@armadra/agent 0.4.0 → 0.5.1

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 (432) hide show
  1. package/CHANGELOG.md +184 -1
  2. package/README.md +202 -83
  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/session-cache.d.ts +5 -0
  17. package/dist/agent/session-cache.js +17 -1
  18. package/dist/agent/session-classifier.d.ts +1 -1
  19. package/dist/agent/session-classifier.js +3 -1
  20. package/dist/agent/session-compaction.d.ts +35 -6
  21. package/dist/agent/session-compaction.js +157 -31
  22. package/dist/agent/session-core.d.ts +27 -1
  23. package/dist/agent/session-extensions.d.ts +61 -0
  24. package/dist/agent/session-extensions.js +129 -0
  25. package/dist/agent/session-images.d.ts +23 -0
  26. package/dist/agent/session-images.js +97 -0
  27. package/dist/agent/session-plan.d.ts +21 -0
  28. package/dist/agent/session-plan.js +524 -0
  29. package/dist/agent/session-rewind.d.ts +81 -0
  30. package/dist/agent/session-rewind.js +354 -0
  31. package/dist/agent/session-run.d.ts +28 -1
  32. package/dist/agent/session-run.js +157 -6
  33. package/dist/agent/session-settings.d.ts +49 -0
  34. package/dist/agent/session-settings.js +95 -0
  35. package/dist/agent/session-subagent.d.ts +36 -24
  36. package/dist/agent/session-subagent.js +259 -129
  37. package/dist/agent/session-sync.d.ts +10 -3
  38. package/dist/agent/session-sync.js +37 -8
  39. package/dist/agent/session-telemetry.d.ts +39 -0
  40. package/dist/agent/session-telemetry.js +231 -0
  41. package/dist/agent/session-tools.js +40 -1
  42. package/dist/agent/session.d.ts +30 -29
  43. package/dist/agent/session.js +79 -123
  44. package/dist/agent/subagent-registry.d.ts +91 -0
  45. package/dist/agent/subagent-registry.js +494 -0
  46. package/dist/agent/system-prompt.d.ts +6 -3
  47. package/dist/agent/system-prompt.js +7 -2
  48. package/dist/agent/tool-runner.d.ts +8 -1
  49. package/dist/agent/tool-runner.js +57 -4
  50. package/dist/agent/types-w5.d.ts +192 -0
  51. package/dist/agent/types-w5.js +10 -0
  52. package/dist/agent/types.d.ts +47 -4
  53. package/dist/agent/types.js +2 -0
  54. package/dist/agent/worktree.d.ts +36 -0
  55. package/dist/agent/worktree.js +86 -0
  56. package/dist/agents/builtin.d.ts +14 -0
  57. package/dist/agents/builtin.js +39 -0
  58. package/dist/agents/catalog.d.ts +43 -0
  59. package/dist/agents/catalog.js +82 -0
  60. package/dist/agents/discover.d.ts +35 -0
  61. package/dist/agents/discover.js +83 -0
  62. package/dist/agents/external.d.ts +82 -0
  63. package/dist/agents/external.js +326 -0
  64. package/dist/agents/parse.d.ts +18 -0
  65. package/dist/agents/parse.js +116 -0
  66. package/dist/agents/result.d.ts +32 -0
  67. package/dist/agents/result.js +67 -0
  68. package/dist/agents/task-control.d.ts +17 -0
  69. package/dist/agents/task-control.js +17 -0
  70. package/dist/agents/task-record.d.ts +78 -0
  71. package/dist/agents/task-record.js +141 -0
  72. package/dist/agents/types.d.ts +46 -0
  73. package/dist/agents/types.js +8 -0
  74. package/dist/ai/apis/anthropic-compat.d.ts +36 -0
  75. package/dist/ai/apis/anthropic-compat.js +92 -0
  76. package/dist/ai/apis/anthropic-request.d.ts +7 -6
  77. package/dist/ai/apis/anthropic-request.js +10 -28
  78. package/dist/ai/apis/cache-params.d.ts +11 -2
  79. package/dist/ai/apis/cache-params.js +25 -6
  80. package/dist/ai/apis/openai-compat.d.ts +4 -1
  81. package/dist/ai/apis/openai-compat.js +8 -1
  82. package/dist/ai/image-limits.d.ts +45 -0
  83. package/dist/ai/image-limits.js +68 -0
  84. package/dist/ai/providers/builtin.d.ts +18 -6
  85. package/dist/ai/providers/builtin.js +135 -6
  86. package/dist/ai/providers/catalog-data.js +17 -13
  87. package/dist/ai/providers/catalog.d.ts +60 -7
  88. package/dist/ai/providers/catalog.js +197 -38
  89. package/dist/ai/providers/channels.d.ts +33 -3
  90. package/dist/ai/providers/channels.js +108 -7
  91. package/dist/ai/providers/enrich.d.ts +6 -3
  92. package/dist/ai/providers/enrich.js +19 -4
  93. package/dist/ai/providers/models-dev-cache.d.ts +28 -24
  94. package/dist/ai/providers/models-dev-cache.js +92 -78
  95. package/dist/ai/providers/models-dev-data.d.ts +7 -0
  96. package/dist/ai/providers/models-dev-data.js +32 -0
  97. package/dist/ai/providers/models-dev-snapshot.d.ts +50 -0
  98. package/dist/ai/providers/models-dev-snapshot.js +137 -0
  99. package/dist/ai/providers/models-dev.d.ts +51 -10
  100. package/dist/ai/providers/models-dev.js +132 -39
  101. package/dist/ai/providers/registry.d.ts +20 -10
  102. package/dist/ai/providers/registry.js +82 -43
  103. package/dist/ai/types.d.ts +28 -2
  104. package/dist/ai/types.js +5 -0
  105. package/dist/bundle/ama.cjs +37605 -21619
  106. package/dist/checkpoints/backend.d.ts +61 -0
  107. package/dist/checkpoints/backend.js +135 -0
  108. package/dist/checkpoints/blobs.d.ts +60 -0
  109. package/dist/checkpoints/blobs.js +203 -0
  110. package/dist/checkpoints/gc.d.ts +47 -0
  111. package/dist/checkpoints/gc.js +144 -0
  112. package/dist/checkpoints/git-head.d.ts +15 -0
  113. package/dist/checkpoints/git-head.js +89 -0
  114. package/dist/checkpoints/index.d.ts +17 -0
  115. package/dist/checkpoints/index.js +17 -0
  116. package/dist/checkpoints/replay.d.ts +48 -0
  117. package/dist/checkpoints/replay.js +154 -0
  118. package/dist/checkpoints/restore.d.ts +86 -0
  119. package/dist/checkpoints/restore.js +263 -0
  120. package/dist/checkpoints/settings.d.ts +14 -0
  121. package/dist/checkpoints/settings.js +23 -0
  122. package/dist/checkpoints/shadow-git.d.ts +108 -0
  123. package/dist/checkpoints/shadow-git.js +491 -0
  124. package/dist/checkpoints/shadow-restore.d.ts +25 -0
  125. package/dist/checkpoints/shadow-restore.js +128 -0
  126. package/dist/checkpoints/tracker.d.ts +64 -0
  127. package/dist/checkpoints/tracker.js +192 -0
  128. package/dist/checkpoints/types.d.ts +99 -0
  129. package/dist/checkpoints/types.js +12 -0
  130. package/dist/cli/args.d.ts +8 -4
  131. package/dist/cli/args.js +17 -97
  132. package/dist/cli/bootstrap.js +13 -1
  133. package/dist/cli/choice-prompt.d.ts +58 -0
  134. package/dist/cli/choice-prompt.js +140 -0
  135. package/dist/cli/codemode-notice.d.ts +3 -2
  136. package/dist/cli/codemode-notice.js +3 -2
  137. package/dist/cli/compose-agents.d.ts +27 -0
  138. package/dist/cli/compose-agents.js +111 -0
  139. package/dist/cli/compose-extensions.d.ts +29 -0
  140. package/dist/cli/compose-extensions.js +44 -0
  141. package/dist/cli/compose-session.d.ts +3 -0
  142. package/dist/cli/compose-session.js +47 -4
  143. package/dist/cli/compose.d.ts +3 -0
  144. package/dist/cli/compose.js +33 -6
  145. package/dist/cli/deps.d.ts +6 -0
  146. package/dist/cli/exit-codes.d.ts +10 -0
  147. package/dist/cli/exit-codes.js +12 -0
  148. package/dist/cli/help-text.d.ts +4 -0
  149. package/dist/cli/help-text.js +102 -0
  150. package/dist/cli/startup-screen.js +5 -3
  151. package/dist/cli/startup-steps.js +7 -1
  152. package/dist/cli/subcommands/config.d.ts +4 -1
  153. package/dist/cli/subcommands/config.js +17 -6
  154. package/dist/cli/subcommands/doctor.js +21 -0
  155. package/dist/cli/subcommands/models-cache-probe.d.ts +1 -1
  156. package/dist/cli/subcommands/models-cache-probe.js +3 -12
  157. package/dist/cli/subcommands/models-discover.js +5 -6
  158. package/dist/cli/subcommands/models.d.ts +2 -0
  159. package/dist/cli/subcommands/models.js +33 -14
  160. package/dist/cli/subcommands/providers.d.ts +1 -1
  161. package/dist/cli/subcommands/providers.js +8 -15
  162. package/dist/cli/subcommands/sessions.d.ts +3 -1
  163. package/dist/cli/subcommands/sessions.js +36 -2
  164. package/dist/codemode/capability.d.ts +24 -7
  165. package/dist/codemode/capability.js +38 -10
  166. package/dist/codemode/host-side.d.ts +14 -0
  167. package/dist/codemode/host-side.js +24 -1
  168. package/dist/codemode/tool.d.ts +1 -1
  169. package/dist/codemode/tool.js +6 -4
  170. package/dist/compaction/breaker.d.ts +25 -9
  171. package/dist/compaction/breaker.js +47 -17
  172. package/dist/compaction/estimate.d.ts +11 -3
  173. package/dist/compaction/estimate.js +64 -22
  174. package/dist/compaction/image-budget.d.ts +45 -0
  175. package/dist/compaction/image-budget.js +115 -0
  176. package/dist/compaction/post-compact.d.ts +38 -0
  177. package/dist/compaction/post-compact.js +152 -0
  178. package/dist/compaction/protect.d.ts +27 -0
  179. package/dist/compaction/protect.js +56 -0
  180. package/dist/compaction/prune-tier.d.ts +58 -12
  181. package/dist/compaction/prune-tier.js +120 -54
  182. package/dist/compaction/summarize-tier.d.ts +23 -4
  183. package/dist/compaction/summarize-tier.js +100 -29
  184. package/dist/config/checker.d.ts +28 -0
  185. package/dist/config/checker.js +97 -0
  186. package/dist/config/json-schema.js +63 -2
  187. package/dist/config/key-docs.js +72 -3
  188. package/dist/config/merge.d.ts +5 -3
  189. package/dist/config/merge.js +81 -7
  190. package/dist/config/profile.d.ts +2 -0
  191. package/dist/config/profile.js +2 -0
  192. package/dist/config/schema-w5.d.ts +18 -0
  193. package/dist/config/schema-w5.js +109 -0
  194. package/dist/config/schema.d.ts +5 -9
  195. package/dist/config/schema.js +68 -114
  196. package/dist/config/types-w5.d.ts +118 -0
  197. package/dist/config/types-w5.js +20 -0
  198. package/dist/config/types.d.ts +50 -1
  199. package/dist/config/types.js +12 -0
  200. package/dist/drivers/acp/client.d.ts +57 -0
  201. package/dist/drivers/acp/client.js +160 -0
  202. package/dist/drivers/acp/driver.d.ts +31 -0
  203. package/dist/drivers/acp/driver.js +274 -0
  204. package/dist/drivers/acp/testing/fake-agent-main.d.ts +5 -0
  205. package/dist/drivers/acp/testing/fake-agent-main.js +7 -0
  206. package/dist/drivers/acp/testing/fake-agent.d.ts +27 -0
  207. package/dist/drivers/acp/testing/fake-agent.js +211 -0
  208. package/dist/drivers/acp/types.d.ts +285 -0
  209. package/dist/drivers/acp/types.js +36 -0
  210. package/dist/drivers/agents.d.ts +58 -0
  211. package/dist/drivers/agents.js +142 -0
  212. package/dist/drivers/base.d.ts +35 -0
  213. package/dist/drivers/base.js +59 -0
  214. package/dist/drivers/catalog.d.ts +46 -0
  215. package/dist/drivers/catalog.js +167 -0
  216. package/dist/drivers/env.d.ts +20 -0
  217. package/dist/drivers/env.js +46 -0
  218. package/dist/drivers/host-runners.d.ts +18 -0
  219. package/dist/drivers/host-runners.js +45 -0
  220. package/dist/drivers/jsonrpc.d.ts +58 -0
  221. package/dist/drivers/jsonrpc.js +180 -0
  222. package/dist/drivers/native/claude-normalize.d.ts +46 -0
  223. package/dist/drivers/native/claude-normalize.js +106 -0
  224. package/dist/drivers/native/claude-stream.d.ts +29 -0
  225. package/dist/drivers/native/claude-stream.js +456 -0
  226. package/dist/drivers/native/codex-app-server.d.ts +26 -0
  227. package/dist/drivers/native/codex-app-server.js +407 -0
  228. package/dist/drivers/native/codex-normalize.d.ts +38 -0
  229. package/dist/drivers/native/codex-normalize.js +124 -0
  230. package/dist/drivers/native/oneshot.d.ts +28 -0
  231. package/dist/drivers/native/oneshot.js +312 -0
  232. package/dist/drivers/permissions.d.ts +40 -0
  233. package/dist/drivers/permissions.js +92 -0
  234. package/dist/drivers/pids.d.ts +32 -0
  235. package/dist/drivers/pids.js +93 -0
  236. package/dist/drivers/pool.d.ts +28 -0
  237. package/dist/drivers/pool.js +96 -0
  238. package/dist/drivers/probe.d.ts +47 -0
  239. package/dist/drivers/probe.js +172 -0
  240. package/dist/drivers/process.d.ts +48 -0
  241. package/dist/drivers/process.js +100 -0
  242. package/dist/drivers/runner.d.ts +61 -0
  243. package/dist/drivers/runner.js +388 -0
  244. package/dist/drivers/store.d.ts +49 -0
  245. package/dist/drivers/store.js +91 -0
  246. package/dist/drivers/turn.d.ts +41 -0
  247. package/dist/drivers/turn.js +99 -0
  248. package/dist/drivers/types.d.ts +122 -0
  249. package/dist/drivers/types.js +11 -0
  250. package/dist/git/info.d.ts +75 -0
  251. package/dist/git/info.js +191 -0
  252. package/dist/hooks/protocol.js +6 -1
  253. package/dist/hooks/types.d.ts +10 -1
  254. package/dist/hooks/types.js +2 -0
  255. package/dist/host/api-impl.d.ts +7 -0
  256. package/dist/host/api-impl.js +15 -0
  257. package/dist/host/types.d.ts +24 -2
  258. package/dist/host/types.js +4 -0
  259. package/dist/index.d.ts +3 -0
  260. package/dist/index.js +1 -0
  261. package/dist/modes/acp/acp-events.d.ts +46 -0
  262. package/dist/modes/acp/acp-events.js +233 -0
  263. package/dist/modes/acp/acp-mode.d.ts +17 -0
  264. package/dist/modes/acp/acp-mode.js +47 -0
  265. package/dist/modes/acp/acp-server.d.ts +79 -0
  266. package/dist/modes/acp/acp-server.js +315 -0
  267. package/dist/modes/commands-core.d.ts +13 -1
  268. package/dist/modes/commands-core.js +64 -0
  269. package/dist/modes/image-input.d.ts +12 -4
  270. package/dist/modes/image-input.js +22 -5
  271. package/dist/modes/interactive/agent-panels.d.ts +14 -0
  272. package/dist/modes/interactive/agent-panels.js +103 -0
  273. package/dist/modes/interactive/agent-ui.d.ts +73 -0
  274. package/dist/modes/interactive/agent-ui.js +234 -0
  275. package/dist/modes/interactive/approval-dialog.d.ts +21 -4
  276. package/dist/modes/interactive/approval-dialog.js +98 -20
  277. package/dist/modes/interactive/approval-merge.d.ts +41 -0
  278. package/dist/modes/interactive/approval-merge.js +89 -0
  279. package/dist/modes/interactive/clipboard-paste.d.ts +18 -0
  280. package/dist/modes/interactive/clipboard-paste.js +28 -0
  281. package/dist/modes/interactive/commands.d.ts +12 -1
  282. package/dist/modes/interactive/commands.js +31 -1
  283. package/dist/modes/interactive/confirm-dialog.d.ts +49 -0
  284. package/dist/modes/interactive/confirm-dialog.js +121 -0
  285. package/dist/modes/interactive/double-esc.d.ts +20 -0
  286. package/dist/modes/interactive/double-esc.js +34 -0
  287. package/dist/modes/interactive/event-notices.d.ts +32 -0
  288. package/dist/modes/interactive/event-notices.js +79 -0
  289. package/dist/modes/interactive/external-editor.d.ts +16 -0
  290. package/dist/modes/interactive/external-editor.js +39 -0
  291. package/dist/modes/interactive/interactive-mode.d.ts +14 -1
  292. package/dist/modes/interactive/interactive-mode.js +140 -136
  293. package/dist/modes/interactive/key-dispatch.d.ts +22 -2
  294. package/dist/modes/interactive/key-dispatch.js +66 -7
  295. package/dist/modes/interactive/line/line-mode.d.ts +4 -1
  296. package/dist/modes/interactive/line/line-mode.js +31 -5
  297. package/dist/modes/interactive/line/line-render.d.ts +2 -1
  298. package/dist/modes/interactive/line/line-render.js +40 -4
  299. package/dist/modes/interactive/message-view.d.ts +1 -1
  300. package/dist/modes/interactive/message-view.js +24 -2
  301. package/dist/modes/interactive/panels.d.ts +18 -1
  302. package/dist/modes/interactive/panels.js +19 -5
  303. package/dist/modes/interactive/plan-command.d.ts +40 -0
  304. package/dist/modes/interactive/plan-command.js +129 -0
  305. package/dist/modes/interactive/plan-dialog.d.ts +98 -0
  306. package/dist/modes/interactive/plan-dialog.js +290 -0
  307. package/dist/modes/interactive/plan-flow.d.ts +34 -0
  308. package/dist/modes/interactive/plan-flow.js +98 -0
  309. package/dist/modes/interactive/rewind-command.d.ts +31 -0
  310. package/dist/modes/interactive/rewind-command.js +106 -0
  311. package/dist/modes/interactive/rewind-flow.d.ts +37 -0
  312. package/dist/modes/interactive/rewind-flow.js +151 -0
  313. package/dist/modes/interactive/rewind-list.d.ts +36 -0
  314. package/dist/modes/interactive/rewind-list.js +123 -0
  315. package/dist/modes/interactive/rewind-panel.d.ts +77 -0
  316. package/dist/modes/interactive/rewind-panel.js +309 -0
  317. package/dist/modes/interactive/rewind-text.d.ts +40 -0
  318. package/dist/modes/interactive/rewind-text.js +139 -0
  319. package/dist/modes/interactive/session-events.d.ts +24 -0
  320. package/dist/modes/interactive/session-events.js +96 -0
  321. package/dist/modes/interactive/startup-ui.js +5 -1
  322. package/dist/modes/interactive/status-area.d.ts +73 -0
  323. package/dist/modes/interactive/status-area.js +190 -0
  324. package/dist/modes/interactive/status-bar.d.ts +99 -11
  325. package/dist/modes/interactive/status-bar.js +273 -90
  326. package/dist/modes/interactive/status-line.d.ts +33 -0
  327. package/dist/modes/interactive/status-line.js +113 -0
  328. package/dist/modes/interactive/subagent-view.d.ts +56 -0
  329. package/dist/modes/interactive/subagent-view.js +154 -0
  330. package/dist/modes/interactive/tasks-report.d.ts +27 -0
  331. package/dist/modes/interactive/tasks-report.js +114 -0
  332. package/dist/modes/interactive/tool-view.d.ts +12 -2
  333. package/dist/modes/interactive/tool-view.js +34 -4
  334. package/dist/modes/print/print-mode.d.ts +13 -4
  335. package/dist/modes/print/print-mode.js +56 -12
  336. package/dist/modes/rpc/commands.d.ts +9 -0
  337. package/dist/modes/rpc/commands.js +44 -0
  338. package/dist/modes/rpc/rpc-mode.js +7 -1
  339. package/dist/modes/session-report.d.ts +11 -0
  340. package/dist/modes/session-report.js +48 -1
  341. package/dist/permissions/auto-safe.d.ts +5 -0
  342. package/dist/permissions/auto-safe.js +18 -0
  343. package/dist/permissions/bypass.d.ts +32 -0
  344. package/dist/permissions/bypass.js +36 -0
  345. package/dist/permissions/classifier.d.ts +4 -0
  346. package/dist/permissions/classifier.js +2 -0
  347. package/dist/permissions/modes.js +1 -1
  348. package/dist/permissions/pipeline.d.ts +43 -4
  349. package/dist/permissions/pipeline.js +114 -9
  350. package/dist/permissions/readonly-bash.d.ts +30 -0
  351. package/dist/permissions/readonly-bash.js +118 -0
  352. package/dist/permissions/types.d.ts +42 -0
  353. package/dist/plan/compose.d.ts +9 -0
  354. package/dist/plan/compose.js +19 -0
  355. package/dist/plan/controller.d.ts +71 -0
  356. package/dist/plan/controller.js +27 -0
  357. package/dist/plan/done-markers.d.ts +17 -0
  358. package/dist/plan/done-markers.js +51 -0
  359. package/dist/plan/extract.d.ts +29 -0
  360. package/dist/plan/extract.js +160 -0
  361. package/dist/plan/prompts.d.ts +36 -0
  362. package/dist/plan/prompts.js +89 -0
  363. package/dist/plan/store.d.ts +37 -0
  364. package/dist/plan/store.js +90 -0
  365. package/dist/rpc.d.ts +58 -2
  366. package/dist/rpc.js +7 -0
  367. package/dist/sandbox/bash.d.ts +74 -0
  368. package/dist/sandbox/bash.js +126 -0
  369. package/dist/sandbox/detect.d.ts +48 -0
  370. package/dist/sandbox/detect.js +149 -0
  371. package/dist/sandbox/index.d.ts +5 -0
  372. package/dist/sandbox/index.js +5 -0
  373. package/dist/sandbox/profile.d.ts +33 -0
  374. package/dist/sandbox/profile.js +76 -0
  375. package/dist/sandbox/wrap.d.ts +29 -0
  376. package/dist/sandbox/wrap.js +117 -0
  377. package/dist/sdk.d.ts +33 -2
  378. package/dist/sdk.js +24 -2
  379. package/dist/session/types.d.ts +3 -1
  380. package/dist/session/types.js +1 -0
  381. package/dist/skills/builtin.d.ts +31 -0
  382. package/dist/skills/builtin.js +109 -0
  383. package/dist/skills/discover.d.ts +2 -1
  384. package/dist/skills/index-prompt.js +5 -8
  385. package/dist/tools/background-jobs.d.ts +71 -0
  386. package/dist/tools/background-jobs.js +198 -0
  387. package/dist/tools/bash.d.ts +53 -1
  388. package/dist/tools/bash.js +158 -7
  389. package/dist/tools/clipboard-image.d.ts +44 -0
  390. package/dist/tools/clipboard-image.js +148 -0
  391. package/dist/tools/edit.d.ts +2 -0
  392. package/dist/tools/edit.js +18 -3
  393. package/dist/tools/image-file.d.ts +38 -3
  394. package/dist/tools/image-file.js +81 -10
  395. package/dist/tools/image-resize.d.ts +58 -0
  396. package/dist/tools/image-resize.js +97 -0
  397. package/dist/tools/presets.d.ts +7 -2
  398. package/dist/tools/presets.js +11 -4
  399. package/dist/tools/read.d.ts +5 -2
  400. package/dist/tools/read.js +13 -10
  401. package/dist/tools/registry.d.ts +7 -1
  402. package/dist/tools/registry.js +27 -4
  403. package/dist/tools/task-ctl.d.ts +22 -0
  404. package/dist/tools/task-ctl.js +116 -0
  405. package/dist/tools/task.d.ts +22 -10
  406. package/dist/tools/task.js +66 -26
  407. package/dist/tools/todo.d.ts +22 -2
  408. package/dist/tools/todo.js +58 -14
  409. package/dist/tools/truncate.d.ts +15 -0
  410. package/dist/tools/truncate.js +25 -0
  411. package/dist/tools/types.d.ts +113 -0
  412. package/dist/tools/types.js +5 -0
  413. package/dist/tools/write.js +3 -0
  414. package/dist/tui/glyphs.d.ts +4 -0
  415. package/dist/tui/glyphs.js +4 -0
  416. package/dist/tui/keybindings.d.ts +6 -1
  417. package/dist/tui/keybindings.js +6 -1
  418. package/docs/acp.md +78 -0
  419. package/docs/agents.md +250 -0
  420. package/docs/codemode.md +12 -8
  421. package/docs/hooks.md +26 -22
  422. package/docs/permissions.md +78 -13
  423. package/docs/plan.md +107 -0
  424. package/docs/providers.md +228 -52
  425. package/docs/rewind-plan.md +181 -0
  426. package/docs/rpc.md +92 -5
  427. package/docs/sandbox.md +215 -0
  428. package/docs/session-format.md +41 -21
  429. package/docs/sessions.md +41 -1
  430. package/docs/tui-design.md +751 -0
  431. package/docs/tui.md +179 -21
  432. package/package.json +13 -2
@@ -6,23 +6,19 @@
6
6
  * (未知字段等)。`path` 是 JSON 指针风格的字段路径(`permission.mode`、`hooks.PreToolUse[0]`)。
7
7
  */
8
8
  import type { AmaConfig, AuthFile, ProfileFile, TrustFile } from "./types.js";
9
+ import { type Diagnostic } from "./checker.js";
9
10
  import type { HookConfig } from "../hooks/types.js";
10
- export type { AmaConfig, AuthFile, ProfileFile, TrustFile, TrustEntry, ProviderConfig, PermissionConfig, CompactionConfig, RetryConfig, ToolsConfig, ToolsPreset, ToolsPresetInput, CodemodeConfig, CodemodeMode, HooksSettings, UiConfig, SkillsConfig, CacheConfig, ModelConfig, ModelOverride, ChannelConfig, } from "./types.js";
11
+ export type { AmaConfig, AuthFile, ProfileFile, TrustFile, TrustEntry, ProviderConfig, PermissionConfig, CompactionConfig, RetryConfig, ToolsConfig, ToolsPreset, ToolsPresetInput, CodemodeConfig, CodemodeMode, HooksSettings, UiConfig, SkillsConfig, CacheConfig, CheckpointsConfig, ModelConfig, ModelOverride, ChannelConfig, } from "./types.js";
11
12
  export { CONFIG_FILE_VERSION } from "./types.js";
12
13
  export type { HookConfig } from "../hooks/types.js";
13
- export interface Diagnostic {
14
- severity: "error" | "warning";
15
- /** 字段路径;文件级问题为 ""。 */
16
- path: string;
17
- message: string;
18
- }
19
- export declare const THINKING_LEVELS: readonly ["off", "minimal", "low", "medium", "high", "xhigh"];
14
+ export type { Diagnostic } from "./checker.js";
15
+ export { THINKING_LEVELS } from "./checker.js";
20
16
  export declare const HOOK_TIMEOUT_MAX_MS = 600000;
21
17
  export declare function hasErrors(diagnostics: readonly Diagnostic[]): boolean;
22
18
  export declare function validateConfig(value: unknown): Diagnostic[];
23
19
  export declare function validateAuthFile(value: unknown): Diagnostic[];
24
20
  export declare const PROFILE_PATH_FIELDS: readonly ["host", "hooksFile", "authFile", "sessionDir", "config"];
25
- export declare const PROFILE_PATH_LIST_FIELDS: readonly ["instructions", "skillDirs", "promptDirs"];
21
+ export declare const PROFILE_PATH_LIST_FIELDS: readonly ["instructions", "skillDirs", "promptDirs", "agentDirs"];
26
22
  export declare function validateProfile(value: unknown): Diagnostic[];
27
23
  export declare function validateTrustFile(value: unknown): Diagnostic[];
28
24
  export declare function validateHookConfig(value: unknown): Diagnostic[];
@@ -5,97 +5,17 @@
5
5
  * 校验结果是诊断列表:`severity: "error"` 拒绝该文件(启动退出码 3),`"warning"` 只提示
6
6
  * (未知字段等)。`path` 是 JSON 指针风格的字段路径(`permission.mode`、`hooks.PreToolUse[0]`)。
7
7
  */
8
+ import { isAbsolute } from "node:path";
9
+ import { Checker, THINKING_LEVELS, checkSection, join, } from "./checker.js";
10
+ import { W5_COMPACTION_KEYS, W5_CONFIG_KEYS, W5_UI_KEYS, checkCompactionW5, checkUiW5, validateConfigW5, } from "./schema-w5.js";
8
11
  import { HOOK_EVENTS } from "../hooks/types.js";
9
12
  import { PERMISSION_MODES_STRICT_FIRST } from "../permissions/types.js";
10
13
  import { WARMING_MODES } from "../ai/cache/types.js";
11
- import { CACHE_RETENTIONS, CHANNEL_NAME_PATTERN, CODEMODE_MODES, TOOLS_PRESET_INPUTS, } from "./types.js";
14
+ import { BUILTIN_PROVIDERS } from "../ai/providers/builtin.js";
15
+ import { CACHE_RETENTIONS, CHANNEL_NAME_PATTERN, CHECKPOINT_MODES, SANDBOX_ENABLED_MODES, SANDBOX_NETWORK_MODES, CODEMODE_MODES, TOOLS_PRESET_INPUTS, } from "./types.js";
12
16
  export { CONFIG_FILE_VERSION } from "./types.js";
13
- export const THINKING_LEVELS = ["off", "minimal", "low", "medium", "high", "xhigh"];
17
+ export { THINKING_LEVELS } from "./checker.js";
14
18
  export const HOOK_TIMEOUT_MAX_MS = 600_000;
15
- class Checker {
16
- diagnostics = [];
17
- error(path, message) {
18
- this.diagnostics.push({ severity: "error", path, message });
19
- }
20
- warn(path, message) {
21
- this.diagnostics.push({ severity: "warning", path, message });
22
- }
23
- object(value, path) {
24
- if (typeof value === "object" && value !== null && !Array.isArray(value))
25
- return true;
26
- this.error(path, "应为对象");
27
- return false;
28
- }
29
- /** 未知字段只警告(前向兼容)。 */
30
- keys(value, path, allowed) {
31
- for (const key of Object.keys(value)) {
32
- if (!allowed.includes(key))
33
- this.warn(join(path, key), "未知字段,已忽略");
34
- }
35
- }
36
- version(value, path) {
37
- if (value["version"] !== 1)
38
- this.error(join(path, "version"), "version 必须为 1");
39
- }
40
- string(value, key, path, required = false) {
41
- const v = value[key];
42
- if (v === undefined) {
43
- if (required)
44
- this.error(join(path, key), "缺少必填字符串");
45
- return;
46
- }
47
- if (typeof v !== "string")
48
- this.error(join(path, key), "应为字符串");
49
- }
50
- boolean(value, key, path) {
51
- const v = value[key];
52
- if (v !== undefined && typeof v !== "boolean")
53
- this.error(join(path, key), "应为布尔值");
54
- }
55
- number(value, key, path, min = 0, max = Number.MAX_SAFE_INTEGER) {
56
- const v = value[key];
57
- if (v === undefined)
58
- return;
59
- if (typeof v !== "number" || !Number.isFinite(v)) {
60
- this.error(join(path, key), "应为数字");
61
- }
62
- else if (v < min || v > max) {
63
- this.error(join(path, key), `应在 ${min}–${max} 之间`);
64
- }
65
- }
66
- oneOf(value, key, path, choices) {
67
- const v = value[key];
68
- if (v === undefined)
69
- return;
70
- if (typeof v !== "string" || !choices.includes(v)) {
71
- this.error(join(path, key), `取值应为 ${choices.join(" | ")}`);
72
- }
73
- }
74
- stringArray(value, key, path) {
75
- const v = value[key];
76
- if (v === undefined)
77
- return;
78
- if (!Array.isArray(v) || v.some((item) => typeof item !== "string")) {
79
- this.error(join(path, key), "应为字符串数组");
80
- }
81
- }
82
- stringRecord(value, key, path) {
83
- const v = value[key];
84
- if (v === undefined)
85
- return;
86
- if (!this.object(v, join(path, key)))
87
- return;
88
- for (const [k, item] of Object.entries(v)) {
89
- if (typeof item !== "string")
90
- this.error(join(join(path, key), k), "应为字符串");
91
- }
92
- }
93
- }
94
- function join(path, key) {
95
- if (typeof key === "number")
96
- return `${path}[${key}]`;
97
- return path === "" ? key : `${path}.${key}`;
98
- }
99
19
  export function hasErrors(diagnostics) {
100
20
  return diagnostics.some((d) => d.severity === "error");
101
21
  }
@@ -117,6 +37,9 @@ const CONFIG_KEYS = [
117
37
  "skills",
118
38
  "cache",
119
39
  "request",
40
+ "checkpoints",
41
+ "sandbox",
42
+ ...W5_CONFIG_KEYS,
120
43
  "$schema",
121
44
  ];
122
45
  const PROVIDER_KEYS = [
@@ -200,15 +123,22 @@ function checkCompat(c, compat, path) {
200
123
  c.boolean(compat, key, path);
201
124
  c.oneOf(compat, "cacheReporting", path, ["auto", "silent", "reported"]);
202
125
  }
203
- /** 返回合法的渠道名集合;没有 `channels` 时 undefined。 */
204
- function checkChannels(c, value, path) {
126
+ /**
127
+ * 返回合法的渠道名集合;没有 `channels`(也没有内置渠道)时 undefined。`builtin` 是内置供应商的内置渠道名
128
+ * ([W5-M2]):同名渠道可只写要改的字段,`defaultChannel` 与模型 `channels` 也可引用它们。
129
+ */
130
+ function checkChannels(c, value, path, builtin) {
205
131
  const channels = value["channels"];
206
- if (channels === undefined)
207
- return undefined;
132
+ if (channels === undefined) {
133
+ if (builtin.length === 0)
134
+ return undefined;
135
+ checkDefaultChannel(c, value, path, new Set(builtin));
136
+ return new Set(builtin);
137
+ }
208
138
  const cp = join(path, "channels");
209
139
  if (!c.object(channels, cp))
210
140
  return new Set();
211
- const names = new Set();
141
+ const names = new Set(builtin);
212
142
  for (const [name, channel] of Object.entries(channels)) {
213
143
  const p = join(cp, name);
214
144
  if (!CHANNEL_NAME_PATTERN.test(name)) {
@@ -219,8 +149,8 @@ function checkChannels(c, value, path) {
219
149
  if (!c.object(channel, p))
220
150
  continue;
221
151
  c.keys(channel, p, CHANNEL_KEYS);
222
- c.string(channel, "api", p, true);
223
- c.string(channel, "baseUrl", p, true);
152
+ c.string(channel, "api", p, !builtin.includes(name));
153
+ c.string(channel, "baseUrl", p, !builtin.includes(name));
224
154
  c.string(channel, "apiKey", p);
225
155
  c.stringRecord(channel, "headers", p);
226
156
  if (channel["authHeader"] !== undefined)
@@ -229,16 +159,19 @@ function checkChannels(c, value, path) {
229
159
  }
230
160
  if (names.size === 0 && Object.keys(channels).length === 0)
231
161
  c.error(cp, "至少要有一个渠道");
232
- const preferred = value["defaultChannel"];
233
- if (preferred !== undefined) {
234
- if (typeof preferred !== "string")
235
- c.error(join(path, "defaultChannel"), "应为字符串");
236
- else if (!names.has(preferred))
237
- c.error(join(path, "defaultChannel"), `渠道 "${preferred}" 不存在`);
238
- }
162
+ checkDefaultChannel(c, value, path, names);
239
163
  return names;
240
164
  }
241
- function checkProvider(c, value, path) {
165
+ function checkDefaultChannel(c, value, path, names) {
166
+ const preferred = value["defaultChannel"];
167
+ if (preferred === undefined)
168
+ return;
169
+ if (typeof preferred !== "string")
170
+ c.error(join(path, "defaultChannel"), "应为字符串");
171
+ else if (!names.has(preferred))
172
+ c.error(join(path, "defaultChannel"), `渠道 "${preferred}" 不存在`);
173
+ }
174
+ function checkProvider(c, value, path, id) {
242
175
  if (!c.object(value, path))
243
176
  return;
244
177
  c.keys(value, path, PROVIDER_KEYS);
@@ -250,21 +183,13 @@ function checkProvider(c, value, path) {
250
183
  checkCompat(c, value["compat"], join(path, "compat"));
251
184
  if (value["authHeader"] !== undefined)
252
185
  c.object(value["authHeader"], join(path, "authHeader"));
253
- const channels = checkChannels(c, value, path);
186
+ const builtin = BUILTIN_PROVIDERS.find((p) => p.id === id)?.channels?.map((ch) => ch.name);
187
+ const channels = checkChannels(c, value, path, builtin ?? []);
254
188
  if (channels === undefined && value["defaultChannel"] !== undefined)
255
189
  c.error(join(path, "defaultChannel"), "没有 channels 时不能设 defaultChannel");
256
190
  checkModels(c, value["models"], join(path, "models"), channels);
257
191
  checkModels(c, value["modelOverrides"], join(path, "modelOverrides"), channels);
258
192
  }
259
- function checkSection(c, config, key, allowed, body) {
260
- const section = config[key];
261
- if (section === undefined)
262
- return;
263
- if (!c.object(section, key))
264
- return;
265
- c.keys(section, key, allowed);
266
- body(section, key);
267
- }
268
193
  export function validateConfig(value) {
269
194
  const c = new Checker();
270
195
  if (!c.object(value, ""))
@@ -276,7 +201,7 @@ export function validateConfig(value) {
276
201
  const providers = value["providers"];
277
202
  if (providers !== undefined && c.object(providers, "providers")) {
278
203
  for (const [id, provider] of Object.entries(providers)) {
279
- checkProvider(c, provider, join("providers", id));
204
+ checkProvider(c, provider, join("providers", id), id);
280
205
  }
281
206
  }
282
207
  const permissionKeys = ["mode", "allow", "deny", "builtinDeny", "autoModel", "autoSafeCommands"];
@@ -293,10 +218,12 @@ export function validateConfig(value) {
293
218
  c.error(join(p, "builtinDeny"), "应为布尔值或字符串数组");
294
219
  }
295
220
  });
296
- checkSection(c, value, "compaction", ["enabled", "reserveTokens", "keepRecentTokens"], (s, p) => {
221
+ const compactionKeys = ["enabled", "reserveTokens", "keepRecentTokens", ...W5_COMPACTION_KEYS];
222
+ checkSection(c, value, "compaction", compactionKeys, (s, p) => {
297
223
  c.boolean(s, "enabled", p);
298
224
  c.number(s, "reserveTokens", p);
299
225
  c.number(s, "keepRecentTokens", p);
226
+ checkCompactionW5(c, s, p);
300
227
  });
301
228
  checkSection(c, value, "retry", ["enabled", "maxRetries", "baseDelayMs", "maxDelayMs"], (s, p) => {
302
229
  c.boolean(s, "enabled", p);
@@ -328,6 +255,8 @@ export function validateConfig(value) {
328
255
  "ascii",
329
256
  "compact",
330
257
  "animation",
258
+ "restoreOnCancel",
259
+ ...W5_UI_KEYS,
331
260
  ], (s, p) => {
332
261
  c.oneOf(s, "theme", p, ["dark", "light", "auto"]);
333
262
  c.boolean(s, "markdown", p);
@@ -337,11 +266,30 @@ export function validateConfig(value) {
337
266
  c.boolean(s, "ascii", p);
338
267
  c.boolean(s, "compact", p);
339
268
  c.boolean(s, "animation", p);
269
+ c.boolean(s, "restoreOnCancel", p);
270
+ checkUiW5(c, s, p);
340
271
  });
341
272
  checkSection(c, value, "skills", ["dirs"], (s, p) => c.stringArray(s, "dirs", p));
342
273
  checkSection(c, value, "request", ["idleTimeoutMs"], (s, p) => {
343
274
  c.number(s, "idleTimeoutMs", p, 0);
344
275
  });
276
+ checkSection(c, value, "checkpoints", ["mode", "maxFileBytes", "keep"], (s, p) => {
277
+ c.oneOf(s, "mode", p, CHECKPOINT_MODES);
278
+ c.number(s, "maxFileBytes", p, 0);
279
+ c.number(s, "keep", p, 1);
280
+ });
281
+ checkSection(c, value, "sandbox", ["enabled", "bash", "network", "writable"], (s, p) => {
282
+ c.oneOf(s, "enabled", p, SANDBOX_ENABLED_MODES);
283
+ c.oneOf(s, "bash", p, SANDBOX_ENABLED_MODES);
284
+ c.oneOf(s, "network", p, SANDBOX_NETWORK_MODES);
285
+ c.stringArray(s, "writable", p);
286
+ const writable = s["writable"];
287
+ if (Array.isArray(writable))
288
+ writable.forEach((item, i) => {
289
+ if (typeof item === "string" && !isAbsolute(item) && item !== "~" && !item.startsWith("~/"))
290
+ c.warn(`${p}.writable[${i}]`, "应为绝对路径或 ~/…,已忽略");
291
+ });
292
+ });
345
293
  checkSection(c, value, "cache", ["warming", "retention", "minSavingsUsd", "missNotices", "warmSubagents"], (s, p) => {
346
294
  c.oneOf(s, "warming", p, WARMING_MODES);
347
295
  c.oneOf(s, "retention", p, CACHE_RETENTIONS);
@@ -349,6 +297,7 @@ export function validateConfig(value) {
349
297
  c.boolean(s, "missNotices", p);
350
298
  c.boolean(s, "warmSubagents", p);
351
299
  });
300
+ validateConfigW5(c, value);
352
301
  return c.diagnostics;
353
302
  }
354
303
  // ---------------------------------------------------------------------------
@@ -385,7 +334,12 @@ export const PROFILE_PATH_FIELDS = [
385
334
  "sessionDir",
386
335
  "config",
387
336
  ];
388
- export const PROFILE_PATH_LIST_FIELDS = ["instructions", "skillDirs", "promptDirs"];
337
+ export const PROFILE_PATH_LIST_FIELDS = [
338
+ "instructions",
339
+ "skillDirs",
340
+ "promptDirs",
341
+ "agentDirs",
342
+ ];
389
343
  export function validateProfile(value) {
390
344
  const c = new Checker();
391
345
  if (!c.object(value, ""))
@@ -0,0 +1,118 @@
1
+ /**
2
+ * 第五波配置键的形状(docs/wave5-plan.md §9)。[W5-C0] 契约文件:C0 只定形状、校验(schema-w5.ts)、
3
+ * 说明与缺省(key-docs.ts)、JSON Schema;行为由各批次实现,未实现前这些键被接受但不起作用。
4
+ *
5
+ * 层级:项目级只接受 `plan.bash`(只能更严)、`reminders`、`ui.statusLine`(随 `ui` 段);其余只认
6
+ * 用户级 / profile(项目级忽略并 warning,merge.ts)。
7
+ */
8
+ import type { ModelThinkingLevel } from "../ai/types.js";
9
+ import type { PermissionMode } from "../permissions/types.js";
10
+ /** [W5-A] 底部信息行:full 两行(速率行 + 状态行),compact 一行。 */
11
+ export type StatusLineMode = "full" | "compact";
12
+ export declare const STATUS_LINE_MODES: readonly StatusLineMode[];
13
+ /** [W5-I] 图像。 */
14
+ export interface ImagesConfig {
15
+ /** auto:超限时用系统工具(sips / magick)缩放,没有工具按原规则拒绝;off:从不缩放。 */
16
+ resize?: "auto" | "off";
17
+ }
18
+ export declare const IMAGE_RESIZE_MODES: readonly ["auto", "off"];
19
+ /** plan 模式下 bash 的处理,从严到宽。 */
20
+ export type PlanBashMode = "deny" | "readonly" | "ask";
21
+ export declare const PLAN_BASH_MODES_STRICT_FIRST: readonly PlanBashMode[];
22
+ /** [W5-F] Plan。 */
23
+ export interface PlanConfig {
24
+ /** 缺省 readonly:只读命令放行、其余拒绝;ask:其余询问;deny:bash 全拒。项目级只能更严。 */
25
+ bash?: PlanBashMode;
26
+ /** 计划文件目录(必须在项目根之内);缺省 `<dataDir>/plans`。 */
27
+ directory?: string;
28
+ /** 无人值守(`-p`、RPC 未声明 plans 能力)时:stop 落盘后停下(缺省),approve 自动批准执行。 */
29
+ unattended?: "stop" | "approve";
30
+ /** 规划用模型 `provider/model[@channel]`:进入 plan 时切换、批准时切回。 */
31
+ model?: string;
32
+ thinkingLevel?: ModelThinkingLevel;
33
+ }
34
+ export declare const PLAN_UNATTENDED_MODES: readonly ["stop", "approve"];
35
+ /** [W5-E / W5-G] 单个 Agent(外部 CLI 或子 Agent 类型)的设置:`agents.<id>`。 */
36
+ export interface AgentEntryConfig {
37
+ /** 该 Agent 的并发上限(claude 缺省 2)。 */
38
+ maxConcurrent?: number;
39
+ /** 允许比 ama 当前模式更宽的上限(只认用户级)。 */
40
+ maxMode?: PermissionMode;
41
+ /** 该类型 / 外部 Agent 使用的模型。 */
42
+ model?: string;
43
+ env?: {
44
+ /** 子进程环境缺省剥离供应商 key、`*_BASE_URL` 与 `AMA_*`;这里列出要放回的变量名。 */
45
+ passthrough?: string[];
46
+ };
47
+ }
48
+ /** `agents` 段里的保留键(其余键都是 Agent id)。 */
49
+ export declare const AGENTS_RESERVED_KEYS: readonly ["maxConcurrent", "sessionBudgetUsd", "dirs"];
50
+ /** [W5-E / W5-G] `agents`:外部 Agent 与子 Agent 定义。 */
51
+ export interface AgentsConfig {
52
+ /** 外部 Agent 总并发,缺省 3。 */
53
+ maxConcurrent?: number;
54
+ /** 本会话外部 Agent 的美元预算;缺省不限。 */
55
+ sessionBudgetUsd?: number;
56
+ /** 追加的子 Agent 定义目录;各层累加。 */
57
+ dirs?: string[];
58
+ [agentId: string]: AgentEntryConfig | number | string[] | undefined;
59
+ }
60
+ /** 取 `agents.<id>`(保留键返回 undefined)。 */
61
+ export declare function agentEntry(agents: AgentsConfig | undefined, agentId: string): AgentEntryConfig | undefined;
62
+ /** [W5-G] ama 自己的子会话。 */
63
+ export interface SubagentsConfig {
64
+ /** 同时运行的子会话,缺省 4。 */
65
+ maxConcurrent?: number;
66
+ /** 排队上限,缺省 16(超出报错)。 */
67
+ maxPending?: number;
68
+ /** 子会话缺省模型;不设继承父会话。 */
69
+ defaultModel?: string;
70
+ }
71
+ /** [W5-G] 模型别名(子 Agent 定义的 `model: fast | strong`)。 */
72
+ export interface ModelsConfig {
73
+ aliases?: {
74
+ fast?: string;
75
+ strong?: string;
76
+ };
77
+ }
78
+ /** [W5-H1] 档一裁剪参数(其余随窗口缩放的常量不暴露)。 */
79
+ export interface PruneConfig {
80
+ /** 保留最近 N 个工具结果,缺省 5。 */
81
+ keepResults?: number;
82
+ /** 一次至少能省多少 token 才裁:auto = max(20k, 0.1×预算)。 */
83
+ clearAtLeast?: "auto" | number;
84
+ }
85
+ /** [W5-H2] 会话预算(`--max-turns` / `--max-cost` 覆盖)。 */
86
+ export interface LimitsConfig {
87
+ maxTurns?: number;
88
+ maxCostUsd?: number;
89
+ }
90
+ /** [W5-H2] 提醒通道 `ama.reminder` 的各项开关(缺省全开)。 */
91
+ export interface RemindersConfig {
92
+ /** 连续多回合未更新 todo 且有未完成项时复述。 */
93
+ todo?: boolean;
94
+ /** 读过的文件被外部改动时列出。 */
95
+ fileChanges?: boolean;
96
+ /** 上下文用量 70% / 85% 各提醒一次。 */
97
+ contextPressure?: boolean;
98
+ /** 预算剩余 < 20% 时提醒。 */
99
+ budget?: boolean;
100
+ }
101
+ /** [W5-F / W5-H2] todo。 */
102
+ export interface TodoConfig {
103
+ /** 连续 N 回合未更新且有未完成项时提醒复述,缺省 10;0 关闭。 */
104
+ reminder?: number;
105
+ }
106
+ /** 第五波并入 `AmaConfig` 的顶层段。 */
107
+ export interface AmaConfigW5 {
108
+ images?: ImagesConfig;
109
+ plan?: PlanConfig;
110
+ agents?: AgentsConfig;
111
+ subagents?: SubagentsConfig;
112
+ models?: ModelsConfig;
113
+ /** [W5-H2] 回退模型 `provider/model[@channel]`:可重试错误用尽或 overloaded 时切换重试一次。 */
114
+ fallbackModel?: string;
115
+ limits?: LimitsConfig;
116
+ reminders?: RemindersConfig;
117
+ todo?: TodoConfig;
118
+ }
@@ -0,0 +1,20 @@
1
+ /**
2
+ * 第五波配置键的形状(docs/wave5-plan.md §9)。[W5-C0] 契约文件:C0 只定形状、校验(schema-w5.ts)、
3
+ * 说明与缺省(key-docs.ts)、JSON Schema;行为由各批次实现,未实现前这些键被接受但不起作用。
4
+ *
5
+ * 层级:项目级只接受 `plan.bash`(只能更严)、`reminders`、`ui.statusLine`(随 `ui` 段);其余只认
6
+ * 用户级 / profile(项目级忽略并 warning,merge.ts)。
7
+ */
8
+ export const STATUS_LINE_MODES = ["full", "compact"];
9
+ export const IMAGE_RESIZE_MODES = ["auto", "off"];
10
+ export const PLAN_BASH_MODES_STRICT_FIRST = ["deny", "readonly", "ask"];
11
+ export const PLAN_UNATTENDED_MODES = ["stop", "approve"];
12
+ /** `agents` 段里的保留键(其余键都是 Agent id)。 */
13
+ export const AGENTS_RESERVED_KEYS = ["maxConcurrent", "sessionBudgetUsd", "dirs"];
14
+ /** 取 `agents.<id>`(保留键返回 undefined)。 */
15
+ export function agentEntry(agents, agentId) {
16
+ if (agents === undefined || AGENTS_RESERVED_KEYS.includes(agentId))
17
+ return undefined;
18
+ const entry = agents[agentId];
19
+ return typeof entry === "object" && !Array.isArray(entry) ? entry : undefined;
20
+ }
@@ -7,10 +7,16 @@
7
7
  * hooks.json 的形状是 `HookConfig`(hooks/types.ts)。
8
8
  * (W3-C0)第三波:`cache` 段(§1.12,只认用户级 / profile);`ModelConfig` / `ModelOverride`
9
9
  * 允许模型级 `api`(§2.3,同一中转的模型走不同协议),由 W3-B12 在注册表里生效。
10
+ * (W5-C0)第五波配置键(docs/wave5-plan.md §9):新段的形状在 types-w5.ts(`AmaConfigW5` 并入
11
+ * `AmaConfig`),已有段加 `ui.statusLine`、`compaction.prune / pruneExclude`、profile `agentDirs`。
10
12
  */
11
13
  import type { WarmingMode } from "../ai/cache/types.js";
12
14
  import type { Api, AuthHeader, CacheRetention, Model, ModelThinkingLevel, ProviderCompat } from "../ai/types.js";
13
15
  import type { PermissionMode } from "../permissions/types.js";
16
+ import type { CheckpointMode } from "../checkpoints/types.js";
17
+ import type { AmaConfigW5, PruneConfig, StatusLineMode } from "./types-w5.js";
18
+ export type * from "./types-w5.js";
19
+ export { AGENTS_RESERVED_KEYS, IMAGE_RESIZE_MODES, PLAN_BASH_MODES_STRICT_FIRST, PLAN_UNATTENDED_MODES, STATUS_LINE_MODES, agentEntry, } from "./types-w5.js";
14
20
  export declare const CONFIG_FILE_VERSION: 1;
15
21
  /**
16
22
  * 自定义模型条目;缺省 maxTokens 8192、reasoning false、input ["text"],不猜 contextWindow。
@@ -74,6 +80,10 @@ export interface CompactionConfig {
74
80
  enabled?: boolean;
75
81
  reserveTokens?: number;
76
82
  keepRecentTokens?: number;
83
+ /** [W5-C0] 档一裁剪参数(W5-H1);只认用户级。 */
84
+ prune?: PruneConfig;
85
+ /** [W5-C0] 不被档一裁剪的工具名(W5-H1);只认用户级。 */
86
+ pruneExclude?: string[];
77
87
  }
78
88
  export interface RetryConfig {
79
89
  enabled?: boolean;
@@ -134,6 +144,10 @@ export interface UiConfig {
134
144
  compact?: boolean;
135
145
  /** false:运行中 spinner 固定为 `·`,缺省 true。 */
136
146
  animation?: boolean;
147
+ /** 运行中 Esc 中断、本回合还没有任何输出时撤回该回合并回填原消息,缺省 true。 */
148
+ restoreOnCancel?: boolean;
149
+ /** [W5-C0] 底部信息行(W5-A):缺省独立终端 full、嵌入宿主(有 profile)compact。 */
150
+ statusLine?: StatusLineMode;
137
151
  }
138
152
  export interface SkillsConfig {
139
153
  dirs?: string[];
@@ -163,8 +177,39 @@ export interface RequestConfig {
163
177
  /** 等响应头与流中两块数据之间的最长间隔(毫秒),收到任何字节即重新计时;缺省 300 000,0 关闭。 */
164
178
  idleTimeoutMs?: number;
165
179
  }
180
+ export declare const CHECKPOINT_MODES: readonly CheckpointMode[];
181
+ /**
182
+ * 检查点(docs/rewind-plan.md §5)。环境变量 `AMA_CHECKPOINTS` 覆盖 `mode`;项目级只接受
183
+ * `mode: "off"` 与调小 `maxFileBytes`(只能收紧)。
184
+ */
185
+ export interface CheckpointsConfig {
186
+ /** tools(缺省):跟踪 edit / write 改过的文件;shadow-git:影子 git(RW-D);off:关闭。 */
187
+ mode?: CheckpointMode;
188
+ /** 单个文件的备份上限(字节),超出不备份,回滚时报告无法恢复;缺省 5 242 880。 */
189
+ maxFileBytes?: number;
190
+ /** 可回滚的最近检查点数,缺省 100。 */
191
+ keep?: number;
192
+ }
193
+ export declare const DEFAULT_CHECKPOINTS_CONFIG: Readonly<Required<CheckpointsConfig>>;
194
+ export declare const SANDBOX_ENABLED_MODES: readonly ("auto" | "off")[];
195
+ /** [S2] `sandbox.network` 的取值。 */
196
+ export declare const SANDBOX_NETWORK_MODES: readonly ("deny" | "allow")[];
197
+ /**
198
+ * 操作系统级沙箱(docs/sandbox.md)。只认用户级 / profile;项目级只接受收紧的 `network: "deny"`,其余忽略
199
+ * 并 warning。环境变量 `AMA_SANDBOX=off` 覆盖 `enabled`。
200
+ */
201
+ export interface SandboxConfig {
202
+ /** auto(缺省):探测到可用的 sandbox-exec / bwrap / unshare 就用;off:不用。 */
203
+ enabled?: "auto" | "off";
204
+ /** [S2] bash 经 OS 沙箱运行:auto 有 sandbox-exec / bwrap 就用;off(缺省)不用。 */
205
+ bash?: "auto" | "off";
206
+ /** [S2] bash 沙箱里的网络:deny(缺省,满足 default 模式免审批的条件)/ allow。 */
207
+ network?: "deny" | "allow";
208
+ /** [S2] bash 沙箱追加的可写目录(绝对路径或 `~/…`)。 */
209
+ writable?: string[];
210
+ }
166
211
  /** config.json(用户级 / 项目级 / profile.config 同形状;项目级只接受受限字段,§10.2)。 */
167
- export interface AmaConfig {
212
+ export interface AmaConfig extends AmaConfigW5 {
168
213
  version: typeof CONFIG_FILE_VERSION;
169
214
  /** `provider/model-id`。 */
170
215
  defaultModel?: string;
@@ -180,6 +225,8 @@ export interface AmaConfig {
180
225
  skills?: SkillsConfig;
181
226
  cache?: CacheConfig;
182
227
  request?: RequestConfig;
228
+ checkpoints?: CheckpointsConfig;
229
+ sandbox?: SandboxConfig;
183
230
  }
184
231
  /** auth.json(0600)。 */
185
232
  export interface AuthFile {
@@ -197,6 +244,8 @@ export interface ProfileFile {
197
244
  instructions?: string[];
198
245
  skillDirs?: string[];
199
246
  promptDirs?: string[];
247
+ /** [W5-C0] 子 Agent 定义目录(发现顺序在 `--agent-dir` 之后、用户级之前,W5-G)。 */
248
+ agentDirs?: string[];
200
249
  hooksFile?: string;
201
250
  authFile?: string;
202
251
  /** false:key 只来自 authFile,不读环境变量(§11.2)。 */
@@ -7,7 +7,10 @@
7
7
  * hooks.json 的形状是 `HookConfig`(hooks/types.ts)。
8
8
  * (W3-C0)第三波:`cache` 段(§1.12,只认用户级 / profile);`ModelConfig` / `ModelOverride`
9
9
  * 允许模型级 `api`(§2.3,同一中转的模型走不同协议),由 W3-B12 在注册表里生效。
10
+ * (W5-C0)第五波配置键(docs/wave5-plan.md §9):新段的形状在 types-w5.ts(`AmaConfigW5` 并入
11
+ * `AmaConfig`),已有段加 `ui.statusLine`、`compaction.prune / pruneExclude`、profile `agentDirs`。
10
12
  */
13
+ export { AGENTS_RESERVED_KEYS, IMAGE_RESIZE_MODES, PLAN_BASH_MODES_STRICT_FIRST, PLAN_UNATTENDED_MODES, STATUS_LINE_MODES, agentEntry, } from "./types-w5.js";
11
14
  export const CONFIG_FILE_VERSION = 1;
12
15
  /** 渠道名:不含 `/` 与 `@`(`provider/model@channel`)。 */
13
16
  export const CHANNEL_NAME_PATTERN = /^[A-Za-z0-9][A-Za-z0-9_-]{0,31}$/;
@@ -43,3 +46,12 @@ export const DEFAULT_CACHE_CONFIG = Object.freeze({
43
46
  missNotices: true,
44
47
  warmSubagents: false,
45
48
  });
49
+ export const CHECKPOINT_MODES = ["tools", "shadow-git", "off"];
50
+ export const DEFAULT_CHECKPOINTS_CONFIG = Object.freeze({
51
+ mode: "tools",
52
+ maxFileBytes: 5_242_880,
53
+ keep: 100,
54
+ });
55
+ export const SANDBOX_ENABLED_MODES = ["auto", "off"];
56
+ /** [S2] `sandbox.network` 的取值。 */
57
+ export const SANDBOX_NETWORK_MODES = ["deny", "allow"];
@@ -0,0 +1,57 @@
1
+ /**
2
+ * ACP 客户端(docs/wave5-plan.md §5.1,D14)。[W5-E]
3
+ *
4
+ * JSON-RPC over NDJSON({@link JsonRpcPeer}),手写零依赖;`@armadra/agent/acp` 导出供 Armadra 复用。
5
+ *
6
+ * - 不声明 `fs` / `terminal` 能力:Agent 发来的 `fs/*`、`terminal/*` 请求一律 method not found。
7
+ * - `session/request_permission` 交给 `onPermission`(驱动再交给 ama 的审批通道,只交给人);
8
+ * 没有处理器时按无人值守回首个 `reject_once`(没有则 cancelled)。
9
+ * - `cancel(sessionId)` 发 `session/cancel` 通知,并让该会话所有挂起的权限请求回 `cancelled`
10
+ * (规范要求:客户端取消回合后必须以 cancelled 回答挂起的请求)。
11
+ */
12
+ import { type AcpAgentCapabilities, type AcpContentBlock, type AcpImplementationInfo, type AcpInitializeResult, type AcpListSessionsResult, type AcpLoadSessionResult, type AcpNewSessionResult, type AcpPromptResult, type AcpRequestPermissionParams, type AcpRequestPermissionResult, type AcpSessionNotification } from "./types.js";
13
+ export interface AcpClientHandlers {
14
+ onUpdate?(notification: AcpSessionNotification): void;
15
+ /** `signal`:该会话被 cancel、连接关闭时 abort(此时应尽快回 cancelled)。 */
16
+ onPermission?(params: AcpRequestPermissionParams, signal: AbortSignal): Promise<AcpRequestPermissionResult>;
17
+ onProtocolError?(line: string, reason: string): void;
18
+ onClose?(): void;
19
+ }
20
+ export interface AcpClientOptions extends AcpClientHandlers {
21
+ input: NodeJS.ReadableStream;
22
+ output: NodeJS.WritableStream;
23
+ clientInfo?: AcpImplementationInfo;
24
+ }
25
+ /** 无人值守的回答:首个 reject_once,没有就 cancelled。 */
26
+ export declare function unattendedOutcome(params: AcpRequestPermissionParams): AcpRequestPermissionResult;
27
+ export declare class AcpClient {
28
+ private readonly options;
29
+ private readonly peer;
30
+ /** sessionId → 挂起权限请求的取消器。 */
31
+ private readonly pendingPermissions;
32
+ private initResult;
33
+ constructor(options: AcpClientOptions);
34
+ get closed(): Promise<void>;
35
+ get isOpen(): boolean;
36
+ get agentCapabilities(): AcpAgentCapabilities;
37
+ get agentInfo(): AcpImplementationInfo | undefined;
38
+ initialize(signal?: AbortSignal): Promise<AcpInitializeResult>;
39
+ supportsResume(): boolean;
40
+ supportsLoad(): boolean;
41
+ supportsList(): boolean;
42
+ supportsClose(): boolean;
43
+ supportsImages(): boolean;
44
+ newSession(cwd: string, signal?: AbortSignal): Promise<AcpNewSessionResult>;
45
+ /** 不回放历史(优先,R13:v2 计划取消 load)。 */
46
+ resumeSession(sessionId: string, cwd: string, signal?: AbortSignal): Promise<AcpLoadSessionResult>;
47
+ /** 回放历史(以 session/update 通知)。 */
48
+ loadSession(sessionId: string, cwd: string, signal?: AbortSignal): Promise<AcpLoadSessionResult>;
49
+ listSessions(cwd?: string, cursor?: string): Promise<AcpListSessionsResult>;
50
+ closeSession(sessionId: string): Promise<unknown>;
51
+ prompt(sessionId: string, prompt: AcpContentBlock[], signal?: AbortSignal): Promise<AcpPromptResult>;
52
+ setMode(sessionId: string, modeId: string): Promise<unknown>;
53
+ /** 协议级取消:发通知,并让挂起的权限请求回 cancelled。 */
54
+ cancel(sessionId: string): Promise<void>;
55
+ close(): void;
56
+ private onRequest;
57
+ }