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,128 @@
1
+ // /cron command — manage cron-driven scheduled prompts (P2-F).
2
+ //
3
+ // /cron list list all schedules
4
+ // /cron create <name> <agent> <cron> <prompt> create
5
+ // /cron delete <id> delete
6
+ // /cron enable <id> enable
7
+ // /cron disable <id> disable
8
+ // /cron check <id> show details
9
+ //
10
+ // Cron expression is the standard 5-field POSIX format ("min hour dom mon dow").
11
+ //
12
+ // Renamed from /schedule in v0.2.38 to avoid colliding with Claude Code's
13
+ // built-in /schedule skill (Anthropic remote routines). The /schedule alias
14
+ // is still wired in router.ts but emits a one-line deprecation banner; it
15
+ // will be removed in v0.4.0.
16
+ import { createSchedule, listSchedules, getSchedule, deleteSchedule, setEnabled, } from '../schedule.js';
17
+ import { parseCron, nextOccurrence } from '../cron.js';
18
+ import { registry } from '../registry.js';
19
+ import { workspaceRegistry } from '../workspace.js';
20
+ export async function handleCronCommand(args, ctx) {
21
+ const parts = args.trim().split(/\s+/).filter(Boolean);
22
+ const sub = parts[0] || 'list';
23
+ // Same per-user scoping rule as /job. ctx.userId set → see only own rows;
24
+ // ctx.userId unset → unrestricted (back-compat for non-IM callers).
25
+ const ownerOpts = ctx.userId ? { creatorId: ctx.userId } : {};
26
+ switch (sub) {
27
+ case 'list':
28
+ case 'ls': {
29
+ const all = listSchedules(50, ownerOpts);
30
+ if (!all.length)
31
+ return '🗓️ 暂无定时任务。\n\n用法: /cron create <name> <agent> "<cron>" <prompt>';
32
+ const lines = all.map((s) => {
33
+ const flag = s.enabled ? '✅' : '⏸️';
34
+ return `${flag} #${s.id} **${s.name}** (${s.agent})\n cron: \`${s.cron}\`\n 下次: ${s.next_run}`;
35
+ });
36
+ return `🗓️ **定时任务** (${all.length})\n\n${lines.join('\n\n')}\n\n/cron check <id> 详情\n/cron enable/disable <id> 启停\n/cron delete <id> 删除`;
37
+ }
38
+ case 'create':
39
+ case 'c': {
40
+ // /cron create <name> <agent> "<cron>" <prompt...>
41
+ if (parts.length < 5) {
42
+ return '用法: /cron create <name> <agent> "<cron expr>" <prompt>\n\n例如: /cron create daily-report opencode "0 9 * * 1-5" 生成今天的销售日报';
43
+ }
44
+ const name = parts[1];
45
+ const agentName = parts[2];
46
+ // The cron expression may be quoted — try to extract.
47
+ const restJoined = parts.slice(3).join(' ');
48
+ let cron;
49
+ let prompt;
50
+ const quoted = restJoined.match(/^"([^"]+)"\s+(.+)$/) || restJoined.match(/^'([^']+)'\s+(.+)$/);
51
+ if (quoted) {
52
+ cron = quoted[1];
53
+ prompt = quoted[2];
54
+ }
55
+ else {
56
+ // Best effort: assume the next 5 tokens are the cron expression
57
+ const tokens = parts.slice(3);
58
+ if (tokens.length < 6)
59
+ return '用法: /cron create <name> <agent> "<cron expr>" <prompt>';
60
+ cron = tokens.slice(0, 5).join(' ');
61
+ prompt = tokens.slice(5).join(' ');
62
+ }
63
+ // M6: workspace whitelist + agent existence check before we touch SQL.
64
+ const agent = registry.findAgent(agentName);
65
+ if (!agent)
66
+ return `❌ Agent "${agentName}" not found.`;
67
+ const ws = workspaceRegistry.resolve(ctx.userId || 'unknown');
68
+ if (!ws.hasAgent(agent.name)) {
69
+ return `❌ Agent "${agent.name}" 不在 workspace "${ws.name}" 的白名单内。`;
70
+ }
71
+ try {
72
+ // Validate before insert so we get a clean error.
73
+ parseCron(cron);
74
+ const id = createSchedule({
75
+ name, agent: agent.name, cron, prompt,
76
+ creatorId: ctx.userId || '',
77
+ workspaceId: ws.id,
78
+ });
79
+ const next = nextOccurrence(parseCron(cron));
80
+ return `✅ 定时任务 #${id} 已创建\n\nName: ${name}\nAgent: ${agent.name}\nCron: \`${cron}\`\n下次执行: ${next?.toISOString() || 'unknown'}`;
81
+ }
82
+ catch (err) {
83
+ const msg = err instanceof Error ? err.message : String(err);
84
+ return `❌ 创建失败: ${msg}`;
85
+ }
86
+ }
87
+ case 'delete':
88
+ case 'rm': {
89
+ const id = parseInt(parts[1] || '', 10);
90
+ if (!Number.isFinite(id))
91
+ return '用法: /cron delete <id>';
92
+ return deleteSchedule(id, ownerOpts)
93
+ ? `✅ 定时任务 #${id} 已删除。`
94
+ : `❌ 未找到 #${id},或不是你创建的。`;
95
+ }
96
+ case 'enable':
97
+ case 'on': {
98
+ const id = parseInt(parts[1] || '', 10);
99
+ if (!Number.isFinite(id))
100
+ return '用法: /cron enable <id>';
101
+ return setEnabled(id, true, ownerOpts)
102
+ ? `✅ 定时任务 #${id} 已启用。`
103
+ : `❌ 未找到 #${id},或不是你创建的。`;
104
+ }
105
+ case 'disable':
106
+ case 'off': {
107
+ const id = parseInt(parts[1] || '', 10);
108
+ if (!Number.isFinite(id))
109
+ return '用法: /cron disable <id>';
110
+ return setEnabled(id, false, ownerOpts)
111
+ ? `⏸️ 定时任务 #${id} 已暂停。`
112
+ : `❌ 未找到 #${id},或不是你创建的。`;
113
+ }
114
+ case 'check':
115
+ case 'show': {
116
+ const id = parseInt(parts[1] || '', 10);
117
+ if (!Number.isFinite(id))
118
+ return '用法: /cron check <id>';
119
+ const s = getSchedule(id, ownerOpts);
120
+ if (!s)
121
+ return `❌ 未找到 #${id}。`;
122
+ return `🗓️ **定时任务 #${s.id}** (${s.name})\n\nAgent: ${s.agent}\n状态: ${s.enabled ? '✅ 启用' : '⏸️ 已暂停'}\nCron: \`${s.cron}\`\n下次执行: ${s.next_run}\n上次执行: ${s.last_run || '从未'}\n通知 URL: ${s.notify_url || '无'}\n\nPrompt: ${s.prompt}`;
123
+ }
124
+ default:
125
+ return '用法: /cron [list|create|delete|enable|disable|check]';
126
+ }
127
+ }
128
+ //# sourceMappingURL=cron.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cron.js","sourceRoot":"","sources":["../../../src/core/commands/cron.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { RouteContext } from '../router.js';
2
+ export declare function handleJobCommand(args: string, ctx: RouteContext): Promise<string | AsyncGenerator<string>>;
3
+ //# sourceMappingURL=job.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"job.d.ts","sourceRoot":"","sources":["../../../src/core/commands/job.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAchD,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,YAAY,GAChB,OAAO,CAAC,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAyK1C"}
@@ -0,0 +1,195 @@
1
+ // /job (also /task) commands — create and manage persisted async jobs with subtask sessions
2
+ import { registry } from '../registry.js';
3
+ import { sessionManager } from '../session.js';
4
+ import { AgentBase } from '../agent-base.js';
5
+ import { createJob, getJob, listJobs, cancelJob, runJob, getJobStats } from '../job-board.js';
6
+ import { workspaceRegistry } from '../workspace.js';
7
+ function formatJob(j) {
8
+ const icon = { pending: '⏳', running: '🔄', completed: '✅', failed: '❌', cancelled: '🚫' }[j.status] || '❓';
9
+ const ts = new Date(`${j.created_at}Z`).toLocaleTimeString('zh-CN', { hour: '2-digit', minute: '2-digit' });
10
+ const preview = j.prompt.substring(0, 50) + (j.prompt.length > 50 ? '...' : '');
11
+ return `${icon} #${j.id} ${j.agent}: ${preview} [${j.status}] · ${ts}`;
12
+ }
13
+ export async function handleJobCommand(args, ctx) {
14
+ const parts = args.trim().split(/\s+/).filter(Boolean);
15
+ const sub = parts[0] || 'list';
16
+ const rest = parts.slice(1).join(' ');
17
+ // Per-user scoping: when ctx.userId is set (the IM-driven path), every read /
18
+ // mutate is restricted to rows whose creator_id matches OR is '' (legacy).
19
+ // When userId is unset (REST/system caller via the same handler) all rows
20
+ // are visible — that's the historical behavior.
21
+ const ownerOpts = ctx.userId ? { creatorId: ctx.userId } : {};
22
+ switch (sub) {
23
+ case 'list':
24
+ case 'ls': {
25
+ const filter = parts[1];
26
+ const jobs = listJobs(10, filter, ownerOpts);
27
+ if (!jobs.length)
28
+ return '📋 暂无任务。\n\n使用 /job create <agent> <prompt> 创建新任务。';
29
+ const stats = getJobStats();
30
+ return `📋 **任务列表** (总 ${stats.total} · 待 ${stats.pending} · 运行 ${stats.running} · 完 ${stats.completed} · 败 ${stats.failed})
31
+
32
+ ${jobs.map(formatJob).join('\n')}
33
+
34
+ /job create <agent> <prompt> 创建
35
+ /job check <id> 查看详情
36
+ /job cancel <id> 取消
37
+ /job run <id> 立即运行`;
38
+ }
39
+ case 'create':
40
+ case 'c': {
41
+ if (!rest)
42
+ return '用法: /job create <agent> <prompt>\n\n例如: /job create opencode 分析这段代码的性能问题';
43
+ const spaceIdx = rest.indexOf(' ');
44
+ if (spaceIdx < 0)
45
+ return '用法: /job create <agent> <prompt>\n\n请提供 agent 名称和任务内容。';
46
+ const agentName = rest.slice(0, spaceIdx);
47
+ const prompt = rest.slice(spaceIdx + 1).trim();
48
+ if (!prompt)
49
+ return '请提供任务内容。';
50
+ const agent = registry.findAgent(agentName);
51
+ if (!agent)
52
+ return `❌ Agent "${agentName}" not found.`;
53
+ // M6: workspace whitelist applies to direct command paths too. Without
54
+ // this, a member of a workspace whose `agents: ['opencode']` whitelist
55
+ // allows only opencode could still smuggle in a `/job create claude-code`.
56
+ const ws = workspaceRegistry.resolve(ctx.userId || 'unknown');
57
+ if (!ws.hasAgent(agent.name)) {
58
+ return `❌ Agent "${agent.name}" 不在 workspace "${ws.name}" 的白名单内。`;
59
+ }
60
+ const id = createJob(agent.name, prompt, {
61
+ creatorId: ctx.userId || '',
62
+ workspaceId: ws.id,
63
+ });
64
+ return `✅ 任务 #${id} 已创建
65
+
66
+ Agent: ${agent.name}
67
+ 状态: 待执行
68
+
69
+ 使用 /job run ${id} 开始执行,或 /job list 查看所有任务。`;
70
+ }
71
+ case 'check':
72
+ case 'get':
73
+ case 'g': {
74
+ const id = parseInt(parts[1] || '', 10);
75
+ if (Number.isNaN(id))
76
+ return '用法: /job check <id>';
77
+ const job = getJob(id, ownerOpts);
78
+ if (!job)
79
+ return `❌ 未找到任务 #${id}。`;
80
+ const statusLabel = { pending: '⏳ 待执行', running: '🔄 运行中', completed: '✅ 已完成', failed: '❌ 失败', cancelled: '🚫 已取消' };
81
+ let msg = `📋 **任务 #${job.id}**
82
+
83
+ Agent: ${job.agent}
84
+ 状态: ${statusLabel[job.status] || job.status}
85
+ 创建: ${job.created_at}`;
86
+ if (job.completed_at)
87
+ msg += `\n完成: ${job.completed_at}`;
88
+ msg += `\n\n内容: ${job.prompt}`;
89
+ if (job.result)
90
+ msg += `\n\n---\n结果:\n${job.result.length > 500 ? `${job.result.slice(0, 500)}...` : job.result}`;
91
+ if (job.error)
92
+ msg += `\n\n错误: ${job.error}`;
93
+ if (job.status === 'completed')
94
+ msg += `\n\n/job run ${job.id} 重新执行`;
95
+ if (job.status === 'pending')
96
+ msg += `\n\n/job run ${job.id} 开始执行`;
97
+ return msg;
98
+ }
99
+ case 'run':
100
+ case 'r': {
101
+ const id = parseInt(parts[1] || '', 10);
102
+ if (Number.isNaN(id))
103
+ return '用法: /job run <id>';
104
+ const job = getJob(id, ownerOpts);
105
+ if (!job)
106
+ return `❌ 未找到任务 #${id}。`;
107
+ if (job.status === 'running')
108
+ return `🔄 任务 #${id} 已在运行中。`;
109
+ const agent = registry.findAgent(job.agent);
110
+ if (!agent)
111
+ return `❌ Agent "${job.agent}" not found.`;
112
+ // Fire and forget with signal support for cancellation
113
+ const isAgentBaseAgent = agent instanceof AgentBase;
114
+ runJob(id, async function* (j, _logger, signal) {
115
+ if (isAgentBaseAgent) {
116
+ const ba = agent;
117
+ const result = await ba.spawnAndCollect(j.prompt, signal);
118
+ if (result)
119
+ yield result;
120
+ }
121
+ else {
122
+ const generator = agent.sendPrompt(`job-${j.id}`, j.prompt, []);
123
+ for await (const chunk of generator) {
124
+ if (signal.aborted)
125
+ break;
126
+ yield chunk;
127
+ }
128
+ }
129
+ }, ctx.logger).catch(() => { });
130
+ return `🔄 任务 #${id} 已开始运行。
131
+
132
+ 使用 /job check ${id} 查看结果。`;
133
+ }
134
+ case 'cancel':
135
+ case 'x': {
136
+ const id = parseInt(parts[1] || '', 10);
137
+ if (Number.isNaN(id))
138
+ return '用法: /job cancel <id>';
139
+ if (cancelJob(id, ownerOpts))
140
+ return `🚫 任务 #${id} 已取消。`;
141
+ return `❌ 无法取消任务 #${id}。可能不存在、已结束、或不是你创建的任务。`;
142
+ }
143
+ case 'switch':
144
+ case 'sw': {
145
+ const arg = parts[1];
146
+ if (!arg)
147
+ return '用法: /job switch <id> 或 /job switch main';
148
+ if (arg === 'main' || arg === '0') {
149
+ await sessionManager.setActiveSubtask(ctx.platform, ctx.channelId, ctx.threadId, null);
150
+ return '✅ 已返回主会话。';
151
+ }
152
+ const id = parseInt(arg, 10);
153
+ if (Number.isNaN(id))
154
+ return '用法: /job switch <id> 或 /job switch main';
155
+ const job = getJob(id, ownerOpts);
156
+ if (!job)
157
+ return `❌ 未找到任务 #${id}。`;
158
+ await sessionManager.setActiveSubtask(ctx.platform, ctx.channelId, ctx.threadId, id);
159
+ // Also create/update subtask metadata in session
160
+ await sessionManager.updateSubtask(ctx.platform, ctx.channelId, ctx.threadId, id, {
161
+ id, agent: job.agent, prompt: job.prompt,
162
+ status: 'running', createdAt: new Date(),
163
+ });
164
+ return `✅ 已进入任务 #${id} 的会话 (${job.agent})。\n\n直接发送消息继续对话。\n/job switch main 返回主会话。`;
165
+ }
166
+ case 'collect':
167
+ case 'cl': {
168
+ const id = parseInt(parts[1] || '', 10);
169
+ if (Number.isNaN(id))
170
+ return '用法: /job collect <id>';
171
+ const job = getJob(id, ownerOpts);
172
+ if (!job)
173
+ return `❌ 未找到任务 #${id}。`;
174
+ if (!job.result)
175
+ return `⚠️ 任务 #${id} (${job.status}) 暂无结果。`;
176
+ // Summarize via main agent
177
+ const existingSession = await sessionManager.getExistingSession(ctx.platform, ctx.channelId, ctx.threadId);
178
+ const mainAgent = existingSession?.agent || ctx.defaultAgent;
179
+ const agent = registry.findAgent(mainAgent);
180
+ if (!agent)
181
+ return `❌ Agent "${mainAgent}" not found.`;
182
+ const summaryPrompt = `Review and summarize this task result from ${job.agent}:\n\n---\n${job.result}\n---\n\nProvide a concise summary.`;
183
+ ctx.logger.info({ event: 'task.collect', taskId: id, agent: mainAgent });
184
+ // Return the generator — caller will stream
185
+ const generator = agent.sendPrompt(`collect-${id}`, summaryPrompt, []);
186
+ return (async function* () {
187
+ for await (const chunk of generator)
188
+ yield chunk;
189
+ })();
190
+ }
191
+ default:
192
+ return '用法: /job [list|create|check|run|cancel|switch|collect]\n\n也支持 /task 作为 /job 的别名。';
193
+ }
194
+ }
195
+ //# sourceMappingURL=job.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"job.js","sourceRoot":"","sources":["../../../src/core/commands/job.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { RouteContext } from '../router.js';
2
+ export declare function handleMemoCommand(args: string, ctx: RouteContext): Promise<string>;
3
+ //# sourceMappingURL=memo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memo.d.ts","sourceRoot":"","sources":["../../../src/core/commands/memo.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AA2DhD,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAkBxF"}
@@ -0,0 +1,151 @@
1
+ // /memo — 5W1H persistent memos. Slash surface is intentionally minimal
2
+ // (list / show / delete / help). The interesting interactions go through
3
+ // the agent's MCP tools (save_memo / search_memos / etc.) — slash is just
4
+ // for management when the user wants to peek at the database directly.
5
+ //
6
+ // Aliases: /memo · /记
7
+ //
8
+ // /memo list 10 most recent
9
+ // /memo list [N] list N (max 50)
10
+ // /memo show <id> detail (with map links if where_* set)
11
+ // /memo delete <id> remove
12
+ // /memo here [what] shortcut: issue a GPS capture link with
13
+ // a note (skips going through the agent)
14
+ // /memo help this
15
+ import { listMemos, getMemo, deleteMemo, searchMemos, mapUrls, } from '../memos.js';
16
+ import { issueToken } from '../location-token.js';
17
+ const DEFAULT_LOC_BASE_URL = 'https://agent.iclaw.host';
18
+ const HELP = [
19
+ '📝 /memo — 5W1H 记录',
20
+ '─────────────────────',
21
+ '/memo 列出最近 10 条',
22
+ '/memo list [N] 列 N 条',
23
+ '/memo show <id> 查看一条 (含地图链接)',
24
+ '/memo delete <id> 删除',
25
+ '/memo here [what] 拿当前 GPS 链接 (例: /memo here 车)',
26
+ '',
27
+ '更聪明的用法:直接说自然语言交给 agent,例如',
28
+ ' "帮我记下,爸爸的生日是5月8日"',
29
+ ' "我的车在哪?"',
30
+ 'agent 会自动调 save_memo / search_memos / request_location_capture',
31
+ '',
32
+ '别名: /memo · /记',
33
+ ].join('\n');
34
+ function fmtRow(m) {
35
+ const head = [m.what, m.who && `· ${m.who}`].filter(Boolean).join(' ');
36
+ const when = m.when_text || m.when_at || '';
37
+ const where = m.where_label || (m.where_lat != null ? '📍坐标' : '');
38
+ const meta = [when, where].filter(Boolean).join(' · ');
39
+ const expires = m.expires_at ? ` (⏰ 过期 ${m.expires_at.slice(0, 16)})` : '';
40
+ return `📝 #${m.id} ${head}${meta ? `\n ${meta}` : ''}${expires}`;
41
+ }
42
+ function fmtDetail(m) {
43
+ const lines = [`📝 记录 #${m.id}`];
44
+ lines.push(` what: ${m.what}`);
45
+ if (m.who)
46
+ lines.push(` who: ${m.who}`);
47
+ if (m.when_at)
48
+ lines.push(` when: ${m.when_at}`);
49
+ else if (m.when_text)
50
+ lines.push(` when: ${m.when_text}`);
51
+ if (m.where_label)
52
+ lines.push(` where: ${m.where_label}`);
53
+ if (m.where_lat != null && m.where_lng != null) {
54
+ lines.push(` 坐标: ${m.where_lat.toFixed(6)}, ${m.where_lng.toFixed(6)}`);
55
+ }
56
+ if (m.how)
57
+ lines.push(` how: ${m.how}`);
58
+ if (m.why)
59
+ lines.push(` why: ${m.why}`);
60
+ lines.push(` 来源: ${m.source}`);
61
+ lines.push(` 记于: ${m.created_at}`);
62
+ if (m.expires_at)
63
+ lines.push(` ⏰ 自动过期: ${m.expires_at}`);
64
+ if (m.where_lat != null && m.where_lng != null) {
65
+ const urls = mapUrls(m.where_lat, m.where_lng, m.where_label || m.what, '');
66
+ lines.push('');
67
+ lines.push(` 🗺 [百度地图](${urls.baidu}) · [高德地图](${urls.amap}) · [Google](${urls.google})`);
68
+ }
69
+ return lines.join('\n');
70
+ }
71
+ export async function handleMemoCommand(args, ctx) {
72
+ const trimmed = args.trim();
73
+ const ownerOpts = ctx.userId ? { userId: ctx.userId } : {};
74
+ if (!trimmed)
75
+ return listAction('', ownerOpts);
76
+ const firstWord = trimmed.split(/\s+/)[0].toLowerCase();
77
+ const rest = trimmed.slice(firstWord.length).trim();
78
+ if (firstWord === 'help' || firstWord === '?' || firstWord === '-h' || firstWord === '--help')
79
+ return HELP;
80
+ if (firstWord === 'list' || firstWord === 'ls')
81
+ return listAction(rest, ownerOpts);
82
+ if (firstWord === 'show' || firstWord === 'get')
83
+ return showAction(rest, ownerOpts);
84
+ if (firstWord === 'delete' || firstWord === 'del' || firstWord === 'rm')
85
+ return deleteAction(rest, ownerOpts);
86
+ if (firstWord === 'search' || firstWord === 'find')
87
+ return searchAction(rest, ownerOpts);
88
+ if (firstWord === 'here' || firstWord === '当前')
89
+ return hereAction(rest, ctx);
90
+ // Free-form input that's not a known subcommand: treat as a search query.
91
+ // Power-user shortcut for "/memo 车" → search for "车".
92
+ return searchAction(trimmed, ownerOpts);
93
+ }
94
+ function listAction(rest, ownerOpts) {
95
+ const n = rest ? Math.max(1, Math.min(50, parseInt(rest, 10) || 10)) : 10;
96
+ const all = listMemos({ ...ownerOpts, limit: n });
97
+ if (!all.length) {
98
+ return [
99
+ '📭 还没有记录。',
100
+ '',
101
+ '让 agent 帮你: 直接说"帮我记下..."',
102
+ '看帮助: /memo help',
103
+ ].join('\n');
104
+ }
105
+ return [`📝 最近 ${all.length} 条记录`, '', ...all.map(fmtRow), '', `详情: /memo show <id>`].join('\n');
106
+ }
107
+ function showAction(rest, ownerOpts) {
108
+ const id = parseInt(rest, 10);
109
+ if (!Number.isFinite(id))
110
+ return '用法: /memo show <id>';
111
+ const m = getMemo(id, ownerOpts);
112
+ if (!m)
113
+ return `❌ 找不到 #${id}(或不属于你)。`;
114
+ return fmtDetail(m);
115
+ }
116
+ function deleteAction(rest, ownerOpts) {
117
+ const id = parseInt(rest, 10);
118
+ if (!Number.isFinite(id))
119
+ return '用法: /memo delete <id>';
120
+ return deleteMemo(id, ownerOpts) ? `🗑 已删除 #${id}` : `❌ 找不到 #${id}(或不属于你)。`;
121
+ }
122
+ function searchAction(query, ownerOpts) {
123
+ const q = query.trim();
124
+ if (!q)
125
+ return listAction('', ownerOpts);
126
+ const rows = searchMemos({ ...ownerOpts, query: q, limit: 10 });
127
+ if (!rows.length) {
128
+ return `🔍 没有匹配 "${q}" 的记录。\n试试 /memo list 看全部,或让 agent 用更精确的查询:\n"我的${q}在哪?" 或 "${q}相关的记录"`;
129
+ }
130
+ return [`🔍 匹配 "${q}" 的 ${rows.length} 条`, '', ...rows.map(fmtRow), '', `详情: /memo show <id>`].join('\n');
131
+ }
132
+ function hereAction(rest, ctx) {
133
+ const what = rest.trim().slice(0, 80);
134
+ if (!ctx.userId)
135
+ return '❌ 无法识别用户身份,无法发起位置授权请求。';
136
+ const baseUrl = (process.env.IMHUB_LOC_BASE_URL || DEFAULT_LOC_BASE_URL).replace(/\/+$/, '');
137
+ const { token, ttlSeconds } = issueToken({
138
+ platform: ctx.platform,
139
+ channelId: ctx.channelId,
140
+ threadId: ctx.threadId,
141
+ userId: ctx.userId,
142
+ }, what ? { what } : {});
143
+ const url = `${baseUrl}/l/${token}`;
144
+ const ttlMin = Math.floor(ttlSeconds / 60);
145
+ return [
146
+ `📍 [👉 点击共享当前位置](${url})`,
147
+ '',
148
+ `链接 ${ttlMin} 分钟内有效。授权后自动回传给 bot 并记入${what ? ` "${what}"` : ''}。`,
149
+ ].join('\n');
150
+ }
151
+ //# sourceMappingURL=memo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memo.js","sourceRoot":"","sources":["../../../src/core/commands/memo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { RouteContext } from '../router.js';
2
+ export declare function handleModelCommand(args: string, ctx: RouteContext): Promise<string>;
3
+ declare function invalidateModelCache(): void;
4
+ /** Test-only diagnostic: clear caches between cases. */
5
+ export declare const _internal: {
6
+ invalidateModelCache: typeof invalidateModelCache;
7
+ };
8
+ export {};
9
+ //# sourceMappingURL=model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../../src/core/commands/model.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAoBhD,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CA4BzF;AA+FD,iBAAS,oBAAoB,IAAI,IAAI,CAGpC;AAuDD,wDAAwD;AACxD,eAAO,MAAM,SAAS;;CAA2B,CAAA"}