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,195 @@
1
+ // ClaudeCodeAdapter — verify prepareCommand picks the right path under each
2
+ // degradation condition (env disable / no IM context / bus down) and that the
3
+ // approval-routed plan writes a sensible mcp-config + cleans it up.
4
+ //
5
+ // Concurrency note: this rewrite (after we found the singleton race that
6
+ // caused mcp.json to be deleted out from under a second concurrent claude
7
+ // run) explicitly tests that two prepareCommand() calls overlapping each
8
+ // other still produce two distinct configs with no shared state.
9
+ import { describe, it, expect, beforeEach, afterEach } from 'bun:test';
10
+ import { readFile, access } from 'fs/promises';
11
+ import { tmpdir } from 'os';
12
+ import { join } from 'path';
13
+ import { randomBytes } from 'crypto';
14
+ import { ApprovalBus, approvalBus } from '../../../core/approval-bus.js';
15
+ import { ClaudeCodeAdapter, _testInternals } from './index.js';
16
+ function uniqueSocketPath() {
17
+ return join(tmpdir(), `imhub-adapter-test-${process.pid}-${randomBytes(4).toString('hex')}.sock`);
18
+ }
19
+ const FULL_OPTS = {
20
+ threadId: 'thread-A',
21
+ platform: 'feishu',
22
+ channelId: 'chan-1',
23
+ userId: 'u1',
24
+ };
25
+ async function fileExists(p) {
26
+ try {
27
+ await access(p);
28
+ return true;
29
+ }
30
+ catch {
31
+ return false;
32
+ }
33
+ }
34
+ describe('ClaudeCodeAdapter prepareCommand — fallback paths', () => {
35
+ let adapter;
36
+ beforeEach(() => {
37
+ adapter = new ClaudeCodeAdapter();
38
+ delete process.env.IMHUB_APPROVAL_DISABLED;
39
+ });
40
+ afterEach(() => {
41
+ delete process.env.IMHUB_APPROVAL_DISABLED;
42
+ });
43
+ it('falls back to dontAsk when IMHUB_APPROVAL_DISABLED=1', async () => {
44
+ process.env.IMHUB_APPROVAL_DISABLED = '1';
45
+ const plan = await _testInternals.prepareCommand(adapter, 'hi', FULL_OPTS);
46
+ expect(plan.args[plan.args.indexOf('--permission-mode') + 1]).toBe('dontAsk');
47
+ expect(plan.args).not.toContain('--permission-prompt-tool');
48
+ expect(plan.args).not.toContain('--mcp-config');
49
+ expect(plan.cleanup).toBeUndefined();
50
+ });
51
+ it('falls back to dontAsk when no IM context (web/scheduler call)', async () => {
52
+ const plan = await _testInternals.prepareCommand(adapter, 'hi', { model: 'sonnet' });
53
+ expect(plan.args[plan.args.indexOf('--permission-mode') + 1]).toBe('dontAsk');
54
+ expect(plan.cleanup).toBeUndefined();
55
+ });
56
+ it('falls back to dontAsk when bus is not started', async () => {
57
+ expect(approvalBus.getSocketPath()).toBeNull();
58
+ const plan = await _testInternals.prepareCommand(adapter, 'hi', FULL_OPTS);
59
+ expect(plan.args[plan.args.indexOf('--permission-mode') + 1]).toBe('dontAsk');
60
+ expect(plan.cleanup).toBeUndefined();
61
+ });
62
+ it('uses --permission-mode plan + skips mcp-config when planMode=true', async () => {
63
+ // planMode short-circuits the approval-bus pipeline regardless of IM
64
+ // context — plan is read-only so there is nothing for the bus to gate.
65
+ const plan = await _testInternals.prepareCommand(adapter, 'sketch', { ...FULL_OPTS, planMode: true });
66
+ expect(plan.args[plan.args.indexOf('--permission-mode') + 1]).toBe('plan');
67
+ expect(plan.args).not.toContain('--mcp-config');
68
+ expect(plan.args).not.toContain('--permission-prompt-tool');
69
+ expect(plan.cleanup).toBeUndefined();
70
+ expect(plan.args[plan.args.length - 1]).toBe('sketch');
71
+ });
72
+ it('buildArgs uses plan when planMode is set, dontAsk otherwise', () => {
73
+ const plain = _testInternals.buildArgs(adapter, 'p', {});
74
+ expect(plain[plain.indexOf('--permission-mode') + 1]).toBe('dontAsk');
75
+ const planning = _testInternals.buildArgs(adapter, 'p', { planMode: true });
76
+ expect(planning[planning.indexOf('--permission-mode') + 1]).toBe('plan');
77
+ });
78
+ });
79
+ describe('ClaudeCodeAdapter prepareCommand — approval-routed', () => {
80
+ let bus;
81
+ let adapter;
82
+ let originalGetSocketPath;
83
+ let originalRegisterRun;
84
+ let originalUnregisterRun;
85
+ beforeEach(async () => {
86
+ bus = new ApprovalBus({ approvalTimeoutMs: 500 });
87
+ await bus.start(uniqueSocketPath());
88
+ originalGetSocketPath = approvalBus.getSocketPath.bind(approvalBus);
89
+ originalRegisterRun = approvalBus.registerRun.bind(approvalBus);
90
+ originalUnregisterRun = approvalBus.unregisterRun.bind(approvalBus);
91
+ approvalBus.getSocketPath = () => bus.getSocketPath();
92
+ approvalBus.registerRun = bus.registerRun.bind(bus);
93
+ approvalBus.unregisterRun = bus.unregisterRun.bind(bus);
94
+ adapter = new ClaudeCodeAdapter();
95
+ });
96
+ afterEach(async () => {
97
+ await bus.stop();
98
+ approvalBus.getSocketPath = originalGetSocketPath;
99
+ approvalBus.registerRun = originalRegisterRun;
100
+ approvalBus.unregisterRun = originalUnregisterRun;
101
+ });
102
+ it('writes a valid mcp-config and emits approval-mode args', async () => {
103
+ const plan = await _testInternals.prepareCommand(adapter, 'hi', FULL_OPTS);
104
+ expect(plan.cleanup).toBeDefined();
105
+ const cfgIdx = plan.args.indexOf('--mcp-config');
106
+ expect(cfgIdx).toBeGreaterThanOrEqual(0);
107
+ const configPath = plan.args[cfgIdx + 1];
108
+ expect(await fileExists(configPath)).toBe(true);
109
+ const raw = await readFile(configPath, 'utf8');
110
+ const parsed = JSON.parse(raw);
111
+ expect(parsed.mcpServers.imhub).toBeDefined();
112
+ expect(parsed.mcpServers.imhub.command).toBe(process.execPath);
113
+ expect(parsed.mcpServers.imhub.args[0]).toMatch(/mcp-approval-server\.js$/);
114
+ expect(parsed.mcpServers.imhub.env.IMHUB_APPROVAL_SOCK).toBe(bus.getSocketPath());
115
+ expect(typeof parsed.mcpServers.imhub.env.IMHUB_RUN_ID).toBe('string');
116
+ expect(parsed.mcpServers.imhub.env.IMHUB_RUN_ID.length).toBeGreaterThan(0);
117
+ expect(plan.args[plan.args.indexOf('--permission-mode') + 1]).toBe('default');
118
+ expect(plan.args[plan.args.indexOf('--permission-prompt-tool') + 1]).toBe('mcp__imhub__request');
119
+ expect(plan.args[plan.args.length - 1]).toBe('hi');
120
+ // mcp-config must come BEFORE the next `-X` flag so its variadic
121
+ // <configs...> doesn't swallow the prompt as a second config path.
122
+ expect(cfgIdx).toBe(0);
123
+ expect(plan.args[cfgIdx + 2].startsWith('-')).toBe(true);
124
+ await plan.cleanup();
125
+ });
126
+ it('cleanup unregisters run and removes config tmpdir', async () => {
127
+ const plan = await _testInternals.prepareCommand(adapter, 'hi', FULL_OPTS);
128
+ const configPath = plan.args[plan.args.indexOf('--mcp-config') + 1];
129
+ expect(await fileExists(configPath)).toBe(true);
130
+ await plan.cleanup();
131
+ expect(await fileExists(configPath)).toBe(false);
132
+ });
133
+ it('IMHUB_APPROVAL_DISABLED still wins even when bus is up', async () => {
134
+ process.env.IMHUB_APPROVAL_DISABLED = '1';
135
+ try {
136
+ const plan = await _testInternals.prepareCommand(adapter, 'hi', FULL_OPTS);
137
+ expect(plan.cleanup).toBeUndefined();
138
+ expect(plan.args).not.toContain('--mcp-config');
139
+ expect(plan.args[plan.args.indexOf('--permission-mode') + 1]).toBe('dontAsk');
140
+ }
141
+ finally {
142
+ delete process.env.IMHUB_APPROVAL_DISABLED;
143
+ }
144
+ });
145
+ it('two prepareCommand calls return INDEPENDENT configs (concurrency safety)', async () => {
146
+ // Fire them in parallel, with their awaits genuinely interleaving.
147
+ const [planA, planB] = await Promise.all([
148
+ _testInternals.prepareCommand(adapter, 'A', FULL_OPTS),
149
+ _testInternals.prepareCommand(adapter, 'B', FULL_OPTS),
150
+ ]);
151
+ const cfgA = planA.args[planA.args.indexOf('--mcp-config') + 1];
152
+ const cfgB = planB.args[planB.args.indexOf('--mcp-config') + 1];
153
+ expect(cfgA).not.toBe(cfgB);
154
+ const rawA = JSON.parse(await readFile(cfgA, 'utf8'));
155
+ const rawB = JSON.parse(await readFile(cfgB, 'utf8'));
156
+ expect(rawA.mcpServers.imhub.env.IMHUB_RUN_ID)
157
+ .not.toBe(rawB.mcpServers.imhub.env.IMHUB_RUN_ID);
158
+ // Cleaning up A must NOT remove B's config.
159
+ await planA.cleanup();
160
+ expect(await fileExists(cfgA)).toBe(false);
161
+ expect(await fileExists(cfgB)).toBe(true);
162
+ await planB.cleanup();
163
+ expect(await fileExists(cfgB)).toBe(false);
164
+ });
165
+ it('cleanup is idempotent (calling twice is safe)', async () => {
166
+ const plan = await _testInternals.prepareCommand(adapter, 'hi', FULL_OPTS);
167
+ await plan.cleanup();
168
+ // Should not throw on the second call
169
+ await plan.cleanup();
170
+ });
171
+ // Regression for ADR 0005: every fallback return inside prepareCommand must
172
+ // carry cwd. An earlier version dropped it on the mkdtemp-failure branch,
173
+ // silently demoting that one call back to im-hub's "/" cwd and leaking
174
+ // memory across IM and terminal Claude.
175
+ it('mkdtemp failure still propagates cwd (ADR 0005)', async () => {
176
+ process.env.IMHUB_CLAUDE_CODE_CWD = '/tmp/imhub-cwd-regression-xyz';
177
+ const origTmp = process.env.TMPDIR;
178
+ process.env.TMPDIR = '/proc/imhub-bogus-no-such-dir/xyz';
179
+ try {
180
+ const plan = await _testInternals.prepareCommand(adapter, 'hi', FULL_OPTS);
181
+ expect(plan.args[plan.args.indexOf('--permission-mode') + 1]).toBe('dontAsk');
182
+ expect(plan.args).not.toContain('--mcp-config');
183
+ expect(plan.cleanup).toBeUndefined();
184
+ expect(plan.cwd).toBe('/tmp/imhub-cwd-regression-xyz');
185
+ }
186
+ finally {
187
+ if (origTmp === undefined)
188
+ delete process.env.TMPDIR;
189
+ else
190
+ process.env.TMPDIR = origTmp;
191
+ delete process.env.IMHUB_CLAUDE_CODE_CWD;
192
+ }
193
+ });
194
+ });
195
+ //# sourceMappingURL=adapter.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.test.js","sourceRoot":"","sources":["../../../../src/plugins/agents/claude-code/adapter.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { AgentBase, type SpawnPlan } from '../../../core/agent-base.js';
2
+ import type { AgentSendOpts } from '../../../core/types.js';
3
+ export declare class ClaudeCodeAdapter extends AgentBase {
4
+ readonly name = "claude-code";
5
+ readonly aliases: string[];
6
+ protected get commandName(): string;
7
+ /**
8
+ * Legacy/fallback args — used when approval routing is disabled or not
9
+ * applicable (no IM context, bus down, IMHUB_APPROVAL_DISABLED=1).
10
+ *
11
+ * planMode override: when opts.planMode is true we hand claude
12
+ * `--permission-mode plan` regardless of fallback path. plan is read-only
13
+ * by design so the IM approval bus has nothing to gate, and dontAsk would
14
+ * silently re-allow mutations the user explicitly opted out of.
15
+ */
16
+ protected buildArgs(prompt: string, opts: AgentSendOpts): string[];
17
+ protected prepareCommand(prompt: string, opts: AgentSendOpts): Promise<SpawnPlan>;
18
+ protected extractText(event: unknown): string;
19
+ }
20
+ export declare const claudeCodeAdapter: ClaudeCodeAdapter;
21
+ export declare const _testInternals: {
22
+ prepareCommand(adapter: ClaudeCodeAdapter, prompt: string, opts: AgentSendOpts): Promise<SpawnPlan>;
23
+ buildArgs(adapter: ClaudeCodeAdapter, prompt: string, opts?: AgentSendOpts): string[];
24
+ };
25
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/plugins/agents/claude-code/index.ts"],"names":[],"mappings":"AA8BA,OAAO,EAAE,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,6BAA6B,CAAA;AACvE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AA6B3D,qBAAa,iBAAkB,SAAQ,SAAS;IAC9C,QAAQ,CAAC,IAAI,iBAAgB;IAC7B,QAAQ,CAAC,OAAO,WAAiC;IAEjD,SAAS,KAAK,WAAW,IAAI,MAAM,CAAoB;IAEvD;;;;;;;;OAQG;IACH,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,MAAM,EAAE;cAUlD,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC;IA8FvF,SAAS,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM;CAW9C;AAED,eAAO,MAAM,iBAAiB,mBAA0B,CAAA;AAIxD,eAAO,MAAM,cAAc;4BACK,iBAAiB,UAAU,MAAM,QAAQ,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC;uBAItF,iBAAiB,UAAU,MAAM,SAAQ,aAAa,GAAQ,MAAM,EAAE;CAI1F,CAAA"}
@@ -0,0 +1,184 @@
1
+ // Claude Code agent adapter
2
+ // Uses --print --output-format stream-json for programmatic interaction
3
+ //
4
+ // Permission flow has two modes, decided per-call in prepareCommand():
5
+ //
6
+ // Approval-routed (default when IM context is present and the bus is up):
7
+ // --permission-mode default
8
+ // --permission-prompt-tool mcp__imhub__request
9
+ // --mcp-config <tmpfile>
10
+ // The MCP sidecar (mcp-approval-server.js) is registered via --mcp-config;
11
+ // it connects to im-hub's approval-bus over a unix socket, and im-hub
12
+ // surfaces approval prompts to the originating IM thread.
13
+ //
14
+ // Legacy "dontAsk" fallback (env IMHUB_APPROVAL_DISABLED=1, OR no IM
15
+ // thread context, OR approvalBus not started):
16
+ // --permission-mode dontAsk
17
+ // Previous behavior — Claude leans entirely on PreToolUse hooks in
18
+ // ~/.claude/settings.json plus the CLAUDE_VIA_IM env signal injected by
19
+ // im-hub.service. Use this when human approval over IM isn't available.
20
+ //
21
+ // IMPORTANT: every per-spawn resource (runId, mcp-config dir, registry
22
+ // entry) lives in the SpawnPlan returned by prepareCommand — never on the
23
+ // adapter instance. The adapter is a singleton and concurrent IM threads
24
+ // would otherwise clobber each other's state mid-spawn.
25
+ import { randomUUID } from 'crypto';
26
+ import { mkdtemp, writeFile, rm } from 'fs/promises';
27
+ import { tmpdir } from 'os';
28
+ import { fileURLToPath } from 'url';
29
+ import { dirname, join } from 'path';
30
+ import { AgentBase } from '../../../core/agent-base.js';
31
+ import { approvalBus } from '../../../core/approval-bus.js';
32
+ import { resolveAgentCwd } from '../../../core/agent-cwd.js';
33
+ import { logger as rootLogger } from '../../../core/logger.js';
34
+ const __dirname = dirname(fileURLToPath(import.meta.url));
35
+ const SIDECAR_PATH = join(__dirname, 'mcp-approval-server.js');
36
+ const log = rootLogger.child({ component: 'agent.claude-code' });
37
+ const BASE_ARGS = ['--print', '--verbose', '--output-format', 'stream-json'];
38
+ /** First call with a UUID: --session-id (creates the session under that id).
39
+ * Subsequent calls: --resume (continues from existing). Mixing them up gets
40
+ * you "Session ID already in use" or "session not found". */
41
+ function sessionFlag(opts) {
42
+ if (!opts.agentSessionId)
43
+ return [];
44
+ return opts.agentSessionResume
45
+ ? ['--resume', opts.agentSessionId]
46
+ : ['--session-id', opts.agentSessionId];
47
+ }
48
+ export class ClaudeCodeAdapter extends AgentBase {
49
+ name = 'claude-code';
50
+ aliases = ['cc', 'claude', 'claudecode'];
51
+ get commandName() { return 'claude'; }
52
+ /**
53
+ * Legacy/fallback args — used when approval routing is disabled or not
54
+ * applicable (no IM context, bus down, IMHUB_APPROVAL_DISABLED=1).
55
+ *
56
+ * planMode override: when opts.planMode is true we hand claude
57
+ * `--permission-mode plan` regardless of fallback path. plan is read-only
58
+ * by design so the IM approval bus has nothing to gate, and dontAsk would
59
+ * silently re-allow mutations the user explicitly opted out of.
60
+ */
61
+ buildArgs(prompt, opts) {
62
+ const mode = opts.planMode ? 'plan' : 'dontAsk';
63
+ return [
64
+ ...sessionFlag(opts),
65
+ ...BASE_ARGS,
66
+ '--permission-mode', mode,
67
+ prompt,
68
+ ];
69
+ }
70
+ async prepareCommand(prompt, opts) {
71
+ // Cwd is computed once and shared by all return paths below — both the
72
+ // approval-routed path and every fallback ("dontAsk", missing IM context,
73
+ // tmpdir failure, etc.). Skipping cwd on the fallbacks would silently
74
+ // demote those calls back to im-hub's "/" cwd and leak across memory.
75
+ const cwd = resolveAgentCwd(this.name, opts);
76
+ // Plan mode short-circuits the approval-bus pipeline: claude's `plan`
77
+ // permission mode is strictly read-only, so there are no mutating tools
78
+ // for the IM bridge to gate. Skipping the mcp-config tmpdir + bus run
79
+ // registration also keeps cleanup trivial. buildArgs picks `--permission-mode plan`
80
+ // when opts.planMode is true.
81
+ if (opts.planMode) {
82
+ return { args: this.buildArgs(prompt, opts), cwd };
83
+ }
84
+ if (process.env.IMHUB_APPROVAL_DISABLED === '1') {
85
+ return { args: this.buildArgs(prompt, opts), cwd };
86
+ }
87
+ const sockPath = approvalBus.getSocketPath();
88
+ if (!sockPath)
89
+ return { args: this.buildArgs(prompt, opts), cwd }; // bus not started
90
+ const { threadId, platform, channelId, userId } = opts;
91
+ if (!threadId || !platform || !channelId) {
92
+ // Non-IM call (web/scheduler/intent-llm) — no thread to route prompts to.
93
+ // resolveAgentCwd returns undefined here too, so cwd ends up undefined and
94
+ // the spawn inherits im-hub's cwd, matching the historical behavior.
95
+ return { args: this.buildArgs(prompt, opts), cwd };
96
+ }
97
+ const runId = randomUUID();
98
+ let configDir;
99
+ try {
100
+ configDir = await mkdtemp(join(tmpdir(), 'imhub-mcp-'));
101
+ }
102
+ catch (err) {
103
+ log.warn({ event: 'claude.approval.mkdtemp_failed', err: String(err) }, 'Falling back to dontAsk: cannot create mcp-config tmpdir');
104
+ return { args: this.buildArgs(prompt, opts), cwd };
105
+ }
106
+ const configPath = join(configDir, 'mcp.json');
107
+ const config = {
108
+ mcpServers: {
109
+ imhub: {
110
+ command: process.execPath,
111
+ args: [SIDECAR_PATH],
112
+ env: {
113
+ IMHUB_APPROVAL_SOCK: sockPath,
114
+ IMHUB_RUN_ID: runId,
115
+ },
116
+ },
117
+ },
118
+ };
119
+ try {
120
+ await writeFile(configPath, JSON.stringify(config), 'utf8');
121
+ }
122
+ catch (err) {
123
+ log.warn({ event: 'claude.approval.write_config_failed', err: String(err) }, 'Falling back to dontAsk: cannot write mcp-config');
124
+ try {
125
+ await rm(configDir, { recursive: true, force: true });
126
+ }
127
+ catch { /* ignore */ }
128
+ return { args: this.buildArgs(prompt, opts), cwd };
129
+ }
130
+ approvalBus.registerRun(runId, {
131
+ threadId, platform, userId: userId ?? '', channelId,
132
+ });
133
+ log.info({ event: 'claude.approval.routed', runId, threadId, platform }, 'Claude run routed via approval-bus');
134
+ // Closure captures runId + configDir locally — concurrent runs each have
135
+ // their own copy, so cleanup never deletes another spawn's tmpdir.
136
+ return {
137
+ args: [
138
+ ...sessionFlag(opts),
139
+ // ORDER MATTERS: --mcp-config takes <configs...> (variadic). Place it
140
+ // before another `-X` flag so it sees exactly one file path, not the
141
+ // prompt as a second config file.
142
+ '--mcp-config', configPath,
143
+ ...BASE_ARGS,
144
+ '--permission-mode', 'default',
145
+ '--permission-prompt-tool', 'mcp__imhub__request',
146
+ prompt,
147
+ ],
148
+ cwd,
149
+ cleanup: async () => {
150
+ approvalBus.unregisterRun(runId);
151
+ try {
152
+ await rm(configDir, { recursive: true, force: true });
153
+ }
154
+ catch { /* ignore */ }
155
+ },
156
+ };
157
+ }
158
+ extractText(event) {
159
+ const msg = event;
160
+ if (msg.type === 'assistant' && msg.message?.content) {
161
+ const parts = [];
162
+ for (const item of msg.message.content) {
163
+ if (item.type === 'text' && item.text)
164
+ parts.push(item.text);
165
+ }
166
+ return parts.join('');
167
+ }
168
+ return '';
169
+ }
170
+ }
171
+ export const claudeCodeAdapter = new ClaudeCodeAdapter();
172
+ // Test-only escape hatch — drives prepareCommand/buildArgs without going
173
+ // through the spawnStream pipeline.
174
+ export const _testInternals = {
175
+ async prepareCommand(adapter, prompt, opts) {
176
+ // @ts-expect-error — protected; tests reach in deliberately
177
+ return adapter.prepareCommand(prompt, opts);
178
+ },
179
+ buildArgs(adapter, prompt, opts = {}) {
180
+ // @ts-expect-error
181
+ return adapter.buildArgs(prompt, opts);
182
+ },
183
+ };
184
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/plugins/agents/claude-code/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ interface DecisionAllow {
3
+ behavior: 'allow';
4
+ updatedInput?: Record<string, unknown>;
5
+ }
6
+ interface DecisionDeny {
7
+ behavior: 'deny';
8
+ message?: string;
9
+ }
10
+ type Decision = DecisionAllow | DecisionDeny;
11
+ declare class ApprovalClient {
12
+ private readonly socketPath;
13
+ private readonly runId;
14
+ private socket;
15
+ private buf;
16
+ private pending;
17
+ private connectErr;
18
+ private closed;
19
+ private connectPromise;
20
+ constructor(socketPath: string, runId: string);
21
+ private connect;
22
+ private onData;
23
+ private dispatch;
24
+ private onClose;
25
+ /**
26
+ * Send an approval request and wait for the decision. If the bus is
27
+ * unreachable or the connection has dropped, returns a deny synchronously.
28
+ */
29
+ request(args: {
30
+ toolName: string;
31
+ input: Record<string, unknown>;
32
+ toolUseId: string;
33
+ }): Promise<Decision>;
34
+ close(): Promise<void>;
35
+ }
36
+ /**
37
+ * Build the MCP server. Exposed as a function (rather than top-level `await`)
38
+ * so tests can construct it without spinning up stdio.
39
+ */
40
+ export declare function buildServer(client: ApprovalClient): McpServer;
41
+ export { ApprovalClient };
42
+ //# sourceMappingURL=mcp-approval-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-approval-server.d.ts","sourceRoot":"","sources":["../../../../src/plugins/agents/claude-code/mcp-approval-server.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AASnE,UAAU,aAAa;IAAG,QAAQ,EAAE,OAAO,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE;AACrF,UAAU,YAAY;IAAG,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE;AAC7D,KAAK,QAAQ,GAAG,aAAa,GAAG,YAAY,CAAA;AAS5C,cAAM,cAAc;IAQN,OAAO,CAAC,QAAQ,CAAC,UAAU;IAAU,OAAO,CAAC,QAAQ,CAAC,KAAK;IAPvE,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,GAAG,CAAK;IAChB,OAAO,CAAC,OAAO,CAAoC;IACnD,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,cAAc,CAAe;gBAER,UAAU,EAAE,MAAM,EAAmB,KAAK,EAAE,MAAM;IAI/E,OAAO,CAAC,OAAO;IA0Bf,OAAO,CAAC,MAAM;IAgBd,OAAO,CAAC,QAAQ;IAoBhB,OAAO,CAAC,OAAO;IAWf;;;OAGG;IACG,OAAO,CAAC,IAAI,EAAE;QAClB,QAAQ,EAAE,MAAM,CAAA;QAChB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QAC9B,SAAS,EAAE,MAAM,CAAA;KAClB,GAAG,OAAO,CAAC,QAAQ,CAAC;IA2Bf,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAU7B;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,cAAc,GAAG,SAAS,CAyC7D;AAED,OAAO,EAAE,cAAc,EAAE,CAAA"}