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,95 @@
1
+ import type { MessengerAdapter } from './types.js';
2
+ import { type ApprovalNotification, type Decision } from './approval-bus.js';
3
+ /**
4
+ * Classify an inbound IM reply as an approval decision. Returns null when the
5
+ * reply doesn't match any known pattern — the caller should treat that as
6
+ * "user changed topic" and route normally.
7
+ */
8
+ export declare function parseApprovalReply(text: string): Decision | null;
9
+ /**
10
+ * Render an approval request as a plain text message. We keep this format
11
+ * stable across IM platforms; richer flows (Feishu cards with buttons) can
12
+ * layer on later by checking platform/sendCard.
13
+ *
14
+ * Two flavors:
15
+ * - Normal: "y 批准 / n 拒绝 / all 同意并对该工具同类调用 5s 自动放行"
16
+ * - Auto-allow grace mode (n.autoAllow set): "⏱ 自动放行中… 5s 内回 n 可拒绝"
17
+ */
18
+ export declare function formatApprovalPrompt(n: ApprovalNotification): string;
19
+ /**
20
+ * Map an IM platform name to its messenger registration. WeChat is special-
21
+ * cased because the messenger is registered as "wechat-ilink" but messages
22
+ * carry platform="wechat".
23
+ */
24
+ export declare function platformToMessengerName(platform: string): string;
25
+ export interface InstallOptions {
26
+ resolveMessenger: (platform: string) => MessengerAdapter | undefined;
27
+ /** Optional. Platform names whose messengers should have button-callback
28
+ * support bound at install time. Adapters that don't implement
29
+ * onButtonCallback are silently skipped. Defaults to all known IM
30
+ * platforms; existing tests / callers don't need to pass this. */
31
+ buttonCallbackPlatforms?: string[];
32
+ }
33
+ /**
34
+ * Wire approval-bus.notifier to the messenger layer. Idempotent: calling
35
+ * install() twice replaces the previous wiring.
36
+ *
37
+ * Notifier prefers the rich-card path (sendApprovalCard) when the resolved
38
+ * adapter implements it; otherwise it falls back to the plain-text path
39
+ * (sendMessage with formatApprovalPrompt). The text path is the canonical
40
+ * approval channel for adapters without native interactive buttons (Feishu
41
+ * cards aren't wired for buttons yet, WeChat iLink can't render them).
42
+ *
43
+ * Button callbacks: for each platform listed in buttonCallbackPlatforms
44
+ * whose adapter implements onButtonCallback, we subscribe a handler that
45
+ * parses callback_data of the form `apv:<reqId>:<y|n|a>` and resolves the
46
+ * matching pending. Subscribing happens once at install — adapters started
47
+ * later won't receive button wiring until install() is called again.
48
+ */
49
+ export declare function install(opts: InstallOptions): void;
50
+ export declare function uninstall(): void;
51
+ /**
52
+ * Bind the inline-button handler for a single platform's messenger. The
53
+ * install() loop calls this for every default platform at boot; callers
54
+ * (e.g. web/server.ts) that register their messenger AFTER install have
55
+ * to call this themselves to get button-click → resolvePending wiring.
56
+ *
57
+ * Idempotent at the messenger level — onButtonCallback's contract is
58
+ * "replace previous handler", so re-calling this on the same platform
59
+ * just rewires.
60
+ *
61
+ * Silent no-op when the messenger isn't registered yet, has no
62
+ * onButtonCallback, or the router hasn't been install()'d.
63
+ */
64
+ export declare function bindButtonHandlerForPlatform(platform: string): void;
65
+ /**
66
+ * Called by cli's onMessage handler before it routes to the agent.
67
+ * Returns true when this message was an approval reply (so the caller should
68
+ * stop and not invoke the normal router).
69
+ *
70
+ * Behavior:
71
+ * - If thread has no pending approval → return false, do nothing
72
+ * - If thread has pending AND text parses as decision → resolve, return true
73
+ * - If thread has pending AND text does NOT parse → auto-deny pending
74
+ * (user is moving on), return false so the message routes normally
75
+ *
76
+ * Receipt: when the resolution adds or revokes an auto-allow rule, also
77
+ * sends a one-line confirmation back to the IM thread so the user knows
78
+ * the rule landed (or got cleared). Best-effort: a missing messenger or
79
+ * sendMessage failure is logged and ignored — the approval itself already
80
+ * resolved successfully.
81
+ */
82
+ export declare function tryHandleApprovalReply(threadId: string, text: string): boolean;
83
+ /**
84
+ * Parse callback_data of the form `apv:<reqId>:<y|n|a>`. reqId may itself
85
+ * contain characters but never `:` in practice (UUID / opaque sidecar id);
86
+ * we still split on the LAST colon to be safe, leaving the choice as the
87
+ * single trailing letter.
88
+ */
89
+ export declare function parseCallbackData(data: string): {
90
+ reqId: string;
91
+ choice: 'y' | 'n' | 'a';
92
+ } | null;
93
+ /** Test helper — not exported from index. */
94
+ export declare function _isInstalled(): boolean;
95
+ //# sourceMappingURL=approval-router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approval-router.d.ts","sourceRoot":"","sources":["../../src/core/approval-router.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACV,gBAAgB,EAIjB,MAAM,YAAY,CAAA;AACnB,OAAO,EAEL,KAAK,oBAAoB,EACzB,KAAK,QAAQ,EAGd,MAAM,mBAAmB,CAAA;AA6B1B;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAehE;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,oBAAoB,GAAG,MAAM,CAmBpE;AASD;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED,MAAM,WAAW,cAAc;IAC7B,gBAAgB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,gBAAgB,GAAG,SAAS,CAAA;IACpE;;;uEAGmE;IACnE,uBAAuB,CAAC,EAAE,MAAM,EAAE,CAAA;CACnC;AAeD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI,CA+DlD;AAED,wBAAgB,SAAS,IAAI,IAAI,CAQhC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAMnE;AAqCD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAuB9E;AA6GD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,CAAA;CAAE,GAAG,IAAI,CAUjG;AAoCD,6CAA6C;AAC7C,wBAAgB,YAAY,IAAI,OAAO,CAA8B"}
@@ -0,0 +1,450 @@
1
+ // approval-router — 把 approval-bus 的两个端口接到 IM messenger 上:
2
+ // 1. notifier:bus 收到 sidecar 的审批请求 → 这里翻译成文本/卡片 → 推到对应 IM thread
3
+ // 2. 拦截层:用户在该 thread 回复 y/n/批准/拒绝时,cli 主 handler 把消息先交给我们;
4
+ // 命中就 resolvePending,吃掉这条消息不进 router;不命中放行,并把已挂起的
5
+ // pending 当作"用户改主意"自动 deny。
6
+ //
7
+ // 不知道 messenger 实现细节,只通过注入的 resolveMessenger 拿到 sendMessage/sendCard。
8
+ import { approvalBus, } from './approval-bus.js';
9
+ import { logger as rootLogger } from './logger.js';
10
+ const log = rootLogger.child({ component: 'approval-router' });
11
+ /** Truncation limit for the plain-text approval prompt. Conservative because
12
+ * some IMs (older WeChat clients) start chunking aggressively past ~500
13
+ * chars and the y/n line at the bottom must stay visible. */
14
+ const MAX_INPUT_PREVIEW = 400;
15
+ /** Truncation limit for the rich-card approval prompt. Telegram allows ~4 KB
16
+ * per message; with the surrounding template (~150 chars) and a <pre>
17
+ * block, 1500 fits in one bubble and covers the long tail of Bash / Edit
18
+ * payloads without losing context. */
19
+ const MAX_INPUT_PREVIEW_CARD = 1500;
20
+ const ALLOW_TOKENS = new Set([
21
+ 'y', 'yes', 'ok', '1', '批准', '同意', '通过', '可以', '✅',
22
+ ]);
23
+ const DENY_TOKENS = new Set([
24
+ 'n', 'no', '0', '拒绝', '不同意', '不行', '不可以', '不', '❌',
25
+ ]);
26
+ /** "Approve this and auto-approve future calls of the same tool with the
27
+ * same input prefix in this session." Bus consumes `autoAllowFurther` and
28
+ * registers the rule. */
29
+ const ALLOW_ALL_TOKENS = new Set([
30
+ 'all', 'a', '全部', '总是', '都同意', '都批准',
31
+ ]);
32
+ /**
33
+ * Classify an inbound IM reply as an approval decision. Returns null when the
34
+ * reply doesn't match any known pattern — the caller should treat that as
35
+ * "user changed topic" and route normally.
36
+ */
37
+ export function parseApprovalReply(text) {
38
+ const trimmed = text.trim().toLowerCase();
39
+ if (!trimmed)
40
+ return null;
41
+ // Strip leading slashes so "/y" works too — some users do that on Telegram.
42
+ const stripped = trimmed.startsWith('/') ? trimmed.slice(1) : trimmed;
43
+ if (ALLOW_ALL_TOKENS.has(stripped)) {
44
+ return { behavior: 'allow', autoAllowFurther: true };
45
+ }
46
+ if (ALLOW_TOKENS.has(stripped)) {
47
+ return { behavior: 'allow' };
48
+ }
49
+ if (DENY_TOKENS.has(stripped)) {
50
+ return { behavior: 'deny', message: '用户在 IM 中拒绝了这次工具调用' };
51
+ }
52
+ return null;
53
+ }
54
+ /**
55
+ * Render an approval request as a plain text message. We keep this format
56
+ * stable across IM platforms; richer flows (Feishu cards with buttons) can
57
+ * layer on later by checking platform/sendCard.
58
+ *
59
+ * Two flavors:
60
+ * - Normal: "y 批准 / n 拒绝 / all 同意并对该工具同类调用 5s 自动放行"
61
+ * - Auto-allow grace mode (n.autoAllow set): "⏱ 自动放行中… 5s 内回 n 可拒绝"
62
+ */
63
+ export function formatApprovalPrompt(n) {
64
+ const inputJson = safeStringify(n.input, MAX_INPUT_PREVIEW);
65
+ if (n.autoAllow) {
66
+ const sec = Math.round(n.autoAllow.graceMs / 1000);
67
+ return [
68
+ `⏱ 自动放行中(${sec}s 后执行)`,
69
+ `工具:${n.toolName}`,
70
+ `入参:${inputJson}`,
71
+ `回复 n 可拒绝(同时撤销该工具的自动放行规则)`,
72
+ `req: ${n.reqId.slice(0, 8)}`,
73
+ ].join('\n');
74
+ }
75
+ return [
76
+ '🔐 工具调用审批请求',
77
+ `工具:${n.toolName}`,
78
+ `入参:${inputJson}`,
79
+ `回复 y 批准 / n 拒绝 / all 本会话内同工具同前缀自动放行(5 分钟内未操作将自动拒绝)`,
80
+ `req: ${n.reqId.slice(0, 8)}`,
81
+ ].join('\n');
82
+ }
83
+ function safeStringify(v, maxLen) {
84
+ let s;
85
+ try {
86
+ s = JSON.stringify(v);
87
+ }
88
+ catch {
89
+ s = String(v);
90
+ }
91
+ if (s.length > maxLen)
92
+ s = s.slice(0, maxLen - 1) + '…';
93
+ return s;
94
+ }
95
+ /**
96
+ * Map an IM platform name to its messenger registration. WeChat is special-
97
+ * cased because the messenger is registered as "wechat-ilink" but messages
98
+ * carry platform="wechat".
99
+ */
100
+ export function platformToMessengerName(platform) {
101
+ return platform === 'wechat' ? 'wechat-ilink' : platform;
102
+ }
103
+ let installed = null;
104
+ const activeCards = new Map();
105
+ /**
106
+ * Wire approval-bus.notifier to the messenger layer. Idempotent: calling
107
+ * install() twice replaces the previous wiring.
108
+ *
109
+ * Notifier prefers the rich-card path (sendApprovalCard) when the resolved
110
+ * adapter implements it; otherwise it falls back to the plain-text path
111
+ * (sendMessage with formatApprovalPrompt). The text path is the canonical
112
+ * approval channel for adapters without native interactive buttons (Feishu
113
+ * cards aren't wired for buttons yet, WeChat iLink can't render them).
114
+ *
115
+ * Button callbacks: for each platform listed in buttonCallbackPlatforms
116
+ * whose adapter implements onButtonCallback, we subscribe a handler that
117
+ * parses callback_data of the form `apv:<reqId>:<y|n|a>` and resolves the
118
+ * matching pending. Subscribing happens once at install — adapters started
119
+ * later won't receive button wiring until install() is called again.
120
+ */
121
+ export function install(opts) {
122
+ installed = opts;
123
+ approvalBus.setNotifier(async (n) => {
124
+ const m = opts.resolveMessenger(n.ctx.platform);
125
+ if (!m) {
126
+ log.warn({ event: 'approval.router.no_messenger', platform: n.ctx.platform, reqId: n.reqId }, 'No messenger registered for platform; approval cannot be surfaced');
127
+ // Throwing tells the bus to auto-deny this request.
128
+ throw new Error(`no messenger for platform ${n.ctx.platform}`);
129
+ }
130
+ // Rich-card path (Telegram inline keyboard).
131
+ if (m.sendApprovalCard) {
132
+ const prompt = {
133
+ reqId: n.reqId,
134
+ toolName: n.toolName,
135
+ inputJson: safeStringify(n.input, MAX_INPUT_PREVIEW_CARD),
136
+ mode: n.autoAllow ? 'auto-allow' : 'normal',
137
+ graceSeconds: n.autoAllow ? Math.round(n.autoAllow.graceMs / 1000) : undefined,
138
+ };
139
+ try {
140
+ const { messageId } = await m.sendApprovalCard(n.ctx.threadId, prompt);
141
+ activeCards.set(n.reqId, {
142
+ platform: n.ctx.platform,
143
+ threadId: n.ctx.threadId,
144
+ messageId,
145
+ });
146
+ log.info({
147
+ event: 'approval.router.card_sent',
148
+ platform: n.ctx.platform,
149
+ threadId: n.ctx.threadId,
150
+ reqId: n.reqId,
151
+ messageId,
152
+ });
153
+ return;
154
+ }
155
+ catch (err) {
156
+ log.warn({
157
+ event: 'approval.router.card_failed_fallback',
158
+ err: String(err),
159
+ reqId: n.reqId,
160
+ }, 'sendApprovalCard threw; falling back to text path');
161
+ // Fall through to text path
162
+ }
163
+ }
164
+ // Text path (Feishu / WeChat / any adapter without sendApprovalCard).
165
+ const text = formatApprovalPrompt(n);
166
+ await m.sendMessage(n.ctx.threadId, text);
167
+ log.info({ event: 'approval.router.prompt_sent', platform: n.ctx.platform, threadId: n.ctx.threadId, reqId: n.reqId });
168
+ });
169
+ const platforms = opts.buttonCallbackPlatforms ?? ['telegram', 'feishu', 'wechat', 'discord', 'web'];
170
+ for (const platform of platforms) {
171
+ bindButtonHandlerForPlatform(platform);
172
+ }
173
+ // Listen for non-user resolutions (timeout, sidecar disconnect, run
174
+ // terminated, shutdown, notifier error) so we can collapse the card to
175
+ // a terminal "已过期" state. The user-driven path (button click / y-n
176
+ // text reply) edits the card itself BEFORE the listener fires — by that
177
+ // time activeCards has already been pruned, so this listener no-ops on
178
+ // cause='user'. Defensive double-check via cause makes intent explicit.
179
+ approvalBus.setResolutionListener((e) => onBusResolution(e));
180
+ }
181
+ export function uninstall() {
182
+ installed = null;
183
+ approvalBus.setNotifier(null);
184
+ approvalBus.setResolutionListener(null);
185
+ activeCards.clear();
186
+ // Note: we don't unsubscribe button handlers from messengers — tests that
187
+ // re-install will overwrite via onButtonCallback's "replace previous"
188
+ // contract. Production never uninstalls.
189
+ }
190
+ /**
191
+ * Bind the inline-button handler for a single platform's messenger. The
192
+ * install() loop calls this for every default platform at boot; callers
193
+ * (e.g. web/server.ts) that register their messenger AFTER install have
194
+ * to call this themselves to get button-click → resolvePending wiring.
195
+ *
196
+ * Idempotent at the messenger level — onButtonCallback's contract is
197
+ * "replace previous handler", so re-calling this on the same platform
198
+ * just rewires.
199
+ *
200
+ * Silent no-op when the messenger isn't registered yet, has no
201
+ * onButtonCallback, or the router hasn't been install()'d.
202
+ */
203
+ export function bindButtonHandlerForPlatform(platform) {
204
+ if (!installed)
205
+ return;
206
+ const m = installed.resolveMessenger(platform);
207
+ if (!m?.onButtonCallback)
208
+ return;
209
+ m.onButtonCallback(async (cb) => handleButtonCallback(platform, cb));
210
+ log.info({ event: 'approval.router.button_handler_bound', platform });
211
+ }
212
+ /**
213
+ * Bus-side resolution listener. Fires for every transition pending → resolved
214
+ * regardless of cause. We only act on non-user causes here: those are the
215
+ * cases where no IM-side handler updated the card, so without us the user
216
+ * sees a card with stale buttons.
217
+ *
218
+ * For auto-allow grace expiry that resolves to allow, we still mark the card
219
+ * as 'allowed' (without byUserDisplay) — the call did go through, just
220
+ * silently. For all other non-user causes (timeout deny, disconnect, run
221
+ * terminated, shutdown, notifier error), the card collapses to 'expired'.
222
+ */
223
+ function onBusResolution(e) {
224
+ if (e.cause === 'user')
225
+ return; // button/text path already edited
226
+ const card = activeCards.get(e.reqId);
227
+ if (!card)
228
+ return; // text-fallback path doesn't track cards
229
+ activeCards.delete(e.reqId);
230
+ if (!installed)
231
+ return;
232
+ const m = installed.resolveMessenger(card.platform);
233
+ if (!m?.editApprovalCard)
234
+ return;
235
+ let decision;
236
+ if (e.cause === 'timeout' && e.decision.behavior === 'allow') {
237
+ // auto-allow grace fired silently
238
+ decision = 'allowed';
239
+ }
240
+ else {
241
+ decision = 'expired';
242
+ }
243
+ m.editApprovalCard(card.threadId, card.messageId, {
244
+ decision,
245
+ atDate: new Date(),
246
+ }).catch((err) => {
247
+ log.warn({ event: 'approval.router.bus_edit_failed', reqId: e.reqId, err: String(err) });
248
+ });
249
+ }
250
+ /**
251
+ * Called by cli's onMessage handler before it routes to the agent.
252
+ * Returns true when this message was an approval reply (so the caller should
253
+ * stop and not invoke the normal router).
254
+ *
255
+ * Behavior:
256
+ * - If thread has no pending approval → return false, do nothing
257
+ * - If thread has pending AND text parses as decision → resolve, return true
258
+ * - If thread has pending AND text does NOT parse → auto-deny pending
259
+ * (user is moving on), return false so the message routes normally
260
+ *
261
+ * Receipt: when the resolution adds or revokes an auto-allow rule, also
262
+ * sends a one-line confirmation back to the IM thread so the user knows
263
+ * the rule landed (or got cleared). Best-effort: a missing messenger or
264
+ * sendMessage failure is logged and ignored — the approval itself already
265
+ * resolved successfully.
266
+ */
267
+ export function tryHandleApprovalReply(threadId, text) {
268
+ if (!approvalBus.hasPendingFor(threadId))
269
+ return false;
270
+ const decision = parseApprovalReply(text);
271
+ if (decision) {
272
+ const info = approvalBus.resolvePending(threadId, decision);
273
+ log.info({ event: 'approval.router.resolved', threadId, behavior: decision.behavior });
274
+ if (info) {
275
+ editCardOnThreadResolution(threadId, info, decision, undefined);
276
+ sendReceiptIfAny(info, decision);
277
+ }
278
+ return true;
279
+ }
280
+ // Unrecognized reply while a pending exists → treat as redirect: deny so
281
+ // the sidecar (and ultimately Claude) doesn't keep waiting, but let the
282
+ // user's actual message route normally.
283
+ const redirectDecision = {
284
+ behavior: 'deny',
285
+ message: '用户在 IM 中改换话题,未给出审批回复',
286
+ };
287
+ const info = approvalBus.resolvePending(threadId, redirectDecision);
288
+ if (info)
289
+ editCardOnThreadResolution(threadId, info, redirectDecision, undefined);
290
+ log.info({ event: 'approval.router.redirected', threadId });
291
+ return false;
292
+ }
293
+ /**
294
+ * Inline-button handler. callback_data format: `apv:<reqId>:<y|n|a>`.
295
+ * Resolves the matching pending via approvalBus.resolvePending, acks the
296
+ * button (must happen within ~1s on Telegram), edits the card to its
297
+ * terminal state, and sends the same auto-allow receipt the text path
298
+ * would send.
299
+ *
300
+ * Late clicks (already resolved or expired): we ack with a soft hint and
301
+ * try to edit the card to the "expired" state so subsequent users see a
302
+ * clean terminal view.
303
+ */
304
+ async function handleButtonCallback(platform, cb) {
305
+ const parsed = parseCallbackData(cb.data);
306
+ if (!parsed) {
307
+ await cb.ack('未识别的按钮');
308
+ return;
309
+ }
310
+ const decision = decisionFromButton(parsed.choice);
311
+ const info = approvalBus.resolvePending(cb.threadId, decision);
312
+ if (!info) {
313
+ await cb.ack('请求已过期或已被处理');
314
+ if (installed) {
315
+ const m = installed.resolveMessenger(platform);
316
+ if (m?.editApprovalCard) {
317
+ await m.editApprovalCard(cb.threadId, cb.messageId, {
318
+ decision: 'expired',
319
+ atDate: new Date(),
320
+ }).catch((err) => {
321
+ log.warn({ event: 'approval.router.expire_edit_failed', err: String(err) });
322
+ });
323
+ }
324
+ }
325
+ activeCards.delete(parsed.reqId);
326
+ return;
327
+ }
328
+ const ackText = decision.behavior === 'allow'
329
+ ? (decision.autoAllowFurther ? '🛡 已批准并自动放行' : '✅ 已批准')
330
+ : (info.wasAutoAllow ? '❌ 已拒绝并撤销规则' : '❌ 已拒绝');
331
+ await cb.ack(ackText);
332
+ if (installed) {
333
+ const m = installed.resolveMessenger(info.platform);
334
+ if (m?.editApprovalCard) {
335
+ const outcome = {
336
+ decision: outcomeFromDecision(decision, info.wasAutoAllow),
337
+ byUserDisplay: cb.userDisplay,
338
+ atDate: new Date(),
339
+ };
340
+ await m.editApprovalCard(cb.threadId, cb.messageId, outcome).catch((err) => {
341
+ log.warn({ event: 'approval.router.edit_failed', err: String(err) });
342
+ });
343
+ }
344
+ }
345
+ activeCards.delete(parsed.reqId);
346
+ log.info({
347
+ event: 'approval.router.button_resolved',
348
+ platform,
349
+ threadId: cb.threadId,
350
+ behavior: decision.behavior,
351
+ autoAllowFurther: decision.behavior === 'allow' && decision.autoAllowFurther === true,
352
+ });
353
+ sendReceiptIfAny(info, decision);
354
+ }
355
+ /** Find the active card belonging to this thread (the one matching the head
356
+ * of the pending queue we just resolved) and edit it to its terminal state.
357
+ * Used by the text-reply path so y/n typed messages also collapse the card
358
+ * on Telegram. No-op when no card was registered (other IMs / fallback). */
359
+ function editCardOnThreadResolution(threadId, info, decision, byUserDisplay) {
360
+ if (!installed)
361
+ return;
362
+ let target = null;
363
+ for (const [reqId, card] of activeCards) {
364
+ if (card.threadId === threadId) {
365
+ target = { reqId, card };
366
+ break;
367
+ }
368
+ }
369
+ if (!target)
370
+ return;
371
+ activeCards.delete(target.reqId);
372
+ const m = installed.resolveMessenger(info.platform);
373
+ if (!m?.editApprovalCard)
374
+ return;
375
+ const outcome = {
376
+ decision: outcomeFromDecision(decision, info.wasAutoAllow),
377
+ byUserDisplay,
378
+ atDate: new Date(),
379
+ };
380
+ m.editApprovalCard(target.card.threadId, target.card.messageId, outcome).catch((err) => {
381
+ log.warn({ event: 'approval.router.edit_failed', err: String(err) });
382
+ });
383
+ }
384
+ function outcomeFromDecision(d, wasAutoAllow) {
385
+ if (d.behavior === 'allow') {
386
+ return d.autoAllowFurther ? 'allowed-pinned' : 'allowed';
387
+ }
388
+ return wasAutoAllow ? 'denied-revoked' : 'denied';
389
+ }
390
+ /**
391
+ * Parse callback_data of the form `apv:<reqId>:<y|n|a>`. reqId may itself
392
+ * contain characters but never `:` in practice (UUID / opaque sidecar id);
393
+ * we still split on the LAST colon to be safe, leaving the choice as the
394
+ * single trailing letter.
395
+ */
396
+ export function parseCallbackData(data) {
397
+ if (!data.startsWith('apv:'))
398
+ return null;
399
+ const rest = data.slice(4);
400
+ const lastColon = rest.lastIndexOf(':');
401
+ if (lastColon <= 0)
402
+ return null;
403
+ const reqId = rest.slice(0, lastColon);
404
+ const choice = rest.slice(lastColon + 1);
405
+ if (choice !== 'y' && choice !== 'n' && choice !== 'a')
406
+ return null;
407
+ if (!reqId)
408
+ return null;
409
+ return { reqId, choice };
410
+ }
411
+ function decisionFromButton(choice) {
412
+ if (choice === 'y')
413
+ return { behavior: 'allow' };
414
+ if (choice === 'a')
415
+ return { behavior: 'allow', autoAllowFurther: true };
416
+ return { behavior: 'deny', message: '用户在 IM 中拒绝了这次工具调用(按钮)' };
417
+ }
418
+ /**
419
+ * If the user just enabled an auto-allow rule (allow + autoAllowFurther) or
420
+ * just revoked one (deny while in grace mode), push a short confirmation
421
+ * line to the originating thread.
422
+ */
423
+ function sendReceiptIfAny(info, decision) {
424
+ if (!installed)
425
+ return;
426
+ let msg = null;
427
+ if (decision.behavior === 'allow' && decision.autoAllowFurther) {
428
+ msg = [
429
+ '✅ 已批准并启用自动放行',
430
+ `规则:${info.toolName} 前缀 "${info.fingerprint}" 5s 内自动放行`,
431
+ '撤销:本会话回 n 单条 / /approval clear 清空',
432
+ ].join('\n');
433
+ }
434
+ else if (decision.behavior === 'deny' && info.wasAutoAllow) {
435
+ msg = `❌ 已拒绝并撤销自动放行规则:${info.toolName} "${info.fingerprint}"`;
436
+ }
437
+ if (!msg)
438
+ return;
439
+ const m = installed.resolveMessenger(info.platform);
440
+ if (!m) {
441
+ log.warn({ event: 'approval.router.receipt_no_messenger', platform: info.platform });
442
+ return;
443
+ }
444
+ m.sendMessage(info.threadId, msg).catch((err) => {
445
+ log.warn({ event: 'approval.router.receipt_failed', err: String(err) });
446
+ });
447
+ }
448
+ /** Test helper — not exported from index. */
449
+ export function _isInstalled() { return installed !== null; }
450
+ //# sourceMappingURL=approval-router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approval-router.js","sourceRoot":"","sources":["../../src/core/approval-router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=approval-router.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approval-router.test.d.ts","sourceRoot":"","sources":["../../src/core/approval-router.test.ts"],"names":[],"mappings":""}