@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
@@ -0,0 +1,91 @@
1
+ #!/usr/bin/env bun
2
+ import { readFileSync } from 'fs';
3
+ import { resolve } from 'path';
4
+ import type { McpPolicy, McpProfileName } from '../types';
5
+ import { buildControllerContextPackAsync } from '../../../src/cli/controller/context-pack';
6
+ import type { ControllerContextPackOptions } from '../../../src/cli/controller/context/types';
7
+ import { PROCESS_RUNTIME_RELEASE_CANARY_ARG } from '../../../src/runtime/execution/process-runtime/canary';
8
+ import { closeCodeGraphReadProviderSessions } from '../../../src/runtime/context/codegraph-read-provider';
9
+
10
+ interface ContextPackEnvelope {
11
+ schemaVersion: 1;
12
+ repoRoot: string;
13
+ policy: McpPolicy;
14
+ options: ControllerContextPackOptions;
15
+ }
16
+
17
+ function profile(value: unknown): McpProfileName {
18
+ if (value === 'planner' || value === 'executor' || value === 'orchestrator' || value === 'controller') return value;
19
+ throw new Error('CONTEXT_PACK_POLICY_PROFILE_INVALID');
20
+ }
21
+
22
+ function stringList(value: unknown): string[] {
23
+ if (!Array.isArray(value) || value.some((entry) => typeof entry !== 'string')) {
24
+ throw new Error('CONTEXT_PACK_POLICY_GLOBS_INVALID');
25
+ }
26
+ return value.map(String);
27
+ }
28
+
29
+ function policy(value: unknown): McpPolicy {
30
+ if (!value || typeof value !== 'object' || Array.isArray(value)) throw new Error('CONTEXT_PACK_POLICY_INVALID');
31
+ const input = value as Record<string, unknown>;
32
+ const execution = input.execution;
33
+ if (!execution || typeof execution !== 'object' || Array.isArray(execution)) throw new Error('CONTEXT_PACK_POLICY_EXECUTION_INVALID');
34
+ const e = execution as Record<string, unknown>;
35
+ const maxFileBytes = Number(input.maxFileBytes);
36
+ if (!Number.isFinite(maxFileBytes) || maxFileBytes <= 0) throw new Error('CONTEXT_PACK_POLICY_MAX_FILE_BYTES_INVALID');
37
+ return {
38
+ profile: profile(input.profile),
39
+ readGlobs: stringList(input.readGlobs),
40
+ writeGlobs: stringList(input.writeGlobs),
41
+ denyGlobs: stringList(input.denyGlobs),
42
+ maxFileBytes,
43
+ execution: {
44
+ fixedWorkflowCheck: e.fixedWorkflowCheck === true,
45
+ codexRunner: e.codexRunner === true,
46
+ agentRunner: e.agentRunner === true,
47
+ allowedAgents: Array.isArray(e.allowedAgents)
48
+ ? e.allowedAgents.filter((entry): entry is 'codex' | 'claude' => entry === 'codex' || entry === 'claude')
49
+ : [],
50
+ runnerTimeoutMs: Number(e.runnerTimeoutMs) || 0,
51
+ runnerMaxTimeoutMs: Number(e.runnerMaxTimeoutMs) || 0,
52
+ },
53
+ };
54
+ }
55
+
56
+ export async function runContextPackSidecar(
57
+ argv = process.argv.slice(2),
58
+ input = readFileSync(0, 'utf8'),
59
+ ): Promise<number> {
60
+ if (argv.includes(PROCESS_RUNTIME_RELEASE_CANARY_ARG)) {
61
+ process.stdout.write('forge context-pack release canary\n');
62
+ return 0;
63
+ }
64
+ const envelope = JSON.parse(input) as ContextPackEnvelope;
65
+ if (envelope.schemaVersion !== 1 || typeof envelope.repoRoot !== 'string' || !envelope.repoRoot.trim()) {
66
+ throw new Error('CONTEXT_PACK_REQUEST_INVALID');
67
+ }
68
+ try {
69
+ const pack = await buildControllerContextPackAsync(
70
+ resolve(envelope.repoRoot),
71
+ policy(envelope.policy),
72
+ envelope.options && typeof envelope.options === 'object' ? envelope.options : {},
73
+ );
74
+ process.stdout.write(`${JSON.stringify({ schemaVersion: 1, pack })}\n`);
75
+ return 0;
76
+ } finally {
77
+ // The Context Pack async path may reuse a CodeGraph session for progressive
78
+ // waves. This process is intentionally disposable, so do not inherit the
79
+ // normal 30-second provider idle lifetime.
80
+ await closeCodeGraphReadProviderSessions();
81
+ }
82
+ }
83
+
84
+ if (import.meta.main) {
85
+ try {
86
+ process.exitCode = await runContextPackSidecar();
87
+ } catch (error) {
88
+ console.error(error instanceof Error ? error.message : String(error));
89
+ process.exitCode = 1;
90
+ }
91
+ }
@@ -54,7 +54,7 @@ export function runtimeIdentitySnapshot(ctx: MultiRepositoryMcpToolContext): Run
54
54
  export function authenticatedFacadeControllerIdentity(
55
55
  ctx: MultiRepositoryMcpToolContext,
56
56
  args: Record<string, unknown>,
57
- _options: { allowTransportSessionRollover?: boolean } = {},
57
+ options: { allowTransportSessionRollover?: boolean } = {},
58
58
  ): { controllerId: string; principalId: string; sessionId: string; transportSessionId?: string; controllerAuthorityId?: string; authorityViaSessionCompatibility?: boolean; controllerInstanceId: string; controllerType: 'chatgpt' | 'codex' | 'claude' | 'grok' | 'human' } {
59
59
  const principalId = ctx.principalId?.trim();
60
60
  const transportSessionId = ctx.sessionId?.trim();
@@ -76,8 +76,16 @@ export function authenticatedFacadeControllerIdentity(
76
76
  // the caller does not provide an explicit compatibility carrier. Durable Work
77
77
  // authority is never derived from this request binding.
78
78
  const sessionId = transportSessionId || requestedSessionId || `mcp_request_${randomUUID().replace(/-/g, '')}`;
79
+ const transportRolloverRequested = Boolean(
80
+ transportSessionId
81
+ && requestedSessionId
82
+ && requestedSessionId !== transportSessionId,
83
+ );
84
+ if (transportRolloverRequested && options.allowTransportSessionRollover !== true) {
85
+ throw new Error('CONTROLLER_TRANSPORT_SESSION_ROLLOVER_NOT_ALLOWED: this operation must use the current authenticated transport session or an explicit controller_authority_id');
86
+ }
79
87
  const compatibilityAuthorityId = (!transportSessionId && requestedSessionId ? requestedSessionId : '')
80
- || (transportSessionId && requestedSessionId !== transportSessionId ? requestedSessionId : '');
88
+ || (transportRolloverRequested ? requestedSessionId : '');
81
89
  const controllerAuthorityId = requestedAuthorityId || compatibilityAuthorityId;
82
90
  const authorityViaSessionCompatibility = !requestedAuthorityId && Boolean(compatibilityAuthorityId);
83
91
  if (requestedControllerId && requestedControllerId !== principalId) {
@@ -117,7 +125,11 @@ export function assertFacadeControllerRoundAuthority(
117
125
  workId: string,
118
126
  args: Record<string, unknown>,
119
127
  ): ControllerRoundRelayRecord | undefined {
120
- const identity = authenticatedFacadeControllerIdentity(ctx, args);
128
+ // A frozen client may carry its explicit controller authority through the
129
+ // bounded `session_id` compatibility carrier. Resolving that carrier is not an
130
+ // authorization shortcut: `assertControllerRoundInvocationAuthority` still owns
131
+ // the exact principal/Work/round comparison below.
132
+ const identity = authenticatedFacadeControllerIdentity(ctx, args, { allowTransportSessionRollover: true });
121
133
  return assertControllerRoundInvocationAuthority({
122
134
  ...store,
123
135
  workId,
@@ -165,7 +177,10 @@ export function currentFacadeTerminalizationAuthority(
165
177
  workId: string,
166
178
  args: Record<string, unknown>,
167
179
  ): ControllerTerminalizationAuthority {
168
- const identity = authenticatedFacadeControllerIdentity(ctx, args);
180
+ // Frozen clients may carry an exact controller authority through the bounded
181
+ // `session_id` compatibility carrier; the terminalization authority check below
182
+ // still owns the exact owner/Work/revision comparison.
183
+ const identity = authenticatedFacadeControllerIdentity(ctx, args, { allowTransportSessionRollover: true });
169
184
  return controllerTerminalizationAuthorityForInvocation({
170
185
  ...store,
171
186
  workId,
@@ -181,7 +196,7 @@ export function currentTerminalCleanupAuthority(
181
196
  workId: string,
182
197
  args: Record<string, unknown>,
183
198
  ): ControllerTerminalizationAuthority {
184
- const identity = authenticatedFacadeControllerIdentity(ctx, args);
199
+ const identity = authenticatedFacadeControllerIdentity(ctx, args, { allowTransportSessionRollover: true });
185
200
  return terminalCleanupAuthorityForInvocation({
186
201
  ...store,
187
202
  workId,
@@ -0,0 +1,258 @@
1
+ import type { CallToolResult } from '../../../packages/protocols/mcp/tool-contract';
2
+ import type { MultiRepositoryMcpToolContext } from '../multi-repository';
3
+ import { callRepositoryTool } from '../tool-mapping/repository-tools';
4
+ import { commitSelectedPaths, selectedPathDiff, stageSelectedPaths } from '../../../src/cli/repositories/selected-path-actions';
5
+ import { deliverWork } from '../../../src/runtime/control-plane/execution/work-delivery-service';
6
+ import { validateWork } from '../../../src/runtime/control-plane/execution/work-operation-service';
7
+ import { startOrResumeSession } from './execution-tools';
8
+ import { result } from './result-adapter';
9
+ import { selected } from './shared-adapter';
10
+ import { callWorkflowSupervisorAdapter } from './workflow-supervisor-adapter';
11
+ import {
12
+ claimControllerRoundSession,
13
+ getControllerRoundRelay,
14
+ releaseObservedControllerSession,
15
+ submitControllerRoundDisposition,
16
+ type ControllerRoundDisposition,
17
+ } from '../../../packages/kernel/controller/api/index';
18
+ import { recoverControllerAuthority } from '../../../src/runtime/control-plane/execution/controller-authority-recovery';
19
+ import { authenticatedFacadeControllerIdentity, runtimeIdentitySnapshot } from './controller-authority-adapter';
20
+ import { readControllerConnectionSnapshot, repairControllerConnection } from '../../../src/runtime/control-plane/facade/controller-connection';
21
+ import { readLocalConversationProviderStatus, sendLocalConversation } from '../../../src/runtime/control-plane/launcher/local-conversation-controller';
22
+
23
+ function object(value: unknown): Record<string, unknown> {
24
+ if (!value || typeof value !== 'object' || Array.isArray(value)) return {};
25
+ return value as Record<string, unknown>;
26
+ }
27
+
28
+ export async function callCoreCapabilityAdapter(
29
+ ctx: MultiRepositoryMcpToolContext,
30
+ name: string,
31
+ args: Record<string, unknown>,
32
+ ): Promise<CallToolResult | undefined> {
33
+ if (name !== 'capability_execute') return undefined;
34
+ const capabilityId = typeof args.capability_id === 'string' ? args.capability_id.trim() : '';
35
+ const action = typeof args.action === 'string' ? args.action.trim() : '';
36
+ const input = object(args.arguments);
37
+
38
+ try {
39
+ if (capabilityId === 'controller.connection') {
40
+ if (action === 'get') return result({ ...readControllerConnectionSnapshot(ctx.controllerHome) });
41
+ if (action === 'repair_connector') return result(repairControllerConnection(ctx.controllerHome));
42
+ return result({ error: { code: 'CORE_CAPABILITY_ACTION_UNSUPPORTED', message: `Unsupported controller.connection action: ${action || '<empty>'}` } }, true);
43
+ }
44
+ if (capabilityId === 'controller.local_conversation') {
45
+ if (action === 'status') return result({ ...readLocalConversationProviderStatus() });
46
+ if (action === 'send') {
47
+ const conversationId = typeof input.conversation_id === 'string' ? input.conversation_id.trim() : '';
48
+ const prompt = typeof input.prompt === 'string' ? input.prompt.trim() : '';
49
+ const providerSessionId = typeof input.provider_session_id === 'string' ? input.provider_session_id.trim() : undefined;
50
+ const timeoutMs = typeof input.timeout_ms === 'number' ? input.timeout_ms : undefined;
51
+ const requestedRepoId = typeof args.repo_id === 'string' ? args.repo_id.trim() : '';
52
+ const repository = requestedRepoId ? selected(ctx, args) : undefined;
53
+ return result({ ...await sendLocalConversation({
54
+ controllerHome: ctx.controllerHome,
55
+ conversationId,
56
+ prompt,
57
+ providerSessionId,
58
+ repoId: repository?.repoId,
59
+ timeoutMs,
60
+ }) });
61
+ }
62
+ return result({ error: { code: 'CORE_CAPABILITY_ACTION_UNSUPPORTED', message: `Unsupported controller.local_conversation action: ${action || '<empty>'}` } }, true);
63
+ }
64
+ if (capabilityId === 'controller.workflow_supervisor') {
65
+ const forwarded = await callWorkflowSupervisorAdapter(ctx, 'supervisor_task', {
66
+ ...input,
67
+ operation: action,
68
+ request_id: typeof args.request_id === 'string' ? args.request_id.trim() : '',
69
+ ...(typeof args.repo_id === 'string' && args.repo_id.trim() ? { repo_id: args.repo_id.trim() } : {}),
70
+ });
71
+ return forwarded ?? result({ error: { code: 'CORE_CAPABILITY_ROUTE_UNAVAILABLE', message: 'Workflow Supervisor capability route is unavailable.' } }, true);
72
+ }
73
+ if (capabilityId === 'controller.round_recovery') {
74
+ if (action !== 'recover_and_dispose') {
75
+ return result({ error: { code: 'CORE_CAPABILITY_ACTION_UNSUPPORTED', message: `Unsupported controller.round_recovery action: ${action || '<empty>'}` } }, true);
76
+ }
77
+ if (input.user_directed !== true) throw new Error('WORK_CONTROLLER_AUTHORITY_RECOVERY_USER_REQUIRED: user_directed=true is required.');
78
+ const workId = typeof input.work_id === 'string' ? input.work_id.trim() : '';
79
+ const recoveryReason = typeof input.recovery_reason === 'string' ? input.recovery_reason.trim() : '';
80
+ const disposition = typeof input.disposition === 'string' ? input.disposition.trim() as ControllerRoundDisposition : undefined;
81
+ const handoffId = typeof input.handoff_id === 'string' ? input.handoff_id.trim() : undefined;
82
+ if (!workId) throw new Error('WORK_CONTROLLER_AUTHORITY_RECOVERY_WORK_REQUIRED');
83
+ if (!recoveryReason) throw new Error('WORK_CONTROLLER_AUTHORITY_RECOVERY_REASON_REQUIRED');
84
+ if (!disposition || !['continue_immediately', 'wait', 'wait_for_user', 'goal_complete'].includes(disposition)) {
85
+ throw new Error('CONTROLLER_RELAY_DISPOSITION_INVALID');
86
+ }
87
+ if (disposition === 'wait_for_user' && !handoffId) throw new Error('CONTROLLER_RELAY_WAIT_FOR_USER_HANDOFF_REQUIRED');
88
+
89
+ const repository = selected(ctx, args);
90
+ const store = { controllerHome: ctx.controllerHome, repoId: repository.repoId };
91
+ const before = getControllerRoundRelay(store, workId);
92
+ if (!before) throw new Error(`WORK_CONTROLLER_AUTHORITY_RECOVERY_RELAY_REQUIRED: ${workId}`);
93
+ const identity = authenticatedFacadeControllerIdentity(ctx, {});
94
+ const recovered = recoverControllerAuthority({
95
+ controllerHome: ctx.controllerHome,
96
+ repoId: repository.repoId,
97
+ repositoryActiveCheckoutId: repository.activeCheckoutId,
98
+ workId,
99
+ requestedBy: 'user',
100
+ recoveryReason,
101
+ identity,
102
+ runtime: runtimeIdentitySnapshot(ctx),
103
+ leaseMs: 60_000,
104
+ });
105
+ if (!('relay' in recovered)) throw new Error(`WORK_CONTROLLER_AUTHORITY_RECOVERY_RELAY_REQUIRED: ${workId}`);
106
+ if (before.providerDispatchEffectId && recovered.relay.providerDispatchEffectId !== before.providerDispatchEffectId) {
107
+ throw new Error(`WORK_CONTROLLER_AUTHORITY_RECOVERY_EFFECT_CHANGED: ${workId}`);
108
+ }
109
+
110
+ const claimed = claimControllerRoundSession(store, {
111
+ workId,
112
+ relayWorkId: workId,
113
+ sessionClaim: {
114
+ workId,
115
+ controllerId: identity.controllerId,
116
+ controllerType: identity.controllerType,
117
+ sessionId: identity.sessionId,
118
+ principalId: identity.principalId,
119
+ controllerInstanceId: identity.controllerInstanceId,
120
+ leaseMs: 60_000,
121
+ },
122
+ });
123
+ if (!claimed.relay || claimed.relay.status !== 'claimed') throw new Error(`CONTROLLER_RELAY_ROUND_NOT_CLAIMED: ${claimed.relay?.status ?? 'missing'}`);
124
+
125
+ let disposed;
126
+ let releaseResult;
127
+ try {
128
+ disposed = submitControllerRoundDisposition(store, {
129
+ workId,
130
+ identity: {
131
+ controllerId: claimed.session.controllerId,
132
+ controllerType: claimed.session.controllerType,
133
+ principalId: claimed.session.principalId?.trim() || claimed.session.controllerId,
134
+ controllerInstanceId: claimed.session.controllerInstanceId?.trim() || '',
135
+ sessionId: claimed.session.sessionId,
136
+ },
137
+ disposition,
138
+ relayScopeId: recovered.relay.relayScopeId,
139
+ requirementId: recovered.relay.requirementId,
140
+ ...(handoffId ? { handoffId } : {}),
141
+ reason: recoveryReason,
142
+ });
143
+ } finally {
144
+ releaseResult = releaseObservedControllerSession(store, {
145
+ workId,
146
+ actor: `controller-round-recovery:${identity.controllerId}`,
147
+ owner: claimed.session,
148
+ });
149
+ }
150
+ if (!releaseResult?.allowed) throw new Error(`WORK_CONTROLLER_RELEASE_FENCED: ${workId}:${releaseResult?.reason ?? 'unknown'}`);
151
+ const after = getControllerRoundRelay(store, workId);
152
+ return result({
153
+ repoId: repository.repoId,
154
+ workId,
155
+ authorityRecovered: true,
156
+ claimed: true,
157
+ disposition,
158
+ dispositionStatus: disposed.status,
159
+ relayScopeId: disposed.relayScopeId,
160
+ ownerReleased: true,
161
+ providerDispatchEffectId: after?.providerDispatchEffectId,
162
+ providerDispatchEffectPreserved: before.providerDispatchEffectId === after?.providerDispatchEffectId,
163
+ providerRedispatched: false,
164
+ });
165
+ }
166
+ if (capabilityId === 'repository.direct_edit') {
167
+ const toolName = action === 'plan'
168
+ ? 'repository_safe_patch_plan'
169
+ : action === 'apply'
170
+ ? 'repository_safe_patch_apply'
171
+ : undefined;
172
+ if (!toolName) {
173
+ return result({ error: { code: 'CORE_CAPABILITY_ACTION_UNSUPPORTED', message: `Unsupported repository.direct_edit action: ${action || '<empty>'}` } }, true);
174
+ }
175
+ const workId = action === 'apply' && typeof input.work_id === 'string' ? input.work_id.trim() : '';
176
+ const callerSession = workId && (!ctx.sessionId || !ctx.principalId || !ctx.controllerInstanceId)
177
+ ? startOrResumeSession(ctx)
178
+ : undefined;
179
+ const forwarded = await callRepositoryTool(ctx.controllerHome, toolName, {
180
+ ...input,
181
+ ...(typeof args.repo_id === 'string' && args.repo_id.trim() ? { repo_id: args.repo_id.trim() } : {}),
182
+ ...(typeof args.checkout_id === 'string' && args.checkout_id.trim() ? { checkout_id: args.checkout_id.trim() } : {}),
183
+ }, {
184
+ sessionId: callerSession?.sessionId ?? ctx.sessionId,
185
+ principalId: callerSession?.principalId ?? ctx.principalId,
186
+ controllerInstanceId: callerSession?.controllerInstanceId ?? ctx.controllerInstanceId,
187
+ });
188
+ return forwarded ?? result({
189
+ error: { code: 'CORE_CAPABILITY_ROUTE_UNAVAILABLE', message: 'Repository direct-edit capability route is unavailable.' },
190
+ }, true);
191
+ }
192
+ if (capabilityId === 'repository.validation') {
193
+ if (action !== 'validate_work') {
194
+ return result({ error: { code: 'CORE_CAPABILITY_ACTION_UNSUPPORTED', message: `Unsupported repository.validation action: ${action || '<empty>'}` } }, true);
195
+ }
196
+ const repository = selected(ctx, args);
197
+ const sessionId = typeof input.session_id === 'string' && input.session_id.trim()
198
+ ? input.session_id.trim()
199
+ : startOrResumeSession(ctx).sessionId;
200
+ return result(await validateWork(ctx, {
201
+ ...input,
202
+ session_id: sessionId,
203
+ repo_id: repository.repoId,
204
+ request_id: typeof args.request_id === 'string' ? args.request_id.trim() : '',
205
+ }));
206
+ }
207
+ if (capabilityId !== 'repository.git') {
208
+ return result({ error: { code: 'CORE_CAPABILITY_UNSUPPORTED', message: `Unsupported core capability: ${capabilityId || '<empty>'}` } }, true);
209
+ }
210
+ const repository = selected(ctx, args);
211
+ switch (action) {
212
+ case 'diff_paths':
213
+ return result({
214
+ ...selectedPathDiff(repository, {
215
+ paths: input.paths,
216
+ staged: input.staged === true,
217
+ maxBytes: typeof input.max_bytes === 'number' ? input.max_bytes : undefined,
218
+ }),
219
+ });
220
+ case 'stage_paths': {
221
+ const staged = stageSelectedPaths(ctx.controllerHome, repository, { paths: input.paths });
222
+ return result({
223
+ repoId: repository.repoId,
224
+ checkoutId: repository.activeCheckoutId,
225
+ ...staged,
226
+ }, staged.execution.ok !== true);
227
+ }
228
+ case 'commit_paths': {
229
+ const committed = commitSelectedPaths(ctx.controllerHome, repository, {
230
+ paths: input.paths,
231
+ message: input.message,
232
+ });
233
+ return result({
234
+ repoId: repository.repoId,
235
+ checkoutId: repository.activeCheckoutId,
236
+ ...committed,
237
+ }, Boolean(committed.error));
238
+ }
239
+ case 'deliver_work': {
240
+ const sessionId = typeof input.session_id === 'string' && input.session_id.trim()
241
+ ? input.session_id.trim()
242
+ : startOrResumeSession(ctx).sessionId;
243
+ const delivered = await deliverWork(ctx, {
244
+ ...input,
245
+ session_id: sessionId,
246
+ repo_id: repository.repoId,
247
+ });
248
+ return result(delivered);
249
+ }
250
+ default:
251
+ return result({ error: { code: 'CORE_CAPABILITY_ACTION_UNSUPPORTED', message: `Unsupported repository.git action: ${action || '<empty>'}` } }, true);
252
+ }
253
+ } catch (error) {
254
+ const message = error instanceof Error ? error.message : String(error);
255
+ const structuredCode = /^([A-Z][A-Z0-9_]+)(?::|$)/.exec(message)?.[1];
256
+ return result({ error: { code: structuredCode ?? 'CORE_CAPABILITY_FAILED', message } }, true);
257
+ }
258
+ }
@@ -5,11 +5,13 @@ import {
5
5
  engineeringRequirementContextDigest,
6
6
  type ContextClosureReceipt,
7
7
  type EngineeringAdmissionEvidence,
8
+ type EngineeringDecisionArea,
8
9
  type IndependentCritiqueFinding,
9
10
  type ProjectEngineeringContractReceipt,
10
11
  } from '../../../packages/kernel/work/api/index';
11
12
  import { loadProjectEngineeringContract } from '../../../src/runtime/context/project-engineering-contract';
12
13
  import { validateRuntimeIssuedContextClosureReceipt } from '../../../src/runtime/context/context-closure';
14
+ import { ENGINEERING_DECISION_INPUT_ENTRIES, engineeringDecisionInputKey } from './engineering-tool-contract';
13
15
 
14
16
  type RecordValue = Record<string, unknown>;
15
17
  function object(value: unknown, code: string): RecordValue {
@@ -25,6 +27,10 @@ function strings(value: unknown, code: string): string[] {
25
27
  return value.map((entry) => text(entry, code));
26
28
  }
27
29
 
30
+ function engineeringDecisionErrorCode(area: EngineeringDecisionArea): string {
31
+ return `ENGINEERING_DESIGN_${engineeringDecisionInputKey(area).toUpperCase()}_REQUIRED`;
32
+ }
33
+
28
34
  export function mintEngineeringAdmissionEvidence(input: {
29
35
  repoRoot: string;
30
36
  sourceRevision: string;
@@ -60,33 +66,10 @@ export function mintEngineeringAdmissionEvidence(input: {
60
66
 
61
67
  const design = object(draft.design_decision, 'ENGINEERING_DESIGN_DECISION_REQUIRED');
62
68
  const decisionsInput = object(design.decisions, 'ENGINEERING_DESIGN_DECISIONS_REQUIRED');
63
- const decisions = {
64
- ownership: text(decisionsInput.ownership, 'ENGINEERING_DESIGN_OWNERSHIP_REQUIRED'),
65
- singleWriter: text(decisionsInput.single_writer, 'ENGINEERING_DESIGN_SINGLE_WRITER_REQUIRED'),
66
- transaction: text(decisionsInput.transaction, 'ENGINEERING_DESIGN_TRANSACTION_REQUIRED'),
67
- lifecycle: text(decisionsInput.lifecycle, 'ENGINEERING_DESIGN_LIFECYCLE_REQUIRED'),
68
- concurrency: text(decisionsInput.concurrency, 'ENGINEERING_DESIGN_CONCURRENCY_REQUIRED'),
69
- persistence: text(decisionsInput.persistence, 'ENGINEERING_DESIGN_PERSISTENCE_REQUIRED'),
70
- failure: text(decisionsInput.failure, 'ENGINEERING_DESIGN_FAILURE_REQUIRED'),
71
- projectionCache: text(decisionsInput.projection_cache, 'ENGINEERING_DESIGN_PROJECTION_CACHE_REQUIRED'),
72
- time: text(decisionsInput.time, 'ENGINEERING_DESIGN_TIME_REQUIRED'),
73
- performance: text(decisionsInput.performance, 'ENGINEERING_DESIGN_PERFORMANCE_REQUIRED'),
74
- compatibility: text(decisionsInput.compatibility, 'ENGINEERING_DESIGN_COMPATIBILITY_REQUIRED'),
75
- semanticScopeIdentity: text(decisionsInput.semantic_scope_identity, 'ENGINEERING_DESIGN_SEMANTIC_SCOPE_IDENTITY_REQUIRED'),
76
- authorizationTrust: text(decisionsInput.authorization_trust, 'ENGINEERING_DESIGN_AUTHORIZATION_TRUST_REQUIRED'),
77
- resourceFencing: text(decisionsInput.resource_fencing, 'ENGINEERING_DESIGN_RESOURCE_FENCING_REQUIRED'),
78
- deploymentTopology: text(decisionsInput.deployment_topology, 'ENGINEERING_DESIGN_DEPLOYMENT_TOPOLOGY_REQUIRED'),
79
- schemaEvolutionDurability: text(decisionsInput.schema_evolution_durability, 'ENGINEERING_DESIGN_SCHEMA_EVOLUTION_DURABILITY_REQUIRED'),
80
- idempotencyReplay: text(decisionsInput.idempotency_replay, 'ENGINEERING_DESIGN_IDEMPOTENCY_REPLAY_REQUIRED'),
81
- retentionGc: text(decisionsInput.retention_gc, 'ENGINEERING_DESIGN_RETENTION_GC_REQUIRED'),
82
- observabilityEvidence: text(decisionsInput.observability_evidence, 'ENGINEERING_DESIGN_OBSERVABILITY_EVIDENCE_REQUIRED'),
83
- recoveryFailureDomain: text(decisionsInput.recovery_failure_domain, 'ENGINEERING_DESIGN_RECOVERY_FAILURE_DOMAIN_REQUIRED'),
84
- capacityBackpressure: text(decisionsInput.capacity_backpressure, 'ENGINEERING_DESIGN_CAPACITY_BACKPRESSURE_REQUIRED'),
85
- releaseUpgradeRollback: text(decisionsInput.release_upgrade_rollback, 'ENGINEERING_DESIGN_RELEASE_UPGRADE_ROLLBACK_REQUIRED'),
86
- securityPrivacy: text(decisionsInput.security_privacy, 'ENGINEERING_DESIGN_SECURITY_PRIVACY_REQUIRED'),
87
- portability: text(decisionsInput.portability, 'ENGINEERING_DESIGN_PORTABILITY_REQUIRED'),
88
- migrationRetirement: text(decisionsInput.migration_retirement, 'ENGINEERING_DESIGN_MIGRATION_RETIREMENT_REQUIRED'),
89
- };
69
+ const decisions = Object.fromEntries(ENGINEERING_DECISION_INPUT_ENTRIES.map(({ area, field }) => [
70
+ area,
71
+ text(decisionsInput[field], engineeringDecisionErrorCode(area)),
72
+ ])) as Record<EngineeringDecisionArea, string>;
90
73
  const budgetInput = object(design.complexity_budget, 'ENGINEERING_COMPLEXITY_BUDGET_REQUIRED');
91
74
  const complexityBudget = {
92
75
  addedWriters: Number(budgetInput.added_writers ?? 0),
@@ -0,0 +1,15 @@
1
+ import {
2
+ ENGINEERING_DECISION_AREAS,
3
+ type EngineeringDecisionArea,
4
+ } from '../../../packages/kernel/work/api/index';
5
+
6
+ export function engineeringDecisionInputKey(area: EngineeringDecisionArea): string {
7
+ return area.replace(/[A-Z]/g, (character) => `_${character.toLowerCase()}`);
8
+ }
9
+
10
+ export const ENGINEERING_DECISION_INPUT_ENTRIES = ENGINEERING_DECISION_AREAS.map((area) => ({
11
+ area,
12
+ field: engineeringDecisionInputKey(area),
13
+ }));
14
+
15
+ export const ENGINEERING_DECISION_INPUT_FIELDS = ENGINEERING_DECISION_INPUT_ENTRIES.map(({ field }) => field);
@@ -11,33 +11,10 @@ import { readControllerResult, searchControllerResult } from '../../../src/runti
11
11
  import { resumeExecutionJobAfterApproval } from '../../../src/runtime/execution/jobs/store';
12
12
  import { recordMcpTiming, type McpTimingTrace } from '../../../src/runtime/diagnostics/mcp-timing';
13
13
  import { compactHandle, contractFor, identityFor, makeBoundedWorkResult, principalFor, requireSession, workForSession } from '../../../src/runtime/control-plane/execution/work-execution-support';
14
- import { finalizeWork } from '../../../src/runtime/control-plane/execution/work-finalization-service';
15
14
  import { bindSessionRepository, prepareWork } from '../../../src/runtime/control-plane/execution/work-preparation-service';
16
15
  import { executeWork, validateWork } from '../../../src/runtime/control-plane/execution/work-operation-service';
17
16
 
18
-
19
- // Compatibility exports: implementation authority lives in control-plane execution.
20
- export {
21
- inspectWorkTargetAdvance,
22
- targetAdvanceLinearMergeCommits,
23
- planTargetAdvanceValidationAuthority,
24
- targetAdvanceWorkScopeViolation,
25
- inspectDirectTargetDelivery,
26
- inspectTargetDirtyWorkOwnership,
27
- inspectDirectCanonicalTargetAdvanceReconciliation,
28
- completionReceiptChangedPaths,
29
- inspectCleanupOnlyMergedHead,
30
- resetFinalizationStagesForRequest,
31
- } from '../../../src/runtime/control-plane/execution/work-finalization-service';
32
- export { releasePreparedWorkOwnership } from '../../../src/runtime/control-plane/execution/work-execution-support';
33
17
  export { selectDefaultWorkValidationChecks } from '../../../src/runtime/control-plane/execution/work-operation-service';
34
- export type {
35
- DirectCanonicalTargetAdvanceInspection,
36
- DirectTargetDeliveryInspection,
37
- TargetAdvanceValidationTransferPlan,
38
- TargetDirtyWorkOwnershipInspection,
39
- WorkTargetAdvanceInspection,
40
- } from '../../../src/runtime/control-plane/execution/work-finalization-service';
41
18
 
42
19
  function definition(name: string, description: string, properties: Record<string, unknown>, required: string[] = [], readOnlyHint = false, destructiveHint = false): McpToolDefinition {
43
20
  return { name, description, inputSchema: { type: 'object', properties, ...(required.length ? { required } : {}), additionalProperties: false }, annotations: { readOnlyHint, openWorldHint: false, destructiveHint } };
@@ -52,24 +29,20 @@ export const executionToolDefinitions: McpToolDefinition[] = [
52
29
  definition('session_bind_repository', 'Explicitly bind the current session to one registered repository and checkout.', { session_id: sessionId, repo_id: repoId, checkout_id: { type: 'string' } }, ['repo_id'], false),
53
30
  definition('work_prepare', 'Prepare or reuse one controller-owned work handle and bind it to a WorkContract, checkout, branch, and permission snapshot.', {
54
31
  session_id: sessionId, repo_id: repoId, checkout_id: { type: 'string' }, work_id: workId,
55
- objective: { type: 'string' }, goal_id: { type: 'string' }, acceptance_criteria: { type: 'array', items: { type: 'string' } }, allowed_paths: { type: 'array', items: { type: 'string' } }, checks: { type: 'array', items: { type: 'string' } },
32
+ objective: { type: 'string' }, goal_id: { type: 'string' }, acceptance_criteria: { type: 'array', items: { type: 'string' } }, checks: { type: 'array', items: { type: 'string' } },
56
33
  isolation: { type: 'string', enum: ['reuse', 'new_worktree', 'auto'] }, base_ref: { type: 'string' }, needs_dependencies: { type: 'boolean' },
57
34
  expected_previous_head: { type: 'string', description: 'Explicit prior WorkHandle HEAD required for audited successor adoption of an existing work_id.' },
58
- adopt_candidate_head: { type: 'string', description: 'Explicit current successor commit to adopt after exact identity, ownership, cleanliness, ancestry, and path-scope validation.' },
35
+ adopt_candidate_head: { type: 'string', description: 'Explicit current successor commit to adopt after exact identity, ownership, cleanliness, and ancestry validation.' },
59
36
  }, [], false),
60
- definition('work_inspect', 'Collect bounded Git, WorkContract, path, check, and readiness evidence through one work handle.', { session_id: sessionId, repo_id: repoId, work_id: workId, detail: { type: 'string', enum: ['summary', 'detail'] } }, ['work_id'], true),
37
+ definition('work_inspect', 'Collect bounded Git, WorkContract, changed-path, check, and readiness evidence through one work handle.', { session_id: sessionId, repo_id: repoId, work_id: workId, detail: { type: 'string', enum: ['summary', 'detail'] } }, ['work_id'], true),
61
38
  definition('work_execute', 'Execute approved, repository-scoped commands against a validated work handle while preserving the existing command policy and audit path.', {
62
39
  session_id: sessionId, controller_id: { type: 'string', description: 'Controller identity that holds the Work lease. Defaults to the authenticated principal.' }, repo_id: repoId, work_id: workId,
63
40
  command: { anyOf: [{ type: 'string' }, { type: 'array', items: { type: 'string' }, minItems: 1 }] }, approval_token: { type: 'string' }, cwd: { type: 'string' }, timeout_ms: { type: 'number' }, max_output_bytes: { type: 'number' },
64
41
  commands: { type: 'array', items: { type: 'object' } }, approval_request_id: { type: 'string' },
65
42
  }, ['work_id'], false),
66
43
  definition('work_validate', 'Run targeted checks or read-only validation commands against a work handle with full current-state validation.', {
67
- session_id: sessionId, controller_id: { type: 'string', description: 'Controller identity that holds the Work lease. Defaults to the authenticated principal.' }, repo_id: repoId, work_id: workId, check_ids: { type: 'array', items: { type: 'string' } }, commands: { type: 'array', items: { type: 'object' } },
44
+ session_id: sessionId, controller_id: { type: 'string', description: 'Controller identity that holds the Work lease. Defaults to the authenticated principal.' }, repo_id: repoId, work_id: workId, check_ids: { type: 'array', items: { type: 'string' } }, commands: { type: 'array', items: { type: 'object' } }, interactive_wait_ms: { type: 'number', description: 'Optional bounded attach window for checks launched by this validation call. Defaults to asynchronous behavior.' },
68
45
  }, ['work_id'], false),
69
- definition('work_finalize', 'Idempotently validate, commit, merge, clean a managed worktree, and complete the existing WorkContract in independently recorded stages.', {
70
- session_id: sessionId, controller_id: { type: 'string', description: 'Controller identity that holds the Work lease. Defaults to the authenticated principal.' }, repo_id: repoId, work_id: workId, commit: { type: 'boolean' }, message: { type: 'string' }, merge: { type: 'boolean' }, target_branch: { type: 'string' }, remote_write: { type: 'boolean', description: 'When true, push the exact locally integrated target revision to origin before cleanup and Work terminalization.' }, delete_branch: { type: 'boolean' }, cleanup: { type: 'boolean' }, no_ff: { type: 'boolean' }, approval_request_id: { type: 'string' },
71
- completion_outcome: { type: 'string', enum: ['completed_changed', 'completed_no_change'] }, no_change_evidence: { type: 'string', description: 'Objective-specific proof that the requested state already holds; required for completed_no_change.' },
72
- }, ['work_id'], false, true),
73
46
  definition('approval_resolve', 'Resolve a controller approval request from the current conversation; GUI approval is optional and not required for continuation.', { session_id: sessionId, repo_id: repoId, work_id: workId, approval_request_id: { type: 'string' }, confirm_authorization: { type: 'boolean' } }, ['approval_request_id', 'confirm_authorization'], false),
74
47
  definition('result_read', 'Read a session-scoped result reference with bounded pagination.', { session_id: sessionId, result_ref: { type: 'string' }, work_id: workId, cursor: { type: 'number' }, limit: { type: 'number' } }, ['result_ref'], true),
75
48
  definition('result_search', 'Search a session-scoped result reference without returning the full payload.', { session_id: sessionId, result_ref: { type: 'string' }, work_id: workId, query: { type: 'string' }, limit: { type: 'number' } }, ['result_ref', 'query'], true),
@@ -77,15 +50,10 @@ export const executionToolDefinitions: McpToolDefinition[] = [
77
50
 
78
51
  const executionToolNames = new Set(executionToolDefinitions.map((tool) => tool.name));
79
52
 
80
- /**
81
- * Work mutation tool names remain grouped for compatibility with older Worker
82
- * entrypoints. On the public MCP surface they execute directly through
83
- * WorkContract + Process Runtime ownership rather than durable ExecutionJobs.
84
- */
53
+ /** Repository execution and validation remain Process/WorkHandle operations; semantic Work completion is separate. */
85
54
  const DURABLE_WORK_OPERATION_NAMES = new Set([
86
55
  'work_execute',
87
56
  'work_validate',
88
- 'work_finalize',
89
57
  ]);
90
58
 
91
59
  export function isDurableWorkOperation(name: string): boolean {
@@ -102,7 +70,7 @@ function failure(error: unknown): CallToolResult {
102
70
  return result({ error: { code, message } }, true);
103
71
  }
104
72
 
105
- function startOrResumeSession(ctx: MultiRepositoryMcpToolContext): ExecutionSessionContext {
73
+ export function startOrResumeSession(ctx: MultiRepositoryMcpToolContext): ExecutionSessionContext {
106
74
  const permissionVersion = ctx.explicitRepository ? currentPermissionSnapshotVersion(ctx.controllerHome, ctx.explicitRepository.repoId) : 0;
107
75
  return startExecutionSession(ctx.controllerHome, {
108
76
  sessionId: ctx.sessionId,
@@ -135,15 +103,14 @@ function inspectWork(ctx: MultiRepositoryMcpToolContext, args: Record<string, un
135
103
  git: { status, diff: { nameOnly: diff.nameOnly, stat: diff.stat, patch: diff.patch, truncated: diff.truncated } },
136
104
  workContract: contract ? {
137
105
  workId: contract.workId,
138
- status: contract.status,
106
+ state: contract.semanticState,
139
107
  objective: contract.objective,
140
108
  checks: contract.checks,
141
109
  acceptanceCriteria: contract.acceptanceCriteria,
142
- allowedPaths: contract.allowedPaths,
143
110
  semantics: buildWorkContinuationSnapshot(contract).semantics,
144
111
  } : undefined,
145
112
  continuation: contract ? buildWorkContinuationSnapshot(contract) : undefined,
146
- paths: { allowed: handle.workContractId ? contract?.allowedPaths ?? [] : [], relevant: diff.nameOnly },
113
+ paths: { changed: diff.nameOnly },
147
114
  checks: checks.map((checkId) => ({ checkId, registered: listControllerChecks(validated.worktreeRepository.canonicalRoot).some((check) => check.id === checkId) })),
148
115
  package: packageManifest ? { name: packageManifest.name, scripts: packageManifest.scripts } : undefined,
149
116
  };
@@ -166,7 +133,6 @@ export async function callExecutionTool(ctx: MultiRepositoryMcpToolContext, name
166
133
  case 'work_inspect': return result(inspectWork(ctx, args));
167
134
  case 'work_execute': return result(await executeWork(ctx, args));
168
135
  case 'work_validate': return result(await validateWork(ctx, args));
169
- case 'work_finalize': return result(await finalizeWork(ctx, args));
170
136
  case 'approval_resolve': {
171
137
  const session = requireSession(ctx, args);
172
138
  const repositoryId = typeof args.repo_id === 'string' && args.repo_id.trim() ? args.repo_id.trim() : session.activeRepositoryId;
@@ -20,11 +20,12 @@ async function runEditSessionValidationViaProcessRuntime(
20
20
  args: Record<string, unknown>,
21
21
  ): Promise<CallToolResult> {
22
22
  const resolved = resolveEditValidationRepository(repository, editSessionId);
23
+ const explicitWorkId = typeof args.work_id === 'string' && args.work_id.trim() ? args.work_id.trim() : undefined;
23
24
  const binding = claimedSessionEditBinding(ctx.controllerHome, resolved.repository, {
24
25
  sessionId: ctx.sessionId,
25
26
  principalId: ctx.principalId,
26
27
  controllerInstanceId: ctx.controllerInstanceId,
27
- }, args.work_id);
28
+ }, explicitWorkId ?? resolved.session.workId);
28
29
  assertEditSessionDurableBinding(resolved.session, binding, { requireBoundIdentity: true });
29
30
  const validation = await startOrJoinEditValidation(ctx.controllerHome, resolved.repository, {
30
31
  editSessionId,