@moretea-labs/forge 1.8.0 → 1.8.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 (528) hide show
  1. package/AGENTS.md +70 -7
  2. package/CHANGELOG.md +14 -0
  3. package/CLAUDE.md +17 -2
  4. package/CONTRIBUTING.md +3 -2
  5. package/THIRD_PARTY_NOTICES.md +1 -1
  6. package/adapters/chatgpt/browser-delivery-host.ts +7 -1
  7. package/adapters/chatgpt/browser-delivery-runtime.ts +529 -56
  8. package/adapters/chatgpt/controller-binding-store.ts +101 -22
  9. package/adapters/chatgpt/controller-round-host.ts +15 -25
  10. package/adapters/chatgpt/controller-round-settlement-store.ts +58 -4
  11. package/adapters/chatgpt/provider-delivery.ts +228 -1
  12. package/adapters/chatgpt/work-conversation-binding-store.ts +79 -53
  13. package/adapters/computer/chatgpt-extension-target.ts +463 -0
  14. package/adapters/computer/chatgpt-target-router.ts +103 -0
  15. package/adapters/computer/chrome-extension/background.js +385 -0
  16. package/adapters/computer/chrome-extension/content.js +378 -0
  17. package/adapters/computer/chrome-extension/core.js +24 -0
  18. package/adapters/computer/chrome-extension/manifest.json +30 -0
  19. package/adapters/computer/desktop-operator-discovery.ts +11 -31
  20. package/adapters/computer/interaction-target-authority.ts +142 -18
  21. package/adapters/mcp/auth.ts +0 -1
  22. package/adapters/mcp/instructions.ts +5 -4
  23. package/adapters/mcp/multi-repository.ts +3 -19
  24. package/adapters/mcp/oauth.ts +73 -0
  25. package/adapters/mcp/paths.ts +4 -1
  26. package/adapters/mcp/runtime-gateway/automation-receipt-adapter.ts +87 -0
  27. package/adapters/mcp/runtime-gateway/bounded-result-runtime.ts +62 -0
  28. package/adapters/mcp/runtime-gateway/cognition-settlement.ts +201 -0
  29. package/adapters/mcp/runtime-gateway/context-adapter.ts +411 -73
  30. package/adapters/mcp/runtime-gateway/context-pack-sidecar.ts +91 -0
  31. package/adapters/mcp/runtime-gateway/controller-authority-adapter.ts +20 -5
  32. package/adapters/mcp/runtime-gateway/core-capability-adapter.ts +258 -0
  33. package/adapters/mcp/runtime-gateway/engineering-preconditions.ts +10 -27
  34. package/adapters/mcp/runtime-gateway/engineering-tool-contract.ts +15 -0
  35. package/adapters/mcp/runtime-gateway/execution-tools.ts +8 -42
  36. package/adapters/mcp/runtime-gateway/gateway-execution-adapter.ts +2 -1
  37. package/adapters/mcp/runtime-gateway/plugin-adapter.ts +117 -45
  38. package/adapters/mcp/runtime-gateway/process-tools.ts +190 -22
  39. package/adapters/mcp/runtime-gateway/protected-computer-adapter.ts +16 -4
  40. package/adapters/mcp/runtime-gateway/recovery-adapter.ts +69 -52
  41. package/adapters/mcp/runtime-gateway/repository-compat-adapter.ts +4 -35
  42. package/adapters/mcp/runtime-gateway/result-adapter.ts +10 -4
  43. package/adapters/mcp/runtime-gateway/router.ts +18 -504
  44. package/adapters/mcp/runtime-gateway/routing-policy.ts +499 -0
  45. package/adapters/mcp/runtime-gateway/runtime-observation-adapter.ts +14 -65
  46. package/adapters/mcp/runtime-gateway/runtime-readiness-observation.ts +218 -0
  47. package/adapters/mcp/runtime-gateway/runtime-tool-definitions.ts +113 -173
  48. package/adapters/mcp/runtime-gateway/runtime-tools.ts +15 -5
  49. package/adapters/mcp/runtime-gateway/scheduler-adapter.ts +1 -0
  50. package/adapters/mcp/runtime-gateway/shared-adapter.ts +20 -0
  51. package/adapters/mcp/runtime-gateway/status-inbox-adapter.ts +358 -266
  52. package/adapters/mcp/runtime-gateway/typescript-navigation-sidecar.ts +136 -0
  53. package/adapters/mcp/runtime-gateway/work-adapter.ts +261 -3122
  54. package/adapters/mcp/runtime-gateway/work-controller-operations.ts +257 -0
  55. package/adapters/mcp/runtime-gateway/work-detail-projection.ts +60 -0
  56. package/adapters/mcp/runtime-gateway/work-input-wire-migration.ts +246 -0
  57. package/adapters/mcp/runtime-gateway/work-learning-operations.ts +145 -0
  58. package/adapters/mcp/runtime-gateway/work-list-projection.ts +38 -0
  59. package/adapters/mcp/runtime-gateway/work-plan-operations.ts +382 -0
  60. package/adapters/mcp/runtime-gateway/work-repair-adapter.ts +308 -0
  61. package/adapters/mcp/runtime-gateway/work-requirement-operations.ts +148 -0
  62. package/adapters/mcp/runtime-gateway/work-semantic-operations.ts +263 -0
  63. package/adapters/mcp/runtime-gateway/work-workflow-operations.ts +113 -0
  64. package/adapters/mcp/runtime-gateway/workflow-supervisor-adapter.ts +156 -0
  65. package/adapters/mcp/server.ts +67 -23
  66. package/adapters/mcp/setup.ts +1 -3
  67. package/adapters/mcp/tool-mapping/legacy-tool-service.ts +44 -170
  68. package/adapters/mcp/tool-mapping/post-finalize-work-attribution.ts +4 -9
  69. package/adapters/mcp/tool-mapping/repository-tools.ts +133 -142
  70. package/adapters/mcp/toolset-names.ts +5 -0
  71. package/adapters/mcp/toolset.ts +6 -5
  72. package/adapters/mcp/transports/http-observation.ts +365 -0
  73. package/adapters/mcp/transports/http.ts +154 -677
  74. package/adapters/mcp/transports/oauth-http.ts +322 -0
  75. package/adapters/mcp/transports/session-registry.ts +6 -0
  76. package/adapters/mcp/tunnels/openai-secure-tunnel.ts +89 -5
  77. package/assets/plugin-registry.v1.json +6 -4
  78. package/assets/reference-configs/agentic-development-flow.md +25 -0
  79. package/assets/reference-configs/global-working-rules.md +19 -0
  80. package/assets/skill-version.json +2 -2
  81. package/docs/architecture/CURRENT.md +111 -41
  82. package/docs/architecture/decisions/20260803-release-identity-binding-and-exit-policy.md +14 -5
  83. package/docs/architecture/decisions/20260823-immediate-controller-relay.md +6 -3
  84. package/docs/architecture/decisions/20260907-assistant-learning-loop.md +2 -0
  85. package/docs/architecture/decisions/20260907-controller-round-transition-policy.md +19 -4
  86. package/docs/architecture/decisions/20260916-workflow-supervisor-authority.md +249 -0
  87. package/docs/architecture/decisions/20260917-cognitive-memory-foundation.md +82 -0
  88. package/docs/architecture/decisions/20260918-stable-candidate-release-lifecycle.md +221 -0
  89. package/docs/architecture/decisions/20260919-autonomous-work-liveness.md +62 -0
  90. package/docs/architecture/decisions/20260924-thin-semantic-working-context.md +72 -0
  91. package/docs/architecture/decisions/20261001-supervisor-turn-authority.md +237 -0
  92. package/docs/architecture/decisions/20261005-forge-v3-desktop-client-boundary.md +77 -0
  93. package/docs/architecture/domains/verification.md +1 -0
  94. package/docs/architecture/domains/workflow-engine.md +6 -0
  95. package/docs/architecture/modules/controller-runtime/transport-lifecycle.md +1 -1
  96. package/docs/forge-plugin-management.md +2 -2
  97. package/docs/operations/controller-performance-and-502.md +17 -0
  98. package/docs/operations/controller-reliability-runbook.md +2 -2
  99. package/docs/operations/features.md +1 -1
  100. package/docs/operations/features.zh-CN.md +1 -1
  101. package/docs/operations/homebrew.md +2 -2
  102. package/docs/operations/mcp-tool-exposure.md +2 -0
  103. package/docs/operations/releasing.md +2 -0
  104. package/docs/operations/standalone-disaster-recovery.md +14 -6
  105. package/docs/wiki/Implementation.md +1 -1
  106. package/package.json +25 -14
  107. package/packages/kernel/cognition/api/index.ts +6 -0
  108. package/packages/kernel/cognition/application/activation-service.ts +451 -0
  109. package/packages/kernel/cognition/application/consolidation-service.ts +185 -0
  110. package/packages/kernel/cognition/application/legacy-experience-adapter.ts +38 -0
  111. package/packages/kernel/cognition/application/memory-service.ts +64 -0
  112. package/packages/kernel/cognition/domain/learning.ts +106 -0
  113. package/packages/kernel/cognition/domain/memory.ts +254 -0
  114. package/packages/kernel/controller/api/index.ts +1 -0
  115. package/packages/kernel/controller/application/continuation-service.ts +281 -0
  116. package/packages/kernel/controller/application/controller-round-service.ts +12 -0
  117. package/packages/kernel/controller/domain/controller-round-transition-policy.ts +242 -21
  118. package/packages/kernel/controller/domain/controller-round.ts +4 -1
  119. package/packages/kernel/controller/domain/execution-quality.ts +3 -1
  120. package/packages/kernel/controller/infrastructure/controller-round-store.ts +689 -103
  121. package/packages/kernel/controller/infrastructure/controller-session-store.ts +297 -71
  122. package/packages/kernel/controller/ports/controller-host.ts +2 -0
  123. package/packages/kernel/identity/api/index.ts +10 -0
  124. package/packages/kernel/identity/domain/activity-projection.ts +43 -0
  125. package/packages/kernel/identity/domain/capability-broker.ts +60 -0
  126. package/packages/kernel/identity/domain/grant.ts +72 -0
  127. package/packages/kernel/identity/domain/owned-resource.ts +116 -0
  128. package/packages/kernel/identity/domain/user-request.ts +93 -0
  129. package/packages/kernel/identity/infrastructure/activity-projection-store.ts +77 -0
  130. package/packages/kernel/identity/infrastructure/capability-broker.ts +81 -0
  131. package/packages/kernel/identity/infrastructure/grant-store.ts +284 -0
  132. package/packages/kernel/identity/infrastructure/owned-resource-store.ts +259 -0
  133. package/packages/kernel/identity/infrastructure/user-request-store.ts +182 -0
  134. package/packages/kernel/scheduler/api/index.ts +0 -2
  135. package/packages/kernel/scheduler/application/schedule-service.ts +3 -0
  136. package/packages/kernel/scheduler/application/settlement.ts +0 -15
  137. package/packages/kernel/scheduler/domain/schedule.ts +87 -0
  138. package/packages/kernel/scheduler/infrastructure/schedule-store.ts +153 -133
  139. package/packages/kernel/work/api/index.ts +3 -2
  140. package/packages/kernel/work/application/work-service.ts +17 -42
  141. package/packages/kernel/work/domain/current-task-lineage.ts +104 -0
  142. package/packages/kernel/work/domain/engineering-design.ts +10 -5
  143. package/packages/kernel/work/domain/engineering-profile.ts +8 -12
  144. package/packages/kernel/work/domain/evaluation-promotion-receipt.ts +186 -0
  145. package/packages/kernel/work/domain/execution-concurrency.ts +19 -26
  146. package/packages/kernel/work/domain/execution-snapshot.ts +0 -31
  147. package/packages/kernel/work/domain/implementation-review.ts +14 -331
  148. package/packages/kernel/work/domain/objective-graph.ts +119 -0
  149. package/packages/kernel/work/domain/project-engineering-contract.ts +23 -1
  150. package/packages/kernel/work/domain/repository-completion-receipt.ts +1 -1
  151. package/packages/kernel/work/domain/state-machine.ts +25 -63
  152. package/packages/kernel/work/domain/types.ts +57 -51
  153. package/packages/kernel/work/infrastructure/work-contract-store.ts +819 -728
  154. package/packages/kernel/work/ports/work-contract-store.ts +5 -2
  155. package/packages/plugin-runtime/browser/session-authority.ts +2 -1
  156. package/packages/plugin-runtime/computer/chatgpt-identity.ts +24 -0
  157. package/packages/plugin-runtime/computer/conversation-target.ts +143 -0
  158. package/packages/plugin-runtime/computer/index.ts +2 -0
  159. package/packages/plugin-runtime/computer/target-authority.ts +26 -1
  160. package/packages/plugin-runtime/external/unix-jsonl-transport.ts +142 -18
  161. package/packages/protocols/computer/contract.ts +27 -1
  162. package/scripts/activate-source-baseline.ts +7 -9
  163. package/scripts/canary-controller-semantic-wait.ts +12 -24
  164. package/scripts/check-mcp-compatibility.ts +48 -136
  165. package/scripts/check-runtime-architecture.mjs +622 -217
  166. package/scripts/forge-local-recovery-helper.mjs +93 -15
  167. package/scripts/lib/project-init-lib.sh +3 -0
  168. package/scripts/open-source-audit-allowlist.txt +1 -2
  169. package/scripts/run-bounded-command.mjs +5 -0
  170. package/scripts/run-governed-gate.ts +0 -1
  171. package/scripts/run-mobile-monitor-bridge.ts +0 -1
  172. package/scripts/smoke-control-plane-failure-domain.ts +94 -0
  173. package/scripts/smoke-mcp-http-runtime.ts +5 -0
  174. package/scripts/smoke-runtime-recovery.ts +12 -43
  175. package/scripts/smoke-schedule-engine.ts +23 -15
  176. package/scripts/smoke-unattended-transport-recovery.ts +223 -0
  177. package/scripts/smoke-user-request-continuation-restart.ts +232 -0
  178. package/scripts/smoke-workflow-supervisor-chrome-adapter.ts +92 -0
  179. package/scripts/smoke-workflow-supervisor-process-restart.ts +276 -0
  180. package/scripts/smoke-workflow-supervisor-restart-recovery.ts +150 -0
  181. package/scripts/smoke-workflow-supervisor.ts +103 -0
  182. package/scripts/verify-forge-runtime.sh +2 -1
  183. package/src/cli/agent-jobs/executor-health.ts +11 -34
  184. package/src/cli/agent-jobs/integration.ts +18 -49
  185. package/src/cli/agent-jobs/job-manager.ts +7 -3
  186. package/src/cli/commands/brain-assistant.ts +27 -13
  187. package/src/cli/commands/brain.ts +13 -15
  188. package/src/cli/commands/chatgpt.ts +1 -163
  189. package/src/cli/commands/recovery.ts +135 -121
  190. package/src/cli/commands/runtime.ts +3 -3
  191. package/src/cli/commands/setup-profile.ts +8 -0
  192. package/src/cli/controller/check-runner.ts +13 -2
  193. package/src/cli/controller/completion-backlog.ts +3 -3
  194. package/src/cli/controller/completion-orchestrator.ts +4 -43
  195. package/src/cli/controller/completion-target.ts +3 -72
  196. package/src/cli/controller/context/source-materializer.ts +81 -100
  197. package/src/cli/controller/context-pack.ts +10 -8
  198. package/src/cli/controller/execution-completion.ts +4 -7
  199. package/src/cli/controller/execution-policy.ts +36 -153
  200. package/src/cli/controller/governance.ts +2 -3
  201. package/src/cli/controller/issue-store.ts +4 -99
  202. package/src/cli/controller/launch-agents.ts +59 -18
  203. package/src/cli/controller/operational-plan.ts +24 -51
  204. package/src/cli/controller/runtime-config.ts +5 -1
  205. package/src/cli/controller/stuck-state-migration.ts +2 -3
  206. package/src/cli/controller/systemd-user.ts +39 -1
  207. package/src/cli/editing/edit-session.ts +1 -7
  208. package/src/cli/local-bridge/console-automations.ts +18 -13
  209. package/src/cli/local-bridge/console-view-models.ts +3 -12
  210. package/src/cli/local-bridge/facade-api.ts +64 -191
  211. package/src/cli/local-bridge/server.ts +24 -147
  212. package/src/cli/local-bridge/types.ts +0 -1
  213. package/src/cli/mcp/oauth-client-retirement.ts +74 -0
  214. package/src/cli/repositories/command-executor.ts +29 -23
  215. package/src/cli/repositories/command-scope.ts +35 -16
  216. package/src/cli/repositories/controller-home.ts +48 -0
  217. package/src/cli/repositories/ephemeral-workspace.ts +20 -30
  218. package/src/cli/repositories/git-command-executor.ts +2 -2
  219. package/src/cli/repositories/registry.ts +77 -11
  220. package/src/cli/repositories/structured-git.ts +62 -2
  221. package/src/cli/repository/session-cache.ts +92 -6
  222. package/src/runtime/context/assistant-context.ts +20 -7
  223. package/src/runtime/context/assistant-work-context.ts +89 -27
  224. package/src/runtime/context/automatic-learning.ts +565 -0
  225. package/src/runtime/context/cognitive-attention.ts +173 -0
  226. package/src/runtime/context/cognitive-skill-canary.ts +158 -0
  227. package/src/runtime/context/context-closure.ts +46 -9
  228. package/src/runtime/context/context-pack-process.ts +103 -0
  229. package/src/runtime/context/context-plane.ts +1 -9
  230. package/src/runtime/context/direct-controller-learning.ts +298 -0
  231. package/src/runtime/context/semantic-navigation-contract.ts +9 -0
  232. package/src/runtime/context/semantic-navigation.ts +6 -34
  233. package/src/runtime/context/typescript-navigation-process.ts +145 -0
  234. package/src/runtime/context/typescript-navigation.ts +89 -3
  235. package/src/runtime/control-plane/cleanup-artifact-retention.ts +212 -9
  236. package/src/runtime/control-plane/concurrency/work-execution-concurrency.ts +9 -47
  237. package/src/runtime/control-plane/execution/controller-authority-recovery.ts +34 -4
  238. package/src/runtime/control-plane/execution/edit-validation-coordinator.ts +29 -20
  239. package/src/runtime/control-plane/execution/execution-identity.ts +23 -3
  240. package/src/runtime/control-plane/execution/repository-work-attribution.ts +7 -30
  241. package/src/runtime/control-plane/execution/retained-work-resume.ts +206 -199
  242. package/src/runtime/control-plane/execution/session-store.ts +31 -1
  243. package/src/runtime/control-plane/execution/validation.ts +6 -8
  244. package/src/runtime/control-plane/execution/work-authority-reconciler.ts +13 -42
  245. package/src/runtime/control-plane/execution/work-check-evidence.ts +137 -0
  246. package/src/runtime/control-plane/execution/work-completion-authority.ts +30 -85
  247. package/src/runtime/control-plane/execution/work-delivery-service.ts +497 -0
  248. package/src/runtime/control-plane/execution/work-evidence-policy.ts +12 -50
  249. package/src/runtime/control-plane/execution/work-execution-support.ts +50 -149
  250. package/src/runtime/control-plane/execution/work-handle-authority.ts +188 -109
  251. package/src/runtime/control-plane/execution/work-handle-store.ts +19 -43
  252. package/src/runtime/control-plane/execution/work-head-settlement.ts +53 -20
  253. package/src/runtime/control-plane/execution/work-lifecycle-audit.ts +52 -29
  254. package/src/runtime/control-plane/execution/work-operation-service.ts +43 -27
  255. package/src/runtime/control-plane/execution/work-preparation-service.ts +126 -266
  256. package/src/runtime/control-plane/execution/work-remote-delivery.ts +2 -3
  257. package/src/runtime/control-plane/execution/work-revision-diff.ts +39 -0
  258. package/src/runtime/control-plane/execution/work-terminal-cleanup.ts +173 -186
  259. package/src/runtime/control-plane/execution/work-validation-reconciler.ts +28 -84
  260. package/src/runtime/control-plane/execution/work-verification-service.ts +406 -50
  261. package/src/runtime/control-plane/execution/work-verification-snapshot.ts +5 -1
  262. package/src/runtime/control-plane/facade/capability-registry.ts +362 -37
  263. package/src/runtime/control-plane/facade/check-normalization.ts +3 -9
  264. package/src/runtime/control-plane/facade/codex-delegation.ts +10 -11
  265. package/src/runtime/control-plane/facade/controller-connection.ts +135 -0
  266. package/src/runtime/control-plane/facade/goal-workloop-access.ts +1 -20
  267. package/src/runtime/control-plane/facade/goal-workloop.ts +281 -1753
  268. package/src/runtime/control-plane/facade/handoff-inbox-application.ts +12 -25
  269. package/src/runtime/control-plane/facade/handoff-inbox-store.ts +256 -52
  270. package/src/runtime/control-plane/facade/index.ts +0 -1
  271. package/src/runtime/control-plane/facade/operation-digest.ts +12 -15
  272. package/src/runtime/control-plane/facade/plan-contract-store.ts +451 -991
  273. package/src/runtime/control-plane/facade/policy-gate.ts +0 -23
  274. package/src/runtime/control-plane/facade/repository-work-admission.ts +12 -22
  275. package/src/runtime/control-plane/facade/requirement-authority.ts +102 -199
  276. package/src/runtime/control-plane/facade/requirement-board.ts +3 -3
  277. package/src/runtime/control-plane/facade/rh-work-operation-contract.ts +51 -14
  278. package/src/runtime/control-plane/facade/self-healing-loop.ts +18 -53
  279. package/src/runtime/control-plane/facade/suggested-actions.ts +15 -18
  280. package/src/runtime/control-plane/facade/types.ts +49 -108
  281. package/src/runtime/control-plane/facade/work-continuation.ts +8 -8
  282. package/src/runtime/control-plane/generated-cache-retention.ts +97 -1
  283. package/src/runtime/control-plane/global-scheduler/autonomous-continuation.ts +248 -0
  284. package/src/runtime/control-plane/global-scheduler/durable-admission.ts +1 -1
  285. package/src/runtime/control-plane/global-scheduler/maintenance.ts +239 -112
  286. package/src/runtime/control-plane/global-scheduler/reconciliation.ts +2 -1
  287. package/src/runtime/control-plane/global-scheduler/scheduler.ts +66 -40
  288. package/src/runtime/control-plane/global-scheduler/wake-signal.ts +42 -2
  289. package/src/runtime/control-plane/governance/access-policy.ts +19 -2
  290. package/src/runtime/control-plane/governance/authorization.ts +20 -3
  291. package/src/runtime/control-plane/launcher/chatgpt-round-continuation.ts +63 -300
  292. package/src/runtime/control-plane/launcher/chatgpt-work-continuation.ts +28 -300
  293. package/src/runtime/control-plane/launcher/local-conversation-controller.ts +238 -0
  294. package/src/runtime/control-plane/launcher/provider-mcp-bootstrap.ts +5 -2
  295. package/src/runtime/control-plane/launcher/thin-launcher.ts +96 -240
  296. package/src/runtime/control-plane/persistence/cognition-store.ts +820 -0
  297. package/src/runtime/control-plane/persistence/experience-store.ts +162 -29
  298. package/src/runtime/control-plane/persistence/requirement-store.ts +216 -74
  299. package/src/runtime/control-plane/persistence/sqlite-store.ts +113 -6
  300. package/src/runtime/control-plane/release-retention.ts +135 -47
  301. package/src/runtime/control-plane/repository-namespace-retention.ts +2 -2
  302. package/src/runtime/control-plane/runtime-cleanup.ts +290 -21
  303. package/src/runtime/control-plane/workspace/project-onboarding.ts +80 -0
  304. package/src/runtime/control-plane/workspace/semantic-sync-service.ts +19 -5
  305. package/src/runtime/control-plane/workspace/workspace-store.ts +169 -0
  306. package/src/runtime/diagnostics/incident-repair.ts +313 -146
  307. package/src/runtime/diagnostics/mcp-timing.ts +114 -0
  308. package/src/runtime/evidence/artifact-store.ts +158 -40
  309. package/src/runtime/evidence/evidence-store.ts +112 -8
  310. package/src/runtime/evidence/output-handle-index.ts +225 -0
  311. package/src/runtime/evidence/result-store.ts +158 -44
  312. package/src/runtime/execution/jobs/store.ts +3 -4
  313. package/src/runtime/execution/managed-workspace.ts +57 -0
  314. package/src/runtime/execution/process-runtime/check-facade.ts +1 -1
  315. package/src/runtime/execution/process-runtime/check-result-retention.ts +2 -2
  316. package/src/runtime/execution/process-runtime/check-result.ts +105 -1
  317. package/src/runtime/execution/process-runtime/check-runner-sidecar.ts +18 -8
  318. package/src/runtime/execution/process-runtime/command-facade.ts +79 -27
  319. package/src/runtime/execution/process-runtime/gc.ts +15 -2
  320. package/src/runtime/execution/process-runtime/handle-index.ts +176 -0
  321. package/src/runtime/execution/process-runtime/host-command-lane.ts +139 -0
  322. package/src/runtime/execution/process-runtime/index.ts +3 -0
  323. package/src/runtime/execution/process-runtime/lightweight-managed.ts +251 -72
  324. package/src/runtime/execution/process-runtime/persisted-check.ts +3 -3
  325. package/src/runtime/execution/process-runtime/process-runner-entry.ts +47 -5
  326. package/src/runtime/execution/process-runtime/process-scope.ts +160 -0
  327. package/src/runtime/execution/process-runtime/resource-claims.ts +65 -61
  328. package/src/runtime/execution/process-runtime/runtime.ts +35 -2
  329. package/src/runtime/execution/process-runtime/store.ts +30 -2
  330. package/src/runtime/execution/process-runtime/types.ts +6 -1
  331. package/src/runtime/execution/workers/executor.ts +2 -6
  332. package/src/runtime/platform/service-inventory.ts +130 -0
  333. package/src/runtime/platform/service-manager.ts +8 -0
  334. package/src/runtime/plugins/action-application.ts +85 -28
  335. package/src/runtime/plugins/app-store-connect-adapter.ts +38 -14
  336. package/src/runtime/plugins/browser-adapter.ts +757 -34
  337. package/src/runtime/plugins/browser-automation-service.ts +23 -3
  338. package/src/runtime/plugins/browser-macos-bridge.ts +321 -29
  339. package/src/runtime/plugins/browser-manifest-surface.ts +45 -11
  340. package/src/runtime/plugins/browser-native-session-service.ts +63 -13
  341. package/src/runtime/plugins/browser-registration.ts +16 -0
  342. package/src/runtime/plugins/browser-runtime.ts +14 -1
  343. package/src/runtime/plugins/browser-session-authority.ts +2 -2
  344. package/src/runtime/plugins/browser-session-store.ts +46 -76
  345. package/src/runtime/plugins/capability-authorization-grants.ts +258 -62
  346. package/src/runtime/plugins/computer-chatgpt-browser-adapter-installer.ts +219 -0
  347. package/src/runtime/plugins/computer-chatgpt-macos-target.ts +891 -0
  348. package/src/runtime/plugins/computer-registration.ts +222 -11
  349. package/src/runtime/plugins/desktop-operator-external-policy.ts +36 -4
  350. package/src/runtime/plugins/desktop-operator-registration.ts +12 -4
  351. package/src/runtime/plugins/external-adapter.ts +42 -6
  352. package/src/runtime/plugins/external-registration.ts +21 -1
  353. package/src/runtime/plugins/gmail-adapter.ts +23 -2
  354. package/src/runtime/plugins/google-calendar-adapter.ts +2 -2
  355. package/src/runtime/plugins/google-shared.ts +14 -7
  356. package/src/runtime/plugins/google-tasks-adapter.ts +2 -2
  357. package/src/runtime/plugins/ios-adapter.ts +1 -1
  358. package/src/runtime/plugins/lightweight-action.ts +208 -2
  359. package/src/runtime/plugins/local-system-adapter.ts +12 -2
  360. package/src/runtime/plugins/managed-process-adapter.ts +12 -5
  361. package/src/runtime/plugins/plugin-action-sidecar.ts +17 -13
  362. package/src/runtime/plugins/plugin-management-adapter.ts +1 -1
  363. package/src/runtime/plugins/store.ts +602 -428
  364. package/src/runtime/plugins/types.ts +20 -0
  365. package/src/runtime/plugins/xiaohongshu-publish.ts +16 -0
  366. package/src/runtime/projections/invalidation.ts +7 -3
  367. package/src/runtime/projections/materialized-view.ts +80 -36
  368. package/src/runtime/recovery/actions.ts +3 -3
  369. package/src/runtime/recovery/capability-action-application.ts +46 -45
  370. package/src/runtime/recovery/lifecycle-inventory.ts +29 -29
  371. package/src/runtime/recovery/maintenance-executor.ts +374 -123
  372. package/src/runtime/recovery/store.ts +29 -11
  373. package/src/runtime/release/release-coordinator.ts +296 -0
  374. package/src/runtime/release/release-session.ts +716 -0
  375. package/src/runtime/release/release-state-migration.ts +25 -0
  376. package/src/runtime/resources/leases/store.ts +56 -25
  377. package/src/runtime/root/computer-composition.ts +191 -6
  378. package/src/runtime/root/controller-progression-composition.ts +192 -0
  379. package/src/runtime/root/controller-round-composition.ts +20 -1
  380. package/src/runtime/root/deployment-topology.ts +106 -0
  381. package/src/runtime/root/entry.ts +4 -3
  382. package/src/runtime/root/known-good-recovery.ts +184 -0
  383. package/src/runtime/root/local-bridge.ts +0 -1
  384. package/src/runtime/root/mcp-transport.ts +111 -18
  385. package/src/runtime/root/ownership.ts +261 -9
  386. package/src/runtime/root/package-connector-service.ts +105 -19
  387. package/src/runtime/root/package-runtime-release.ts +117 -18
  388. package/src/runtime/root/package-runtime-service.ts +17 -11
  389. package/src/runtime/root/release-execution-canary.ts +44 -12
  390. package/src/runtime/root/release-loader.ts +90 -8
  391. package/src/runtime/root/release-manifest.ts +80 -6
  392. package/src/runtime/root/release-materialize.ts +372 -28
  393. package/src/runtime/root/release-store.ts +395 -36
  394. package/src/runtime/root/runtime-lane.ts +191 -0
  395. package/src/runtime/root/runtime.ts +159 -27
  396. package/src/runtime/root/scheduled-controller-composition.ts +28 -3
  397. package/src/runtime/root/service-runner.ts +2 -2
  398. package/src/runtime/root/service.ts +36 -33
  399. package/src/runtime/root/status.ts +48 -0
  400. package/src/runtime/root/types.ts +32 -3
  401. package/src/runtime/root/workflow-supervisor-composition.ts +493 -0
  402. package/src/runtime/root/workflow-supervisor-runtime.ts +209 -0
  403. package/src/runtime/root/write-fence.ts +50 -2
  404. package/src/runtime/safe-tooling/google-credential-store.ts +76 -21
  405. package/src/runtime/safe-tooling/google-oauth-broker.ts +25 -7
  406. package/src/runtime/safe-tooling/workspace-auth.ts +1 -1
  407. package/src/runtime/shared/bounded-child-supervisor.ts +9 -1
  408. package/src/runtime/shared/process-environment.ts +20 -9
  409. package/src/runtime/shared/response-budget.ts +1 -3
  410. package/src/runtime/standalone-recovery/controller-home-migration.ts +16 -24
  411. package/src/runtime/standalone-recovery/core.ts +3702 -342
  412. package/src/runtime/standalone-recovery/entry.ts +469 -39
  413. package/src/runtime/standalone-recovery/installer.ts +262 -148
  414. package/src/runtime/standalone-recovery/mcp-server.ts +29 -193
  415. package/src/runtime/standalone-recovery/operation-lock.ts +1 -1
  416. package/src/runtime/standalone-recovery/performance.ts +54 -16
  417. package/src/runtime/standalone-recovery/release.ts +53 -5
  418. package/src/runtime/standalone-recovery/service-labels.ts +5 -2
  419. package/src/runtime/standalone-recovery/watchdog-heartbeat.ts +5 -2
  420. package/src/runtime/workflow/schedules/browser-probe.ts +17 -6
  421. package/src/runtime/workflow/schedules/chatgpt-automation-migration.ts +10 -3
  422. package/src/runtime/workflow/schedules/engine.ts +138 -172
  423. package/src/runtime/workflow/schedules/work-continuation.ts +44 -5
  424. package/src/runtime/workflows/runtime.ts +15 -19
  425. package/src/testing/test-governance.ts +5 -1
  426. package/supervisor/chatgpt-conversation.ts +23 -0
  427. package/supervisor/client.ts +201 -0
  428. package/supervisor/control-plane.ts +868 -0
  429. package/supervisor/entry.ts +15 -0
  430. package/supervisor/forge-validators.ts +80 -0
  431. package/supervisor/index.ts +5 -0
  432. package/supervisor/native-browser-adapter.ts +786 -0
  433. package/supervisor/native-messaging/host.ts +39 -0
  434. package/supervisor/native-messaging/manifest.ts +26 -0
  435. package/supervisor/native-messaging/protocol.ts +27 -0
  436. package/supervisor/paths.ts +18 -0
  437. package/supervisor/protocol.ts +202 -0
  438. package/supervisor/server.ts +404 -0
  439. package/supervisor/store.ts +1451 -0
  440. package/supervisor/tsconfig.json +8 -0
  441. package/supervisor/types.ts +255 -0
  442. package/adapters/chatgpt/controller-host.ts +0 -119
  443. package/adapters/mcp/controller-round-compatibility.ts +0 -184
  444. package/adapters/mcp/frozen-client-semantic-compatibility.ts +0 -292
  445. package/adapters/mcp/runtime-gateway/work-compat-adapter.ts +0 -502
  446. package/packages/kernel/progression/api/index.ts +0 -2
  447. package/packages/kernel/progression/application/projector.ts +0 -211
  448. package/packages/kernel/progression/domain/types.ts +0 -116
  449. package/packages/kernel/progression/index.ts +0 -1
  450. package/packages/kernel/scheduler/application/continuation-service.ts +0 -212
  451. package/packages/kernel/scheduler/domain/continuation.ts +0 -38
  452. package/packages/kernel/scheduler/infrastructure/continuation-dispatch-store.ts +0 -38
  453. package/packages/kernel/work/domain/admission-policy.ts +0 -34
  454. package/scripts/benchmark-background-check-overlap.ts +0 -228
  455. package/scripts/benchmark-computer-hotpath.ts +0 -255
  456. package/scripts/benchmark-controller-hotpath.ts +0 -212
  457. package/scripts/benchmark-controller-round2.ts +0 -191
  458. package/scripts/benchmark-ios-agent-device.ts +0 -511
  459. package/scripts/benchmark-mcp-host.sh +0 -117
  460. package/scripts/benchmark-mcp-transport.ts +0 -169
  461. package/scripts/benchmark-operational-memory-activation.ts +0 -235
  462. package/scripts/benchmark-operational-shadow.ts +0 -28
  463. package/scripts/benchmark-quality-harness.ts +0 -146
  464. package/scripts/benchmark-route-session-concurrency.ts +0 -915
  465. package/scripts/benchmark-thin-harness-gateway-ab.ts +0 -632
  466. package/scripts/benchmark-thin-harness-mcp-e2e.ts +0 -498
  467. package/scripts/benchmark-thin-harness.ts +0 -251
  468. package/scripts/benchmark-typescript-navigation.ts +0 -186
  469. package/scripts/benchmark-work-efficiency.ts +0 -334
  470. package/scripts/build-controller-ui.ts +0 -28
  471. package/scripts/check-npm-release.sh +0 -32
  472. package/scripts/check-public-release-surface.sh +0 -19
  473. package/scripts/check-release-published.sh +0 -57
  474. package/scripts/check-release-readiness.sh +0 -37
  475. package/scripts/check-release-version.mjs +0 -74
  476. package/scripts/check-tarball-install-smoke.sh +0 -150
  477. package/scripts/package-source-archive.sh +0 -147
  478. package/scripts/public-release-files.txt +0 -39
  479. package/scripts/public-release.ts +0 -174
  480. package/scripts/publish-release-tarball.sh +0 -27
  481. package/scripts/route-nl-vs-ts-eval.ts +0 -679
  482. package/scripts/stage-runtime-release.ts +0 -44
  483. package/src/cli/controller/progress.ts +0 -656
  484. package/src/cli/controller/work-mode.ts +0 -181
  485. package/src/cli/local-bridge/console-assets.ts +0 -17
  486. package/src/cli/local-bridge/dashboard.ts +0 -17
  487. package/src/cli/local-bridge/frontend/src/App.tsx +0 -10
  488. package/src/cli/local-bridge/frontend/src/components/Button.tsx +0 -1
  489. package/src/cli/local-bridge/frontend/src/components/DetailPane.tsx +0 -3
  490. package/src/cli/local-bridge/frontend/src/components/SearchField.tsx +0 -1
  491. package/src/cli/local-bridge/frontend/src/components/SectionHeader.tsx +0 -1
  492. package/src/cli/local-bridge/frontend/src/components/Segmented.tsx +0 -1
  493. package/src/cli/local-bridge/frontend/src/components/StatusText.tsx +0 -3
  494. package/src/cli/local-bridge/frontend/src/design/icons.tsx +0 -11
  495. package/src/cli/local-bridge/frontend/src/design/tokens.css +0 -8
  496. package/src/cli/local-bridge/frontend/src/features/automations/AutomationsView.tsx +0 -153
  497. package/src/cli/local-bridge/frontend/src/features/capabilities/CapabilitiesView.tsx +0 -37
  498. package/src/cli/local-bridge/frontend/src/features/overview/OverviewView.tsx +0 -183
  499. package/src/cli/local-bridge/frontend/src/features/repositories/RepositoriesView.tsx +0 -2
  500. package/src/cli/local-bridge/frontend/src/features/system/SystemView.tsx +0 -2
  501. package/src/cli/local-bridge/frontend/src/features/work/WorkView.tsx +0 -4
  502. package/src/cli/local-bridge/frontend/src/lib/api.ts +0 -30
  503. package/src/cli/local-bridge/frontend/src/lib/format.ts +0 -4
  504. package/src/cli/local-bridge/frontend/src/lib/routes.ts +0 -7
  505. package/src/cli/local-bridge/frontend/src/main.tsx +0 -1
  506. package/src/cli/local-bridge/frontend/src/shell/AppShell.tsx +0 -1
  507. package/src/cli/local-bridge/frontend/src/shell/CommandBar.tsx +0 -2
  508. package/src/cli/local-bridge/frontend/src/shell/Sidebar.tsx +0 -4
  509. package/src/cli/local-bridge/frontend/src/styles.css +0 -28
  510. package/src/cli/local-bridge/frontend/src/types.ts +0 -15
  511. package/src/cli/local-bridge/frontend/src/vite-env.d.ts +0 -1
  512. package/src/cli/local-bridge/frontend/vite.config.ts +0 -27
  513. package/src/cli/local-bridge/ui-dist/app.css +0 -1
  514. package/src/cli/local-bridge/ui-dist/app.js +0 -11228
  515. package/src/runtime/control-plane/execution/content-equivalent-commit-authority.ts +0 -169
  516. package/src/runtime/control-plane/execution/direct-canonical-work-reconciliation.ts +0 -85
  517. package/src/runtime/control-plane/execution/direct-edit-work-completion.ts +0 -655
  518. package/src/runtime/control-plane/execution/work-finalization-service.ts +0 -2850
  519. package/src/runtime/control-plane/execution/work-path-scope.ts +0 -37
  520. package/src/runtime/control-plane/execution/work-task-receipt.ts +0 -468
  521. package/src/runtime/control-plane/facade/controller-round-relay.ts +0 -3
  522. package/src/runtime/control-plane/facade/work-admission-policy.ts +0 -142
  523. package/src/runtime/control-plane/facade/work-implementation-review.ts +0 -2
  524. package/src/runtime/control-plane/facade/work-state-machine.ts +0 -2
  525. package/src/runtime/control-plane/facade/work-task-projection.ts +0 -66
  526. package/src/runtime/control-plane/routing/index.ts +0 -1
  527. package/src/runtime/control-plane/routing/route-policy.ts +0 -401
  528. package/src/runtime/control-plane/routing/workspace-admission.ts +0 -70
@@ -1,6 +1,5 @@
1
1
  import { randomBytes } from "crypto";
2
2
  import { readFileSync } from "fs";
3
- import { spawn } from "child_process";
4
3
  import { createServer, type Server } from "http";
5
4
  import express, {
6
5
  type NextFunction,
@@ -36,11 +35,6 @@ import {
36
35
  } from "../controller/issue-store";
37
36
  import { readTaskRunEvidence } from "../controller/run-evidence";
38
37
  import { resolveEffectiveTaskState } from "../controller/task-status-resolver";
39
- import {
40
- getControllerTimeline,
41
- getProjectProgress,
42
- getTaskProgressDetail,
43
- } from "../controller/progress";
44
38
  import { buildControllerTaskLedgerProjection } from "../controller/task-ledger";
45
39
  import { buildControllerOperationalPlan } from "../controller/operational-plan";
46
40
  import { exportControllerWorklog, listControllerWorklogEvents, parseWorklogCategory } from "../controller/worklog";
@@ -73,8 +67,6 @@ import {
73
67
  rollbackEditSession,
74
68
  verifyEditSession,
75
69
  } from "../editing/edit-session";
76
- import { localBridgeDashboardHtml } from "./dashboard";
77
- import { readConsoleAsset, type ConsoleAssetName } from "./console-assets";
78
70
  import { applyConsoleAutomationAction, listConsoleAutomations, summarizeConsoleAutomations } from "./console-automations";
79
71
  import {
80
72
  ackConsoleHandoff,
@@ -89,21 +81,17 @@ import {
89
81
  getConsolePlugin,
90
82
  listConsolePlugins,
91
83
  toConsoleOperationFeedback,
92
- continueConsoleWork,
93
84
  delegateConsoleWork,
94
85
  dismissConsoleHandoff,
95
- finalizeConsoleWork,
96
86
  getConsoleHandoff,
97
87
  getConsoleWork,
98
88
  listConsoleHandoffs,
99
89
  listConsoleWork,
100
90
  mapRepositoryCard,
101
- previewExecutionMode,
102
91
  repairConsole,
103
92
  resolveConsoleHandoff,
104
93
  setConsoleAccessPolicy,
105
94
  startConsoleWork,
106
- stopConsoleWork,
107
95
  verifyConsoleWork,
108
96
  } from "./facade-api";
109
97
  import {
@@ -113,7 +101,7 @@ import {
113
101
  forgeToolSurfaceFingerprint,
114
102
  defaultLocalAgentRunners,
115
103
  } from "../controller/runtime-config";
116
- import { taskExecutionPolicy, taskWriteScopesConflict } from "../controller/execution-policy";
104
+ import { taskWriteScopesConflict } from "../controller/execution-policy";
117
105
  import { continueTaskAfterSuccessfulRun } from "../controller/execution-completion";
118
106
  import { applyCompletionDecision, completionDecisionQueues, finishCompletionBacklog, inspectCompletionBacklog } from "../controller/completion-backlog";
119
107
  import { finishEditSession, finishTaskRun } from "../controller/completion-orchestrator";
@@ -158,7 +146,6 @@ export interface LocalBridgeServerOptions {
158
146
  defaultRepoId?: string;
159
147
  host?: string;
160
148
  port?: number;
161
- openBrowser?: boolean;
162
149
  token?: string;
163
150
  allowLanMobileIntents?: boolean;
164
151
  mode?: "standalone" | "embedded" | "remote" | "disabled" | "unknown";
@@ -218,22 +205,6 @@ function cookieValue(request: Request, name: string): string | undefined {
218
205
  return undefined;
219
206
  }
220
207
 
221
- function openUrl(url: string): void {
222
- const command =
223
- process.platform === "darwin"
224
- ? "open"
225
- : process.platform === "win32"
226
- ? "cmd"
227
- : "xdg-open";
228
- const args = process.platform === "win32" ? ["/c", "start", "", url] : [url];
229
- try {
230
- const child = spawn(command, args, { detached: true, stdio: "ignore" });
231
- child.unref();
232
- } catch (_error) {
233
- // The URL is still printed by the caller when a desktop opener is unavailable.
234
- }
235
- }
236
-
237
208
  function errorMessage(error: unknown): string {
238
209
  return error instanceof Error ? error.message : String(error);
239
210
  }
@@ -263,6 +234,15 @@ function legacyControlPlaneMutationRetiredPayload(): Record<string, unknown> {
263
234
  };
264
235
  }
265
236
 
237
+ function legacyProgressProjectionRetiredPayload(): Record<string, unknown> {
238
+ return {
239
+ error: "LEGACY_PROGRESS_PROJECTION_RETIRED",
240
+ message: "Legacy Issue/Task progress projections were retired with the Local Bridge web UI. Use Requirement, Plan, Work and execution evidence APIs.",
241
+ authority: "controller-home-sqlite",
242
+ deprecated: true,
243
+ };
244
+ }
245
+
266
246
  function queryString(value: unknown): string | undefined {
267
247
  return typeof value === "string" && value.trim() ? value.trim() : undefined;
268
248
  }
@@ -545,8 +525,7 @@ export function buildLocalControllerSnapshot(repoRoot: string) {
545
525
  projectState: loadControllerProjectState(repoRoot),
546
526
  governance: inspectProjectGovernance(repoRoot),
547
527
  recovery,
548
- progress: getProjectProgress(repoRoot),
549
- timeline: getControllerTimeline(repoRoot, { limit: 40 }),
528
+ timeline: listControllerWorklogEvents(repoRoot, { limit: 40 }),
550
529
  githubPlugin: getGitHubPluginStatus(repoRoot),
551
530
  assistantPlugins,
552
531
  mobileIntents,
@@ -949,26 +928,6 @@ export async function startLocalBridgeServer(
949
928
  next();
950
929
  };
951
930
 
952
- app.get("/console-assets/:asset", (request, response) => {
953
- const asset = String(request.params.asset ?? "");
954
- if (asset !== "app.js" && asset !== "app.css") { response.status(404).end(); return; }
955
- response.setHeader("Cache-Control", "no-cache");
956
- response.type(asset.endsWith(".css") ? "text/css" : "application/javascript");
957
- response.send(readConsoleAsset(asset as ConsoleAssetName));
958
- });
959
-
960
- app.get("/", (_request, response) => {
961
- response.setHeader("Cache-Control", "no-store, max-age=0");
962
- response.setHeader("Pragma", "no-cache");
963
- response.setHeader("Expires", "0");
964
- response.setHeader("Referrer-Policy", "no-referrer");
965
- response.setHeader(
966
- "Set-Cookie",
967
- `${cookieName}=${encodeURIComponent(token)}; Path=/api; HttpOnly; SameSite=Strict`,
968
- );
969
- response.setHeader("Content-Type", "text/html; charset=utf-8");
970
- response.send(localBridgeDashboardHtml());
971
- });
972
931
  app.get("/health", (_request, response) => {
973
932
  const exposure = controllerExposureSnapshot(mcpExposureContext);
974
933
  const fingerprint = exposure.fingerprint;
@@ -1242,15 +1201,15 @@ export async function startLocalBridgeServer(
1242
1201
  repositoryName: repository.displayName,
1243
1202
  })),
1244
1203
  ).sort((left, right) => right.updatedAt.localeCompare(left.updatedAt));
1245
- const statusOf = (item: (typeof items)[number]) => String(item.advanced?.status ?? "");
1204
+ const stateOf = (item: (typeof items)[number]) => String(item.advanced?.state ?? "");
1246
1205
  response.json({
1247
1206
  schemaVersion: 1,
1248
1207
  generatedAt: new Date().toISOString(),
1249
1208
  summary: {
1250
1209
  total: items.length,
1251
- open: items.filter((item) => ["open", "running", "ready"].includes(statusOf(item))).length,
1252
- needsAttention: items.filter((item) => ["blocked", "failed"].includes(statusOf(item))).length,
1253
- completed: items.filter((item) => ["completed", "cancelled"].includes(statusOf(item))).length,
1210
+ open: items.filter((item) => stateOf(item) === "open").length,
1211
+ needsAttention: items.filter((item) => ["blocked", "failed", "needs_attention"].includes(item.phase)).length,
1212
+ completed: items.filter((item) => ["completed", "cancelled"].includes(stateOf(item))).length,
1254
1213
  },
1255
1214
  repositories: repositories.map((repository) => ({ repoId: repository.repoId, repositoryName: repository.displayName })),
1256
1215
  items,
@@ -1388,28 +1347,6 @@ export async function startLocalBridgeServer(
1388
1347
  }
1389
1348
  });
1390
1349
 
1391
- app.post("/api/console/mode-preview", (request, response) => {
1392
- try {
1393
- const body = request.body && typeof request.body === "object" && !Array.isArray(request.body)
1394
- ? request.body as Record<string, unknown>
1395
- : {};
1396
- const modePreview = previewExecutionMode({
1397
- objective: queryString(body.objective) ?? "",
1398
- expectedFiles: typeof body.expectedFiles === "number" ? body.expectedFiles : undefined,
1399
- expectedChangedLines: typeof body.expectedChangedLines === "number" ? body.expectedChangedLines : undefined,
1400
- scopeClear: body.scopeClear !== false,
1401
- requiresInvestigation: body.requiresInvestigation === true,
1402
- requiresLongRunningChecks: body.requiresLongRunningChecks === true,
1403
- requiresWorker: body.requiresWorker === true,
1404
- requiresApproval: body.requiresApproval === true,
1405
- destructive: body.destructive === true,
1406
- });
1407
- response.json({ modePreview });
1408
- } catch (error) {
1409
- response.status(400).json({ error: errorMessage(error) });
1410
- }
1411
- });
1412
-
1413
1350
  app.get("/api/console/inbox", (request, response) => {
1414
1351
  try {
1415
1352
  const status = queryString(request.query.status) === "all" ? "all"
@@ -1529,19 +1466,11 @@ export async function startLocalBridgeServer(
1529
1466
  acceptanceCriteria: Array.isArray(body.acceptanceCriteria) ? body.acceptanceCriteria.map(String) : undefined,
1530
1467
  allowedPaths: Array.isArray(body.allowedPaths) ? body.allowedPaths.map(String) : undefined,
1531
1468
  forbiddenPaths: Array.isArray(body.forbiddenPaths) ? body.forbiddenPaths.map(String) : undefined,
1532
- expectedFiles: typeof body.expectedFiles === "number" ? body.expectedFiles : undefined,
1533
- expectedChangedLines: typeof body.expectedChangedLines === "number" ? body.expectedChangedLines : undefined,
1534
1469
  scopeClear: body.scopeClear !== false,
1535
- requiresInvestigation: body.requiresInvestigation === true,
1536
- requiresLongRunningChecks: body.requiresLongRunningChecks === true,
1537
- requiresWorker: body.requiresWorker === true,
1538
1470
  requiresApproval: body.requiresApproval === true,
1539
1471
  destructive: body.destructive === true,
1540
1472
  accessMode: body.accessMode === 'full_access' ? 'full_access' : body.accessMode === 'request' ? 'request' : undefined,
1541
1473
  approvalConfirmed: body.approvalConfirmed === true,
1542
- forceMode: body.forceMode === "direct_control" || body.forceMode === "goal_workloop" || body.forceMode === "handoff_only"
1543
- ? body.forceMode
1544
- : undefined,
1545
1474
  checkIds: Array.isArray(body.checkIds) ? body.checkIds.map(String) : undefined,
1546
1475
  });
1547
1476
  const feedback = toConsoleOperationFeedback(result);
@@ -1560,18 +1489,6 @@ export async function startLocalBridgeServer(
1560
1489
  return { ...result, ...feedback, feedback };
1561
1490
  };
1562
1491
 
1563
- app.post("/api/console/work/continue", (request, response) => {
1564
- try {
1565
- const body = request.body && typeof request.body === "object" && !Array.isArray(request.body)
1566
- ? request.body as Record<string, unknown>
1567
- : {};
1568
- const result = continueConsoleWork(consoleCtx(request), queryString(body.workId) ?? "", queryString(body.note));
1569
- response.status(result.status === "not_found" ? 404 : result.status === "blocked" || result.status === "failed" ? 409 : 200).json(withFeedback(result));
1570
- } catch (error) {
1571
- response.status(400).json({ error: errorMessage(error) });
1572
- }
1573
- });
1574
-
1575
1492
  app.post("/api/console/work/verify", async (request, response) => {
1576
1493
  try {
1577
1494
  const body = request.body && typeof request.body === "object" && !Array.isArray(request.body)
@@ -1590,30 +1507,6 @@ export async function startLocalBridgeServer(
1590
1507
  }
1591
1508
  });
1592
1509
 
1593
- app.post("/api/console/work/finalize", (request, response) => {
1594
- try {
1595
- const body = request.body && typeof request.body === "object" && !Array.isArray(request.body)
1596
- ? request.body as Record<string, unknown>
1597
- : {};
1598
- const result = finalizeConsoleWork(consoleCtx(request), queryString(body.workId) ?? "");
1599
- response.status(result.status === "not_found" ? 404 : result.status === "failed" || result.status === "blocked" ? 409 : 200).json(withFeedback(result));
1600
- } catch (error) {
1601
- response.status(400).json({ error: errorMessage(error) });
1602
- }
1603
- });
1604
-
1605
- app.post("/api/console/work/stop", (request, response) => {
1606
- try {
1607
- const body = request.body && typeof request.body === "object" && !Array.isArray(request.body)
1608
- ? request.body as Record<string, unknown>
1609
- : {};
1610
- const result = stopConsoleWork(consoleCtx(request), queryString(body.workId) ?? "", queryString(body.reason));
1611
- response.status(result.status === "not_found" ? 404 : 200).json(withFeedback(result));
1612
- } catch (error) {
1613
- response.status(400).json({ error: errorMessage(error) });
1614
- }
1615
- });
1616
-
1617
1510
  app.post("/api/console/work/delegate", (request, response) => {
1618
1511
  try {
1619
1512
  const body = request.body && typeof request.body === "object" && !Array.isArray(request.body)
@@ -1890,13 +1783,6 @@ export async function startLocalBridgeServer(
1890
1783
  response.status(400).json({ error: errorMessage(error) });
1891
1784
  }
1892
1785
  });
1893
- app.get("/api/progress", (request, response) => {
1894
- try {
1895
- response.json(getProjectProgress(requestRepositoryRoot(request, options, controllerHome)));
1896
- } catch (error) {
1897
- response.status(400).json({ error: errorMessage(error) });
1898
- }
1899
- });
1900
1786
  app.get("/api/governance", (request, response) => {
1901
1787
  try {
1902
1788
  response.json(inspectProjectGovernance(requestRepositoryRoot(request, options, controllerHome)));
@@ -2007,6 +1893,12 @@ export async function startLocalBridgeServer(
2007
1893
  response.status(400).json({ error: errorMessage(error) });
2008
1894
  }
2009
1895
  });
1896
+ app.get("/api/progress", (_request, response) => {
1897
+ response.status(410).json(legacyProgressProjectionRetiredPayload());
1898
+ });
1899
+ app.get("/api/issues/:issueId/tasks/:taskId", (_request, response) => {
1900
+ response.status(410).json(legacyProgressProjectionRetiredPayload());
1901
+ });
2010
1902
  app.patch("/api/project-state", (request, response) => {
2011
1903
  try {
2012
1904
  const body = request.body ?? {};
@@ -2093,7 +1985,6 @@ export async function startLocalBridgeServer(
2093
1985
  response.json(issue);
2094
1986
  return;
2095
1987
  }
2096
- const policy = taskExecutionPolicy(task);
2097
1988
  const confirmAcceptance = request.body?.confirmAcceptance === true;
2098
1989
  const reviewer = queryString(request.body?.reviewer) ?? "local-controller-human";
2099
1990
  const latestRunId = task.runIds.at(-1);
@@ -2140,8 +2031,8 @@ export async function startLocalBridgeServer(
2140
2031
  return { checkId, ok: false, summary: errorMessage(error) };
2141
2032
  }
2142
2033
  }));
2143
- if (policy.requiresAcceptanceEvidence && !confirmAcceptance) {
2144
- throw new Error(`${policy.executionClass} requires explicit acceptance evidence when no successful Run is linked`);
2034
+ if (task.acceptanceCriteria.length > 0 && !confirmAcceptance) {
2035
+ throw new Error('Explicit Task acceptance criteria require acceptance evidence when no successful Run is linked');
2145
2036
  }
2146
2037
  const at = new Date().toISOString();
2147
2038
  response.json(recordTaskVerification(repoRoot, issue.id, task.id, {
@@ -2278,7 +2169,7 @@ export async function startLocalBridgeServer(
2278
2169
  app.get("/api/timeline", (request, response) => {
2279
2170
  try {
2280
2171
  response.json({
2281
- events: getControllerTimeline(requestRepositoryRoot(request, options, controllerHome), {
2172
+ events: listControllerWorklogEvents(requestRepositoryRoot(request, options, controllerHome), {
2282
2173
  category: parseWorklogCategory(queryString(request.query.category)),
2283
2174
  issueId: queryString(request.query.issueId),
2284
2175
  taskId: queryString(request.query.taskId),
@@ -2293,19 +2184,6 @@ export async function startLocalBridgeServer(
2293
2184
  response.status(400).json({ error: errorMessage(error) });
2294
2185
  }
2295
2186
  });
2296
- app.get("/api/issues/:issueId/tasks/:taskId", (request, response) => {
2297
- try {
2298
- response.json(
2299
- getTaskProgressDetail(
2300
- requestRepositoryRoot(request, options, controllerHome),
2301
- request.params.issueId,
2302
- request.params.taskId,
2303
- ),
2304
- );
2305
- } catch (error) {
2306
- response.status(404).json({ error: errorMessage(error) });
2307
- }
2308
- });
2309
2187
  app.post("/api/worklog/export", (request, response) => {
2310
2188
  try {
2311
2189
  response.json(
@@ -2703,7 +2581,6 @@ export async function startLocalBridgeServer(
2703
2581
  const port =
2704
2582
  typeof address === "object" && address ? address.port : requestedPort;
2705
2583
  const url = `http://${host === "::1" ? "[::1]" : host}:${port}/`;
2706
- if (options.openBrowser) openUrl(url);
2707
2584
  return {
2708
2585
  host,
2709
2586
  port,
@@ -167,7 +167,6 @@ export interface LocalBridgeConfig {
167
167
  version: 1;
168
168
  host?: string;
169
169
  port?: number;
170
- autoOpen?: boolean;
171
170
  /** Allow only authenticated /mobile/intent requests on a wildcard/LAN bind. */
172
171
  allowLanMobileIntents?: boolean;
173
172
  approvals?: Partial<Record<LocalBridgeJobAction, LocalBridgeApproval>>;
@@ -0,0 +1,74 @@
1
+ import {
2
+ mcpServiceOAuthTokenStoreFallbackPaths,
3
+ mcpServiceOAuthTokenStorePath,
4
+ } from '../../../adapters/mcp/auth';
5
+ import {
6
+ McpOAuthTokenStore,
7
+ type McpOAuthClientRetirementResult,
8
+ } from '../../../adapters/mcp/oauth';
9
+ import {
10
+ reconcilePluginCapabilityAuthorizations,
11
+ type ReconcilePluginCapabilityAuthorizationsResult,
12
+ } from '../../runtime/plugins/capability-authorization-grants';
13
+
14
+ export interface RetireMcpOAuthClientOptions {
15
+ now?: Date;
16
+ }
17
+
18
+ export interface RetireMcpOAuthClientResult {
19
+ clientId: string;
20
+ ownerScope: string;
21
+ oauth: McpOAuthClientRetirementResult;
22
+ capabilityAuthorizations: ReconcilePluginCapabilityAuthorizationsResult;
23
+ changed: boolean;
24
+ }
25
+
26
+ function requiredClientId(clientId: string): string {
27
+ const normalized = clientId.trim();
28
+ if (!normalized) throw new Error('MCP_OAUTH_CLIENT_ID_REQUIRED');
29
+ return normalized;
30
+ }
31
+
32
+ export function mcpOAuthClientOwnerScope(clientId: string): string {
33
+ return `mcp:oauth-client:${requiredClientId(clientId)}`;
34
+ }
35
+
36
+ /**
37
+ * Converge one retired MCP OAuth client across Forge's existing authorities.
38
+ *
39
+ * Ordering is deliberate and idempotent:
40
+ * 1. revoke credentials and remove the OAuth registration in the OAuth store;
41
+ * 2. once the client is absent from that authority, reclaim only its exact
42
+ * capability-grant owner scope while compacting already-dead grants.
43
+ *
44
+ * This is ordered convergence across two atomic stores, not a fabricated
45
+ * cross-file transaction. A failure in step 2 can be retried safely: step 1
46
+ * becomes a no-op and the exact retired owner is reconciled on the next call.
47
+ */
48
+ export function retireMcpOAuthClient(
49
+ controllerHome: string,
50
+ clientId: string,
51
+ options: RetireMcpOAuthClientOptions = {},
52
+ ): RetireMcpOAuthClientResult {
53
+ const normalizedClientId = requiredClientId(clientId);
54
+ const store = new McpOAuthTokenStore(
55
+ mcpServiceOAuthTokenStorePath(controllerHome),
56
+ mcpServiceOAuthTokenStoreFallbackPaths(controllerHome),
57
+ );
58
+ store.load();
59
+
60
+ const oauth = store.retireClient(normalizedClientId);
61
+ const ownerScope = mcpOAuthClientOwnerScope(normalizedClientId);
62
+ const capabilityAuthorizations = reconcilePluginCapabilityAuthorizations(controllerHome, {
63
+ retiredOwnerScopes: [ownerScope],
64
+ now: options.now,
65
+ });
66
+
67
+ return {
68
+ clientId: normalizedClientId,
69
+ ownerScope,
70
+ oauth,
71
+ capabilityAuthorizations,
72
+ changed: oauth.changed || capabilityAuthorizations.changed,
73
+ };
74
+ }
@@ -4,7 +4,7 @@ import { appendFileSync, existsSync, lstatSync, mkdirSync } from 'fs';
4
4
  import { dirname, join, relative, resolve } from 'path';
5
5
  import { capProcessOutput, redactProcessOutput } from '../../effects/process-runner';
6
6
  import { MAX_AGENT_TIMEOUT_MS, MIN_AGENT_TIMEOUT_MS } from '../controller/runtime-config';
7
- import { repositoryControllerRoot } from './controller-home';
7
+ import { scopedOperationRoot } from './controller-home';
8
8
  import {
9
9
  classifyRepositoryCommand,
10
10
  type RepositoryCommandAuthorization,
@@ -13,6 +13,8 @@ import {
13
13
  import {
14
14
  assertCommandPathOperandsStayInRepository,
15
15
  assertRepositoryCommandInputAllowed,
16
+ commandExecutionScopeKey,
17
+ type RepositoryCommandScopeTarget,
16
18
  type RepositoryCommandExternalPathUsage,
17
19
  resolveRepositoryCommandCwd,
18
20
  } from './command-scope';
@@ -22,7 +24,7 @@ import type { RepositoryRecord } from './types';
22
24
  import { readRepositoryAccessPolicy } from '../../runtime/control-plane/governance/access-policy';
23
25
  import { invalidateRepositoryReadCaches } from '../repository/inspector';
24
26
  import { assertResolvedAuthorization, decideAuthorization, type AuthorizationDecision } from '../../runtime/control-plane/governance/authorization';
25
- import { assertRuntimeMayWriteOrThrow } from '../../runtime/root/write-fence';
27
+ import { assertRuntimeMayWriteOrThrow, isRuntimeWriteFenceError } from '../../runtime/root/write-fence';
26
28
  import { commandEnvironment, runCanonicalCommand, type RepositoryCommandAsyncHooks, type SpawnCommandResult } from './command-process';
27
29
  import {
28
30
  changedSnapshotPaths,
@@ -77,11 +79,13 @@ export interface ExecuteRepositoryCommandInput {
77
79
  snapshotFingerprintTimeoutMs?: number;
78
80
  }
79
81
 
82
+ export type { RepositoryCommandScopeTarget as RepositoryCommandExecutionTarget };
83
+
80
84
 
81
85
  export interface RepositoryCommandExecution {
82
86
  status: 'preview' | 'approval_required' | 'executed';
83
87
  repoId: string;
84
- checkoutId: string;
88
+ checkoutId?: string;
85
89
  cwd: string;
86
90
  command: RepositoryCommandValue;
87
91
  classification: RepositoryCommandClassification;
@@ -170,7 +174,7 @@ function boundedSnapshotFingerprintPaths(
170
174
  }
171
175
 
172
176
  function approvalToken(
173
- repository: RepositoryRecord,
177
+ repository: RepositoryCommandScopeTarget,
174
178
  relativeCwd: string,
175
179
  command: RepositoryCommandValue,
176
180
  classification: RepositoryCommandClassification,
@@ -179,7 +183,7 @@ function approvalToken(
179
183
  ): string {
180
184
  return createHash('sha256').update(JSON.stringify({
181
185
  version: 2,
182
- repoId: repository.repoId,
186
+ repoId: commandExecutionScopeKey(repository),
183
187
  checkoutId: repository.activeCheckoutId,
184
188
  cwd: relativeCwd,
185
189
  command,
@@ -190,7 +194,7 @@ function approvalToken(
190
194
  }
191
195
 
192
196
  function finalizePreparedExecution(
193
- repository: RepositoryRecord,
197
+ repository: RepositoryCommandScopeTarget,
194
198
  input: ExecuteRepositoryCommandInput,
195
199
  controllerHome: string | undefined,
196
200
  root: string,
@@ -213,7 +217,7 @@ function finalizePreparedExecution(
213
217
  } {
214
218
  const commandForPersistence = commandValue(command);
215
219
  const token = approvalToken(repository, relativeCwd, commandForPersistence, classification, before, externalPathUsages);
216
- const permission = controllerHome ? readRepositoryAccessPolicy(controllerHome, repository.repoId) : undefined;
220
+ const permission = controllerHome ? readRepositoryAccessPolicy(controllerHome, commandExecutionScopeKey(repository)) : undefined;
217
221
  const isGit = command.kind === 'argv'
218
222
  ? command.executable?.split(/[\\/]/).at(-1)?.toLowerCase() === 'git'
219
223
  : /^\s*git\s+/i.test(command.shellCommand!);
@@ -226,8 +230,8 @@ function finalizePreparedExecution(
226
230
  controllerHome,
227
231
  accessMode: permission?.mode ?? 'request',
228
232
  risk,
229
- repositoryId: repository.repoId,
230
- currentRepositoryId: repository.repoId,
233
+ repositoryId: commandExecutionScopeKey(repository),
234
+ currentRepositoryId: commandExecutionScopeKey(repository),
231
235
  permissionSnapshotVersion: permission?.revision ?? 1,
232
236
  approvalToken: token,
233
237
  command: commandForPersistence,
@@ -237,14 +241,14 @@ function finalizePreparedExecution(
237
241
  ...(input.workId ? { workId: input.workId, boundWorkId: input.workId } : {}),
238
242
  }) : undefined);
239
243
  const resolved = controllerHome && input.approvalRequestId
240
- ? assertResolvedAuthorization({ controllerHome, repositoryId: repository.repoId, approvalRequestId: input.approvalRequestId, sessionId: input.sessionId, principalId: input.principalId, workId: input.workId, permissionSnapshotVersion: permission?.revision ?? 1, command: commandForPersistence })
244
+ ? assertResolvedAuthorization({ controllerHome, repositoryId: commandExecutionScopeKey(repository), approvalRequestId: input.approvalRequestId, sessionId: input.sessionId, principalId: input.principalId, workId: input.workId, permissionSnapshotVersion: permission?.revision ?? 1, command: commandForPersistence })
241
245
  : undefined;
242
246
  const effectiveDecision: AuthorizationDecision | undefined = resolved
243
247
  ? { decision: 'allow', source: 'user_confirmation', reason: 'Resolved approval request matches the exact command and current permission snapshot.' }
244
248
  : delegated;
245
249
  const execution: RepositoryCommandExecution = {
246
250
  status: input.dryRun === true ? 'preview' : 'approval_required',
247
- repoId: repository.repoId,
251
+ repoId: commandExecutionScopeKey(repository),
248
252
  checkoutId: repository.activeCheckoutId,
249
253
  cwd: relativeCwd,
250
254
  command: commandForPersistence,
@@ -277,7 +281,7 @@ function finalizePreparedExecution(
277
281
  }
278
282
 
279
283
  function prepareRepositoryCommandExecution(
280
- repository: RepositoryRecord,
284
+ repository: RepositoryCommandScopeTarget,
281
285
  input: ExecuteRepositoryCommandInput,
282
286
  controllerHome?: string,
283
287
  ): {
@@ -298,7 +302,7 @@ function prepareRepositoryCommandExecution(
298
302
  const externalGrants = loadExternalFilesystemGrants(root).grants;
299
303
  const externalPathUsages = assertCommandPathOperandsStayInRepository(command, cwd, root, externalGrants, {
300
304
  controllerHome,
301
- repositoryId: repository.repoId,
305
+ repositoryId: commandExecutionScopeKey(repository),
302
306
  });
303
307
  const classification = classifyRepositoryCommand(command, repository.defaultBranch);
304
308
  const before = input.reuseSnapshot ?? (input.allowNonGitWorkspace ? emptyWorkspaceSnapshot() : repositorySnapshot(root));
@@ -317,7 +321,7 @@ function prepareRepositoryCommandExecution(
317
321
  }
318
322
 
319
323
  async function prepareRepositoryCommandExecutionAsync(
320
- repository: RepositoryRecord,
324
+ repository: RepositoryCommandScopeTarget,
321
325
  input: ExecuteRepositoryCommandInput,
322
326
  controllerHome?: string,
323
327
  mode: 'standard' | 'readonly_direct' = 'standard',
@@ -339,7 +343,7 @@ async function prepareRepositoryCommandExecutionAsync(
339
343
  const externalGrants = loadExternalFilesystemGrants(root).grants;
340
344
  const externalPathUsages = assertCommandPathOperandsStayInRepository(command, cwd, root, externalGrants, {
341
345
  controllerHome,
342
- repositoryId: repository.repoId,
346
+ repositoryId: commandExecutionScopeKey(repository),
343
347
  });
344
348
  const classification = classifyRepositoryCommand(command, repository.defaultBranch);
345
349
  if (mode === 'readonly_direct' && classification.risk !== 'readonly') {
@@ -373,7 +377,7 @@ async function prepareRepositoryCommandExecutionAsync(
373
377
  }
374
378
 
375
379
  export function previewRepositoryCommandExecution(
376
- repository: RepositoryRecord,
380
+ repository: RepositoryCommandScopeTarget,
377
381
  input: ExecuteRepositoryCommandInput,
378
382
  controllerHome?: string,
379
383
  ): PreparedRepositoryCommandExecution {
@@ -387,7 +391,7 @@ export function previewRepositoryCommandExecution(
387
391
 
388
392
  /** Async preview — preferred on Fast Path to avoid blocking Gateway with sync git snapshots. */
389
393
  export async function previewRepositoryCommandExecutionAsync(
390
- repository: RepositoryRecord,
394
+ repository: RepositoryCommandScopeTarget,
391
395
  input: ExecuteRepositoryCommandInput,
392
396
  controllerHome?: string,
393
397
  ): Promise<PreparedRepositoryCommandExecution> {
@@ -401,10 +405,12 @@ export async function previewRepositoryCommandExecutionAsync(
401
405
 
402
406
  function auditCommand(
403
407
  controllerHome: string,
404
- repository: RepositoryRecord,
408
+ repository: RepositoryCommandScopeTarget,
405
409
  execution: RepositoryCommandExecution,
406
410
  ): void {
407
- const path = join(repositoryControllerRoot(controllerHome, repository.repoId), 'audit', 'commands.jsonl');
411
+ // A workspace target has no repository semantics; its command audit belongs to
412
+ // the workspace partition, not a synthetic repository partition.
413
+ const path = join(scopedOperationRoot(controllerHome, commandExecutionScopeKey(repository)), 'audit', 'commands.jsonl');
408
414
  mkdirSync(dirname(path), { recursive: true });
409
415
  appendFileSync(path, `${JSON.stringify({
410
416
  timestamp: new Date().toISOString(),
@@ -416,7 +422,7 @@ function auditCommand(
416
422
 
417
423
  export function executeRepositoryCommand(
418
424
  controllerHome: string,
419
- repository: RepositoryRecord,
425
+ repository: RepositoryCommandScopeTarget,
420
426
  input: ExecuteRepositoryCommandInput,
421
427
  ): RepositoryCommandExecution {
422
428
  const prepared = prepareRepositoryCommandExecution(repository, input, controllerHome);
@@ -439,7 +445,7 @@ export function executeRepositoryCommand(
439
445
  try {
440
446
  assertRuntimeMayWriteOrThrow('remote_side_effect', controllerHome);
441
447
  } catch (error) {
442
- if (error instanceof Error && error.message.startsWith('WRITER_FENCED:')) throw error;
448
+ if (isRuntimeWriteFenceError(error)) throw error;
443
449
  /* unbound legacy */
444
450
  }
445
451
  }
@@ -499,7 +505,7 @@ export function executeRepositoryCommand(
499
505
  * mutation snapshot or Controller write state, Process records, Leases, Jobs or receipts.
500
506
  */
501
507
  export async function executeRepositoryReadOnlyCommandDirect(
502
- repository: RepositoryRecord,
508
+ repository: RepositoryCommandScopeTarget,
503
509
  input: ExecuteRepositoryCommandInput,
504
510
  ): Promise<RepositoryCommandExecution> {
505
511
  const prepared = await prepareRepositoryCommandExecutionAsync(
@@ -564,7 +570,7 @@ export async function executeRepositoryReadOnlyCommandDirect(
564
570
 
565
571
  export async function executeRepositoryCommandAsync(
566
572
  controllerHome: string,
567
- repository: RepositoryRecord,
573
+ repository: RepositoryCommandScopeTarget,
568
574
  input: ExecuteRepositoryCommandInput,
569
575
  hooks: RepositoryCommandAsyncHooks = {},
570
576
  ): Promise<RepositoryCommandExecution> {