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,169 @@
1
+ // reminder-rpc.ts — RPC handlers for agent-initiated reminder operations.
2
+ //
3
+ // Lives one layer below the MCP sidecar: the sidecar parses tool calls
4
+ // from the agent, sends them as `type:'reminder'` messages on the bus,
5
+ // and the bus delegates to handleReminderOp() here. Keeps approval-bus.ts
6
+ // focused on transport and lets reminder logic stay testable on its own.
7
+ //
8
+ // Why not just import this from sidecar directly?
9
+ // The sidecar runs as a separate Node process (spawned by claude-code via
10
+ // --mcp-config) and shouldn't touch reminders.db / sessionManager / the
11
+ // messenger registry — those are main-process state. The bus already has
12
+ // the runId → RunContext mapping (from approvalBus.registerRun), so it's
13
+ // the natural mediator.
14
+ import { logger as rootLogger } from './logger.js';
15
+ import { createReminder, listReminders, cancelReminder, snoozeReminder, parseDuration, isValidRecurrence, ReminderError, MIN_FUTURE_MS, } from './reminders.js';
16
+ import { setPending } from './pending-reminder.js';
17
+ const log = rootLogger.child({ component: 'reminder-rpc' });
18
+ let confirmNotifier = null;
19
+ export function setReminderConfirmNotifier(n) {
20
+ confirmNotifier = n;
21
+ }
22
+ const HIGH_FREQ_THRESHOLD_MS = 60 * 60_000;
23
+ export async function handleReminderOp(op, payload, ctx) {
24
+ try {
25
+ switch (op) {
26
+ case 'create': return await handleCreate(payload, ctx);
27
+ case 'list': return handleList(ctx);
28
+ case 'cancel': return handleCancel(payload, ctx);
29
+ case 'snooze': return handleSnooze(payload, ctx);
30
+ default: return { ok: false, error: `unknown op: ${op}` };
31
+ }
32
+ }
33
+ catch (err) {
34
+ if (err instanceof ReminderError)
35
+ return { ok: false, error: err.message };
36
+ log.warn({ event: 'rpc.unhandled', err: err instanceof Error ? err.message : String(err) });
37
+ return { ok: false, error: err instanceof Error ? err.message : String(err) };
38
+ }
39
+ }
40
+ // ─── create ─────────────────────────────────────────────────────────
41
+ async function handleCreate(payload, ctx) {
42
+ const fireAtRaw = typeof payload.fireAt === 'string' ? payload.fireAt : null;
43
+ const text = typeof payload.text === 'string' ? payload.text.trim() : '';
44
+ const recurrenceRaw = typeof payload.recurrence === 'string' ? payload.recurrence : null;
45
+ const promptModeRaw = typeof payload.promptMode === 'string' ? payload.promptMode : 'llm';
46
+ const promptMode = promptModeRaw === 'literal' ? 'literal' : 'llm';
47
+ if (!fireAtRaw)
48
+ return { ok: false, error: 'fireAt is required (ISO 8601 local time)' };
49
+ if (!text)
50
+ return { ok: false, error: 'text is required' };
51
+ const fireAt = new Date(fireAtRaw);
52
+ if (Number.isNaN(fireAt.getTime())) {
53
+ return { ok: false, error: `bad fireAt: "${fireAtRaw}"` };
54
+ }
55
+ if (recurrenceRaw && !isValidRecurrence(recurrenceRaw)) {
56
+ return { ok: false, error: `bad recurrence: "${recurrenceRaw}"` };
57
+ }
58
+ const recurrence = recurrenceRaw ?? undefined;
59
+ // High-freq + LLM polish: stash a pending entry + send a confirmation
60
+ // card to the user. Agent gets back a 'pending_confirmation' status and
61
+ // should keep its reply terse — the card is the user-facing prompt.
62
+ const isHighFreqLlm = promptMode === 'llm'
63
+ && recurrence?.startsWith('every:')
64
+ && (parseDuration(recurrence.slice(6)) ?? Number.POSITIVE_INFINITY) < HIGH_FREQ_THRESHOLD_MS;
65
+ if (isHighFreqLlm) {
66
+ const tk = `${ctx.platform}:${ctx.channelId}:${ctx.threadId}`;
67
+ setPending(tk, {
68
+ fireAt, text, recurrence,
69
+ });
70
+ const card = [
71
+ '🔔 这是一条**高频循环 + LLM 润色**的提醒,需要你确认',
72
+ ` 内容:${text}`,
73
+ ` 循环:${recurrence}`,
74
+ ` 首次:${fireAt.toLocaleString()}`,
75
+ '',
76
+ '高频循环每次都会调一次 LLM 来润色,可能不是你想要的。',
77
+ '回复 `y` 创建(含润色) / `n` 取消(或在创建时加 `literal` 关闭润色)',
78
+ ].join('\n');
79
+ if (confirmNotifier) {
80
+ try {
81
+ await confirmNotifier(ctx, card);
82
+ }
83
+ catch (err) {
84
+ log.warn({ event: 'rpc.notifier_failed', err: err instanceof Error ? err.message : String(err) });
85
+ }
86
+ }
87
+ return {
88
+ ok: true,
89
+ result: {
90
+ status: 'pending_confirmation',
91
+ message: 'High-frequency + LLM polish requires user confirmation. A card has been sent to the user — wait for them to reply y/n. You should keep your own reply brief.',
92
+ },
93
+ };
94
+ }
95
+ // Normal create
96
+ const id = createReminder({
97
+ fireAt, text,
98
+ platform: ctx.platform, channelId: ctx.channelId, threadId: ctx.threadId,
99
+ userId: ctx.userId,
100
+ source: 'mcp',
101
+ recurrence,
102
+ promptMode,
103
+ });
104
+ log.info({ event: 'rpc.create.ok', id, recurrence, promptMode, threadId: ctx.threadId });
105
+ return {
106
+ ok: true,
107
+ result: {
108
+ id,
109
+ fireAt: fireAt.toISOString(),
110
+ text,
111
+ recurrence: recurrence ?? null,
112
+ promptMode,
113
+ message: `Reminder #${id} created. It will fire at ${fireAt.toLocaleString()}${recurrence ? ` and recur (${recurrence})` : ''}.`,
114
+ },
115
+ };
116
+ }
117
+ // ─── list ───────────────────────────────────────────────────────────
118
+ function handleList(ctx) {
119
+ const owner = ctx.userId ? { creatorId: ctx.userId } : {};
120
+ const all = listReminders({ ...owner, status: 'pending', limit: 50 });
121
+ const slim = all.map((r) => ({
122
+ id: r.id,
123
+ fire_at: r.fire_at,
124
+ text: r.text,
125
+ recurrence: r.recurrence,
126
+ prompt_mode: r.prompt_mode,
127
+ }));
128
+ return { ok: true, result: { reminders: slim } };
129
+ }
130
+ // ─── cancel ─────────────────────────────────────────────────────────
131
+ function handleCancel(payload, ctx) {
132
+ const id = typeof payload.id === 'number' ? payload.id : Number.parseInt(String(payload.id), 10);
133
+ if (!Number.isFinite(id) || id <= 0)
134
+ return { ok: false, error: 'id must be a positive integer' };
135
+ const owner = ctx.userId ? { creatorId: ctx.userId } : {};
136
+ const ok = cancelReminder(id, owner);
137
+ return ok
138
+ ? { ok: true, result: { id, cancelled: true, message: `Reminder #${id} cancelled.` } }
139
+ : { ok: false, error: `Reminder #${id} not found, not owned by you, or already terminal.` };
140
+ }
141
+ // ─── snooze ─────────────────────────────────────────────────────────
142
+ function handleSnooze(payload, ctx) {
143
+ const id = typeof payload.id === 'number' ? payload.id : Number.parseInt(String(payload.id), 10);
144
+ const duration = typeof payload.duration === 'string' ? payload.duration : '';
145
+ if (!Number.isFinite(id) || id <= 0)
146
+ return { ok: false, error: 'id must be a positive integer' };
147
+ if (!duration)
148
+ return { ok: false, error: 'duration is required (e.g. "5m", "30m", "2h")' };
149
+ const deltaMs = parseDuration(duration);
150
+ if (deltaMs === null)
151
+ return { ok: false, error: `bad duration: "${duration}". Use s/m/h/d (e.g. 5m).` };
152
+ if (deltaMs < MIN_FUTURE_MS) {
153
+ return { ok: false, error: `duration too short (min ${MIN_FUTURE_MS / 1000}s)` };
154
+ }
155
+ const owner = ctx.userId ? { creatorId: ctx.userId } : {};
156
+ try {
157
+ const newId = snoozeReminder(id, deltaMs, owner);
158
+ return {
159
+ ok: true,
160
+ result: { newId, originalId: id, duration, message: `Reminder #${id} snoozed by ${duration} → new #${newId}.` },
161
+ };
162
+ }
163
+ catch (err) {
164
+ if (err instanceof ReminderError)
165
+ return { ok: false, error: err.message };
166
+ throw err;
167
+ }
168
+ }
169
+ //# sourceMappingURL=reminder-rpc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reminder-rpc.js","sourceRoot":"","sources":["../../src/core/reminder-rpc.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,159 @@
1
+ export declare const MAX_PENDING_PER_USER = 50;
2
+ export declare const MIN_FUTURE_MS: number;
3
+ export declare const MAX_FUTURE_MS: number;
4
+ export declare const MAX_TEXT_LEN = 1000;
5
+ export type ReminderStatus = 'pending' | 'firing' | 'fired' | 'cancelled' | 'failed';
6
+ export type PromptMode = 'literal' | 'llm';
7
+ export interface Reminder {
8
+ id: number;
9
+ fire_at: string;
10
+ text: string;
11
+ platform: string;
12
+ channel_id: string;
13
+ thread_id: string;
14
+ user_id: string;
15
+ status: ReminderStatus;
16
+ created_at: string;
17
+ fired_at: string | null;
18
+ error: string | null;
19
+ source: string;
20
+ parent_id: number | null;
21
+ recurrence: string | null;
22
+ last_fired_at: string | null;
23
+ /** 'llm' = at fire time, treat `text` as a prompt and ask the active
24
+ * agent to compose the actual delivery. 'literal' = deliver `text` as-is. */
25
+ prompt_mode: PromptMode;
26
+ }
27
+ export interface CreateReminderInput {
28
+ fireAt: Date;
29
+ text: string;
30
+ platform: string;
31
+ channelId: string;
32
+ threadId: string;
33
+ userId: string;
34
+ source?: 'slash' | 'mcp' | 'api';
35
+ parentId?: number;
36
+ /** Recurrence spec: `every:5m` / `daily:HH:MM` / `weekly:1,3,5:HH:MM`.
37
+ * When set, the row stays `pending` after each fire and `fire_at` is rolled
38
+ * forward to the next occurrence. Cancel via /remind cancel <id>. */
39
+ recurrence?: string;
40
+ /** Default 'llm'. Set 'literal' to bypass LLM polish and deliver text as-is. */
41
+ promptMode?: PromptMode;
42
+ }
43
+ export interface OwnerOpts {
44
+ /** When set, list/get/cancel/snooze only see rows where user_id matches
45
+ * OR is empty (legacy/system rows). Same model as schedule.ts. */
46
+ creatorId?: string;
47
+ }
48
+ export declare class ReminderError extends Error {
49
+ code: string;
50
+ constructor(code: string, msg: string);
51
+ }
52
+ /** "2m" / "90s" / "3h" / "1d" → milliseconds. Rejects 0/negative/non-int. */
53
+ export declare function parseDuration(s: string): number | null;
54
+ /** "18:30" → today's 18:30 if still in the future, else tomorrow's 18:30.
55
+ * Uses server TZ (override at process level via TZ=… env). */
56
+ export declare function parseClock(s: string, now?: Date): Date | null;
57
+ /** ISO-ish absolute datetime "2026-05-09T20:00" / "2026-05-09T20:00:00Z" etc.
58
+ * Trailing seconds and timezone suffix are optional. */
59
+ export declare function parseISO(s: string): Date | null;
60
+ /** Unified parser tried in order: duration → clock → ISO. */
61
+ export declare function parseWhen(s: string, now?: Date): {
62
+ ok: true;
63
+ fireAt: Date;
64
+ } | {
65
+ ok: false;
66
+ reason: string;
67
+ };
68
+ /**
69
+ * Consume a time-expression prefix from the head of `s`, supporting Chinese
70
+ * (no-separator allowed: "40秒喝水" / "下午6点下班") and English/ISO formats.
71
+ * Returns { fireAt, rest } on success, null when nothing matches.
72
+ *
73
+ * This is the main entry point used by the /remind slash handler so users
74
+ * don't need to remember strict syntax.
75
+ */
76
+ export declare function parseWhenPrefix(s: string, now?: Date): {
77
+ fireAt: Date;
78
+ rest: string;
79
+ } | null;
80
+ export declare const MIN_RECURRENCE_INTERVAL_MS: number;
81
+ /** Validate a recurrence spec string. Returns true if parseable. */
82
+ export declare function isValidRecurrence(spec: string): boolean;
83
+ /**
84
+ * Compute the next fire time for a recurring reminder.
85
+ *
86
+ * `anchor` is the previous fire_at (for `every:` we step forward from there;
87
+ * if we missed cycles while offline, we fast-forward past `now`). For clock-
88
+ * based recurrences (daily/weekly) anchor is ignored — we always pick the
89
+ * next future slot from `now`.
90
+ *
91
+ * Returns null if the spec is malformed or has no satisfiable next slot.
92
+ */
93
+ export declare function computeNext(spec: string, anchor: Date, now: Date): Date | null;
94
+ /** Human-readable recurrence label for /remind list. */
95
+ export declare function describeRecurrence(spec: string): string;
96
+ /**
97
+ * Consume a recurrence prefix from the head of `s`. Supports:
98
+ *
99
+ * 每5分钟 / 每隔5分钟 / 每2小时 / 每30秒(拒绝, 不做亚分钟级)
100
+ * 每天早上8点 / 每日下午6点半 / 每天8:30
101
+ * 每周一8点 / 每周一三五9点 / 每周末10点 / 每个工作日9点
102
+ * every 5m / every 1h
103
+ *
104
+ * Returns `{ recurrence, fireAt, rest }` where `fireAt` is the FIRST occurrence
105
+ * (≥ now). `null` when no recurrence pattern matched.
106
+ */
107
+ export declare function parseRecurrencePrefix(s: string, now?: Date): {
108
+ recurrence: string;
109
+ fireAt: Date;
110
+ rest: string;
111
+ } | null;
112
+ export declare function createReminder(input: CreateReminderInput): number;
113
+ export declare function listReminders(opts?: OwnerOpts & {
114
+ status?: ReminderStatus;
115
+ limit?: number;
116
+ }): Reminder[];
117
+ export declare function getReminder(id: number, opts?: OwnerOpts): Reminder | null;
118
+ export declare function cancelReminder(id: number, opts?: OwnerOpts): boolean;
119
+ export declare function clearReminders(opts: {
120
+ creatorId: string;
121
+ }): number;
122
+ /** Snooze an existing reminder by `deltaMs`: clones the row's text and target
123
+ * thread to a new pending row, then marks the original 'cancelled' (if still
124
+ * pending) or just chains parent_id (if already fired). Returns new id. */
125
+ export declare function snoozeReminder(id: number, deltaMs: number, opts?: OwnerOpts): number;
126
+ /** Bind (or rebind) an email address to an IM user. Returns the bound email. */
127
+ export declare function bindEmail(platform: string, userId: string, email: string): string;
128
+ /** Look up the bound email for an IM user, or null. */
129
+ export declare function getBoundEmail(platform: string, userId: string): string | null;
130
+ /** Remove the binding for an IM user. Returns true if a row was deleted. */
131
+ export declare function unbindEmail(platform: string, userId: string): boolean;
132
+ /**
133
+ * Render a compact "background context" block listing the user's pending
134
+ * reminders for the current platform. Used by router.ts to prepend to the
135
+ * agent prompt so the agent has live visibility into the user's queue —
136
+ * lets it answer "what reminders do I have?" without an extra
137
+ * list_reminders tool call, and avoids creating duplicates.
138
+ *
139
+ * Empty string when nothing pending — caller should noop.
140
+ *
141
+ * Cost: ~80-200 tokens per message when populated. Bounded to 5 reminders.
142
+ */
143
+ export declare function buildContextSnippet(platform: string, userId: string): string;
144
+ /** Whether the LLM intent detector should run for this user's non-slash
145
+ * messages. Default on (no row = enabled). DB-unavailable also returns
146
+ * true so users on bun/fail-soft don't lose the feature silently. */
147
+ export declare function isAiwatchEnabled(platform: string, userId: string): boolean;
148
+ /** Set the aiwatch enabled flag. UPSERT semantics. Returns the new value. */
149
+ export declare function setAiwatchEnabled(platform: string, userId: string, enabled: boolean): boolean;
150
+ /** Move a failed/cancelled reminder back to pending with a fresh fireAt
151
+ * (now + MIN_FUTURE_MS). Owner-scoped. Returns true on success. */
152
+ export declare function retryReminder(id: number, opts?: OwnerOpts): boolean;
153
+ /** Run a single tick. Exposed for tests so they can advance the clock manually. */
154
+ export declare function tick(now?: Date): Promise<number>;
155
+ /** Start the periodic ticker. Idempotent. */
156
+ export declare function startReminderEngine(): void;
157
+ export declare function stopReminderEngine(): void;
158
+ export declare function closeReminderDb(): void;
159
+ //# sourceMappingURL=reminders.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reminders.d.ts","sourceRoot":"","sources":["../../src/core/reminders.ts"],"names":[],"mappings":"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"}