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,455 @@
1
+ // cli-ui/i18n.ts — string dictionaries + persistent language preference
2
+ // for the interactive CLI wizard (agim / agim config / status / etc.).
3
+ //
4
+ // Pattern mirrors imhub-site's strings.ts: the EN dict drives the Key type,
5
+ // the ZH dict is `Record<Key, string>` so missing keys are a compile error.
6
+ //
7
+ // Language preference is persisted to ~/.im-hub/cli-lang (single-line file
8
+ // containing "en" or "zh"). First-run users get a language picker; later
9
+ // runs default to the saved choice (Enter accepts).
10
+ import { readFileSync, writeFileSync, mkdirSync } from 'node:fs';
11
+ import { dirname, join } from 'node:path';
12
+ import { AGIM_HOME } from '../core/agim-paths.js';
13
+ const PREF_FILE = join(AGIM_HOME, 'cli-lang');
14
+ const en = {
15
+ // ─── language picker ─────────────────────────────────────────────────
16
+ 'lang.pick': 'Select language / 选择界面语言',
17
+ 'lang.label.en': 'English',
18
+ 'lang.label.zh': '中文',
19
+ 'lang.saved': 'Language preference saved to {file}',
20
+ // ─── entry menu (bare `agim`) ────────────────────────────────────────
21
+ 'menu.title': 'Agim · maintenance entry',
22
+ 'menu.subtitle': 'What would you like to do?',
23
+ 'menu.config': 'Configure (messengers, agents, SMTP, Baidu Maps …)',
24
+ 'menu.status': 'Show service status',
25
+ 'menu.start': 'Start the service (foreground)',
26
+ 'menu.start_bg': 'Start the service (background)',
27
+ 'menu.restart': 'Restart the service',
28
+ 'menu.stop': 'Stop the service',
29
+ 'menu.uninstall': 'Uninstall Agim (keeps workspaces)',
30
+ 'menu.quit': 'Quit',
31
+ // ─── config root ─────────────────────────────────────────────────────
32
+ 'config.title': 'Agim · config',
33
+ 'config.subtitle': 'Pick a section to edit. Each section has a Back option.',
34
+ 'config.section.messengers': 'Messengers (WeChat / Telegram / Feishu / Discord / Email)',
35
+ 'config.section.agents': 'AI agents (Claude Code / OpenCode / Codex / Copilot)',
36
+ 'config.section.acp': 'Remote ACP agents',
37
+ 'config.section.smtp': 'SMTP — email reminder delivery',
38
+ 'config.section.baidu': 'Baidu Maps AK — /memo address geocoding',
39
+ 'config.section.done': 'Done — save and exit',
40
+ 'config.saved': 'Config saved to {file}',
41
+ // ─── messengers ──────────────────────────────────────────────────────
42
+ 'messengers.title': 'Messengers',
43
+ 'messengers.subtitle': 'Pick a messenger to configure. Each is independent.',
44
+ 'messengers.status.enabled': 'enabled',
45
+ 'messengers.status.enabled_no_creds': 'enabled (credentials missing)',
46
+ 'messengers.status.disabled': 'not configured',
47
+ 'messengers.label.wechat': 'WeChat (iLink bot)',
48
+ 'messengers.label.telegram': 'Telegram',
49
+ 'messengers.label.feishu': 'Feishu / Lark',
50
+ 'messengers.label.dingtalk': 'DingTalk (钉钉)',
51
+ 'messengers.label.discord': 'Discord',
52
+ 'messengers.label.email': 'Email (SMTP push)',
53
+ 'messengers.row': '{label} — {status}',
54
+ 'messengers.action.configure': 'Configure',
55
+ 'messengers.action.reconfigure': 'Re-configure (replace credentials)',
56
+ 'messengers.action.remove': 'Remove from enabled list',
57
+ 'messengers.action.enable_email': 'Enable email push (also requires SMTP)',
58
+ 'messengers.action.disable_email': 'Disable email push',
59
+ 'messengers.action.back': '← Back',
60
+ 'messengers.removed': '{label} removed from the enabled list.',
61
+ 'messengers.enabled': '{label} configured and enabled.',
62
+ 'messengers.smtp_hint': 'Email push relies on the SMTP settings above. Configure SMTP first if you have not.',
63
+ // WeChat QR flow
64
+ 'wechat.fetching': 'Fetching QR code from iLink…',
65
+ 'wechat.scan': '📱 Scan with WeChat — paste the URL into a browser to render the image:',
66
+ 'wechat.waiting': 'Waiting for scan + confirm (up to 2 minutes)…',
67
+ 'wechat.logged_in': '✅ Logged in as {user} (bot id: {bot})',
68
+ 'wechat.failed': '❌ Login failed or timed out. You can retry from this menu.',
69
+ // Telegram / Feishu / Discord help blocks
70
+ 'tg.docs': 'To get a bot token:\n 1. Open Telegram and search for @BotFather\n 2. Send /newbot and follow the prompts\n 3. Copy the bot token',
71
+ 'tg.field.token': 'Bot token',
72
+ 'tg.field.token_keep': 'Bot token (Enter = keep existing {hint})',
73
+ 'tg.field.channel': 'Channel id (optional, Enter = default)',
74
+ 'feishu.docs': 'To create a Feishu bot:\n 1. https://open.feishu.cn/app → 创建自建应用\n 2. Enable Bot capability\n 3. Subscribe to im.message.receive_v1\n 4. Permissions: im:message, im:message.p2p_msg:readonly, im:message:send_as_bot\n 5. Create + publish a version\n 6. Copy App ID and App Secret',
75
+ 'feishu.field.app_id': 'App ID',
76
+ 'feishu.field.app_secret': 'App Secret',
77
+ 'feishu.field.app_secret_keep': 'App Secret (Enter = keep existing)',
78
+ 'dingtalk.docs': 'To create a DingTalk Stream-mode bot:\n 1. https://open.dingtalk.com → create an Enterprise Internal App (1-person company works for personal use)\n 2. App → Add capability → Bot → choose Stream mode → publish\n 3. Copy ClientID (== AppKey) and ClientSecret from the app credentials page',
79
+ 'dingtalk.field.client_id': 'ClientID (AppKey)',
80
+ 'dingtalk.field.client_secret': 'ClientSecret',
81
+ 'dingtalk.field.client_secret_keep': 'ClientSecret (Enter = keep existing)',
82
+ 'discord.docs': 'To create a Discord bot:\n 1. https://discord.com/developers/applications → New Application\n 2. Bot tab → Add Bot → enable MESSAGE CONTENT INTENT (privileged)\n 3. Reset Token to grab the bot token\n 4. OAuth2 → URL Generator → invite to your server',
83
+ 'discord.field.token': 'Bot token',
84
+ 'discord.field.token_keep': 'Bot token (Enter = keep existing)',
85
+ 'discord.field.channel': 'Channel id (optional, Enter = default)',
86
+ 'discord.field.guilds': 'Allowed guild ids (comma-separated, optional)',
87
+ 'discord.field.channels': 'Allowed channel ids (comma-separated, optional)',
88
+ // ─── agents ──────────────────────────────────────────────────────────
89
+ 'agents.title': 'AI agents',
90
+ 'agents.subtitle': 'Pick an agent to configure. Status comes from probing its CLI.',
91
+ 'agents.status.enabled_installed': 'enabled · CLI installed',
92
+ 'agents.status.enabled_missing': 'enabled · CLI NOT installed',
93
+ 'agents.status.disabled_installed': 'not enabled · CLI installed',
94
+ 'agents.status.disabled_missing': 'not enabled · CLI NOT installed',
95
+ 'agents.row': '{label} — {status}',
96
+ 'agents.label.claude-code': 'Claude Code',
97
+ 'agents.label.opencode': 'OpenCode',
98
+ 'agents.label.codex': 'Codex',
99
+ 'agents.label.copilot': 'GitHub Copilot CLI',
100
+ 'agents.action.enable': 'Add to enabled list',
101
+ 'agents.action.disable': 'Remove from enabled list',
102
+ 'agents.action.set_default': 'Set as default agent',
103
+ 'agents.action.recheck': 'Re-check CLI installation',
104
+ 'agents.action.install_hint': 'Show install instructions',
105
+ 'agents.action.back': '← Back',
106
+ 'agents.installed_msg': '✅ {label}: CLI installed and reachable.',
107
+ 'agents.missing_msg': '❌ {label}: CLI not found on PATH.',
108
+ 'agents.auth_hint.opencode': 'After install, run: opencode auth login',
109
+ 'agents.auth_hint.codex': 'After install, run: codex login',
110
+ 'agents.install_hint.claude-code': 'Install: npm install -g @anthropic-ai/claude-code',
111
+ 'agents.install_hint.opencode': 'Install: npm i -g opencode-ai@latest (or visit https://github.com/anomalyco/opencode)',
112
+ 'agents.install_hint.codex': 'Install: npm install -g @openai/codex',
113
+ 'agents.install_hint.copilot': 'Install (any one):\n npm i -g @github/copilot\n gh extension install github/gh-copilot\n brew install copilot-cli (macOS)\n winget install GitHub.Copilot (Windows)\nDetails: https://github.com/features/copilot/cli',
114
+ 'agents.enabled': 'Enabled {label}{also_default}.',
115
+ 'agents.also_default': ' (also set as default)',
116
+ 'agents.removed': 'Removed {label} from enabled list.',
117
+ 'agents.default_set': 'Default agent is now {label}.',
118
+ 'agents.default_picker': 'Default agent (used when no /prefix)',
119
+ 'agents.set_default_subtitle': 'Pick the default agent.',
120
+ 'agents.set_default_action': 'Set / change default agent',
121
+ // ─── ACP agents ──────────────────────────────────────────────────────
122
+ 'acp.title': 'Remote ACP agents',
123
+ 'acp.subtitle': 'HTTP agents exposed via ACP. Add, edit, or remove.',
124
+ 'acp.action.add': 'Add a new agent',
125
+ 'acp.action.edit': 'Edit {name}',
126
+ 'acp.action.remove': 'Remove {name}',
127
+ 'acp.action.back': '← Back',
128
+ 'acp.field.name': 'Agent name (used as /prefix)',
129
+ 'acp.field.endpoint': 'Endpoint URL (e.g. https://api.example.com)',
130
+ 'acp.field.auth_type': 'Auth type',
131
+ 'acp.field.auth_token': 'Bearer token',
132
+ 'acp.auth.none': 'None (public endpoint)',
133
+ 'acp.auth.bearer': 'Bearer token',
134
+ 'acp.added': 'Added agent: {name}',
135
+ 'acp.removed': 'Removed agent: {name}',
136
+ // ─── SMTP ────────────────────────────────────────────────────────────
137
+ 'smtp.title': 'SMTP (for /remind email delivery)',
138
+ 'smtp.subtitle': 'These end up in {envFile} (chmod 600). Skip if email is not used.',
139
+ 'smtp.current_set': 'Currently configured: {user} via {host}:{port}',
140
+ 'smtp.current_unset': 'Currently configured: (none)',
141
+ 'smtp.action.edit': 'Edit / re-configure SMTP',
142
+ 'smtp.action.disable': 'Disable SMTP (clear all keys)',
143
+ 'smtp.action.back': '← Back',
144
+ 'smtp.preset': 'Pick a preset or Custom',
145
+ 'smtp.preset.gmail': 'Gmail (smtp.gmail.com:465, requires App Password)',
146
+ 'smtp.preset.outlook': 'Outlook (smtp.office365.com:587)',
147
+ 'smtp.preset.qq': 'QQ Mail (smtp.qq.com:465, requires authorization code)',
148
+ 'smtp.preset.163': '163 Mail (smtp.163.com:465, requires authorization code)',
149
+ 'smtp.preset.custom': 'Custom SMTP server',
150
+ 'smtp.preset.skip': 'Skip — disable SMTP',
151
+ 'smtp.field.host': 'SMTP host',
152
+ 'smtp.field.port': 'SMTP port',
153
+ 'smtp.field.user': 'SMTP user (login email)',
154
+ 'smtp.field.pass': 'SMTP password / app password (hidden)',
155
+ 'smtp.field.pass_keep': 'SMTP password (hidden, Enter = keep existing)',
156
+ 'smtp.field.from': 'From address (Enter = same as user)',
157
+ 'smtp.field.secure': 'TLS mode',
158
+ 'smtp.secure.auto': 'auto (recommended)',
159
+ 'smtp.secure.true': 'true (SSL on connect, e.g. port 465)',
160
+ 'smtp.secure.false': 'false (STARTTLS, e.g. port 587)',
161
+ 'smtp.saved': 'SMTP credentials saved to {file} (chmod 600)',
162
+ 'smtp.cleared': 'SMTP disabled — cleared {file}',
163
+ 'env.shadowed_warn': '⚠️ {key} is also set by the running environment (systemd unit / shell export). Saving to {file} alone will NOT change the active value — update the unit file or `unset` the shell export first.',
164
+ // ─── Baidu Maps AK ───────────────────────────────────────────────────
165
+ 'baidu.title': 'Baidu Maps AK (for /memo address geocoding)',
166
+ 'baidu.subtitle': 'Optional — without it, /memo still works with raw coords + browser GPS.',
167
+ 'baidu.howto': 'Get a free AK: https://lbsyun.baidu.com → Console → 应用管理 → 创建应用 → 服务端 API',
168
+ 'baidu.action.set': 'Set / update AK',
169
+ 'baidu.action.clear': 'Clear AK (disable geocoding)',
170
+ 'baidu.action.back': '← Back',
171
+ 'baidu.input': 'Paste AK (32-char string starting with non-digit, leave blank to skip)',
172
+ 'baidu.saved': 'Baidu Maps AK saved to {file}',
173
+ 'baidu.cleared': 'Baidu Maps AK cleared',
174
+ // ─── service mgmt ────────────────────────────────────────────────────
175
+ 'svc.status.title': 'Agim · status',
176
+ 'svc.status.systemd_active': 'systemd unit `im-hub.service` is active (pid {pid})',
177
+ 'svc.status.systemd_inactive': 'systemd unit `im-hub.service` exists but is inactive',
178
+ 'svc.status.bg_running': 'background daemon running (pid {pid}, log: {log})',
179
+ 'svc.status.fg_running': 'foreground process running (pid {pid})',
180
+ 'svc.status.not_running': 'no running Agim instance found',
181
+ 'svc.status.web': 'web console: http://{bind}:{port}',
182
+ 'svc.status.uptime': 'uptime: {duration}',
183
+ 'svc.start.starting_fg': 'Starting in foreground — Ctrl-C to stop.',
184
+ 'svc.start.starting_bg': 'Starting in background…',
185
+ 'svc.start.bg_ready': '✅ Background daemon started (pid {pid}, log: {log})',
186
+ 'svc.start.bg_hint': 'Tip: use `agim stop` to terminate; `agim status` to inspect.',
187
+ 'svc.start.systemd_managed': 'A systemd unit already manages im-hub. Use `systemctl start im-hub.service`.',
188
+ 'svc.start.already_running': 'Already running (pid {pid}). Use `agim restart` instead.',
189
+ 'svc.stop.stopping_systemd': 'Stopping systemd unit `im-hub.service`…',
190
+ 'svc.stop.stopping_bg': 'Stopping background daemon (pid {pid})…',
191
+ 'svc.stop.not_running': 'Nothing to stop — Agim is not running.',
192
+ 'svc.stop.stopped': '✅ Stopped.',
193
+ 'svc.restart.systemd': 'Restarting via `systemctl restart im-hub.service`…',
194
+ 'svc.restart.bg': 'Restarting background daemon…',
195
+ 'svc.restart.fg_warning': 'A foreground process is running; cannot restart from another shell. Stop it (Ctrl-C) and run `agim start --bg`.',
196
+ 'svc.restart.done': '✅ Restarted.',
197
+ 'svc.uninstall.confirm': 'Uninstall Agim? This stops the service, removes the npm install + {config} + systemd unit. Workspaces under {workspaces} are KEPT.',
198
+ 'svc.uninstall.stopping': 'Stopping any running instance…',
199
+ 'svc.uninstall.removing_npm': 'Removing global npm package `agim-cli`…',
200
+ 'svc.uninstall.removing_unit': 'Removing systemd unit…',
201
+ 'svc.uninstall.removing_config': 'Removing {config} + env…',
202
+ 'svc.uninstall.workspaces_kept': 'Workspaces kept at {workspaces} (your memos / sessions / agent data).',
203
+ 'svc.uninstall.done': '✅ Uninstalled. Workspaces preserved.',
204
+ 'svc.uninstall.cancelled': 'Cancelled.',
205
+ // ─── shared ──────────────────────────────────────────────────────────
206
+ 'back': '← Back',
207
+ 'cancel': 'Cancel',
208
+ 'confirm': 'Confirm',
209
+ 'yes': 'Yes',
210
+ 'no': 'No',
211
+ 'skip': 'Skip',
212
+ 'press_enter_for_default': '(Enter = accept default)',
213
+ 'press_esc_to_skip': '(Esc = skip)',
214
+ 'error.prefix': '❌ Error: {message}',
215
+ 'warning.prefix': '⚠️ {message}',
216
+ 'info.prefix': 'ℹ {message}',
217
+ 'ok.prefix': '✓ {message}',
218
+ };
219
+ // `Record<Key, string>` — TS errors if you forget to translate a key.
220
+ const zh = {
221
+ // ─── language picker ──────────────────────────────────────────────
222
+ 'lang.pick': '选择界面语言 / Select language',
223
+ 'lang.label.en': 'English',
224
+ 'lang.label.zh': '中文',
225
+ 'lang.saved': '语言偏好已保存到 {file}',
226
+ // ─── entry menu ──────────────────────────────────────────────────
227
+ 'menu.title': '阿吉姆 (Agim) · 维护入口',
228
+ 'menu.subtitle': '想做什么?',
229
+ 'menu.config': '配置(IM / Agent / SMTP / 百度地图 …)',
230
+ 'menu.status': '查看服务状态',
231
+ 'menu.start': '启动服务(前台)',
232
+ 'menu.start_bg': '启动服务(后台)',
233
+ 'menu.restart': '重启服务',
234
+ 'menu.stop': '停止服务',
235
+ 'menu.uninstall': '卸载阿吉姆(保留 workspaces)',
236
+ 'menu.quit': '退出',
237
+ // ─── config root ─────────────────────────────────────────────────
238
+ 'config.title': '阿吉姆 · 配置',
239
+ 'config.subtitle': '选要编辑的分类。每个分类内部都能 Back 回上一层。',
240
+ 'config.section.messengers': 'IM 渠道(微信 / Telegram / 飞书 / Discord / 邮件)',
241
+ 'config.section.agents': 'AI Agent(Claude Code / OpenCode / Codex / Copilot)',
242
+ 'config.section.acp': '远程 ACP agent',
243
+ 'config.section.smtp': 'SMTP — /remind 邮件发送',
244
+ 'config.section.baidu': '百度地图 AK — /memo 地址解析',
245
+ 'config.section.done': '完成 — 保存并退出',
246
+ 'config.saved': '配置已保存到 {file}',
247
+ // ─── messengers ──────────────────────────────────────────────────
248
+ 'messengers.title': 'IM 渠道',
249
+ 'messengers.subtitle': '选一个 IM 进入配置。每个 IM 独立配置。',
250
+ 'messengers.status.enabled': '已启用',
251
+ 'messengers.status.enabled_no_creds': '已启用(缺凭据)',
252
+ 'messengers.status.disabled': '未配置',
253
+ 'messengers.label.wechat': '微信(iLink bot)',
254
+ 'messengers.label.telegram': 'Telegram',
255
+ 'messengers.label.feishu': '飞书 / Lark',
256
+ 'messengers.label.dingtalk': '钉钉(DingTalk)',
257
+ 'messengers.label.discord': 'Discord',
258
+ 'messengers.label.email': '邮件(SMTP 推送)',
259
+ 'messengers.row': '{label} — {status}',
260
+ 'messengers.action.configure': '配置',
261
+ 'messengers.action.reconfigure': '重新配置(替换凭据)',
262
+ 'messengers.action.remove': '从已启用列表移除',
263
+ 'messengers.action.enable_email': '启用邮件推送(还需配 SMTP)',
264
+ 'messengers.action.disable_email': '禁用邮件推送',
265
+ 'messengers.action.back': '← 返回',
266
+ 'messengers.removed': '{label} 已从已启用列表移除。',
267
+ 'messengers.enabled': '{label} 已配置并启用。',
268
+ 'messengers.smtp_hint': '邮件推送依赖上面的 SMTP 配置,请先在 SMTP 分类里配置。',
269
+ // 微信扫码流
270
+ 'wechat.fetching': '正在从 iLink 拉取二维码…',
271
+ 'wechat.scan': '📱 用微信扫码 —— 把下面的 URL 粘到浏览器里可以渲染成图片:',
272
+ 'wechat.waiting': '等待扫码 + 确认(最多 2 分钟)…',
273
+ 'wechat.logged_in': '✅ 已登录:{user}(bot id:{bot})',
274
+ 'wechat.failed': '❌ 登录失败或超时,可从菜单重试。',
275
+ // Telegram / 飞书 / Discord 帮助
276
+ 'tg.docs': '获取 bot token:\n 1. 在 Telegram 中搜 @BotFather\n 2. 发 /newbot 按提示走\n 3. 复制 bot token',
277
+ 'tg.field.token': 'Bot token',
278
+ 'tg.field.token_keep': 'Bot token(Enter = 保留现有 {hint})',
279
+ 'tg.field.channel': 'Channel id(可选,Enter = default)',
280
+ 'feishu.docs': '创建飞书机器人:\n 1. https://open.feishu.cn/app → 创建自建应用\n 2. 启用机器人能力\n 3. 订阅事件 im.message.receive_v1\n 4. 权限:im:message、im:message.p2p_msg:readonly、im:message:send_as_bot\n 5. 创建并发布版本\n 6. 复制 App ID 与 App Secret',
281
+ 'feishu.field.app_id': 'App ID',
282
+ 'feishu.field.app_secret': 'App Secret',
283
+ 'feishu.field.app_secret_keep': 'App Secret(Enter = 保留现有)',
284
+ 'dingtalk.docs': '创建钉钉 Stream 模式机器人:\n 1. https://open.dingtalk.com → 创建"企业内部应用"(1 人企业也可以,个人自用足够)\n 2. 应用 → 添加能力 → 机器人 → 选 Stream 模式 → 发布\n 3. 在应用凭证页拿到 ClientID(即 AppKey)和 ClientSecret',
285
+ 'dingtalk.field.client_id': 'ClientID(AppKey)',
286
+ 'dingtalk.field.client_secret': 'ClientSecret',
287
+ 'dingtalk.field.client_secret_keep': 'ClientSecret(Enter = 保留现有)',
288
+ 'discord.docs': '创建 Discord 机器人:\n 1. https://discord.com/developers/applications → New Application\n 2. Bot 选项卡 → Add Bot → 开启 MESSAGE CONTENT INTENT(特权 intent)\n 3. Reset Token 获取 bot token\n 4. OAuth2 → URL Generator → 邀请到你的服务器',
289
+ 'discord.field.token': 'Bot token',
290
+ 'discord.field.token_keep': 'Bot token(Enter = 保留现有)',
291
+ 'discord.field.channel': 'Channel id(可选,Enter = default)',
292
+ 'discord.field.guilds': '允许的 guild id(英文逗号分隔,可选)',
293
+ 'discord.field.channels': '允许的 channel id(英文逗号分隔,可选)',
294
+ // ─── agents ──────────────────────────────────────────────────────
295
+ 'agents.title': 'AI agent',
296
+ 'agents.subtitle': '选一个 agent 进入配置。状态来自实时探测 CLI。',
297
+ 'agents.status.enabled_installed': '已启用 · CLI 已安装',
298
+ 'agents.status.enabled_missing': '已启用 · CLI 未安装',
299
+ 'agents.status.disabled_installed': '未启用 · CLI 已安装',
300
+ 'agents.status.disabled_missing': '未启用 · CLI 未安装',
301
+ 'agents.row': '{label} — {status}',
302
+ 'agents.label.claude-code': 'Claude Code',
303
+ 'agents.label.opencode': 'OpenCode',
304
+ 'agents.label.codex': 'Codex',
305
+ 'agents.label.copilot': 'GitHub Copilot CLI',
306
+ 'agents.action.enable': '加入已启用列表',
307
+ 'agents.action.disable': '从已启用列表移除',
308
+ 'agents.action.set_default': '设为默认 agent',
309
+ 'agents.action.recheck': '重新检测 CLI 安装',
310
+ 'agents.action.install_hint': '查看安装说明',
311
+ 'agents.action.back': '← 返回',
312
+ 'agents.installed_msg': '✅ {label}:CLI 已安装且可调用。',
313
+ 'agents.missing_msg': '❌ {label}:PATH 中找不到 CLI。',
314
+ 'agents.auth_hint.opencode': '安装完后跑:opencode auth login',
315
+ 'agents.auth_hint.codex': '安装完后跑:codex login',
316
+ 'agents.install_hint.claude-code': '安装:npm install -g @anthropic-ai/claude-code',
317
+ 'agents.install_hint.opencode': '安装:npm i -g opencode-ai@latest(或访问 https://github.com/anomalyco/opencode)',
318
+ 'agents.install_hint.codex': '安装:npm install -g @openai/codex',
319
+ 'agents.install_hint.copilot': '安装(任选其一):\n npm i -g @github/copilot\n gh extension install github/gh-copilot\n brew install copilot-cli (macOS)\n winget install GitHub.Copilot (Windows)\n详情:https://github.com/features/copilot/cli',
320
+ 'agents.enabled': '已启用 {label}{also_default}。',
321
+ 'agents.also_default': '(同时设为默认)',
322
+ 'agents.removed': '已从已启用列表移除 {label}。',
323
+ 'agents.default_set': '默认 agent 已切换为 {label}。',
324
+ 'agents.default_picker': '默认 agent(无 /prefix 时用谁)',
325
+ 'agents.set_default_subtitle': '选择默认 agent。',
326
+ 'agents.set_default_action': '设置 / 修改默认 agent',
327
+ // ─── ACP agents ──────────────────────────────────────────────────
328
+ 'acp.title': '远程 ACP agent',
329
+ 'acp.subtitle': '走 ACP 协议的 HTTP agent。可以新增 / 编辑 / 删除。',
330
+ 'acp.action.add': '+ 新增 agent',
331
+ 'acp.action.edit': '编辑 {name}',
332
+ 'acp.action.remove': '删除 {name}',
333
+ 'acp.action.back': '← 返回',
334
+ 'acp.field.name': 'Agent 名称(用作 /prefix)',
335
+ 'acp.field.endpoint': 'Endpoint URL(例:https://api.example.com)',
336
+ 'acp.field.auth_type': '认证方式',
337
+ 'acp.field.auth_token': 'Bearer token',
338
+ 'acp.auth.none': '无(公开 endpoint)',
339
+ 'acp.auth.bearer': 'Bearer token',
340
+ 'acp.added': '已新增 agent:{name}',
341
+ 'acp.removed': '已删除 agent:{name}',
342
+ // ─── SMTP ────────────────────────────────────────────────────────
343
+ 'smtp.title': 'SMTP(用于 /remind 邮件投递)',
344
+ 'smtp.subtitle': '凭据会写到 {envFile}(chmod 600)。不用邮件就跳过。',
345
+ 'smtp.current_set': '当前已配置:{user} via {host}:{port}',
346
+ 'smtp.current_unset': '当前已配置:(无)',
347
+ 'smtp.action.edit': '编辑 / 重新配置 SMTP',
348
+ 'smtp.action.disable': '禁用 SMTP(清除所有凭据)',
349
+ 'smtp.action.back': '← 返回',
350
+ 'smtp.preset': '选一个预设或自定义',
351
+ 'smtp.preset.gmail': 'Gmail(smtp.gmail.com:465,需要应用专用密码)',
352
+ 'smtp.preset.outlook': 'Outlook(smtp.office365.com:587)',
353
+ 'smtp.preset.qq': 'QQ 邮箱(smtp.qq.com:465,需要授权码)',
354
+ 'smtp.preset.163': '163 邮箱(smtp.163.com:465,需要授权码)',
355
+ 'smtp.preset.custom': '自定义 SMTP 服务器',
356
+ 'smtp.preset.skip': '跳过 — 禁用 SMTP',
357
+ 'smtp.field.host': 'SMTP 主机',
358
+ 'smtp.field.port': 'SMTP 端口',
359
+ 'smtp.field.user': 'SMTP 登录用户(邮箱地址)',
360
+ 'smtp.field.pass': 'SMTP 密码 / 应用专用密码(输入隐藏)',
361
+ 'smtp.field.pass_keep': 'SMTP 密码(隐藏,Enter = 保留现有)',
362
+ 'smtp.field.from': '发件人地址(Enter = 跟登录用户一致)',
363
+ 'smtp.field.secure': 'TLS 模式',
364
+ 'smtp.secure.auto': 'auto(推荐)',
365
+ 'smtp.secure.true': 'true(连接即 SSL,例:465 端口)',
366
+ 'smtp.secure.false': 'false(STARTTLS,例:587 端口)',
367
+ 'smtp.saved': 'SMTP 凭据已保存到 {file}(chmod 600)',
368
+ 'smtp.cleared': 'SMTP 已禁用 — 清除了 {file}',
369
+ 'env.shadowed_warn': '⚠️ {key} 同时被运行时环境(systemd 单元或 shell export)设置了。仅写 {file} **不会**改变运行时生效的值——先去改 systemd 单元,或 unset 掉 shell 里的导出。',
370
+ // ─── Baidu Maps AK ───────────────────────────────────────────────
371
+ 'baidu.title': '百度地图 AK(用于 /memo 地址解析)',
372
+ 'baidu.subtitle': '可选——没有 AK 时 /memo 仍能用直接坐标 + 浏览器 GPS。',
373
+ 'baidu.howto': '免费申请:https://lbsyun.baidu.com → 控制台 → 应用管理 → 创建应用 → 服务端 API',
374
+ 'baidu.action.set': '设置 / 更新 AK',
375
+ 'baidu.action.clear': '清除 AK(禁用 geocoding)',
376
+ 'baidu.action.back': '← 返回',
377
+ 'baidu.input': '粘贴 AK(32 字符,非数字开头;留空跳过)',
378
+ 'baidu.saved': '百度地图 AK 已保存到 {file}',
379
+ 'baidu.cleared': '百度地图 AK 已清除',
380
+ // ─── service mgmt ────────────────────────────────────────────────
381
+ 'svc.status.title': '阿吉姆 · 状态',
382
+ 'svc.status.systemd_active': 'systemd 单元 `im-hub.service` 正在运行(pid {pid})',
383
+ 'svc.status.systemd_inactive': 'systemd 单元 `im-hub.service` 存在但未启动',
384
+ 'svc.status.bg_running': '后台守护进程在跑(pid {pid},日志:{log})',
385
+ 'svc.status.fg_running': '前台进程在跑(pid {pid})',
386
+ 'svc.status.not_running': '未发现阿吉姆实例',
387
+ 'svc.status.web': 'Web 控制台:http://{bind}:{port}',
388
+ 'svc.status.uptime': '运行时长:{duration}',
389
+ 'svc.start.starting_fg': '前台启动中——Ctrl-C 退出。',
390
+ 'svc.start.starting_bg': '后台启动中…',
391
+ 'svc.start.bg_ready': '✅ 后台守护进程已启动(pid {pid},日志:{log})',
392
+ 'svc.start.bg_hint': '提示:`agim stop` 终止;`agim status` 查看。',
393
+ 'svc.start.systemd_managed': '已有 systemd 单元管理 im-hub。用 `systemctl start im-hub.service`。',
394
+ 'svc.start.already_running': '已经在跑(pid {pid})。用 `agim restart` 重启。',
395
+ 'svc.stop.stopping_systemd': '停止 systemd 单元 `im-hub.service`…',
396
+ 'svc.stop.stopping_bg': '停止后台守护进程(pid {pid})…',
397
+ 'svc.stop.not_running': '没在跑,无需停止。',
398
+ 'svc.stop.stopped': '✅ 已停止。',
399
+ 'svc.restart.systemd': '通过 `systemctl restart im-hub.service` 重启…',
400
+ 'svc.restart.bg': '重启后台守护进程…',
401
+ 'svc.restart.fg_warning': '前台进程在跑,无法从其他 shell 重启它。请在那个 shell 里 Ctrl-C 后用 `agim start --bg`。',
402
+ 'svc.restart.done': '✅ 已重启。',
403
+ 'svc.uninstall.confirm': '确定卸载阿吉姆吗?将停止服务、移除全局 npm 包 + {config} + systemd 单元。{workspaces} 下的工作区数据 **保留**。',
404
+ 'svc.uninstall.stopping': '停止运行中的实例…',
405
+ 'svc.uninstall.removing_npm': '移除全局 npm 包 `agim-cli`…',
406
+ 'svc.uninstall.removing_unit': '移除 systemd 单元…',
407
+ 'svc.uninstall.removing_config': '移除 {config} + env…',
408
+ 'svc.uninstall.workspaces_kept': '工作区数据保留在 {workspaces}(你的 memos / sessions / agent 数据)。',
409
+ 'svc.uninstall.done': '✅ 卸载完成。工作区数据已保留。',
410
+ 'svc.uninstall.cancelled': '已取消。',
411
+ // ─── shared ──────────────────────────────────────────────────────
412
+ 'back': '← 返回',
413
+ 'cancel': '取消',
414
+ 'confirm': '确认',
415
+ 'yes': '是',
416
+ 'no': '否',
417
+ 'skip': '跳过',
418
+ 'press_enter_for_default': '(Enter 接受默认)',
419
+ 'press_esc_to_skip': '(Esc 跳过)',
420
+ 'error.prefix': '❌ 错误:{message}',
421
+ 'warning.prefix': '⚠️ {message}',
422
+ 'info.prefix': 'ℹ {message}',
423
+ 'ok.prefix': '✓ {message}',
424
+ };
425
+ const dicts = { en, zh };
426
+ /** Translate. If `key` is missing in `lang`, falls back to en, then to the key itself. */
427
+ export function t(lang, key, vars = {}) {
428
+ let s = dicts[lang]?.[key] ?? en[key] ?? key;
429
+ for (const [k, v] of Object.entries(vars)) {
430
+ s = s.replace(new RegExp(`\\{${k}\\}`, 'g'), String(v));
431
+ }
432
+ return s;
433
+ }
434
+ /** Read persisted preference; returns null when not set. */
435
+ export function readSavedLang() {
436
+ try {
437
+ const raw = readFileSync(PREF_FILE, 'utf-8').trim();
438
+ if (raw === 'en' || raw === 'zh')
439
+ return raw;
440
+ }
441
+ catch { /* not set */ }
442
+ return null;
443
+ }
444
+ /** Persist to ~/.im-hub/cli-lang. Best-effort — failures only logged. */
445
+ export function saveLang(lang) {
446
+ try {
447
+ mkdirSync(dirname(PREF_FILE), { recursive: true });
448
+ writeFileSync(PREF_FILE, lang + '\n', { mode: 0o644 });
449
+ }
450
+ catch (err) {
451
+ console.warn(`⚠️ Could not save language preference: ${err instanceof Error ? err.message : String(err)}`);
452
+ }
453
+ }
454
+ export const LANG_PREF_FILE = PREF_FILE;
455
+ //# sourceMappingURL=i18n.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n.js","sourceRoot":"","sources":["../../src/cli-ui/i18n.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { type Lang } from './i18n.js';
2
+ /**
3
+ * Prompt for language. Default = last saved choice, or 'zh' for first-run
4
+ * users (the install.sh installer already greets in zh by default).
5
+ *
6
+ * Returns the picked Lang. Persists ONLY when the choice actually changed
7
+ * from the saved value — minimizes disk writes for the no-change case.
8
+ */
9
+ export declare function pickLang(): Promise<Lang>;
10
+ //# sourceMappingURL=lang-picker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lang-picker.d.ts","sourceRoot":"","sources":["../../src/cli-ui/lang-picker.ts"],"names":[],"mappings":"AAMA,OAAO,EAA8B,KAAK,IAAI,EAAE,MAAM,WAAW,CAAA;AAEjE;;;;;;GAMG;AACH,wBAAsB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAiB9C"}
@@ -0,0 +1,33 @@
1
+ // cli-ui/lang-picker.ts — first-line of every interactive entry point.
2
+ // Reads the persisted preference (~/.im-hub/cli-lang) so a returning user
3
+ // just hits Enter. Saves the choice back on every selection so toggling
4
+ // once flips the default for next time.
5
+ import { menu } from './prompts.js';
6
+ import { readSavedLang, saveLang, t } from './i18n.js';
7
+ /**
8
+ * Prompt for language. Default = last saved choice, or 'zh' for first-run
9
+ * users (the install.sh installer already greets in zh by default).
10
+ *
11
+ * Returns the picked Lang. Persists ONLY when the choice actually changed
12
+ * from the saved value — minimizes disk writes for the no-change case.
13
+ */
14
+ export async function pickLang() {
15
+ const saved = readSavedLang();
16
+ const def = saved ?? 'zh';
17
+ // i18n.t needs a Lang to render the picker question itself. We render
18
+ // in the user's saved language (or zh on first run) so returning users
19
+ // never see English they didn't ask for.
20
+ const picked = await menu({
21
+ lang: def,
22
+ message: t(def, 'lang.pick'),
23
+ choices: [
24
+ { value: 'en', name: t(def, 'lang.label.en') },
25
+ { value: 'zh', name: t(def, 'lang.label.zh') },
26
+ ],
27
+ default: def,
28
+ });
29
+ if (picked !== saved)
30
+ saveLang(picked);
31
+ return picked;
32
+ }
33
+ //# sourceMappingURL=lang-picker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lang-picker.js","sourceRoot":"","sources":["../../src/cli-ui/lang-picker.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,0EAA0E;AAC1E,wEAAwE;AACxE,wCAAwC;AAExC,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AACnC,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC,EAAa,MAAM,WAAW,CAAA;AAEjE;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ;IAC5B,MAAM,KAAK,GAAG,aAAa,EAAE,CAAA;IAC7B,MAAM,GAAG,GAAS,KAAK,IAAI,IAAI,CAAA;IAC/B,sEAAsE;IACtE,uEAAuE;IACvE,yCAAyC;IACzC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAO;QAC9B,IAAI,EAAE,GAAG;QACT,OAAO,EAAE,CAAC,CAAC,GAAG,EAAE,WAAW,CAAC;QAC5B,OAAO,EAAE;YACP,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,EAAE,eAAe,CAAC,EAAE;YAC9C,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,EAAE,eAAe,CAAC,EAAE;SAC/C;QACD,OAAO,EAAE,GAAG;KACb,CAAS,CAAA;IACV,IAAI,MAAM,KAAK,KAAK;QAAE,QAAQ,CAAC,MAAM,CAAC,CAAA;IACtC,OAAO,MAAM,CAAA;AACf,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare const CONFIG_DIR: string;
2
+ export declare const CONFIG_FILE: string;
3
+ export declare const WORKSPACES_DIR: string;
4
+ //# sourceMappingURL=paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/cli-ui/paths.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,UAAU,QAAY,CAAA;AACnC,eAAO,MAAM,WAAW,QAAkC,CAAA;AAC1D,eAAO,MAAM,cAAc,QAAkB,CAAA"}
@@ -0,0 +1,11 @@
1
+ // cli-ui/paths.ts — shared filesystem locations used by the CLI wizard
2
+ // + service management. Delegates to `core/agim-paths.ts`, which
3
+ // auto-detects whether the on-disk root is the v1.0+ `~/.agim/` name or
4
+ // the legacy `~/.im-hub/` name from a 0.x install. Existing imports keep
5
+ // working — the constant names didn't change.
6
+ import { join } from 'node:path';
7
+ import { AGIM_HOME, AGIM_WORKSPACES } from '../core/agim-paths.js';
8
+ export const CONFIG_DIR = AGIM_HOME;
9
+ export const CONFIG_FILE = join(CONFIG_DIR, 'config.json');
10
+ export const WORKSPACES_DIR = AGIM_WORKSPACES;
11
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/cli-ui/paths.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,iEAAiE;AACjE,wEAAwE;AACxE,yEAAyE;AACzE,8CAA8C;AAE9C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAElE,MAAM,CAAC,MAAM,UAAU,GAAG,SAAS,CAAA;AACnC,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAA;AAC1D,MAAM,CAAC,MAAM,cAAc,GAAG,eAAe,CAAA"}
@@ -0,0 +1,65 @@
1
+ import { type Lang, type Key } from './i18n.js';
2
+ export declare const BACK: unique symbol;
3
+ export type BackSentinel = typeof BACK;
4
+ export declare class UserAbortError extends Error {
5
+ constructor();
6
+ }
7
+ export interface MenuChoice<T> {
8
+ /** Value returned when this choice is picked. */
9
+ value: T;
10
+ /** Display name (already localized). */
11
+ name: string;
12
+ /** Optional dim-text description shown to the right. */
13
+ description?: string;
14
+ /** Optional separator before this item (renders a divider). */
15
+ separatorBefore?: boolean;
16
+ /** When true, item is shown but cannot be selected. */
17
+ disabled?: boolean | string;
18
+ }
19
+ /**
20
+ * Single-choice menu with arrow keys + Enter. If `back` is provided
21
+ * (a key from i18n.ts pointing at a `← Back`-style string), an extra
22
+ * back entry is appended; picking it returns the BACK sentinel.
23
+ */
24
+ export declare function menu<T>(opts: {
25
+ lang: Lang;
26
+ message: string;
27
+ choices: MenuChoice<T>[];
28
+ back?: Key;
29
+ default?: T;
30
+ }): Promise<T | BackSentinel>;
31
+ /**
32
+ * Multi-select with Space to toggle. Always returns an array (possibly
33
+ * empty). No back option — typical usage is "pick which IMs to enable";
34
+ * cancel is via Ctrl-C → UserAbortError.
35
+ */
36
+ export declare function multiSelect<T extends string>(opts: {
37
+ lang: Lang;
38
+ message: string;
39
+ choices: Array<{
40
+ value: T;
41
+ name: string;
42
+ description?: string;
43
+ checked?: boolean;
44
+ }>;
45
+ required?: boolean;
46
+ }): Promise<T[]>;
47
+ /** Free-text input with optional default + validator. */
48
+ export declare function inputText(opts: {
49
+ message: string;
50
+ default?: string;
51
+ validate?: (v: string) => true | string;
52
+ required?: boolean;
53
+ }): Promise<string>;
54
+ /** Hidden input for secrets (no echo). */
55
+ export declare function inputSecret(opts: {
56
+ message: string;
57
+ required?: boolean;
58
+ validate?: (v: string) => true | string;
59
+ }): Promise<string>;
60
+ /** Yes/no with arrow-key navigation. */
61
+ export declare function yesNo(opts: {
62
+ message: string;
63
+ default?: boolean;
64
+ }): Promise<boolean>;
65
+ //# sourceMappingURL=prompts.d.ts.map