@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
@@ -1,7 +1,9 @@
1
1
  /**
2
2
  * 配置目录初始化(docs/providers.md「配置目录」):`ama init` 与 CLI 首次运行的自动初始化。
3
3
  *
4
- * - 目录 0700;`config.json` 只在不存在时写最小内容(`--force` 时先备份再重写);
4
+ * - 目录 0700;`config.json` 只在不存在时写最小内容(`--force` 时先备份再重写):只有 `$schema`、
5
+ * `version` 与空 `providers`,不写死任何缺省值——缺省值以后调整(例如 codemode 跟随预设)对老用户
6
+ * 同样生效,`config show` 的来源也显示 default 而不是 user;
5
7
  * - `config.schema.json` 不是用户文件,每次 init 都按当前版本重写(内容相同则不动);
6
8
  * - 不创建 auth.json(只有 `ama auth set` / `ama providers add` 才写,0600)。
7
9
  * - 自动初始化只在 CLI 里、配置目录不存在时触发,`AMA_NO_INIT=1` 关闭;SDK 与测试不走这里。
@@ -12,14 +14,11 @@ import { CONFIG_SCHEMA_FILE, configSchemaText } from "./json-schema.js";
12
14
  import { AUTH_FILE, CONFIG_FILE } from "./paths.js";
13
15
  import { CONFIG_FILE_VERSION } from "./types.js";
14
16
  export const NO_INIT_ENV = "AMA_NO_INIT";
15
- /** 最小 config.json:常用键的缺省值(与 DEFAULT_CONFIG 相同,写出来方便直接改)。 */
17
+ /** 最小 config.json:只有 `$schema`、`version` 与空 `providers`(缺省值见 `ama config show`)。 */
16
18
  export function minimalConfig() {
17
19
  return {
18
20
  $schema: `./${CONFIG_SCHEMA_FILE}`,
19
21
  version: CONFIG_FILE_VERSION,
20
- thinkingLevel: "medium",
21
- permission: { mode: "default" },
22
- tools: { preset: "default" },
23
22
  providers: {},
24
23
  };
25
24
  }
@@ -84,6 +83,14 @@ const STATUS_TEXT = {
84
83
  unchanged: "已是当前版本",
85
84
  overwritten: "已重写(原文件备份为 .bak)",
86
85
  };
86
+ /** init 之后的下一步(配 key / 接中转站 / 自检)。 */
87
+ export const INIT_NEXT_STEPS = [
88
+ "下一步:",
89
+ " ama auth set anthropic 保存内置供应商的 key(或设置 ANTHROPIC_API_KEY 等环境变量)",
90
+ " ama providers add <id> --base-url <url> 接入中转站或自建服务",
91
+ " ama doctor 检查配置、key 与运行环境",
92
+ " ama config show 查看生效配置与每项来源",
93
+ ];
87
94
  export function describeInit(result) {
88
95
  const lines = [`${result.dir}${result.dirCreated ? " 已创建(0700)" : " 已存在"}`];
89
96
  for (const file of result.files)
@@ -3,6 +3,7 @@
3
3
  * (docs/providers.md「配置目录」)。规则与 schema.ts 的 `validateConfig` 一一对应:未知字段在那里是
4
4
  * warning、这里是 `additionalProperties: false`;渠道引用(模型 `channels` 指向已定义的渠道)这类跨字段
5
5
  * 规则 JSON Schema 表达不了,只在 `validateConfig` 里查。一致性由 json-schema.test.ts 的正反例守住。
6
+ * 顶层与各段的键(供应商内部除外)的 description / default 来自 key-docs.ts(`annotate`)。
6
7
  */
7
8
  type Schema = Record<string, unknown>;
8
9
  export declare const CONFIG_SCHEMA_FILE = "config.schema.json";
@@ -3,11 +3,15 @@
3
3
  * (docs/providers.md「配置目录」)。规则与 schema.ts 的 `validateConfig` 一一对应:未知字段在那里是
4
4
  * warning、这里是 `additionalProperties: false`;渠道引用(模型 `channels` 指向已定义的渠道)这类跨字段
5
5
  * 规则 JSON Schema 表达不了,只在 `validateConfig` 里查。一致性由 json-schema.test.ts 的正反例守住。
6
+ * 顶层与各段的键(供应商内部除外)的 description / default 来自 key-docs.ts(`annotate`)。
6
7
  */
7
8
  import { WARMING_MODES } from "../ai/cache/types.js";
8
9
  import { PERMISSION_MODES_STRICT_FIRST } from "../permissions/types.js";
10
+ import { CONFIG_KEY_DOCS, DYNAMIC_DEFAULTS, defaultFor } from "./key-docs.js";
9
11
  import { HOOK_TIMEOUT_MAX_MS, THINKING_LEVELS } from "./schema.js";
10
- import { CACHE_RETENTIONS, CHANNEL_NAME_PATTERN, CODEMODE_MODES, TOOLS_PRESETS_STRICT_FIRST, } from "./types.js";
12
+ import { CACHE_RETENTIONS, CHANNEL_NAME_PATTERN, CHECKPOINT_MODES, SANDBOX_ENABLED_MODES, SANDBOX_NETWORK_MODES, CODEMODE_MODES, IMAGE_RESIZE_MODES, PLAN_BASH_MODES_STRICT_FIRST, PLAN_UNATTENDED_MODES, STATUS_LINE_MODES, TOOLS_PRESET_INPUTS, } from "./types.js";
13
+ import { AGENT_ID_PATTERN } from "./schema-w5.js";
14
+ import { AGENTS_RESERVED_KEYS } from "./types-w5.js";
11
15
  export const CONFIG_SCHEMA_FILE = "config.schema.json";
12
16
  export const CONFIG_SCHEMA_ID = "https://github.com/Owlbay/armadra-agent/config.schema.json";
13
17
  const KNOWN_APIS = [
@@ -119,8 +123,69 @@ const provider = object({
119
123
  models: { type: "array", items: model("自定义模型(同 id 整条替换)") },
120
124
  modelOverrides: { type: "array", items: model("只改已有模型的元数据") },
121
125
  });
126
+ // [W5-C0] 第五波的段(规则同 schema-w5.ts)
127
+ const agentEntry = object({
128
+ maxConcurrent: num(1, 64),
129
+ maxMode: oneOf(PERMISSION_MODES_STRICT_FIRST),
130
+ model: str(),
131
+ env: object({ passthrough: strings }),
132
+ });
133
+ function w5Sections() {
134
+ return {
135
+ images: object({ resize: oneOf(IMAGE_RESIZE_MODES) }),
136
+ plan: object({
137
+ bash: oneOf(PLAN_BASH_MODES_STRICT_FIRST),
138
+ directory: str(),
139
+ unattended: oneOf(PLAN_UNATTENDED_MODES),
140
+ model: str(),
141
+ thinkingLevel: oneOf(THINKING_LEVELS),
142
+ }),
143
+ agents: object({ maxConcurrent: num(1, 64), sessionBudgetUsd: num(0), dirs: strings }, {
144
+ additionalProperties: agentEntry,
145
+ propertyNames: {
146
+ pattern: `^(${AGENTS_RESERVED_KEYS.join("|")}|${AGENT_ID_PATTERN.source.slice(1, -1)})$`,
147
+ },
148
+ }),
149
+ subagents: object({ maxConcurrent: num(1, 64), maxPending: num(0, 1024), defaultModel: str() }),
150
+ models: object({ aliases: object({ fast: str(), strong: str() }) }),
151
+ fallbackModel: str(),
152
+ limits: object({ maxTurns: num(1), maxCostUsd: num(0) }),
153
+ reminders: object({
154
+ todo: bool(),
155
+ fileChanges: bool(),
156
+ contextPressure: bool(),
157
+ budget: bool(),
158
+ }),
159
+ todo: object({ reminder: num(0) }),
160
+ };
161
+ }
162
+ /** 给顶层与各段的键写上 description 与 default(key-docs.ts);供应商内部不动。 */
163
+ function annotate(properties, prefix = "") {
164
+ for (const [key, shared] of Object.entries(properties)) {
165
+ const path = prefix === "" ? key : `${prefix}.${key}`;
166
+ // 片段(strings、bool() 等)在多处复用:先浅拷贝再写说明
167
+ const schema = { ...shared };
168
+ properties[key] = schema;
169
+ const description = CONFIG_KEY_DOCS[path];
170
+ if (description !== undefined)
171
+ schema["description"] = description;
172
+ const nested = schema["properties"];
173
+ if (nested !== undefined && path !== "providers") {
174
+ annotate(nested, path);
175
+ continue;
176
+ }
177
+ const value = defaultFor(path);
178
+ if (value !== undefined && DYNAMIC_DEFAULTS[path] === undefined)
179
+ schema["default"] = value;
180
+ }
181
+ }
122
182
  /** 生成 config.json 的 JSON Schema。 */
123
183
  export function buildConfigJsonSchema() {
184
+ const schema = buildBaseSchema();
185
+ annotate(schema["properties"]);
186
+ return schema;
187
+ }
188
+ function buildBaseSchema() {
124
189
  return {
125
190
  $schema: "http://json-schema.org/draft-07/schema#",
126
191
  $id: CONFIG_SCHEMA_ID,
@@ -136,8 +201,19 @@ export function buildConfigJsonSchema() {
136
201
  allow: strings,
137
202
  deny: strings,
138
203
  builtinDeny: { anyOf: [{ type: "boolean" }, strings] },
204
+ autoModel: str("auto 模式分类器的模型 provider/model;缺省用当前会话模型"),
205
+ autoSafeCommands: strings,
206
+ }),
207
+ compaction: object({
208
+ enabled: bool(),
209
+ reserveTokens: num(0),
210
+ keepRecentTokens: num(0),
211
+ prune: object({
212
+ keepResults: num(0),
213
+ clearAtLeast: { anyOf: [{ const: "auto" }, { type: "number", minimum: 0 }] },
214
+ }),
215
+ pruneExclude: strings,
139
216
  }),
140
- compaction: object({ enabled: bool(), reserveTokens: num(0), keepRecentTokens: num(0) }),
141
217
  retry: object({
142
218
  enabled: bool(),
143
219
  maxRetries: num(0, 100),
@@ -145,7 +221,7 @@ export function buildConfigJsonSchema() {
145
221
  maxDelayMs: num(0),
146
222
  }),
147
223
  tools: object({
148
- preset: oneOf(TOOLS_PRESETS_STRICT_FIRST),
224
+ preset: oneOf(TOOLS_PRESET_INPUTS),
149
225
  default: strings,
150
226
  maxToolResultChars: num(1),
151
227
  bashTimeoutMs: num(1),
@@ -158,11 +234,16 @@ export function buildConfigJsonSchema() {
158
234
  }),
159
235
  hooks: object({ timeoutMs: num(1, HOOK_TIMEOUT_MAX_MS) }),
160
236
  ui: object({
161
- theme: oneOf(["dark", "light"]),
237
+ theme: oneOf(["dark", "light", "auto"]),
162
238
  markdown: bool(),
163
239
  showThinking: oneOf(["full", "collapsed", "hidden"]),
164
240
  tuiMode: oneOf(["regular"]),
165
241
  quietStartup: oneOf(["normal", "header", "silent"]),
242
+ ascii: bool(),
243
+ compact: bool(),
244
+ animation: bool(),
245
+ restoreOnCancel: bool(),
246
+ statusLine: oneOf(STATUS_LINE_MODES),
166
247
  }),
167
248
  skills: object({ dirs: strings }),
168
249
  cache: object({
@@ -172,6 +253,19 @@ export function buildConfigJsonSchema() {
172
253
  missNotices: bool(),
173
254
  warmSubagents: bool(),
174
255
  }),
256
+ request: object({ idleTimeoutMs: num(0) }),
257
+ checkpoints: object({
258
+ mode: oneOf(CHECKPOINT_MODES),
259
+ maxFileBytes: num(0),
260
+ keep: num(1),
261
+ }),
262
+ sandbox: object({
263
+ enabled: oneOf(SANDBOX_ENABLED_MODES),
264
+ bash: oneOf(SANDBOX_ENABLED_MODES, "bash 经 OS 沙箱运行(缺省 off)"),
265
+ network: oneOf(SANDBOX_NETWORK_MODES, "bash 沙箱里的网络(缺省 deny)"),
266
+ writable: { ...strings, description: "bash 沙箱追加的可写目录(绝对路径或 ~/…)" },
267
+ }),
268
+ ...w5Sections(),
175
269
  }),
176
270
  required: ["version"],
177
271
  };
@@ -0,0 +1,22 @@
1
+ /**
2
+ * config.json 每个键的说明与缺省值:config.schema.json(编辑器悬停)与 `ama config show`(来源 default
3
+ * 的行)共用这一张表。
4
+ *
5
+ * - `description` 写在 `CONFIG_KEY_DOCS`;缺省值不手写,从 `DEFAULT_CONFIG`(merge.ts)、
6
+ * `DEFAULT_CACHE_CONFIG`(types.ts)与代码里的隐式缺省(`IMPLICIT_DEFAULTS`)合成 `DISPLAY_DEFAULTS`;
7
+ * - 缺省值取决于运行时的键(自动选模型、跟随预设等)列在 `DYNAMIC_DEFAULTS`,schema 里不写 `default`,
8
+ * 说明里写规则;
9
+ * - 一致性由 json-schema.test.ts 守住:schema 的每个键都在表里,表里的每个键 schema 都有,缺省值与
10
+ * DISPLAY_DEFAULTS 相同,DISPLAY_DEFAULTS 本身通过 `validateConfig`。
11
+ */
12
+ import { type AmaConfig } from "./types.js";
13
+ /** 全部有固定缺省值的键(展示用;运行时仍以 DEFAULT_CONFIG 合并)。 */
14
+ export declare const DISPLAY_DEFAULTS: Readonly<AmaConfig>;
15
+ /** 缺省值由运行时决定的键 → 规则(schema 不写 default)。 */
16
+ export declare const DYNAMIC_DEFAULTS: Readonly<Record<string, string>>;
17
+ /** 键路径 → 说明(段落本身也有一条)。 */
18
+ export declare const CONFIG_KEY_DOCS: Readonly<Record<string, string>>;
19
+ /** 叶子路径(段落不算)。 */
20
+ export declare function documentedLeaves(): string[];
21
+ /** 键路径的缺省值(DISPLAY_DEFAULTS 里取;没有返回 undefined)。 */
22
+ export declare function defaultFor(path: string): unknown;
@@ -0,0 +1,174 @@
1
+ /**
2
+ * config.json 每个键的说明与缺省值:config.schema.json(编辑器悬停)与 `ama config show`(来源 default
3
+ * 的行)共用这一张表。
4
+ *
5
+ * - `description` 写在 `CONFIG_KEY_DOCS`;缺省值不手写,从 `DEFAULT_CONFIG`(merge.ts)、
6
+ * `DEFAULT_CACHE_CONFIG`(types.ts)与代码里的隐式缺省(`IMPLICIT_DEFAULTS`)合成 `DISPLAY_DEFAULTS`;
7
+ * - 缺省值取决于运行时的键(自动选模型、跟随预设等)列在 `DYNAMIC_DEFAULTS`,schema 里不写 `default`,
8
+ * 说明里写规则;
9
+ * - 一致性由 json-schema.test.ts 守住:schema 的每个键都在表里,表里的每个键 schema 都有,缺省值与
10
+ * DISPLAY_DEFAULTS 相同,DISPLAY_DEFAULTS 本身通过 `validateConfig`。
11
+ */
12
+ import { DEFAULT_IDLE_TIMEOUT_MS } from "../ai/http.js";
13
+ import { DEFAULT_INLINE_BUDGET } from "../codemode/declarations.js";
14
+ import { DEFAULT_CONFIG, mergeConfig } from "./merge.js";
15
+ import { DEFAULT_CACHE_CONFIG, DEFAULT_CHECKPOINTS_CONFIG } from "./types.js";
16
+ /** 代码里生效、但 DEFAULT_CONFIG 不写的缺省(写进去会改变合并结果或 `config.codemode` 的有无)。 */
17
+ const IMPLICIT_DEFAULTS = {
18
+ providers: {},
19
+ permission: { builtinDeny: true, autoSafeCommands: [] },
20
+ tools: { default: [] },
21
+ codemode: { inlineBudget: DEFAULT_INLINE_BUDGET, requireStrict: false },
22
+ cache: { ...DEFAULT_CACHE_CONFIG },
23
+ request: { idleTimeoutMs: DEFAULT_IDLE_TIMEOUT_MS },
24
+ ui: { compact: false, animation: true, restoreOnCancel: true },
25
+ checkpoints: { ...DEFAULT_CHECKPOINTS_CONFIG },
26
+ sandbox: { enabled: "auto", bash: "off", network: "deny", writable: [] },
27
+ // [W5-C0] 第五波键的缺省(行为由各批次实现)
28
+ compaction: { prune: { keepResults: 5, clearAtLeast: "auto" }, pruneExclude: [] },
29
+ images: { resize: "auto" },
30
+ plan: { bash: "readonly", unattended: "stop" },
31
+ agents: { maxConcurrent: 3, dirs: [] },
32
+ subagents: { maxConcurrent: 4, maxPending: 16 },
33
+ reminders: { todo: true, fileChanges: true, contextPressure: true, budget: true },
34
+ todo: { reminder: 10 },
35
+ };
36
+ /** 全部有固定缺省值的键(展示用;运行时仍以 DEFAULT_CONFIG 合并)。 */
37
+ export const DISPLAY_DEFAULTS = Object.freeze(mergeConfig(DEFAULT_CONFIG, IMPLICIT_DEFAULTS));
38
+ /** 缺省值由运行时决定的键 → 规则(schema 不写 default)。 */
39
+ export const DYNAMIC_DEFAULTS = Object.freeze({
40
+ $schema: "ama init 写 ./config.schema.json",
41
+ defaultModel: "零配置自动选择",
42
+ "permission.autoModel": "当前会话模型",
43
+ "codemode.mode": "跟随预设",
44
+ "ui.ascii": "自动检测",
45
+ // [W5-C0]
46
+ "ui.statusLine": "独立终端 full,嵌入宿主(有 profile)compact",
47
+ "plan.directory": "<数据目录>/plans",
48
+ "plan.model": "不设:沿用当前模型",
49
+ "plan.thinkingLevel": "不设:沿用当前思考强度",
50
+ "agents.sessionBudgetUsd": "不设:不限",
51
+ "subagents.defaultModel": "不设:继承父会话模型",
52
+ "models.aliases.fast": "不设:fast 按 inherit 处理",
53
+ "models.aliases.strong": "不设:strong 按 inherit 处理",
54
+ fallbackModel: "不设:不回退",
55
+ "limits.maxTurns": "不设:不限",
56
+ "limits.maxCostUsd": "不设:不限",
57
+ });
58
+ /** 键路径 → 说明(段落本身也有一条)。 */
59
+ export const CONFIG_KEY_DOCS = Object.freeze({
60
+ $schema: "编辑器用的 JSON Schema 路径",
61
+ version: "配置文件格式版本,固定为 1",
62
+ defaultModel: "缺省模型 provider/model 或 provider/model@channel;不写时零配置自动选择(ama config show 显示选了谁、为什么)",
63
+ thinkingLevel: "思考强度",
64
+ providers: "自定义供应商与对内置供应商的覆盖(docs/providers.md)",
65
+ permission: "权限(docs/permissions.md)",
66
+ "permission.mode": "权限模式;项目级只能更严",
67
+ "permission.allow": "放行规则,如 bash(npm test);项目级不能加",
68
+ "permission.deny": "拒绝规则,如 write(**/.env);各层累加",
69
+ "permission.builtinDeny": "内置 deny 表(.git/** 写、.ssh/** 读写):true 全部启用,false 全部移除,数组 = 要移除的规则原文;只认用户级",
70
+ "permission.autoModel": "auto 模式分类器的模型 provider/model;不写时用当前会话模型;只认用户级",
71
+ "permission.autoSafeCommands": "auto 模式安全名单追加(词前缀或含 * 的通配);只认用户级",
72
+ compaction: "自动压缩",
73
+ "compaction.enabled": "上下文接近上限时自动压缩",
74
+ "compaction.reserveTokens": "为回复预留的 token;剩余不足时触发压缩",
75
+ "compaction.keepRecentTokens": "压缩时原样保留的最近消息 token",
76
+ "compaction.prune": "档一裁剪(旧工具结果换成占位);只认用户级(第五波 W5-H1 起生效)",
77
+ "compaction.prune.keepResults": "保留最近 N 个工具结果不裁",
78
+ "compaction.prune.clearAtLeast": "一次至少能省这么多 token 才裁(避免频繁打断缓存);auto = max(20000, 0.1 × 上下文预算)",
79
+ "compaction.pruneExclude": "不被档一裁剪的工具名;只认用户级(第五波 W5-H1 起生效)",
80
+ retry: "请求失败重试",
81
+ "retry.enabled": "可重试的错误(限流、服务端错误、连接中断等)自动重试",
82
+ "retry.maxRetries": "最多重试次数",
83
+ "retry.baseDelayMs": "首次重试等待(毫秒,指数退避;有 Retry-After 时按它)",
84
+ "retry.maxDelayMs": "单次等待上限(毫秒)",
85
+ tools: "内置工具",
86
+ "tools.preset": "工具预设:default(六个工具;网络隔离时另加 codemode,todo 需在 tools.default 加 +todo)、minimal、codemode-only、coordinator;codemode 是 codemode-only 的旧名;项目级只能更严",
87
+ "tools.default": "在预设上微调:+name 加、-name 去,不带前缀的名字整组替换预设的内置工具;只认用户级",
88
+ "tools.maxToolResultChars": "单条工具结果进上下文的字符上限,超出保留首尾",
89
+ "tools.bashTimeoutMs": "bash 缺省超时(毫秒,单次调用可覆盖,最大 600000)",
90
+ "tools.disabled": "禁用的工具名;各层累加",
91
+ codemode: "codemode:模型写脚本批量调用工具(docs/codemode.md)",
92
+ "codemode.mode": "off | on | only;不写时跟随预设:default → on(Node ≥ 25;Node 22 / 24 → off)、codemode-only → only、minimal / coordinator → off;项目级只接受 off",
93
+ "codemode.inlineBudget": "only 模式在描述里内联工具声明的预算(估算 token),超出只列名字",
94
+ "codemode.requireStrict": "true:运行时 Node 不隔离网络(Node 22 / 24)时直接禁用 codemode",
95
+ hooks: "Hook 设置(Hook 本身写在 hooks.json)",
96
+ "hooks.timeoutMs": "单个 Hook 命令的缺省超时(毫秒)",
97
+ ui: "终端界面",
98
+ "ui.theme": "配色主题:dark、light,或 auto(按 COLORFGBG 猜,不发终端查询,猜不出用 dark)",
99
+ "ui.markdown": "按 Markdown 渲染回复",
100
+ "ui.showThinking": "思考内容的显示方式",
101
+ "ui.tuiMode": "终端界面形态(目前只有 regular)",
102
+ "ui.quietStartup": "启动画面详略",
103
+ "ui.ascii": "ASCII 字形(> * L、+ - |);不写时自动检测:区域设置不含 UTF-8、TERM=linux、旧 conhost 时开启;AMA_ASCII=1/0 覆盖",
104
+ "ui.compact": "消息区块间不空行、启动头不画框",
105
+ "ui.animation": "false:运行中 spinner 静止,只在秒数变化时重绘",
106
+ "ui.restoreOnCancel": "运行中 Esc 中断、本回合还没有任何回复或工具调用时,撤回该回合并把原消息放回输入框",
107
+ "ui.statusLine": "底部信息行:full 两行(速率行 + 状态行),compact 一行;运行时 Ctrl+G 或 /statusline 切换(第五波 W5-A 起生效)",
108
+ skills: "Skill",
109
+ "skills.dirs": "追加的 Skill 目录;各层累加",
110
+ cache: "提示缓存;整段只认用户级",
111
+ request: "模型请求;整段只认用户级 / profile",
112
+ "request.idleTimeoutMs": "流空闲超时(毫秒):等响应头或两块数据之间超过即判卡住并按可重试错误重试;0 关闭;AMA_IDLE_TIMEOUT_MS 覆盖",
113
+ "cache.warming": "保温:off 关闭,streaming 生成期间保温,idle 空闲时也保温",
114
+ "cache.retention": "缓存时长档:none、short、long(供应商支持时)",
115
+ "cache.minSavingsUsd": "保温的最低期望节省(美元)",
116
+ "cache.missNotices": "在消息区提示缓存未命中与上下文余量",
117
+ "cache.warmSubagents": "子会话(task)也保温",
118
+ checkpoints: "检查点:回滚代码用的文件备份(docs/sessions.md「检查点与文件备份」)",
119
+ "checkpoints.mode": "tools:跟踪 edit / write 改过的文件;shadow-git:另用影子 git 快照整个工作目录,bash 等直接改动也能回滚(需要 git,大目录自动降级为 tools);off:关闭;AMA_CHECKPOINTS 覆盖;项目级只接受 off",
120
+ "checkpoints.maxFileBytes": "单个文件的备份上限(字节),超出不备份、回滚时报告无法恢复;项目级只能调小",
121
+ "checkpoints.keep": "可回滚的最近检查点数,更早的不再列为回滚点;只认用户级 / profile",
122
+ sandbox: '操作系统级沙箱(docs/sandbox.md);只认用户级 / profile,项目级只接受 network: "deny"',
123
+ "sandbox.enabled": "auto:探测到可用的 macOS sandbox-exec / Linux bwrap、unshare 就用(codemode 子进程拒绝网络与写入;Node 22 / 24 上 codemode 因此网络隔离);off:不用;AMA_SANDBOX=off 覆盖",
124
+ "sandbox.bash": "auto:bash 经 sandbox-exec / bwrap 运行(unshare 不算),写入只限工作区、临时目录、输出目录与 sandbox.writable,default 模式下沙箱内命令免审批;off:不用;只认用户级 / profile",
125
+ "sandbox.network": "bash 沙箱里的网络:deny 拒绝(沙箱内免审批的前提);allow 允许联网但写入仍受限、照常审批;项目级只能设 deny",
126
+ "sandbox.writable": "bash 沙箱追加的可写目录(绝对路径或 ~/…);只认用户级 / profile",
127
+ // [W5-C0] 第五波(docs/wave5-plan.md);括号里是起生效的批次
128
+ images: "图像输入;只认用户级(第五波 W5-I 起生效)",
129
+ "images.resize": "auto:图片超过端点上限时用系统工具(sips / magick)缩放,找不到工具按原规则拒绝;off:从不缩放",
130
+ plan: "Plan 模式(第五波 W5-F 起生效)",
131
+ "plan.bash": "plan 模式下的 bash:readonly 只读命令放行其余拒绝,ask 其余询问,deny 全拒;项目级只能更严",
132
+ "plan.directory": "计划文件目录(必须在项目根之内,否则回落缺省);只认用户级",
133
+ "plan.unattended": "无人值守(-p、RPC 未声明 plans 能力)时:stop 落盘计划后停下等人审批,approve 自动批准执行;只认用户级",
134
+ "plan.model": "规划用模型 provider/model[@channel]:进入 plan 时切换、批准时切回;只认用户级",
135
+ "plan.thinkingLevel": "规划时的思考强度;只认用户级",
136
+ agents: "外部 Agent(claude / codex / ACP)与子 Agent 类型;agents.<id> 设单个 Agent 的 maxConcurrent / maxMode / model / env.passthrough;只认用户级(第五波 W5-E / W5-G 起生效)",
137
+ "agents.maxConcurrent": "外部 Agent 的总并发",
138
+ "agents.sessionBudgetUsd": "本会话外部 Agent 的美元预算",
139
+ "agents.dirs": "追加的子 Agent 定义目录(*.md);各层累加",
140
+ subagents: "ama 自己的 task 子会话;只认用户级(第五波 W5-G 起生效)",
141
+ "subagents.maxConcurrent": "同时运行的子会话数",
142
+ "subagents.maxPending": "排队上限,超出时 task 报错",
143
+ "subagents.defaultModel": "子会话缺省模型 provider/model[@channel]",
144
+ models: "模型别名;只认用户级(第五波 W5-G 起生效)",
145
+ "models.aliases": "子 Agent 定义里 model: fast / strong 指向的模型",
146
+ "models.aliases.fast": "fast 别名的模型 provider/model[@channel]",
147
+ "models.aliases.strong": "strong 别名的模型 provider/model[@channel]",
148
+ fallbackModel: "回退模型 provider/model[@channel]:可重试错误用尽或过载时切换重试一次,下一回合回主模型;只认用户级(第五波 W5-H2 起生效)",
149
+ limits: "会话预算,到限结束本次运行(-p 退出码 8);--max-turns / --max-cost 覆盖;只认用户级(第五波 W5-H2 起生效)",
150
+ "limits.maxTurns": "一次运行最多回合数",
151
+ "limits.maxCostUsd": "一次运行的美元上限",
152
+ reminders: "附在对话尾部的提醒(不改缓存前缀);项目级可设(第五波 W5-H2 起生效)",
153
+ "reminders.todo": "todo 有未完成项且多回合未更新时复述",
154
+ "reminders.fileChanges": "读过的文件被外部改动时列出",
155
+ "reminders.contextPressure": "上下文用量到 70% / 85% 时各提醒一次",
156
+ "reminders.budget": "预算剩余不足 20% 时提醒",
157
+ todo: "todo 工具;只认用户级(第五波 W5-F / W5-H2 起生效)",
158
+ "todo.reminder": "连续 N 回合未更新且有未完成项时提醒复述;0 关闭",
159
+ });
160
+ /** 叶子路径(段落不算)。 */
161
+ export function documentedLeaves() {
162
+ const keys = Object.keys(CONFIG_KEY_DOCS);
163
+ return keys.filter((key) => !keys.some((other) => other.startsWith(`${key}.`)));
164
+ }
165
+ /** 键路径的缺省值(DISPLAY_DEFAULTS 里取;没有返回 undefined)。 */
166
+ export function defaultFor(path) {
167
+ let node = DISPLAY_DEFAULTS;
168
+ for (const key of path.split(".")) {
169
+ if (typeof node !== "object" || node === null || Array.isArray(node))
170
+ return undefined;
171
+ node = node[key];
172
+ }
173
+ return node;
174
+ }
@@ -2,14 +2,17 @@
2
2
  * 配置层级合并(设计 §7.2、§10.2)。[B5]
3
3
  *
4
4
  * 顺序:内置缺省 ← 用户级 ← profile.config ← 项目级(受限字段,只能收紧)← 命令行。
5
- * - 对象深合并;数组整体替换,例外是「累加型」列表:`permission.allow / deny`、
5
+ * - 对象深合并;数组整体替换,例外是「累加型」列表:`permission.allow / deny / autoSafeCommands`、
6
6
  * `tools.disabled`、`skills.dirs` 跨层拼接去重。
7
- * - 项目级 `.ama/config.json` 只接受:`permission.deny`(追加)、`permission.mode`(只能更严)、
8
- * `compaction`、`tools.disabled`、`tools.preset`(只能更严)、`codemode.mode: "off"`、`ui`;
9
- * 其它字段与放宽项(含 `permission.builtinDeny`)被忽略并记 warning。
7
+ * - 项目级 `.ama/config.json` 只接受:`permission.deny`(追加)、`permission.mode`(只能更严,且不能是
8
+ * auto / full-auto)、
9
+ * `compaction`、`tools.disabled`、`tools.preset`(只能更严)、`codemode.mode: "off"`、`ui`、
10
+ * `checkpoints.mode: "off"`、`checkpoints.maxFileBytes`(只能调小)、(W5-C0)`plan.bash`(只能更严)、
11
+ * `reminders`;`compaction.prune / pruneExclude` 与第五波其余段只认用户级;
12
+ * 其它字段与放宽项(含 `permission.builtinDeny / autoModel / autoSafeCommands`)被忽略并记 warning。
10
13
  * - 同时产出带来源的权限规则清单(`ruleSpecs`),交给权限管线(B3 的 rules.ts 解析)。
11
14
  */
12
- import type { AmaConfig, CodemodeMode, ToolsPreset } from "./types.js";
15
+ import type { AmaConfig, CodemodeMode, PlanBashMode, ToolsPresetInput } from "./types.js";
13
16
  import type { PermissionMode, RuleSource } from "../permissions/types.js";
14
17
  import type { ModelThinkingLevel } from "../ai/types.js";
15
18
  export declare const DEFAULT_CONFIG: Readonly<AmaConfig>;
@@ -28,13 +31,13 @@ export interface RestrictResult {
28
31
  accepted: Partial<AmaConfig>;
29
32
  warnings: string[];
30
33
  }
31
- /** 预设 a 是否比 b 更严或相同(coordinator 最严,codemode 最宽)。 */
32
- export declare function isPresetStricterOrEqual(a: ToolsPreset, b: ToolsPreset): boolean;
34
+ /** 预设 a 是否比 b 更严或相同(coordinator 最严,codemode-only 最宽;别名按规范名比)。 */
35
+ export declare function isPresetStricterOrEqual(a: ToolsPresetInput, b: ToolsPresetInput): boolean;
33
36
  /**
34
37
  * 把项目级配置裁剪为受限字段(§7.2);`currentMode` / `currentPreset` 是合并到此为止的
35
38
  * 权限模式与工具预设。
36
39
  */
37
- export declare function restrictProjectConfig(project: AmaConfig, currentMode: PermissionMode, label?: string, currentPreset?: ToolsPreset): RestrictResult;
40
+ export declare function restrictProjectConfig(project: AmaConfig, currentMode: PermissionMode, label?: string, currentPreset?: ToolsPresetInput, currentMaxFileBytes?: number, currentPlanBash?: PlanBashMode): RestrictResult;
38
41
  /** 命令行对配置的覆盖(只含与 config 同名的那部分参数)。 */
39
42
  export interface CliConfigOverrides {
40
43
  thinkingLevel?: ModelThinkingLevel | undefined;
@@ -45,7 +48,7 @@ export interface CliConfigOverrides {
45
48
  tuiMode?: "regular" | undefined;
46
49
  skillDirs?: readonly string[] | undefined;
47
50
  /** `--tools-preset`。 */
48
- toolsPreset?: ToolsPreset | undefined;
51
+ toolsPreset?: ToolsPresetInput | undefined;
49
52
  /** `--codemode`。 */
50
53
  codemode?: CodemodeMode | undefined;
51
54
  }