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,537 @@
1
+ // approval-bus tests — 用真实 unix socket 模拟 sidecar 端,验证协议与 pending 生命周期。
2
+ import { describe, it, expect, beforeEach, afterEach } from 'bun:test';
3
+ import { createConnection } from 'net';
4
+ import { tmpdir } from 'os';
5
+ import { join } from 'path';
6
+ import { randomBytes } from 'crypto';
7
+ import { ApprovalBus, } from './approval-bus.js';
8
+ const RUN_CTX = {
9
+ threadId: 'thread-A',
10
+ platform: 'feishu',
11
+ userId: 'user-1',
12
+ channelId: 'chan-1',
13
+ };
14
+ function uniqueSocketPath() {
15
+ return join(tmpdir(), `imhub-test-${process.pid}-${randomBytes(4).toString('hex')}.sock`);
16
+ }
17
+ /** A minimal NDJSON client over unix socket. Tests get one of these per connection. */
18
+ class TestClient {
19
+ buf = '';
20
+ queue = [];
21
+ waiters = [];
22
+ socket;
23
+ constructor(socket) {
24
+ this.socket = socket;
25
+ socket.setEncoding('utf8');
26
+ socket.on('data', (chunk) => {
27
+ this.buf += chunk;
28
+ let nl;
29
+ while ((nl = this.buf.indexOf('\n')) !== -1) {
30
+ const line = this.buf.slice(0, nl);
31
+ this.buf = this.buf.slice(nl + 1);
32
+ if (!line)
33
+ continue;
34
+ const obj = JSON.parse(line);
35
+ const w = this.waiters.shift();
36
+ if (w)
37
+ w(obj);
38
+ else
39
+ this.queue.push(obj);
40
+ }
41
+ });
42
+ }
43
+ send(obj) {
44
+ this.socket.write(JSON.stringify(obj) + '\n');
45
+ }
46
+ /** Send a raw line (no JSON validation) — used for bad-json tests. */
47
+ sendRaw(line) {
48
+ this.socket.write(line + '\n');
49
+ }
50
+ /** Resolve as soon as next NDJSON message arrives. Throws on timeout. */
51
+ next(timeoutMs = 1000) {
52
+ return new Promise((resolve, reject) => {
53
+ const queued = this.queue.shift();
54
+ if (queued !== undefined) {
55
+ resolve(queued);
56
+ return;
57
+ }
58
+ const timer = setTimeout(() => {
59
+ const idx = this.waiters.indexOf(wrapped);
60
+ if (idx >= 0)
61
+ this.waiters.splice(idx, 1);
62
+ reject(new Error(`TestClient.next() timed out after ${timeoutMs}ms`));
63
+ }, timeoutMs);
64
+ const wrapped = (v) => {
65
+ clearTimeout(timer);
66
+ resolve(v);
67
+ };
68
+ this.waiters.push(wrapped);
69
+ });
70
+ }
71
+ /** Resolve next message OR null if socket closes first within timeout. */
72
+ nextOrClose(timeoutMs = 1000) {
73
+ return Promise.race([
74
+ this.next(timeoutMs).catch(() => null),
75
+ new Promise((resolve) => {
76
+ this.socket.once('close', () => resolve(null));
77
+ }),
78
+ ]);
79
+ }
80
+ close() {
81
+ return new Promise((resolve) => {
82
+ if (this.socket.destroyed) {
83
+ resolve();
84
+ return;
85
+ }
86
+ this.socket.once('close', () => resolve());
87
+ this.socket.end();
88
+ });
89
+ }
90
+ }
91
+ async function connectClient(path) {
92
+ return new Promise((resolve, reject) => {
93
+ const sock = createConnection(path);
94
+ sock.once('error', reject);
95
+ sock.once('connect', () => {
96
+ sock.removeAllListeners('error');
97
+ sock.on('error', () => { });
98
+ resolve(new TestClient(sock));
99
+ });
100
+ });
101
+ }
102
+ const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
103
+ describe('ApprovalBus', () => {
104
+ let bus;
105
+ let path;
106
+ beforeEach(async () => {
107
+ bus = new ApprovalBus({ approvalTimeoutMs: 200 });
108
+ path = uniqueSocketPath();
109
+ await bus.start(path);
110
+ });
111
+ afterEach(async () => {
112
+ await bus.stop();
113
+ });
114
+ it('start() listens on the given socket path', async () => {
115
+ expect(bus.getSocketPath()).toBe(path);
116
+ // Simply being able to connect verifies the listener is up
117
+ const client = await connectClient(path);
118
+ await client.close();
119
+ });
120
+ it('happy path: approval → notifier → resolvePending(allow)', async () => {
121
+ bus.registerRun('run-1', RUN_CTX);
122
+ let notified = null;
123
+ bus.setNotifier(async (n) => { notified = n; });
124
+ const client = await connectClient(path);
125
+ client.send({
126
+ v: 1, type: 'approval',
127
+ runId: 'run-1', reqId: 'req-1',
128
+ toolName: 'Bash', input: { command: 'git push' }, toolUseId: 'tu-1',
129
+ });
130
+ // Wait for notifier to fire (it's async via handleApproval)
131
+ for (let i = 0; i < 50 && !notified; i++)
132
+ await sleep(10);
133
+ expect(notified).not.toBeNull();
134
+ expect(notified.runId).toBe('run-1');
135
+ expect(notified.reqId).toBe('req-1');
136
+ expect(notified.toolName).toBe('Bash');
137
+ expect(notified.input).toEqual({ command: 'git push' });
138
+ expect(notified.ctx.threadId).toBe('thread-A');
139
+ expect(bus.hasPendingFor('thread-A')).toBe(true);
140
+ const resolved = bus.resolvePending('thread-A', { behavior: 'allow' });
141
+ expect(resolved).not.toBeNull();
142
+ expect(resolved?.toolName).toBe('Bash');
143
+ // M13: fingerprint length bumped 5 → 10 to reduce false matches
144
+ // (`git p` would alias to `git push` AND `git pull` AND `git pr…`;
145
+ // at 10 chars `git push` stays distinct from `git pull` family).
146
+ expect(resolved?.fingerprint).toBe('git push');
147
+ expect(resolved?.platform).toBe('feishu');
148
+ expect(resolved?.wasAutoAllow).toBe(false);
149
+ expect(bus.hasPendingFor('thread-A')).toBe(false);
150
+ const decision = await client.next();
151
+ expect(decision).toEqual({ v: 1, type: 'decision', reqId: 'req-1', behavior: 'allow' });
152
+ await client.close();
153
+ });
154
+ it('resolvePending forwards updatedInput', async () => {
155
+ bus.registerRun('run-1', RUN_CTX);
156
+ bus.setNotifier(async () => { });
157
+ const client = await connectClient(path);
158
+ client.send({
159
+ v: 1, type: 'approval', runId: 'run-1', reqId: 'req-1',
160
+ toolName: 'Bash', input: { command: 'rm -rf /tmp/x' }, toolUseId: 'tu-1',
161
+ });
162
+ await sleep(20);
163
+ bus.resolvePending('thread-A', { behavior: 'allow', updatedInput: { command: 'rm -rf /tmp/safe' } });
164
+ const decision = await client.next();
165
+ expect(decision.behavior).toBe('allow');
166
+ expect(decision.updatedInput).toEqual({ command: 'rm -rf /tmp/safe' });
167
+ await client.close();
168
+ });
169
+ it('resolvePending(deny) carries the message', async () => {
170
+ bus.registerRun('run-1', RUN_CTX);
171
+ bus.setNotifier(async () => { });
172
+ const client = await connectClient(path);
173
+ client.send({
174
+ v: 1, type: 'approval', runId: 'run-1', reqId: 'req-1',
175
+ toolName: 'Bash', input: {}, toolUseId: 'tu-1',
176
+ });
177
+ await sleep(20);
178
+ bus.resolvePending('thread-A', { behavior: 'deny', message: '用户拒绝' });
179
+ const decision = await client.next();
180
+ expect(decision).toEqual({ v: 1, type: 'decision', reqId: 'req-1', behavior: 'deny', message: '用户拒绝' });
181
+ await client.close();
182
+ });
183
+ it('approval timeout → auto deny', async () => {
184
+ bus.registerRun('run-1', RUN_CTX);
185
+ bus.setNotifier(async () => { });
186
+ const client = await connectClient(path);
187
+ client.send({
188
+ v: 1, type: 'approval', runId: 'run-1', reqId: 'req-1',
189
+ toolName: 'Bash', input: {}, toolUseId: 'tu-1',
190
+ });
191
+ const decision = await client.next(2000);
192
+ expect(decision.behavior).toBe('deny');
193
+ expect(decision.message).toBe('approval timeout');
194
+ expect(bus.hasPendingFor('thread-A')).toBe(false);
195
+ await client.close();
196
+ });
197
+ it('unknown runId → instant deny without notifier', async () => {
198
+ let notifierCalls = 0;
199
+ bus.setNotifier(async () => { notifierCalls++; });
200
+ const client = await connectClient(path);
201
+ client.send({
202
+ v: 1, type: 'approval', runId: 'unknown', reqId: 'req-1',
203
+ toolName: 'Bash', input: {}, toolUseId: 'tu-1',
204
+ });
205
+ const decision = await client.next();
206
+ expect(decision.behavior).toBe('deny');
207
+ expect(decision.message).toContain('unknown runId');
208
+ expect(notifierCalls).toBe(0);
209
+ await client.close();
210
+ });
211
+ it('no notifier installed → instant deny', async () => {
212
+ bus.registerRun('run-1', RUN_CTX);
213
+ // Intentionally no setNotifier
214
+ const client = await connectClient(path);
215
+ client.send({
216
+ v: 1, type: 'approval', runId: 'run-1', reqId: 'req-1',
217
+ toolName: 'Bash', input: {}, toolUseId: 'tu-1',
218
+ });
219
+ const decision = await client.next();
220
+ expect(decision.behavior).toBe('deny');
221
+ expect(decision.message).toContain('no notifier installed');
222
+ await client.close();
223
+ });
224
+ it('unregisterRun denies pending for that run', async () => {
225
+ bus.registerRun('run-1', RUN_CTX);
226
+ bus.setNotifier(async () => { });
227
+ const client = await connectClient(path);
228
+ client.send({
229
+ v: 1, type: 'approval', runId: 'run-1', reqId: 'req-1',
230
+ toolName: 'Bash', input: {}, toolUseId: 'tu-1',
231
+ });
232
+ await sleep(20);
233
+ expect(bus.hasPendingFor('thread-A')).toBe(true);
234
+ bus.unregisterRun('run-1');
235
+ const decision = await client.next();
236
+ expect(decision.behavior).toBe('deny');
237
+ expect(decision.message).toContain('run terminated');
238
+ expect(bus.hasPendingFor('thread-A')).toBe(false);
239
+ await client.close();
240
+ });
241
+ it('socket close denies pending for that connection', async () => {
242
+ bus.registerRun('run-1', RUN_CTX);
243
+ bus.setNotifier(async () => { });
244
+ const client = await connectClient(path);
245
+ client.send({
246
+ v: 1, type: 'approval', runId: 'run-1', reqId: 'req-1',
247
+ toolName: 'Bash', input: {}, toolUseId: 'tu-1',
248
+ });
249
+ await sleep(20);
250
+ expect(bus.hasPendingFor('thread-A')).toBe(true);
251
+ await client.close();
252
+ // Give bus a moment to handle 'close'
253
+ for (let i = 0; i < 20 && bus.hasPendingFor('thread-A'); i++)
254
+ await sleep(10);
255
+ expect(bus.hasPendingFor('thread-A')).toBe(false);
256
+ });
257
+ it('bad JSON does not crash; subsequent valid lines still work', async () => {
258
+ bus.registerRun('run-1', RUN_CTX);
259
+ bus.setNotifier(async () => { });
260
+ const client = await connectClient(path);
261
+ client.sendRaw('not json at all {{{');
262
+ client.send({
263
+ v: 1, type: 'approval', runId: 'run-1', reqId: 'req-1',
264
+ toolName: 'Bash', input: {}, toolUseId: 'tu-1',
265
+ });
266
+ await sleep(20);
267
+ expect(bus.hasPendingFor('thread-A')).toBe(true);
268
+ bus.resolvePending('thread-A', { behavior: 'allow' });
269
+ const decision = await client.next();
270
+ expect(decision.reqId).toBe('req-1');
271
+ await client.close();
272
+ });
273
+ it('unsupported version is ignored, no decision sent', async () => {
274
+ bus.registerRun('run-1', RUN_CTX);
275
+ bus.setNotifier(async () => { });
276
+ const client = await connectClient(path);
277
+ client.send({
278
+ v: 999, type: 'approval', runId: 'run-1', reqId: 'req-1',
279
+ toolName: 'Bash', input: {}, toolUseId: 'tu-1',
280
+ });
281
+ // Should NOT receive a decision for v:999
282
+ let received = null;
283
+ try {
284
+ received = await client.next(150);
285
+ }
286
+ catch { /* expected timeout */ }
287
+ expect(received).toBeNull();
288
+ expect(bus.hasPendingFor('thread-A')).toBe(false);
289
+ await client.close();
290
+ });
291
+ it('duplicate reqId → second one denied, first stays pending', async () => {
292
+ bus.registerRun('run-1', RUN_CTX);
293
+ bus.setNotifier(async () => { });
294
+ const client = await connectClient(path);
295
+ client.send({
296
+ v: 1, type: 'approval', runId: 'run-1', reqId: 'dup',
297
+ toolName: 'Bash', input: {}, toolUseId: 'tu-1',
298
+ });
299
+ await sleep(20);
300
+ client.send({
301
+ v: 1, type: 'approval', runId: 'run-1', reqId: 'dup',
302
+ toolName: 'Read', input: {}, toolUseId: 'tu-2',
303
+ });
304
+ const first = await client.next();
305
+ // Second send hits "duplicate reqId" branch — that's the first decision we see
306
+ expect(first.behavior).toBe('deny');
307
+ expect(first.message).toBe('duplicate reqId');
308
+ // Original is still pending
309
+ expect(bus.hasPendingFor('thread-A')).toBe(true);
310
+ bus.resolvePending('thread-A', { behavior: 'allow' });
311
+ const second = await client.next();
312
+ expect(second.behavior).toBe('allow');
313
+ await client.close();
314
+ });
315
+ it('resolvePending returns null when no pending exists', () => {
316
+ expect(bus.resolvePending('nope', { behavior: 'allow' })).toBeNull();
317
+ });
318
+ it('stop() denies all pending and closes socket', async () => {
319
+ bus.registerRun('run-1', RUN_CTX);
320
+ bus.setNotifier(async () => { });
321
+ const client = await connectClient(path);
322
+ client.send({
323
+ v: 1, type: 'approval', runId: 'run-1', reqId: 'req-1',
324
+ toolName: 'Bash', input: {}, toolUseId: 'tu-1',
325
+ });
326
+ await sleep(20);
327
+ await bus.stop();
328
+ const decision = await client.next(500);
329
+ expect(decision.behavior).toBe('deny');
330
+ expect(decision.message).toContain('shutting down');
331
+ // After stop(), new connections should fail
332
+ let connectErr = null;
333
+ try {
334
+ await connectClient(path);
335
+ }
336
+ catch (e) {
337
+ connectErr = e;
338
+ }
339
+ expect(connectErr).not.toBeNull();
340
+ });
341
+ it('notifier rejection → auto deny', async () => {
342
+ bus.registerRun('run-1', RUN_CTX);
343
+ bus.setNotifier(async () => { throw new Error('messenger down'); });
344
+ const client = await connectClient(path);
345
+ client.send({
346
+ v: 1, type: 'approval', runId: 'run-1', reqId: 'req-1',
347
+ toolName: 'Bash', input: {}, toolUseId: 'tu-1',
348
+ });
349
+ const decision = await client.next();
350
+ expect(decision.behavior).toBe('deny');
351
+ expect(decision.message).toBe('notifier error');
352
+ expect(bus.hasPendingFor('thread-A')).toBe(false);
353
+ await client.close();
354
+ });
355
+ it('auto-allow: rule registered on allow+autoAllowFurther, second request resolves via grace timer', async () => {
356
+ const fastBus = new ApprovalBus({ approvalTimeoutMs: 5000, autoAllowGraceMs: 80 });
357
+ const fastPath = uniqueSocketPath();
358
+ await fastBus.start(fastPath);
359
+ try {
360
+ fastBus.registerRun('run-1', RUN_CTX);
361
+ const notifications = [];
362
+ fastBus.setNotifier(async (n) => { notifications.push(n); });
363
+ const client = await connectClient(fastPath);
364
+ // First call — user replies "all"
365
+ client.send({
366
+ v: 1, type: 'approval', runId: 'run-1', reqId: 'r-1',
367
+ toolName: 'Bash', input: { command: 'git status -s' }, toolUseId: 'tu-1',
368
+ });
369
+ for (let i = 0; i < 50 && notifications.length < 1; i++)
370
+ await sleep(10);
371
+ expect(notifications[0].autoAllow).toBeUndefined(); // first ask is normal
372
+ fastBus.resolvePending('thread-A', { behavior: 'allow', autoAllowFurther: true });
373
+ const d1 = await client.next();
374
+ expect(d1.behavior).toBe('allow');
375
+ // Wire payload must NOT carry autoAllowFurther — that's internal-only.
376
+ expect(d1.autoAllowFurther).toBeUndefined();
377
+ expect(fastBus.getAutoAllowKeys('thread-A')).toEqual(['Bash::git status']);
378
+ // Second call — same tool + same prefix → grace mode
379
+ client.send({
380
+ v: 1, type: 'approval', runId: 'run-1', reqId: 'r-2',
381
+ toolName: 'Bash', input: { command: 'git status' }, toolUseId: 'tu-2',
382
+ });
383
+ for (let i = 0; i < 50 && notifications.length < 2; i++)
384
+ await sleep(10);
385
+ expect(notifications[1].autoAllow).toEqual({ graceMs: 80 });
386
+ // Don't reply → grace timer fires → allow auto-resolved
387
+ const d2 = await client.next(500);
388
+ expect(d2.behavior).toBe('allow');
389
+ expect(fastBus.hasPendingFor('thread-A')).toBe(false);
390
+ await client.close();
391
+ }
392
+ finally {
393
+ await fastBus.stop();
394
+ }
395
+ });
396
+ it('auto-allow: explicit deny in grace mode revokes the rule', async () => {
397
+ const fastBus = new ApprovalBus({ approvalTimeoutMs: 5000, autoAllowGraceMs: 1000 });
398
+ const fastPath = uniqueSocketPath();
399
+ await fastBus.start(fastPath);
400
+ try {
401
+ fastBus.registerRun('run-1', RUN_CTX);
402
+ fastBus.setNotifier(async () => { });
403
+ const client = await connectClient(fastPath);
404
+ // Seed a rule directly via the public path (allow+autoAllowFurther).
405
+ client.send({
406
+ v: 1, type: 'approval', runId: 'run-1', reqId: 'r-seed',
407
+ // Long enough for the 10-char prefix to land on a shared region
408
+ // with the second call below (`rm -rf /tm` is the fingerprint).
409
+ toolName: 'Bash', input: { command: 'rm -rf /tmp/x' }, toolUseId: 'tu-1',
410
+ });
411
+ await sleep(20);
412
+ fastBus.resolvePending('thread-A', { behavior: 'allow', autoAllowFurther: true });
413
+ await client.next();
414
+ expect(fastBus.getAutoAllowKeys('thread-A')).toEqual(['Bash::rm -rf /tm']);
415
+ // Second call hits the rule → grace mode. User explicitly denies.
416
+ client.send({
417
+ v: 1, type: 'approval', runId: 'run-1', reqId: 'r-2',
418
+ toolName: 'Bash', input: { command: 'rm -rf /tmp/y' }, toolUseId: 'tu-2',
419
+ });
420
+ await sleep(20);
421
+ fastBus.resolvePending('thread-A', { behavior: 'deny', message: '不行' });
422
+ const d = await client.next();
423
+ expect(d.behavior).toBe('deny');
424
+ // Rule is revoked → next call should be normal (not auto-allow).
425
+ expect(fastBus.getAutoAllowKeys('thread-A')).toEqual([]);
426
+ await client.close();
427
+ }
428
+ finally {
429
+ await fastBus.stop();
430
+ }
431
+ });
432
+ it('auto-allow: non-user denies (run terminated, shutdown) do NOT revoke the rule', async () => {
433
+ const fastBus = new ApprovalBus({ approvalTimeoutMs: 5000, autoAllowGraceMs: 5000 });
434
+ const fastPath = uniqueSocketPath();
435
+ await fastBus.start(fastPath);
436
+ try {
437
+ fastBus.registerRun('run-1', RUN_CTX);
438
+ fastBus.setNotifier(async () => { });
439
+ const client = await connectClient(fastPath);
440
+ client.send({
441
+ v: 1, type: 'approval', runId: 'run-1', reqId: 'r-1',
442
+ toolName: 'Bash', input: { command: 'ls -la /tmp/imhub-foo' }, toolUseId: 'tu-1',
443
+ });
444
+ await sleep(20);
445
+ fastBus.resolvePending('thread-A', { behavior: 'allow', autoAllowFurther: true });
446
+ await client.next();
447
+ // Open a 2nd request that hits the rule (auto-allow grace). Both
448
+ // commands share the first 10 chars (`ls -la /tm`) so they map to
449
+ // the same fingerprint after the AUTO_ALLOW_PREFIX_LEN bump.
450
+ client.send({
451
+ v: 1, type: 'approval', runId: 'run-1', reqId: 'r-2',
452
+ toolName: 'Bash', input: { command: 'ls -la /tmp/imhub-other' }, toolUseId: 'tu-2',
453
+ });
454
+ await sleep(20);
455
+ // Simulate "claude died" — unregisterRun → cancelPending(deny). This
456
+ // should NOT clear the rule.
457
+ fastBus.unregisterRun('run-1');
458
+ const d = await client.next();
459
+ expect(d.behavior).toBe('deny');
460
+ expect(fastBus.getAutoAllowKeys('thread-A')).toEqual(['Bash::ls -la /tm']);
461
+ await client.close();
462
+ }
463
+ finally {
464
+ await fastBus.stop();
465
+ }
466
+ });
467
+ it('auto-allow: clearAutoAllowForThread drops every rule', () => {
468
+ bus.clearAutoAllowForThread('does-not-exist'); // should not throw
469
+ // Internal — exercise via the real public path: addAutoAllowRule is called
470
+ // via cancelPending. We use a private lookup helper here.
471
+ bus.registerRun('run-clr', RUN_CTX);
472
+ bus.setNotifier(async () => { });
473
+ // After clearing, no rules should remain — start from baseline.
474
+ bus.clearAutoAllowForThread('thread-A');
475
+ expect(bus.getAutoAllowKeys('thread-A')).toEqual([]);
476
+ });
477
+ it('queues multiple pending on same thread, resolves head first', async () => {
478
+ bus.registerRun('run-1', RUN_CTX);
479
+ bus.setNotifier(async () => { });
480
+ const client = await connectClient(path);
481
+ client.send({
482
+ v: 1, type: 'approval', runId: 'run-1', reqId: 'req-A',
483
+ toolName: 'Bash', input: {}, toolUseId: 'tu-A',
484
+ });
485
+ await sleep(20);
486
+ client.send({
487
+ v: 1, type: 'approval', runId: 'run-1', reqId: 'req-B',
488
+ toolName: 'Read', input: {}, toolUseId: 'tu-B',
489
+ });
490
+ await sleep(20);
491
+ expect(bus.hasPendingFor('thread-A')).toBe(true);
492
+ bus.resolvePending('thread-A', { behavior: 'allow' });
493
+ const first = await client.next();
494
+ expect(first.reqId).toBe('req-A');
495
+ expect(bus.hasPendingFor('thread-A')).toBe(true);
496
+ bus.resolvePending('thread-A', { behavior: 'deny', message: 'no' });
497
+ const second = await client.next();
498
+ expect(second.reqId).toBe('req-B');
499
+ expect(second.behavior).toBe('deny');
500
+ await client.close();
501
+ });
502
+ // M14 follow-up: each resolution must increment exactly ONE of
503
+ // allowed/denied/timedOut. If two buckets fire on the same call
504
+ // (e.g. cause='timeout' + decision.behavior='deny'), the Prometheus
505
+ // "allow = resolved - deny - timeout" math would go negative — counters
506
+ // must be monotonic, so this invariant is load-bearing for the metrics
507
+ // exposition.
508
+ it('metrics: resolution buckets are mutually exclusive', async () => {
509
+ bus.registerRun('run-1', RUN_CTX);
510
+ bus.setNotifier(async () => { });
511
+ const client = await connectClient(path);
512
+ // 1. user allow
513
+ client.send({ v: 1, type: 'approval', runId: 'run-1', reqId: 'r1', toolName: 'Bash', input: {}, toolUseId: 'tu-1' });
514
+ await sleep(20);
515
+ bus.resolvePending('thread-A', { behavior: 'allow' });
516
+ await client.next();
517
+ // 2. user deny
518
+ client.send({ v: 1, type: 'approval', runId: 'run-1', reqId: 'r2', toolName: 'Bash', input: {}, toolUseId: 'tu-2' });
519
+ await sleep(20);
520
+ bus.resolvePending('thread-A', { behavior: 'deny', message: 'no' });
521
+ await client.next();
522
+ // 3. timeout (no auto-allow grace, fires deny on the wire but counts as timeout)
523
+ client.send({ v: 1, type: 'approval', runId: 'run-1', reqId: 'r3', toolName: 'Bash', input: {}, toolUseId: 'tu-3' });
524
+ const timeoutDecision = await client.next(2000);
525
+ expect(timeoutDecision.behavior).toBe('deny');
526
+ const m = bus.getMetrics();
527
+ expect(m.totalRequests).toBe(3);
528
+ expect(m.totalResolved).toBe(3);
529
+ expect(m.totalAllowed).toBe(1);
530
+ expect(m.totalDenied).toBe(1);
531
+ expect(m.totalTimedOut).toBe(1);
532
+ // Invariant — buckets sum to totalResolved.
533
+ expect(m.totalAllowed + m.totalDenied + m.totalTimedOut).toBe(m.totalResolved);
534
+ await client.close();
535
+ });
536
+ });
537
+ //# sourceMappingURL=approval-bus.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approval-bus.test.js","sourceRoot":"","sources":["../../src/core/approval-bus.test.ts"],"names":[],"mappings":"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"}