@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,191 @@
1
+ /**
2
+ * 子 Agent 视图的正文(docs/wave6-plan.md §1.2、D2)。[W6-A]
3
+ *
4
+ * - `AmaTranscript`:ama 子会话的全量消息,复用消息区的 `MessageView` / `ToolTracker` 渲染;先按条目重放
5
+ * (句柄在内存时读 `entries()`,被 LRU 释放或 resume 后只读加载子会话文件),运行中再跟随子会话事件。
6
+ * 视图里直接发的消息(`origin:"direct"`)按普通用户消息显示——在这里就是人发给它的。
7
+ * - `ExternalTranscript`:外部 Agent 的内存环形缓冲(文本、思考、工具起止、回合、notice);重启后缓冲为空,
8
+ * 只给一行「用原 CLI resume」的说明。
9
+ */
10
+ import { entryToMessage } from "../../session/projection.js";
11
+ import { readSessionReadOnly } from "../../session/scan.js";
12
+ import { indexEntries, pathToRoot } from "../../session/tree.js";
13
+ import { wrapTextWithAnsi } from "../../tui.js";
14
+ import { msg } from "../../i18n/index.js";
15
+ import { MessageView } from "./message-view.js";
16
+ import { ToolTracker } from "./tool-view.js";
17
+ /** 视图里人发的消息按普通用户消息显示。 */
18
+ function shown(message) {
19
+ if (message.role === "user" && message.origin === "direct") {
20
+ const { origin: _direct, ...rest } = message;
21
+ return rest;
22
+ }
23
+ return message;
24
+ }
25
+ /** 只读读子会话文件当前分支的条目。 */
26
+ export function readBranch(file) {
27
+ const session = readSessionReadOnly(file);
28
+ return pathToRoot(indexEntries(session.entries), session.leaf);
29
+ }
30
+ export class AmaTranscript {
31
+ options;
32
+ view;
33
+ tools;
34
+ constructor(options) {
35
+ this.options = options;
36
+ this.view = new MessageView(options);
37
+ this.tools = new ToolTracker({
38
+ theme: options.theme,
39
+ now: options.now,
40
+ ...(options.cwd !== undefined ? { cwd: options.cwd } : {}),
41
+ });
42
+ }
43
+ get isEmpty() {
44
+ return this.view.blockCount === 0;
45
+ }
46
+ /** 按条目重画(打开视图、重新接上句柄)。 */
47
+ load(entries) {
48
+ this.view.reset();
49
+ this.tools.clear();
50
+ const messages = [];
51
+ for (const entry of entries) {
52
+ const message = entryToMessage(entry);
53
+ if (message !== undefined)
54
+ messages.push(shown(message));
55
+ }
56
+ this.view.replay(messages, {
57
+ tool: (call, result) => {
58
+ if (result === undefined)
59
+ return this.tools.start({
60
+ toolCallId: call.id,
61
+ toolName: call.name,
62
+ args: call.arguments,
63
+ }).view;
64
+ return this.tools.completed(call.id, call.name, call.arguments, {
65
+ content: result.content,
66
+ isError: result.isError,
67
+ ...(result.details !== undefined ? { details: result.details } : {}),
68
+ }, result.isError);
69
+ },
70
+ });
71
+ }
72
+ /** 子会话事件;返回 true 表示内容变了。 */
73
+ onEvent(event) {
74
+ switch (event.type) {
75
+ case "message_start": {
76
+ const message = event.message;
77
+ if (message.role === "user")
78
+ this.view.addUser(shown(message));
79
+ else if (message.role === "assistant")
80
+ this.view.startAssistant(message);
81
+ else
82
+ return false;
83
+ return true;
84
+ }
85
+ case "message_update":
86
+ this.view.updateAssistant(event.message);
87
+ return true;
88
+ case "message_end":
89
+ if (event.message.role !== "assistant")
90
+ return false;
91
+ this.view.endAssistant(event.message);
92
+ return true;
93
+ case "tool_execution_start": {
94
+ const started = this.tools.start(event);
95
+ if (started.topLevel)
96
+ this.view.addTool(started.view);
97
+ return true;
98
+ }
99
+ case "tool_execution_update":
100
+ this.tools.update(event.toolCallId, event.partial);
101
+ return true;
102
+ case "tool_execution_end":
103
+ this.tools.end(event.toolCallId, event.result, event.isError);
104
+ return true;
105
+ default:
106
+ return false;
107
+ }
108
+ }
109
+ tick() {
110
+ this.tools.tick();
111
+ }
112
+ render(width) {
113
+ return this.view.render(width);
114
+ }
115
+ invalidate() {
116
+ this.view.invalidate();
117
+ }
118
+ }
119
+ export class ExternalTranscript {
120
+ theme;
121
+ source;
122
+ constructor(theme, source) {
123
+ this.theme = theme;
124
+ this.source = source;
125
+ }
126
+ get isEmpty() {
127
+ return this.source.events().length === 0;
128
+ }
129
+ render(width) {
130
+ const t = this.theme;
131
+ const g = t.glyphs;
132
+ const m = msg().agents.view;
133
+ const events = this.source.events();
134
+ if (events.length === 0) {
135
+ const text = this.source.running()
136
+ ? m.waiting
137
+ : this.source.sessionId !== undefined
138
+ ? m.externalGone(this.source.runner, this.source.sessionId)
139
+ : m.externalNoSession(this.source.runner);
140
+ return wrapTextWithAnsi(t.fg("dim", text), width);
141
+ }
142
+ // 工具:started 与随后同 id 的结束合成一行
143
+ const ended = new Map();
144
+ for (const e of events)
145
+ if (e.kind === "tool" && e.toolId !== undefined && e.status !== "started")
146
+ ended.set(e.toolId, e.status);
147
+ const out = [];
148
+ let last;
149
+ const block = (lines) => {
150
+ if (out.length > 0)
151
+ out.push("");
152
+ out.push(...lines);
153
+ };
154
+ for (const e of events) {
155
+ if (e.kind === "tool" && e.status !== "started" && e.toolId !== undefined)
156
+ continue;
157
+ switch (e.kind) {
158
+ case "text":
159
+ block(wrapTextWithAnsi((e.text ?? "").trim(), width));
160
+ break;
161
+ case "thought":
162
+ block(wrapTextWithAnsi(t.fg("dim", `${g.thinking} ${(e.text ?? "").trim()}`), width));
163
+ break;
164
+ case "tool": {
165
+ const status = e.toolId !== undefined ? ended.get(e.toolId) : e.status;
166
+ const mark = status === "completed"
167
+ ? t.fg("success", g.ok)
168
+ : status === "failed"
169
+ ? t.fg("error", g.fail)
170
+ : t.fg("dim", g.spinnerStatic);
171
+ const line = `${t.fg("tool", g.tool)} ${e.toolName ?? ""} ${mark}`;
172
+ // 相邻的工具行不空行
173
+ if (last === "tool")
174
+ out.push(line);
175
+ else
176
+ block([line]);
177
+ break;
178
+ }
179
+ case "turn":
180
+ block([t.fg("dim", `${g.rule.repeat(2)} ${m.turn(e.turn ?? 0)}`)]);
181
+ break;
182
+ case "notice":
183
+ block(wrapTextWithAnsi(t.fg(e.level === "warn" ? "warning" : "dim", e.text ?? ""), width));
184
+ break;
185
+ }
186
+ last = e.kind;
187
+ }
188
+ return out;
189
+ }
190
+ invalidate() { }
191
+ }
@@ -11,11 +11,21 @@
11
11
  *
12
12
  * 外部 Agent 的 notice(W5-E runner 的 `{type:"notice"}`)由任务注册表写进会话日志(`[task tN] …`),没有
13
13
  * 事件;这里在会话的 `options.log` 外面套一层,只把这类行转到消息区,其余照原样写日志。
14
+ *
15
+ * [W6-A] Agent 栏(agent-bar.ts,提示行之下、状态行之上)与子 Agent 视图(agent-view.ts,底部覆盖层):
16
+ * - 键位:空输入时 `Ctrl+B`(有任务即可)或 `↓`(栏可见时)进栏(`app.agents.focus`,key-dispatch.ts 先问这里);
17
+ * 栏内 ↑↓ 选、Enter 打开视图、Esc / Ctrl+B 返回,可打印字符回到输入框;
18
+ * - `/tasks` 无参 = 聚焦栏(`ui.agentBar: "off"` 时仍是原来的选择器),`/tasks <id>` = 直接进视图;
19
+ * - 等审批的任务按 `permission_request.context.taskId` 记下(栏与视图标题显示「等待审批」)。
14
20
  */
15
21
  import type { AgentSession, SessionEvent } from "../../agent/types.js";
16
22
  import type { SwitchRequest } from "../../cli/compose-session.js";
17
23
  import type { ClipboardDeps } from "../../tools/clipboard-image.js";
18
- import type { Component, Editor, TUI, Theme } from "../../tui.js";
24
+ import { type Component, type Editor, type TUI, type Theme } from "../../tui.js";
25
+ import { AgentBar } from "./agent-bar.js";
26
+ import type { CommandUi } from "./commands.js";
27
+ import type { AgentKeys } from "./key-dispatch.js";
28
+ import type { StatusArea } from "./status-area.js";
19
29
  import { FirstRunMerge } from "./approval-merge.js";
20
30
  import type { NoticeLevel } from "./message-view.js";
21
31
  import type { PickerSpec } from "./pickers.js";
@@ -47,15 +57,29 @@ export interface AgentUiDeps {
47
57
  displayPath(path: string): string;
48
58
  /** 剪贴板读取的注入(测试)。 */
49
59
  clipboard?: ClipboardDeps;
60
+ /** [W6-A] 底部区域:Agent 栏插在速率行 / 状态栏之上;`ui.*` 配置。 */
61
+ area?: Pick<StatusArea, "rate" | "ui">;
50
62
  }
63
+ /** [W6-A] `CommandUi` 的 Agent 栏 / 视图钩子(`/tasks`、`/tasks <id>`);晚绑定,装配时 agentUi 还没建。 */
64
+ export declare function agentCommandHooks(get: () => AgentUi): Pick<CommandUi, "agentBar" | "agentView">;
51
65
  export declare class AgentUi {
52
66
  private readonly deps;
53
67
  readonly plan: PlanFlow;
54
68
  readonly merge: FirstRunMerge;
69
+ /** [W6-A] Agent 栏。 */
70
+ readonly bar: AgentBar;
71
+ /** [W6-A] key-dispatch.ts 的 Agent 栏入口。 */
72
+ readonly keys: AgentKeys;
73
+ private view;
74
+ /** 等审批的请求 → 任务。 */
75
+ private readonly approvals;
55
76
  private restoreLog;
56
77
  /** 后台子 Agent 运行中:每秒重画跟随行的耗时(主会话空闲时 Loader 不转)。 */
57
78
  private ticker;
58
79
  constructor(deps: AgentUiDeps);
80
+ private keybindings;
81
+ private barEnabled;
82
+ private waiting;
59
83
  /** 新会话(启动、/new /resume /fork):接管计划审批,转发外部 Agent notice。 */
60
84
  attach(session: AgentSession): void;
61
85
  detach(): void;
@@ -67,6 +91,17 @@ export declare class AgentUi {
67
91
  /** 交互界面自己处理的第五波命令;不是返回 false。 */
68
92
  command(name: string, args: string): Promise<boolean>;
69
93
  private showPlan;
94
+ /** `/tasks`(无参):聚焦 Agent 栏;栏关闭(嵌入宿主缺省)时仍是选择器。 */
95
+ focusBar(): Promise<void>;
96
+ /** `app.agents.focus`(输入为空):`↓` 只在栏可见时进入,其它键(`Ctrl+B`)有任务即可。 */
97
+ private focusFromKey;
98
+ /** 栏聚焦时的按键;不在栏里返回 false。 */
99
+ private barKey;
100
+ /** `/tasks <id>` 与栏里 Enter:打开子 Agent 视图。 */
101
+ openView(taskId: string): void;
102
+ get viewing(): string | undefined;
103
+ /** 撤掉视图(Esc、换会话、退出);看到了结束后的状态就算查看过。 */
104
+ closeView(): void;
70
105
  private tasks;
71
106
  /** `Ctrl+V` / `/paste`:光标处插入 `@<路径>`。 */
72
107
  paste(): Promise<void>;
@@ -11,9 +11,19 @@
11
11
  *
12
12
  * 外部 Agent 的 notice(W5-E runner 的 `{type:"notice"}`)由任务注册表写进会话日志(`[task tN] …`),没有
13
13
  * 事件;这里在会话的 `options.log` 外面套一层,只把这类行转到消息区,其余照原样写日志。
14
+ *
15
+ * [W6-A] Agent 栏(agent-bar.ts,提示行之下、状态行之上)与子 Agent 视图(agent-view.ts,底部覆盖层):
16
+ * - 键位:空输入时 `Ctrl+B`(有任务即可)或 `↓`(栏可见时)进栏(`app.agents.focus`,key-dispatch.ts 先问这里);
17
+ * 栏内 ↑↓ 选、Enter 打开视图、Esc / Ctrl+B 返回,可打印字符回到输入框;
18
+ * - `/tasks` 无参 = 聚焦栏(`ui.agentBar: "off"` 时仍是原来的选择器),`/tasks <id>` = 直接进视图;
19
+ * - 等审批的任务按 `permission_request.context.taskId` 记下(栏与视图标题显示「等待审批」)。
14
20
  */
15
- import { taskRegistryView } from "../../agent/subagent-registry.js";
21
+ import { registryOf, taskRegistryView } from "../../agent/subagent-registry.js";
16
22
  import { planController } from "../../plan/controller.js";
23
+ import { msg } from "../../i18n/index.js";
24
+ import { defaultKeybindings, isPrintableText, parseKey, } from "../../tui.js";
25
+ import { AgentBar } from "./agent-bar.js";
26
+ import { AgentView } from "./agent-view.js";
17
27
  import { agentsPanel, planPanel, taskOutputPanel } from "./agent-panels.js";
18
28
  import { FirstRunMerge } from "./approval-merge.js";
19
29
  import { pasteImage } from "./clipboard-paste.js";
@@ -22,11 +32,28 @@ import { editExternally } from "./external-editor.js";
22
32
  import { PlanFlow } from "./plan-flow.js";
23
33
  import { backgroundEndText, SubagentTracker } from "./subagent-view.js";
24
34
  import { listTasks, stopTask, taskLine, taskOutput } from "./tasks-report.js";
35
+ /** [W6-A] `CommandUi` 的 Agent 栏 / 视图钩子(`/tasks`、`/tasks <id>`);晚绑定,装配时 agentUi 还没建。 */
36
+ export function agentCommandHooks(get) {
37
+ return {
38
+ agentBar: () => get().focusBar(),
39
+ agentView: (taskId) => get().openView(taskId),
40
+ };
41
+ }
25
42
  const TASK_NOTICE = /^\[task (t\d+)\] ([\s\S]*)$/;
26
43
  export class AgentUi {
27
44
  deps;
28
45
  plan;
29
46
  merge;
47
+ /** [W6-A] Agent 栏。 */
48
+ bar;
49
+ /** [W6-A] key-dispatch.ts 的 Agent 栏入口。 */
50
+ keys = {
51
+ handleKey: (data) => this.barKey(data),
52
+ focus: (data) => this.focusFromKey(data),
53
+ };
54
+ view;
55
+ /** 等审批的请求 → 任务。 */
56
+ approvals = new Map();
30
57
  restoreLog;
31
58
  /** 后台子 Agent 运行中:每秒重画跟随行的耗时(主会话空闲时 Loader 不转)。 */
32
59
  ticker;
@@ -51,15 +78,42 @@ export class AgentUi {
51
78
  notice: (level, text) => deps.notice(level, text),
52
79
  prompt: (text) => deps.prompt(text),
53
80
  });
81
+ this.bar = new AgentBar({
82
+ theme: deps.theme,
83
+ registry: () => registryOf(deps.session().state.sessionId),
84
+ tracker: deps.subagents,
85
+ now: () => deps.now(),
86
+ approvals: () => this.waiting(),
87
+ enabled: () => this.barEnabled(),
88
+ });
89
+ if (deps.area !== undefined)
90
+ deps.tui.insertBefore(this.bar, deps.area.rate);
91
+ }
92
+ keybindings() {
93
+ return this.deps.dialog.keybindings ?? defaultKeybindings;
94
+ }
95
+ barEnabled() {
96
+ return this.deps.area !== undefined && this.deps.area.ui().agentBar !== "off";
97
+ }
98
+ waiting() {
99
+ return new Set(this.approvals.values());
54
100
  }
55
101
  /** 新会话(启动、/new /resume /fork):接管计划审批,转发外部 Agent notice。 */
56
102
  attach(session) {
103
+ const viewing = this.viewing;
104
+ this.closeView();
105
+ // 换了会话:原来在看的任务不在新会话里
106
+ if (viewing !== undefined)
107
+ this.deps.notice("info", msg().agents.view.removed(viewing));
108
+ this.bar.reset();
109
+ this.approvals.clear();
57
110
  this.deps.subagents.clear();
58
111
  this.stopTicker();
59
112
  this.plan.attach(session);
60
113
  this.routeNotices(session);
61
114
  }
62
115
  detach() {
116
+ this.closeView();
63
117
  this.restoreLog?.();
64
118
  this.restoreLog = undefined;
65
119
  this.stopTicker();
@@ -76,6 +130,7 @@ export class AgentUi {
76
130
  return this.stopTicker();
77
131
  for (const state of live)
78
132
  this.deps.tools().get(state.parentToolCallId)?.refresh();
133
+ this.view?.component.tick();
79
134
  this.deps.render();
80
135
  }, 1000);
81
136
  this.ticker.unref?.();
@@ -121,6 +176,9 @@ export class AgentUi {
121
176
  if (state === undefined)
122
177
  return true;
123
178
  this.deps.tools().get(state.parentToolCallId)?.refresh();
179
+ // 视图里看的任务又开跑(续聊、被释放后重开):重新接上它的子会话
180
+ if (event.type === "subagent_start" && this.view?.component.task === event.taskId)
181
+ this.view.component.attach();
124
182
  // 后台任务:完成时 <task-notification> 那一行就是提示;失败 / 停止另给一行
125
183
  if (event.type === "subagent_end" && state.background && state.status !== "completed")
126
184
  this.deps.notice("warn", backgroundEndText(state));
@@ -136,6 +194,15 @@ export class AgentUi {
136
194
  case "background_job":
137
195
  this.deps.notice("info", backgroundJobText(event));
138
196
  return true;
197
+ case "permission_request": {
198
+ const taskId = event.context?.taskId;
199
+ if (taskId !== undefined)
200
+ this.approvals.set(event.requestId, taskId);
201
+ return false;
202
+ }
203
+ case "permission_resolved":
204
+ this.approvals.delete(event.requestId);
205
+ return false;
139
206
  default:
140
207
  return false;
141
208
  }
@@ -148,9 +215,6 @@ export class AgentUi {
148
215
  case "plan":
149
216
  await this.showPlan();
150
217
  return true;
151
- case "tasks":
152
- await this.tasks();
153
- return true;
154
218
  case "agents":
155
219
  this.deps.panel(agentsPanel(this.deps.session().state.sessionId, this.deps.theme));
156
220
  return true;
@@ -165,7 +229,7 @@ export class AgentUi {
165
229
  const session = this.deps.session();
166
230
  const controller = planController(session);
167
231
  if (controller === undefined) {
168
- this.deps.notice("info", "当前会话没有 Plan 能力");
232
+ this.deps.notice("info", msg().plan.command.unavailable);
169
233
  return;
170
234
  }
171
235
  this.deps.panel(planPanel(controller, session, this.deps.theme, this.deps.displayPath));
@@ -173,20 +237,122 @@ export class AgentUi {
173
237
  if (pending !== undefined && !session.state.isStreaming)
174
238
  await this.plan.ask(session, pending);
175
239
  }
240
+ // -------------------------------------------------------------------------
241
+ // [W6-A] Agent 栏与子 Agent 视图
242
+ // -------------------------------------------------------------------------
243
+ /** `/tasks`(无参):聚焦 Agent 栏;栏关闭(嵌入宿主缺省)时仍是选择器。 */
244
+ async focusBar() {
245
+ if (!this.barEnabled())
246
+ return this.tasks();
247
+ if (!this.bar.focus()) {
248
+ this.deps.notice("info", msg().agents.bar.empty);
249
+ return;
250
+ }
251
+ this.deps.render();
252
+ }
253
+ /** `app.agents.focus`(输入为空):`↓` 只在栏可见时进入,其它键(`Ctrl+B`)有任务即可。 */
254
+ focusFromKey(data) {
255
+ if (this.view !== undefined || !this.barEnabled())
256
+ return false;
257
+ if (parseKey(data)?.id === "down" && !this.bar.visible)
258
+ return false;
259
+ if (!this.bar.focus())
260
+ return false;
261
+ this.deps.render();
262
+ return true;
263
+ }
264
+ /** 栏聚焦时的按键;不在栏里返回 false。 */
265
+ barKey(data) {
266
+ if (!this.bar.focused)
267
+ return false;
268
+ const keys = this.keybindings();
269
+ if (keys.matches(data, "tui.select.up")) {
270
+ if (!this.bar.move(-1))
271
+ this.bar.blur();
272
+ }
273
+ else if (keys.matches(data, "tui.select.down"))
274
+ this.bar.move(1);
275
+ else if (keys.matches(data, "tui.editor.submit")) {
276
+ const taskId = this.bar.selected();
277
+ if (taskId !== undefined)
278
+ this.openView(taskId);
279
+ }
280
+ else if (keys.matches(data, "tui.select.cancel") || keys.matches(data, "app.agents.focus"))
281
+ this.bar.blur();
282
+ else {
283
+ // 可打印字符与其它键:退出栏,交给输入框
284
+ this.bar.blur();
285
+ this.deps.render();
286
+ return !isPrintableText(data) && keys.actionsFor(data).length === 0;
287
+ }
288
+ this.deps.render();
289
+ return true;
290
+ }
291
+ /** `/tasks <id>` 与栏里 Enter:打开子 Agent 视图。 */
292
+ openView(taskId) {
293
+ const sessionId = this.deps.session().state.sessionId;
294
+ if (taskRegistryView(sessionId)?.get(taskId) === undefined) {
295
+ this.deps.notice("info", msg().agents.view.unknown(taskId));
296
+ return;
297
+ }
298
+ this.closeView();
299
+ const ui = this.deps.area?.ui() ?? {};
300
+ const component = new AgentView(taskId, {
301
+ theme: this.deps.theme,
302
+ keys: this.keybindings(),
303
+ registry: () => registryOf(this.deps.session().state.sessionId),
304
+ tracker: this.deps.subagents,
305
+ approvals: () => this.waiting(),
306
+ now: () => this.deps.now(),
307
+ rows: () => this.deps.tui.terminal.rows,
308
+ render: () => this.deps.render(),
309
+ siblings: () => this.bar.all().map((row) => row.taskId),
310
+ close: () => this.closeView(),
311
+ stop: (id) => stopTask(this.deps.session().state.sessionId, id),
312
+ messages: {
313
+ ...(ui.showThinking !== undefined ? { showThinking: ui.showThinking } : {}),
314
+ ...(ui.markdown !== undefined ? { markdown: ui.markdown } : {}),
315
+ ...(ui.compact === true ? { compact: true } : {}),
316
+ },
317
+ });
318
+ // 视图盖住主区时主区不变(栏收起);Esc 回到主界面
319
+ this.bar.blur();
320
+ const handle = this.deps.tui.showOverlay(component, { anchor: "bottom" });
321
+ this.view = { component, handle };
322
+ this.deps.render();
323
+ }
324
+ get viewing() {
325
+ return this.view?.component.task;
326
+ }
327
+ /** 撤掉视图(Esc、换会话、退出);看到了结束后的状态就算查看过。 */
328
+ closeView() {
329
+ const view = this.view;
330
+ if (view === undefined)
331
+ return;
332
+ this.view = undefined;
333
+ view.component.dispose();
334
+ view.handle.hide();
335
+ const taskId = view.component.task;
336
+ const info = taskRegistryView(this.deps.session().state.sessionId)?.get(taskId);
337
+ if (info !== undefined && info.status !== "running")
338
+ this.bar.markViewed(taskId);
339
+ this.bar.blur();
340
+ this.deps.render();
341
+ }
176
342
  async tasks() {
177
343
  const sessionId = this.deps.session().state.sessionId;
178
344
  const tasks = listTasks(sessionId);
179
345
  if (tasks.length === 0) {
180
- this.deps.notice("info", "还没有子 Agent 任务");
346
+ this.deps.notice("info", msg().panels.tasks.none);
181
347
  return;
182
348
  }
183
349
  const now = this.deps.now();
184
350
  const picked = await this.deps.pick({
185
- title: "子 Agent 任务",
351
+ title: msg().interactive.agentUi.tasksTitle,
186
352
  items: [...tasks]
187
353
  .reverse()
188
354
  .map((task) => ({ value: task.taskId, label: taskLine(task, now) })),
189
- footer: "↑↓ 选择 · Enter 查看 · Esc 取消",
355
+ footer: msg().interactive.agentUi.tasksFooter("↑↓"),
190
356
  });
191
357
  if (picked === undefined)
192
358
  return;
@@ -195,10 +361,10 @@ export class AgentUi {
195
361
  return;
196
362
  if (task.status === "running") {
197
363
  const action = await this.deps.pick({
198
- title: `任务 ${task.taskId}`,
364
+ title: msg().panels.tasks.title(task.taskId),
199
365
  items: [
200
- { value: "output", label: "查看已有输出" },
201
- { value: "stop", label: "停止任务" },
366
+ { value: "output", label: msg().interactive.agentUi.viewOutput },
367
+ { value: "stop", label: msg().interactive.agentUi.stop },
202
368
  ],
203
369
  numberKeys: true,
204
370
  });
@@ -206,7 +372,7 @@ export class AgentUi {
206
372
  return;
207
373
  if (action.value === "stop") {
208
374
  await stopTask(sessionId, task.taskId);
209
- this.deps.notice("info", `已停止 ${task.taskId}`);
375
+ this.deps.notice("info", msg().interactive.agentUi.stopped(task.taskId));
210
376
  return;
211
377
  }
212
378
  }
@@ -217,7 +383,7 @@ export class AgentUi {
217
383
  }
218
384
  /** `Ctrl+V` / `/paste`:光标处插入 `@<路径>`。 */
219
385
  async paste() {
220
- this.deps.hint("读取剪贴板…");
386
+ this.deps.hint(msg().interactive.clipboard.reading);
221
387
  const pasted = await pasteImage(this.deps.dataDir, this.deps.clipboard);
222
388
  if (!pasted.ok) {
223
389
  this.deps.hint("");
@@ -228,7 +394,7 @@ export class AgentUi {
228
394
  const before = editor.getText();
229
395
  const lead = before === "" || /\s$/.test(before) ? "" : " ";
230
396
  editor.insertText(`${lead}${pasted.ref} `);
231
- this.deps.hint("已插入剪贴板图片");
397
+ this.deps.hint(msg().interactive.clipboard.inserted);
232
398
  this.deps.render();
233
399
  }
234
400
  }
@@ -0,0 +1,72 @@
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 { type Component, type Focusable, type Keybindings, type Theme } from "../../tui.js";
21
+ import { type TaskSource } from "./agent-bar.js";
22
+ import type { MessageViewOptions } from "./message-view.js";
23
+ import type { SubagentTracker } from "./subagent-view.js";
24
+ export interface AgentViewDeps {
25
+ theme: Theme;
26
+ keys: Keybindings;
27
+ registry(): TaskSource | undefined;
28
+ tracker: SubagentTracker;
29
+ approvals(): ReadonlySet<string>;
30
+ now(): number;
31
+ /** 终端行数(视图高度 = 行数 − 1)。 */
32
+ rows(): number;
33
+ render(): void;
34
+ /** 兄弟任务的顺序(←/→)。 */
35
+ siblings(): string[];
36
+ /** 换了查看的任务(栏的选择跟着走)。 */
37
+ onSwitch?(taskId: string): void;
38
+ close(): void;
39
+ stop(taskId: string): Promise<void>;
40
+ /** 消息区的显示选项(思考块、Markdown、紧凑)。 */
41
+ messages?: Omit<MessageViewOptions, "theme">;
42
+ }
43
+ export declare class AgentView implements Component, Focusable {
44
+ private taskId;
45
+ private readonly deps;
46
+ private readonly editor;
47
+ private body;
48
+ private off;
49
+ private follow;
50
+ /** 不跟随时正文窗口的首行。 */
51
+ private top;
52
+ private lastBody;
53
+ private flash;
54
+ private notice;
55
+ private _focused;
56
+ constructor(taskId: string, deps: AgentViewDeps);
57
+ get task(): string;
58
+ get focused(): boolean;
59
+ set focused(value: boolean);
60
+ /** 接上任务的数据(打开、切兄弟任务、任务重新开跑);任务不存在返回 false。 */
61
+ attach(): boolean;
62
+ dispose(): void;
63
+ /** 每秒:运行中的工具重画耗时。 */
64
+ tick(): void;
65
+ private switchTo;
66
+ private submit;
67
+ handleInput(data: string): void;
68
+ private scroll;
69
+ private title;
70
+ render(width: number): string[];
71
+ invalidate(): void;
72
+ }