im-hub-pro 0.2.31 → 0.2.36

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.
Files changed (184) hide show
  1. package/CHANGELOG.md +46 -0
  2. package/README.md +117 -374
  3. package/README.zh-CN.md +118 -374
  4. package/dist/cli.js +79 -111
  5. package/dist/cli.js.map +1 -1
  6. package/dist/core/acp-server.js +6 -6
  7. package/dist/core/acp-server.js.map +1 -1
  8. package/dist/core/agent-base.d.ts.map +1 -1
  9. package/dist/core/agent-base.js +12 -13
  10. package/dist/core/agent-base.js.map +1 -1
  11. package/dist/core/agent-cwd.js +3 -3
  12. package/dist/core/agent-cwd.js.map +1 -1
  13. package/dist/core/agent-cwd.test.js +4 -4
  14. package/dist/core/agent-cwd.test.js.map +1 -1
  15. package/dist/core/approval-bus.d.ts +27 -7
  16. package/dist/core/approval-bus.d.ts.map +1 -1
  17. package/dist/core/approval-bus.js +77 -44
  18. package/dist/core/approval-bus.js.map +1 -1
  19. package/dist/core/approval-bus.synthetic.test.js +16 -15
  20. package/dist/core/approval-bus.synthetic.test.js.map +1 -1
  21. package/dist/core/approval-bus.test.js +49 -43
  22. package/dist/core/approval-bus.test.js.map +1 -1
  23. package/dist/core/approval-router.d.ts +7 -1
  24. package/dist/core/approval-router.d.ts.map +1 -1
  25. package/dist/core/approval-router.js +25 -28
  26. package/dist/core/approval-router.js.map +1 -1
  27. package/dist/core/approval-router.test.js +34 -29
  28. package/dist/core/approval-router.test.js.map +1 -1
  29. package/dist/core/audit-log.js +2 -2
  30. package/dist/core/audit-log.js.map +1 -1
  31. package/dist/core/bgjob-reader.js +6 -6
  32. package/dist/core/bgjob-reader.js.map +1 -1
  33. package/dist/core/bgjob-reader.test.js +12 -12
  34. package/dist/core/bgjob-reader.test.js.map +1 -1
  35. package/dist/core/commands/approval.d.ts.map +1 -1
  36. package/dist/core/commands/approval.js +5 -4
  37. package/dist/core/commands/approval.js.map +1 -1
  38. package/dist/core/commands/approval.test.js +16 -13
  39. package/dist/core/commands/approval.test.js.map +1 -1
  40. package/dist/core/commands/audit.js +1 -1
  41. package/dist/core/commands/audit.js.map +1 -1
  42. package/dist/core/commands/builtin.d.ts.map +1 -1
  43. package/dist/core/commands/builtin.js +4 -2
  44. package/dist/core/commands/builtin.js.map +1 -1
  45. package/dist/core/commands/job.js +8 -8
  46. package/dist/core/commands/job.js.map +1 -1
  47. package/dist/core/commands/model.js +7 -7
  48. package/dist/core/commands/model.js.map +1 -1
  49. package/dist/core/commands/plan.js +2 -2
  50. package/dist/core/commands/plan.js.map +1 -1
  51. package/dist/core/commands/plan.test.js +3 -3
  52. package/dist/core/commands/plan.test.js.map +1 -1
  53. package/dist/core/commands/sessions.js +4 -4
  54. package/dist/core/commands/sessions.js.map +1 -1
  55. package/dist/core/commands/stats.js +2 -2
  56. package/dist/core/commands/stats.js.map +1 -1
  57. package/dist/core/config-schema.d.ts +2 -0
  58. package/dist/core/config-schema.d.ts.map +1 -1
  59. package/dist/core/config-schema.js +15 -3
  60. package/dist/core/config-schema.js.map +1 -1
  61. package/dist/core/event-bus.d.ts +1 -1
  62. package/dist/core/event-bus.d.ts.map +1 -1
  63. package/dist/core/event-bus.js +1 -1
  64. package/dist/core/event-bus.js.map +1 -1
  65. package/dist/core/intent-llm.js +1 -1
  66. package/dist/core/intent-llm.js.map +1 -1
  67. package/dist/core/job-board.d.ts +1 -3
  68. package/dist/core/job-board.d.ts.map +1 -1
  69. package/dist/core/job-board.js +2 -2
  70. package/dist/core/job-board.js.map +1 -1
  71. package/dist/core/logger.js +1 -1
  72. package/dist/core/logger.js.map +1 -1
  73. package/dist/core/metrics.js +1 -1
  74. package/dist/core/metrics.js.map +1 -1
  75. package/dist/core/onboarding.d.ts.map +1 -1
  76. package/dist/core/onboarding.js +4 -5
  77. package/dist/core/onboarding.js.map +1 -1
  78. package/dist/core/onboarding.test.js +1 -1
  79. package/dist/core/onboarding.test.js.map +1 -1
  80. package/dist/core/router.d.ts +5 -0
  81. package/dist/core/router.d.ts.map +1 -1
  82. package/dist/core/router.js +8 -1
  83. package/dist/core/router.js.map +1 -1
  84. package/dist/core/schedule.d.ts.map +1 -1
  85. package/dist/core/schedule.js +7 -4
  86. package/dist/core/schedule.js.map +1 -1
  87. package/dist/core/session-subtasks.test.js +6 -6
  88. package/dist/core/session-subtasks.test.js.map +1 -1
  89. package/dist/core/session.d.ts.map +1 -1
  90. package/dist/core/session.js +14 -8
  91. package/dist/core/session.js.map +1 -1
  92. package/dist/core/sqlite-helper.js +2 -2
  93. package/dist/core/sqlite-helper.js.map +1 -1
  94. package/dist/core/transcribe.js +5 -5
  95. package/dist/core/transcribe.js.map +1 -1
  96. package/dist/core/transcribe.test.js +3 -3
  97. package/dist/core/transcribe.test.js.map +1 -1
  98. package/dist/plugins/agents/acp/acp-client.d.ts.map +1 -1
  99. package/dist/plugins/agents/acp/acp-client.js +4 -2
  100. package/dist/plugins/agents/acp/acp-client.js.map +1 -1
  101. package/dist/plugins/agents/acp/discovery.d.ts.map +1 -1
  102. package/dist/plugins/agents/acp/discovery.js +2 -0
  103. package/dist/plugins/agents/acp/discovery.js.map +1 -1
  104. package/dist/plugins/agents/claude-code/adapter.test.js +10 -10
  105. package/dist/plugins/agents/claude-code/adapter.test.js.map +1 -1
  106. package/dist/plugins/agents/claude-code/index.js +5 -5
  107. package/dist/plugins/agents/claude-code/index.js.map +1 -1
  108. package/dist/plugins/agents/claude-code/mcp-approval-server.d.ts.map +1 -1
  109. package/dist/plugins/agents/claude-code/mcp-approval-server.js +11 -9
  110. package/dist/plugins/agents/claude-code/mcp-approval-server.js.map +1 -1
  111. package/dist/plugins/agents/claude-code/mcp-approval-server.test.js +9 -8
  112. package/dist/plugins/agents/claude-code/mcp-approval-server.test.js.map +1 -1
  113. package/dist/plugins/agents/codex/adapter.test.js +1 -1
  114. package/dist/plugins/agents/codex/adapter.test.js.map +1 -1
  115. package/dist/plugins/agents/codex/index.js +3 -3
  116. package/dist/plugins/agents/codex/index.js.map +1 -1
  117. package/dist/plugins/agents/copilot/index.js +3 -3
  118. package/dist/plugins/agents/copilot/index.js.map +1 -1
  119. package/dist/plugins/agents/opencode/http-adapter.test.js +10 -8
  120. package/dist/plugins/agents/opencode/http-adapter.test.js.map +1 -1
  121. package/dist/plugins/agents/opencode/opencode-http-adapter.d.ts +1 -1
  122. package/dist/plugins/agents/opencode/opencode-http-adapter.d.ts.map +1 -1
  123. package/dist/plugins/agents/opencode/opencode-http-adapter.js +6 -4
  124. package/dist/plugins/agents/opencode/opencode-http-adapter.js.map +1 -1
  125. package/dist/plugins/agents/opencode/serve-manager.d.ts.map +1 -1
  126. package/dist/plugins/agents/opencode/serve-manager.js +10 -6
  127. package/dist/plugins/agents/opencode/serve-manager.js.map +1 -1
  128. package/dist/plugins/messengers/discord/discord-adapter.d.ts +0 -1
  129. package/dist/plugins/messengers/discord/discord-adapter.d.ts.map +1 -1
  130. package/dist/plugins/messengers/discord/discord-adapter.js +3 -6
  131. package/dist/plugins/messengers/discord/discord-adapter.js.map +1 -1
  132. package/dist/plugins/messengers/discord/discord-adapter.test.js +12 -12
  133. package/dist/plugins/messengers/discord/discord-adapter.test.js.map +1 -1
  134. package/dist/plugins/messengers/feishu/feishu-adapter.d.ts +0 -1
  135. package/dist/plugins/messengers/feishu/feishu-adapter.d.ts.map +1 -1
  136. package/dist/plugins/messengers/feishu/feishu-adapter.js +4 -7
  137. package/dist/plugins/messengers/feishu/feishu-adapter.js.map +1 -1
  138. package/dist/plugins/messengers/feishu/feishu-client.d.ts +0 -1
  139. package/dist/plugins/messengers/feishu/feishu-client.d.ts.map +1 -1
  140. package/dist/plugins/messengers/feishu/feishu-client.js +0 -2
  141. package/dist/plugins/messengers/feishu/feishu-client.js.map +1 -1
  142. package/dist/plugins/messengers/telegram/markdown-to-html.js +3 -3
  143. package/dist/plugins/messengers/telegram/markdown-to-html.js.map +1 -1
  144. package/dist/plugins/messengers/telegram/media-download.js +5 -5
  145. package/dist/plugins/messengers/telegram/media-download.js.map +1 -1
  146. package/dist/plugins/messengers/telegram/media-download.test.js +3 -3
  147. package/dist/plugins/messengers/telegram/media-download.test.js.map +1 -1
  148. package/dist/plugins/messengers/telegram/telegram-adapter.d.ts +15 -0
  149. package/dist/plugins/messengers/telegram/telegram-adapter.d.ts.map +1 -1
  150. package/dist/plugins/messengers/telegram/telegram-adapter.js +165 -8
  151. package/dist/plugins/messengers/telegram/telegram-adapter.js.map +1 -1
  152. package/dist/plugins/messengers/wechat/ilink-adapter.d.ts +10 -0
  153. package/dist/plugins/messengers/wechat/ilink-adapter.d.ts.map +1 -1
  154. package/dist/plugins/messengers/wechat/ilink-adapter.js +167 -17
  155. package/dist/plugins/messengers/wechat/ilink-adapter.js.map +1 -1
  156. package/dist/plugins/messengers/wechat/ilink-client.d.ts +10 -1
  157. package/dist/plugins/messengers/wechat/ilink-client.d.ts.map +1 -1
  158. package/dist/plugins/messengers/wechat/ilink-client.js +42 -0
  159. package/dist/plugins/messengers/wechat/ilink-client.js.map +1 -1
  160. package/dist/plugins/messengers/wechat/ilink-types.d.ts +8 -0
  161. package/dist/plugins/messengers/wechat/ilink-types.d.ts.map +1 -1
  162. package/dist/plugins/messengers/wechat/ilink-types.js +10 -0
  163. package/dist/plugins/messengers/wechat/ilink-types.js.map +1 -1
  164. package/dist/plugins/messengers/wechat/media-download.d.ts +32 -0
  165. package/dist/plugins/messengers/wechat/media-download.d.ts.map +1 -0
  166. package/dist/plugins/messengers/wechat/media-download.js +78 -0
  167. package/dist/plugins/messengers/wechat/media-download.js.map +1 -0
  168. package/dist/utils/backoff.js +1 -1
  169. package/dist/utils/backoff.js.map +1 -1
  170. package/dist/utils/cross-platform.d.ts +1 -1
  171. package/dist/utils/cross-platform.d.ts.map +1 -1
  172. package/dist/utils/cross-platform.js +3 -3
  173. package/dist/utils/cross-platform.js.map +1 -1
  174. package/dist/utils/safe-equal.js +1 -1
  175. package/dist/utils/safe-equal.js.map +1 -1
  176. package/dist/web/public/_app.js +7 -7
  177. package/dist/web/public/index.html +14 -15
  178. package/dist/web/public/login.html +106 -0
  179. package/dist/web/public/settings.html +37 -36
  180. package/dist/web/public/tasks.html +99 -93
  181. package/dist/web/server.d.ts.map +1 -1
  182. package/dist/web/server.js +215 -84
  183. package/dist/web/server.js.map +1 -1
  184. package/package.json +3 -3
package/CHANGELOG.md CHANGED
@@ -2,6 +2,52 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file.
4
4
 
5
+ ## [0.2.35] - 2026-05-09
6
+
7
+ ### Added — WeChat & Telegram rich media support
8
+
9
+ - **WeChat 图片 / 文件 / 语音 / 视频接收**:`handleIncomingMessage` 现在处理 iLink `item_list` 的全部 5 种类型(TEXT=1, IMAGE=2, VOICE=3, FILE=4, VIDEO=5),此前只处理 TEXT。
10
+ - **图片**:通过 iLink CDN 下载到 `~/.im-hub/media/wechat/<userId>/`,转为 `[图片附件:/path]` 标记传递给 Agent
11
+ - **语音**:优先使用微信自带转写(`voice_item.text`),无转写时下载音频后走 OpenAI Whisper 或 whisper.cpp(复用 `src/core/transcribe.ts`)
12
+ - **文件**:下载并保留原始文件名,显示大小,转为 `[文件附件:/path (name, size)]`
13
+ - **视频**:下载并显示时长和大小,转为 `[视频附件:/path (duration, size)]`
14
+ - **混合消息**:同一条消息中的文本 + 媒体项按顺序拼接
15
+ - **Telegram 图片 / 语音增强**:Telegram 适配器的图片下载和语音转写能力在本轮中同步维护和 bugfix。
16
+ - **新文件**:`src/plugins/messengers/wechat/media-download.ts` — 媒体下载辅助,含路径安全检查(拒绝 `../` / `/`)和 20 MB 大小上限
17
+ - **新类型**:`ilink-types.ts` 新增 `ITEM_TYPE` 常量和 `DownloadMediaRequest`
18
+ - **新方法**:`ILinkClient.downloadMedia(cdnMedia)` — 通过 iLink CDN 端点下载二进制媒体
19
+
20
+ ### Tests
21
+
22
+ - 53 个新测试:
23
+ - 31 集成测试(`test/integration/wechat-media-integration.test.ts`)— 端到端验证 `handleIncomingMessage` 对所有媒体类型的处理,含成功 / 失败 / 边界情况
24
+ - 15 单元测试(`test/unit/wechat-media-download.test.ts`)— 下载辅助函数、扩展名推断、CDN 提取、安全防护
25
+ - 8 单元测试(`test/unit/wechat-media-handling.test.ts`)— 类型常量和消息结构验证
26
+ - 全量 950 pass / 0 fail
27
+
28
+ ---
29
+
30
+ ## [0.2.33] - 2026-05-09
31
+
32
+ ### Fixed — audit-fixes-7950 follow-up
33
+
34
+ 稳定 0.2.32(v0.2.32 的 10 项审计修复在合入时引入 37 个失败测试 + 一处运行时回归,0.2.33 把这些都修掉,建议直接从 0.2.31 升到 0.2.33)。
35
+
36
+ - **审批总线 composite key 测试同步**:P0 #4 把 `ApprovalBus` 的内部 keying 从裸 threadId 改成 `platform:channelId:threadId`,但单元测试仍然按裸 `'thread-A'` 调 `hasPendingFor` / `resolvePending`,导致 `bun test` 红 37 项。所有相关测试(approval-bus、synthetic、router、approval 命令、mcp-approval、opencode-http、discord)改用 `threadKey()` 显式构造 composite,注释中误导性的 "backward compat" 承诺一并删除。
37
+ - **Claude session 标记顺序回归**:P1 #5 把 `markClaudeSessionPrimed` 从 `routeMessage` 之前挪到了之后;如果 claude 已写出 jsonl 但 run 中途出错,下一轮就会用 `--session-id` 而不是 `--resume`,触发 "session already exists"。0.2.33 把 markPrimed 移回 `onAgentResolved` 内部、紧跟 `setClaudeSessionId`,恢复"先 mark 再调 adapter"的语义。
38
+ - **Cookie 加固**:`web.public_bind_warning` 改在 server 启动时打一次(之前每次登录都打);`Set-Cookie` 在 public bind 或 `X-Forwarded-Proto: https` 时自动附加 `Secure`,纯 localhost dev 不加。
39
+ - **静态页测试改写**:原 `/tasks` 用例还在断言 `IMHUB_TOKEN` 注入到 HTML,改成走真实流程:未登录 302 到 `/login`,POST `/api/auth/login` 拿 cookie 后 200,断言 HTML 中不再含 token。
40
+ - **死代码清理**:`editCardOnThreadResolution` 的 thread-scan fallback 在 composite key 下永远 miss,删掉;签名从 `(threadId, info, decision, by)` 缩为 `(info, decision, by)`。
41
+ - **小项**:`web/server.ts` 删未使用的 `lstat` import;`settings.html` toast 调用末尾被误删的 `;` 补回。
42
+ - **测试 flake 修复**:`test/integration/acp-server.test.ts` 在全套并发下被 `intent.test.ts` 注册的空-yield 子代理污染(router intent fallback 到 opencode → 返回 '')。ACP 测试在 `beforeAll` 重新注册 4 个 profile 名同名 stub 让其也产出内容。
43
+
44
+ ### Result
45
+
46
+ - `bun test`:895 / 895 pass(之前 857 / 37)
47
+ - `tsc --noEmit` / `biome` 干净
48
+
49
+ ---
50
+
5
51
  ## [0.2.31] - 2026-05-08
6
52
 
7
53
  ### Release