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,549 @@
1
+ // OpenCode HTTP driver.
2
+ //
3
+ // Why this exists:
4
+ // `opencode run --format json` (the stdio driver in opencode-stdio-adapter.ts)
5
+ // does NOT emit `permission.asked` events on its stdout stream, and its
6
+ // inline auto-reject logic occasionally fails to release the prompt
7
+ // deferred — the process then hangs until im-hub's 30-min hard SIGTERM.
8
+ // Audit confirmed this on 2026-05-04 (rows id=283/284, exact 1,800,000 ms).
9
+ //
10
+ // What this driver does instead:
11
+ // 1. Lazily starts a long-lived `opencode serve` daemon on 127.0.0.1
12
+ // (via OpencodeServeManager). Probes-and-reuses any healthy daemon
13
+ // already on the configured port so back-to-back im-hub restarts
14
+ // don't bind-fail on a still-running child.
15
+ // 2. Subscribes to /event SSE so the adapter — not the run-CLI — owns the
16
+ // authoritative event stream.
17
+ // 3. Creates sessions via POST /session and submits prompts via
18
+ // POST /session/:id/message. Resumes existing sessions when
19
+ // opts.agentSessionId is set; on first turn of a resumed session this
20
+ // process lifetime, PATCHes the session ruleset to apply the current
21
+ // gate policy.
22
+ // 4. Routes `permission.asked` SSE events through the IM approval bus
23
+ // when an IM context (threadId + platform) and notifier are both
24
+ // available. Decisions translate: allow → opencode `once`, deny →
25
+ // opencode `reject` (with optional message). Without an IM channel
26
+ // the adapter falls back to auto-`once` so non-IM call paths (web,
27
+ // scheduler) keep working.
28
+ // 5. Exits cleanly on `session.status: idle` for the right session,
29
+ // surfaces `session.error`, and is bounded by OPENCODE_TIMEOUT_MS
30
+ // (default 30 min).
31
+ //
32
+ // Selection: env IMHUB_OPENCODE_DRIVER=http picks this; anything else (incl
33
+ // unset) picks the stdio adapter. See ./index.ts factory.
34
+ //
35
+ // Gate policy: env IMHUB_OPENCODE_GATE controls which permissions surface
36
+ // as IM cards. See buildSessionRuleset() for the strict / medium / loose /
37
+ // none levels — medium is the default and gates edit / write / patch.
38
+ //
39
+ // Compatibility: extends OpenCodeAdapter so registry / tests that probe
40
+ // `instanceof OpenCodeAdapter` stay green. The base class's spawnStream is
41
+ // not used — sendPrompt is overridden end-to-end.
42
+ import { OpenCodeAdapter } from './opencode-stdio-adapter.js';
43
+ import { resolveAgentCwd } from '../../../core/agent-cwd.js';
44
+ import { logger as rootLogger } from '../../../core/logger.js';
45
+ import { opencodeServe as defaultServe } from './serve-manager.js';
46
+ import { approvalBus as defaultApprovalBus } from '../../../core/approval-bus.js';
47
+ const log = rootLogger.child({ component: 'agent.opencode.http' });
48
+ const DEFAULT_TIMEOUT_MS = 30 * 60 * 1000;
49
+ export class OpenCodeHttpAdapter extends OpenCodeAdapter {
50
+ serve;
51
+ fetchImpl;
52
+ /** null when the bridge is intentionally disabled. */
53
+ approvalBus;
54
+ /** Set of opencode session ids whose ruleset we've already PATCHed in this
55
+ * process lifetime. Lets us re-apply the gate policy when an im-hub
56
+ * restart resurfaces an old session, without duplicating rules every
57
+ * turn. Cleared only by im-hub restart — that's fine since the rules
58
+ * the previous run wrote are still in opencode's session DB. */
59
+ rulesetApplied = new Set();
60
+ constructor(opts = {}) {
61
+ super();
62
+ this.serve = opts.serve ?? defaultServe;
63
+ this.fetchImpl = opts.fetchImpl ?? fetch;
64
+ this.approvalBus = opts.approvalBus === null
65
+ ? null
66
+ : (opts.approvalBus ?? defaultApprovalBus);
67
+ log.info({ event: 'opencode.http.driver_selected', bridge: this.approvalBus !== null }, '[opencode] HTTP driver active (real serve + SSE; IM approval bridge when bus has notifier)');
68
+ }
69
+ /**
70
+ * Translate a single SSE event into adapter-side effects:
71
+ * - sessionID capture → opts.onAgentSessionId
72
+ * - step-finish cost/tokens → opts.onUsage
73
+ * - text-part with finished `time.end` → returned as a chunk
74
+ * Pure: tests drive this directly without spinning up a daemon.
75
+ */
76
+ inspectHttpEvent(event, sessionID, opts) {
77
+ const props = event.properties ?? {};
78
+ const part = props.part;
79
+ // sessionID can appear on the event root, on properties, on properties.info
80
+ // or inside part. Bubble up the first one we see — setOpencodeSessionId
81
+ // (the receiver) is idempotent.
82
+ const sid = props.sessionID || part?.sessionID || props.info?.sessionID;
83
+ if (sid && opts.onAgentSessionId) {
84
+ try {
85
+ opts.onAgentSessionId(sid);
86
+ }
87
+ catch { /* don't let userland callbacks kill the stream */ }
88
+ }
89
+ if (event.type === 'message.part.updated' && part) {
90
+ if (part.type === 'step-finish') {
91
+ const delta = {};
92
+ if (typeof part.cost === 'number' && Number.isFinite(part.cost))
93
+ delta.costUsd = part.cost;
94
+ if (typeof part.tokens?.input === 'number')
95
+ delta.tokensInput = part.tokens.input;
96
+ if (typeof part.tokens?.output === 'number')
97
+ delta.tokensOutput = part.tokens.output;
98
+ if (delta.costUsd !== undefined || delta.tokensInput !== undefined || delta.tokensOutput !== undefined) {
99
+ if (opts.onUsage) {
100
+ try {
101
+ opts.onUsage(delta);
102
+ }
103
+ catch { /* same — user callback safety */ }
104
+ }
105
+ }
106
+ }
107
+ // Match the stdio adapter: only yield text once the part is fully
108
+ // emitted (time.end set). Avoids streaming partial fragments and keeps
109
+ // /stats response_len aligned across drivers.
110
+ const eventSid = props.sessionID || props.info?.sessionID || part.sessionID;
111
+ if (part.type === 'text' &&
112
+ part.text &&
113
+ part.time?.end &&
114
+ eventSid === sessionID) {
115
+ return { text: part.text };
116
+ }
117
+ }
118
+ return {};
119
+ }
120
+ /**
121
+ * `session.status` event with status.type === 'idle' for our session is
122
+ * the canonical "stop" signal in opencode (cf. run.ts:532).
123
+ */
124
+ isIdleEvent(event, sessionID) {
125
+ if (event.type !== 'session.status')
126
+ return false;
127
+ const props = event.properties ?? {};
128
+ const sid = props.sessionID || props.info?.sessionID;
129
+ if (sid !== sessionID)
130
+ return false;
131
+ return props.status?.type === 'idle' || props.info?.status?.type === 'idle';
132
+ }
133
+ isErrorEvent(event, sessionID) {
134
+ if (event.type !== 'session.error')
135
+ return null;
136
+ const props = event.properties ?? {};
137
+ if (props.sessionID !== sessionID)
138
+ return null;
139
+ const e = props.error;
140
+ let msg = 'session error';
141
+ if (e && typeof e === 'object') {
142
+ if (typeof e.name === 'string')
143
+ msg = e.name;
144
+ const data = e.data;
145
+ if (data && typeof data.message === 'string')
146
+ msg = data.message;
147
+ }
148
+ return { error: msg };
149
+ }
150
+ buildHttpContextualPrompt(prompt, history) {
151
+ if (!history || history.length === 0)
152
+ return prompt;
153
+ const historyText = history
154
+ .map(msg => `[${msg.role === 'user' ? 'User' : 'Assistant'}]: ${msg.content}`)
155
+ .join('\n\n');
156
+ return `Previous conversation context:\n${historyText}\n\nCurrent request: ${prompt}`;
157
+ }
158
+ async *sendPrompt(_sessionId, prompt, history, opts) {
159
+ const callOpts = opts ?? {};
160
+ const baseUrl = await this.serve.ensureRunning();
161
+ let sessionID = callOpts.agentSessionId;
162
+ if (!sessionID) {
163
+ sessionID = await this.createSession(baseUrl, callOpts);
164
+ if (callOpts.onAgentSessionId) {
165
+ try {
166
+ callOpts.onAgentSessionId(sessionID);
167
+ }
168
+ catch { /* ignore */ }
169
+ }
170
+ // Newly-created sessions already received the ruleset in createSession's
171
+ // POST body — no need to PATCH again. Mark applied so we skip the dup.
172
+ this.rulesetApplied.add(sessionID);
173
+ }
174
+ else if (callOpts.planMode) {
175
+ // Plan mode: opencode's `plan` primary agent already ships with its own
176
+ // stricter ruleset (edit denied except .opencode/plans/*.md). Stacking
177
+ // the medium-gate edit/write/patch=ask rules on top would just create
178
+ // redundant ask prompts during read-only planning. Skip the PATCH and
179
+ // let plan agent's defaults govern this turn. We intentionally do NOT
180
+ // mark rulesetApplied — once the user /plan off's and we resume normal
181
+ // turns, the next non-plan turn should re-apply the medium gate.
182
+ }
183
+ else if (!this.rulesetApplied.has(sessionID)) {
184
+ // Resumed session: opencode loaded its previously-stored ruleset,
185
+ // which may predate the current gate policy (older sessions were
186
+ // created with no override at all). PATCH the gate ruleset onto it
187
+ // so edit/write/patch correctly route through the IM bridge for the
188
+ // rest of this process's lifetime.
189
+ //
190
+ // Claim the slot synchronously so concurrent prompts on the same
191
+ // session don't fire duplicate PATCHes; remove on failure so the
192
+ // next turn retries instead of leaving the session permanently
193
+ // unguarded if this attempt fails transiently.
194
+ const targetSession = sessionID;
195
+ this.rulesetApplied.add(targetSession);
196
+ this.applyRuleset(baseUrl, targetSession).catch((err) => {
197
+ this.rulesetApplied.delete(targetSession);
198
+ log.warn({ event: 'opencode.http.apply_ruleset_failed', err: String(err), sessionID: targetSession });
199
+ });
200
+ }
201
+ log.info({ event: 'opencode.http.send', sessionID, historyLen: history?.length || 0, hasResume: !!callOpts.agentSessionResume }, 'sendPrompt');
202
+ // When resuming, opencode already has the conversation in its DB — feeding
203
+ // history again would duplicate every prior turn. (Same invariant as the
204
+ // stdio driver — see router.callAgentWithHistory zeroing effectiveHistory.)
205
+ const contextualPrompt = callOpts.agentSessionResume
206
+ ? prompt
207
+ : this.buildHttpContextualPrompt(prompt, history);
208
+ // Subscribe BEFORE posting so we don't miss early events.
209
+ const sse = await this.openEventStream(baseUrl);
210
+ const promptPromise = this.postPrompt(baseUrl, sessionID, contextualPrompt, callOpts)
211
+ .catch((err) => ({ error: err instanceof Error ? err : new Error(String(err)) }));
212
+ const timeoutMs = resolveTimeout();
213
+ const timeoutAt = Date.now() + timeoutMs;
214
+ let surfacedError = null;
215
+ try {
216
+ for await (const event of sse) {
217
+ if (Date.now() > timeoutAt) {
218
+ log.warn({ event: 'opencode.http.timeout', sessionID, timeoutMs }, 'http adapter timed out');
219
+ yield `\n\n⚠️ 处理超时(已超过 ${Math.round(timeoutMs / 60000)} 分钟)`;
220
+ return;
221
+ }
222
+ if (event.type === 'permission.asked') {
223
+ this.routeAsk(event, baseUrl, sessionID, callOpts);
224
+ continue;
225
+ }
226
+ const errEvent = this.isErrorEvent(event, sessionID);
227
+ if (errEvent) {
228
+ surfacedError = errEvent.error;
229
+ continue;
230
+ }
231
+ const { text } = this.inspectHttpEvent(event, sessionID, callOpts);
232
+ if (text)
233
+ yield text;
234
+ if (this.isIdleEvent(event, sessionID)) {
235
+ break;
236
+ }
237
+ }
238
+ }
239
+ finally {
240
+ sse.close();
241
+ }
242
+ const result = await promptPromise;
243
+ if (result && typeof result === 'object' && 'error' in result) {
244
+ log.warn({ event: 'opencode.http.prompt_failed', err: String(result.error) }, 'prompt POST failed');
245
+ yield `opencode failed: ${result.error.message}`;
246
+ return;
247
+ }
248
+ if (surfacedError) {
249
+ yield `opencode session error: ${surfacedError}`;
250
+ }
251
+ }
252
+ // ─── permission bridge ────────────────────────────────────────────────
253
+ /**
254
+ * Decide how to handle a `permission.asked` SSE event:
255
+ * - If `this.approvalBus` is set AND has a notifier installed AND the
256
+ * call carries enough IM context (threadId + platform) → register a
257
+ * synthetic pending so the user gets an IM card; the bus's resolve
258
+ * callback POSTs the decision back to opencode via /permission/.../reply.
259
+ * - Otherwise → fall back to `once`. Without an IM channel there's no
260
+ * human to ask, and a plain `reject` would surface as a tool-call
261
+ * failure mid-conversation which is worse UX than allowing.
262
+ *
263
+ * Fire-and-forget: the SSE loop must keep draining other events while the
264
+ * bridge waits for the user. The bus enforces its own timeout (5 min by
265
+ * default) so we never deadlock the SSE loop.
266
+ */
267
+ routeAsk(event, baseUrl, ocSessionID, opts) {
268
+ const props = event.properties ?? {};
269
+ const reqId = props.id;
270
+ if (typeof reqId !== 'string')
271
+ return;
272
+ const fallback = () => {
273
+ this.replyPermission(baseUrl, reqId, 'once').catch((err) => {
274
+ log.warn({ event: 'opencode.http.ask_fallback_failed', err: String(err), reqId });
275
+ });
276
+ };
277
+ const bus = this.approvalBus;
278
+ const canBridge = bus !== null && bus.hasNotifier()
279
+ && typeof opts.threadId === 'string' && opts.threadId.length > 0
280
+ && typeof opts.platform === 'string' && opts.platform.length > 0;
281
+ if (!canBridge) {
282
+ fallback();
283
+ return;
284
+ }
285
+ const ctx = {
286
+ threadId: opts.threadId,
287
+ platform: opts.platform,
288
+ userId: opts.userId ?? '',
289
+ channelId: opts.channelId ?? '',
290
+ };
291
+ const dispatch = (decision) => {
292
+ const wire = decisionToOpencodeReply(decision);
293
+ this.replyPermission(baseUrl, reqId, wire.reply, wire.message).catch((err) => {
294
+ log.warn({ event: 'opencode.http.ask_reply_failed', err: String(err), reqId });
295
+ });
296
+ };
297
+ bus.registerSyntheticPending({
298
+ runId: ocSessionID, // opencode session id IS the run id from the bus's POV
299
+ reqId,
300
+ toolName: typeof props.permission === 'string' ? props.permission : 'permission',
301
+ input: {
302
+ ...(Array.isArray(props.patterns) ? { patterns: props.patterns } : {}),
303
+ ...(props.metadata && typeof props.metadata === 'object' ? props.metadata : {}),
304
+ },
305
+ ctx,
306
+ dispatch,
307
+ }).catch((err) => {
308
+ // Bus rejected (e.g. notifier removed mid-flight). Safety: fall back.
309
+ log.warn({ event: 'opencode.http.bridge_register_failed', err: String(err), reqId });
310
+ fallback();
311
+ });
312
+ }
313
+ /**
314
+ * Build the session-level permission ruleset to append to opencode's
315
+ * agent defaults. See createSession's docstring for policy rationale.
316
+ *
317
+ * The returned rules are flat `{permission, pattern, action}` objects
318
+ * matching opencode's `Permission.Rule` schema.
319
+ */
320
+ buildSessionRuleset() {
321
+ const gate = (process.env.IMHUB_OPENCODE_GATE || 'medium').toLowerCase();
322
+ const ask = (permission) => ({ permission, pattern: '*', action: 'ask' });
323
+ if (gate === 'none')
324
+ return [];
325
+ if (gate === 'strict')
326
+ return [ask('edit'), ask('write'), ask('patch'), ask('bash')];
327
+ if (gate === 'loose')
328
+ return [ask('edit'), ask('write')];
329
+ return [ask('edit'), ask('write'), ask('patch')]; // medium (default)
330
+ }
331
+ /**
332
+ * PATCH a resumed session with our gate ruleset so subsequent tool calls
333
+ * surface as `permission.asked` events for the bridge. opencode's update
334
+ * endpoint merges (current + payload) — payload comes last and wins under
335
+ * findLast semantics. Idempotent across im-hub restarts but NOT within a
336
+ * single process: the caller (sendPrompt) gates on rulesetApplied.
337
+ */
338
+ async applyRuleset(baseUrl, sessionID) {
339
+ const ruleset = this.buildSessionRuleset();
340
+ if (ruleset.length === 0)
341
+ return; // gate=none
342
+ const res = await this.fetchImpl(`${baseUrl}/session/${sessionID}`, {
343
+ method: 'PATCH',
344
+ headers: { 'Content-Type': 'application/json' },
345
+ body: JSON.stringify({ permission: ruleset }),
346
+ });
347
+ if (!res.ok) {
348
+ throw new Error(`opencode session update failed: HTTP ${res.status}`);
349
+ }
350
+ await res.text().catch(() => '');
351
+ log.info({ event: 'opencode.http.ruleset_applied', sessionID, gate: process.env.IMHUB_OPENCODE_GATE || 'medium' }, 'applied gate ruleset to resumed session');
352
+ }
353
+ // ─── HTTP plumbing ──────────────────────────────────────────────────────
354
+ async createSession(baseUrl, opts) {
355
+ // Session-level permission overrides for IM-launched runs.
356
+ //
357
+ // Why we override at all:
358
+ // opencode's built-in `build` agent ships with a `*: allow` catch-all
359
+ // (agent.ts:86-103 in the upstream repo). With findLast semantics,
360
+ // that swallows mutating tools like edit/write/patch unless we
361
+ // *append* stricter rules whose specificity wins.
362
+ //
363
+ // The "medium" policy (default):
364
+ // - edit / write / patch → ask: any time the assistant wants to
365
+ // mutate files, surface an IM card. These are the operations a
366
+ // user wants to "拍板".
367
+ // - bash is intentionally NOT gated: IM-driven exploration involves
368
+ // a flood of `ls` / `cat` / `git status` and asking on every one
369
+ // would drown the user. Mutations the LLM does via bash (rm,
370
+ // npm install, git commit) aren't caught here — that's a known
371
+ // gap; revisit if it bites in practice.
372
+ // - external_directory is already `ask` by default for paths
373
+ // outside the cwd / skill whitelist; we don't need to repeat it
374
+ // and it would be surprising to override.
375
+ //
376
+ // Override path: env IMHUB_OPENCODE_GATE=strict|loose|none flips this
377
+ // policy without redeploy:
378
+ // strict → bash also asks
379
+ // loose → only write+edit (drop patch)
380
+ // none → no override (mostly for debugging)
381
+ const body = {
382
+ title: 'im-hub session',
383
+ };
384
+ // Plan mode: route through opencode's built-in `plan` agent and skip our
385
+ // medium-gate ruleset entirely (plan agent's edit-deny-except-plans
386
+ // policy is already stricter than the IM gate would impose).
387
+ if (opts.planMode) {
388
+ body.agent = 'plan';
389
+ }
390
+ else {
391
+ body.permission = this.buildSessionRuleset();
392
+ }
393
+ const res = await this.fetchImpl(`${baseUrl}/session`, {
394
+ method: 'POST',
395
+ headers: { 'Content-Type': 'application/json' },
396
+ body: JSON.stringify(body),
397
+ });
398
+ if (!res.ok) {
399
+ throw new Error(`opencode session create failed: HTTP ${res.status} ${await safeText(res)}`);
400
+ }
401
+ const json = await res.json();
402
+ if (!json.id)
403
+ throw new Error('opencode session create returned no id');
404
+ log.info({
405
+ event: 'opencode.http.session_created',
406
+ sessionID: json.id,
407
+ cwd: resolveAgentCwd('opencode', opts),
408
+ }, 'session created');
409
+ return json.id;
410
+ }
411
+ async postPrompt(baseUrl, sessionID, prompt, opts) {
412
+ const body = {
413
+ parts: [{ type: 'text', text: prompt }],
414
+ };
415
+ if (opts.model)
416
+ body.model = opts.model;
417
+ if (opts.variant)
418
+ body.variant = opts.variant;
419
+ // planMode forces the plan agent on every turn, including resumed sessions
420
+ // that were originally created under build. opencode's per-message `agent`
421
+ // field overrides the session's default agent for this single turn.
422
+ if (opts.planMode)
423
+ body.agent = 'plan';
424
+ const res = await this.fetchImpl(`${baseUrl}/session/${sessionID}/message`, {
425
+ method: 'POST',
426
+ headers: { 'Content-Type': 'application/json' },
427
+ body: JSON.stringify(body),
428
+ });
429
+ if (!res.ok) {
430
+ throw new Error(`opencode prompt failed: HTTP ${res.status} ${await safeText(res)}`);
431
+ }
432
+ // Drain the body to free the connection slot — events stream via SSE.
433
+ await res.text().catch(() => '');
434
+ }
435
+ async replyPermission(baseUrl, requestId, reply, message) {
436
+ const body = { reply };
437
+ if (reply === 'reject' && message)
438
+ body.message = message;
439
+ const res = await this.fetchImpl(`${baseUrl}/permission/${requestId}/reply`, {
440
+ method: 'POST',
441
+ headers: { 'Content-Type': 'application/json' },
442
+ body: JSON.stringify(body),
443
+ });
444
+ if (!res.ok) {
445
+ throw new Error(`opencode permission reply HTTP ${res.status}`);
446
+ }
447
+ }
448
+ async openEventStream(baseUrl) {
449
+ const res = await this.fetchImpl(`${baseUrl}/event`, {
450
+ headers: { Accept: 'text/event-stream' },
451
+ });
452
+ if (!res.ok || !res.body) {
453
+ throw new Error(`opencode event stream failed: HTTP ${res.status}`);
454
+ }
455
+ return new EventStream(res.body);
456
+ }
457
+ }
458
+ /**
459
+ * Map a bus Decision to opencode's permission.reply schema.
460
+ *
461
+ * Mapping rules:
462
+ * - allow → once (one-shot grant; matches what TUI sends)
463
+ * - allow + autoAllowFurther → once on the wire; the bus has already
464
+ * registered an im-side auto-allow rule by side effect (see
465
+ * ApprovalBus.cancelPending). We deliberately do NOT promote to
466
+ * opencode's `always` because that would persist a ruleset addition on
467
+ * the opencode session, which is heavier scope than the IM rule.
468
+ * - deny + message → reject (+ message). opencode surfaces this as a
469
+ * CorrectedError ("user rejected … with feedback"), giving the LLM a
470
+ * useful hint instead of a bare reject.
471
+ * - deny → reject
472
+ */
473
+ function decisionToOpencodeReply(decision) {
474
+ if (decision.behavior === 'allow')
475
+ return { reply: 'once' };
476
+ return decision.message
477
+ ? { reply: 'reject', message: decision.message }
478
+ : { reply: 'reject' };
479
+ }
480
+ function resolveTimeout() {
481
+ const raw = process.env.OPENCODE_TIMEOUT_MS;
482
+ if (raw) {
483
+ const n = parseInt(raw, 10);
484
+ if (Number.isFinite(n) && n > 0)
485
+ return n;
486
+ }
487
+ return DEFAULT_TIMEOUT_MS;
488
+ }
489
+ async function safeText(res) {
490
+ try {
491
+ return (await res.text()).slice(0, 500);
492
+ }
493
+ catch {
494
+ return '';
495
+ }
496
+ }
497
+ export class EventStream {
498
+ reader;
499
+ decoder = new TextDecoder('utf-8');
500
+ buf = '';
501
+ closed = false;
502
+ constructor(body) {
503
+ this.reader = body.getReader();
504
+ }
505
+ close() {
506
+ if (this.closed)
507
+ return;
508
+ this.closed = true;
509
+ try {
510
+ void this.reader.cancel();
511
+ }
512
+ catch { /* ignore */ }
513
+ }
514
+ async *[Symbol.asyncIterator]() {
515
+ while (!this.closed) {
516
+ const { value, done } = await this.reader.read();
517
+ if (done)
518
+ return;
519
+ if (!value)
520
+ continue;
521
+ this.buf += this.decoder.decode(value, { stream: true });
522
+ let idx;
523
+ while ((idx = this.buf.indexOf('\n\n')) !== -1) {
524
+ const frame = this.buf.slice(0, idx);
525
+ this.buf = this.buf.slice(idx + 2);
526
+ const evt = parseSseFrame(frame);
527
+ if (evt)
528
+ yield evt;
529
+ }
530
+ }
531
+ }
532
+ }
533
+ function parseSseFrame(frame) {
534
+ let payload = '';
535
+ for (const line of frame.split('\n')) {
536
+ if (line.startsWith('data:')) {
537
+ payload += line.slice(5).trimStart();
538
+ }
539
+ }
540
+ if (!payload)
541
+ return null;
542
+ try {
543
+ return JSON.parse(payload);
544
+ }
545
+ catch {
546
+ return null;
547
+ }
548
+ }
549
+ //# sourceMappingURL=opencode-http-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode-http-adapter.js","sourceRoot":"","sources":["../../../../src/plugins/agents/opencode/opencode-http-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { AgentBase, type SpawnPlan } from '../../../core/agent-base.js';
2
+ import type { AgentSendOpts } from '../../../core/types.js';
3
+ export declare class OpenCodeAdapter extends AgentBase {
4
+ readonly name = "opencode";
5
+ readonly aliases: string[];
6
+ protected buildArgs(prompt: string, opts: AgentSendOpts): string[];
7
+ /**
8
+ * opencode keys its per-project AGENTS.md and memory off the spawn cwd,
9
+ * so for IM calls we pin to ~/.im-hub-workspaces/opencode/. Non-IM calls
10
+ * (web/scheduler) keep cwd undefined and inherit im-hub's cwd, preserving
11
+ * the prior behavior. See agent-cwd.ts for full rationale.
12
+ */
13
+ protected prepareCommand(prompt: string, opts: AgentSendOpts): Promise<SpawnPlan>;
14
+ protected extractText(event: unknown): string;
15
+ /**
16
+ * Pull metadata out of every event:
17
+ * - `sessionID` on any event → bubble up via opts.onAgentSessionId so cli
18
+ * can persist it. Idempotent (the callback handles dedup).
19
+ * - `cost` / `tokens` on `step_finish` → bubble up via opts.onUsage so
20
+ * callAgentWithHistory can roll into /stats.
21
+ */
22
+ protected inspectEvent(event: unknown, opts: AgentSendOpts): void;
23
+ }
24
+ //# sourceMappingURL=opencode-stdio-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode-stdio-adapter.d.ts","sourceRoot":"","sources":["../../../../src/plugins/agents/opencode/opencode-stdio-adapter.ts"],"names":[],"mappings":"AA0BA,OAAO,EAAE,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,6BAA6B,CAAA;AACvE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAuB3D,qBAAa,eAAgB,SAAQ,SAAS;IAC5C,QAAQ,CAAC,IAAI,cAAa;IAC1B,QAAQ,CAAC,OAAO,WAAuB;IAEvC,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,MAAM,EAAE;IAelE;;;;;OAKG;cACa,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC;IAOvF,SAAS,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM;IAO7C;;;;;;OAMG;IACH,SAAS,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,GAAG,IAAI;CAiBlE"}