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,379 @@
1
+ // Job Board — persistent async job queue backed by SQLite
2
+ //
3
+ // Jobs survive restarts. Each job executes an agent invocation and stores the result.
4
+ // Supports: create, list, get, cancel.
5
+ //
6
+ // Ownership (H5/M6/H7, code-review-2026-05-06):
7
+ // - Each row carries `creator_id` (the IM userId that originated the job)
8
+ // and `workspace_id`. Commands that the user runs through IM
9
+ // (`/job list|check|cancel|run`) MUST pass the caller's userId via
10
+ // opts.creatorId so users can't peek at or stomp on each others' jobs.
11
+ // Internal callers (REST `/api/jobs`, ACP server, scheduler) pass no
12
+ // filter and see every row — that's intentional, those entry-points
13
+ // are guarded by the web / API token.
14
+ // - Legacy rows (created before the migration) have creator_id = ''.
15
+ // They're treated as "ownerless / system" and visible to every owner-
16
+ // scoped query (so an upgrade doesn't appear to vanish the user's
17
+ // prior history).
18
+ // - pruneOldJobs() walks completed/failed/cancelled rows older than
19
+ // `IM_HUB_JOB_RETENTION_DAYS` (default 30) and deletes them; runs every
20
+ // 6h via setInterval, mirroring audit-log.
21
+ import { join } from 'node:path';
22
+ import { logger as rootLogger } from './logger.js';
23
+ import { eventBus } from './event-bus.js';
24
+ import { createSqliteHelper } from './sqlite-helper.js';
25
+ import { AGIM_HOME } from './agim-paths.js';
26
+ const BOARD_DB = join(AGIM_HOME, 'jobs.db');
27
+ /** Hard cap on a single job's accumulated result. A misbehaving agent (or a
28
+ * runaway tool that dumps a giant file) could otherwise keep filling the
29
+ * Buffer in {@link runJob} until the host OOMs and rage-stuff the SQLite TEXT
30
+ * column with the same payload. We cap at 1 MiB by default; chunks that would
31
+ * push past the cap are dropped and a truncation footer is appended. Override
32
+ * via env IMHUB_JOB_RESULT_MAX_BYTES. */
33
+ function resolveMaxResultBytes() {
34
+ const raw = process.env.IMHUB_JOB_RESULT_MAX_BYTES;
35
+ if (raw) {
36
+ const n = parseInt(raw, 10);
37
+ if (Number.isFinite(n) && n > 0)
38
+ return n;
39
+ }
40
+ return 1 * 1024 * 1024;
41
+ }
42
+ /** Hard cap on concurrent runJob() invocations. Spawning more than this
43
+ * would let a few /job run X requests OOM the host (each agent process
44
+ * carries hundreds of MB). Override via env IM_HUB_MAX_CONCURRENT_JOBS. */
45
+ function resolveMaxConcurrent() {
46
+ const raw = process.env.IM_HUB_MAX_CONCURRENT_JOBS;
47
+ if (raw) {
48
+ const n = parseInt(raw, 10);
49
+ if (Number.isFinite(n) && n > 0)
50
+ return n;
51
+ }
52
+ return 3;
53
+ }
54
+ // Running job controllers (for cancellation)
55
+ const runningControllers = new Map();
56
+ // Wait queue for jobs that arrived while at capacity. Each entry is the
57
+ // resolver of a Promise the caller is awaiting on.
58
+ const waitQueue = [];
59
+ let activeJobs = 0;
60
+ /**
61
+ * Reset jobs that were 'running' when the previous im-hub process died.
62
+ * Without this, those rows stay marked 'running' forever and every
63
+ * /job list shows ghosts.
64
+ */
65
+ function reapStaleRunning(d) {
66
+ try {
67
+ const stmt = d.prepare("UPDATE jobs SET status='failed', error='im-hub restarted while running', completed_at=datetime('now') WHERE status='running'");
68
+ const info = stmt.run();
69
+ if (info.changes > 0) {
70
+ rootLogger.warn({ event: 'job-board.reap', stale: info.changes }, `Marked ${info.changes} stale running job(s) as failed`);
71
+ }
72
+ }
73
+ catch {
74
+ // best-effort; missing table is fine on first start
75
+ }
76
+ }
77
+ /**
78
+ * Idempotent column-add for ownership tracking. Run on every helper init —
79
+ * SQLite's ALTER TABLE ADD COLUMN throws "duplicate column name" if the
80
+ * column already exists, which we silently swallow. Cheaper than the full
81
+ * pragma table_info() inspection round-trip.
82
+ */
83
+ function migrateOwnership(d) {
84
+ for (const col of ['creator_id', 'workspace_id']) {
85
+ try {
86
+ d.prepare(`ALTER TABLE jobs ADD COLUMN ${col} TEXT NOT NULL DEFAULT ''`).run();
87
+ rootLogger.info({ component: 'job-board', column: col, event: 'job-board.migration' }, `Added ${col} column to jobs table`);
88
+ }
89
+ catch {
90
+ // duplicate column — already migrated
91
+ }
92
+ }
93
+ }
94
+ /** Default number of days a completed/failed/cancelled job is retained. */
95
+ function resolveRetentionDays() {
96
+ const raw = process.env.IM_HUB_JOB_RETENTION_DAYS;
97
+ if (raw) {
98
+ const n = parseInt(raw, 10);
99
+ if (Number.isFinite(n) && n > 0)
100
+ return n;
101
+ }
102
+ return 30;
103
+ }
104
+ /** How often pruneOldJobs() is fired by the auto-sweep timer. 0 disables. */
105
+ const RETENTION_SWEEP_INTERVAL_MS = 6 * 60 * 60 * 1000;
106
+ let retentionSweepTimer = null;
107
+ const helper = createSqliteHelper({
108
+ file: BOARD_DB,
109
+ component: 'job-board',
110
+ logger: rootLogger,
111
+ schema: `
112
+ CREATE TABLE IF NOT EXISTS jobs (
113
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
114
+ agent TEXT NOT NULL,
115
+ prompt TEXT NOT NULL,
116
+ status TEXT NOT NULL DEFAULT 'pending',
117
+ result TEXT,
118
+ error TEXT,
119
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
120
+ completed_at TEXT,
121
+ creator_id TEXT NOT NULL DEFAULT '',
122
+ workspace_id TEXT NOT NULL DEFAULT ''
123
+ );
124
+ CREATE INDEX IF NOT EXISTS idx_jobs_created ON jobs(created_at);
125
+ CREATE INDEX IF NOT EXISTS idx_jobs_creator ON jobs(creator_id);
126
+ CREATE INDEX IF NOT EXISTS idx_jobs_status_created ON jobs(status, created_at);
127
+ `,
128
+ init: (d) => {
129
+ migrateOwnership(d);
130
+ // First-time / cold-start cleanup: any 'running' rows are leftover from a
131
+ // prior process that didn't get to finalize.
132
+ reapStaleRunning(d);
133
+ // Initial retention sweep + periodic timer. Mirrors audit-log shape so
134
+ // both tables stay bounded without operator intervention.
135
+ pruneOldJobs(d);
136
+ if (RETENTION_SWEEP_INTERVAL_MS > 0 && retentionSweepTimer === null) {
137
+ retentionSweepTimer = setInterval(() => {
138
+ const live = helper.get();
139
+ if (live)
140
+ pruneOldJobs(live);
141
+ }, RETENTION_SWEEP_INTERVAL_MS);
142
+ if (typeof retentionSweepTimer === 'object' && retentionSweepTimer && 'unref' in retentionSweepTimer) {
143
+ retentionSweepTimer.unref();
144
+ }
145
+ }
146
+ },
147
+ });
148
+ /** Stop the retention sweep (used by tests + graceful shutdown). */
149
+ export function stopJobRetentionSweep() {
150
+ if (retentionSweepTimer) {
151
+ clearInterval(retentionSweepTimer);
152
+ retentionSweepTimer = null;
153
+ }
154
+ }
155
+ /** Close the underlying SQLite handle. Called by cli.ts on graceful
156
+ * shutdown so the WAL is checkpointed before exit (L2). */
157
+ export function closeJobBoardDb() {
158
+ helper.close();
159
+ }
160
+ function getDb() {
161
+ return helper.get();
162
+ }
163
+ export function createJob(agent, prompt, opts = {}) {
164
+ const d = getDb();
165
+ if (!d)
166
+ throw new Error('Job board unavailable (SQLite not initialized)');
167
+ const row = d.prepare('INSERT INTO jobs (agent, prompt, status, creator_id, workspace_id) VALUES (?, ?, ?, ?, ?)').run(agent, prompt, 'pending', opts.creatorId || '', opts.workspaceId || '');
168
+ const id = Number(row.lastInsertRowid);
169
+ eventBus.publish({ type: 'job', phase: 'created', jobId: id, agent });
170
+ return id;
171
+ }
172
+ export function getJob(id, opts = {}) {
173
+ const d = getDb();
174
+ if (!d)
175
+ return null;
176
+ const row = (opts.creatorId !== undefined
177
+ ? d.prepare("SELECT * FROM jobs WHERE id = ? AND (creator_id = ? OR creator_id = '')")
178
+ .get(id, opts.creatorId)
179
+ : d.prepare('SELECT * FROM jobs WHERE id = ?').get(id));
180
+ return row || null;
181
+ }
182
+ export function listJobs(limit = 20, status, opts = {}) {
183
+ const d = getDb();
184
+ if (!d)
185
+ return [];
186
+ const safeLimit = Number.isFinite(limit) && limit > 0 ? Math.min(Math.floor(limit), 1000) : 20;
187
+ const conditions = [];
188
+ const params = [];
189
+ if (status) {
190
+ conditions.push('status = ?');
191
+ params.push(status);
192
+ }
193
+ if (opts.creatorId !== undefined) {
194
+ conditions.push("(creator_id = ? OR creator_id = '')");
195
+ params.push(opts.creatorId);
196
+ }
197
+ if (opts.agent) {
198
+ conditions.push('agent = ?');
199
+ params.push(opts.agent);
200
+ }
201
+ const where = conditions.length ? `WHERE ${conditions.join(' AND ')}` : '';
202
+ return d.prepare(`SELECT * FROM jobs ${where} ORDER BY created_at DESC LIMIT ?`)
203
+ .all(...params, safeLimit);
204
+ }
205
+ function updateJob(id, fields) {
206
+ const d = getDb();
207
+ if (!d)
208
+ return;
209
+ const sets = [];
210
+ const vals = [];
211
+ for (const [k, v] of Object.entries(fields)) {
212
+ if (v !== undefined) {
213
+ sets.push(`${k} = ?`);
214
+ vals.push(v);
215
+ }
216
+ }
217
+ if (!sets.length)
218
+ return;
219
+ d.prepare(`UPDATE jobs SET ${sets.join(', ')} WHERE id = ?`).run(...vals, id);
220
+ }
221
+ /**
222
+ * Acquire a job slot. Returns immediately when capacity available, otherwise
223
+ * queues the caller and returns a promise that resolves when a slot frees.
224
+ */
225
+ async function acquireSlot() {
226
+ const max = resolveMaxConcurrent();
227
+ if (activeJobs < max) {
228
+ activeJobs++;
229
+ return;
230
+ }
231
+ await new Promise((resolve) => waitQueue.push(resolve));
232
+ activeJobs++;
233
+ }
234
+ function releaseSlot() {
235
+ activeJobs = Math.max(0, activeJobs - 1);
236
+ const next = waitQueue.shift();
237
+ if (next)
238
+ next();
239
+ }
240
+ export async function runJob(id, runner, logger) {
241
+ const job = getJob(id);
242
+ if (!job)
243
+ return;
244
+ // Block here if the job board is at capacity. The job stays 'pending' in
245
+ // SQLite while waiting — visible to /job list as queued.
246
+ await acquireSlot();
247
+ const controller = new AbortController();
248
+ runningControllers.set(id, controller);
249
+ updateJob(id, { status: 'running' });
250
+ eventBus.publish({ type: 'job', phase: 'started', jobId: id, agent: job.agent });
251
+ logger.info({ event: 'job.start', jobId: id, agent: job.agent, active: activeJobs });
252
+ let fullText = '';
253
+ let bytes = 0;
254
+ let droppedBytes = 0;
255
+ let truncated = false;
256
+ const cap = resolveMaxResultBytes();
257
+ try {
258
+ for await (const chunk of runner(job, logger, controller.signal)) {
259
+ if (controller.signal.aborted)
260
+ break;
261
+ const chunkBytes = Buffer.byteLength(chunk, 'utf-8');
262
+ if (truncated) {
263
+ droppedBytes += chunkBytes;
264
+ continue;
265
+ }
266
+ if (bytes + chunkBytes > cap) {
267
+ // Drop the entire over-cap chunk to keep the boundary on a UTF-8 /
268
+ // line boundary the producer chose; partial slicing risks splitting
269
+ // a multibyte char or a JSON object mid-event.
270
+ truncated = true;
271
+ droppedBytes += chunkBytes;
272
+ continue;
273
+ }
274
+ fullText += chunk;
275
+ bytes += chunkBytes;
276
+ }
277
+ if (truncated) {
278
+ const note = `\n\n[im-hub: result truncated — ${droppedBytes} bytes dropped after ${cap}-byte cap; raise IMHUB_JOB_RESULT_MAX_BYTES if needed]`;
279
+ fullText += note;
280
+ logger.warn({ event: 'job.result.truncated', jobId: id, droppedBytes, cap });
281
+ }
282
+ // Only update if not cancelled
283
+ if (!controller.signal.aborted) {
284
+ updateJob(id, { status: 'completed', result: fullText, completed_at: new Date().toISOString() });
285
+ eventBus.publish({ type: 'job', phase: 'completed', jobId: id, agent: job.agent });
286
+ logger.info({ event: 'job.complete', jobId: id, resultLen: fullText.length, truncated });
287
+ }
288
+ else {
289
+ updateJob(id, { status: 'cancelled', result: fullText || null, completed_at: new Date().toISOString() });
290
+ eventBus.publish({ type: 'job', phase: 'cancelled', jobId: id, agent: job.agent });
291
+ logger.info({ event: 'job.cancelled', jobId: id });
292
+ }
293
+ }
294
+ catch (err) {
295
+ const msg = err instanceof Error ? err.message : String(err);
296
+ const stack = err instanceof Error ? err.stack : undefined;
297
+ updateJob(id, { status: 'failed', error: msg, completed_at: new Date().toISOString() });
298
+ eventBus.publish({ type: 'job', phase: 'failed', jobId: id, agent: job.agent });
299
+ logger.error({ event: 'job.failed', jobId: id, error: msg, stack });
300
+ }
301
+ finally {
302
+ runningControllers.delete(id);
303
+ releaseSlot();
304
+ }
305
+ }
306
+ /** Test/diagnostic accessor: how many runJob invocations are currently in flight. */
307
+ export function _activeJobCount() { return activeJobs; }
308
+ /** Test/diagnostic accessor: the wait queue depth. */
309
+ export function _waitQueueDepth() { return waitQueue.length; }
310
+ /** Test-only: directly exercise the concurrency gate without SQLite. */
311
+ export const _testSlot = { acquire: acquireSlot, release: releaseSlot };
312
+ export function cancelJob(id, opts = {}) {
313
+ const job = getJob(id, opts);
314
+ if (!job || (job.status !== 'pending' && job.status !== 'running'))
315
+ return false;
316
+ const ctrl = runningControllers.get(id);
317
+ if (ctrl) {
318
+ ctrl.abort();
319
+ runningControllers.delete(id);
320
+ }
321
+ updateJob(id, { status: 'cancelled', completed_at: new Date().toISOString() });
322
+ eventBus.publish({ type: 'job', phase: 'cancelled', jobId: id, agent: job.agent });
323
+ return true;
324
+ }
325
+ /**
326
+ * Delete jobs that finished (completed / failed / cancelled) more than
327
+ * `daysRetention` days ago. 'pending' / 'running' rows are never pruned —
328
+ * a stalled-but-resumable job is the operator's call. Returns the row
329
+ * count so callers / tests can assert.
330
+ */
331
+ export function pruneOldJobs(d = getDb(), daysRetention = resolveRetentionDays()) {
332
+ if (!d)
333
+ return 0;
334
+ try {
335
+ const info = d.prepare(`
336
+ DELETE FROM jobs
337
+ WHERE status IN ('completed', 'failed', 'cancelled')
338
+ AND completed_at IS NOT NULL
339
+ AND completed_at < datetime('now', ?)
340
+ `).run(`-${daysRetention} days`);
341
+ if (info.changes > 0) {
342
+ rootLogger.info({
343
+ component: 'job-board', event: 'job-board.pruned',
344
+ deleted: info.changes, days: daysRetention,
345
+ }, `Pruned ${info.changes} job row(s) older than ${daysRetention}d`);
346
+ }
347
+ return info.changes;
348
+ }
349
+ catch (err) {
350
+ const msg = err instanceof Error ? err.message : String(err);
351
+ rootLogger.warn({ component: 'job-board', event: 'job-board.prune.failed', error: msg }, 'job-board retention sweep failed');
352
+ return 0;
353
+ }
354
+ }
355
+ export function getJobStats() {
356
+ const empty = { total: 0, pending: 0, running: 0, completed: 0, failed: 0 };
357
+ const d = getDb();
358
+ if (!d)
359
+ return empty;
360
+ try {
361
+ const row = d.prepare(`
362
+ SELECT
363
+ COUNT(*) as total,
364
+ SUM(CASE WHEN status='pending' THEN 1 ELSE 0 END) as pending,
365
+ SUM(CASE WHEN status='running' THEN 1 ELSE 0 END) as running,
366
+ SUM(CASE WHEN status='completed' THEN 1 ELSE 0 END) as completed,
367
+ SUM(CASE WHEN status='failed' THEN 1 ELSE 0 END) as failed
368
+ FROM jobs
369
+ `).get();
370
+ return {
371
+ total: row.total || 0, pending: row.pending || 0, running: row.running || 0,
372
+ completed: row.completed || 0, failed: row.failed || 0,
373
+ };
374
+ }
375
+ catch {
376
+ return empty;
377
+ }
378
+ }
379
+ //# sourceMappingURL=job-board.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"job-board.js","sourceRoot":"","sources":["../../src/core/job-board.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ export interface LocationContext {
2
+ /** WGS-84 latitude (caller is responsible for any GCJ-02→WGS-84 reversal). */
3
+ lat: number;
4
+ /** WGS-84 longitude. */
5
+ lng: number;
6
+ /** Optional accuracy in meters from the source platform. */
7
+ accuracy?: number;
8
+ /** Venue title (Telegram venue / Feishu location.name). */
9
+ venueLabel?: string;
10
+ /** Venue address line. */
11
+ venueAddress?: string;
12
+ /** Internal — used for TTL eviction. */
13
+ createdAt: number;
14
+ }
15
+ export declare function setLocationContext(threadKey: string, ctx: Omit<LocationContext, 'createdAt'>): void;
16
+ /**
17
+ * Pop the location for this thread if any. Single-shot — consuming a
18
+ * location clears it, so a single share annotates at most one user turn.
19
+ */
20
+ export declare function consumeLocationContext(threadKey: string): LocationContext | null;
21
+ export declare function _sizeForTest(): number;
22
+ export declare function _clearForTest(): void;
23
+ /**
24
+ * Render a single-line annotation that we prepend to the user's next text
25
+ * message before sending it to the agent. Format is a structured tag the
26
+ * agent's system prompt knows about — see save_memo's tool description.
27
+ *
28
+ * Example:
29
+ * [user just shared location: lat=30.275796, lng=120.127970, name="黄龙国际中心", address="学院路77号", accuracy_m=5]
30
+ */
31
+ export declare function formatLocationAnnotation(c: LocationContext): string;
32
+ //# sourceMappingURL=location-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"location-context.d.ts","sourceRoot":"","sources":["../../src/core/location-context.ts"],"names":[],"mappings":"AAwBA,MAAM,WAAW,eAAe;IAC9B,8EAA8E;IAC9E,GAAG,EAAE,MAAM,CAAA;IACX,wBAAwB;IACxB,GAAG,EAAE,MAAM,CAAA;IACX,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,2DAA2D;IAC3D,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,0BAA0B;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,wCAAwC;IACxC,SAAS,EAAE,MAAM,CAAA;CAClB;AAUD,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,IAAI,CAAC,eAAe,EAAE,WAAW,CAAC,GACtC,IAAI,CAGN;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAKhF;AAED,wBAAgB,YAAY,IAAI,MAAM,CAAsB;AAC5D,wBAAgB,aAAa,IAAI,IAAI,CAAkB;AAEvD;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CAAC,CAAC,EAAE,eAAe,GAAG,MAAM,CAWnE"}
@@ -0,0 +1,69 @@
1
+ // location-context.ts — short-lived "user just shared GPS / venue" cache
2
+ // per IM thread. Used by Telegram + Feishu adapters when the user sends a
3
+ // native location/venue message: instead of running a deterministic
4
+ // pending-reply + heuristic-extraction flow, we just stash the coords here
5
+ // for the duration of one user turn, and cli.ts injects an annotation
6
+ // into the user's NEXT text message before dispatching to the agent.
7
+ //
8
+ // Why this design (matches WeChat's H5-flow architecture):
9
+ // The agent already has full conversational context + LLM judgment;
10
+ // it's the right decision-maker for "should this be saved? as what?".
11
+ // The adapter's job is to surface the data, not to decide.
12
+ //
13
+ // Compared to the old pending-memo-location.ts:
14
+ // - No reply-decoding regex (cancel/confirm/free-form patterns)
15
+ // - No heuristic noun extraction (was producing "记下" / "一个好吃的日"
16
+ // style truncations)
17
+ // - No "y/n to skip" UX — the agent decides based on the user's actual
18
+ // follow-up message. "不用记" / silence / new topic all work naturally.
19
+ //
20
+ // The cache is purely additive: location is consumed on the next agent
21
+ // dispatch in the same thread within 5 min. Beyond that, it evicts.
22
+ const TTL_MS = 5 * 60 * 1000;
23
+ const store = new Map();
24
+ function evictExpired(now) {
25
+ for (const [k, v] of store) {
26
+ if (now - v.createdAt > TTL_MS)
27
+ store.delete(k);
28
+ }
29
+ }
30
+ export function setLocationContext(threadKey, ctx) {
31
+ evictExpired(Date.now());
32
+ store.set(threadKey, { ...ctx, createdAt: Date.now() });
33
+ }
34
+ /**
35
+ * Pop the location for this thread if any. Single-shot — consuming a
36
+ * location clears it, so a single share annotates at most one user turn.
37
+ */
38
+ export function consumeLocationContext(threadKey) {
39
+ evictExpired(Date.now());
40
+ const c = store.get(threadKey);
41
+ if (c)
42
+ store.delete(threadKey);
43
+ return c ?? null;
44
+ }
45
+ export function _sizeForTest() { return store.size; }
46
+ export function _clearForTest() { store.clear(); }
47
+ /**
48
+ * Render a single-line annotation that we prepend to the user's next text
49
+ * message before sending it to the agent. Format is a structured tag the
50
+ * agent's system prompt knows about — see save_memo's tool description.
51
+ *
52
+ * Example:
53
+ * [user just shared location: lat=30.275796, lng=120.127970, name="黄龙国际中心", address="学院路77号", accuracy_m=5]
54
+ */
55
+ export function formatLocationAnnotation(c) {
56
+ const parts = [
57
+ `lat=${c.lat.toFixed(6)}`,
58
+ `lng=${c.lng.toFixed(6)}`,
59
+ ];
60
+ if (c.venueLabel)
61
+ parts.push(`name=${JSON.stringify(c.venueLabel)}`);
62
+ if (c.venueAddress)
63
+ parts.push(`address=${JSON.stringify(c.venueAddress)}`);
64
+ if (typeof c.accuracy === 'number' && Number.isFinite(c.accuracy)) {
65
+ parts.push(`accuracy_m=${Math.round(c.accuracy)}`);
66
+ }
67
+ return `[user just shared location: ${parts.join(', ')}]`;
68
+ }
69
+ //# sourceMappingURL=location-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"location-context.js","sourceRoot":"","sources":["../../src/core/location-context.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,0EAA0E;AAC1E,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,qEAAqE;AACrE,EAAE;AACF,2DAA2D;AAC3D,sEAAsE;AACtE,wEAAwE;AACxE,6DAA6D;AAC7D,EAAE;AACF,gDAAgD;AAChD,kEAAkE;AAClE,kEAAkE;AAClE,yBAAyB;AACzB,yEAAyE;AACzE,yEAAyE;AACzE,EAAE;AACF,uEAAuE;AACvE,oEAAoE;AAEpE,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAA;AAiB5B,MAAM,KAAK,GAAG,IAAI,GAAG,EAA2B,CAAA;AAEhD,SAAS,YAAY,CAAC,GAAW;IAC/B,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC;QAC3B,IAAI,GAAG,GAAG,CAAC,CAAC,SAAS,GAAG,MAAM;YAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;IACjD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,SAAiB,EACjB,GAAuC;IAEvC,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAA;IACxB,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,GAAG,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;AACzD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,SAAiB;IACtD,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAA;IACxB,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;IAC9B,IAAI,CAAC;QAAE,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;IAC9B,OAAO,CAAC,IAAI,IAAI,CAAA;AAClB,CAAC;AAED,MAAM,UAAU,YAAY,KAAa,OAAO,KAAK,CAAC,IAAI,CAAA,CAAC,CAAC;AAC5D,MAAM,UAAU,aAAa,KAAW,KAAK,CAAC,KAAK,EAAE,CAAA,CAAC,CAAC;AAEvD;;;;;;;GAOG;AACH,MAAM,UAAU,wBAAwB,CAAC,CAAkB;IACzD,MAAM,KAAK,GAAa;QACtB,OAAO,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;QACzB,OAAO,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;KAC1B,CAAA;IACD,IAAI,CAAC,CAAC,UAAU;QAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC,CAAA;IACpE,IAAI,CAAC,CAAC,YAAY;QAAE,KAAK,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAA;IAC3E,IAAI,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClE,KAAK,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;IACpD,CAAC;IACD,OAAO,+BAA+B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAA;AAC3D,CAAC"}
@@ -0,0 +1,57 @@
1
+ export interface TokenContext {
2
+ platform: string;
3
+ channelId: string;
4
+ threadId: string;
5
+ userId: string;
6
+ }
7
+ /**
8
+ * Optional metadata the issuer may attach.
9
+ *
10
+ * - `what` : label shown on the H5 page and used as the new memo's
11
+ * `what` field if the token's flow CREATES a memo.
12
+ * - `memoId` : when set, the H5 callback UPDATES an existing memo's
13
+ * where_lat / where_lng instead of creating a new one.
14
+ * Used when agent already created the memo via save_memo
15
+ * and is now augmenting it with GPS.
16
+ *
17
+ * Server-side only — clients (the H5 page) can READ what/memoId via
18
+ * /api/loc/info but never inject them.
19
+ */
20
+ export interface TokenMeta {
21
+ what?: string;
22
+ memoId?: number;
23
+ }
24
+ export declare function issueToken(ctx: TokenContext, meta?: TokenMeta): {
25
+ token: string;
26
+ expiresAt: number;
27
+ ttlSeconds: number;
28
+ };
29
+ /** Read-only peek — used by GET /api/loc/info so the H5 page can render
30
+ * "正在记录: <what>" without consuming the token. Returns null when the
31
+ * token is unknown or expired (auto-evicts expired). */
32
+ export declare function peekToken(token: string): {
33
+ ctx: TokenContext;
34
+ what: string;
35
+ memoId: number | null;
36
+ expiresAt: number;
37
+ } | null;
38
+ export type ConsumeResult = {
39
+ ok: true;
40
+ ctx: TokenContext;
41
+ what: string;
42
+ memoId: number | null;
43
+ } | {
44
+ ok: false;
45
+ reason: 'unknown' | 'expired';
46
+ };
47
+ /**
48
+ * Consume a token — single-shot. After this call, the token is removed
49
+ * from the store regardless of outcome (`expired` tokens are also dropped
50
+ * to prevent retry brute-force scanning).
51
+ */
52
+ export declare function consumeToken(token: string): ConsumeResult;
53
+ /** Test/diagnostic helper. */
54
+ export declare function _pendingCount(): number;
55
+ export declare function _clearAll(): void;
56
+ export declare function _stopSweep(): void;
57
+ //# sourceMappingURL=location-token.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"location-token.d.ts","sourceRoot":"","sources":["../../src/core/location-token.ts"],"names":[],"mappings":"AAiCA,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;CACf;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,SAAS;IACxB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AA8BD,wBAAgB,UAAU,CAAC,GAAG,EAAE,YAAY,EAAE,IAAI,GAAE,SAAc,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAsB5H;AAED;;yDAEyD;AACzD,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,GAAG,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAa7H;AAED,MAAM,MAAM,aAAa,GACrB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,GAAG,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GACpE;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,SAAS,GAAG,SAAS,CAAA;CAAE,CAAA;AAEhD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAsBzD;AAED,8BAA8B;AAC9B,wBAAgB,aAAa,IAAI,MAAM,CAAuB;AAC9D,wBAAgB,SAAS,IAAI,IAAI,CAAmB;AACpD,wBAAgB,UAAU,IAAI,IAAI,CAEjC"}