@armadra/agent 0.3.0 → 0.5.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 (527) hide show
  1. package/CHANGELOG.md +257 -0
  2. package/README.md +263 -95
  3. package/THIRD_PARTY_NOTICES.md +34 -0
  4. package/dist/acp.d.ts +18 -0
  5. package/dist/acp.js +19 -0
  6. package/dist/agent/limits.d.ts +38 -0
  7. package/dist/agent/limits.js +127 -0
  8. package/dist/agent/loop-guard.d.ts +38 -0
  9. package/dist/agent/loop-guard.js +95 -0
  10. package/dist/agent/loop.d.ts +4 -0
  11. package/dist/agent/loop.js +7 -0
  12. package/dist/agent/prompt-rules.d.ts +12 -0
  13. package/dist/agent/prompt-rules.js +18 -0
  14. package/dist/agent/reminders.d.ts +59 -0
  15. package/dist/agent/reminders.js +327 -0
  16. package/dist/agent/retry.d.ts +1 -1
  17. package/dist/agent/retry.js +2 -1
  18. package/dist/agent/session-cache.d.ts +5 -0
  19. package/dist/agent/session-cache.js +18 -2
  20. package/dist/agent/session-classifier.d.ts +18 -0
  21. package/dist/agent/session-classifier.js +105 -0
  22. package/dist/agent/session-compaction.d.ts +35 -6
  23. package/dist/agent/session-compaction.js +157 -31
  24. package/dist/agent/session-core.d.ts +40 -1
  25. package/dist/agent/session-extensions.d.ts +61 -0
  26. package/dist/agent/session-extensions.js +129 -0
  27. package/dist/agent/session-images.d.ts +23 -0
  28. package/dist/agent/session-images.js +97 -0
  29. package/dist/agent/session-plan.d.ts +21 -0
  30. package/dist/agent/session-plan.js +524 -0
  31. package/dist/agent/session-rewind.d.ts +81 -0
  32. package/dist/agent/session-rewind.js +354 -0
  33. package/dist/agent/session-run.d.ts +28 -1
  34. package/dist/agent/session-run.js +157 -6
  35. package/dist/agent/session-settings.d.ts +49 -0
  36. package/dist/agent/session-settings.js +95 -0
  37. package/dist/agent/session-subagent.d.ts +36 -24
  38. package/dist/agent/session-subagent.js +259 -129
  39. package/dist/agent/session-sync.d.ts +10 -3
  40. package/dist/agent/session-sync.js +37 -8
  41. package/dist/agent/session-telemetry.d.ts +39 -0
  42. package/dist/agent/session-telemetry.js +231 -0
  43. package/dist/agent/session-tools.js +63 -3
  44. package/dist/agent/session.d.ts +33 -29
  45. package/dist/agent/session.js +91 -126
  46. package/dist/agent/subagent-registry.d.ts +91 -0
  47. package/dist/agent/subagent-registry.js +494 -0
  48. package/dist/agent/system-prompt.d.ts +6 -3
  49. package/dist/agent/system-prompt.js +7 -2
  50. package/dist/agent/tool-runner.d.ts +8 -1
  51. package/dist/agent/tool-runner.js +72 -6
  52. package/dist/agent/types-w5.d.ts +192 -0
  53. package/dist/agent/types-w5.js +10 -0
  54. package/dist/agent/types.d.ts +55 -4
  55. package/dist/agent/types.js +2 -0
  56. package/dist/agent/worktree.d.ts +36 -0
  57. package/dist/agent/worktree.js +86 -0
  58. package/dist/agents/builtin.d.ts +14 -0
  59. package/dist/agents/builtin.js +39 -0
  60. package/dist/agents/catalog.d.ts +43 -0
  61. package/dist/agents/catalog.js +82 -0
  62. package/dist/agents/discover.d.ts +35 -0
  63. package/dist/agents/discover.js +83 -0
  64. package/dist/agents/external.d.ts +82 -0
  65. package/dist/agents/external.js +326 -0
  66. package/dist/agents/parse.d.ts +18 -0
  67. package/dist/agents/parse.js +116 -0
  68. package/dist/agents/result.d.ts +32 -0
  69. package/dist/agents/result.js +67 -0
  70. package/dist/agents/task-control.d.ts +17 -0
  71. package/dist/agents/task-control.js +17 -0
  72. package/dist/agents/task-record.d.ts +78 -0
  73. package/dist/agents/task-record.js +141 -0
  74. package/dist/agents/types.d.ts +46 -0
  75. package/dist/agents/types.js +8 -0
  76. package/dist/ai/apis/anthropic-compat.d.ts +36 -0
  77. package/dist/ai/apis/anthropic-compat.js +92 -0
  78. package/dist/ai/apis/anthropic-messages.js +3 -2
  79. package/dist/ai/apis/anthropic-request.d.ts +7 -6
  80. package/dist/ai/apis/anthropic-request.js +10 -28
  81. package/dist/ai/apis/cache-params.d.ts +11 -2
  82. package/dist/ai/apis/cache-params.js +25 -6
  83. package/dist/ai/apis/google-generative-ai.js +3 -2
  84. package/dist/ai/apis/openai-compat.d.ts +4 -1
  85. package/dist/ai/apis/openai-compat.js +8 -1
  86. package/dist/ai/apis/openai-completions.js +3 -2
  87. package/dist/ai/apis/openai-responses.js +3 -2
  88. package/dist/ai/http.d.ts +28 -6
  89. package/dist/ai/http.js +41 -8
  90. package/dist/ai/image-limits.d.ts +45 -0
  91. package/dist/ai/image-limits.js +68 -0
  92. package/dist/ai/providers/builtin.d.ts +18 -6
  93. package/dist/ai/providers/builtin.js +135 -6
  94. package/dist/ai/providers/catalog-data.js +17 -13
  95. package/dist/ai/providers/catalog.d.ts +60 -7
  96. package/dist/ai/providers/catalog.js +197 -38
  97. package/dist/ai/providers/channels.d.ts +33 -3
  98. package/dist/ai/providers/channels.js +108 -7
  99. package/dist/ai/providers/enrich.d.ts +6 -3
  100. package/dist/ai/providers/enrich.js +19 -4
  101. package/dist/ai/providers/models-dev-cache.d.ts +28 -24
  102. package/dist/ai/providers/models-dev-cache.js +92 -78
  103. package/dist/ai/providers/models-dev-data.d.ts +7 -0
  104. package/dist/ai/providers/models-dev-data.js +32 -0
  105. package/dist/ai/providers/models-dev-snapshot.d.ts +50 -0
  106. package/dist/ai/providers/models-dev-snapshot.js +137 -0
  107. package/dist/ai/providers/models-dev.d.ts +51 -10
  108. package/dist/ai/providers/models-dev.js +132 -39
  109. package/dist/ai/providers/registry.d.ts +28 -11
  110. package/dist/ai/providers/registry.js +112 -65
  111. package/dist/ai/providers/suggest.d.ts +18 -0
  112. package/dist/ai/providers/suggest.js +72 -0
  113. package/dist/ai/sse.d.ts +6 -2
  114. package/dist/ai/sse.js +22 -2
  115. package/dist/ai/types.d.ts +37 -4
  116. package/dist/ai/types.js +5 -0
  117. package/dist/bundle/ama.cjs +41979 -21147
  118. package/dist/checkpoints/backend.d.ts +61 -0
  119. package/dist/checkpoints/backend.js +135 -0
  120. package/dist/checkpoints/blobs.d.ts +60 -0
  121. package/dist/checkpoints/blobs.js +203 -0
  122. package/dist/checkpoints/gc.d.ts +47 -0
  123. package/dist/checkpoints/gc.js +144 -0
  124. package/dist/checkpoints/git-head.d.ts +15 -0
  125. package/dist/checkpoints/git-head.js +89 -0
  126. package/dist/checkpoints/index.d.ts +17 -0
  127. package/dist/checkpoints/index.js +17 -0
  128. package/dist/checkpoints/replay.d.ts +48 -0
  129. package/dist/checkpoints/replay.js +154 -0
  130. package/dist/checkpoints/restore.d.ts +86 -0
  131. package/dist/checkpoints/restore.js +263 -0
  132. package/dist/checkpoints/settings.d.ts +14 -0
  133. package/dist/checkpoints/settings.js +23 -0
  134. package/dist/checkpoints/shadow-git.d.ts +108 -0
  135. package/dist/checkpoints/shadow-git.js +491 -0
  136. package/dist/checkpoints/shadow-restore.d.ts +25 -0
  137. package/dist/checkpoints/shadow-restore.js +128 -0
  138. package/dist/checkpoints/tracker.d.ts +64 -0
  139. package/dist/checkpoints/tracker.js +192 -0
  140. package/dist/checkpoints/types.d.ts +99 -0
  141. package/dist/checkpoints/types.js +12 -0
  142. package/dist/cli/args.d.ts +26 -7
  143. package/dist/cli/args.js +75 -82
  144. package/dist/cli/bootstrap.js +40 -4
  145. package/dist/cli/codemode-notice.d.ts +21 -0
  146. package/dist/cli/codemode-notice.js +56 -0
  147. package/dist/cli/compose-agents.d.ts +27 -0
  148. package/dist/cli/compose-agents.js +111 -0
  149. package/dist/cli/compose-extensions.d.ts +29 -0
  150. package/dist/cli/compose-extensions.js +44 -0
  151. package/dist/cli/compose-session.d.ts +8 -0
  152. package/dist/cli/compose-session.js +76 -2
  153. package/dist/cli/compose-store.d.ts +1 -1
  154. package/dist/cli/compose-store.js +3 -1
  155. package/dist/cli/compose.d.ts +17 -4
  156. package/dist/cli/compose.js +60 -14
  157. package/dist/cli/default-model.d.ts +38 -1
  158. package/dist/cli/default-model.js +96 -9
  159. package/dist/cli/deps.d.ts +42 -0
  160. package/dist/cli/exit-codes.d.ts +12 -0
  161. package/dist/cli/exit-codes.js +15 -0
  162. package/dist/cli/fake-visibility.d.ts +13 -0
  163. package/dist/cli/fake-visibility.js +26 -0
  164. package/dist/cli/from-prompt.d.ts +18 -0
  165. package/dist/cli/from-prompt.js +49 -0
  166. package/dist/cli/help-text.d.ts +4 -0
  167. package/dist/cli/help-text.js +102 -0
  168. package/dist/cli/main.d.ts +9 -2
  169. package/dist/cli/main.js +77 -3
  170. package/dist/cli/proxy.d.ts +51 -0
  171. package/dist/cli/proxy.js +135 -0
  172. package/dist/cli/startup-screen.d.ts +29 -0
  173. package/dist/cli/startup-screen.js +51 -2
  174. package/dist/cli/startup-steps.d.ts +1 -1
  175. package/dist/cli/startup-steps.js +21 -13
  176. package/dist/cli/subcommands/config.d.ts +22 -3
  177. package/dist/cli/subcommands/config.js +119 -21
  178. package/dist/cli/subcommands/context.js +4 -1
  179. package/dist/cli/subcommands/doctor.js +33 -1
  180. package/dist/cli/subcommands/init.js +2 -1
  181. package/dist/cli/subcommands/models-discover.d.ts +15 -9
  182. package/dist/cli/subcommands/models-discover.js +58 -52
  183. package/dist/cli/subcommands/models.d.ts +2 -0
  184. package/dist/cli/subcommands/models.js +33 -14
  185. package/dist/cli/subcommands/probe-runner.d.ts +96 -0
  186. package/dist/cli/subcommands/probe-runner.js +264 -0
  187. package/dist/cli/subcommands/providers-probe.d.ts +34 -0
  188. package/dist/cli/subcommands/providers-probe.js +87 -0
  189. package/dist/cli/subcommands/providers.d.ts +3 -2
  190. package/dist/cli/subcommands/providers.js +53 -51
  191. package/dist/cli/subcommands/sessions-export.d.ts +10 -0
  192. package/dist/cli/subcommands/sessions-export.js +59 -0
  193. package/dist/cli/subcommands/sessions-search.d.ts +13 -0
  194. package/dist/cli/subcommands/sessions-search.js +103 -0
  195. package/dist/cli/subcommands/sessions.d.ts +6 -3
  196. package/dist/cli/subcommands/sessions.js +58 -3
  197. package/dist/cli/subcommands/stats.d.ts +17 -0
  198. package/dist/cli/subcommands/stats.js +198 -0
  199. package/dist/cli/system-prompt-arg.d.ts +11 -0
  200. package/dist/cli/system-prompt-arg.js +34 -0
  201. package/dist/codemode/capability.d.ts +24 -7
  202. package/dist/codemode/capability.js +38 -10
  203. package/dist/codemode/host-side.d.ts +14 -0
  204. package/dist/codemode/host-side.js +24 -1
  205. package/dist/codemode/modes.d.ts +4 -11
  206. package/dist/codemode/modes.js +5 -27
  207. package/dist/codemode/tool.d.ts +18 -14
  208. package/dist/codemode/tool.js +76 -31
  209. package/dist/compaction/breaker.d.ts +25 -9
  210. package/dist/compaction/breaker.js +47 -17
  211. package/dist/compaction/estimate.d.ts +11 -3
  212. package/dist/compaction/estimate.js +64 -22
  213. package/dist/compaction/image-budget.d.ts +45 -0
  214. package/dist/compaction/image-budget.js +115 -0
  215. package/dist/compaction/post-compact.d.ts +38 -0
  216. package/dist/compaction/post-compact.js +152 -0
  217. package/dist/compaction/protect.d.ts +27 -0
  218. package/dist/compaction/protect.js +56 -0
  219. package/dist/compaction/prune-tier.d.ts +58 -12
  220. package/dist/compaction/prune-tier.js +120 -54
  221. package/dist/compaction/summarize-tier.d.ts +23 -4
  222. package/dist/compaction/summarize-tier.js +100 -29
  223. package/dist/config/checker.d.ts +28 -0
  224. package/dist/config/checker.js +97 -0
  225. package/dist/config/init.d.ts +6 -2
  226. package/dist/config/init.js +12 -5
  227. package/dist/config/json-schema.d.ts +1 -0
  228. package/dist/config/json-schema.js +98 -4
  229. package/dist/config/key-docs.d.ts +22 -0
  230. package/dist/config/key-docs.js +174 -0
  231. package/dist/config/merge.d.ts +12 -9
  232. package/dist/config/merge.js +102 -13
  233. package/dist/config/profile.d.ts +2 -0
  234. package/dist/config/profile.js +2 -0
  235. package/dist/config/schema-w5.d.ts +18 -0
  236. package/dist/config/schema-w5.js +109 -0
  237. package/dist/config/schema.d.ts +5 -9
  238. package/dist/config/schema.js +91 -118
  239. package/dist/config/types-w5.d.ts +118 -0
  240. package/dist/config/types-w5.js +20 -0
  241. package/dist/config/types.d.ts +84 -7
  242. package/dist/config/types.js +29 -1
  243. package/dist/drivers/acp/client.d.ts +57 -0
  244. package/dist/drivers/acp/client.js +160 -0
  245. package/dist/drivers/acp/driver.d.ts +31 -0
  246. package/dist/drivers/acp/driver.js +274 -0
  247. package/dist/drivers/acp/testing/fake-agent-main.d.ts +5 -0
  248. package/dist/drivers/acp/testing/fake-agent-main.js +7 -0
  249. package/dist/drivers/acp/testing/fake-agent.d.ts +27 -0
  250. package/dist/drivers/acp/testing/fake-agent.js +211 -0
  251. package/dist/drivers/acp/types.d.ts +285 -0
  252. package/dist/drivers/acp/types.js +36 -0
  253. package/dist/drivers/agents.d.ts +58 -0
  254. package/dist/drivers/agents.js +142 -0
  255. package/dist/drivers/base.d.ts +35 -0
  256. package/dist/drivers/base.js +59 -0
  257. package/dist/drivers/catalog.d.ts +46 -0
  258. package/dist/drivers/catalog.js +167 -0
  259. package/dist/drivers/env.d.ts +20 -0
  260. package/dist/drivers/env.js +46 -0
  261. package/dist/drivers/host-runners.d.ts +18 -0
  262. package/dist/drivers/host-runners.js +45 -0
  263. package/dist/drivers/jsonrpc.d.ts +58 -0
  264. package/dist/drivers/jsonrpc.js +180 -0
  265. package/dist/drivers/native/claude-normalize.d.ts +46 -0
  266. package/dist/drivers/native/claude-normalize.js +106 -0
  267. package/dist/drivers/native/claude-stream.d.ts +29 -0
  268. package/dist/drivers/native/claude-stream.js +456 -0
  269. package/dist/drivers/native/codex-app-server.d.ts +26 -0
  270. package/dist/drivers/native/codex-app-server.js +407 -0
  271. package/dist/drivers/native/codex-normalize.d.ts +38 -0
  272. package/dist/drivers/native/codex-normalize.js +124 -0
  273. package/dist/drivers/native/oneshot.d.ts +28 -0
  274. package/dist/drivers/native/oneshot.js +312 -0
  275. package/dist/drivers/permissions.d.ts +40 -0
  276. package/dist/drivers/permissions.js +92 -0
  277. package/dist/drivers/pids.d.ts +32 -0
  278. package/dist/drivers/pids.js +93 -0
  279. package/dist/drivers/pool.d.ts +28 -0
  280. package/dist/drivers/pool.js +96 -0
  281. package/dist/drivers/probe.d.ts +47 -0
  282. package/dist/drivers/probe.js +172 -0
  283. package/dist/drivers/process.d.ts +48 -0
  284. package/dist/drivers/process.js +100 -0
  285. package/dist/drivers/runner.d.ts +61 -0
  286. package/dist/drivers/runner.js +388 -0
  287. package/dist/drivers/store.d.ts +49 -0
  288. package/dist/drivers/store.js +91 -0
  289. package/dist/drivers/turn.d.ts +41 -0
  290. package/dist/drivers/turn.js +99 -0
  291. package/dist/drivers/types.d.ts +122 -0
  292. package/dist/drivers/types.js +11 -0
  293. package/dist/git/info.d.ts +75 -0
  294. package/dist/git/info.js +191 -0
  295. package/dist/hooks/protocol.js +6 -1
  296. package/dist/hooks/types.d.ts +10 -1
  297. package/dist/hooks/types.js +2 -0
  298. package/dist/host/api-impl.d.ts +7 -0
  299. package/dist/host/api-impl.js +15 -0
  300. package/dist/host/types.d.ts +24 -2
  301. package/dist/host/types.js +4 -0
  302. package/dist/index.d.ts +3 -0
  303. package/dist/index.js +1 -0
  304. package/dist/modes/acp/acp-events.d.ts +46 -0
  305. package/dist/modes/acp/acp-events.js +233 -0
  306. package/dist/modes/acp/acp-mode.d.ts +17 -0
  307. package/dist/modes/acp/acp-mode.js +47 -0
  308. package/dist/modes/acp/acp-server.d.ts +79 -0
  309. package/dist/modes/acp/acp-server.js +315 -0
  310. package/dist/modes/commands-core.d.ts +7 -1
  311. package/dist/modes/commands-core.js +61 -5
  312. package/dist/modes/image-input.d.ts +12 -4
  313. package/dist/modes/image-input.js +22 -5
  314. package/dist/modes/interactive/agent-panels.d.ts +14 -0
  315. package/dist/modes/interactive/agent-panels.js +103 -0
  316. package/dist/modes/interactive/agent-ui.d.ts +73 -0
  317. package/dist/modes/interactive/agent-ui.js +234 -0
  318. package/dist/modes/interactive/approval-dialog.d.ts +40 -7
  319. package/dist/modes/interactive/approval-dialog.js +192 -35
  320. package/dist/modes/interactive/approval-merge.d.ts +41 -0
  321. package/dist/modes/interactive/approval-merge.js +89 -0
  322. package/dist/modes/interactive/clipboard-paste.d.ts +18 -0
  323. package/dist/modes/interactive/clipboard-paste.js +28 -0
  324. package/dist/modes/interactive/commands.d.ts +20 -3
  325. package/dist/modes/interactive/commands.js +75 -16
  326. package/dist/modes/interactive/double-esc.d.ts +20 -0
  327. package/dist/modes/interactive/double-esc.js +34 -0
  328. package/dist/modes/interactive/event-notices.d.ts +32 -0
  329. package/dist/modes/interactive/event-notices.js +79 -0
  330. package/dist/modes/interactive/external-editor.d.ts +16 -0
  331. package/dist/modes/interactive/external-editor.js +39 -0
  332. package/dist/modes/interactive/interactive-mode.d.ts +16 -2
  333. package/dist/modes/interactive/interactive-mode.js +184 -202
  334. package/dist/modes/interactive/key-dispatch.d.ts +18 -2
  335. package/dist/modes/interactive/key-dispatch.js +53 -6
  336. package/dist/modes/interactive/line/line-mode.d.ts +3 -1
  337. package/dist/modes/interactive/line/line-mode.js +28 -9
  338. package/dist/modes/interactive/line/line-render.d.ts +6 -1
  339. package/dist/modes/interactive/line/line-render.js +66 -8
  340. package/dist/modes/interactive/message-view.d.ts +49 -10
  341. package/dist/modes/interactive/message-view.js +262 -46
  342. package/dist/modes/interactive/panels.d.ts +35 -0
  343. package/dist/modes/interactive/panels.js +157 -0
  344. package/dist/modes/interactive/pickers.d.ts +23 -2
  345. package/dist/modes/interactive/pickers.js +48 -15
  346. package/dist/modes/interactive/plan-command.d.ts +40 -0
  347. package/dist/modes/interactive/plan-command.js +129 -0
  348. package/dist/modes/interactive/plan-dialog.d.ts +98 -0
  349. package/dist/modes/interactive/plan-dialog.js +290 -0
  350. package/dist/modes/interactive/plan-flow.d.ts +34 -0
  351. package/dist/modes/interactive/plan-flow.js +98 -0
  352. package/dist/modes/interactive/rewind-command.d.ts +31 -0
  353. package/dist/modes/interactive/rewind-command.js +106 -0
  354. package/dist/modes/interactive/rewind-flow.d.ts +37 -0
  355. package/dist/modes/interactive/rewind-flow.js +151 -0
  356. package/dist/modes/interactive/rewind-list.d.ts +36 -0
  357. package/dist/modes/interactive/rewind-list.js +123 -0
  358. package/dist/modes/interactive/rewind-panel.d.ts +77 -0
  359. package/dist/modes/interactive/rewind-panel.js +309 -0
  360. package/dist/modes/interactive/rewind-text.d.ts +40 -0
  361. package/dist/modes/interactive/rewind-text.js +139 -0
  362. package/dist/modes/interactive/run-indicator.d.ts +51 -0
  363. package/dist/modes/interactive/run-indicator.js +189 -0
  364. package/dist/modes/interactive/session-events.d.ts +24 -0
  365. package/dist/modes/interactive/session-events.js +96 -0
  366. package/dist/modes/interactive/startup-header.d.ts +40 -0
  367. package/dist/modes/interactive/startup-header.js +169 -0
  368. package/dist/modes/interactive/status-area.d.ts +73 -0
  369. package/dist/modes/interactive/status-area.js +190 -0
  370. package/dist/modes/interactive/status-bar.d.ts +107 -16
  371. package/dist/modes/interactive/status-bar.js +306 -81
  372. package/dist/modes/interactive/status-line.d.ts +33 -0
  373. package/dist/modes/interactive/status-line.js +113 -0
  374. package/dist/modes/interactive/subagent-view.d.ts +56 -0
  375. package/dist/modes/interactive/subagent-view.js +154 -0
  376. package/dist/modes/interactive/tasks-report.d.ts +27 -0
  377. package/dist/modes/interactive/tasks-report.js +114 -0
  378. package/dist/modes/interactive/tool-summary.d.ts +46 -0
  379. package/dist/modes/interactive/tool-summary.js +218 -0
  380. package/dist/modes/interactive/tool-view.d.ts +58 -15
  381. package/dist/modes/interactive/tool-view.js +233 -145
  382. package/dist/modes/print/print-mode.d.ts +40 -4
  383. package/dist/modes/print/print-mode.js +161 -8
  384. package/dist/modes/rpc/commands.d.ts +9 -0
  385. package/dist/modes/rpc/commands.js +49 -0
  386. package/dist/modes/rpc/rpc-mode.js +7 -1
  387. package/dist/modes/session-report.d.ts +11 -0
  388. package/dist/modes/session-report.js +48 -1
  389. package/dist/permissions/auto-safe.d.ts +65 -0
  390. package/dist/permissions/auto-safe.js +547 -0
  391. package/dist/permissions/classifier.d.ts +68 -0
  392. package/dist/permissions/classifier.js +186 -0
  393. package/dist/permissions/dangerous.d.ts +5 -0
  394. package/dist/permissions/dangerous.js +1 -1
  395. package/dist/permissions/modes.d.ts +30 -0
  396. package/dist/permissions/modes.js +78 -0
  397. package/dist/permissions/pipeline.d.ts +72 -6
  398. package/dist/permissions/pipeline.js +306 -11
  399. package/dist/permissions/protected.d.ts +19 -0
  400. package/dist/permissions/protected.js +74 -0
  401. package/dist/permissions/readonly-bash.d.ts +30 -0
  402. package/dist/permissions/readonly-bash.js +118 -0
  403. package/dist/permissions/rules.js +3 -0
  404. package/dist/permissions/types.d.ts +92 -3
  405. package/dist/permissions/types.js +3 -0
  406. package/dist/plan/compose.d.ts +9 -0
  407. package/dist/plan/compose.js +19 -0
  408. package/dist/plan/controller.d.ts +71 -0
  409. package/dist/plan/controller.js +27 -0
  410. package/dist/plan/done-markers.d.ts +17 -0
  411. package/dist/plan/done-markers.js +51 -0
  412. package/dist/plan/extract.d.ts +29 -0
  413. package/dist/plan/extract.js +160 -0
  414. package/dist/plan/prompts.d.ts +36 -0
  415. package/dist/plan/prompts.js +89 -0
  416. package/dist/plan/store.d.ts +37 -0
  417. package/dist/plan/store.js +90 -0
  418. package/dist/rpc.d.ts +58 -2
  419. package/dist/rpc.js +7 -0
  420. package/dist/sandbox/bash.d.ts +74 -0
  421. package/dist/sandbox/bash.js +126 -0
  422. package/dist/sandbox/detect.d.ts +48 -0
  423. package/dist/sandbox/detect.js +149 -0
  424. package/dist/sandbox/index.d.ts +5 -0
  425. package/dist/sandbox/index.js +5 -0
  426. package/dist/sandbox/profile.d.ts +33 -0
  427. package/dist/sandbox/profile.js +76 -0
  428. package/dist/sandbox/wrap.d.ts +29 -0
  429. package/dist/sandbox/wrap.js +117 -0
  430. package/dist/sdk.d.ts +42 -5
  431. package/dist/sdk.js +34 -4
  432. package/dist/session/export.d.ts +32 -0
  433. package/dist/session/export.js +187 -0
  434. package/dist/session/redact.d.ts +15 -0
  435. package/dist/session/redact.js +55 -0
  436. package/dist/session/reuse.d.ts +33 -0
  437. package/dist/session/reuse.js +86 -0
  438. package/dist/session/scan.d.ts +34 -0
  439. package/dist/session/scan.js +140 -0
  440. package/dist/session/search.d.ts +52 -0
  441. package/dist/session/search.js +211 -0
  442. package/dist/session/stats-aggregate.d.ts +63 -0
  443. package/dist/session/stats-aggregate.js +163 -0
  444. package/dist/session/stats-index.d.ts +26 -0
  445. package/dist/session/stats-index.js +91 -0
  446. package/dist/session/stats-scan.d.ts +54 -0
  447. package/dist/session/stats-scan.js +236 -0
  448. package/dist/session/types.d.ts +3 -1
  449. package/dist/session/types.js +1 -0
  450. package/dist/skills/builtin.d.ts +31 -0
  451. package/dist/skills/builtin.js +109 -0
  452. package/dist/skills/discover.d.ts +2 -1
  453. package/dist/skills/index-prompt.js +5 -8
  454. package/dist/tools/background-jobs.d.ts +71 -0
  455. package/dist/tools/background-jobs.js +198 -0
  456. package/dist/tools/bash.d.ts +53 -1
  457. package/dist/tools/bash.js +158 -7
  458. package/dist/tools/clipboard-image.d.ts +44 -0
  459. package/dist/tools/clipboard-image.js +148 -0
  460. package/dist/tools/edit.d.ts +2 -0
  461. package/dist/tools/edit.js +18 -3
  462. package/dist/tools/image-file.d.ts +38 -3
  463. package/dist/tools/image-file.js +81 -10
  464. package/dist/tools/image-resize.d.ts +58 -0
  465. package/dist/tools/image-resize.js +97 -0
  466. package/dist/tools/presets.d.ts +40 -8
  467. package/dist/tools/presets.js +65 -19
  468. package/dist/tools/read.d.ts +5 -2
  469. package/dist/tools/read.js +13 -10
  470. package/dist/tools/registry.d.ts +7 -1
  471. package/dist/tools/registry.js +27 -4
  472. package/dist/tools/task-ctl.d.ts +22 -0
  473. package/dist/tools/task-ctl.js +116 -0
  474. package/dist/tools/task.d.ts +22 -10
  475. package/dist/tools/task.js +66 -26
  476. package/dist/tools/todo.d.ts +22 -2
  477. package/dist/tools/todo.js +58 -14
  478. package/dist/tools/truncate.d.ts +15 -0
  479. package/dist/tools/truncate.js +25 -0
  480. package/dist/tools/types.d.ts +113 -0
  481. package/dist/tools/types.js +5 -0
  482. package/dist/tools/write.js +3 -0
  483. package/dist/tui/component.d.ts +8 -2
  484. package/dist/tui/component.js +3 -1
  485. package/dist/tui/components/box.d.ts +6 -1
  486. package/dist/tui/components/box.js +16 -6
  487. package/dist/tui/components/card.d.ts +23 -0
  488. package/dist/tui/components/card.js +37 -0
  489. package/dist/tui/components/editor-history.d.ts +6 -0
  490. package/dist/tui/components/editor-history.js +45 -0
  491. package/dist/tui/components/editor-paste.d.ts +1 -1
  492. package/dist/tui/components/editor-paste.js +4 -4
  493. package/dist/tui/components/editor.d.ts +11 -5
  494. package/dist/tui/components/editor.js +52 -58
  495. package/dist/tui/components/key-value.d.ts +3 -0
  496. package/dist/tui/components/key-value.js +16 -6
  497. package/dist/tui/components/loader.d.ts +37 -7
  498. package/dist/tui/components/loader.js +84 -21
  499. package/dist/tui/components/markdown.d.ts +5 -1
  500. package/dist/tui/components/markdown.js +45 -21
  501. package/dist/tui/components/meter.d.ts +3 -3
  502. package/dist/tui/components/meter.js +13 -11
  503. package/dist/tui/components/select-list.d.ts +23 -1
  504. package/dist/tui/components/select-list.js +76 -13
  505. package/dist/tui/glyphs.d.ts +72 -0
  506. package/dist/tui/glyphs.js +118 -0
  507. package/dist/tui/keybindings.d.ts +5 -0
  508. package/dist/tui/keybindings.js +5 -0
  509. package/dist/tui/theme.d.ts +30 -6
  510. package/dist/tui/theme.js +103 -17
  511. package/dist/tui.d.ts +4 -2
  512. package/dist/tui.js +3 -1
  513. package/docs/acp.md +78 -0
  514. package/docs/agents.md +250 -0
  515. package/docs/codemode.md +28 -10
  516. package/docs/hooks.md +36 -32
  517. package/docs/permissions.md +212 -0
  518. package/docs/plan.md +107 -0
  519. package/docs/providers.md +261 -62
  520. package/docs/rewind-plan.md +181 -0
  521. package/docs/rpc.md +127 -40
  522. package/docs/sandbox.md +215 -0
  523. package/docs/session-format.md +43 -22
  524. package/docs/sessions.md +174 -0
  525. package/docs/tui-design.md +751 -0
  526. package/docs/tui.md +260 -64
  527. package/package.json +15 -2
package/README.md CHANGED
@@ -23,9 +23,15 @@ ama
23
23
  - [工具与预设](#工具与预设)
24
24
  - [缓存](#缓存)
25
25
  - [安全](#安全)
26
+ - [沙箱](#沙箱)
27
+ - [Plan](#plan)
28
+ - [子 Agent](#子-agent)
29
+ - [外部 Agent](#外部-agent)
30
+ - [回滚](#回滚)
26
31
  - [界面与入口](#界面与入口)
27
32
  - [嵌入 Armadra](#嵌入-armadra)
28
33
  - [文档](#文档)
34
+ - [已知限制](#已知限制)
29
35
  - [开发](#开发)
30
36
 
31
37
  ## 为什么做 ama
@@ -38,20 +44,23 @@ ama
38
44
 
39
45
  ## 特性一览
40
46
 
41
- | 方面 | 内容 |
42
- | -------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
43
- | 多协议与供应商 | 4 条协议线、13 家内置供应商(Anthropic、OpenAI、Google、DeepSeek、Moonshot、智谱、通义、OpenRouter、Groq、xAI、Mistral、Ollama、LM Studio)、自定义供应商、模型级协议 |
44
- | 零配置与中转站 | 有 key 就选第一个可用的供应商;识别 `OPENAI_BASE_URL` / `ANTHROPIC_BASE_URL`;`ama providers add` 只给 baseUrl 与 key 一键接入:列模型、探测渠道、写回配置 |
45
- | 模型元数据 | 上下文、输出上限、图像输入、推理、价格缺省从 models.dev 补(本地缓存,启动不联网);一个供应商可挂多个渠道(Chat / Responses / Messages),`provider/model@渠道` |
46
- | 图像输入 | `-p --image`、界面里 `@图片路径`;四条协议都映射;模型不收图片时直接拒绝并提示换模型 |
47
- | 工具与预设 | read / edit / write / bash / grep / glob,另有 ls、todo、task(子 Agent)、codemode;四个预设 `default` / `minimal` / `codemode` / `coordinator` |
48
- | codemode | 模型写一段 JS,在受 Node 权限模型约束的子进程里编排多次工具调用,只有输出回到模型 |
49
- | Skill | `SKILL.md` 目录,模型按索引自行读取,用户用 `/skill:<名字>` 调用;另有提示模板 |
50
- | 两层 Hook | 命令式 Hook(`hooks.json`,9 个事件,用户策略)与进程内宿主适配器 HostApi(嵌入方) |
51
- | 权限 | 四种模式、allow / deny 规则、危险命令识别(穿透 `sh -c` / `eval` / `xargs` / `find -exec`)、项目信任、审批时的执行前预览 |
52
- | 缓存 | 前缀稳定、缓存字段与兼容开关、未命中归因、「报 / 不报缓存」三态、长工具运行时保温、压缩摘要按会话前缀续写 |
53
- | 会话 | JSONL 条目树,分叉与 `/tree` 回溯;两档压缩(裁剪大工具结果 → 摘要)与熔断 |
54
- | 入口 | 差分渲染终端界面、`--no-tui` 行式、`-p`(text / json / stream-json)、`--mode rpc`、SDK |
47
+ | 方面 | 内容 |
48
+ | --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
49
+ | 多协议与供应商 | 4 条协议线、17 家内置供应商(Anthropic、OpenAI、Google、DeepSeek、Moonshot、智谱、通义、OpenRouter、Groq、xAI、Mistral、MiniMax、阶跃、火山方舟、腾讯、Ollama、LM Studio)、内置渠道(Messages / Responses 优先、Chat 回落)、自定义供应商、模型级协议 |
50
+ | 零配置与中转站 | 有 key 就选第一个可用的供应商(中转站按价格规则挑缺省模型);识别 `OPENAI_BASE_URL` / `ANTHROPIC_BASE_URL`;`ama providers add` 只给 baseUrl 与 key 一键接入:列模型、探测渠道、写回配置 |
51
+ | 模型元数据 | 上下文、输出上限、图像输入、推理、价格来自随包的 models.dev 内置快照(启动与运行都不联网,`ama models refresh` 显式刷新);一个供应商可挂多个渠道(Chat / Responses / Messages),`provider/model@渠道` |
52
+ | 图像输入 | `-p --image`、界面里 `@图片路径`、`Ctrl+V` / `/paste` 粘贴剪贴板图片;按端点分档的单图上限、超限自动缩放;模型不收图片时直接拒绝并提示换模型 |
53
+ | 工具与预设 | read / edit / write / bash / grep / glob,另有 ls、todo、task / task_ctl(子 Agent)、codemode;四个预设 `default` / `minimal` / `codemode-only` / `coordinator` |
54
+ | Plan 与子 Agent | Plan 模式只读调研、出计划后审批执行;`task` 委派子 Agent(内置 general / explore / plan,可自定义类型,前台 / 后台 / 续聊 / worktree 隔离) |
55
+ | 外部 Agent | `task(agent="claude" \| "codex" \| "acp:<程序>")` 以各 CLI 自己的登录驱动外部编码 Agent,审批只交给人;`ama --mode acp` 把 ama 暴露为 ACP Agent |
56
+ | 回滚与沙箱 | 每回合检查点,`/rewind` / 双击 Esc 回到任一条消息之前(代码、对话或两者);macOS / Linux 的操作系统沙箱隔离 codemode 与(可选)bash |
57
+ | codemode | 模型写一段 JS,在受 Node 权限模型约束的子进程里编排多次工具调用,只有输出回到模型 |
58
+ | Skill | `SKILL.md` 目录,模型按索引自行读取,用户用 `/skill:<名字>` 调用;另有提示模板 |
59
+ | 两层 Hook | 命令式 Hook(`hooks.json`,11 个事件,用户策略)与进程内宿主适配器 HostApi(嵌入方) |
60
+ | 权限 | 四种模式、allow / deny 规则、危险命令识别(穿透 `sh -c` / `eval` / `xargs` / `find -exec`)、项目信任、审批时的执行前预览 |
61
+ | 缓存 | 前缀稳定、缓存字段与兼容开关、未命中归因、「报 / 不报缓存」三态、长工具运行时保温、压缩摘要按会话前缀续写 |
62
+ | 会话 | JSONL 条目树,分叉与 `/tree` 回溯;两档压缩(裁剪大工具结果 → 摘要)与熔断;预算上限(`--max-turns` / `--max-cost`)、重复调用检测、模型回退 |
63
+ | 入口 | 差分渲染终端界面、`--no-tui` 行式、`-p`(text / json / stream-json)、`--mode rpc`、`--mode acp`、SDK |
55
64
 
56
65
  ## 安装
57
66
 
@@ -85,18 +94,19 @@ pnpm build # 产出 dist/ 与 dist/bundle/ama.cjs、dist/bundle/
85
94
  node dist/bundle/ama.cjs --version
86
95
  ```
87
96
 
88
- ### Node 版本与 codemode
97
+ ### Node 版本、codemode 与沙箱
89
98
 
90
- | Node | codemode 沙箱 |
91
- | ------- | -------------------------------------------------------------------------------------------- |
92
- | ≥ 25 | 文件系统与网络都隔离;`codemode` 按只读类工具处理,`default` 权限模式下免审批 |
93
- | 22 / 24 | 隔离文件系统,**不隔离网络**;`codemode` 按执行类处理,每次都要审批(状态栏显示红色 `net!`) |
99
+ | Node / 平台 | codemode | bash 沙箱(`sandbox.bash: "auto"`) |
100
+ | ------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------- |
101
+ | ≥ 25 | 文件系统与网络都隔离;`codemode` 按只读类工具处理,`default` 权限模式下免审批;`default` 预设**缺省开启** codemode | 取决于平台(下两行) |
102
+ | 22 / 24 + 操作系统沙箱(macOS、多数 Linux) | 子进程经 `sandbox-exec` / bubblewrap 启动,网络由内核拒绝;与 Node ≥ 25 相同:只读类、`default` 预设缺省开启 | macOS `sandbox-exec`、Linux bubblewrap 可用(`unshare` 不算) |
103
+ | 22 / 24,没有操作系统沙箱(如 Windows) | 隔离文件系统,**不隔离网络**;`codemode` 按执行类处理,每次都要审批(状态栏显示红色 `net!`);`default` 预设缺省**不开** codemode,启动时提示一次(每个配置目录一次) | 不可用,bash 照常审批 |
94
104
 
95
- 其余功能在 Node 22 起都一样。`codemode.requireStrict: true` 可以在网络未隔离时直接禁用 codemode。
105
+ 其余功能在 Node 22 起都一样。`ama doctor` 显示本机的操作系统沙箱能力([docs/sandbox.md](docs/sandbox.md));`sandbox.enabled: "off"` 或 `AMA_SANDBOX=off` 关闭它。网络未隔离时想用 codemode 就显式开:`--codemode on` 或 config 写 `"codemode": { "mode": "on" }`。`codemode.requireStrict: true` 可以在网络未隔离时直接禁用 codemode。
96
106
 
97
107
  ## 快速开始
98
108
 
99
- **零配置**:设好任一家的标准环境变量就能用,ama 按内置顺序选第一个有 key 的供应商和它的缺省模型。
109
+ **零配置**:设好任一家的标准环境变量就能用,ama 按内置顺序选第一个有 key 的供应商和它的缺省模型(`ama config show` 说明选了谁、为什么)。没有任何 key 时启动会提示怎么配,不会落到测试用的 `fake` 供应商上。
100
110
 
101
111
  ```sh
102
112
  export ANTHROPIC_API_KEY=sk-... # 或 OPENAI_API_KEY、GEMINI_API_KEY、DEEPSEEK_API_KEY、MOONSHOT_API_KEY ……
@@ -122,22 +132,29 @@ ama -p "列出 TODO" --model deepseek/deepseek-v4-pro --output-format json
122
132
 
123
133
  **常用参数**:
124
134
 
125
- | 参数 | 作用 |
126
- | ------------------------------------------------------- | ---------------------------------------------- |
127
- | `--model provider/id` | 选模型(配置、命令行、`/model`、SDK 写法一致) |
128
- | `--thinking off\|minimal\|low\|medium\|high\|xhigh` | 思考级别(缺省 `medium`) |
129
- | `--permission-mode plan\|default\|auto-edit\|full-auto` | 权限模式(缺省 `default`) |
130
- | `-c` / `-r [id]` | 继续本目录最近的会话 / 选择会话恢复 |
131
- | `--tools-preset <名>` | 工具预设(见下文) |
132
- | `--allow <规则>` / `--deny <规则>` | 追加权限规则,可重复 |
135
+ | 参数 | 作用 |
136
+ | ------------------------------------------------------- | ------------------------------------------------------------ |
137
+ | `--model provider/id` | 选模型(配置、命令行、`/model`、SDK 写法一致) |
138
+ | `--thinking off\|minimal\|low\|medium\|high\|xhigh` | 思考级别(缺省 `medium`) |
139
+ | `--permission-mode plan\|default\|auto-edit\|full-auto` | 权限模式(缺省 `default`) |
140
+ | `-c` / `-r [id]` | 继续本目录最近的会话 / 选择会话恢复 |
141
+ | `--tools-preset <名>` | 工具预设(见下文) |
142
+ | `--allow <规则>` / `--deny <规则>` | 追加权限规则,可重复 |
143
+ | `--max-turns N` / `--max-cost USD` | 一次运行的轮数 / 美元上限(`-p` 到限退出 8) |
144
+ | `--agent-dir <目录>` | 追加子 Agent 定义目录,可重复 |
145
+ | `--mode rpc` / `--mode acp` | stdio 上说 RPC(JSONL)/ ACP(JSON-RPC),供宿主与编辑器驱动 |
133
146
 
134
- 本地 Ollama / LM Studio 不需要 key:`ama --model ollama/<模型名>`。`ama --help` 列出全部参数与子命令;测试或排查时可用不花钱的 `--model fake/echo`(回显最后一条用户消息)。
147
+ **内置供应商**(17 家):Anthropic、OpenAI、Google、DeepSeek、Moonshot(Kimi)、智谱、通义(DashScope)、OpenRouter、Groq、xAI、Mistral、MiniMax、阶跃、火山方舟、腾讯 TokenHub、Ollama、LM Studio。多协议的供应商带内置渠道,缺省协议 Messages / Responses 优先、Chat 回落:OpenAI、xAI、火山方舟走 Responses,通义、MiniMax、阶跃、腾讯走 Messages,DeepSeek、智谱、Kimi 暂走 Chat(`@messages` 可选),`provider/model@渠道` 指定渠道。完整表见 [docs/providers.md](docs/providers.md)「内置供应商」。
148
+
149
+ 本地 Ollama / LM Studio 不需要 key:`ama --model ollama/<模型名>`。`ama --help` 列出全部参数与子命令;测试或排查时可用不花钱的 `--model fake/echo`(回显最后一条用户消息;模型选择器、`models list`、`doctor` 缺省不列这个测试供应商,`AMA_SHOW_FAKE=1` 时列出)。
135
150
 
136
151
  ## 配置
137
152
 
138
- 一个文件 `~/.config/ama/config.json`。第一次运行 ama 时自动建好目录(0700)、最小的 `config.json` 与给编辑器用的
139
- `config.schema.json`;也可以 `ama init` 手动建(已有文件不覆盖)。`ama config path` 打印各文件位置,`ama config edit`
140
- 用 `$VISUAL` / `$EDITOR` 打开。常用的只有五个键:
153
+ 一个文件 `~/.config/ama/config.json`。第一次进入对话(交互、`-p`、RPC)或 `ama providers add` 时自动建好目录(0700)、
154
+ 最小的 `config.json` 与给编辑器用的 `config.schema.json`;`config show`、`doctor`、`models list` 等只读命令不写配置目录。
155
+ 也可以 `ama init` 手动建(已有文件不覆盖)。生成的 `config.json` 只有 `$schema`、`version` 与空 `providers`,不写死缺省值——以后
156
+ 缺省值调整时老配置同样跟着变。`ama config path` 打印各文件位置,`ama config edit` 用 `$VISUAL` / `$EDITOR` 打开,
157
+ `config.schema.json` 给每个键带了说明与缺省值,编辑器悬停可见。常用的只有五个键:
141
158
 
142
159
  ```json
143
160
  {
@@ -151,14 +168,22 @@ ama -p "列出 TODO" --model deepseek/deepseek-v4-pro --output-format json
151
168
  }
152
169
  ```
153
170
 
154
- 其余(`compaction`、`retry`、`codemode`、`hooks`、`ui`、`skills`、`cache`)都有缺省,`ama config show` 会列出来。
171
+ 其余(`compaction`、`retry`、`codemode`、`hooks`、`ui`、`skills`、`cache`、`request`)都有缺省,`ama config show` 列出每一项的生效值与来源(default / user / profile / project / cli),也接受 `--tools-preset` / `--codemode` 看覆盖后的效果。
172
+
173
+ **请求超时**:模型请求有空闲超时,缺省 300 s——等响应头、以及流里两块数据之间超过这个时间就判定卡住,按可重试错误
174
+ 走 `retry` 的退避重试(收到任何字节即重新计时,长回答不受影响)。用 `request.idleTimeoutMs`(只认用户级)或环境变量
175
+ `AMA_IDLE_TIMEOUT_MS` 调整,0 关闭。
176
+
177
+ **代理**:设了 `HTTPS_PROXY` / `HTTP_PROXY`(`NO_PROXY` 排除)时,ama 启动时调用 Node 内置的环境变量代理(等价于
178
+ `NODE_USE_ENV_PROXY=1`,零依赖)。Node 24+ 直接可用;Node 22 只有 22.21+ 设 `NODE_USE_ENV_PROXY=1` 才行,更早的版本会提示一次
179
+ 并直连。`ama doctor` 的「代理」一节显示当前状态(代理地址里的账号密码打码)。
155
180
 
156
181
  ### 文件位置与层级
157
182
 
158
183
  | 位置 | 内容 |
159
184
  | --------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
160
185
  | `~/.config/ama/` | 用户级:`config.json`、`config.schema.json`(ama 生成)、`auth.json`(0600)、`hooks.json`、`keybindings.json`、`trust.json`、`AGENTS.md`、`skills/` |
161
- | `~/.local/share/ama/` | 数据:`sessions/`(会话 JSONL)、`models-dev.json`(模型元数据缓存)、输入历史 |
186
+ | `~/.local/share/ama/` | 数据:`sessions/`(会话 JSONL)、`plans/`(计划文件)、`file-history/`(检查点备份)、`models-dev.json`(`ama models refresh` 的覆盖)、输入历史 |
162
187
  | `<项目>/.ama/` | 项目级:`config.json`(只能收紧)、`hooks.json` / `skills/` / `prompts/`(需信任) |
163
188
  | `<项目>/AGENTS.md` | 项目约定,从 cwd 向上查找,自动进系统提示 |
164
189
  | `--profile <文件>` | 宿主 profile(嵌入方用,见「嵌入 Armadra」) |
@@ -189,8 +214,8 @@ ama providers list # 供应商 → 渠道 →
189
214
  ```
190
215
 
191
216
  `add` 列出 `GET {baseUrl}/models` 的模型,从 baseUrl 推出 chat / responses / messages 三个候选渠道,`--probe` 逐渠道发最小
192
- 请求,把能用的渠道写进每个模型的 `channels`;上下文、输出上限、图像、推理与价格不写进配置,运行时从 models.dev 缓存补
193
- (`ama models list` 标出每个字段的来源)。不给 `--key-env` 时 key 从 stdin 读(不回显)存进 `auth.json`。写入后的配置:
217
+ 请求,把能用的渠道写进每个模型的 `channels`;上下文、输出上限、图像、推理与价格不写进配置,运行时从内置的 models.dev
218
+ 快照补(`ama models list` 标出每个字段的来源)。不给 `--key-env` 时 key 从 stdin 读(不回显)存进 `auth.json`。写入后的配置:
194
219
 
195
220
  ```json
196
221
  {
@@ -240,8 +265,8 @@ OPENAI_BASE_URL=https://proxy.example/v1 OPENAI_API_KEY=$PACKY_API_KEY \
240
265
 
241
266
  - `api` 缺省 `openai-completions`;可选 `openai-responses`、`anthropic-messages`、`google-generative-ai`。
242
267
  - `apiKey` 支持 `$ENV` / `${ENV}`(读环境变量)与 `!command`(执行命令取值),不要把 key 明文写进配置。
243
- - 自定义模型的元数据缺省从 models.dev 补(`ama models refresh-catalog` 刷新缓存);匹配不到时不猜 `contextWindow`,自动
244
- 压缩关闭,需要时在模型条目里补上或写 `"modelsDev": "provider/model"` 指定条目。
268
+ - 自定义模型的元数据缺省从随包的 models.dev 快照补(启动不联网;`ama models refresh` 显式联网刷新到数据目录,`refresh-catalog`
269
+ 是旧名);匹配不到时不猜 `contextWindow`,自动压缩关闭,需要时在模型条目里补上或写 `"modelsDev": "provider/model"` 指定条目。
245
270
 
246
271
  **不想手写模型表**:让 ama 去问中转站。
247
272
 
@@ -256,20 +281,20 @@ ama models cache-probe packy/grok-4.7 # 这个端点报不报
256
281
 
257
282
  ## 工具与预设
258
283
 
259
- | 预设 | 模型直接看到的工具 | 适合 |
260
- | ------------- | ----------------------------------- | ------------------------------------------ |
261
- | `default` | read、edit、write、bash、grep、glob | 缺省 |
262
- | `minimal` | read、edit、write、bash | 小模型、小上下文;`full-auto` |
263
- | `codemode` | 只有 `codemode` | 长流程、工具调用密集的任务 |
264
- | `coordinator` | read 与宿主注册的画布工具 | 嵌入 Armadra 的协调者:不写文件、不跑 bash |
284
+ | 预设 | 模型直接看到的工具 | 适合 |
285
+ | --------------- | -------------------------------------------------------------- | ------------------------------------------------------------------------------------------- |
286
+ | `default` | read、edit、write、bash、grep、glob;网络隔离时另加 `codemode` | 缺省(要 todo 就 `tools.default: ["+todo"]`) |
287
+ | `minimal` | read、edit、write、bash | 小模型、小上下文;`full-auto` |
288
+ | `codemode-only` | 只有 `codemode` | 长流程、工具调用密集的任务 |
289
+ | `coordinator` | read 与宿主注册的画布工具 | 嵌入 Armadra 的协调者:不写文件、不跑 bash;codemode 缺省关,显式开了脚本里也只能调这些工具 |
265
290
 
266
- - `--tools-preset <名>` 或 `tools.preset` 选预设。
267
- - `tools.default` 在预设上微调:`["+todo", "+task", "-glob"]`;不带前缀的名字整组替换。
291
+ - `--tools-preset <名>` 或 `tools.preset` 选预设。`codemode` 是 `codemode-only` 的旧名(0.3.0),配置、命令行、RPC、SDK 都还认,`ama config show` 显示规范名并提示。
292
+ - `tools.default` 在预设上微调:`["+task", "+todo", "-glob"]`;不带前缀的名字整组替换。`task` 与 `task_ctl` 同进退(`+task` 一起加)。
268
293
  - 另有 `--tools a,b,c`(只启用这些)、`--exclude-tools a,b`、交互模式的 `/tools`。
269
294
 
270
- **codemode** 让模型写一段 JavaScript,用 `tools.<name>(args)` 编排多次工具调用(可以 `Promise.all` 并发),只有脚本输出回到模型。`--tools-preset codemode` 只留它,`--codemode on` 在现有工具之外加上它。脚本跑在 `node --permission` 子进程的 vm 里:没有 `require` / `import` / `process` / `fetch`,每次内层调用仍逐个经过 Hook、权限与审批。
295
+ **codemode** 让模型写一段 JavaScript,用 `tools.<name>(args)` 编排多次工具调用(可以 `Promise.all` 并发),只有脚本输出回到模型。脚本跑在 `node --permission` 子进程的 vm 里:没有 `require` / `import` / `process` / `fetch`,每次内层调用仍逐个经过 Hook、权限与审批。
271
296
 
272
- **什么时候用 codemode**:[三预设基准](docs/benchmarks/presets-2026-10-02.md)(三个模型 × 三类小任务)里,codemode 每组输入 token 比 default 多约 45%(工具声明每轮都在前缀里),顶层轮数却没有明显减少——这些任务本来只需要 2–4 次调用。所以缺省保持 `default`,只读检索多、调用次数多的长流程再用 codemode。
297
+ **缺省开放**:`codemode.mode` 不写时跟随预设——`default` → `on`(六个工具 + codemode,只在网络隔离的沙箱里:Node ≥ 25,或 Node 22 / 24 + 操作系统沙箱;否则 `off`),`codemode-only` → `only`,`minimal` / `coordinator` → `off`。显式的 `--codemode off|on|only` 或 `codemode.mode` 优先,项目级只能写 `off`。`on` 模式下 codemode 的描述只用一行列出可在脚本里调用的直接工具(参数相同)与仅脚本可调的工具名,不重复声明,前缀只多约 400 token([三预设基准](https://github.com/Owlbay/armadra-agent/blob/main/docs/benchmarks/presets-2026-10-02.md)测的是去重前的 codemode 预设:小任务输入多约 45%、轮数不减)。只读检索多、调用次数多的长流程可以用 `codemode-only`。
273
298
 
274
299
  ## 缓存
275
300
 
@@ -281,10 +306,15 @@ ama models cache-probe packy/grok-4.7 # 这个端点报不报
281
306
 
282
307
  ### 读状态栏
283
308
 
309
+ 独立终端缺省两行(`Ctrl+G` / `/statusline` 切换成一行,嵌入宿主缺省一行):
310
+
284
311
  ```
285
- anthropic/<model-id> · think:medium · ↑412k ↓8.1k · cache 83% ♨ · $0.84 · rebill $0.11 · ctx 34% · mode:default
312
+ tps: 100 tok/s • 546 tok / 5.5s (avg 100 · ttft 1.4s) ↑412k ↓8.1k · cache 83% ♨ · rebill $0.11 · [-]
313
+ Accept edits claude-opus-5-5 medium | Ctx 34.0% | proj ⎇ main 5ae9e54 (+12,-3) | $0.84 | 2h24m
286
314
  ```
287
315
 
316
+ 上行是速率与用量,下行是权限模式、模型与思考级别、上下文、目录与 git 分支(含工作区增删行)、费用、会话时长。缓存相关的项:
317
+
288
318
  | 项 | 怎么读 |
289
319
  | -------------- | -------------------------------------------------------------------------- |
290
320
  | `cache 83%` | **最近一次**请求的命中率;会话累计在 `/session` |
@@ -292,7 +322,7 @@ anthropic/<model-id> · think:medium · ↑412k ↓8.1k · cache 83% ♨ · $0.8
292
322
  | `cache 未报告` | 端点不报缓存(连续 3 次读写都是 0);这类请求不算进命中率,而不是显示成 0% |
293
323
  | `♨` | 保温计时中 |
294
324
  | `rebill $0.11` | 本会话因缓存未命中多付的钱(无价格的模型显示 token);为 0 不显示 |
295
- | `ctx 34%` | 上下文占用;≥ 70% 黄、≥ 90% 红,跨过时消息区提示「约剩 N 回合」 |
325
+ | `Ctx 34.0%` | 上下文占用;≥ 70% 黄、≥ 90% 红,跨过时消息区提示「约剩 N 回合」 |
296
326
 
297
327
  一次未命中重计费 ≥ 20k token 或 ≥ $0.10 时,消息区写一行原因。`/cache` 看缓存统计,`/cache fingerprint` 查前缀指纹(两次之间哈希变了,就是系统提示或工具表被改了)。
298
328
 
@@ -304,7 +334,7 @@ anthropic/<model-id> · think:medium · ↑412k ↓8.1k · cache 83% ♨ · $0.8
304
334
 
305
335
  ### 实测
306
336
 
307
- [缓存验收实验](docs/benchmarks/cache-2026-10-02.md)(2026-10-02,经一家测试中转站):
337
+ [缓存验收实验](https://github.com/Owlbay/armadra-agent/blob/main/docs/benchmarks/cache-2026-10-02.md)(2026-10-02,经一家测试中转站):
308
338
 
309
339
  | 场景 | 结果 |
310
340
  | --------------------------- | ---------------------------------------------------------------------------------------------- |
@@ -316,22 +346,79 @@ anthropic/<model-id> · think:medium · ↑412k ↓8.1k · cache 83% ♨ · $0.8
316
346
 
317
347
  ## 安全
318
348
 
319
- **权限模式**(`--permission-mode`、`/permission`、交互模式 `Shift+Tab` 循环):
349
+ **权限模式**(`--permission-mode`、配置 `permission.mode`、`/permission` 选择器、交互模式 `Shift+Tab` 循环):
320
350
 
321
- | 模式 | 读 | 写 | 执行(bash 等) |
322
- | ----------- | --- | ---- | --------------- |
323
- | `plan` | ✓ | 拒绝 | 拒绝 |
324
- | `default` | ✓ | 询问 | 询问 |
325
- | `auto-edit` | ✓ | ✓ | 询问 |
326
- | `full-auto` | ✓ | ✓ | ✓ |
351
+ | 模式 | 显示名 | 读 | 写 | 执行(bash 等) |
352
+ | ----------- | ------------------ | --- | ------------------------------------------------------ | ------------------------------ |
353
+ | `default` | Manual | ✓ | 询问 | 询问 |
354
+ | `auto-edit` | Accept edits | ✓ | ✓ | 询问 |
355
+ | `plan` | Plan | ✓ | 拒绝 | 拒绝 |
356
+ | `auto` | Auto | ✓ | ✓ ¹ | 安全的自动放行,有风险的才问 ² |
357
+ | `full-auto` | Bypass permissions | ✓ | ✓ | ✓ |
358
+ | `allowlist` | Allowlist only | ✓ | 只放行 allow 规则命中的,其余拒绝,从不询问(适合 CI) | 同左 |
327
359
 
328
- **判定顺序**:deny 规则(含 Hook deny)→ 危险命令 → 模式 → allow 规则把「询问」变「允许」。前两步之后的规则不能放宽它们。无人值守(`-p`、RPC 未接审批)时「询问」一律按拒绝。
360
+ ¹ 机密文件(`.env`、私钥、`.ssh/` 等)、`.git/` 与 `.ama/`、项目目录外的写入仍然询问。
361
+ ² 三层判定:规则层(危险命令、网络、删除类、受保护路径 → 询问)→ 静态判定(安全名单:`ls`、`cat`、`grep`、`git status/diff/log`、`npm test`、`tsc --noEmit`、`cargo test` 等 → 放行)→ 都没决定时问一次模型分类器(独立请求,不影响主会话缓存;`permission.autoModel` 可指定便宜模型)。详见 [docs/permissions.md](docs/permissions.md)。
362
+
363
+ **判定顺序**:deny 规则(含 Hook deny)→ 危险命令 →(auto 的规则层)→ 模式 / 静态判定 → allow 规则把「询问」变「允许」→(auto 的分类器)。前面的结论后面不能放宽。无人值守(`-p`、RPC 未接审批)时「询问」一律按拒绝。项目级配置只能收紧模式,且不能设 `auto` / `full-auto`。
329
364
 
330
365
  - **规则**:`bash(git push*)`、`write(src/**)`、`read(**)`、`canvas_*`;`--allow` / `--deny` 可重复。内置 deny:写 `.git/**`、读写 `.ssh/**`。
331
366
  - **危险命令**:`rm -rf /`、`sudo`、`git push --force`、`git reset --hard`、`git clean -f`、`curl … | sh`、`chmod -R 777`、`npm publish`、`shutdown` 等,即使有 allow 规则也要询问。识别会穿透 `sh -c '…'`、`eval`、`xargs`、`find -exec` 与 git 全局选项。
367
+ - **bash 沙箱**(缺省关闭):见下文「沙箱」。
332
368
  - **项目信任**:`.ama/hooks.json`、`.ama/skills/`、`.ama/prompts/` 会执行或注入项目里的内容,需要先信任目录(交互模式问一次,可记住;`--trust` / `--no-trust`;非交互缺省不信任)。`AGENTS.md` 与 `.ama/config.json` 不需要信任,因为后者只能收紧。
333
369
  - **执行前预览**:审批对话框除了输入摘要,还列出这一步会碰到什么——bash 里 `rm` / `mv` / `git clean` / `git reset --hard` / 重定向的目标路径是否存在、大小、目录里有多少文件;write 显示路径与行数,edit 显示每处修改的 −/+ 摘要。`y` 允许、`n` 拒绝、`a` 本会话同类不再问、`v` 看完整输入。
334
- - **Hook**:`hooks.json` 在 `PreToolUse`、`PostToolUse`、`UserPromptSubmit`、`Stop` 等 9 个事件运行 shell 命令,可以否决工具调用、改写输入、追加上下文、让运行再跑一轮。见 [docs/hooks.md](docs/hooks.md)。
370
+ - **Hook**:`hooks.json` 在 `PreToolUse`、`PostToolUse`、`UserPromptSubmit`、`Stop`、`PostCompact`、`PostRewind` 等 11 个事件运行 shell 命令,可以否决工具调用、改写输入、追加上下文、让运行再跑一轮。见 [docs/hooks.md](docs/hooks.md)。
371
+ - **审批来源**:子 Agent 与外部 Agent 发起的审批在对话框标题标出来源(`[task:explore]`、`[claude · 会话 abc12345]`、「首次运行外部 Agent」),见 [docs/permissions.md](docs/permissions.md)「审批对话框的来源标注」。
372
+
373
+ ## 沙箱
374
+
375
+ macOS 用 `sandbox-exec`,Linux 用 bubblewrap(退而 `unshare -r -n`,只隔离网络),启动时用目标配置跑一次最小探针确认真能用(嵌套沙箱、没有用户命名空间时降级),`ama doctor` 显示结果。Windows 没有操作系统沙箱。
376
+
377
+ - **codemode**:子进程经沙箱启动,内核拒绝网络与一切写入;有沙箱时 Node 22 / 24 与 Node ≥ 25 一样按只读类处理、`default` 预设缺省开启(见上文「Node 版本、codemode 与沙箱」)。
378
+ - **bash**(缺省关闭):`"sandbox": { "bash": "auto" }` 后 bash(含后台 bash)在沙箱里跑——只能写工作区、系统临时目录与 `sandbox.writable` 追加的目录,工作区的 `.ama/`、`.git/hooks`、`.git/config` 只读,读不到 `~/.ssh` 等凭据,缺省不能联网(`sandbox.network: "allow"` 放开)。`default` / `auto-edit` 下沙箱内的命令免审批(危险命令、deny 规则、Hook ask 照旧);被沙箱拒绝时模型可以请求 `sandbox: false` 不经沙箱重跑,这一步照常审批、无人值守拒绝。状态栏多一个 `沙箱` 标记。
379
+ - `sandbox.*` 只认用户级 / profile,项目级只能写收紧的 `network: "deny"`;`sandbox.enabled: "off"` 或 `AMA_SANDBOX=off` 整体关闭。
380
+
381
+ 细节、各平台策略与已知绕过见 [docs/sandbox.md](docs/sandbox.md)。
382
+
383
+ ## Plan
384
+
385
+ Plan 模式(`Shift+Tab`、`/permission plan`、`/plan <目标>`、`--permission-mode plan`)下模型只读调研——只放行读工具、只读命令(`ls`、`rg`、`git log / diff` 等)与只读子 Agent——最后输出 `<proposed_plan>` 计划块。ama 提取步骤、把计划落到 `<数据目录>/plans/`,弹出审批框:
386
+
387
+ - **批准并执行** / **批准,在新上下文执行**(新建会话,以计划全文开场),接着选执行模式(回到进入前的模式 / Accept edits / Auto);步骤变成待办,逐步推进(有 todo 工具时用 `todo update`,没有时模型每完成一步写一行 `[DONE:S1]`);
388
+ - **继续修改**(意见发给模型重写计划)/ **放弃并退出 Plan**;`e` 在外部编辑器里改计划,Esc 放弃但留在 Plan。
389
+
390
+ line 模式用 `/plan approve [模式|fresh]` / `/plan reject`;RPC 声明 `plans` 能力后由客户端审批;SDK 用 `createAgentSession({ plan: { onProposed } })`。**ama 不替人批准**:`-p` 缺省停在「计划待审批」并退出 9,用户级配置 `"plan": { "unattended": "approve" }` 才在无人值守时自动批准执行。`plan.model` 可让规划与执行用不同模型。见 [docs/plan.md](docs/plan.md)。
391
+
392
+ ## 子 Agent
393
+
394
+ `task` 工具把子任务交给一个全新上下文的子 Agent(同进程、独立会话文件,深度 1),结果作为工具结果回到父会话。`default` 预设下 `task` 只在 codemode 脚本里可用,直接暴露用 `--tools …,task` 或 `tools.default: ["+task"]`。
395
+
396
+ - 内置类型 `general`(缺省)、`explore`、`plan`(后两者强制只读、不弹审批);`~/.config/ama/agents/*.md`、`.ama/agents/*.md`(需信任)或 `--agent-dir` 定义自己的类型(工具白名单、模型、权限、轮数、worktree 隔离)。
397
+ - 同一回复里的多个 task 并行(`subagents.maxConcurrent`,缺省 4);`background: true` 立即返回 `taskId`,完成后父会话收到 `<task-notification>`;`task{taskId}` 续聊;`task_ctl` 列出 / 等待 / 停止 / 读输出;`isolation: "worktree"` 在独立 git worktree 里跑。
398
+ - 子会话工具表与父逐字节相同,首个请求复用父的缓存前缀。界面里 task 工具行折叠显示进度,`/tasks` 看输出或停止,`/agents` 列出可用类型。
399
+
400
+ 见 [docs/agents.md](docs/agents.md)「子 Agent」。
401
+
402
+ ## 外部 Agent
403
+
404
+ `task(agent="claude")`、`"codex"` 或 `"acp:<程序>"`(Gemini CLI、OpenCode、Kimi、ama 自己等任意 ACP Agent)用你在该 CLI 里的**现有登录**驱动外部编码 Agent,前台 / 后台 / 续聊 / `task_ctl` 与 ama 子 Agent 一致;结果按资料处理。
405
+
406
+ - **审批只交给人**:外部 Agent 要确认的操作走界面 / 宿主,auto 分类器与模型都不参与;无人值守一律拒绝。每个会话首次以某个外部 Agent 运行时确认一次(allow 规则 `task(claude)` 或 `full-auto` 放行)。
407
+ - 外部 Agent 的模式不比 ama 当前模式宽(plan / allowlist 下只读);子进程缺省剥离供应商 key、`*_BASE_URL`、`AMA_*`,不把订阅切成 API 计费;只在已信任目录里启动;有并发池、美元预算与看门狗。
408
+ - 嵌入宿主时 ama 不自己启动外部 CLI,只用宿主经 `HostApi.runners` 注入的 runner。
409
+ - **ama 作为 ACP Agent**:`ama --mode acp` 供 Zed、JetBrains、Armadra 的 ACP 节点驱动;`@armadra/agent/acp` 导出客户端、驱动与假 Agent。
410
+
411
+ 见 [docs/agents.md](docs/agents.md)「外部 Agent」与 [docs/acp.md](docs/acp.md)。
412
+
413
+ ## 回滚
414
+
415
+ 每条开启新回合的用户消息都是回滚点:edit / write 第一次写文件前备份,每个新回合重拍已跟踪文件(`checkpoints.mode: "shadow-git"` 时整个工作目录进影子仓库,bash 的改动也能回滚)。
416
+
417
+ - `/rewind` 或空闲时双击 Esc 打开列表,确认面板给出:恢复代码和对话 / 恢复对话 / 恢复代码 / 从这里摘要 / 摘要到这里,每项带预览;回合外被手动改过的文件按冲突列出、缺省跳过,可选择覆盖;git HEAD 变了只提示命令,不动 git。
418
+ - 运行中 Esc 中断且本回合还没有输出时自动撤回这条消息并回填(`ui.restoreOnCancel`)。
419
+ - line 模式 `/rewind <n> [both|conversation|code] [overwrite]`;RPC `get_rewind_points` / `rewind`;SDK `session.rewind()`;Hook `PostRewind`。
420
+
421
+ 见 [docs/tui.md](docs/tui.md)「回滚」、[docs/rewind-plan.md](docs/rewind-plan.md) 与 [docs/sessions.md](docs/sessions.md)。
335
422
 
336
423
  ## 界面与入口
337
424
 
@@ -339,19 +426,22 @@ anthropic/<model-id> · think:medium · ↑412k ↓8.1k · cache 83% ♨ · $0.8
339
426
 
340
427
  直接运行 `ama`(stdin / stdout 都是 TTY)进入交互模式。界面只用主屏,对话历史留在终端回滚里,tmux `capture-pane` 能读到完整对话。
341
428
 
342
- | 按键 | 作用 |
343
- | -------------------- | ------------------------------------------ |
344
- | Enter | 发送;运行中插话(steer) |
345
- | Alt+Enter | 运行中排到本轮之后(followUp) |
346
- | Shift+Enter / Ctrl+J | 换行 |
347
- | Esc | 中断当前运行 |
348
- | Shift+Tab | 循环权限模式 |
349
- | Ctrl+O | 展开 / 折叠工具输出 |
350
- | Ctrl+L / Ctrl+T | 选择模型 / 思考级别 |
351
- | Ctrl+C | 清空输入;输入为空时 1.5 秒内再按一次退出 |
352
- | Tab | 补全:`/` 命令、模板与 Skill,`@` 文件路径 |
353
-
354
- 常用命令:`/model`、`/thinking`、`/permission`、`/tools`、`/compact`、`/tree`(回到某条消息之前重新分支)、`/fork`、`/resume`、`/new`、`/session`、`/cache`、`/hooks`、`/skill:<名字>`、`/help`。输入里的 `@图片路径`(或粘贴 / 拖入的图片路径)作为图片附件发给模型;`/model` 按「供应商 · 渠道」分组,标出上下文与 `img`。按键可在 `~/.config/ama/keybindings.json` 覆盖。见 [docs/tui.md](docs/tui.md)。
429
+ | 按键 | 作用 |
430
+ | -------------------- | -------------------------------------------------------------- |
431
+ | Enter | 发送;运行中插话(steer) |
432
+ | Alt+Enter | 运行中排到本轮之后(followUp) |
433
+ | Shift+Enter / Ctrl+J | 换行 |
434
+ | Esc | 中断当前运行 |
435
+ | Esc Esc(空闲) | 输入框为空:打开回滚列表(同 `/rewind`);有字:清空并存进历史 |
436
+ | Shift+Tab | 循环权限模式 |
437
+ | Ctrl+O | 展开 / 折叠工具输出 |
438
+ | Ctrl+L / Ctrl+T | 选择模型 / 思考级别 |
439
+ | Ctrl+G | 底部信息行 两行 ↔ 一行(同 `/statusline`) |
440
+ | Ctrl+V | 粘贴剪贴板里的图片,插入 `@<路径>`(同 `/paste`) |
441
+ | Ctrl+C | 清空输入;输入为空时 1.5 秒内再按一次退出 |
442
+ | Tab | 补全:`/` 命令、模板与 Skill,`@` 文件路径 |
443
+
444
+ 常用命令:`/model`、`/thinking`、`/permission`、`/tools`、`/compact`、`/tree`(回到某条消息之前重新分支)、`/fork`、`/resume`、`/new`、`/session`、`/cache`、`/hooks`、`/skill:<名字>`、`/help`;第五波新增 `/plan`(计划面板与审批,`/plan <目标>` 进入 Plan)、`/tasks`(子 Agent 任务)、`/agents`(可用类型与外部 Agent)、`/paste`(剪贴板图片)、`/rewind`(回滚)、`/statusline [full|compact]`。输入里的 `@图片路径`(或粘贴 / 拖入的图片路径)作为图片附件发给模型;`/model` 按「供应商 · 渠道」分组,标出上下文与 `img`。按键可在 `~/.config/ama/keybindings.json` 覆盖。见 [docs/tui.md](docs/tui.md)。
355
445
 
356
446
  `--no-tui`(或 stdin / stdout 不是 TTY、`TERM=dumb`)进入行式界面:readline + 括号粘贴,命令相同。
357
447
 
@@ -363,10 +453,56 @@ anthropic/<model-id> · think:medium · ↑412k ↓8.1k · cache 83% ♨ · $0.8
363
453
  | `json` | 一个 `result` 对象:会话 id、模型、`stopReason`、`text`、用量、费用、缓存统计 |
364
454
  | `stream-json` | 每行一个事件,与 RPC 事件同形状 |
365
455
 
366
- `--image <文件>` 可重复,随提示发送图片(PNG / JPEG / GIF / WebP,单张 ≤ 5 MB);提示里的 `@图片路径` 同样作为附件。当前
456
+ **stdin**:管道内容拼在提示后面(`git diff | ama -p "审阅"`);没有提示参数时管道内容就是提示。有提示参数时只等管道的
457
+ 首字节 2 秒(`AMA_STDIN_WAIT_MS` 可调,0 = 不等):一个字节都没收到就忽略 stdin、继续运行,并在 stderr 提示一行——父进程
458
+ 留着不关的管道不会让 `-p` 挂起;收到首字节后读到 EOF。上游命令要先跑很久才输出时,在末尾加 `-` 一直等到 EOF
459
+ (`npm test 2>&1 | ama -p "找出失败原因" -`);`--no-stdin` 完全不读。`< 文件` 重定向总会读取。
460
+
461
+ `--image <文件>` 可重复,随提示发送图片(PNG / JPEG / GIF / WebP,单张上限按端点分档、base64 后计:官方 Anthropic 10 MB、Gemini / OpenAI 20 MB、中转 5 MB,超限时尝试用 sips / ImageMagick 缩放);提示里的 `@图片路径` 同样作为附件。当前
367
462
  模型不收图片时直接退出 2,不发请求。
368
463
 
369
- 退出码:0 正常 · 1 运行期错误 · 2 用法错误 · 3 配置错误 · 4 无可用模型或 key · 5 会话错误 · 6 宿主 / Hook 启动失败 · 78 宿主 API 版本不匹配 · 130 / 143 信号。
464
+ `--max-turns N` 限制一次运行最多 N 轮(一次模型请求加它的工具执行算一轮),`--max-cost USD` 限制一次运行的美元用量(配置
465
+ `limits.maxTurns / maxCostUsd` 同义),到上限时提前结束(事件 `limit_reached`),**退出码 8**(0.4.x 的 `--max-turns` 是 1),
466
+ `json` 结果带 `limitReached{kind, value, limit}`(轮数到限另有 `maxTurnsReached: true`)。Plan 模式下计划待审批时退出 9(见上文「Plan」)。
467
+
468
+ `--system-prompt <文本|@文件>` 补充系统提示(任何模式都可用):缺省作为最后一条规则追加,preamble 与工具表这段最长的
469
+ 缓存前缀不变;`--system-prompt-mode replace` 改为替换开头的角色说明,工具表、规则与 AGENTS.md 仍然保留。
470
+
471
+ `--no-session` 让会话只留在内存里、不写会话文件(适合 CI 与一次性调用;之后无法 `--resume`),交互模式里 `/new` 切出的
472
+ 新会话同样不落盘。
473
+
474
+ **无人值守**:`-p` 没有人审批,缺省权限模式下需要询问的调用(写文件、跑命令)一律拒绝。被拒时 stderr 一行汇总被拒的
475
+ 工具与原因,`json` 结果带 `deniedTools`,`stream-json` 的 `tool_execution_end` 带 `denied: true`,退出码 7。需要放行时用
476
+ `--permission-mode auto-edit`(放行写入)/ `auto`(ama 判断每一步),或 `--allow "bash(npm test*)"` 按规则放行。
477
+
478
+ | 退出码 | 含义 |
479
+ | ------ | ------------------------------------------------------------ |
480
+ | 0 | 正常 |
481
+ | 1 | 运行期错误(模型最终失败等) |
482
+ | 2 | 用法错误;当前模型不收图片 |
483
+ | 3 | 配置 / profile / 路径错误 |
484
+ | 4 | 无可用模型或 key |
485
+ | 5 | 会话不存在 / 损坏 |
486
+ | 6 | 宿主 / Hook 启动失败 |
487
+ | 7 | `-p` 有工具调用被拒(无人审批、deny 规则、plan 等) |
488
+ | 8 | `-p` 到达预算上限(`--max-turns` / `--max-cost` / `limits`) |
489
+ | 9 | `-p` 产出的计划已落盘、待审批(`plan.unattended: stop`) |
490
+ | 78 | 宿主 API 版本不匹配 |
491
+ | 130 | SIGINT;143 = SIGTERM |
492
+
493
+ ### 会话统计、检索与复用
494
+
495
+ 会话是 `<数据目录>/sessions` 下的 JSONL,下面这些命令只读不写(缺省看当前目录的会话,`--all` 看全部):
496
+
497
+ ```sh
498
+ ama stats --since 7d --by model # 请求、token、缓存命中率、费用、工具调用 Top N(--json 可用)
499
+ ama sessions search "parser" --role user # 跨会话全文检索,/正则/ 也行
500
+ ama sessions show 3f9a1c2e # 末尾列出用户消息编号
501
+ ama -p --from 3f9a1c2e#2 --model packy/kimi-k2.5 # 用那条消息(含图片)换个模型再问
502
+ ama sessions export 3f9a1c2e --format md --output s.md # md / json / jsonl,导出前脱敏
503
+ ```
504
+
505
+ 统计口径(命中率只算报告缓存的端点、费用只加有价请求等)与导出格式见 [docs/sessions.md](docs/sessions.md)。
370
506
 
371
507
  ### RPC
372
508
 
@@ -376,7 +512,9 @@ anthropic/<model-id> · think:medium · ↑412k ↓8.1k · cache 83% ♨ · $0.8
376
512
  printf '{"id":"1","type":"prompt","message":"hi"}\n' | ama --mode rpc --model fake/echo
377
513
  ```
378
514
 
379
- 协议见 [docs/rpc.md](docs/rpc.md),类型从 `@armadra/agent/rpc` 导入。
515
+ `hello.capabilities` 列出服务端能力(`approvals`、`images`、`hooks`、`plans`),客户端用 `set_client_capabilities` 声明要接管的审批与计划审批。第五波新增计划(`plan_response` / `get_plan` / `get_todos`)、任务(`get_tasks` / `get_agents`)、回滚(`get_rewind_points` / `rewind` / `summarize_*`)命令与 `subagent_*`、`plan_*`、`limit_reached`、`telemetry_tick` 等事件。协议见 [docs/rpc.md](docs/rpc.md),类型从 `@armadra/agent/rpc` 导入。
516
+
517
+ `ama --mode acp` 说 ACP(JSON-RPC over NDJSON),见 [docs/acp.md](docs/acp.md)。
380
518
 
381
519
  ### SDK
382
520
 
@@ -406,10 +544,12 @@ await session.dispose();
406
544
  ```
407
545
 
408
546
  - `createAgentSession` 不读文件系统配置:内存会话、指定工具、回调审批,适合嵌在别的程序里。
547
+ - 回滚:`session.rewindPoints()` 列出活动路径上开启新回合的用户消息;`session.rewind({ entryId, mode: "both" | "conversation" | "code", dryRun?, onConflict? })` 回到该消息之前(返回原消息草稿与代码恢复结果,内存会话只能仅对话);`session.summarizeFrom(entryId, instructions?)` / `session.summarizeUpTo(entryId, instructions?)` 对应「从这里摘要」「摘要到这里」。设计见 [docs/rewind-plan.md](docs/rewind-plan.md)。
548
+ - 计划:`createAgentSession({ plan: { onProposed } })` 在计划提出后回调审批(返回 `{ decision: "approve" | "approve_fresh" | "revise" | "reject", mode?, feedback? }`),或之后用 `session.plan.respond()`;`session.plan.current()` / `todos()` 读当前计划与待办。类型 `SessionPlanOptions`、`PlanDecision` 等从包入口导出,见 [docs/plan.md](docs/plan.md)「接口」。
409
549
  - `createRuntime({ argv })` 走与 `ama` 命令行相同的启动序列(读配置、AGENTS.md、Skill、hooks.json、auth.json)。
410
- - 子路径:`@armadra/agent/host`(宿主适配器类型)、`@armadra/agent/rpc`(RPC 类型)、`@armadra/agent/tui`(终端组件库)、`@armadra/agent/bundle`(单文件 `ama.cjs`,`require.resolve` 可取路径交给 `node` 或 `ELECTRON_RUN_AS_NODE=1` 启动)。
550
+ - 子路径:`@armadra/agent/host`(宿主适配器类型)、`@armadra/agent/rpc`(RPC 类型)、`@armadra/agent/tui`(终端组件库)、`@armadra/agent/acp`(ACP 类型、客户端、驱动与假 Agent)、`@armadra/agent/bundle`(单文件 `ama.cjs`,`require.resolve` 可取路径交给 `node` 或 `ELECTRON_RUN_AS_NODE=1` 启动)。
411
551
 
412
- 完整示例见 [examples/sdk-demo.ts](examples/sdk-demo.ts)(自定义工具、流式输出、用量统计)。
552
+ 完整示例见 [examples/sdk-demo.ts](https://github.com/Owlbay/armadra-agent/blob/main/examples/sdk-demo.ts)(自定义工具、流式输出、用量统计)。
413
553
 
414
554
  ## 嵌入 Armadra
415
555
 
@@ -422,19 +562,47 @@ Armadra 以 `ama --profile <path>` 启动 ama。profile 是一个 JSON 文件,
422
562
 
423
563
  ## 文档
424
564
 
425
- | 文档 | 内容 |
426
- | ---------------------------------------------------------------------------------------------------- | ------------------------------------------------------- |
427
- | [docs/providers.md](docs/providers.md) | 内置供应商、API Key、自定义供应商与中转站、compat、缓存 |
428
- | [docs/tui.md](docs/tui.md) | 终端界面:布局、按键、命令、审批预览、缓存显示、组件库 |
429
- | [docs/codemode.md](docs/codemode.md) | codemode 脚本、沙箱与权限 |
430
- | [docs/hooks.md](docs/hooks.md) | 命令式 Hook(hooks.json) |
431
- | [docs/host-api.md](docs/host-api.md) | 宿主适配器 API |
432
- | [docs/rpc.md](docs/rpc.md) | RPC 协议(stdio JSONL) |
433
- | [docs/session-format.md](docs/session-format.md) | 会话文件格式 |
434
- | [docs/extensions.md](docs/extensions.md) | 本地扩展(设计草案,未实现) |
435
- | [docs/design.md](docs/design.md) | 总体设计与决策记录 |
436
- | [docs/benchmarks/](docs/benchmarks/) | 三预设基准与缓存验收实验(报告与原始数据) |
437
- | [docs/implementation-plan.md](docs/implementation-plan.md)、[docs/wave3-plan.md](docs/wave3-plan.md) | 实施计划(追溯用) |
565
+ | 文档 | 内容 |
566
+ | ----------------------------------------------------- | --------------------------------------------------------------------------------------- |
567
+ | [docs/providers.md](docs/providers.md) | 内置供应商与渠道、API Key、自定义供应商与中转站、模型元数据快照、图像输入、compat、缓存 |
568
+ | [docs/tui.md](docs/tui.md) | 终端界面:布局、状态栏、按键、命令、回滚、审批、Plan 审批、子 Agent、剪贴板图片、组件库 |
569
+ | [docs/permissions.md](docs/permissions.md) | 权限模式、plan 只读命令、判定顺序、沙箱内免审批、auto 三层判定、审批来源标注 |
570
+ | [docs/plan.md](docs/plan.md) | Plan 模式:流程、计划格式、审批、分模型、配置与持久化 |
571
+ | [docs/agents.md](docs/agents.md) | 子 Agent(类型、定义文件、后台、续聊、worktree)与外部 Agent(驱动、权限、环境、预算) |
572
+ | [docs/acp.md](docs/acp.md) | ACP:`ama --mode acp` 与 ama 作为 ACP 客户端 |
573
+ | [docs/sandbox.md](docs/sandbox.md) | 操作系统沙箱:codemode 与 bash、各平台实现、配置与已知绕过 |
574
+ | [docs/codemode.md](docs/codemode.md) | codemode 脚本、沙箱与权限 |
575
+ | [docs/hooks.md](docs/hooks.md) | 命令式 Hook(hooks.json) |
576
+ | [docs/host-api.md](docs/host-api.md) | 宿主适配器 API |
577
+ | [docs/rpc.md](docs/rpc.md) | RPC 协议(stdio JSONL) |
578
+ | [docs/session-format.md](docs/session-format.md) | 会话文件格式 |
579
+ | [docs/sessions.md](docs/sessions.md) | 会话统计、检索、`--from` 复用、导出、检查点与影子 git |
580
+ | [docs/rewind-plan.md](docs/rewind-plan.md) | 检查点与回滚的设计 |
581
+ | [docs/tui-design.md](docs/tui-design.md) | 终端界面视觉规格与逐屏样稿 |
582
+ | [docs/design.md][design] | 总体设计与决策记录(第五波增补指引在 §0 之后) |
583
+ | [docs/extensions.md][extensions] | 本地扩展(设计草案,未实现) |
584
+ | [docs/benchmarks/][benchmarks] | 预设基准、D20 todo 复测与缓存验收实验(报告与原始数据) |
585
+ | [docs/wave5-plan.md][wave5] | 第五波设计:状态行、模型元数据、渠道、图像、外部 Agent、Plan、子 Agent、压缩与 harness |
586
+ | [docs/implementation-plan.md][impl]、[wave3-plan][w3] | 早期实施计划(追溯用) |
587
+ | [docs/research/][research] | 第五波调研报告(追溯用) |
588
+
589
+ npm 包里带上表前十五份(用户文档);其余是设计与追溯材料,链接指向 GitHub。
590
+
591
+ [design]: https://github.com/Owlbay/armadra-agent/blob/main/docs/design.md
592
+ [extensions]: https://github.com/Owlbay/armadra-agent/blob/main/docs/extensions.md
593
+ [benchmarks]: https://github.com/Owlbay/armadra-agent/tree/main/docs/benchmarks
594
+ [wave5]: https://github.com/Owlbay/armadra-agent/blob/main/docs/wave5-plan.md
595
+ [impl]: https://github.com/Owlbay/armadra-agent/blob/main/docs/implementation-plan.md
596
+ [w3]: https://github.com/Owlbay/armadra-agent/blob/main/docs/wave3-plan.md
597
+ [research]: https://github.com/Owlbay/armadra-agent/tree/main/docs/research
598
+
599
+ ## 已知限制
600
+
601
+ - **Linux 沙箱未在真机上验证**:bubblewrap 的策略只经单元测试与 Ubuntu CI 验证,没有在 Linux 桌面 / 服务器真机上跑过;没有 bwrap 时退到 `unshare -r -n`(只隔离网络,不能用于 bash 沙箱),都没有则按无沙箱处理(codemode 回到执行类、每次审批)。
602
+ - **外部 Agent 的真实 CLI 测试只在本地跑**:CI 只跑录制回放与 ama 驱动 ama;接 `claude` / `codex` 的端到端需要本机已登录,`AMA_E2E_AGENTS=1` 时运行(会用你的订阅额度),见 [docs/agents.md](docs/agents.md)「本地验证真实 CLI」。
603
+ - **DeepSeek、智谱、Kimi 缺省仍走 Chat**:它们的 Messages 渠道(`@messages`)只在中转上测过,等官方直连过了实测门(`scripts/channel-probe.mjs`)再切缺省。
604
+ - **models.dev 刷新 PR 不自动触发 CI**:仓库 secret `MODELS_DEV_PR_TOKEN` 没配时,每周的 workflow 用缺省 token 开 PR(先在 workflow 里自跑 `pnpm run ci` 并把结果写进描述)。
605
+ - 子 Agent 深度 1,不读 `.claude/agents`,不支持继承父对话的 fork 模式;Windows 没有操作系统沙箱。
438
606
 
439
607
  ## 开发
440
608
 
@@ -443,7 +611,7 @@ Armadra 以 `ama --profile <path>` 启动 ama。profile 是一个 JSON 文件,
443
611
  ```sh
444
612
  pnpm install
445
613
  pnpm run ci # typecheck、fmt:check、check:deps、release:check、test、build,再跑 bundle --version
446
- AMA_E2E=1 pnpm test:e2e # bundle 级端到端:print / rpc / codemode / cache / host(fake 供应商,不花钱)
614
+ AMA_E2E=1 pnpm test:e2e # bundle 级端到端:print / rpc / acp / plan / 子 Agent / 回滚 / codemode / cache / host(fake 供应商,不花钱)
447
615
  ```
448
616
 
449
617
  pnpm 10 起 `pnpm ci` 是内置的「清理后安装」,跑检查要写 `pnpm run ci`。常用单项:`pnpm test`、`pnpm typecheck`、`pnpm fmt`、`pnpm build`。测试一律用 fake 供应商:`AMA_FAKE_SCRIPT=<脚本.json>` 让它按脚本产出文本、工具调用、429、断流等,示例在 `test/fixtures/scripts/`。
@@ -452,7 +620,7 @@ pnpm 10 起 `pnpm ci` 是内置的「清理后安装」,跑检查要写 `pnpm
452
620
 
453
621
  | 脚本 | 用途 |
454
622
  | --------------------------------------------------------- | ------------------------------------- |
455
- | `node scripts/bench-presets.mjs`(`pnpm bench:presets`) | 三预设基准 |
623
+ | `node scripts/bench-presets.mjs`(`pnpm bench:presets`) | 预设基准(`--tasks long` 多步长任务) |
456
624
  | `node scripts/cache-experiment.mjs`(`pnpm bench:cache`) | 缓存验收实验 E1–E5 |
457
625
  | `node scripts/record-sse.mjs` | 录制各协议的 SSE 样本作为测试 fixture |
458
626
 
@@ -460,7 +628,7 @@ pnpm 10 起 `pnpm ci` 是内置的「清理后安装」,跑检查要写 `pnpm
460
628
 
461
629
  **约束**:运行时依赖必须为零,`src/` 只允许 `node:` 内置模块与相对路径(`pnpm check:deps` 守住)。`src/` 按层分目录(`ai` 模型接入、`agent` 循环、`session` 会话树、`tools`、`codemode`、`permissions`、`hooks`、`host` 宿主契约、`tui` 组件库、`modes` 各入口、`cli` 启动),各目录的 `types.ts` 是模块之间的契约。
462
630
 
463
- **发布**:改 `package.json` 版本与 [CHANGELOG.md](CHANGELOG.md),合入 main 后打 `v<版本>` tag。CI 全绿后 release job 生成 GitHub Release(`ama.cjs`、`ama-sandbox.cjs`、`package.tgz`、`SHA256SUMS`),再以 provenance 发布到 npm(需要仓库 secret `NPM_TOKEN`,没有时跳过)。`pnpm release:check` 检查 tag 与版本一致,协议常量变化要求破坏性版本升级。
631
+ **发布**:改 `package.json` 版本与 [CHANGELOG.md](CHANGELOG.md),合入 main 后打 `v<版本>` tag。CI 全绿后 release job 生成 GitHub Release(`ama.cjs`、`ama-sandbox.cjs`、`package.tgz`、`SHA256SUMS`),再以 provenance 发布到 npm:优先用 OIDC 可信发布(trusted publishing,npm ≥ 11.5.1,job 内自动升级),在 npmjs.com 的 `@armadra/agent` 包设置 → Trusted Publisher 添加 GitHub Actions(组织 `Owlbay`、仓库 `armadra-agent`、工作流 `ci.yml`、环境留空)即可,不需要长期 token;仓库 secret `NPM_TOKEN` 保留为回退,两者都没有时 job 失败并提示。`pnpm release:check` 检查 tag 与版本一致,协议常量变化要求破坏性版本升级。
464
632
 
465
633
  ## 更新记录
466
634