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,115 @@
1
+ // Rate limiter — per-user token bucket for agent invocations
2
+ const DEFAULT_RATE = 10; // tokens per interval
3
+ const DEFAULT_INTERVAL_MS = 60_000; // 1 minute
4
+ const DEFAULT_BURST = 15; // max tokens in bucket
5
+ /**
6
+ * Threshold for the opportunistic bucket-map sweep performed inside
7
+ * {@link RateLimiter.allow}. Keeps the in-memory map bounded under bursty
8
+ * workloads with high user diversity (one bucket per `user:agent` key,
9
+ * unbounded if never pruned) without needing an external scheduler.
10
+ */
11
+ const AUTO_CLEANUP_EVERY_MS = 30 * 60 * 1000;
12
+ /** Buckets idle for at least this long are dropped on a sweep. */
13
+ const DEFAULT_IDLE_MS = 30 * 60 * 1000;
14
+ export class RateLimiter {
15
+ buckets = new Map();
16
+ rate;
17
+ intervalMs;
18
+ burst;
19
+ lastSweepAt = Date.now();
20
+ constructor(rate = DEFAULT_RATE, intervalMs = DEFAULT_INTERVAL_MS, burst = DEFAULT_BURST) {
21
+ this.rate = rate;
22
+ this.intervalMs = intervalMs;
23
+ this.burst = burst;
24
+ }
25
+ /** Check if a request is allowed. Returns true if within limit. */
26
+ allow(key) {
27
+ this.maybeSweep();
28
+ const b = this.getBucket(key);
29
+ if (b.tokens > 0) {
30
+ b.tokens--;
31
+ return true;
32
+ }
33
+ return false;
34
+ }
35
+ /** Get remaining tokens for a key. */
36
+ remaining(key) {
37
+ return this.getBucket(key).tokens;
38
+ }
39
+ /** Get status for display. */
40
+ status(key) {
41
+ return {
42
+ remaining: this.getBucket(key).tokens,
43
+ rate: this.rate,
44
+ intervalSec: Math.round(this.intervalMs / 1000),
45
+ };
46
+ }
47
+ /** Read the bucket's static configuration (no key required). */
48
+ config() {
49
+ return {
50
+ rate: this.rate,
51
+ intervalSec: Math.round(this.intervalMs / 1000),
52
+ burst: this.burst,
53
+ };
54
+ }
55
+ /**
56
+ * Best-effort estimate (epoch ms) of when the next token will be available
57
+ * for `key`. If the bucket already has tokens, returns now.
58
+ */
59
+ nextAllowAt(key) {
60
+ const b = this.getBucket(key);
61
+ if (b.tokens > 0)
62
+ return Date.now();
63
+ // We add `rate` tokens every `intervalMs` from `lastRefill`. The next
64
+ // refill arrives at `lastRefill + intervalMs`.
65
+ return b.lastRefill + this.intervalMs;
66
+ }
67
+ /**
68
+ * Drop buckets that have been idle for at least `idleMs` milliseconds.
69
+ * Run periodically to bound memory under bursty workloads.
70
+ *
71
+ * Called automatically by {@link allow} every {@link AUTO_CLEANUP_EVERY_MS},
72
+ * but exposed publicly so ops / tests can force a sweep.
73
+ */
74
+ cleanup(idleMs = DEFAULT_IDLE_MS) {
75
+ const now = Date.now();
76
+ let dropped = 0;
77
+ for (const [key, b] of this.buckets) {
78
+ if (now - b.lastRefill > idleMs) {
79
+ this.buckets.delete(key);
80
+ dropped++;
81
+ }
82
+ }
83
+ return dropped;
84
+ }
85
+ /** Test/diagnostic accessor: how many distinct keys are tracked. */
86
+ size() { return this.buckets.size; }
87
+ maybeSweep() {
88
+ const now = Date.now();
89
+ if (now - this.lastSweepAt < AUTO_CLEANUP_EVERY_MS)
90
+ return;
91
+ this.lastSweepAt = now;
92
+ this.cleanup();
93
+ }
94
+ getBucket(key) {
95
+ const now = Date.now();
96
+ let b = this.buckets.get(key);
97
+ if (!b) {
98
+ b = { tokens: this.burst, lastRefill: now };
99
+ this.buckets.set(key, b);
100
+ return b;
101
+ }
102
+ // Refill tokens based on elapsed time
103
+ const elapsed = now - b.lastRefill;
104
+ const refill = Math.floor(elapsed / this.intervalMs) * this.rate;
105
+ if (refill > 0) {
106
+ b.tokens = Math.min(this.burst, b.tokens + refill);
107
+ b.lastRefill = now;
108
+ }
109
+ return b;
110
+ }
111
+ }
112
+ // Global instances
113
+ export const userLimiter = new RateLimiter(10, 60000, 15); // 10 req/min per user
114
+ export const agentLimiter = new RateLimiter(30, 60000, 50); // 30 req/min per agent
115
+ //# sourceMappingURL=rate-limiter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limiter.js","sourceRoot":"","sources":["../../src/core/rate-limiter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import type { MessengerAdapter, AgentAdapter } from './types.js';
2
+ import type { ACPAgentConfig } from '../plugins/agents/acp/types.js';
3
+ /**
4
+ * Global registry for all adapters
5
+ */
6
+ declare class PluginRegistry {
7
+ private messengers;
8
+ private agents;
9
+ private agentAliases;
10
+ registerMessenger(adapter: MessengerAdapter): void;
11
+ registerAgent(adapter: AgentAdapter): void;
12
+ getMessenger(name: string): MessengerAdapter | undefined;
13
+ getAgent(name: string): AgentAdapter | undefined;
14
+ findAgent(nameOrAlias: string): AgentAdapter | undefined;
15
+ listMessengers(): string[];
16
+ listAgents(): string[];
17
+ /**
18
+ * Load ACP (remote) agents from config. Uses Promise.allSettled
19
+ * for parallel loading so one slow endpoint doesn't block startup.
20
+ */
21
+ loadACPAgents(acpConfigs: ACPAgentConfig[]): Promise<void>;
22
+ /**
23
+ * Discover ACP agents via `.well-known/acp` on each base URL, then
24
+ * load every advertised agent through loadACPAgents(). Failures on
25
+ * individual URLs are logged but don't fail the batch.
26
+ */
27
+ loadDiscoveredACPAgents(baseUrls: string[]): Promise<number>;
28
+ loadBuiltInPlugins(): Promise<void>;
29
+ }
30
+ export declare const registry: PluginRegistry;
31
+ export {};
32
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/core/registry.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAChE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAA;AAKpE;;GAEG;AACH,cAAM,cAAc;IAClB,OAAO,CAAC,UAAU,CAAsC;IACxD,OAAO,CAAC,MAAM,CAAkC;IAChD,OAAO,CAAC,YAAY,CAA4B;IAEhD,iBAAiB,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI;IAOlD,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI;IAe1C,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAIxD,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAIhD,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAcxD,cAAc,IAAI,MAAM,EAAE;IAI1B,UAAU,IAAI,MAAM,EAAE;IAItB;;;OAGG;IACG,aAAa,CAAC,UAAU,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA2BhE;;;;OAIG;IACG,uBAAuB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAa5D,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC;CAoC1C;AAGD,eAAO,MAAM,QAAQ,gBAAuB,CAAA"}
@@ -0,0 +1,126 @@
1
+ // Plugin registry for messengers and agents
2
+ import { logger as rootLogger } from './logger.js';
3
+ const log = rootLogger.child({ component: 'registry' });
4
+ /**
5
+ * Global registry for all adapters
6
+ */
7
+ class PluginRegistry {
8
+ messengers = new Map();
9
+ agents = new Map();
10
+ agentAliases = new Map();
11
+ registerMessenger(adapter) {
12
+ if (this.messengers.has(adapter.name)) {
13
+ log.warn({ messenger: adapter.name }, `Messenger "${adapter.name}" already registered, overwriting`);
14
+ }
15
+ this.messengers.set(adapter.name, adapter);
16
+ }
17
+ registerAgent(adapter) {
18
+ if (this.agents.has(adapter.name)) {
19
+ log.warn({ agent: adapter.name }, `Agent "${adapter.name}" already registered, overwriting`);
20
+ }
21
+ this.agents.set(adapter.name, adapter);
22
+ // Register aliases
23
+ for (const alias of adapter.aliases) {
24
+ if (this.agentAliases.has(alias)) {
25
+ log.warn({ alias, agent: adapter.name }, `Agent alias "${alias}" already registered, overwriting`);
26
+ }
27
+ this.agentAliases.set(alias, adapter.name);
28
+ }
29
+ }
30
+ getMessenger(name) {
31
+ return this.messengers.get(name);
32
+ }
33
+ getAgent(name) {
34
+ return this.agents.get(name);
35
+ }
36
+ findAgent(nameOrAlias) {
37
+ // Try exact name first
38
+ const agent = this.agents.get(nameOrAlias);
39
+ if (agent)
40
+ return agent;
41
+ // Try alias
42
+ const realName = this.agentAliases.get(nameOrAlias);
43
+ if (realName) {
44
+ return this.agents.get(realName);
45
+ }
46
+ return undefined;
47
+ }
48
+ listMessengers() {
49
+ return Array.from(this.messengers.keys());
50
+ }
51
+ listAgents() {
52
+ return Array.from(this.agents.keys());
53
+ }
54
+ /**
55
+ * Load ACP (remote) agents from config. Uses Promise.allSettled
56
+ * for parallel loading so one slow endpoint doesn't block startup.
57
+ */
58
+ async loadACPAgents(acpConfigs) {
59
+ const enabled = acpConfigs.filter((c) => c.enabled !== false);
60
+ if (enabled.length === 0)
61
+ return;
62
+ const results = await Promise.allSettled(enabled.map(async (cfg) => {
63
+ const { ACPAdapter } = await import('../plugins/agents/acp/acp-adapter.js');
64
+ const adapter = new ACPAdapter(cfg);
65
+ const available = await adapter.isAvailable().catch(() => false);
66
+ if (!available) {
67
+ log.warn({ acpAgent: cfg.name, endpoint: cfg.endpoint }, `ACP agent "${cfg.name}" not reachable, skipping`);
68
+ return;
69
+ }
70
+ this.registerAgent(adapter);
71
+ log.info({ acpAgent: cfg.name, endpoint: cfg.endpoint }, `Loaded ACP agent: ${cfg.name}`);
72
+ }));
73
+ for (const result of results) {
74
+ if (result.status === 'rejected') {
75
+ log.warn({ reason: String(result.reason) }, 'Failed to load ACP agent');
76
+ }
77
+ }
78
+ }
79
+ /**
80
+ * Discover ACP agents via `.well-known/acp` on each base URL, then
81
+ * load every advertised agent through loadACPAgents(). Failures on
82
+ * individual URLs are logged but don't fail the batch.
83
+ */
84
+ async loadDiscoveredACPAgents(baseUrls) {
85
+ if (!baseUrls.length)
86
+ return 0;
87
+ const { discoverMany } = await import('../plugins/agents/acp/discovery.js');
88
+ const results = await discoverMany(baseUrls);
89
+ const flat = [];
90
+ for (const r of results)
91
+ flat.push(...r.agents);
92
+ if (flat.length === 0)
93
+ return 0;
94
+ await this.loadACPAgents(flat);
95
+ log.info({ baseUrls: baseUrls.length, agents: flat.length }, 'ACP discovery complete');
96
+ return flat.length;
97
+ }
98
+ async loadBuiltInPlugins() {
99
+ // Load built-in messengers
100
+ const { ilinkWeChatAdapter } = await import('../plugins/messengers/wechat/ilink-adapter.js');
101
+ this.registerMessenger(ilinkWeChatAdapter);
102
+ const { telegramAdapter } = await import('../plugins/messengers/telegram/telegram-adapter.js');
103
+ this.registerMessenger(telegramAdapter);
104
+ const { feishuAdapter } = await import('../plugins/messengers/feishu/index.js');
105
+ this.registerMessenger(feishuAdapter);
106
+ const { dingtalkAdapter } = await import('../plugins/messengers/dingtalk/index.js');
107
+ this.registerMessenger(dingtalkAdapter);
108
+ const { discordAdapter } = await import('../plugins/messengers/discord/index.js');
109
+ this.registerMessenger(discordAdapter);
110
+ const { emailAdapter } = await import('../plugins/messengers/email/email-adapter.js');
111
+ this.registerMessenger(emailAdapter);
112
+ // Load built-in agents
113
+ const { claudeCodeAdapter } = await import('../plugins/agents/claude-code/index.js');
114
+ this.registerAgent(claudeCodeAdapter);
115
+ const { codexAdapter } = await import('../plugins/agents/codex/index.js');
116
+ this.registerAgent(codexAdapter);
117
+ const { copilotAdapter } = await import('../plugins/agents/copilot/index.js');
118
+ this.registerAgent(copilotAdapter);
119
+ const { opencodeAdapter } = await import('../plugins/agents/opencode/index.js');
120
+ this.registerAgent(opencodeAdapter);
121
+ log.info({ messengers: this.messengers.size, agents: this.agents.size }, 'Plugin registry initialized');
122
+ }
123
+ }
124
+ // Singleton registry
125
+ export const registry = new PluginRegistry();
126
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/core/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ export interface DetectionOutcome {
2
+ /** True when we want to short-circuit the normal agent flow. */
3
+ handled: boolean;
4
+ /** Reply text to send the user (the confirmation card). */
5
+ reply?: string;
6
+ }
7
+ /**
8
+ * Run the detector against an inbound message. On positive detection,
9
+ * stashes a pending entry under the thread key and returns a confirmation
10
+ * card text. On any negative outcome (filter miss, LLM null, low
11
+ * confidence, time validation fails) returns { handled: false } so the
12
+ * caller dispatches the message normally.
13
+ *
14
+ * Owner-scoped: respects the per-user `aiwatch` setting. Off → skip.
15
+ */
16
+ export declare function tryDetectReminderIntent(opts: {
17
+ platform: string;
18
+ channelId: string;
19
+ threadId: string;
20
+ userId: string;
21
+ text: string;
22
+ /** Test hook for time-injection. Default: new Date(). */
23
+ now?: Date;
24
+ }): Promise<DetectionOutcome>;
25
+ //# sourceMappingURL=remind-intent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remind-intent.d.ts","sourceRoot":"","sources":["../../src/core/remind-intent.ts"],"names":[],"mappings":"AA2GA,MAAM,WAAW,gBAAgB;IAC/B,gEAAgE;IAChE,OAAO,EAAE,OAAO,CAAA;IAChB,2DAA2D;IAC3D,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAID;;;;;;;;GAQG;AACH,wBAAsB,uBAAuB,CAAC,IAAI,EAAE;IAClD,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,yDAAyD;IACzD,GAAG,CAAC,EAAE,IAAI,CAAA;CACX,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAwF5B"}
@@ -0,0 +1,196 @@
1
+ // remind-intent.ts — LLM intent detector for non-slash messages.
2
+ //
3
+ // When a user types something like "明天早上8点提醒我开会" without `/remind`,
4
+ // this module asks the active agent to classify the message. If it looks
5
+ // like a reminder request with high confidence, we stash a pending entry
6
+ // and reply with a confirmation card — the user clicks y/n, never gets
7
+ // silently auto-created.
8
+ //
9
+ // Cost guard: we run a cheap regex pre-filter first (must contain a
10
+ // time-like token). Only messages that pass the pre-filter ever reach the
11
+ // LLM. This avoids burning agent calls on every chat message.
12
+ import { logger as rootLogger } from './logger.js';
13
+ import { callHelperForJson } from './agent-helper.js';
14
+ import { isAiwatchEnabled } from './reminders.js';
15
+ import { setPending } from './pending-reminder.js';
16
+ import { isValidRecurrence } from './reminders.js';
17
+ const log = rootLogger.child({ component: 'remind-intent' });
18
+ const DETECTOR_TIMEOUT_MS = 10_000;
19
+ const DETECTOR_MAX_OUTPUT = 600;
20
+ // Tightened from 0.7 to 0.85 once the agent-MCP fallback path landed:
21
+ // B-tier (implicit reminders, e.g. "对了,明天有聚餐") usually score
22
+ // 0.65~0.85 — those now fall through to the agent which has full
23
+ // conversation context. F1 only fires for clear A-tier explicit asks
24
+ // ("提醒我..."、"叫我..."、"X 分钟后...") which score ≥ 0.85.
25
+ const CONFIDENCE_THRESHOLD = 0.85;
26
+ // Pre-filter: must have at least ONE time-ish token. Catches CN units
27
+ // (秒/分/时/天/周/月/点), CN time words (早上/上午/中午/下午/晚上/凌晨/
28
+ // 今晚/明天/后天/每天/每周), EN durations (Nm/Nh/Nd, "every N…"), HH:MM,
29
+ // ISO date.
30
+ //
31
+ // PERF (2026-05-10): the previous version also matched on standalone verb
32
+ // words (提醒|通知|叫我|告诉我|记得|别忘了),without requiring a time
33
+ // token. Those verbs appear in everyday Chinese chat ("告诉我天气", "通知
34
+ // 群里他来了") and were triggering a 5-10s helper-LLM call on a huge
35
+ // fraction of normal WeChat messages — net effect was every reply
36
+ // arriving 5-10s late even when no reminder was intended. Since the
37
+ // downstream LLM can't produce a valid fire_at_iso without a time token
38
+ // anyway (and we reject without one at remind-intent.ts:164), the
39
+ // verb-only branch was pure waste — guaranteed false positive. Removed.
40
+ //
41
+ // If a user *does* want to set a reminder, the natural phrasing always
42
+ // carries a time token (e.g. "明天9点提醒我开会", "30分钟后叫我喝水",
43
+ // "今晚8点别忘了") which the remaining branches catch.
44
+ const TIME_HINT_RE = new RegExp([
45
+ '\\d+\\s*(秒|分钟|分|小时|钟头|时|天|周|月|点|刻)',
46
+ '(早上|上午|中午|下午|晚上|凌晨|今晚|今天|明天|后天|今早|大后天)',
47
+ '(每天|每日|每周|每月|每年|每个工作日|每隔)',
48
+ '\\d{1,2}:\\d{2}',
49
+ '\\d{4}-\\d{2}-\\d{2}',
50
+ '\\b(every\\s+\\d|in\\s+\\d+\\s*(min|hour|day|sec))\\b',
51
+ ].join('|'), 'i');
52
+ const DETECTOR_SYSTEM_PROMPT = [
53
+ '你是一个"未来事件 / 提醒意图"识别器。',
54
+ '任务:判断用户消息是否提到了一件具体的、未来发生的、用户参与的事件,',
55
+ '且为这件事提前提醒一下是合理的。',
56
+ '',
57
+ '严格只输出一个 JSON 对象(不要 markdown 围栏,不要解释),schema:',
58
+ '{',
59
+ ' "is_reminder": boolean,',
60
+ ' "confidence": number, // 0.0~1.0',
61
+ ' "fire_at_iso": string|null, // ISO 8601 本地时间,如 "2026-05-09T20:30:00"',
62
+ ' "text": string|null, // 要做的事,≤ 60 字',
63
+ ' "recurrence": string|null // every:5m / daily:HH:MM / weekly:1,3,5:HH:MM,无则 null',
64
+ '}',
65
+ '',
66
+ '识别分级(仍输出 is_reminder + confidence):',
67
+ '',
68
+ 'A. 显式请求 (confidence 0.85~0.99):用户直接要求设提醒。',
69
+ ' 例: "提醒我明天9点开会"、"30分钟后叫我喝水"、"每天8点提醒我吃药"',
70
+ '',
71
+ 'B. 隐式备忘 (confidence 0.65~0.85):用户陈述未来事件 + 自己参与,',
72
+ ' 语气暗示"别忘了/在意这件事"——日常生活中"顺嘴说一下" 的备忘。',
73
+ ' 例(都判 is_reminder=true):',
74
+ ' - "对了,明天中午我和团队有个聚餐"',
75
+ ' - "明天9点要开会"',
76
+ ' - "下午要给爸打电话"',
77
+ ' - "周五晚上7点演唱会"',
78
+ ' - "记一下,下周三去医院复查"',
79
+ '',
80
+ 'C. 必须 is_reminder=false 的反例:',
81
+ ' - 描述过去:"昨天开会很累"、"刚才提醒过了"',
82
+ ' - 假设/问句:"明天会下雨吗"、"如果迟到了怎么办"',
83
+ ' - 抽象讨论:天气、新闻、技术问题、闲聊',
84
+ ' - 模糊时间 + 无具体事件:"过段时间再说"、"以后再聊"',
85
+ ' - 别人的事:"小王明天去开会"(不是用户参与的)',
86
+ '',
87
+ '其他规则:',
88
+ '- 时间必须未来 + 具体(精确到日 + 大致时段:早上/中午/下午/晚上)。',
89
+ '- "明天中午" → 大约 12:00;"早上" → 09:00;"下午" → 15:00;"晚上" → 20:00。具体时点优先("明天9点" → 09:00:00)。',
90
+ '- text 是事,不是时间。"明天9点开会" 的 text 是 "开会",不是 "明天9点开会"。',
91
+ '- fire_at_iso 用本地时区,格式 "YYYY-MM-DDTHH:MM:SS",不带 Z 也不带偏移。',
92
+ '- 不确定就给较低 confidence,让阈值机制兜底。',
93
+ ].join('\n');
94
+ const NON_HANDLED = { handled: false };
95
+ /**
96
+ * Run the detector against an inbound message. On positive detection,
97
+ * stashes a pending entry under the thread key and returns a confirmation
98
+ * card text. On any negative outcome (filter miss, LLM null, low
99
+ * confidence, time validation fails) returns { handled: false } so the
100
+ * caller dispatches the message normally.
101
+ *
102
+ * Owner-scoped: respects the per-user `aiwatch` setting. Off → skip.
103
+ */
104
+ export async function tryDetectReminderIntent(opts) {
105
+ const { platform, channelId, threadId, userId, text } = opts;
106
+ const now = opts.now ?? new Date();
107
+ // 1. User opt-out
108
+ if (userId && !isAiwatchEnabled(platform, userId)) {
109
+ return NON_HANDLED;
110
+ }
111
+ // 2. Skip slash + obvious non-content
112
+ const trimmed = text.trim();
113
+ if (!trimmed || trimmed.length < 3 || trimmed.length > 500)
114
+ return NON_HANDLED;
115
+ if (trimmed.startsWith('/'))
116
+ return NON_HANDLED;
117
+ // 3. Cheap regex pre-filter — if no time-ish token, skip LLM entirely
118
+ if (!TIME_HINT_RE.test(trimmed))
119
+ return NON_HANDLED;
120
+ // 4. LLM extraction
121
+ const userPrompt = [
122
+ `当前时间:${now.toLocaleString()}`,
123
+ `当前时间(ISO):${formatLocalIso(now)}`,
124
+ `用户消息:${trimmed}`,
125
+ ].join('\n');
126
+ const det = await callHelperForJson({
127
+ platform, channelId, threadId,
128
+ systemPrompt: DETECTOR_SYSTEM_PROMPT,
129
+ userPrompt,
130
+ timeoutMs: DETECTOR_TIMEOUT_MS,
131
+ maxOutputChars: DETECTOR_MAX_OUTPUT,
132
+ });
133
+ if (!det || !det.is_reminder) {
134
+ log.debug({ event: 'remind-intent.skip', reason: det ? 'is_reminder=false' : 'llm_null' });
135
+ return NON_HANDLED;
136
+ }
137
+ const conf = typeof det.confidence === 'number' ? det.confidence : 0;
138
+ if (conf < CONFIDENCE_THRESHOLD) {
139
+ log.debug({ event: 'remind-intent.low_conf', conf });
140
+ return NON_HANDLED;
141
+ }
142
+ // 5. Validate extracted slots
143
+ if (!det.fire_at_iso || !det.text) {
144
+ log.debug({ event: 'remind-intent.bad_slots', det });
145
+ return NON_HANDLED;
146
+ }
147
+ const fireAt = new Date(det.fire_at_iso);
148
+ if (Number.isNaN(fireAt.getTime())) {
149
+ log.debug({ event: 'remind-intent.bad_iso', iso: det.fire_at_iso });
150
+ return NON_HANDLED;
151
+ }
152
+ const deltaMs = fireAt.getTime() - now.getTime();
153
+ if (deltaMs < 10_000 || deltaMs > 7 * 24 * 60 * 60_000) {
154
+ log.debug({ event: 'remind-intent.out_of_range', deltaMs });
155
+ return NON_HANDLED;
156
+ }
157
+ let recurrence;
158
+ if (det.recurrence) {
159
+ if (isValidRecurrence(det.recurrence)) {
160
+ recurrence = det.recurrence;
161
+ }
162
+ else {
163
+ log.debug({ event: 'remind-intent.bad_recurrence', rec: det.recurrence });
164
+ // Not fatal: drop recurrence, keep one-shot
165
+ }
166
+ }
167
+ // 6. Stash pending + return confirmation card
168
+ const threadKey = `${platform}:${channelId}:${threadId}`;
169
+ const cleanText = String(det.text).slice(0, 200);
170
+ setPending(threadKey, {
171
+ fireAt,
172
+ text: cleanText,
173
+ recurrence,
174
+ });
175
+ const recurLine = recurrence ? `\n 循环:${recurrence}` : '';
176
+ const reply = [
177
+ '🔔 要不要为这件事设个提醒?',
178
+ ` 内容:${cleanText}`,
179
+ ` 时间:${fireAt.toLocaleString()}${recurLine}`,
180
+ '',
181
+ '回复 `y` 创建 / `n` 不用(5 分钟没回复自动忽略)',
182
+ ].join('\n');
183
+ log.info({
184
+ event: 'remind-intent.proposed',
185
+ threadKey, text: cleanText, fireAt: fireAt.toISOString(), conf, recurrence,
186
+ });
187
+ return { handled: true, reply };
188
+ }
189
+ /** Format a Date as a local-time ISO-ish string ("2026-05-09T20:30:00").
190
+ * Note: this is the same shape as Reminder.fire_at storage. */
191
+ function formatLocalIso(d) {
192
+ const pad = (n) => String(n).padStart(2, '0');
193
+ return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}T` +
194
+ `${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`;
195
+ }
196
+ //# sourceMappingURL=remind-intent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remind-intent.js","sourceRoot":"","sources":["../../src/core/remind-intent.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,EAAE;AACF,oEAAoE;AACpE,yEAAyE;AACzE,yEAAyE;AACzE,uEAAuE;AACvE,yBAAyB;AACzB,EAAE;AACF,oEAAoE;AACpE,0EAA0E;AAC1E,8DAA8D;AAE9D,OAAO,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,aAAa,CAAA;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAElD,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC,CAAA;AAE5D,MAAM,mBAAmB,GAAG,MAAM,CAAA;AAClC,MAAM,mBAAmB,GAAG,GAAG,CAAA;AAC/B,sEAAsE;AACtE,6DAA6D;AAC7D,iEAAiE;AACjE,qEAAqE;AACrE,oDAAoD;AACpD,MAAM,oBAAoB,GAAG,IAAI,CAAA;AAEjC,sEAAsE;AACtE,qDAAqD;AACrD,+DAA+D;AAC/D,YAAY;AACZ,EAAE;AACF,0EAA0E;AAC1E,uDAAuD;AACvD,mEAAmE;AACnE,gEAAgE;AAChE,kEAAkE;AAClE,oEAAoE;AACpE,wEAAwE;AACxE,kEAAkE;AAClE,wEAAwE;AACxE,EAAE;AACF,uEAAuE;AACvE,uDAAuD;AACvD,iDAAiD;AACjD,MAAM,YAAY,GAAG,IAAI,MAAM,CAAC;IAC9B,oCAAoC;IACpC,wCAAwC;IACxC,2BAA2B;IAC3B,iBAAiB;IACjB,sBAAsB;IACtB,uDAAuD;CACxD,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAA;AAEjB,MAAM,sBAAsB,GAAG;IAC7B,uBAAuB;IACvB,oCAAoC;IACpC,kBAAkB;IAClB,EAAE;IACF,8CAA8C;IAC9C,GAAG;IACH,2BAA2B;IAC3B,2CAA2C;IAC3C,yEAAyE;IACzE,+CAA+C;IAC/C,uFAAuF;IACvF,GAAG;IACH,EAAE;IACF,qCAAqC;IACrC,EAAE;IACF,2CAA2C;IAC3C,2CAA2C;IAC3C,EAAE;IACF,iDAAiD;IACjD,uCAAuC;IACvC,4BAA4B;IAC5B,wBAAwB;IACxB,gBAAgB;IAChB,iBAAiB;IACjB,kBAAkB;IAClB,qBAAqB;IACrB,EAAE;IACF,8BAA8B;IAC9B,6BAA6B;IAC7B,gCAAgC;IAChC,yBAAyB;IACzB,mCAAmC;IACnC,8BAA8B;IAC9B,EAAE;IACF,OAAO;IACP,yCAAyC;IACzC,uFAAuF;IACvF,oDAAoD;IACpD,0DAA0D;IAC1D,+BAA+B;CAChC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAiBZ,MAAM,WAAW,GAAqB,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA;AAExD;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,IAQ7C;IACC,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAA;IAC5D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAA;IAElC,kBAAkB;IAClB,IAAI,MAAM,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC;QAClD,OAAO,WAAW,CAAA;IACpB,CAAC;IACD,sCAAsC;IACtC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;IAC3B,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,GAAG;QAAE,OAAO,WAAW,CAAA;IAC9E,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,WAAW,CAAA;IAC/C,sEAAsE;IACtE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,WAAW,CAAA;IAEnD,oBAAoB;IACpB,MAAM,UAAU,GAAG;QACjB,QAAQ,GAAG,CAAC,cAAc,EAAE,EAAE;QAC9B,aAAa,cAAc,CAAC,GAAG,CAAC,EAAE;QAClC,QAAQ,OAAO,EAAE;KAClB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAEZ,MAAM,GAAG,GAAG,MAAM,iBAAiB,CAAiB;QAClD,QAAQ,EAAE,SAAS,EAAE,QAAQ;QAC7B,YAAY,EAAE,sBAAsB;QACpC,UAAU;QACV,SAAS,EAAE,mBAAmB;QAC9B,cAAc,EAAE,mBAAmB;KACpC,CAAC,CAAA;IAEF,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;QAC7B,GAAG,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,oBAAoB,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAA;QAC1F,OAAO,WAAW,CAAA;IACpB,CAAC;IACD,MAAM,IAAI,GAAG,OAAO,GAAG,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAA;IACpE,IAAI,IAAI,GAAG,oBAAoB,EAAE,CAAC;QAChC,GAAG,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,wBAAwB,EAAE,IAAI,EAAE,CAAC,CAAA;QACpD,OAAO,WAAW,CAAA;IACpB,CAAC;IAED,8BAA8B;IAC9B,IAAI,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QAClC,GAAG,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,yBAAyB,EAAE,GAAG,EAAE,CAAC,CAAA;QACpD,OAAO,WAAW,CAAA;IACpB,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;IACxC,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;QACnC,GAAG,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,uBAAuB,EAAE,GAAG,EAAE,GAAG,CAAC,WAAW,EAAE,CAAC,CAAA;QACnE,OAAO,WAAW,CAAA;IACpB,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC,OAAO,EAAE,CAAA;IAChD,IAAI,OAAO,GAAG,MAAM,IAAI,OAAO,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC;QACvD,GAAG,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,4BAA4B,EAAE,OAAO,EAAE,CAAC,CAAA;QAC3D,OAAO,WAAW,CAAA;IACpB,CAAC;IACD,IAAI,UAA8B,CAAA;IAClC,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;QACnB,IAAI,iBAAiB,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YACtC,UAAU,GAAG,GAAG,CAAC,UAAU,CAAA;QAC7B,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,8BAA8B,EAAE,GAAG,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC,CAAA;YACzE,4CAA4C;QAC9C,CAAC;IACH,CAAC;IAED,8CAA8C;IAC9C,MAAM,SAAS,GAAG,GAAG,QAAQ,IAAI,SAAS,IAAI,QAAQ,EAAE,CAAA;IACxD,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IAChD,UAAU,CAAC,SAAS,EAAE;QACpB,MAAM;QACN,IAAI,EAAE,SAAS;QACf,UAAU;KACX,CAAC,CAAA;IAEF,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,WAAW,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;IAC3D,MAAM,KAAK,GAAG;QACZ,iBAAiB;QACjB,SAAS,SAAS,EAAE;QACpB,SAAS,MAAM,CAAC,cAAc,EAAE,GAAG,SAAS,EAAE;QAC9C,EAAE;QACF,iCAAiC;KAClC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAEZ,GAAG,CAAC,IAAI,CAAC;QACP,KAAK,EAAE,wBAAwB;QAC/B,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,UAAU;KAC3E,CAAC,CAAA;IACF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;AACjC,CAAC;AAED;gEACgE;AAChE,SAAS,cAAc,CAAC,CAAO;IAC7B,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IACrD,OAAO,GAAG,CAAC,CAAC,WAAW,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG;QACvE,GAAG,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,EAAE,CAAA;AACxE,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { RunContext } from './approval-bus.js';
2
+ /** Notifier responsible for delivering a confirmation card to the user
3
+ * when a high-frequency + LLM-polish reminder needs explicit y/n. The
4
+ * message body is fully composed by reminder-rpc; the notifier just
5
+ * routes it to the right messenger. Set once at startup from cli.ts. */
6
+ export type ReminderConfirmNotifier = (ctx: RunContext, message: string) => Promise<void>;
7
+ export declare function setReminderConfirmNotifier(n: ReminderConfirmNotifier | null): void;
8
+ export type ReminderOp = 'create' | 'list' | 'cancel' | 'snooze';
9
+ export type ReminderRpcResult = {
10
+ ok: true;
11
+ result: unknown;
12
+ } | {
13
+ ok: false;
14
+ error: string;
15
+ };
16
+ export declare function handleReminderOp(op: string, payload: Record<string, unknown>, ctx: RunContext): Promise<ReminderRpcResult>;
17
+ //# sourceMappingURL=reminder-rpc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reminder-rpc.d.ts","sourceRoot":"","sources":["../../src/core/reminder-rpc.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAInD;;;yEAGyE;AACzE,MAAM,MAAM,uBAAuB,GAAG,CACpC,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,KAC7B,OAAO,CAAC,IAAI,CAAC,CAAA;AAGlB,wBAAgB,0BAA0B,CAAC,CAAC,EAAE,uBAAuB,GAAG,IAAI,GAAG,IAAI,CAElF;AAED,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAA;AAEhE,MAAM,MAAM,iBAAiB,GACzB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GAC7B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAIhC,wBAAsB,gBAAgB,CACpC,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,GAAG,EAAE,UAAU,GACd,OAAO,CAAC,iBAAiB,CAAC,CAc5B"}