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,65 @@
1
+ import { sessionManager } from './session.js';
2
+ export interface CallHelperOpts {
3
+ /** IM thread coordinates — used to pick the same agent the user is
4
+ * currently chatting with. */
5
+ platform: string;
6
+ channelId: string;
7
+ threadId: string;
8
+ /** Behavioral guidance ("you are X, do Y, do not Z"). Most agents don't
9
+ * expose a native system role, so we prepend it to the user prompt. */
10
+ systemPrompt: string;
11
+ /** The actual instruction / payload. */
12
+ userPrompt: string;
13
+ /** Hard wall-clock cap. Default 15s. */
14
+ timeoutMs?: number;
15
+ /** Stop accumulating output once this many characters arrive. Defends
16
+ * against a runaway agent and bounds memory. Default 4 000. */
17
+ maxOutputChars?: number;
18
+ /** Override agent selection. When omitted, resolveActiveAgent() picks. */
19
+ agentName?: string;
20
+ }
21
+ /**
22
+ * Resolve which agent to use for this thread. Exposed so callers can probe
23
+ * "is an agent available at all?" before composing a heavy prompt.
24
+ *
25
+ * Visible-for-test: takes optional injectable resolvers so unit tests don't
26
+ * need to spin up a real session manager.
27
+ */
28
+ export declare function resolveActiveAgent(platform: string, channelId: string, threadId: string, deps?: {
29
+ getExistingSession?: typeof sessionManager.getExistingSession;
30
+ listAgents?: () => string[];
31
+ }): Promise<string | null>;
32
+ /**
33
+ * Pick the fastest registered agent for a short helper task (noun
34
+ * extraction, intent classification, etc.). Spawn-cost order, lowest first:
35
+ *
36
+ * 1. opencode — HTTP daemon already running; per-call latency ~1–3 s
37
+ * 2. claude-code — fresh subprocess each call; ~5–10 s spawn cost
38
+ * 3. codex — `codex exec` cold start is ~15–30 s; way too slow for
39
+ * a micro-task that has a 6 s timeout budget
40
+ * 4. copilot / any other — fallback to first registered
41
+ *
42
+ * Used for inline LLM helpers that block the IM pipeline (memo-extract's
43
+ * `what` extraction, intent detector). Picking the sticky agent would
44
+ * make a feishu-+-codex user pay 15 s per memo save — unacceptable.
45
+ *
46
+ * Falls through to `resolveActiveAgent` semantics if none of the preferred
47
+ * agents are registered.
48
+ */
49
+ export declare function pickFastHelperAgent(deps?: {
50
+ listAgents?: () => string[];
51
+ }): string | null;
52
+ /**
53
+ * Call a helper agent with composed prompts. Returns trimmed output text or
54
+ * null on any failure / timeout / no-agent.
55
+ *
56
+ * The result is *raw* — JSON parsing, truncation, etc. are caller's job.
57
+ */
58
+ export declare function callHelperAgent(opts: CallHelperOpts): Promise<string | null>;
59
+ /**
60
+ * Shorthand for "ask the helper agent and parse the first JSON block out
61
+ * of the response". Returns null on parse failure or LLM failure. Callers
62
+ * should validate the shape with their own type guard.
63
+ */
64
+ export declare function callHelperForJson<T = unknown>(opts: CallHelperOpts): Promise<T | null>;
65
+ //# sourceMappingURL=agent-helper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-helper.d.ts","sourceRoot":"","sources":["../../src/core/agent-helper.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAO7C,MAAM,WAAW,cAAc;IAC7B;mCAC+B;IAC/B,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB;4EACwE;IACxE,YAAY,EAAE,MAAM,CAAA;IACpB,wCAAwC;IACxC,UAAU,EAAE,MAAM,CAAA;IAClB,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;oEACgE;IAChE,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,0EAA0E;IAC1E,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE;IACJ,kBAAkB,CAAC,EAAE,OAAO,cAAc,CAAC,kBAAkB,CAAA;IAC7D,UAAU,CAAC,EAAE,MAAM,MAAM,EAAE,CAAA;CACvB,GACL,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAaxB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,MAAM,EAAE,CAAA;CAAO,GACzC,MAAM,GAAG,IAAI,CAOf;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA+ClF;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,CAAC,GAAG,OAAO,EACjD,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAoBnB"}
@@ -0,0 +1,150 @@
1
+ // agent-helper.ts — generic LLM-via-AgentAdapter helper.
2
+ //
3
+ // Why this layer exists: features that want a small LLM judgement
4
+ // (reminder text polish, reminder-intent detection, etc.) MUST NOT bake in
5
+ // a specific provider (DeepSeek, OpenAI, …). im-hub is shipped as a
6
+ // pluggable framework — every user's LLM access goes through the agent
7
+ // they've already registered (claude-code / codex / opencode / copilot /
8
+ // any future ACP-discovered remote). So all helper calls funnel through
9
+ // one of those adapters via AgentAdapter.sendPrompt.
10
+ //
11
+ // Selection rule (in order):
12
+ // 1. opts.agentName (explicit override; mainly tests)
13
+ // 2. The active agent of the IM thread — sessionManager.getExistingSession
14
+ // 3. The first registered agent — registry.listAgents()[0]
15
+ // 4. null → no LLM available, caller falls back to literal/no-op behavior
16
+ //
17
+ // Fail-soft contract: any failure returns null. Timeout is a hard cap
18
+ // independent of the underlying adapter so a wedged claude-code subprocess
19
+ // can't block a reminder fire indefinitely.
20
+ import { logger as rootLogger } from './logger.js';
21
+ import { registry } from './registry.js';
22
+ import { sessionManager } from './session.js';
23
+ const log = rootLogger.child({ component: 'agent-helper' });
24
+ const DEFAULT_TIMEOUT_MS = 15_000;
25
+ const DEFAULT_MAX_OUTPUT_CHARS = 4_000;
26
+ /**
27
+ * Resolve which agent to use for this thread. Exposed so callers can probe
28
+ * "is an agent available at all?" before composing a heavy prompt.
29
+ *
30
+ * Visible-for-test: takes optional injectable resolvers so unit tests don't
31
+ * need to spin up a real session manager.
32
+ */
33
+ export async function resolveActiveAgent(platform, channelId, threadId, deps = {}) {
34
+ const getSession = deps.getExistingSession ?? sessionManager.getExistingSession.bind(sessionManager);
35
+ const listAgents = deps.listAgents ?? (() => registry.listAgents());
36
+ try {
37
+ const session = await getSession(platform, channelId, threadId);
38
+ if (session?.agent)
39
+ return session.agent;
40
+ }
41
+ catch (err) {
42
+ log.debug({ err: err instanceof Error ? err.message : String(err) }, 'session lookup failed during agent resolution');
43
+ }
44
+ const all = listAgents();
45
+ return all[0] ?? null;
46
+ }
47
+ /**
48
+ * Pick the fastest registered agent for a short helper task (noun
49
+ * extraction, intent classification, etc.). Spawn-cost order, lowest first:
50
+ *
51
+ * 1. opencode — HTTP daemon already running; per-call latency ~1–3 s
52
+ * 2. claude-code — fresh subprocess each call; ~5–10 s spawn cost
53
+ * 3. codex — `codex exec` cold start is ~15–30 s; way too slow for
54
+ * a micro-task that has a 6 s timeout budget
55
+ * 4. copilot / any other — fallback to first registered
56
+ *
57
+ * Used for inline LLM helpers that block the IM pipeline (memo-extract's
58
+ * `what` extraction, intent detector). Picking the sticky agent would
59
+ * make a feishu-+-codex user pay 15 s per memo save — unacceptable.
60
+ *
61
+ * Falls through to `resolveActiveAgent` semantics if none of the preferred
62
+ * agents are registered.
63
+ */
64
+ export function pickFastHelperAgent(deps = {}) {
65
+ const all = (deps.listAgents ?? (() => registry.listAgents()))();
66
+ const preferred = ['opencode', 'claude-code', 'codex', 'copilot'];
67
+ for (const name of preferred) {
68
+ if (all.includes(name))
69
+ return name;
70
+ }
71
+ return all[0] ?? null;
72
+ }
73
+ /**
74
+ * Call a helper agent with composed prompts. Returns trimmed output text or
75
+ * null on any failure / timeout / no-agent.
76
+ *
77
+ * The result is *raw* — JSON parsing, truncation, etc. are caller's job.
78
+ */
79
+ export async function callHelperAgent(opts) {
80
+ const agentName = opts.agentName ?? await resolveActiveAgent(opts.platform, opts.channelId, opts.threadId);
81
+ if (!agentName) {
82
+ log.debug({ event: 'helper.no_agent', platform: opts.platform, threadId: opts.threadId }, 'no agent available — caller will fall back');
83
+ return null;
84
+ }
85
+ const adapter = registry.getAgent(agentName);
86
+ if (!adapter) {
87
+ log.warn({ event: 'helper.agent_missing', agentName }, 'resolved agent is not registered — caller will fall back');
88
+ return null;
89
+ }
90
+ const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;
91
+ const maxChars = opts.maxOutputChars ?? DEFAULT_MAX_OUTPUT_CHARS;
92
+ const composed = `${opts.systemPrompt.trim()}\n\n---\n\n${opts.userPrompt.trim()}`;
93
+ let acc = '';
94
+ const start = Date.now();
95
+ try {
96
+ const generator = adapter.sendPrompt('llm-helper', composed, []);
97
+ const collect = (async () => {
98
+ for await (const chunk of generator) {
99
+ acc += chunk;
100
+ if (acc.length >= maxChars)
101
+ break;
102
+ }
103
+ })();
104
+ const timeout = new Promise((_, reject) => setTimeout(() => reject(new Error(`helper agent timed out (${timeoutMs}ms)`)), timeoutMs));
105
+ await Promise.race([collect, timeout]);
106
+ const text = acc.trim();
107
+ log.debug({
108
+ event: 'helper.ok',
109
+ agent: agentName, elapsedMs: Date.now() - start, chars: text.length,
110
+ }, 'helper call succeeded');
111
+ return text || null;
112
+ }
113
+ catch (err) {
114
+ log.warn({
115
+ event: 'helper.failed',
116
+ agent: agentName, elapsedMs: Date.now() - start,
117
+ err: err instanceof Error ? err.message : String(err),
118
+ }, 'helper agent call failed — caller will fall back');
119
+ return null;
120
+ }
121
+ }
122
+ /**
123
+ * Shorthand for "ask the helper agent and parse the first JSON block out
124
+ * of the response". Returns null on parse failure or LLM failure. Callers
125
+ * should validate the shape with their own type guard.
126
+ */
127
+ export async function callHelperForJson(opts) {
128
+ const raw = await callHelperAgent(opts);
129
+ if (!raw)
130
+ return null;
131
+ // Many adapters wrap output in markdown fences or add prose. Find the
132
+ // first {...} block (non-greedy), then parse.
133
+ const match = raw.match(/\{[\s\S]*\}/);
134
+ if (!match) {
135
+ log.debug({ event: 'helper.json.no_match', rawLen: raw.length }, 'no JSON object in helper response');
136
+ return null;
137
+ }
138
+ try {
139
+ return JSON.parse(match[0]);
140
+ }
141
+ catch (err) {
142
+ log.debug({
143
+ event: 'helper.json.parse_failed',
144
+ err: err instanceof Error ? err.message : String(err),
145
+ preview: match[0].slice(0, 200),
146
+ }, 'helper JSON parse failed');
147
+ return null;
148
+ }
149
+ }
150
+ //# sourceMappingURL=agent-helper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-helper.js","sourceRoot":"","sources":["../../src/core/agent-helper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /** Per-user state directory. Cached at module-eval time. */
2
+ export declare const AGIM_HOME: string;
3
+ /** Per-agent workspace tree. Cached at module-eval time. */
4
+ export declare const AGIM_WORKSPACES: string;
5
+ /** True iff the resolved AGIM_HOME is the legacy `~/.im-hub/` path.
6
+ * Useful for callers that want to log the legacy mode or emit a one-time
7
+ * "consider migrating to ~/.agim/" hint (we deliberately don't do that
8
+ * hint automatically — users can move when they want). */
9
+ export declare function isLegacyHome(): boolean;
10
+ //# sourceMappingURL=agim-paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agim-paths.d.ts","sourceRoot":"","sources":["../../src/core/agim-paths.ts"],"names":[],"mappings":"AAkDA,4DAA4D;AAC5D,eAAO,MAAM,SAAS,EAAE,MAA0B,CAAA;AAElD,4DAA4D;AAC5D,eAAO,MAAM,eAAe,EAAE,MAAgC,CAAA;AAE9D;;;2DAG2D;AAC3D,wBAAgB,YAAY,IAAI,OAAO,CAEtC"}
@@ -0,0 +1,64 @@
1
+ // agim-paths.ts — resolve the per-user state directory + workspace tree.
2
+ //
3
+ // v1.0 brand rebrand introduced canonical names `~/.agim/` and
4
+ // `~/.agim-workspaces/`. To keep every 0.x deployment intact, this
5
+ // module *auto-detects* which name the user already has on disk and
6
+ // sticks with that. Fresh installs land at the new name. No data is
7
+ // ever moved automatically — we just pick the right root and stay there.
8
+ //
9
+ // Resolution order (cached at first evaluation, run once per process):
10
+ // 1. $AGIM_HOME env var — explicit override (also accepts the
11
+ // legacy $IMHUB_HOME spelling).
12
+ // 2. `~/.agim/` if it already exists (v1.0+ canonical name)
13
+ // 3. `~/.im-hub/` if it exists (legacy from pre-v1.0 installs).
14
+ // 4. Default to `~/.agim/` (a fresh install will create it under
15
+ // this name lazily as files are written).
16
+ //
17
+ // The same logic applies to the workspaces sibling: prefer
18
+ // `~/.agim-workspaces/`, fall back to `~/.im-hub-workspaces/`.
19
+ //
20
+ // Code in the rest of the codebase should import AGIM_HOME and
21
+ // AGIM_WORKSPACES from here rather than hard-coding `.im-hub`. The
22
+ // `cli-ui/paths.ts` helpers re-export from this module for
23
+ // backwards-compat with existing import sites.
24
+ import { existsSync } from 'node:fs';
25
+ import { homedir } from 'node:os';
26
+ import { join } from 'node:path';
27
+ function resolveAgimHome() {
28
+ const override = process.env.AGIM_HOME || process.env.IMHUB_HOME;
29
+ if (override)
30
+ return override;
31
+ const home = homedir();
32
+ const newPath = join(home, '.agim');
33
+ const oldPath = join(home, '.im-hub');
34
+ if (existsSync(newPath))
35
+ return newPath;
36
+ if (existsSync(oldPath))
37
+ return oldPath;
38
+ return newPath;
39
+ }
40
+ function resolveAgimWorkspaces() {
41
+ const override = process.env.AGIM_WORKSPACES || process.env.IMHUB_WORKSPACES;
42
+ if (override)
43
+ return override;
44
+ const home = homedir();
45
+ const newPath = join(home, '.agim-workspaces');
46
+ const oldPath = join(home, '.im-hub-workspaces');
47
+ if (existsSync(newPath))
48
+ return newPath;
49
+ if (existsSync(oldPath))
50
+ return oldPath;
51
+ return newPath;
52
+ }
53
+ /** Per-user state directory. Cached at module-eval time. */
54
+ export const AGIM_HOME = resolveAgimHome();
55
+ /** Per-agent workspace tree. Cached at module-eval time. */
56
+ export const AGIM_WORKSPACES = resolveAgimWorkspaces();
57
+ /** True iff the resolved AGIM_HOME is the legacy `~/.im-hub/` path.
58
+ * Useful for callers that want to log the legacy mode or emit a one-time
59
+ * "consider migrating to ~/.agim/" hint (we deliberately don't do that
60
+ * hint automatically — users can move when they want). */
61
+ export function isLegacyHome() {
62
+ return AGIM_HOME.endsWith('/.im-hub');
63
+ }
64
+ //# sourceMappingURL=agim-paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agim-paths.js","sourceRoot":"","sources":["../../src/core/agim-paths.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,EAAE;AACF,+DAA+D;AAC/D,mEAAmE;AACnE,oEAAoE;AACpE,oEAAoE;AACpE,yEAAyE;AACzE,EAAE;AACF,uEAAuE;AACvE,gEAAgE;AAChE,qCAAqC;AACrC,8DAA8D;AAC9D,kEAAkE;AAClE,mEAAmE;AACnE,+CAA+C;AAC/C,EAAE;AACF,2DAA2D;AAC3D,+DAA+D;AAC/D,EAAE;AACF,+DAA+D;AAC/D,mEAAmE;AACnE,2DAA2D;AAC3D,+CAA+C;AAE/C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,SAAS,eAAe;IACtB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAA;IAChE,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAA;IAC7B,MAAM,IAAI,GAAG,OAAO,EAAE,CAAA;IACtB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IACnC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;IACrC,IAAI,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAA;IACvC,IAAI,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAA;IACvC,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,SAAS,qBAAqB;IAC5B,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAA;IAC5E,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAA;IAC7B,MAAM,IAAI,GAAG,OAAO,EAAE,CAAA;IACtB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAA;IAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAA;IAChD,IAAI,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAA;IACvC,IAAI,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAA;IACvC,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,4DAA4D;AAC5D,MAAM,CAAC,MAAM,SAAS,GAAW,eAAe,EAAE,CAAA;AAElD,4DAA4D;AAC5D,MAAM,CAAC,MAAM,eAAe,GAAW,qBAAqB,EAAE,CAAA;AAE9D;;;2DAG2D;AAC3D,MAAM,UAAU,YAAY;IAC1B,OAAO,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAA;AACvC,CAAC"}
@@ -0,0 +1,300 @@
1
+ export interface RunContext {
2
+ threadId: string;
3
+ platform: string;
4
+ userId: string;
5
+ channelId: string;
6
+ }
7
+ /** Wire-format decision sent back to the sidecar. `autoAllowFurther` is
8
+ * internal-only — `sendDecision` strips it before serializing. */
9
+ export type Decision = {
10
+ behavior: 'allow';
11
+ updatedInput?: Record<string, unknown>;
12
+ autoAllowFurther?: boolean;
13
+ } | {
14
+ behavior: 'deny';
15
+ message?: string;
16
+ };
17
+ export interface ApprovalNotification {
18
+ runId: string;
19
+ reqId: string;
20
+ toolName: string;
21
+ input: Record<string, unknown>;
22
+ toolUseId: string;
23
+ ctx: RunContext;
24
+ /** Present iff this request matched a per-thread auto-allow rule. The
25
+ * notifier should render a softer prompt ("⏱ 自动放行中, 5s 内回 n 可拒绝")
26
+ * instead of the regular y/n one — the bus will allow on timer expiry,
27
+ * unless the user actively denies first. */
28
+ autoAllow?: {
29
+ graceMs: number;
30
+ };
31
+ }
32
+ /** Notifier 只负责"通知 IM 推卡片/消息"。不要在这里返回决策;决策走 resolvePending。 */
33
+ export type ApprovalNotifier = (n: ApprovalNotification) => Promise<void>;
34
+ /** Snapshot returned by {@link ApprovalBus.resolvePending} so the router can
35
+ * send the user a confirmation receipt ("✅ 已批准并启用自动放行 …" or
36
+ * "❌ 已拒绝并撤销自动放行 …") without re-scanning bus internals. */
37
+ export interface ResolvedInfo {
38
+ reqId: string;
39
+ runId: string;
40
+ threadId: string;
41
+ platform: string;
42
+ toolName: string;
43
+ /** Same fingerprint the bus uses for the auto-allow rule key. */
44
+ fingerprint: string;
45
+ /** True iff the resolved pending had been created in auto-allow grace
46
+ * mode — i.e. matched an existing rule. Lets the router distinguish
47
+ * "user denied a normal prompt" from "user denied an auto-allow prompt
48
+ * (which also revoked the rule)". */
49
+ wasAutoAllow: boolean;
50
+ }
51
+ /** Why an approval was resolved. Used by ResolutionListener consumers (e.g.
52
+ * approval-router) to decide whether to edit a UI card to "expired" — only
53
+ * non-`user` causes need cleanup, since the user-driven path (button click /
54
+ * text reply) edits the card itself before the listener fires. */
55
+ export type ResolutionCause = 'user' | 'timeout' | 'sidecar-disconnect' | 'run-terminated' | 'shutdown' | 'notifier-error';
56
+ /** Fired exactly once per pending when it transitions from pending → resolved.
57
+ * Mirrors the wire decision sent to sidecar/dispatch but adds context (cause,
58
+ * threadId, platform) so listeners can route side-effects without scanning
59
+ * bus internals. Synchronous; listener errors are logged + swallowed. */
60
+ export interface ResolutionEvent {
61
+ reqId: string;
62
+ runId: string;
63
+ threadId: string;
64
+ platform: string;
65
+ toolName: string;
66
+ fingerprint: string;
67
+ decision: Decision;
68
+ wasAutoAllow: boolean;
69
+ cause: ResolutionCause;
70
+ }
71
+ export type ResolutionListener = (e: ResolutionEvent) => void;
72
+ /** Composite key that prevents cross-platform/channel thread collisions. */
73
+ export declare function threadKey(platform: string, channelId: string, threadId: string): string;
74
+ export interface ApprovalBusOptions {
75
+ approvalTimeoutMs?: number;
76
+ /** Window between sending the auto-allow notice and auto-resolving as
77
+ * allow (when the user doesn't actively deny in the meantime). */
78
+ autoAllowGraceMs?: number;
79
+ }
80
+ export declare class ApprovalBus {
81
+ private server;
82
+ private socketPath;
83
+ private readonly approvalTimeoutMs;
84
+ private readonly autoAllowGraceMs;
85
+ private runContexts;
86
+ private pendingById;
87
+ private pendingByThread;
88
+ private connections;
89
+ private notifier;
90
+ private resolutionListener;
91
+ /** compositeKey → set of `${toolName}::${prefix}` keys the user has marked
92
+ * as auto-allow within this conversation. Cleared by clearAutoAllowForThread
93
+ * (called from session.resetConversation) and on stop(). Key format is
94
+ * `platform:channelId:threadId` to isolate across platforms/channels. */
95
+ private autoAllowByThread;
96
+ /** Per-thread opt-out for readonly auto-allow. Default: enabled (= empty
97
+ * set means everyone is opted in). Toggled via /approval readonly on|off.
98
+ * In-memory only — survives no restarts; restart returns to default-on,
99
+ * matching the env-var default. */
100
+ private readonlyAutoAllowDisabledThreads;
101
+ /**
102
+ * Lifetime counters surfaced via {@link getMetrics}. Help ops detect
103
+ * leaks (pending growing unbounded), spikes (totalRequests rate), and
104
+ * approval skew (deny:allow ratio). Reset on stop() so the gauge for a
105
+ * fresh process starts at zero.
106
+ */
107
+ private metricsSnapshot;
108
+ constructor(opts?: ApprovalBusOptions);
109
+ /** 注入"通知 IM 推送"的回调。messenger 层启动时调一次。 */
110
+ setNotifier(n: ApprovalNotifier | null): void;
111
+ /** Subscribe to resolution events. Replaces any previous listener.
112
+ * approval-router uses this to keep its UI cards in sync with bus-side
113
+ * cancellations (timeout / sidecar disconnect / run terminated). The
114
+ * user-driven path (button or y/n text) already edits its own card; the
115
+ * listener still fires there with cause='user' so consumers can dedup. */
116
+ setResolutionListener(l: ResolutionListener | null): void;
117
+ /** 启动 unix socket 服务。返回最终使用的 socket 路径。 */
118
+ start(socketPath?: string): Promise<string>;
119
+ stop(): Promise<void>;
120
+ registerRun(runId: string, ctx: RunContext): void;
121
+ /** 进程结束时调。pending 全 deny,runContext 清掉。 */
122
+ unregisterRun(runId: string): void;
123
+ /** Check if there are pending approvals for the given composite key.
124
+ * `key` must be a composite produced by `threadKey(platform, channelId,
125
+ * threadId)` — that's what register stores under. A bare threadId will
126
+ * miss in multi-platform deployments. */
127
+ hasPendingFor(key: string): boolean;
128
+ /** True iff a notifier has been installed (i.e. messenger layer has wired
129
+ * the bus into IM). Callers that have a fallback path (e.g. the opencode
130
+ * HTTP adapter) check this before registerSyntheticPending so they can
131
+ * short-circuit when the bus is dormant — mostly relevant in tests and in
132
+ * non-IM call paths (web, scheduler). */
133
+ hasNotifier(): boolean;
134
+ /**
135
+ * 由 messenger.onMessage 拦截层调用。把 thread 队列头部的 pending 用
136
+ * 给定决策 resolve 掉。返回被 resolve 的 pending 描述(platform / tool /
137
+ * fingerprint / 是否处于 auto-allow grace 模式);router 用这些信息发回执。
138
+ * 没有 pending 时返回 null。
139
+ *
140
+ * Auto-allow side-effect: a user-initiated deny against a pending that
141
+ * was running in auto-allow mode revokes the matching rule (the user is
142
+ * signaling "stop auto-approving this"). Revocation is intentionally
143
+ * scoped to this user-path so sidecar disconnects / shutdown / run-
144
+ * terminated denies don't accidentally clear rules the user still wants.
145
+ */
146
+ /** Resolve the FIFO head for the given composite key. `key` must be a
147
+ * composite produced by `threadKey(platform, channelId, threadId)`. The
148
+ * text-reply path (cli's tryHandleApprovalReply) is the canonical caller;
149
+ * button callbacks should use `resolvePendingByReqId` instead. */
150
+ resolvePending(key: string, decision: Decision): ResolvedInfo | null;
151
+ /**
152
+ * Resolve a specific pending approval identified by reqId. Used by button
153
+ * callbacks and the dashboard where the UI element carries the exact reqId,
154
+ * avoiding the FIFO head-of-thread ambiguity of resolvePending().
155
+ */
156
+ resolvePendingByReqId(reqId: string, decision: Decision): ResolvedInfo | null;
157
+ private _resolveTarget;
158
+ /** Drop every auto-allow rule registered for this thread. Called from
159
+ * session.resetConversation so `/new` truly returns to "ask every time".
160
+ * `key` must be a composite from `threadKey(platform, channelId, threadId)`. */
161
+ clearAutoAllowForThread(key: string): void;
162
+ /** Test/diagnostic helper — current rule keys for a thread. */
163
+ getAutoAllowKeys(key: string): string[];
164
+ /** Whether readonly auto-allow is active for this thread. False if either
165
+ * the global env flag is off OR the user explicitly opted this thread out. */
166
+ isReadonlyAutoAllowEnabled(key: string): boolean;
167
+ /** Per-thread toggle. Returns the new effective state (after applying the
168
+ * global env constraint — if the env disabled it, returning true is
169
+ * impossible). */
170
+ setReadonlyAutoAllowEnabled(key: string, enabled: boolean): boolean;
171
+ /** True iff the tool name is in the readonly allowlist. Surface for tests
172
+ * and the /approval command's status output. */
173
+ isReadonlyTool(toolName: string): boolean;
174
+ /** Snapshot of the readonly allowlist. Returns a copy so callers can't
175
+ * mutate the bus's internal set. */
176
+ getReadonlyTools(): string[];
177
+ /** 测试用:当前 socket 路径。 */
178
+ getSocketPath(): string | null;
179
+ /**
180
+ * Operational metrics snapshot used by /api/metrics (M14). `pending` is
181
+ * a live count; the totals are lifetime counters that monotonically
182
+ * increase until stop(). The three result buckets (allowed / denied /
183
+ * timedOut) are mutually exclusive and sum to totalResolved — see
184
+ * cancelPending for the bucketing rule. Cheap to call — no allocations
185
+ * beyond the returned object.
186
+ */
187
+ getMetrics(): {
188
+ pending: number;
189
+ totalRequests: number;
190
+ totalResolved: number;
191
+ totalAllowed: number;
192
+ totalDenied: number;
193
+ totalTimedOut: number;
194
+ totalReadonlyAutoAllowed: number;
195
+ };
196
+ /**
197
+ * Snapshot of every currently-pending approval, sanitized for surface
198
+ * to the operator dashboard. Used by the web `/api/approvals` endpoint
199
+ * (and any future ops tooling). Returns a stable JSON shape — input
200
+ * is included verbatim so the UI can render the same preview the
201
+ * IM-side card would; sockets / dispatch closures / timer handles are
202
+ * intentionally omitted.
203
+ *
204
+ * Sorted oldest-first so the queue head is at index 0 (matches the
205
+ * head-of-thread queue semantics used by resolvePending).
206
+ */
207
+ listPending(): Array<{
208
+ reqId: string;
209
+ runId: string;
210
+ threadId: string;
211
+ platform: string;
212
+ toolName: string;
213
+ input: Record<string, unknown>;
214
+ fingerprint: string;
215
+ autoAllow: boolean;
216
+ registeredAt: number;
217
+ ageMs: number;
218
+ }>;
219
+ private handleConnection;
220
+ private handleLine;
221
+ /**
222
+ * Handle a reminder RPC sent by the MCP sidecar (mcp-approval-server.ts).
223
+ * Same socket as approvals; different `type`. Two ways to identify the
224
+ * IM thread:
225
+ *
226
+ * 1. runId → RunContext lookup (preferred — used by claude-code via
227
+ * --mcp-config env, and opencode stdio via per-spawn extraEnv)
228
+ * 2. _im_context inline (fallback — used by opencode http where the
229
+ * MCP server is shared across sessions and per-spawn env can't be
230
+ * injected; the agent itself asserts the context)
231
+ *
232
+ * Path 2 is **single-user only** by design: a multi-tenant deployment
233
+ * would let one user's agent forge reminders for another. Adapters that
234
+ * want to use path 2 must opt in by sending `_im_context`. We log it
235
+ * loudly so operators can audit.
236
+ */
237
+ private handleReminder;
238
+ private sendReminderResult;
239
+ /**
240
+ * Handle a memo RPC from the MCP sidecar — same socket as approvals and
241
+ * reminders, different `type`. Mirror of {@link handleReminder}. Both
242
+ * runId-resolved context and the inline `_im_context` fallback are
243
+ * supported, with the same single-user-only caveat for path 2.
244
+ *
245
+ * Wire history: pre-0.2.42 this was `type: 'location'` carrying geo-only
246
+ * memos; 0.2.42 generalized to 5W1H memos and renamed the wire type.
247
+ */
248
+ private handleMemo;
249
+ private sendMemoResult;
250
+ private handleApproval;
251
+ /**
252
+ * Register an approval request that did NOT come from the unix-socket
253
+ * sidecar. Used by the opencode HTTP bridge (P2): SSE event from opencode
254
+ * → bridge calls this with a `dispatch` callback that POSTs the decision
255
+ * back to opencode's REST API.
256
+ *
257
+ * Behavior is identical to the socket path — same notifier, same timeout,
258
+ * same auto-allow rules — just the delivery channel differs. The
259
+ * `dispatch` is invoked with the final Decision exactly once, on:
260
+ * - user reply via {@link resolvePending}
261
+ * - timeout (deny in normal mode, allow in auto-allow mode)
262
+ * - {@link unregisterRun} (deny: "run terminated")
263
+ * - {@link stop} (deny: "approval-bus shutting down")
264
+ *
265
+ * dispatch errors are logged and swallowed — the bus must not crash on
266
+ * a misbehaving callback.
267
+ *
268
+ * Idempotent on duplicate reqId: returns silently without firing notify
269
+ * (matches the socket path's "duplicate reqId" handling, minus the wire
270
+ * deny since the synthetic caller has no socket to deny on).
271
+ *
272
+ * Throws synchronously only when the caller's bus state is invalid (no
273
+ * notifier installed). The caller should avoid registering the synthetic
274
+ * pending in that case and fall back to its own deny path.
275
+ */
276
+ registerSyntheticPending(input: {
277
+ runId: string;
278
+ reqId: string;
279
+ toolName: string;
280
+ input: Record<string, unknown>;
281
+ /** Optional — used by Claude's MCP path; defaults to '' for synthetic. */
282
+ toolUseId?: string;
283
+ ctx: RunContext;
284
+ dispatch: (decision: Decision) => void;
285
+ }): Promise<void>;
286
+ /**
287
+ * Shared register-and-notify pipeline used by both the socket path and the
288
+ * synthetic path. Builds the PendingApproval, wires the timer, fires the
289
+ * notifier, and ensures the timer is cleared if the notifier itself throws.
290
+ */
291
+ private _registerPending;
292
+ private cancelPending;
293
+ private addAutoAllowRule;
294
+ private removeAutoAllowRule;
295
+ private removePending;
296
+ private sendDecision;
297
+ }
298
+ /** 进程级单例。im-hub 启动时 await approvalBus.start() 一次。 */
299
+ export declare const approvalBus: ApprovalBus;
300
+ //# sourceMappingURL=approval-bus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approval-bus.d.ts","sourceRoot":"","sources":["../../src/core/approval-bus.ts"],"names":[],"mappings":"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"}