@armadra/agent 0.6.2 → 0.6.4

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 (147) hide show
  1. package/CHANGELOG.md +85 -0
  2. package/CHANGELOG.zh-CN.md +59 -0
  3. package/README.md +168 -575
  4. package/README.zh-CN.md +165 -596
  5. package/dist/agent/queue.d.ts +9 -0
  6. package/dist/agent/queue.js +27 -0
  7. package/dist/agent/session-subagent.d.ts +1 -0
  8. package/dist/agent/session-subagent.js +9 -0
  9. package/dist/agent/session.d.ts +11 -0
  10. package/dist/agent/session.js +29 -2
  11. package/dist/agent/subagent-background.d.ts +75 -0
  12. package/dist/agent/subagent-background.js +209 -0
  13. package/dist/agent/subagent-direct.d.ts +5 -2
  14. package/dist/agent/subagent-direct.js +34 -1
  15. package/dist/agent/subagent-registry.d.ts +26 -6
  16. package/dist/agent/subagent-registry.js +66 -94
  17. package/dist/agent/types-w5.d.ts +11 -1
  18. package/dist/agent/types.d.ts +12 -0
  19. package/dist/agents/builtin.js +0 -1
  20. package/dist/agents/external.js +0 -1
  21. package/dist/agents/parse.js +4 -3
  22. package/dist/agents/result.d.ts +7 -1
  23. package/dist/agents/result.js +20 -1
  24. package/dist/agents/task-control.d.ts +13 -2
  25. package/dist/agents/task-record.d.ts +16 -4
  26. package/dist/agents/task-record.js +32 -0
  27. package/dist/agents/types.d.ts +5 -1
  28. package/dist/ai/apis/chatgpt-rate-limits.js +7 -2
  29. package/dist/ai/providers/discovered-cache.d.ts +10 -4
  30. package/dist/ai/providers/discovered-cache.js +30 -14
  31. package/dist/ai/types.d.ts +2 -1
  32. package/dist/auth/chatgpt/backend-client.d.ts +6 -5
  33. package/dist/auth/chatgpt/backend-client.js +8 -7
  34. package/dist/bundle/ama.cjs +2034 -552
  35. package/dist/cli/compose-agents.d.ts +2 -1
  36. package/dist/cli/compose-agents.js +11 -2
  37. package/dist/cli/subcommands/models-discover.d.ts +1 -0
  38. package/dist/cli/subcommands/models-discover.js +12 -2
  39. package/dist/config/json-schema.js +10 -2
  40. package/dist/config/key-docs.js +9 -2
  41. package/dist/config/merge.d.ts +1 -1
  42. package/dist/config/merge.js +20 -3
  43. package/dist/config/schema-w5.js +4 -2
  44. package/dist/config/schema.js +4 -0
  45. package/dist/config/settings-registry.js +5 -0
  46. package/dist/config/types-w5.d.ts +10 -0
  47. package/dist/config/types-w5.js +2 -0
  48. package/dist/config/types.d.ts +5 -1
  49. package/dist/drivers/runner.js +29 -2
  50. package/dist/git/info.d.ts +19 -0
  51. package/dist/git/info.js +64 -8
  52. package/dist/i18n/catalog.d.ts +58 -8
  53. package/dist/i18n/messages/agents.d.ts +60 -0
  54. package/dist/i18n/messages/agents.js +62 -2
  55. package/dist/i18n/messages/config-keys.d.ts +8 -0
  56. package/dist/i18n/messages/config-keys.js +18 -10
  57. package/dist/i18n/messages/config.d.ts +8 -0
  58. package/dist/i18n/messages/interactive-startup.d.ts +0 -16
  59. package/dist/i18n/messages/interactive-startup.js +0 -16
  60. package/dist/i18n/messages/interactive-view.d.ts +8 -0
  61. package/dist/i18n/messages/interactive-view.js +10 -0
  62. package/dist/i18n/messages/interactive.d.ts +33 -16
  63. package/dist/i18n/messages/interactive.js +31 -0
  64. package/dist/i18n/messages/print.d.ts +4 -0
  65. package/dist/i18n/messages/print.js +4 -0
  66. package/dist/i18n/messages/report.d.ts +8 -0
  67. package/dist/i18n/messages/report.js +12 -4
  68. package/dist/i18n/messages/settings.d.ts +8 -0
  69. package/dist/i18n/messages/settings.js +8 -0
  70. package/dist/i18n/messages/subcommands-config.d.ts +4 -0
  71. package/dist/i18n/messages/subcommands-config.js +4 -0
  72. package/dist/i18n/messages/subcommands.d.ts +4 -0
  73. package/dist/index.d.ts +1 -0
  74. package/dist/modes/commands-core.js +19 -4
  75. package/dist/modes/interactive/agent-bar.d.ts +3 -1
  76. package/dist/modes/interactive/agent-bar.js +12 -5
  77. package/dist/modes/interactive/agent-ui.d.ts +21 -3
  78. package/dist/modes/interactive/agent-ui.js +82 -12
  79. package/dist/modes/interactive/agent-view.d.ts +9 -0
  80. package/dist/modes/interactive/agent-view.js +28 -4
  81. package/dist/modes/interactive/approval-dock.d.ts +51 -0
  82. package/dist/modes/interactive/approval-dock.js +112 -0
  83. package/dist/modes/interactive/approval-ui.d.ts +43 -0
  84. package/dist/modes/interactive/approval-ui.js +64 -0
  85. package/dist/modes/interactive/commands.js +4 -1
  86. package/dist/modes/interactive/event-notices.d.ts +6 -1
  87. package/dist/modes/interactive/event-notices.js +7 -1
  88. package/dist/modes/interactive/interactive-mode.d.ts +4 -2
  89. package/dist/modes/interactive/interactive-mode.js +46 -39
  90. package/dist/modes/interactive/interrupt-send.d.ts +25 -0
  91. package/dist/modes/interactive/interrupt-send.js +32 -0
  92. package/dist/modes/interactive/key-dispatch.d.ts +29 -5
  93. package/dist/modes/interactive/key-dispatch.js +97 -8
  94. package/dist/modes/interactive/line/line-mode.d.ts +1 -0
  95. package/dist/modes/interactive/line/line-mode.js +34 -7
  96. package/dist/modes/interactive/run-indicator.d.ts +34 -2
  97. package/dist/modes/interactive/run-indicator.js +62 -8
  98. package/dist/modes/interactive/session-events.js +5 -1
  99. package/dist/modes/interactive/startup-header.d.ts +29 -14
  100. package/dist/modes/interactive/startup-header.js +93 -59
  101. package/dist/modes/interactive/startup-logo.d.ts +83 -0
  102. package/dist/modes/interactive/startup-logo.js +183 -0
  103. package/dist/modes/interactive/status-area.d.ts +18 -0
  104. package/dist/modes/interactive/status-area.js +67 -1
  105. package/dist/modes/interactive/status-bar.d.ts +13 -2
  106. package/dist/modes/interactive/status-bar.js +60 -17
  107. package/dist/modes/interactive/status-line.d.ts +11 -8
  108. package/dist/modes/interactive/status-line.js +52 -39
  109. package/dist/modes/interactive/status-quota.d.ts +58 -0
  110. package/dist/modes/interactive/status-quota.js +155 -0
  111. package/dist/modes/interactive/subagent-view.d.ts +1 -0
  112. package/dist/modes/interactive/subagent-view.js +8 -0
  113. package/dist/modes/interactive/task-background.d.ts +31 -0
  114. package/dist/modes/interactive/task-background.js +68 -0
  115. package/dist/modes/interactive/tool-view.d.ts +7 -1
  116. package/dist/modes/interactive/tool-view.js +24 -1
  117. package/dist/modes/print/print-mode.d.ts +11 -0
  118. package/dist/modes/print/print-mode.js +36 -1
  119. package/dist/modes/rpc/commands.d.ts +4 -1
  120. package/dist/modes/rpc/commands.js +24 -2
  121. package/dist/rpc.d.ts +20 -0
  122. package/dist/rpc.js +3 -0
  123. package/dist/tools/task-ctl.d.ts +2 -0
  124. package/dist/tools/task-ctl.js +7 -2
  125. package/dist/tools/task.d.ts +11 -0
  126. package/dist/tools/task.js +20 -2
  127. package/dist/tools/types.d.ts +6 -0
  128. package/dist/tui/components/editor.d.ts +2 -0
  129. package/dist/tui/components/editor.js +4 -0
  130. package/dist/tui/components/loader.d.ts +5 -1
  131. package/dist/tui/components/loader.js +18 -5
  132. package/dist/tui/keybindings.d.ts +15 -3
  133. package/dist/tui/keybindings.js +15 -3
  134. package/docs/agents.md +52 -28
  135. package/docs/en/host-api.md +5 -1
  136. package/docs/en/providers.md +1 -1
  137. package/docs/en/rpc.md +28 -14
  138. package/docs/en/sessions.md +3 -1
  139. package/docs/en/tui.md +106 -70
  140. package/docs/host-api.md +5 -1
  141. package/docs/providers.md +4 -2
  142. package/docs/rpc.md +28 -14
  143. package/docs/session-format.md +1 -1
  144. package/docs/sessions.md +2 -1
  145. package/docs/tui-design.md +42 -29
  146. package/docs/tui.md +106 -70
  147. package/package.json +1 -1
@@ -89,37 +89,49 @@
89
89
 
90
90
  ### 3.1 启动头
91
91
 
92
- `ui.quietStartup: normal`(80 列):
92
+ `ui.quietStartup: normal`,宽 ≥ 72 列(字符画在左,信息列在右,顶端对齐,中间空 3 列;无框):
93
93
 
94
94
  ```
95
- ╭──────────────────────────────────────────────────────────╮
96
- │ ✻ ama 0.1.0 │
97
- │ │
98
- │ 模型 anthropic/claude-sonnet-4-5@messages · 思考 medium │
99
- │ 目录 ~/Projects/armadra-agent · 已信任(trust.json) │
100
- │ 模式 Accept edits · 预设 default · codemode on │
101
- │ 已加载 CLAUDE.md, AGENTS.md · 3 Skill · 2 模板 · 4 Hook │
102
- │ │
103
- │ /help 命令 · Shift+Tab 切模式 · Ctrl+O 展开工具输出 │
104
- ╰──────────────────────────────────────────────────────────╯
95
+ ▄███▄ ██▄ ▄██ ▄███▄ ama 0.1.0
96
+ ██▀ ▀██ ███▄ ▄███ ██▀ ▀██ anthropic/claude-sonnet-4-5@messages · 思考 medium
97
+ ███████ ██ ▀█▀ ██ ███████ ~/Projects/armadra-agent · 已信任(trust.json)
98
+ ██ ██ ██ ██ ██ ██ Accept edits · 预设 default · codemode on
99
+ ▀▀ ▀▀ ▀▀ ▀▀ ▀▀ ▀▀ CLAUDE.md, AGENTS.md · 3 Skill · 2 模板 · 4 Hook
100
+ 警告 2 条(ama doctor)
101
+ /help 命令 · Shift+Tab 切模式 · Ctrl+O 展开工具输出
105
102
  ```
106
103
 
107
- - 框宽 `min(width, 60)`,不居中(左对齐,便于回滚里对齐正文);边框 `border`;`✻ ama 0.1.0` 粗体,`✻` `accent`;键名列 `dim`,值 `text`,模型 `accent`,`已信任` `success` / `未信任` `warning`,`Bypass permissions` 时模式值 `warning`;最后一行 `dim`。
108
- - 警告条数 `警告 2 条(ama doctor 查看)` 用 `warning`,放在「已加载」之后。
109
- - `header` 档(profile 缺省):一行 `✻ ama 0.1.0 · anthropic/claude-sonnet-4-5 · Accept edits · /help`,无框。`silent` 不输出。
104
+ - 字形 5 行、宽 25,只用 `█ ▀ ▄`(1 列宽,回滚与 `capture-pane` 里照样对齐)。按字母着色:A `accent`、M `user`、A `tool`,粗体;深色主题是蓝 → 浅蓝 → 紫,浅色主题是深蓝 → 蓝 → 紫,16 色退为亮蓝 / 亮蓝 / 品红(深)或蓝 / 蓝 / 品红(浅)。
105
+ - 信息列:`ama` 粗体 + 版本 `dim`;模型 `accent`;`已信任` `success` / `未信任` `warning`;`Bypass permissions` 时模式 `warning`;警告行 `warning`;按键提示与分隔点 `dim`。已加载 / 宿主 / 警告有才画,多出字形高度的行左侧留空。
106
+ - 48–71 列:字符画在上,空一行,信息列在下(同样的行)。
107
+ - < 48 列:不画字符画,两行 `✻ ama 0.1.0 · anthropic/claude-sonnet-4-5 · medium` / `Accept edits · …/armadra-agent · 已信任`,有警告再加一行。
108
+ - `ui.logo: "off"` 或 `ui.compact`:只画信息列,首行 `✻ ama 0.1.0`(`✻` `accent`)。
109
+ - `header` 档(profile 缺省):一行 `✻ ama 0.1.0 · anthropic/claude-sonnet-4-5 · Accept edits · /help`。`silent` 不输出。
110
+ - 路径用 `~` 缩写,过长从左截断(`…/armadra-agent`);每行截到可用宽度。
110
111
 
111
- 40 列(normal 自动降为无框多行,键列省略):
112
+ ASCII(`ui.ascii` / `AMA_ASCII=1`)字形,同样着色:
112
113
 
113
114
  ```
114
- ✻ ama 0.1.0
115
- anthropic/claude-sonnet-4-5 · medium
116
- ~/Projects/armadra-agent · 已信任
117
- Accept edits · default · codemode on
118
- CLAUDE.md, AGENTS.md · 3 Skill · 4 Hook
119
- /help · Shift+Tab 切模式
115
+ _ __ __ _
116
+ / \ | \/ | / \
117
+ / _ \ | |\/| | / _ \
118
+ / ___ \| | | |/ ___ \
119
+ /_/ \_\_| |_/_/ \_\
120
120
  ```
121
121
 
122
- 规则:`width < 56` 时去框去键列;路径用 `~` 缩写并从左侧截断(`…/armadra-agent`)。
122
+ #### 3.1.1 启动动画
123
+
124
+ 「点亮」扫描:字形先整体 `dim`,3 列宽的高亮带(`text` 粗体)从左扫到右,扫过的列定格为字母色;每帧前进 1 列、32 ms 一帧,共 28 帧(约 0.9 s,上限 1.2 s),之后停在定格帧。只有字符画变,信息列一开始就是定格内容。
125
+
126
+ 中间帧(第 12 帧,括号内为样式,实际不显示):
127
+
128
+ ```
129
+ ▄███▄ ██▄ ▄██ ▄███▄ ← A 已定格(accent)、M 左半 user、第 10–12 列高亮(text)、其后 dim
130
+ ```
131
+
132
+ - 动画帧通过差分渲染原地改写启动头所在行,只在整屏内容装得下视口时播放(每帧前再检查一次,内容超出或宽度变化立即定格),所以回滚区只留定格帧。
133
+ - 按任意键立即定格;按键不被吞,照常交给输入框。退出时也先定格。
134
+ - 不播放(直接画定格帧):`ui.animation: false`、无色(`NO_COLOR` 等)、stdout 非 TTY、嵌入宿主(profile.host)、`CI` 环境、命令行带初始提示、终端矮于 16 行、没画字符画(`header` / `silent` 档、`ui.logo: off`、`ui.compact`、窄于 48 列)。行式界面、`-p`、RPC、ACP 不走交互模式。
123
135
 
124
136
  ### 3.2 用户消息
125
137
 
@@ -640,7 +652,7 @@ Manual 模式下 `task(agent="claude")` 的 task 调用审批正文多一行「
640
652
  - **Ctrl+O**:全局切换(现有),范围扩大到思考块(§3.4);提示行 `工具输出:展开`。
641
653
  - **流式防闪烁**:Markdown 按块缓存只重渲末块(现有);代码块固定全宽;工具调用标题行在运行中不变(spinner 不放标题,放 `⎿` 摘要行);状态栏只在事件时 `refresh()`;状态栏右区 token 数在流式期间不更新(`message_end` 才更新),避免每 chunk 改最后一行。
642
654
  - **行数只增不减**:运行中 → 完成的替换保持 ≥ 原行数(bash 尾部 8 行 → 完成后 3 行 + 折叠提示会变短;允许,但差分会清多出的行——这是现有 `diff()` 覆盖的路径)。
643
- - **宽度变化**:全量重画最后一屏(现有);Markdown / ToolView / KeyValue 缓存都带 width 键;启动头 Box 按新宽重算是否去框。
655
+ - **宽度变化**:全量重画最后一屏(现有);Markdown / ToolView / KeyValue 缓存都带 width 键;启动头按新宽重算布局(并排 / 叠放 / 两行)。
644
656
  - **覆盖层**:审批 bottom 全宽;选择器 center 宽 `min(width - 2, 72)`;覆盖层打开时编辑器提示符变 dim、Loader 动词 `等待确认`。
645
657
  - **tmux**:所有新字形都是 1 列;`▎`(U+258E)、`⎿`、`⏺` 在 Windows Terminal + Cascadia / 等宽回退字体下测过宽度为 1;检测失败的用户用 `AMA_ASCII=1`。
646
658
 
@@ -648,12 +660,13 @@ Manual 模式下 `task(agent="claude")` 的 task 调用审批正文多一行「
648
660
 
649
661
  ### 5.1 配置项(只加必要的)
650
662
 
651
- | 键 | 类型 | 缺省 | 说明 |
652
- | -------------- | ----------------------------- | -------- | ---------------------- |
653
- | `ui.theme` | `"dark" \| "light" \| "auto"` | `dark` | 新增 `auto`(§2.1) |
654
- | `ui.ascii` | boolean | 自动检测 | `AMA_ASCII=1` 等价 |
655
- | `ui.compact` | boolean | `false` | 块间不空行、启动头无框 |
656
- | `ui.animation` | boolean | `true` | false → spinner 静态 |
663
+ | 键 | 类型 | 缺省 | 说明 |
664
+ | -------------- | ----------------------------- | -------- | -------------------------------- |
665
+ | `ui.theme` | `"dark" \| "light" \| "auto"` | `dark` | 新增 `auto`(§2.1) |
666
+ | `ui.ascii` | boolean | 自动检测 | `AMA_ASCII=1` 等价 |
667
+ | `ui.compact` | boolean | `false` | 块间不空行、启动头不画字符画 |
668
+ | `ui.logo` | `"auto" \| "off"` | `auto` | off → 启动头不画字符画 |
669
+ | `ui.animation` | boolean | `true` | false → spinner 与启动字符画静态 |
657
670
 
658
671
  改 `src/config/types.ts`(`UiConfig`)、`src/config/schema.ts`(`checkSection("ui", …)` 加键)、`src/config/json-schema.ts`、`docs/design.md §10.2`。`AMA_ASCII` 加进 `src/config/paths.ts` 旁的环境变量表(有文档的话)。
659
672
 
package/docs/tui.md CHANGED
@@ -9,16 +9,12 @@
9
9
  视觉规格(配色、字形、逐屏样稿)见 [tui-design.md](tui-design.md)。层级用缩进表达:第 0 列是用户 `›`、工具 `⏺` 与提示符号,第 2 列是结果连接符 `⎿`,第 4 列是工具输出;去掉颜色(`NO_COLOR`、`capture-pane` 不带 `-e`)也读得出结构。
10
10
 
11
11
  ```
12
- ╭──────────────────────────────────────────────────────────────╮
13
- │ ✻ ama 0.3.0 │ ← 启动头(normal 档)
14
- │ │
15
- │ 模型 anthropic/claude-sonnet-4-5 · 思考 medium │
16
- │ 目录 ~/Projects/demo · 已信任(trust.json) │
17
- │ 模式 Accept edits · 预设 default │
18
- │ 已加载 AGENTS.md · 2 Skill │
19
- │ │
20
- │ /help 命令 · Shift+Tab 切模式 · Ctrl+O 展开工具输出 │
21
- ╰──────────────────────────────────────────────────────────────╯
12
+ ▄███▄ ██▄ ▄██ ▄███▄ ama 0.6.2 ← 启动头(normal 档)
13
+ ██▀ ▀██ ███▄ ▄███ ██▀ ▀██ anthropic/claude-sonnet-4-5@messages · 思考 medium
14
+ ███████ ██ ▀█▀ ██ ███████ ~/Projects/demo · 已信任(trust.json)
15
+ ██ ██ ██ ██ ██ ██ Accept edits · 预设 default
16
+ ▀▀ ▀▀ ▀▀ ▀▀ ▀▀ ▀▀ AGENTS.md · 2 Skill
17
+ /help 命令 · Shift+Tab 切模式 · Ctrl+O 展开工具输出
22
18
 
23
19
  › 读一下 README ← 用户消息(续行缩进 2 列)
24
20
 
@@ -37,24 +33,27 @@
37
33
  ────────────────────────────────────────────────
38
34
  › 输入消息,/ 命令,@ 文件,Shift+Enter 换行 ← 输入框(占位)
39
35
  ────────────────────────────────────────────────
40
- tps: 100 tok/s • 546 tok / 5.5s (avg 100 · ttft 1.4s) ↑12k ↓1.2k · cache 80% ♨ · [-] ← 速率行(full)
41
- Accept edits claude-opus-5-5 medium | Ctx 3.0% | proj ⎇ main 5ae9e54 (+12,-3) | $0.26 | 2h24m
36
+ codemode on tps: 100 tok/s • 546 tok / 5.5s (avg 100 · ttft 1.4s) · ↑12k ↓1.2k · cache 80% ♨ · [-] ← 速率行(full)
37
+ Accept edits | shift+tab 切换 claude-opus-5-5 medium | Ctx 3.0% | proj ⎇ main 5ae9e54 ↑2 (+12,-3) | $0.26 | 2h24m
38
+ 5 小时:10.0% | 重置:2h 18m | 本周:31.0% | 本周重置:6d 5h ← 订阅配额行(full,ChatGPT 订阅模型)
42
39
  ```
43
40
 
44
- - **用户消息**:`›` 开头,续行缩进 2 列;运行中插话标 `↳ 插话`,排到本轮之后的标 `↳ 之后`,宿主(Armadra 画布)注入的标 `↳ 宿主`(会话文件里的 `origin` 不变:steer / followUp / host)。
41
+ - **用户消息**:`›` 开头,续行缩进 2 列;运行中插话标 `↳ 插话`,排到本轮之后的标 `↳ 之后`,宿主(Armadra 画布)注入的标 `↳ 宿主`,打断并发送开的新回合标 `↳ 打断`(会话文件里的 `origin` 不变:steer / followUp / host / interrupt)。
45
42
  - **思考块**:`ui.showThinking` = `collapsed`(缺省,`✻ 思考中…` → `✻ 思考 · 1.2k token`,`Ctrl+O` 展开为缩进的正文,最多 60 行)/ `full`(总是展开)/ `hidden`。
46
43
  - **工具调用**:标题 `⏺ 工具名 摘要`,`⏺` 运行中为强调色、成功绿、失败红;第二行 `⎿` 后是结果摘要——`读取 N 行`、`N 处修改 · +a −b`、`退出 0 · 2.1s · 48 行`、`14 处匹配 · 6 个文件`、`N 个内层调用 · 脚本输出 M 行`、`子 Agent · 运行中 1m05s` / `完成 · 1m42s · ↑28k ↓4.1k`;运行中摘要行带与底部同帧的 spinner 与秒数。正文折叠显示前 3 行,`edit` 显示 diff(前 12 行,≥ 60 列带行号),`bash` 运行中滚动显示最后 8 行。`Ctrl+O` 展开 / 折叠全部(含思考块)。codemode 脚本里的内层调用挂在外层调用下面(折叠时只列最近 5 个的标题与摘要)。
47
44
  - **提示**:`✗` 错误、`↻ 重试 n/m`、`!` 警告(缓存未命中、上下文余量)、`⛔ Hook 阻止`、宿主通知、审批被拒或超时的说明;压缩 / 分支摘要是左竖条卡片(`▎ 上下文已压缩 128k → 24k token`)。
48
- - **运行中**:`⠋ 动词 · 已用时 · …`,动词按当前最深状态取:`等待确认`(审批打开)、`运行 bash` / `运行 3 个工具`、`重试 2/3 · 2s 后`、`压缩上下文`、`回复中 · ↓≈1.2k`(本条输出的估算 token)、`思考中`。
49
- - **状态栏**:永远是最后一行,模式永远在最左。`compact` 的分隔符固定为 `·`(嵌入宿主按此解析),`full` 用 `|`。布局由 `ui.statusLine` 决定:独立终端缺省 `full`(两行),有 profile 的嵌入宿主缺省 `compact`(一行,布局与以前相同);运行时 `Ctrl+G` 或 `/statusline [full|compact]` 切换,只影响本会话。`full` 时输入框在倒数第 4 行(`compact` 仍是倒数第 3 行)。
50
- - **`full` 上行(速率行)**:`tps: <速率> tok/s • <输出 token> tok / <耗时> (avg <会话均速> · ttft <首 token 延迟>)`——速率在流式中是最近 2 s 的瞬时值(`tps:` 强调色),结束后是该请求的平均值,生成不足 0.25 s 的整块回复不算速率、显示 `—`;耗时从首 token 起;ASCII 下 `•` 为 `*`。右区是用量类项 `↑` 输入(含缓存读写)`↓` 输出 · 缓存 · 重计费 · 排队数 · codemode · 工具预设(非 default 时)· 宿主状态,行尾 `[-]` 提示可折叠。只统计对话请求(压缩摘要、保温、分类器不计)。窄时依次丢弃 输出量 / 耗时、codemode、排队数、token、缓存、重计费、预设、宿主状态、avg、ttft;`tps` 与 `[-]` 不丢。
51
- - **`full` 下行**:左区 `权限模式 | shift+tab 切换`,右区 `模型 思考级别 | Ctx 3.0% | <目录名> ⎇ <分支> <短提交> (+a,-d) | $费用 | 会话时长`(Ctx 一位小数,宽屏也不换余量表);窄时依次丢弃切换提示、思考级别、增删行、目录名、分支与提交、时长、费用、上下文、模型。
52
- - **`compact`**:一行,右区 模型 · 思考级别 · `↑ ↓` · 缓存 · 费用 · 重计费 · 上下文占用 · 目录 ⎇ 分支 提交 +a −b · 会话时长 · 排队数 · codemode · 预设 · 宿主状态;窄时依次丢弃切换提示、宿主状态、预设、重计费、费用、缓存、token、思考级别、排队数、codemode、增删行、目录名、分支与提交、时长、上下文、模型。
53
- - **git**:分支与短提交直接读 `.git/HEAD`(worktree 认;detached 只显示短提交;非 git 目录整段省略,只剩目录名);`+a −b` 是工作区(含暂存)相对 HEAD 的增删行,回合结束、写类工具结束、回滚、`/tree` 之后在后台跑 `git diff --numstat HEAD`,至多 10 秒一次,超过 2 秒或失败就本会话不再显示增删;`AMA_STATUS_GIT=0` 关闭。
45
+ - **运行中**:`⠋ 动词 · 已用时 · …`,动词按当前最深状态取:`等待确认`(审批打开)、`运行 bash` / `运行 3 个工具`、`重试 2/3 · 2s 后`、`压缩上下文`、`回复中 · ↓≈1.2k`(本条输出的估算 token)、`思考中`。有阻塞中的前台子 Agent 任务时加 `Ctrl+B 转后台`,Agent 栏里有任务时加 `↓ Agent 栏`(有停靠的审批时换成 `↓ 处理审批`):`⠏ 运行 task · 4s · Esc 中断 · Ctrl+B 转后台 · ↓ Agent 栏`,一行放不下时从后往前整项丢掉。输入框有字时最前面加 `Enter 排队 · Ctrl+X 打断并发送`(`ui.enterWhileRunning: "interrupt"` 时是 `Enter 打断并发送 · Ctrl+X 排队`);有排队的插话时队列末行是 `Alt+↑ 取回 · Ctrl+X 立即发送 · Esc 回填并中断`。
46
+ - **状态栏**:模式永远在最左;`full` 左右分区——左列是状态与开关(权限模式、`shift+tab` 提示、codemode、沙箱、预设、回退),右列是度量与模型(tps、用量、模型、Ctx、git、费用、时长、配额),右列右对齐、左列为空时整行靠右;除 full 布局下的订阅配额行外,状态栏是最后一行(`compact` 永远是最后一行)。`compact` 的分隔符固定为 `·`(嵌入宿主按此解析),`full` 用 `|`。布局由 `ui.statusLine` 决定:独立终端缺省 `full`(两行),有 profile 的嵌入宿主缺省 `compact`(一行,布局与以前相同);运行时 `Ctrl+G` 或 `/statusline [full|compact]` 切换,只影响本会话。`full` 时输入框在倒数第 4 行(`compact` 仍是倒数第 3 行)。
47
+ - **`full` 上行(速率行)**:左区是开关类项 `codemode on|only`(网络未隔离时追加 `net!`)· `沙箱` · `preset <名>`(非 default 时)· `→ <回退模型>`(回退中,黄色)· 排队数 · 宿主状态,没有时左区为空。右区 `tps: <速率> tok/s • <输出 token> tok / <耗时> (avg <会话均速> · ttft <首 token 延迟>) · ↑<输入> ↓<输出> · 缓存 · 重计费 · [-]`——速率在流式中是最近 2 s 的瞬时值(`tps:` 强调色),结束后是该请求的平均值,生成不足 0.25 s 的整块回复不算速率、显示 `—`;耗时从首 token 起;`↑` 输入含缓存读写;ASCII 下 `•` 为 `*`、`→` 为 `->`;行尾 `[-]` 提示可折叠。只统计对话请求(压缩摘要、保温、分类器不计)。窄时先丢右区度量(输出量 / 耗时、token、缓存、重计费、avg、ttft),再丢左区开关(宿主状态、排队数、预设、回退、沙箱、codemode);`tps` 与 `[-]` 不丢。
48
+ - **`full` 下行**:左区 `权限模式 | shift+tab 切换`,右区 `模型 思考级别 | Ctx 3.0% | <目录名> ⎇ <分支> <短提交> ↑N ↓N (+a,-d) | $费用 | 会话时长`(Ctx 一位小数,宽屏也不换余量表);窄时依次丢弃切换提示、思考级别、增删行、目录名、分支与提交、时长、费用、上下文、模型。
49
+ - **订阅配额行**(`full` 第三行,在状态栏下方):当前模型走 ChatGPT 订阅(`chatgpt` 供应商)时显示 `5 小时:<已用%> | 重置:<距重置> | 本周:<已用%> | 本周重置:<距重置>`(英文界面 `Session: … | Reset: … | Weekly: … | Weekly Reset: …`),数据来自最近一次 `quota_update`(codex 方式的 `x-codex-primary/secondary-*` 响应头与 `codex.rate_limits` 事件;siwc 只有超限 429 时才有)。重置时间是相对时长(`2h 18m`、`6d 5h`),每分钟刷新一次。codex 方式在第一次请求前显示「配额:首次请求后显示」(第一次请求就会带回配额,先占住行免得行数跳动);siwc 没有数据时不占行(只有超限才有配额,占位会一直挂着);非订阅模型不显示。窄于 80 列时压缩为 `5h 10% ↻2h18m · 周 31% ↻6d5h`,再窄先丢重置时间。配额行在右区右对齐。标签按窗口时长认而不是按 primary / secondary 槽位:300 分钟是「5 小时」、10080 分钟是「本周」,其它时长用实际时长(`1d:`);缺时长时 primary 当 5 小时、secondary 当本周(与另一个窗口撞名时取另一种);按时长从短到长排。用量 0、无时长、无重置时间的窗口是服务端的「没有这个窗口」,不显示(有的套餐 codex 只送一个周窗口,放在 primary)。`Ctrl+G` / `/statusline compact` 折叠时配额行与速率行一起收起(`compact` 只保留一行,宿主按「最后一行 = 状态栏」锚定)。
50
+ - **配色**(`full`):标签、单位、分隔符与括号暗灰;速率数字紫、输出量 / 耗时 / avg 蓝、ttft 紫;模型与思考级别蓝;Ctx 与配额百分比按阈值绿 / 黄 / 红(≥ 70% 黄、≥ 90% 红);目录与分支绿、短提交暗灰、`↑N` 领先橙、`↓N` 落后红、`(+a,-d)` 绿 / 红;费用黄;时长与重置时间紫。都取主题语义色,深 / 浅主题与 16 色各有对应;`NO_COLOR` 与 ASCII 不着色、结构不变。`compact` 的着色不变。
51
+ - **`compact`**:一行,右区 模型 · 思考级别 · `↑ ↓` · 缓存 · 费用 · 重计费 · 上下文占用 · 目录 ⎇ 分支 提交 +a −b · 会话时长 · 排队数 · codemode · 预设 · 宿主状态 · 订阅配额短项(`5h 10% 周 31%`,只在有配额数据时;项内不含 `·`);窄时依次丢弃配额短项、切换提示、宿主状态、预设、重计费、费用、缓存、token、思考级别、排队数、codemode、增删行、目录名、分支与提交、时长、上下文、模型。
52
+ - **git**:分支与短提交直接读 `.git/HEAD`(worktree 认;detached 只显示短提交;非 git 目录整段省略,只剩目录名);`+a −b` 是工作区(含暂存)相对 HEAD 的增删行,回合结束、写类工具结束、回滚、`/tree` 之后在后台跑 `git diff --numstat HEAD`,至多 10 秒一次,超过 2 秒或失败就本会话不再显示增删;`AMA_STATUS_GIT=0` 关闭。`full` 的 `↑N` / `↓N` 是当前分支领先 / 落后上游的提交数:分支在 git 配置里有上游(`branch.<名>.merge`)时,同一节流周期接着跑 `git rev-list --left-right --count @{upstream}...HEAD`(同样 2 秒超时,超时本会话不再统计);为 0、没有上游或 detached 不显示;ASCII 下为 `^N` / `vN`。
54
53
  - **费用**含子任务、保温、分类器与外部 Agent 以美元计的用量(其它单位只在 `/session`);**时长**从本进程打开当前会话起算(`Ns` / `Nm` / `NhMm`)。
55
54
  - bash 命令在操作系统沙箱里跑时(`sandbox.bash: "auto"` 且本机可用,见 [sandbox.md](sandbox.md))用量类项多一个 `沙箱`,宽度不够时与 codemode 一起先丢。
56
- - 模型回退中(`fallbackModel`,主模型过载或重试用尽后改用回退模型重试一次)模型项显示 `主模型 → 回退模型`(回退模型黄色),回退模型回复、切回主模型后消失;消息区同时有一行说明。
57
- - 模型名随宽度缩写(< 100 列去供应商、< 60 去渠道、< 48 去版本后缀);`compact` ≥ 110 列时上下文显示为余量表 `ctx ▮▮▮▯▯▯▯▯▯▯ 34%`;会变的数字按最宽形状占位,数值变化不会让某项时有时无。ASCII 模式 `⎇` → `git`、`−` → `-`、`♨` → `~`。
55
+ - 模型回退中(`fallbackModel`,主模型过载或重试用尽后改用回退模型重试一次)`compact` 的模型项显示 `主模型 → 回退模型`(回退模型黄色),`full` 的模型项只留主模型、速率行左区显示 `→ 回退模型`,回退模型回复、切回主模型后消失;消息区同时有一行说明。
56
+ - 模型名随宽度缩写(< 100 列去供应商、< 60 去渠道、< 48 去版本后缀);`compact` ≥ 110 列时上下文显示为余量表 `ctx ▮▮▮▯▯▯▯▯▯▯ 34%`;会变的数字按最宽形状占位,数值变化不会让某项时有时无。ASCII 模式 `⎇` → `git`、`−` → `-`、`♨` → `~`、`↻` → `@`。
58
57
  - **退出**:消息区最后追加一行会话摘要与恢复命令,留在终端回滚里:
59
58
 
60
59
  ```
@@ -111,26 +110,44 @@ Accept edits claude-opus-5-5 medium | Ctx 3.0% | proj ⎇ main 5ae9e54 (+12,
111
110
 
112
111
  ## 按键
113
112
 
114
- | 按键 | 作用 |
115
- | -------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- |
116
- | Enter | 发送;运行中 = steer(插到当前轮) |
117
- | Alt+Enter | 运行中排到本轮之后(followUp);空闲时等同 Enter |
118
- | Shift+Enter / Ctrl+J | 换行 |
119
- | Esc | 中断:排队的消息回填到输入框,然后停止当前运行;补全打开时先关补全 |
120
- | Esc Esc(空闲) | 输入框为空:打开回滚列表(同 `/rewind`);有字:清空并存进输入历史 |
121
- | Alt+↑ | 取回最后一条排队消息 |
122
- | Shift+Tab / Tab | 循环权限模式 Manual → Accept edits → Plan → Auto → Bypass permissions(Tab 只在输入为空、补全未打开时,否则仍是补全;进入 Bypass 前确认,见下文「进入 Bypass」) |
123
- | Ctrl+O | 展开 / 折叠工具输出与思考块 |
124
- | Ctrl+L / Ctrl+T | 选择模型 / 思考级别 |
125
- | Ctrl+G | 底部信息行 两行(full)↔ 一行(compact),只影响本会话 |
126
- | Ctrl+V | 粘贴剪贴板里的图片:存进数据目录,光标处插入 `@<路径>`(同 `/paste`) |
127
- | Ctrl+C | 清空输入;输入为空时 1.5 秒内再按一次退出(退出码 130) |
128
- | Ctrl+D | 输入为空时退出 |
129
- | Tab | 补全 |
130
- | ↑ / ↓ | 单行时浏览历史(`<数据目录>/history`,500 条) |
131
- | Ctrl+B / ↓(空输入) | 进入 Agent 栏(有子 Agent 任务时;有字时 Ctrl+B 仍是光标左移,tmux 里用 ↓),见「子 Agent」(第六波 W6-A 起) |
132
-
133
- 按键可在 `~/.config/ama/keybindings.json` 覆盖,键是动作 id(`app.interrupt`、`app.rewind`、`app.message.followUp`、`app.statusLine.toggle`、`app.paste.image`、`app.agents.focus`、`tui.editor.newLine` ……),值是按键或按键数组,空数组表示禁用。`app.rewind` 是空闲时双击的那个键(缺省 Esc,两次间隔 ≤ 800 ms)。
113
+ | 按键 | 作用 |
114
+ | -------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
115
+ | Enter | 发送;运行中 = steer(排队,等下一个投递点:本次模型回复结束或本批工具结束) |
116
+ | Ctrl+X | 运行中打断并立即发送:中止当前回合(模型流与正在跑的工具,工具记「aborted by user」),立刻以输入框的文字开新回合,排队的插话拼在前面;输入为空时只把排队的插话立即送出。空闲时等同 Enter。`ui.enterWhileRunning: "interrupt"` 时与 Enter 互换 |
117
+ | Alt+Enter | 运行中排到本轮之后(followUp);空闲时等同 Enter |
118
+ | Shift+Enter / Ctrl+J | 换行 |
119
+ | Esc | 中断:排队的消息回填到输入框,然后停止当前运行(连带前台子 Agent 任务;后台任务不受影响,提示里写明);补全打开时先关补全 |
120
+ | Esc Esc(空闲) | 输入框为空:打开回滚列表(同 `/rewind`);有字:清空并存进输入历史 |
121
+ | Alt+↑ | 取回最后一条排队消息 |
122
+ | Shift+Tab / Tab | 循环权限模式 Manual → Accept edits → Plan → Auto → Bypass permissions(Tab 只在输入为空、补全未打开时,否则仍是补全;进入 Bypass 前确认,见下文「进入 Bypass」) |
123
+ | Ctrl+O | 展开 / 折叠工具输出与思考块 |
124
+ | Ctrl+L / Ctrl+T | 选择模型 / 思考级别 |
125
+ | Ctrl+G | 底部信息行 两行(full)↔ 一行(compact),只影响本会话 |
126
+ | Ctrl+V | 粘贴剪贴板里的图片:存进数据目录,光标处插入 `@<路径>`(同 `/paste`) |
127
+ | Ctrl+C | 清空输入;输入为空时 1.5 秒内再按一次退出(退出码 130) |
128
+ | Ctrl+D | 输入为空时退出 |
129
+ | Tab | 补全 |
130
+ | ↑ / ↓ | 单行时浏览历史(`<数据目录>/history`,500 条) |
131
+ | ↓(空输入) | 进入 Agent 栏(有子 Agent 任务即可);有字时仍是下移 / 历史并提示一次,见「子 Agent」 |
132
+ | Ctrl+B | 有阻塞中的前台子 Agent 任务(或 `task_ctl wait`)时全部转后台,不看输入框有没有字;没有时是光标左移。tmux 里按 `C-b C-b`,见「子 Agent」 |
133
+
134
+ 按键可在 `~/.config/ama/keybindings.json` 覆盖,键是动作 id(`app.interrupt`、`app.rewind`、`app.message.followUp`、`app.message.interrupt`、`app.statusLine.toggle`、`app.paste.image`、`app.agents.focus`、`app.tasks.background`、`tui.editor.newLine` ……),值是按键或按键数组,空数组表示禁用。`app.rewind` 是空闲时双击的那个键(缺省 Esc,两次间隔 ≤ 800 ms)。
135
+
136
+ ### 打断并立即发送
137
+
138
+ 运行中按 Enter 缺省是**排队**(steer):消息等下一个投递点才送达——模型在长篇输出、或工具在跑一个 5 分钟的命令时要等很久。要立刻改方向,在输入框写好后按 **`Ctrl+X`**(动作 `app.message.interrupt`):
139
+
140
+ - 当前回合立即中止:模型流断开,正在执行的工具按中断收尾(每个工具调用恰有一个结果,记「aborted by user」),被打断的回复按中断规则留在会话里;随后**不用再按 Enter**,这段文字直接作为新回合的用户消息发出(会话里 `origin: "interrupt"`,消息区标 `↳ 打断`)。
141
+ - 已排队的插话一起带上:按入队顺序拼在这段文字前面(空行分隔);排到本轮之后的(Alt+Enter)留在队列,新回合结束后照常送达。
142
+ - 只连带前台:前台子 Agent 任务随主回合中止,后台任务不受影响。
143
+ - 补全打开、审批框或选择器打开时不触发;斜杠命令照常当命令执行;输入为空时只把排队的插话立即送出(没有可发的内容时提示一行)。
144
+ - 中断的请求前缀不变:新回合的请求以被打断那次请求的全部消息为前缀,缓存照常命中。
145
+ - Esc 不变:仍是中断并把排队消息回填输入框(中断即撤回见下文),不会自动发送。
146
+ - 想让 Enter 直接打断:`/config` 里把 `ui.enterWhileRunning` 设为 `interrupt`(立即生效),这时 Enter 打断并发送、`Ctrl+X` 排队。
147
+
148
+ 缺省键选 `Ctrl+X` 的原因:macOS Terminal、iTerm2、tmux、Windows Terminal 都原样送达,且没有别的绑定;`Ctrl+Enter` 不开 kitty 键盘协议时与 Enter 无法区分,`Ctrl+S` 可能被 XOFF 流控吃掉,`Alt+Enter` 已是 followUp,`Alt+字母` 在 macOS 缺省不送 Meta,`Ctrl+]` 在非美式键盘上难按。可在 `keybindings.json` 改。
149
+
150
+ line 模式(`--no-tui`)运行中输入 `/interrupt <文本>` 效果相同(空闲时就是普通提示);交互界面里也认这条命令。RPC 是 `prompt` / `steer` 的 `interrupt: true`,见 [rpc.md](rpc.md)。
134
151
 
135
152
  ## 回滚
136
153
 
@@ -308,12 +325,17 @@ Plan 模式(Shift+Tab、`/permission plan`、`/plan <目标>`、`--permission-
308
325
  ⏺ task 检查 src/tui 的测试覆盖缺口
309
326
  ⎿ ⠋ explore · 运行中 1m05s · 3 轮 · read grep bash · ↑12k ↓3.4k
310
327
  ⏺ task 后台审查
311
- ⎿ 完成 · 0.0s
328
+ ⎿ 已在后台启动
312
329
  ↳ t2 explore · 运行中 40s · 1 轮 · read
330
+ ⏺ task scan
331
+ ⎿ 已转后台 · 12s
332
+ ↳ t3 explore · 运行中 30s · 2 轮 · grep
313
333
  ```
314
334
 
315
- - 状态行是类型(外部 Agent 写 `claude(claude)` 这类 runner)、状态与耗时、轮数、最近 3 个工具、用量;前台任务结束后换成结果摘要。后台任务(`background: true`)的工具调用立即返回,下面多一行跟随状态(运行中每秒刷新);完成后模型收到的 `<task-notification>` 在消息区只显示一行「↳ 子 Agent 通知 t2 explore 完成 · 7 轮 · /tasks 查看输出」,失败或被停止时另有一行黄色提示。
316
- - `/tasks`:聚焦 Agent 栏(见下);`/tasks <id>` 直接打开该任务的子 Agent 视图;`/tasks stop <id>` 停止。`ui.agentBar: "off"`(嵌入宿主缺省)时 `/tasks` 仍是任务选择器(新的在上,Enter 查看输出、运行中可停止)。line 模式 `/tasks` 列表、`/tasks <id>` 输出、`/tasks stop <id>` 停止。
335
+ - 状态行是类型(外部 Agent 写 `claude(claude)` 这类 runner)、状态与耗时、轮数、最近 3 个工具、用量;前台任务结束后换成结果摘要。后台任务(交互界面缺省后台,见 [agents.md](agents.md)「前台与后台」)的工具调用立即返回,摘要行是「已在后台启动」,下面多一行跟随状态(运行中每秒刷新);前台任务转后台后摘要行是「已转后台 · 已用时」,同样带跟随行(给模型的说明文字不显示,`Ctrl+O` 展开可见);超时自动转后台(`subagents.autoBackgroundAfterMs`)或宿主转的另有一行提示;完成后模型收到的 `<task-notification>` 在消息区只显示一行「↳ 子 Agent 通知 t2 explore 完成 · 7 轮 · /tasks 查看输出」,失败或被停止时另有一行黄色提示。
336
+ - `/tasks`:聚焦 Agent 栏(见下);`/tasks <id>` 直接打开该任务的子 Agent 视图;`/tasks stop <id>` 停止;`/tasks bg [id]` 转后台(不给 id = 全部阻塞中的前台任务,同 `Ctrl+B`)。`ui.agentBar: "off"` 时 `/tasks` 仍是任务选择器(新的在上,Enter 查看输出、运行中可停止)。line 模式 `/tasks` 列表、`/tasks <id>` 输出、`/tasks stop <id>` 停止、`/tasks bg [id]` 转后台(运行中输入也按命令处理,不当插话)。
337
+ - 转后台(`Ctrl+B`,键位动作 `app.tasks.background`):主回合在等前台任务(`task` 带 `background: false`、`-p` 缺省,或 `task_ctl wait`)时按下,工具调用立即返回、任务继续跑,主回合接着往下走,你可以继续发消息;任务结束后照常收到 `<task-notification>` 并开一轮。底部提示「已转后台:t2,完成后会通知」。没有可转的任务时 `Ctrl+B` 落回编辑器(光标左移),不吞键。tmux 的缺省前缀就是 `C-b`:在 tmux 里按 `C-b C-b`(缺省 `send-prefix`)把它透传给 ama,或进栏按 `b`;也可在 `keybindings.json` 改成别的键。
338
+ - Esc 只中断前台:运行中按 Esc 停主回合,连带还在前台的子任务;已转后台的任务继续跑,中断提示写「已中断(后台任务 t2 仍在运行,Esc 不影响)」。
317
339
  - `/agents`:可用类型——名字、runner、来源(内置 / 用户 / 项目 / profile / 宿主),外部 Agent 带「已安装 版本」或「未安装」,再加一行说明。
318
340
  - 外部 Agent 自己报告的提示(预算用尽、超时、模式降级等)在消息区显示为一行 `[claude · t3] …`。
319
341
 
@@ -328,11 +350,13 @@ Plan 模式(Shift+Tab、`/permission plan`、`/plan <目标>`、`--permission-
328
350
  另 1 个
329
351
  ```
330
352
 
331
- - 状态:排队(并发池满)/ 运行中(用时、轮数、最近一个工具)/ 等待审批(审批框里正有它的请求)/ 完成 / 失败 / 已停止(以及轮数耗尽、已中断);`⏺` 运行中强调色、完成绿、失败红、其余黄 / 暗;ASCII 下是 `*`。
353
+ - 状态:排队(并发池满)/ 运行中(用时、轮数、最近一个工具)/ 等待审批(审批框里正有它的请求,或停靠在栏里,整行黄色)/ 完成 / 失败 / 已停止(以及轮数耗尽、已中断);`⏺` 运行中强调色、完成绿、失败红、其余黄 / 暗;ASCII 下是 `*`。
332
354
  - 什么时候显示:有排队、运行中或等审批的任务;本会话里结束、还没在视图里看过的任务保留到看过为止,最多 10 分钟。resume 进来时已经结束的任务不显示(`/tasks` 里能看到)。
333
- - 进入:输入框为空时 `Ctrl+B`(有任务即可),或 `↓`(栏可见时)——tmux 的缺省前缀会吃掉 `Ctrl+B`,这时用 `↓`;输入框有字时 `Ctrl+B` 仍是光标左移、`↓` 仍是下移 / 历史。键位动作 `app.agents.focus`,可在 `keybindings.json` 改。
334
- - 栏里:`↑` `↓` 选(列出本会话全部任务,窗口跟着滚;在第一项再按 `↑` 回到输入框),Enter 打开子 Agent 视图,Esc / `Ctrl+B` 回到输入框;直接打字则回到输入框并把字填进去。末行是按键提示。
335
- - 嵌入宿主(有 profile)缺省 `ui.agentBar: "off"`:不显示栏,`Ctrl+B` / `↓` 照常交给编辑器。
355
+ - 进入:输入框为空、补全没开时按 `↓`,本会话有任务即可(栏收起了也行,与 `/tasks` 一致);tmux 内外一样。运行中也能进,运行提示行末尾的 `↓ Agent 栏` 就是提醒。键位动作 `app.agents.focus`(缺省只有 `down`),可在 `keybindings.json` 改。
356
+ - 按了没进去时底部提示一行(3 秒):输入框有字——「输入框有字;清空后再按 ↓ 进 Agent 栏」(每段草稿一次,光标在末行时;`↓` 照常下移);栏关闭——「Agent 栏已关闭(ui.agentBar),用 /tasks」;没有任务——「还没有子 Agent 任务」。在用 `↑` `↓` 浏览输入历史时 `↓` 只翻历史。
357
+ - `Ctrl+B` 不进栏,是「前台任务转后台」(见上)。想要原来的「`Ctrl+B` 进栏」可在 `keybindings.json` 写 `"app.agents.focus": ["down", "ctrl+b"]` 并把 `app.tasks.background` 改成别的键。
358
+ - 栏里:`↑` `↓` 选(列出本会话全部任务,窗口跟着滚;在第一项再按 `↑` 回到输入框),Enter 打开子 Agent 视图(选中的任务有停靠的审批时随即弹出),`b` / `Ctrl+B` 把选中的前台任务转后台(不是前台运行中的给一行提示),`x` 停止选中的任务(第一次提示「再按 x 停止 t2」,1.5 秒内再按才停),Esc 回到输入框;其它字母回到输入框并把字填进去。末行是按键提示 `↑↓ 选择 · Enter 打开 · b 转后台 · x 停止 · Esc 返回`,窄屏丢掉 `b` / `x` 两项。
359
+ - 嵌入宿主(有 profile)不再缺省关闭栏;宿主自己展示子任务、不要栏时在 profile 里写 `ui.agentBar: "off"`(见 [host-api.md](host-api.md)「嵌入 Armadra」)。关闭后栏不显示,`↓` 在有任务时提示改用 `/tasks`。
336
360
 
337
361
  ### 子 Agent 视图
338
362
 
@@ -353,8 +377,18 @@ t2 explore · 运行中 1m05s · 3 轮 · ↑12k ↓3.4k · Esc 返回 · /tasks
353
377
  - 正文实时跟随:ama 子 Agent 显示子会话的全部消息与工具调用(与消息区同样的渲染);子会话句柄已被释放(保留上限 16 个)或会话是 resume 进来的,就只读加载子会话文件,任务再次运行时接上实时事件。外部 Agent(claude / codex / ACP)显示本进程内存里的实时输出(文本、思考、工具起止、回合、提示;最多 2000 条 / 1 MB,不落盘);ama 重启后只剩一行说明「用原 CLI resume <会话 id> 查看全文」。
354
378
  - 输入框为空时:`↑` / PgUp 上翻(暂停跟随,底部提示「已暂停跟随 · End 继续」),`↓` / PgDn 下翻,End(暂停时也可按 `f`)回到跟随;`←` `→` 切到上一个 / 下一个任务;Esc 返回主界面。输入框有字时 Esc 先清空。
355
379
  - Enter 把输入发给这个子 Agent(会话里记为 `origin: "direct"` 的 user 消息,见 [session-format.md](session-format.md)):ama 子 Agent 运行中 → 排到它本轮结束时送达;外部 Agent 运行中或任务还在排队 → 等本次运行结束后续聊;已结束 → 后台续聊(同 `task_ctl send`,完成后主会话照常收到 `<task-notification>`)。底部一行提示发送结果。父会话的模型不知道你直接和子 Agent 说过话,结果经结束通知自然带回。
356
- - 视图里不中断任何东西:Esc 只是返回。停止子任务用 `/tasks stop <id>`——在视图输入框里也能用(视图里只认这一条命令)。
357
- - 正在看的任务等审批时标题显示「等待审批」,审批框照常弹在视图上面(带 `[task:<类型>]` 来源)。
380
+ - `Ctrl+X` 打断并发送给这个子 Agent:ama 子 Agent 运行中 → 中止它当前这一轮(工具按中断收尾)并立即以这条消息开新一轮,任务照常完成、照常通知主会话;外部 Agent 的驱动能中断单个回合(ACP `session/cancel`、Claude stream-json interrupt、Codex `turn/interrupt`)→ 中断后立即以它(连同之前排着的消息)开下一回合;不能(oneshot、宿主驱动)或任务还在并发池排队 → 退回排队并提示「不支持打断,已排队」;已结束 → 同 Enter 的后台续聊。`ui.enterWhileRunning: "interrupt"` 时与 Enter 互换。主会话不受影响。
381
+ - 视图里 Esc 不中断任何东西:Esc 只是返回。停止子任务用 `/tasks stop <id>`,转后台用 `Ctrl+B` 或 `/tasks bg [id]`——在视图输入框里也能用(视图里只认这两条命令)。
382
+ - 正在看的任务等审批时标题显示「等待审批」,审批框照常弹在视图上面(带 `[task:<类型>]` 来源);它的审批停靠在栏里时,打开视图即弹出。
383
+
384
+ ### 后台任务的审批停靠
385
+
386
+ 后台任务(含转后台的)要审批时,不打断你正在做的事:
387
+
388
+ - 主会话在运行、输入框有草稿或已有别的覆盖层时,不弹框,先**停靠**:Agent 栏该任务行显示「等待审批」(黄色),运行提示行附 `↓ 处理审批`;子任务在这期间等着。
389
+ - 主会话空闲、输入框为空、没有覆盖层时自动弹出;进栏选中它按 Enter(打开视图)立即弹出。
390
+ - 停靠期间主会话自己或前台任务又要审批:审批是串行的,先弹停靠的这个,再弹它们,主会话的审批不会被挡住。
391
+ - 前台任务与主会话自己的审批照旧立即弹出;超时(缺省 10 分钟按拒绝)、中止与无人值守规则不变。RPC 客户端照常收到 `permission_request`,自己决定怎么呈现。
358
392
 
359
393
  审批框的来源标注:
360
394
 
@@ -420,12 +454,13 @@ t2 explore · 运行中 1m05s · 3 轮 · ↑12k ↓3.4k · Esc 返回 · /tasks
420
454
 
421
455
  ## 启动画面
422
456
 
423
- `ui.quietStartup` / `--quiet-startup`:`normal` 显示带框的启动头——标题、模型与思考级别、目录(`~` 缩写)与信任状态、权限模式 / 预设 / codemode、已加载的上下文文件 / Skill / 提示模板 / Hook、警告数与常用按键;窄于 56 列或 `ui.compact` 时去框、每项一行。`header` 只有一行 `✻ ama 版本 · 模型 · 模式 · /help`(profile 缺省);`silent` 不显示。`--resume` 不带 id、模型没有 key、会话目录不存在、项目资源需要信任时,界面启动前会先出现一个小的选择 / 输入提示,答完收成一行留在屏幕上。
457
+ `ui.quietStartup` / `--quiet-startup`:`normal` 显示「AMA」字符画与信息列——版本、模型与思考级别、目录(`~` 缩写)与信任状态、权限模式 / 预设 / codemode、已加载的上下文文件 / Skill / 提示模板 / Hook、警告数与常用按键;宽 ≥ 72 列字符画在左、信息在右,48–71 列字符画在上,窄于 48 列退回两行简洁头(版本 · 模型 · 思考 / 模式 · 目录 · 信任);`ui.logo: "off"` 或 `ui.compact` 只显示信息列。字符画按字母取主题的 accent → user → tool 三色,ASCII 模式换成 `_ / \ |` 拼的字形。启动时播放一次约 1 秒的「点亮」扫描(字形先暗后亮,高亮带从左扫到右,结束定格),只在原地重画、不在回滚里留帧;按任意键立即定格,按键照常进入输入框。以下情况直接显示定格帧:`ui.animation: false`、`NO_COLOR` / 无色终端、非 TTY、嵌入宿主(profile.host)、`CI` 环境、启动即带提示(`ama "…"`)、终端矮于 16 行或内容超出一屏;行式界面、`-p`、RPC、ACP 不画启动头。`header` 只有一行 `✻ ama 版本 · 模型 · 模式 · /help`(profile 缺省);`silent` 不显示。`--resume` 不带 id、模型没有 key、会话目录不存在、项目资源需要信任时,界面启动前会先出现一个小的选择 / 输入提示,答完收成一行留在屏幕上。
424
458
 
425
459
  ## 在 tmux / Armadra 终端节点里
426
460
 
427
461
  - 括号粘贴:启动时开启;粘贴的多行内容整体进入输入框(超过 10 行或 1 000 字符折叠为 `[粘贴 #N · M 行]`),粘贴后紧跟的回车直接发送,适合由外部程序写入。
428
462
  - 不查询终端能力、不开鼠标与 Kitty 键盘协议,避免回包混进输入;tmux ≥ 3.4 透传同步输出,旧版本也能正常显示。
463
+ - tmux 的缺省前缀 `C-b` 会被 tmux 客户端吃掉:转后台按 `C-b C-b`(`send-prefix` 透传),或 `↓` 进 Agent 栏按 `b`;进栏用 `↓`,不受前缀影响。
429
464
  - 窗口尺寸变化时整屏重画最后一屏,回滚里的历史不受影响。
430
465
  - 自动降级:非 TTY、`TERM=dumb`、`--no-tui` 或终端初始化失败时使用行式界面,命令与审批问答相同。
431
466
 
@@ -437,8 +472,9 @@ t2 explore · 运行中 1m05s · 3 轮 · ↑12k ↓3.4k · Esc 返回 · /tasks
437
472
  | ----------------- | ----------- | --------------------------------------------------------------------------------------------- |
438
473
  | `ui.theme` | `dark` | `dark` / `light` / `auto`;auto 只看 `COLORFGBG`(不发终端查询),猜不出用 dark,建议显式配置 |
439
474
  | `ui.ascii` | 自动检测 | ASCII 字形(`›` → `>`、`⏺` → `*`、`⎿` → `L`、框线 → `+ - \|`、spinner 4 帧) |
440
- | `ui.compact` | `false` | 消息区块间不空行、启动头无框 |
441
- | `ui.animation` | `true` | `false`:运行中 spinner 静止为 `·`,只在秒数变化时重绘 |
475
+ | `ui.compact` | `false` | 消息区块间不空行、启动头不画字符画 |
476
+ | `ui.logo` | `auto` | 启动头的「AMA」字符画;`off` 只显示信息列 |
477
+ | `ui.animation` | `true` | `false`:运行中 spinner 静止为 `·`,只在秒数变化时重绘;启动字符画不播放动画 |
442
478
  | `ui.markdown` | `true` | `false`:助手正文不做 Markdown 渲染 |
443
479
  | `ui.showThinking` | `collapsed` | 见「布局」 |
444
480
  | `ui.quietStartup` | `normal` | 见「启动画面」 |
@@ -512,29 +548,29 @@ tui.setFocus(editor);
512
548
  tui.start();
513
549
  ```
514
550
 
515
- | 导出 | 作用 |
516
- | ------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------ |
517
- | `Component`、`Focusable`、`CURSOR_MARKER` | 组件契约:`render(width)` 返回各行(每行可见宽 ≤ width)、`handleInput?(data)`、`invalidate()`;获焦组件在光标处输出 `CURSOR_MARKER` |
518
- | `TUI` | 根容器与差分渲染(主屏、同步输出):`addChild`、`start` / `stop`、`requestRender`、`setFocus`、`addInputListener`、`showOverlay` |
519
- | `ProcessTerminal`、`MemoryTerminal`、`VirtualScreen` | 真实终端(raw 模式、括号粘贴);内存终端与 VT 屏幕(测试、帧黄金) |
520
- | `Container`、`Text`、`TruncatedText`、`Markdown`、`Box`、`Card`、`Spacer` | 基础组件;`Card` 是左竖条卡片,`Box` 可设 `borderColor` |
521
- | `Loader` | 运行指示:`setVerb(动词, 附加项, { elapsed })`、`frame` / `onFrame`(与别的组件同帧换字)、`animation: false` |
522
- | `Editor`、`EditorBuffer`、`PasteStore` | 多行编辑器(历史、补全接口 `AutocompleteProvider`、粘贴折叠) |
523
- | `SelectList` | 可过滤的选择列表:分组、徽标、数字键、`stacked`、`currentValue`(✓)、`footer` 按键提示 |
524
- | `KeyValue`、`Meter` | 两列对齐的键值表(`wrap` 折行对齐值列);余量表(`levelColor` 阈值着色) |
525
- | `compositeOverlays`、`OverlayOptions` | 覆盖层合成(居中 / 底部锚定) |
526
- | `createTheme`、`plainTheme`、`detectCapabilities`、`Theme` | 主题与颜色能力探测(`NO_COLOR`、16 / 256 / truecolor);14 个语义色,`resolveThemeName("auto")` |
527
- | `Theme.glyphs`、`UNICODE_GLYPHS`、`ASCII_GLYPHS`、`detectAscii` | 字形表(`›` `⏺` `⎿` `✻` `▎`、框线、spinner 帧……)与 ASCII 回退;`createTheme(name, { ascii })` |
528
- | `Keybindings`、`DEFAULT_KEYBINDINGS`、`loadKeybindingsFile` | 动作 id → 按键,`keybindings.json` 覆盖 |
529
- | `parseKey`、`matchesKey`、`StdinBuffer` | 键序列解析与 Esc 超时切分(`AMA_TUI_ESC_TIMEOUT`) |
530
- | `visibleWidth`、`truncateToWidth`、`wrapTextWithAnsi`、`sliceByColumn` 等 | 带 ANSI 与宽字符的宽度计算与截断 |
551
+ | 导出 | 作用 |
552
+ | ------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |
553
+ | `Component`、`Focusable`、`CURSOR_MARKER` | 组件契约:`render(width)` 返回各行(每行可见宽 ≤ width)、`handleInput?(data)`、`invalidate()`;获焦组件在光标处输出 `CURSOR_MARKER` |
554
+ | `TUI` | 根容器与差分渲染(主屏、同步输出):`addChild`、`start` / `stop`、`requestRender`、`setFocus`、`addInputListener`、`showOverlay` |
555
+ | `ProcessTerminal`、`MemoryTerminal`、`VirtualScreen` | 真实终端(raw 模式、括号粘贴);内存终端与 VT 屏幕(测试、帧黄金) |
556
+ | `Container`、`Text`、`TruncatedText`、`Markdown`、`Box`、`Card`、`Spacer` | 基础组件;`Card` 是左竖条卡片,`Box` 可设 `borderColor` |
557
+ | `Loader` | 运行指示:`setVerb(动词, 附加项, { elapsed, optional })`(`optional` 一行放不下时整项丢掉)、`frame` / `onFrame`(与别的组件同帧换字)、`animation: false` |
558
+ | `Editor`、`EditorBuffer`、`PasteStore` | 多行编辑器(历史、补全接口 `AutocompleteProvider`、粘贴折叠) |
559
+ | `SelectList` | 可过滤的选择列表:分组、徽标、数字键、`stacked`、`currentValue`(✓)、`footer` 按键提示 |
560
+ | `KeyValue`、`Meter` | 两列对齐的键值表(`wrap` 折行对齐值列);余量表(`levelColor` 阈值着色) |
561
+ | `compositeOverlays`、`OverlayOptions` | 覆盖层合成(居中 / 底部锚定) |
562
+ | `createTheme`、`plainTheme`、`detectCapabilities`、`Theme` | 主题与颜色能力探测(`NO_COLOR`、16 / 256 / truecolor);14 个语义色,`resolveThemeName("auto")` |
563
+ | `Theme.glyphs`、`UNICODE_GLYPHS`、`ASCII_GLYPHS`、`detectAscii` | 字形表(`›` `⏺` `⎿` `✻` `▎`、框线、spinner 帧……)与 ASCII 回退;`createTheme(name, { ascii })` |
564
+ | `Keybindings`、`DEFAULT_KEYBINDINGS`、`loadKeybindingsFile` | 动作 id → 按键,`keybindings.json` 覆盖 |
565
+ | `parseKey`、`matchesKey`、`StdinBuffer` | 键序列解析与 Esc 超时切分(`AMA_TUI_ESC_TIMEOUT`) |
566
+ | `visibleWidth`、`truncateToWidth`、`wrapTextWithAnsi`、`sliceByColumn` 等 | 带 ANSI 与宽字符的宽度计算与截断 |
531
567
 
532
568
  ## 测试
533
569
 
534
570
  帧黄金都在 `test/fixtures/tui/`,`MemoryTerminal` 还原屏幕(无色,只验布局与字形):
535
571
 
536
572
  - `src/modes/interactive/interactive-mode.test.ts`:80x24、40x24 跑一次完整的读文件 run(启动、输入、工具运行中、结束、`Ctrl+O` 展开、退出摘要)→ `run-*.txt`;审批、缓存提示等。
537
- - `src/modes/interactive/interactive-frames.test.ts`:启动头(`startup-normal-*`、`header-quiet-*`)、工具层级(`tools-*`)、提示(`notices-*`)、运行中动词(`loader-verbs-*`)、`/session` 面板(`panel-session-*`)、ASCII 模式整条 run(`ascii-run-*`)。
573
+ - `src/modes/interactive/interactive-frames.test.ts`:启动头(`startup-normal-*`、`header-quiet-*`;字符画各变体与动画见 `startup-logo.test.ts` / `startup-logo-*`)、工具层级(`tools-*`)、提示(`notices-*`)、运行中动词(`loader-verbs-*`)、`/session` 面板(`panel-session-*`)、ASCII 模式整条 run(`ascii-run-*`)。
538
574
  - 第五波(W5-U):`plan-dialog.test.ts`(`plan-dialog-*`:四选项、执行模式、修改意见、外部编辑、ASCII、40 列)、`approval-origin.test.ts`(`approval-origin-*`、`approval-task-agent-*`、`approval-first-run-*`、`approval-task-external-*` 与首次运行合并)、`subagent-view.test.ts`(`subagent-view-*`)、`tasks-panel.test.ts`(`tasks-picker-*`、`tasks-output-*`、`agents-panel-*`)、`harness-notices.test.ts`(`harness-notices-*`)、`interactive-w5.test.ts`(plan → 审批 → 执行、`/plan`、后台任务进 `/tasks`、Ctrl+V,`interactive-plan-*`、`interactive-tasks-*`)。
539
575
  - `src/tui/tui-frames.test.ts`:组件级(对话、Markdown、编辑器占位 / 多行 / 粘贴 / 补全);`status-bar.test.ts` 的 `status-widths.txt`;`approval-dialog.test.ts`、`pickers.test.ts` 的审批与模式选择器。
540
576
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@armadra/agent",
3
- "version": "0.6.2",
3
+ "version": "0.6.4",
4
4
  "description": "A coding and coordination agent that runs standalone or embedded in Armadra",
5
5
  "type": "module",
6
6
  "keywords": [