@armadra/agent 0.5.1 → 0.6.0

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 (467) hide show
  1. package/CHANGELOG.md +177 -304
  2. package/CHANGELOG.zh-CN.md +442 -0
  3. package/README.md +408 -364
  4. package/README.zh-CN.md +705 -0
  5. package/dist/agent/session-plan.js +2 -2
  6. package/dist/agent/session-state.d.ts +3 -0
  7. package/dist/agent/session-state.js +20 -0
  8. package/dist/agent/session-subagent.d.ts +15 -1
  9. package/dist/agent/session-subagent.js +26 -3
  10. package/dist/agent/session-telemetry.d.ts +16 -2
  11. package/dist/agent/session-telemetry.js +29 -7
  12. package/dist/agent/session-tools.js +5 -2
  13. package/dist/agent/session-trace-writer.d.ts +27 -0
  14. package/dist/agent/session-trace-writer.js +253 -0
  15. package/dist/agent/session.d.ts +2 -0
  16. package/dist/agent/session.js +12 -0
  17. package/dist/agent/subagent-direct.d.ts +20 -0
  18. package/dist/agent/subagent-direct.js +76 -0
  19. package/dist/agent/subagent-registry.d.ts +8 -1
  20. package/dist/agent/subagent-registry.js +28 -1
  21. package/dist/agent/system-prompt.d.ts +3 -1
  22. package/dist/agent/system-prompt.js +3 -0
  23. package/dist/agent/tool-runner.d.ts +2 -1
  24. package/dist/agent/tool-runner.js +5 -4
  25. package/dist/agent/types-w6.d.ts +39 -0
  26. package/dist/agent/types-w6.js +4 -0
  27. package/dist/agent/types.d.ts +5 -2
  28. package/dist/agents/external.js +1 -1
  29. package/dist/agents/task-record.d.ts +74 -1
  30. package/dist/agents/task-record.js +100 -0
  31. package/dist/ai/apis/cache-params.js +2 -1
  32. package/dist/ai/apis/chatgpt-backend.d.ts +52 -0
  33. package/dist/ai/apis/chatgpt-backend.js +224 -0
  34. package/dist/ai/apis/chatgpt-rate-limits.d.ts +26 -0
  35. package/dist/ai/apis/chatgpt-rate-limits.js +91 -0
  36. package/dist/ai/apis/openai-responses-request.d.ts +2 -1
  37. package/dist/ai/apis/openai-responses-request.js +8 -2
  38. package/dist/ai/apis/openai-responses.d.ts +2 -0
  39. package/dist/ai/apis/openai-responses.js +51 -16
  40. package/dist/ai/overflow.d.ts +1 -1
  41. package/dist/ai/overflow.js +10 -7
  42. package/dist/ai/providers/auth.d.ts +15 -2
  43. package/dist/ai/providers/auth.js +69 -2
  44. package/dist/ai/providers/builtin.js +27 -0
  45. package/dist/ai/providers/catalog-data.js +1 -0
  46. package/dist/ai/providers/enrich.js +2 -7
  47. package/dist/ai/providers/models-dev-cache.js +15 -19
  48. package/dist/ai/providers/models-dev-snapshot.js +8 -7
  49. package/dist/ai/providers/models-dev.js +5 -15
  50. package/dist/ai/providers/suggest.js +2 -16
  51. package/dist/ai/types.d.ts +27 -1
  52. package/dist/auth/chatgpt/backend-client.d.ts +26 -0
  53. package/dist/auth/chatgpt/backend-client.js +74 -0
  54. package/dist/auth/chatgpt/claims.d.ts +17 -0
  55. package/dist/auth/chatgpt/claims.js +46 -0
  56. package/dist/auth/chatgpt/cli.d.ts +33 -0
  57. package/dist/auth/chatgpt/cli.js +252 -0
  58. package/dist/auth/chatgpt/doctor.d.ts +17 -0
  59. package/dist/auth/chatgpt/doctor.js +36 -0
  60. package/dist/auth/chatgpt/host-id.d.ts +7 -0
  61. package/dist/auth/chatgpt/host-id.js +26 -0
  62. package/dist/auth/chatgpt/login.d.ts +30 -0
  63. package/dist/auth/chatgpt/login.js +130 -0
  64. package/dist/auth/chatgpt/presets.d.ts +66 -0
  65. package/dist/auth/chatgpt/presets.js +120 -0
  66. package/dist/auth/chatgpt/quota-text.d.ts +13 -0
  67. package/dist/auth/chatgpt/quota-text.js +36 -0
  68. package/dist/auth/oauth/browser.d.ts +12 -0
  69. package/dist/auth/oauth/browser.js +27 -0
  70. package/dist/auth/oauth/callback-server.d.ts +47 -0
  71. package/dist/auth/oauth/callback-server.js +147 -0
  72. package/dist/auth/oauth/flows.d.ts +62 -0
  73. package/dist/auth/oauth/flows.js +113 -0
  74. package/dist/auth/oauth/jwt.d.ts +24 -0
  75. package/dist/auth/oauth/jwt.js +81 -0
  76. package/dist/auth/oauth/live.d.ts +21 -0
  77. package/dist/auth/oauth/live.js +25 -0
  78. package/dist/auth/oauth/oidc.d.ts +26 -0
  79. package/dist/auth/oauth/oidc.js +72 -0
  80. package/dist/auth/oauth/pkce.d.ts +15 -0
  81. package/dist/auth/oauth/pkce.js +20 -0
  82. package/dist/auth/oauth/refresh.d.ts +35 -0
  83. package/dist/auth/oauth/refresh.js +129 -0
  84. package/dist/auth/oauth/token-client.d.ts +33 -0
  85. package/dist/auth/oauth/token-client.js +121 -0
  86. package/dist/auth/oauth/token-store.d.ts +23 -0
  87. package/dist/auth/oauth/token-store.js +125 -0
  88. package/dist/auth/testing/fake-oauth.d.ts +73 -0
  89. package/dist/auth/testing/fake-oauth.js +271 -0
  90. package/dist/auth/testing/refresh-child.d.ts +5 -0
  91. package/dist/auth/testing/refresh-child.js +16 -0
  92. package/dist/bundle/ama.cjs +25928 -11144
  93. package/dist/checkpoints/backend.js +6 -5
  94. package/dist/checkpoints/restore.js +3 -2
  95. package/dist/checkpoints/settings.js +2 -1
  96. package/dist/checkpoints/shadow-git.js +7 -6
  97. package/dist/checkpoints/shadow-restore.js +3 -2
  98. package/dist/checkpoints/tracker.js +4 -3
  99. package/dist/cli/args.d.ts +9 -2
  100. package/dist/cli/args.js +74 -27
  101. package/dist/cli/bootstrap.js +53 -31
  102. package/dist/cli/choice-prompt.js +8 -6
  103. package/dist/cli/codemode-notice.js +2 -2
  104. package/dist/cli/compose-agents.js +2 -1
  105. package/dist/cli/compose-extensions.js +2 -0
  106. package/dist/cli/compose-memory.d.ts +53 -0
  107. package/dist/cli/compose-memory.js +127 -0
  108. package/dist/cli/compose-providers.d.ts +5 -0
  109. package/dist/cli/compose-providers.js +32 -2
  110. package/dist/cli/compose-session.d.ts +5 -0
  111. package/dist/cli/compose-session.js +27 -13
  112. package/dist/cli/compose-store.d.ts +2 -0
  113. package/dist/cli/compose-store.js +9 -5
  114. package/dist/cli/compose.d.ts +2 -0
  115. package/dist/cli/compose.js +13 -5
  116. package/dist/cli/default-model.d.ts +0 -2
  117. package/dist/cli/default-model.js +5 -8
  118. package/dist/cli/deps.d.ts +5 -1
  119. package/dist/cli/exit-codes.d.ts +1 -1
  120. package/dist/cli/exit-codes.js +7 -16
  121. package/dist/cli/from-prompt.js +3 -2
  122. package/dist/cli/help-text.d.ts +2 -1
  123. package/dist/cli/help-text.js +5 -99
  124. package/dist/cli/main.d.ts +5 -0
  125. package/dist/cli/main.js +21 -2
  126. package/dist/cli/proxy.js +14 -9
  127. package/dist/cli/runtime.d.ts +5 -0
  128. package/dist/cli/startup-screen.js +20 -27
  129. package/dist/cli/startup-steps.js +6 -8
  130. package/dist/cli/subcommands/auth.d.ts +6 -3
  131. package/dist/cli/subcommands/auth.js +52 -22
  132. package/dist/cli/subcommands/config-set.d.ts +21 -0
  133. package/dist/cli/subcommands/config-set.js +137 -0
  134. package/dist/cli/subcommands/config.d.ts +2 -1
  135. package/dist/cli/subcommands/config.js +51 -37
  136. package/dist/cli/subcommands/doctor.d.ts +2 -1
  137. package/dist/cli/subcommands/doctor.js +97 -58
  138. package/dist/cli/subcommands/init.d.ts +1 -1
  139. package/dist/cli/subcommands/init.js +8 -7
  140. package/dist/cli/subcommands/memory.d.ts +18 -0
  141. package/dist/cli/subcommands/memory.js +189 -0
  142. package/dist/cli/subcommands/model-meta.js +11 -9
  143. package/dist/cli/subcommands/models-cache-probe.js +23 -20
  144. package/dist/cli/subcommands/models-discover.d.ts +3 -0
  145. package/dist/cli/subcommands/models-discover.js +44 -21
  146. package/dist/cli/subcommands/models.d.ts +1 -1
  147. package/dist/cli/subcommands/models.js +29 -22
  148. package/dist/cli/subcommands/probe-runner.js +8 -7
  149. package/dist/cli/subcommands/providers-list.js +32 -21
  150. package/dist/cli/subcommands/providers-plan.js +24 -25
  151. package/dist/cli/subcommands/providers-probe.js +5 -6
  152. package/dist/cli/subcommands/providers.d.ts +1 -1
  153. package/dist/cli/subcommands/providers.js +45 -50
  154. package/dist/cli/subcommands/sessions-export.d.ts +1 -1
  155. package/dist/cli/subcommands/sessions-export.js +10 -9
  156. package/dist/cli/subcommands/sessions-search.d.ts +1 -1
  157. package/dist/cli/subcommands/sessions-search.js +11 -10
  158. package/dist/cli/subcommands/sessions-trace.d.ts +30 -0
  159. package/dist/cli/subcommands/sessions-trace.js +156 -0
  160. package/dist/cli/subcommands/sessions.d.ts +4 -3
  161. package/dist/cli/subcommands/sessions.js +40 -37
  162. package/dist/cli/subcommands/stats.d.ts +1 -1
  163. package/dist/cli/subcommands/stats.js +49 -30
  164. package/dist/cli/system-prompt-arg.js +3 -2
  165. package/dist/codemode/capability.js +3 -2
  166. package/dist/compaction/post-compact.d.ts +1 -0
  167. package/dist/compaction/post-compact.js +15 -1
  168. package/dist/compaction/prune-tier.d.ts +1 -1
  169. package/dist/compaction/prune-tier.js +3 -3
  170. package/dist/compaction/serialize.js +2 -1
  171. package/dist/config/auth-file.d.ts +12 -2
  172. package/dist/config/auth-file.js +32 -10
  173. package/dist/config/checker.js +12 -11
  174. package/dist/config/context-files.js +3 -2
  175. package/dist/config/edit.d.ts +106 -0
  176. package/dist/config/edit.js +350 -0
  177. package/dist/config/init.d.ts +4 -3
  178. package/dist/config/init.js +10 -18
  179. package/dist/config/json-schema.d.ts +2 -1
  180. package/dist/config/json-schema.js +101 -68
  181. package/dist/config/key-docs.d.ts +18 -7
  182. package/dist/config/key-docs.js +43 -128
  183. package/dist/config/load.js +7 -6
  184. package/dist/config/merge.d.ts +4 -1
  185. package/dist/config/merge.js +42 -22
  186. package/dist/config/paths.js +6 -5
  187. package/dist/config/profile.d.ts +5 -1
  188. package/dist/config/profile.js +7 -2
  189. package/dist/config/schema-w5.js +3 -2
  190. package/dist/config/schema-w6.d.ts +19 -0
  191. package/dist/config/schema-w6.js +115 -0
  192. package/dist/config/schema.js +34 -20
  193. package/dist/config/settings-registry.d.ts +78 -0
  194. package/dist/config/settings-registry.js +184 -0
  195. package/dist/config/types-w6.d.ts +109 -0
  196. package/dist/config/types-w6.js +19 -0
  197. package/dist/config/types.d.ts +11 -8
  198. package/dist/config/types.js +1 -0
  199. package/dist/drivers/acp/client.js +1 -1
  200. package/dist/drivers/acp/driver.js +13 -8
  201. package/dist/drivers/agents.js +4 -3
  202. package/dist/drivers/base.js +3 -2
  203. package/dist/drivers/host-runners.js +2 -1
  204. package/dist/drivers/native/claude-stream.js +12 -11
  205. package/dist/drivers/native/codex-app-server.js +17 -12
  206. package/dist/drivers/native/oneshot.js +8 -7
  207. package/dist/drivers/pool.js +1 -1
  208. package/dist/drivers/runner.d.ts +3 -1
  209. package/dist/drivers/runner.js +68 -20
  210. package/dist/drivers/turn.js +1 -1
  211. package/dist/hooks/config.js +3 -2
  212. package/dist/hooks/protocol.js +18 -12
  213. package/dist/host/api-impl.js +11 -10
  214. package/dist/host/loader.js +9 -8
  215. package/dist/host/types.d.ts +3 -0
  216. package/dist/i18n/catalog.d.ts +2169 -0
  217. package/dist/i18n/catalog.js +72 -0
  218. package/dist/i18n/format.d.ts +21 -0
  219. package/dist/i18n/format.js +58 -0
  220. package/dist/i18n/index.d.ts +58 -0
  221. package/dist/i18n/index.js +72 -0
  222. package/dist/i18n/messages/agents.d.ts +84 -0
  223. package/dist/i18n/messages/agents.js +85 -0
  224. package/dist/i18n/messages/approval.d.ts +99 -0
  225. package/dist/i18n/messages/approval.js +100 -0
  226. package/dist/i18n/messages/auth.d.ts +187 -0
  227. package/dist/i18n/messages/auth.js +189 -0
  228. package/dist/i18n/messages/cli-args.d.ts +46 -0
  229. package/dist/i18n/messages/cli-args.js +46 -0
  230. package/dist/i18n/messages/cli-help.d.ts +12 -0
  231. package/dist/i18n/messages/cli-help.js +244 -0
  232. package/dist/i18n/messages/cli.d.ts +336 -0
  233. package/dist/i18n/messages/cli.js +311 -0
  234. package/dist/i18n/messages/config-keys.d.ts +289 -0
  235. package/dist/i18n/messages/config-keys.js +292 -0
  236. package/dist/i18n/messages/config.d.ts +502 -0
  237. package/dist/i18n/messages/config.js +239 -0
  238. package/dist/i18n/messages/drivers.d.ts +123 -0
  239. package/dist/i18n/messages/drivers.js +124 -0
  240. package/dist/i18n/messages/errors.d.ts +83 -0
  241. package/dist/i18n/messages/errors.js +171 -0
  242. package/dist/i18n/messages/interactive-line.d.ts +61 -0
  243. package/dist/i18n/messages/interactive-line.js +69 -0
  244. package/dist/i18n/messages/interactive-startup.d.ts +103 -0
  245. package/dist/i18n/messages/interactive-startup.js +104 -0
  246. package/dist/i18n/messages/interactive-view.d.ts +140 -0
  247. package/dist/i18n/messages/interactive-view.js +141 -0
  248. package/dist/i18n/messages/interactive.d.ts +493 -0
  249. package/dist/i18n/messages/interactive.js +248 -0
  250. package/dist/i18n/messages/memory.d.ts +123 -0
  251. package/dist/i18n/messages/memory.js +128 -0
  252. package/dist/i18n/messages/panels.d.ts +190 -0
  253. package/dist/i18n/messages/panels.js +189 -0
  254. package/dist/i18n/messages/permissions.d.ts +126 -0
  255. package/dist/i18n/messages/permissions.js +151 -0
  256. package/dist/i18n/messages/plan.d.ts +123 -0
  257. package/dist/i18n/messages/plan.js +124 -0
  258. package/dist/i18n/messages/print.d.ts +86 -0
  259. package/dist/i18n/messages/print.js +91 -0
  260. package/dist/i18n/messages/report.d.ts +391 -0
  261. package/dist/i18n/messages/report.js +490 -0
  262. package/dist/i18n/messages/rewind.d.ts +198 -0
  263. package/dist/i18n/messages/rewind.js +217 -0
  264. package/dist/i18n/messages/session.d.ts +230 -0
  265. package/dist/i18n/messages/session.js +258 -0
  266. package/dist/i18n/messages/settings.d.ts +348 -0
  267. package/dist/i18n/messages/settings.js +336 -0
  268. package/dist/i18n/messages/subcommands-config.d.ts +111 -0
  269. package/dist/i18n/messages/subcommands-config.js +127 -0
  270. package/dist/i18n/messages/subcommands.d.ts +548 -0
  271. package/dist/i18n/messages/subcommands.js +474 -0
  272. package/dist/i18n/messages/trace.d.ts +243 -0
  273. package/dist/i18n/messages/trace.js +238 -0
  274. package/dist/i18n/types.d.ts +15 -0
  275. package/dist/i18n/types.js +7 -0
  276. package/dist/index.d.ts +6 -0
  277. package/dist/index.js +2 -0
  278. package/dist/memory/edit.d.ts +24 -0
  279. package/dist/memory/edit.js +63 -0
  280. package/dist/memory/frontmatter.d.ts +37 -0
  281. package/dist/memory/frontmatter.js +79 -0
  282. package/dist/memory/index.d.ts +28 -0
  283. package/dist/memory/index.js +126 -0
  284. package/dist/memory/lock.d.ts +17 -0
  285. package/dist/memory/lock.js +62 -0
  286. package/dist/memory/paths.d.ts +57 -0
  287. package/dist/memory/paths.js +175 -0
  288. package/dist/memory/report.d.ts +36 -0
  289. package/dist/memory/report.js +86 -0
  290. package/dist/memory/runtime.d.ts +42 -0
  291. package/dist/memory/runtime.js +36 -0
  292. package/dist/memory/secrets.d.ts +8 -0
  293. package/dist/memory/secrets.js +27 -0
  294. package/dist/memory/section.d.ts +28 -0
  295. package/dist/memory/section.js +59 -0
  296. package/dist/memory/store.d.ts +70 -0
  297. package/dist/memory/store.js +284 -0
  298. package/dist/memory/tool.d.ts +31 -0
  299. package/dist/memory/tool.js +94 -0
  300. package/dist/modes/acp/acp-events.js +2 -1
  301. package/dist/modes/acp/acp-server.js +13 -12
  302. package/dist/modes/commands-core.d.ts +11 -0
  303. package/dist/modes/commands-core.js +93 -62
  304. package/dist/modes/image-input.js +20 -6
  305. package/dist/modes/interactive/agent-bar.d.ts +95 -0
  306. package/dist/modes/interactive/agent-bar.js +248 -0
  307. package/dist/modes/interactive/agent-panels.js +27 -26
  308. package/dist/modes/interactive/agent-transcript.d.ts +47 -0
  309. package/dist/modes/interactive/agent-transcript.js +191 -0
  310. package/dist/modes/interactive/agent-ui.d.ts +36 -1
  311. package/dist/modes/interactive/agent-ui.js +180 -14
  312. package/dist/modes/interactive/agent-view.d.ts +72 -0
  313. package/dist/modes/interactive/agent-view.js +281 -0
  314. package/dist/modes/interactive/approval-dialog.js +46 -34
  315. package/dist/modes/interactive/clipboard-paste.d.ts +2 -2
  316. package/dist/modes/interactive/clipboard-paste.js +9 -4
  317. package/dist/modes/interactive/commands.d.ts +19 -1
  318. package/dist/modes/interactive/commands.js +84 -40
  319. package/dist/modes/interactive/completion.js +2 -1
  320. package/dist/modes/interactive/config-panel.d.ts +70 -0
  321. package/dist/modes/interactive/config-panel.js +319 -0
  322. package/dist/modes/interactive/config-ui.d.ts +96 -0
  323. package/dist/modes/interactive/config-ui.js +397 -0
  324. package/dist/modes/interactive/confirm-dialog.js +6 -7
  325. package/dist/modes/interactive/event-notices.js +11 -9
  326. package/dist/modes/interactive/interactive-mode.d.ts +1 -1
  327. package/dist/modes/interactive/interactive-mode.js +19 -22
  328. package/dist/modes/interactive/key-dispatch.d.ts +12 -0
  329. package/dist/modes/interactive/key-dispatch.js +24 -9
  330. package/dist/modes/interactive/line/line-editor.js +2 -1
  331. package/dist/modes/interactive/line/line-mode.js +18 -7
  332. package/dist/modes/interactive/line/line-render.js +25 -24
  333. package/dist/modes/interactive/memory-panel.d.ts +64 -0
  334. package/dist/modes/interactive/memory-panel.js +221 -0
  335. package/dist/modes/interactive/message-view.d.ts +4 -2
  336. package/dist/modes/interactive/message-view.js +42 -33
  337. package/dist/modes/interactive/panels.js +39 -31
  338. package/dist/modes/interactive/pickers.d.ts +2 -1
  339. package/dist/modes/interactive/pickers.js +10 -6
  340. package/dist/modes/interactive/plan-command.d.ts +1 -1
  341. package/dist/modes/interactive/plan-command.js +24 -27
  342. package/dist/modes/interactive/plan-dialog.js +18 -17
  343. package/dist/modes/interactive/plan-flow.js +6 -5
  344. package/dist/modes/interactive/rewind-command.d.ts +1 -1
  345. package/dist/modes/interactive/rewind-command.js +18 -16
  346. package/dist/modes/interactive/rewind-flow.d.ts +0 -1
  347. package/dist/modes/interactive/rewind-flow.js +13 -14
  348. package/dist/modes/interactive/rewind-list.js +7 -6
  349. package/dist/modes/interactive/rewind-panel.js +40 -40
  350. package/dist/modes/interactive/rewind-text.d.ts +5 -3
  351. package/dist/modes/interactive/rewind-text.js +48 -38
  352. package/dist/modes/interactive/run-indicator.js +15 -12
  353. package/dist/modes/interactive/session-events.js +3 -2
  354. package/dist/modes/interactive/startup-header.js +22 -23
  355. package/dist/modes/interactive/startup-ui.js +38 -30
  356. package/dist/modes/interactive/status-area.d.ts +2 -0
  357. package/dist/modes/interactive/status-area.js +8 -2
  358. package/dist/modes/interactive/status-bar.js +4 -3
  359. package/dist/modes/interactive/subagent-view.js +9 -7
  360. package/dist/modes/interactive/tasks-report.d.ts +6 -0
  361. package/dist/modes/interactive/tasks-report.js +28 -31
  362. package/dist/modes/interactive/terminal-setup.d.ts +9 -0
  363. package/dist/modes/interactive/terminal-setup.js +23 -0
  364. package/dist/modes/interactive/tool-summary.js +19 -17
  365. package/dist/modes/interactive/tool-view.js +7 -4
  366. package/dist/modes/interactive/trace-view.d.ts +89 -0
  367. package/dist/modes/interactive/trace-view.js +332 -0
  368. package/dist/modes/print/print-mode.js +14 -15
  369. package/dist/modes/rpc/commands.js +7 -3
  370. package/dist/modes/rpc/rpc-mode.js +9 -3
  371. package/dist/modes/session-report.d.ts +2 -0
  372. package/dist/modes/session-report.js +101 -105
  373. package/dist/modes/startup-ui-text.js +11 -6
  374. package/dist/permissions/bypass.d.ts +8 -10
  375. package/dist/permissions/bypass.js +19 -10
  376. package/dist/permissions/memory-class.d.ts +23 -0
  377. package/dist/permissions/memory-class.js +54 -0
  378. package/dist/permissions/modes.d.ts +3 -3
  379. package/dist/permissions/modes.js +21 -16
  380. package/dist/permissions/pipeline.d.ts +1 -1
  381. package/dist/permissions/pipeline.js +9 -2
  382. package/dist/permissions/preview.js +49 -42
  383. package/dist/permissions/rules.js +5 -2
  384. package/dist/permissions/types.d.ts +4 -0
  385. package/dist/plan/store.js +2 -1
  386. package/dist/rpc.d.ts +39 -1
  387. package/dist/rpc.js +3 -0
  388. package/dist/sandbox/bash.js +11 -8
  389. package/dist/sandbox/detect.js +14 -11
  390. package/dist/sdk.d.ts +17 -1
  391. package/dist/sdk.js +29 -7
  392. package/dist/session/export.js +31 -30
  393. package/dist/session/manager.d.ts +1 -1
  394. package/dist/session/manager.js +5 -3
  395. package/dist/session/reuse.js +5 -4
  396. package/dist/session/scan.js +3 -2
  397. package/dist/session/stats-aggregate.d.ts +3 -1
  398. package/dist/session/stats-aggregate.js +5 -1
  399. package/dist/session/stats-index.js +2 -1
  400. package/dist/session/stats-scan.d.ts +4 -1
  401. package/dist/session/stats-scan.js +6 -2
  402. package/dist/session/store.d.ts +11 -0
  403. package/dist/session/store.js +48 -1
  404. package/dist/session/types.d.ts +2 -0
  405. package/dist/skills/builtin.js +2 -1
  406. package/dist/tools/image-file.d.ts +26 -1
  407. package/dist/tools/image-file.js +55 -13
  408. package/dist/tools/presets.d.ts +14 -1
  409. package/dist/tools/presets.js +3 -3
  410. package/dist/tools/registry.js +1 -1
  411. package/dist/tools/truncate.d.ts +1 -1
  412. package/dist/tools/truncate.js +2 -2
  413. package/dist/tools/types.d.ts +17 -1
  414. package/dist/trace/build-index.d.ts +91 -0
  415. package/dist/trace/build-index.js +127 -0
  416. package/dist/trace/build-nodes.d.ts +24 -0
  417. package/dist/trace/build-nodes.js +279 -0
  418. package/dist/trace/build-util.d.ts +43 -0
  419. package/dist/trace/build-util.js +120 -0
  420. package/dist/trace/build.d.ts +82 -0
  421. package/dist/trace/build.js +382 -0
  422. package/dist/trace/detail.d.ts +35 -0
  423. package/dist/trace/detail.js +205 -0
  424. package/dist/trace/flatten.d.ts +69 -0
  425. package/dist/trace/flatten.js +173 -0
  426. package/dist/trace/format.d.ts +47 -0
  427. package/dist/trace/format.js +329 -0
  428. package/dist/trace/html-template.d.ts +19 -0
  429. package/dist/trace/html-template.js +150 -0
  430. package/dist/trace/html.d.ts +104 -0
  431. package/dist/trace/html.js +292 -0
  432. package/dist/trace/preview.d.ts +29 -0
  433. package/dist/trace/preview.js +59 -0
  434. package/dist/trace/query-session.d.ts +14 -0
  435. package/dist/trace/query-session.js +38 -0
  436. package/dist/trace/query.d.ts +55 -0
  437. package/dist/trace/query.js +188 -0
  438. package/dist/trace/session.d.ts +40 -0
  439. package/dist/trace/session.js +168 -0
  440. package/dist/trace/types.d.ts +243 -0
  441. package/dist/trace/types.js +13 -0
  442. package/dist/tui/components/editor-paste.d.ts +2 -0
  443. package/dist/tui/components/editor-paste.js +6 -3
  444. package/dist/tui/components/editor.js +2 -2
  445. package/dist/tui/components/loader.d.ts +3 -0
  446. package/dist/tui/components/loader.js +14 -0
  447. package/dist/tui/components/settings-list.d.ts +61 -0
  448. package/dist/tui/components/settings-list.js +135 -0
  449. package/dist/tui/keybindings.d.ts +5 -0
  450. package/dist/tui/keybindings.js +17 -5
  451. package/dist/tui.d.ts +1 -0
  452. package/dist/tui.js +2 -0
  453. package/docs/en/host-api.md +167 -0
  454. package/docs/en/permissions.md +214 -0
  455. package/docs/en/providers.md +625 -0
  456. package/docs/en/rpc.md +361 -0
  457. package/docs/en/sessions.md +219 -0
  458. package/docs/en/tui.md +527 -0
  459. package/docs/host-api.md +18 -17
  460. package/docs/memory.md +172 -0
  461. package/docs/permissions.md +2 -2
  462. package/docs/providers.md +67 -1
  463. package/docs/rpc.md +31 -3
  464. package/docs/session-format.md +8 -2
  465. package/docs/sessions.md +29 -1
  466. package/docs/tui.md +132 -3
  467. package/package.json +8 -3
@@ -25,42 +25,32 @@ import { AgentSessionImpl } from "../../agent/session.js";
25
25
  import { taskRegistryView } from "../../agent/subagent-registry.js";
26
26
  import { currentSession, switchSession } from "../../cli/compose-session.js";
27
27
  import { startupInfo, startupScreenLevel, tildePath } from "../../cli/startup-screen.js";
28
- import { KEYBINDINGS_FILE } from "../../config/paths.js";
29
28
  import { AmaError, isAmaError } from "../../errors.js";
30
- import { Container, Editor, Keybindings, Loader, ProcessTerminal, Spacer, TUI, Text, createTheme, detectCapabilities, resolveAscii, resolveThemeName, loadKeybindingsFile, } from "../../tui.js";
29
+ import { msg } from "../../i18n/index.js";
30
+ import { Container, Editor, Loader, Spacer, TUI, Text, createTheme, detectCapabilities, resolveAscii, resolveThemeName, } from "../../tui.js";
31
31
  import { BYPASS_MODE, createBypassGate } from "../../permissions/bypass.js";
32
32
  import { onTerminationSignals } from "../shared.js";
33
- import { AgentUi } from "./agent-ui.js";
33
+ import { AgentUi, agentCommandHooks } from "./agent-ui.js";
34
34
  import { ApprovalDialogBroker, approvalOutcomeText } from "./approval-dialog.js";
35
35
  import { mergingBroker } from "./approval-merge.js";
36
36
  import { ALL_COMMANDS, runInteractiveCommand } from "./commands.js";
37
+ import { memoryPanelFor } from "./memory-panel.js";
37
38
  import { InteractiveCompletion } from "./completion.js";
38
39
  import { confirmBypass } from "./confirm-dialog.js";
40
+ import { configUiFor } from "./config-ui.js";
39
41
  import { createKeyDispatch } from "./key-dispatch.js";
40
42
  import { MessageView, exitSummaryLines } from "./message-view.js";
41
43
  import { openPicker } from "./pickers.js";
42
44
  import { createRewindFlow } from "./rewind-flow.js";
45
+ import { openTraceView } from "./trace-view.js";
43
46
  import { StartupHeader } from "./startup-header.js";
44
47
  import { QueueView, RunIndicator } from "./run-indicator.js";
45
48
  import { StatusArea, statusLineSlash } from "./status-area.js";
46
49
  import { createSessionEventHandler } from "./session-events.js";
47
50
  import { SubagentTracker } from "./subagent-view.js";
51
+ import { loadKeys, processTerminal } from "./terminal-setup.js";
48
52
  import { ToolTracker } from "./tool-view.js";
49
53
  const HINT_MS = 2500;
50
- const EDITOR_PLACEHOLDER = "输入消息,/ 命令,@ 文件,Shift+Enter 换行";
51
- function processTerminal() {
52
- const stdin = process.stdin;
53
- if (stdin.isTTY !== true || typeof stdin.setRawMode !== "function" || !process.stdout.isTTY) {
54
- throw new AmaError("terminal_init_failed", "stdin / stdout 不是终端");
55
- }
56
- return new ProcessTerminal();
57
- }
58
- function loadKeys(runtime, warn) {
59
- const parsed = loadKeybindingsFile(join(runtime.paths.configDir, KEYBINDINGS_FILE));
60
- for (const w of parsed.warnings)
61
- warn(`keybindings.json:${w}`);
62
- return new Keybindings(parsed.overrides);
63
- }
64
54
  export function runInteractiveMode(runtime, context, options = {}) {
65
55
  const terminal = options.terminal ?? processTerminal();
66
56
  const ui = runtime.config.ui ?? {};
@@ -95,7 +85,7 @@ export function runInteractiveMode(runtime, context, options = {}) {
95
85
  const loaderSlot = new Container();
96
86
  const loader = new Loader(() => tui.requestRender(), {
97
87
  theme,
98
- message: "思考中",
88
+ message: msg().interactive.view.run.thinking,
99
89
  now,
100
90
  ...(ui.animation === false ? { animation: false } : {}),
101
91
  ...(options.spinnerIntervalMs !== undefined ? { intervalMs: options.spinnerIntervalMs } : {}),
@@ -126,7 +116,7 @@ export function runInteractiveMode(runtime, context, options = {}) {
126
116
  theme,
127
117
  keybindings: keys,
128
118
  maxVisibleLines: 8,
129
- placeholder: EDITOR_PLACEHOLDER,
119
+ placeholder: msg().interactive.app.placeholder,
130
120
  autocomplete: completion,
131
121
  requestRender: () => tui.requestRender(),
132
122
  ...(historyFile !== undefined ? { historyFile } : {}),
@@ -196,7 +186,7 @@ export function runInteractiveMode(runtime, context, options = {}) {
196
186
  const replay = () => {
197
187
  view.replay(session.messages, {
198
188
  tool: (call, result) => tools.completed(call.id, call.name, call.arguments, result === undefined
199
- ? { content: "(没有结果)", isError: true }
189
+ ? { content: msg().interactive.app.noResult, isError: true }
200
190
  : {
201
191
  content: result.content,
202
192
  isError: result.isError,
@@ -285,6 +275,7 @@ export function runInteractiveMode(runtime, context, options = {}) {
285
275
  setDraft,
286
276
  editorEmpty: () => editor.isEmpty(),
287
277
  });
278
+ const configUi = configUiFor(pickerHost, { runtime, context, view, loader, area, tui, notice });
288
279
  const commandUi = {
289
280
  runtime,
290
281
  session: () => session,
@@ -314,6 +305,10 @@ export function runInteractiveMode(runtime, context, options = {}) {
314
305
  exit: (code) => exit(code),
315
306
  now,
316
307
  extra: (name, args) => agentUi.command(name, args),
308
+ ...agentCommandHooks(() => agentUi),
309
+ configPanel: (args) => configUi.open(args),
310
+ traceView: (id) => openTraceView({ ...pickerHost, session: () => session, now, notice, render }, id),
311
+ memoryPanel: memoryPanelFor(() => commandUi, pickerHost, tui, env), // [W6-M]
317
312
  };
318
313
  const runCommand = (line) => (statusLineSlash(area, line, notice)
319
314
  ? Promise.resolve(true)
@@ -360,6 +355,7 @@ export function runInteractiveMode(runtime, context, options = {}) {
360
355
  runCommand: (line) => void runCommand(line),
361
356
  exit: (code) => exit(code),
362
357
  onInterrupted: (empty) => void rewind.afterInterrupt(empty),
358
+ agents: () => agentUi.keys,
363
359
  }));
364
360
  // ---- 晚绑定 ---------------------------------------------------------------
365
361
  const overlayHooks = {
@@ -395,6 +391,7 @@ export function runInteractiveMode(runtime, context, options = {}) {
395
391
  dialog: { theme, keybindings: keys, ...overlayHooks },
396
392
  displayPath: (path) => tildePath(path, home),
397
393
  ...(options.clipboard !== undefined ? { clipboard: options.clipboard } : {}),
394
+ area,
398
395
  });
399
396
  const taskAgent = (taskId) => taskRegistryView(session.state.sessionId)?.get(taskId)?.agent;
400
397
  const broker = mergingBroker(new ApprovalDialogBroker({
@@ -411,7 +408,7 @@ export function runInteractiveMode(runtime, context, options = {}) {
411
408
  notice(outcome === "deny" ? "info" : "warn", text);
412
409
  }
413
410
  },
414
- }), agentUi.merge, (request) => notice("info", `${approvalOutcomeText(request, "allow", taskAgent)}(随上一次确认)`));
411
+ }), agentUi.merge, (request) => notice("info", msg().interactive.app.followed(approvalOutcomeText(request, "allow", taskAgent))));
415
412
  // ---- 启动与退出 -----------------------------------------------------------
416
413
  let offSignals = () => undefined;
417
414
  function exit(code) {
@@ -453,7 +450,7 @@ export function runInteractiveMode(runtime, context, options = {}) {
453
450
  }
454
451
  catch (error) {
455
452
  unsubscribe();
456
- reject(new AmaError("terminal_init_failed", `终端初始化失败:${error instanceof Error ? error.message : String(error)}`, { cause: error }));
453
+ reject(new AmaError("terminal_init_failed", msg().interactive.app.terminalInitFailed(error instanceof Error ? error.message : String(error)), { cause: error }));
457
454
  return;
458
455
  }
459
456
  runtime.approvals.setUiBroker(broker);
@@ -9,12 +9,22 @@
9
9
  *
10
10
  * [RW-C] 空闲时双击 Esc(`app.rewind`,double-esc.ts):输入框为空打开回滚列表,有字则清空并存进
11
11
  * 输入历史;运行中 Esc 仍为中断,中断后交给 `onInterrupted`(中断即撤回)。
12
+ *
13
+ * [W6-A] Agent 栏(agent-ui.ts):栏聚焦时它先收键(Esc 是「返回」,不中断、不回滚);输入为空、补全没开时
14
+ * `app.agents.focus`(缺省 `Ctrl+B` / `↓`)先问它要不要进栏,不要就照常交给编辑器(光标左移、历史下一条)。
12
15
  */
13
16
  import type { AgentSession } from "../../agent/types.js";
14
17
  import type { PermissionMode } from "../../permissions/types.js";
15
18
  import type { Editor, Keybindings } from "../../tui.js";
16
19
  import type { StatusBar } from "./status-bar.js";
17
20
  import type { ToolTracker } from "./tool-view.js";
21
+ /** [W6-A] Agent 栏的按键入口。 */
22
+ export interface AgentKeys {
23
+ /** 栏聚焦时先消费按键;返回 true 已处理。 */
24
+ handleKey(data: string): boolean;
25
+ /** `app.agents.focus`(输入为空):进栏返回 true,否则交给编辑器。 */
26
+ focus(data: string): boolean;
27
+ }
18
28
  export interface KeyDispatchDeps {
19
29
  keys: Keybindings;
20
30
  editor: Editor;
@@ -46,6 +56,8 @@ export interface KeyDispatchDeps {
46
56
  onInterrupted?(editorWasEmpty: boolean): void;
47
57
  /** 双击 Esc 的间隔(测试注入)。 */
48
58
  doubleEscMs?: number;
59
+ /** [W6-A] Agent 栏(晚绑定)。 */
60
+ agents?(): AgentKeys | undefined;
49
61
  }
50
62
  /** 返回输入监听器:已处理返回 true,交给编辑器返回 false。 */
51
63
  export declare function createKeyDispatch(deps: KeyDispatchDeps): (data: string) => boolean;
@@ -9,7 +9,11 @@
9
9
  *
10
10
  * [RW-C] 空闲时双击 Esc(`app.rewind`,double-esc.ts):输入框为空打开回滚列表,有字则清空并存进
11
11
  * 输入历史;运行中 Esc 仍为中断,中断后交给 `onInterrupted`(中断即撤回)。
12
+ *
13
+ * [W6-A] Agent 栏(agent-ui.ts):栏聚焦时它先收键(Esc 是「返回」,不中断、不回滚);输入为空、补全没开时
14
+ * `app.agents.focus`(缺省 `Ctrl+B` / `↓`)先问它要不要进栏,不要就照常交给编辑器(光标左移、历史下一条)。
12
15
  */
16
+ import { msg } from "../../i18n/index.js";
13
17
  import { ExitCode } from "../../cli/exit-codes.js";
14
18
  import { nextCycleMode, permissionModeLabel } from "../../permissions/modes.js";
15
19
  import { DOUBLE_ESC_HINT_MS, DoubleEscape } from "./double-esc.js";
@@ -23,10 +27,10 @@ export function createKeyDispatch(deps) {
23
27
  const doubleEscape = () => {
24
28
  switch (esc.press(deps.now(), editor.isEmpty())) {
25
29
  case "arm-rewind":
26
- deps.showHint("再按 Esc 回滚", DOUBLE_ESC_HINT_MS);
30
+ deps.showHint(msg().interactive.keys.escRewind, DOUBLE_ESC_HINT_MS);
27
31
  return;
28
32
  case "arm-clear":
29
- deps.showHint("再按 Esc 清空", DOUBLE_ESC_HINT_MS);
33
+ deps.showHint(msg().interactive.keys.escClear, DOUBLE_ESC_HINT_MS);
30
34
  return;
31
35
  case "rewind":
32
36
  deps.showHint("");
@@ -38,7 +42,7 @@ export function createKeyDispatch(deps) {
38
42
  if (text.trim() !== "")
39
43
  editor.addToHistory(text);
40
44
  editor.clear();
41
- deps.showHint("已清空输入 · ↑ 取回");
45
+ deps.showHint(msg().interactive.keys.cleared);
42
46
  return;
43
47
  }
44
48
  }
@@ -71,8 +75,8 @@ export function createKeyDispatch(deps) {
71
75
  const applyMode = (mode, skipped) => {
72
76
  deps.session().setPermissionMode(mode);
73
77
  status.refresh();
74
- const label = `权限模式:${permissionModeLabel(mode)}`;
75
- deps.showHint(skipped ? `未进入 Bypass · ${label}` : label);
78
+ const label = msg().interactive.commands.modeSet(permissionModeLabel(mode));
79
+ deps.showHint(skipped ? msg().interactive.keys.bypassSkipped(label) : label);
76
80
  };
77
81
  const cyclePermission = () => {
78
82
  const next = nextCycleMode(deps.session().state.permissionMode);
@@ -90,18 +94,29 @@ export function createKeyDispatch(deps) {
90
94
  const is = (action) => keys.matches(data, action);
91
95
  if (!is("app.rewind"))
92
96
  esc.reset();
97
+ const agents = deps.agents?.();
98
+ if (agents?.handleKey(data) === true) {
99
+ esc.reset();
100
+ return true;
101
+ }
102
+ if (agents !== undefined &&
103
+ is("app.agents.focus") &&
104
+ editor.isEmpty() &&
105
+ !editor.isCompletionOpen &&
106
+ agents.focus(data))
107
+ return true;
93
108
  if (is("app.clear")) {
94
109
  if (!editor.isEmpty()) {
95
110
  editor.clear();
96
111
  ctrlCArmedAt = deps.now();
97
- deps.showHint("已清空输入 · 再按 Ctrl+C 退出");
112
+ deps.showHint(msg().interactive.keys.clearedCtrlC);
98
113
  }
99
114
  else if (deps.now() - ctrlCArmedAt < DOUBLE_CTRL_C_MS) {
100
115
  deps.exit(ExitCode.Sigint);
101
116
  }
102
117
  else {
103
118
  ctrlCArmedAt = deps.now();
104
- deps.showHint("再按一次 Ctrl+C 退出");
119
+ deps.showHint(msg().interactive.keys.ctrlCAgain);
105
120
  }
106
121
  return true;
107
122
  }
@@ -109,7 +124,7 @@ export function createKeyDispatch(deps) {
109
124
  if (is("app.interrupt") && !editor.isCompletionOpen && deps.busy()) {
110
125
  esc.reset();
111
126
  interrupt();
112
- deps.showHint("已中断");
127
+ deps.showHint(msg().interactive.keys.interrupted);
113
128
  deps.onInterrupted?.(editor.isEmpty());
114
129
  return true;
115
130
  }
@@ -140,7 +155,7 @@ export function createKeyDispatch(deps) {
140
155
  if (is("app.tools.expand")) {
141
156
  const expanded = tools.toggleExpanded();
142
157
  deps.onExpandToggle?.(expanded);
143
- deps.showHint(expanded ? "工具输出:展开" : "工具输出:折叠");
158
+ deps.showHint(expanded ? msg().interactive.keys.toolsExpanded : msg().interactive.keys.toolsCollapsed);
144
159
  return true;
145
160
  }
146
161
  if (is("app.model.select")) {
@@ -6,6 +6,7 @@
6
6
  * 空行 Ctrl+D 结束。括号粘贴:单行原样插入,多行折叠成 `[粘贴 #n +k 行]` 标记,提交时展开。
7
7
  * `ask()`:审批等单键问答,下一个可见字符(或 Enter = 缺省答案)作答。
8
8
  */
9
+ import { msg } from "../../../i18n/index.js";
9
10
  import { visibleWidth } from "../../../tui/ansi.js";
10
11
  import { PasteState } from "./paste-state.js";
11
12
  const KEYS = {
@@ -205,7 +206,7 @@ export class LineEditor {
205
206
  this.insert(text);
206
207
  }
207
208
  else {
208
- const marker = `[粘贴 #${this.pastes.size + 1} +${lines} 行]`;
209
+ const marker = msg().interactive.line.pasteMarker(this.pastes.size + 1, lines);
209
210
  this.pastes.set(marker, text);
210
211
  this.insert(marker);
211
212
  }
@@ -11,16 +11,20 @@
11
11
  * - 斜杠命令走 commands-core(与 B7 同一语义),`pick` 退化为列出候选;`/rewind` 列编号、
12
12
  * `/rewind <n> …` 执行,回到的单行原消息放回编辑行。
13
13
  */
14
+ import { msg } from "../../../i18n/index.js";
14
15
  import { promptImages, sessionModel } from "../../image-input.js";
15
16
  import { taskRegistryView } from "../../../agent/subagent-registry.js";
16
17
  import { currentSession, switchSession } from "../../../cli/compose-session.js";
17
18
  import { ExitCode } from "../../../cli/exit-codes.js";
18
- import { BYPASS_LINE_QUESTION, BYPASS_MODE, BYPASS_RISK_LINES, createBypassGate, } from "../../../permissions/bypass.js";
19
+ import { BYPASS_MODE, bypassLineQuestion, bypassRiskLines, createBypassGate, } from "../../../permissions/bypass.js";
19
20
  import { previewDisplayLines } from "../../../permissions/preview.js";
20
21
  import { AMA_VERSION } from "../../../version.js";
21
22
  import { runSlashCommand } from "../../commands-core.js";
23
+ import { configCommand } from "../config-ui.js";
24
+ import { lineTraceCommand } from "../../../trace/session.js";
22
25
  import { createLineReader } from "../../rpc/jsonl.js";
23
26
  import { errorText, onTerminationSignals } from "../../shared.js";
27
+ import { memoryLineCommand } from "../memory-panel.js";
24
28
  import { LineEditor } from "./line-editor.js";
25
29
  import { cacheNoticesEnabled } from "../../session-report.js";
26
30
  import { EventPrinter, approvalQuestion, logsInfo, pickHint } from "./line-render.js";
@@ -46,6 +50,11 @@ export async function runLineMode(runtime, context, options = {}) {
46
50
  let unsubscribe = session.subscribe((event) => printer.handle(event));
47
51
  const commands = {
48
52
  runtime,
53
+ extra: {
54
+ config: configCommand(runtime, context),
55
+ trace: lineTraceCommand,
56
+ memory: memoryLineCommand, // [W6-M]
57
+ },
49
58
  session: () => session,
50
59
  async switchSession(request) {
51
60
  const next = await switchSession(runtime, request);
@@ -106,13 +115,15 @@ export async function runLineMode(runtime, context, options = {}) {
106
115
  const ed = editor;
107
116
  if (runtime.config.ui?.quietStartup !== "silent") {
108
117
  const model = session.state.model;
109
- io.stdout(`ama ${AMA_VERSION} · ${model?.provider}/${model?.id} · /help 查看命令,Ctrl+D 退出\n`);
118
+ io.stdout(`${msg().interactive.line.banner(AMA_VERSION, `${model?.provider}/${model?.id}`)}\n`);
110
119
  }
111
120
  // /permission full-auto:进入 Bypass 前文本确认一次(管道里没有这一步,命令本身就是显式选择)
112
121
  commands.confirmPermissionMode = createBypassGate(() => {
113
122
  ed.hide();
114
- io.stdout(`\n${BYPASS_RISK_LINES.map((l) => ` ${l}\n`).join("")}`);
115
- return ed.ask(BYPASS_LINE_QUESTION, "n").then((answer) => answer === "y");
123
+ io.stdout(`\n${bypassRiskLines()
124
+ .map((l) => ` ${l}\n`)
125
+ .join("")}`);
126
+ return ed.ask(bypassLineQuestion(), "n").then((answer) => answer === "y");
116
127
  }, session.state.permissionMode === BYPASS_MODE);
117
128
  runtime.approvals.setUiBroker({
118
129
  ask: (request, signal) => new Promise((resolve) => {
@@ -170,14 +181,14 @@ export async function runLineMode(runtime, context, options = {}) {
170
181
  if (action.kind === "interrupt") {
171
182
  if (busy) {
172
183
  void session.abort();
173
- err("^C 已中断\n");
184
+ err(`${msg().interactive.line.interrupted}\n`);
174
185
  }
175
186
  else if (Date.now() - lastInterrupt < DOUBLE_INTERRUPT_MS) {
176
187
  return finish(ExitCode.Sigint);
177
188
  }
178
189
  else {
179
190
  lastInterrupt = Date.now();
180
- io.stdout("\n(再按一次 Ctrl+C 退出)\n");
191
+ io.stdout(`\n${msg().interactive.line.ctrlCAgain}\n`);
181
192
  ed.render();
182
193
  }
183
194
  continue;
@@ -185,7 +196,7 @@ export async function runLineMode(runtime, context, options = {}) {
185
196
  if (busy) {
186
197
  if (action.text.trim() !== "") {
187
198
  void session.steer(action.text).catch(() => undefined);
188
- out(`↳ steer:${action.text}\n`);
199
+ out(`${msg().interactive.line.steer(action.text)}\n`);
189
200
  }
190
201
  continue;
191
202
  }
@@ -2,9 +2,10 @@
2
2
  * 行式界面的输出:会话事件 → 纯文本(助手文本流式写 stdout,工具 / 重试 / 压缩一行提示)。[B6]
3
3
  * 选择器在行式界面里退化为列出候选、提示带参数重发。
4
4
  */
5
+ import { msg } from "../../../i18n/index.js";
5
6
  import { THINKING_LEVELS } from "../../../ai/thinking.js";
6
7
  import { listSessions } from "../../../cli/compose-store.js";
7
- import { AUTO_LAYER_TEXT, permissionModeLines } from "../../../permissions/modes.js";
8
+ import { autoLayerText, permissionModeLines } from "../../../permissions/modes.js";
8
9
  import { cacheEventNotice, warmSentNotice } from "../../session-report.js";
9
10
  import { isFirstRunRequest, sourceLabel } from "../approval-dialog.js";
10
11
  import { LIMIT_WARNING, backgroundJobText, limitReachedText, modelFallbackText, } from "../event-notices.js";
@@ -25,27 +26,27 @@ export function argsSummary(args) {
25
26
  return "";
26
27
  }
27
28
  export function approvalQuestion(request, taskAgent) {
29
+ const m = msg().interactive.line;
28
30
  const label = sourceLabel(request, taskAgent);
29
31
  const task = label === undefined ? "" : `${label} `;
30
32
  const origin = request.context?.origin;
31
33
  if (origin !== undefined) {
32
- const where = origin.toolCall.locations?.[0];
33
- return `${task}允许 ${origin.toolCall.title}${where !== undefined ? ` ${where}` : ""}?[y 允许 / a 本会话都允许 / N 拒绝] `;
34
+ return m.approvalOrigin(task, origin.toolCall.title, origin.toolCall.locations?.[0]);
34
35
  }
35
36
  if (isFirstRunRequest(request)) {
36
37
  const input = request.input;
37
- return `${task}${String(input["note"])} 允许?[y 允许 / N 拒绝] `;
38
+ return m.approvalFirstRun(task, String(input["note"]));
38
39
  }
39
40
  const summary = argsSummary(request.input);
40
41
  const auto = request.autoDecision;
41
42
  const why = request.reason === "dangerous"
42
- ? "(危险命令)"
43
+ ? { kind: "dangerous" }
43
44
  : request.hookReason !== undefined
44
- ? `(${request.hookReason})`
45
+ ? { kind: "hook", reason: request.hookReason }
45
46
  : auto !== undefined
46
- ? `(Auto ${AUTO_LAYER_TEXT[auto.layer]}:${auto.reason})`
47
- : "";
48
- return `${task}允许 ${request.toolName}${summary !== "" ? ` ${summary}` : ""}${why}?[y 允许 / a 本会话都允许 / N 拒绝] `;
47
+ ? { kind: "auto", layer: autoLayerText(auto.layer), reason: auto.reason }
48
+ : undefined;
49
+ return m.approvalTool(task, request.toolName, summary, why);
49
50
  }
50
51
  /** `AMA_LOG=info|debug`。 */
51
52
  export function logsInfo(env) {
@@ -92,7 +93,8 @@ export class EventPrinter {
92
93
  if (event.message.role === "assistant") {
93
94
  this.endLine();
94
95
  if (event.message.stopReason === "error")
95
- this.pendingError = event.message.errorMessage ?? "模型调用失败";
96
+ this.pendingError =
97
+ event.message.errorMessage ?? msg().interactive.view.message.modelError;
96
98
  }
97
99
  return;
98
100
  case "agent_end":
@@ -114,14 +116,14 @@ export class EventPrinter {
114
116
  }
115
117
  return;
116
118
  case "auto_retry_start":
117
- this.line(`↻ 重试 ${event.attempt}/${event.maxAttempts}(${Math.round(event.delayMs / 1000)}s):${event.errorMessage}`, true);
119
+ this.line(msg().interactive.line.retry(event.attempt, event.maxAttempts, Math.round(event.delayMs / 1000), event.errorMessage), true);
118
120
  return;
119
121
  case "compaction_start":
120
- this.line("… 压缩上下文", true);
122
+ this.line(msg().interactive.line.compacting, true);
121
123
  return;
122
124
  case "compaction_end":
123
125
  if (event.error !== undefined)
124
- this.line(`压缩失败:${event.error}`, true);
126
+ this.line(msg().interactive.events.compactionFailed(event.error), true);
125
127
  return;
126
128
  case "cache_miss":
127
129
  case "context_pressure": {
@@ -142,7 +144,7 @@ export class EventPrinter {
142
144
  this.pendingError = undefined;
143
145
  if (error !== undefined) {
144
146
  this.failures++;
145
- this.line(`ama: 错误:${error}`, true);
147
+ this.line(msg().interactive.line.error(error), true);
146
148
  }
147
149
  // 失败时 warning 就是同一条错误文本,不再重复打印;预算到限已由 limit_reached 说明
148
150
  if (event.warning !== undefined &&
@@ -153,12 +155,11 @@ export class EventPrinter {
153
155
  }
154
156
  // [W5-U] 第五波事件
155
157
  case "plan_proposed": {
156
- const file = event.filePath !== undefined ? `(${event.filePath})` : "";
157
- this.line(`◇ 计划 v${event.version} 待审批${file}:/plan approve [模式|fresh] 批准 · /plan reject 放弃 · 直接输入修改意见`);
158
+ this.line(msg().interactive.line.planProposed(event.version, event.filePath));
158
159
  return;
159
160
  }
160
161
  case "subagent_start":
161
- this.line(` ↳ ${event.taskId} ${event.agent}${event.background ? "(后台)" : ""} 开始`);
162
+ this.line(msg().interactive.line.subagentStart(event.taskId, event.agent, event.background === true));
162
163
  return;
163
164
  case "subagent_end":
164
165
  this.line(` ↳ ${event.taskId} ${taskStatusText(event.status)}`);
@@ -189,14 +190,14 @@ export async function pickHint(what, runtime, session) {
189
190
  for (const model of provider.models)
190
191
  refs.push(` ${provider.id}/${model.id}`);
191
192
  }
192
- return ["可用模型(/model <provider/id>):", ...refs.slice(0, 40)].join("\n");
193
+ return [msg().interactive.line.modelsHeading, ...refs.slice(0, 40)].join("\n");
193
194
  }
194
195
  case "session": {
195
196
  const items = listSessions({ sessionDir: runtime.paths.sessionDir, cwd: session.state.cwd });
196
197
  if (items.length === 0)
197
- return "本目录没有会话";
198
+ return msg().interactive.line.noSessions;
198
199
  return [
199
- "最近的会话(/resume <id>):",
200
+ msg().interactive.line.sessionsHeading,
200
201
  ...items
201
202
  .slice(0, 15)
202
203
  .map((i) => ` ${i.id.slice(0, 8)} ${i.modifiedAt.slice(0, 16).replace("T", " ")} ${(i.name ?? i.firstPrompt ?? "").replace(/\s+/g, " ").slice(0, 50)}`),
@@ -205,9 +206,9 @@ export async function pickHint(what, runtime, session) {
205
206
  case "tree": {
206
207
  const users = session.entries.filter((e) => e.type === "message" && e.message.role === "user");
207
208
  if (users.length === 0)
208
- return "还没有可分叉的消息";
209
+ return msg().interactive.line.noForkable;
209
210
  return [
210
- "可分叉的位置(/fork <条目 id>):",
211
+ msg().interactive.line.forkHeading,
211
212
  ...users.slice(-15).map((e) => {
212
213
  const message = e.type === "message" ? e.message : undefined;
213
214
  const content = message?.role === "user" ? message.content : "";
@@ -220,10 +221,10 @@ export async function pickHint(what, runtime, session) {
220
221
  }
221
222
  case "permission":
222
223
  return [
223
- "Mode(/permission <模式>):",
224
+ msg().interactive.line.modeHeading,
224
225
  ...permissionModeLines(session.state.permissionMode, runtime.config.permission?.mode ?? "default").map((line) => ` ${line}`),
225
226
  ].join("\n");
226
227
  case "thinking":
227
- return `思考级别(/thinking <级别>):${THINKING_LEVELS.join(" | ")};当前 ${session.state.thinkingLevel}`;
228
+ return msg().interactive.line.thinking(THINKING_LEVELS.join(" | "), session.state.thinkingLevel);
228
229
  }
229
230
  }
@@ -0,0 +1,64 @@
1
+ /**
2
+ * `/memory`(docs/wave6-plan.md §3.5)。[W6-M]
3
+ *
4
+ * | 输入 | 交互界面 | 行式界面 |
5
+ * | ---------------------------- | ------------------------------------------ | ------------------------------ |
6
+ * | `/memory` | 消息区面板:各作用域条目(> 90 天标灰) | 文本列表 |
7
+ * | `/memory show <名字>` | 面板显示正文 | 打印正文 |
8
+ * | `/memory edit [名字\|作用域]`| `$EDITOR` 编辑副本,存回时检查凭据与上限 | 提示用 `ama memory edit` |
9
+ * | `/memory rm <名字>` | 确认框后删除 | 需 `--yes` |
10
+ * | `/memory on\|off` | 本会话允许 / 禁止写 | 同左 |
11
+ * | `/memory reload` | 重渲染 memory 节(提示断一次缓存) | 同左 |
12
+ *
13
+ * 会话未开启记忆时一律提示如何开启。写入后的索引在下次会话(或 reload)才进系统提示。
14
+ */
15
+ import { type EditText } from "../../memory/edit.js";
16
+ import type { MemoryRuntime } from "../../memory/runtime.js";
17
+ import { type Component, type Theme } from "../../tui.js";
18
+ import type { CommandContext, CommandResult } from "../commands-core.js";
19
+ import type { CommandUi } from "./commands.js";
20
+ import { type ChoiceHost } from "./confirm-dialog.js";
21
+ export type MemoryAction = {
22
+ kind: "list";
23
+ } | {
24
+ kind: "show";
25
+ name: string;
26
+ } | {
27
+ kind: "edit";
28
+ target?: string;
29
+ } | {
30
+ kind: "rm";
31
+ name: string;
32
+ yes: boolean;
33
+ } | {
34
+ kind: "writes";
35
+ on: boolean;
36
+ } | {
37
+ kind: "reload";
38
+ } | {
39
+ kind: "usage";
40
+ };
41
+ export declare function parseMemoryArgs(args: string): MemoryAction;
42
+ /** 行式界面(`CommandContext.extra.memory`)。 */
43
+ export declare function memoryLineCommand(args: string, ctx: CommandContext): Promise<CommandResult>;
44
+ /** `/memory` 面板:每个作用域一段,条目一行(名字、说明、更新日期;> 90 天标灰)。 */
45
+ export declare function memoryListPanel(runtime: MemoryRuntime, theme: Theme, now: number): Component;
46
+ export interface MemoryPanelDeps {
47
+ ui(): CommandUi;
48
+ /** 删除前的确认框。 */
49
+ choice: ChoiceHost;
50
+ /** 编辑器期间挂起 / 恢复界面。 */
51
+ suspend(): void;
52
+ resume(): void;
53
+ env: Readonly<Record<string, string | undefined>>;
54
+ /** 测试注入:代替真实编辑器。 */
55
+ edit?: EditText;
56
+ }
57
+ /** 交互界面的 `CommandUi.memoryPanel`。 */
58
+ export declare function createMemoryPanel(deps: MemoryPanelDeps): (args: string) => Promise<void>;
59
+ /** interactive-mode.ts 的一行装配(编辑器期间停掉 TUI,回来整屏重画)。 */
60
+ export declare function memoryPanelFor(ui: () => CommandUi, choice: ChoiceHost, tui: {
61
+ stop(): void;
62
+ start(): void;
63
+ forceFullRedraw(): void;
64
+ }, env: Readonly<Record<string, string | undefined>>): (args: string) => Promise<void>;