vgxness 1.20.4 → 1.20.6

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 (375) hide show
  1. package/dist/adapters/claude/agent-renderer.js +82 -0
  2. package/dist/{mcp → adapters/claude/install}/claude-code-agent-config.js +64 -9
  3. package/dist/{mcp → adapters/claude/install}/claude-code-config.js +28 -6
  4. package/dist/{mcp → adapters/claude/install}/claude-code-project-memory.js +35 -5
  5. package/dist/{mcp → adapters/claude/install}/claude-code-scope.js +12 -3
  6. package/dist/{mcp → adapters/claude/install}/claude-code-user-config.js +26 -5
  7. package/dist/{mcp → adapters/claude/install}/claude-code-user-memory.js +47 -7
  8. package/dist/{mcp → adapters/claude/install}/client-install-claude-code-contract.js +45 -8
  9. package/dist/{mcp → adapters/claude/install}/client-install-claude-code.js +98 -14
  10. package/dist/adapters/json/agent-renderer.js +104 -0
  11. package/dist/adapters/opencode/agent-renderer.js +113 -0
  12. package/dist/{mcp → adapters/opencode/install}/client-install-opencode-contract.js +2 -2
  13. package/dist/{mcp → adapters/opencode/install}/client-install-opencode.js +1 -1
  14. package/dist/{mcp → adapters/opencode/install}/opencode-default-agent-config.js +2 -2
  15. package/dist/{mcp → adapters/opencode/install}/opencode-handoff-preview.js +60 -7
  16. package/dist/{mcp → adapters/opencode/install}/opencode-visibility.js +1 -1
  17. package/dist/adapters/provider-renderer.js +6 -0
  18. package/dist/agents/agent-activation-service.js +1 -263
  19. package/dist/agents/agent-lookup-contexts.js +1 -28
  20. package/dist/agents/agent-registry-service.js +1 -81
  21. package/dist/agents/agent-resolver.js +1 -287
  22. package/dist/agents/agent-seed-service.js +1 -157
  23. package/dist/agents/agent-seed-upgrade-service.js +1 -231
  24. package/dist/agents/agent-selector-resolver.js +1 -28
  25. package/dist/agents/boot-upgrade.js +1 -59
  26. package/dist/agents/canonical-agent-manifest.js +1 -245
  27. package/dist/agents/canonical-agent-projection.js +1 -236
  28. package/dist/agents/manager-profile-overlay-service.js +1 -60
  29. package/dist/agents/profile-model-routing.js +1 -30
  30. package/dist/agents/renderers/claude-renderer.js +1 -82
  31. package/dist/agents/renderers/index.js +1 -14
  32. package/dist/agents/renderers/json-renderer.js +1 -104
  33. package/dist/agents/renderers/opencode-renderer.js +1 -113
  34. package/dist/agents/renderers/provider-adapter.js +1 -6
  35. package/dist/agents/repositories/agent-seed-history.js +1 -128
  36. package/dist/agents/repositories/agents.js +1 -200
  37. package/dist/agents/repositories/manager-profile-overlays.js +1 -90
  38. package/dist/agents/schema.js +1 -1
  39. package/dist/application/agents/agent-activation-service.js +261 -0
  40. package/dist/application/agents/agent-lookup-contexts.js +28 -0
  41. package/dist/application/agents/agent-registry-service.js +81 -0
  42. package/dist/application/agents/agent-resolver.js +287 -0
  43. package/dist/application/agents/agent-seed-service.js +157 -0
  44. package/dist/application/agents/agent-seed-upgrade-service.js +231 -0
  45. package/dist/application/agents/agent-selector-resolver.js +28 -0
  46. package/dist/application/agents/boot-upgrade.js +59 -0
  47. package/dist/application/agents/canonical-agent-projection.js +236 -0
  48. package/dist/application/agents/manager-profile-overlay-service.js +68 -0
  49. package/dist/application/agents/profile-model-routing.js +30 -0
  50. package/dist/application/agents/renderers/claude-renderer.js +1 -0
  51. package/dist/application/agents/renderers/index.js +14 -0
  52. package/dist/application/agents/renderers/json-renderer.js +1 -0
  53. package/dist/application/agents/renderers/opencode-renderer.js +1 -0
  54. package/dist/application/agents/renderers/provider-adapter.js +1 -0
  55. package/dist/application/memory/active-work-preview.js +75 -0
  56. package/dist/application/memory/agent-memory-capture-service.js +498 -0
  57. package/dist/application/memory/import/dry-run-planner.js +58 -0
  58. package/dist/application/memory/import/index.js +3 -0
  59. package/dist/application/memory/import/observation-writer.js +226 -0
  60. package/dist/application/memory/import/package.js +179 -0
  61. package/dist/application/memory/memory-service.js +202 -0
  62. package/dist/application/memory/search.js +11 -0
  63. package/dist/{mcp → application/provider-setup}/provider-change-plan.js +74 -13
  64. package/dist/{mcp → application/provider-setup}/provider-doctor.js +201 -31
  65. package/dist/{mcp → application/provider-setup}/provider-health-types.js +1 -1
  66. package/dist/{mcp → application/provider-setup}/provider-status.js +170 -33
  67. package/dist/application/runs/execution-planning.js +180 -0
  68. package/dist/application/runs/operation-execution.js +1 -0
  69. package/dist/application/runs/operation-retry.js +129 -0
  70. package/dist/application/runs/resume-after-approval-result.js +88 -0
  71. package/dist/application/runs/run-insights.js +270 -0
  72. package/dist/application/runs/run-service.js +1480 -0
  73. package/dist/application/runs/run-snapshot-export-service.js +31 -0
  74. package/dist/application/runs/sandbox-process-execution.js +244 -0
  75. package/dist/application/runs/sandbox-worktree-planning.js +59 -0
  76. package/dist/application/runs/task-scoped-command-grant-service.js +224 -0
  77. package/dist/application/sdd/artifact-portability-service.js +137 -0
  78. package/dist/application/sdd/cockpit-read-model.js +195 -0
  79. package/dist/application/sdd/sdd-continuation-plan.js +265 -0
  80. package/dist/application/sdd/sdd-workflow-service.js +892 -0
  81. package/dist/application/skills/boot-seed.js +42 -0
  82. package/dist/application/skills/personal-skills.js +41 -0
  83. package/dist/application/skills/skill-export-service.js +34 -0
  84. package/dist/application/skills/skill-index-service.js +126 -0
  85. package/dist/application/skills/skill-payload.js +186 -0
  86. package/dist/application/skills/skill-registry-service.js +648 -0
  87. package/dist/application/skills/skill-resolver.js +368 -0
  88. package/dist/application/skills/skill-seed-service.js +242 -0
  89. package/dist/application/skills/skill-status-service.js +147 -0
  90. package/dist/cli/bun-bin.js +0 -0
  91. package/dist/cli/cli-flags.js +1 -387
  92. package/dist/cli/cli-help.js +1 -173
  93. package/dist/cli/cli-helpers.js +1 -77
  94. package/dist/cli/cli-types.js +1 -1
  95. package/dist/cli/commands/agent-skill-dispatcher.js +1 -700
  96. package/dist/cli/commands/index.js +1 -9
  97. package/dist/cli/commands/interactive-entrypoint-dispatcher.js +1 -14
  98. package/dist/cli/commands/mcp-dispatcher.js +1 -232
  99. package/dist/cli/commands/memory-sdd-dispatcher.js +1 -367
  100. package/dist/cli/commands/run-permission-dispatcher.js +1 -455
  101. package/dist/cli/commands/setup-dispatcher.js +1 -496
  102. package/dist/cli/commands/status-dispatcher.js +1 -130
  103. package/dist/cli/commands/verification-dispatcher.js +1 -47
  104. package/dist/cli/commands/workflow-dispatcher.js +1 -566
  105. package/dist/cli/dispatcher.js +1 -247
  106. package/dist/cli/doctor-renderer.js +1 -26
  107. package/dist/cli/home-tui-app.js +1 -411
  108. package/dist/cli/home-tui-controller.js +1 -314
  109. package/dist/cli/mcp-start-path.js +1 -21
  110. package/dist/cli/product-resume-renderer.js +1 -32
  111. package/dist/cli/product-status-renderer.js +1 -81
  112. package/dist/cli/sdd-renderer.js +1 -247
  113. package/dist/cli/setup-plan-renderer.js +1 -79
  114. package/dist/cli/setup-status-renderer.js +1 -50
  115. package/dist/cli/setup-tui-app.js +1 -130
  116. package/dist/cli/setup-tui-controller.js +1 -89
  117. package/dist/cli/tui/focus-reducer.js +1 -0
  118. package/dist/cli/tui/focus-types.js +1 -0
  119. package/dist/cli/tui/ink/app-shell.js +1 -0
  120. package/dist/cli/tui/ink/components.js +1 -38
  121. package/dist/cli/tui/ink/help-overlay.js +1 -0
  122. package/dist/cli/tui/ink/state-components.js +1 -0
  123. package/dist/cli/tui/ink/theme.js +1 -36
  124. package/dist/cli/tui/key-intents.js +1 -0
  125. package/dist/cli/tui/keymap.js +1 -20
  126. package/dist/cli/tui/navigation.js +1 -10
  127. package/dist/cli/tui/screen-registry.js +1 -0
  128. package/dist/cli/tui/terminal-capabilities.js +1 -12
  129. package/dist/cli/tui/tui-types.js +1 -1
  130. package/dist/cli/tui/visual/badges.js +1 -19
  131. package/dist/cli/tui/visual/footer.js +1 -27
  132. package/dist/cli/tui/visual/index.js +1 -3
  133. package/dist/cli/tui/visual/viewport.js +1 -11
  134. package/dist/cli/tui-render-helpers.js +1 -200
  135. package/dist/cli/verification-plan-renderer.js +1 -25
  136. package/dist/cli/verification-report-renderer.js +1 -19
  137. package/dist/domain/agents/canonical-agent-manifest.js +355 -0
  138. package/dist/domain/agents/schema.js +1 -0
  139. package/dist/domain/memory/active-work-topics.js +64 -0
  140. package/dist/domain/memory/memory-capture-schema.js +1 -0
  141. package/dist/domain/memory/schema.js +1 -0
  142. package/dist/domain/runs/schema.js +5 -0
  143. package/dist/domain/sdd/cockpit-types.js +1 -0
  144. package/dist/domain/sdd/schema.js +111 -0
  145. package/dist/domain/skills/schema.js +1 -0
  146. package/dist/governance/risk-classifier.js +2 -0
  147. package/dist/interfaces/cli/bun-bin.js +46 -0
  148. package/dist/interfaces/cli/cli-flags.js +391 -0
  149. package/dist/interfaces/cli/cli-help.js +173 -0
  150. package/dist/interfaces/cli/cli-helpers.js +77 -0
  151. package/dist/interfaces/cli/cli-types.js +1 -0
  152. package/dist/interfaces/cli/commands/agent-skill-dispatcher.js +700 -0
  153. package/dist/interfaces/cli/commands/index.js +9 -0
  154. package/dist/interfaces/cli/commands/interactive-entrypoint-dispatcher.js +14 -0
  155. package/dist/interfaces/cli/commands/mcp-dispatcher.js +252 -0
  156. package/dist/interfaces/cli/commands/memory-sdd-dispatcher.js +367 -0
  157. package/dist/interfaces/cli/commands/run-permission-dispatcher.js +460 -0
  158. package/dist/interfaces/cli/commands/setup-dispatcher.js +496 -0
  159. package/dist/interfaces/cli/commands/status-dispatcher.js +130 -0
  160. package/dist/interfaces/cli/commands/verification-dispatcher.js +47 -0
  161. package/dist/interfaces/cli/commands/workflow-dispatcher.js +566 -0
  162. package/dist/interfaces/cli/dispatcher.js +247 -0
  163. package/dist/interfaces/cli/doctor-renderer.js +26 -0
  164. package/dist/interfaces/cli/home-tui-app.js +462 -0
  165. package/dist/interfaces/cli/home-tui-controller.js +341 -0
  166. package/dist/interfaces/cli/index.js +27 -0
  167. package/dist/interfaces/cli/mcp-start-path.js +21 -0
  168. package/dist/interfaces/cli/product-resume-renderer.js +32 -0
  169. package/dist/interfaces/cli/product-status-renderer.js +81 -0
  170. package/dist/interfaces/cli/sdd-renderer.js +247 -0
  171. package/dist/interfaces/cli/setup-plan-renderer.js +79 -0
  172. package/dist/interfaces/cli/setup-status-renderer.js +50 -0
  173. package/dist/interfaces/cli/setup-tui-app.js +135 -0
  174. package/dist/interfaces/cli/setup-tui-controller.js +89 -0
  175. package/dist/interfaces/cli/tui/focus-reducer.js +60 -0
  176. package/dist/interfaces/cli/tui/focus-types.js +10 -0
  177. package/dist/interfaces/cli/tui/ink/app-shell.js +16 -0
  178. package/dist/interfaces/cli/tui/ink/components.js +38 -0
  179. package/dist/interfaces/cli/tui/ink/help-overlay.js +6 -0
  180. package/dist/interfaces/cli/tui/ink/state-components.js +22 -0
  181. package/dist/interfaces/cli/tui/ink/theme.js +36 -0
  182. package/dist/interfaces/cli/tui/key-intents.js +33 -0
  183. package/dist/interfaces/cli/tui/keymap.js +20 -0
  184. package/dist/interfaces/cli/tui/navigation.js +10 -0
  185. package/dist/interfaces/cli/tui/screen-registry.js +43 -0
  186. package/dist/interfaces/cli/tui/terminal-capabilities.js +12 -0
  187. package/dist/interfaces/cli/tui/tui-types.js +1 -0
  188. package/dist/interfaces/cli/tui/visual/badges.js +19 -0
  189. package/dist/interfaces/cli/tui/visual/footer.js +27 -0
  190. package/dist/interfaces/cli/tui/visual/index.js +3 -0
  191. package/dist/interfaces/cli/tui/visual/viewport.js +11 -0
  192. package/dist/interfaces/cli/tui-render-helpers.js +200 -0
  193. package/dist/interfaces/cli/verification-plan-renderer.js +25 -0
  194. package/dist/interfaces/cli/verification-report-renderer.js +19 -0
  195. package/dist/interfaces/mcp/contracts/agents.js +1 -0
  196. package/dist/interfaces/mcp/contracts/context.js +1 -0
  197. package/dist/interfaces/mcp/contracts/governance.js +1 -0
  198. package/dist/interfaces/mcp/contracts/index.js +1 -0
  199. package/dist/interfaces/mcp/contracts/memory.js +1 -0
  200. package/dist/interfaces/mcp/contracts/providers.js +1 -0
  201. package/dist/interfaces/mcp/contracts/runs.js +1 -0
  202. package/dist/interfaces/mcp/contracts/sdd.js +1 -0
  203. package/dist/interfaces/mcp/contracts/sessions.js +1 -0
  204. package/dist/interfaces/mcp/contracts/skills.js +1 -0
  205. package/dist/interfaces/mcp/contracts/verification.js +1 -0
  206. package/dist/interfaces/mcp/control-plane/handlers/agents.js +38 -0
  207. package/dist/interfaces/mcp/control-plane/handlers/context.js +12 -0
  208. package/dist/interfaces/mcp/control-plane/handlers/memory.js +95 -0
  209. package/dist/interfaces/mcp/control-plane/handlers/providers.js +19 -0
  210. package/dist/interfaces/mcp/control-plane/handlers/runs.js +134 -0
  211. package/dist/interfaces/mcp/control-plane/handlers/sdd.js +225 -0
  212. package/dist/interfaces/mcp/control-plane/handlers/sessions.js +39 -0
  213. package/dist/interfaces/mcp/control-plane/handlers/skills.js +82 -0
  214. package/dist/interfaces/mcp/control-plane/handlers/verification.js +11 -0
  215. package/dist/interfaces/mcp/control-plane/types.js +1 -0
  216. package/dist/interfaces/mcp/control-plane.js +235 -0
  217. package/dist/interfaces/mcp/schema.js +174 -0
  218. package/dist/interfaces/mcp/schemas/common.js +121 -0
  219. package/dist/interfaces/mcp/schemas/inputs/agents.js +69 -0
  220. package/dist/interfaces/mcp/schemas/inputs/context.js +32 -0
  221. package/dist/interfaces/mcp/schemas/inputs/governance.js +23 -0
  222. package/dist/interfaces/mcp/schemas/inputs/index.js +10 -0
  223. package/dist/interfaces/mcp/schemas/inputs/memory.js +50 -0
  224. package/dist/interfaces/mcp/schemas/inputs/providers.js +35 -0
  225. package/dist/interfaces/mcp/schemas/inputs/runs.js +146 -0
  226. package/dist/interfaces/mcp/schemas/inputs/sdd.js +102 -0
  227. package/dist/interfaces/mcp/schemas/inputs/sessions.js +32 -0
  228. package/dist/interfaces/mcp/schemas/inputs/skills.js +231 -0
  229. package/dist/interfaces/mcp/schemas/inputs/verification.js +9 -0
  230. package/dist/interfaces/mcp/schemas/outputs/index.js +2 -0
  231. package/dist/interfaces/mcp/schemas/outputs/providers.js +28 -0
  232. package/dist/interfaces/mcp/schemas/outputs/sdd.js +166 -0
  233. package/dist/interfaces/mcp/stdio-server.js +116 -0
  234. package/dist/interfaces/mcp/validation/agents.js +189 -0
  235. package/dist/interfaces/mcp/validation/common.js +415 -0
  236. package/dist/interfaces/mcp/validation/governance.js +50 -0
  237. package/dist/interfaces/mcp/validation/memory.js +133 -0
  238. package/dist/interfaces/mcp/validation/providers.js +94 -0
  239. package/dist/interfaces/mcp/validation/runs.js +514 -0
  240. package/dist/interfaces/mcp/validation/sdd.js +247 -0
  241. package/dist/interfaces/mcp/validation/sessions.js +51 -0
  242. package/dist/interfaces/mcp/validation/skills.js +685 -0
  243. package/dist/interfaces/mcp/validation/verification.js +24 -0
  244. package/dist/interfaces/mcp/validation.js +149 -0
  245. package/dist/mcp/control-plane-snapshot-service.js +65 -2
  246. package/dist/mcp/control-plane.js +1 -646
  247. package/dist/mcp/doctor.js +1 -1
  248. package/dist/mcp/index.js +17 -17
  249. package/dist/mcp/schema.js +1 -1072
  250. package/dist/mcp/stdio-server.js +1 -116
  251. package/dist/mcp/validation.js +1 -2239
  252. package/dist/memory/active-work-preview.js +1 -75
  253. package/dist/memory/active-work-topics.js +1 -64
  254. package/dist/memory/agent-memory-capture-service.js +1 -497
  255. package/dist/memory/import/dry-run-planner.js +1 -58
  256. package/dist/memory/import/index.js +1 -3
  257. package/dist/memory/import/observation-writer.js +1 -226
  258. package/dist/memory/import/package.js +1 -179
  259. package/dist/memory/memory-capture-schema.js +1 -1
  260. package/dist/memory/memory-service.js +1 -201
  261. package/dist/memory/repositories/artifacts.js +1 -67
  262. package/dist/memory/repositories/observations.js +1 -217
  263. package/dist/memory/repositories/sessions.js +1 -125
  264. package/dist/memory/repositories/traces.js +1 -78
  265. package/dist/memory/schema.js +1 -1
  266. package/dist/memory/search.js +1 -11
  267. package/dist/memory/sqlite/database.js +1 -228
  268. package/dist/memory/storage-paths.js +1 -72
  269. package/dist/payload/context-budget-policy.js +10 -0
  270. package/dist/payload/context-budget-service.js +26 -0
  271. package/dist/payload/payload-diagnostics.js +50 -0
  272. package/dist/permissions/explicit-request-authorization.js +126 -0
  273. package/dist/permissions/policy-evaluator.js +54 -14
  274. package/dist/runs/execution-planning.js +1 -178
  275. package/dist/runs/operation-execution.js +1 -1
  276. package/dist/runs/operation-retry.js +1 -129
  277. package/dist/runs/repositories/runs.js +1 -676
  278. package/dist/runs/repositories/task-scoped-command-grants.js +1 -462
  279. package/dist/runs/resume-after-approval-result.js +1 -84
  280. package/dist/runs/run-insights.js +1 -270
  281. package/dist/runs/run-service.js +1 -1439
  282. package/dist/runs/run-snapshot-export-service.js +1 -31
  283. package/dist/runs/sandbox-process-execution.js +1 -240
  284. package/dist/runs/sandbox-worktree-planning.js +1 -59
  285. package/dist/runs/schema.js +1 -5
  286. package/dist/runs/task-scoped-command-grant-service.js +1 -216
  287. package/dist/sdd/artifact-portability-service.js +1 -137
  288. package/dist/sdd/cockpit-read-model.js +1 -195
  289. package/dist/sdd/cockpit-types.js +1 -1
  290. package/dist/sdd/schema.js +1 -111
  291. package/dist/sdd/sdd-continuation-plan.js +1 -265
  292. package/dist/sdd/sdd-workflow-service.js +1 -822
  293. package/dist/setup/providers/claude-setup-adapter.js +11 -4
  294. package/dist/setup/providers/opencode-setup-adapter.js +10 -7
  295. package/dist/setup/setup-plan.js +20 -7
  296. package/dist/skills/boot-seed.js +1 -42
  297. package/dist/skills/personal-skills.js +1 -41
  298. package/dist/skills/repositories/skill-evaluation-requests.js +1 -190
  299. package/dist/skills/repositories/skill-evaluation-scenarios.js +1 -305
  300. package/dist/skills/repositories/skill-improvement-proposals.js +1 -355
  301. package/dist/skills/repositories/skills.js +1 -1077
  302. package/dist/skills/schema.js +1 -1
  303. package/dist/skills/skill-export-service.js +1 -34
  304. package/dist/skills/skill-index-service.js +1 -126
  305. package/dist/skills/skill-payload.js +1 -186
  306. package/dist/skills/skill-registry-service.js +1 -644
  307. package/dist/skills/skill-resolver.js +1 -368
  308. package/dist/skills/skill-seed-service.js +1 -242
  309. package/dist/skills/skill-status-service.js +1 -147
  310. package/dist/storage/agents/repositories/agent-seed-history.js +128 -0
  311. package/dist/storage/agents/repositories/agents.js +200 -0
  312. package/dist/storage/agents/repositories/manager-profile-overlays.js +90 -0
  313. package/dist/storage/memory/repositories/artifacts.js +67 -0
  314. package/dist/storage/memory/repositories/observations.js +217 -0
  315. package/dist/storage/memory/repositories/sessions.js +125 -0
  316. package/dist/storage/memory/repositories/traces.js +78 -0
  317. package/dist/storage/memory/sqlite/database.js +228 -0
  318. package/dist/storage/memory/storage-paths.js +72 -0
  319. package/dist/storage/runs/repositories/runs.js +676 -0
  320. package/dist/storage/runs/repositories/task-scoped-command-grants.js +464 -0
  321. package/dist/storage/skills/repositories/skill-evaluation-requests.js +190 -0
  322. package/dist/storage/skills/repositories/skill-evaluation-scenarios.js +305 -0
  323. package/dist/storage/skills/repositories/skill-improvement-proposals.js +355 -0
  324. package/dist/storage/skills/repositories/skills.js +1084 -0
  325. package/docs/architecture.md +2 -2
  326. package/docs/glossary.md +1 -1
  327. package/docs/mcp.md +1 -1
  328. package/docs/module-boundaries.md +114 -0
  329. package/docs/prd.md +1 -1
  330. package/docs/project-health-audit-v1.10.x.md +1 -1
  331. package/docs/providers.md +2 -2
  332. package/docs/safety.md +3 -3
  333. package/docs/sdd/archive/2026-06-26-ambitious-structure-reorganization/apply-progress.md +122 -0
  334. package/docs/sdd/archive/2026-06-26-ambitious-structure-reorganization/archive-report.md +61 -0
  335. package/docs/sdd/archive/2026-06-26-ambitious-structure-reorganization/design.md +66 -0
  336. package/docs/sdd/archive/2026-06-26-ambitious-structure-reorganization/proposal.md +79 -0
  337. package/docs/sdd/archive/2026-06-26-ambitious-structure-reorganization/spec.md +67 -0
  338. package/docs/sdd/archive/2026-06-26-ambitious-structure-reorganization/tasks.md +63 -0
  339. package/docs/sdd/archive/2026-06-26-ambitious-structure-reorganization/verify-report.md +71 -0
  340. package/docs/sdd/archive/2026-06-26-legacy-facade-cleanup/apply-progress.md +68 -0
  341. package/docs/sdd/archive/2026-06-26-legacy-facade-cleanup/archive-report.md +61 -0
  342. package/docs/sdd/archive/2026-06-26-legacy-facade-cleanup/design.md +43 -0
  343. package/docs/sdd/archive/2026-06-26-legacy-facade-cleanup/proposal.md +61 -0
  344. package/docs/sdd/archive/2026-06-26-legacy-facade-cleanup/spec.md +31 -0
  345. package/docs/sdd/archive/2026-06-26-legacy-facade-cleanup/tasks.md +27 -0
  346. package/docs/sdd/archive/2026-06-26-legacy-facade-cleanup/verify-report.md +58 -0
  347. package/docs/sdd/archive/2026-06-26-provider-install-adapter-boundary/apply-progress.md +65 -0
  348. package/docs/sdd/archive/2026-06-26-provider-install-adapter-boundary/archive-report.md +53 -0
  349. package/docs/sdd/archive/2026-06-26-provider-install-adapter-boundary/design.md +64 -0
  350. package/docs/sdd/archive/2026-06-26-provider-install-adapter-boundary/proposal.md +62 -0
  351. package/docs/sdd/archive/2026-06-26-provider-install-adapter-boundary/spec.md +51 -0
  352. package/docs/sdd/archive/2026-06-26-provider-install-adapter-boundary/tasks.md +50 -0
  353. package/docs/sdd/archive/2026-06-26-provider-install-adapter-boundary/verify-report.md +66 -0
  354. package/docs/storage.md +2 -2
  355. package/package.json +2 -2
  356. /package/dist/{mcp → adapters/claude/install}/claude-code-cli.js +0 -0
  357. /package/dist/{memory → storage/memory}/sqlite/migrations/001_initial.sql +0 -0
  358. /package/dist/{memory → storage/memory}/sqlite/migrations/002_observation_revisions.sql +0 -0
  359. /package/dist/{memory → storage/memory}/sqlite/migrations/003_agent_registry.sql +0 -0
  360. /package/dist/{memory → storage/memory}/sqlite/migrations/004_run_runtime.sql +0 -0
  361. /package/dist/{memory → storage/memory}/sqlite/migrations/005_run_approvals.sql +0 -0
  362. /package/dist/{memory → storage/memory}/sqlite/migrations/006_run_operation_attempts.sql +0 -0
  363. /package/dist/{memory → storage/memory}/sqlite/migrations/007_abandoned_operation_attempts.sql +0 -0
  364. /package/dist/{memory → storage/memory}/sqlite/migrations/008_run_execution_plan_events.sql +0 -0
  365. /package/dist/{memory → storage/memory}/sqlite/migrations/009_multiple_operation_attempts.sql +0 -0
  366. /package/dist/{memory → storage/memory}/sqlite/migrations/010_skill_registry.sql +0 -0
  367. /package/dist/{memory → storage/memory}/sqlite/migrations/011_skill_usage_resolution_outcomes.sql +0 -0
  368. /package/dist/{memory → storage/memory}/sqlite/migrations/012_skill_improvement_proposals.sql +0 -0
  369. /package/dist/{memory → storage/memory}/sqlite/migrations/013_skill_evaluation_scenarios.sql +0 -0
  370. /package/dist/{memory → storage/memory}/sqlite/migrations/014_manager_profile_overlays.sql +0 -0
  371. /package/dist/{memory → storage/memory}/sqlite/migrations/015_artifact_metadata.sql +0 -0
  372. /package/dist/{memory → storage/memory}/sqlite/migrations/016_agent_seed_history.sql +0 -0
  373. /package/dist/{memory → storage/memory}/sqlite/migrations/017_intent_signal_skill_targets.sql +0 -0
  374. /package/dist/{memory → storage/memory}/sqlite/migrations/018_skill_system_v2.sql +0 -0
  375. /package/dist/{memory → storage/memory}/sqlite/migrations/019_task_scoped_command_grants.sql +0 -0
@@ -0,0 +1,566 @@
1
+ import { AgentRegistryService } from '../../../agents/agent-registry-service.js';
2
+ import { canonicalOpenCodeDefaultModel } from '../../../agents/canonical-agent-manifest.js';
3
+ import { createNaturalLanguagePlan } from '../../../orchestrator/natural-language-planner.js';
4
+ import { RunService } from '../../../runs/run-service.js';
5
+ import { normalizeSddPhaseInput, sddPhases } from '../../../sdd/schema.js';
6
+ import { CommandAllowlistAdapter, commandAllowlistIds } from '../../../workflows/command-allowlist-adapter.js';
7
+ import { GuardedProviderWorkflowExecutor, operationMetadataForWorkflowExecution, SafeNonDispatchingWorkflowExecutor, workflowExecutorSafety, } from '../../../workflows/workflow-executor.js';
8
+ import { getWorkflowDefinition, listWorkflows } from '../../../workflows/workflow-registry.js';
9
+ import { optionalStringFlag, requiredFlag } from '../cli-flags.js';
10
+ import { validationFailure } from '../cli-help.js';
11
+ import { jsonResult, resultFailure, toJsonValue } from '../cli-helpers.js';
12
+ function resolveWorkflowRunAgent(input) {
13
+ if (input.explicitAgentId !== undefined) {
14
+ const agent = input.registry.getAgent(input.explicitAgentId);
15
+ if (!agent.ok) {
16
+ return { ok: false, value: workflowRunBlockedAgentResolution(input, `Explicit --agent-id could not be resolved: ${agent.error.message}`) };
17
+ }
18
+ return {
19
+ ok: true,
20
+ value: {
21
+ agent: agent.value,
22
+ summary: workflowRunAgentSummary(agent.value, {
23
+ policy: 'explicit-agent-id',
24
+ reasons: ['explicit --agent-id selected a registry agent'],
25
+ fallbackReason: null,
26
+ }),
27
+ },
28
+ };
29
+ }
30
+ const resolution = input.registry.resolveAgents({
31
+ project: input.project,
32
+ scope: 'project',
33
+ mode: 'agent',
34
+ workflow: input.workflow,
35
+ phase: input.phase,
36
+ providerAdapter: input.providerAdapter,
37
+ intent: input.intent,
38
+ taskDescription: input.intent,
39
+ desiredCapabilities: [],
40
+ });
41
+ if (!resolution.ok)
42
+ return { ok: false, value: workflowRunBlockedAgentResolution(input, resolution.error.message) };
43
+ const manager = resolution.value.candidates.find((candidate) => candidate.agent.name === 'vgxness-manager');
44
+ const selected = manager ?? resolution.value.candidates[0];
45
+ if (selected === undefined) {
46
+ return {
47
+ ok: false,
48
+ value: workflowRunBlockedAgentResolution(input, 'No project agent matched the requested workflow, phase, provider adapter, and project scope. Seed or register vgxness-manager before running workflows.', resolution.value.skipped.map((skipped) => ({ agent: skipped.agent, reasons: skipped.reasons }))),
49
+ };
50
+ }
51
+ return {
52
+ ok: true,
53
+ value: {
54
+ agent: selected.agent,
55
+ summary: workflowRunAgentSummary(selected.agent, {
56
+ policy: 'project-manager-preferred',
57
+ reasons: selected.reasons,
58
+ fallbackReason: manager === undefined && selected.agent.name !== 'vgxness-manager'
59
+ ? 'vgxness-manager was not resolvable for this workflow/phase/provider; selected the highest-scoring project agent instead.'
60
+ : null,
61
+ score: selected.score,
62
+ }),
63
+ },
64
+ };
65
+ }
66
+ function workflowRunAgentSummary(agent, details) {
67
+ return {
68
+ id: agent.id,
69
+ name: agent.name,
70
+ mode: agent.mode,
71
+ project: agent.project,
72
+ scope: agent.scope,
73
+ workflows: agent.workflows,
74
+ policy: details.policy,
75
+ reasons: details.reasons,
76
+ fallbackReason: details.fallbackReason ?? null,
77
+ ...(details.score !== undefined ? { score: details.score } : {}),
78
+ };
79
+ }
80
+ function workflowRunBlockedAgentResolution(input, reason, skipped) {
81
+ return {
82
+ ok: false,
83
+ status: 'blocked',
84
+ reason,
85
+ workflow: input.workflow,
86
+ phase: input.phase,
87
+ providerAdapter: input.providerAdapter,
88
+ selectedAgent: null,
89
+ safety: {
90
+ executed: false,
91
+ recordsRuns: false,
92
+ callsProvider: false,
93
+ editsFiles: false,
94
+ writesProviderConfig: false,
95
+ mutatesSddArtifacts: false,
96
+ },
97
+ nextAction: 'Register or seed a real project agent such as vgxness-manager, then retry the workflow run.',
98
+ ...(skipped !== undefined ? { skipped } : {}),
99
+ };
100
+ }
101
+ function workflowRunSafety(workflow) {
102
+ return {
103
+ executed: true,
104
+ recordsRuns: true,
105
+ callsProvider: false,
106
+ editsFiles: false,
107
+ writesProviderConfig: false,
108
+ mutability: workflow.mutability,
109
+ safetyProfile: workflow.safetyProfile,
110
+ requiresSddArtifacts: workflow.requiresSddArtifacts,
111
+ notes: [
112
+ 'Safe run slice: recorded run intent and checkpoint only.',
113
+ 'No provider tools were called, no user files were edited, no provider config was written, and no SDD artifacts were mutated.',
114
+ ],
115
+ };
116
+ }
117
+ function workflowRunRecommendation(selected, recommended, planner) {
118
+ if (selected.id === recommended.id) {
119
+ return {
120
+ status: 'aligned',
121
+ recommendedWorkflow: recommended.id,
122
+ message: `Planner agrees with explicit ${selected.id} workflow.`,
123
+ };
124
+ }
125
+ return {
126
+ status: recommended.id === 'sdd' ? 'escalation-recommended' : 'workflow-mismatch',
127
+ explicitWorkflow: selected.id,
128
+ recommendedWorkflow: recommended.id,
129
+ reason: planner.reason,
130
+ message: recommended.id === 'sdd'
131
+ ? `Planner recommends formal SDD instead of ${selected.id}; do not continue with mutable lightweight work until reviewed.`
132
+ : `Planner recommends ${recommended.id} instead of explicit ${selected.id}; review before continuing.`,
133
+ };
134
+ }
135
+ function workflowRunNextAction(selected, recommended, planner) {
136
+ if (recommended.id === 'sdd' && selected.id !== 'sdd') {
137
+ return {
138
+ type: 'review-escalation',
139
+ command: planner.suggestedChangeId === undefined ? null : `vgxness sdd next --project ${planner.project} --change ${planner.suggestedChangeId}`,
140
+ reason: 'Planner detected broad or risky work and recommends the formal SDD workflow before any edits.',
141
+ };
142
+ }
143
+ return {
144
+ type: selected.id === 'sdd' ? 'continue-sdd' : 'manual-continuation',
145
+ command: selected.id === 'sdd' && planner.suggestedChangeId !== undefined
146
+ ? `vgxness sdd next --project ${planner.project} --change ${planner.suggestedChangeId}`
147
+ : null,
148
+ reason: selected.id === 'sdd'
149
+ ? 'Use existing SDD commands to inspect readiness; this run command did not mutate artifacts.'
150
+ : 'Inspect the recorded checkpoint, then continue manually or through a future approved executor slice.',
151
+ };
152
+ }
153
+ function appendWorkflowExecutionCheckpoint(service, runId, label, state) {
154
+ return service.appendCheckpoint({ runId, label, state: toJsonValue(state) });
155
+ }
156
+ function workflowExecutionSafety(preflightRecorded) {
157
+ return workflowExecutorSafety(preflightRecorded);
158
+ }
159
+ function workflowExecutionBlockedValue(runId, workflow, reason, message, checkpoint, recommendation) {
160
+ return {
161
+ ok: false,
162
+ runId,
163
+ workflow,
164
+ status: 'blocked',
165
+ dispatched: false,
166
+ reason,
167
+ message,
168
+ ...(checkpoint.ok ? { checkpointId: checkpoint.value.id } : {}),
169
+ ...(recommendation === undefined ? {} : { recommendation }),
170
+ safety: workflowExecutionSafety(false),
171
+ nextAction: 'Resolve the blocking safety gate, then re-run the explicit execute command.',
172
+ };
173
+ }
174
+ function validateWorkflowExecutionAgent(agent, run, workflow) {
175
+ if (agent.mode !== 'agent')
176
+ return {
177
+ ok: false,
178
+ reason: 'selected-agent-not-primary-agent',
179
+ message: `Selected registry entry ${agent.id} is ${agent.mode}; delegated workflow execution requires a primary agent.`,
180
+ };
181
+ if (agent.id !== run.selectedAgentId)
182
+ return { ok: false, reason: 'selected-agent-mismatch', message: 'Resolved selected agent does not match run.selectedAgentId.' };
183
+ if (agent.project !== run.project)
184
+ return {
185
+ ok: false,
186
+ reason: 'selected-agent-project-mismatch',
187
+ message: `Selected agent belongs to project ${agent.project}, not run project ${run.project}.`,
188
+ };
189
+ if (agent.adapters[run.providerAdapter] === undefined)
190
+ return { ok: false, reason: 'selected-agent-provider-mismatch', message: `Selected agent has no ${run.providerAdapter} adapter.` };
191
+ if (!agent.workflows.includes(workflow.id) && !agent.workflows.includes(`${workflow.id}:${run.phase}`)) {
192
+ return {
193
+ ok: false,
194
+ reason: 'selected-agent-workflow-mismatch',
195
+ message: `Selected agent is not registered for workflow ${workflow.id} or phase ${workflow.id}:${run.phase}.`,
196
+ };
197
+ }
198
+ return { ok: true };
199
+ }
200
+ function recordWorkflowPendingApproval(service, runId, operation, executorMode, preflight) {
201
+ const approvalId = preflight.approval?.id ?? preflight.audit.approvalId;
202
+ return service.appendEvent({
203
+ runId,
204
+ kind: 'operation-execution',
205
+ title: `Workflow operation pending approval: ${operation.category} ${operation.operation}`,
206
+ payload: {
207
+ status: 'pending-approval',
208
+ executorName: `workflow-${executorMode}`,
209
+ requestedOperation: operationMetadataForWorkflowExecution(operation),
210
+ input: operation.input ?? null,
211
+ decisionEventId: preflight.permissionEvent.id,
212
+ approvalId: approvalId ?? null,
213
+ decision: preflight.decision.decision,
214
+ reason: preflight.decision.reason,
215
+ message: preflight.decision.message,
216
+ executorInvoked: false,
217
+ operationExecuted: false,
218
+ timestamp: new Date().toISOString(),
219
+ },
220
+ relatedType: 'approval',
221
+ ...(approvalId === undefined ? {} : { relatedId: approvalId }),
222
+ });
223
+ }
224
+ export function runWorkflowPreviewCommand(workflow, parsed) {
225
+ const project = optionalStringFlag(parsed.flags, 'project') ?? 'vgxness';
226
+ const intent = optionalStringFlag(parsed.flags, 'intent') ?? parsed.positionals.slice(2).join(' ').trim();
227
+ const selected = getWorkflowDefinition(workflow);
228
+ return jsonResult({
229
+ ok: true,
230
+ value: {
231
+ workflow: selected,
232
+ registry: listWorkflows(),
233
+ ...(intent.length > 0 ? { planner: createNaturalLanguagePlan({ project, intent }) } : {}),
234
+ safety: {
235
+ executed: false,
236
+ callsProvider: false,
237
+ editsFiles: false,
238
+ writesProviderConfig: false,
239
+ recordsRuns: false,
240
+ },
241
+ },
242
+ });
243
+ }
244
+ export function runWorkflowRunCommand(workflow, parsed, database) {
245
+ const project = optionalStringFlag(parsed.flags, 'project') ?? 'vgxness';
246
+ const intent = requiredFlag(parsed.flags, 'intent');
247
+ if (!intent.ok)
248
+ return resultFailure(intent);
249
+ const selected = getWorkflowDefinition(workflow);
250
+ const planner = createNaturalLanguagePlan({ project, intent: intent.value });
251
+ const recommended = getWorkflowDefinition(planner.workflow);
252
+ const phaseInput = optionalStringFlag(parsed.flags, 'phase') ?? selected.defaultPhase;
253
+ let phase = phaseInput;
254
+ if (selected.id === 'sdd') {
255
+ const canonicalPhase = normalizeSddPhaseInput(phaseInput);
256
+ if (canonicalPhase === undefined)
257
+ return resultFailure(validationFailure(`Unknown SDD phase: ${phaseInput}. Expected one of: ${sddPhases.join(', ')}`));
258
+ phase = canonicalPhase;
259
+ }
260
+ const providerAdapter = optionalStringFlag(parsed.flags, 'provider-adapter') ?? 'opencode';
261
+ const model = optionalStringFlag(parsed.flags, 'model') ?? canonicalOpenCodeDefaultModel;
262
+ const registry = new AgentRegistryService(database);
263
+ const explicitAgentId = optionalStringFlag(parsed.flags, 'agent-id');
264
+ const selectedAgent = resolveWorkflowRunAgent({
265
+ registry,
266
+ project,
267
+ intent: intent.value,
268
+ workflow: selected.id,
269
+ phase,
270
+ providerAdapter,
271
+ ...(explicitAgentId !== undefined ? { explicitAgentId } : {}),
272
+ });
273
+ if (!selectedAgent.ok)
274
+ return jsonResult({ ok: true, value: selectedAgent.value });
275
+ const service = new RunService(database);
276
+ const created = service.createRun({
277
+ project,
278
+ userIntent: intent.value,
279
+ workflow: selected.id,
280
+ phase,
281
+ selectedAgentId: selectedAgent.value.agent.id,
282
+ providerAdapter,
283
+ model,
284
+ });
285
+ if (!created.ok)
286
+ return resultFailure(created);
287
+ const executionSafety = workflowRunSafety(selected);
288
+ const recommendation = workflowRunRecommendation(selected, recommended, planner);
289
+ const checkpointState = toJsonValue({
290
+ kind: 'workflow-run-plan',
291
+ version: 1,
292
+ workflow: selected,
293
+ planner,
294
+ safety: executionSafety,
295
+ recommendation,
296
+ selectedAgent: selectedAgent.value.summary,
297
+ nextAction: workflowRunNextAction(selected, recommended, planner),
298
+ });
299
+ const checkpoint = service.appendCheckpoint({
300
+ runId: created.value.id,
301
+ label: 'workflow-run-planned',
302
+ state: checkpointState,
303
+ });
304
+ if (!checkpoint.ok)
305
+ return resultFailure(checkpoint);
306
+ return jsonResult({
307
+ ok: true,
308
+ value: {
309
+ ok: true,
310
+ runId: created.value.id,
311
+ workflow: selected,
312
+ phase,
313
+ selectedAgent: selectedAgent.value.summary,
314
+ planner: {
315
+ workflow: planner.workflow,
316
+ flow: planner.flow,
317
+ confidence: planner.confidence,
318
+ reason: planner.reason,
319
+ signals: planner.signals,
320
+ needsClarification: planner.needsClarification,
321
+ },
322
+ safety: executionSafety,
323
+ checkpointId: checkpoint.value.id,
324
+ recommendation,
325
+ nextAction: workflowRunNextAction(selected, recommended, planner),
326
+ },
327
+ });
328
+ }
329
+ export function runWorkflowExecuteCommand(workflow, parsed, database, environment) {
330
+ const runId = requiredFlag(parsed.flags, 'run-id');
331
+ if (!runId.ok)
332
+ return resultFailure(runId);
333
+ const service = new RunService(database);
334
+ const details = service.getRun(runId.value);
335
+ if (!details.ok)
336
+ return resultFailure(details);
337
+ const selected = getWorkflowDefinition(workflow);
338
+ if (details.value.workflow !== selected.id) {
339
+ const checkpoint = appendWorkflowExecutionCheckpoint(service, details.value.id, 'workflow-execution-blocked', {
340
+ kind: 'workflow-execution-blocked',
341
+ version: 1,
342
+ runId: details.value.id,
343
+ requestedWorkflow: selected.id,
344
+ runWorkflow: details.value.workflow,
345
+ status: 'blocked',
346
+ dispatched: false,
347
+ reason: 'workflow-mismatch',
348
+ message: `Run ${details.value.id} belongs to workflow ${details.value.workflow}, not ${selected.id}.`,
349
+ safety: workflowExecutionSafety(false),
350
+ });
351
+ if (!checkpoint.ok)
352
+ return resultFailure(checkpoint);
353
+ return jsonResult({
354
+ ok: true,
355
+ value: workflowExecutionBlockedValue(details.value.id, selected.id, 'workflow-mismatch', 'Run workflow does not match the execute command.', checkpoint),
356
+ });
357
+ }
358
+ const agent = new AgentRegistryService(database).getAgent(details.value.selectedAgentId);
359
+ if (!agent.ok) {
360
+ const checkpoint = appendWorkflowExecutionCheckpoint(service, details.value.id, 'workflow-execution-blocked', {
361
+ kind: 'workflow-execution-blocked',
362
+ version: 1,
363
+ runId: details.value.id,
364
+ workflow: selected.id,
365
+ status: 'blocked',
366
+ dispatched: false,
367
+ reason: 'selected-agent-unresolved',
368
+ message: agent.error.message,
369
+ selectedAgentId: details.value.selectedAgentId,
370
+ safety: workflowExecutionSafety(false),
371
+ });
372
+ if (!checkpoint.ok)
373
+ return resultFailure(checkpoint);
374
+ return jsonResult({
375
+ ok: true,
376
+ value: workflowExecutionBlockedValue(details.value.id, selected.id, 'selected-agent-unresolved', agent.error.message, checkpoint),
377
+ });
378
+ }
379
+ const agentGate = validateWorkflowExecutionAgent(agent.value, details.value, selected);
380
+ if (!agentGate.ok) {
381
+ const checkpoint = appendWorkflowExecutionCheckpoint(service, details.value.id, 'workflow-execution-blocked', {
382
+ kind: 'workflow-execution-blocked',
383
+ version: 1,
384
+ runId: details.value.id,
385
+ workflow: selected.id,
386
+ status: 'blocked',
387
+ dispatched: false,
388
+ reason: agentGate.reason,
389
+ message: agentGate.message,
390
+ selectedAgent: workflowRunAgentSummary(agent.value, { policy: 'run-selected-agent', reasons: ['run.selectedAgentId resolved to a real registry agent'] }),
391
+ safety: workflowExecutionSafety(false),
392
+ });
393
+ if (!checkpoint.ok)
394
+ return resultFailure(checkpoint);
395
+ return jsonResult({ ok: true, value: workflowExecutionBlockedValue(details.value.id, selected.id, agentGate.reason, agentGate.message, checkpoint) });
396
+ }
397
+ if (parsed.flags.confirm !== true) {
398
+ const checkpoint = appendWorkflowExecutionCheckpoint(service, details.value.id, 'workflow-execution-blocked', {
399
+ kind: 'workflow-execution-blocked',
400
+ version: 1,
401
+ runId: details.value.id,
402
+ workflow: selected.id,
403
+ status: 'blocked',
404
+ dispatched: false,
405
+ reason: 'missing-confirmation',
406
+ message: 'Explicit --confirm is required before delegated workflow execution can be requested.',
407
+ selectedAgent: workflowRunAgentSummary(agent.value, { policy: 'run-selected-agent', reasons: ['run.selectedAgentId resolved to a real registry agent'] }),
408
+ safety: workflowExecutionSafety(false),
409
+ nextAction: `Re-run: vgxness ${selected.id} execute --run-id ${details.value.id} --confirm`,
410
+ });
411
+ if (!checkpoint.ok)
412
+ return resultFailure(checkpoint);
413
+ return jsonResult({
414
+ ok: true,
415
+ value: workflowExecutionBlockedValue(details.value.id, selected.id, 'missing-confirmation', 'Explicit --confirm is required.', checkpoint),
416
+ });
417
+ }
418
+ const planner = createNaturalLanguagePlan({ project: details.value.project, intent: details.value.userIntent });
419
+ const recommended = getWorkflowDefinition(planner.workflow);
420
+ const recommendation = workflowRunRecommendation(selected, recommended, planner);
421
+ if (recommended.id === 'sdd' && selected.id !== 'sdd' && parsed.flags['override-escalation'] !== true) {
422
+ const checkpoint = appendWorkflowExecutionCheckpoint(service, details.value.id, 'workflow-execution-blocked', {
423
+ kind: 'workflow-execution-blocked',
424
+ version: 1,
425
+ runId: details.value.id,
426
+ workflow: selected.id,
427
+ status: 'blocked',
428
+ dispatched: false,
429
+ reason: 'escalation-recommended',
430
+ message: 'Planner recommends formal SDD; delegated lightweight execution is blocked unless --override-escalation is supplied.',
431
+ recommendation,
432
+ planner,
433
+ selectedAgent: workflowRunAgentSummary(agent.value, { policy: 'run-selected-agent', reasons: ['run.selectedAgentId resolved to a real registry agent'] }),
434
+ safety: workflowExecutionSafety(false),
435
+ nextAction: workflowRunNextAction(selected, recommended, planner),
436
+ });
437
+ if (!checkpoint.ok)
438
+ return resultFailure(checkpoint);
439
+ return jsonResult({
440
+ ok: true,
441
+ value: workflowExecutionBlockedValue(details.value.id, selected.id, 'escalation-recommended', 'Planner recommends formal SDD; supply --override-escalation only after human review.', checkpoint, recommendation),
442
+ });
443
+ }
444
+ const workspaceRoot = optionalStringFlag(parsed.flags, 'workspace') ?? environment.cwd;
445
+ const executorMode = optionalStringFlag(parsed.flags, 'executor') ?? 'safe-non-dispatching';
446
+ if (executorMode !== 'safe-non-dispatching' && executorMode !== 'provider' && executorMode !== 'command')
447
+ return resultFailure(validationFailure(`Unknown workflow executor: ${executorMode}. Expected safe-non-dispatching, provider, or command.`));
448
+ const commandId = optionalStringFlag(parsed.flags, 'command');
449
+ if (executorMode === 'command' && commandId === undefined)
450
+ return resultFailure(validationFailure(`--executor command requires --command <name>. Allowlisted commands: ${commandAllowlistIds().join(', ')}`));
451
+ if (executorMode !== 'command' && commandId !== undefined)
452
+ return resultFailure(validationFailure('--command can only be used with --executor command'));
453
+ const commandTargets = optionalStringFlag(parsed.flags, 'command-targets')
454
+ ?.split(',')
455
+ .map((item) => item.trim())
456
+ .filter((item) => item.length > 0) ?? [];
457
+ let commandAdapter;
458
+ if (executorMode === 'command') {
459
+ try {
460
+ const commandCwd = optionalStringFlag(parsed.flags, 'command-cwd');
461
+ commandAdapter = new CommandAllowlistAdapter({
462
+ commandId: commandId ?? '',
463
+ workspaceRoot,
464
+ targetPaths: commandTargets,
465
+ ...(commandCwd === undefined ? {} : { cwd: commandCwd }),
466
+ });
467
+ }
468
+ catch (error) {
469
+ return resultFailure(validationFailure(error instanceof Error ? error.message : 'Command allowlist adapter rejected the request.'));
470
+ }
471
+ }
472
+ const operation = {
473
+ category: executorMode === 'command' ? 'shell' : 'provider-tool',
474
+ operation: executorMode === 'command' ? `command-allowlist:${commandId}` : 'workflow-delegated-dispatch',
475
+ ...(executorMode === 'command' ? {} : { providerToolName: `${details.value.providerAdapter}:workflow-dispatch` }),
476
+ workspaceRoot,
477
+ agent: agent.value,
478
+ ambiguous: executorMode !== 'command',
479
+ input: toJsonValue({
480
+ runId: details.value.id,
481
+ project: details.value.project,
482
+ workflow: selected.id,
483
+ phase: details.value.phase,
484
+ userIntent: details.value.userIntent,
485
+ providerAdapter: details.value.providerAdapter,
486
+ model: details.value.model,
487
+ selectedAgentId: agent.value.id,
488
+ requestedBy: 'cli-workflow-execute',
489
+ ...(executorMode === 'command' ? { command: commandId, allowlistedCommand: commandAdapter?.plan.request.argv ?? [] } : {}),
490
+ }),
491
+ };
492
+ const preflight = service.preflightOperation({ runId: details.value.id, ...operation });
493
+ if (!preflight.ok)
494
+ return resultFailure(preflight);
495
+ if (preflight.value.outcome === 'approval-needed') {
496
+ const pending = recordWorkflowPendingApproval(service, details.value.id, operation, executorMode, preflight.value);
497
+ if (!pending.ok)
498
+ return resultFailure(pending);
499
+ }
500
+ const selectedAgentSummary = workflowRunAgentSummary(agent.value, {
501
+ policy: 'run-selected-agent',
502
+ reasons: ['run.selectedAgentId resolved to a real registry agent'],
503
+ });
504
+ const executor = executorMode === 'provider' || executorMode === 'command'
505
+ ? new GuardedProviderWorkflowExecutor({
506
+ ...(commandAdapter === undefined ? {} : { adapter: commandAdapter }),
507
+ capabilities: {
508
+ sandboxEnforceable: commandAdapter !== undefined,
509
+ processExecutionEnforceable: commandAdapter !== undefined,
510
+ workspaceBoundaryEnforced: commandAdapter !== undefined,
511
+ providerConfigWritesBlocked: commandAdapter !== undefined,
512
+ },
513
+ })
514
+ : new SafeNonDispatchingWorkflowExecutor();
515
+ const executorResult = executor.execute({
516
+ run: details.value,
517
+ workflow: selected,
518
+ selectedAgent: agent.value,
519
+ selectedAgentSummary,
520
+ workspaceRoot,
521
+ requestedOperation: operation,
522
+ preflight: preflight.value,
523
+ ...(commandAdapter === undefined ? {} : { sandboxExecutionEvidence: commandAdapter.plan.evidence }),
524
+ gates: {
525
+ validRunId: true,
526
+ workflowMatchesRun: true,
527
+ selectedAgentReal: true,
528
+ selectedAgentMatchesRun: true,
529
+ workspaceRoot,
530
+ confirmed: true,
531
+ escalationOverride: parsed.flags['override-escalation'] === true,
532
+ },
533
+ plannerRecommendation: { planner, recommendation },
534
+ });
535
+ const checkpoint = appendWorkflowExecutionCheckpoint(service, details.value.id, executorResult.checkpointLabel, executorResult.checkpointPayload);
536
+ if (!checkpoint.ok)
537
+ return resultFailure(checkpoint);
538
+ return jsonResult({
539
+ ok: true,
540
+ value: {
541
+ ok: true,
542
+ runId: details.value.id,
543
+ workflow: selected.id,
544
+ phase: details.value.phase,
545
+ status: executorResult.status,
546
+ dispatched: executorResult.dispatched,
547
+ dispatchMode: executorResult.dispatchMode,
548
+ executorId: executorResult.executorId,
549
+ executorKind: executorResult.executorKind,
550
+ reason: executorResult.reason,
551
+ message: executorResult.message,
552
+ selectedAgent: selectedAgentSummary,
553
+ preflight: {
554
+ outcome: preflight.value.outcome,
555
+ decision: preflight.value.decision,
556
+ audit: preflight.value.audit,
557
+ eligibleForFutureExecution: preflight.value.eligibleForFutureExecution,
558
+ safety: preflight.value.safety,
559
+ },
560
+ executorAudit: executorResult.audit,
561
+ checkpointId: checkpoint.value.id,
562
+ safety: workflowExecutionSafety(true),
563
+ nextAction: executorResult.nextAction,
564
+ },
565
+ });
566
+ }