@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,23 +1,20 @@
1
1
  import { createHash } from 'crypto';
2
2
  import { spawnSync } from 'child_process';
3
3
  import type { McpExecutionContext } from '../../../../packages/protocols/mcp/execution-context';
4
- import type { RepositoryRecord } from '../../../cli/repositories/types';
5
4
  import { getRepository, resolveRepositorySelection, selectRepositoryCheckout } from '../../../cli/repositories/registry';
6
5
  import { repositoryGitStatus } from '../../../cli/repositories/structured-git';
7
6
  import { ensureManagedWorkspace } from '../../execution/managed-workspace';
7
+ import { listRecoverableProcessRecords } from '../../execution/process-runtime/store';
8
8
  import { readRepositoryAccessPolicy } from '../governance/access-policy';
9
- import { activateWorkContract, appendWorkEvidence, failWorkContract, getWorkContract, recordWorkEvidenceState, updateWorkContract } from '../../../../packages/kernel/work/api/index';
10
- import { admitPreparedRepositoryWorkContract } from '../facade/repository-work-admission';
11
- import { isTerminalWorkContractStatus, type WorkReconciliationRecord } from '../facade/types';
12
- import { claimControllerSession, getControllerSession, resumeControllerSession } from '../../../../packages/kernel/controller/api/index';
9
+ import { activateWorkContract, failWorkContract, getWorkContract } from '../../../../packages/kernel/work/api/index';
10
+ import { admitPreparedRepositoryWorkContract, materializeRepositoryWorkPlacement } from '../facade/repository-work-admission';
11
+ import { isTerminalSemanticWorkState } from '../facade/types';
13
12
  import { updateExecutionSession, type ExecutionSessionContext } from './session-store';
14
13
  import { currentPermissionSnapshotVersion, validateWorkHandle } from './validation';
15
- import { assertExecutionIdentity, executionIdentityFromCoordinates } from './execution-identity';
16
14
  import { withWorkPrepareRequest } from './work-prepare-request-store';
17
- import { markWorkHandleFailed, newWorkId, readWorkHandle, transitionWorkHandle, writeWorkHandle, type WorkFinalizationStages, type WorkHandleState } from './work-handle-store';
18
- import { assertWorkPathsWithinScope } from './work-path-scope';
15
+ import { markWorkHandleFailed, newWorkId, readWorkHandle, writeWorkHandle, type WorkFinalizationStages, type WorkHandleState } from './work-handle-store';
19
16
  import { createGoalDelegation } from '../governance/authorization';
20
- import { compactHandle, contractFor, findWorkHandle, gitChangedPaths, gitCommit, gitHead, gitMergeBase, identityFor, requireSession, selectWorkFinalizationTarget } from './work-execution-support';
17
+ import { compactHandle, contractFor, findWorkHandle, gitHead, gitIsAncestor, identityFor, requireSession } from './work-execution-support';
21
18
 
22
19
  function requireExplicitRepoId(args: Record<string, unknown>): string {
23
20
  const value = typeof args.repo_id === 'string' ? args.repo_id.trim() : '';
@@ -39,21 +36,7 @@ function initialStage(): WorkFinalizationStages {
39
36
  return { validation: 'pending', commit: 'pending', merge: 'pending', branchCleanup: 'pending', worktreeCleanup: 'pending' };
40
37
  }
41
38
 
42
- /**
43
- * A previous finalization request may have validated a Work and explicitly
44
- * skipped every effectful stage without delivering or cleaning anything. That
45
- * is retryable preparation history, not an irreversible finalization boundary.
46
- * Any done/failed effectful stage or retained finalization error stays fenced.
47
- */
48
- export function workHeadAdoptionFinalizationIsRetryable(stages: WorkFinalizationStages): boolean {
49
- if (stages.validation === 'failed' || stages.lastError) return false;
50
- return [stages.commit, stages.merge, stages.branchCleanup, stages.worktreeCleanup]
51
- .every((stage) => stage === 'pending' || stage === 'skipped');
52
- }
53
39
 
54
- function normalizedRequiredString(args: Record<string, unknown>, key: string): string | undefined {
55
- return typeof args[key] === 'string' && args[key].trim() ? args[key].trim() : undefined;
56
- }
57
40
 
58
41
  function boundedStringArray(value: unknown, limit: number): string[] {
59
42
  return Array.isArray(value) ? value.map(String).slice(0, limit) : [];
@@ -74,231 +57,12 @@ function workPrepareFingerprint(input: {
74
57
  return createHash('sha256').update(JSON.stringify({ schemaVersion: 1, operation: 'work_prepare', ...input })).digest('hex');
75
58
  }
76
59
 
77
- function claimPreparedWorkOwnership(
78
- ctx: McpExecutionContext,
79
- session: ExecutionSessionContext,
80
- handle: WorkHandleState,
81
- args: Record<string, unknown>,
82
- ): void {
83
- const workIdValue = handle.workContractId ?? handle.workId;
84
- const controllerId = typeof args.controller_id === 'string' && args.controller_id.trim()
85
- ? args.controller_id.trim()
86
- : session.principalId;
87
- claimControllerSession({ controllerHome: ctx.controllerHome, repoId: handle.repositoryId }, {
88
- workId: workIdValue,
89
- controllerId,
90
- controllerType: 'chatgpt',
91
- sessionId: session.sessionId,
92
- principalId: session.principalId,
93
- controllerInstanceId: session.controllerInstanceId,
94
- leaseMs: 3_600_000,
95
- });
96
- }
97
-
98
- function claimHeadAdoptionOwnership(
99
- ctx: McpExecutionContext,
100
- session: ExecutionSessionContext,
101
- handle: WorkHandleState,
102
- args: Record<string, unknown>,
103
- ): void {
104
- const workIdValue = handle.workContractId ?? handle.workId;
105
- const controllerId = normalizedRequiredString(args, 'controller_id') ?? session.principalId;
106
- if (controllerId !== session.principalId) {
107
- throw new Error('WORK_CONTROLLER_IDENTITY_MISMATCH: controller_id must match the authenticated principal');
108
- }
109
- const options = { controllerHome: ctx.controllerHome, repoId: handle.repositoryId };
110
- const current = getControllerSession(options, workIdValue);
111
- const input = {
112
- workId: workIdValue,
113
- controllerId,
114
- controllerType: current?.controllerType ?? 'chatgpt' as const,
115
- sessionId: session.sessionId,
116
- principalId: session.principalId,
117
- controllerInstanceId: session.controllerInstanceId,
118
- expectedClaimGeneration: current?.claimGeneration ?? 0,
119
- leaseMs: 3_600_000,
120
- };
121
- const claimed = current
122
- ? resumeControllerSession(options, input)
123
- : claimControllerSession(options, input);
124
- if (
125
- claimed.controllerId !== controllerId
126
- || claimed.sessionId !== session.sessionId
127
- || claimed.principalId !== session.principalId
128
- || claimed.controllerInstanceId !== session.controllerInstanceId
129
- || (claimed.claimGeneration ?? 0) < 1
130
- ) {
131
- throw new Error('WORK_HEAD_ADOPTION_OWNERSHIP_FENCE_MISMATCH');
132
- }
133
- }
134
-
135
- function adoptExistingWorkHead(
136
- ctx: McpExecutionContext,
137
- session: ExecutionSessionContext,
138
- repository: RepositoryRecord,
139
- handle: WorkHandleState,
140
- args: Record<string, unknown>,
141
- ): Record<string, unknown> | undefined {
142
- const previousInput = normalizedRequiredString(args, 'expected_previous_head');
143
- const candidateInput = normalizedRequiredString(args, 'adopt_candidate_head');
144
- if (!previousInput && !candidateInput) return undefined;
145
- if (!previousInput || !candidateInput) {
146
- throw new Error('WORK_HEAD_ADOPTION_ARGUMENTS_REQUIRED: expected_previous_head and adopt_candidate_head must be provided together');
147
- }
148
- const requestedCheckoutId = normalizedRequiredString(args, 'checkout_id');
149
- if (!requestedCheckoutId) throw new Error('WORK_HEAD_ADOPTION_CHECKOUT_REQUIRED: checkout_id must be explicit');
150
- if (repository.repoId !== handle.repositoryId) throw new Error('WORK_HEAD_ADOPTION_REPOSITORY_MISMATCH');
151
- if (requestedCheckoutId !== handle.checkoutId || repository.activeCheckoutId !== handle.checkoutId) {
152
- throw new Error(`WORK_HEAD_ADOPTION_CHECKOUT_MISMATCH: expected ${handle.checkoutId}, found ${requestedCheckoutId}`);
153
- }
154
- if (!handle.managedWorktree) throw new Error('WORK_HEAD_ADOPTION_MANAGED_WORKTREE_REQUIRED');
155
- if (handle.principalId !== session.principalId) throw new Error('WORK_HANDLE_PRINCIPAL_MISMATCH: work handle belongs to another principal');
156
- if (handle.state !== 'prepared' && handle.state !== 'editing') {
157
- throw new Error(`WORK_HEAD_ADOPTION_STATE_INVALID: ${handle.state}`);
158
- }
159
- if (!workHeadAdoptionFinalizationIsRetryable(handle.finalization)) {
160
- throw new Error('WORK_HEAD_ADOPTION_FINALIZATION_ALREADY_STARTED');
161
- }
162
-
163
- const registered = getRepository(handle.repositoryId, ctx.controllerHome, { includeRemoved: true });
164
- const registeredCheckout = registered.checkouts.find((entry) => entry.checkoutId === handle.checkoutId);
165
- if (!registeredCheckout || registeredCheckout.lifecycle !== 'active' || registeredCheckout.worktree !== true) {
166
- throw new Error('WORK_HEAD_ADOPTION_CHECKOUT_NOT_ACTIVE_MANAGED');
167
- }
168
- const worktreeRepository = selectRepositoryCheckout(registered, handle.checkoutId);
169
- const guarded = assertExecutionIdentity({
170
- controllerHome: ctx.controllerHome,
171
- identity: executionIdentityFromCoordinates({
172
- repositoryId: handle.repositoryId,
173
- checkoutId: handle.checkoutId,
174
- canonicalRoot: handle.worktreePath,
175
- workId: handle.workId,
176
- worktreePath: handle.worktreePath,
177
- branch: handle.branch,
178
- }),
179
- cwd: handle.worktreePath,
180
- requestedRepoId: repository.repoId,
181
- requestedCheckoutId,
182
- });
183
- const status = repositoryGitStatus(worktreeRepository);
184
- if (!status.clean) throw new Error('WORK_HEAD_ADOPTION_WORKTREE_DIRTY');
185
-
186
- const previousHead = gitCommit(handle.worktreePath, previousInput, 'PREVIOUS_HEAD');
187
- const candidateHead = gitCommit(handle.worktreePath, candidateInput, 'CANDIDATE_HEAD');
188
- const authoritativePrevious = handle.expectedHead ? gitCommit(handle.worktreePath, handle.expectedHead, 'AUTHORITATIVE_PREVIOUS_HEAD') : undefined;
189
- if (!authoritativePrevious || authoritativePrevious !== previousHead) {
190
- throw new Error(`WORK_HEAD_ADOPTION_PREVIOUS_HEAD_MISMATCH: expected ${authoritativePrevious ?? 'missing'}, found ${previousHead}`);
191
- }
192
- if (guarded.currentHead !== candidateHead || status.head !== candidateHead) {
193
- throw new Error(`WORK_HEAD_ADOPTION_CANDIDATE_NOT_CURRENT: expected current HEAD ${candidateHead}, found ${guarded.currentHead ?? status.head ?? 'missing'}`);
194
- }
195
- if (previousHead === candidateHead) throw new Error('WORK_HEAD_ADOPTION_SUCCESSOR_REQUIRED');
196
- const ancestry = spawnSync('git', ['-C', handle.worktreePath, 'merge-base', '--is-ancestor', previousHead, candidateHead], {
197
- encoding: 'utf-8', stdio: ['ignore', 'pipe', 'pipe'], timeout: 10_000,
198
- });
199
- if (ancestry.status !== 0 || ancestry.error) throw new Error('WORK_HEAD_ADOPTION_NOT_DESCENDANT');
200
-
201
- const contract = contractFor(ctx, handle);
202
- if (!contract || contract.repoId !== handle.repositoryId) throw new Error('WORK_HEAD_ADOPTION_CONTRACT_MISSING');
203
- if (isTerminalWorkContractStatus(contract.status) || contract.completionReceipt) {
204
- throw new Error('WORK_HEAD_ADOPTION_CONTRACT_TERMINAL');
205
- }
206
- // expectedHead can predate unrelated commits that landed on the source checkout
207
- // before this Work was rebased. Scope adoption to the candidate's unique delta
208
- // from the current source-checkout merge-base; otherwise those target-branch
209
- // commits are incorrectly attributed to the Work and fail its allow-list.
210
- const sourceRepository = selectWorkFinalizationTarget(registered, handle);
211
- const sourceHead = handle.sourceCheckoutId && handle.sourceCheckoutId !== handle.checkoutId
212
- ? repositoryGitStatus(sourceRepository).head
213
- : undefined;
214
- const scopeBaseHead = sourceHead ? gitMergeBase(handle.worktreePath, sourceHead, candidateHead) : previousHead;
215
- const changedPaths = gitChangedPaths(handle.worktreePath, scopeBaseHead, candidateHead);
216
- assertWorkPathsWithinScope(contract, changedPaths, {
217
- forbidden: 'WORK_HEAD_ADOPTION_FORBIDDEN_PATH',
218
- outOfScope: 'WORK_HEAD_ADOPTION_PATH_OUT_OF_SCOPE',
219
- });
220
-
221
- claimHeadAdoptionOwnership(ctx, session, handle, args);
222
-
223
- const reviewedAt = new Date().toISOString();
224
- const reconciliationId = `RECNC-${createHash('sha256').update([
225
- handle.repositoryId, handle.workId, previousHead, candidateHead, handle.checkoutId, handle.branch,
226
- ].join('\0')).digest('hex').slice(0, 16)}`;
227
- const reconciliation: WorkReconciliationRecord = {
228
- schemaVersion: 1,
229
- reconciliationId,
230
- originalExpectedRevision: previousHead,
231
- observedTargetRevision: candidateHead,
232
- baseRevision: gitCommit(handle.worktreePath, handle.baseCommit ?? previousHead, 'BASE_HEAD'),
233
- targetBranch: handle.branch,
234
- reachable: true,
235
- method: 'exact_commit',
236
- comparedPaths: changedPaths,
237
- reviewer: session.principalId.slice(0, 200),
238
- reviewedAt,
239
- unrecoverableStages: [],
240
- cleanupOwnershipProof: `No cleanup was performed; managed checkout ${handle.checkoutId} remains owned by Work finalizer.`,
241
- rationale: 'Adopted an exact clean successor commit after repository, checkout, worktree, branch, controller ownership, ancestry, and WorkContract path-scope verification. This reconciliation is not completion evidence.',
242
- outcome: 'accepted_equivalence',
243
- };
244
-
245
- const adopted = transitionWorkHandle(ctx.controllerHome, handle, 'editing', {
246
- deliveryBaseCommit: scopeBaseHead,
247
- expectedHead: candidateHead,
248
- failureReason: undefined,
249
- finalization: initialStage(),
250
- validationRun: undefined,
251
- validatedInputFingerprint: undefined,
252
- });
253
- try {
254
- recordWorkEvidenceState(
255
- { controllerHome: ctx.controllerHome, repoId: handle.repositoryId },
256
- contract.workId,
257
- contract.checkRefs.length === 0
258
- ? contract.evidenceState
259
- : contract.evidenceState === 'valid' || contract.evidenceState === 'stale'
260
- ? 'stale'
261
- : 'partial',
262
- );
263
- updateWorkContract({ controllerHome: ctx.controllerHome, repoId: handle.repositoryId }, contract.workId, {
264
- reconciliations: [reconciliation, ...contract.reconciliations.filter((entry) => entry.reconciliationId !== reconciliationId)],
265
- });
266
- appendWorkEvidence({ controllerHome: ctx.controllerHome, repoId: handle.repositoryId }, contract.workId, {
267
- title: 'audited WorkHandle successor HEAD adoption',
268
- summary: `${previousHead} -> ${candidateHead}; ${changedPaths.length} candidate-unique path(s) from scope base ${scopeBaseHead} remained within the WorkContract allow-list. Historical validation and completion receipts were not rewritten.`,
269
- detailLevel: 'summary',
270
- });
271
- } catch (error) {
272
- try {
273
- writeWorkHandle(ctx.controllerHome, { ...handle, recordRevision: adopted.recordRevision });
274
- } catch (rollbackError) {
275
- throw new Error(`WORK_HEAD_ADOPTION_AUDIT_WRITE_FAILED_AND_ROLLBACK_FAILED: ${String(error)}; ${String(rollbackError)}`);
276
- }
277
- throw error;
278
- }
279
- const nextSession = updateExecutionSession(ctx.controllerHome, identityFor(ctx, args), {
280
- activeRepositoryId: handle.repositoryId,
281
- activeCheckoutId: handle.checkoutId,
282
- activeWorkId: handle.workId,
283
- permissionSnapshotVersion: handle.permissionSnapshotVersion,
284
- lastValidatedAt: reviewedAt,
285
- });
286
- return {
287
- session: nextSession,
288
- work: compactHandle(adopted),
289
- reused: true,
290
- adopted: true,
291
- adoption: { previousHead, candidateHead, changedPaths, reconciliationId },
292
- controllerClaimed: true,
293
- };
294
- }
295
-
296
60
  function invalidateActiveWork(ctx: McpExecutionContext, session: ExecutionSessionContext, reason: string): void {
297
61
  if (!session.activeRepositoryId || !session.activeWorkId) return;
298
62
  const handle = readWorkHandle(ctx.controllerHome, session.activeRepositoryId, session.activeWorkId);
299
63
  if (!handle || handle.state === 'cleaned') return;
300
64
  const contract = contractFor(ctx, handle);
301
- if (contract?.status === 'completed') return;
65
+ if (contract?.semanticState === 'completed') return;
302
66
  markWorkHandleFailed(ctx.controllerHome, handle, reason);
303
67
  }
304
68
 
@@ -318,6 +82,85 @@ export function bindSessionRepository(ctx: McpExecutionContext, args: Record<str
318
82
  return { session: next, repository: { repoId: repository.repoId, checkoutId: repository.activeCheckoutId, canonicalRoot: repository.canonicalRoot, branch: repository.checkouts.find((entry) => entry.checkoutId === repository.activeCheckoutId)?.branch ?? null }, switched: switching };
319
83
  }
320
84
 
85
+ function gitPathSet(root: string, args: string[], code: string): Set<string> {
86
+ const result = spawnSync('git', ['-C', root, ...args, '-z'], {
87
+ encoding: 'utf8',
88
+ stdio: ['ignore', 'pipe', 'pipe'],
89
+ timeout: 10_000,
90
+ });
91
+ if (result.error || result.status !== 0) throw new Error(`${code}: ${result.error?.message ?? result.stderr?.trim() ?? `git ${args.join(' ')} failed`}`);
92
+ return new Set(String(result.stdout ?? '').split('\0').map((value) => value.trim()).filter(Boolean));
93
+ }
94
+
95
+ function currentDirtyPaths(root: string): Set<string> {
96
+ const paths = new Set<string>();
97
+ for (const path of gitPathSet(root, ['diff', '--name-only'], 'WORK_HANDLE_SUCCESSOR_ADOPTION_DIRTY_PATHS_UNAVAILABLE')) paths.add(path);
98
+ for (const path of gitPathSet(root, ['diff', '--cached', '--name-only'], 'WORK_HANDLE_SUCCESSOR_ADOPTION_DIRTY_PATHS_UNAVAILABLE')) paths.add(path);
99
+ for (const path of gitPathSet(root, ['ls-files', '--others', '--exclude-standard'], 'WORK_HANDLE_SUCCESSOR_ADOPTION_DIRTY_PATHS_UNAVAILABLE')) paths.add(path);
100
+ return paths;
101
+ }
102
+
103
+ function adoptExplicitSuccessorHead(
104
+ ctx: McpExecutionContext,
105
+ args: Record<string, unknown>,
106
+ repository: ReturnType<typeof selectedRepository>,
107
+ existing: WorkHandleState,
108
+ ): WorkHandleState | undefined {
109
+ const expectedPreviousHead = typeof args.expected_previous_head === 'string' ? args.expected_previous_head.trim() : '';
110
+ const adoptCandidateHead = typeof args.adopt_candidate_head === 'string' ? args.adopt_candidate_head.trim() : '';
111
+ if (!expectedPreviousHead && !adoptCandidateHead) return undefined;
112
+ if (!expectedPreviousHead || !adoptCandidateHead) {
113
+ throw new Error('WORK_HANDLE_SUCCESSOR_ADOPTION_PAIR_REQUIRED: expected_previous_head and adopt_candidate_head must be supplied together');
114
+ }
115
+ if (existing.state !== 'prepared' && existing.state !== 'editing') {
116
+ throw new Error(`WORK_HANDLE_SUCCESSOR_ADOPTION_STATE_INVALID: ${existing.state}`);
117
+ }
118
+ if (existing.expectedHead !== expectedPreviousHead) {
119
+ throw new Error(`WORK_HANDLE_SUCCESSOR_ADOPTION_PREVIOUS_HEAD_MISMATCH: expected ${existing.expectedHead ?? 'missing'}, received ${expectedPreviousHead}`);
120
+ }
121
+ if (existing.repositoryId !== repository.repoId || existing.checkoutId !== repository.activeCheckoutId) {
122
+ throw new Error('WORK_HANDLE_SUCCESSOR_ADOPTION_CHECKOUT_MISMATCH');
123
+ }
124
+ const root = existing.worktreePath;
125
+ const currentHead = gitHead(root);
126
+ if (!currentHead || currentHead !== adoptCandidateHead) {
127
+ throw new Error(`WORK_HANDLE_SUCCESSOR_ADOPTION_CURRENT_HEAD_MISMATCH: expected ${adoptCandidateHead}, found ${currentHead ?? 'missing'}`);
128
+ }
129
+ if (!gitIsAncestor(root, expectedPreviousHead, adoptCandidateHead)) {
130
+ throw new Error(`WORK_HANDLE_SUCCESSOR_ADOPTION_NONLINEAR: ${expectedPreviousHead} is not an ancestor of ${adoptCandidateHead}`);
131
+ }
132
+ const changedPaths = gitPathSet(root, ['diff', '--name-only', `${expectedPreviousHead}..${adoptCandidateHead}`], 'WORK_HANDLE_SUCCESSOR_ADOPTION_DIFF_UNAVAILABLE');
133
+ const dirtyPaths = currentDirtyPaths(root);
134
+ if (existing.managedWorktree) {
135
+ if (dirtyPaths.size > 0) {
136
+ throw new Error(`WORK_HANDLE_SUCCESSOR_ADOPTION_MANAGED_DIRTY: ${[...dirtyPaths].sort().slice(0, 20).join(',')}`);
137
+ }
138
+ const blockingProcesses = listRecoverableProcessRecords(ctx.controllerHome, existing.repositoryId)
139
+ .filter((record) => record.workId === existing.workId)
140
+ .map((record) => record.processId)
141
+ .sort();
142
+ if (blockingProcesses.length > 0) {
143
+ throw new Error(`WORK_HANDLE_SUCCESSOR_ADOPTION_ACTIVE_PROCESS: ${blockingProcesses.slice(0, 20).join(',')}`);
144
+ }
145
+ } else {
146
+ const overlap = [...changedPaths].filter((path) => dirtyPaths.has(path)).sort();
147
+ if (overlap.length > 0) {
148
+ throw new Error(`WORK_HANDLE_SUCCESSOR_ADOPTION_DIRTY_OVERLAP: ${overlap.slice(0, 20).join(',')}`);
149
+ }
150
+ }
151
+ const candidate: WorkHandleState = {
152
+ ...existing,
153
+ deliveryBaseCommit: adoptCandidateHead,
154
+ expectedHead: adoptCandidateHead,
155
+ validationRun: undefined,
156
+ validatedInputFingerprint: undefined,
157
+ finalization: initialStage(),
158
+ failureReason: undefined,
159
+ };
160
+ validateWorkHandle(ctx.controllerHome, candidate, identityFor(ctx, args), 'cheap', 'inspect');
161
+ return writeWorkHandle(ctx.controllerHome, candidate);
162
+ }
163
+
321
164
  export function prepareWork(ctx: McpExecutionContext, args: Record<string, unknown>): Record<string, unknown> {
322
165
  const session = requireSession(ctx, args);
323
166
  const repository = selectedRepository(ctx, session, args, true);
@@ -329,12 +172,16 @@ export function prepareWork(ctx: McpExecutionContext, args: Record<string, unkno
329
172
  const existing = readWorkHandle(ctx.controllerHome, repository.repoId, existingId)
330
173
  ?? findWorkHandle(ctx, session, { ...args, work_id: existingId, repo_id: repository.repoId });
331
174
  if (existing.principalId !== session.principalId) throw new Error('WORK_HANDLE_ACCESS_DENIED');
332
- const adopted = adoptExistingWorkHead(ctx, session, repository, existing, args);
333
- if (adopted) return adopted;
334
- validateWorkHandle(ctx.controllerHome, existing, identityFor(ctx, args), 'cheap', 'inspect');
335
- updateExecutionSession(ctx.controllerHome, identityFor(ctx, args), { activeRepositoryId: existing.repositoryId, activeCheckoutId: existing.checkoutId, activeWorkId: existing.workId, permissionSnapshotVersion: existing.permissionSnapshotVersion });
336
- claimPreparedWorkOwnership(ctx, session, existing, args);
337
- return { session: requireSession(ctx, args), work: compactHandle(existing), reused: true, controllerClaimed: true };
175
+ const adopted = adoptExplicitSuccessorHead(ctx, args, repository, existing);
176
+ const active = adopted ?? existing;
177
+ if (!adopted) validateWorkHandle(ctx.controllerHome, active, identityFor(ctx, args), 'cheap', 'inspect');
178
+ updateExecutionSession(ctx.controllerHome, identityFor(ctx, args), { activeRepositoryId: active.repositoryId, activeCheckoutId: active.checkoutId, activeWorkId: active.workId, permissionSnapshotVersion: active.permissionSnapshotVersion });
179
+ return {
180
+ session: requireSession(ctx, args),
181
+ work: compactHandle(active),
182
+ reused: true,
183
+ ...(adopted ? { adoptedSuccessor: { previousHead: existing.expectedHead, currentHead: adopted.expectedHead } } : {}),
184
+ };
338
185
  }
339
186
 
340
187
  const requestId = typeof args.request_id === 'string' ? args.request_id.trim() : '';
@@ -350,8 +197,12 @@ export function prepareWork(ctx: McpExecutionContext, args: Record<string, unkno
350
197
  const needsDependencies = args.needs_dependencies === true;
351
198
  const baseCheckoutId = repository.activeCheckoutId;
352
199
  const baseStatus = repositoryGitStatus(repository);
200
+ const deliveryTargetBranch = baseStatus.branch;
201
+ if (!deliveryTargetBranch) throw new Error(`WORK_DELIVERY_TARGET_DETACHED: source checkout ${baseCheckoutId} has no branch`);
353
202
  if (isolation === 'reuse' && !baseStatus.clean) throw new Error('WORKTREE_DIRTY: reuse was requested but the selected checkout is dirty; choose new_worktree or auto');
354
- const useWorktree = isolation === 'new_worktree' || (isolation === 'auto' && !baseStatus.clean);
203
+ // A repository Work freezes its start revision on its own checkout. Sharing the
204
+ // canonical checkout is an explicit model choice (`reuse`), never the auto path.
205
+ const useWorktree = isolation !== 'reuse';
355
206
  const policy = readRepositoryAccessPolicy(ctx.controllerHome, repository.repoId);
356
207
  const fingerprint = workPrepareFingerprint({
357
208
  repoId: repository.repoId,
@@ -378,28 +229,23 @@ export function prepareWork(ctx: McpExecutionContext, args: Record<string, unkno
378
229
  const createdWorkId = request.workId;
379
230
  const existingHandle = readWorkHandle(ctx.controllerHome, repository.repoId, createdWorkId);
380
231
  if (existingHandle) {
381
- if (existingHandle.principalId !== session.principalId || existingHandle.sessionId !== session.sessionId) {
382
- throw new Error(`WORK_PREPARE_REQUEST_INDEX_CORRUPT: ${requestId}`);
383
- }
384
232
  const existingContract = getWorkContract({ controllerHome: ctx.controllerHome, repoId: repository.repoId }, createdWorkId);
385
233
  if (!existingContract) throw new Error(`WORK_PREPARE_RESULT_LOST: ${requestId} has a Work handle without its WorkContract`);
386
- const terminal = isTerminalWorkContractStatus(existingContract.status)
387
- && !(existingContract.status === 'failed' && request.status === 'claimed');
234
+ const terminal = isTerminalSemanticWorkState(existingContract.semanticState);
388
235
  if (terminal) {
389
236
  return {
390
237
  session: requireSession(ctx, args),
391
238
  work: compactHandle(existingHandle),
392
239
  reused: true,
393
240
  terminal: true,
394
- workContractStatus: existingContract.status,
395
- controllerClaimed: false,
241
+ workContractStatus: existingContract.semanticState,
396
242
  };
397
243
  }
398
- if (existingContract.status === 'open' || existingContract.status === 'failed') {
244
+ if (existingContract.semanticState === 'open') {
399
245
  activateWorkContract(
400
246
  { controllerHome: ctx.controllerHome, repoId: repository.repoId },
401
247
  createdWorkId,
402
- { phase: 'implementation', summary: 'Prepared Work ownership resumed on the existing WorkHandle.', worktreeRef: existingHandle.worktreePath },
248
+ { phase: 'implementation', summary: 'Prepared Work resumed on the existing WorkHandle.', worktreeRef: existingHandle.worktreePath },
403
249
  );
404
250
  }
405
251
  const delegation = createGoalDelegation({
@@ -413,8 +259,7 @@ export function prepareWork(ctx: McpExecutionContext, args: Record<string, unkno
413
259
  source: 'gpt_risk_delegate',
414
260
  });
415
261
  const nextSession = updateExecutionSession(ctx.controllerHome, identityFor(ctx, args), { activeRepositoryId: repository.repoId, activeCheckoutId: existingHandle.checkoutId, activeWorkId: createdWorkId, permissionSnapshotVersion: policy.revision, goalDelegation: delegation, lastValidatedAt: new Date().toISOString() });
416
- claimPreparedWorkOwnership(ctx, nextSession, existingHandle, args);
417
- return { session: nextSession, work: compactHandle(existingHandle), reused: true, isolation: existingHandle.managedWorktree ? 'isolated' : 'current', controllerClaimed: true };
262
+ return { session: nextSession, work: compactHandle(existingHandle), reused: true, isolation: existingHandle.managedWorktree ? 'isolated' : 'current' };
418
263
  }
419
264
 
420
265
  let contract = getWorkContract({ controllerHome: ctx.controllerHome, repoId: repository.repoId }, createdWorkId);
@@ -422,8 +267,8 @@ export function prepareWork(ctx: McpExecutionContext, args: Record<string, unkno
422
267
  if (request.status === 'prepared') {
423
268
  throw new Error(`WORK_PREPARE_RESULT_LOST: ${requestId} completed without a readable Work handle`);
424
269
  }
425
- if (contract && (contract.status === 'completed' || contract.status === 'cancelled')) {
426
- throw new Error(`WORK_PREPARE_REQUEST_TERMINAL: ${requestId} belongs to ${contract.status} Work ${createdWorkId}`);
270
+ if (contract && (contract.semanticState === 'completed' || contract.semanticState === 'cancelled')) {
271
+ throw new Error(`WORK_PREPARE_REQUEST_TERMINAL: ${requestId} belongs to ${contract.semanticState} Work ${createdWorkId}`);
427
272
  }
428
273
  if (!contract) {
429
274
  contract = admitPreparedRepositoryWorkContract(
@@ -457,19 +302,35 @@ export function prepareWork(ctx: McpExecutionContext, args: Record<string, unkno
457
302
  ? ensureManagedWorkspace(ctx.controllerHome, repository, {
458
303
  requestId: createdWorkId,
459
304
  title: objective,
305
+ associatedWorkId: createdWorkId,
460
306
  baseRef,
461
307
  prepareDependencies: needsDependencies,
462
308
  })
463
309
  : { mode: 'current' as const, checkoutId: baseCheckoutId, root: repository.canonicalRoot, branch: baseStatus.branch ?? 'detached', baseRevision: baseStatus.head ?? undefined, managed: false };
310
+ if (workspace.managed) {
311
+ const materialized = materializeRepositoryWorkPlacement(
312
+ { controllerHome: ctx.controllerHome, repoId: repository.repoId },
313
+ contract.workId,
314
+ () => workspace,
315
+ );
316
+ if (!materialized) throw new Error(`WORK_PLACEMENT_MATERIALIZATION_LOST: ${contract.workId}`);
317
+ contract = materialized;
318
+ }
464
319
  const refreshed = getRepository(repository.repoId, ctx.controllerHome);
465
320
  const checkout = selectRepositoryCheckout(refreshed, workspace.checkoutId);
321
+ if (workspace.managed && (
322
+ contract.checkoutId !== checkout.activeCheckoutId
323
+ || contract.worktreeRef !== checkout.canonicalRoot
324
+ )) {
325
+ throw new Error(`WORK_PLACEMENT_IDENTITY_DRIFT: contract=${contract.checkoutId ?? 'missing'}:${contract.worktreeRef ?? 'missing'}; checkout=${checkout.activeCheckoutId}:${checkout.canonicalRoot}`);
326
+ }
466
327
  const branch = workspace.branch || repositoryGitStatus(checkout).branch;
467
328
  if (!branch) throw new Error('WORKTREE_DETACHED: selected worktree has no branch');
468
329
  const head = gitHead(checkout.canonicalRoot);
469
330
  const handle: WorkHandleState = {
470
331
  schemaVersion: 1, workId: createdWorkId, sessionId: session.sessionId, principalId: session.principalId,
471
332
  repositoryId: repository.repoId, checkoutId: checkout.activeCheckoutId, worktreePath: checkout.canonicalRoot, branch,
472
- sourceCheckoutId: baseCheckoutId, managedWorktree: workspace.managed, workContractId: contract.workId, goalId, delegationVersion: delegation.version,
333
+ sourceCheckoutId: baseCheckoutId, deliveryTargetBranch, managedWorktree: workspace.managed, workContractId: contract.workId, goalId, delegationVersion: delegation.version,
473
334
  baseCommit: workspace.baseRevision ?? head, deliveryBaseCommit: workspace.baseRevision ?? head, expectedHead: head, permissionSnapshotVersion: policy.revision,
474
335
  state: 'prepared', createdAt: new Date().toISOString(), updatedAt: new Date().toISOString(), finalization: initialStage(),
475
336
  cleanupResponsibility: { owner: 'work_finalizer', registeredAt: new Date().toISOString() },
@@ -481,8 +342,7 @@ export function prepareWork(ctx: McpExecutionContext, args: Record<string, unkno
481
342
  { phase: 'implementation', summary: 'Repository Work preparation completed and execution ownership is active.', worktreeRef: checkout.canonicalRoot },
482
343
  );
483
344
  const nextSession = updateExecutionSession(ctx.controllerHome, identityFor(ctx, args), { activeRepositoryId: repository.repoId, activeCheckoutId: checkout.activeCheckoutId, activeWorkId: createdWorkId, permissionSnapshotVersion: policy.revision, goalDelegation: delegation, lastValidatedAt: new Date().toISOString() });
484
- claimPreparedWorkOwnership(ctx, nextSession, handle, args);
485
- return { session: nextSession, work: compactHandle(handle), reused: requestReused, isolation: workspace.mode, controllerClaimed: true };
345
+ return { session: nextSession, work: compactHandle(handle), reused: requestReused, isolation: workspace.mode };
486
346
  } catch (error) {
487
347
  failWorkContract(
488
348
  { controllerHome: ctx.controllerHome, repoId: repository.repoId },
@@ -1,7 +1,6 @@
1
1
  import { spawnSync } from 'child_process';
2
2
  import type { RepositoryRecord } from '../../../cli/repositories/types';
3
- import { getWorkContract } from '../../../../packages/kernel/work/api/index';
4
- import { isTerminalWorkContractStatus } from '../facade/types';
3
+ import { getWorkContract, semanticWorkState } from '../../../../packages/kernel/work/api/index';
5
4
  import { executeRepositoryCommandViaProcessRuntime, waitRepositoryCommandProcess } from '../../execution/process-runtime/command-facade';
6
5
  import { executionIdentityForRepository } from './execution-identity';
7
6
 
@@ -59,7 +58,7 @@ function assertActiveWork(input: {
59
58
  !contract
60
59
  || contract.repoId !== input.repository.repoId
61
60
  || (contract.checkoutId && contract.checkoutId !== input.repository.activeCheckoutId)
62
- || isTerminalWorkContractStatus(contract.status)
61
+ || semanticWorkState(contract) !== 'open'
63
62
  || Boolean(contract.completionReceipt)
64
63
  ) {
65
64
  throw new Error(`WORK_REMOTE_DELIVERY_ACTIVE_AUTHORITY_REQUIRED: ${input.workId}`);
@@ -0,0 +1,39 @@
1
+ import { spawnSync } from 'child_process';
2
+
3
+ function gitText(repoRoot: string, args: string[]): string {
4
+ const result = spawnSync('git', args, { cwd: repoRoot, encoding: 'utf-8' });
5
+ if (result.status !== 0 || result.error || typeof result.stdout !== 'string') {
6
+ throw new Error(`WORK_REVISION_DIFF_GIT_FAILED: git ${args.join(' ')}`);
7
+ }
8
+ return result.stdout.trim();
9
+ }
10
+
11
+ function commitRevision(repoRoot: string, revision: string | undefined, label: string): string {
12
+ if (!revision?.trim()) throw new Error(`WORK_REVISION_DIFF_${label}_MISSING`);
13
+ return gitText(repoRoot, ['rev-parse', `${revision.trim()}^{commit}`]);
14
+ }
15
+
16
+ export function changedPaths(repoRoot: string, baseRevision: string, targetRevision: string): string[] {
17
+ const result = spawnSync('git', ['diff', '--name-only', '-z', baseRevision, targetRevision], {
18
+ cwd: repoRoot,
19
+ encoding: 'utf-8',
20
+ maxBuffer: 8 * 1024 * 1024,
21
+ });
22
+ if (result.status !== 0 || result.error || typeof result.stdout !== 'string') {
23
+ throw new Error('WORK_REVISION_DIFF_CHANGED_PATHS_UNAVAILABLE');
24
+ }
25
+ return [...new Set(result.stdout.split('\0').filter(Boolean))].sort();
26
+ }
27
+
28
+ export function changedPathsFromUnbornBase(repoRoot: string, targetRevision: string): string[] {
29
+ const targetCommit = commitRevision(repoRoot, targetRevision, 'TARGET_REVISION');
30
+ const result = spawnSync('git', ['ls-tree', '-r', '--name-only', '-z', targetCommit], {
31
+ cwd: repoRoot,
32
+ encoding: 'utf-8',
33
+ maxBuffer: 8 * 1024 * 1024,
34
+ });
35
+ if (result.status !== 0 || result.error || typeof result.stdout !== 'string') {
36
+ throw new Error('WORK_REVISION_DIFF_UNBORN_CHANGED_PATHS_UNAVAILABLE');
37
+ }
38
+ return [...new Set(result.stdout.split('\0').filter(Boolean))].sort();
39
+ }