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,352 @@
1
+ import type { Logger } from 'pino';
2
+ /**
3
+ * Message received from a messenger platform
4
+ */
5
+ export interface Message {
6
+ id: string;
7
+ threadId: string;
8
+ userId: string;
9
+ text: string;
10
+ timestamp: Date;
11
+ channelId: string;
12
+ }
13
+ /**
14
+ * Chat message for conversation history
15
+ */
16
+ export interface ChatMessage {
17
+ role: 'user' | 'assistant';
18
+ content: string;
19
+ timestamp: Date;
20
+ }
21
+ /**
22
+ * Discriminated union for parsed messages
23
+ * Each variant has a unique `type` field for type-safe pattern matching
24
+ */
25
+ export type ParsedMessage = {
26
+ type: 'default';
27
+ prompt: string;
28
+ } | {
29
+ type: 'command';
30
+ command: 'start' | 'status' | 'help' | 'agents' | 'new';
31
+ } | {
32
+ type: 'agentCommand';
33
+ command: string;
34
+ prompt: string;
35
+ } | {
36
+ type: 'agent';
37
+ agent: string;
38
+ prompt: string;
39
+ } | {
40
+ type: 'audit';
41
+ args: string;
42
+ } | {
43
+ type: 'router';
44
+ args: string;
45
+ } | {
46
+ type: 'workspaces';
47
+ args: string;
48
+ } | {
49
+ type: 'schedule';
50
+ args: string;
51
+ } | {
52
+ type: 'job';
53
+ args: string;
54
+ } | {
55
+ type: 'model';
56
+ args: string;
57
+ } | {
58
+ type: 'think';
59
+ args: string;
60
+ } | {
61
+ type: 'stats';
62
+ args: string;
63
+ } | {
64
+ type: 'sessions';
65
+ args: string;
66
+ } | {
67
+ type: 'approval';
68
+ args: string;
69
+ } | {
70
+ type: 'plan';
71
+ args: string;
72
+ } | {
73
+ type: 'error';
74
+ prompt: string;
75
+ error: string;
76
+ };
77
+ /**
78
+ * Message context passed through the processing pipeline
79
+ */
80
+ export interface MessageContext {
81
+ message: Message;
82
+ platform: string;
83
+ channelId: string;
84
+ agent?: string;
85
+ session?: Session;
86
+ /** Unique trace id generated at message ingestion */
87
+ traceId?: string;
88
+ /** Child logger bound to this request's traceId */
89
+ logger?: Logger;
90
+ }
91
+ /**
92
+ * Session state for a conversation
93
+ * Keyed by `${platform}:${channelId}:${threadId}` for uniqueness
94
+ */
95
+ export interface Session {
96
+ id: string;
97
+ channelId: string;
98
+ threadId: string;
99
+ platform: string;
100
+ agent: string;
101
+ createdAt: Date;
102
+ lastActivity: Date;
103
+ ttl: number;
104
+ messages: ChatMessage[];
105
+ /** Current model (provider/model format) */
106
+ model?: string;
107
+ /** Thinking depth variant */
108
+ variant?: string;
109
+ /** Per-session usage roll-up. Updated by callAgentWithHistory after every
110
+ * successful agent invocation. Persisted with the session metadata so
111
+ * /stats survives restart. */
112
+ usage?: SessionUsage;
113
+ /** Active subtask id for /switch routing */
114
+ activeSubtaskId?: number | null;
115
+ subtasks?: SubtaskMeta[];
116
+ subtaskCounter?: number;
117
+ /** UUID we pre-allocate for the claude-code adapter so multiple turns in
118
+ * the same im-hub conversation share one resumable claude session
119
+ * (`claude --resume <uuid>`). Persists across restarts. */
120
+ claudeSessionId?: string;
121
+ /** Set to true after the first successful claude-code run on this session.
122
+ * cli uses it to decide between `--session-id` (fresh, allowed once) and
123
+ * `--resume` (subsequent turns). Cleared by /new. */
124
+ claudeSessionPrimed?: boolean;
125
+ /** opencode session id (`ses_…`) discovered from opencode's first JSON event
126
+ * on a fresh run. Subsequent turns pass `--session <id>` so opencode
127
+ * resumes the same conversation from its own DB and im-hub no longer needs
128
+ * to stitch the history into the prompt. Cleared by /new. */
129
+ opencodeSessionId?: string;
130
+ /** codex thread id (UUID) discovered from codex's `thread.started` event on
131
+ * a fresh run. Subsequent turns spawn `codex exec resume <id> …` so codex
132
+ * continues the same session from its own ~/.codex/sessions store. Cleared
133
+ * by /new. */
134
+ codexSessionId?: string;
135
+ /** Plan mode flag — toggled by /plan on / /plan off. When true:
136
+ * • claude-code adapter spawns with `--permission-mode plan` and bypasses
137
+ * the IM approval bus (plan mode is read-only, no mutations to gate).
138
+ * • opencode adapter routes through the built-in `plan` agent and skips
139
+ * the medium-gate ruleset PATCH (plan agent's deny-edit policy is
140
+ * already stricter than the IM gate).
141
+ * Persists across turns and `/oc`↔`/cc` agent switches; cleared by /new. */
142
+ planMode?: boolean;
143
+ }
144
+ export interface SessionUsage {
145
+ turns: number;
146
+ costUsd: number;
147
+ promptChars: number;
148
+ responseChars: number;
149
+ durationMsTotal: number;
150
+ /** ISO string of first invocation */
151
+ startedAt: string;
152
+ }
153
+ /** Lightweight subtask metadata stored in parent session */
154
+ export interface SubtaskMeta {
155
+ id: number;
156
+ agent: string;
157
+ prompt: string;
158
+ status: 'pending' | 'running' | 'completed' | 'failed' | 'cancelled';
159
+ result?: string;
160
+ createdAt: Date;
161
+ completedAt?: Date;
162
+ }
163
+ /**
164
+ * Adapter interface for messenger platforms (WeChat, Feishu, Telegram)
165
+ */
166
+ export interface MessengerAdapter {
167
+ readonly name: string;
168
+ start(): Promise<void>;
169
+ stop(): Promise<void>;
170
+ onMessage(handler: (ctx: MessageContext) => Promise<void>): void;
171
+ sendMessage(threadId: string, text: string): Promise<void>;
172
+ /**
173
+ * Send typing indicator to show the bot is processing
174
+ * @param threadId - The conversation thread ID
175
+ * @param isTyping - true to start typing indicator, false to stop
176
+ */
177
+ sendTyping?(threadId: string, isTyping: boolean): Promise<void>;
178
+ /**
179
+ * Send an interactive card (Feishu only)
180
+ * @param threadId - The conversation thread ID
181
+ * @param card - The card JSON object
182
+ */
183
+ sendCard?(threadId: string, card: unknown): Promise<void>;
184
+ /**
185
+ * Send a "thinking" placeholder message (e.g. 🤔 思考中…) and return a
186
+ * dismiss handle. Adapters that can delete or update their own messages
187
+ * (Feishu) should return a callable that removes the placeholder before
188
+ * the real response is sent. Adapters that cannot recall (WeChat iLink)
189
+ * should still send the placeholder and return undefined — the placeholder
190
+ * lingers in the chat but at least gives the user immediate feedback.
191
+ * Adapters that prefer their native typing indicator can omit this method.
192
+ */
193
+ sendThinking?(threadId: string, text: string): Promise<ThinkingHandle | undefined>;
194
+ /**
195
+ * Subscribe to inline-button (callback_query) events. Adapters that support
196
+ * native interactive buttons (Telegram inline keyboard, Feishu card actions
197
+ * once we wire them) call the handler when a user taps a button. Adapters
198
+ * without native button support simply omit this method — approval-router
199
+ * falls back to its text/y-n flow.
200
+ *
201
+ * Idempotent: re-registering replaces the previous handler.
202
+ */
203
+ onButtonCallback?(handler: (cb: ButtonCallback) => Promise<void>): void;
204
+ /**
205
+ * Send an approval prompt as a rich card with action buttons. When this
206
+ * method is implemented, approval-router prefers it over plain
207
+ * sendMessage. The returned messageId is later passed to editApprovalCard
208
+ * so the card can be replaced with the outcome (✅ / ❌ / ⏱).
209
+ *
210
+ * Adapters that don't implement this fall back to sendMessage(text) — the
211
+ * text path remains the canonical approval channel for Feishu / WeChat /
212
+ * any IM that doesn't have native button support.
213
+ */
214
+ sendApprovalCard?(threadId: string, prompt: ApprovalCardPrompt): Promise<{
215
+ messageId: string;
216
+ }>;
217
+ /**
218
+ * Replace the body of an approval card after the request has been resolved
219
+ * (allowed / denied / timed out). Best-effort: failure is logged and
220
+ * swallowed by the router, since the underlying approval has already
221
+ * resolved on the bus side.
222
+ */
223
+ editApprovalCard?(threadId: string, messageId: string, outcome: ApprovalCardOutcome): Promise<void>;
224
+ }
225
+ /**
226
+ * Inline-button tap event surfaced by adapters that implement
227
+ * onButtonCallback. The data field is opaque to the adapter; consumers
228
+ * (approval-router, future button consumers) parse it.
229
+ *
230
+ * ack MUST be called within ~1s on Telegram or the client shows a stuck
231
+ * "loading" spinner — adapters wrap their platform-native ack so callers
232
+ * can stay platform-agnostic.
233
+ */
234
+ export interface ButtonCallback {
235
+ /** Raw callback_data string (Telegram caps at 64 bytes UTF-8). */
236
+ data: string;
237
+ threadId: string;
238
+ userId: string;
239
+ /** Display name for the user who tapped (e.g. "@benking" or first_name).
240
+ * Used for "已批准 by @benking" rendering. Optional — adapters that
241
+ * can't easily resolve a display name should leave it undefined. */
242
+ userDisplay?: string;
243
+ /** ID of the message that owned the button — passed back to
244
+ * editApprovalCard for in-place updates. */
245
+ messageId: string;
246
+ /** Acknowledge the button tap to the platform. Optional toast text
247
+ * (Telegram shows it briefly above the chat). Errors are swallowed. */
248
+ ack: (text?: string) => Promise<void>;
249
+ }
250
+ /**
251
+ * Payload handed to sendApprovalCard. inputJson is already truncated to a
252
+ * display-safe length by the caller (router) — adapters should render it
253
+ * as-is in a code block.
254
+ */
255
+ export interface ApprovalCardPrompt {
256
+ /** Bus-side request id; embedded in callback_data so the button click
257
+ * knows which approval to resolve. Adapters must not depend on its
258
+ * internal format. */
259
+ reqId: string;
260
+ toolName: string;
261
+ /** Stringified input, already length-capped. May contain newlines. */
262
+ inputJson: string;
263
+ /** 'normal' = ask user; 'auto-allow' = grace window before automatic
264
+ * allow (only the deny button is meaningful). */
265
+ mode: 'normal' | 'auto-allow';
266
+ /** Auto-allow grace window in seconds, present iff mode === 'auto-allow'. */
267
+ graceSeconds?: number;
268
+ }
269
+ /**
270
+ * Outcome rendered into a card after the approval is resolved. The card's
271
+ * action buttons are removed during this edit so the user can no longer
272
+ * tap a stale button.
273
+ */
274
+ export interface ApprovalCardOutcome {
275
+ decision: 'allowed' | 'allowed-pinned' | 'denied' | 'denied-revoked' | 'expired';
276
+ /** "@user" or first name of the human who decided, if known. */
277
+ byUserDisplay?: string;
278
+ atDate: Date;
279
+ }
280
+ /** Optional callback returned by sendThinking; invoked once the real response
281
+ * is ready, to remove or otherwise hide the placeholder. */
282
+ export type ThinkingHandle = () => Promise<void>;
283
+ /**
284
+ * Optional per-call context piped from the IM router into the agent. Lets
285
+ * adapters (e.g. ClaudeCodeAdapter) route side-channel events back to the
286
+ * originating IM conversation — for instance, permission prompts surfaced
287
+ * via approval-bus.
288
+ *
289
+ * All fields optional so non-IM call sites (web, scheduler, intent-llm) can
290
+ * keep calling sendPrompt without adornment.
291
+ */
292
+ export interface AgentSendOpts {
293
+ model?: string;
294
+ variant?: string;
295
+ threadId?: string;
296
+ platform?: string;
297
+ userId?: string;
298
+ channelId?: string;
299
+ /** Optional UUID to bind to the agent's own resumable-session concept.
300
+ * Currently honoured by the claude-code adapter (passed as
301
+ * `--session-id` for first call, `--resume` for subsequent calls) so
302
+ * multi-turn IM conversations share one resumable claude session and
303
+ * the user can later `claude --resume <uuid>` to continue from their
304
+ * terminal. Other adapters ignore this. */
305
+ agentSessionId?: string;
306
+ /** When true, the adapter should resume an existing session under
307
+ * `agentSessionId` rather than create a new one. claude-code translates
308
+ * this to `--resume <uuid>` instead of `--session-id <uuid>`. */
309
+ agentSessionResume?: boolean;
310
+ /** Optional one-shot callback for adapters whose CLI generates the session
311
+ * id itself (rather than letting im-hub pre-allocate). opencode emits
312
+ * `sessionID` in every JSON event; the adapter calls this when it sees
313
+ * the id so cli can persist it on the im-hub session row for next turn.
314
+ * Idempotent: same id may fire multiple times per spawn. */
315
+ onAgentSessionId?: (id: string) => void;
316
+ /** Optional callback for adapters that surface usage data inline (cost +
317
+ * tokens). opencode's `step_finish` event carries this; cli accumulates
318
+ * the deltas to feed `recordUsage` so /stats reflects opencode cost. */
319
+ onUsage?: (delta: {
320
+ costUsd?: number;
321
+ tokensInput?: number;
322
+ tokensOutput?: number;
323
+ }) => void;
324
+ /** When true, the adapter should run the agent in plan / read-only mode.
325
+ * claude-code translates this to `--permission-mode plan`; opencode
326
+ * translates it to `--agent plan` (stdio) or `agent: 'plan'` in the HTTP
327
+ * body. Other adapters ignore this. See Session.planMode for lifecycle. */
328
+ planMode?: boolean;
329
+ }
330
+ /**
331
+ * Adapter interface for AI coding agents (Claude Code, Codex, Copilot)
332
+ *
333
+ * sendPrompt returns an AsyncGenerator for streaming responses.
334
+ * Each yielded string is a complete message chunk.
335
+ * The generator throws on error — caller catches and handles.
336
+ */
337
+ export interface AgentAdapter {
338
+ readonly name: string;
339
+ readonly aliases: string[];
340
+ sendPrompt(sessionId: string, prompt: string, history?: ChatMessage[], opts?: AgentSendOpts): AsyncGenerator<string>;
341
+ isAvailable(): Promise<boolean>;
342
+ }
343
+ /**
344
+ * Configuration for the im-hub instance
345
+ */
346
+ export interface Config {
347
+ messengers: string[];
348
+ agents: string[];
349
+ defaultAgent: string;
350
+ [key: string]: unknown;
351
+ }
352
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ // im-hub core types
2
+ export {};
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA,oBAAoB"}
@@ -0,0 +1,67 @@
1
+ import { RateLimiter } from './rate-limiter.js';
2
+ export interface WorkspaceConfig {
3
+ id: string;
4
+ name: string;
5
+ agents: string[];
6
+ rateLimit?: {
7
+ rate: number;
8
+ intervalSec: number;
9
+ burst: number;
10
+ };
11
+ members?: string[];
12
+ }
13
+ export declare class Workspace {
14
+ readonly id: string;
15
+ readonly name: string;
16
+ readonly agentWhitelist: Set<string>;
17
+ readonly limiter: RateLimiter;
18
+ readonly memberSet: Set<string> | null;
19
+ constructor(cfg: WorkspaceConfig);
20
+ hasAgent(agent: string): boolean;
21
+ hasMember(userId: string): boolean;
22
+ allow(userKey: string): boolean;
23
+ }
24
+ export declare class WorkspaceRegistry {
25
+ private workspaces;
26
+ private defaultWorkspace;
27
+ constructor();
28
+ add(cfg: WorkspaceConfig): void;
29
+ /**
30
+ * Remove a workspace by id. Returns true on success, false if the id
31
+ * doesn't exist or refers to the default workspace (which is created
32
+ * by the constructor and used as a fallback — removing it would break
33
+ * `resolve()` for users without an explicit assignment).
34
+ */
35
+ remove(id: string): boolean;
36
+ get(id: string): Workspace | undefined;
37
+ /** Resolve workspace for a user. Prioritizes named workspaces over default. */
38
+ resolve(userId: string): Workspace;
39
+ /** Load from config */
40
+ load(config: {
41
+ workspaces?: WorkspaceConfig[];
42
+ }): void;
43
+ /**
44
+ * Return summaries of every registered workspace, including the default.
45
+ * Used by `/workspaces` and the Web settings UI.
46
+ */
47
+ list(): Array<{
48
+ id: string;
49
+ name: string;
50
+ agents: string[];
51
+ members: number | null;
52
+ rateLimit: {
53
+ rate: number;
54
+ intervalSec: number;
55
+ burst: number;
56
+ };
57
+ }>;
58
+ /**
59
+ * Full config snapshot for the settings UI, including the original
60
+ * member list. Distinct from `list()`'s summary shape (which exposes
61
+ * only a member count to preserve callers that don't need the IDs).
62
+ */
63
+ listFull(): WorkspaceConfig[];
64
+ get default(): Workspace;
65
+ }
66
+ export declare const workspaceRegistry: WorkspaceRegistry;
67
+ //# sourceMappingURL=workspace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../../src/core/workspace.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAE/C,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,SAAS,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAA;IAChE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;CACnB;AAED,qBAAa,SAAS;IACpB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IACpC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAA;IAC7B,QAAQ,CAAC,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAAA;gBAE1B,GAAG,EAAE,eAAe;IAYhC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAMhC,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAKlC,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;CAGhC;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,UAAU,CAA+B;IACjD,OAAO,CAAC,gBAAgB,CAAW;;IAcnC,GAAG,CAAC,GAAG,EAAE,eAAe,GAAG,IAAI;IAI/B;;;;;OAKG;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAK3B,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAItC,+EAA+E;IAC/E,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS;IAQlC,uBAAuB;IACvB,IAAI,CAAC,MAAM,EAAE;QAAE,UAAU,CAAC,EAAE,eAAe,EAAE,CAAA;KAAE,GAAG,IAAI;IAQtD;;;OAGG;IACH,IAAI,IAAI,KAAK,CAAC;QACZ,EAAE,EAAE,MAAM,CAAA;QACV,IAAI,EAAE,MAAM,CAAA;QACZ,MAAM,EAAE,MAAM,EAAE,CAAA;QAChB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;QACtB,SAAS,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,WAAW,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAA;KAChE,CAAC;IAUF;;;;OAIG;IACH,QAAQ,IAAI,eAAe,EAAE;IAU7B,IAAI,OAAO,IAAI,SAAS,CAAiC;CAC1D;AAED,eAAO,MAAM,iBAAiB,mBAA0B,CAAA"}
@@ -0,0 +1,113 @@
1
+ // Multi-tenant workspace registry
2
+ //
3
+ // Each workspace has its own agent whitelist, rate limits, and config.
4
+ // The default workspace handles existing single-tenant deployments.
5
+ import { RateLimiter } from './rate-limiter.js';
6
+ export class Workspace {
7
+ id;
8
+ name;
9
+ agentWhitelist;
10
+ limiter;
11
+ memberSet; // null = open
12
+ constructor(cfg) {
13
+ this.id = cfg.id;
14
+ this.name = cfg.name;
15
+ this.agentWhitelist = new Set(cfg.agents);
16
+ this.limiter = new RateLimiter(cfg.rateLimit?.rate ?? 10, (cfg.rateLimit?.intervalSec ?? 60) * 1000, cfg.rateLimit?.burst ?? 15);
17
+ this.memberSet = cfg.members?.length ? new Set(cfg.members) : null;
18
+ }
19
+ hasAgent(agent) {
20
+ // Empty whitelist = unrestricted. Named whitelist enforces membership.
21
+ if (this.agentWhitelist.size === 0)
22
+ return true;
23
+ return this.agentWhitelist.has(agent);
24
+ }
25
+ hasMember(userId) {
26
+ if (!this.memberSet)
27
+ return true; // open workspace
28
+ return this.memberSet.has(userId);
29
+ }
30
+ allow(userKey) {
31
+ return this.limiter.allow(userKey);
32
+ }
33
+ }
34
+ export class WorkspaceRegistry {
35
+ workspaces = new Map();
36
+ defaultWorkspace;
37
+ constructor() {
38
+ // Default workspace is unrestricted (empty whitelist) so any registered
39
+ // agent — including ACP-added custom agents — is reachable without
40
+ // explicit workspace configuration.
41
+ this.defaultWorkspace = new Workspace({
42
+ id: 'default',
43
+ name: 'Default',
44
+ agents: [],
45
+ });
46
+ this.workspaces.set('default', this.defaultWorkspace);
47
+ }
48
+ add(cfg) {
49
+ this.workspaces.set(cfg.id, new Workspace(cfg));
50
+ }
51
+ /**
52
+ * Remove a workspace by id. Returns true on success, false if the id
53
+ * doesn't exist or refers to the default workspace (which is created
54
+ * by the constructor and used as a fallback — removing it would break
55
+ * `resolve()` for users without an explicit assignment).
56
+ */
57
+ remove(id) {
58
+ if (id === 'default')
59
+ return false;
60
+ return this.workspaces.delete(id);
61
+ }
62
+ get(id) {
63
+ return this.workspaces.get(id);
64
+ }
65
+ /** Resolve workspace for a user. Prioritizes named workspaces over default. */
66
+ resolve(userId) {
67
+ for (const ws of this.workspaces.values()) {
68
+ if (ws.id === 'default')
69
+ continue; // default matches last
70
+ if (ws.hasMember(userId))
71
+ return ws;
72
+ }
73
+ return this.defaultWorkspace;
74
+ }
75
+ /** Load from config */
76
+ load(config) {
77
+ if (config.workspaces) {
78
+ for (const cfg of config.workspaces) {
79
+ this.add(cfg);
80
+ }
81
+ }
82
+ }
83
+ /**
84
+ * Return summaries of every registered workspace, including the default.
85
+ * Used by `/workspaces` and the Web settings UI.
86
+ */
87
+ list() {
88
+ return Array.from(this.workspaces.values()).map((ws) => ({
89
+ id: ws.id,
90
+ name: ws.name,
91
+ agents: Array.from(ws.agentWhitelist),
92
+ members: ws.memberSet ? ws.memberSet.size : null,
93
+ rateLimit: ws.limiter.config(),
94
+ }));
95
+ }
96
+ /**
97
+ * Full config snapshot for the settings UI, including the original
98
+ * member list. Distinct from `list()`'s summary shape (which exposes
99
+ * only a member count to preserve callers that don't need the IDs).
100
+ */
101
+ listFull() {
102
+ return Array.from(this.workspaces.values()).map((ws) => ({
103
+ id: ws.id,
104
+ name: ws.name,
105
+ agents: Array.from(ws.agentWhitelist),
106
+ members: ws.memberSet ? Array.from(ws.memberSet) : [],
107
+ rateLimit: ws.limiter.config(),
108
+ }));
109
+ }
110
+ get default() { return this.defaultWorkspace; }
111
+ }
112
+ export const workspaceRegistry = new WorkspaceRegistry();
113
+ //# sourceMappingURL=workspace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../src/core/workspace.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export * from './core/types.js';
2
+ export * from './core/registry.js';
3
+ export * from './core/router.js';
4
+ export * from './core/session.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,cAAc,iBAAiB,CAAA;AAC/B,cAAc,oBAAoB,CAAA;AAClC,cAAc,kBAAkB,CAAA;AAChC,cAAc,mBAAmB,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ // im-hub main entry point
2
+ export * from './core/types.js';
3
+ export * from './core/registry.js';
4
+ export * from './core/router.js';
5
+ export * from './core/session.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,0BAA0B;AAE1B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,oBAAoB,CAAA;AAClC,cAAc,kBAAkB,CAAA;AAChC,cAAc,mBAAmB,CAAA"}
@@ -0,0 +1,16 @@
1
+ import type { AgentAdapter, ChatMessage } from '../../../core/types.js';
2
+ import type { ACPAgentConfig, ACPManifest } from './types.js';
3
+ export declare class ACPAdapter implements AgentAdapter {
4
+ readonly name: string;
5
+ readonly aliases: string[];
6
+ private client;
7
+ constructor(config: ACPAgentConfig);
8
+ isAvailable(): Promise<boolean>;
9
+ sendPrompt(sessionId: string, prompt: string, history?: ChatMessage[], _opts?: {
10
+ model?: string;
11
+ variant?: string;
12
+ }): AsyncGenerator<string>;
13
+ /** Get the agent manifest for display (not part of AgentAdapter interface) */
14
+ getManifest(): Promise<ACPManifest | undefined>;
15
+ }
16
+ //# sourceMappingURL=acp-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acp-adapter.d.ts","sourceRoot":"","sources":["../../../../src/plugins/agents/acp/acp-adapter.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AACvE,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAM7D,qBAAa,UAAW,YAAW,YAAY;IAC7C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,CAAA;IAC1B,OAAO,CAAC,MAAM,CAAW;gBAEb,MAAM,EAAE,cAAc;IAM5B,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAI9B,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,EAAE,EAAE,KAAK,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,cAAc,CAAC,MAAM,CAAC;IAiBnJ,8EAA8E;IACxE,WAAW,IAAI,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;CAOtD"}
@@ -0,0 +1,49 @@
1
+ // ACPAdapter — bridges ACP protocol to IM-Hub's AgentAdapter interface.
2
+ //
3
+ // P2-C: sessionId is now forwarded to the remote agent in the request body
4
+ // (as `session_id`) so multi-turn conversations preserve context across
5
+ // HTTP calls. Remote agents that don't recognize the field simply ignore
6
+ // it; this is a forward-compatible spec extension.
7
+ import { ACPClient } from './acp-client.js';
8
+ import { logger as rootLogger } from '../../../core/logger.js';
9
+ const log = rootLogger.child({ component: 'acp-adapter' });
10
+ export class ACPAdapter {
11
+ name;
12
+ aliases;
13
+ client;
14
+ constructor(config) {
15
+ this.name = config.name;
16
+ this.aliases = config.aliases || [];
17
+ this.client = new ACPClient(config);
18
+ }
19
+ async isAvailable() {
20
+ return this.client.healthCheck();
21
+ }
22
+ async *sendPrompt(sessionId, prompt, history, _opts) {
23
+ // Try streaming first, fall back to sync.
24
+ // NOTE: Fallback creates a new task; if the streaming task was partially
25
+ // processed, the agent may repeat work. Acceptable for v1.
26
+ try {
27
+ for await (const chunk of this.client.streamPrompt(prompt, history, sessionId)) {
28
+ yield chunk;
29
+ }
30
+ }
31
+ catch (streamError) {
32
+ const errMsg = streamError instanceof Error ? streamError.message : String(streamError);
33
+ log.warn({ agent: this.name, error: errMsg, sessionId }, 'ACP streaming failed, falling back to sync');
34
+ const response = await this.client.sendPromptSync(prompt, history, sessionId);
35
+ if (response)
36
+ yield response;
37
+ }
38
+ }
39
+ /** Get the agent manifest for display (not part of AgentAdapter interface) */
40
+ async getManifest() {
41
+ try {
42
+ return await this.client.fetchManifest();
43
+ }
44
+ catch {
45
+ return undefined;
46
+ }
47
+ }
48
+ }
49
+ //# sourceMappingURL=acp-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acp-adapter.js","sourceRoot":"","sources":["../../../../src/plugins/agents/acp/acp-adapter.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,EAAE;AACF,2EAA2E;AAC3E,wEAAwE;AACxE,yEAAyE;AACzE,mDAAmD;AAInD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,yBAAyB,CAAA;AAE9D,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC,CAAA;AAE1D,MAAM,OAAO,UAAU;IACZ,IAAI,CAAQ;IACZ,OAAO,CAAU;IAClB,MAAM,CAAW;IAEzB,YAAY,MAAsB;QAChC,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAA;QACvB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAA;QACnC,IAAI,CAAC,MAAM,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,CAAA;IACrC,CAAC;IAED,KAAK,CAAC,WAAW;QACf,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAA;IAClC,CAAC;IAED,KAAK,CAAC,CAAC,UAAU,CAAC,SAAiB,EAAE,MAAc,EAAE,OAAuB,EAAE,KAA4C;QACxH,0CAA0C;QAC1C,yEAAyE;QACzE,2DAA2D;QAC3D,IAAI,CAAC;YACH,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,CAAC;gBAC/E,MAAM,KAAK,CAAA;YACb,CAAC;QACH,CAAC;QAAC,OAAO,WAAW,EAAE,CAAC;YACrB,MAAM,MAAM,GAAG,WAAW,YAAY,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;YACvF,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,EACrD,4CAA4C,CAAC,CAAA;YAC/C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,CAAA;YAC7E,IAAI,QAAQ;gBAAE,MAAM,QAAQ,CAAA;QAC9B,CAAC;IACH,CAAC;IAED,8EAA8E;IAC9E,KAAK,CAAC,WAAW;QACf,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAA;QAC1C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAA;QAClB,CAAC;IACH,CAAC;CACF"}