@armadra/agent 0.5.1 → 0.6.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 (486) hide show
  1. package/CHANGELOG.md +203 -304
  2. package/CHANGELOG.zh-CN.md +462 -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/discovered-cache.d.ts +48 -0
  47. package/dist/ai/providers/discovered-cache.js +102 -0
  48. package/dist/ai/providers/enrich.js +2 -7
  49. package/dist/ai/providers/model-visibility.d.ts +33 -0
  50. package/dist/ai/providers/model-visibility.js +70 -0
  51. package/dist/ai/providers/models-dev-cache.js +15 -19
  52. package/dist/ai/providers/models-dev-snapshot.js +8 -7
  53. package/dist/ai/providers/models-dev.js +5 -15
  54. package/dist/ai/providers/registry.d.ts +2 -0
  55. package/dist/ai/providers/registry.js +6 -1
  56. package/dist/ai/providers/suggest.js +2 -16
  57. package/dist/ai/types.d.ts +27 -1
  58. package/dist/auth/chatgpt/backend-client.d.ts +26 -0
  59. package/dist/auth/chatgpt/backend-client.js +74 -0
  60. package/dist/auth/chatgpt/claims.d.ts +17 -0
  61. package/dist/auth/chatgpt/claims.js +46 -0
  62. package/dist/auth/chatgpt/cli.d.ts +35 -0
  63. package/dist/auth/chatgpt/cli.js +279 -0
  64. package/dist/auth/chatgpt/doctor.d.ts +17 -0
  65. package/dist/auth/chatgpt/doctor.js +36 -0
  66. package/dist/auth/chatgpt/host-id.d.ts +7 -0
  67. package/dist/auth/chatgpt/host-id.js +26 -0
  68. package/dist/auth/chatgpt/login.d.ts +30 -0
  69. package/dist/auth/chatgpt/login.js +130 -0
  70. package/dist/auth/chatgpt/presets.d.ts +66 -0
  71. package/dist/auth/chatgpt/presets.js +120 -0
  72. package/dist/auth/chatgpt/quota-text.d.ts +13 -0
  73. package/dist/auth/chatgpt/quota-text.js +36 -0
  74. package/dist/auth/oauth/browser.d.ts +12 -0
  75. package/dist/auth/oauth/browser.js +27 -0
  76. package/dist/auth/oauth/callback-server.d.ts +47 -0
  77. package/dist/auth/oauth/callback-server.js +147 -0
  78. package/dist/auth/oauth/flows.d.ts +62 -0
  79. package/dist/auth/oauth/flows.js +113 -0
  80. package/dist/auth/oauth/jwt.d.ts +24 -0
  81. package/dist/auth/oauth/jwt.js +81 -0
  82. package/dist/auth/oauth/live.d.ts +21 -0
  83. package/dist/auth/oauth/live.js +25 -0
  84. package/dist/auth/oauth/oidc.d.ts +26 -0
  85. package/dist/auth/oauth/oidc.js +72 -0
  86. package/dist/auth/oauth/pkce.d.ts +15 -0
  87. package/dist/auth/oauth/pkce.js +20 -0
  88. package/dist/auth/oauth/refresh.d.ts +35 -0
  89. package/dist/auth/oauth/refresh.js +129 -0
  90. package/dist/auth/oauth/token-client.d.ts +33 -0
  91. package/dist/auth/oauth/token-client.js +121 -0
  92. package/dist/auth/oauth/token-store.d.ts +23 -0
  93. package/dist/auth/oauth/token-store.js +125 -0
  94. package/dist/auth/testing/fake-oauth.d.ts +73 -0
  95. package/dist/auth/testing/fake-oauth.js +271 -0
  96. package/dist/auth/testing/refresh-child.d.ts +5 -0
  97. package/dist/auth/testing/refresh-child.js +16 -0
  98. package/dist/bundle/ama.cjs +26532 -11045
  99. package/dist/checkpoints/backend.js +6 -5
  100. package/dist/checkpoints/restore.js +3 -2
  101. package/dist/checkpoints/settings.js +2 -1
  102. package/dist/checkpoints/shadow-git.js +7 -6
  103. package/dist/checkpoints/shadow-restore.js +3 -2
  104. package/dist/checkpoints/tracker.js +4 -3
  105. package/dist/cli/args.d.ts +9 -2
  106. package/dist/cli/args.js +74 -27
  107. package/dist/cli/bootstrap.js +53 -31
  108. package/dist/cli/choice-prompt.js +8 -6
  109. package/dist/cli/codemode-notice.js +2 -2
  110. package/dist/cli/compose-agents.js +2 -1
  111. package/dist/cli/compose-extensions.js +2 -0
  112. package/dist/cli/compose-memory.d.ts +53 -0
  113. package/dist/cli/compose-memory.js +127 -0
  114. package/dist/cli/compose-providers.d.ts +6 -0
  115. package/dist/cli/compose-providers.js +38 -2
  116. package/dist/cli/compose-session.d.ts +5 -0
  117. package/dist/cli/compose-session.js +27 -13
  118. package/dist/cli/compose-store.d.ts +2 -0
  119. package/dist/cli/compose-store.js +9 -5
  120. package/dist/cli/compose.d.ts +2 -0
  121. package/dist/cli/compose.js +13 -5
  122. package/dist/cli/default-model.d.ts +0 -2
  123. package/dist/cli/default-model.js +5 -8
  124. package/dist/cli/deps.d.ts +5 -1
  125. package/dist/cli/exit-codes.d.ts +1 -1
  126. package/dist/cli/exit-codes.js +7 -16
  127. package/dist/cli/from-prompt.js +3 -2
  128. package/dist/cli/help-text.d.ts +2 -1
  129. package/dist/cli/help-text.js +5 -99
  130. package/dist/cli/main.d.ts +5 -0
  131. package/dist/cli/main.js +21 -2
  132. package/dist/cli/proxy.js +14 -9
  133. package/dist/cli/runtime.d.ts +5 -0
  134. package/dist/cli/startup-screen.js +20 -27
  135. package/dist/cli/startup-steps.js +6 -8
  136. package/dist/cli/subcommands/auth.d.ts +6 -3
  137. package/dist/cli/subcommands/auth.js +52 -22
  138. package/dist/cli/subcommands/config-set.d.ts +21 -0
  139. package/dist/cli/subcommands/config-set.js +145 -0
  140. package/dist/cli/subcommands/config.d.ts +2 -1
  141. package/dist/cli/subcommands/config.js +51 -37
  142. package/dist/cli/subcommands/doctor.d.ts +2 -1
  143. package/dist/cli/subcommands/doctor.js +97 -58
  144. package/dist/cli/subcommands/init.d.ts +1 -1
  145. package/dist/cli/subcommands/init.js +8 -7
  146. package/dist/cli/subcommands/memory.d.ts +18 -0
  147. package/dist/cli/subcommands/memory.js +189 -0
  148. package/dist/cli/subcommands/model-meta.js +11 -9
  149. package/dist/cli/subcommands/models-cache-probe.js +23 -20
  150. package/dist/cli/subcommands/models-discover.d.ts +4 -0
  151. package/dist/cli/subcommands/models-discover.js +60 -21
  152. package/dist/cli/subcommands/models-enable.d.ts +13 -0
  153. package/dist/cli/subcommands/models-enable.js +145 -0
  154. package/dist/cli/subcommands/models.d.ts +3 -1
  155. package/dist/cli/subcommands/models.js +39 -24
  156. package/dist/cli/subcommands/probe-runner.js +8 -7
  157. package/dist/cli/subcommands/providers-list.js +32 -21
  158. package/dist/cli/subcommands/providers-plan.js +24 -25
  159. package/dist/cli/subcommands/providers-probe.js +5 -6
  160. package/dist/cli/subcommands/providers.d.ts +1 -1
  161. package/dist/cli/subcommands/providers.js +45 -50
  162. package/dist/cli/subcommands/sessions-export.d.ts +1 -1
  163. package/dist/cli/subcommands/sessions-export.js +10 -9
  164. package/dist/cli/subcommands/sessions-search.d.ts +1 -1
  165. package/dist/cli/subcommands/sessions-search.js +11 -10
  166. package/dist/cli/subcommands/sessions-trace.d.ts +30 -0
  167. package/dist/cli/subcommands/sessions-trace.js +156 -0
  168. package/dist/cli/subcommands/sessions.d.ts +4 -3
  169. package/dist/cli/subcommands/sessions.js +40 -37
  170. package/dist/cli/subcommands/stats.d.ts +1 -1
  171. package/dist/cli/subcommands/stats.js +49 -30
  172. package/dist/cli/system-prompt-arg.js +3 -2
  173. package/dist/codemode/capability.js +3 -2
  174. package/dist/compaction/post-compact.d.ts +1 -0
  175. package/dist/compaction/post-compact.js +15 -1
  176. package/dist/compaction/prune-tier.d.ts +1 -1
  177. package/dist/compaction/prune-tier.js +3 -3
  178. package/dist/compaction/serialize.js +2 -1
  179. package/dist/config/auth-file.d.ts +12 -2
  180. package/dist/config/auth-file.js +32 -10
  181. package/dist/config/checker.js +12 -11
  182. package/dist/config/context-files.js +3 -2
  183. package/dist/config/edit.d.ts +106 -0
  184. package/dist/config/edit.js +350 -0
  185. package/dist/config/init.d.ts +4 -3
  186. package/dist/config/init.js +10 -18
  187. package/dist/config/json-schema.d.ts +2 -1
  188. package/dist/config/json-schema.js +102 -69
  189. package/dist/config/key-docs.d.ts +18 -7
  190. package/dist/config/key-docs.js +43 -128
  191. package/dist/config/load.js +7 -6
  192. package/dist/config/merge.d.ts +4 -1
  193. package/dist/config/merge.js +42 -22
  194. package/dist/config/paths.js +6 -5
  195. package/dist/config/profile.d.ts +5 -1
  196. package/dist/config/profile.js +7 -2
  197. package/dist/config/schema-w5.js +12 -4
  198. package/dist/config/schema-w6.d.ts +19 -0
  199. package/dist/config/schema-w6.js +115 -0
  200. package/dist/config/schema.js +34 -20
  201. package/dist/config/settings-registry.d.ts +81 -0
  202. package/dist/config/settings-registry.js +185 -0
  203. package/dist/config/types-w5.d.ts +7 -0
  204. package/dist/config/types-w5.js +2 -0
  205. package/dist/config/types-w6.d.ts +109 -0
  206. package/dist/config/types-w6.js +19 -0
  207. package/dist/config/types.d.ts +11 -8
  208. package/dist/config/types.js +1 -0
  209. package/dist/drivers/acp/client.js +1 -1
  210. package/dist/drivers/acp/driver.js +13 -8
  211. package/dist/drivers/agents.js +4 -3
  212. package/dist/drivers/base.js +3 -2
  213. package/dist/drivers/host-runners.js +2 -1
  214. package/dist/drivers/native/claude-stream.js +12 -11
  215. package/dist/drivers/native/codex-app-server.js +17 -12
  216. package/dist/drivers/native/oneshot.js +8 -7
  217. package/dist/drivers/pool.js +1 -1
  218. package/dist/drivers/runner.d.ts +3 -1
  219. package/dist/drivers/runner.js +68 -20
  220. package/dist/drivers/turn.js +1 -1
  221. package/dist/hooks/config.js +3 -2
  222. package/dist/hooks/protocol.js +18 -12
  223. package/dist/host/api-impl.js +11 -10
  224. package/dist/host/loader.js +9 -8
  225. package/dist/host/types.d.ts +3 -0
  226. package/dist/i18n/catalog.d.ts +2209 -0
  227. package/dist/i18n/catalog.js +72 -0
  228. package/dist/i18n/format.d.ts +21 -0
  229. package/dist/i18n/format.js +58 -0
  230. package/dist/i18n/index.d.ts +58 -0
  231. package/dist/i18n/index.js +72 -0
  232. package/dist/i18n/messages/agents.d.ts +84 -0
  233. package/dist/i18n/messages/agents.js +85 -0
  234. package/dist/i18n/messages/approval.d.ts +99 -0
  235. package/dist/i18n/messages/approval.js +100 -0
  236. package/dist/i18n/messages/auth.d.ts +189 -0
  237. package/dist/i18n/messages/auth.js +201 -0
  238. package/dist/i18n/messages/cli-args.d.ts +46 -0
  239. package/dist/i18n/messages/cli-args.js +46 -0
  240. package/dist/i18n/messages/cli-help.d.ts +12 -0
  241. package/dist/i18n/messages/cli-help.js +248 -0
  242. package/dist/i18n/messages/cli.d.ts +336 -0
  243. package/dist/i18n/messages/cli.js +311 -0
  244. package/dist/i18n/messages/config-keys.d.ts +293 -0
  245. package/dist/i18n/messages/config-keys.js +296 -0
  246. package/dist/i18n/messages/config.d.ts +508 -0
  247. package/dist/i18n/messages/config.js +241 -0
  248. package/dist/i18n/messages/drivers.d.ts +123 -0
  249. package/dist/i18n/messages/drivers.js +124 -0
  250. package/dist/i18n/messages/errors.d.ts +83 -0
  251. package/dist/i18n/messages/errors.js +171 -0
  252. package/dist/i18n/messages/interactive-line.d.ts +61 -0
  253. package/dist/i18n/messages/interactive-line.js +69 -0
  254. package/dist/i18n/messages/interactive-startup.d.ts +99 -0
  255. package/dist/i18n/messages/interactive-startup.js +100 -0
  256. package/dist/i18n/messages/interactive-view.d.ts +140 -0
  257. package/dist/i18n/messages/interactive-view.js +141 -0
  258. package/dist/i18n/messages/interactive.d.ts +489 -0
  259. package/dist/i18n/messages/interactive.js +248 -0
  260. package/dist/i18n/messages/memory.d.ts +123 -0
  261. package/dist/i18n/messages/memory.js +128 -0
  262. package/dist/i18n/messages/panels.d.ts +233 -0
  263. package/dist/i18n/messages/panels.js +232 -0
  264. package/dist/i18n/messages/permissions.d.ts +126 -0
  265. package/dist/i18n/messages/permissions.js +151 -0
  266. package/dist/i18n/messages/plan.d.ts +123 -0
  267. package/dist/i18n/messages/plan.js +124 -0
  268. package/dist/i18n/messages/print.d.ts +86 -0
  269. package/dist/i18n/messages/print.js +91 -0
  270. package/dist/i18n/messages/report.d.ts +391 -0
  271. package/dist/i18n/messages/report.js +490 -0
  272. package/dist/i18n/messages/rewind.d.ts +198 -0
  273. package/dist/i18n/messages/rewind.js +217 -0
  274. package/dist/i18n/messages/session.d.ts +230 -0
  275. package/dist/i18n/messages/session.js +258 -0
  276. package/dist/i18n/messages/settings.d.ts +355 -0
  277. package/dist/i18n/messages/settings.js +343 -0
  278. package/dist/i18n/messages/subcommands-config.d.ts +113 -0
  279. package/dist/i18n/messages/subcommands-config.js +129 -0
  280. package/dist/i18n/messages/subcommands-models.d.ts +34 -0
  281. package/dist/i18n/messages/subcommands-models.js +34 -0
  282. package/dist/i18n/messages/subcommands.d.ts +576 -0
  283. package/dist/i18n/messages/subcommands.js +477 -0
  284. package/dist/i18n/messages/trace.d.ts +243 -0
  285. package/dist/i18n/messages/trace.js +238 -0
  286. package/dist/i18n/types.d.ts +15 -0
  287. package/dist/i18n/types.js +7 -0
  288. package/dist/index.d.ts +6 -0
  289. package/dist/index.js +2 -0
  290. package/dist/memory/edit.d.ts +24 -0
  291. package/dist/memory/edit.js +63 -0
  292. package/dist/memory/frontmatter.d.ts +37 -0
  293. package/dist/memory/frontmatter.js +79 -0
  294. package/dist/memory/index.d.ts +28 -0
  295. package/dist/memory/index.js +126 -0
  296. package/dist/memory/lock.d.ts +17 -0
  297. package/dist/memory/lock.js +62 -0
  298. package/dist/memory/paths.d.ts +57 -0
  299. package/dist/memory/paths.js +175 -0
  300. package/dist/memory/report.d.ts +36 -0
  301. package/dist/memory/report.js +86 -0
  302. package/dist/memory/runtime.d.ts +42 -0
  303. package/dist/memory/runtime.js +36 -0
  304. package/dist/memory/secrets.d.ts +8 -0
  305. package/dist/memory/secrets.js +27 -0
  306. package/dist/memory/section.d.ts +28 -0
  307. package/dist/memory/section.js +59 -0
  308. package/dist/memory/store.d.ts +70 -0
  309. package/dist/memory/store.js +284 -0
  310. package/dist/memory/tool.d.ts +31 -0
  311. package/dist/memory/tool.js +94 -0
  312. package/dist/modes/acp/acp-events.js +2 -1
  313. package/dist/modes/acp/acp-server.js +13 -12
  314. package/dist/modes/commands-core.d.ts +11 -0
  315. package/dist/modes/commands-core.js +93 -62
  316. package/dist/modes/image-input.js +20 -6
  317. package/dist/modes/interactive/agent-bar.d.ts +95 -0
  318. package/dist/modes/interactive/agent-bar.js +248 -0
  319. package/dist/modes/interactive/agent-panels.js +27 -26
  320. package/dist/modes/interactive/agent-transcript.d.ts +47 -0
  321. package/dist/modes/interactive/agent-transcript.js +191 -0
  322. package/dist/modes/interactive/agent-ui.d.ts +36 -1
  323. package/dist/modes/interactive/agent-ui.js +180 -14
  324. package/dist/modes/interactive/agent-view.d.ts +72 -0
  325. package/dist/modes/interactive/agent-view.js +281 -0
  326. package/dist/modes/interactive/approval-dialog.js +46 -34
  327. package/dist/modes/interactive/clipboard-paste.d.ts +2 -2
  328. package/dist/modes/interactive/clipboard-paste.js +9 -4
  329. package/dist/modes/interactive/commands.d.ts +22 -1
  330. package/dist/modes/interactive/commands.js +100 -49
  331. package/dist/modes/interactive/completion.js +2 -1
  332. package/dist/modes/interactive/config-panel.d.ts +70 -0
  333. package/dist/modes/interactive/config-panel.js +319 -0
  334. package/dist/modes/interactive/config-ui.d.ts +96 -0
  335. package/dist/modes/interactive/config-ui.js +397 -0
  336. package/dist/modes/interactive/confirm-dialog.js +6 -7
  337. package/dist/modes/interactive/event-notices.js +11 -9
  338. package/dist/modes/interactive/interactive-mode.d.ts +1 -1
  339. package/dist/modes/interactive/interactive-mode.js +21 -22
  340. package/dist/modes/interactive/key-dispatch.d.ts +12 -0
  341. package/dist/modes/interactive/key-dispatch.js +24 -9
  342. package/dist/modes/interactive/line/line-editor.js +2 -1
  343. package/dist/modes/interactive/line/line-mode.js +18 -7
  344. package/dist/modes/interactive/line/line-render.js +25 -24
  345. package/dist/modes/interactive/memory-panel.d.ts +64 -0
  346. package/dist/modes/interactive/memory-panel.js +221 -0
  347. package/dist/modes/interactive/message-view.d.ts +4 -2
  348. package/dist/modes/interactive/message-view.js +42 -33
  349. package/dist/modes/interactive/model-items.d.ts +45 -0
  350. package/dist/modes/interactive/model-items.js +134 -0
  351. package/dist/modes/interactive/model-picker.d.ts +57 -0
  352. package/dist/modes/interactive/model-picker.js +191 -0
  353. package/dist/modes/interactive/panels.js +39 -31
  354. package/dist/modes/interactive/pickers.d.ts +2 -1
  355. package/dist/modes/interactive/pickers.js +10 -6
  356. package/dist/modes/interactive/plan-command.d.ts +1 -1
  357. package/dist/modes/interactive/plan-command.js +24 -27
  358. package/dist/modes/interactive/plan-dialog.js +18 -17
  359. package/dist/modes/interactive/plan-flow.js +6 -5
  360. package/dist/modes/interactive/rewind-command.d.ts +1 -1
  361. package/dist/modes/interactive/rewind-command.js +18 -16
  362. package/dist/modes/interactive/rewind-flow.d.ts +0 -1
  363. package/dist/modes/interactive/rewind-flow.js +13 -14
  364. package/dist/modes/interactive/rewind-list.js +7 -6
  365. package/dist/modes/interactive/rewind-panel.js +40 -40
  366. package/dist/modes/interactive/rewind-text.d.ts +5 -3
  367. package/dist/modes/interactive/rewind-text.js +48 -38
  368. package/dist/modes/interactive/run-indicator.js +15 -12
  369. package/dist/modes/interactive/session-events.js +3 -2
  370. package/dist/modes/interactive/startup-header.js +22 -23
  371. package/dist/modes/interactive/startup-ui.d.ts +3 -9
  372. package/dist/modes/interactive/startup-ui.js +44 -88
  373. package/dist/modes/interactive/status-area.d.ts +2 -0
  374. package/dist/modes/interactive/status-area.js +8 -2
  375. package/dist/modes/interactive/status-bar.js +4 -3
  376. package/dist/modes/interactive/subagent-view.js +9 -7
  377. package/dist/modes/interactive/tasks-report.d.ts +6 -0
  378. package/dist/modes/interactive/tasks-report.js +28 -31
  379. package/dist/modes/interactive/terminal-setup.d.ts +9 -0
  380. package/dist/modes/interactive/terminal-setup.js +23 -0
  381. package/dist/modes/interactive/tool-summary.js +19 -17
  382. package/dist/modes/interactive/tool-view.js +7 -4
  383. package/dist/modes/interactive/trace-view.d.ts +89 -0
  384. package/dist/modes/interactive/trace-view.js +332 -0
  385. package/dist/modes/print/print-mode.js +14 -15
  386. package/dist/modes/rpc/commands.js +7 -3
  387. package/dist/modes/rpc/rpc-mode.js +9 -3
  388. package/dist/modes/session-report.d.ts +2 -0
  389. package/dist/modes/session-report.js +101 -105
  390. package/dist/modes/startup-ui-text.js +11 -6
  391. package/dist/permissions/bypass.d.ts +8 -10
  392. package/dist/permissions/bypass.js +19 -10
  393. package/dist/permissions/memory-class.d.ts +23 -0
  394. package/dist/permissions/memory-class.js +54 -0
  395. package/dist/permissions/modes.d.ts +3 -3
  396. package/dist/permissions/modes.js +21 -16
  397. package/dist/permissions/pipeline.d.ts +1 -1
  398. package/dist/permissions/pipeline.js +9 -2
  399. package/dist/permissions/preview.js +49 -42
  400. package/dist/permissions/rules.js +5 -2
  401. package/dist/permissions/types.d.ts +4 -0
  402. package/dist/plan/store.js +2 -1
  403. package/dist/rpc.d.ts +39 -1
  404. package/dist/rpc.js +3 -0
  405. package/dist/sandbox/bash.js +11 -8
  406. package/dist/sandbox/detect.js +14 -11
  407. package/dist/sdk.d.ts +17 -1
  408. package/dist/sdk.js +29 -7
  409. package/dist/session/export.js +31 -30
  410. package/dist/session/manager.d.ts +1 -1
  411. package/dist/session/manager.js +5 -3
  412. package/dist/session/reuse.js +5 -4
  413. package/dist/session/scan.js +3 -2
  414. package/dist/session/stats-aggregate.d.ts +3 -1
  415. package/dist/session/stats-aggregate.js +5 -1
  416. package/dist/session/stats-index.js +2 -1
  417. package/dist/session/stats-scan.d.ts +4 -1
  418. package/dist/session/stats-scan.js +6 -2
  419. package/dist/session/store.d.ts +11 -0
  420. package/dist/session/store.js +48 -1
  421. package/dist/session/types.d.ts +2 -0
  422. package/dist/skills/builtin.js +2 -1
  423. package/dist/tools/image-file.d.ts +26 -1
  424. package/dist/tools/image-file.js +55 -13
  425. package/dist/tools/presets.d.ts +14 -1
  426. package/dist/tools/presets.js +3 -3
  427. package/dist/tools/registry.js +1 -1
  428. package/dist/tools/truncate.d.ts +1 -1
  429. package/dist/tools/truncate.js +2 -2
  430. package/dist/tools/types.d.ts +17 -1
  431. package/dist/trace/build-index.d.ts +91 -0
  432. package/dist/trace/build-index.js +127 -0
  433. package/dist/trace/build-nodes.d.ts +24 -0
  434. package/dist/trace/build-nodes.js +279 -0
  435. package/dist/trace/build-util.d.ts +43 -0
  436. package/dist/trace/build-util.js +120 -0
  437. package/dist/trace/build.d.ts +82 -0
  438. package/dist/trace/build.js +382 -0
  439. package/dist/trace/detail.d.ts +35 -0
  440. package/dist/trace/detail.js +205 -0
  441. package/dist/trace/flatten.d.ts +69 -0
  442. package/dist/trace/flatten.js +173 -0
  443. package/dist/trace/format.d.ts +47 -0
  444. package/dist/trace/format.js +329 -0
  445. package/dist/trace/html-template.d.ts +19 -0
  446. package/dist/trace/html-template.js +150 -0
  447. package/dist/trace/html.d.ts +104 -0
  448. package/dist/trace/html.js +292 -0
  449. package/dist/trace/preview.d.ts +29 -0
  450. package/dist/trace/preview.js +59 -0
  451. package/dist/trace/query-session.d.ts +14 -0
  452. package/dist/trace/query-session.js +38 -0
  453. package/dist/trace/query.d.ts +55 -0
  454. package/dist/trace/query.js +188 -0
  455. package/dist/trace/session.d.ts +40 -0
  456. package/dist/trace/session.js +168 -0
  457. package/dist/trace/types.d.ts +243 -0
  458. package/dist/trace/types.js +13 -0
  459. package/dist/tui/components/editor-paste.d.ts +2 -0
  460. package/dist/tui/components/editor-paste.js +6 -3
  461. package/dist/tui/components/editor.js +2 -2
  462. package/dist/tui/components/loader.d.ts +3 -0
  463. package/dist/tui/components/loader.js +14 -0
  464. package/dist/tui/components/select-list.d.ts +2 -0
  465. package/dist/tui/components/select-list.js +7 -0
  466. package/dist/tui/components/settings-list.d.ts +61 -0
  467. package/dist/tui/components/settings-list.js +135 -0
  468. package/dist/tui/keybindings.d.ts +5 -0
  469. package/dist/tui/keybindings.js +17 -5
  470. package/dist/tui.d.ts +1 -0
  471. package/dist/tui.js +2 -0
  472. package/docs/en/host-api.md +167 -0
  473. package/docs/en/permissions.md +214 -0
  474. package/docs/en/providers.md +627 -0
  475. package/docs/en/rpc.md +361 -0
  476. package/docs/en/sessions.md +219 -0
  477. package/docs/en/tui.md +534 -0
  478. package/docs/host-api.md +18 -17
  479. package/docs/memory.md +172 -0
  480. package/docs/permissions.md +2 -2
  481. package/docs/providers.md +73 -1
  482. package/docs/rpc.md +31 -3
  483. package/docs/session-format.md +8 -2
  484. package/docs/sessions.md +29 -1
  485. package/docs/tui.md +140 -4
  486. package/package.json +8 -3
@@ -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>;
@@ -0,0 +1,221 @@
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 { formatBytes } from "../../checkpoints/gc.js";
16
+ import { memoryOf, reloadMemorySection } from "../../cli/compose-memory.js";
17
+ import { msg } from "../../i18n/index.js";
18
+ import { editMemory } from "../../memory/edit.js";
19
+ import { logicalPath } from "../../memory/paths.js";
20
+ import { findOne, isStale, listText, memoryErrorText, runtimeNotes, scopeLabel, scopeSummaries, } from "../../memory/report.js";
21
+ import { Card, wrapTextWithAnsi } from "../../tui.js";
22
+ import { openChoice } from "./confirm-dialog.js";
23
+ import { editExternally } from "./external-editor.js";
24
+ export function parseMemoryArgs(args) {
25
+ const words = args
26
+ .trim()
27
+ .split(/\s+/)
28
+ .filter((w) => w !== "");
29
+ const [sub, ...rest] = words;
30
+ const yes = rest.includes("--yes");
31
+ const name = rest.filter((w) => w !== "--yes").join(" ");
32
+ switch (sub) {
33
+ case undefined:
34
+ case "list":
35
+ return { kind: "list" };
36
+ case "show":
37
+ return name === "" ? { kind: "usage" } : { kind: "show", name };
38
+ case "edit":
39
+ return name === "" ? { kind: "edit" } : { kind: "edit", target: name };
40
+ case "rm":
41
+ return name === "" ? { kind: "usage" } : { kind: "rm", name, yes };
42
+ case "on":
43
+ case "off":
44
+ return rest.length === 0 ? { kind: "writes", on: sub === "on" } : { kind: "usage" };
45
+ case "reload":
46
+ return rest.length === 0 ? { kind: "reload" } : { kind: "usage" };
47
+ default:
48
+ return { kind: "usage" };
49
+ }
50
+ }
51
+ /** 不需要界面能力的动作(两种界面共用);需要编辑器 / 确认框的返回 undefined。 */
52
+ function simpleAction(runtime, session, action) {
53
+ const m = msg().memory.command;
54
+ switch (action.kind) {
55
+ case "usage":
56
+ return m.usage;
57
+ case "writes":
58
+ runtime.writesEnabled = action.on;
59
+ return action.on ? m.writesOn : m.writesOff;
60
+ case "reload":
61
+ return reloadMemorySection(session)?.changed === true ? m.reloaded : m.reloadUnchanged;
62
+ case "show": {
63
+ const found = findOne(runtime.store, action.name);
64
+ if (!found.ok)
65
+ return found.message;
66
+ const text = runtime.store.readRaw(found.entry) ?? "";
67
+ return `${logicalPath(found.entry.scope, found.entry.file)}\n${text.trimEnd()}`;
68
+ }
69
+ default:
70
+ return undefined;
71
+ }
72
+ }
73
+ /** 行式界面(`CommandContext.extra.memory`)。 */
74
+ export async function memoryLineCommand(args, ctx) {
75
+ const m = msg().memory;
76
+ const session = ctx.session();
77
+ const runtime = memoryOf(session);
78
+ if (runtime === undefined)
79
+ return { kind: "handled", message: m.panel.disabled };
80
+ const action = parseMemoryArgs(args);
81
+ const simple = simpleAction(runtime, session, action);
82
+ if (simple !== undefined)
83
+ return { kind: "handled", message: simple };
84
+ if (action.kind === "list")
85
+ return { kind: "handled", message: listText(runtime.store, { notes: runtimeNotes(runtime) }) };
86
+ if (action.kind === "edit")
87
+ return { kind: "handled", message: m.command.lineNoEditor };
88
+ if (action.kind !== "rm")
89
+ return { kind: "handled", message: m.command.usage };
90
+ const found = findOne(runtime.store, action.name);
91
+ if (!found.ok)
92
+ return { kind: "handled", message: found.message };
93
+ if (!action.yes)
94
+ return { kind: "handled", message: m.command.lineNeedsYes(action.name) };
95
+ try {
96
+ return {
97
+ kind: "handled",
98
+ message: m.command.deleted((await runtime.store.remove(found.entry)).path),
99
+ };
100
+ }
101
+ catch (error) {
102
+ return { kind: "handled", message: memoryErrorText(error) };
103
+ }
104
+ }
105
+ /** 按行折行的简单正文组件。 */
106
+ class Lines {
107
+ lines;
108
+ constructor(lines) {
109
+ this.lines = lines;
110
+ }
111
+ render(width) {
112
+ return this.lines.flatMap((line) => (line === "" ? [""] : wrapTextWithAnsi(line, width)));
113
+ }
114
+ invalidate() { }
115
+ }
116
+ /** `/memory` 面板:每个作用域一段,条目一行(名字、说明、更新日期;> 90 天标灰)。 */
117
+ export function memoryListPanel(runtime, theme, now) {
118
+ const m = msg().memory.panel;
119
+ const store = runtime.store;
120
+ const lines = [];
121
+ for (const s of scopeSummaries(store)) {
122
+ if (lines.length > 0)
123
+ lines.push("");
124
+ lines.push(theme.bold(m.scopeLine(`${scopeLabel(s.scope)} ${logicalPath(s.scope)}/`, s.entries.length, formatBytes(s.indexBytes), formatBytes(store.limits.indexMaxBytes))));
125
+ if (s.entries.length === 0)
126
+ lines.push(theme.fg("dim", ` ${m.noEntries}`));
127
+ for (const e of s.entries) {
128
+ const description = e.description === "" ? "" : ` — ${e.description}`;
129
+ const text = ` ${e.name}${description} ${m.entryUpdated(e.updated)}`;
130
+ lines.push(isStale(e, now) ? theme.fg("dim", text) : text);
131
+ }
132
+ if (s.omitted > 0)
133
+ lines.push(theme.fg("warning", ` ${m.truncated(s.omitted)}`));
134
+ }
135
+ for (const note of runtimeNotes(runtime))
136
+ lines.push("", theme.fg("warning", note));
137
+ return new Card(new Lines(lines), { theme, title: m.title, subtitle: m.hint });
138
+ }
139
+ /** 交互界面的 `CommandUi.memoryPanel`。 */
140
+ export function createMemoryPanel(deps) {
141
+ const edit = deps.edit ??
142
+ ((text, name) => editExternally(text, name, {
143
+ env: deps.env,
144
+ suspend: () => deps.suspend(),
145
+ resume: () => deps.resume(),
146
+ }));
147
+ return async (args) => {
148
+ const ui = deps.ui();
149
+ const m = msg().memory;
150
+ const session = ui.session();
151
+ const runtime = memoryOf(session);
152
+ if (runtime === undefined)
153
+ return ui.notice("info", m.panel.disabled);
154
+ const action = parseMemoryArgs(args);
155
+ const theme = ui.theme?.();
156
+ if (action.kind === "list") {
157
+ if (ui.panel !== undefined && theme !== undefined)
158
+ return ui.panel(memoryListPanel(runtime, theme, ui.now()));
159
+ return ui.notice("info", listText(runtime.store, { notes: runtimeNotes(runtime) }));
160
+ }
161
+ if (action.kind === "show" && ui.panel !== undefined && theme !== undefined) {
162
+ const found = findOne(runtime.store, action.name);
163
+ if (!found.ok)
164
+ return ui.notice("warn", found.message);
165
+ const body = (runtime.store.readRaw(found.entry) ?? "").trimEnd().split("\n");
166
+ const title = logicalPath(found.entry.scope, found.entry.file);
167
+ return ui.panel(new Card(new Lines(body), { theme, title }));
168
+ }
169
+ const simple = simpleAction(runtime, session, action);
170
+ if (simple !== undefined)
171
+ return ui.notice("info", simple);
172
+ try {
173
+ if (action.kind === "edit") {
174
+ const outcome = await editMemory(runtime.store, action.target, edit);
175
+ if (outcome.status === "saved")
176
+ return ui.notice("info", m.command.saved(outcome.path));
177
+ if (outcome.status === "not_found")
178
+ return ui.notice("warn", outcome.message);
179
+ return ui.notice("info", outcome.status === "cancelled" ? m.command.editCancelled : m.command.unchanged);
180
+ }
181
+ if (action.kind !== "rm")
182
+ return ui.notice("info", m.command.usage);
183
+ const found = findOne(runtime.store, action.name);
184
+ if (!found.ok)
185
+ return ui.notice("warn", found.message);
186
+ const path = logicalPath(found.entry.scope, found.entry.file);
187
+ const choice = action.yes
188
+ ? 0
189
+ : await openChoice(deps.choice, {
190
+ title: m.command.confirmTitle,
191
+ body: [path],
192
+ options: [
193
+ { label: m.command.confirmDelete, keys: "y" },
194
+ { label: m.command.confirmCancel, keys: "n Esc" },
195
+ ],
196
+ selected: 1,
197
+ borderColor: "warning",
198
+ });
199
+ if (choice !== 0)
200
+ return;
201
+ await runtime.store.remove(found.entry);
202
+ ui.notice("info", m.command.deleted(path));
203
+ }
204
+ catch (error) {
205
+ ui.notice("error", memoryErrorText(error));
206
+ }
207
+ };
208
+ }
209
+ /** interactive-mode.ts 的一行装配(编辑器期间停掉 TUI,回来整屏重画)。 */
210
+ export function memoryPanelFor(ui, choice, tui, env) {
211
+ return createMemoryPanel({
212
+ ui,
213
+ choice,
214
+ env,
215
+ suspend: () => tui.stop(),
216
+ resume: () => {
217
+ tui.start();
218
+ tui.forceFullRedraw();
219
+ },
220
+ });
221
+ }
@@ -35,8 +35,8 @@ export interface MessageViewOptions {
35
35
  export declare function exitSummaryLines(stats: Pick<SessionStats, "sessionId" | "sessionFile" | "userMessages" | "tokens" | "cost" | "cache" | "cacheHitRate">, elapsedMs: number, theme: Theme): string[];
36
36
  /** 思考块展开时的正文行数上限(`full` 不限)。 */
37
37
  export declare const THINKING_EXPANDED_LINES = 60;
38
- /** origin → 中文标签(未知 origin 原样显示)。 */
39
- export declare const ORIGIN_LABELS: Readonly<Record<string, string>>;
38
+ /** origin → 界面语言的标签(未知 origin 原样显示)。 */
39
+ export declare function originLabel(origin: string): string;
40
40
  /** 首行带前缀、续行按 `indent` 缩进的文本(用户消息、排队消息)。 */
41
41
  export declare class PrefixedText implements Component {
42
42
  private readonly prefix;
@@ -80,6 +80,8 @@ export declare class MessageView extends Container {
80
80
  private thinkingExpanded;
81
81
  constructor(options: MessageViewOptions);
82
82
  private get theme();
83
+ /** [W6-S] `/config` 热应用:之后渲染的块按新选项(共享同一个 options 对象)。 */
84
+ setOptions(options: Partial<Omit<MessageViewOptions, "theme">>): void;
83
85
  /** 追加一块(与上一块之间空一行;`compact` 不空行)。 */
84
86
  add(component: Component): void;
85
87
  /** 追加工具调用块:紧跟在另一个工具调用后面时不空行。 */