@armadra/agent 0.2.1 → 0.4.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 (232) hide show
  1. package/CHANGELOG.md +99 -0
  2. package/README.md +142 -49
  3. package/dist/agent/retry.d.ts +1 -1
  4. package/dist/agent/retry.js +2 -1
  5. package/dist/agent/session-cache.js +6 -3
  6. package/dist/agent/session-classifier.d.ts +18 -0
  7. package/dist/agent/session-classifier.js +103 -0
  8. package/dist/agent/session-core.d.ts +13 -0
  9. package/dist/agent/session-state.js +2 -1
  10. package/dist/agent/session-sync.js +9 -2
  11. package/dist/agent/session-tools.js +24 -3
  12. package/dist/agent/session.d.ts +3 -0
  13. package/dist/agent/session.js +20 -10
  14. package/dist/agent/tool-runner.js +15 -2
  15. package/dist/agent/types.d.ts +9 -1
  16. package/dist/ai/apis/anthropic-messages.js +3 -2
  17. package/dist/ai/apis/google-generative-ai.js +3 -2
  18. package/dist/ai/apis/openai-completions.js +3 -2
  19. package/dist/ai/apis/openai-responses.js +5 -3
  20. package/dist/ai/cache/fingerprint.d.ts +1 -1
  21. package/dist/ai/cache/fingerprint.js +1 -1
  22. package/dist/ai/cache/reporting.js +2 -1
  23. package/dist/ai/http.d.ts +28 -6
  24. package/dist/ai/http.js +41 -8
  25. package/dist/ai/providers/channels.d.ts +51 -0
  26. package/dist/ai/providers/channels.js +96 -0
  27. package/dist/ai/providers/enrich.d.ts +34 -0
  28. package/dist/ai/providers/enrich.js +86 -0
  29. package/dist/ai/providers/models-dev-cache.d.ts +53 -0
  30. package/dist/ai/providers/models-dev-cache.js +147 -0
  31. package/dist/ai/providers/models-dev.d.ts +99 -0
  32. package/dist/ai/providers/models-dev.js +315 -0
  33. package/dist/ai/providers/registry.d.ts +42 -4
  34. package/dist/ai/providers/registry.js +195 -34
  35. package/dist/ai/providers/suggest.d.ts +18 -0
  36. package/dist/ai/providers/suggest.js +72 -0
  37. package/dist/ai/sse.d.ts +6 -2
  38. package/dist/ai/sse.js +22 -2
  39. package/dist/ai/types.d.ts +30 -3
  40. package/dist/bundle/ama.cjs +17893 -10698
  41. package/dist/cli/args.d.ts +23 -5
  42. package/dist/cli/args.js +113 -13
  43. package/dist/cli/bootstrap.js +28 -3
  44. package/dist/cli/codemode-notice.d.ts +20 -0
  45. package/dist/cli/codemode-notice.js +55 -0
  46. package/dist/cli/compose-providers.js +3 -0
  47. package/dist/cli/compose-session.d.ts +8 -0
  48. package/dist/cli/compose-session.js +32 -1
  49. package/dist/cli/compose-store.d.ts +1 -1
  50. package/dist/cli/compose-store.js +3 -1
  51. package/dist/cli/compose.d.ts +17 -5
  52. package/dist/cli/compose.js +53 -19
  53. package/dist/cli/default-model.d.ts +38 -1
  54. package/dist/cli/default-model.js +96 -9
  55. package/dist/cli/deps.d.ts +38 -0
  56. package/dist/cli/exit-codes.d.ts +2 -0
  57. package/dist/cli/exit-codes.js +3 -0
  58. package/dist/cli/fake-visibility.d.ts +13 -0
  59. package/dist/cli/fake-visibility.js +26 -0
  60. package/dist/cli/from-prompt.d.ts +18 -0
  61. package/dist/cli/from-prompt.js +49 -0
  62. package/dist/cli/main.d.ts +10 -2
  63. package/dist/cli/main.js +88 -2
  64. package/dist/cli/proxy.d.ts +51 -0
  65. package/dist/cli/proxy.js +135 -0
  66. package/dist/cli/startup-screen.d.ts +29 -0
  67. package/dist/cli/startup-screen.js +47 -0
  68. package/dist/cli/startup-steps.d.ts +1 -1
  69. package/dist/cli/startup-steps.js +20 -13
  70. package/dist/cli/subcommands/config.d.ts +29 -4
  71. package/dist/cli/subcommands/config.js +188 -25
  72. package/dist/cli/subcommands/context.js +5 -1
  73. package/dist/cli/subcommands/doctor.js +12 -1
  74. package/dist/cli/subcommands/init.d.ts +6 -0
  75. package/dist/cli/subcommands/init.js +23 -0
  76. package/dist/cli/subcommands/model-meta.d.ts +16 -0
  77. package/dist/cli/subcommands/model-meta.js +54 -0
  78. package/dist/cli/subcommands/models-cache-probe.js +1 -1
  79. package/dist/cli/subcommands/models-discover.d.ts +18 -6
  80. package/dist/cli/subcommands/models-discover.js +87 -52
  81. package/dist/cli/subcommands/models.js +26 -18
  82. package/dist/cli/subcommands/probe-runner.d.ts +96 -0
  83. package/dist/cli/subcommands/probe-runner.js +264 -0
  84. package/dist/cli/subcommands/providers-list.d.ts +8 -0
  85. package/dist/cli/subcommands/providers-list.js +97 -0
  86. package/dist/cli/subcommands/providers-plan.d.ts +79 -0
  87. package/dist/cli/subcommands/providers-plan.js +215 -0
  88. package/dist/cli/subcommands/providers-probe.d.ts +34 -0
  89. package/dist/cli/subcommands/providers-probe.js +87 -0
  90. package/dist/cli/subcommands/providers.d.ts +28 -0
  91. package/dist/cli/subcommands/providers.js +436 -0
  92. package/dist/cli/subcommands/sessions-export.d.ts +10 -0
  93. package/dist/cli/subcommands/sessions-export.js +59 -0
  94. package/dist/cli/subcommands/sessions-search.d.ts +13 -0
  95. package/dist/cli/subcommands/sessions-search.js +103 -0
  96. package/dist/cli/subcommands/sessions.d.ts +3 -2
  97. package/dist/cli/subcommands/sessions.js +22 -1
  98. package/dist/cli/subcommands/stats.d.ts +17 -0
  99. package/dist/cli/subcommands/stats.js +198 -0
  100. package/dist/cli/system-prompt-arg.d.ts +11 -0
  101. package/dist/cli/system-prompt-arg.js +34 -0
  102. package/dist/codemode/modes.d.ts +4 -11
  103. package/dist/codemode/modes.js +5 -27
  104. package/dist/codemode/tool.d.ts +18 -14
  105. package/dist/codemode/tool.js +71 -28
  106. package/dist/config/init.d.ts +34 -0
  107. package/dist/config/init.js +99 -0
  108. package/dist/config/json-schema.d.ts +15 -0
  109. package/dist/config/json-schema.js +215 -0
  110. package/dist/config/key-docs.d.ts +22 -0
  111. package/dist/config/key-docs.js +105 -0
  112. package/dist/config/merge.d.ts +9 -8
  113. package/dist/config/merge.js +22 -7
  114. package/dist/config/schema.d.ts +1 -1
  115. package/dist/config/schema.js +97 -15
  116. package/dist/config/types.d.ts +57 -11
  117. package/dist/config/types.js +19 -1
  118. package/dist/modes/commands-core.js +6 -5
  119. package/dist/modes/image-input.d.ts +27 -0
  120. package/dist/modes/image-input.js +78 -0
  121. package/dist/modes/interactive/approval-dialog.d.ts +21 -5
  122. package/dist/modes/interactive/approval-dialog.js +106 -27
  123. package/dist/modes/interactive/commands.d.ts +11 -2
  124. package/dist/modes/interactive/commands.js +58 -19
  125. package/dist/modes/interactive/interactive-mode.d.ts +2 -1
  126. package/dist/modes/interactive/interactive-mode.js +70 -82
  127. package/dist/modes/interactive/key-dispatch.d.ts +3 -1
  128. package/dist/modes/interactive/key-dispatch.js +5 -6
  129. package/dist/modes/interactive/line/line-mode.d.ts +1 -0
  130. package/dist/modes/interactive/line/line-mode.js +9 -5
  131. package/dist/modes/interactive/line/line-render.d.ts +4 -0
  132. package/dist/modes/interactive/line/line-render.js +28 -6
  133. package/dist/modes/interactive/message-view.d.ts +48 -9
  134. package/dist/modes/interactive/message-view.js +238 -44
  135. package/dist/modes/interactive/panels.d.ts +18 -0
  136. package/dist/modes/interactive/panels.js +143 -0
  137. package/dist/modes/interactive/pickers.d.ts +23 -2
  138. package/dist/modes/interactive/pickers.js +48 -15
  139. package/dist/modes/interactive/run-indicator.d.ts +51 -0
  140. package/dist/modes/interactive/run-indicator.js +189 -0
  141. package/dist/modes/interactive/startup-header.d.ts +40 -0
  142. package/dist/modes/interactive/startup-header.js +169 -0
  143. package/dist/modes/interactive/startup-ui.d.ts +7 -2
  144. package/dist/modes/interactive/startup-ui.js +41 -11
  145. package/dist/modes/interactive/status-bar.d.ts +18 -15
  146. package/dist/modes/interactive/status-bar.js +98 -56
  147. package/dist/modes/interactive/tool-summary.d.ts +46 -0
  148. package/dist/modes/interactive/tool-summary.js +218 -0
  149. package/dist/modes/interactive/tool-view.d.ts +48 -15
  150. package/dist/modes/interactive/tool-view.js +203 -145
  151. package/dist/modes/print/print-mode.d.ts +33 -4
  152. package/dist/modes/print/print-mode.js +128 -8
  153. package/dist/modes/rpc/commands.js +12 -2
  154. package/dist/permissions/auto-safe.d.ts +60 -0
  155. package/dist/permissions/auto-safe.js +529 -0
  156. package/dist/permissions/classifier.d.ts +64 -0
  157. package/dist/permissions/classifier.js +184 -0
  158. package/dist/permissions/dangerous.d.ts +5 -0
  159. package/dist/permissions/dangerous.js +1 -1
  160. package/dist/permissions/modes.d.ts +30 -0
  161. package/dist/permissions/modes.js +78 -0
  162. package/dist/permissions/pipeline.d.ts +31 -4
  163. package/dist/permissions/pipeline.js +196 -6
  164. package/dist/permissions/protected.d.ts +19 -0
  165. package/dist/permissions/protected.js +74 -0
  166. package/dist/permissions/rules.js +3 -0
  167. package/dist/permissions/types.d.ts +50 -3
  168. package/dist/permissions/types.js +3 -0
  169. package/dist/rpc.d.ts +2 -0
  170. package/dist/sdk.d.ts +9 -3
  171. package/dist/sdk.js +10 -2
  172. package/dist/session/export.d.ts +32 -0
  173. package/dist/session/export.js +187 -0
  174. package/dist/session/projection.js +5 -1
  175. package/dist/session/redact.d.ts +15 -0
  176. package/dist/session/redact.js +55 -0
  177. package/dist/session/reuse.d.ts +33 -0
  178. package/dist/session/reuse.js +86 -0
  179. package/dist/session/scan.d.ts +34 -0
  180. package/dist/session/scan.js +140 -0
  181. package/dist/session/search.d.ts +52 -0
  182. package/dist/session/search.js +211 -0
  183. package/dist/session/stats-aggregate.d.ts +63 -0
  184. package/dist/session/stats-aggregate.js +163 -0
  185. package/dist/session/stats-index.d.ts +26 -0
  186. package/dist/session/stats-index.js +91 -0
  187. package/dist/session/stats-scan.d.ts +54 -0
  188. package/dist/session/stats-scan.js +236 -0
  189. package/dist/session/types.d.ts +2 -0
  190. package/dist/tools/image-file.d.ts +31 -0
  191. package/dist/tools/image-file.js +114 -0
  192. package/dist/tools/presets.d.ts +35 -8
  193. package/dist/tools/presets.js +56 -17
  194. package/dist/tools/read.d.ts +4 -8
  195. package/dist/tools/read.js +15 -64
  196. package/dist/tui/component.d.ts +8 -2
  197. package/dist/tui/component.js +3 -1
  198. package/dist/tui/components/box.d.ts +6 -1
  199. package/dist/tui/components/box.js +16 -6
  200. package/dist/tui/components/card.d.ts +23 -0
  201. package/dist/tui/components/card.js +37 -0
  202. package/dist/tui/components/editor-history.d.ts +6 -0
  203. package/dist/tui/components/editor-history.js +45 -0
  204. package/dist/tui/components/editor-paste.d.ts +1 -1
  205. package/dist/tui/components/editor-paste.js +4 -4
  206. package/dist/tui/components/editor.d.ts +11 -5
  207. package/dist/tui/components/editor.js +52 -58
  208. package/dist/tui/components/key-value.d.ts +3 -0
  209. package/dist/tui/components/key-value.js +16 -6
  210. package/dist/tui/components/loader.d.ts +37 -7
  211. package/dist/tui/components/loader.js +84 -21
  212. package/dist/tui/components/markdown.d.ts +5 -1
  213. package/dist/tui/components/markdown.js +45 -21
  214. package/dist/tui/components/meter.d.ts +3 -3
  215. package/dist/tui/components/meter.js +13 -11
  216. package/dist/tui/components/select-list.d.ts +23 -1
  217. package/dist/tui/components/select-list.js +76 -13
  218. package/dist/tui/glyphs.d.ts +68 -0
  219. package/dist/tui/glyphs.js +114 -0
  220. package/dist/tui/theme.d.ts +30 -6
  221. package/dist/tui/theme.js +103 -17
  222. package/dist/tui.d.ts +4 -2
  223. package/dist/tui.js +3 -1
  224. package/docs/codemode.md +23 -9
  225. package/docs/hooks.md +10 -10
  226. package/docs/permissions.md +148 -0
  227. package/docs/providers.md +241 -3
  228. package/docs/rpc.md +38 -38
  229. package/docs/session-format.md +3 -2
  230. package/docs/sessions.md +134 -0
  231. package/docs/tui.md +140 -61
  232. package/package.json +3 -1
package/docs/tui.md CHANGED
@@ -6,26 +6,52 @@
6
6
 
7
7
  ## 布局
8
8
 
9
+ 视觉规格(配色、字形、逐屏样稿)见 [tui-design.md](tui-design.md)。层级用缩进表达:第 0 列是用户 `›`、工具 `⏺` 与提示符号,第 2 列是结果连接符 `⎿`,第 4 列是工具输出;去掉颜色(`NO_COLOR`、`capture-pane` 不带 `-e`)也读得出结构。
10
+
9
11
  ```
10
- ama 0.1.0 · Enter 发送 · Esc 中断 · Ctrl+C 两次退出 · /help 命令 ← 启动画面
11
- › 读一下 README ← 用户消息
12
- 思考 · 120 token ← 思考块(折叠)
13
- ● read README.md ← 工具调用
14
- …前 3 行结果…
15
- 回答正文(Markdown)
16
- ↳ followUp 之后再提交 ← 排队消息
17
- ⠋ 工作中 · Esc 中断 (12s) ← 运行中
18
- ──────────────────────────────────
19
- 输入框
20
- ──────────────────────────────────
21
- anthropic/claude-sonnet · think:medium · ↑12k ↓1.2k · cache 80% ♨ · $0.12 · rebill $0.11 · ctx 34% · mode:default · preset:default
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
+ ╰──────────────────────────────────────────────────────────────╯
22
+
23
+ › 读一下 README ← 用户消息(续行缩进 2 列)
24
+
25
+ ✻ 思考 · 120 token ← 思考块(折叠;Ctrl+O 展开)
26
+
27
+ ⏺ read README.md ← 工具调用:⏺ 工具名 摘要
28
+ ⎿ 读取 5 行 ← 一行结果摘要
29
+ 1 # Demo ← 输出正文(缩进 4 列)
30
+ … 另 2 行(Ctrl+O 展开)
31
+ ⏺ bash pnpm test ← 相邻工具调用之间不空行
32
+ ⎿ ⠋ 运行中 · 4s
33
+
34
+ ↳ 之后 顺便更新文档 ← 排队消息
35
+ Alt+↑ 取回 · Esc 回填并中断
36
+ ⠋ 运行 bash · 4s · Esc 中断 ← 运行中动词
37
+ ────────────────────────────────────────────────
38
+ › 输入消息,/ 命令,@ 文件,Shift+Enter 换行 ← 输入框(占位)
39
+ ────────────────────────────────────────────────
40
+ Accept edits · shift+tab 切换 sonnet-4-5 · medium · ↑12k ↓1.2k · cache 80% ♨ · $0.12 · ctx 34%
22
41
  ```
23
42
 
24
- - **用户消息**:`›` 开头;运行中插话标 `↳ steer`,排到本轮之后的标 `↳ followUp`,宿主(Armadra 画布)注入的标 `↳ host`。
25
- - **思考块**:`ui.showThinking` = `collapsed`(缺省,一行计数)/ `full`(全文)/ `hidden`。
26
- - **工具调用**:一行标题,圆点运行中为强调色、成功绿、失败红;折叠显示结果前 3 行,`edit` 显示 diff(前 12 行),`bash` 运行中滚动显示最后 8 行。`Ctrl+O` 展开 / 折叠全部。codemode 脚本里的内层调用挂在外层调用下面。
27
- - **提示**:压缩摘要卡、`↻ 重试 n/m`、`⛔ Hook 阻止`、宿主通知、审批被拒或超时的说明都进消息区。
28
- - **状态栏**:模型 · 思考级别 · `↑` 输入(含缓存读写)`↓` 输出 · 缓存 · 费用 · 重计费 · 上下文占用 · 排队数 · 权限模式 · codemode · 工具预设 · 宿主状态。终端太窄时依次丢弃宿主状态、预设、重计费、费用、缓存、token、思考级别、排队数、codemode,模型、上下文与权限模式最后丢。
43
+ - **用户消息**:`›` 开头,续行缩进 2 列;运行中插话标 `↳ 插话`,排到本轮之后的标 `↳ 之后`,宿主(Armadra 画布)注入的标 `↳ 宿主`(会话文件里的 `origin` 不变:steer / followUp / host)。
44
+ - **思考块**:`ui.showThinking` = `collapsed`(缺省,`✻ 思考中…` → `✻ 思考 · 1.2k token`,`Ctrl+O` 展开为缩进的正文,最多 60 行)/ `full`(总是展开)/ `hidden`。
45
+ - **工具调用**:标题 `⏺ 工具名 摘要`,`⏺` 运行中为强调色、成功绿、失败红;第二行 `⎿` 后是结果摘要——`读取 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 个的标题与摘要)。
46
+ - **提示**:`✗` 错误、`↻ 重试 n/m`、`!` 警告(缓存未命中、上下文余量)、`⛔ Hook 阻止`、宿主通知、审批被拒或超时的说明;压缩 / 分支摘要是左竖条卡片(`▎ 上下文已压缩 128k → 24k token`)。
47
+ - **运行中**:`⠋ 动词 · 已用时 · …`,动词按当前最深状态取:`等待确认`(审批打开)、`运行 bash` / `运行 3 个工具`、`重试 2/3 · 2s 后`、`压缩上下文`、`回复中 · ↓≈1.2k`(本条输出的估算 token)、`思考中`。
48
+ - **状态栏**:永远是最后一行。左区权限模式与 `shift+tab 切换` 提示,右区按固定顺序:模型 · 思考级别 · `↑` 输入(含缓存读写)`↓` 输出 · 缓存 · 费用 · 重计费 · 上下文占用 · 排队数 · codemode · 工具预设(非 default 时)· 宿主状态;分隔符固定为 `·`,宿主可按此解析。模型名随宽度缩写(< 100 列去供应商、< 60 去渠道、< 48 去版本后缀)。终端太窄时依次丢弃切换提示、宿主状态、预设、重计费、费用、缓存、token、思考级别、排队数、codemode、上下文、模型;权限模式永不丢。≥ 110 列时上下文显示为余量表 `ctx ▮▮▮▯▯▯▯▯▯▯ 34%`。
49
+ - **退出**:消息区最后追加一行会话摘要与恢复命令,留在终端回滚里:
50
+
51
+ ```
52
+ ─ 会话 3f2a9c1e · 12 分钟 · 7 回合 · ↑128k ↓9.4k · cache 81% · $0.42(重计费 $0.03)
53
+ 恢复:ama --resume 3f2a9c1e
54
+ ```
29
55
 
30
56
  ## 缓存与上下文
31
57
 
@@ -38,8 +64,8 @@ anthropic/claude-sonnet · think:medium · ↑12k ↓1.2k · cache 80% ♨ · $0
38
64
  | `cache 未报告` | 端点不报缓存(`silent`:连续 3 个可比请求读写都是 0,或 `compat.cacheReporting: "silent"`);这类请求不进命中率分母 |
39
65
  | `♨` | 保温计时中(工具长时间运行时按 TTL 重放前缀,`/cache warm` 可切换) |
40
66
  | `rebill $0.11` | 本会话缓存未命中导致的重计费金额;模型没有价格时显示 token 数;为 0 不显示 |
41
- | `ctx 72%` | 上下文占用,≥ 70% 黄色、≥ 90% 红色;`ctx ?` 表示模型没有窗口信息 |
42
- | `codemode:only` | codemode 生效(`on` / `only`);运行时 Node 的权限模型不隔离网络(Node 22 / 24)时追加红色 `net!` |
67
+ | `ctx 72%` | 上下文占用,< 70% 绿色、≥ 70% 黄色、≥ 90% 红色;`ctx ?` 表示模型没有窗口信息 |
68
+ | `codemode only` | codemode 生效(`on` / `only`);运行时 Node 的权限模型不隔离网络(Node 22 / 24)时追加红色 `net!` |
43
69
 
44
70
  消息区(line 模式写 stderr,前缀 `ama: `)只在两种情况下提示一行,`cache.missNotices: false` 可关:
45
71
 
@@ -47,16 +73,22 @@ anthropic/claude-sonnet · think:medium · ↑12k ↓1.2k · cache 80% ♨ · $0
47
73
  - 上下文占用跨过 70% / 90%(各一次):`上下文已用 72%,约剩 9 回合(按最近 5 回合均值)`;回合数估不出时给余量 token。
48
74
  - line 模式在 `AMA_LOG=info` 时另写保温成功:`缓存保温已刷新(读 12k token,$0.001)`。
49
75
 
50
- `/session` 在会话信息之后有「缓存」段,`/cache` 只显示这一段:
76
+ `/session` 在消息区画一张左竖条面板,会话信息之后是「缓存」段,`/cache` 只显示这一段(line 模式与 RPC 是同样内容的纯文本):
51
77
 
52
78
  ```
53
- 缓存
54
- 输入 3.4k = 缓存读 2.2k(65%)+ 未缓存 1.2k
55
- 报告状态 reported
56
- 命中率 最近 84% · 会话 65%
57
- 未命中 0 次
58
- 保温 streaming · 已停止:模型目录没有缓存 TTL
59
- 上下文 1%,余量 ≈ 127k token ≈ 2443 回合
79
+ ▎ 会话 3f2a9c1e ~/.local/share/ama/sessions/…/3f2a9c1e.jsonl
80
+ ▎ 模型 anthropic/claude-sonnet-4-5 · 思考 medium · 权限 Accept edits
81
+ ▎ 消息 用户 7 · 助手 9 · 工具调用 23
82
+ ▎ 用量 输入 3.4k · 输出 9.4k · 缓存读 118k · 缓存写 6.2k · $0.42
83
+ ▎ 上下文 ▮▮▮▯▯▯▯▯▯▯ 34% · 68k / 200k
84
+ ▎
85
+ ▎ 缓存
86
+ ▎ 输入 3.4k = 缓存读 2.2k(65%)+ 未缓存 1.2k
87
+ ▎ 报告状态 reported
88
+ ▎ 命中率 最近 84% · 会话 65%
89
+ ▎ 未命中 0 次
90
+ ▎ 保温 streaming · 已停止:模型目录没有缓存 TTL
91
+ ▎ 上下文 1%,余量 ≈ 127k token ≈ 2443 回合
60
92
  ```
61
93
 
62
94
  未命中行按原因分列(`3 次,重计费 61k token ≈ $0.18(空闲超时 2 · 前缀变化 1)`);保温行在计时中显示 `streaming · 下次 2m 10s · 期望节省 $0.18 ≥ $0.05`,停止时给原因;有 task 子会话时另有「子任务」行。
@@ -70,20 +102,20 @@ anthropic/claude-sonnet · think:medium · ↑12k ↓1.2k · cache 80% ♨ · $0
70
102
 
71
103
  ## 按键
72
104
 
73
- | 按键 | 作用 |
74
- | -------------------- | ------------------------------------------------------------------ |
75
- | Enter | 发送;运行中 = steer(插到当前轮) |
76
- | Alt+Enter | 运行中排到本轮之后(followUp);空闲时等同 Enter |
77
- | Shift+Enter / Ctrl+J | 换行 |
78
- | Esc | 中断:排队的消息回填到输入框,然后停止当前运行;补全打开时先关补全 |
79
- | Alt+↑ | 取回最后一条排队消息 |
80
- | Shift+Tab | 循环权限模式 plan → default → auto-edit → full-auto |
81
- | Ctrl+O | 展开 / 折叠工具输出 |
82
- | Ctrl+L / Ctrl+T | 选择模型 / 思考级别 |
83
- | Ctrl+C | 清空输入;输入为空时 1.5 秒内再按一次退出(退出码 130) |
84
- | Ctrl+D | 输入为空时退出 |
85
- | Tab | 补全 |
86
- | ↑ / ↓ | 单行时浏览历史(`<数据目录>/history`,500 条) |
105
+ | 按键 | 作用 |
106
+ | -------------------- | --------------------------------------------------------------------- |
107
+ | Enter | 发送;运行中 = steer(插到当前轮) |
108
+ | Alt+Enter | 运行中排到本轮之后(followUp);空闲时等同 Enter |
109
+ | Shift+Enter / Ctrl+J | 换行 |
110
+ | Esc | 中断:排队的消息回填到输入框,然后停止当前运行;补全打开时先关补全 |
111
+ | Alt+↑ | 取回最后一条排队消息 |
112
+ | Shift+Tab | 循环权限模式 Manual → Accept edits → Plan → Auto → Bypass permissions |
113
+ | Ctrl+O | 展开 / 折叠工具输出与思考块 |
114
+ | Ctrl+L / Ctrl+T | 选择模型 / 思考级别 |
115
+ | Ctrl+C | 清空输入;输入为空时 1.5 秒内再按一次退出(退出码 130) |
116
+ | Ctrl+D | 输入为空时退出 |
117
+ | Tab | 补全 |
118
+ | ↑ / ↓ | 单行时浏览历史(`<数据目录>/history`,500 条) |
87
119
 
88
120
  按键可在 `~/.config/ama/keybindings.json` 覆盖,键是动作 id(`app.interrupt`、`app.message.followUp`、`tui.editor.newLine` ……),值是按键或按键数组,空数组表示禁用。
89
121
 
@@ -93,8 +125,11 @@ anthropic/claude-sonnet · think:medium · ↑12k ↓1.2k · cache 80% ♨ · $0
93
125
 
94
126
  - `/tree`:列出会话里的全部用户消息(分叉处缩进,`●` 是当前分支);选中一条后回到它之前,原文回填输入框,修改后发送就形成新分支。
95
127
  - `/fork`(无参数):同样选一条用户消息,从它之前复制出新会话。
96
- - `/model`、`/resume`、`/permission`、`/thinking` 不带参数时打开选择器;`/permissions` 显示权限判定顺序与已加载规则。
97
- - `/session`、`/cache`:会话用量与缓存统计(见下文「缓存与上下文」)。
128
+ - `/model`、`/resume`、`/permission`、`/thinking` 不带参数时打开选择器;`/permissions` 显示权限判定顺序、已加载规则与最近 20 条 auto 判定(层、结果、原因)。
129
+ - `/permission` 选择器标题「权限模式」:Manual / Accept edits / Plan / Auto / Bypass permissions / Allowlist only,每项一行说明,右侧数字 1–6 直接选;当前模式打 `✓`,配置里的缺省模式标 `Default`,Auto 标 `Recommended`,底部一行按键提示。`/permission auto`、`/permission Accept edits` 直接切换。状态栏最左是模式的显示名。auto 模式下需要确认时,审批对话框多一行「Auto 规则层 / 分类器:原因」。详见 [permissions.md](permissions.md)。
130
+ - 选择器底部一行按键提示(`↑↓ 选择 · Enter 确认 · Esc 取消`),选中行有底色(≥ 256 色;更少时强调色粗体)。`/model` 选择器给当前模型打 `✓`,并带 `(i/n)` 计数;按「供应商 · 渠道」分组(多渠道模型在每个渠道下各一项,非首选渠道带 `@渠道`),说明里有上下文与 `img`(收图片);`/model packy/kimi-k2.5@messages` 直接切到指定渠道。
131
+ - 输入里的 `@图片路径`(可加引号,Tab 补全路径)或粘贴 / 拖入的图片文件路径作为图片附件随消息发送;当前模型不收图片时 `@` 附件报错、不发送,未加 `@` 的路径忽略(见 [providers.md](providers.md)「图像输入」)。
132
+ - `/session`、`/cache`:会话用量与缓存统计面板(见上文「缓存与上下文」);`/permissions` 同样是面板,allow 绿、deny 红,判定顺序折行对齐。
98
133
 
99
134
  ## 补全
100
135
 
@@ -103,7 +138,25 @@ anthropic/claude-sonnet · think:medium · ↑12k ↓1.2k · cache 80% ♨ · $0
103
138
 
104
139
  ## 审批
105
140
 
106
- 工具调用需要确认时,底部弹出对话框:bash 显示完整命令,write 显示路径与行数,edit 显示每处修改的 −/+ 摘要;子 Agent 发起的请求标 `[task]`。`y` 允许、`n` / Esc 拒绝、`a` 本会话内同类不再询问、`v` 查看完整输入。10 分钟不作答按拒绝处理(`AMA_APPROVAL_TIMEOUT_MS` 可改)。
141
+ 工具调用需要确认时,底部弹出对话框:标题是原因(`需要确认` / `危险命令` / `Hook 要求确认`,子 Agent 发起的加 `[task]`),边框随预览严重度变红 / 黄;bash 显示完整命令,write 显示路径与行数,edit 显示每处修改的 −/+ 摘要。下面是编号选项:
142
+
143
+ ```
144
+ ╭─ 危险命令 ─────────────────────────────────────────────╮
145
+ │ bash 危险命令 │
146
+ │ $ rm -rf build dist/*.map > out.log │
147
+ │ │
148
+ │ 删除 build/:目录,132 个文件,1.2 MB │
149
+ │ 这条命令可能有破坏性,请确认 │
150
+ │ │
151
+ │ 1. 允许 y │
152
+ │ 2. 本会话允许同类 a │
153
+ │ › 3. 拒绝 n Esc │
154
+ │ │
155
+ │ ↑↓ 选择 · Enter 确认 · v 完整输入 │
156
+ ╰─────────────────────────────────────────────────────────╯
157
+ ```
158
+
159
+ `1`–`3` 或 `↑↓` + Enter 选择,`y` 允许、`a` 本会话内同类不再询问、`n` / Esc / Ctrl+C 拒绝、`v` 查看完整输入。缺省选中项:危险命令是「拒绝」,其余是「允许」。窄于 56 列时紧凑显示(工具名单独一行、不留空行)。10 分钟不作答按拒绝处理(`AMA_APPROVAL_TIMEOUT_MS` 可改)。
107
160
 
108
161
  输入摘要之后是**执行前预览**:这一步会碰到什么。
109
162
 
@@ -115,15 +168,33 @@ anthropic/claude-sonnet · think:medium · ↑12k ↓1.2k · cache 80% ♨ · $0
115
168
 
116
169
  ## 启动画面
117
170
 
118
- `ui.quietStartup` / `--quiet-startup`:`normal` 显示标题、模型、目录与信任状态、已加载的上下文文件 / Skill / 提示模板 / Hook;`header` 只有标题行(profile 缺省);`silent` 不显示。`--resume` 不带 id、模型没有 key、会话目录不存在、项目资源需要信任时,界面启动前会先出现一个小的选择 / 输入提示,答完收成一行留在屏幕上。
171
+ `ui.quietStartup` / `--quiet-startup`:`normal` 显示带框的启动头——标题、模型与思考级别、目录(`~` 缩写)与信任状态、权限模式 / 预设 / codemode、已加载的上下文文件 / Skill / 提示模板 / Hook、警告数与常用按键;窄于 56 列或 `ui.compact` 时去框、每项一行。`header` 只有一行 `✻ ama 版本 · 模型 · 模式 · /help`(profile 缺省);`silent` 不显示。`--resume` 不带 id、模型没有 key、会话目录不存在、项目资源需要信任时,界面启动前会先出现一个小的选择 / 输入提示,答完收成一行留在屏幕上。
119
172
 
120
173
  ## 在 tmux / Armadra 终端节点里
121
174
 
122
- - 括号粘贴:启动时开启;粘贴的多行内容整体进入输入框(超过 10 行或 1 000 字符折叠为 `[paste #N +M lines]`),粘贴后紧跟的回车直接发送,适合由外部程序写入。
175
+ - 括号粘贴:启动时开启;粘贴的多行内容整体进入输入框(超过 10 行或 1 000 字符折叠为 `[粘贴 #N · M 行]`),粘贴后紧跟的回车直接发送,适合由外部程序写入。
123
176
  - 不查询终端能力、不开鼠标与 Kitty 键盘协议,避免回包混进输入;tmux ≥ 3.4 透传同步输出,旧版本也能正常显示。
124
177
  - 窗口尺寸变化时整屏重画最后一屏,回滚里的历史不受影响。
125
178
  - 自动降级:非 TTY、`TERM=dumb`、`--no-tui` 或终端初始化失败时使用行式界面,命令与审批问答相同。
126
179
 
180
+ ## 配置与排错
181
+
182
+ `config.json` 的 `ui` 段(项目级也可设):
183
+
184
+ | 键 | 缺省 | 作用 |
185
+ | ----------------- | ----------- | --------------------------------------------------------------------------------------------- |
186
+ | `ui.theme` | `dark` | `dark` / `light` / `auto`;auto 只看 `COLORFGBG`(不发终端查询),猜不出用 dark,建议显式配置 |
187
+ | `ui.ascii` | 自动检测 | ASCII 字形(`›` → `>`、`⏺` → `*`、`⎿` → `L`、框线 → `+ - \|`、spinner 4 帧) |
188
+ | `ui.compact` | `false` | 消息区块间不空行、启动头无框 |
189
+ | `ui.animation` | `true` | `false`:运行中 spinner 静止为 `·`,只在秒数变化时重绘 |
190
+ | `ui.markdown` | `true` | `false`:助手正文不做 Markdown 渲染 |
191
+ | `ui.showThinking` | `collapsed` | 见「布局」 |
192
+ | `ui.quietStartup` | `normal` | 见「启动画面」 |
193
+
194
+ - **ASCII 模式**:`AMA_ASCII=1`(或 `ui.ascii: true`)强制开启,`AMA_ASCII=0` 强制关闭;自动检测在区域设置(`LC_ALL` > `LC_CTYPE` > `LANG`)已设置但不含 UTF-8、`TERM=linux`、Windows 上既没有 `WT_SESSION` 也没有 `TERM_PROGRAM`(旧 conhost)时开启。Windows Terminal 走 Unicode。
195
+ - **字符错位**:`⏺`(U+23FA)、`⎿`、`▎` 在个别字体(尤其 emoji 回退字体)下画成两格,宽度计算按 wcwidth(一格),会出现列错位或残影——换等宽字体或设 `AMA_ASCII=1`。
196
+ - **颜色**:`NO_COLOR` 或 `TERM=dumb` 无色;16 色终端按内置表取近,选中行不用底色而用强调色粗体;浅色终端设 `ui.theme: "light"`。
197
+
127
198
  ## 组件库(`@armadra/agent/tui`)
128
199
 
129
200
  交互模式用的终端组件单独导出,零依赖,宿主或其它 Node 程序可以直接用来画主屏界面。
@@ -148,21 +219,29 @@ tui.setFocus(editor);
148
219
  tui.start();
149
220
  ```
150
221
 
151
- | 导出 | 作用 |
152
- | --------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------ |
153
- | `Component`、`Focusable`、`CURSOR_MARKER` | 组件契约:`render(width)` 返回各行(每行可见宽 ≤ width)、`handleInput?(data)`、`invalidate()`;获焦组件在光标处输出 `CURSOR_MARKER` |
154
- | `TUI` | 根容器与差分渲染(主屏、同步输出):`addChild`、`start` / `stop`、`requestRender`、`setFocus`、`addInputListener`、`showOverlay` |
155
- | `ProcessTerminal`、`MemoryTerminal`、`VirtualScreen` | 真实终端(raw 模式、括号粘贴);内存终端与 VT 屏幕(测试、帧黄金) |
156
- | `Container`、`Text`、`TruncatedText`、`Markdown`、`Box`、`Spacer`、`Loader` | 基础组件 |
157
- | `Editor`、`EditorBuffer`、`PasteStore` | 多行编辑器(历史、补全接口 `AutocompleteProvider`、粘贴折叠) |
158
- | `SelectList` | 可过滤的选择列表 |
159
- | `KeyValue`、`Meter` | 两列对齐的键值表;进度条 |
160
- | `compositeOverlays`、`OverlayOptions` | 覆盖层合成(居中 / 底部锚定) |
161
- | `createTheme`、`plainTheme`、`detectCapabilities`、`Theme` | 主题与颜色能力探测(`NO_COLOR`、16 / 256 / truecolor);11 个语义色 |
162
- | `Keybindings`、`DEFAULT_KEYBINDINGS`、`loadKeybindingsFile` | 动作 id → 按键,`keybindings.json` 覆盖 |
163
- | `parseKey`、`matchesKey`、`StdinBuffer` | 键序列解析与 Esc 超时切分(`AMA_TUI_ESC_TIMEOUT`) |
164
- | `visibleWidth`、`truncateToWidth`、`wrapTextWithAnsi`、`sliceByColumn` 等 | 带 ANSI 与宽字符的宽度计算与截断 |
222
+ | 导出 | 作用 |
223
+ | ------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------ |
224
+ | `Component`、`Focusable`、`CURSOR_MARKER` | 组件契约:`render(width)` 返回各行(每行可见宽 ≤ width)、`handleInput?(data)`、`invalidate()`;获焦组件在光标处输出 `CURSOR_MARKER` |
225
+ | `TUI` | 根容器与差分渲染(主屏、同步输出):`addChild`、`start` / `stop`、`requestRender`、`setFocus`、`addInputListener`、`showOverlay` |
226
+ | `ProcessTerminal`、`MemoryTerminal`、`VirtualScreen` | 真实终端(raw 模式、括号粘贴);内存终端与 VT 屏幕(测试、帧黄金) |
227
+ | `Container`、`Text`、`TruncatedText`、`Markdown`、`Box`、`Card`、`Spacer` | 基础组件;`Card` 是左竖条卡片,`Box` 可设 `borderColor` |
228
+ | `Loader` | 运行指示:`setVerb(动词, 附加项, { elapsed })`、`frame` / `onFrame`(与别的组件同帧换字)、`animation: false` |
229
+ | `Editor`、`EditorBuffer`、`PasteStore` | 多行编辑器(历史、补全接口 `AutocompleteProvider`、粘贴折叠) |
230
+ | `SelectList` | 可过滤的选择列表:分组、徽标、数字键、`stacked`、`currentValue`(✓)、`footer` 按键提示 |
231
+ | `KeyValue`、`Meter` | 两列对齐的键值表(`wrap` 折行对齐值列);余量表(`levelColor` 阈值着色) |
232
+ | `compositeOverlays`、`OverlayOptions` | 覆盖层合成(居中 / 底部锚定) |
233
+ | `createTheme`、`plainTheme`、`detectCapabilities`、`Theme` | 主题与颜色能力探测(`NO_COLOR`、16 / 256 / truecolor);14 个语义色,`resolveThemeName("auto")` |
234
+ | `Theme.glyphs`、`UNICODE_GLYPHS`、`ASCII_GLYPHS`、`detectAscii` | 字形表(`›` `⏺` `⎿` `✻` `▎`、框线、spinner 帧……)与 ASCII 回退;`createTheme(name, { ascii })` |
235
+ | `Keybindings`、`DEFAULT_KEYBINDINGS`、`loadKeybindingsFile` | 动作 id → 按键,`keybindings.json` 覆盖 |
236
+ | `parseKey`、`matchesKey`、`StdinBuffer` | 键序列解析与 Esc 超时切分(`AMA_TUI_ESC_TIMEOUT`) |
237
+ | `visibleWidth`、`truncateToWidth`、`wrapTextWithAnsi`、`sliceByColumn` 等 | 带 ANSI 与宽字符的宽度计算与截断 |
165
238
 
166
239
  ## 测试
167
240
 
168
- `src/modes/interactive/interactive-mode.test.ts` 用 `MemoryTerminal`(80x24、40x24)+ fake 供应商跑一次完整的读文件 run,把启动、输入、工具运行中、结束、`Ctrl+O` 展开、退出各帧写进 `test/fixtures/tui/run-*.txt`。改界面后用 `AMA_UPDATE_GOLDEN=1 pnpm vitest run src/modes/interactive` 更新并审阅差异。
241
+ 帧黄金都在 `test/fixtures/tui/`,`MemoryTerminal` 还原屏幕(无色,只验布局与字形):
242
+
243
+ - `src/modes/interactive/interactive-mode.test.ts`:80x24、40x24 跑一次完整的读文件 run(启动、输入、工具运行中、结束、`Ctrl+O` 展开、退出摘要)→ `run-*.txt`;审批、缓存提示等。
244
+ - `src/modes/interactive/interactive-frames.test.ts`:启动头(`startup-normal-*`、`header-quiet-*`)、工具层级(`tools-*`)、提示(`notices-*`)、运行中动词(`loader-verbs-*`)、`/session` 面板(`panel-session-*`)、ASCII 模式整条 run(`ascii-run-*`)。
245
+ - `src/tui/tui-frames.test.ts`:组件级(对话、Markdown、编辑器占位 / 多行 / 粘贴 / 补全);`status-bar.test.ts` 的 `status-widths.txt`;`approval-dialog.test.ts`、`pickers.test.ts` 的审批与模式选择器。
246
+
247
+ 改界面后用 `AMA_UPDATE_GOLDEN=1 pnpm vitest run src/modes/interactive src/tui` 更新,并逐个审阅 `git diff test/fixtures/tui`。
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@armadra/agent",
3
- "version": "0.2.1",
3
+ "version": "0.4.0",
4
4
  "description": "可独立使用、可嵌入 Armadra 的编码 / 协调 Agent",
5
5
  "type": "module",
6
6
  "keywords": [
@@ -57,10 +57,12 @@
57
57
  "docs/rpc.md",
58
58
  "docs/host-api.md",
59
59
  "docs/hooks.md",
60
+ "docs/permissions.md",
60
61
  "docs/providers.md",
61
62
  "docs/codemode.md",
62
63
  "docs/tui.md",
63
64
  "docs/session-format.md",
65
+ "docs/sessions.md",
64
66
  "CHANGELOG.md"
65
67
  ],
66
68
  "sideEffects": [