@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,281 @@
1
+ /**
2
+ * 子 Agent 视图(docs/wave6-plan.md §1.1–§1.2、D2、D3)。[W6-A]
3
+ *
4
+ * 主屏约束下的「全屏」:底部覆盖层,高度 = 终端行数 − 1(不切备用屏;撤掉覆盖层后消息区与回滚历史不变)。
5
+ *
6
+ * ```
7
+ * t2 explore · 运行中 1m05s · 3 轮 · ↑12k ↓3.4k · Esc 返回 · /tasks stop t2 停止
8
+ * <正文:ama 子会话的消息与工具 / 外部 Agent 的实时输出,跟随尾部>
9
+ * <一行提示:发送结果、已暂停跟随>
10
+ * ────────
11
+ * › 发给 t2
12
+ * ────────
13
+ * ```
14
+ *
15
+ * 按键:Enter 发给子 Agent(`registry.message`,留在视图);输入为空时 Esc 返回、`←` `→` 切兄弟任务、
16
+ * `↑` / PgUp 上翻(暂停跟随)、`↓` / PgDn 下翻、End(暂停时也可 `f`)回到跟随;输入非空时 Esc 清空。
17
+ * Esc 不中断父会话,停止子任务用 `/tasks stop <id>`(视图里只认这一条命令)。
18
+ * 所查看的任务在等审批时标题显示「等待审批」,审批框照常以覆盖层弹在视图上面。
19
+ */
20
+ import { msg } from "../../i18n/index.js";
21
+ import { Editor, isPrintableText, parseKey, truncateToWidth, visibleWidth, } from "../../tui.js";
22
+ import { formatTokenCount } from "../session-report.js";
23
+ import { agentLabel, rowFacts, statusColor, taskRow } from "./agent-bar.js";
24
+ import { AmaTranscript, ExternalTranscript, readBranch, } from "./agent-transcript.js";
25
+ export class AgentView {
26
+ taskId;
27
+ deps;
28
+ editor;
29
+ body;
30
+ off;
31
+ follow = true;
32
+ /** 不跟随时正文窗口的首行。 */
33
+ top = 0;
34
+ lastBody = { total: 0, height: 0 };
35
+ flash;
36
+ notice;
37
+ _focused = false;
38
+ constructor(taskId, deps) {
39
+ this.taskId = taskId;
40
+ this.deps = deps;
41
+ this.editor = new Editor({
42
+ theme: deps.theme,
43
+ keybindings: deps.keys,
44
+ maxVisibleLines: 4,
45
+ placeholder: msg().agents.view.placeholder(taskId),
46
+ requestRender: () => deps.render(),
47
+ onSubmit: (text) => void this.submit(text),
48
+ });
49
+ this.attach();
50
+ }
51
+ get task() {
52
+ return this.taskId;
53
+ }
54
+ get focused() {
55
+ return this._focused;
56
+ }
57
+ set focused(value) {
58
+ this._focused = value;
59
+ this.editor.focused = value;
60
+ }
61
+ /** 接上任务的数据(打开、切兄弟任务、任务重新开跑);任务不存在返回 false。 */
62
+ attach() {
63
+ this.off?.();
64
+ this.off = undefined;
65
+ this.notice = undefined;
66
+ const registry = this.deps.registry();
67
+ const live = registry?.live(this.taskId);
68
+ if (registry === undefined || live === undefined) {
69
+ this.body = undefined;
70
+ return false;
71
+ }
72
+ const info = live.info;
73
+ if (info.runner !== "ama") {
74
+ const taskId = this.taskId;
75
+ const source = {
76
+ events: () => registry.live(taskId)?.recent ?? [],
77
+ running: () => registry.get(taskId)?.status === "running",
78
+ runner: info.runner,
79
+ ...(info.sessionRef?.sessionId !== undefined
80
+ ? { sessionId: info.sessionRef.sessionId }
81
+ : {}),
82
+ };
83
+ this.body = new ExternalTranscript(this.deps.theme, source);
84
+ return true;
85
+ }
86
+ const body = new AmaTranscript({
87
+ theme: this.deps.theme,
88
+ ...this.deps.messages,
89
+ now: this.deps.now,
90
+ });
91
+ this.body = body;
92
+ if (live.entries !== undefined) {
93
+ body.load(live.entries());
94
+ this.off = live.observe?.((event) => {
95
+ if (body.onEvent(event))
96
+ this.deps.render();
97
+ });
98
+ return true;
99
+ }
100
+ const file = info.sessionRef?.sessionFile;
101
+ if (file === undefined) {
102
+ this.notice = msg().agents.view.noTranscript;
103
+ return true;
104
+ }
105
+ try {
106
+ body.load(readBranch(file));
107
+ }
108
+ catch (error) {
109
+ this.notice = msg().agents.view.loadFailed(error instanceof Error ? error.message : String(error));
110
+ }
111
+ return true;
112
+ }
113
+ dispose() {
114
+ this.off?.();
115
+ this.off = undefined;
116
+ }
117
+ /** 每秒:运行中的工具重画耗时。 */
118
+ tick() {
119
+ if (this.body instanceof AmaTranscript)
120
+ this.body.tick();
121
+ }
122
+ switchTo(delta) {
123
+ const list = this.deps.siblings();
124
+ const at = list.indexOf(this.taskId);
125
+ if (list.length < 2 || at < 0)
126
+ return;
127
+ const next = list[(at + delta + list.length) % list.length];
128
+ this.dispose();
129
+ this.taskId = next;
130
+ this.follow = true;
131
+ this.top = 0;
132
+ this.flash = undefined;
133
+ this.editor.clear();
134
+ this.attach();
135
+ this.deps.onSwitch?.(next);
136
+ }
137
+ async submit(text) {
138
+ const m = msg().agents.view;
139
+ const trimmed = text.trim();
140
+ if (trimmed === "")
141
+ return;
142
+ const taskId = this.taskId;
143
+ if (trimmed.startsWith("/")) {
144
+ const stop = /^\/tasks\s+stop(?:\s+(\S+))?\s*$/.exec(trimmed);
145
+ if (stop === null)
146
+ this.flash = m.commandsHere;
147
+ else {
148
+ const target = stop[1] ?? taskId;
149
+ try {
150
+ await this.deps.stop(target);
151
+ this.flash = m.stopped(target);
152
+ }
153
+ catch (error) {
154
+ this.flash = error instanceof Error ? error.message : String(error);
155
+ }
156
+ }
157
+ this.deps.render();
158
+ return;
159
+ }
160
+ const registry = this.deps.registry();
161
+ try {
162
+ if (registry === undefined)
163
+ throw new Error(m.unknown(taskId));
164
+ const reply = await registry.message(taskId, text);
165
+ this.flash = m[reply](taskId);
166
+ }
167
+ catch (error) {
168
+ this.flash = m.sendFailed(error instanceof Error ? error.message : String(error));
169
+ }
170
+ this.follow = true;
171
+ this.deps.render();
172
+ }
173
+ handleInput(data) {
174
+ const keys = this.deps.keys;
175
+ const empty = this.editor.isEmpty();
176
+ const id = parseKey(data)?.id;
177
+ this.flash = undefined;
178
+ if (keys.matches(data, "tui.select.cancel") && !this.editor.isCompletionOpen) {
179
+ if (!empty)
180
+ this.editor.clear();
181
+ else
182
+ this.deps.close();
183
+ return;
184
+ }
185
+ if (empty) {
186
+ if (id === "left" || id === "right")
187
+ return this.switchTo(id === "left" ? -1 : 1);
188
+ const page = Math.max(1, this.lastBody.height - 1);
189
+ if (id === "up" || id === "pageup")
190
+ return this.scroll(id === "up" ? -1 : -page);
191
+ if (id === "down" || id === "pagedown")
192
+ return this.scroll(id === "down" ? 1 : page);
193
+ if (id === "end" || (id === "f" && !this.follow && isPrintableText(data))) {
194
+ this.follow = true;
195
+ return;
196
+ }
197
+ }
198
+ this.editor.handleInput(data);
199
+ }
200
+ scroll(delta) {
201
+ const { total, height } = this.lastBody;
202
+ const bottom = Math.max(0, total - height);
203
+ const from = this.follow ? bottom : this.top;
204
+ const next = Math.max(0, Math.min(bottom, from + delta));
205
+ if (delta > 0 && next >= bottom) {
206
+ this.follow = true;
207
+ return;
208
+ }
209
+ this.follow = false;
210
+ this.top = next;
211
+ }
212
+ title(width) {
213
+ const t = this.deps.theme;
214
+ const m = msg().agents.view;
215
+ const registry = this.deps.registry();
216
+ const info = registry?.get(this.taskId);
217
+ if (info === undefined)
218
+ return truncateToWidth(t.bold(this.taskId), width);
219
+ const row = taskRow(info, {
220
+ tracker: this.deps.tracker,
221
+ approvals: this.deps.approvals(),
222
+ queued: registry?.live(this.taskId)?.queued === true,
223
+ now: this.deps.now(),
224
+ });
225
+ const g = t.glyphs;
226
+ const usage = this.deps.tracker.get(this.taskId)?.usage ?? info.usage;
227
+ const tokens = usage !== undefined && usage.input + usage.output + usage.cacheRead > 0
228
+ ? `${g.arrowUp}${formatTokenCount(usage.input + usage.cacheRead + usage.cacheWrite)} ${g.arrowDown}${formatTokenCount(usage.output)}`
229
+ : undefined;
230
+ const stop = info.status === "running" ? m.stopHint(this.taskId) : undefined;
231
+ const compose = (withTokens, withStop) => {
232
+ const facts = [rowFacts(row, false), ...(withTokens && tokens ? [tokens] : [])];
233
+ const hints = [m.back, ...(withStop && stop ? [stop] : [])];
234
+ return (t.bold(`${this.taskId} ${agentLabel(row)}`) +
235
+ t.fg("dim", " · ") +
236
+ t.fg(statusColor(row.status), facts.join(" · ")) +
237
+ t.fg("dim", ` · ${hints.join(" · ")}`));
238
+ };
239
+ // 窄屏先丢用量、再丢停止提示,「Esc 返回」尽量留着
240
+ for (const [withTokens, withStop] of [
241
+ [true, true],
242
+ [false, true],
243
+ [false, false],
244
+ ]) {
245
+ const text = compose(withTokens, withStop);
246
+ if (visibleWidth(text) <= width)
247
+ return text;
248
+ }
249
+ return truncateToWidth(compose(false, false), width, g.ellipsis);
250
+ }
251
+ render(width) {
252
+ const t = this.deps.theme;
253
+ const height = Math.max(5, this.deps.rows() - 1);
254
+ const title = this.title(width);
255
+ const input = this.editor.render(width);
256
+ const footer = this.flash ?? (this.follow ? undefined : msg().agents.view.paused);
257
+ const bodyHeight = Math.max(1, height - 1 - input.length - (footer === undefined ? 0 : 1));
258
+ let lines = this.body?.render(width) ?? [];
259
+ if (this.notice !== undefined)
260
+ lines = [t.fg("warning", this.notice), "", ...lines];
261
+ const total = lines.length;
262
+ this.lastBody = { total, height: bodyHeight };
263
+ const bottom = Math.max(0, total - bodyHeight);
264
+ if (this.follow)
265
+ this.top = bottom;
266
+ else
267
+ this.top = Math.min(this.top, bottom);
268
+ const shown = lines.slice(this.top, this.top + bodyHeight);
269
+ while (shown.length < bodyHeight)
270
+ shown.push("");
271
+ const out = [title, ...shown];
272
+ if (footer !== undefined)
273
+ out.push(truncateToWidth(t.fg("dim", footer), width, t.glyphs.ellipsis));
274
+ out.push(...input);
275
+ return out.slice(0, height);
276
+ }
277
+ invalidate() {
278
+ this.body?.invalidate();
279
+ this.editor.invalidate();
280
+ }
281
+ }
@@ -21,7 +21,8 @@
21
21
  *
22
22
  * broker 链本身串行化审批,所以同一时刻最多一个对话框。
23
23
  */
24
- import { AUTO_LAYER_TEXT, isPermissionMode, permissionModeLabel } from "../../permissions/modes.js";
24
+ import { msg } from "../../i18n/index.js";
25
+ import { autoLayerText, isPermissionMode, permissionModeLabel } from "../../permissions/modes.js";
25
26
  import { previewDisplayLines } from "../../permissions/preview.js";
26
27
  import { Box, defaultKeybindings, matchesKey, padToWidth, truncateToWidth, visibleWidth, wrapTextWithAnsi, } from "../../tui.js";
27
28
  import { displayPath, flat } from "./tool-summary.js";
@@ -47,7 +48,7 @@ export function sourceLabel(request, taskAgent) {
47
48
  const context = request.context;
48
49
  const origin = context?.origin;
49
50
  if (origin !== undefined)
50
- return `[${origin.agent} · 会话 ${origin.sessionId.slice(0, 8)}]`;
51
+ return msg().approval.originLabel(origin.agent, origin.sessionId.slice(0, 8));
51
52
  if ((context?.depth ?? 0) <= 0)
52
53
  return undefined;
53
54
  const taskId = context?.taskId;
@@ -57,13 +58,14 @@ export function sourceLabel(request, taskAgent) {
57
58
  /** 原因 → 标题文字(带来源标注)。 */
58
59
  export function approvalTitle(request, taskAgent) {
59
60
  const label = sourceLabel(request, taskAgent);
61
+ const t = msg().approval.title;
60
62
  const reason = isFirstRunRequest(request)
61
- ? "首次运行外部 Agent"
63
+ ? t.firstRun
62
64
  : request.reason === "dangerous"
63
- ? "危险命令"
65
+ ? t.dangerous
64
66
  : request.reason === "hook"
65
- ? "Hook 要求确认"
66
- : "需要确认";
67
+ ? t.hook
68
+ : t.confirm;
67
69
  return label === undefined ? reason : `${label} ${reason}`;
68
70
  }
69
71
  /** 外部 Agent 请求的正文:标题 + 种类、涉及路径、输入摘要。 */
@@ -73,30 +75,31 @@ function originLines(origin, theme, cwd) {
73
75
  out.push(theme.fg("muted", displayPath(path, cwd)));
74
76
  const hidden = (origin.toolCall.locations?.length ?? 0) - 3;
75
77
  if (hidden > 0)
76
- out.push(theme.fg("dim", `… 另 ${hidden} 个路径`));
78
+ out.push(theme.fg("dim", msg().approval.morePaths(hidden)));
77
79
  const summary = origin.toolCall.inputSummary;
78
80
  if (summary !== undefined && summary.trim() !== "") {
79
81
  const { shown, hidden: more } = lines(summary, COMMAND_LINES);
80
82
  out.push(...shown.map((l) => theme.fg("code", l)));
81
83
  if (more > 0)
82
- out.push(theme.fg("dim", `… 另 ${more} 行`));
84
+ out.push(theme.fg("dim", msg().approval.moreLines(more)));
83
85
  }
84
86
  return out;
85
87
  }
86
88
  /** 对话框正文(不含选项与按键行)。 */
87
89
  export function describeRequest(request, theme, options = {}) {
90
+ const m = msg().approval;
88
91
  const out = [];
89
92
  const label = sourceLabel(request, options.taskAgent);
90
93
  const task = label === undefined ? "" : theme.fg("warning", `${label} `);
91
94
  const origin = request.context?.origin;
92
95
  const firstRun = isFirstRunRequest(request);
93
96
  const tag = request.reason === "dangerous"
94
- ? theme.fg("error", "危险命令")
97
+ ? theme.fg("error", m.tag.dangerous)
95
98
  : request.reason === "hook"
96
- ? theme.fg("warning", "Hook 要求确认")
99
+ ? theme.fg("warning", m.tag.hook)
97
100
  : origin !== undefined
98
101
  ? theme.fg("dim", origin.toolCall.kind)
99
- : theme.fg("dim", firstRun ? "首次运行" : "需要确认");
102
+ : theme.fg("dim", firstRun ? m.tag.firstRun : m.tag.confirm);
100
103
  const input = record(request.input);
101
104
  const name = origin !== undefined
102
105
  ? theme.bold(theme.fg("tool", flat(origin.toolCall.title)))
@@ -104,7 +107,7 @@ export function describeRequest(request, theme, options = {}) {
104
107
  ? theme.bold(theme.fg("tool", `task ${String(input["agent"] ?? "")}`.trim()))
105
108
  : theme.bold(theme.fg("tool", request.toolName));
106
109
  out.push(options.compact === true ? `${task}${name}` : `${task}${name} ${tag}`);
107
- const more = (n) => theme.fg("dim", `… 另 ${n} 行(v 查看)`);
110
+ const more = (n) => theme.fg("dim", m.moreLinesView(n));
108
111
  if (origin !== undefined && options.expanded !== true) {
109
112
  out.push(...originLines(origin, theme, options.cwd));
110
113
  }
@@ -112,14 +115,14 @@ export function describeRequest(request, theme, options = {}) {
112
115
  out.push(String(input["note"]));
113
116
  const mode = input["mode"];
114
117
  if (typeof mode === "string")
115
- out.push(theme.fg("dim", `模式 ${isPermissionMode(mode) ? permissionModeLabel(mode) : mode}`));
118
+ out.push(theme.fg("dim", m.firstRunMode(isPermissionMode(mode) ? permissionModeLabel(mode) : mode)));
116
119
  }
117
120
  else if (options.expanded === true) {
118
121
  const json = JSON.stringify(request.input, null, 2) ?? String(request.input);
119
122
  const { shown, hidden } = lines(json, FULL_INPUT_LINES);
120
123
  out.push(...shown.map((l) => theme.fg("code", l)));
121
124
  if (hidden > 0)
122
- out.push(theme.fg("dim", `… 另 ${hidden} 行`));
125
+ out.push(theme.fg("dim", m.moreLines(hidden)));
123
126
  }
124
127
  else if (request.toolName === "bash" && typeof input["command"] === "string") {
125
128
  const { shown, hidden } = lines(input["command"], COMMAND_LINES);
@@ -129,11 +132,11 @@ export function describeRequest(request, theme, options = {}) {
129
132
  }
130
133
  else if (request.toolName === "write" && typeof input["content"] === "string") {
131
134
  const count = lines(input["content"], Number.MAX_SAFE_INTEGER).shown.length;
132
- out.push(`${toolSummary("write", input, options.cwd)} ${theme.fg("dim", `写入 ${count} 行`)}`);
135
+ out.push(`${toolSummary("write", input, options.cwd)} ${theme.fg("dim", m.writeLines(count))}`);
133
136
  }
134
137
  else if (request.toolName === "edit" && Array.isArray(input["edits"])) {
135
138
  const edits = input["edits"];
136
- out.push(`${toolSummary("edit", input, options.cwd)} ${theme.fg("dim", `${edits.length} 处修改`)}`);
139
+ out.push(`${toolSummary("edit", input, options.cwd)} ${theme.fg("dim", m.editCount(edits.length))}`);
137
140
  for (const edit of edits.slice(0, 2)) {
138
141
  for (const [sign, text, color] of [
139
142
  ["-", edit.oldText, "error"],
@@ -148,7 +151,7 @@ export function describeRequest(request, theme, options = {}) {
148
151
  }
149
152
  }
150
153
  if (edits.length > 2)
151
- out.push(theme.fg("dim", `… 另 ${edits.length - 2} 处`));
154
+ out.push(theme.fg("dim", m.moreEdits(edits.length - 2)));
152
155
  }
153
156
  else {
154
157
  const summary = toolSummary(request.toolName, input, options.cwd);
@@ -160,7 +163,7 @@ export function describeRequest(request, theme, options = {}) {
160
163
  : undefined;
161
164
  // 与首次运行确认合并(approval-merge.ts):允许即同意本会话以你的登录运行该 CLI
162
165
  if (runner !== undefined)
163
- out.push(theme.fg("warning", `外部 Agent ${agent}:以你在 ${runner} CLI 的登录运行(含本会话首次运行确认)`));
166
+ out.push(theme.fg("warning", m.externalRunner(String(agent), runner)));
164
167
  }
165
168
  const severity = request.preview?.severity;
166
169
  const color = severity === "danger" ? "error" : severity === "warn" ? "warning" : "dim";
@@ -169,30 +172,40 @@ export function describeRequest(request, theme, options = {}) {
169
172
  if (origin !== undefined || firstRun) {
170
173
  // 外部 Agent 的请求由它自己的策略决定要问;首次运行确认的说明已在正文
171
174
  if (origin !== undefined)
172
- out.push(theme.fg("dim", `${origin.agent} 请求确认`));
175
+ out.push(theme.fg("dim", m.originAsks(origin.agent)));
173
176
  else
174
- out.push(theme.fg("dim", "本会话首次以你的登录运行该 CLI"));
177
+ out.push(theme.fg("dim", m.firstRunLogin));
175
178
  }
176
179
  else if (request.reason === "hook") {
177
- out.push(theme.fg("warning", `Hook:${request.hookReason ?? "(无说明)"}`));
180
+ out.push(theme.fg("warning", m.hookReason(request.hookReason)));
178
181
  }
179
182
  else if (request.reason === "dangerous") {
180
- out.push(theme.fg("error", "这条命令可能有破坏性,请确认"));
183
+ out.push(theme.fg("error", m.dangerousWarn));
181
184
  }
182
185
  else if (auto !== undefined) {
183
- out.push(theme.fg("warning", `Auto ${AUTO_LAYER_TEXT[auto.layer]}:${auto.reason}`));
186
+ out.push(theme.fg("warning", m.autoReason(autoLayerText(auto.layer), auto.reason)));
184
187
  }
185
188
  else if (options.permissionMode !== undefined) {
186
189
  const mode = options.permissionMode;
187
190
  const label = isPermissionMode(mode) ? permissionModeLabel(mode) : mode;
188
- out.push(theme.fg("dim", `权限模式 ${label} 下需要确认`));
191
+ out.push(theme.fg("dim", m.modeNeedsConfirm(label)));
189
192
  }
190
193
  return out;
191
194
  }
195
+ /** 选项文字随界面语言(取用时求值)。 */
196
+ function option(decision, key, keys) {
197
+ return {
198
+ decision,
199
+ keys,
200
+ get label() {
201
+ return msg().approval.option[key];
202
+ },
203
+ };
204
+ }
192
205
  export const APPROVAL_OPTIONS = [
193
- { decision: "allow", label: "允许", keys: "y" },
194
- { decision: "allow_session", label: "本会话允许同类", keys: "a" },
195
- { decision: "deny", label: "拒绝", keys: "n Esc" },
206
+ option("allow", "allow", "y"),
207
+ option("allow_session", "allowSession", "a"),
208
+ option("deny", "deny", "n Esc"),
196
209
  ];
197
210
  /** 宽度低于它(Box 外宽)时用紧凑布局。 */
198
211
  const COMPACT_WIDTH = 56;
@@ -266,9 +279,7 @@ class ApprovalDialog {
266
279
  if (!compact)
267
280
  lines.push("");
268
281
  const arrows = theme.glyphs.arrowUp + theme.glyphs.arrowDown;
269
- const hint = compact
270
- ? `${arrows} Enter · v 完整输入`
271
- : `${arrows} 选择 · Enter 确认 · v 完整输入`;
282
+ const hint = compact ? msg().approval.hintCompact(arrows) : msg().approval.hint(arrows);
272
283
  lines.push(theme.fg("dim", hint));
273
284
  return lines.map((l) => truncateToWidth(l, width));
274
285
  }
@@ -346,14 +357,15 @@ export function approvalOutcomeText(request, outcome, taskAgent) {
346
357
  const origin = request.context?.origin;
347
358
  const tool = origin !== undefined ? flat(origin.toolCall.title, 60) : request.toolName;
348
359
  const what = `${label === undefined ? "" : `${label} `}${tool}`;
360
+ const m = msg().approval.outcome;
349
361
  switch (outcome) {
350
362
  case "allow":
351
- return `已允许 ${what}`;
363
+ return m.allow(what);
352
364
  case "allow_session":
353
- return `已允许 ${what}(本会话同类不再询问)`;
365
+ return m.allowSession(what);
354
366
  case "deny":
355
- return `已拒绝 ${what}`;
367
+ return m.deny(what);
356
368
  case "cancelled":
357
- return `审批已取消(超时或中断):${what}`;
369
+ return m.cancelled(what);
358
370
  }
359
371
  }
@@ -11,8 +11,8 @@ export type PasteOutcome = {
11
11
  ok: false;
12
12
  message: string;
13
13
  };
14
- export declare const NO_CLIPBOARD_TOOL = "\u8BFB\u4E0D\u4E86\u526A\u8D34\u677F\u56FE\u7247\uFF1A\u6CA1\u6709\u53EF\u7528\u7684\u7CFB\u7EDF\u547D\u4EE4\uFF08macOS osascript / pngpaste\uFF0CLinux wl-paste / xclip\uFF0CWindows PowerShell\uFF09";
15
- export declare const NO_CLIPBOARD_IMAGE = "\u526A\u8D34\u677F\u91CC\u6CA1\u6709\u56FE\u7247";
14
+ export declare function noClipboardTool(): string;
15
+ export declare function noClipboardImage(): string;
16
16
  /** `@路径`;路径带空白时加引号。 */
17
17
  export declare function imageRef(path: string): string;
18
18
  export declare function pasteImage(dataDir: string, deps?: ClipboardDeps): Promise<PasteOutcome>;
@@ -2,9 +2,14 @@
2
2
  * `Ctrl+V` 与 `/paste`:剪贴板图片写进 `<dataDir>/clipboard/`,输入框插入 `@<路径>`(发送时按 `@图片`
3
3
  * 附件读取)。[W5-U] 读取本身在 tools/clipboard-image.ts(W5-I)。
4
4
  */
5
+ import { msg } from "../../i18n/index.js";
5
6
  import { readClipboardImage } from "../../tools/clipboard-image.js";
6
- export const NO_CLIPBOARD_TOOL = "读不了剪贴板图片:没有可用的系统命令(macOS osascript / pngpaste,Linux wl-paste / xclip,Windows PowerShell)";
7
- export const NO_CLIPBOARD_IMAGE = "剪贴板里没有图片";
7
+ export function noClipboardTool() {
8
+ return msg().interactive.clipboard.noTool;
9
+ }
10
+ export function noClipboardImage() {
11
+ return msg().interactive.clipboard.noImage;
12
+ }
8
13
  /** `@路径`;路径带空白时加引号。 */
9
14
  export function imageRef(path) {
10
15
  return /\s/.test(path) ? `@"${path}"` : `@${path}`;
@@ -16,13 +21,13 @@ export async function pasteImage(dataDir, deps) {
16
21
  return { ok: true, ref: imageRef(result.path), path: result.path };
17
22
  return {
18
23
  ok: false,
19
- message: result.reason === "no_tool" ? NO_CLIPBOARD_TOOL : NO_CLIPBOARD_IMAGE,
24
+ message: result.reason === "no_tool" ? noClipboardTool() : noClipboardImage(),
20
25
  };
21
26
  }
22
27
  catch (error) {
23
28
  return {
24
29
  ok: false,
25
- message: `读取剪贴板失败:${error instanceof Error ? error.message : String(error)}`,
30
+ message: msg().interactive.clipboard.failed(error instanceof Error ? error.message : String(error)),
26
31
  };
27
32
  }
28
33
  }
@@ -10,10 +10,14 @@
10
10
  * - `/rewind`(无参数)打开回滚列表与确认面板(rewind-flow.ts);带参数走 commands-core,对话变了时
11
11
  * 重画消息区并回填原消息。
12
12
  * - 不是命令(含模板与 `/skill:`)返回 false,调用方把整行当提示发出。
13
+ * - [W6-C0] 面板钩子:`/config`(W6-S)、`/trace`(W6-T1)、`/memory`(W6-M)按 `PANEL_COMMANDS` 表分派到
14
+ * `CommandUi` 的可选钩子;`/tasks` 无参在有 `agentBar` 时聚焦 Agent 栏、`/tasks <id>` 在有 `agentView` 时
15
+ * 直接进子 Agent 视图(W6-A)。钩子没装时回落 commands-core(line 模式同一套文本)。
13
16
  */
14
17
  import type { AgentSession, RewindDraftText } from "../../agent/types.js";
15
18
  import type { SwitchRequest } from "../../cli/compose-session.js";
16
19
  import type { Runtime } from "../../cli/runtime.js";
20
+ import type { PermissionMode } from "../../permissions/types.js";
17
21
  import type { Component, SelectItem, Theme } from "../../tui.js";
18
22
  import { type CommandInfo } from "../commands-core.js";
19
23
  import { type NoticeLevel } from "./message-view.js";
@@ -21,7 +25,8 @@ import { type PickerSpec } from "./pickers.js";
21
25
  export declare const INTERACTIVE_COMMANDS: readonly CommandInfo[];
22
26
  /** 补全与 /help 用的完整命令表。 */
23
27
  export declare const ALL_COMMANDS: readonly CommandInfo[];
24
- export declare const KEY_HINTS: string;
28
+ /** `/help` 末尾的按键说明(多行)。 */
29
+ export declare function keyHints(): string;
25
30
  export interface CommandUi {
26
31
  readonly runtime: Runtime;
27
32
  session(): AgentSession;
@@ -48,9 +53,25 @@ export interface CommandUi {
48
53
  home?: string;
49
54
  /** 进程环境:给出时 /model 选择器按 fake-visibility 规则藏起测试供应商 fake。 */
50
55
  env?: Readonly<Record<string, string | undefined>>;
56
+ /** 切换权限模式前的确认(进入 Bypass 前弹确认框);返回 false 保持原模式。 */
57
+ confirmMode?(mode: PermissionMode): boolean | Promise<boolean>;
51
58
  /** [W5-U] 界面自己处理的第五波命令(agent-ui.ts);处理了返回 true。 */
52
59
  extra?(name: string, args: string): Promise<boolean>;
60
+ /** [W6-C0] 聚焦 Agent 栏(W6-A;`/tasks` 无参)。 */
61
+ agentBar?(): void | Promise<void>;
62
+ /** [W6-C0] 打开某任务的子 Agent 视图(W6-A;`/tasks <id>`)。 */
63
+ agentView?(taskId: string): void | Promise<void>;
64
+ /** [W6-C0] 轨迹覆盖层(W6-T1;`/trace [任务 id]`)。 */
65
+ traceView?(taskId?: string): void | Promise<void>;
66
+ /** [W6-C0] 记忆面板 / 子命令(W6-M;`/memory …`)。 */
67
+ memoryPanel?(args: string): void | Promise<void>;
68
+ /** [W6-C0] 设置面板(W6-S;`/config`,`/config key=value` 直接设一项)。 */
69
+ configPanel?(args: string): void | Promise<void>;
53
70
  }
71
+ /**
72
+ * [W6-C0] 面板类命令 → `CommandUi` 钩子。钩子存在就调用并返回 true;不存在返回 false(回落 commands-core)。
73
+ */
74
+ export declare const PANEL_COMMANDS: Readonly<Record<string, (ui: CommandUi, args: string) => Promise<boolean>>>;
54
75
  /** 当前分支上的条目 id(树选择器标 ●)。 */
55
76
  export declare function activeBranchIds(session: AgentSession): Set<string>;
56
77
  export declare function permissionsText(runtime: Runtime, session: AgentSession): string;