im-hub-pro 0.2.29

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 (384) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +497 -0
  3. package/README.zh-CN.md +496 -0
  4. package/dist/cli.d.ts +3 -0
  5. package/dist/cli.d.ts.map +1 -0
  6. package/dist/cli.js +921 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/core/acp-server.d.ts +8 -0
  9. package/dist/core/acp-server.d.ts.map +1 -0
  10. package/dist/core/acp-server.js +266 -0
  11. package/dist/core/acp-server.js.map +1 -0
  12. package/dist/core/agent-base.d.ts +94 -0
  13. package/dist/core/agent-base.d.ts.map +1 -0
  14. package/dist/core/agent-base.js +374 -0
  15. package/dist/core/agent-base.js.map +1 -0
  16. package/dist/core/agent-cwd.d.ts +45 -0
  17. package/dist/core/agent-cwd.d.ts.map +1 -0
  18. package/dist/core/agent-cwd.js +178 -0
  19. package/dist/core/agent-cwd.js.map +1 -0
  20. package/dist/core/agent-cwd.test.d.ts +2 -0
  21. package/dist/core/agent-cwd.test.d.ts.map +1 -0
  22. package/dist/core/agent-cwd.test.js +149 -0
  23. package/dist/core/agent-cwd.test.js.map +1 -0
  24. package/dist/core/approval-bus.d.ts +232 -0
  25. package/dist/core/approval-bus.d.ts.map +1 -0
  26. package/dist/core/approval-bus.js +703 -0
  27. package/dist/core/approval-bus.js.map +1 -0
  28. package/dist/core/approval-bus.synthetic.test.d.ts +2 -0
  29. package/dist/core/approval-bus.synthetic.test.d.ts.map +1 -0
  30. package/dist/core/approval-bus.synthetic.test.js +182 -0
  31. package/dist/core/approval-bus.synthetic.test.js.map +1 -0
  32. package/dist/core/approval-bus.test.d.ts +2 -0
  33. package/dist/core/approval-bus.test.d.ts.map +1 -0
  34. package/dist/core/approval-bus.test.js +537 -0
  35. package/dist/core/approval-bus.test.js.map +1 -0
  36. package/dist/core/approval-router.d.ts +95 -0
  37. package/dist/core/approval-router.d.ts.map +1 -0
  38. package/dist/core/approval-router.js +450 -0
  39. package/dist/core/approval-router.js.map +1 -0
  40. package/dist/core/approval-router.test.d.ts +2 -0
  41. package/dist/core/approval-router.test.d.ts.map +1 -0
  42. package/dist/core/approval-router.test.js +413 -0
  43. package/dist/core/approval-router.test.js.map +1 -0
  44. package/dist/core/audit-log.d.ts +55 -0
  45. package/dist/core/audit-log.d.ts.map +1 -0
  46. package/dist/core/audit-log.js +203 -0
  47. package/dist/core/audit-log.js.map +1 -0
  48. package/dist/core/bgjob-reader.d.ts +65 -0
  49. package/dist/core/bgjob-reader.d.ts.map +1 -0
  50. package/dist/core/bgjob-reader.js +212 -0
  51. package/dist/core/bgjob-reader.js.map +1 -0
  52. package/dist/core/bgjob-reader.test.d.ts +2 -0
  53. package/dist/core/bgjob-reader.test.d.ts.map +1 -0
  54. package/dist/core/bgjob-reader.test.js +178 -0
  55. package/dist/core/bgjob-reader.test.js.map +1 -0
  56. package/dist/core/circuit-breaker.d.ts +37 -0
  57. package/dist/core/circuit-breaker.d.ts.map +1 -0
  58. package/dist/core/circuit-breaker.js +115 -0
  59. package/dist/core/circuit-breaker.js.map +1 -0
  60. package/dist/core/commands/agent.d.ts +4 -0
  61. package/dist/core/commands/agent.d.ts.map +1 -0
  62. package/dist/core/commands/agent.js +21 -0
  63. package/dist/core/commands/agent.js.map +1 -0
  64. package/dist/core/commands/approval.d.ts +3 -0
  65. package/dist/core/commands/approval.d.ts.map +1 -0
  66. package/dist/core/commands/approval.js +44 -0
  67. package/dist/core/commands/approval.js.map +1 -0
  68. package/dist/core/commands/approval.test.d.ts +2 -0
  69. package/dist/core/commands/approval.test.d.ts.map +1 -0
  70. package/dist/core/commands/approval.test.js +85 -0
  71. package/dist/core/commands/approval.test.js.map +1 -0
  72. package/dist/core/commands/audit.d.ts +3 -0
  73. package/dist/core/commands/audit.d.ts.map +1 -0
  74. package/dist/core/commands/audit.js +84 -0
  75. package/dist/core/commands/audit.js.map +1 -0
  76. package/dist/core/commands/builtin.d.ts +3 -0
  77. package/dist/core/commands/builtin.d.ts.map +1 -0
  78. package/dist/core/commands/builtin.js +26 -0
  79. package/dist/core/commands/builtin.js.map +1 -0
  80. package/dist/core/commands/job.d.ts +3 -0
  81. package/dist/core/commands/job.d.ts.map +1 -0
  82. package/dist/core/commands/job.js +195 -0
  83. package/dist/core/commands/job.js.map +1 -0
  84. package/dist/core/commands/model.d.ts +9 -0
  85. package/dist/core/commands/model.d.ts.map +1 -0
  86. package/dist/core/commands/model.js +183 -0
  87. package/dist/core/commands/model.js.map +1 -0
  88. package/dist/core/commands/plan.d.ts +3 -0
  89. package/dist/core/commands/plan.d.ts.map +1 -0
  90. package/dist/core/commands/plan.js +75 -0
  91. package/dist/core/commands/plan.js.map +1 -0
  92. package/dist/core/commands/plan.test.d.ts +2 -0
  93. package/dist/core/commands/plan.test.d.ts.map +1 -0
  94. package/dist/core/commands/plan.test.js +122 -0
  95. package/dist/core/commands/plan.test.js.map +1 -0
  96. package/dist/core/commands/router.d.ts +3 -0
  97. package/dist/core/commands/router.d.ts.map +1 -0
  98. package/dist/core/commands/router.js +71 -0
  99. package/dist/core/commands/router.js.map +1 -0
  100. package/dist/core/commands/schedule.d.ts +3 -0
  101. package/dist/core/commands/schedule.d.ts.map +1 -0
  102. package/dist/core/commands/schedule.js +123 -0
  103. package/dist/core/commands/schedule.js.map +1 -0
  104. package/dist/core/commands/sessions.d.ts +3 -0
  105. package/dist/core/commands/sessions.d.ts.map +1 -0
  106. package/dist/core/commands/sessions.js +88 -0
  107. package/dist/core/commands/sessions.js.map +1 -0
  108. package/dist/core/commands/stats.d.ts +3 -0
  109. package/dist/core/commands/stats.d.ts.map +1 -0
  110. package/dist/core/commands/stats.js +73 -0
  111. package/dist/core/commands/stats.js.map +1 -0
  112. package/dist/core/commands/think.d.ts +3 -0
  113. package/dist/core/commands/think.d.ts.map +1 -0
  114. package/dist/core/commands/think.js +28 -0
  115. package/dist/core/commands/think.js.map +1 -0
  116. package/dist/core/commands/workspaces.d.ts +3 -0
  117. package/dist/core/commands/workspaces.d.ts.map +1 -0
  118. package/dist/core/commands/workspaces.js +47 -0
  119. package/dist/core/commands/workspaces.js.map +1 -0
  120. package/dist/core/config-schema.d.ts +58 -0
  121. package/dist/core/config-schema.d.ts.map +1 -0
  122. package/dist/core/config-schema.js +63 -0
  123. package/dist/core/config-schema.js.map +1 -0
  124. package/dist/core/cron.d.ts +29 -0
  125. package/dist/core/cron.d.ts.map +1 -0
  126. package/dist/core/cron.js +184 -0
  127. package/dist/core/cron.js.map +1 -0
  128. package/dist/core/event-bus.d.ts +80 -0
  129. package/dist/core/event-bus.d.ts.map +1 -0
  130. package/dist/core/event-bus.js +62 -0
  131. package/dist/core/event-bus.js.map +1 -0
  132. package/dist/core/intent-llm.d.ts +27 -0
  133. package/dist/core/intent-llm.d.ts.map +1 -0
  134. package/dist/core/intent-llm.js +170 -0
  135. package/dist/core/intent-llm.js.map +1 -0
  136. package/dist/core/intent.d.ts +12 -0
  137. package/dist/core/intent.d.ts.map +1 -0
  138. package/dist/core/intent.js +187 -0
  139. package/dist/core/intent.js.map +1 -0
  140. package/dist/core/job-board.d.ts +84 -0
  141. package/dist/core/job-board.d.ts.map +1 -0
  142. package/dist/core/job-board.js +379 -0
  143. package/dist/core/job-board.js.map +1 -0
  144. package/dist/core/logger.d.ts +6 -0
  145. package/dist/core/logger.d.ts.map +1 -0
  146. package/dist/core/logger.js +54 -0
  147. package/dist/core/logger.js.map +1 -0
  148. package/dist/core/metrics.d.ts +55 -0
  149. package/dist/core/metrics.d.ts.map +1 -0
  150. package/dist/core/metrics.js +291 -0
  151. package/dist/core/metrics.js.map +1 -0
  152. package/dist/core/onboarding.d.ts +94 -0
  153. package/dist/core/onboarding.d.ts.map +1 -0
  154. package/dist/core/onboarding.js +426 -0
  155. package/dist/core/onboarding.js.map +1 -0
  156. package/dist/core/onboarding.test.d.ts +2 -0
  157. package/dist/core/onboarding.test.d.ts.map +1 -0
  158. package/dist/core/onboarding.test.js +112 -0
  159. package/dist/core/onboarding.test.js.map +1 -0
  160. package/dist/core/rate-limiter.d.ts +44 -0
  161. package/dist/core/rate-limiter.d.ts.map +1 -0
  162. package/dist/core/rate-limiter.js +115 -0
  163. package/dist/core/rate-limiter.js.map +1 -0
  164. package/dist/core/registry.d.ts +32 -0
  165. package/dist/core/registry.d.ts.map +1 -0
  166. package/dist/core/registry.js +122 -0
  167. package/dist/core/registry.js.map +1 -0
  168. package/dist/core/router.d.ts +41 -0
  169. package/dist/core/router.d.ts.map +1 -0
  170. package/dist/core/router.js +431 -0
  171. package/dist/core/router.js.map +1 -0
  172. package/dist/core/schedule.d.ts +65 -0
  173. package/dist/core/schedule.d.ts.map +1 -0
  174. package/dist/core/schedule.js +316 -0
  175. package/dist/core/schedule.js.map +1 -0
  176. package/dist/core/session-subtasks.test.d.ts +2 -0
  177. package/dist/core/session-subtasks.test.d.ts.map +1 -0
  178. package/dist/core/session-subtasks.test.js +88 -0
  179. package/dist/core/session-subtasks.test.js.map +1 -0
  180. package/dist/core/session.d.ts +182 -0
  181. package/dist/core/session.d.ts.map +1 -0
  182. package/dist/core/session.js +774 -0
  183. package/dist/core/session.js.map +1 -0
  184. package/dist/core/sqlite-helper.d.ts +37 -0
  185. package/dist/core/sqlite-helper.d.ts.map +1 -0
  186. package/dist/core/sqlite-helper.js +79 -0
  187. package/dist/core/sqlite-helper.js.map +1 -0
  188. package/dist/core/transcribe.d.ts +25 -0
  189. package/dist/core/transcribe.d.ts.map +1 -0
  190. package/dist/core/transcribe.js +217 -0
  191. package/dist/core/transcribe.js.map +1 -0
  192. package/dist/core/transcribe.test.d.ts +2 -0
  193. package/dist/core/transcribe.test.d.ts.map +1 -0
  194. package/dist/core/transcribe.test.js +163 -0
  195. package/dist/core/transcribe.test.js.map +1 -0
  196. package/dist/core/types.d.ts +352 -0
  197. package/dist/core/types.d.ts.map +1 -0
  198. package/dist/core/types.js +3 -0
  199. package/dist/core/types.js.map +1 -0
  200. package/dist/core/workspace.d.ts +67 -0
  201. package/dist/core/workspace.d.ts.map +1 -0
  202. package/dist/core/workspace.js +113 -0
  203. package/dist/core/workspace.js.map +1 -0
  204. package/dist/index.d.ts +5 -0
  205. package/dist/index.d.ts.map +1 -0
  206. package/dist/index.js +6 -0
  207. package/dist/index.js.map +1 -0
  208. package/dist/plugins/agents/acp/acp-adapter.d.ts +16 -0
  209. package/dist/plugins/agents/acp/acp-adapter.d.ts.map +1 -0
  210. package/dist/plugins/agents/acp/acp-adapter.js +49 -0
  211. package/dist/plugins/agents/acp/acp-adapter.js.map +1 -0
  212. package/dist/plugins/agents/acp/acp-client.d.ts +32 -0
  213. package/dist/plugins/agents/acp/acp-client.d.ts.map +1 -0
  214. package/dist/plugins/agents/acp/acp-client.js +175 -0
  215. package/dist/plugins/agents/acp/acp-client.js.map +1 -0
  216. package/dist/plugins/agents/acp/discovery.d.ts +19 -0
  217. package/dist/plugins/agents/acp/discovery.d.ts.map +1 -0
  218. package/dist/plugins/agents/acp/discovery.js +109 -0
  219. package/dist/plugins/agents/acp/discovery.js.map +1 -0
  220. package/dist/plugins/agents/acp/index.d.ts +4 -0
  221. package/dist/plugins/agents/acp/index.d.ts.map +1 -0
  222. package/dist/plugins/agents/acp/index.js +4 -0
  223. package/dist/plugins/agents/acp/index.js.map +1 -0
  224. package/dist/plugins/agents/acp/types.d.ts +62 -0
  225. package/dist/plugins/agents/acp/types.d.ts.map +1 -0
  226. package/dist/plugins/agents/acp/types.js +5 -0
  227. package/dist/plugins/agents/acp/types.js.map +1 -0
  228. package/dist/plugins/agents/claude-code/adapter.test.d.ts +2 -0
  229. package/dist/plugins/agents/claude-code/adapter.test.d.ts.map +1 -0
  230. package/dist/plugins/agents/claude-code/adapter.test.js +195 -0
  231. package/dist/plugins/agents/claude-code/adapter.test.js.map +1 -0
  232. package/dist/plugins/agents/claude-code/index.d.ts +25 -0
  233. package/dist/plugins/agents/claude-code/index.d.ts.map +1 -0
  234. package/dist/plugins/agents/claude-code/index.js +184 -0
  235. package/dist/plugins/agents/claude-code/index.js.map +1 -0
  236. package/dist/plugins/agents/claude-code/mcp-approval-server.d.ts +42 -0
  237. package/dist/plugins/agents/claude-code/mcp-approval-server.d.ts.map +1 -0
  238. package/dist/plugins/agents/claude-code/mcp-approval-server.js +235 -0
  239. package/dist/plugins/agents/claude-code/mcp-approval-server.js.map +1 -0
  240. package/dist/plugins/agents/claude-code/mcp-approval-server.test.d.ts +2 -0
  241. package/dist/plugins/agents/claude-code/mcp-approval-server.test.d.ts.map +1 -0
  242. package/dist/plugins/agents/claude-code/mcp-approval-server.test.js +188 -0
  243. package/dist/plugins/agents/claude-code/mcp-approval-server.test.js.map +1 -0
  244. package/dist/plugins/agents/codex/adapter.test.d.ts +2 -0
  245. package/dist/plugins/agents/codex/adapter.test.d.ts.map +1 -0
  246. package/dist/plugins/agents/codex/adapter.test.js +192 -0
  247. package/dist/plugins/agents/codex/adapter.test.js.map +1 -0
  248. package/dist/plugins/agents/codex/index.d.ts +37 -0
  249. package/dist/plugins/agents/codex/index.d.ts.map +1 -0
  250. package/dist/plugins/agents/codex/index.js +254 -0
  251. package/dist/plugins/agents/codex/index.js.map +1 -0
  252. package/dist/plugins/agents/copilot/index.d.ts +35 -0
  253. package/dist/plugins/agents/copilot/index.d.ts.map +1 -0
  254. package/dist/plugins/agents/copilot/index.js +182 -0
  255. package/dist/plugins/agents/copilot/index.js.map +1 -0
  256. package/dist/plugins/agents/opencode/adapter.test.d.ts +2 -0
  257. package/dist/plugins/agents/opencode/adapter.test.d.ts.map +1 -0
  258. package/dist/plugins/agents/opencode/adapter.test.js +139 -0
  259. package/dist/plugins/agents/opencode/adapter.test.js.map +1 -0
  260. package/dist/plugins/agents/opencode/http-adapter.test.d.ts +2 -0
  261. package/dist/plugins/agents/opencode/http-adapter.test.d.ts.map +1 -0
  262. package/dist/plugins/agents/opencode/http-adapter.test.js +492 -0
  263. package/dist/plugins/agents/opencode/http-adapter.test.js.map +1 -0
  264. package/dist/plugins/agents/opencode/index.d.ts +5 -0
  265. package/dist/plugins/agents/opencode/index.d.ts.map +1 -0
  266. package/dist/plugins/agents/opencode/index.js +30 -0
  267. package/dist/plugins/agents/opencode/index.js.map +1 -0
  268. package/dist/plugins/agents/opencode/opencode-http-adapter.d.ts +138 -0
  269. package/dist/plugins/agents/opencode/opencode-http-adapter.d.ts.map +1 -0
  270. package/dist/plugins/agents/opencode/opencode-http-adapter.js +549 -0
  271. package/dist/plugins/agents/opencode/opencode-http-adapter.js.map +1 -0
  272. package/dist/plugins/agents/opencode/opencode-stdio-adapter.d.ts +24 -0
  273. package/dist/plugins/agents/opencode/opencode-stdio-adapter.d.ts.map +1 -0
  274. package/dist/plugins/agents/opencode/opencode-stdio-adapter.js +103 -0
  275. package/dist/plugins/agents/opencode/opencode-stdio-adapter.js.map +1 -0
  276. package/dist/plugins/agents/opencode/serve-manager.d.ts +27 -0
  277. package/dist/plugins/agents/opencode/serve-manager.d.ts.map +1 -0
  278. package/dist/plugins/agents/opencode/serve-manager.js +190 -0
  279. package/dist/plugins/agents/opencode/serve-manager.js.map +1 -0
  280. package/dist/plugins/messengers/discord/discord-adapter.d.ts +22 -0
  281. package/dist/plugins/messengers/discord/discord-adapter.d.ts.map +1 -0
  282. package/dist/plugins/messengers/discord/discord-adapter.js +241 -0
  283. package/dist/plugins/messengers/discord/discord-adapter.js.map +1 -0
  284. package/dist/plugins/messengers/discord/discord-adapter.test.d.ts +2 -0
  285. package/dist/plugins/messengers/discord/discord-adapter.test.d.ts.map +1 -0
  286. package/dist/plugins/messengers/discord/discord-adapter.test.js +332 -0
  287. package/dist/plugins/messengers/discord/discord-adapter.test.js.map +1 -0
  288. package/dist/plugins/messengers/discord/index.d.ts +4 -0
  289. package/dist/plugins/messengers/discord/index.d.ts.map +1 -0
  290. package/dist/plugins/messengers/discord/index.js +4 -0
  291. package/dist/plugins/messengers/discord/index.js.map +1 -0
  292. package/dist/plugins/messengers/discord/markdown-to-discord.d.ts +11 -0
  293. package/dist/plugins/messengers/discord/markdown-to-discord.d.ts.map +1 -0
  294. package/dist/plugins/messengers/discord/markdown-to-discord.js +59 -0
  295. package/dist/plugins/messengers/discord/markdown-to-discord.js.map +1 -0
  296. package/dist/plugins/messengers/discord/types.d.ts +9 -0
  297. package/dist/plugins/messengers/discord/types.d.ts.map +1 -0
  298. package/dist/plugins/messengers/discord/types.js +3 -0
  299. package/dist/plugins/messengers/discord/types.js.map +1 -0
  300. package/dist/plugins/messengers/feishu/card-builder.d.ts +23 -0
  301. package/dist/plugins/messengers/feishu/card-builder.d.ts.map +1 -0
  302. package/dist/plugins/messengers/feishu/card-builder.js +89 -0
  303. package/dist/plugins/messengers/feishu/card-builder.js.map +1 -0
  304. package/dist/plugins/messengers/feishu/feishu-adapter.d.ts +33 -0
  305. package/dist/plugins/messengers/feishu/feishu-adapter.d.ts.map +1 -0
  306. package/dist/plugins/messengers/feishu/feishu-adapter.js +195 -0
  307. package/dist/plugins/messengers/feishu/feishu-adapter.js.map +1 -0
  308. package/dist/plugins/messengers/feishu/feishu-client.d.ts +44 -0
  309. package/dist/plugins/messengers/feishu/feishu-client.d.ts.map +1 -0
  310. package/dist/plugins/messengers/feishu/feishu-client.js +120 -0
  311. package/dist/plugins/messengers/feishu/feishu-client.js.map +1 -0
  312. package/dist/plugins/messengers/feishu/feishu-dedup.test.d.ts +2 -0
  313. package/dist/plugins/messengers/feishu/feishu-dedup.test.d.ts.map +1 -0
  314. package/dist/plugins/messengers/feishu/feishu-dedup.test.js +70 -0
  315. package/dist/plugins/messengers/feishu/feishu-dedup.test.js.map +1 -0
  316. package/dist/plugins/messengers/feishu/index.d.ts +4 -0
  317. package/dist/plugins/messengers/feishu/index.d.ts.map +1 -0
  318. package/dist/plugins/messengers/feishu/index.js +4 -0
  319. package/dist/plugins/messengers/feishu/index.js.map +1 -0
  320. package/dist/plugins/messengers/feishu/types.d.ts +113 -0
  321. package/dist/plugins/messengers/feishu/types.d.ts.map +1 -0
  322. package/dist/plugins/messengers/feishu/types.js +4 -0
  323. package/dist/plugins/messengers/feishu/types.js.map +1 -0
  324. package/dist/plugins/messengers/telegram/index.d.ts +4 -0
  325. package/dist/plugins/messengers/telegram/index.d.ts.map +1 -0
  326. package/dist/plugins/messengers/telegram/index.js +4 -0
  327. package/dist/plugins/messengers/telegram/index.js.map +1 -0
  328. package/dist/plugins/messengers/telegram/markdown-to-html.d.ts +5 -0
  329. package/dist/plugins/messengers/telegram/markdown-to-html.d.ts.map +1 -0
  330. package/dist/plugins/messengers/telegram/markdown-to-html.js +186 -0
  331. package/dist/plugins/messengers/telegram/markdown-to-html.js.map +1 -0
  332. package/dist/plugins/messengers/telegram/media-download.d.ts +51 -0
  333. package/dist/plugins/messengers/telegram/media-download.d.ts.map +1 -0
  334. package/dist/plugins/messengers/telegram/media-download.js +224 -0
  335. package/dist/plugins/messengers/telegram/media-download.js.map +1 -0
  336. package/dist/plugins/messengers/telegram/media-download.test.d.ts +2 -0
  337. package/dist/plugins/messengers/telegram/media-download.test.d.ts.map +1 -0
  338. package/dist/plugins/messengers/telegram/media-download.test.js +125 -0
  339. package/dist/plugins/messengers/telegram/media-download.test.js.map +1 -0
  340. package/dist/plugins/messengers/telegram/telegram-adapter.d.ts +62 -0
  341. package/dist/plugins/messengers/telegram/telegram-adapter.d.ts.map +1 -0
  342. package/dist/plugins/messengers/telegram/telegram-adapter.js +653 -0
  343. package/dist/plugins/messengers/telegram/telegram-adapter.js.map +1 -0
  344. package/dist/plugins/messengers/telegram/types.d.ts +47 -0
  345. package/dist/plugins/messengers/telegram/types.d.ts.map +1 -0
  346. package/dist/plugins/messengers/telegram/types.js +3 -0
  347. package/dist/plugins/messengers/telegram/types.js.map +1 -0
  348. package/dist/plugins/messengers/wechat/ilink-adapter.d.ts +68 -0
  349. package/dist/plugins/messengers/wechat/ilink-adapter.d.ts.map +1 -0
  350. package/dist/plugins/messengers/wechat/ilink-adapter.js +483 -0
  351. package/dist/plugins/messengers/wechat/ilink-adapter.js.map +1 -0
  352. package/dist/plugins/messengers/wechat/ilink-client.d.ts +66 -0
  353. package/dist/plugins/messengers/wechat/ilink-client.d.ts.map +1 -0
  354. package/dist/plugins/messengers/wechat/ilink-client.js +288 -0
  355. package/dist/plugins/messengers/wechat/ilink-client.js.map +1 -0
  356. package/dist/plugins/messengers/wechat/ilink-types.d.ts +173 -0
  357. package/dist/plugins/messengers/wechat/ilink-types.d.ts.map +1 -0
  358. package/dist/plugins/messengers/wechat/ilink-types.js +12 -0
  359. package/dist/plugins/messengers/wechat/ilink-types.js.map +1 -0
  360. package/dist/utils/backoff.d.ts +35 -0
  361. package/dist/utils/backoff.d.ts.map +1 -0
  362. package/dist/utils/backoff.js +59 -0
  363. package/dist/utils/backoff.js.map +1 -0
  364. package/dist/utils/cross-platform.d.ts +26 -0
  365. package/dist/utils/cross-platform.d.ts.map +1 -0
  366. package/dist/utils/cross-platform.js +58 -0
  367. package/dist/utils/cross-platform.js.map +1 -0
  368. package/dist/utils/message-split.d.ts +14 -0
  369. package/dist/utils/message-split.d.ts.map +1 -0
  370. package/dist/utils/message-split.js +65 -0
  371. package/dist/utils/message-split.js.map +1 -0
  372. package/dist/utils/safe-equal.d.ts +2 -0
  373. package/dist/utils/safe-equal.d.ts.map +1 -0
  374. package/dist/utils/safe-equal.js +11 -0
  375. package/dist/utils/safe-equal.js.map +1 -0
  376. package/dist/web/public/_app.js +196 -0
  377. package/dist/web/public/index.html +935 -0
  378. package/dist/web/public/settings.html +1181 -0
  379. package/dist/web/public/tasks.html +1827 -0
  380. package/dist/web/server.d.ts +11 -0
  381. package/dist/web/server.d.ts.map +1 -0
  382. package/dist/web/server.js +1820 -0
  383. package/dist/web/server.js.map +1 -0
  384. package/package.json +73 -0
@@ -0,0 +1,496 @@
1
+ # im-hub-pro
2
+
3
+ [English](README.md)
4
+
5
+ **IM 到 AI Agent 的万能桥梁** — 将微信 / 飞书 / Telegram / **Discord** 接入 Claude Code / Codex / Copilot / OpenCode,**或通过 ACP 接入任意自定义 Agent**。单 Node.js 进程,无需 Docker / Redis;自带浏览器仪表盘、持久化任务、多租户工作区,IM 端真正的"工具调用人审"。
6
+
7
+ > 原 [`im-hub`](https://www.npmjs.com/package/im-hub) 包的产品化分支。落盘配置(`~/.im-hub/`)、环境变量(`IMHUB_*`)、HTTP 头(`X-IM-Hub-Token`)保持不变 —— 老部署可以无缝切换,详见下方[迁移指南](#从-im-hub-迁移)。
8
+
9
+ ## 0.2.13 → 0.2.23 主要升级
10
+
11
+ - **Discord 适配器**(基于 `discord.js` 的 Gateway WebSocket)
12
+ - **工具调用人审(HITL)** — Claude 调工具时自动暂停,IM 同一会话回复 `y`/`n` 即可,**或在 Web 对话界面点弹出的审批卡**
13
+ - **任务仪表盘** `/tasks`,标签覆盖 **Jobs · Background · Subtasks · Schedules · Approvals · Health · Files · Audit**(每个 tab 支持 agent 过滤、Jobs 多选批量、SSE 实时刷新)
14
+ - **多租户 Workspace** — 每个工作区独立的 Agent 白名单 + 限流,**Settings 页加完整 CRUD UI**;`/job` `/schedule` `/audit` 命令也按 creator/workspace 隔离(每个用户只看到自己的)
15
+ - **ACP Server 模式** — im-hub-pro 自身作为 ACP 兼容 Agent(`POST /tasks`,sync + SSE)
16
+ - **持久化 Job Board** + Cron 调度器(SQLite 落地,重启不丢,30 天自动修剪)
17
+ - **智能路由**:意图分类(中英文)、断路器、Sticky 会话
18
+ - **结构化日志**(`pino`)+ 全链路 `traceId` + 审计日志 + Prometheus `/api/metrics`
19
+ - **三态主题**(浅色 / 深色 / 跟随系统),所有页面在首屏前同步应用,无闪烁
20
+ - **v0.2.16 — 安全收口(P0 + P1)**:REST/WS token 常量时比较、Schedule `notify_url` SSRF 防护、日志级别 secret redact、approval socket 路径熵 + 权限校验、`Session.addMessage` per-key 互斥
21
+ - **v0.2.17 — 可观测 + IM 文本边界(P2 + P3)**:静态页 CSP / `X-Frame-Options` / `X-Content-Type-Options`,WebSocket 连接上限 + 背压,Prometheus 标签基数白名单,新增 counter(`im_hub_audit_prune_failed_total` / `im_hub_agent_cleanup_failed_total` / `im_hub_approval_*`),UTF-16 代理对安全切分,auto-allow 指纹 5 → 10 字符,SIGINT 关停时 SQLite WAL 干净 checkpoint
22
+ - **v0.2.18 — IM 重连退避(M9)**:抽公共 `Backoff` 助手(指数 + ±50% jitter),替换 Telegram + WeChat polling 的固定 2s / 5s 重连间隔;多实例从同一次网络抖动恢复时不再锁步打 IM 平台
23
+ - **v0.2.19 — Codex sandbox + Dashboard 过滤 / Audit tab**:codex 接入 `session.planMode`(默认 sandbox 改为显式 `-s workspace-write`,关闭 auto-approval);Jobs/Subtasks/Schedules tab 加 agent 过滤;新增 Audit tab 把 SQLite 审计日志拉到 UI
24
+ - **v0.2.20 — Web 控制台 PR-A**:三态主题管理 + 全局错误边界 + 对话内审批卡(在 Web 聊天界面直接 Allow / Deny / Allow + Auto)
25
+ - **v0.2.21 — Web 控制台 PR-B**:Health tab(每个 agent 的 breaker / 限流余量 / p50/95/99 / sparkline)+ Approvals tab(浏览并解决所有 pending HITL 审批)
26
+ - **v0.2.22 — Web 控制台 PR-C**:SSE 事件流(`/events`)替代轮询,audit / approval / job / metrics 实时推送;Settings 页加 Workspace 完整 CRUD UI
27
+ - **v0.2.23 — Web 控制台 PR-D**:Files tab 只读浏览 `~/.im-hub-workspaces/<agent>/`;Jobs tab 多选 + 批量取消/重跑;Settings 页 header / 容器重新调整布局
28
+
29
+ 完整变更见 [CHANGELOG.md](CHANGELOG.md)。
30
+
31
+ ## Web 对话与任务仪表盘
32
+
33
+ ```
34
+ im-hub-pro start # 启动后访问 http://localhost:3000
35
+ # / 对话(支持对话内审批卡)
36
+ # /tasks jobs · background · subtasks · schedules
37
+ # · approvals · health · files · audit
38
+ # /settings Agent · 通道 · ACP · 工作区
39
+ ```
40
+
41
+ - WebSocket 实时流式响应;**仪表盘走 SSE `/events`** 推送(audit / approval / job / metrics)
42
+ - Agent 切换与对话历史
43
+ - **三态主题**(浅色 / 深色 / 跟随系统),按 tab 持久化 + 全局错误边界
44
+ - 中英双语界面,自动检测浏览器语言
45
+ - `/tasks` 同时展示持久化任务、cron 调度、**`~/.claude/bgjobs`** + **`~/.config/opencode/bgjobs`** + **`~/.codex/bgjobs`** 的后台任务(可用 `IMHUB_BGJOB_ROOTS` 覆盖)、所有会话的 subtask 平铺、agent 健康(breaker · 限流 · p50/95/99 · sparkline)、待审批列表(浏览器直接处理)以及 `~/.im-hub-workspaces/<agent>/` 的只读文件浏览器
46
+
47
+ ## 核心特性
48
+
49
+ - **多路复用** — 一个实例同时对接多个 IM 与多个 Agent
50
+ - **自定义 Agent 接入** — 通过 [ACP 协议](https://agentcommunicationprotocol.dev) 接入任何 HTTP 端点;支持 `/.well-known/acp` 自动发现
51
+ - **内置 IM 通道** — 微信(iLink)、飞书(WebSocket 长连接)、Telegram(grammy)、**Discord**(discord.js)
52
+ - **内置 Agent** — Claude Code、Codex、Copilot、OpenCode(统一 `AgentBase` 适配)
53
+ - **插件架构** — 轻松扩展新 IM / Agent
54
+ - **原生 TypeScript** — 无需 Go / Docker / Redis
55
+ - **JSONL 流式输出** — 真实流式 + 多字节 UTF-8 安全
56
+
57
+ ## 安装
58
+
59
+ ```bash
60
+ npm install -g im-hub-pro
61
+ ```
62
+
63
+ 需要 **Node.js ≥ 18**(生产推荐 ≥ 22 LTS,详见 [`docs/deployment.md`](docs/deployment.md))。
64
+
65
+ ### 从 `im-hub` 迁移
66
+
67
+ `~/.im-hub/` 配置目录、`IMHUB_*` 环境变量、`X-IM-Hub-Token` 请求头、ACP 协议标识(`im-hub-gateway`)全部保持不变 —— 这是纯品牌改名。
68
+
69
+ ```bash
70
+ npm uninstall -g im-hub
71
+ npm install -g im-hub-pro
72
+ im-hub-pro start
73
+ ```
74
+
75
+ ## 快速开始
76
+
77
+ ```bash
78
+ # 1. 配置至少一个 IM
79
+ im-hub-pro config wechat # 扫码登录
80
+ im-hub-pro config feishu # 飞书 App ID + Secret,无需 webhook
81
+ im-hub-pro config telegram # @BotFather 拿 Token
82
+ im-hub-pro config discord # Bot Token,详见 docs/discord-setup.md
83
+
84
+ # 2. (可选)配置 Agent CLI,多数能自动检测
85
+ im-hub-pro config claude
86
+
87
+ # 3. (可选)通过 ACP 接入远端自定义 Agent
88
+ im-hub-pro config agent
89
+
90
+ # 4. 启动
91
+ im-hub-pro start
92
+ ```
93
+
94
+ ### 飞书(WebSocket 长连接)
95
+
96
+ - ✅ 无需 webhook
97
+ - ✅ 无需公网 IP / 域名
98
+ - ✅ 无需 ngrok 内网穿透
99
+ - ✅ 直接从本地启动
100
+
101
+ ### Discord
102
+
103
+ 完整流程(创建 Bot、Intents、OAuth 邀请)见 [`docs/discord-setup.md`](docs/discord-setup.md)。
104
+
105
+ ### 接入你自己的 Agent
106
+
107
+ im-hub-pro 支持 **ACP(Agent Communication Protocol)**,只要你的 Agent 暴露一个标准 HTTP 端点就能接入——业务机器人、内部工具、云服务,皆可。
108
+
109
+ ```bash
110
+ im-hub-pro config agent
111
+ # 交互式:名称、端点、认证(无 / Bearer / API Key),自动验证连接 + /.well-known/acp 自动发现
112
+ ```
113
+
114
+ 接入后用法和内置 Agent 一致:
115
+
116
+ ```
117
+ /myagent 分析一下一季度的销售报告
118
+ ```
119
+
120
+ ### 把 im-hub-pro 当作 Agent 用
121
+
122
+ im-hub-pro 同时暴露 ACP 服务端,任何 ACP 客户端都可以以 `POST http://localhost:3000/tasks`(同步)或加 `?mode=stream`(SSE)调用,鉴权同 Web Token:`Authorization: Bearer <token>`。
123
+
124
+ ## CLI 命令
125
+
126
+ ```
127
+ im-hub-pro # 等同 start
128
+ im-hub-pro start # 启动桥接 + Web UI
129
+ im-hub-pro config wechat # 配置微信
130
+ im-hub-pro config feishu # 配置飞书
131
+ im-hub-pro config telegram # 配置 Telegram
132
+ im-hub-pro config discord # 配置 Discord
133
+ im-hub-pro config claude # 配置 Claude Code
134
+ im-hub-pro config agent # 接入自定义 ACP Agent
135
+ im-hub-pro agents # 列出可用 Agent
136
+ im-hub-pro messengers # 列出可用 IM
137
+ im-hub-pro help
138
+ ```
139
+
140
+ ## 聊天命令
141
+
142
+ 直接在 IM 里发,回包流式回到同一 thread。
143
+
144
+ | 命令 | 含义 |
145
+ |---|---|
146
+ | 任意文本 | 路由到 Agent(Sticky 会话 + 意图分类) |
147
+ | `/<agent> <内容>` | 切换 Agent 并发送(如 `/cc 解释这段代码`、`/oc`、`/cx`、`/co`) |
148
+ | `/help` | 帮助 |
149
+ | `/agents` | 列出可用 Agent |
150
+ | `/status` | 连接状态 |
151
+ | `/new` | 开新会话(清空历史) |
152
+ | `/router status\|policy\|explain\|reset` | 查看路由策略 / 预测某条消息会去哪 |
153
+ | `/audit [n]` | 最近的调用审计 |
154
+ | `/job ...` | 查看 / 取消持久化任务 |
155
+ | `/schedule ...` | 列出 / 添加 / 删除 cron 调度 |
156
+ | `/sessions` | 列出本 thread 最近的会话 |
157
+ | `/model [provider/model]` | 查看或切换会话模型 |
158
+ | `/models` | 列出当前 Agent 可用模型 |
159
+ | `/think on\|off\|...` | 切换"深度思考"模式 |
160
+ | `/stats` | Agent 调用 / 延迟 / 错误统计 |
161
+ | `y` / `n` / `批准` / `拒绝` | 同意 / 拒绝 Claude 工具调用(HITL) |
162
+
163
+ ## 工具调用人审(Human-in-the-loop)
164
+
165
+ 当你从 IM 启动的 Claude 任务尝试调用工具时,im-hub-pro 会暂停它,并在同一 IM 会话发送审批卡片:
166
+
167
+ ```
168
+ 🔐 工具调用审批请求
169
+ 工具:Bash
170
+ 入参:{"command":"rm -rf node_modules"}
171
+ 回复 y 批准 / n 拒绝(5 分钟内未操作将自动拒绝)
172
+ req: a3f1c0d2
173
+ ```
174
+
175
+ 回复 `y` / `n` / `批准` / `拒绝`,决策通过 MCP sidecar 回到 Claude,对应继续或中止执行。同一审批链路在微信 / Telegram / 飞书 / Discord 上零差异工作。可用 `IMHUB_APPROVAL_DISABLED=1` 关闭。
176
+
177
+ ## 架构
178
+
179
+ ```
180
+ ┌─── 外部触发 ────┐
181
+ │ cron 30s tick │
182
+ │ webhook → /api/notify
183
+ │ REST → /api/invoke
184
+ │ ACP → /tasks (sync/SSE)
185
+ └────────────┬─────┘
186
+ ┌─ IM 入口 ────────────────────────┼─────────────────────┐
187
+ │ 微信 iLink (长轮询 + 心跳) │
188
+ │ Telegram (grammy) │
189
+ │ 飞书 (Lark SDK WebSocket) │
190
+ │ Discord (discord.js Gateway) │
191
+ │ Web Chat (浏览器 WebSocket) │
192
+ └────────────────────────────────┬──────────────────────┘
193
+ │ MessageContext
194
+
195
+ ┌── 路由前置 gates ─────────────────┐
196
+ │ workspace.resolve(userId) │
197
+ │ rateLimiter.allow(userKey) │
198
+ │ traceId + pino 子 logger │
199
+ └────────────────┬───────────────────┘
200
+
201
+ ┌── parseMessage + 意图分类 ───────┐
202
+ │ /<cmd> → 内置子命令 │
203
+ │ /<agent> → 显式切换 │
204
+ │ default → classifyIntent │
205
+ │ ├ 主题正则(中英) │
206
+ │ ├ 关键词画像 │
207
+ │ ├ Sticky 会话偏置 │
208
+ │ └ LLM 兜底(按需) │
209
+ └────────────────┬───────────────────┘
210
+
211
+ ┌── Agent 调用 ─────────────────────┐
212
+ │ workspace 白名单 + 断路器 │
213
+ │ + 可用性 TTL 缓存 │
214
+ │ AgentBase.sendPrompt → spawnStream│
215
+ │ (LineBuffer · 真流式 · │
216
+ │ abort/timeout · UTF-8 安全) │
217
+ └────────────────┬───────────────────┘
218
+ ┌──────┬───────┼────────┬─────────┐
219
+ ▼ ▼ ▼ ▼ ▼
220
+ opencode claude codex copilot ACP 远端
221
+
222
+ ▼ (工具需要审批时)
223
+ MCP sidecar ─ unix socket ─ approvalBus
224
+ └─ approvalRouter → IM 会话
225
+
226
+ ┌─ Cross-cutting ───────────────────────────────────────┐
227
+ │ audit-log (SQLite,30 天保留) │
228
+ │ job-board (SQLite 持久化 + AbortController) │
229
+ │ scheduler (30s tick → cron → 入队) │
230
+ │ workspaces (按租户隔离 Agent 白名单 / 限流) │
231
+ │ metrics (Prometheus 文本,/api/metrics) │
232
+ │ session (~/.im-hub/sessions/,append-only JSONL) │
233
+ │ pino (traceId 全链路,生产 JSON) │
234
+ └───────────────────────────────────────────────────────┘
235
+ ```
236
+
237
+ 单进程、单实例:SQLite 三件套(`audit.db` / `jobs.db` / `schedules.db`)+ 会话文件树就是全部持久化层,不依赖 Redis / MQ。
238
+
239
+ 更深入的架构剖析见 [`docs/architecture/current.md`](docs/architecture/current.md)。
240
+
241
+ ## 项目结构
242
+
243
+ ```
244
+ im-hub-pro/
245
+ ├── src/
246
+ │ ├── core/
247
+ │ │ ├── types.ts # 插件接口
248
+ │ │ ├── registry.ts # 插件注册
249
+ │ │ ├── router.ts # 消息路由
250
+ │ │ ├── session.ts # 会话管理(append-only JSONL)
251
+ │ │ ├── workspace.ts # 多租户工作区
252
+ │ │ ├── intent.ts # 意图分类
253
+ │ │ ├── intent-llm.ts # LLM 兜底(LRU 缓存)
254
+ │ │ ├── circuit-breaker.ts # 单 Agent 断路器
255
+ │ │ ├── rate-limiter.ts # Token bucket 限流
256
+ │ │ ├── job-board.ts # 持久化任务 + 取消
257
+ │ │ ├── schedule.ts # cron tick → 入队
258
+ │ │ ├── audit-log.ts # SQLite 审计
259
+ │ │ ├── metrics.ts # Prometheus 分位
260
+ │ │ ├── acp-server.ts # /tasks ACP 服务端
261
+ │ │ ├── approval-bus.ts # 工具审批 pub/sub
262
+ │ │ ├── approval-router.ts # 审批 ↔ IM 桥
263
+ │ │ ├── bgjob-reader.ts # ~/.claude + ~/.config/opencode bgjobs
264
+ │ │ ├── agent-base.ts # CLI Agent 共享 spawn/stream
265
+ │ │ ├── config-schema.ts # zod schema
266
+ │ │ ├── logger.ts # pino + traceId
267
+ │ │ ├── sqlite-helper.ts # 共享 prepare / PRAGMA 缓存
268
+ │ │ └── commands/ # /audit /router /job /schedule /model …
269
+ │ ├── plugins/
270
+ │ │ ├── messengers/
271
+ │ │ │ ├── wechat/ # iLink 长轮询
272
+ │ │ │ ├── feishu/ # Lark SDK WebSocket
273
+ │ │ │ ├── telegram/ # grammy
274
+ │ │ │ └── discord/ # discord.js
275
+ │ │ └── agents/
276
+ │ │ ├── claude-code/ # 含 MCP 审批 sidecar
277
+ │ │ ├── codex/
278
+ │ │ ├── copilot/
279
+ │ │ ├── opencode/
280
+ │ │ └── acp/ # ACP 客户端 + /.well-known 发现
281
+ │ ├── index.ts
282
+ │ ├── cli.ts
283
+ │ └── web/
284
+ │ ├── server.ts # HTTP + WS + REST + ACP server
285
+ │ └── public/
286
+ │ ├── index.html # 对话界面
287
+ │ ├── tasks.html # 任务仪表盘
288
+ │ └── settings.html # 设置界面
289
+ ├── docs/
290
+ │ ├── architecture/{current,target}.md
291
+ │ ├── adr/{0001,0002,0003}-*.md
292
+ │ ├── deployment.md
293
+ │ ├── discord-setup.md
294
+ │ └── upgrade-plan.md
295
+ ├── package.json
296
+ ├── tsconfig.json
297
+ └── README.md
298
+ ```
299
+
300
+ ## 配置
301
+
302
+ 配置文件:`~/.im-hub/config.json`
303
+
304
+ ```json
305
+ {
306
+ "messengers": ["wechat", "discord"],
307
+ "agents": ["claude-code", "opencode"],
308
+ "defaultAgent": "claude-code",
309
+ "discord": {
310
+ "botToken": "***",
311
+ "allowedGuilds": [],
312
+ "allowedChannels": []
313
+ },
314
+ "acpAgents": [
315
+ {
316
+ "name": "my-agent",
317
+ "aliases": ["ma"],
318
+ "endpoint": "https://api.example.com",
319
+ "auth": { "type": "bearer", "token": "***" },
320
+ "enabled": true
321
+ }
322
+ ],
323
+ "workspaces": [
324
+ {
325
+ "id": "team-data",
326
+ "name": "数据团队",
327
+ "agents": ["opencode", "my-agent"],
328
+ "members": ["user-123"],
329
+ "rateLimit": { "rate": 30, "intervalSec": 60, "burst": 60 }
330
+ }
331
+ ]
332
+ }
333
+ ```
334
+
335
+ 由 `zod` 在启动时与每次 PUT `/api/config` 时校验,配置错误会立即报错而不是带病运行。
336
+
337
+ ## 环境要求
338
+
339
+ - **Node.js 18+**(生产建议 22 LTS+)
340
+ - **至少一个 Agent CLI**(或 ACP 远端):
341
+ - `npm i -g @anthropic-ai/claude-code`
342
+ - `npm i -g @openai/codex`
343
+ - `npm i -g @github/copilot`
344
+ - `npm i -g opencode-ai`
345
+
346
+ ## 开发
347
+
348
+ ```bash
349
+ git clone https://github.com/benking007/imhub.git
350
+ cd imhub
351
+ npm install
352
+ npm run build # tsc + 拷贝 public/
353
+ npm run dev # tsc --watch
354
+ npm test # bun test
355
+ npm run typecheck # tsc --noEmit(src + 测试)
356
+ npm start
357
+ ```
358
+
359
+ ## 路线图
360
+
361
+ ### v0.1.x(MVP)
362
+ - [x] 微信扫码登录
363
+ - [x] Claude Code、Codex、Copilot、OpenCode Agent
364
+ - [x] 基础命令路由
365
+
366
+ ### v0.2.0 — 多 IM
367
+ - [x] 飞书适配器
368
+ - [x] Telegram 适配器
369
+ - [x] 会话持久化与对话历史
370
+ - [x] ACP 自定义 Agent 接入
371
+
372
+ ### v0.2.x — Web & UI
373
+ - [x] Web 对话界面(流式)
374
+ - [x] 设置页面
375
+ - [x] 双语界面(EN / 中文)
376
+
377
+ ### v0.2.13 — 基础设施
378
+ - [x] 结构化日志(pino)+ traceId
379
+ - [x] zod 配置 schema 校验
380
+ - [x] AgentBase 抽象 + 可用性缓存
381
+ - [x] 审计日志(SQLite)+ `/audit`
382
+ - [x] 意图分类 + 断路器 + 限流
383
+ - [x] ACP server 模式(`POST /tasks`,sync + SSE)
384
+ - [x] `/.well-known/acp` 自动发现
385
+ - [x] 多租户 Workspace + Agent 白名单
386
+ - [x] 持久化 Job Board + cron 调度
387
+ - [x] Web `/tasks` 面板 + REST API
388
+ - [x] Prometheus 指标
389
+
390
+ ### v0.2.14 — 工具审批
391
+ - [x] IM 端的工具调用人审(HITL)
392
+ - [x] MCP 审批 sidecar(claude-code adapter)
393
+
394
+ ### v0.2.15 — Discord & 仪表盘
395
+ - [x] Discord IM 适配器
396
+ - [x] 任务面板接入 Claude / opencode bgjobs
397
+ - [x] Subtask 平铺列表
398
+
399
+ ### v0.2.16 — 安全收口(P0 + P1)
400
+ - [x] REST + WS token 常量时比较(共享 `safe-equal`)
401
+ - [x] Schedule `notify_url` SSRF 防护(仅 http(s);屏蔽 RFC1918 / loopback / IPv6 ULA)+ 10s fetch 超时 + `redirect:'manual'`
402
+ - [x] HTML 注入 token:用 `JSON.stringify` 取代单引号拼接
403
+ - [x] Telegram bot token 日志脱敏(pino `redact.paths` + adapter 级 scrub)
404
+ - [x] WeChat 凭证文件 `0o600`、父目录 `0o700`
405
+ - [x] Approval socket 路径用 128-bit 随机 + listen 后 `chmod 0o600` + stat 校验
406
+ - [x] Job 结果大小上限(`IMHUB_JOB_RESULT_MAX_BYTES`,默认 1 MiB)+ UTF-8 / JSON 安全截断
407
+ - [x] Job Board 30 天保留 + 6h 修剪 + `creator_id` / `workspace_id` 库内迁移
408
+ - [x] `/job` `/schedule` `/audit` 命令按 creator/workspace 隔离(老库 ownerless 行仍对所有人可见,平稳升级)
409
+ - [x] Workspace 白名单从路由层下沉到命令层
410
+ - [x] 限流器机会式自清扫(不引 setInterval)
411
+ - [x] `Session.addMessage` per-key 互斥(修读改写并发竞态)
412
+
413
+ ### v0.2.17 — 可观测 + IM 文本边界(P2 + P3)
414
+ - [x] 静态页安全响应头(`X-Frame-Options` / `X-Content-Type-Options` / `Referrer-Policy` / CSP)
415
+ - [x] `/api/health` 公开(k8s liveness 友好)
416
+ - [x] WebSocket 连接上限(`IMHUB_MAX_WS_CLIENTS`,默认 100)+ `bufferedAmount` 背压(4 MiB highwater)
417
+ - [x] Prometheus 标签基数白名单(`intent` / `platform` 命中外归 `'other'`)
418
+ - [x] 新增 counter:`im_hub_audit_prune_failed_total`、`im_hub_agent_cleanup_failed_total`、`im_hub_approval_pending` / `im_hub_approval_requests_total` / `im_hub_approval_resolved_total{result=allow|deny|timeout}`
419
+ - [x] `intent-llm` 缓存键 SHA-256 + prompt 截 256 字符(防 LRU 内存膨胀)
420
+ - [x] auto-allow 指纹长度 5 → 10(`git status` ≠ `git stash` ≠ `git submo`)
421
+ - [x] UTF-16 代理对安全切分(emoji 在切点上不再渲染成 `□`)
422
+ - [x] Telegram HTML 转义补 `'` / `"`(approval-card `<a href="...">` 防御)
423
+ - [x] approval-bus 缓冲溢出回 `{type:"fatal"}` 而非静默 destroy
424
+ - [x] SIGINT 关停时 SQLite WAL 干净 checkpoint
425
+ - [x] traceId 12 hex → 16 hex(`~2^48` → `~2^64`)
426
+ - [x] WeChat ilink-client 剩余 4 处 fetch 加超时
427
+ - [x] Discord 输入提示 interval 配 `AbortController`(不再与 `client.destroy()` 抢 channel)
428
+ - [x] WeChat `contextTokens` 在心跳 tick 上周期清扫
429
+ - [x] CI 锁文件修复(腾讯镜像 URL → `https://registry.npmjs.org/`)
430
+
431
+ ### v0.2.18 — IM 重连退避(M9)
432
+ - [x] 抽公共 `Backoff` 助手(指数 + ±jitter,RNG 可注入做确定性测试)
433
+ - [x] Telegram `runPollingLoop`:固定 2s / 5s setTimeout → `Backoff(2s, 60s, 0.5)`;30s 健康运行阈值会重置 backoff
434
+ - [x] WeChat ilink `pollLoop`:内联 `Math.pow(2,n-1)` → `Backoff(2s, 30s, 0.5)`;getUpdates 成功路径调用 reset
435
+
436
+ ### v0.2.19 — Codex sandbox + Dashboard 过滤 / Audit tab
437
+ - [x] Codex 接入 `session.planMode`;默认 sandbox 从 `--full-auto` 改为显式 `-s workspace-write`
438
+ - [x] Jobs / Subtasks / Schedules 三个 tab 加 agent 下拉过滤(`OwnerOpts.agent` 全链路下沉)
439
+ - [x] 新增 Audit tab,把 SQLite 审计日志拉到 UI;`GET /api/audit?agent=&days=&user=&intent=`
440
+
441
+ ### v0.2.20 — Web 控制台 PR-A:主题 + 错误边界 + 对话内审批
442
+ - [x] 三态主题(浅色 / 深色 / 跟随系统),`<head>` 同步应用避免闪烁
443
+ - [x] `_app.js` 共享工具:`window.imhub.{theme,i18n,api,showError}` + 自动安装的错误边界
444
+ - [x] `/` 对话内审批卡(Allow / Deny / Allow + Auto),点击走 WS `approval-action` 回 `approvalBus.resolvePending()`,跟 Telegram inline-button 同一条路径
445
+ - [x] `approval-router` 导出 `bindButtonHandlerForPlatform(platform)`,给延迟注册的 messenger(web 是其中之一)调用,避免 install-before-register 时序问题
446
+
447
+ ### v0.2.21 — Web 控制台 PR-B:Health + Approvals tab
448
+ - [x] Health tab:每个 agent 的 breaker 状态(closed/open/half-open)、限流余量、p50/95/99 延迟、调用次数 / 成功率 / 成本 / 冷却 + 60 次轮询的 p95 sparkline
449
+ - [x] Approvals tab:列出所有 pending HITL 审批(reqId / threadId / tool / 等待时长 / registeredAt),浏览器侧直接 Allow / Deny / Allow + Auto
450
+ - [x] 后端:`GET /api/agent-health` / `GET /api/approvals` / `POST /api/approvals/:reqId/resolve`
451
+ - [x] `approval-bus.PendingApproval` 增 `input` + `registeredAt`;register / cancel 时 emit `'approval'` 事件给 SSE 用
452
+
453
+ ### v0.2.22 — Web 控制台 PR-C:SSE 事件流 + Workspace CRUD UI
454
+ - [x] `src/core/event-bus.ts` — 类型化 publish/subscribe(audit / approval / job / metrics)+ 200 条 ring buffer
455
+ - [x] `GET /events` SSE 端点 — token 走 `?token=`,25s 心跳,listener 错误吞掉
456
+ - [x] Dashboard 接 `EventSource('/events?token=...')`,事件触发只刷可见 tab;轮询保留作为 fallback;`approval requested` 事件让 Approvals tab 标签闪一下高亮
457
+ - [x] Settings 页 Workspace 卡 — 列表 + 新增 / 编辑 / 删除(编辑时 id 锁定,default 行不可编辑/删除)
458
+ - [x] 后端 `GET/POST/PATCH/DELETE /api/workspaces` + `WorkspaceRegistry.{remove(id), listFull()}`;mutation persist 回 `~/.im-hub/config.json`
459
+
460
+ ### v0.2.23 — Web 控制台 PR-D:Files tab + Jobs 批量 + Settings 美化
461
+ - [x] Files tab — 只读浏览 `~/.im-hub-workspaces/<agent>/`,左目录树 / 右内容窗,1 MiB 上限,NUL byte 探测二进制 → base64
462
+ - [x] 路径 traversal 防御:agent 名必须在 `registry.listAgents()` 白名单;resolve 后路径必须等于或位于 `defaultAgentCwd(agent)` base 之下
463
+ - [x] Jobs tab 多选 + 全选 + 隐藏式批量工具栏;选中态跨刷新保留
464
+ - [x] `POST /api/jobs/batch-cancel` / `batch-run` 接受 `{ ids: number[] }`(最多 100),per-id 失败不互相阻断
465
+ - [x] Settings header 重写(`.brand` + `.controls` 双分组)— 修复语言 `<select>` 拉伸成满屏宽问题;容器 720→880,header sticky,toast / `.btn-danger:hover` 改主题变量
466
+
467
+ ### v0.3.0
468
+ - [ ] 钉钉适配器
469
+ - [ ] Slack 适配器
470
+ - [ ] 飞书 / Discord 卡片按钮版审批(替代纯文本)
471
+ - [ ] Cron `nextOccurrence` 内部 UTC 化(DST 安全,CR-2026-05-06 的 M5)
472
+ - [ ] 多实例事件总线(Redis Streams / NATS)让 SSE 在多副本间也能跨进程
473
+ - [ ] Workspace 成员选择 UI(当前 CSV 输入对运维好用但易错)
474
+
475
+ ## 社区 <a name="wechat-group"></a>
476
+
477
+ 有问题?欢迎在 [X](https://x.com/lijieisme) 或 Discord 上交流。
478
+
479
+ <p align="center">
480
+ <a href="https://discord.gg/R83CXYz5">
481
+ <img src="https://img.shields.io/badge/加入_Discord-5865F2?style=for-the-badge&logo=discord&logoColor=white" alt="Join Discord">
482
+ </a>
483
+ &nbsp;
484
+ <a href="https://x.com/lijieisme">
485
+ <img src="https://img.shields.io/badge/关注_X-000000?style=for-the-badge&logo=x&logoColor=white" alt="X">
486
+ </a>
487
+ </p>
488
+
489
+ <p align="center">
490
+ <img src="assets/wechat-group" alt="原作者微信" width="180"><br>
491
+ <sub><i>原作者联系方式</i></sub>
492
+ </p>
493
+
494
+ ## 许可证
495
+
496
+ MIT
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}