@armadra/agent 0.4.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 (422) hide show
  1. package/CHANGELOG.md +174 -1
  2. package/README.md +201 -82
  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 +36203 -20499
  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/codemode-notice.d.ts +3 -2
  134. package/dist/cli/codemode-notice.js +3 -2
  135. package/dist/cli/compose-agents.d.ts +27 -0
  136. package/dist/cli/compose-agents.js +111 -0
  137. package/dist/cli/compose-extensions.d.ts +29 -0
  138. package/dist/cli/compose-extensions.js +44 -0
  139. package/dist/cli/compose-session.d.ts +3 -0
  140. package/dist/cli/compose-session.js +47 -4
  141. package/dist/cli/compose.d.ts +3 -0
  142. package/dist/cli/compose.js +33 -6
  143. package/dist/cli/deps.d.ts +6 -0
  144. package/dist/cli/exit-codes.d.ts +10 -0
  145. package/dist/cli/exit-codes.js +12 -0
  146. package/dist/cli/help-text.d.ts +4 -0
  147. package/dist/cli/help-text.js +102 -0
  148. package/dist/cli/startup-screen.js +5 -3
  149. package/dist/cli/startup-steps.js +7 -1
  150. package/dist/cli/subcommands/config.d.ts +4 -1
  151. package/dist/cli/subcommands/config.js +17 -6
  152. package/dist/cli/subcommands/doctor.js +21 -0
  153. package/dist/cli/subcommands/models-discover.js +5 -6
  154. package/dist/cli/subcommands/models.d.ts +2 -0
  155. package/dist/cli/subcommands/models.js +33 -14
  156. package/dist/cli/subcommands/providers.js +5 -6
  157. package/dist/cli/subcommands/sessions.d.ts +3 -1
  158. package/dist/cli/subcommands/sessions.js +36 -2
  159. package/dist/codemode/capability.d.ts +24 -7
  160. package/dist/codemode/capability.js +38 -10
  161. package/dist/codemode/host-side.d.ts +14 -0
  162. package/dist/codemode/host-side.js +24 -1
  163. package/dist/codemode/tool.d.ts +1 -1
  164. package/dist/codemode/tool.js +6 -4
  165. package/dist/compaction/breaker.d.ts +25 -9
  166. package/dist/compaction/breaker.js +47 -17
  167. package/dist/compaction/estimate.d.ts +11 -3
  168. package/dist/compaction/estimate.js +64 -22
  169. package/dist/compaction/image-budget.d.ts +45 -0
  170. package/dist/compaction/image-budget.js +115 -0
  171. package/dist/compaction/post-compact.d.ts +38 -0
  172. package/dist/compaction/post-compact.js +152 -0
  173. package/dist/compaction/protect.d.ts +27 -0
  174. package/dist/compaction/protect.js +56 -0
  175. package/dist/compaction/prune-tier.d.ts +58 -12
  176. package/dist/compaction/prune-tier.js +120 -54
  177. package/dist/compaction/summarize-tier.d.ts +23 -4
  178. package/dist/compaction/summarize-tier.js +100 -29
  179. package/dist/config/checker.d.ts +28 -0
  180. package/dist/config/checker.js +97 -0
  181. package/dist/config/json-schema.js +63 -2
  182. package/dist/config/key-docs.js +72 -3
  183. package/dist/config/merge.d.ts +5 -3
  184. package/dist/config/merge.js +81 -7
  185. package/dist/config/profile.d.ts +2 -0
  186. package/dist/config/profile.js +2 -0
  187. package/dist/config/schema-w5.d.ts +18 -0
  188. package/dist/config/schema-w5.js +109 -0
  189. package/dist/config/schema.d.ts +5 -9
  190. package/dist/config/schema.js +68 -114
  191. package/dist/config/types-w5.d.ts +118 -0
  192. package/dist/config/types-w5.js +20 -0
  193. package/dist/config/types.d.ts +50 -1
  194. package/dist/config/types.js +12 -0
  195. package/dist/drivers/acp/client.d.ts +57 -0
  196. package/dist/drivers/acp/client.js +160 -0
  197. package/dist/drivers/acp/driver.d.ts +31 -0
  198. package/dist/drivers/acp/driver.js +274 -0
  199. package/dist/drivers/acp/testing/fake-agent-main.d.ts +5 -0
  200. package/dist/drivers/acp/testing/fake-agent-main.js +7 -0
  201. package/dist/drivers/acp/testing/fake-agent.d.ts +27 -0
  202. package/dist/drivers/acp/testing/fake-agent.js +211 -0
  203. package/dist/drivers/acp/types.d.ts +285 -0
  204. package/dist/drivers/acp/types.js +36 -0
  205. package/dist/drivers/agents.d.ts +58 -0
  206. package/dist/drivers/agents.js +142 -0
  207. package/dist/drivers/base.d.ts +35 -0
  208. package/dist/drivers/base.js +59 -0
  209. package/dist/drivers/catalog.d.ts +46 -0
  210. package/dist/drivers/catalog.js +167 -0
  211. package/dist/drivers/env.d.ts +20 -0
  212. package/dist/drivers/env.js +46 -0
  213. package/dist/drivers/host-runners.d.ts +18 -0
  214. package/dist/drivers/host-runners.js +45 -0
  215. package/dist/drivers/jsonrpc.d.ts +58 -0
  216. package/dist/drivers/jsonrpc.js +180 -0
  217. package/dist/drivers/native/claude-normalize.d.ts +46 -0
  218. package/dist/drivers/native/claude-normalize.js +106 -0
  219. package/dist/drivers/native/claude-stream.d.ts +29 -0
  220. package/dist/drivers/native/claude-stream.js +456 -0
  221. package/dist/drivers/native/codex-app-server.d.ts +26 -0
  222. package/dist/drivers/native/codex-app-server.js +407 -0
  223. package/dist/drivers/native/codex-normalize.d.ts +38 -0
  224. package/dist/drivers/native/codex-normalize.js +124 -0
  225. package/dist/drivers/native/oneshot.d.ts +28 -0
  226. package/dist/drivers/native/oneshot.js +312 -0
  227. package/dist/drivers/permissions.d.ts +40 -0
  228. package/dist/drivers/permissions.js +92 -0
  229. package/dist/drivers/pids.d.ts +32 -0
  230. package/dist/drivers/pids.js +93 -0
  231. package/dist/drivers/pool.d.ts +28 -0
  232. package/dist/drivers/pool.js +96 -0
  233. package/dist/drivers/probe.d.ts +47 -0
  234. package/dist/drivers/probe.js +172 -0
  235. package/dist/drivers/process.d.ts +48 -0
  236. package/dist/drivers/process.js +100 -0
  237. package/dist/drivers/runner.d.ts +61 -0
  238. package/dist/drivers/runner.js +388 -0
  239. package/dist/drivers/store.d.ts +49 -0
  240. package/dist/drivers/store.js +91 -0
  241. package/dist/drivers/turn.d.ts +41 -0
  242. package/dist/drivers/turn.js +99 -0
  243. package/dist/drivers/types.d.ts +122 -0
  244. package/dist/drivers/types.js +11 -0
  245. package/dist/git/info.d.ts +75 -0
  246. package/dist/git/info.js +191 -0
  247. package/dist/hooks/protocol.js +6 -1
  248. package/dist/hooks/types.d.ts +10 -1
  249. package/dist/hooks/types.js +2 -0
  250. package/dist/host/api-impl.d.ts +7 -0
  251. package/dist/host/api-impl.js +15 -0
  252. package/dist/host/types.d.ts +24 -2
  253. package/dist/host/types.js +4 -0
  254. package/dist/index.d.ts +3 -0
  255. package/dist/index.js +1 -0
  256. package/dist/modes/acp/acp-events.d.ts +46 -0
  257. package/dist/modes/acp/acp-events.js +233 -0
  258. package/dist/modes/acp/acp-mode.d.ts +17 -0
  259. package/dist/modes/acp/acp-mode.js +47 -0
  260. package/dist/modes/acp/acp-server.d.ts +79 -0
  261. package/dist/modes/acp/acp-server.js +315 -0
  262. package/dist/modes/commands-core.d.ts +7 -1
  263. package/dist/modes/commands-core.js +55 -0
  264. package/dist/modes/image-input.d.ts +12 -4
  265. package/dist/modes/image-input.js +22 -5
  266. package/dist/modes/interactive/agent-panels.d.ts +14 -0
  267. package/dist/modes/interactive/agent-panels.js +103 -0
  268. package/dist/modes/interactive/agent-ui.d.ts +73 -0
  269. package/dist/modes/interactive/agent-ui.js +234 -0
  270. package/dist/modes/interactive/approval-dialog.d.ts +21 -4
  271. package/dist/modes/interactive/approval-dialog.js +98 -20
  272. package/dist/modes/interactive/approval-merge.d.ts +41 -0
  273. package/dist/modes/interactive/approval-merge.js +89 -0
  274. package/dist/modes/interactive/clipboard-paste.d.ts +18 -0
  275. package/dist/modes/interactive/clipboard-paste.js +28 -0
  276. package/dist/modes/interactive/commands.d.ts +9 -1
  277. package/dist/modes/interactive/commands.js +19 -0
  278. package/dist/modes/interactive/double-esc.d.ts +20 -0
  279. package/dist/modes/interactive/double-esc.js +34 -0
  280. package/dist/modes/interactive/event-notices.d.ts +32 -0
  281. package/dist/modes/interactive/event-notices.js +79 -0
  282. package/dist/modes/interactive/external-editor.d.ts +16 -0
  283. package/dist/modes/interactive/external-editor.js +39 -0
  284. package/dist/modes/interactive/interactive-mode.d.ts +14 -1
  285. package/dist/modes/interactive/interactive-mode.js +134 -136
  286. package/dist/modes/interactive/key-dispatch.d.ts +16 -2
  287. package/dist/modes/interactive/key-dispatch.js +49 -1
  288. package/dist/modes/interactive/line/line-mode.d.ts +2 -1
  289. package/dist/modes/interactive/line/line-mode.js +22 -5
  290. package/dist/modes/interactive/line/line-render.d.ts +2 -1
  291. package/dist/modes/interactive/line/line-render.js +40 -4
  292. package/dist/modes/interactive/message-view.d.ts +1 -1
  293. package/dist/modes/interactive/message-view.js +24 -2
  294. package/dist/modes/interactive/panels.d.ts +18 -1
  295. package/dist/modes/interactive/panels.js +19 -5
  296. package/dist/modes/interactive/plan-command.d.ts +40 -0
  297. package/dist/modes/interactive/plan-command.js +129 -0
  298. package/dist/modes/interactive/plan-dialog.d.ts +98 -0
  299. package/dist/modes/interactive/plan-dialog.js +290 -0
  300. package/dist/modes/interactive/plan-flow.d.ts +34 -0
  301. package/dist/modes/interactive/plan-flow.js +98 -0
  302. package/dist/modes/interactive/rewind-command.d.ts +31 -0
  303. package/dist/modes/interactive/rewind-command.js +106 -0
  304. package/dist/modes/interactive/rewind-flow.d.ts +37 -0
  305. package/dist/modes/interactive/rewind-flow.js +151 -0
  306. package/dist/modes/interactive/rewind-list.d.ts +36 -0
  307. package/dist/modes/interactive/rewind-list.js +123 -0
  308. package/dist/modes/interactive/rewind-panel.d.ts +77 -0
  309. package/dist/modes/interactive/rewind-panel.js +309 -0
  310. package/dist/modes/interactive/rewind-text.d.ts +40 -0
  311. package/dist/modes/interactive/rewind-text.js +139 -0
  312. package/dist/modes/interactive/session-events.d.ts +24 -0
  313. package/dist/modes/interactive/session-events.js +96 -0
  314. package/dist/modes/interactive/status-area.d.ts +73 -0
  315. package/dist/modes/interactive/status-area.js +190 -0
  316. package/dist/modes/interactive/status-bar.d.ts +99 -11
  317. package/dist/modes/interactive/status-bar.js +273 -90
  318. package/dist/modes/interactive/status-line.d.ts +33 -0
  319. package/dist/modes/interactive/status-line.js +113 -0
  320. package/dist/modes/interactive/subagent-view.d.ts +56 -0
  321. package/dist/modes/interactive/subagent-view.js +154 -0
  322. package/dist/modes/interactive/tasks-report.d.ts +27 -0
  323. package/dist/modes/interactive/tasks-report.js +114 -0
  324. package/dist/modes/interactive/tool-view.d.ts +12 -2
  325. package/dist/modes/interactive/tool-view.js +34 -4
  326. package/dist/modes/print/print-mode.d.ts +13 -4
  327. package/dist/modes/print/print-mode.js +56 -12
  328. package/dist/modes/rpc/commands.d.ts +9 -0
  329. package/dist/modes/rpc/commands.js +44 -0
  330. package/dist/modes/rpc/rpc-mode.js +7 -1
  331. package/dist/modes/session-report.d.ts +11 -0
  332. package/dist/modes/session-report.js +48 -1
  333. package/dist/permissions/auto-safe.d.ts +5 -0
  334. package/dist/permissions/auto-safe.js +18 -0
  335. package/dist/permissions/classifier.d.ts +4 -0
  336. package/dist/permissions/classifier.js +2 -0
  337. package/dist/permissions/modes.js +1 -1
  338. package/dist/permissions/pipeline.d.ts +43 -4
  339. package/dist/permissions/pipeline.js +114 -9
  340. package/dist/permissions/readonly-bash.d.ts +30 -0
  341. package/dist/permissions/readonly-bash.js +118 -0
  342. package/dist/permissions/types.d.ts +42 -0
  343. package/dist/plan/compose.d.ts +9 -0
  344. package/dist/plan/compose.js +19 -0
  345. package/dist/plan/controller.d.ts +71 -0
  346. package/dist/plan/controller.js +27 -0
  347. package/dist/plan/done-markers.d.ts +17 -0
  348. package/dist/plan/done-markers.js +51 -0
  349. package/dist/plan/extract.d.ts +29 -0
  350. package/dist/plan/extract.js +160 -0
  351. package/dist/plan/prompts.d.ts +36 -0
  352. package/dist/plan/prompts.js +89 -0
  353. package/dist/plan/store.d.ts +37 -0
  354. package/dist/plan/store.js +90 -0
  355. package/dist/rpc.d.ts +58 -2
  356. package/dist/rpc.js +7 -0
  357. package/dist/sandbox/bash.d.ts +74 -0
  358. package/dist/sandbox/bash.js +126 -0
  359. package/dist/sandbox/detect.d.ts +48 -0
  360. package/dist/sandbox/detect.js +149 -0
  361. package/dist/sandbox/index.d.ts +5 -0
  362. package/dist/sandbox/index.js +5 -0
  363. package/dist/sandbox/profile.d.ts +33 -0
  364. package/dist/sandbox/profile.js +76 -0
  365. package/dist/sandbox/wrap.d.ts +29 -0
  366. package/dist/sandbox/wrap.js +117 -0
  367. package/dist/sdk.d.ts +33 -2
  368. package/dist/sdk.js +24 -2
  369. package/dist/session/types.d.ts +3 -1
  370. package/dist/session/types.js +1 -0
  371. package/dist/skills/builtin.d.ts +31 -0
  372. package/dist/skills/builtin.js +109 -0
  373. package/dist/skills/discover.d.ts +2 -1
  374. package/dist/skills/index-prompt.js +5 -8
  375. package/dist/tools/background-jobs.d.ts +71 -0
  376. package/dist/tools/background-jobs.js +198 -0
  377. package/dist/tools/bash.d.ts +53 -1
  378. package/dist/tools/bash.js +158 -7
  379. package/dist/tools/clipboard-image.d.ts +44 -0
  380. package/dist/tools/clipboard-image.js +148 -0
  381. package/dist/tools/edit.d.ts +2 -0
  382. package/dist/tools/edit.js +18 -3
  383. package/dist/tools/image-file.d.ts +38 -3
  384. package/dist/tools/image-file.js +81 -10
  385. package/dist/tools/image-resize.d.ts +58 -0
  386. package/dist/tools/image-resize.js +97 -0
  387. package/dist/tools/presets.d.ts +7 -2
  388. package/dist/tools/presets.js +11 -4
  389. package/dist/tools/read.d.ts +5 -2
  390. package/dist/tools/read.js +13 -10
  391. package/dist/tools/registry.d.ts +7 -1
  392. package/dist/tools/registry.js +27 -4
  393. package/dist/tools/task-ctl.d.ts +22 -0
  394. package/dist/tools/task-ctl.js +116 -0
  395. package/dist/tools/task.d.ts +22 -10
  396. package/dist/tools/task.js +66 -26
  397. package/dist/tools/todo.d.ts +22 -2
  398. package/dist/tools/todo.js +58 -14
  399. package/dist/tools/truncate.d.ts +15 -0
  400. package/dist/tools/truncate.js +25 -0
  401. package/dist/tools/types.d.ts +113 -0
  402. package/dist/tools/types.js +5 -0
  403. package/dist/tools/write.js +3 -0
  404. package/dist/tui/glyphs.d.ts +4 -0
  405. package/dist/tui/glyphs.js +4 -0
  406. package/dist/tui/keybindings.d.ts +5 -0
  407. package/dist/tui/keybindings.js +5 -0
  408. package/docs/acp.md +78 -0
  409. package/docs/agents.md +250 -0
  410. package/docs/codemode.md +12 -8
  411. package/docs/hooks.md +26 -22
  412. package/docs/permissions.md +77 -13
  413. package/docs/plan.md +107 -0
  414. package/docs/providers.md +228 -52
  415. package/docs/rewind-plan.md +181 -0
  416. package/docs/rpc.md +92 -5
  417. package/docs/sandbox.md +215 -0
  418. package/docs/session-format.md +41 -21
  419. package/docs/sessions.md +41 -1
  420. package/docs/tui-design.md +751 -0
  421. package/docs/tui.md +125 -6
  422. package/package.json +13 -2
@@ -4,14 +4,14 @@
4
4
 
5
5
  ## 模式
6
6
 
7
- | 值 | 显示名 | 读 | 写(项目内) | 执行(bash 等) | 何时用 |
8
- | ----------- | ------------------ | --- | --------------------------- | ------------------------------ | -------------------------------- |
9
- | `default` | Manual | ✓ | 询问 | 询问 | 缺省 |
10
- | `auto-edit` | Accept edits | ✓ | ✓ | 询问 | 放心让它改代码,命令逐条看 |
11
- | `plan` | Plan | ✓ | 拒绝 | 拒绝 | 只读调研、出方案 |
12
- | `auto` | Auto | ✓ | ✓(受保护路径与项目外询问) | 安全名单放行,其余由分类器判断 | 推荐:常规操作不打扰,有风险才问 |
13
- | `full-auto` | Bypass permissions | ✓ | ✓ | ✓ | 一次性沙箱、容器 |
14
- | `allowlist` | Allowlist only | ✓ | 只放行 allow 规则命中的 | 只放行 allow 规则命中的 | CI:从不询问,没列出的直接拒绝 |
7
+ | 值 | 显示名 | 读 | 写(项目内) | 执行(bash 等) | 何时用 |
8
+ | ----------- | ------------------ | --- | --------------------------- | ------------------------------- | -------------------------------------------- |
9
+ | `default` | Manual | ✓ | 询问 | 询问 | 缺省 |
10
+ | `auto-edit` | Accept edits | ✓ | ✓ | 询问 | 放心让它改代码,命令逐条看 |
11
+ | `plan` | Plan | ✓ | 拒绝 | 只读命令放行,其余拒绝 | 只读调研、出计划并审批([plan.md](plan.md)) |
12
+ | `auto` | Auto | ✓ | ✓(受保护路径与项目外询问) | 安全名单放行,其余由分类器判断 | 推荐:常规操作不打扰,有风险才问 |
13
+ | `full-auto` | Bypass permissions | ✓ | ✓ | ✓ | 一次性沙箱、容器 |
14
+ | `allowlist` | Allowlist only | ✓ | 只放行 allow 规则命中的 | 只读命令与 allow 规则命中的放行 | CI:从不询问,没列出的直接拒绝 |
15
15
 
16
16
  所有模式下,deny 规则、Hook deny 都先判定并直接拒绝;危险命令表(`rm -rf /`、`git push --force`、`curl … | sh` 等,见 README「安全」)一律询问,`allowlist` 与无人值守时变为拒绝。
17
17
 
@@ -21,7 +21,9 @@
21
21
 
22
22
  严格度从严到宽:`plan < allowlist < default < auto-edit < auto < full-auto`。项目级 `.ama/config.json` 只能把模式往严的方向改;另外**不能设 `auto` 或 `full-auto`**(这两种由 ama 自己或什么都不判断就放行,必须由用户级配置、命令行或 profile 打开),设了会被忽略并给 warning。
23
23
 
24
- `allowlist` 排在 `plan` 与 `default` 之间:它放行的调用是 `plan` 放行的(只读工具)加上 allow 规则明确列出的;`default` 放行的集合包含它(只读 + allow 规则),其余在 `default` 下询问、在 `allowlist` 下拒绝。所以 `plan ⊆ allowlist ⊆ default`。读工具在 `allowlist` 下照常放行,与其它模式一致;要连读都限制,用 deny 规则。
24
+ `allowlist` 排在 `plan` 与 `default` 之间:它放行的调用是 `plan` 放行的(只读工具、[只读命令](#plan-模式与只读命令)、`task`)加上 allow 规则明确列出的;`default` 放行的集合包含它(只读 + allow 规则),其余在 `default` 下询问、在 `allowlist` 下拒绝。所以 `plan ⊆ allowlist ⊆ default`。读工具在 `allowlist` 下照常放行,与其它模式一致;要连读都限制,用 deny 规则。
25
+
26
+ 只读命令是一张静态名单(下一节),`plan` 与 `allowlist` 用同一张,严格度的全序因此不变;CI 里用 `allowlist` 多放行 `ls`、`git log` 这类命令无害。`task` 在两种模式下都放行:子会话共用同一条权限管线,子 Agent 能做的不会比父会话多。`plan.bash: "ask"` 时 plan 会对名单外的命令询问(`allowlist` 从不询问),「不经询问就放行」的集合仍满足上面的包含关系。
25
27
 
26
28
  ### 界面
27
29
 
@@ -29,6 +31,42 @@
29
31
  - `/permission` 不带参数打开选择器:标题 `Mode`,每项「显示名 + 一行说明」,右侧是数字快捷键 1–6,当前模式打勾,配置里的缺省模式标 `Default`,Auto 标 `Recommended`。line 模式 `/permission` 打印同样的列表。
30
32
  - `Shift+Tab` 循环:Manual → Accept edits → Plan → Auto → Bypass permissions → Manual。`Allowlist only` 不在循环里,只能显式选。
31
33
 
34
+ ### 审批对话框的来源标注
35
+
36
+ 审批不只来自主会话。对话框(以及 RPC `permission_request.context`)标出请求从哪来,选项都只有「允许 / 本会话允许同类 / 拒绝」:
37
+
38
+ | 来源 | 标题前缀 | 正文 | 谁来判定 |
39
+ | ------------------------------------------ | ----------------------------------------- | --------------------------------------------- | -------------------------------------------------------------------------- |
40
+ | `task` 子 Agent 的工具调用 | `[task:explore]`(查不到类型时 `[task]`) | 同主会话 | 同一条权限管线;只读类型(`explore` / `plan`)按 plan 判定、不弹审批 |
41
+ | 外部 Agent(claude / codex / ACP)请求权限 | `[claude · 会话 abc12345]` | 外部 Agent 给的标题、种类、涉及路径与输入摘要 | 只交给人:宿主 → 界面 → 无人值守拒绝,auto 分类器与模型不参与 |
42
+ | 外部 Agent 本会话首次运行 | 标题「首次运行外部 Agent」 | 说明(以你在该 CLI 的登录运行)与模式 | allow / deny 规则 `task(<id>)`、`full-auto` 放行,其余交给人(不经分类器) |
43
+
44
+ 外部 Agent 的「本会话允许」由它自己记住。Manual 模式下 `task(agent=…)` 的 task 调用审批与首次运行确认合并为一次(见 [agents.md](agents.md)「在 task 里使用」)。RPC 的 `context` 是 `{ depth, taskId, origin }`([rpc.md](rpc.md)「审批」)。
45
+
46
+ ## plan 模式与只读命令
47
+
48
+ plan 模式的第 ③ 步看输入(实现 `src/permissions/pipeline.ts` 的 `planDecision`),流程与计划审批见 [plan.md](plan.md):
49
+
50
+ | 调用 | plan 下 |
51
+ | ------------------------- | ------------------------------------------------------------------------------------------------------------------------ |
52
+ | read / grep / glob / ls | 放行 |
53
+ | `todo` | `get` 放行;`set` / `update` 拒绝,提示把步骤写进 `<proposed_plan>`(清单在批准时由计划生成) |
54
+ | bash | 按 `plan.bash`:`readonly`(缺省)只读命令放行、其余拒绝;`ask` 其余询问(无人值守拒绝);`deny` 全部拒绝 |
55
+ | write / edit 等 | 拒绝,说明带指引:`Plan mode is active: write/execute tools are disabled. Finish the plan with a <proposed_plan> block.` |
56
+ | task | 放行(子会话共用同一管线,同样处在 plan;子会话不提取计划块) |
57
+ | deny 规则、危险命令、Hook | 先于模式判定(不变) |
58
+
59
+ 只读命令(`src/permissions/readonly-bash.ts`):先过 auto 的静态判定(分词、嵌套展开、网络 / 删除 / 写入目标 / 机密路径、命令替换、变量展开、点文件通配),再要求每段都在下面的名单里、没有输出重定向(`/dev/null` 除外)、没有嵌套 shell(`sh -c`、`eval`、`xargs`、`find -exec`)与进程替换、段首没有环境赋值或包装命令(`GIT_EXTERNAL_DIFF=… git diff`、`env …`)。
60
+
61
+ | 命令 | 限制 |
62
+ | ------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------ |
63
+ | `ls cat head tail wc stat echo printf pwd which du basename dirname realpath true false cd` | — |
64
+ | `grep egrep fgrep`、`rg`、`fd`、`find` | `rg --pre`、`fd -x / -X / --exec*`、`find -exec / -ok / -delete / -fprint*` 不算 |
65
+ | `tree`、`file`、`jq` | `tree -o`、`file -C`、`jq -i` 不算 |
66
+ | `git status / log / show / diff / rev-parse / blame / ls-files / branch` | git 全局选项只允许 `-C`、`--no-pager`;`--output`、`--ext-diff`、`--textconv` 与改分支的选项不算 |
67
+
68
+ 比 auto 的安全名单窄:不含测试 / 构建运行器(`npm test`、`cargo build` 会执行项目脚本),也不含 `env` / `printenv`(会把环境变量里的密钥打进上下文)。读机密路径(`cat .env`)不算只读。
69
+
32
70
  ## 判定顺序
33
71
 
34
72
  一次工具调用(模型直接发起或 codemode / task 里嵌套发起都一样):
@@ -44,10 +82,14 @@ schema 校验
44
82
  Hook ask → 询问
45
83
  allow 规则、Hook allow、本会话记忆 → 放行
46
84
  ② 模式
47
- plan / default / auto-edit / full-auto:同以前的模式真值表
48
- allowlist:只读工具放行,其余拒绝(不在允许名单)
49
- auto:静态判定(不调模型)→ 放行;未决定 → ③
50
- ③ [auto] 模型分类器:allow → 放行;ask / 出错 / 超时 → 询问
85
+ plan:只读工具、只读命令、task 放行,其余拒绝(plan.bash: ask 时其余命令询问)
86
+ default / auto-edit / full-auto:同以前的模式真值表
87
+ [default / auto-edit] 模式要询问的 bash:allow 规则 / Hook allow / 会话记忆之外,
88
+ 沙箱内免审批(见下)→ 放行;Hook ask 仍把结论改回询问
89
+ allowlist:只读工具、只读命令、task 放行,其余拒绝(不在允许名单)
90
+ auto:[沙箱生效时] 请求 sandbox:false 越出沙箱 → 询问(allow 规则 / Hook allow / 会话记忆之后)
91
+ 静态判定(不调模型)→ 放行;未决定 → ③
92
+ ③ [auto] 模型分类器(沙箱内的 bash 附 os_sandbox 输入):allow → 放行;ask / 出错 / 超时 → 询问
51
93
  → 询问时走审批链(宿主 broker → 界面 → 无人值守按拒绝)
52
94
  ```
53
95
 
@@ -55,6 +97,28 @@ schema 校验
55
97
  - `allowlist` 从不询问:凡是会询问的(危险命令、Hook ask)一律拒绝,拒绝说明写「不在允许名单」。
56
98
  - 无人值守(`-p`、RPC 未接审批)时,询问一律按拒绝;auto 模式下分类器仍会先跑,判 allow 的照样执行。
57
99
 
100
+ ### 沙箱内命令免审批
101
+
102
+ `sandbox.bash: auto` 且本机有能限制写入的 OS 沙箱时([sandbox.md](sandbox.md)「第二阶段」),bash 经沙箱运行。
103
+ default / auto-edit 下,满足下面全部条件的 bash 调用免审批(`PermissionVerdict.sandboxed: true`):
104
+
105
+ 1. 将在沙箱内运行:没有 `sandbox: false`;
106
+ 2. `sandbox.network: deny`(联网可外带数据,`allow` 时照常询问);
107
+ 3. 命令文本(含 `sh -c`、`eval`、`xargs`、`find -exec` 里的嵌套命令)不碰机密路径(`cat .env`、`~/.ssh/…`),嵌套不超深;
108
+ 4. 前面没被 deny 规则、Hook deny 拒绝,不在危险命令表里(`rm -rf` 工作区外路径、`git push --force`、`git reset --hard`
109
+ 等照常询问),之后也没有 Hook ask。
110
+
111
+ | 模式 | 沙箱内的 bash | `sandbox: false`(越出沙箱) |
112
+ | ------------------ | ---------------------------------------------------- | ---------------------------------------------------- |
113
+ | default、auto-edit | 满足上面条件即放行,否则询问 | 询问(allow 规则、Hook allow、会话记忆可放行) |
114
+ | auto | 规则层与静态判定照旧;分类器多一项 `os_sandbox` 输入 | 规则层询问(allow 规则、Hook allow、会话记忆可放行) |
115
+ | plan、allowlist | 不变 | 不变 |
116
+ | full-auto | 放行 | 放行 |
117
+
118
+ 无人值守时「询问」一律拒绝,所以 `-p` 里越出沙箱的调用被拒。auto 不直接放行沙箱内的命令:它的规则层(网络、
119
+ 删除、受保护路径、项目外写入)是有意比 default 更细的防线,分类器仍是最后一关;代价是 default + 沙箱放行的一些
120
+ 命令(工作区里的 `rm -r dist`)在 auto 下仍会询问。
121
+
58
122
  ## auto 的三层
59
123
 
60
124
  ### ① 规则层
package/docs/plan.md ADDED
@@ -0,0 +1,107 @@
1
+ # Plan 模式
2
+
3
+ plan 模式让 ama 先只读调研、写出一份结构化的计划,经人批准后再切回执行模式按计划推进。本文写流程、计划格式、审批的几种入口、配置与持久化;权限细节见 [permissions.md](permissions.md)「plan 模式与只读命令」,设计依据见 [wave5-plan.md](wave5-plan.md) §6。
4
+
5
+ ## 流程
6
+
7
+ ```text
8
+ 进入 plan(Shift+Tab / /permission / --permission-mode plan / RPC set_permission_mode / SDK)
9
+ 记下进入前的模式(prePlanMode),会话里落 ama.plan_state{active:true}
10
+ 只读探索:read / grep / glob / ls、只读命令、task 子 Agent(同样处在 plan)
11
+ 每个提示之后追加模式说明 ama.plan_mode(第 1 个完整版,之后每 5 个提示一次简版,每第 5 次与压缩后完整版)
12
+ 模型输出 <proposed_plan> 块
13
+ 回合以纯文本结束时提取 → 落 ama.plan{status:"proposed"} 与计划文件 → 事件 plan_proposed
14
+ 审批:批准并执行 / 指定模式执行 / 在新上下文执行 / 继续修改 / 放弃
15
+ 交接:步骤写成 todo(首项 in_progress)→ 切回执行模式 → 新回合带上 ama.plan_approved(计划全文 + 文件路径)
16
+ ```
17
+
18
+ - **模式说明只追加在尾部**:说明以 `custom_message`(`display: false`)跟在用户消息之后,投影成 user 消息,不改系统提示和工具表,进入 / 退出 plan 前后缓存前缀逐字节不变。没有 enter / exit 之类的工具。
19
+ - 手动退出 plan(没有批准计划)时,下一个提示后追加 `ama.plan_mode_exit`,告诉模型只读限制已解除。
20
+ - 在 plan 里被拒的写 / 执行调用,拒绝说明自带指引(`Finish the plan with a <proposed_plan> block`),说明被压缩掉后模型也能恢复。
21
+ - `todo` 在 plan 下只能 `get`:清单由批准的计划生成,避免模型用 todo 代替计划、跳过审批。
22
+ - 只有根会话提取计划;`task` 子会话里的计划块作为 task 结果文本返回给父会话。
23
+
24
+ ## 计划格式
25
+
26
+ ```markdown
27
+ <proposed_plan>
28
+
29
+ # <标题>
30
+
31
+ ## 背景
32
+
33
+ ## 步骤
34
+
35
+ - [ ] S1 <动作>(涉及:path/a.ts)
36
+ - [ ] S2 <动作> [depends: S1] [agent: codex]
37
+
38
+ ## 验证
39
+
40
+ ## 假设与风险
41
+
42
+ </proposed_plan>
43
+ ```
44
+
45
+ - 开、闭标签各占一行,不在代码围栏里;一条回复里有多个块取最后一个完整块,不闭合的块忽略。
46
+ - 步骤取 `- [ ] Sx` 清单;没有清单时取「步骤 / Steps」小节里的编号列表。`[depends: …]`、`[agent: …]` 解析成 `dependsOn`、`agent`(只是建议,派发仍按各自的授权)。最多 30 条,多出的截断并记 warning。解析不出步骤也能审批,只是不生成 todo。
47
+ - 弱模型不写标签时,可以把上一条回复当作计划提交审批(`PlanController.proposeFromLastReply()`,交互界面与 line 模式的 `/plan approve` 用它)。
48
+
49
+ ## 审批
50
+
51
+ 谁来回答取决于运行方式;**ama 不替人批准**:
52
+
53
+ | 运行方式 | 回答者 |
54
+ | ------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
55
+ | 交互(TUI) | 用户在底部审批框里选:批准并执行 / 批准,在新上下文执行(两者接着选执行模式:回到进入前的模式 / Accept edits / Auto)/ 继续修改(框内或外部编辑器写意见)/ 放弃并退出 Plan;`e` 在 `$VISUAL` / `$EDITOR` 里改计划,Esc 放弃但留在 Plan。见 [tui.md](tui.md)「Plan 审批」 |
56
+ | 交互(line,`--no-tui`) | `/plan approve [模式\|fresh]`、`/plan reject`;回复 `1` / `2` / `3` 也能批准(进入前的模式 / Accept edits / Auto),其它内容作为修改意见、留在 plan |
57
+ | RPC,声明了 `plans` 能力 | 客户端:`plan_proposed` → `plan_response`(见 [rpc.md](rpc.md)「计划审批」) |
58
+ | SDK,给了 `plan.onProposed` | 回调:运行结束后调用,返回 `{ decision, mode?, feedback?, editedMarkdown? }`;返回 undefined 留待 `session.plan.respond()` |
59
+ | `-p`、未声明能力的 RPC、无回调的 SDK | 配置 `plan.unattended`:`stop`(缺省)落盘计划后停下,不切模式、不执行;`approve` 在同一次运行里自动批准并执行 |
60
+
61
+ 四种决定:
62
+
63
+ - **approve**:计划标 approved;步骤写成 `ama.todo`(`planStep` 指回步骤 id,首项 in_progress);权限模式切到指定模式,缺省进入 plan 前的模式(进入前就是 plan 时用 Manual);配置了 `plan.model` 时切回执行模型;随后开新回合:用户消息 `The plan is approved. Go ahead.`(`origin: "plan"`)+ `ama.plan_approved`(计划全文、文件路径与进度记法,见下文「进度记法」)。line 模式下回复 `1` 本身就是这个回合的用户消息。
64
+ - **approve_fresh**:同样标 approved 并切模式,但执行放到新会话:首条用户消息是计划全文与文件路径,新会话里写 todo。RPC 由服务端新建会话;SDK 的 `respond()` 返回 `freshPrompt`,由调用方新建会话后 `planController(next).adopt(plan)` 再发它。上下文占用高或配置了 `plan.model` 时最划算(反正要重读)。
65
+ - **revise**:留在 plan;`feedback` 作为普通用户消息开回合,模型整份重写计划,新版本号 +1,旧版标 superseded。
66
+ - **reject**:计划标 rejected,留在 plan。交互界面的「放弃,退出 Plan 模式」在 reject 之后切回进入前的模式;审批框里按 Esc 是 reject 但留在 plan。
67
+
68
+ **进度记法**:活动工具集里有 `todo`(`tools.default: ["+todo"]`、`--tools …,todo`)时,交接消息请模型「按 todo 推进,每完成一步 todo update」;没有时(`default` 预设缺省不含 todo,见 D20 与 [docs/benchmarks/](https://github.com/Owlbay/armadra-agent/tree/main/docs/benchmarks))请模型每完成一步在回复里**单独一行**写 `[DONE:<步骤 id>]`(如 `[DONE:S1]`),ama 在回合结束时读这些标记:对应的计划待办标 done,没有进行中的项时下一个 pending 转 in_progress,照常落 `ama.todo`、发 `todo_updated`,界面与 RPC 的进度显示不受影响。「在新上下文执行」的首条消息用同样的规则。
69
+
70
+ 客户端改过的全文(`editedMarkdown`,界面里「在外部编辑器里改」)先落一份新版本,交接消息用改后的全文。
71
+
72
+ `-p` 在 `stop` 下停在「计划待审批」时:stderr 一行写明计划文件与审批办法,`--output-format json` 的结果带 `planPending{planId, version, filePath}`,退出码 **9**(计划已落盘、未执行;不复用 7「工具调用被拒」)。`approve` 下批准后照常执行,退出码按执行结果。
73
+
74
+ ## 规划 / 执行分模型
75
+
76
+ `plan.model`(`provider/model[@channel]`)与 `plan.thinkingLevel`:plan 下的**第一个提示**切到规划模型,**批准时**切回执行模型(手动退出后的下一个提示也切回)。只是经过 plan(Shift+Tab 循环)不会切。缺省不设。换模型后前缀缓存全部失效,下一次请求全价重读(记为 `cache_miss{model_changed}`),所以缺省关闭;搭配「在新上下文执行」最划算。切走的执行模型记在 `ama.plan_state` 里,resume 后批准仍能切回。
77
+
78
+ ## 配置
79
+
80
+ | 键 | 缺省 | 说明 |
81
+ | -------------------- | ------------------ | -------------------------------------------------------------------------------------------- |
82
+ | `plan.bash` | `readonly` | plan 下的 bash:`readonly` 只读命令放行其余拒绝,`ask` 其余询问,`deny` 全拒;项目级只能更严 |
83
+ | `plan.directory` | `<数据目录>/plans` | 计划文件目录;相对路径按项目根解析,必须在项目根之内,否则 warning 回落缺省;只认用户级 |
84
+ | `plan.unattended` | `stop` | 无人值守时 `stop` 停下等人审批,`approve` 自动批准执行;只认用户级 |
85
+ | `plan.model` | 不设 | 规划用模型 |
86
+ | `plan.thinkingLevel` | 不设 | 规划时的思考强度 |
87
+
88
+ ## 持久化
89
+
90
+ | 条目 | 内容 |
91
+ | ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------- |
92
+ | `custom{ama.plan}` | `PlanData`:`{ id, version, status, markdown, steps, sourceEntryId, filePath? }`;状态变化另记一条,同 id 取分支上最后一条 |
93
+ | `custom{ama.plan_state}` | `{ active, prePlanMode, planId?, executionModel?, executionThinking? }`:进入 / 退出 plan;resume 时据此回到 plan |
94
+ | `custom_message{ama.plan_mode}` | 模式说明(完整版或简版) |
95
+ | `custom_message{ama.plan_mode_exit}` | 手动退出 plan |
96
+ | `custom_message{ama.plan_approved}` | 交接消息(批准即说明 plan 已结束,不再另发 `ama.plan_mode_exit`) |
97
+ | `custom{ama.todo}` | 批准时由步骤生成的清单 |
98
+
99
+ 计划文件 `<目录>/<sessionId>-v<N>.md` 只是导出,由 ama 进程写,不经模型的工具调用,不受 plan 只读限制。版本号在会话内单调。
100
+
101
+ ## 接口
102
+
103
+ - RPC:命令 `plan_response` / `get_plan` / `get_todos`,能力 `plans`,事件 `plan_proposed` / `plan_resolved` / `todo_updated`,见 [rpc.md](rpc.md)。
104
+ - SDK:`createAgentSession({ plan: { bash?, directory?, unattended?, model?, thinkingLevel?, onProposed? } })`;返回的会话有 `session.plan.current()`、`session.plan.respond(response)`、`session.plan.todos()`。
105
+ - 进程内:`planController(session)`(`src/agent/session-plan.ts`)给界面用——`pending()`、`respond()`、`proposeFromLastReply()`、`adopt()`、`setAttendance()`。
106
+ - 交互界面:底部审批框(四个选项 + 执行模式、`e` 编辑计划、Esc 留在 Plan)、`/plan` 面板,`/plan <目标>` 进入 Plan 并发出目标,`/plan approve [模式|fresh]` / `/plan reject` 不开对话框直接作答;见 [tui.md](tui.md)「Plan 审批」。
107
+ - `-p`:`stop` 下退出码 9 与 `planPending`(见上文);要无人值守执行就在用户级配置写 `"plan": { "unattended": "approve" }`。