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 @@
1
+ {"version":3,"file":"telegram-adapter.js","sourceRoot":"","sources":["../../../../src/plugins/messengers/telegram/telegram-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ export interface TelegramConfig {
2
+ botToken: string;
3
+ channelId?: string;
4
+ /** HTTP proxy URL (e.g., http://127.0.0.1:7890) for regions where Telegram is blocked */
5
+ proxy?: string;
6
+ /** When set + non-empty, only Telegram user IDs in this list may resolve
7
+ * approvals via inline-button callbacks. Stringified user_id (TG numeric).
8
+ * If absent or empty, button taps from anyone in the chat are accepted —
9
+ * matches the existing text-reply path's permissiveness, fine for 1:1
10
+ * bots but a real risk in shared groups.
11
+ *
12
+ * Note: this gates BUTTONS only. y/n text replies remain unrestricted to
13
+ * preserve existing behavior; tighten there separately if needed. */
14
+ approvalAllowlist?: string[];
15
+ }
16
+ export interface SendMessageResult {
17
+ message_id: number;
18
+ chat: {
19
+ id: number;
20
+ };
21
+ }
22
+ export interface TelegramMessageUpdate {
23
+ update_id: number;
24
+ message?: {
25
+ message_id: number;
26
+ from?: {
27
+ id: number;
28
+ is_bot: boolean;
29
+ first_name: string;
30
+ username?: string;
31
+ };
32
+ chat: {
33
+ id: number;
34
+ type: 'private' | 'group' | 'supergroup' | 'channel';
35
+ title?: string;
36
+ username?: string;
37
+ };
38
+ date: number;
39
+ text?: string;
40
+ entities?: Array<{
41
+ type: string;
42
+ offset: number;
43
+ length: number;
44
+ }>;
45
+ };
46
+ }
47
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/plugins/messengers/telegram/types.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,yFAAyF;IACzF,KAAK,CAAC,EAAE,MAAM,CAAA;IACd;;;;;;;0EAOsE;IACtE,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAA;CAC7B;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE;QACJ,EAAE,EAAE,MAAM,CAAA;KACX,CAAA;CACF;AAED,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE;QACR,UAAU,EAAE,MAAM,CAAA;QAClB,IAAI,CAAC,EAAE;YACL,EAAE,EAAE,MAAM,CAAA;YACV,MAAM,EAAE,OAAO,CAAA;YACf,UAAU,EAAE,MAAM,CAAA;YAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;SAClB,CAAA;QACD,IAAI,EAAE;YACJ,EAAE,EAAE,MAAM,CAAA;YACV,IAAI,EAAE,SAAS,GAAG,OAAO,GAAG,YAAY,GAAG,SAAS,CAAA;YACpD,KAAK,CAAC,EAAE,MAAM,CAAA;YACd,QAAQ,CAAC,EAAE,MAAM,CAAA;SAClB,CAAA;QACD,IAAI,EAAE,MAAM,CAAA;QACZ,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,QAAQ,CAAC,EAAE,KAAK,CAAC;YACf,IAAI,EAAE,MAAM,CAAA;YACZ,MAAM,EAAE,MAAM,CAAA;YACd,MAAM,EAAE,MAAM,CAAA;SACf,CAAC,CAAA;KACH,CAAA;CACF"}
@@ -0,0 +1,3 @@
1
+ // Telegram adapter types
2
+ export {};
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/plugins/messengers/telegram/types.ts"],"names":[],"mappings":"AAAA,yBAAyB"}
@@ -0,0 +1,68 @@
1
+ import type { MessengerAdapter, MessageContext } from '../../../core/types.js';
2
+ import type { Credentials } from './ilink-types.js';
3
+ export declare class ILinkWeChatAdapter implements MessengerAdapter {
4
+ readonly name = "wechat-ilink";
5
+ private client;
6
+ private messageHandler?;
7
+ private isRunning;
8
+ private pollState;
9
+ private contextTokens;
10
+ private typingTickets;
11
+ private processedMessages;
12
+ constructor();
13
+ start(): Promise<void>;
14
+ stop(): Promise<void>;
15
+ onMessage(handler: (ctx: MessageContext) => Promise<void>): void;
16
+ sendMessage(threadId: string, text: string): Promise<void>;
17
+ /**
18
+ * Send a "thinking" placeholder. iLink doesn't expose a server-side message
19
+ * recall API, so the placeholder lingers in the chat after the real
20
+ * response arrives — but at least the user gets immediate feedback that
21
+ * the bot received their message and is working on it.
22
+ */
23
+ sendThinking(threadId: string, text: string): Promise<undefined>;
24
+ sendTyping(threadId: string, isTyping: boolean): Promise<void>;
25
+ /**
26
+ * Start QR code login flow
27
+ * Returns QR code URL and token for polling
28
+ */
29
+ startQRLogin(): Promise<{
30
+ qrUrl: string;
31
+ qrToken: string;
32
+ }>;
33
+ /**
34
+ * Poll QR code status until confirmed or expired
35
+ */
36
+ waitForQRLogin(qrToken: string, onStatus?: (status: string) => void): Promise<Credentials | null>;
37
+ private startPolling;
38
+ private pollLoop;
39
+ /**
40
+ * Attempt to recover from SESSION_EXPIRED. Tries a fresh getUpdates
41
+ * up to 3 times with linear backoff so a single network blip during
42
+ * recovery doesn't tear down the whole adapter (W-3).
43
+ */
44
+ private tryRefreshSession;
45
+ /**
46
+ * Periodic keep-alive: probe getconfig instead of getUpdates so we don't
47
+ * race the polling loop on the same long-poll cursor (W-1).
48
+ */
49
+ private sendHeartbeat;
50
+ private handleIncomingMessage;
51
+ private getContextToken;
52
+ private setContextToken;
53
+ private cleanupProcessedMessages;
54
+ /**
55
+ * L14: drop expired context-token entries. The original implementation
56
+ * only removed an entry on read (`getContextToken` checked TTL), so a
57
+ * userId that messaged once and never came back left its row in the
58
+ * Map indefinitely. Called from the polling loop at the same cadence
59
+ * as cleanupProcessedMessages so memory stays bounded under big group
60
+ * sizes / churning user populations.
61
+ */
62
+ private cleanupExpiredContextTokens;
63
+ private loadCredentials;
64
+ private saveCredentials;
65
+ private splitMessage;
66
+ }
67
+ export declare const ilinkWeChatAdapter: ILinkWeChatAdapter;
68
+ //# sourceMappingURL=ilink-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ilink-adapter.d.ts","sourceRoot":"","sources":["../../../../src/plugins/messengers/wechat/ilink-adapter.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAW,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAEvF,OAAO,KAAK,EAAE,WAAW,EAAoC,MAAM,kBAAkB,CAAA;AAgBrF,qBAAa,kBAAmB,YAAW,gBAAgB;IACzD,QAAQ,CAAC,IAAI,kBAAiB;IAC9B,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,cAAc,CAAC,CAAwC;IAC/D,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,SAAS,CAIhB;IACD,OAAO,CAAC,aAAa,CAAuC;IAC5D,OAAO,CAAC,aAAa,CAA4B;IACjD,OAAO,CAAC,iBAAiB,CAA4B;;IAU/C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAiBtB,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;IAiChE;;;;;OAKG;IACG,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAShE,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAoCpE;;;OAGG;IACG,YAAY,IAAI,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAQjE;;OAEG;IACG,cAAc,CAClB,OAAO,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,GAClC,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAoD9B,OAAO,CAAC,YAAY;YAON,QAAQ;IAqFtB;;;;OAIG;YACW,iBAAiB;IA6B/B;;;OAGG;YACW,aAAa;YAUb,qBAAqB;IAwEnC,OAAO,CAAC,eAAe;IAavB,OAAO,CAAC,eAAe;IAQvB,OAAO,CAAC,wBAAwB;IAShC;;;;;;;OAOG;IACH,OAAO,CAAC,2BAA2B;YAarB,eAAe;YAsBf,eAAe;IAe7B,OAAO,CAAC,YAAY;CAgCrB;AAGD,eAAO,MAAM,kBAAkB,oBAA2B,CAAA"}
@@ -0,0 +1,483 @@
1
+ // WeChat iLink Bot API Adapter
2
+ // Implements MessengerAdapter using the iLink HTTP API
3
+ import { ILinkClient } from './ilink-client.js';
4
+ import { ILINK_ERRORS } from './ilink-types.js';
5
+ import { homedir } from 'os';
6
+ import { join } from 'path';
7
+ import { readFile, writeFile, mkdir, stat } from 'fs/promises';
8
+ import { logger as rootLogger } from '../../../core/logger.js';
9
+ import { Backoff } from '../../../utils/backoff.js';
10
+ const log = rootLogger.child({ component: 'wechat-ilink' });
11
+ const CREDENTIALS_FILE = join(homedir(), '.im-hub', 'wechat-credentials.json');
12
+ const POLL_TIMEOUT = 30000; // 30 seconds
13
+ const CONTEXT_TOKEN_TTL = 30 * 60 * 1000; // 30 minutes
14
+ const PROCESSED_MESSAGES_TTL = 60 * 1000; // 1 minute
15
+ export class ILinkWeChatAdapter {
16
+ name = 'wechat-ilink';
17
+ client;
18
+ messageHandler;
19
+ isRunning = false;
20
+ pollState = {
21
+ getUpdatesBuf: '',
22
+ isPolling: false,
23
+ lastPollTime: 0,
24
+ };
25
+ contextTokens = new Map();
26
+ typingTickets = new Map();
27
+ processedMessages = new Map(); // message_id -> timestamp
28
+ constructor() {
29
+ this.client = new ILinkClient();
30
+ }
31
+ // ============================================
32
+ // Lifecycle
33
+ // ============================================
34
+ async start() {
35
+ // Load saved credentials
36
+ const credentials = await this.loadCredentials();
37
+ if (credentials) {
38
+ this.client.setCredentials(credentials);
39
+ log.info('Credentials loaded from cache');
40
+ }
41
+ else {
42
+ throw new Error('No WeChat credentials found. Run "im-hub config wechat" first.');
43
+ }
44
+ this.isRunning = true;
45
+ log.info('WeChat iLink adapter started');
46
+ // Start polling in background
47
+ this.startPolling();
48
+ }
49
+ async stop() {
50
+ this.isRunning = false;
51
+ this.client.clearCredentials();
52
+ log.info('WeChat iLink adapter stopped');
53
+ }
54
+ // ============================================
55
+ // Message Handling
56
+ // ============================================
57
+ onMessage(handler) {
58
+ this.messageHandler = handler;
59
+ }
60
+ async sendMessage(threadId, text) {
61
+ if (!this.client.hasCredentials()) {
62
+ throw new Error('WeChat adapter not authenticated');
63
+ }
64
+ // Extract user ID from threadId (format: user:xxx or room:xxx)
65
+ const userId = threadId.replace(/^(user|room):/, '');
66
+ // Get context token for this user
67
+ const contextToken = this.getContextToken(userId);
68
+ if (!contextToken) {
69
+ throw new Error('No context token available for this user');
70
+ }
71
+ // Split long messages
72
+ const chunks = this.splitMessage(text);
73
+ for (const chunk of chunks) {
74
+ const response = await this.client.sendMessage(userId, chunk, contextToken);
75
+ if (response.ret !== 0 && response.ret !== undefined) {
76
+ if (response.ret === ILINK_ERRORS.SESSION_EXPIRED) {
77
+ throw new Error('WeChat session expired. Please re-login.');
78
+ }
79
+ throw new Error(`Failed to send message: ${response.errmsg || response.ret}`);
80
+ }
81
+ }
82
+ }
83
+ // ============================================
84
+ // Typing Indicator
85
+ // ============================================
86
+ /**
87
+ * Send a "thinking" placeholder. iLink doesn't expose a server-side message
88
+ * recall API, so the placeholder lingers in the chat after the real
89
+ * response arrives — but at least the user gets immediate feedback that
90
+ * the bot received their message and is working on it.
91
+ */
92
+ async sendThinking(threadId, text) {
93
+ try {
94
+ await this.sendMessage(threadId, text);
95
+ }
96
+ catch (err) {
97
+ log.debug({ err: String(err) }, 'Failed to send thinking placeholder');
98
+ }
99
+ return undefined; // no dismiss — recall not supported on iLink
100
+ }
101
+ async sendTyping(threadId, isTyping) {
102
+ if (!this.client.hasCredentials()) {
103
+ return;
104
+ }
105
+ // Extract user ID from threadId (format: user:xxx or room:xxx)
106
+ const userId = threadId.replace(/^(user|room):/, '');
107
+ // Get or fetch typing ticket
108
+ let typingTicket = this.typingTickets.get(userId);
109
+ if (!typingTicket) {
110
+ const contextToken = this.getContextToken(userId);
111
+ const ticket = await this.client.getTypingTicket(userId, contextToken ?? undefined);
112
+ if (!ticket) {
113
+ log.warn({ userId }, 'Could not get typing ticket');
114
+ return;
115
+ }
116
+ typingTicket = ticket;
117
+ this.typingTickets.set(userId, ticket);
118
+ }
119
+ // Send typing status (1 = start, 2 = stop)
120
+ const status = isTyping ? 1 : 2;
121
+ const success = await this.client.sendTyping(userId, typingTicket, status);
122
+ if (!success) {
123
+ // Ticket might be expired, clear it for next attempt
124
+ this.typingTickets.delete(userId);
125
+ log.warn({ userId }, 'Failed to send typing indicator, cleared ticket');
126
+ }
127
+ }
128
+ // ============================================
129
+ // QR Code Login
130
+ // ============================================
131
+ /**
132
+ * Start QR code login flow
133
+ * Returns QR code URL and token for polling
134
+ */
135
+ async startQRLogin() {
136
+ const response = await this.client.getQRCode();
137
+ return {
138
+ qrUrl: response.qrcode_img_content,
139
+ qrToken: response.qrcode,
140
+ };
141
+ }
142
+ /**
143
+ * Poll QR code status until confirmed or expired
144
+ */
145
+ async waitForQRLogin(qrToken, onStatus) {
146
+ const maxAttempts = 120; // 2 minutes with 1s interval
147
+ let attempts = 0;
148
+ while (attempts < maxAttempts) {
149
+ const status = await this.client.getQRCodeStatus(qrToken);
150
+ switch (status.status) {
151
+ case 'wait':
152
+ onStatus?.('Waiting for scan...');
153
+ break;
154
+ case 'scaned':
155
+ onStatus?.('QR code scanned! Waiting for confirmation...');
156
+ break;
157
+ case 'confirmed':
158
+ if (status.bot_token && status.ilink_bot_id && status.ilink_user_id) {
159
+ const credentials = {
160
+ bot_token: status.bot_token,
161
+ baseUrl: status.baseurl || 'https://ilinkai.weixin.qq.com',
162
+ accountId: status.ilink_bot_id,
163
+ userId: status.ilink_user_id,
164
+ savedAt: new Date().toISOString(),
165
+ };
166
+ // Save credentials
167
+ await this.saveCredentials(credentials);
168
+ this.client.setCredentials(credentials);
169
+ onStatus?.('Login successful!');
170
+ return credentials;
171
+ }
172
+ break;
173
+ case 'expired':
174
+ onStatus?.('QR code expired');
175
+ return null;
176
+ }
177
+ // Wait 1 second before next poll
178
+ await new Promise((resolve) => setTimeout(resolve, 1000));
179
+ attempts++;
180
+ }
181
+ return null;
182
+ }
183
+ // ============================================
184
+ // Polling
185
+ // ============================================
186
+ startPolling() {
187
+ if (this.pollState.isPolling)
188
+ return;
189
+ this.pollState.isPolling = true;
190
+ this.pollLoop();
191
+ }
192
+ async pollLoop() {
193
+ log.info('Polling started');
194
+ let consecutiveFailures = 0;
195
+ let lastHeartbeatTime = Date.now();
196
+ const HEARTBEAT_INTERVAL_MS = 60 * 1000; // 60 seconds
197
+ // M9: shared exponential-with-jitter helper. The previous inline
198
+ // `1000 * Math.pow(2, n - 1)` was deterministic, so a fleet of im-hub
199
+ // instances recovering from a shared network event would all
200
+ // reconnect in lock-step. Backoff(jitter=0.5) spreads the storm
201
+ // across a ±50% window without changing the underlying cadence.
202
+ // Base 2_000 / cap 30_000 preserves the prior schedule's ballpark
203
+ // (2s, 4s, 8s, 16s, 30s capped) — first failure still has no
204
+ // extra wait via the `consecutiveFailures > 1` gate below.
205
+ const backoff = new Backoff({ baseMs: 2_000, capMs: 30_000, jitter: 0.5 });
206
+ while (this.isRunning) {
207
+ try {
208
+ const response = await this.client.getUpdates(this.pollState.getUpdatesBuf);
209
+ // Success — reset failure counter and backoff
210
+ consecutiveFailures = 0;
211
+ backoff.reset();
212
+ if (response.msgs?.length) {
213
+ log.debug({ count: response.msgs.length }, 'Received messages');
214
+ }
215
+ const isSuccess = response.ret === 0 || response.ret === undefined;
216
+ if (isSuccess) {
217
+ this.pollState.getUpdatesBuf = response.get_updates_buf;
218
+ if (response.msgs) {
219
+ for (const msg of response.msgs) {
220
+ this.handleIncomingMessage(msg).catch(err => log.error({ err: err instanceof Error ? err.message : String(err) }, 'Message handler error'));
221
+ }
222
+ }
223
+ }
224
+ else if (response.ret === ILINK_ERRORS.SESSION_EXPIRED) {
225
+ log.warn('WeChat session expired, attempting recovery...');
226
+ const recovered = await this.tryRefreshSession();
227
+ if (!recovered) {
228
+ log.error('WeChat session expired. Token refresh failed after retries — polling stopped.');
229
+ this.isRunning = false;
230
+ break;
231
+ }
232
+ log.info('Token refreshed successfully, resuming polling');
233
+ }
234
+ else {
235
+ log.warn({ ret: response.ret }, 'Unexpected getUpdates response code');
236
+ }
237
+ }
238
+ catch (err) {
239
+ const errMsg = err instanceof Error ? err.message : String(err);
240
+ consecutiveFailures++;
241
+ log.error({ err: errMsg, consecutiveFailures }, 'Poll error');
242
+ // First failure: no extra wait, just the regular 1s tail sleep.
243
+ // From the second consecutive failure on, draw the next delay
244
+ // from the jittered exponential schedule (2s/4s/8s/16s/30s ±50%).
245
+ if (consecutiveFailures > 1) {
246
+ const delayMs = backoff.nextDelayMs();
247
+ log.warn({ delayMs }, `Backing off after ${consecutiveFailures} consecutive failures`);
248
+ await new Promise((resolve) => setTimeout(resolve, delayMs));
249
+ continue;
250
+ }
251
+ }
252
+ // Periodic heartbeat: getconfig probe (no side effect on the
253
+ // long-poll cursor, so it's safe to run alongside the loop).
254
+ if (Date.now() - lastHeartbeatTime >= HEARTBEAT_INTERVAL_MS) {
255
+ lastHeartbeatTime = Date.now();
256
+ this.sendHeartbeat().catch(err => log.warn({ err: err instanceof Error ? err.message : String(err) }, 'Heartbeat error'));
257
+ // L14: piggyback context-token sweep on the heartbeat tick (1/min).
258
+ // Cheap full scan — bounded by active user count.
259
+ this.cleanupExpiredContextTokens();
260
+ }
261
+ await new Promise((resolve) => setTimeout(resolve, 1000));
262
+ }
263
+ this.pollState.isPolling = false;
264
+ log.info('Polling stopped');
265
+ }
266
+ /**
267
+ * Attempt to recover from SESSION_EXPIRED. Tries a fresh getUpdates
268
+ * up to 3 times with linear backoff so a single network blip during
269
+ * recovery doesn't tear down the whole adapter (W-3).
270
+ */
271
+ async tryRefreshSession() {
272
+ const MAX_ATTEMPTS = 3;
273
+ for (let attempt = 1; attempt <= MAX_ATTEMPTS; attempt++) {
274
+ try {
275
+ const response = await this.client.getUpdates('');
276
+ if (response.ret === 0 || response.ret === undefined) {
277
+ this.pollState.getUpdatesBuf = response.get_updates_buf;
278
+ if (response.msgs) {
279
+ for (const msg of response.msgs) {
280
+ if (msg.from_user_id && msg.context_token) {
281
+ this.setContextToken(msg.from_user_id, msg.context_token);
282
+ }
283
+ }
284
+ }
285
+ log.info({ attempt }, 'Session recovered after SESSION_EXPIRED');
286
+ return true;
287
+ }
288
+ log.warn({ attempt, ret: response.ret }, 'Session refresh attempt returned error');
289
+ }
290
+ catch (err) {
291
+ log.warn({ attempt, err: err instanceof Error ? err.message : String(err) }, 'Session refresh attempt threw');
292
+ }
293
+ if (attempt < MAX_ATTEMPTS) {
294
+ await new Promise((resolve) => setTimeout(resolve, attempt * 5_000)); // 5s, 10s
295
+ }
296
+ }
297
+ return false;
298
+ }
299
+ /**
300
+ * Periodic keep-alive: probe getconfig instead of getUpdates so we don't
301
+ * race the polling loop on the same long-poll cursor (W-1).
302
+ */
303
+ async sendHeartbeat() {
304
+ if (!this.client.hasCredentials())
305
+ return;
306
+ const ok = await this.client.pingConfig();
307
+ if (ok) {
308
+ log.debug('Heartbeat OK');
309
+ }
310
+ else {
311
+ log.warn('Heartbeat failed (getconfig returned non-OK)');
312
+ }
313
+ }
314
+ async handleIncomingMessage(msg) {
315
+ log.debug({ messageId: msg.message_id, type: msg.message_type }, 'handleIncomingMessage');
316
+ if (!this.messageHandler) {
317
+ log.warn('No message handler registered');
318
+ return;
319
+ }
320
+ if (msg.message_type === 2) {
321
+ log.debug('Skipping bot message');
322
+ return;
323
+ }
324
+ const msgId = String(msg.message_id);
325
+ if (msgId && this.processedMessages.has(msgId)) {
326
+ log.debug({ messageId: msgId }, 'Skipping duplicate message');
327
+ return;
328
+ }
329
+ if (msgId) {
330
+ this.processedMessages.set(msgId, Date.now());
331
+ this.cleanupProcessedMessages();
332
+ }
333
+ if (!msg.item_list?.length) {
334
+ log.debug('No item_list in message');
335
+ return;
336
+ }
337
+ const textItems = msg.item_list.filter((item) => item.type === 1 && item.text_item?.text);
338
+ if (!textItems.length) {
339
+ log.debug('No text items found');
340
+ return;
341
+ }
342
+ const text = textItems.map((item) => item.text_item.text).join('\n');
343
+ log.debug({
344
+ text,
345
+ fromUserId: msg.from_user_id,
346
+ contextToken: msg.context_token ? 'present' : 'missing',
347
+ }, 'Extracted message');
348
+ // Store context token for replies
349
+ if (msg.from_user_id && msg.context_token) {
350
+ this.setContextToken(msg.from_user_id, msg.context_token);
351
+ }
352
+ // Build message object - use accountId as channelId
353
+ const message = {
354
+ id: String(msg.message_id || Date.now()),
355
+ threadId: msg.group_id ? `room:${msg.group_id}` : `user:${msg.from_user_id}`,
356
+ userId: msg.from_user_id || 'unknown',
357
+ text,
358
+ timestamp: new Date(msg.create_time_ms || Date.now()),
359
+ channelId: this.client.getCredentials()?.accountId || 'default',
360
+ };
361
+ const ctx = {
362
+ message,
363
+ platform: 'wechat',
364
+ channelId: this.client.getCredentials()?.accountId || 'default',
365
+ };
366
+ log.debug('Calling message handler');
367
+ await this.messageHandler(ctx);
368
+ log.debug('Message handler completed');
369
+ }
370
+ // ============================================
371
+ // Context Token Management
372
+ // ============================================
373
+ getContextToken(userId) {
374
+ const cached = this.contextTokens.get(userId);
375
+ if (!cached)
376
+ return null;
377
+ // Check if expired
378
+ if (Date.now() - cached.timestamp > CONTEXT_TOKEN_TTL) {
379
+ this.contextTokens.delete(userId);
380
+ return null;
381
+ }
382
+ return cached.contextToken;
383
+ }
384
+ setContextToken(userId, token) {
385
+ this.contextTokens.set(userId, {
386
+ userId,
387
+ contextToken: token,
388
+ timestamp: Date.now(),
389
+ });
390
+ }
391
+ cleanupProcessedMessages() {
392
+ const now = Date.now();
393
+ for (const [msgId, timestamp] of this.processedMessages) {
394
+ if (now - timestamp > PROCESSED_MESSAGES_TTL) {
395
+ this.processedMessages.delete(msgId);
396
+ }
397
+ }
398
+ }
399
+ /**
400
+ * L14: drop expired context-token entries. The original implementation
401
+ * only removed an entry on read (`getContextToken` checked TTL), so a
402
+ * userId that messaged once and never came back left its row in the
403
+ * Map indefinitely. Called from the polling loop at the same cadence
404
+ * as cleanupProcessedMessages so memory stays bounded under big group
405
+ * sizes / churning user populations.
406
+ */
407
+ cleanupExpiredContextTokens() {
408
+ const now = Date.now();
409
+ for (const [userId, cached] of this.contextTokens) {
410
+ if (now - cached.timestamp > CONTEXT_TOKEN_TTL) {
411
+ this.contextTokens.delete(userId);
412
+ }
413
+ }
414
+ }
415
+ // ============================================
416
+ // Credentials Persistence
417
+ // ============================================
418
+ async loadCredentials() {
419
+ try {
420
+ const data = await readFile(CREDENTIALS_FILE, 'utf-8');
421
+ // Defense in depth: nag in logs if the file isn't 0o600. We can't
422
+ // safely chmod it on the user's behalf at load time (concurrent ops,
423
+ // odd ownership) but the warning prompts an operator to fix legacy
424
+ // credentials files written before H9.
425
+ try {
426
+ const st = await stat(CREDENTIALS_FILE);
427
+ if (process.platform !== 'win32' && (st.mode & 0o077) !== 0) {
428
+ log.warn({
429
+ file: CREDENTIALS_FILE,
430
+ mode: (st.mode & 0o777).toString(8),
431
+ }, 'Credentials file is group/world readable — chmod 600 recommended');
432
+ }
433
+ }
434
+ catch { /* stat failure is non-fatal */ }
435
+ return JSON.parse(data);
436
+ }
437
+ catch {
438
+ return null;
439
+ }
440
+ }
441
+ async saveCredentials(credentials) {
442
+ const dir = join(CREDENTIALS_FILE, '..');
443
+ // Restrict the parent dir to the current user. recursive:true is a no-op
444
+ // when the dir already exists with looser perms — accept that compromise
445
+ // (we don't want to chmod existing dirs out from under the operator) and
446
+ // rely on the file-level 0o600 below as the primary line of defense.
447
+ await mkdir(dir, { recursive: true, mode: 0o700 });
448
+ await writeFile(CREDENTIALS_FILE, JSON.stringify(credentials, null, 2), { mode: 0o600 });
449
+ log.info({ file: CREDENTIALS_FILE }, 'Credentials saved');
450
+ }
451
+ // ============================================
452
+ // Utilities
453
+ // ============================================
454
+ splitMessage(text, maxLength = 2000) {
455
+ if (text.length <= maxLength) {
456
+ return [text];
457
+ }
458
+ const chunks = [];
459
+ let remaining = text;
460
+ while (remaining.length > maxLength) {
461
+ // Try to split at newline
462
+ let splitPoint = remaining.lastIndexOf('\n', maxLength);
463
+ if (splitPoint < maxLength / 2) {
464
+ splitPoint = maxLength;
465
+ }
466
+ chunks.push(remaining.slice(0, splitPoint));
467
+ remaining = remaining.slice(splitPoint).trim();
468
+ }
469
+ if (remaining) {
470
+ chunks.push(remaining);
471
+ }
472
+ // Add continuation markers
473
+ if (chunks.length > 1) {
474
+ for (let i = 0; i < chunks.length - 1; i++) {
475
+ chunks[i] += '\n\n[continued...]';
476
+ }
477
+ }
478
+ return chunks;
479
+ }
480
+ }
481
+ // Singleton instance
482
+ export const ilinkWeChatAdapter = new ILinkWeChatAdapter();
483
+ //# sourceMappingURL=ilink-adapter.js.map