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,426 @@
1
+ // Onboarding module - friendly first-run experience
2
+ // Handles messenger config checks, agent availability, and interactive setup
3
+ import { createInterface } from 'readline';
4
+ import { homedir } from 'os';
5
+ import { join } from 'path';
6
+ import { readFile, writeFile, mkdir } from 'fs/promises';
7
+ import { registry } from './registry.js';
8
+ const CONFIG_DIR = join(homedir(), '.im-hub');
9
+ const CONFIG_FILE = join(CONFIG_DIR, 'config.json');
10
+ // ============================================
11
+ // Constants
12
+ // ============================================
13
+ const AVAILABLE_MESSENGERS = [
14
+ { id: 'wechat-ilink', displayName: 'WeChat', description: 'Scan QR to login' },
15
+ { id: 'telegram', displayName: 'Telegram', description: 'Bot token from @BotFather' },
16
+ { id: 'feishu', displayName: 'Feishu/Lark', description: 'App ID and Secret' },
17
+ { id: 'discord', displayName: 'Discord', description: 'Bot token from Developer Portal' },
18
+ ];
19
+ const AGENT_PACKAGES = {
20
+ 'claude-code': { agent: 'claude-code', npmPackage: '@anthropic-ai/claude-code', command: 'claude' },
21
+ 'codex': { agent: 'codex', npmPackage: '@openai/codex', command: 'codex' },
22
+ 'copilot': { agent: 'copilot', npmPackage: '@github/copilot', command: 'copilot' },
23
+ 'opencode': { agent: 'opencode', npmPackage: 'opencode-ai', command: 'opencode' },
24
+ };
25
+ // ============================================
26
+ // ============================================
27
+ // Agent availability cache (TTL-based)
28
+ // ============================================
29
+ // ============================================
30
+ // Config helpers (extracted for reuse)
31
+ // ============================================
32
+ export async function loadConfig() {
33
+ try {
34
+ const data = await readFile(CONFIG_FILE, 'utf-8');
35
+ return JSON.parse(data);
36
+ }
37
+ catch {
38
+ return {
39
+ messengers: [],
40
+ agents: [],
41
+ defaultAgent: 'claude-code',
42
+ };
43
+ }
44
+ }
45
+ export async function saveConfig(config) {
46
+ await mkdir(CONFIG_DIR, { recursive: true });
47
+ await writeFile(CONFIG_FILE, JSON.stringify(config, null, 2));
48
+ }
49
+ // ============================================
50
+ // Readline helper
51
+ // ============================================
52
+ function createPromptInterface() {
53
+ return createInterface({
54
+ input: process.stdin,
55
+ output: process.stdout,
56
+ });
57
+ }
58
+ async function prompt(rl, question) {
59
+ return new Promise((resolve) => {
60
+ rl.question(question, (answer) => {
61
+ resolve(answer.trim());
62
+ });
63
+ });
64
+ }
65
+ // ============================================
66
+ // 1. checkMessengerConfig (SYNC)
67
+ // ============================================
68
+ /**
69
+ * Check if messengers are configured.
70
+ * IMPORTANT: This checks the config.messengers array BEFORE any default fill.
71
+ */
72
+ export function checkMessengerConfig(config) {
73
+ if (config.messengers.length === 0) {
74
+ return {
75
+ needsOnboarding: true,
76
+ availableMessengers: AVAILABLE_MESSENGERS,
77
+ };
78
+ }
79
+ return {
80
+ needsOnboarding: false,
81
+ availableMessengers: [],
82
+ warnings: [],
83
+ };
84
+ }
85
+ // ============================================
86
+ // 2. checkAgentAvailability (ASYNC, TTL-cached)
87
+ // ============================================
88
+ // Cache with TTL so agent install/uninstall is reflected within 2 minutes
89
+ let agentCheckCache = null;
90
+ const AGENT_CHECK_CACHE_TTL = 2 * 60 * 1000; // 2 minutes
91
+ /** Per-agent cached `isAvailable()` results — fall-through cache for
92
+ * `isAgentAvailableCached` when an agent isn't represented in the bulk
93
+ * snapshot (e.g. registered after the last refresh, or the bulk hasn't
94
+ * run yet). The bulk cache is consulted first; this Map only matters for
95
+ * the fallback probe path. */
96
+ const perAgentCache = new Map();
97
+ /**
98
+ * Check which agents are available.
99
+ * Result is cached with a 2-minute TTL.
100
+ */
101
+ export async function checkAgentAvailability() {
102
+ if (agentCheckCache && Date.now() - agentCheckCache.timestamp < AGENT_CHECK_CACHE_TTL) {
103
+ return agentCheckCache.result;
104
+ }
105
+ const agentNames = registry.listAgents();
106
+ const available = [];
107
+ const missing = [];
108
+ for (const name of agentNames) {
109
+ const agent = registry.findAgent(name);
110
+ if (agent) {
111
+ try {
112
+ const isAvail = await agent.isAvailable();
113
+ if (isAvail) {
114
+ available.push(name);
115
+ }
116
+ else {
117
+ missing.push(name);
118
+ }
119
+ perAgentCache.set(name, { ok: isAvail, timestamp: Date.now() });
120
+ }
121
+ catch {
122
+ missing.push(name);
123
+ perAgentCache.set(name, { ok: false, timestamp: Date.now() });
124
+ }
125
+ }
126
+ }
127
+ const result = {
128
+ available,
129
+ missing,
130
+ allMissing: available.length === 0,
131
+ };
132
+ agentCheckCache = { result, timestamp: Date.now() };
133
+ return result;
134
+ }
135
+ /**
136
+ * Check if a specific agent is available.
137
+ *
138
+ * Uses the bulk cache when present, but falls through to a one-off probe
139
+ * if the agent name isn't represented (e.g. agent registered after the
140
+ * last bulk refresh). The probe result is itself cached for the TTL.
141
+ */
142
+ export async function isAgentAvailableCached(agentName) {
143
+ const bulk = await checkAgentAvailability();
144
+ if (bulk.available.includes(agentName))
145
+ return true;
146
+ if (bulk.missing.includes(agentName))
147
+ return false;
148
+ // Not represented in bulk — probe directly with a per-agent cache.
149
+ const cached = perAgentCache.get(agentName);
150
+ if (cached && Date.now() - cached.timestamp < AGENT_CHECK_CACHE_TTL) {
151
+ return cached.ok;
152
+ }
153
+ const agent = registry.findAgent(agentName);
154
+ if (!agent)
155
+ return false;
156
+ try {
157
+ const ok = await agent.isAvailable();
158
+ perAgentCache.set(agentName, { ok, timestamp: Date.now() });
159
+ return ok;
160
+ }
161
+ catch {
162
+ perAgentCache.set(agentName, { ok: false, timestamp: Date.now() });
163
+ return false;
164
+ }
165
+ }
166
+ /**
167
+ * Clear the agent availability caches. Useful for tests that change the
168
+ * registry state, and for the future `/router refresh` ops command.
169
+ */
170
+ export function clearAgentCache() {
171
+ agentCheckCache = null;
172
+ perAgentCache.clear();
173
+ }
174
+ // ============================================
175
+ // 3. formatAgentInstallHint
176
+ // ============================================
177
+ /**
178
+ * Generate friendly install message for missing agents
179
+ */
180
+ export function formatAgentInstallHint(missing) {
181
+ if (missing.length === 0)
182
+ return '';
183
+ const getInstallHint = (name) => {
184
+ const hint = AGENT_PACKAGES[name];
185
+ if (!hint)
186
+ return `npm i -g ${name}`;
187
+ return `npm i -g ${hint.npmPackage}`;
188
+ };
189
+ if (missing.length === 1) {
190
+ return `Install ${missing[0]}: ${getInstallHint(missing[0])}`;
191
+ }
192
+ const hints = missing.map((name) => ` - ${name}: ${getInstallHint(name)}`);
193
+ return `Install agents:\n${hints.join('\n')}`;
194
+ }
195
+ /**
196
+ * Format error message when agent is not available
197
+ */
198
+ export function formatAgentNotAvailableError(agentName) {
199
+ let installHint;
200
+ if (agentName === 'copilot') {
201
+ installHint = `安装方式 (选择其一):
202
+ npm i -g @github/copilot
203
+ gh extension install github/gh-copilot
204
+ brew install copilot-cli (macOS)
205
+ winget install GitHub.Copilot (Windows)
206
+ 或安装 VS Code Copilot Chat 扩展`;
207
+ }
208
+ else {
209
+ const hint = AGENT_PACKAGES[agentName];
210
+ installHint = hint ? `npm i -g ${hint.npmPackage}` : `npm i -g ${agentName}`;
211
+ }
212
+ return `❌ ${agentName} is not installed or not available.\n\n${installHint}\n\nOr try another agent:\n /cc - Claude Code\n /cx - Codex\n /co - Copilot\n /oc - OpenCode`;
213
+ }
214
+ // ============================================
215
+ // 4. runMessengerOnboarding
216
+ // ============================================
217
+ /**
218
+ * Interactive onboarding flow.
219
+ * Returns updated config on success, null on failure/cancel.
220
+ */
221
+ export async function runMessengerOnboarding(config) {
222
+ // Non-interactive fallback
223
+ if (!process.stdin.isTTY) {
224
+ console.log('❌ No messengers configured. Run interactively:');
225
+ console.log(' im-hub config wechat');
226
+ console.log(' im-hub config telegram');
227
+ console.log(' im-hub config feishu');
228
+ return null;
229
+ }
230
+ const rl = createPromptInterface();
231
+ try {
232
+ while (true) {
233
+ // Show menu
234
+ console.log('\n📱 Let\'s set up a messenger:\n');
235
+ AVAILABLE_MESSENGERS.forEach((m, i) => {
236
+ console.log(` ${i + 1}. ${m.displayName} - ${m.description}`);
237
+ });
238
+ console.log(` Q. Quit and configure manually\n`);
239
+ const choice = await prompt(rl, `Select a messenger (1-${AVAILABLE_MESSENGERS.length} or Q): `);
240
+ // Handle quit
241
+ if (choice.toLowerCase() === 'q' || choice === '') {
242
+ console.log('\n❌ Onboarding cancelled.');
243
+ console.log('Run "im-hub config <messenger>" to configure manually.');
244
+ return null;
245
+ }
246
+ const index = parseInt(choice, 10) - 1;
247
+ if (index < 0 || index >= AVAILABLE_MESSENGERS.length) {
248
+ console.log(`Invalid choice. Please enter 1-${AVAILABLE_MESSENGERS.length} or Q.`);
249
+ continue;
250
+ }
251
+ const selected = AVAILABLE_MESSENGERS[index];
252
+ // Run the config flow
253
+ const result = await configureMessenger(selected.id, config, rl);
254
+ if (result) {
255
+ rl.close();
256
+ return result;
257
+ }
258
+ // Config failed - show retry menu
259
+ console.log(`\n❌ Failed to configure ${selected.displayName}.`);
260
+ const retry = await prompt(rl, '[R] Retry, [S] Select different, [Q] Quit: ');
261
+ if (retry.toLowerCase() === 'q') {
262
+ rl.close();
263
+ return null;
264
+ }
265
+ else if (retry.toLowerCase() === 's') {
266
+ continue; // Back to menu
267
+ }
268
+ // 'r' or anything else = retry same messenger (loop continues)
269
+ }
270
+ }
271
+ catch (error) {
272
+ const errMsg = error instanceof Error ? error.message : String(error);
273
+ console.error(`\n❌ Onboarding error: ${errMsg}`);
274
+ rl.close();
275
+ return null;
276
+ }
277
+ }
278
+ // ============================================
279
+ // Messenger config flows
280
+ // ============================================
281
+ async function configureMessenger(messengerId, config, rl) {
282
+ switch (messengerId) {
283
+ case 'wechat-ilink':
284
+ return configureWeChat(config, rl);
285
+ case 'telegram':
286
+ return configureTelegram(config, rl);
287
+ case 'feishu':
288
+ return configureFeishu(config, rl);
289
+ case 'discord':
290
+ return configureDiscord(config, rl);
291
+ default:
292
+ console.log(`Unknown messenger: ${messengerId}`);
293
+ return null;
294
+ }
295
+ }
296
+ async function configureWeChat(config, _rl) {
297
+ console.log('\n📱 Configuring WeChat...');
298
+ console.log('Fetching QR code...\n');
299
+ try {
300
+ const { ILinkWeChatAdapter } = await import('../plugins/messengers/wechat/ilink-adapter.js');
301
+ const adapter = new ILinkWeChatAdapter();
302
+ const { qrUrl, qrToken } = await adapter.startQRLogin();
303
+ console.log('📱 Scan this QR code with WeChat:\n');
304
+ console.log(qrUrl);
305
+ console.log('\n');
306
+ const credentials = await adapter.waitForQRLogin(qrToken, (status) => {
307
+ console.log(`[${new Date().toLocaleTimeString()}] ${status}`);
308
+ });
309
+ if (credentials) {
310
+ console.log(`\n✅ Logged in as ${credentials.userId}`);
311
+ console.log(` Bot ID: ${credentials.accountId}`);
312
+ if (!config.messengers.includes('wechat-ilink')) {
313
+ config.messengers.push('wechat-ilink');
314
+ }
315
+ return config;
316
+ }
317
+ else {
318
+ console.log('\n❌ Login failed or timed out');
319
+ return null;
320
+ }
321
+ }
322
+ catch (error) {
323
+ const errMsg = error instanceof Error ? error.message : String(error);
324
+ console.error(`\n❌ Failed to configure WeChat: ${errMsg}`);
325
+ return null;
326
+ }
327
+ }
328
+ async function configureTelegram(config, rl) {
329
+ console.log('\n📱 Configuring Telegram...');
330
+ console.log('To get a bot token:');
331
+ console.log('1. Open Telegram and search for @BotFather');
332
+ console.log('2. Send /newbot and follow instructions');
333
+ console.log('3. Copy the bot token\n');
334
+ const token = await prompt(rl, 'Enter your bot token: ');
335
+ if (!token) {
336
+ console.log('❌ Bot token is required');
337
+ return null;
338
+ }
339
+ const channelId = await prompt(rl, 'Enter channel ID (optional, press Enter for default): ');
340
+ config.telegram = { botToken: token, channelId: channelId || 'default' };
341
+ if (!config.messengers.includes('telegram')) {
342
+ config.messengers.push('telegram');
343
+ }
344
+ console.log('✅ Telegram bot token saved');
345
+ console.log(` Channel ID: ${config.telegram.channelId}`);
346
+ return config;
347
+ }
348
+ async function configureFeishu(config, rl) {
349
+ console.log('\n📱 Configuring Feishu (WebSocket long polling mode)...');
350
+ console.log('To create a Feishu bot:');
351
+ console.log('1. Go to https://open.feishu.cn/app');
352
+ console.log('2. Create a custom bot app');
353
+ console.log('3. Enable Bot capability');
354
+ console.log('4. Configure event subscriptions (Subscribe to "Receive Message" event)');
355
+ console.log('5. Copy App ID and App Secret\n');
356
+ const appId = await prompt(rl, 'Enter App ID: ');
357
+ const appSecret = await prompt(rl, 'Enter App Secret: ');
358
+ if (!appId || !appSecret) {
359
+ console.log('❌ App ID and App Secret are required');
360
+ return null;
361
+ }
362
+ config.feishu = { appId, appSecret };
363
+ if (!config.messengers.includes('feishu')) {
364
+ config.messengers.push('feishu');
365
+ }
366
+ console.log('✅ Feishu bot credentials saved');
367
+ console.log('\n✅ Using WebSocket long polling mode - no webhook configuration needed!');
368
+ console.log(' The bot will automatically connect to Feishu servers.');
369
+ return config;
370
+ }
371
+ async function configureDiscord(config, rl) {
372
+ console.log('\n📱 Configuring Discord...');
373
+ console.log('To create a Discord bot:');
374
+ console.log('1. Go to https://discord.com/developers/applications');
375
+ console.log('2. Click "New Application" and give it a name');
376
+ console.log('3. Go to "Bot" tab and click "Add Bot"');
377
+ console.log('4. IMPORTANT: Enable "MESSAGE CONTENT INTENT" under Privileged Gateway Intents');
378
+ console.log('5. Click "Reset Token" to get your bot token');
379
+ console.log('6. Go to OAuth2 > URL Generator:');
380
+ console.log(' - Scopes: bot');
381
+ console.log(' - Bot Permissions: Send Messages, Read Message History, View Channels');
382
+ console.log('7. Use the generated URL to invite the bot to your server\n');
383
+ const token = await prompt(rl, 'Enter your bot token: ');
384
+ if (!token) {
385
+ console.log('❌ Bot token is required');
386
+ return null;
387
+ }
388
+ const channelId = await prompt(rl, 'Enter channel ID (optional, press Enter for default): ');
389
+ const allowedGuilds = await prompt(rl, 'Allowed guild IDs (comma-separated, optional): ');
390
+ const allowedChannels = await prompt(rl, 'Allowed channel IDs (comma-separated, optional): ');
391
+ config.discord = {
392
+ botToken: token,
393
+ channelId: channelId || 'default',
394
+ allowedGuilds: allowedGuilds ? allowedGuilds.split(',').map(s => s.trim()).filter(Boolean) : undefined,
395
+ allowedChannels: allowedChannels ? allowedChannels.split(',').map(s => s.trim()).filter(Boolean) : undefined,
396
+ };
397
+ if (!config.messengers.includes('discord')) {
398
+ config.messengers.push('discord');
399
+ }
400
+ console.log('✅ Discord bot token saved');
401
+ console.log(` Channel ID: ${config.discord.channelId}`);
402
+ if (config.discord.allowedGuilds?.length) {
403
+ console.log(` Allowed guilds: ${config.discord.allowedGuilds.join(', ')}`);
404
+ }
405
+ if (config.discord.allowedChannels?.length) {
406
+ console.log(` Allowed channels: ${config.discord.allowedChannels.join(', ')}`);
407
+ }
408
+ return config;
409
+ }
410
+ // ============================================
411
+ // Error message formatter for messenger.start()
412
+ // ============================================
413
+ /**
414
+ * Format a user-friendly error message for messenger startup failures
415
+ */
416
+ export function formatMessengerStartError(messengerName, error) {
417
+ const errMsg = error instanceof Error ? error.message : String(error);
418
+ // Check for credential/auth errors
419
+ if (errMsg.toLowerCase().includes('credentials') || errMsg.toLowerCase().includes('auth')) {
420
+ const configName = messengerName.replace('-ilink', '');
421
+ return `Run "im-hub config ${configName}" to reconfigure.`;
422
+ }
423
+ // Generic error
424
+ return errMsg;
425
+ }
426
+ //# sourceMappingURL=onboarding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onboarding.js","sourceRoot":"","sources":["../../src/core/onboarding.ts"],"names":[],"mappings":"AAAA,oDAAoD;AACpD,6EAA6E;AAE7E,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAA;AAC5B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAExC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAA;AAC7C,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAA;AA+CnD,+CAA+C;AAC/C,YAAY;AACZ,+CAA+C;AAE/C,MAAM,oBAAoB,GAAoB;IAC5C,EAAE,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,kBAAkB,EAAE;IAC9E,EAAE,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,2BAA2B,EAAE;IACrF,EAAE,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,mBAAmB,EAAE;IAC9E,EAAE,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,iCAAiC,EAAE;CAC1F,CAAA;AAED,MAAM,cAAc,GAAqC;IACvD,aAAa,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,2BAA2B,EAAE,OAAO,EAAE,QAAQ,EAAE;IACnG,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,OAAO,EAAE,OAAO,EAAE;IAC1E,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,iBAAiB,EAAE,OAAO,EAAE,SAAS,EAAE;IAClF,UAAU,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,OAAO,EAAE,UAAU,EAAE;CAClF,CAAA;AAED,+CAA+C;AAC/C,+CAA+C;AAC/C,uCAAuC;AACvC,+CAA+C;AAE/C,+CAA+C;AAC/C,uCAAuC;AACvC,+CAA+C;AAE/C,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;QACjD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,UAAU,EAAE,EAAE;YACd,MAAM,EAAE,EAAE;YACV,YAAY,EAAE,aAAa;SAC5B,CAAA;IACH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAAc;IAC7C,MAAM,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAC5C,MAAM,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;AAC/D,CAAC;AAED,+CAA+C;AAC/C,kBAAkB;AAClB,+CAA+C;AAE/C,SAAS,qBAAqB;IAC5B,OAAO,eAAe,CAAC;QACrB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAA;AACJ,CAAC;AAED,KAAK,UAAU,MAAM,CAAC,EAAsC,EAAE,QAAgB;IAC5E,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE;YAC/B,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAA;QACxB,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,+CAA+C;AAC/C,iCAAiC;AACjC,+CAA+C;AAE/C;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAc;IACjD,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,OAAO;YACL,eAAe,EAAE,IAAI;YACrB,mBAAmB,EAAE,oBAAoB;SAC1C,CAAA;IACH,CAAC;IAED,OAAO;QACL,eAAe,EAAE,KAAK;QACtB,mBAAmB,EAAE,EAAE;QACvB,QAAQ,EAAE,EAAE;KACb,CAAA;AACH,CAAC;AAED,+CAA+C;AAC/C,gDAAgD;AAChD,+CAA+C;AAE/C,0EAA0E;AAC1E,IAAI,eAAe,GAA2D,IAAI,CAAA;AAClF,MAAM,qBAAqB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAA,CAAC,YAAY;AAExD;;;;8BAI8B;AAC9B,MAAM,aAAa,GAAG,IAAI,GAAG,EAA8C,CAAA;AAE3E;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB;IAC1C,IAAI,eAAe,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,eAAe,CAAC,SAAS,GAAG,qBAAqB,EAAE,CAAC;QACtF,OAAO,eAAe,CAAC,MAAM,CAAA;IAC/B,CAAC;IACD,MAAM,UAAU,GAAG,QAAQ,CAAC,UAAU,EAAE,CAAA;IACxC,MAAM,SAAS,GAAa,EAAE,CAAA;IAC9B,MAAM,OAAO,GAAa,EAAE,CAAA;IAC5B,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;QACtC,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,WAAW,EAAE,CAAA;gBACzC,IAAI,OAAO,EAAE,CAAC;oBACZ,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBACtB,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBACpB,CAAC;gBACD,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;YACjE,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBAClB,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;YAC/D,CAAC;QACH,CAAC;IACH,CAAC;IACD,MAAM,MAAM,GAAqB;QAC/B,SAAS;QACT,OAAO;QACP,UAAU,EAAE,SAAS,CAAC,MAAM,KAAK,CAAC;KACnC,CAAA;IACD,eAAe,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAA;IACnD,OAAO,MAAM,CAAA;AACf,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,SAAiB;IAC5D,MAAM,IAAI,GAAG,MAAM,sBAAsB,EAAE,CAAA;IAC3C,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,IAAI,CAAA;IACnD,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,KAAK,CAAA;IAElD,mEAAmE;IACnE,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;IAC3C,IAAI,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,SAAS,GAAG,qBAAqB,EAAE,CAAC;QACpE,OAAO,MAAM,CAAC,EAAE,CAAA;IAClB,CAAC;IACD,MAAM,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;IAC3C,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAA;IACxB,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,WAAW,EAAE,CAAA;QACpC,aAAa,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;QAC3D,OAAO,EAAE,CAAA;IACX,CAAC;IAAC,MAAM,CAAC;QACP,aAAa,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;QAClE,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe;IAC7B,eAAe,GAAG,IAAI,CAAA;IACtB,aAAa,CAAC,KAAK,EAAE,CAAA;AACvB,CAAC;AAED,+CAA+C;AAC/C,4BAA4B;AAC5B,+CAA+C;AAE/C;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAAiB;IACtD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAA;IAEnC,MAAM,cAAc,GAAG,CAAC,IAAY,EAAU,EAAE;QAC9C,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,CAAA;QACjC,IAAI,CAAC,IAAI;YAAE,OAAO,YAAY,IAAI,EAAE,CAAA;QACpC,OAAO,YAAY,IAAI,CAAC,UAAU,EAAE,CAAA;IACtC,CAAC,CAAA;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,WAAW,OAAO,CAAC,CAAC,CAAC,KAAK,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IAC/D,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,IAAI,KAAK,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAC3E,OAAO,oBAAoB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAA;AAC/C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,4BAA4B,CAAC,SAAiB;IAC5D,IAAI,WAAmB,CAAA;IAEvB,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,WAAW,GAAG;;;;;8BAKY,CAAA;IAC5B,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,GAAG,cAAc,CAAC,SAAS,CAAC,CAAA;QACtC,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,YAAY,SAAS,EAAE,CAAA;IAC9E,CAAC;IAED,OAAO,KAAK,SAAS,0CAA0C,WAAW,kGAAkG,CAAA;AAC9K,CAAC;AAED,+CAA+C;AAC/C,4BAA4B;AAC5B,+CAA+C;AAE/C;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,MAAc;IACzD,2BAA2B;IAC3B,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAA;QAC7D,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAA;QACtC,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAA;QACxC,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAA;QACtC,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,EAAE,GAAG,qBAAqB,EAAE,CAAA;IAElC,IAAI,CAAC;QACH,OAAO,IAAI,EAAE,CAAC;YACZ,YAAY;YACZ,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAA;YAChD,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBACpC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,WAAW,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC,CAAA;YAChE,CAAC,CAAC,CAAA;YACF,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAA;YAEjD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,EAAE,EAAE,yBAAyB,oBAAoB,CAAC,MAAM,UAAU,CAAC,CAAA;YAE/F,cAAc;YACd,IAAI,MAAM,CAAC,WAAW,EAAE,KAAK,GAAG,IAAI,MAAM,KAAK,EAAE,EAAE,CAAC;gBAClD,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAA;gBACxC,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAA;gBACrE,OAAO,IAAI,CAAA;YACb,CAAC;YAED,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,CAAC,CAAA;YACtC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,IAAI,oBAAoB,CAAC,MAAM,EAAE,CAAC;gBACtD,OAAO,CAAC,GAAG,CAAC,kCAAkC,oBAAoB,CAAC,MAAM,QAAQ,CAAC,CAAA;gBAClF,SAAQ;YACV,CAAC;YAED,MAAM,QAAQ,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAA;YAE5C,sBAAsB;YACtB,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,CAAA;YAEhE,IAAI,MAAM,EAAE,CAAC;gBACX,EAAE,CAAC,KAAK,EAAE,CAAA;gBACV,OAAO,MAAM,CAAA;YACf,CAAC;YAED,kCAAkC;YAClC,OAAO,CAAC,GAAG,CAAC,2BAA2B,QAAQ,CAAC,WAAW,GAAG,CAAC,CAAA;YAC/D,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,EAAE,EAAE,6CAA6C,CAAC,CAAA;YAE7E,IAAI,KAAK,CAAC,WAAW,EAAE,KAAK,GAAG,EAAE,CAAC;gBAChC,EAAE,CAAC,KAAK,EAAE,CAAA;gBACV,OAAO,IAAI,CAAA;YACb,CAAC;iBAAM,IAAI,KAAK,CAAC,WAAW,EAAE,KAAK,GAAG,EAAE,CAAC;gBACvC,SAAQ,CAAC,eAAe;YAC1B,CAAC;YACD,+DAA+D;QACjE,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QACrE,OAAO,CAAC,KAAK,CAAC,yBAAyB,MAAM,EAAE,CAAC,CAAA;QAChD,EAAE,CAAC,KAAK,EAAE,CAAA;QACV,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED,+CAA+C;AAC/C,yBAAyB;AACzB,+CAA+C;AAE/C,KAAK,UAAU,kBAAkB,CAC/B,WAAmB,EACnB,MAAc,EACd,EAAsC;IAEtC,QAAQ,WAAW,EAAE,CAAC;QACpB,KAAK,cAAc;YACjB,OAAO,eAAe,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;QACpC,KAAK,UAAU;YACb,OAAO,iBAAiB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;QACtC,KAAK,QAAQ;YACX,OAAO,eAAe,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;QACpC,KAAK,SAAS;YACZ,OAAO,gBAAgB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;QACrC;YACE,OAAO,CAAC,GAAG,CAAC,sBAAsB,WAAW,EAAE,CAAC,CAAA;YAChD,OAAO,IAAI,CAAA;IACf,CAAC;AACH,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,MAAc,EAAE,GAAuC;IACpF,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAA;IACzC,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAA;IAEpC,IAAI,CAAC;QACH,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,MAAM,CAAC,+CAA+C,CAAC,CAAA;QAC5F,MAAM,OAAO,GAAG,IAAI,kBAAkB,EAAE,CAAA;QAExC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,MAAM,OAAO,CAAC,YAAY,EAAE,CAAA;QAEvD,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAA;QAClD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;QAClB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAEjB,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE;YACnE,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,kBAAkB,EAAE,KAAK,MAAM,EAAE,CAAC,CAAA;QAC/D,CAAC,CAAC,CAAA;QAEF,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,oBAAoB,WAAW,CAAC,MAAM,EAAE,CAAC,CAAA;YACrD,OAAO,CAAC,GAAG,CAAC,cAAc,WAAW,CAAC,SAAS,EAAE,CAAC,CAAA;YAElD,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;gBAChD,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;YACxC,CAAC;YAED,OAAO,MAAM,CAAA;QACf,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAA;YAC5C,OAAO,IAAI,CAAA;QACb,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QACrE,OAAO,CAAC,KAAK,CAAC,mCAAmC,MAAM,EAAE,CAAC,CAAA;QAC1D,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,MAAc,EAAE,EAAsC;IACrF,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAA;IAC3C,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAA;IAClC,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAA;IACzD,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAA;IACtD,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAA;IAEtC,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,EAAE,EAAE,wBAAwB,CAAC,CAAA;IAExD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAA;QACtC,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,EAAE,EAAE,wDAAwD,CAAC,CAAA;IAE5F,MAAM,CAAC,QAAQ,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,IAAI,SAAS,EAAE,CAAA;IACxE,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5C,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IACpC,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAA;IACzC,OAAO,CAAC,GAAG,CAAC,kBAAkB,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAA;IAE1D,OAAO,MAAM,CAAA;AACf,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,MAAc,EAAE,EAAsC;IACnF,OAAO,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAA;IACvE,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAA;IACtC,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAA;IAClD,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAA;IACzC,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAA;IACvC,OAAO,CAAC,GAAG,CAAC,yEAAyE,CAAC,CAAA;IACtF,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAA;IAE9C,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAA;IAChD,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,EAAE,EAAE,oBAAoB,CAAC,CAAA;IAExD,IAAI,CAAC,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAA;QACnD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,CAAC,MAAM,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,CAAA;IACpC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1C,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IAClC,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAA;IAC7C,OAAO,CAAC,GAAG,CAAC,0EAA0E,CAAC,CAAA;IACvF,OAAO,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAA;IAEvE,OAAO,MAAM,CAAA;AACf,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,MAAc,EAAE,EAAsC;IACpF,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAA;IAC1C,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAA;IACvC,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAA;IACnE,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAA;IAC5D,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAA;IACrD,OAAO,CAAC,GAAG,CAAC,gFAAgF,CAAC,CAAA;IAC7F,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAA;IAC3D,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAA;IAC/C,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAA;IAC/B,OAAO,CAAC,GAAG,CAAC,0EAA0E,CAAC,CAAA;IACvF,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAA;IAE1E,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,EAAE,EAAE,wBAAwB,CAAC,CAAA;IAExD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAA;QACtC,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,EAAE,EAAE,wDAAwD,CAAC,CAAA;IAC5F,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC,EAAE,EAAE,iDAAiD,CAAC,CAAA;IACzF,MAAM,eAAe,GAAG,MAAM,MAAM,CAAC,EAAE,EAAE,mDAAmD,CAAC,CAAA;IAE7F,MAAM,CAAC,OAAO,GAAG;QACf,QAAQ,EAAE,KAAK;QACf,SAAS,EAAE,SAAS,IAAI,SAAS;QACjC,aAAa,EAAE,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS;QACtG,eAAe,EAAE,eAAe,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS;KAC7G,CAAA;IACD,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3C,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IACnC,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAA;IACxC,OAAO,CAAC,GAAG,CAAC,kBAAkB,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAA;IACzD,IAAI,MAAM,CAAC,OAAO,CAAC,aAAa,EAAE,MAAM,EAAE,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,sBAAsB,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAC9E,CAAC;IACD,IAAI,MAAM,CAAC,OAAO,CAAC,eAAe,EAAE,MAAM,EAAE,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,wBAAwB,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAClF,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC;AAED,+CAA+C;AAC/C,gDAAgD;AAChD,+CAA+C;AAE/C;;GAEG;AACH,MAAM,UAAU,yBAAyB,CAAC,aAAqB,EAAE,KAAc;IAC7E,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IAErE,mCAAmC;IACnC,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1F,MAAM,UAAU,GAAG,aAAa,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;QACtD,OAAO,sBAAsB,UAAU,mBAAmB,CAAA;IAC5D,CAAC;IAED,gBAAgB;IAChB,OAAO,MAAM,CAAA;AACf,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=onboarding.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onboarding.test.d.ts","sourceRoot":"","sources":["../../src/core/onboarding.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,112 @@
1
+ // Tests for onboarding module
2
+ import { describe, it, expect } from 'bun:test';
3
+ import { checkMessengerConfig, formatAgentInstallHint, formatAgentNotAvailableError, formatMessengerStartError, } from './onboarding.js';
4
+ describe('checkMessengerConfig', () => {
5
+ it('returns needsOnboarding=true when messengers empty', () => {
6
+ const config = {
7
+ messengers: [],
8
+ agents: [],
9
+ defaultAgent: 'claude-code',
10
+ };
11
+ const result = checkMessengerConfig(config);
12
+ expect(result.needsOnboarding).toBe(true);
13
+ expect(result.availableMessengers.length).toBeGreaterThan(0);
14
+ });
15
+ it('returns needsOnboarding=false when messengers populated', () => {
16
+ const config = {
17
+ messengers: ['wechat-ilink'],
18
+ agents: [],
19
+ defaultAgent: 'claude-code',
20
+ };
21
+ const result = checkMessengerConfig(config);
22
+ expect(result.needsOnboarding).toBe(false);
23
+ expect(result.availableMessengers.length).toBe(0);
24
+ });
25
+ it('includes correct availableMessengers list', () => {
26
+ const config = {
27
+ messengers: [],
28
+ agents: [],
29
+ defaultAgent: 'claude-code',
30
+ };
31
+ const result = checkMessengerConfig(config);
32
+ const ids = result.availableMessengers.map((m) => m.id);
33
+ expect(ids).toContain('wechat-ilink');
34
+ expect(ids).toContain('telegram');
35
+ expect(ids).toContain('feishu');
36
+ });
37
+ });
38
+ describe('formatAgentInstallHint', () => {
39
+ it('formats single agent correctly', () => {
40
+ const hint = formatAgentInstallHint(['opencode']);
41
+ expect(hint).toContain('opencode');
42
+ expect(hint).toContain('npm i -g');
43
+ });
44
+ it('formats multiple agents correctly', () => {
45
+ const hint = formatAgentInstallHint(['claude-code', 'codex']);
46
+ expect(hint).toContain('npm i -g');
47
+ expect(hint).toContain('@anthropic-ai/claude-code');
48
+ expect(hint).toContain('@openai/codex');
49
+ });
50
+ it('handles unknown agents', () => {
51
+ const hint = formatAgentInstallHint(['unknown-agent']);
52
+ expect(hint).toContain('unknown-agent');
53
+ expect(hint).toContain('npm i -g unknown-agent');
54
+ });
55
+ it('returns empty string for empty array', () => {
56
+ const hint = formatAgentInstallHint([]);
57
+ expect(hint).toBe('');
58
+ });
59
+ });
60
+ describe('formatAgentNotAvailableError', () => {
61
+ it('includes install command for opencode', () => {
62
+ const error = formatAgentNotAvailableError('opencode');
63
+ expect(error).toContain('opencode');
64
+ expect(error).toContain('not installed');
65
+ expect(error).toContain('npm i -g opencode');
66
+ });
67
+ it('includes install command for claude-code', () => {
68
+ const error = formatAgentNotAvailableError('claude-code');
69
+ expect(error).toContain('claude-code');
70
+ expect(error).toContain('npm i -g @anthropic-ai/claude-code');
71
+ });
72
+ it('includes alternative agent suggestions', () => {
73
+ const error = formatAgentNotAvailableError('codex');
74
+ expect(error).toContain('/cc');
75
+ expect(error).toContain('/cx');
76
+ expect(error).toContain('/co');
77
+ expect(error).toContain('/oc');
78
+ });
79
+ it('handles unknown agents', () => {
80
+ const error = formatAgentNotAvailableError('unknown-agent');
81
+ expect(error).toContain('unknown-agent');
82
+ expect(error).toContain('npm i -g unknown-agent');
83
+ });
84
+ });
85
+ describe('formatMessengerStartError', () => {
86
+ it('shows config hint for credential errors', () => {
87
+ const error = new Error('No credentials found');
88
+ const hint = formatMessengerStartError('wechat-ilink', error);
89
+ expect(hint).toContain('im-hub config wechat');
90
+ });
91
+ it('shows config hint for auth errors', () => {
92
+ const error = new Error('Authentication failed');
93
+ const hint = formatMessengerStartError('telegram', error);
94
+ expect(hint).toContain('im-hub config telegram');
95
+ });
96
+ it('returns original message for other errors', () => {
97
+ const error = new Error('Network timeout');
98
+ const hint = formatMessengerStartError('wechat-ilink', error);
99
+ expect(hint).toBe('Network timeout');
100
+ });
101
+ it('handles non-Error objects', () => {
102
+ const hint = formatMessengerStartError('feishu', 'string error');
103
+ expect(hint).toBe('string error');
104
+ });
105
+ it('removes -ilink suffix for config hint', () => {
106
+ const error = new Error('No credentials');
107
+ const hint = formatMessengerStartError('wechat-ilink', error);
108
+ expect(hint).toContain('im-hub config wechat');
109
+ expect(hint).not.toContain('wechat-ilink');
110
+ });
111
+ });
112
+ //# sourceMappingURL=onboarding.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onboarding.test.js","sourceRoot":"","sources":["../../src/core/onboarding.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ export declare class RateLimiter {
2
+ private buckets;
3
+ private rate;
4
+ private intervalMs;
5
+ private burst;
6
+ private lastSweepAt;
7
+ constructor(rate?: number, intervalMs?: number, burst?: number);
8
+ /** Check if a request is allowed. Returns true if within limit. */
9
+ allow(key: string): boolean;
10
+ /** Get remaining tokens for a key. */
11
+ remaining(key: string): number;
12
+ /** Get status for display. */
13
+ status(key: string): {
14
+ remaining: number;
15
+ rate: number;
16
+ intervalSec: number;
17
+ };
18
+ /** Read the bucket's static configuration (no key required). */
19
+ config(): {
20
+ rate: number;
21
+ intervalSec: number;
22
+ burst: number;
23
+ };
24
+ /**
25
+ * Best-effort estimate (epoch ms) of when the next token will be available
26
+ * for `key`. If the bucket already has tokens, returns now.
27
+ */
28
+ nextAllowAt(key: string): number;
29
+ /**
30
+ * Drop buckets that have been idle for at least `idleMs` milliseconds.
31
+ * Run periodically to bound memory under bursty workloads.
32
+ *
33
+ * Called automatically by {@link allow} every {@link AUTO_CLEANUP_EVERY_MS},
34
+ * but exposed publicly so ops / tests can force a sweep.
35
+ */
36
+ cleanup(idleMs?: number): number;
37
+ /** Test/diagnostic accessor: how many distinct keys are tracked. */
38
+ size(): number;
39
+ private maybeSweep;
40
+ private getBucket;
41
+ }
42
+ export declare const userLimiter: RateLimiter;
43
+ export declare const agentLimiter: RateLimiter;
44
+ //# sourceMappingURL=rate-limiter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limiter.d.ts","sourceRoot":"","sources":["../../src/core/rate-limiter.ts"],"names":[],"mappings":"AAoBA,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,IAAI,CAAQ;IACpB,OAAO,CAAC,UAAU,CAAQ;IAC1B,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,WAAW,CAAqB;gBAE5B,IAAI,SAAe,EAAE,UAAU,SAAsB,EAAE,KAAK,SAAgB;IAMxF,mEAAmE;IACnE,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAU3B,sCAAsC;IACtC,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAI9B,8BAA8B;IAC9B,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE;IAQ7E,gEAAgE;IAChE,MAAM,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE;IAQ9D;;;OAGG;IACH,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAQhC;;;;;;OAMG;IACH,OAAO,CAAC,MAAM,SAAkB,GAAG,MAAM;IAYzC,oEAAoE;IACpE,IAAI,IAAI,MAAM;IAEd,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,SAAS;CAiBlB;AAGD,eAAO,MAAM,WAAW,aAAiC,CAAA;AACzD,eAAO,MAAM,YAAY,aAAiC,CAAA"}