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,332 @@
1
+ // Discord adapter β€” offline tests.
2
+ //
3
+ // We don't dial out to discord.gg here. Instead we new the adapter, then
4
+ // inject a mock `Client` (assigning to the private field) and a mock config.
5
+ // This exercises every code path *except* `client.login()`, which is exactly
6
+ // what we want β€” login is already covered by discord.js's own tests.
7
+ //
8
+ // Two slices:
9
+ // 1. Adapter contract β€” sendMessage routes via channels.fetch().send(),
10
+ // messageCreate forwards the right MessageContext, whitelist filtering
11
+ // and bot self-message filtering both work.
12
+ // 2. End-to-end with the real ApprovalBus + approval-router. Sidecar pokes
13
+ // bus β†’ bus calls notifier β†’ notifier hits DiscordAdapter.sendMessage β†’
14
+ // mock channel records the prompt β†’ user "replies" by emitting a fake
15
+ // messageCreate β†’ cli.ts's interception path resolves the pending. We
16
+ // verify the sidecar receives `{behavior: "allow"}`.
17
+ //
18
+ // All tests use mock objects shaped just enough for the adapter; the public
19
+ // discord.js types stay external.
20
+ import { describe, it, expect, beforeEach, afterEach } from 'bun:test';
21
+ import { EventEmitter } from 'events';
22
+ import { tmpdir } from 'os';
23
+ import { join } from 'path';
24
+ import { randomBytes } from 'crypto';
25
+ import { createConnection } from 'net';
26
+ import { DiscordAdapter } from './discord-adapter.js';
27
+ import { approvalBus, } from '../../../core/approval-bus.js';
28
+ import { install as installApprovalRouter, uninstall as uninstallApprovalRouter, tryHandleApprovalReply, platformToMessengerName, } from '../../../core/approval-router.js';
29
+ // ChannelType.GuildText = 0; DM = 1 (verified against discord-api-types/v10)
30
+ const TYPE_GUILD_TEXT = 0;
31
+ function makeFakeChannel(id, type = TYPE_GUILD_TEXT) {
32
+ const sent = [];
33
+ return {
34
+ id,
35
+ type,
36
+ sent,
37
+ send: async (text) => { sent.push(text); return { id: `msg-${sent.length}` }; },
38
+ sendTyping: async () => { },
39
+ isTextBased: () => true,
40
+ };
41
+ }
42
+ function makeFakeClient(channels) {
43
+ const ee = new EventEmitter();
44
+ ee.channels = {
45
+ fetch: async (id) => channels.get(id) ?? null,
46
+ };
47
+ ee.destroy = () => { };
48
+ return ee;
49
+ }
50
+ /**
51
+ * Bootstrap a DiscordAdapter without going through start(). Sets the private
52
+ * `client` and `config` so the adapter behaves as if logged in.
53
+ */
54
+ function bootAdapter(opts) {
55
+ const adapter = new DiscordAdapter();
56
+ const client = makeFakeClient(opts.channels);
57
+ adapter.client = client;
58
+ adapter.config = {
59
+ botToken: 'fake',
60
+ channelId: opts.config?.channelId ?? 'default',
61
+ allowedGuilds: opts.config?.allowedGuilds,
62
+ allowedChannels: opts.config?.allowedChannels,
63
+ };
64
+ adapter.isRunning = true;
65
+ // Hook the same event the real start() does.
66
+ client.on('messageCreate', async (m) => {
67
+ await adapter.handleDiscordMessage(m);
68
+ });
69
+ const received = [];
70
+ adapter.onMessage(async (ctx) => { received.push(ctx); });
71
+ return { adapter, client, received };
72
+ }
73
+ function uniqueSocketPath() {
74
+ return join(tmpdir(), `imhub-discord-test-${process.pid}-${randomBytes(4).toString('hex')}.sock`);
75
+ }
76
+ describe('DiscordAdapter β€” sendMessage', () => {
77
+ it('writes the message to the channel resolved by channels.fetch', async () => {
78
+ const ch = makeFakeChannel('chan-1');
79
+ const { adapter } = bootAdapter({ channels: new Map([['chan-1', ch]]) });
80
+ await adapter.sendMessage('chan-1', 'hello world');
81
+ expect(ch.sent.length).toBe(1);
82
+ expect(ch.sent[0]).toBe('hello world');
83
+ });
84
+ it('passes text through markdownToDiscord (heading β†’ bold)', async () => {
85
+ const ch = makeFakeChannel('chan-1');
86
+ const { adapter } = bootAdapter({ channels: new Map([['chan-1', ch]]) });
87
+ await adapter.sendMessage('chan-1', '# Title\nbody');
88
+ expect(ch.sent.length).toBe(1);
89
+ // # Title becomes **Title** so Discord renders it as bold rather than '#'.
90
+ expect(ch.sent[0]).toContain('**Title**');
91
+ expect(ch.sent[0]).not.toMatch(/^#\s/m);
92
+ });
93
+ it('throws when channel is not resolvable', async () => {
94
+ const { adapter } = bootAdapter({ channels: new Map() });
95
+ await expect(adapter.sendMessage('missing', 'x')).rejects.toThrow(/not found|not text-based/);
96
+ });
97
+ it('splits into multiple sends when message exceeds 2000 chars', async () => {
98
+ const ch = makeFakeChannel('chan-1');
99
+ const { adapter } = bootAdapter({ channels: new Map([['chan-1', ch]]) });
100
+ const big = 'x'.repeat(4500);
101
+ await adapter.sendMessage('chan-1', big);
102
+ expect(ch.sent.length).toBeGreaterThanOrEqual(2);
103
+ for (const chunk of ch.sent)
104
+ expect(chunk.length).toBeLessThanOrEqual(2000);
105
+ });
106
+ });
107
+ describe('DiscordAdapter β€” incoming messageCreate', () => {
108
+ it('forwards a MessageContext with platform="discord" and threadId=channelId', async () => {
109
+ const ch = makeFakeChannel('chan-1');
110
+ const { client, received } = bootAdapter({ channels: new Map([['chan-1', ch]]) });
111
+ client.emit('messageCreate', {
112
+ id: 'm-1',
113
+ channelId: 'chan-1',
114
+ guildId: 'g-1',
115
+ content: 'hello',
116
+ author: { id: 'u-1', bot: false },
117
+ createdAt: new Date(),
118
+ attachments: { size: 0 },
119
+ });
120
+ // give the async handler a tick
121
+ await new Promise((r) => setTimeout(r, 5));
122
+ expect(received.length).toBe(1);
123
+ expect(received[0].platform).toBe('discord');
124
+ expect(received[0].message.threadId).toBe('chan-1');
125
+ expect(received[0].message.userId).toBe('u-1');
126
+ expect(received[0].message.text).toBe('hello');
127
+ });
128
+ it('drops messages from bot accounts (incl. self)', async () => {
129
+ const { client, received } = bootAdapter({ channels: new Map() });
130
+ client.emit('messageCreate', {
131
+ id: 'm-bot',
132
+ channelId: 'chan-1',
133
+ guildId: 'g-1',
134
+ content: 'I am a bot',
135
+ author: { id: 'b-1', bot: true },
136
+ createdAt: new Date(),
137
+ attachments: { size: 0 },
138
+ });
139
+ await new Promise((r) => setTimeout(r, 5));
140
+ expect(received.length).toBe(0);
141
+ });
142
+ it('drops messages from non-whitelisted guilds when allowedGuilds set', async () => {
143
+ const { client, received } = bootAdapter({
144
+ channels: new Map(),
145
+ config: { allowedGuilds: ['g-allowed'] },
146
+ });
147
+ client.emit('messageCreate', {
148
+ id: 'm-x',
149
+ channelId: 'chan-1',
150
+ guildId: 'g-blocked',
151
+ content: 'hi',
152
+ author: { id: 'u-1', bot: false },
153
+ createdAt: new Date(),
154
+ attachments: { size: 0 },
155
+ });
156
+ await new Promise((r) => setTimeout(r, 5));
157
+ expect(received.length).toBe(0);
158
+ });
159
+ it('drops messages from non-whitelisted channels when allowedChannels set', async () => {
160
+ const { client, received } = bootAdapter({
161
+ channels: new Map(),
162
+ config: { allowedChannels: ['chan-allowed'] },
163
+ });
164
+ client.emit('messageCreate', {
165
+ id: 'm-x',
166
+ channelId: 'chan-blocked',
167
+ guildId: 'g-1',
168
+ content: 'hi',
169
+ author: { id: 'u-1', bot: false },
170
+ createdAt: new Date(),
171
+ attachments: { size: 0 },
172
+ });
173
+ await new Promise((r) => setTimeout(r, 5));
174
+ expect(received.length).toBe(0);
175
+ });
176
+ it('drops empty messages with no attachments', async () => {
177
+ const { client, received } = bootAdapter({ channels: new Map() });
178
+ client.emit('messageCreate', {
179
+ id: 'm-empty',
180
+ channelId: 'chan-1',
181
+ guildId: 'g-1',
182
+ content: '',
183
+ author: { id: 'u-1', bot: false },
184
+ createdAt: new Date(),
185
+ attachments: { size: 0 },
186
+ });
187
+ await new Promise((r) => setTimeout(r, 5));
188
+ expect(received.length).toBe(0);
189
+ });
190
+ });
191
+ describe('platformToMessengerName + DiscordAdapter β€” name match', () => {
192
+ it('platform "discord" resolves to messenger name "discord"', () => {
193
+ const adapter = new DiscordAdapter();
194
+ expect(adapter.name).toBe('discord');
195
+ expect(platformToMessengerName('discord')).toBe('discord');
196
+ });
197
+ });
198
+ describe('Discord Γ— ApprovalBus Γ— approval-router β€” end-to-end (offline)', () => {
199
+ let socketPath;
200
+ beforeEach(() => {
201
+ socketPath = uniqueSocketPath();
202
+ });
203
+ afterEach(async () => {
204
+ try {
205
+ uninstallApprovalRouter();
206
+ }
207
+ catch { }
208
+ try {
209
+ await approvalBus.stop();
210
+ }
211
+ catch { }
212
+ });
213
+ it('Discord user β†’ approval prompt sent to Discord channel β†’ reply "y" β†’ sidecar gets allow', async () => {
214
+ // 1. Boot DiscordAdapter with mocked client + channel
215
+ const ch = makeFakeChannel('chan-discord-1');
216
+ const { adapter, client } = bootAdapter({
217
+ channels: new Map([['chan-discord-1', ch]]),
218
+ });
219
+ // 2. Wire approval-bus + router so platform=discord resolves to this adapter
220
+ await approvalBus.start(socketPath);
221
+ const ctx = {
222
+ threadId: 'chan-discord-1',
223
+ platform: 'discord',
224
+ userId: 'u-1',
225
+ channelId: 'default',
226
+ };
227
+ approvalBus.registerRun('run-discord-1', ctx);
228
+ installApprovalRouter({
229
+ resolveMessenger: (platform) => {
230
+ const name = platformToMessengerName(platform);
231
+ return name === 'discord' ? adapter : undefined;
232
+ },
233
+ });
234
+ // Subscribe to messages from the adapter just to prove the cli wiring path
235
+ // (cli.ts:181) would receive the user's reply too.
236
+ let messageHandlerCalled = 0;
237
+ adapter.onMessage(async () => { messageHandlerCalled++; });
238
+ // 3. Sidecar end: dial the unix socket and send a fake approval request
239
+ const sock = await new Promise((resolve, reject) => {
240
+ const s = createConnection(socketPath);
241
+ s.once('error', reject);
242
+ s.once('connect', () => resolve(s));
243
+ });
244
+ sock.setEncoding('utf8');
245
+ const decisions = [];
246
+ sock.on('data', (chunk) => {
247
+ for (const line of chunk.split('\n')) {
248
+ if (line.trim())
249
+ decisions.push(JSON.parse(line));
250
+ }
251
+ });
252
+ sock.write(JSON.stringify({
253
+ v: 1, type: 'approval', runId: 'run-discord-1', reqId: 'rd-1',
254
+ toolName: 'Bash', input: { command: 'git status' }, toolUseId: 'tu-1',
255
+ }) + '\n');
256
+ // 4. Wait for the prompt to land in the Discord channel
257
+ for (let i = 0; i < 50 && ch.sent.length === 0; i++) {
258
+ await new Promise((r) => setTimeout(r, 10));
259
+ }
260
+ expect(ch.sent.length).toBe(1);
261
+ expect(ch.sent[0]).toContain('Bash');
262
+ expect(ch.sent[0]).toContain('git status');
263
+ expect(ch.sent[0]).toContain('y'); // y/n hint line
264
+ // 5. User "replies" via Discord. In production cli.ts:181 calls
265
+ // tryHandleApprovalReply BEFORE handleMessage. We replicate that order:
266
+ // emit messageCreate (which the adapter delivers to onMessage), and
267
+ // then call tryHandleApprovalReply directly to mirror cli.ts.
268
+ client.emit('messageCreate', {
269
+ id: 'm-reply',
270
+ channelId: 'chan-discord-1',
271
+ guildId: 'g-1',
272
+ content: 'y',
273
+ author: { id: 'u-1', bot: false },
274
+ createdAt: new Date(),
275
+ attachments: { size: 0 },
276
+ });
277
+ await new Promise((r) => setTimeout(r, 5));
278
+ expect(messageHandlerCalled).toBeGreaterThanOrEqual(1);
279
+ const consumed = tryHandleApprovalReply('chan-discord-1', 'y');
280
+ expect(consumed).toBe(true);
281
+ // 6. Sidecar should now receive {behavior: "allow"}
282
+ for (let i = 0; i < 50 && decisions.length === 0; i++) {
283
+ await new Promise((r) => setTimeout(r, 10));
284
+ }
285
+ expect(decisions.length).toBe(1);
286
+ expect(decisions[0].behavior).toBe('allow');
287
+ sock.end();
288
+ });
289
+ it('Discord user replies "n" β†’ sidecar gets deny', async () => {
290
+ const ch = makeFakeChannel('chan-discord-2');
291
+ const { adapter } = bootAdapter({
292
+ channels: new Map([['chan-discord-2', ch]]),
293
+ });
294
+ await approvalBus.start(socketPath);
295
+ approvalBus.registerRun('run-discord-2', {
296
+ threadId: 'chan-discord-2', platform: 'discord', userId: 'u-1', channelId: 'default',
297
+ });
298
+ installApprovalRouter({
299
+ resolveMessenger: () => adapter,
300
+ });
301
+ const sock = await new Promise((resolve, reject) => {
302
+ const s = createConnection(socketPath);
303
+ s.once('error', reject);
304
+ s.once('connect', () => resolve(s));
305
+ });
306
+ sock.setEncoding('utf8');
307
+ const decisions = [];
308
+ sock.on('data', (chunk) => {
309
+ for (const line of chunk.split('\n')) {
310
+ if (line.trim())
311
+ decisions.push(JSON.parse(line));
312
+ }
313
+ });
314
+ sock.write(JSON.stringify({
315
+ v: 1, type: 'approval', runId: 'run-discord-2', reqId: 'rd-2',
316
+ toolName: 'Write', input: { file_path: '/etc/passwd' }, toolUseId: 'tu-2',
317
+ }) + '\n');
318
+ for (let i = 0; i < 50 && ch.sent.length === 0; i++) {
319
+ await new Promise((r) => setTimeout(r, 10));
320
+ }
321
+ expect(ch.sent.length).toBe(1);
322
+ expect(tryHandleApprovalReply('chan-discord-2', 'n')).toBe(true);
323
+ for (let i = 0; i < 50 && decisions.length === 0; i++) {
324
+ await new Promise((r) => setTimeout(r, 10));
325
+ }
326
+ expect(decisions.length).toBe(1);
327
+ const d = decisions[0];
328
+ expect(d.behavior).toBe('deny');
329
+ sock.end();
330
+ });
331
+ });
332
+ //# sourceMappingURL=discord-adapter.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discord-adapter.test.js","sourceRoot":"","sources":["../../../../src/plugins/messengers/discord/discord-adapter.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export { DiscordAdapter, discordAdapter } from './discord-adapter.js';
2
+ export type { DiscordConfig } from './types.js';
3
+ export { markdownToDiscord } from './markdown-to-discord.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/plugins/messengers/discord/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA"}
@@ -0,0 +1,4 @@
1
+ // Discord adapter exports
2
+ export { DiscordAdapter, discordAdapter } from './discord-adapter.js';
3
+ export { markdownToDiscord } from './markdown-to-discord.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/plugins/messengers/discord/index.ts"],"names":[],"mappings":"AAAA,0BAA0B;AAE1B,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAErE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Convert standard Markdown to Discord-compatible Markdown.
3
+ *
4
+ * Discord already supports most GFM, so the main job here is:
5
+ * 1. Strip unsupported HTML tags (Discord ignores them)
6
+ * 2. Convert <b>/<i>/<s> to Discord markdown equivalents
7
+ * 3. Ensure code blocks are preserved
8
+ * 4. Convert headings to bold (Discord doesn't render # in regular messages)
9
+ */
10
+ export declare function markdownToDiscord(markdown: string): string;
11
+ //# sourceMappingURL=markdown-to-discord.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-to-discord.d.ts","sourceRoot":"","sources":["../../../../src/plugins/messengers/discord/markdown-to-discord.ts"],"names":[],"mappings":"AAIA;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CA4D1D"}
@@ -0,0 +1,59 @@
1
+ // Markdown to Discord format converter
2
+ // Discord natively supports: **bold**, *italic*, ~~strikethrough~~, `code`, ```code blocks```, > blockquote
3
+ // For long messages, we can use Embeds for richer formatting
4
+ /**
5
+ * Convert standard Markdown to Discord-compatible Markdown.
6
+ *
7
+ * Discord already supports most GFM, so the main job here is:
8
+ * 1. Strip unsupported HTML tags (Discord ignores them)
9
+ * 2. Convert <b>/<i>/<s> to Discord markdown equivalents
10
+ * 3. Ensure code blocks are preserved
11
+ * 4. Convert headings to bold (Discord doesn't render # in regular messages)
12
+ */
13
+ export function markdownToDiscord(markdown) {
14
+ let result = markdown;
15
+ // Convert HTML bold/strong to Discord **bold**
16
+ result = result.replace(/<\/?(?:b|strong)>/gi, '**');
17
+ // Convert HTML italic/em to Discord *italic*
18
+ result = result.replace(/<\/?(?:i|em)>/gi, '*');
19
+ // Convert HTML strikethrough to Discord ~~strike~~
20
+ result = result.replace(/<\/?(?:s|del|strike)>/gi, '~~');
21
+ // Convert HTML underline to Discord __underline__
22
+ result = result.replace(/<\/?(?:u|ins)>/gi, '__');
23
+ // Convert HTML code to Discord `code`
24
+ result = result.replace(/<code>([^<]*)<\/code>/gi, '`$1`');
25
+ // Convert HTML links to Discord links
26
+ result = result.replace(/<a[^>]*href="([^"]*)"[^>]*>([^<]*)<\/a>/gi, '[$2]($1)');
27
+ // Convert HTML lists to plain text bullets
28
+ result = result.replace(/<ul[^>]*>([\s\S]*?)<\/ul>/gi, '\n$1');
29
+ result = result.replace(/<ol[^>]*>([\s\S]*?)<\/ol>/gi, '\n$1');
30
+ result = result.replace(/<li[^>]*>([\s\S]*?)<\/li>/gi, '- $1\n');
31
+ // Convert HTML blockquotes to Discord > blockquote
32
+ result = result.replace(/<blockquote[^>]*>([\s\S]*?)<\/blockquote>/gi, (_match, content) => {
33
+ return content
34
+ .split('\n')
35
+ .map((line) => `> ${line}`)
36
+ .join('\n');
37
+ });
38
+ // Convert headings (# syntax) to bold text for regular messages
39
+ // (Discord doesn't render heading syntax in normal messages)
40
+ result = result.replace(/^(#{1,6})\s+(.+)$/gm, (_match, _hashes, text) => {
41
+ return `**${text}**`;
42
+ });
43
+ // Convert <hr> to separator
44
+ result = result.replace(/<hr\s*\/?>/gi, '\n---\n');
45
+ // Convert <br> to newline
46
+ result = result.replace(/<br\s*\/?>/gi, '\n');
47
+ // Strip remaining HTML tags
48
+ result = result.replace(/<\/?[a-zA-Z][^>]*>/g, '');
49
+ // Decode common HTML entities
50
+ result = result.replace(/&amp;/g, '&');
51
+ result = result.replace(/&lt;/g, '<');
52
+ result = result.replace(/&gt;/g, '>');
53
+ result = result.replace(/&quot;/g, '"');
54
+ result = result.replace(/&#39;/g, "'");
55
+ // Clean up excess blank lines
56
+ result = result.replace(/\n{3,}/g, '\n\n');
57
+ return result.trim();
58
+ }
59
+ //# sourceMappingURL=markdown-to-discord.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-to-discord.js","sourceRoot":"","sources":["../../../../src/plugins/messengers/discord/markdown-to-discord.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,4GAA4G;AAC5G,6DAA6D;AAE7D;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAChD,IAAI,MAAM,GAAG,QAAQ,CAAA;IAErB,+CAA+C;IAC/C,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,qBAAqB,EAAE,IAAI,CAAC,CAAA;IAEpD,6CAA6C;IAC7C,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAA;IAE/C,mDAAmD;IACnD,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,yBAAyB,EAAE,IAAI,CAAC,CAAA;IAExD,kDAAkD;IAClD,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAA;IAEjD,sCAAsC;IACtC,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,yBAAyB,EAAE,MAAM,CAAC,CAAA;IAE1D,sCAAsC;IACtC,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,2CAA2C,EAAE,UAAU,CAAC,CAAA;IAEhF,2CAA2C;IAC3C,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,6BAA6B,EAAE,MAAM,CAAC,CAAA;IAC9D,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,6BAA6B,EAAE,MAAM,CAAC,CAAA;IAC9D,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,6BAA6B,EAAE,QAAQ,CAAC,CAAA;IAEhE,mDAAmD;IACnD,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,6CAA6C,EAAE,CAAC,MAAM,EAAE,OAAe,EAAE,EAAE;QACjG,OAAO,OAAO;aACX,KAAK,CAAC,IAAI,CAAC;aACX,GAAG,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC;aAClC,IAAI,CAAC,IAAI,CAAC,CAAA;IACf,CAAC,CAAC,CAAA;IAEF,gEAAgE;IAChE,6DAA6D;IAC7D,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;QACvE,OAAO,KAAK,IAAI,IAAI,CAAA;IACtB,CAAC,CAAC,CAAA;IAEF,4BAA4B;IAC5B,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE,SAAS,CAAC,CAAA;IAElD,0BAA0B;IAC1B,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC,CAAA;IAE7C,4BAA4B;IAC5B,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAA;IAElD,8BAA8B;IAC9B,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;IACtC,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;IACrC,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;IACrC,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAA;IACvC,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;IAEtC,8BAA8B;IAC9B,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;IAE1C,OAAO,MAAM,CAAC,IAAI,EAAE,CAAA;AACtB,CAAC"}
@@ -0,0 +1,9 @@
1
+ export interface DiscordConfig {
2
+ botToken: string;
3
+ channelId?: string;
4
+ /** Only respond in these guilds (server IDs). Empty = all guilds. */
5
+ allowedGuilds?: string[];
6
+ /** Only respond in these channels. Empty = all channels. */
7
+ allowedChannels?: string[];
8
+ }
9
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/plugins/messengers/discord/types.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,qEAAqE;IACrE,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;IACxB,4DAA4D;IAC5D,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;CAC3B"}
@@ -0,0 +1,3 @@
1
+ // Discord adapter types
2
+ export {};
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/plugins/messengers/discord/types.ts"],"names":[],"mappings":"AAAA,wBAAwB"}
@@ -0,0 +1,23 @@
1
+ import type { FeishuCard } from './types.js';
2
+ export declare class CardBuilder {
3
+ private header;
4
+ private elements;
5
+ withHeader(title: string, template?: string): this;
6
+ addMarkdown(content: string): this;
7
+ addDiv(text: string): this;
8
+ addCode(code: string, language?: string): this;
9
+ addDivider(): this;
10
+ addButtons(buttons: Array<{
11
+ text: string;
12
+ type: 'primary' | 'default' | 'danger';
13
+ value: Record<string, string>;
14
+ }>): this;
15
+ addAgentBadge(agent: string): this;
16
+ build(): FeishuCard;
17
+ }
18
+ /**
19
+ * Convert markdown text to Feishu-compatible format
20
+ * Feishu supports most standard markdown in the markdown element
21
+ */
22
+ export declare function markdownToFeishu(text: string): string;
23
+ //# sourceMappingURL=card-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"card-builder.d.ts","sourceRoot":"","sources":["../../../../src/plugins/messengers/feishu/card-builder.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAuC,MAAM,YAAY,CAAA;AAEjF,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,QAAQ,CAA0B;IAE1C,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IAQlD,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAQlC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAQ1B,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IAS9C,UAAU,IAAI,IAAI;IAKlB,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC;QACxB,IAAI,EAAE,MAAM,CAAA;QACZ,IAAI,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAA;QACtC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAC9B,CAAC,GAAG,IAAI;IAeT,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAmBlC,KAAK,IAAI,UAAU;CAUpB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAIrD"}
@@ -0,0 +1,89 @@
1
+ // Feishu Card Builder
2
+ // Builds Feishu interactive card JSON using native elements
3
+ export class CardBuilder {
4
+ header;
5
+ elements = [];
6
+ withHeader(title, template) {
7
+ this.header = {
8
+ title: { tag: 'plain_text', content: title },
9
+ template
10
+ };
11
+ return this;
12
+ }
13
+ addMarkdown(content) {
14
+ this.elements.push({
15
+ tag: 'markdown',
16
+ content
17
+ });
18
+ return this;
19
+ }
20
+ addDiv(text) {
21
+ this.elements.push({
22
+ tag: 'div',
23
+ text: { tag: 'plain_text', content: text }
24
+ });
25
+ return this;
26
+ }
27
+ addCode(code, language) {
28
+ this.elements.push({
29
+ tag: 'code',
30
+ text: { tag: 'plain_text', content: code },
31
+ language
32
+ });
33
+ return this;
34
+ }
35
+ addDivider() {
36
+ this.elements.push({ tag: 'hr' });
37
+ return this;
38
+ }
39
+ addButtons(buttons) {
40
+ const actions = buttons.map(b => ({
41
+ tag: 'button',
42
+ text: { tag: 'plain_text', content: b.text },
43
+ type: b.type,
44
+ value: b.value
45
+ }));
46
+ this.elements.push({
47
+ tag: 'action',
48
+ actions
49
+ });
50
+ return this;
51
+ }
52
+ addAgentBadge(agent) {
53
+ const agentEmoji = {
54
+ 'claude-code': '🧠',
55
+ 'codex': '⚑',
56
+ 'copilot': 'πŸ€–',
57
+ 'opencode': 'πŸ”§'
58
+ };
59
+ const emoji = agentEmoji[agent] || 'πŸ€–';
60
+ this.elements.push({
61
+ tag: 'note',
62
+ elements: [{
63
+ tag: 'plain_text',
64
+ content: `${emoji} ${agent}`
65
+ }]
66
+ });
67
+ return this;
68
+ }
69
+ build() {
70
+ const card = {
71
+ config: { wide_screen_mode: true },
72
+ elements: this.elements
73
+ };
74
+ if (this.header) {
75
+ card.header = this.header;
76
+ }
77
+ return card;
78
+ }
79
+ }
80
+ /**
81
+ * Convert markdown text to Feishu-compatible format
82
+ * Feishu supports most standard markdown in the markdown element
83
+ */
84
+ export function markdownToFeishu(text) {
85
+ // Feishu markdown element supports standard markdown
86
+ // Just need to ensure code blocks are properly formatted
87
+ return text;
88
+ }
89
+ //# sourceMappingURL=card-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"card-builder.js","sourceRoot":"","sources":["../../../../src/plugins/messengers/feishu/card-builder.ts"],"names":[],"mappings":"AAAA,sBAAsB;AACtB,4DAA4D;AAI5D,MAAM,OAAO,WAAW;IACd,MAAM,CAAsB;IAC5B,QAAQ,GAAwB,EAAE,CAAA;IAE1C,UAAU,CAAC,KAAa,EAAE,QAAiB;QACzC,IAAI,CAAC,MAAM,GAAG;YACZ,KAAK,EAAE,EAAE,GAAG,EAAE,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE;YAC5C,QAAQ;SACT,CAAA;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,WAAW,CAAC,OAAe;QACzB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YACjB,GAAG,EAAE,UAAU;YACf,OAAO;SACR,CAAC,CAAA;QACF,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,CAAC,IAAY;QACjB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YACjB,GAAG,EAAE,KAAK;YACV,IAAI,EAAE,EAAE,GAAG,EAAE,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE;SAC3C,CAAC,CAAA;QACF,OAAO,IAAI,CAAA;IACb,CAAC;IAED,OAAO,CAAC,IAAY,EAAE,QAAiB;QACrC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YACjB,GAAG,EAAE,MAAM;YACX,IAAI,EAAE,EAAE,GAAG,EAAE,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE;YAC1C,QAAQ;SACT,CAAC,CAAA;QACF,OAAO,IAAI,CAAA;IACb,CAAC;IAED,UAAU;QACR,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAA;QACjC,OAAO,IAAI,CAAA;IACb,CAAC;IAED,UAAU,CAAC,OAIT;QACA,MAAM,OAAO,GAAuB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACpD,GAAG,EAAE,QAAiB;YACtB,IAAI,EAAE,EAAE,GAAG,EAAE,YAAqB,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE;YACrD,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,KAAK,EAAE,CAAC,CAAC,KAAK;SACf,CAAC,CAAC,CAAA;QAEH,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YACjB,GAAG,EAAE,QAAQ;YACb,OAAO;SACR,CAAC,CAAA;QACF,OAAO,IAAI,CAAA;IACb,CAAC;IAED,aAAa,CAAC,KAAa;QACzB,MAAM,UAAU,GAA2B;YACzC,aAAa,EAAE,IAAI;YACnB,OAAO,EAAE,GAAG;YACZ,SAAS,EAAE,IAAI;YACf,UAAU,EAAE,IAAI;SACjB,CAAA;QACD,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,IAAI,CAAA;QAEvC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YACjB,GAAG,EAAE,MAAM;YACX,QAAQ,EAAE,CAAC;oBACT,GAAG,EAAE,YAAY;oBACjB,OAAO,EAAE,GAAG,KAAK,IAAI,KAAK,EAAE;iBAC7B,CAAC;SACH,CAAC,CAAA;QACF,OAAO,IAAI,CAAA;IACb,CAAC;IAED,KAAK;QACH,MAAM,IAAI,GAAe;YACvB,MAAM,EAAE,EAAE,gBAAgB,EAAE,IAAI,EAAE;YAClC,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAA;QACD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;QAC3B,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,qDAAqD;IACrD,yDAAyD;IACzD,OAAO,IAAI,CAAA;AACb,CAAC"}
@@ -0,0 +1,33 @@
1
+ import type { MessengerAdapter, MessageContext } from '../../../core/types.js';
2
+ export declare class FeishuAdapter implements MessengerAdapter {
3
+ readonly name = "feishu";
4
+ private client;
5
+ private config;
6
+ private messageHandler?;
7
+ private isRunning;
8
+ /** message_id β†’ first-seen timestamp (ms). LRU-ish: pruned on insert. */
9
+ private seenMessages;
10
+ start(): Promise<void>;
11
+ stop(): Promise<void>;
12
+ onMessage(handler: (ctx: MessageContext) => Promise<void>): void;
13
+ sendMessage(threadId: string, text: string): Promise<void>;
14
+ sendCard(threadId: string, card: unknown): Promise<void>;
15
+ /**
16
+ * Send a "πŸ€” 思考中…" placeholder so the user sees immediate feedback
17
+ * (sendTyping is a no-op on Feishu β€” the SDK doesn't expose a public
18
+ * typing API). The placeholder is intentionally not recalled when the
19
+ * real reply arrives β€” keeping it in chat history shows the user when
20
+ * the bot started working, and matches WeChat behaviour where recall
21
+ * isn't available either.
22
+ */
23
+ sendThinking(threadId: string, text: string): Promise<undefined>;
24
+ sendTyping(threadId: string, isTyping: boolean): Promise<void>;
25
+ /**
26
+ * Returns true if this message_id was already seen within DEDUP_TTL_MS.
27
+ * Side effect on first sight: record it and prune any expired entries.
28
+ */
29
+ private isDuplicate;
30
+ private handleFeishuMessage;
31
+ }
32
+ export declare const feishuAdapter: FeishuAdapter;
33
+ //# sourceMappingURL=feishu-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feishu-adapter.d.ts","sourceRoot":"","sources":["../../../../src/plugins/messengers/feishu/feishu-adapter.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAW,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAyCvF,qBAAa,aAAc,YAAW,gBAAgB;IACpD,QAAQ,CAAC,IAAI,YAAW;IACxB,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,cAAc,CAAC,CAAwC;IAC/D,OAAO,CAAC,SAAS,CAAQ;IACzB,yEAAyE;IACzE,OAAO,CAAC,YAAY,CAA4B;IAE1C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA6BtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAU3B,SAAS,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAI1D,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAY1D,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAO9D;;;;;;;OAOG;IACG,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAUhE,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAepE;;;OAGG;IACH,OAAO,CAAC,WAAW;YAyBL,mBAAmB;CA8DlC;AAGD,eAAO,MAAM,aAAa,eAAsB,CAAA"}