@armadra/agent 0.5.0 → 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 (471) hide show
  1. package/CHANGELOG.md +177 -294
  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 +28307 -13241
  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.d.ts +58 -0
  103. package/dist/cli/choice-prompt.js +142 -0
  104. package/dist/cli/codemode-notice.js +2 -2
  105. package/dist/cli/compose-agents.js +2 -1
  106. package/dist/cli/compose-extensions.js +2 -0
  107. package/dist/cli/compose-memory.d.ts +53 -0
  108. package/dist/cli/compose-memory.js +127 -0
  109. package/dist/cli/compose-providers.d.ts +5 -0
  110. package/dist/cli/compose-providers.js +32 -2
  111. package/dist/cli/compose-session.d.ts +5 -0
  112. package/dist/cli/compose-session.js +27 -13
  113. package/dist/cli/compose-store.d.ts +2 -0
  114. package/dist/cli/compose-store.js +9 -5
  115. package/dist/cli/compose.d.ts +2 -0
  116. package/dist/cli/compose.js +13 -5
  117. package/dist/cli/default-model.d.ts +0 -2
  118. package/dist/cli/default-model.js +5 -8
  119. package/dist/cli/deps.d.ts +5 -1
  120. package/dist/cli/exit-codes.d.ts +1 -1
  121. package/dist/cli/exit-codes.js +7 -16
  122. package/dist/cli/from-prompt.js +3 -2
  123. package/dist/cli/help-text.d.ts +2 -1
  124. package/dist/cli/help-text.js +5 -99
  125. package/dist/cli/main.d.ts +5 -0
  126. package/dist/cli/main.js +21 -2
  127. package/dist/cli/proxy.js +14 -9
  128. package/dist/cli/runtime.d.ts +5 -0
  129. package/dist/cli/startup-screen.js +20 -27
  130. package/dist/cli/startup-steps.js +6 -8
  131. package/dist/cli/subcommands/auth.d.ts +6 -3
  132. package/dist/cli/subcommands/auth.js +52 -22
  133. package/dist/cli/subcommands/config-set.d.ts +21 -0
  134. package/dist/cli/subcommands/config-set.js +137 -0
  135. package/dist/cli/subcommands/config.d.ts +2 -1
  136. package/dist/cli/subcommands/config.js +51 -37
  137. package/dist/cli/subcommands/doctor.d.ts +2 -1
  138. package/dist/cli/subcommands/doctor.js +97 -58
  139. package/dist/cli/subcommands/init.d.ts +1 -1
  140. package/dist/cli/subcommands/init.js +8 -7
  141. package/dist/cli/subcommands/memory.d.ts +18 -0
  142. package/dist/cli/subcommands/memory.js +189 -0
  143. package/dist/cli/subcommands/model-meta.js +11 -9
  144. package/dist/cli/subcommands/models-cache-probe.d.ts +1 -1
  145. package/dist/cli/subcommands/models-cache-probe.js +26 -32
  146. package/dist/cli/subcommands/models-discover.d.ts +3 -0
  147. package/dist/cli/subcommands/models-discover.js +44 -21
  148. package/dist/cli/subcommands/models.d.ts +1 -1
  149. package/dist/cli/subcommands/models.js +29 -22
  150. package/dist/cli/subcommands/probe-runner.js +8 -7
  151. package/dist/cli/subcommands/providers-list.js +32 -21
  152. package/dist/cli/subcommands/providers-plan.js +24 -25
  153. package/dist/cli/subcommands/providers-probe.js +5 -6
  154. package/dist/cli/subcommands/providers.d.ts +2 -2
  155. package/dist/cli/subcommands/providers.js +48 -59
  156. package/dist/cli/subcommands/sessions-export.d.ts +1 -1
  157. package/dist/cli/subcommands/sessions-export.js +10 -9
  158. package/dist/cli/subcommands/sessions-search.d.ts +1 -1
  159. package/dist/cli/subcommands/sessions-search.js +11 -10
  160. package/dist/cli/subcommands/sessions-trace.d.ts +30 -0
  161. package/dist/cli/subcommands/sessions-trace.js +156 -0
  162. package/dist/cli/subcommands/sessions.d.ts +4 -3
  163. package/dist/cli/subcommands/sessions.js +40 -37
  164. package/dist/cli/subcommands/stats.d.ts +1 -1
  165. package/dist/cli/subcommands/stats.js +49 -30
  166. package/dist/cli/system-prompt-arg.js +3 -2
  167. package/dist/codemode/capability.js +3 -2
  168. package/dist/compaction/post-compact.d.ts +1 -0
  169. package/dist/compaction/post-compact.js +15 -1
  170. package/dist/compaction/prune-tier.d.ts +1 -1
  171. package/dist/compaction/prune-tier.js +3 -3
  172. package/dist/compaction/serialize.js +2 -1
  173. package/dist/config/auth-file.d.ts +12 -2
  174. package/dist/config/auth-file.js +32 -10
  175. package/dist/config/checker.js +12 -11
  176. package/dist/config/context-files.js +3 -2
  177. package/dist/config/edit.d.ts +106 -0
  178. package/dist/config/edit.js +350 -0
  179. package/dist/config/init.d.ts +4 -3
  180. package/dist/config/init.js +10 -18
  181. package/dist/config/json-schema.d.ts +2 -1
  182. package/dist/config/json-schema.js +101 -68
  183. package/dist/config/key-docs.d.ts +18 -7
  184. package/dist/config/key-docs.js +43 -128
  185. package/dist/config/load.js +7 -6
  186. package/dist/config/merge.d.ts +4 -1
  187. package/dist/config/merge.js +42 -22
  188. package/dist/config/paths.js +6 -5
  189. package/dist/config/profile.d.ts +5 -1
  190. package/dist/config/profile.js +7 -2
  191. package/dist/config/schema-w5.js +3 -2
  192. package/dist/config/schema-w6.d.ts +19 -0
  193. package/dist/config/schema-w6.js +115 -0
  194. package/dist/config/schema.js +34 -20
  195. package/dist/config/settings-registry.d.ts +78 -0
  196. package/dist/config/settings-registry.js +184 -0
  197. package/dist/config/types-w6.d.ts +109 -0
  198. package/dist/config/types-w6.js +19 -0
  199. package/dist/config/types.d.ts +11 -8
  200. package/dist/config/types.js +1 -0
  201. package/dist/drivers/acp/client.js +1 -1
  202. package/dist/drivers/acp/driver.js +13 -8
  203. package/dist/drivers/agents.js +4 -3
  204. package/dist/drivers/base.js +3 -2
  205. package/dist/drivers/host-runners.js +2 -1
  206. package/dist/drivers/native/claude-stream.js +12 -11
  207. package/dist/drivers/native/codex-app-server.js +17 -12
  208. package/dist/drivers/native/oneshot.js +8 -7
  209. package/dist/drivers/pool.js +1 -1
  210. package/dist/drivers/runner.d.ts +3 -1
  211. package/dist/drivers/runner.js +68 -20
  212. package/dist/drivers/turn.js +1 -1
  213. package/dist/hooks/config.js +3 -2
  214. package/dist/hooks/protocol.js +18 -12
  215. package/dist/host/api-impl.js +11 -10
  216. package/dist/host/loader.js +9 -8
  217. package/dist/host/types.d.ts +3 -0
  218. package/dist/i18n/catalog.d.ts +2169 -0
  219. package/dist/i18n/catalog.js +72 -0
  220. package/dist/i18n/format.d.ts +21 -0
  221. package/dist/i18n/format.js +58 -0
  222. package/dist/i18n/index.d.ts +58 -0
  223. package/dist/i18n/index.js +72 -0
  224. package/dist/i18n/messages/agents.d.ts +84 -0
  225. package/dist/i18n/messages/agents.js +85 -0
  226. package/dist/i18n/messages/approval.d.ts +99 -0
  227. package/dist/i18n/messages/approval.js +100 -0
  228. package/dist/i18n/messages/auth.d.ts +187 -0
  229. package/dist/i18n/messages/auth.js +189 -0
  230. package/dist/i18n/messages/cli-args.d.ts +46 -0
  231. package/dist/i18n/messages/cli-args.js +46 -0
  232. package/dist/i18n/messages/cli-help.d.ts +12 -0
  233. package/dist/i18n/messages/cli-help.js +244 -0
  234. package/dist/i18n/messages/cli.d.ts +336 -0
  235. package/dist/i18n/messages/cli.js +311 -0
  236. package/dist/i18n/messages/config-keys.d.ts +289 -0
  237. package/dist/i18n/messages/config-keys.js +292 -0
  238. package/dist/i18n/messages/config.d.ts +502 -0
  239. package/dist/i18n/messages/config.js +239 -0
  240. package/dist/i18n/messages/drivers.d.ts +123 -0
  241. package/dist/i18n/messages/drivers.js +124 -0
  242. package/dist/i18n/messages/errors.d.ts +83 -0
  243. package/dist/i18n/messages/errors.js +171 -0
  244. package/dist/i18n/messages/interactive-line.d.ts +61 -0
  245. package/dist/i18n/messages/interactive-line.js +69 -0
  246. package/dist/i18n/messages/interactive-startup.d.ts +103 -0
  247. package/dist/i18n/messages/interactive-startup.js +104 -0
  248. package/dist/i18n/messages/interactive-view.d.ts +140 -0
  249. package/dist/i18n/messages/interactive-view.js +141 -0
  250. package/dist/i18n/messages/interactive.d.ts +493 -0
  251. package/dist/i18n/messages/interactive.js +248 -0
  252. package/dist/i18n/messages/memory.d.ts +123 -0
  253. package/dist/i18n/messages/memory.js +128 -0
  254. package/dist/i18n/messages/panels.d.ts +190 -0
  255. package/dist/i18n/messages/panels.js +189 -0
  256. package/dist/i18n/messages/permissions.d.ts +126 -0
  257. package/dist/i18n/messages/permissions.js +151 -0
  258. package/dist/i18n/messages/plan.d.ts +123 -0
  259. package/dist/i18n/messages/plan.js +124 -0
  260. package/dist/i18n/messages/print.d.ts +86 -0
  261. package/dist/i18n/messages/print.js +91 -0
  262. package/dist/i18n/messages/report.d.ts +391 -0
  263. package/dist/i18n/messages/report.js +490 -0
  264. package/dist/i18n/messages/rewind.d.ts +198 -0
  265. package/dist/i18n/messages/rewind.js +217 -0
  266. package/dist/i18n/messages/session.d.ts +230 -0
  267. package/dist/i18n/messages/session.js +258 -0
  268. package/dist/i18n/messages/settings.d.ts +348 -0
  269. package/dist/i18n/messages/settings.js +336 -0
  270. package/dist/i18n/messages/subcommands-config.d.ts +111 -0
  271. package/dist/i18n/messages/subcommands-config.js +127 -0
  272. package/dist/i18n/messages/subcommands.d.ts +548 -0
  273. package/dist/i18n/messages/subcommands.js +474 -0
  274. package/dist/i18n/messages/trace.d.ts +243 -0
  275. package/dist/i18n/messages/trace.js +238 -0
  276. package/dist/i18n/types.d.ts +15 -0
  277. package/dist/i18n/types.js +7 -0
  278. package/dist/index.d.ts +6 -0
  279. package/dist/index.js +2 -0
  280. package/dist/memory/edit.d.ts +24 -0
  281. package/dist/memory/edit.js +63 -0
  282. package/dist/memory/frontmatter.d.ts +37 -0
  283. package/dist/memory/frontmatter.js +79 -0
  284. package/dist/memory/index.d.ts +28 -0
  285. package/dist/memory/index.js +126 -0
  286. package/dist/memory/lock.d.ts +17 -0
  287. package/dist/memory/lock.js +62 -0
  288. package/dist/memory/paths.d.ts +57 -0
  289. package/dist/memory/paths.js +175 -0
  290. package/dist/memory/report.d.ts +36 -0
  291. package/dist/memory/report.js +86 -0
  292. package/dist/memory/runtime.d.ts +42 -0
  293. package/dist/memory/runtime.js +36 -0
  294. package/dist/memory/secrets.d.ts +8 -0
  295. package/dist/memory/secrets.js +27 -0
  296. package/dist/memory/section.d.ts +28 -0
  297. package/dist/memory/section.js +59 -0
  298. package/dist/memory/store.d.ts +70 -0
  299. package/dist/memory/store.js +284 -0
  300. package/dist/memory/tool.d.ts +31 -0
  301. package/dist/memory/tool.js +94 -0
  302. package/dist/modes/acp/acp-events.js +2 -1
  303. package/dist/modes/acp/acp-server.js +13 -12
  304. package/dist/modes/commands-core.d.ts +17 -0
  305. package/dist/modes/commands-core.js +101 -61
  306. package/dist/modes/image-input.js +20 -6
  307. package/dist/modes/interactive/agent-bar.d.ts +95 -0
  308. package/dist/modes/interactive/agent-bar.js +248 -0
  309. package/dist/modes/interactive/agent-panels.js +27 -26
  310. package/dist/modes/interactive/agent-transcript.d.ts +47 -0
  311. package/dist/modes/interactive/agent-transcript.js +191 -0
  312. package/dist/modes/interactive/agent-ui.d.ts +36 -1
  313. package/dist/modes/interactive/agent-ui.js +180 -14
  314. package/dist/modes/interactive/agent-view.d.ts +72 -0
  315. package/dist/modes/interactive/agent-view.js +281 -0
  316. package/dist/modes/interactive/approval-dialog.js +46 -34
  317. package/dist/modes/interactive/clipboard-paste.d.ts +2 -2
  318. package/dist/modes/interactive/clipboard-paste.js +9 -4
  319. package/dist/modes/interactive/commands.d.ts +22 -1
  320. package/dist/modes/interactive/commands.js +93 -38
  321. package/dist/modes/interactive/completion.js +2 -1
  322. package/dist/modes/interactive/config-panel.d.ts +70 -0
  323. package/dist/modes/interactive/config-panel.js +319 -0
  324. package/dist/modes/interactive/config-ui.d.ts +96 -0
  325. package/dist/modes/interactive/config-ui.js +397 -0
  326. package/dist/modes/interactive/confirm-dialog.d.ts +49 -0
  327. package/dist/modes/interactive/confirm-dialog.js +120 -0
  328. package/dist/modes/interactive/event-notices.js +11 -9
  329. package/dist/modes/interactive/interactive-mode.d.ts +1 -1
  330. package/dist/modes/interactive/interactive-mode.js +25 -22
  331. package/dist/modes/interactive/key-dispatch.d.ts +18 -0
  332. package/dist/modes/interactive/key-dispatch.js +39 -13
  333. package/dist/modes/interactive/line/line-editor.js +2 -1
  334. package/dist/modes/interactive/line/line-mode.d.ts +2 -0
  335. package/dist/modes/interactive/line/line-mode.js +24 -4
  336. package/dist/modes/interactive/line/line-render.js +25 -24
  337. package/dist/modes/interactive/memory-panel.d.ts +64 -0
  338. package/dist/modes/interactive/memory-panel.js +221 -0
  339. package/dist/modes/interactive/message-view.d.ts +4 -2
  340. package/dist/modes/interactive/message-view.js +42 -33
  341. package/dist/modes/interactive/panels.js +39 -31
  342. package/dist/modes/interactive/pickers.d.ts +2 -1
  343. package/dist/modes/interactive/pickers.js +10 -6
  344. package/dist/modes/interactive/plan-command.d.ts +1 -1
  345. package/dist/modes/interactive/plan-command.js +24 -27
  346. package/dist/modes/interactive/plan-dialog.js +18 -17
  347. package/dist/modes/interactive/plan-flow.js +6 -5
  348. package/dist/modes/interactive/rewind-command.d.ts +1 -1
  349. package/dist/modes/interactive/rewind-command.js +18 -16
  350. package/dist/modes/interactive/rewind-flow.d.ts +0 -1
  351. package/dist/modes/interactive/rewind-flow.js +13 -14
  352. package/dist/modes/interactive/rewind-list.js +7 -6
  353. package/dist/modes/interactive/rewind-panel.js +40 -40
  354. package/dist/modes/interactive/rewind-text.d.ts +5 -3
  355. package/dist/modes/interactive/rewind-text.js +48 -38
  356. package/dist/modes/interactive/run-indicator.js +15 -12
  357. package/dist/modes/interactive/session-events.js +3 -2
  358. package/dist/modes/interactive/startup-header.js +22 -23
  359. package/dist/modes/interactive/startup-ui.js +41 -29
  360. package/dist/modes/interactive/status-area.d.ts +2 -0
  361. package/dist/modes/interactive/status-area.js +8 -2
  362. package/dist/modes/interactive/status-bar.js +4 -3
  363. package/dist/modes/interactive/subagent-view.js +9 -7
  364. package/dist/modes/interactive/tasks-report.d.ts +6 -0
  365. package/dist/modes/interactive/tasks-report.js +28 -31
  366. package/dist/modes/interactive/terminal-setup.d.ts +9 -0
  367. package/dist/modes/interactive/terminal-setup.js +23 -0
  368. package/dist/modes/interactive/tool-summary.js +19 -17
  369. package/dist/modes/interactive/tool-view.js +7 -4
  370. package/dist/modes/interactive/trace-view.d.ts +89 -0
  371. package/dist/modes/interactive/trace-view.js +332 -0
  372. package/dist/modes/print/print-mode.js +14 -15
  373. package/dist/modes/rpc/commands.js +7 -3
  374. package/dist/modes/rpc/rpc-mode.js +9 -3
  375. package/dist/modes/session-report.d.ts +2 -0
  376. package/dist/modes/session-report.js +101 -105
  377. package/dist/modes/startup-ui-text.js +11 -6
  378. package/dist/permissions/bypass.d.ts +30 -0
  379. package/dist/permissions/bypass.js +45 -0
  380. package/dist/permissions/memory-class.d.ts +23 -0
  381. package/dist/permissions/memory-class.js +54 -0
  382. package/dist/permissions/modes.d.ts +3 -3
  383. package/dist/permissions/modes.js +21 -16
  384. package/dist/permissions/pipeline.d.ts +1 -1
  385. package/dist/permissions/pipeline.js +9 -2
  386. package/dist/permissions/preview.js +49 -42
  387. package/dist/permissions/rules.js +5 -2
  388. package/dist/permissions/types.d.ts +4 -0
  389. package/dist/plan/store.js +2 -1
  390. package/dist/rpc.d.ts +39 -1
  391. package/dist/rpc.js +3 -0
  392. package/dist/sandbox/bash.js +11 -8
  393. package/dist/sandbox/detect.js +14 -11
  394. package/dist/sdk.d.ts +17 -1
  395. package/dist/sdk.js +29 -7
  396. package/dist/session/export.js +31 -30
  397. package/dist/session/manager.d.ts +1 -1
  398. package/dist/session/manager.js +5 -3
  399. package/dist/session/reuse.js +5 -4
  400. package/dist/session/scan.js +3 -2
  401. package/dist/session/stats-aggregate.d.ts +3 -1
  402. package/dist/session/stats-aggregate.js +5 -1
  403. package/dist/session/stats-index.js +2 -1
  404. package/dist/session/stats-scan.d.ts +4 -1
  405. package/dist/session/stats-scan.js +6 -2
  406. package/dist/session/store.d.ts +11 -0
  407. package/dist/session/store.js +48 -1
  408. package/dist/session/types.d.ts +2 -0
  409. package/dist/skills/builtin.js +2 -1
  410. package/dist/tools/image-file.d.ts +26 -1
  411. package/dist/tools/image-file.js +55 -13
  412. package/dist/tools/presets.d.ts +14 -1
  413. package/dist/tools/presets.js +3 -3
  414. package/dist/tools/registry.js +1 -1
  415. package/dist/tools/truncate.d.ts +1 -1
  416. package/dist/tools/truncate.js +2 -2
  417. package/dist/tools/types.d.ts +17 -1
  418. package/dist/trace/build-index.d.ts +91 -0
  419. package/dist/trace/build-index.js +127 -0
  420. package/dist/trace/build-nodes.d.ts +24 -0
  421. package/dist/trace/build-nodes.js +279 -0
  422. package/dist/trace/build-util.d.ts +43 -0
  423. package/dist/trace/build-util.js +120 -0
  424. package/dist/trace/build.d.ts +82 -0
  425. package/dist/trace/build.js +382 -0
  426. package/dist/trace/detail.d.ts +35 -0
  427. package/dist/trace/detail.js +205 -0
  428. package/dist/trace/flatten.d.ts +69 -0
  429. package/dist/trace/flatten.js +173 -0
  430. package/dist/trace/format.d.ts +47 -0
  431. package/dist/trace/format.js +329 -0
  432. package/dist/trace/html-template.d.ts +19 -0
  433. package/dist/trace/html-template.js +150 -0
  434. package/dist/trace/html.d.ts +104 -0
  435. package/dist/trace/html.js +292 -0
  436. package/dist/trace/preview.d.ts +29 -0
  437. package/dist/trace/preview.js +59 -0
  438. package/dist/trace/query-session.d.ts +14 -0
  439. package/dist/trace/query-session.js +38 -0
  440. package/dist/trace/query.d.ts +55 -0
  441. package/dist/trace/query.js +188 -0
  442. package/dist/trace/session.d.ts +40 -0
  443. package/dist/trace/session.js +168 -0
  444. package/dist/trace/types.d.ts +243 -0
  445. package/dist/trace/types.js +13 -0
  446. package/dist/tui/components/editor-paste.d.ts +2 -0
  447. package/dist/tui/components/editor-paste.js +6 -3
  448. package/dist/tui/components/editor.js +2 -2
  449. package/dist/tui/components/loader.d.ts +3 -0
  450. package/dist/tui/components/loader.js +14 -0
  451. package/dist/tui/components/settings-list.d.ts +61 -0
  452. package/dist/tui/components/settings-list.js +135 -0
  453. package/dist/tui/keybindings.d.ts +6 -1
  454. package/dist/tui/keybindings.js +18 -6
  455. package/dist/tui.d.ts +1 -0
  456. package/dist/tui.js +2 -0
  457. package/docs/en/host-api.md +167 -0
  458. package/docs/en/permissions.md +214 -0
  459. package/docs/en/providers.md +625 -0
  460. package/docs/en/rpc.md +361 -0
  461. package/docs/en/sessions.md +219 -0
  462. package/docs/en/tui.md +527 -0
  463. package/docs/host-api.md +18 -17
  464. package/docs/memory.md +172 -0
  465. package/docs/permissions.md +3 -2
  466. package/docs/providers.md +67 -1
  467. package/docs/rpc.md +31 -3
  468. package/docs/session-format.md +8 -2
  469. package/docs/sessions.md +29 -1
  470. package/docs/tui.md +189 -21
  471. package/package.json +8 -3
@@ -0,0 +1,89 @@
1
+ /**
2
+ * `/trace` 覆盖层(docs/wave6-plan.md §2.4)。[W6-T1]
3
+ *
4
+ * - `/trace`(当前会话)、`/trace t2`(以任务 t2 为根:ama 子会话的子轨迹,或外部 Agent 骨架)。
5
+ * - 主屏约束下的覆盖层:`anchor: "bottom"`、高度 `rows − 1`(同 rewind 面板);退出撤掉覆盖层,消息区不变。
6
+ * - 布局:标题汇总一行 + 列表窗口 + 按键提示一行;只格式化可见窗口里的行(10k 节点也只算可见行)。
7
+ * - 键:↑↓ / PgUp PgDn / Home End 移动;→ 展开(子 Agent 展开即懒加载子轨迹)或进第一个子行;← 折叠或回父行;
8
+ * Enter 详情卡片(再按或 Esc 返回);「更早的 N 个回合」行上 Enter / ↑ 加载前一页;f 跟随开关(进行中自动开,
9
+ * 手动上移暂停,End 恢复);Esc 先关详情再关视图。
10
+ * - 刷新:会话事件(`entry_appended` / `telemetry_tick` / 工具起止 / 请求起止)触发,节流 ≤ 2 Hz;每次整棵
11
+ * 重建(构建器是 O(条目) 的纯函数,10k 节点实测见 trace-view.test.ts),展开状态与光标按行 key 保留。
12
+ */
13
+ import type { AgentSession } from "../../agent/types.js";
14
+ import { type Component, type Focusable, type Keybindings, type OverlayHandle, type Theme } from "../../tui.js";
15
+ import { type TraceRow } from "../../trace/flatten.js";
16
+ import { LiveTracker, type ChildLoader } from "../../trace/session.js";
17
+ import type { NoticeLevel } from "./message-view.js";
18
+ /** 尾部优先:首屏与每次向前翻页的回合数。 */
19
+ export declare const TRACE_PAGE_TURNS = 50;
20
+ /** 刷新节流(≤ 2 Hz)。 */
21
+ export declare const TRACE_REFRESH_MS = 500;
22
+ export interface TraceViewHost {
23
+ theme: Theme;
24
+ keybindings?: Keybindings;
25
+ showOverlay(component: Component, options: {
26
+ anchor: "bottom";
27
+ }): OverlayHandle;
28
+ rows(): number;
29
+ session(): AgentSession;
30
+ now(): number;
31
+ notice(level: NoticeLevel, text: string): void;
32
+ /** 请求重画(异步刷新后)。 */
33
+ render?(): void;
34
+ /** 子会话读取(测试注入);缺省只读读文件、按 mtime 缓存。 */
35
+ loadChild?: ChildLoader;
36
+ /** 刷新节流(测试用 0)。 */
37
+ refreshMs?: number;
38
+ }
39
+ export declare class TraceView implements Component, Focusable {
40
+ private readonly host;
41
+ private readonly taskId;
42
+ private readonly close;
43
+ focused: boolean;
44
+ private trace;
45
+ private root;
46
+ private rows;
47
+ private lookup;
48
+ private readonly expanded;
49
+ /** 已展开过的 ama 子 Agent(重建后重新挂子轨迹)。 */
50
+ private readonly loaded;
51
+ private fromTurn;
52
+ private cursor;
53
+ private top;
54
+ private follow;
55
+ private detail;
56
+ readonly live: LiveTracker;
57
+ private readonly loadChild;
58
+ constructor(host: TraceViewHost, taskId: string | undefined, close: () => void);
59
+ /** 任务存在(`/trace <id>`)或看主会话。 */
60
+ get found(): boolean;
61
+ private rowsKeyOfRoot;
62
+ /** 重建轨迹(会话条目 + live 叠加 + 已展开的子轨迹)。 */
63
+ rebuild(): void;
64
+ /** 重新摊平,光标按 key 保持;跟随时贴底。 */
65
+ private reflow;
66
+ /** 会话有变化:重建并重排。 */
67
+ refresh(): void;
68
+ /** 当前行数(测试用)。 */
69
+ get rowCount(): number;
70
+ get cursorIndex(): number;
71
+ get selected(): TraceRow | undefined;
72
+ get following(): boolean;
73
+ get detailOpen(): boolean;
74
+ private bodyHeight;
75
+ private move;
76
+ private loadEarlier;
77
+ private expand;
78
+ private collapse;
79
+ handleInput(data: string): void;
80
+ private detailInput;
81
+ private ctx;
82
+ private headerLine;
83
+ render(width: number): string[];
84
+ invalidate(): void;
85
+ }
86
+ /**
87
+ * 打开 `/trace` 覆盖层;关闭时 resolve。任务不存在时提示一行、不打开。
88
+ */
89
+ export declare function openTraceView(host: TraceViewHost, taskId?: string): Promise<void>;
@@ -0,0 +1,332 @@
1
+ /**
2
+ * `/trace` 覆盖层(docs/wave6-plan.md §2.4)。[W6-T1]
3
+ *
4
+ * - `/trace`(当前会话)、`/trace t2`(以任务 t2 为根:ama 子会话的子轨迹,或外部 Agent 骨架)。
5
+ * - 主屏约束下的覆盖层:`anchor: "bottom"`、高度 `rows − 1`(同 rewind 面板);退出撤掉覆盖层,消息区不变。
6
+ * - 布局:标题汇总一行 + 列表窗口 + 按键提示一行;只格式化可见窗口里的行(10k 节点也只算可见行)。
7
+ * - 键:↑↓ / PgUp PgDn / Home End 移动;→ 展开(子 Agent 展开即懒加载子轨迹)或进第一个子行;← 折叠或回父行;
8
+ * Enter 详情卡片(再按或 Esc 返回);「更早的 N 个回合」行上 Enter / ↑ 加载前一页;f 跟随开关(进行中自动开,
9
+ * 手动上移暂停,End 恢复);Esc 先关详情再关视图。
10
+ * - 刷新:会话事件(`entry_appended` / `telemetry_tick` / 工具起止 / 请求起止)触发,节流 ≤ 2 Hz;每次整棵
11
+ * 重建(构建器是 O(条目) 的纯函数,10k 节点实测见 trace-view.test.ts),展开状态与光标按行 key 保留。
12
+ */
13
+ import { msg } from "../../i18n/index.js";
14
+ import { defaultKeybindings, matchesKey, padToWidth, truncateToWidth, visibleWidth, } from "../../tui.js";
15
+ import { buildTrace, findSubagent, loadSubagentTrace } from "../../trace/build.js";
16
+ import { describeNode, detailLines, entryLookup, } from "../../trace/detail.js";
17
+ import { flattenNode, flattenTrace, needsChild, rowIndex, tailStart, } from "../../trace/flatten.js";
18
+ import { formatRow, rowLabel, summaryText } from "../../trace/format.js";
19
+ import { childLoader, LiveTracker, traceInputOf } from "../../trace/session.js";
20
+ /** 尾部优先:首屏与每次向前翻页的回合数。 */
21
+ export const TRACE_PAGE_TURNS = 50;
22
+ /** 刷新节流(≤ 2 Hz)。 */
23
+ export const TRACE_REFRESH_MS = 500;
24
+ export class TraceView {
25
+ host;
26
+ taskId;
27
+ close;
28
+ focused = false;
29
+ trace;
30
+ root;
31
+ rows = [];
32
+ lookup;
33
+ expanded = new Map();
34
+ /** 已展开过的 ama 子 Agent(重建后重新挂子轨迹)。 */
35
+ loaded = new Set();
36
+ fromTurn = 0;
37
+ cursor = 0;
38
+ top = 0;
39
+ follow = false;
40
+ detail;
41
+ live;
42
+ loadChild;
43
+ constructor(host, taskId, close) {
44
+ this.host = host;
45
+ this.taskId = taskId;
46
+ this.close = close;
47
+ this.live = new LiveTracker(host.session, host.now);
48
+ this.loadChild = host.loadChild ?? childLoader();
49
+ this.rebuild();
50
+ this.follow = this.trace.partial;
51
+ if (taskId === undefined)
52
+ this.fromTurn = tailStart(this.trace, TRACE_PAGE_TURNS);
53
+ if (this.root !== undefined)
54
+ this.expanded.set(this.rowsKeyOfRoot(), true);
55
+ this.reflow();
56
+ this.cursor = Math.max(0, this.rows.length - 1);
57
+ }
58
+ /** 任务存在(`/trace <id>`)或看主会话。 */
59
+ get found() {
60
+ return this.taskId === undefined || this.root !== undefined;
61
+ }
62
+ rowsKeyOfRoot() {
63
+ return `a:${this.taskId}`;
64
+ }
65
+ /** 重建轨迹(会话条目 + live 叠加 + 已展开的子轨迹)。 */
66
+ rebuild() {
67
+ const session = this.host.session();
68
+ const input = traceInputOf(session);
69
+ this.trace = buildTrace(input, { live: this.live.overlay() });
70
+ for (const taskId of this.loaded) {
71
+ const node = findSubagent(this.trace, taskId);
72
+ if (node !== undefined)
73
+ loadSubagentTrace(node, this.loadChild);
74
+ }
75
+ if (this.taskId !== undefined) {
76
+ this.root = findSubagent(this.trace, this.taskId);
77
+ if (this.root !== undefined)
78
+ loadSubagentTrace(this.root, this.loadChild);
79
+ }
80
+ const children = this.loadChild.inputs().flatMap((i) => i.entries);
81
+ this.lookup = entryLookup([...input.entries, ...children], session.state.cwd);
82
+ }
83
+ /** 重新摊平,光标按 key 保持;跟随时贴底。 */
84
+ reflow() {
85
+ const key = this.rows[this.cursor]?.key;
86
+ const opts = { expanded: this.expanded, fromTurn: this.fromTurn };
87
+ this.rows =
88
+ this.root !== undefined ? flattenNode(this.root, opts) : flattenTrace(this.trace, opts);
89
+ const at = key === undefined ? -1 : rowIndex(this.rows, key);
90
+ this.cursor = this.follow
91
+ ? Math.max(0, this.rows.length - 1)
92
+ : at >= 0
93
+ ? at
94
+ : Math.min(this.cursor, Math.max(0, this.rows.length - 1));
95
+ if (this.detail !== undefined) {
96
+ const fresh = this.rows[rowIndex(this.rows, this.detail.row.key)];
97
+ if (fresh !== undefined)
98
+ this.detail.row = fresh;
99
+ }
100
+ }
101
+ /** 会话有变化:重建并重排。 */
102
+ refresh() {
103
+ this.rebuild();
104
+ this.reflow();
105
+ }
106
+ /** 当前行数(测试用)。 */
107
+ get rowCount() {
108
+ return this.rows.length;
109
+ }
110
+ get cursorIndex() {
111
+ return this.cursor;
112
+ }
113
+ get selected() {
114
+ return this.rows[this.cursor];
115
+ }
116
+ get following() {
117
+ return this.follow;
118
+ }
119
+ get detailOpen() {
120
+ return this.detail !== undefined;
121
+ }
122
+ bodyHeight() {
123
+ return Math.max(1, this.host.rows() - 1 - 2);
124
+ }
125
+ move(delta) {
126
+ if (this.rows.length === 0)
127
+ return;
128
+ if (delta < 0)
129
+ this.follow = false;
130
+ // 第一行是「更早的回合」时继续上移 = 加载前一页
131
+ if (delta < 0 && this.cursor === 0 && this.rows[0]?.node.kind === "more")
132
+ return this.loadEarlier();
133
+ this.cursor = Math.max(0, Math.min(this.rows.length - 1, this.cursor + delta));
134
+ if (delta > 0 && this.cursor === this.rows.length - 1 && this.trace.partial)
135
+ this.follow = true;
136
+ }
137
+ loadEarlier() {
138
+ const key = this.rows[1]?.key;
139
+ this.fromTurn = Math.max(0, this.fromTurn - TRACE_PAGE_TURNS);
140
+ this.reflow();
141
+ const at = key === undefined ? -1 : rowIndex(this.rows, key);
142
+ this.cursor = Math.max(0, at - 1);
143
+ }
144
+ expand() {
145
+ const row = this.selected;
146
+ if (row === undefined)
147
+ return;
148
+ if (!row.expandable)
149
+ return;
150
+ if (!row.expanded) {
151
+ if (needsChild(row.node)) {
152
+ this.loaded.add(row.node.taskId);
153
+ loadSubagentTrace(row.node, this.loadChild);
154
+ this.rebuild();
155
+ }
156
+ this.expanded.set(row.key, true);
157
+ this.reflow();
158
+ return;
159
+ }
160
+ if (this.rows[this.cursor + 1]?.depth === row.depth + 1)
161
+ this.cursor++;
162
+ }
163
+ collapse() {
164
+ const row = this.selected;
165
+ if (row === undefined)
166
+ return;
167
+ this.follow = false;
168
+ if (row.expanded) {
169
+ this.expanded.set(row.key, false);
170
+ this.reflow();
171
+ return;
172
+ }
173
+ const slash = row.key.lastIndexOf("/");
174
+ if (slash < 0)
175
+ return;
176
+ const parent = rowIndex(this.rows, row.key.slice(0, slash));
177
+ if (parent >= 0)
178
+ this.cursor = parent;
179
+ }
180
+ handleInput(data) {
181
+ const keys = this.host.keybindings ?? defaultKeybindings;
182
+ if (this.detail !== undefined)
183
+ return this.detailInput(data, keys);
184
+ const page = this.bodyHeight();
185
+ if (keys.matches(data, "tui.select.up"))
186
+ this.move(-1);
187
+ else if (keys.matches(data, "tui.select.down"))
188
+ this.move(1);
189
+ else if (keys.matches(data, "tui.select.pageUp"))
190
+ this.move(-page);
191
+ else if (keys.matches(data, "tui.select.pageDown"))
192
+ this.move(page);
193
+ else if (matchesKey(data, "home")) {
194
+ this.follow = false;
195
+ this.cursor = 0;
196
+ }
197
+ else if (matchesKey(data, "end")) {
198
+ this.cursor = Math.max(0, this.rows.length - 1);
199
+ this.follow = this.trace.partial;
200
+ }
201
+ else if (matchesKey(data, "right"))
202
+ this.expand();
203
+ else if (matchesKey(data, "left"))
204
+ this.collapse();
205
+ else if (matchesKey(data, "enter")) {
206
+ const row = this.selected;
207
+ if (row?.node.kind === "more")
208
+ this.loadEarlier();
209
+ else if (row !== undefined && row.node.kind !== "aux_group")
210
+ this.detail = { row, scroll: 0 };
211
+ }
212
+ else if (data === "f") {
213
+ this.follow = !this.follow;
214
+ if (this.follow)
215
+ this.cursor = Math.max(0, this.rows.length - 1);
216
+ }
217
+ else if (matchesKey(data, "escape") || keys.matches(data, "tui.select.cancel"))
218
+ this.close();
219
+ }
220
+ detailInput(data, keys) {
221
+ const detail = this.detail;
222
+ const page = this.bodyHeight();
223
+ if (keys.matches(data, "tui.select.up"))
224
+ detail.scroll = Math.max(0, detail.scroll - 1);
225
+ else if (keys.matches(data, "tui.select.down"))
226
+ detail.scroll++;
227
+ else if (keys.matches(data, "tui.select.pageUp"))
228
+ detail.scroll = Math.max(0, detail.scroll - page);
229
+ else if (keys.matches(data, "tui.select.pageDown"))
230
+ detail.scroll += page;
231
+ else if (matchesKey(data, "escape") || matchesKey(data, "enter") || matchesKey(data, "left"))
232
+ this.detail = undefined;
233
+ }
234
+ ctx() {
235
+ return {
236
+ theme: this.host.theme,
237
+ describe: (n) => describeNode(n, this.lookup),
238
+ };
239
+ }
240
+ headerLine(width) {
241
+ const theme = this.host.theme;
242
+ const m = msg().trace;
243
+ const root = this.root;
244
+ const title = root !== undefined ? m.taskTitle(root.taskId, root.agent) : m.title;
245
+ const source = root !== undefined ? root.child : this.trace;
246
+ const summary = source !== undefined ? ` · ${summaryText(source, theme)}` : "";
247
+ const state = this.trace.partial ? (this.follow ? m.follow.on : m.follow.off) : "";
248
+ const right = state === "" ? "" : ` ${theme.fg(this.follow ? "accent" : "muted", state)}`;
249
+ const left = truncateToWidth(`${theme.bold(title)}${theme.fg("muted", summary)}`, Math.max(1, width - visibleWidth(right)), theme.glyphs.ellipsis);
250
+ return padToWidth(`${left}${right}`, width);
251
+ }
252
+ render(width) {
253
+ const theme = this.host.theme;
254
+ const height = this.bodyHeight();
255
+ const lines = [this.headerLine(width)];
256
+ if (this.detail !== undefined) {
257
+ const { row } = this.detail;
258
+ const body = [
259
+ theme.bold(rowLabel(row, this.ctx())),
260
+ ...detailLines(row.node, this.lookup, Math.max(8, width - 2), theme, this.trace.startedAt),
261
+ ].map((l) => ` ${l}`);
262
+ const max = Math.max(0, body.length - height);
263
+ this.detail.scroll = Math.min(this.detail.scroll, max);
264
+ for (const line of body.slice(this.detail.scroll, this.detail.scroll + height))
265
+ lines.push(padToWidth(truncateToWidth(line, width, theme.glyphs.ellipsis), width));
266
+ }
267
+ else if (this.rows.length === 0)
268
+ lines.push(padToWidth(theme.dim(` ${msg().trace.empty}`), width));
269
+ else {
270
+ // 窗口:光标始终可见;跟随时贴底
271
+ if (this.cursor < this.top)
272
+ this.top = this.cursor;
273
+ if (this.cursor >= this.top + height)
274
+ this.top = this.cursor - height + 1;
275
+ this.top = Math.max(0, Math.min(this.top, Math.max(0, this.rows.length - height)));
276
+ const ctx = this.ctx();
277
+ for (let i = this.top; i < Math.min(this.rows.length, this.top + height); i++)
278
+ lines.push(formatRow(this.rows[i], width, ctx, i === this.cursor));
279
+ }
280
+ while (lines.length < height + 1)
281
+ lines.push(" ".repeat(width));
282
+ const hints = msg().trace.hints;
283
+ const hint = this.detail !== undefined ? hints.detail : width < 60 ? hints.listNarrow : hints.list;
284
+ lines.push(padToWidth(truncateToWidth(theme.dim(hint), width, theme.glyphs.ellipsis), width));
285
+ return lines;
286
+ }
287
+ invalidate() { }
288
+ }
289
+ /**
290
+ * 打开 `/trace` 覆盖层;关闭时 resolve。任务不存在时提示一行、不打开。
291
+ */
292
+ export function openTraceView(host, taskId) {
293
+ return new Promise((resolve) => {
294
+ let handle;
295
+ let timer;
296
+ let unsubscribe;
297
+ let last = 0;
298
+ const finish = () => {
299
+ if (timer !== undefined)
300
+ clearTimeout(timer);
301
+ unsubscribe?.();
302
+ handle?.hide();
303
+ host.render?.();
304
+ resolve();
305
+ };
306
+ const view = new TraceView(host, taskId, finish);
307
+ if (!view.found) {
308
+ host.notice("warn", msg().trace.taskNotFound(taskId));
309
+ resolve();
310
+ return;
311
+ }
312
+ const throttle = host.refreshMs ?? TRACE_REFRESH_MS;
313
+ const flush = () => {
314
+ timer = undefined;
315
+ last = host.now();
316
+ view.refresh();
317
+ host.render?.();
318
+ };
319
+ unsubscribe = host.session().subscribe((event) => {
320
+ if (!view.live.onEvent(event) || timer !== undefined)
321
+ return;
322
+ const wait = Math.max(0, throttle - (host.now() - last));
323
+ if (wait === 0)
324
+ flush();
325
+ else {
326
+ timer = setTimeout(flush, wait);
327
+ timer.unref?.();
328
+ }
329
+ });
330
+ handle = host.showOverlay(view, { anchor: "bottom" });
331
+ });
332
+ }
@@ -30,6 +30,7 @@ import { errorText, lastAssistant, onStdoutClosed, onTerminationSignals } from "
30
30
  import { toJsonLine, toWireEvent } from "./json-event.js";
31
31
  import { formatUsd } from "../../agent/limits.js";
32
32
  import { promptImages, sessionModel } from "../image-input.js";
33
+ import { msg } from "../../i18n/index.js";
33
34
  export function joinPrompt(argument, piped) {
34
35
  const parts = [argument ?? "", piped.replace(/\s+$/, "")].filter((p) => p.trim() !== "");
35
36
  return parts.join("\n\n");
@@ -75,14 +76,14 @@ export async function readPromptStdin(io, prompt, mode, hintMs = STDIN_WAIT_HINT
75
76
  return "";
76
77
  const text = await readWithin(io, waitMs);
77
78
  if (text === undefined) {
78
- io.stderr(`ama: 未在 ${formatSeconds(waitMs)}内收到管道输入,已忽略;需要等待请在末尾加 -\n`);
79
+ io.stderr(msg().print.print.stdinIgnored(formatSeconds(waitMs)));
79
80
  return "";
80
81
  }
81
82
  return text;
82
83
  }
83
84
  const timer = safe
84
85
  ? undefined
85
- : setTimeout(() => io.stderr("ama: 正在等待 stdin 输入结束(Ctrl+D 结束;提示也可以直接写成参数)…\n"), hintMs);
86
+ : setTimeout(() => io.stderr(msg().print.print.stdinWaiting), hintMs);
86
87
  try {
87
88
  return await io.readStdin();
88
89
  }
@@ -91,7 +92,8 @@ export async function readPromptStdin(io, prompt, mode, hintMs = STDIN_WAIT_HINT
91
92
  }
92
93
  }
93
94
  function formatSeconds(ms) {
94
- return ms % 1000 === 0 ? `${ms / 1000} 秒` : `${ms} 毫秒`;
95
+ const m = msg().print.print;
96
+ return ms % 1000 === 0 ? m.seconds(ms / 1000) : m.millis(ms);
95
97
  }
96
98
  export async function runPrintMode(runtime, context) {
97
99
  const { io } = context;
@@ -100,7 +102,7 @@ export async function runPrintMode(runtime, context) {
100
102
  const piped = await readPromptStdin(io, context.prompt, stdinMode);
101
103
  const prompt = joinPrompt(context.prompt, piped);
102
104
  if (prompt === "") {
103
- io.stderr("ama: -p 需要提示(位置参数或 stdin 管道)\n");
105
+ io.stderr(msg().print.print.needsPrompt);
104
106
  return ExitCode.Usage;
105
107
  }
106
108
  const session = currentSession(runtime);
@@ -132,7 +134,7 @@ export async function runPrintMode(runtime, context) {
132
134
  if (format === "stream-json")
133
135
  io.stdout(`${toJsonLine(toWireEvent(event))}\n`);
134
136
  else if (event.type === "auto_retry_start")
135
- io.stderr(`ama: ↻ 重试 ${event.attempt}/${event.maxAttempts}(${Math.round(event.delayMs / 1000)}s 后):${event.errorMessage}\n`);
137
+ io.stderr(msg().print.print.retry(event.attempt, event.maxAttempts, Math.round(event.delayMs / 1000), event.errorMessage));
136
138
  });
137
139
  let signalled;
138
140
  const offSignals = onTerminationSignals((code) => {
@@ -215,7 +217,7 @@ export async function runPrintMode(runtime, context) {
215
217
  return ExitCode.LimitReached;
216
218
  }
217
219
  if (last?.stopReason === "error" || last?.stopReason === "aborted") {
218
- io.stderr(`ama: ${last.errorMessage ?? "模型调用失败"}\n`);
220
+ io.stderr(`ama: ${last.errorMessage ?? msg().print.print.modelFailed}\n`);
219
221
  return ExitCode.RuntimeError;
220
222
  }
221
223
  if (denied.length > 0)
@@ -231,15 +233,14 @@ export async function runPrintMode(runtime, context) {
231
233
  /** stderr 一行:计划已落盘待审批(-p 不替人批准)。 */
232
234
  export function describePlanPending(plan) {
233
235
  const where = plan.filePath ?? plan.planId;
234
- return (`ama: 计划 v${plan.version} 已落盘、待审批(未执行):${where};-p 不替人批准——` +
235
- "在交互界面或 RPC plan_response 里审批,或设 plan.unattended: approve 让 -p 批准后接着执行");
236
+ return msg().print.print.planPending(plan.version, where);
236
237
  }
237
238
  /** stderr 一行:哪个预算到限。 */
238
239
  export function describeLimit(event) {
240
+ const m = msg().print.print;
239
241
  return event.kind === "turns"
240
- ? `ama: 已达到回合上限 ${event.limit}(--max-turns / limits.maxTurns),运行在完成前结束`
241
- : `ama: 已达到费用上限 ${formatUsd(event.limit)}(累计 ${formatUsd(event.value)};` +
242
- "--max-cost / limits.maxCostUsd),运行在完成前结束";
242
+ ? m.limitTurns(event.limit)
243
+ : m.limitCost(formatUsd(event.limit), formatUsd(event.value));
243
244
  }
244
245
  function textOf(event) {
245
246
  const content = event.result.content;
@@ -253,8 +254,6 @@ export function describeDenied(denied) {
253
254
  const counts = new Map();
254
255
  for (const item of denied)
255
256
  counts.set(item.toolName, (counts.get(item.toolName) ?? 0) + 1);
256
- const tools = [...counts].map(([name, n]) => `${name} ×${n}`).join("、");
257
- const reason = denied[0]?.reason ?? "";
258
- return (`ama: ${denied.length} 次工具调用被拒:${tools}${reason !== "" ? `(${reason})` : ""};` +
259
- "-p 没有人审批,需要放行时用 --permission-mode auto-edit|auto 或 --allow <规则>");
257
+ const tools = [...counts].map(([name, n]) => `${name} ×${n}`);
258
+ return msg().print.print.denied(denied.length, tools, denied[0]?.reason ?? "");
260
259
  }
@@ -22,6 +22,8 @@ import { AmaError } from "../../errors.js";
22
22
  import { isPermissionMode } from "../../permissions/modes.js";
23
23
  import { PERMISSION_MODES_STRICT_FIRST } from "../../permissions/types.js";
24
24
  import { BUILTIN_COMMANDS } from "../commands-core.js";
25
+ import { msg } from "../../i18n/index.js";
26
+ import { sessionTrace } from "../../trace/query-session.js";
25
27
  /** 审批 broker:等客户端 `permission_response`。 */
26
28
  export class RpcApprovals {
27
29
  pending = new Map();
@@ -65,13 +67,13 @@ export class RpcApprovals {
65
67
  function impl(session) {
66
68
  if (session instanceof AgentSessionImpl)
67
69
  return session;
68
- throw new AmaError("not_implemented", "该会话不支持此命令");
70
+ throw new AmaError("not_implemented", msg().print.rpc.unsupported);
69
71
  }
70
72
  /** [W5-F] 当前会话的计划控制面;会话没有装配 plan 扩展时报 not_implemented。 */
71
73
  function plans(ctx) {
72
74
  const controller = planController(ctx.session());
73
75
  if (controller === undefined)
74
- throw new AmaError("not_implemented", "该会话没有装配 plan 扩展");
76
+ throw new AmaError("not_implemented", msg().print.rpc.noPlan);
75
77
  return controller;
76
78
  }
77
79
  /** 声明了 `plans` 能力 → 客户端作答;否则按 `plan.unattended`。换会话后重新应用。 */
@@ -286,7 +288,7 @@ export const handlers = {
286
288
  },
287
289
  set_permission_mode: async (p, ctx) => {
288
290
  if (!isPermissionMode(p.mode)) {
289
- throw new AmaError("invalid_arguments", `mode 应为 ${PERMISSION_MODES_STRICT_FIRST.join(" | ")}`);
291
+ throw new AmaError("invalid_arguments", msg().print.rpc.badMode(PERMISSION_MODES_STRICT_FIRST));
290
292
  }
291
293
  ctx.session().setPermissionMode(p.mode);
292
294
  return { mode: p.mode };
@@ -308,5 +310,7 @@ export const handlers = {
308
310
  get_todos: async (_p, ctx) => ({ items: currentTodos(impl(ctx.session()).manager.branch()) }),
309
311
  get_tasks: async (_p, ctx) => ({ tasks: [...(ctx.tasks?.()?.list() ?? [])] }),
310
312
  get_agents: async (_p, ctx) => ({ agents: [...(ctx.agents?.() ?? [])] }),
313
+ // [W6-T2] 轨迹(docs/wave6-plan.md §2.6;分页 / 增量 / 脱敏见 trace/query.ts)
314
+ get_trace: async (p, ctx) => sessionTrace(ctx.session(), p ?? {}),
311
315
  };
312
316
  export const RPC_COMMAND_TYPES = Object.keys(handlers);
@@ -23,6 +23,7 @@ import { sessionAgents, taskRegistryView } from "../../agent/subagent-registry.j
23
23
  import { cachedAgentInfos } from "../../agents/external.js";
24
24
  import { RpcApprovals, handlers } from "./commands.js";
25
25
  import { createLineReader, writeChunked } from "./jsonl.js";
26
+ import { msg } from "../../i18n/index.js";
26
27
  export const RPC_CAPABILITIES = ["approvals", "images", "hooks", "plans"];
27
28
  export async function runRpcMode(runtime, context, options = {}) {
28
29
  const stdin = options.stdin ?? process.stdin;
@@ -79,7 +80,7 @@ export async function runRpcMode(runtime, context, options = {}) {
79
80
  type: "response",
80
81
  command: type,
81
82
  success: false,
82
- error: `未知命令:${String(type)}`,
83
+ error: msg().print.rpc.unknownCommand(String(type)),
83
84
  code: "invalid_arguments",
84
85
  });
85
86
  return;
@@ -116,12 +117,17 @@ export async function runRpcMode(runtime, context, options = {}) {
116
117
  type: "response",
117
118
  command: "parse",
118
119
  success: false,
119
- error: `JSON 解析失败:${errorText(error)}`,
120
+ error: msg().print.rpc.parseFailed(errorText(error)),
120
121
  });
121
122
  return;
122
123
  }
123
124
  if (typeof command !== "object" || command === null || typeof command.type !== "string") {
124
- void write({ type: "response", command: "parse", success: false, error: "缺少 type" });
125
+ void write({
126
+ type: "response",
127
+ command: "parse",
128
+ success: false,
129
+ error: msg().print.rpc.missingType,
130
+ });
125
131
  return;
126
132
  }
127
133
  const task = respond(command).finally(() => inflight.delete(task));
@@ -58,6 +58,8 @@ export declare function externalUsageText(usage: {
58
58
  export declare function externalRows(session: AgentSession): KeyValueRow[];
59
59
  /** [W5-U] 子 Agent 任务汇总(`getStats().tasks`);没有任务时 undefined。 */
60
60
  export declare function taskStatsText(session: AgentSession): string | undefined;
61
+ /** [W6-O] 「订阅用量」段(`getStats().subscription`):按供应商列请求与 token、缓存只给命中率;附最近配额。 */
62
+ export declare function subscriptionRows(session: AgentSession, now?: number): KeyValueRow[];
61
63
  /** 键值行 → 纯文本(键列对齐、去行尾空白)。 */
62
64
  export declare function renderRows(rows: readonly KeyValueRow[], indent?: string): string[];
63
65
  export declare function describeCache(session: AgentSession, now?: number): string;