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,540 @@
1
+ // approval-router — 把 approval-bus 的两个端口接到 IM messenger 上:
2
+ // 1. notifier:bus 收到 sidecar 的审批请求 → 这里翻译成文本/卡片 → 推到对应 IM thread
3
+ // 2. 拦截层:用户在该 thread 回复 y/n/批准/拒绝时,cli 主 handler 把消息先交给我们;
4
+ // 命中就 resolvePending,吃掉这条消息不进 router;不命中放行,并把已挂起的
5
+ // pending 当作"用户改主意"自动 deny。
6
+ //
7
+ // 不知道 messenger 实现细节,只通过注入的 resolveMessenger 拿到 sendMessage/sendCard。
8
+ import { approvalBus, } from './approval-bus.js';
9
+ import { logger as rootLogger } from './logger.js';
10
+ const log = rootLogger.child({ component: 'approval-router' });
11
+ /** Truncation limit for the plain-text approval prompt. Conservative because
12
+ * some IMs (older WeChat clients) start chunking aggressively past ~500
13
+ * chars and the y/n line at the bottom must stay visible. */
14
+ const MAX_INPUT_PREVIEW = 400;
15
+ /** Truncation limit for the rich-card approval prompt. Telegram allows ~4 KB
16
+ * per message; with the surrounding template (~150 chars) and a <pre>
17
+ * block, 1500 fits in one bubble and covers the long tail of Bash / Edit
18
+ * payloads without losing context. */
19
+ const MAX_INPUT_PREVIEW_CARD = 1500;
20
+ const ALLOW_TOKENS = new Set([
21
+ 'y', 'yes', 'ok', '1', '批准', '同意', '通过', '可以', '✅',
22
+ ]);
23
+ const DENY_TOKENS = new Set([
24
+ 'n', 'no', '0', '拒绝', '不同意', '不行', '不可以', '不', '❌',
25
+ ]);
26
+ /** "Approve this and auto-approve future calls of the same tool with the
27
+ * same input prefix in this session." Bus consumes `autoAllowFurther` and
28
+ * registers the rule. */
29
+ const ALLOW_ALL_TOKENS = new Set([
30
+ 'all', 'a', '全部', '总是', '都同意', '都批准',
31
+ ]);
32
+ /**
33
+ * Classify an inbound IM reply as an approval decision. Returns null when the
34
+ * reply doesn't match any known pattern — the caller should treat that as
35
+ * "user changed topic" and route normally.
36
+ */
37
+ export function parseApprovalReply(text) {
38
+ const trimmed = text.trim().toLowerCase();
39
+ if (!trimmed)
40
+ return null;
41
+ // Strip leading slashes so "/y" works too — some users do that on Telegram.
42
+ const stripped = trimmed.startsWith('/') ? trimmed.slice(1) : trimmed;
43
+ if (ALLOW_ALL_TOKENS.has(stripped)) {
44
+ return { behavior: 'allow', autoAllowFurther: true };
45
+ }
46
+ if (ALLOW_TOKENS.has(stripped)) {
47
+ return { behavior: 'allow' };
48
+ }
49
+ if (DENY_TOKENS.has(stripped)) {
50
+ return { behavior: 'deny', message: '用户在 IM 中拒绝了这次工具调用' };
51
+ }
52
+ return null;
53
+ }
54
+ /**
55
+ * Compact JSON serialize with truncation. Used by the rich-card path (which
56
+ * has its own UI rendering) — for plain-text we use formatInputBody below.
57
+ */
58
+ function safeStringify(v, maxLen) {
59
+ let s;
60
+ try {
61
+ s = JSON.stringify(v);
62
+ }
63
+ catch {
64
+ s = String(v);
65
+ }
66
+ if (s.length > maxLen)
67
+ s = `${s.slice(0, maxLen - 1)}…`;
68
+ return s;
69
+ }
70
+ /**
71
+ * Strip MCP-style prefix from a tool name for display. `mcp__imhub__create_reminder`
72
+ * → `imhub: create_reminder` (the user cares about the namespace, not the
73
+ * triple-underscore wire format).
74
+ */
75
+ function displayToolName(name) {
76
+ const m = /^mcp__([^_]+(?:_[^_]+)*)__(.+)$/.exec(name);
77
+ if (m)
78
+ return `${m[1]}: ${m[2]}`;
79
+ return name;
80
+ }
81
+ /**
82
+ * Render the input payload as a multiline body. Known tools (Bash / Read /
83
+ * Edit / Write / Grep / Glob / WebFetch) get a single labelled line for
84
+ * their primary field. Unknown tools fall back to compact JSON, truncated.
85
+ *
86
+ * The goal is "user can decide y/n in 1 second" — they shouldn't have to
87
+ * mentally parse JSON for the most common tools.
88
+ */
89
+ function formatInputBody(toolName, input, maxLen) {
90
+ // Single-field shortcuts for built-in claude-code tools.
91
+ const single = (label, key) => {
92
+ const v = input[key];
93
+ if (typeof v !== 'string')
94
+ return null;
95
+ const truncated = v.length > maxLen ? `${v.slice(0, maxLen - 1)}…` : v;
96
+ return `${label}:${truncated}`;
97
+ };
98
+ switch (toolName) {
99
+ case 'Bash': {
100
+ const cmd = single('命令', 'command');
101
+ if (cmd)
102
+ return cmd;
103
+ break;
104
+ }
105
+ case 'Read':
106
+ case 'Edit':
107
+ case 'Write':
108
+ case 'NotebookEdit': {
109
+ const fp = single('路径', 'file_path');
110
+ if (fp)
111
+ return fp;
112
+ break;
113
+ }
114
+ case 'Glob': {
115
+ const p = single('Pattern', 'pattern');
116
+ if (p)
117
+ return p;
118
+ break;
119
+ }
120
+ case 'Grep': {
121
+ const p = single('查找', 'pattern');
122
+ if (p)
123
+ return p;
124
+ break;
125
+ }
126
+ case 'WebFetch':
127
+ case 'WebSearch': {
128
+ const u = single('URL', 'url') ?? single('Query', 'query');
129
+ if (u)
130
+ return u;
131
+ break;
132
+ }
133
+ }
134
+ // Fallback: JSON dump, but pretty-printed when small enough.
135
+ let s;
136
+ try {
137
+ const pretty = JSON.stringify(input, null, 2);
138
+ s = pretty.length <= maxLen ? pretty : JSON.stringify(input);
139
+ }
140
+ catch {
141
+ s = String(input);
142
+ }
143
+ if (s.length > maxLen)
144
+ s = `${s.slice(0, maxLen - 1)}…`;
145
+ // For multi-line JSON, indent so it visually groups under the "入参" label.
146
+ if (s.includes('\n')) {
147
+ return `入参:\n${s.split('\n').map((l) => ` ${l}`).join('\n')}`;
148
+ }
149
+ return `入参:${s}`;
150
+ }
151
+ /**
152
+ * Render an approval request as a plain text message. We keep this format
153
+ * stable across IM platforms; richer flows (Feishu cards with buttons) can
154
+ * layer on later by checking platform/sendCard.
155
+ *
156
+ * Two flavors:
157
+ * - Normal: y/n/all action box with timeout footer
158
+ * - Auto-allow grace mode (n.autoAllow set): "⏱ 自动放行中…" with deny option
159
+ */
160
+ export function formatApprovalPrompt(n) {
161
+ const tool = displayToolName(n.toolName);
162
+ const body = formatInputBody(n.toolName, n.input, MAX_INPUT_PREVIEW);
163
+ if (n.autoAllow) {
164
+ const sec = Math.round(n.autoAllow.graceMs / 1000);
165
+ return [
166
+ `⏱ 自动放行中(${sec}s 后执行)`,
167
+ ``,
168
+ `工具:${tool}`,
169
+ body,
170
+ ``,
171
+ `回复 n 可拒绝并撤销规则`,
172
+ `req ${n.reqId.slice(0, 8)}`,
173
+ ].join('\n');
174
+ }
175
+ return [
176
+ `🔐 需要审批`,
177
+ ``,
178
+ `工具:${tool}`,
179
+ body,
180
+ ``,
181
+ `y 批准`,
182
+ `n 拒绝`,
183
+ `all 本会话同类自动放行`,
184
+ ``,
185
+ `5 分钟未回 = 拒绝 · req ${n.reqId.slice(0, 8)}`,
186
+ ].join('\n');
187
+ }
188
+ /**
189
+ * Map an IM platform name to its messenger registration. WeChat is special-
190
+ * cased because the messenger is registered as "wechat-ilink" but messages
191
+ * carry platform="wechat".
192
+ */
193
+ export function platformToMessengerName(platform) {
194
+ return platform === 'wechat' ? 'wechat-ilink' : platform;
195
+ }
196
+ let installed = null;
197
+ const activeCards = new Map();
198
+ /**
199
+ * Wire approval-bus.notifier to the messenger layer. Idempotent: calling
200
+ * install() twice replaces the previous wiring.
201
+ *
202
+ * Notifier prefers the rich-card path (sendApprovalCard) when the resolved
203
+ * adapter implements it; otherwise it falls back to the plain-text path
204
+ * (sendMessage with formatApprovalPrompt). The text path is the canonical
205
+ * approval channel for adapters without native interactive buttons (Feishu
206
+ * cards aren't wired for buttons yet, WeChat iLink can't render them).
207
+ *
208
+ * Button callbacks: for each platform listed in buttonCallbackPlatforms
209
+ * whose adapter implements onButtonCallback, we subscribe a handler that
210
+ * parses callback_data of the form `apv:<reqId>:<y|n|a>` and resolves the
211
+ * matching pending. Subscribing happens once at install — adapters started
212
+ * later won't receive button wiring until install() is called again.
213
+ */
214
+ export function install(opts) {
215
+ installed = opts;
216
+ approvalBus.setNotifier(async (n) => {
217
+ const m = opts.resolveMessenger(n.ctx.platform);
218
+ if (!m) {
219
+ log.warn({ event: 'approval.router.no_messenger', platform: n.ctx.platform, reqId: n.reqId }, 'No messenger registered for platform; approval cannot be surfaced');
220
+ // Throwing tells the bus to auto-deny this request.
221
+ throw new Error(`no messenger for platform ${n.ctx.platform}`);
222
+ }
223
+ // Rich-card path (Telegram inline keyboard).
224
+ if (m.sendApprovalCard) {
225
+ const prompt = {
226
+ reqId: n.reqId,
227
+ toolName: n.toolName,
228
+ inputJson: safeStringify(n.input, MAX_INPUT_PREVIEW_CARD),
229
+ mode: n.autoAllow ? 'auto-allow' : 'normal',
230
+ graceSeconds: n.autoAllow ? Math.round(n.autoAllow.graceMs / 1000) : undefined,
231
+ };
232
+ try {
233
+ const { messageId } = await m.sendApprovalCard(n.ctx.threadId, prompt);
234
+ activeCards.set(n.reqId, {
235
+ platform: n.ctx.platform,
236
+ threadId: n.ctx.threadId,
237
+ messageId,
238
+ });
239
+ log.info({
240
+ event: 'approval.router.card_sent',
241
+ platform: n.ctx.platform,
242
+ threadId: n.ctx.threadId,
243
+ reqId: n.reqId,
244
+ messageId,
245
+ });
246
+ return;
247
+ }
248
+ catch (err) {
249
+ log.warn({
250
+ event: 'approval.router.card_failed_fallback',
251
+ err: String(err),
252
+ reqId: n.reqId,
253
+ }, 'sendApprovalCard threw; falling back to text path');
254
+ // Fall through to text path
255
+ }
256
+ }
257
+ // Text path (Feishu / WeChat / any adapter without sendApprovalCard).
258
+ const text = formatApprovalPrompt(n);
259
+ await m.sendMessage(n.ctx.threadId, text);
260
+ log.info({ event: 'approval.router.prompt_sent', platform: n.ctx.platform, threadId: n.ctx.threadId, reqId: n.reqId });
261
+ });
262
+ const platforms = opts.buttonCallbackPlatforms ?? ['telegram', 'feishu', 'wechat', 'discord', 'web'];
263
+ for (const platform of platforms) {
264
+ bindButtonHandlerForPlatform(platform);
265
+ }
266
+ // Listen for non-user resolutions (timeout, sidecar disconnect, run
267
+ // terminated, shutdown, notifier error) so we can collapse the card to
268
+ // a terminal "已过期" state. The user-driven path (button click / y-n
269
+ // text reply) edits the card itself BEFORE the listener fires — by that
270
+ // time activeCards has already been pruned, so this listener no-ops on
271
+ // cause='user'. Defensive double-check via cause makes intent explicit.
272
+ approvalBus.setResolutionListener((e) => onBusResolution(e));
273
+ }
274
+ export function uninstall() {
275
+ installed = null;
276
+ approvalBus.setNotifier(null);
277
+ approvalBus.setResolutionListener(null);
278
+ activeCards.clear();
279
+ // Note: we don't unsubscribe button handlers from messengers — tests that
280
+ // re-install will overwrite via onButtonCallback's "replace previous"
281
+ // contract. Production never uninstalls.
282
+ }
283
+ /**
284
+ * Bind the inline-button handler for a single platform's messenger. The
285
+ * install() loop calls this for every default platform at boot; callers
286
+ * (e.g. web/server.ts) that register their messenger AFTER install have
287
+ * to call this themselves to get button-click → resolvePending wiring.
288
+ *
289
+ * Idempotent at the messenger level — onButtonCallback's contract is
290
+ * "replace previous handler", so re-calling this on the same platform
291
+ * just rewires.
292
+ *
293
+ * Silent no-op when the messenger isn't registered yet, has no
294
+ * onButtonCallback, or the router hasn't been install()'d.
295
+ */
296
+ export function bindButtonHandlerForPlatform(platform) {
297
+ if (!installed)
298
+ return;
299
+ const m = installed.resolveMessenger(platform);
300
+ if (!m?.onButtonCallback)
301
+ return;
302
+ m.onButtonCallback(async (cb) => handleButtonCallback(platform, cb));
303
+ log.info({ event: 'approval.router.button_handler_bound', platform });
304
+ }
305
+ /**
306
+ * Bus-side resolution listener. Fires for every transition pending → resolved
307
+ * regardless of cause. We only act on non-user causes here: those are the
308
+ * cases where no IM-side handler updated the card, so without us the user
309
+ * sees a card with stale buttons.
310
+ *
311
+ * For auto-allow grace expiry that resolves to allow, we still mark the card
312
+ * as 'allowed' (without byUserDisplay) — the call did go through, just
313
+ * silently. For all other non-user causes (timeout deny, disconnect, run
314
+ * terminated, shutdown, notifier error), the card collapses to 'expired'.
315
+ */
316
+ function onBusResolution(e) {
317
+ if (e.cause === 'user')
318
+ return; // button/text path already edited
319
+ const card = activeCards.get(e.reqId);
320
+ if (!card)
321
+ return; // text-fallback path doesn't track cards
322
+ activeCards.delete(e.reqId);
323
+ if (!installed)
324
+ return;
325
+ const m = installed.resolveMessenger(card.platform);
326
+ if (!m?.editApprovalCard)
327
+ return;
328
+ let decision;
329
+ if (e.cause === 'timeout' && e.decision.behavior === 'allow') {
330
+ // auto-allow grace fired silently
331
+ decision = 'allowed';
332
+ }
333
+ else {
334
+ decision = 'expired';
335
+ }
336
+ m.editApprovalCard(card.threadId, card.messageId, {
337
+ decision,
338
+ atDate: new Date(),
339
+ }).catch((err) => {
340
+ log.warn({ event: 'approval.router.bus_edit_failed', reqId: e.reqId, err: String(err) });
341
+ });
342
+ }
343
+ /**
344
+ * Called by cli's onMessage handler before it routes to the agent.
345
+ * Returns true when this message was an approval reply (so the caller should
346
+ * stop and not invoke the normal router).
347
+ *
348
+ * Behavior:
349
+ * - If thread has no pending approval → return false, do nothing
350
+ * - If thread has pending AND text parses as decision → resolve, return true
351
+ * - If thread has pending AND text does NOT parse → auto-deny pending
352
+ * (user is moving on), return false so the message routes normally
353
+ *
354
+ * Receipt: when the resolution adds or revokes an auto-allow rule, also
355
+ * sends a one-line confirmation back to the IM thread so the user knows
356
+ * the rule landed (or got cleared). Best-effort: a missing messenger or
357
+ * sendMessage failure is logged and ignored — the approval itself already
358
+ * resolved successfully.
359
+ */
360
+ /**
361
+ * Called by cli's onMessage handler before it routes to the agent.
362
+ * `key` must be a composite key from `threadKey(platform, channelId, threadId)`
363
+ * — same value the bus stored under at registerRun/registerSyntheticPending
364
+ * time. A bare threadId will miss in multi-platform deployments.
365
+ */
366
+ export function tryHandleApprovalReply(key, text) {
367
+ if (!approvalBus.hasPendingFor(key))
368
+ return false;
369
+ const decision = parseApprovalReply(text);
370
+ if (decision) {
371
+ const info = approvalBus.resolvePending(key, decision);
372
+ log.info({ event: 'approval.router.resolved', key, behavior: decision.behavior });
373
+ if (info) {
374
+ editCardOnThreadResolution(info, decision, undefined);
375
+ sendReceiptIfAny(info, decision);
376
+ }
377
+ return true;
378
+ }
379
+ const redirectDecision = {
380
+ behavior: 'deny',
381
+ message: '用户在 IM 中改换话题,未给出审批回复',
382
+ };
383
+ const info = approvalBus.resolvePending(key, redirectDecision);
384
+ if (info)
385
+ editCardOnThreadResolution(info, redirectDecision, undefined);
386
+ log.info({ event: 'approval.router.redirected', key });
387
+ return false;
388
+ }
389
+ /**
390
+ * Inline-button handler. callback_data format: `apv:<reqId>:<y|n|a>`.
391
+ * Resolves the matching pending via approvalBus.resolvePending, acks the
392
+ * button (must happen within ~1s on Telegram), edits the card to its
393
+ * terminal state, and sends the same auto-allow receipt the text path
394
+ * would send.
395
+ *
396
+ * Late clicks (already resolved or expired): we ack with a soft hint and
397
+ * try to edit the card to the "expired" state so subsequent users see a
398
+ * clean terminal view.
399
+ */
400
+ async function handleButtonCallback(platform, cb) {
401
+ const parsed = parseCallbackData(cb.data);
402
+ if (!parsed) {
403
+ await cb.ack('未识别的按钮');
404
+ return;
405
+ }
406
+ const decision = decisionFromButton(parsed.choice);
407
+ const info = approvalBus.resolvePendingByReqId(parsed.reqId, decision);
408
+ if (!info) {
409
+ await cb.ack('请求已过期或已被处理');
410
+ if (installed) {
411
+ const m = installed.resolveMessenger(platform);
412
+ if (m?.editApprovalCard) {
413
+ await m.editApprovalCard(cb.threadId, cb.messageId, {
414
+ decision: 'expired',
415
+ atDate: new Date(),
416
+ }).catch((err) => {
417
+ log.warn({ event: 'approval.router.expire_edit_failed', err: String(err) });
418
+ });
419
+ }
420
+ }
421
+ activeCards.delete(parsed.reqId);
422
+ return;
423
+ }
424
+ const ackText = decision.behavior === 'allow'
425
+ ? (decision.autoAllowFurther ? '🛡 已批准并自动放行' : '✅ 已批准')
426
+ : (info.wasAutoAllow ? '❌ 已拒绝并撤销规则' : '❌ 已拒绝');
427
+ await cb.ack(ackText);
428
+ if (installed) {
429
+ const m = installed.resolveMessenger(info.platform);
430
+ if (m?.editApprovalCard) {
431
+ const outcome = {
432
+ decision: outcomeFromDecision(decision, info.wasAutoAllow),
433
+ byUserDisplay: cb.userDisplay,
434
+ atDate: new Date(),
435
+ };
436
+ await m.editApprovalCard(cb.threadId, cb.messageId, outcome).catch((err) => {
437
+ log.warn({ event: 'approval.router.edit_failed', err: String(err) });
438
+ });
439
+ }
440
+ }
441
+ activeCards.delete(parsed.reqId);
442
+ log.info({
443
+ event: 'approval.router.button_resolved',
444
+ platform,
445
+ threadId: cb.threadId,
446
+ behavior: decision.behavior,
447
+ autoAllowFurther: decision.behavior === 'allow' && decision.autoAllowFurther === true,
448
+ });
449
+ sendReceiptIfAny(info, decision);
450
+ }
451
+ /** Find the active card matching the resolved reqId and edit it to its
452
+ * terminal state. Keyed strictly by reqId — both the text y/n path and the
453
+ * button-callback path now resolve via reqId, so a thread-scan fallback is
454
+ * unnecessary. No-op when no card was registered (other IMs / fallback). */
455
+ function editCardOnThreadResolution(info, decision, byUserDisplay) {
456
+ if (!installed)
457
+ return;
458
+ const card = activeCards.get(info.reqId);
459
+ if (!card)
460
+ return;
461
+ activeCards.delete(info.reqId);
462
+ const m = installed.resolveMessenger(info.platform);
463
+ if (!m?.editApprovalCard)
464
+ return;
465
+ const outcome = {
466
+ decision: outcomeFromDecision(decision, info.wasAutoAllow),
467
+ byUserDisplay,
468
+ atDate: new Date(),
469
+ };
470
+ m.editApprovalCard(card.threadId, card.messageId, outcome).catch((err) => {
471
+ log.warn({ event: 'approval.router.edit_failed', err: String(err) });
472
+ });
473
+ }
474
+ function outcomeFromDecision(d, wasAutoAllow) {
475
+ if (d.behavior === 'allow') {
476
+ return d.autoAllowFurther ? 'allowed-pinned' : 'allowed';
477
+ }
478
+ return wasAutoAllow ? 'denied-revoked' : 'denied';
479
+ }
480
+ /**
481
+ * Parse callback_data of the form `apv:<reqId>:<y|n|a>`. reqId may itself
482
+ * contain characters but never `:` in practice (UUID / opaque sidecar id);
483
+ * we still split on the LAST colon to be safe, leaving the choice as the
484
+ * single trailing letter.
485
+ */
486
+ export function parseCallbackData(data) {
487
+ if (!data.startsWith('apv:'))
488
+ return null;
489
+ const rest = data.slice(4);
490
+ const lastColon = rest.lastIndexOf(':');
491
+ if (lastColon <= 0)
492
+ return null;
493
+ const reqId = rest.slice(0, lastColon);
494
+ const choice = rest.slice(lastColon + 1);
495
+ if (choice !== 'y' && choice !== 'n' && choice !== 'a')
496
+ return null;
497
+ if (!reqId)
498
+ return null;
499
+ return { reqId, choice };
500
+ }
501
+ function decisionFromButton(choice) {
502
+ if (choice === 'y')
503
+ return { behavior: 'allow' };
504
+ if (choice === 'a')
505
+ return { behavior: 'allow', autoAllowFurther: true };
506
+ return { behavior: 'deny', message: '用户在 IM 中拒绝了这次工具调用(按钮)' };
507
+ }
508
+ /**
509
+ * If the user just enabled an auto-allow rule (allow + autoAllowFurther) or
510
+ * just revoked one (deny while in grace mode), push a short confirmation
511
+ * line to the originating thread.
512
+ */
513
+ function sendReceiptIfAny(info, decision) {
514
+ if (!installed)
515
+ return;
516
+ let msg = null;
517
+ if (decision.behavior === 'allow' && decision.autoAllowFurther) {
518
+ msg = [
519
+ '✅ 已批准并启用自动放行',
520
+ `规则:${info.toolName} 前缀 "${info.fingerprint}" 5s 内自动放行`,
521
+ '撤销:本会话回 n 单条 / /approval clear 清空',
522
+ ].join('\n');
523
+ }
524
+ else if (decision.behavior === 'deny' && info.wasAutoAllow) {
525
+ msg = `❌ 已拒绝并撤销自动放行规则:${info.toolName} "${info.fingerprint}"`;
526
+ }
527
+ if (!msg)
528
+ return;
529
+ const m = installed.resolveMessenger(info.platform);
530
+ if (!m) {
531
+ log.warn({ event: 'approval.router.receipt_no_messenger', platform: info.platform });
532
+ return;
533
+ }
534
+ m.sendMessage(info.threadId, msg).catch((err) => {
535
+ log.warn({ event: 'approval.router.receipt_failed', err: String(err) });
536
+ });
537
+ }
538
+ /** Test helper — not exported from index. */
539
+ export function _isInstalled() { return installed !== null; }
540
+ //# sourceMappingURL=approval-router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approval-router.js","sourceRoot":"","sources":["../../src/core/approval-router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import type Database from 'better-sqlite3';
2
+ export interface AuditRecord {
3
+ traceId: string;
4
+ userId: string;
5
+ platform: string;
6
+ agent: string;
7
+ intent: string;
8
+ promptLen: number;
9
+ responseLen: number;
10
+ durationMs: number;
11
+ cost: number;
12
+ success: boolean;
13
+ error?: string;
14
+ }
15
+ export declare function logInvocation(rec: AuditRecord): void;
16
+ export interface QueryOpts {
17
+ limit?: number;
18
+ agent?: string;
19
+ platform?: string;
20
+ userId?: string;
21
+ intent?: string;
22
+ days?: number;
23
+ }
24
+ export interface InvocationRow {
25
+ id: number;
26
+ trace_id: string;
27
+ ts: string;
28
+ user_id: string;
29
+ platform: string;
30
+ agent: string;
31
+ intent: string;
32
+ prompt_len: number;
33
+ response_len: number;
34
+ duration_ms: number;
35
+ cost: number;
36
+ success: number;
37
+ error: string | null;
38
+ }
39
+ export declare function queryInvocations(opts?: QueryOpts): InvocationRow[];
40
+ /**
41
+ * Delete rows older than the retention window. Returns number of deleted
42
+ * rows so callers / tests can assert behavior.
43
+ */
44
+ export declare function pruneExpired(d?: Database.Database): number;
45
+ /** Stop the periodic retention sweep (used by tests and graceful shutdown). */
46
+ export declare function stopRetentionSweep(): void;
47
+ /** Close the underlying SQLite handle. Pairs with stopRetentionSweep on
48
+ * graceful shutdown so WAL is checkpointed cleanly (L2). */
49
+ export declare function closeAuditDb(): void;
50
+ export declare function getStats(): {
51
+ total: number;
52
+ byAgent: Record<string, number>;
53
+ totalCost: number;
54
+ };
55
+ //# sourceMappingURL=audit-log.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit-log.d.ts","sourceRoot":"","sources":["../../src/core/audit-log.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAA;AAwE1C,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI,CAyCpD;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,QAAQ,EAAE,MAAM,CAAA;IAChB,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,MAAM,CAAA;IACpB,WAAW,EAAE,MAAM,CAAA;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CACrB;AAED,wBAAgB,gBAAgB,CAAC,IAAI,GAAE,SAAc,GAAG,aAAa,EAAE,CAyBtE;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,CAAC,GAAE,QAAQ,CAAC,QAAmB,GAAG,MAAM,CAmBpE;AAED,+EAA+E;AAC/E,wBAAgB,kBAAkB,IAAI,IAAI,CAKzC;AAED;6DAC6D;AAC7D,wBAAgB,YAAY,IAAI,IAAI,CAEnC;AAED,wBAAgB,QAAQ,IAAI;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAgBhG"}