@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
@@ -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
  /** 追加工具调用块:紧跟在另一个工具调用后面时不空行。 */
@@ -14,27 +14,28 @@
14
14
  *
15
15
  * 滚动交给终端回滚:消息区只追加,切换会话时整体清空重画。
16
16
  */
17
+ import { msg } from "../../i18n/index.js";
17
18
  import { Card, Container, Markdown, Spacer, Text, visibleWidth, wrapTextWithAnsi, } from "../../tui.js";
18
19
  import { formatCost, formatTokens } from "./status-bar.js";
19
20
  import { notificationSummary } from "./subagent-view.js";
20
21
  import { PLAN_APPROVED_PROMPT } from "../../plan/prompts.js";
21
22
  /** 退出摘要的时长:不足 1 分钟按秒,否则按分钟。 */
22
23
  function sessionDuration(ms) {
23
- const seconds = Math.max(0, Math.round(ms / 1000));
24
- return seconds < 60 ? `${seconds} 秒` : `${Math.round(seconds / 60)} 分钟`;
24
+ return msg().interactive.view.message.duration(Math.max(0, Math.round(ms / 1000)));
25
25
  }
26
26
  /**
27
27
  * 退出摘要(§3.14):`─ 会话 <id> · 时长 · N 回合 · ↑in ↓out · cache x% · $y(重计费 $z)` 与
28
28
  * ` 恢复:ama --resume <id>`。整体 dim,会话 id 与恢复命令正文色;0 回合只到「回合」;会话没落盘不给恢复行。
29
29
  */
30
30
  export function exitSummaryLines(stats, elapsedMs, theme) {
31
+ const m = msg().interactive.view.message;
31
32
  const g = theme.glyphs;
32
33
  const dim = (s) => theme.fg("dim", s);
33
34
  const id = stats.sessionId.slice(0, 8);
34
35
  const parts = [
35
- dim(`${g.rule} 会话 `) + theme.fg("text", id),
36
+ dim(m.sessionPrefix(g.rule)) + theme.fg("text", id),
36
37
  dim(sessionDuration(elapsedMs)),
37
- dim(`${stats.userMessages} 回合`),
38
+ dim(m.turns(stats.userMessages)),
38
39
  ];
39
40
  const t = stats.tokens;
40
41
  const prompt = t.input + t.cacheRead + t.cacheWrite;
@@ -45,28 +46,23 @@ export function exitSummaryLines(stats, elapsedMs, theme) {
45
46
  parts.push(dim(`cache ${Math.round(rate * 100)}%`));
46
47
  if (stats.cost !== undefined && stats.cost > 0) {
47
48
  const rebill = stats.cache?.reBilledUsd;
48
- const extra = rebill !== undefined && rebill > 0 ? `(重计费 ${formatCost(rebill)})` : "";
49
+ const extra = rebill !== undefined && rebill > 0 ? m.rebill(formatCost(rebill)) : "";
49
50
  parts.push(dim(formatCost(stats.cost) + extra));
50
51
  }
51
52
  }
52
53
  const lines = [parts.join(dim(" · "))];
53
54
  if (stats.userMessages > 0 && stats.sessionFile !== undefined) {
54
- lines.push(dim(" 恢复:") + theme.fg("text", `ama --resume ${id}`));
55
+ lines.push(dim(m.resume) + theme.fg("text", `ama --resume ${id}`));
55
56
  }
56
57
  return lines;
57
58
  }
58
59
  /** 思考块展开时的正文行数上限(`full` 不限)。 */
59
60
  export const THINKING_EXPANDED_LINES = 60;
60
- /** origin → 中文标签(未知 origin 原样显示)。 */
61
- export const ORIGIN_LABELS = {
62
- steer: "插话",
63
- followUp: "之后",
64
- host: "宿主",
65
- task: "子 Agent 通知",
66
- plan: "计划",
67
- };
68
- /** [W5-U] origin 为 plan 的交接消息(给模型的英文开场)在消息区的说法。 */
69
- const PLAN_HANDOFF_TEXT = "按批准的计划开始执行";
61
+ /** origin → 界面语言的标签(未知 origin 原样显示)。 */
62
+ export function originLabel(origin) {
63
+ const labels = msg().interactive.view.message.origin;
64
+ return labels[origin] ?? origin;
65
+ }
70
66
  /** 首行带前缀、续行按 `indent` 缩进的文本(用户消息、排队消息)。 */
71
67
  export class PrefixedText {
72
68
  prefix;
@@ -135,9 +131,10 @@ class ThinkingView {
135
131
  const t = this.theme;
136
132
  const g = t.glyphs;
137
133
  const style = (s) => t.fg("dim", t.italic(s));
134
+ const m = msg().interactive.view.message;
138
135
  const title = this.streaming
139
- ? `${g.thinking} 思考中${g.ellipsis}`
140
- : `${g.thinking} 思考 · ${formatTokens(this.tokens)} token`;
136
+ ? m.thinkingStreaming(g.thinking, g.ellipsis)
137
+ : m.thinking(g.thinking, formatTokens(this.tokens));
141
138
  const lines = [
142
139
  style(title) + (this.open && !this.streaming ? " " + t.fg("dim", g.collapse) : ""),
143
140
  ];
@@ -150,7 +147,7 @@ class ThinkingView {
150
147
  for (const line of all.slice(0, limit))
151
148
  lines.push(" " + t.fg("muted", t.italic(line)));
152
149
  if (all.length > limit) {
153
- lines.push(" " + t.fg("dim", `${g.ellipsis} 另 ${all.length - limit} 行`));
150
+ lines.push(" " + t.fg("dim", m.moreLines(g.ellipsis, all.length - limit)));
154
151
  }
155
152
  }
156
153
  this.cache = { width, lines };
@@ -173,7 +170,11 @@ export function contentText(content) {
173
170
  if (typeof content === "string")
174
171
  return content;
175
172
  return content
176
- .map((block) => (block.type === "text" ? block.text : block.type === "image" ? "[图片]" : ""))
173
+ .map((block) => block.type === "text"
174
+ ? block.text
175
+ : block.type === "image"
176
+ ? msg().interactive.view.message.image
177
+ : "")
177
178
  .join("");
178
179
  }
179
180
  /** 一条助手消息:按内容块(思考 / 文本)同步子组件;工具调用块由 tool-view 单独显示。 */
@@ -247,14 +248,15 @@ export class AssistantView extends Container {
247
248
  finish(message) {
248
249
  this.streaming = false;
249
250
  const { theme } = this.options;
251
+ const m = msg().interactive.view.message;
250
252
  if (message.stopReason === "error") {
251
- this.status.setText(theme.fg("error", `${theme.glyphs.fail} ${message.errorMessage ?? "模型调用失败"}`));
253
+ this.status.setText(theme.fg("error", `${theme.glyphs.fail} ${message.errorMessage ?? m.modelError}`));
252
254
  }
253
255
  else if (message.stopReason === "aborted") {
254
- this.status.setText(theme.fg("dim", "已中断"));
256
+ this.status.setText(theme.fg("dim", m.interrupted));
255
257
  }
256
258
  else if (message.stopReason === "length") {
257
- this.status.setText(theme.fg("warning", "输出达到长度上限"));
259
+ this.status.setText(theme.fg("warning", m.lengthLimit));
258
260
  }
259
261
  this.update(message);
260
262
  }
@@ -285,6 +287,10 @@ export class MessageView extends Container {
285
287
  get theme() {
286
288
  return this.options.theme;
287
289
  }
290
+ /** [W6-S] `/config` 热应用:之后渲染的块按新选项(共享同一个 options 对象)。 */
291
+ setOptions(options) {
292
+ Object.assign(this.options, options);
293
+ }
288
294
  /** 追加一块(与上一块之间空一行;`compact` 不空行)。 */
289
295
  add(component) {
290
296
  this.push(component, this.options.compact !== true);
@@ -350,12 +356,12 @@ export class MessageView extends Container {
350
356
  this.add(new PrefixedText(t.fg("user", t.bold(t.glyphs.prompt)) + " ", text));
351
357
  return;
352
358
  }
353
- const label = ORIGIN_LABELS[origin] ?? origin;
359
+ const label = originLabel(origin);
354
360
  // [W5-U] 后台子 Agent 的 <task-notification> 是给模型的全文,消息区只留一行
355
361
  const summary = origin === "task"
356
362
  ? notificationSummary(text)
357
363
  : origin === "plan" && text === PLAN_APPROVED_PROMPT
358
- ? PLAN_HANDOFF_TEXT
364
+ ? msg().interactive.view.message.planHandoff
359
365
  : undefined;
360
366
  if (summary !== undefined) {
361
367
  this.add(new PrefixedText(t.fg("dim", t.glyphs.queued) + " " + t.fg("muted", `${label} `), t.fg("muted", summary)));
@@ -398,23 +404,24 @@ export class MessageView extends Container {
398
404
  }
399
405
  addHookBlocked(reason) {
400
406
  const glyph = this.theme.glyphs.blocked;
401
- this.add(new Text(this.theme.fg("warning", `${glyph} Hook 阻止:${reason}`)));
407
+ this.add(new Text(this.theme.fg("warning", msg().interactive.view.message.hookBlocked(glyph, reason))));
402
408
  }
403
409
  addRetry(attempt, maxAttempts, delayMs, error) {
404
410
  const seconds = Math.max(1, Math.round(delayMs / 1000));
405
411
  const glyph = this.theme.glyphs.retry;
406
- this.add(new Text(this.theme.fg("warning", `${glyph} 重试 ${attempt}/${maxAttempts}(${seconds}s 后):${error}`)));
412
+ this.add(new Text(this.theme.fg("warning", msg().interactive.view.message.retry(glyph, attempt, maxAttempts, seconds, error))));
407
413
  }
408
414
  /** 退出前追加的会话摘要(留在终端回滚里)。 */
409
415
  addExitSummary(lines) {
410
416
  this.add(new Text(lines.join("\n")));
411
417
  }
412
418
  addRetryFailed(error) {
413
- this.addNotice("error", `重试失败${error !== undefined ? `:${error}` : ""}`);
419
+ this.addNotice("error", msg().interactive.view.message.retryFailed(error));
414
420
  }
415
421
  /** 压缩 / 分支摘要卡(左竖条):标题 + token 变化(有则显示)+ 摘要前 3 行。 */
416
422
  addSummaryCard(summary, options = {}) {
417
423
  const t = this.theme;
424
+ const m = msg().interactive.view.message;
418
425
  const lines = summary
419
426
  .trim()
420
427
  .split("\n")
@@ -422,16 +429,16 @@ export class MessageView extends Container {
422
429
  const head = lines.slice(0, 3);
423
430
  const body = head.map((l) => t.fg("muted", l));
424
431
  if (lines.length > head.length) {
425
- body.push(t.fg("dim", `${t.glyphs.ellipsis} 另 ${lines.length - head.length} 行`));
432
+ body.push(t.fg("dim", m.moreLines(t.glyphs.ellipsis, lines.length - head.length)));
426
433
  }
427
434
  let subtitle;
428
435
  if (options.tokensBefore !== undefined) {
429
- const after = options.tokensAfter !== undefined ? ` → ${formatTokens(options.tokensAfter)}` : "";
430
- subtitle = `${formatTokens(options.tokensBefore)}${after} token`;
436
+ const after = options.tokensAfter !== undefined ? formatTokens(options.tokensAfter) : undefined;
437
+ subtitle = m.summaryTokens(formatTokens(options.tokensBefore), after);
431
438
  }
432
439
  this.add(new Card(new Text(body.join("\n")), {
433
440
  theme: t,
434
- title: options.title ?? "上下文已压缩",
441
+ title: options.title ?? m.compacted,
435
442
  ...(subtitle !== undefined ? { subtitle } : {}),
436
443
  }));
437
444
  }
@@ -471,7 +478,9 @@ export class MessageView extends Container {
471
478
  this.addSummaryCard(message.summary, { tokensBefore: message.tokensBefore });
472
479
  break;
473
480
  case "branchSummary":
474
- this.addSummaryCard(message.summary, { title: "分支摘要" });
481
+ this.addSummaryCard(message.summary, {
482
+ title: msg().interactive.view.message.branchSummary,
483
+ });
475
484
  break;
476
485
  case "custom":
477
486
  if (message.display)
@@ -8,7 +8,8 @@
8
8
  * - `/permissions`:权限模式、判定顺序(折行对齐值列)、规则(allow success、deny error、来源 dim)、
9
9
  * 最近的 auto 判定。
10
10
  */
11
- import { AUTO_LAYER_TEXT, permissionModeLabel } from "../../permissions/modes.js";
11
+ import { msg } from "../../i18n/index.js";
12
+ import { autoLayerText, permissionModeLabel } from "../../permissions/modes.js";
12
13
  import { Card, KeyValue, Meter, } from "../../tui.js";
13
14
  import { cacheRows, externalRows, formatTokenCount, formatUsd, taskStatsText, } from "../session-report.js";
14
15
  import { tildePath } from "../../cli/startup-screen.js";
@@ -49,9 +50,13 @@ export function keyValue(rows, theme, wrap = false) {
49
50
  return new KeyValue(rows, { theme, maxKeyRatio: 0.3, ...(wrap ? { wrap: true } : {}) });
50
51
  }
51
52
  function cacheSection(session, theme, now) {
52
- return [theme.bold("缓存"), new Indent(keyValue(cacheRows(session, now), theme), 2)];
53
+ return [
54
+ theme.bold(msg().panels.cache.title),
55
+ new Indent(keyValue(cacheRows(session, now), theme), 2),
56
+ ];
53
57
  }
54
58
  export function sessionPanel(session, theme, options = {}) {
59
+ const m = msg().panels.session;
55
60
  const now = options.now ?? Date.now();
56
61
  const state = session.state;
57
62
  const stats = session.getStats();
@@ -67,41 +72,41 @@ export function sessionPanel(session, theme, options = {}) {
67
72
  `${stats.contextWindow === undefined ? "?" : formatTokenCount(stats.contextWindow)}`;
68
73
  const rows = [
69
74
  {
70
- key: "模型",
75
+ key: m.model,
71
76
  value: theme.fg("accent", model) +
72
77
  sep +
73
- `思考 ${state.thinkingLevel}` +
78
+ m.thinking(state.thinkingLevel) +
74
79
  sep +
75
- `权限 ${permissionModeLabel(state.permissionMode)}`,
80
+ m.permission(permissionModeLabel(state.permissionMode)),
76
81
  },
77
82
  {
78
- key: "消息",
83
+ key: m.messages,
79
84
  value: [
80
- `用户 ${stats.userMessages}`,
81
- `助手 ${stats.assistantMessages}`,
82
- `工具调用 ${stats.toolCalls}`,
85
+ m.user(stats.userMessages),
86
+ m.assistant(stats.assistantMessages),
87
+ m.toolCalls(stats.toolCalls),
83
88
  ].join(sep),
84
89
  },
85
90
  {
86
- key: "用量",
91
+ key: m.usage,
87
92
  value: [
88
- `输入 ${formatTokenCount(t.input)}`,
89
- `输出 ${formatTokenCount(t.output)}`,
90
- `缓存读 ${formatTokenCount(t.cacheRead)}`,
91
- `缓存写 ${formatTokenCount(t.cacheWrite)}`,
93
+ m.input(formatTokenCount(t.input)),
94
+ m.output(formatTokenCount(t.output)),
95
+ m.cacheRead(formatTokenCount(t.cacheRead)),
96
+ m.cacheWrite(formatTokenCount(t.cacheWrite)),
92
97
  formatUsd(stats.cost),
93
98
  ].join(sep),
94
99
  },
95
- { key: "上下文", value: meter + window },
100
+ { key: m.context, value: meter + window },
96
101
  ];
97
102
  const tasks = taskStatsText(session);
98
103
  if (tasks !== undefined)
99
- rows.push({ key: "子 Agent", value: tasks });
104
+ rows.push({ key: m.subagents, value: tasks });
100
105
  const external = externalRows(session);
101
106
  const externalSection = external.length > 0
102
- ? ["", theme.bold("外部 Agent"), new Indent(keyValue(external, theme), 2)]
107
+ ? ["", theme.bold(m.external), new Indent(keyValue(external, theme), 2)]
103
108
  : [];
104
- const file = state.sessionFile === undefined ? "未落盘" : tildePath(state.sessionFile, options.home);
109
+ const file = state.sessionFile === undefined ? m.notSaved : tildePath(state.sessionFile, options.home);
105
110
  const parts = [
106
111
  keyValue(rows, theme),
107
112
  "",
@@ -110,12 +115,15 @@ export function sessionPanel(session, theme, options = {}) {
110
115
  ];
111
116
  return new Card(new Stack(parts), {
112
117
  theme,
113
- title: `会话 ${state.sessionId.slice(0, 8)}`,
118
+ title: m.title(state.sessionId.slice(0, 8)),
114
119
  subtitle: file,
115
120
  });
116
121
  }
117
122
  export function cachePanel(session, theme, now = Date.now()) {
118
- return new Card(keyValue(cacheRows(session, now), theme), { theme, title: "缓存" });
123
+ return new Card(keyValue(cacheRows(session, now), theme), {
124
+ theme,
125
+ title: msg().panels.cache.title,
126
+ });
119
127
  }
120
128
  const DECISION_COLOR = {
121
129
  allow: "success",
@@ -123,20 +131,20 @@ const DECISION_COLOR = {
123
131
  ask: "warning",
124
132
  };
125
133
  export function permissionsPanel(runtime, session, theme) {
134
+ const m = msg().panels.permissions;
126
135
  const rules = runtime.permission.rules;
127
136
  const mode = session.state.permissionMode;
128
- const order = mode === "auto"
129
- ? "deny 规则 → Hook deny → 危险命令确认 → 规则层(受保护路径、项目外写入、网络、删除类)→ Hook ask → allow 规则 / Hook allow / 本会话记忆 → 静态判定(只读、项目内写入、安全名单)→ 模型分类器 → 询问"
130
- : mode === "allowlist"
131
- ? "deny 规则 → Hook deny → 危险命令(拒绝)→ 只读工具 / allow 规则 / Hook allow 放行 → 其余拒绝(从不询问)"
132
- : "deny 规则 → Hook deny → 危险命令确认 → 权限模式 → allow 规则 / Hook allow / 本会话记忆 → 询问";
137
+ const order = mode === "auto" ? m.orderAuto : mode === "allowlist" ? m.orderAllowlist : m.orderDefault;
133
138
  const effect = (decision) => theme.fg(DECISION_COLOR[decision] ?? "text", decision.padEnd(5));
134
139
  const parts = [
135
140
  keyValue([
136
- { key: "权限模式", value: `${permissionModeLabel(mode)}${theme.fg("dim", `(${mode})`)}` },
137
- { key: "判定顺序", value: order },
141
+ {
142
+ key: m.mode,
143
+ value: m.modeValue(permissionModeLabel(mode), mode, (t) => theme.fg("dim", t)),
144
+ },
145
+ { key: m.order, value: order },
138
146
  ], theme, true),
139
- theme.bold(rules.length === 0 ? "规则(无)" : `规则(${rules.length})`),
147
+ theme.bold(rules.length === 0 ? m.rulesNone : m.rules(rules.length)),
140
148
  ];
141
149
  if (rules.length > 0) {
142
150
  parts.push(new Indent(keyValue(rules.map((r) => ({
@@ -146,11 +154,11 @@ export function permissionsPanel(runtime, session, theme) {
146
154
  }
147
155
  const recent = runtime.permission.autoDecisions?.() ?? [];
148
156
  if (recent.length > 0) {
149
- parts.push(theme.bold(`最近的 auto 判定(${recent.length})`));
157
+ parts.push(theme.bold(m.recentAuto(recent.length)));
150
158
  parts.push(new Indent(keyValue(recent.map((d) => ({
151
- key: AUTO_LAYER_TEXT[d.layer],
159
+ key: autoLayerText(d.layer),
152
160
  value: `${effect(d.decision)} ${d.toolName} ${d.summary} — ${d.reason}` +
153
- (d.cached === true ? theme.fg("dim", "(缓存)") : ""),
161
+ (d.cached === true ? theme.fg("dim", m.cached) : ""),
154
162
  })), theme), 2));
155
163
  }
156
164
  return new Card(new Stack(parts), { theme });
@@ -39,7 +39,8 @@ export interface PickerSpec {
39
39
  /** 框内上下留白行数。 */
40
40
  paddingY?: number;
41
41
  }
42
- export declare const PICKER_FOOTER = "\u2191\u2193 \u9009\u62E9 \u00B7 Enter \u786E\u8BA4 \u00B7 Esc \u53D6\u6D88";
42
+ /** 列表下的缺省按键提示(`arrows` 缺省 `↑↓`)。 */
43
+ export declare function pickerFooter(arrows?: string): string;
43
44
  /** 打开一个居中选择器;Enter 返回选中项,Esc / Ctrl+C 返回 undefined。 */
44
45
  export declare function openPicker(host: PickerHost, spec: PickerSpec): Promise<SelectItem | undefined>;
45
46
  /**