agim-cli 1.0.1

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 (453) hide show
  1. package/CHANGELOG.md +1234 -0
  2. package/LICENSE +21 -0
  3. package/README.md +422 -0
  4. package/README.zh-CN.md +414 -0
  5. package/dist/cli-ui/cmd-handlers.d.ts +11 -0
  6. package/dist/cli-ui/cmd-handlers.d.ts.map +1 -0
  7. package/dist/cli-ui/cmd-handlers.js +240 -0
  8. package/dist/cli-ui/cmd-handlers.js.map +1 -0
  9. package/dist/cli-ui/config-wizard.d.ts +3 -0
  10. package/dist/cli-ui/config-wizard.d.ts.map +1 -0
  11. package/dist/cli-ui/config-wizard.js +851 -0
  12. package/dist/cli-ui/config-wizard.js.map +1 -0
  13. package/dist/cli-ui/entry-menu.d.ts +28 -0
  14. package/dist/cli-ui/entry-menu.d.ts.map +1 -0
  15. package/dist/cli-ui/entry-menu.js +50 -0
  16. package/dist/cli-ui/entry-menu.js.map +1 -0
  17. package/dist/cli-ui/env-file.d.ts +35 -0
  18. package/dist/cli-ui/env-file.d.ts.map +1 -0
  19. package/dist/cli-ui/env-file.js +163 -0
  20. package/dist/cli-ui/env-file.js.map +1 -0
  21. package/dist/cli-ui/i18n.d.ts +204 -0
  22. package/dist/cli-ui/i18n.d.ts.map +1 -0
  23. package/dist/cli-ui/i18n.js +455 -0
  24. package/dist/cli-ui/i18n.js.map +1 -0
  25. package/dist/cli-ui/lang-picker.d.ts +10 -0
  26. package/dist/cli-ui/lang-picker.d.ts.map +1 -0
  27. package/dist/cli-ui/lang-picker.js +33 -0
  28. package/dist/cli-ui/lang-picker.js.map +1 -0
  29. package/dist/cli-ui/paths.d.ts +4 -0
  30. package/dist/cli-ui/paths.d.ts.map +1 -0
  31. package/dist/cli-ui/paths.js +11 -0
  32. package/dist/cli-ui/paths.js.map +1 -0
  33. package/dist/cli-ui/prompts.d.ts +65 -0
  34. package/dist/cli-ui/prompts.d.ts.map +1 -0
  35. package/dist/cli-ui/prompts.js +125 -0
  36. package/dist/cli-ui/prompts.js.map +1 -0
  37. package/dist/cli-ui/service.d.ts +41 -0
  38. package/dist/cli-ui/service.d.ts.map +1 -0
  39. package/dist/cli-ui/service.js +241 -0
  40. package/dist/cli-ui/service.js.map +1 -0
  41. package/dist/cli.d.ts +3 -0
  42. package/dist/cli.d.ts.map +1 -0
  43. package/dist/cli.js +1143 -0
  44. package/dist/cli.js.map +1 -0
  45. package/dist/core/acp-server.d.ts +8 -0
  46. package/dist/core/acp-server.d.ts.map +1 -0
  47. package/dist/core/acp-server.js +266 -0
  48. package/dist/core/acp-server.js.map +1 -0
  49. package/dist/core/agent-base.d.ts +94 -0
  50. package/dist/core/agent-base.d.ts.map +1 -0
  51. package/dist/core/agent-base.js +373 -0
  52. package/dist/core/agent-base.js.map +1 -0
  53. package/dist/core/agent-cwd.d.ts +48 -0
  54. package/dist/core/agent-cwd.d.ts.map +1 -0
  55. package/dist/core/agent-cwd.js +181 -0
  56. package/dist/core/agent-cwd.js.map +1 -0
  57. package/dist/core/agent-helper.d.ts +65 -0
  58. package/dist/core/agent-helper.d.ts.map +1 -0
  59. package/dist/core/agent-helper.js +150 -0
  60. package/dist/core/agent-helper.js.map +1 -0
  61. package/dist/core/agim-paths.d.ts +10 -0
  62. package/dist/core/agim-paths.d.ts.map +1 -0
  63. package/dist/core/agim-paths.js +64 -0
  64. package/dist/core/agim-paths.js.map +1 -0
  65. package/dist/core/approval-bus.d.ts +300 -0
  66. package/dist/core/approval-bus.d.ts.map +1 -0
  67. package/dist/core/approval-bus.js +990 -0
  68. package/dist/core/approval-bus.js.map +1 -0
  69. package/dist/core/approval-router.d.ts +101 -0
  70. package/dist/core/approval-router.d.ts.map +1 -0
  71. package/dist/core/approval-router.js +540 -0
  72. package/dist/core/approval-router.js.map +1 -0
  73. package/dist/core/audit-log.d.ts +55 -0
  74. package/dist/core/audit-log.d.ts.map +1 -0
  75. package/dist/core/audit-log.js +203 -0
  76. package/dist/core/audit-log.js.map +1 -0
  77. package/dist/core/bgjob-reader.d.ts +65 -0
  78. package/dist/core/bgjob-reader.d.ts.map +1 -0
  79. package/dist/core/bgjob-reader.js +212 -0
  80. package/dist/core/bgjob-reader.js.map +1 -0
  81. package/dist/core/circuit-breaker.d.ts +37 -0
  82. package/dist/core/circuit-breaker.d.ts.map +1 -0
  83. package/dist/core/circuit-breaker.js +115 -0
  84. package/dist/core/circuit-breaker.js.map +1 -0
  85. package/dist/core/commands/agent.d.ts +4 -0
  86. package/dist/core/commands/agent.d.ts.map +1 -0
  87. package/dist/core/commands/agent.js +40 -0
  88. package/dist/core/commands/agent.js.map +1 -0
  89. package/dist/core/commands/approval.d.ts +3 -0
  90. package/dist/core/commands/approval.d.ts.map +1 -0
  91. package/dist/core/commands/approval.js +85 -0
  92. package/dist/core/commands/approval.js.map +1 -0
  93. package/dist/core/commands/audit.d.ts +3 -0
  94. package/dist/core/commands/audit.d.ts.map +1 -0
  95. package/dist/core/commands/audit.js +84 -0
  96. package/dist/core/commands/audit.js.map +1 -0
  97. package/dist/core/commands/builtin.d.ts +3 -0
  98. package/dist/core/commands/builtin.d.ts.map +1 -0
  99. package/dist/core/commands/builtin.js +304 -0
  100. package/dist/core/commands/builtin.js.map +1 -0
  101. package/dist/core/commands/cron.d.ts +3 -0
  102. package/dist/core/commands/cron.d.ts.map +1 -0
  103. package/dist/core/commands/cron.js +128 -0
  104. package/dist/core/commands/cron.js.map +1 -0
  105. package/dist/core/commands/job.d.ts +3 -0
  106. package/dist/core/commands/job.d.ts.map +1 -0
  107. package/dist/core/commands/job.js +195 -0
  108. package/dist/core/commands/job.js.map +1 -0
  109. package/dist/core/commands/memo.d.ts +3 -0
  110. package/dist/core/commands/memo.d.ts.map +1 -0
  111. package/dist/core/commands/memo.js +151 -0
  112. package/dist/core/commands/memo.js.map +1 -0
  113. package/dist/core/commands/model.d.ts +9 -0
  114. package/dist/core/commands/model.d.ts.map +1 -0
  115. package/dist/core/commands/model.js +183 -0
  116. package/dist/core/commands/model.js.map +1 -0
  117. package/dist/core/commands/plan.d.ts +3 -0
  118. package/dist/core/commands/plan.d.ts.map +1 -0
  119. package/dist/core/commands/plan.js +75 -0
  120. package/dist/core/commands/plan.js.map +1 -0
  121. package/dist/core/commands/remind.d.ts +3 -0
  122. package/dist/core/commands/remind.d.ts.map +1 -0
  123. package/dist/core/commands/remind.js +271 -0
  124. package/dist/core/commands/remind.js.map +1 -0
  125. package/dist/core/commands/router.d.ts +3 -0
  126. package/dist/core/commands/router.d.ts.map +1 -0
  127. package/dist/core/commands/router.js +71 -0
  128. package/dist/core/commands/router.js.map +1 -0
  129. package/dist/core/commands/sessions.d.ts +3 -0
  130. package/dist/core/commands/sessions.d.ts.map +1 -0
  131. package/dist/core/commands/sessions.js +88 -0
  132. package/dist/core/commands/sessions.js.map +1 -0
  133. package/dist/core/commands/stats.d.ts +3 -0
  134. package/dist/core/commands/stats.d.ts.map +1 -0
  135. package/dist/core/commands/stats.js +73 -0
  136. package/dist/core/commands/stats.js.map +1 -0
  137. package/dist/core/commands/think.d.ts +3 -0
  138. package/dist/core/commands/think.d.ts.map +1 -0
  139. package/dist/core/commands/think.js +28 -0
  140. package/dist/core/commands/think.js.map +1 -0
  141. package/dist/core/commands/workspaces.d.ts +3 -0
  142. package/dist/core/commands/workspaces.d.ts.map +1 -0
  143. package/dist/core/commands/workspaces.js +47 -0
  144. package/dist/core/commands/workspaces.js.map +1 -0
  145. package/dist/core/config-schema.d.ts +60 -0
  146. package/dist/core/config-schema.d.ts.map +1 -0
  147. package/dist/core/config-schema.js +75 -0
  148. package/dist/core/config-schema.js.map +1 -0
  149. package/dist/core/coord-systems.d.ts +65 -0
  150. package/dist/core/coord-systems.d.ts.map +1 -0
  151. package/dist/core/coord-systems.js +229 -0
  152. package/dist/core/coord-systems.js.map +1 -0
  153. package/dist/core/cron.d.ts +29 -0
  154. package/dist/core/cron.d.ts.map +1 -0
  155. package/dist/core/cron.js +184 -0
  156. package/dist/core/cron.js.map +1 -0
  157. package/dist/core/event-bus.d.ts +80 -0
  158. package/dist/core/event-bus.d.ts.map +1 -0
  159. package/dist/core/event-bus.js +62 -0
  160. package/dist/core/event-bus.js.map +1 -0
  161. package/dist/core/intent-llm.d.ts +27 -0
  162. package/dist/core/intent-llm.d.ts.map +1 -0
  163. package/dist/core/intent-llm.js +170 -0
  164. package/dist/core/intent-llm.js.map +1 -0
  165. package/dist/core/intent.d.ts +12 -0
  166. package/dist/core/intent.d.ts.map +1 -0
  167. package/dist/core/intent.js +187 -0
  168. package/dist/core/intent.js.map +1 -0
  169. package/dist/core/job-board.d.ts +82 -0
  170. package/dist/core/job-board.d.ts.map +1 -0
  171. package/dist/core/job-board.js +379 -0
  172. package/dist/core/job-board.js.map +1 -0
  173. package/dist/core/location-context.d.ts +32 -0
  174. package/dist/core/location-context.d.ts.map +1 -0
  175. package/dist/core/location-context.js +69 -0
  176. package/dist/core/location-context.js.map +1 -0
  177. package/dist/core/location-token.d.ts +57 -0
  178. package/dist/core/location-token.d.ts.map +1 -0
  179. package/dist/core/location-token.js +128 -0
  180. package/dist/core/location-token.js.map +1 -0
  181. package/dist/core/logger.d.ts +6 -0
  182. package/dist/core/logger.d.ts.map +1 -0
  183. package/dist/core/logger.js +54 -0
  184. package/dist/core/logger.js.map +1 -0
  185. package/dist/core/memo-rpc.d.ts +13 -0
  186. package/dist/core/memo-rpc.d.ts.map +1 -0
  187. package/dist/core/memo-rpc.js +288 -0
  188. package/dist/core/memo-rpc.js.map +1 -0
  189. package/dist/core/memos.d.ts +163 -0
  190. package/dist/core/memos.d.ts.map +1 -0
  191. package/dist/core/memos.js +502 -0
  192. package/dist/core/memos.js.map +1 -0
  193. package/dist/core/metrics.d.ts +55 -0
  194. package/dist/core/metrics.d.ts.map +1 -0
  195. package/dist/core/metrics.js +291 -0
  196. package/dist/core/metrics.js.map +1 -0
  197. package/dist/core/onboarding.d.ts +99 -0
  198. package/dist/core/onboarding.d.ts.map +1 -0
  199. package/dist/core/onboarding.js +426 -0
  200. package/dist/core/onboarding.js.map +1 -0
  201. package/dist/core/pending-reminder.d.ts +25 -0
  202. package/dist/core/pending-reminder.d.ts.map +1 -0
  203. package/dist/core/pending-reminder.js +53 -0
  204. package/dist/core/pending-reminder.js.map +1 -0
  205. package/dist/core/rate-limiter.d.ts +44 -0
  206. package/dist/core/rate-limiter.d.ts.map +1 -0
  207. package/dist/core/rate-limiter.js +115 -0
  208. package/dist/core/rate-limiter.js.map +1 -0
  209. package/dist/core/registry.d.ts +32 -0
  210. package/dist/core/registry.d.ts.map +1 -0
  211. package/dist/core/registry.js +126 -0
  212. package/dist/core/registry.js.map +1 -0
  213. package/dist/core/remind-intent.d.ts +25 -0
  214. package/dist/core/remind-intent.d.ts.map +1 -0
  215. package/dist/core/remind-intent.js +196 -0
  216. package/dist/core/remind-intent.js.map +1 -0
  217. package/dist/core/reminder-rpc.d.ts +17 -0
  218. package/dist/core/reminder-rpc.d.ts.map +1 -0
  219. package/dist/core/reminder-rpc.js +169 -0
  220. package/dist/core/reminder-rpc.js.map +1 -0
  221. package/dist/core/reminders.d.ts +159 -0
  222. package/dist/core/reminders.d.ts.map +1 -0
  223. package/dist/core/reminders.js +977 -0
  224. package/dist/core/reminders.js.map +1 -0
  225. package/dist/core/router.d.ts +55 -0
  226. package/dist/core/router.d.ts.map +1 -0
  227. package/dist/core/router.js +497 -0
  228. package/dist/core/router.js.map +1 -0
  229. package/dist/core/schedule.d.ts +65 -0
  230. package/dist/core/schedule.d.ts.map +1 -0
  231. package/dist/core/schedule.js +323 -0
  232. package/dist/core/schedule.js.map +1 -0
  233. package/dist/core/session.d.ts +182 -0
  234. package/dist/core/session.d.ts.map +1 -0
  235. package/dist/core/session.js +807 -0
  236. package/dist/core/session.js.map +1 -0
  237. package/dist/core/sqlite-helper.d.ts +37 -0
  238. package/dist/core/sqlite-helper.d.ts.map +1 -0
  239. package/dist/core/sqlite-helper.js +79 -0
  240. package/dist/core/sqlite-helper.js.map +1 -0
  241. package/dist/core/transcribe.d.ts +25 -0
  242. package/dist/core/transcribe.d.ts.map +1 -0
  243. package/dist/core/transcribe.js +217 -0
  244. package/dist/core/transcribe.js.map +1 -0
  245. package/dist/core/types.d.ts +360 -0
  246. package/dist/core/types.d.ts.map +1 -0
  247. package/dist/core/types.js +3 -0
  248. package/dist/core/types.js.map +1 -0
  249. package/dist/core/workspace.d.ts +67 -0
  250. package/dist/core/workspace.d.ts.map +1 -0
  251. package/dist/core/workspace.js +113 -0
  252. package/dist/core/workspace.js.map +1 -0
  253. package/dist/index.d.ts +5 -0
  254. package/dist/index.d.ts.map +1 -0
  255. package/dist/index.js +6 -0
  256. package/dist/index.js.map +1 -0
  257. package/dist/plugins/agents/acp/acp-adapter.d.ts +16 -0
  258. package/dist/plugins/agents/acp/acp-adapter.d.ts.map +1 -0
  259. package/dist/plugins/agents/acp/acp-adapter.js +49 -0
  260. package/dist/plugins/agents/acp/acp-adapter.js.map +1 -0
  261. package/dist/plugins/agents/acp/acp-client.d.ts +32 -0
  262. package/dist/plugins/agents/acp/acp-client.d.ts.map +1 -0
  263. package/dist/plugins/agents/acp/acp-client.js +177 -0
  264. package/dist/plugins/agents/acp/acp-client.js.map +1 -0
  265. package/dist/plugins/agents/acp/discovery.d.ts +19 -0
  266. package/dist/plugins/agents/acp/discovery.d.ts.map +1 -0
  267. package/dist/plugins/agents/acp/discovery.js +111 -0
  268. package/dist/plugins/agents/acp/discovery.js.map +1 -0
  269. package/dist/plugins/agents/acp/index.d.ts +4 -0
  270. package/dist/plugins/agents/acp/index.d.ts.map +1 -0
  271. package/dist/plugins/agents/acp/index.js +4 -0
  272. package/dist/plugins/agents/acp/index.js.map +1 -0
  273. package/dist/plugins/agents/acp/types.d.ts +62 -0
  274. package/dist/plugins/agents/acp/types.d.ts.map +1 -0
  275. package/dist/plugins/agents/acp/types.js +5 -0
  276. package/dist/plugins/agents/acp/types.js.map +1 -0
  277. package/dist/plugins/agents/claude-code/index.d.ts +25 -0
  278. package/dist/plugins/agents/claude-code/index.d.ts.map +1 -0
  279. package/dist/plugins/agents/claude-code/index.js +184 -0
  280. package/dist/plugins/agents/claude-code/index.js.map +1 -0
  281. package/dist/plugins/agents/claude-code/mcp-approval-server.d.ts +59 -0
  282. package/dist/plugins/agents/claude-code/mcp-approval-server.d.ts.map +1 -0
  283. package/dist/plugins/agents/claude-code/mcp-approval-server.js +645 -0
  284. package/dist/plugins/agents/claude-code/mcp-approval-server.js.map +1 -0
  285. package/dist/plugins/agents/codex/build-mcp-cli-args.d.ts +28 -0
  286. package/dist/plugins/agents/codex/build-mcp-cli-args.d.ts.map +1 -0
  287. package/dist/plugins/agents/codex/build-mcp-cli-args.js +74 -0
  288. package/dist/plugins/agents/codex/build-mcp-cli-args.js.map +1 -0
  289. package/dist/plugins/agents/codex/index.d.ts +53 -0
  290. package/dist/plugins/agents/codex/index.d.ts.map +1 -0
  291. package/dist/plugins/agents/codex/index.js +341 -0
  292. package/dist/plugins/agents/codex/index.js.map +1 -0
  293. package/dist/plugins/agents/copilot/index.d.ts +35 -0
  294. package/dist/plugins/agents/copilot/index.d.ts.map +1 -0
  295. package/dist/plugins/agents/copilot/index.js +182 -0
  296. package/dist/plugins/agents/copilot/index.js.map +1 -0
  297. package/dist/plugins/agents/opencode/ensure-mcp-config.d.ts +11 -0
  298. package/dist/plugins/agents/opencode/ensure-mcp-config.d.ts.map +1 -0
  299. package/dist/plugins/agents/opencode/ensure-mcp-config.js +100 -0
  300. package/dist/plugins/agents/opencode/ensure-mcp-config.js.map +1 -0
  301. package/dist/plugins/agents/opencode/index.d.ts +5 -0
  302. package/dist/plugins/agents/opencode/index.d.ts.map +1 -0
  303. package/dist/plugins/agents/opencode/index.js +30 -0
  304. package/dist/plugins/agents/opencode/index.js.map +1 -0
  305. package/dist/plugins/agents/opencode/opencode-http-adapter.d.ts +166 -0
  306. package/dist/plugins/agents/opencode/opencode-http-adapter.d.ts.map +1 -0
  307. package/dist/plugins/agents/opencode/opencode-http-adapter.js +682 -0
  308. package/dist/plugins/agents/opencode/opencode-http-adapter.js.map +1 -0
  309. package/dist/plugins/agents/opencode/opencode-stdio-adapter.d.ts +32 -0
  310. package/dist/plugins/agents/opencode/opencode-stdio-adapter.d.ts.map +1 -0
  311. package/dist/plugins/agents/opencode/opencode-stdio-adapter.js +137 -0
  312. package/dist/plugins/agents/opencode/opencode-stdio-adapter.js.map +1 -0
  313. package/dist/plugins/agents/opencode/serve-manager.d.ts +27 -0
  314. package/dist/plugins/agents/opencode/serve-manager.d.ts.map +1 -0
  315. package/dist/plugins/agents/opencode/serve-manager.js +194 -0
  316. package/dist/plugins/agents/opencode/serve-manager.js.map +1 -0
  317. package/dist/plugins/messengers/dingtalk/dingtalk-adapter.d.ts +57 -0
  318. package/dist/plugins/messengers/dingtalk/dingtalk-adapter.d.ts.map +1 -0
  319. package/dist/plugins/messengers/dingtalk/dingtalk-adapter.js +409 -0
  320. package/dist/plugins/messengers/dingtalk/dingtalk-adapter.js.map +1 -0
  321. package/dist/plugins/messengers/dingtalk/dingtalk-client.d.ts +48 -0
  322. package/dist/plugins/messengers/dingtalk/dingtalk-client.d.ts.map +1 -0
  323. package/dist/plugins/messengers/dingtalk/dingtalk-client.js +236 -0
  324. package/dist/plugins/messengers/dingtalk/dingtalk-client.js.map +1 -0
  325. package/dist/plugins/messengers/dingtalk/index.d.ts +3 -0
  326. package/dist/plugins/messengers/dingtalk/index.d.ts.map +1 -0
  327. package/dist/plugins/messengers/dingtalk/index.js +3 -0
  328. package/dist/plugins/messengers/dingtalk/index.js.map +1 -0
  329. package/dist/plugins/messengers/dingtalk/link-coords.d.ts +23 -0
  330. package/dist/plugins/messengers/dingtalk/link-coords.d.ts.map +1 -0
  331. package/dist/plugins/messengers/dingtalk/link-coords.js +89 -0
  332. package/dist/plugins/messengers/dingtalk/link-coords.js.map +1 -0
  333. package/dist/plugins/messengers/dingtalk/media-store.d.ts +16 -0
  334. package/dist/plugins/messengers/dingtalk/media-store.d.ts.map +1 -0
  335. package/dist/plugins/messengers/dingtalk/media-store.js +77 -0
  336. package/dist/plugins/messengers/dingtalk/media-store.js.map +1 -0
  337. package/dist/plugins/messengers/dingtalk/types.d.ts +82 -0
  338. package/dist/plugins/messengers/dingtalk/types.d.ts.map +1 -0
  339. package/dist/plugins/messengers/dingtalk/types.js +14 -0
  340. package/dist/plugins/messengers/dingtalk/types.js.map +1 -0
  341. package/dist/plugins/messengers/discord/discord-adapter.d.ts +21 -0
  342. package/dist/plugins/messengers/discord/discord-adapter.d.ts.map +1 -0
  343. package/dist/plugins/messengers/discord/discord-adapter.js +238 -0
  344. package/dist/plugins/messengers/discord/discord-adapter.js.map +1 -0
  345. package/dist/plugins/messengers/discord/index.d.ts +4 -0
  346. package/dist/plugins/messengers/discord/index.d.ts.map +1 -0
  347. package/dist/plugins/messengers/discord/index.js +4 -0
  348. package/dist/plugins/messengers/discord/index.js.map +1 -0
  349. package/dist/plugins/messengers/discord/markdown-to-discord.d.ts +11 -0
  350. package/dist/plugins/messengers/discord/markdown-to-discord.d.ts.map +1 -0
  351. package/dist/plugins/messengers/discord/markdown-to-discord.js +59 -0
  352. package/dist/plugins/messengers/discord/markdown-to-discord.js.map +1 -0
  353. package/dist/plugins/messengers/discord/types.d.ts +9 -0
  354. package/dist/plugins/messengers/discord/types.d.ts.map +1 -0
  355. package/dist/plugins/messengers/discord/types.js +3 -0
  356. package/dist/plugins/messengers/discord/types.js.map +1 -0
  357. package/dist/plugins/messengers/email/email-adapter.d.ts +33 -0
  358. package/dist/plugins/messengers/email/email-adapter.d.ts.map +1 -0
  359. package/dist/plugins/messengers/email/email-adapter.js +137 -0
  360. package/dist/plugins/messengers/email/email-adapter.js.map +1 -0
  361. package/dist/plugins/messengers/feishu/card-builder.d.ts +23 -0
  362. package/dist/plugins/messengers/feishu/card-builder.d.ts.map +1 -0
  363. package/dist/plugins/messengers/feishu/card-builder.js +89 -0
  364. package/dist/plugins/messengers/feishu/card-builder.js.map +1 -0
  365. package/dist/plugins/messengers/feishu/feishu-adapter.d.ts +23 -0
  366. package/dist/plugins/messengers/feishu/feishu-adapter.d.ts.map +1 -0
  367. package/dist/plugins/messengers/feishu/feishu-adapter.js +250 -0
  368. package/dist/plugins/messengers/feishu/feishu-adapter.js.map +1 -0
  369. package/dist/plugins/messengers/feishu/feishu-client.d.ts +43 -0
  370. package/dist/plugins/messengers/feishu/feishu-client.d.ts.map +1 -0
  371. package/dist/plugins/messengers/feishu/feishu-client.js +118 -0
  372. package/dist/plugins/messengers/feishu/feishu-client.js.map +1 -0
  373. package/dist/plugins/messengers/feishu/index.d.ts +4 -0
  374. package/dist/plugins/messengers/feishu/index.d.ts.map +1 -0
  375. package/dist/plugins/messengers/feishu/index.js +4 -0
  376. package/dist/plugins/messengers/feishu/index.js.map +1 -0
  377. package/dist/plugins/messengers/feishu/types.d.ts +113 -0
  378. package/dist/plugins/messengers/feishu/types.d.ts.map +1 -0
  379. package/dist/plugins/messengers/feishu/types.js +4 -0
  380. package/dist/plugins/messengers/feishu/types.js.map +1 -0
  381. package/dist/plugins/messengers/telegram/index.d.ts +4 -0
  382. package/dist/plugins/messengers/telegram/index.d.ts.map +1 -0
  383. package/dist/plugins/messengers/telegram/index.js +4 -0
  384. package/dist/plugins/messengers/telegram/index.js.map +1 -0
  385. package/dist/plugins/messengers/telegram/markdown-to-html.d.ts +5 -0
  386. package/dist/plugins/messengers/telegram/markdown-to-html.d.ts.map +1 -0
  387. package/dist/plugins/messengers/telegram/markdown-to-html.js +186 -0
  388. package/dist/plugins/messengers/telegram/markdown-to-html.js.map +1 -0
  389. package/dist/plugins/messengers/telegram/media-download.d.ts +59 -0
  390. package/dist/plugins/messengers/telegram/media-download.d.ts.map +1 -0
  391. package/dist/plugins/messengers/telegram/media-download.js +228 -0
  392. package/dist/plugins/messengers/telegram/media-download.js.map +1 -0
  393. package/dist/plugins/messengers/telegram/telegram-adapter.d.ts +77 -0
  394. package/dist/plugins/messengers/telegram/telegram-adapter.d.ts.map +1 -0
  395. package/dist/plugins/messengers/telegram/telegram-adapter.js +880 -0
  396. package/dist/plugins/messengers/telegram/telegram-adapter.js.map +1 -0
  397. package/dist/plugins/messengers/telegram/types.d.ts +47 -0
  398. package/dist/plugins/messengers/telegram/types.d.ts.map +1 -0
  399. package/dist/plugins/messengers/telegram/types.js +3 -0
  400. package/dist/plugins/messengers/telegram/types.js.map +1 -0
  401. package/dist/plugins/messengers/wechat/context-store.d.ts +18 -0
  402. package/dist/plugins/messengers/wechat/context-store.d.ts.map +1 -0
  403. package/dist/plugins/messengers/wechat/context-store.js +105 -0
  404. package/dist/plugins/messengers/wechat/context-store.js.map +1 -0
  405. package/dist/plugins/messengers/wechat/ilink-adapter.d.ts +71 -0
  406. package/dist/plugins/messengers/wechat/ilink-adapter.d.ts.map +1 -0
  407. package/dist/plugins/messengers/wechat/ilink-adapter.js +664 -0
  408. package/dist/plugins/messengers/wechat/ilink-adapter.js.map +1 -0
  409. package/dist/plugins/messengers/wechat/ilink-client.d.ts +75 -0
  410. package/dist/plugins/messengers/wechat/ilink-client.d.ts.map +1 -0
  411. package/dist/plugins/messengers/wechat/ilink-client.js +331 -0
  412. package/dist/plugins/messengers/wechat/ilink-client.js.map +1 -0
  413. package/dist/plugins/messengers/wechat/ilink-types.d.ts +181 -0
  414. package/dist/plugins/messengers/wechat/ilink-types.d.ts.map +1 -0
  415. package/dist/plugins/messengers/wechat/ilink-types.js +22 -0
  416. package/dist/plugins/messengers/wechat/ilink-types.js.map +1 -0
  417. package/dist/plugins/messengers/wechat/media-download.d.ts +32 -0
  418. package/dist/plugins/messengers/wechat/media-download.d.ts.map +1 -0
  419. package/dist/plugins/messengers/wechat/media-download.js +78 -0
  420. package/dist/plugins/messengers/wechat/media-download.js.map +1 -0
  421. package/dist/scripts/migrate-gcj02-to-wgs84.d.ts +3 -0
  422. package/dist/scripts/migrate-gcj02-to-wgs84.d.ts.map +1 -0
  423. package/dist/scripts/migrate-gcj02-to-wgs84.js +52 -0
  424. package/dist/scripts/migrate-gcj02-to-wgs84.js.map +1 -0
  425. package/dist/utils/backoff.d.ts +35 -0
  426. package/dist/utils/backoff.d.ts.map +1 -0
  427. package/dist/utils/backoff.js +59 -0
  428. package/dist/utils/backoff.js.map +1 -0
  429. package/dist/utils/cross-platform.d.ts +26 -0
  430. package/dist/utils/cross-platform.d.ts.map +1 -0
  431. package/dist/utils/cross-platform.js +58 -0
  432. package/dist/utils/cross-platform.js.map +1 -0
  433. package/dist/utils/message-split.d.ts +14 -0
  434. package/dist/utils/message-split.d.ts.map +1 -0
  435. package/dist/utils/message-split.js +65 -0
  436. package/dist/utils/message-split.js.map +1 -0
  437. package/dist/utils/safe-equal.d.ts +2 -0
  438. package/dist/utils/safe-equal.d.ts.map +1 -0
  439. package/dist/utils/safe-equal.js +11 -0
  440. package/dist/utils/safe-equal.js.map +1 -0
  441. package/dist/web/public/_app.js +196 -0
  442. package/dist/web/public/index.html +936 -0
  443. package/dist/web/public/loc.html +305 -0
  444. package/dist/web/public/login.html +106 -0
  445. package/dist/web/public/memos.html +271 -0
  446. package/dist/web/public/reminders.html +234 -0
  447. package/dist/web/public/settings.html +1355 -0
  448. package/dist/web/public/tasks.html +1835 -0
  449. package/dist/web/server.d.ts +12 -0
  450. package/dist/web/server.d.ts.map +1 -0
  451. package/dist/web/server.js +2399 -0
  452. package/dist/web/server.js.map +1 -0
  453. package/package.json +92 -0
@@ -0,0 +1,182 @@
1
+ // GitHub Copilot CLI agent adapter
2
+ // Supports multiple installation methods:
3
+ // 1. GitHub CLI extension: `gh copilot` (recommended)
4
+ // 2. Standalone npm: `copilot` command
5
+ // 3. VS Code extension: bundled copilot CLI
6
+ // 4. Homebrew (macOS): `brew install copilot-cli`
7
+ // 5. WinGet (Windows): `winget install GitHub.Copilot`
8
+ import { access, constants, readdir } from 'node:fs/promises';
9
+ import { homedir } from 'node:os';
10
+ import { join } from 'node:path';
11
+ import { AgentBase } from '../../../core/agent-base.js';
12
+ import { crossSpawn, isWindows, isMac } from '../../../utils/cross-platform.js';
13
+ import { logger as rootLogger } from '../../../core/logger.js';
14
+ /** Check if a command exists and can be executed */
15
+ async function commandExists(cmd) {
16
+ return new Promise((resolve) => {
17
+ const proc = crossSpawn(cmd, ['--version'], { stdio: 'ignore' });
18
+ proc.on('error', () => resolve(false));
19
+ proc.on('close', (code) => resolve(code === 0));
20
+ });
21
+ }
22
+ async function checkGHCopilot() {
23
+ if (!(await commandExists('gh')))
24
+ return null;
25
+ return new Promise((resolve) => {
26
+ const proc = crossSpawn('gh', ['copilot', '--version'], { stdio: 'ignore' });
27
+ proc.on('error', () => resolve(null));
28
+ proc.on('close', (code) => {
29
+ if (code === 0) {
30
+ resolve({ type: 'gh-ext', command: 'gh', argsPrefix: ['copilot'] });
31
+ }
32
+ else {
33
+ resolve(null);
34
+ }
35
+ });
36
+ });
37
+ }
38
+ async function checkStandaloneCopilot() {
39
+ if (await commandExists('copilot')) {
40
+ return { type: 'standalone', command: 'copilot', argsPrefix: [] };
41
+ }
42
+ return null;
43
+ }
44
+ async function findVSCodeCopilot() {
45
+ if (isMac) {
46
+ const macPath = join(homedir(), 'Library/Application Support/Code/User/globalStorage/github.copilot-chat/copilotCli/copilot');
47
+ try {
48
+ await access(macPath, constants.X_OK);
49
+ return { type: 'vscode', command: macPath, argsPrefix: [] };
50
+ }
51
+ catch { /* fall through */ }
52
+ }
53
+ if (isWindows) {
54
+ const extensionsDir = join(homedir(), '.vscode', 'extensions');
55
+ try {
56
+ const entries = await readdir(extensionsDir, { withFileTypes: true });
57
+ const copilotDir = entries.find((entry) => entry.isDirectory() && entry.name.startsWith('github.copilot-chat-'));
58
+ if (copilotDir) {
59
+ const copilotBin = join(extensionsDir, copilotDir.name, 'copilotCli', 'copilot.exe');
60
+ try {
61
+ await access(copilotBin, constants.X_OK);
62
+ return { type: 'vscode', command: copilotBin, argsPrefix: [] };
63
+ }
64
+ catch { /* fall through */ }
65
+ }
66
+ }
67
+ catch { /* ignore readdir errors */ }
68
+ }
69
+ const linuxPath = join(homedir(), '.vscode/extensions/github.copilot-chat/copilotCli/copilot');
70
+ try {
71
+ await access(linuxPath, constants.X_OK);
72
+ return { type: 'vscode', command: linuxPath, argsPrefix: [] };
73
+ }
74
+ catch {
75
+ return null;
76
+ }
77
+ }
78
+ /** TTL'd installation cache so a fresh install is picked up within 2min. */
79
+ const INSTALL_CACHE_TTL = 2 * 60 * 1000;
80
+ let cachedInstall = null;
81
+ let cachedAt = 0;
82
+ async function detectCopilotInstall() {
83
+ if (cachedInstall && Date.now() - cachedAt < INSTALL_CACHE_TTL)
84
+ return cachedInstall;
85
+ cachedInstall =
86
+ (await checkGHCopilot()) ||
87
+ (await checkStandaloneCopilot()) ||
88
+ (await findVSCodeCopilot());
89
+ cachedAt = Date.now();
90
+ return cachedInstall;
91
+ }
92
+ /**
93
+ * Copilot adapter built on AgentBase. Differs from the other CLI agents
94
+ * in two ways:
95
+ * 1. The binary path is discovered async (gh / standalone / VSCode)
96
+ * 2. The CLI is not JSONL — its stdout is plain text
97
+ *
98
+ * AgentBase already handles plain text via the JSON.parse fallback (yields
99
+ * the line verbatim). We override commandName/buildArgs/extractText after
100
+ * resolving the install, and use isAvailable() to short-circuit when no
101
+ * install was found.
102
+ */
103
+ class CopilotAdapter extends AgentBase {
104
+ name = 'copilot';
105
+ aliases = ['gh', 'github', 'copilotcli', 'ghcp'];
106
+ /** Resolved install, populated by isAvailable() and reused by spawn calls. */
107
+ resolvedInstall = null;
108
+ get commandName() {
109
+ if (!this.resolvedInstall) {
110
+ // Should never happen — sendPrompt awaits isAvailable() first. But if
111
+ // someone calls spawnAndCollect directly we degrade by using a
112
+ // sentinel that the spawn will fail on, surfaced via handleError.
113
+ return 'copilot';
114
+ }
115
+ return this.resolvedInstall.command;
116
+ }
117
+ buildArgs(prompt) {
118
+ const install = this.resolvedInstall;
119
+ if (!install)
120
+ return ['-p', prompt, '-s'];
121
+ if (install.type === 'gh-ext') {
122
+ return [...install.argsPrefix, 'suggest', prompt, '--prompt-only'];
123
+ }
124
+ return [...install.argsPrefix, '-p', prompt, '-s'];
125
+ }
126
+ extractText(event) {
127
+ // Copilot CLI is not JSONL; AgentBase's fallback already yields the
128
+ // raw line. extractText is only consulted on successfully-parsed JSON,
129
+ // which Copilot never emits.
130
+ if (event && typeof event === 'object') {
131
+ const e = event;
132
+ if (typeof e.content === 'string')
133
+ return e.content;
134
+ if (typeof e.text === 'string')
135
+ return e.text;
136
+ }
137
+ return '';
138
+ }
139
+ async isAvailable() {
140
+ this.resolvedInstall = await detectCopilotInstall();
141
+ return this.resolvedInstall !== null;
142
+ }
143
+ async healthCheck() {
144
+ const start = Date.now();
145
+ const ok = await this.isAvailable();
146
+ return { ok, latencyMs: Date.now() - start };
147
+ }
148
+ handleError(_code, stderr, _errorMessage) {
149
+ if (stderr.includes('402') || stderr.includes('no quota') || stderr.includes('insufficient')) {
150
+ return `❌ Copilot 额度不足,请检查您的 GitHub Copilot 订阅。
151
+
152
+ 💡 可以使用以下命令切换到其他 Agent:
153
+ • /claude - 切换到 Claude Code
154
+ • /codex - 切换到 OpenAI Codex
155
+ • /agents - 查看所有可用 Agent`;
156
+ }
157
+ return null;
158
+ }
159
+ notAvailableMessage() {
160
+ return `❌ Copilot CLI 未找到。
161
+
162
+ 安装方式 (选择其一):
163
+ npm i -g @github/copilot
164
+ gh extension install github/gh-copilot
165
+ brew install copilot-cli (macOS)
166
+ winget install GitHub.Copilot (Windows)
167
+
168
+ 或安装 VS Code Copilot Chat 扩展。`;
169
+ }
170
+ // Override sendPrompt to short-circuit when not installed — gives a
171
+ // friendlier message than spawnStream would after spawn failure.
172
+ async *sendPrompt(sessionId, prompt, history, _opts) {
173
+ if (!(await this.isAvailable())) {
174
+ yield this.notAvailableMessage();
175
+ return;
176
+ }
177
+ rootLogger.info({ component: `agent.${this.name}`, agent: this.name, install: this.resolvedInstall?.type }, '[copilot] sendPrompt');
178
+ yield* super.sendPrompt(sessionId, prompt, history, _opts);
179
+ }
180
+ }
181
+ export const copilotAdapter = new CopilotAdapter();
182
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/plugins/agents/copilot/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Idempotently register the imhub MCP server in opencode's global config.
3
+ * Returns true when a write actually happened (config changed), false when
4
+ * the config was already in the desired state.
5
+ *
6
+ * Failures (file unreadable, JSON malformed, write rejected) are logged
7
+ * and swallowed — opencode users still keep working without reminder
8
+ * tools, the same way they did before this feature.
9
+ */
10
+ export declare function ensureOpencodeMcpRegistered(): Promise<boolean>;
11
+ //# sourceMappingURL=ensure-mcp-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ensure-mcp-config.d.ts","sourceRoot":"","sources":["../../../../src/plugins/agents/opencode/ensure-mcp-config.ts"],"names":[],"mappings":"AA6CA;;;;;;;;GAQG;AACH,wBAAsB,2BAA2B,IAAI,OAAO,CAAC,OAAO,CAAC,CAkEpE"}
@@ -0,0 +1,100 @@
1
+ // ensure-mcp-config.ts — register the imhub MCP sidecar into opencode's
2
+ // global config so the reminder tools are visible to opencode runs.
3
+ //
4
+ // Why modify global config:
5
+ //
6
+ // opencode loads MCP servers from `~/.config/opencode/opencode.json` at
7
+ // startup and inherits parent process env when spawning each server's
8
+ // stdio. We can't just "pass --mcp-config" per spawn — opencode has no
9
+ // such flag. The next-best knob is the global config file.
10
+ //
11
+ // We do an additive update: read the JSON if it exists, set
12
+ // `mcp.imhub.local.{command,enabled}`, write back. Other keys (provider,
13
+ // theme, etc.) are preserved unchanged. Idempotent — repeated calls are
14
+ // no-ops once the desired entry is in place.
15
+ //
16
+ // Per-spawn IM context (which thread / user is calling) flows through
17
+ // process.env: opencode-stdio-adapter sets IMHUB_APPROVAL_SOCK +
18
+ // IMHUB_RUN_ID on each spawn, opencode forwards them to the MCP server
19
+ // (per opencode/src/mcp/index.ts:384, env: { ...process.env, ... }).
20
+ import { homedir } from 'node:os';
21
+ import { join, dirname } from 'node:path';
22
+ import { readFile, writeFile, mkdir } from 'node:fs/promises';
23
+ import { fileURLToPath } from 'node:url';
24
+ import { logger as rootLogger } from '../../../core/logger.js';
25
+ const log = rootLogger.child({ component: 'opencode-mcp-config' });
26
+ const __filename = fileURLToPath(import.meta.url);
27
+ const __dirname = dirname(__filename);
28
+ // Sidecar lives next to claude-code's MCP entry — same JS, opencode just
29
+ // reaches it through a different MCP transport.
30
+ const SIDECAR_PATH = join(__dirname, '..', 'claude-code', 'mcp-approval-server.js');
31
+ /**
32
+ * Idempotently register the imhub MCP server in opencode's global config.
33
+ * Returns true when a write actually happened (config changed), false when
34
+ * the config was already in the desired state.
35
+ *
36
+ * Failures (file unreadable, JSON malformed, write rejected) are logged
37
+ * and swallowed — opencode users still keep working without reminder
38
+ * tools, the same way they did before this feature.
39
+ */
40
+ export async function ensureOpencodeMcpRegistered() {
41
+ const configPath = process.env.OPENCODE_CONFIG_PATH
42
+ ?? join(homedir(), '.config', 'opencode', 'opencode.json');
43
+ let config = {};
44
+ try {
45
+ const buf = await readFile(configPath, 'utf8');
46
+ config = JSON.parse(buf);
47
+ if (typeof config !== 'object' || config === null || Array.isArray(config)) {
48
+ log.warn({ event: 'opencode.mcp.bad_config', configPath }, 'opencode config is not a JSON object — skipping MCP registration');
49
+ return false;
50
+ }
51
+ }
52
+ catch (err) {
53
+ const code = err.code;
54
+ if (code !== 'ENOENT') {
55
+ log.warn({
56
+ event: 'opencode.mcp.read_failed', configPath,
57
+ err: err instanceof Error ? err.message : String(err),
58
+ }, 'opencode config read failed — skipping MCP registration');
59
+ return false;
60
+ }
61
+ // No config yet — start fresh.
62
+ config = {};
63
+ }
64
+ if (!config.mcp || typeof config.mcp !== 'object' || Array.isArray(config.mcp)) {
65
+ config.mcp = {};
66
+ }
67
+ const mcp = config.mcp;
68
+ const desired = {
69
+ type: 'local',
70
+ command: [process.execPath, SIDECAR_PATH],
71
+ enabled: true,
72
+ };
73
+ // Compare existing entry; bail if already correct.
74
+ const existing = mcp.imhub;
75
+ if (existing
76
+ && typeof existing === 'object'
77
+ && !Array.isArray(existing)
78
+ && JSON.stringify(existing) === JSON.stringify(desired)) {
79
+ log.debug({ event: 'opencode.mcp.already_registered', configPath });
80
+ return false;
81
+ }
82
+ mcp.imhub = desired;
83
+ try {
84
+ await mkdir(dirname(configPath), { recursive: true });
85
+ await writeFile(configPath, `${JSON.stringify(config, null, 2)}\n`, 'utf8');
86
+ log.info({
87
+ event: 'opencode.mcp.registered',
88
+ configPath, sidecar: SIDECAR_PATH,
89
+ }, 'imhub MCP server registered in opencode global config');
90
+ return true;
91
+ }
92
+ catch (err) {
93
+ log.warn({
94
+ event: 'opencode.mcp.write_failed', configPath,
95
+ err: err instanceof Error ? err.message : String(err),
96
+ }, 'opencode config write failed — opencode will not see imhub MCP tools');
97
+ return false;
98
+ }
99
+ }
100
+ //# sourceMappingURL=ensure-mcp-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ensure-mcp-config.js","sourceRoot":"","sources":["../../../../src/plugins/agents/opencode/ensure-mcp-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { OpenCodeAdapter } from './opencode-stdio-adapter.js';
2
+ export { OpenCodeAdapter } from './opencode-stdio-adapter.js';
3
+ export { OpenCodeHttpAdapter } from './opencode-http-adapter.js';
4
+ export declare const opencodeAdapter: OpenCodeAdapter;
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/plugins/agents/opencode/index.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAA;AAG7D,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAA;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAgBhE,eAAO,MAAM,eAAe,iBAA0B,CAAA"}
@@ -0,0 +1,30 @@
1
+ // OpenCode adapter plugin entry — re-exports + driver factory.
2
+ //
3
+ // Two drivers coexist:
4
+ // • stdio (default): opencode-stdio-adapter.ts — `opencode run --format json`
5
+ // • http: opencode-http-adapter.ts — `opencode serve` + REST + SSE (P1.5+)
6
+ //
7
+ // Selection: env IMHUB_OPENCODE_DRIVER=http picks the HTTP driver. Anything
8
+ // else (incl unset, empty string, unrecognized value) keeps stdio. Default is
9
+ // preserved as stdio so this PR is a no-op until ops flip the env.
10
+ //
11
+ // Why a runtime env switch instead of config: lets us A/B inside a single
12
+ // systemd unit by restarting with the env set, with zero config-file edits.
13
+ // Once HTTP is proven we promote it to default and can drop the switch.
14
+ import { logger } from '../../../core/logger.js';
15
+ import { OpenCodeAdapter } from './opencode-stdio-adapter.js';
16
+ import { OpenCodeHttpAdapter } from './opencode-http-adapter.js';
17
+ export { OpenCodeAdapter } from './opencode-stdio-adapter.js';
18
+ export { OpenCodeHttpAdapter } from './opencode-http-adapter.js';
19
+ function createOpencodeAdapter() {
20
+ const driver = (process.env.IMHUB_OPENCODE_DRIVER || '').toLowerCase();
21
+ if (driver === 'http') {
22
+ return new OpenCodeHttpAdapter();
23
+ }
24
+ if (driver && driver !== 'stdio') {
25
+ logger.warn({ component: 'agent.opencode', requestedDriver: driver, fallback: 'stdio' }, `[opencode] unknown IMHUB_OPENCODE_DRIVER=${driver}, falling back to stdio`);
26
+ }
27
+ return new OpenCodeAdapter();
28
+ }
29
+ export const opencodeAdapter = createOpencodeAdapter();
30
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/plugins/agents/opencode/index.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,EAAE;AACF,uBAAuB;AACvB,gFAAgF;AAChF,6EAA6E;AAC7E,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,mEAAmE;AACnE,EAAE;AACF,0EAA0E;AAC1E,4EAA4E;AAC5E,wEAAwE;AAExE,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAA;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAEhE,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAA;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAEhE,SAAS,qBAAqB;IAC5B,MAAM,MAAM,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAA;IACtE,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,IAAI,mBAAmB,EAAE,CAAA;IAClC,CAAC;IACD,IAAI,MAAM,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;QACjC,MAAM,CAAC,IAAI,CACT,EAAE,SAAS,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,EAC3E,4CAA4C,MAAM,yBAAyB,CAC5E,CAAA;IACH,CAAC;IACD,OAAO,IAAI,eAAe,EAAE,CAAA;AAC9B,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,qBAAqB,EAAE,CAAA"}
@@ -0,0 +1,166 @@
1
+ import { OpenCodeAdapter } from './opencode-stdio-adapter.js';
2
+ import type { AgentSendOpts, ChatMessage } from '../../../core/types.js';
3
+ import { type OpencodeServeManager } from './serve-manager.js';
4
+ import { type ApprovalBus } from '../../../core/approval-bus.js';
5
+ /** Shape of an event arriving on opencode's /event SSE stream. Every field
6
+ * is optional because we are deliberately conservative — opencode's bus is
7
+ * shared across many event types and we touch only the slice we need. */
8
+ interface OpencodePart {
9
+ id?: string;
10
+ type?: string;
11
+ text?: string;
12
+ tokens?: {
13
+ input?: number;
14
+ output?: number;
15
+ total?: number;
16
+ reasoning?: number;
17
+ };
18
+ cost?: number;
19
+ time?: {
20
+ start?: number;
21
+ end?: number;
22
+ };
23
+ sessionID?: string;
24
+ }
25
+ /** Shape returned by POST /session/:id/message on opencode 1.14.45+ where the
26
+ * /event SSE stream silently drops bus events. The endpoint blocks until the
27
+ * assistant message is complete and returns the full message body. We use it
28
+ * as the authoritative source of text + usage when SSE yields nothing. */
29
+ interface OpencodeMessageResponse {
30
+ info?: {
31
+ id?: string;
32
+ sessionID?: string;
33
+ cost?: number;
34
+ tokens?: {
35
+ input?: number;
36
+ output?: number;
37
+ total?: number;
38
+ reasoning?: number;
39
+ };
40
+ };
41
+ parts?: OpencodePart[];
42
+ }
43
+ interface OpencodeEvent {
44
+ type: string;
45
+ properties?: {
46
+ sessionID?: string;
47
+ info?: {
48
+ id?: string;
49
+ status?: {
50
+ type?: string;
51
+ };
52
+ sessionID?: string;
53
+ };
54
+ part?: OpencodePart;
55
+ status?: {
56
+ type?: string;
57
+ };
58
+ error?: unknown;
59
+ /** permission.asked carries an id at properties.id (Permission.Request). */
60
+ id?: string;
61
+ /** Permission name on permission.asked, e.g. "external_directory" / "bash". */
62
+ permission?: string;
63
+ /** Patterns the agent wants to access. */
64
+ patterns?: string[];
65
+ /** Tool-specific metadata that may help the user decide. */
66
+ metadata?: Record<string, unknown>;
67
+ };
68
+ }
69
+ export interface HttpAdapterOptions {
70
+ /** Override the singleton serve manager. Tests inject a mock. */
71
+ serve?: OpencodeServeManager;
72
+ /** Override fetch. Tests inject a mock. */
73
+ fetchImpl?: typeof fetch;
74
+ /** Override the IM approval bus. Defaults to the process singleton; pass
75
+ * `null` to disable the bridge entirely (used by tests that want to lock
76
+ * in the no-bus fallback path). */
77
+ approvalBus?: ApprovalBus | null;
78
+ }
79
+ export declare class OpenCodeHttpAdapter extends OpenCodeAdapter {
80
+ private readonly serve;
81
+ private readonly fetchImpl;
82
+ /** null when the bridge is intentionally disabled. */
83
+ private readonly approvalBus;
84
+ /** Set of opencode session ids whose ruleset we've already PATCHed in this
85
+ * process lifetime. Lets us re-apply the gate policy when an im-hub
86
+ * restart resurfaces an old session, without duplicating rules every
87
+ * turn. Cleared only by im-hub restart — that's fine since the rules
88
+ * the previous run wrote are still in opencode's session DB. */
89
+ private readonly rulesetApplied;
90
+ constructor(opts?: HttpAdapterOptions);
91
+ /**
92
+ * Translate a single SSE event into adapter-side effects:
93
+ * - sessionID capture → opts.onAgentSessionId
94
+ * - step-finish cost/tokens → opts.onUsage
95
+ * - text-part with finished `time.end` → returned as a chunk (with
96
+ * part id when known, so the caller can dedupe against the POST-body
97
+ * fallback for SSE-broken builds — see drainResponseBody).
98
+ * Pure: tests drive this directly without spinning up a daemon.
99
+ */
100
+ inspectHttpEvent(event: OpencodeEvent, sessionID: string, opts: AgentSendOpts): {
101
+ text?: string;
102
+ partId?: string;
103
+ };
104
+ /**
105
+ * `session.status` event with status.type === 'idle' for our session is
106
+ * the canonical "stop" signal in opencode (cf. run.ts:532).
107
+ */
108
+ isIdleEvent(event: OpencodeEvent, sessionID: string): boolean;
109
+ isErrorEvent(event: OpencodeEvent, sessionID: string): {
110
+ error: string;
111
+ } | null;
112
+ buildHttpContextualPrompt(prompt: string, history?: ChatMessage[]): string;
113
+ sendPrompt(_sessionId: string, prompt: string, history?: ChatMessage[], opts?: AgentSendOpts): AsyncGenerator<string>;
114
+ /**
115
+ * Extract assistant text + usage from the POST /session/:id/message response
116
+ * body, skipping any text part already emitted via SSE (matched by part id).
117
+ * Used as a fallback for opencode builds whose /event stream is broken.
118
+ */
119
+ drainResponseBody(body: OpencodeMessageResponse, alreadyYielded: Set<string>, opts: AgentSendOpts): string[];
120
+ /**
121
+ * Decide how to handle a `permission.asked` SSE event:
122
+ * - If `this.approvalBus` is set AND has a notifier installed AND the
123
+ * call carries enough IM context (threadId + platform) → register a
124
+ * synthetic pending so the user gets an IM card; the bus's resolve
125
+ * callback POSTs the decision back to opencode via /permission/.../reply.
126
+ * - Otherwise → fall back to `once`. Without an IM channel there's no
127
+ * human to ask, and a plain `reject` would surface as a tool-call
128
+ * failure mid-conversation which is worse UX than allowing.
129
+ *
130
+ * Fire-and-forget: the SSE loop must keep draining other events while the
131
+ * bridge waits for the user. The bus enforces its own timeout (5 min by
132
+ * default) so we never deadlock the SSE loop.
133
+ */
134
+ private routeAsk;
135
+ /**
136
+ * Build the session-level permission ruleset to append to opencode's
137
+ * agent defaults. See createSession's docstring for policy rationale.
138
+ *
139
+ * The returned rules are flat `{permission, pattern, action}` objects
140
+ * matching opencode's `Permission.Rule` schema.
141
+ */
142
+ private buildSessionRuleset;
143
+ /**
144
+ * PATCH a resumed session with our gate ruleset so subsequent tool calls
145
+ * surface as `permission.asked` events for the bridge. opencode's update
146
+ * endpoint merges (current + payload) — payload comes last and wins under
147
+ * findLast semantics. Idempotent across im-hub restarts but NOT within a
148
+ * single process: the caller (sendPrompt) gates on rulesetApplied.
149
+ */
150
+ private applyRuleset;
151
+ private createSession;
152
+ private postPrompt;
153
+ private replyPermission;
154
+ private openEventStream;
155
+ }
156
+ export declare class EventStream implements AsyncIterable<OpencodeEvent> {
157
+ private reader;
158
+ private decoder;
159
+ private buf;
160
+ private closed;
161
+ constructor(body: NonNullable<Response['body']>);
162
+ close(): void;
163
+ [Symbol.asyncIterator](): AsyncIterator<OpencodeEvent>;
164
+ }
165
+ export type { OpencodeEvent };
166
+ //# sourceMappingURL=opencode-http-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode-http-adapter.d.ts","sourceRoot":"","sources":["../../../../src/plugins/agents/opencode/opencode-http-adapter.ts"],"names":[],"mappings":"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"}