@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,12 +1,13 @@
1
1
  import { bindRepositoryEntities } from '../../../src/cli/repositories/entity-migration';
2
2
  import { bootstrapLocalProject, diagnoseLatestLocalProjectSource } from '../../../src/cli/repositories/local-project-onboarding';
3
3
  import { resolveEphemeralWorkspaceTarget } from '../../../src/cli/repositories/ephemeral-workspace';
4
- import type { ResolvedExecutionIdentity } from '../../../src/runtime/control-plane/execution/execution-identity';
4
+ import { commandExecutionScopeKey, type RepositoryCommandScopeTarget } from '../../../src/cli/repositories/command-scope';
5
+ import { executionIdentityForWork, type ResolvedExecutionIdentity } from '../../../src/runtime/control-plane/execution/execution-identity';
5
6
  import { assertNoBoundExecutionSessionMutation, resolveClaimedRepositoryWorkId, resolveExplicitClaimedRepositoryWork, type RepositoryWorkAttributionCaller } from '../../../src/runtime/control-plane/execution/repository-work-attribution';
6
- import { getWorkContract } from '../../../packages/kernel/work/api';
7
- import { assertWorkPathsWithinScope } from '../../../src/runtime/control-plane/execution/work-path-scope';
7
+ import { getWorkContract, promoteWorkToRepositoryChange, semanticWorkState, type WorkContract } from '../../../packages/kernel/work/api';
8
8
  import { assertCanonicalRepositoryMutationWorkHandleAvailable, ensureRepositoryMutationWorkHandle, markRepositoryMutationStarted } from '../../../src/runtime/control-plane/execution/work-handle-authority';
9
- import { isTerminalWorkContractStatus } from '../../../src/runtime/control-plane/facade/types';
9
+ import { readWorkHandle } from '../../../src/runtime/control-plane/execution/work-handle-store';
10
+ import { ensureRunningRepositoryWorkCheckout } from '../../../src/runtime/control-plane/execution/retained-work-resume';
10
11
  import { executeRepositoryCommand, previewRepositoryCommandExecution } from '../../../src/cli/repositories/command-executor';
11
12
  import { withControllerLock } from '../../../src/cli/repositories/locks';
12
13
  import {
@@ -37,7 +38,6 @@ import {
37
38
  repositoryGitMergeBranch,
38
39
  repositoryGitStatus,
39
40
  repositoryGitSwitchBranch,
40
- resolveRepositoryGitCommitScope,
41
41
  } from '../../../src/cli/repositories/structured-git';
42
42
  import {
43
43
  readRepositoryGitStatusSample,
@@ -56,7 +56,6 @@ import {
56
56
  classifyRepositoryCommandRoute,
57
57
  executeRepositoryCommandViaProcessRuntime,
58
58
  } from '../../../src/runtime/execution/process-runtime/command-facade';
59
- import { assessWorkMode, parseExplicitTaskMode } from '../../../src/cli/controller/work-mode';
60
59
  import { classifyRepositoryCommand } from '../../../src/cli/repositories/command-classifier';
61
60
  import { normalizeRepositoryCommand } from '../../../src/cli/repositories/command-normalization';
62
61
  import { readRepositoryRange } from '../../../src/cli/repository/inspector';
@@ -157,12 +156,12 @@ export const repositoryToolDefinitions: McpToolDefinition[] = [
157
156
  include_removed: { type: 'boolean' },
158
157
  operation: {
159
158
  type: 'string',
160
- enum: ['summary', 'batch_execute', 'lanes_execute', 'lanes_integrate', 'fast_receipt_get', 'fast_receipt_list', 'execution_route', 'assess_work_mode'],
161
- description: 'Defaults to summary. Use batch_execute for multi-step Fast Path (one parent receipt). Use lanes_execute for limited parallel reads. Use assess_work_mode for Fast/Durable routing advice.',
159
+ enum: ['summary', 'batch_execute', 'lanes_execute', 'lanes_integrate', 'fast_receipt_get', 'fast_receipt_list', 'execution_route'],
160
+ description: 'Defaults to summary. Use batch_execute for multi-step repository capability execution and lanes_execute for limited parallel reads. Workflow/mode selection belongs to the model/user, not Workbench.',
162
161
  },
163
162
  payload: {
164
163
  type: 'object',
165
- description: 'Operation-specific bounded arguments. Batch write operations should include request_id. For batch_execute: { steps:[{id?, kind, input}], stop_on_error?, allowed_paths?, timeout_ms?, request_id?, purpose? }. For assess_work_mode: { description, known_paths?, expected_files?, requires_parallelism?, independent_task_count?, agent_requested? }. Agent routing is opt-in only.',
164
+ description: 'Operation-specific bounded arguments. Batch write operations should include request_id. For batch_execute: { steps:[{id?, kind, input}], stop_on_error?, allowed_paths?, timeout_ms?, request_id?, purpose? }.' ,
166
165
  additionalProperties: true,
167
166
  },
168
167
  }),
@@ -252,7 +251,7 @@ export const repositoryToolDefinitions: McpToolDefinition[] = [
252
251
  cwd: { type: 'string', description: 'Optional root-relative working directory.' },
253
252
  workspace_root: { type: 'string', description: 'Absolute existing local directory used as an ephemeral execution root. Mutually exclusive with repo_id/checkout_id; does not register or initialize the directory.' },
254
253
  }, ['command'], true),
255
- definition('repository_command_execute', 'Execute one repository-scoped command through the thinnest eligible lane: ephemeral for ordinary local work, an in-memory lightweight handle when it outlives the interaction budget, or explicit Durable handling for Work/external/release effects. Lightweight handles have no SQLite, Lease, recovery, or replay membership. Use rh_context for routine code discovery/reading; shell exploration is fallback-only.', {
254
+ definition('repository_command_execute', 'Compatibility facade for commands whose domain context is a repository/workspace. Repository targeting, Git/source mutation fences, and compatibility response fields live here; Process Runtime owns command execution and process identity. New broad host-local command callers should use process_exec. Use rh_context for routine code discovery/reading; shell exploration is fallback-only.', {
256
255
  repo_id: repoId,
257
256
  checkout_id: { type: 'string', description: 'Optional checkout identity for repositories with multiple local clones.' },
258
257
  work_id: { type: 'string', description: 'Optional durable Work identity. Workflow controllers should pass the exact claimed Work id so attribution survives transient MCP transport sessions.' },
@@ -306,11 +305,10 @@ export function claimedSessionEditBinding(
306
305
  if (!work) return undefined;
307
306
  return {
308
307
  workId,
309
- repoId: repository.repoId,
310
- checkoutId: repository.activeCheckoutId,
308
+ repoId: repository.repoId,
309
+ checkoutId: repository.activeCheckoutId,
311
310
  principalId: caller.principalId.trim(),
312
311
  controllerInstanceId: caller.controllerInstanceId,
313
- routeDecisionFingerprint: work.routeDecisionFingerprint,
314
312
  };
315
313
  }
316
314
 
@@ -341,21 +339,52 @@ function resolveRepositorySelectionForClaimedWork(
341
339
  ): ReturnType<typeof resolveRepositorySelection> {
342
340
  const checkoutId = typeof args.checkout_id === 'string' ? args.checkout_id.trim() : '';
343
341
  const explicitWorkId = typeof args.work_id === 'string' ? args.work_id.trim() : '';
344
- const repository = resolveRepositorySelection({
342
+ let repository = resolveRepositorySelection({
345
343
  repoId: repoIdValue || undefined,
346
344
  checkoutId: checkoutId || undefined,
347
345
  controllerHome,
348
346
  allowSoleRepository: true,
349
347
  });
350
- if (!explicitWorkId || checkoutId) return repository;
351
- const work = resolveExplicitClaimedRepositoryWork(controllerHome, repository, caller, explicitWorkId);
352
- if (!work?.checkoutId || work.checkoutId === repository.activeCheckoutId) return repository;
353
- return resolveRepositorySelection({
354
- repoId: repository.repoId,
355
- checkoutId: work.checkoutId,
356
- controllerHome,
357
- allowSoleRepository: true,
358
- });
348
+ if (!explicitWorkId) return repository;
349
+ const recordedWork = getWorkContract({ controllerHome, repoId: repository.repoId }, explicitWorkId);
350
+ const recordedHandle = readWorkHandle(controllerHome, repository.repoId, explicitWorkId);
351
+ const workCheckoutId = recordedHandle?.checkoutId?.trim() || recordedWork?.checkoutId?.trim();
352
+ if (!checkoutId && workCheckoutId && workCheckoutId !== repository.activeCheckoutId) {
353
+ repository = resolveRepositorySelection({
354
+ repoId: repository.repoId,
355
+ checkoutId: workCheckoutId,
356
+ controllerHome,
357
+ allowSoleRepository: true,
358
+ });
359
+ }
360
+ let work = resolveExplicitClaimedRepositoryWork(controllerHome, repository, caller, explicitWorkId);
361
+ if (!work) return repository;
362
+ if (work.workKind !== 'repository_change') {
363
+ work = promoteWorkToRepositoryChange({ controllerHome, repoId: repository.repoId }, work.workId);
364
+ }
365
+ const principalId = caller?.principalId?.trim();
366
+ const sessionId = caller?.sessionId?.trim();
367
+ const controllerInstanceId = caller?.controllerInstanceId?.trim();
368
+ if (principalId && sessionId && controllerInstanceId) {
369
+ ensureRunningRepositoryWorkCheckout({
370
+ controllerHome,
371
+ repository,
372
+ workId: work.workId,
373
+ identity: { principalId, sessionId, controllerInstanceId },
374
+ });
375
+ const refreshedWork = getWorkContract({ controllerHome, repoId: repository.repoId }, work.workId);
376
+ const refreshedHandle = readWorkHandle(controllerHome, repository.repoId, work.workId);
377
+ const refreshedCheckoutId = refreshedHandle?.checkoutId?.trim() || refreshedWork?.checkoutId?.trim();
378
+ if (refreshedCheckoutId && refreshedCheckoutId !== repository.activeCheckoutId) {
379
+ repository = resolveRepositorySelection({
380
+ repoId: repository.repoId,
381
+ checkoutId: refreshedCheckoutId,
382
+ controllerHome,
383
+ allowSoleRepository: true,
384
+ });
385
+ }
386
+ }
387
+ return repository;
359
388
  }
360
389
 
361
390
  function rawDefaultBranchMergeCommand(repository: ReturnType<typeof resolveRepositorySelection>, command: unknown): boolean {
@@ -372,7 +401,7 @@ function rawDefaultBranchMergeCommand(repository: ReturnType<typeof resolveRepos
372
401
 
373
402
  interface HistoricalReadOnlyWorkContext {
374
403
  workId: string;
375
- status: string;
404
+ state: WorkContract['semanticState'];
376
405
  mode: 'historical_read_only_observation';
377
406
  attribution: 'not_active_work';
378
407
  }
@@ -385,12 +414,12 @@ function historicalReadOnlyWorkContext(
385
414
  const requestedWorkId = typeof args.work_id === 'string' ? args.work_id.trim() : '';
386
415
  if (!requestedWorkId) return undefined;
387
416
  const work = getWorkContract({ controllerHome, repoId: repository.repoId }, requestedWorkId);
388
- if (!work || !isTerminalWorkContractStatus(work.status)) return undefined;
417
+ if (!work || semanticWorkState(work) === 'open') return undefined;
389
418
  const classification = classifyRepositoryCommand(args.command as string | string[], repository.defaultBranch);
390
419
  if (classification.risk !== 'readonly') return undefined;
391
420
  return {
392
421
  workId: work.workId,
393
- status: work.status,
422
+ state: work.semanticState,
394
423
  mode: 'historical_read_only_observation',
395
424
  attribution: 'not_active_work',
396
425
  };
@@ -402,7 +431,10 @@ function resolveRepositoryCommandTarget(
402
431
  repoIdValue: string,
403
432
  caller?: RepositoryToolCallerContext,
404
433
  ): {
405
- repository: ReturnType<typeof resolveRepositorySelection>;
434
+ /** Present only for a repository target; absent for an arbitrary workspace. */
435
+ repository?: ReturnType<typeof resolveRepositorySelection>;
436
+ /** Typed command target used for scope, cwd, policy, audit and approval storage. */
437
+ commandTarget: RepositoryCommandScopeTarget;
406
438
  executionIdentity: ResolvedExecutionIdentity;
407
439
  workspace?: { workspaceId: string; root: string; registered: false };
408
440
  historicalWorkContext?: HistoricalReadOnlyWorkContext;
@@ -415,7 +447,7 @@ function resolveRepositoryCommandTarget(
415
447
  }
416
448
  const target = resolveEphemeralWorkspaceTarget(workspaceRoot, controllerHome);
417
449
  return {
418
- repository: target.repository,
450
+ commandTarget: target.commandTarget,
419
451
  executionIdentity: {
420
452
  schemaVersion: 1,
421
453
  authority: 'ephemeral_workspace',
@@ -442,6 +474,7 @@ function resolveRepositoryCommandTarget(
442
474
  if (historicalWorkContext) {
443
475
  return {
444
476
  repository: selectedRepository,
477
+ commandTarget: selectedRepository,
445
478
  executionIdentity: {
446
479
  schemaVersion: 1,
447
480
  authority: 'repository',
@@ -460,6 +493,7 @@ function resolveRepositoryCommandTarget(
460
493
  : undefined;
461
494
  return {
462
495
  repository,
496
+ commandTarget: repository,
463
497
  executionIdentity: {
464
498
  schemaVersion: 1,
465
499
  authority: 'repository',
@@ -591,7 +625,10 @@ function compactProcessCommandPayload(input: {
591
625
  route?: string;
592
626
  reasons: string[];
593
627
  decision?: unknown;
594
- repoId: string;
628
+ /** Repository id for a repository target; absent for an arbitrary workspace target. */
629
+ repoId?: string;
630
+ /** Workspace scope id when the target is an arbitrary workspace. */
631
+ scopeId?: string;
595
632
  checkoutId?: string;
596
633
  workspace?: { workspaceId: string; root: string; registered: false };
597
634
  historicalWorkContext?: HistoricalReadOnlyWorkContext;
@@ -700,8 +737,8 @@ function compactProcessCommandPayload(input: {
700
737
 
701
738
  function emptyRepositoryMigration(repository: ReturnType<typeof registerRepository>) {
702
739
  return {
703
- repoId: repository.repoId,
704
- checkoutId: repository.activeCheckoutId,
740
+ repoId: repository.repoId,
741
+ checkoutId: repository.activeCheckoutId,
705
742
  scanned: 0,
706
743
  updated: 0,
707
744
  unresolved: 0,
@@ -867,39 +904,6 @@ export async function callRepositoryTool(
867
904
  const payload = typeof args.payload === 'object' && args.payload !== null
868
905
  ? args.payload as Record<string, unknown>
869
906
  : {};
870
- if (operation === 'assess_work_mode') {
871
- const description = typeof payload.description === 'string'
872
- ? payload.description
873
- : typeof args.description === 'string' ? args.description : '';
874
- const assessment = assessWorkMode({
875
- description,
876
- knownPaths: Array.isArray(payload.known_paths) ? payload.known_paths.map(String) : undefined,
877
- expectedFiles: typeof payload.expected_files === 'number' ? payload.expected_files : undefined,
878
- expectedChangedLines: typeof payload.expected_changed_lines === 'number' ? payload.expected_changed_lines : undefined,
879
- requiresInvestigation: payload.requires_investigation === true,
880
- requiresParallelism: payload.requires_parallelism === true,
881
- requiresLongRunningChecks: payload.requires_long_running_checks === true,
882
- needsDependencies: payload.needs_dependencies === true,
883
- requiresIndependentDeliverables: payload.requires_independent_deliverables === true,
884
- independentTaskCount: typeof payload.independent_task_count === 'number' ? payload.independent_task_count : undefined,
885
- requiresRemoteWrite: payload.requires_remote_write === true || payload.remote_write === true,
886
- requiresRecovery: payload.requires_recovery === true,
887
- agentRequested: payload.agent_requested === true || payload.requires_worker === true,
888
- requiresWorkerIsolation: payload.requires_worker_isolation === true,
889
- risk: typeof payload.risk === 'string' ? payload.risk as 'low' | 'medium' | 'high' | 'destructive' : undefined,
890
- explicitMode: parseExplicitTaskMode(payload.mode),
891
- });
892
- return result({
893
- assessment,
894
- routing: {
895
- path: assessment.executionPath,
896
- reasons: assessment.reasons,
897
- recommendedMode: assessment.recommendedMode,
898
- issueRequired: assessment.issueRequired,
899
- },
900
- nextTools: assessment.nextTools,
901
- });
902
- }
903
907
  const internalTool = {
904
908
  batch_execute: 'repository_batch_execute',
905
909
  lanes_execute: 'repository_lanes_execute',
@@ -924,8 +928,8 @@ export async function callRepositoryTool(
924
928
  : readRepositoryGitStatusSample(controllerHome, repository.repoId, repository.activeCheckoutId);
925
929
  return result({
926
930
  status: status ?? {
927
- repoId: repository.repoId,
928
- checkoutId: repository.activeCheckoutId,
931
+ repoId: repository.repoId,
932
+ checkoutId: repository.activeCheckoutId,
929
933
  sampleSource: 'daemon-sample',
930
934
  sampled: false,
931
935
  observedAt: null,
@@ -972,24 +976,14 @@ export async function callRepositoryTool(
972
976
  allowSoleRepository: true,
973
977
  });
974
978
  return result({
975
- repoId: repository.repoId,
976
- checkoutId: repository.activeCheckoutId,
979
+ repoId: repository.repoId,
980
+ checkoutId: repository.activeCheckoutId,
977
981
  plan: buildSafePatchPlan(repository, { operations: args.operations, chunkSize: args.chunk_size }),
978
982
  });
979
983
  }
980
984
  case 'repository_safe_patch_apply': {
981
985
  const repository = resolveRepositorySelectionForClaimedWork(controllerHome, args, repoIdValue, caller);
982
986
  const binding = safePatchEditBinding(controllerHome, repository, caller, args);
983
- if (binding?.workId) {
984
- const work = getWorkContract({ controllerHome, repoId: repository.repoId }, binding.workId);
985
- if (!work) throw new Error(`WORK_NOT_FOUND: ${binding.workId}`);
986
- const requestedPaths = buildSafePatchPlan(repository, { operations: args.operations, chunkSize: args.chunk_size })
987
- .chunks.flatMap((chunk) => chunk.paths);
988
- assertWorkPathsWithinScope(work, requestedPaths, {
989
- forbidden: 'WORK_MUTATION_FORBIDDEN_PATH',
990
- outOfScope: 'WORK_MUTATION_PATH_OUT_OF_SCOPE',
991
- });
992
- }
993
987
  const applied = withControllerLock(
994
988
  controllerHome,
995
989
  { scope: 'repository', repoId: repository.repoId },
@@ -1009,6 +1003,7 @@ export async function callRepositoryTool(
1009
1003
  repository,
1010
1004
  workId: binding.workId,
1011
1005
  principalId: binding.principalId ?? caller?.principalId ?? '',
1006
+ sessionId: caller?.sessionId,
1012
1007
  })
1013
1008
  : undefined;
1014
1009
  const patchResult = applySafePatch(repository, {
@@ -1080,8 +1075,8 @@ export async function callRepositoryTool(
1080
1075
  errorMessage: firstFailure?.message,
1081
1076
  });
1082
1077
  const payload = {
1083
- repoId: repository.repoId,
1084
- checkoutId: repository.activeCheckoutId,
1078
+ repoId: repository.repoId,
1079
+ checkoutId: repository.activeCheckoutId,
1085
1080
  ...applied as unknown as Record<string, unknown>,
1086
1081
  phase: digest.phase,
1087
1082
  statusLabel: digest.statusLabel,
@@ -1096,12 +1091,12 @@ export async function callRepositoryTool(
1096
1091
  }
1097
1092
  case 'repository_command_preview': {
1098
1093
  const target = resolveRepositoryCommandTarget(controllerHome, args, repoIdValue, caller);
1099
- const { repository } = target;
1094
+ const { commandTarget } = target;
1100
1095
  const execution = withControllerLock(
1101
1096
  controllerHome,
1102
- { scope: 'repository', repoId: repository.repoId },
1097
+ { scope: 'repository', repoId: commandExecutionScopeKey(commandTarget) },
1103
1098
  'mcp:repository_command_preview',
1104
- () => executeRepositoryCommand(controllerHome, repository, {
1099
+ () => executeRepositoryCommand(controllerHome, commandTarget, {
1105
1100
  command: args.command as string | string[],
1106
1101
  cwd: typeof args.cwd === 'string' ? args.cwd : undefined,
1107
1102
  dryRun: true,
@@ -1109,23 +1104,32 @@ export async function callRepositoryTool(
1109
1104
  }),
1110
1105
  60_000,
1111
1106
  );
1107
+ // Repository targets keep repoId/checkoutId. An arbitrary workspace target
1108
+ // reports its workspace scope id and never a repository id.
1109
+ const { repoId: _previewRepoId, checkoutId: _previewCheckoutId, ...workspacePreviewFields } = execution as unknown as Record<string, unknown>;
1112
1110
  return result({
1113
- ...execution as unknown as Record<string, unknown>,
1111
+ ...(commandTarget.repoId ? execution as unknown as Record<string, unknown> : workspacePreviewFields),
1112
+ ...(commandTarget.repoId ? {} : { scopeId: commandExecutionScopeKey(commandTarget) }),
1114
1113
  ...(target.workspace ? { workspace: target.workspace } : {}),
1115
1114
  });
1116
1115
  }
1117
1116
  case 'repository_command_execute': {
1118
1117
  const explorationGuidance = fragmentedRepositoryExplorationGuidance(args.command);
1119
1118
  let target = resolveRepositoryCommandTarget(controllerHome, args, repoIdValue, caller);
1120
- let { repository, executionIdentity, historicalWorkContext } = target;
1119
+ let { repository, commandTarget, executionIdentity, historicalWorkContext } = target;
1120
+ // Repository targets keep their established identity fields. An arbitrary
1121
+ // workspace target reports a workspace scope id and never a repository id.
1122
+ const commandScopeKey = commandExecutionScopeKey(commandTarget);
1123
+ const scopeFields: Record<string, unknown> = repository
1124
+ ? { repoId: commandScopeKey, checkoutId: commandTarget.activeCheckoutId }
1125
+ : { scopeId: commandScopeKey };
1121
1126
  const explicitWorkId = typeof args.work_id === 'string' ? args.work_id.trim() : '';
1122
- if (!explicitWorkId) assertNoBoundExecutionSessionMutation(controllerHome, repository, caller);
1123
- const deliveryWorkId = rawDefaultBranchMergeCommand(repository, args.command)
1124
- ? executionIdentity.workId
1125
- : undefined;
1126
- if (deliveryWorkId) {
1127
- throw new Error(`WORK_DELIVERY_REQUIRES_FINALIZE: ${deliveryWorkId} must pass Work verification and use rh_work finalize before default-branch integration`);
1128
- }
1127
+ // Repository-semantic checks apply only when a repository target exists;
1128
+ // an arbitrary workspace has no bound session, default branch, or Work.
1129
+ if (repository && !explicitWorkId) assertNoBoundExecutionSessionMutation(controllerHome, repository, caller);
1130
+ // Git integration is a capability with its own repository, scope and
1131
+ // concurrency checks. A Work's semantic completion and any optional
1132
+ // verification/review evidence never admit or deny this operation.
1129
1133
  const timeoutMs = typeof args.timeout_ms === 'number'
1130
1134
  ? args.timeout_ms
1131
1135
  : typeof args.timeout_ms === 'string'
@@ -1155,7 +1159,7 @@ export async function callRepositoryTool(
1155
1159
  const routeClass = classifyRepositoryCommandRoute(args.command as string | string[], {
1156
1160
  forceDurable,
1157
1161
  workId: executionIdentity.workId,
1158
- defaultBranch: repository.defaultBranch,
1162
+ defaultBranch: commandTarget.defaultBranch,
1159
1163
  timeoutMs,
1160
1164
  });
1161
1165
  const processRequestId = typeof args.request_id === 'string' ? args.request_id.trim() : '';
@@ -1168,7 +1172,7 @@ export async function callRepositoryTool(
1168
1172
  );
1169
1173
  }
1170
1174
  let mutationAuthority: ReturnType<typeof ensureRepositoryMutationWorkHandle> | undefined;
1171
- const mutationClassification = classifyRepositoryCommand(args.command as string | string[], repository.defaultBranch);
1175
+ const mutationClassification = classifyRepositoryCommand(args.command as string | string[], commandTarget.defaultBranch);
1172
1176
  if (
1173
1177
  (mutationClassification.risk === 'workspace_write' || mutationClassification.risk === 'destructive')
1174
1178
  && (routeClass.route === 'process_direct' || routeClass.route === 'process_managed')
@@ -1176,51 +1180,43 @@ export async function callRepositoryTool(
1176
1180
  if (executionIdentity.workId) {
1177
1181
  mutationAuthority = withControllerLock(
1178
1182
  controllerHome,
1179
- { scope: 'repository', repoId: repository.repoId },
1183
+ { scope: 'repository', repoId: commandExecutionScopeKey(commandTarget) },
1180
1184
  'mcp:repository_command_execute:mutation-authority',
1181
1185
  () => ensureRepositoryMutationWorkHandle({
1182
1186
  controllerHome,
1183
- repository,
1187
+ repository: repository!,
1184
1188
  workId: executionIdentity.workId!,
1185
1189
  principalId: caller?.principalId ?? '',
1190
+ sessionId: caller?.sessionId,
1186
1191
  deferEffectPromotion: true,
1187
1192
  }),
1188
1193
  60_000,
1189
1194
  );
1190
- // Pre-mutation reconciliation may advance expectedHead. Re-resolve
1191
- // immutable execution identity after that durable CAS and before spawn.
1192
- target = resolveRepositoryCommandTarget(controllerHome, args, repoIdValue, caller);
1193
- ({ repository, executionIdentity, historicalWorkContext } = target);
1195
+ // Pre-mutation reconciliation may advance expectedHead. Preserve the
1196
+ // complete WorkHandle identity after that CAS; rebuilding a generic
1197
+ // repository identity here drops branch/expectedHead and prevents the
1198
+ // successful command from settling its legitimate successor HEAD.
1199
+ executionIdentity = executionIdentityForWork(repository!, mutationAuthority.handle);
1194
1200
  } else {
1195
1201
  withControllerLock(
1196
1202
  controllerHome,
1197
- { scope: 'repository', repoId: repository.repoId },
1203
+ { scope: 'repository', repoId: commandExecutionScopeKey(commandTarget) },
1198
1204
  'mcp:repository_command_execute:unattributed-mutation-authority',
1199
1205
  () => assertCanonicalRepositoryMutationWorkHandleAvailable({
1200
1206
  controllerHome,
1201
- repositoryId: repository.repoId,
1202
- checkoutId: repository.activeCheckoutId,
1207
+ repositoryId: commandExecutionScopeKey(commandTarget),
1208
+ checkoutId: commandTarget.activeCheckoutId ?? '',
1203
1209
  }),
1204
1210
  60_000,
1205
1211
  );
1206
1212
  }
1207
1213
  }
1208
- if (executionIdentity.workId && (rawCommitScope.kind === 'staged_index' || rawCommitScope.kind === 'explicit_paths')) {
1209
- const work = getWorkContract({ controllerHome, repoId: repository.repoId }, executionIdentity.workId);
1210
- if (!work) throw new Error(`WORK_NOT_FOUND: ${executionIdentity.workId}`);
1211
- const commitScope = resolveRepositoryGitCommitScope(repository, {
1212
- paths: rawCommitScope.kind === 'explicit_paths' ? rawCommitScope.paths : undefined,
1213
- });
1214
- assertWorkPathsWithinScope(work, commitScope.paths, {
1215
- forbidden: 'WORK_COMMIT_STAGED_PATH_FORBIDDEN',
1216
- outOfScope: 'WORK_COMMIT_STAGED_PATH_OUT_OF_SCOPE',
1217
- });
1218
- }
1219
- // repository_command_execute owns its command execution architecture.
1220
- // Do not send ordinary command text through Thin Harness semantic risk
1221
- // routing: that creates duplicate regex/classifier policy and turns
1222
- // unknown CLI shapes into false durable/reject decisions. Only an
1223
- // explicitly requested durable mode uses the generic durable router.
1214
+ // Compatibility boundary only: this facade owns repository-domain
1215
+ // context (target resolution, Git/source mutation fencing and legacy
1216
+ // response translation), while Unified Process Runtime owns execution,
1217
+ // handles, cancellation and persistence. Do not create another generic
1218
+ // command executor here. Thin Harness is consulted only for an explicit
1219
+ // external durable boundary, not as a second command classifier.
1224
1220
  const routingDecision = forceDurable
1225
1221
  ? routeExecution({
1226
1222
  operation: 'repository_command_execute',
@@ -1255,8 +1251,7 @@ export async function callRepositoryTool(
1255
1251
  path: routeClass.reason,
1256
1252
  route: 'reject',
1257
1253
  status: 'rejected',
1258
- repoId: repository.repoId,
1259
- checkoutId: repository.activeCheckoutId,
1254
+ ...scopeFields,
1260
1255
  workspace: target.workspace,
1261
1256
  message: routeClass.reason === 'standalone_recovery_lifecycle_required'
1262
1257
  ? 'Canonical Runtime and connector lifecycle operations must be submitted to the standalone Forge Recovery owner, not executed as a child of repository Process Runtime.'
@@ -1277,8 +1272,7 @@ export async function callRepositoryTool(
1277
1272
  accepted: false,
1278
1273
  mode: 'durable',
1279
1274
  path: 'ephemeral_workspace_promotion_required',
1280
- repoId: repository.repoId,
1281
- checkoutId: repository.activeCheckoutId,
1275
+ ...scopeFields,
1282
1276
  workspace: target.workspace,
1283
1277
  message: 'Ephemeral workspaces must be registered before durable remote effects so Process identity and reconciliation have a stable repository authority.',
1284
1278
  suggestedOperation: 'repository_register',
@@ -1287,7 +1281,7 @@ export async function callRepositoryTool(
1287
1281
  if (routeClass.route === 'process_direct' || routeClass.route === 'process_managed' || routeClass.route === 'durable') {
1288
1282
  const processResult = await executeRepositoryCommandViaProcessRuntime({
1289
1283
  controllerHome,
1290
- repository,
1284
+ repository: commandTarget,
1291
1285
  command: args.command as string | string[],
1292
1286
  cwd: typeof args.cwd === 'string' ? args.cwd : undefined,
1293
1287
  timeoutMs,
@@ -1300,18 +1294,18 @@ export async function callRepositoryTool(
1300
1294
  workId: executionIdentity.workId,
1301
1295
  executionIdentity,
1302
1296
  allowNonGitWorkspace: target.workspace !== undefined,
1297
+ principalId: caller?.principalId ?? undefined,
1303
1298
  });
1304
- if (mutationAuthority && (processResult.route === 'process_direct' || processResult.route === 'process_managed')) {
1299
+ if (repository && mutationAuthority && (processResult.route === 'process_direct' || processResult.route === 'process_managed')) {
1305
1300
  const processHandle = processResult.process;
1306
1301
  const postStatus = repositoryGitStatus(repository);
1307
1302
  const expectedHead = mutationAuthority.handle.expectedHead;
1308
- const mutationObserved = (processHandle !== undefined && processHandle.completed !== true)
1309
- || !postStatus.clean
1303
+ const mutationObserved = !postStatus.clean
1310
1304
  || (Boolean(postStatus.head) && postStatus.head !== expectedHead);
1311
1305
  if (mutationObserved) {
1312
1306
  withControllerLock(
1313
1307
  controllerHome,
1314
- { scope: 'repository', repoId: repository.repoId },
1308
+ { scope: 'repository', repoId: commandExecutionScopeKey(commandTarget) },
1315
1309
  'mcp:repository_command_execute:mutation-started',
1316
1310
  () => markRepositoryMutationStarted({
1317
1311
  controllerHome,
@@ -1342,8 +1336,7 @@ export async function callRepositoryTool(
1342
1336
  mode: processResult.route,
1343
1337
  path: processResult.reason ?? routeClass.reason,
1344
1338
  route: processResult.route,
1345
- repoId: repository.repoId,
1346
- checkoutId: repository.activeCheckoutId,
1339
+ ...scopeFields,
1347
1340
  workspace: target.workspace,
1348
1341
  status: processResult.executionStatus,
1349
1342
  policyDecision: processResult.policyDecision ?? 'approval_required',
@@ -1370,8 +1363,7 @@ export async function callRepositoryTool(
1370
1363
  route: processResult.route,
1371
1364
  reasons: [processResult.reason ?? routeClass.reason, ...routingDecision.reasons],
1372
1365
  decision: detailLevel === 'detail' ? routingDecision : undefined,
1373
- repoId: repository.repoId,
1374
- checkoutId: repository.activeCheckoutId,
1366
+ ...scopeFields,
1375
1367
  workspace: target.workspace,
1376
1368
  historicalWorkContext,
1377
1369
  processId: handle?.processId,
@@ -1434,8 +1426,7 @@ export async function callRepositoryTool(
1434
1426
  accepted: false,
1435
1427
  mode: 'durable',
1436
1428
  path: 'ephemeral_workspace_promotion_required',
1437
- repoId: repository.repoId,
1438
- checkoutId: repository.activeCheckoutId,
1429
+ ...scopeFields,
1439
1430
  workspace: target.workspace,
1440
1431
  message: 'Ephemeral workspaces support bounded local Direct/Managed execution only. Register the directory before durable, remote, release, or resumable Work.',
1441
1432
  suggestedOperation: 'repository_register',
@@ -1449,13 +1440,13 @@ export async function callRepositoryTool(
1449
1440
  try {
1450
1441
  const routeClass = classifyRepositoryCommandRoute(args.command as string | string[], {
1451
1442
  forceDurable: false,
1452
- defaultBranch: repository.defaultBranch,
1443
+ defaultBranch: commandTarget.defaultBranch,
1453
1444
  timeoutMs,
1454
1445
  });
1455
1446
  if (routeClass.route === 'process_direct') {
1456
1447
  const processResult = await executeRepositoryCommandViaProcessRuntime({
1457
1448
  controllerHome,
1458
- repository,
1449
+ repository: commandTarget,
1459
1450
  command: args.command as string | string[],
1460
1451
  cwd: typeof args.cwd === 'string' ? args.cwd : undefined,
1461
1452
  timeoutMs,
@@ -1463,6 +1454,7 @@ export async function callRepositoryTool(
1463
1454
  requestId: typeof args.request_id === 'string' ? args.request_id : undefined,
1464
1455
  workId: executionIdentity.workId,
1465
1456
  executionIdentity,
1457
+ principalId: caller?.principalId ?? undefined,
1466
1458
  });
1467
1459
  if (processResult.route === 'process_direct') {
1468
1460
  const execRecord = processResult.process as unknown as Record<string, unknown> | undefined;
@@ -1476,8 +1468,7 @@ export async function callRepositoryTool(
1476
1468
  mode: 'durable',
1477
1469
  reasons: ['durable_worker_inline_process_direct', routeClass.reason, ...routingDecision.reasons],
1478
1470
  }),
1479
- repoId: repository.repoId,
1480
- checkoutId: repository.activeCheckoutId,
1471
+ ...scopeFields,
1481
1472
  ok,
1482
1473
  processId: typeof execRecord?.processId === 'string' ? execRecord.processId : undefined,
1483
1474
  status: typeof execRecord?.status === 'string' ? execRecord.status : undefined,
@@ -1544,8 +1535,8 @@ export async function callRepositoryTool(
1544
1535
  const batch = await executeRepositoryBatch(
1545
1536
  { controllerHome, repository },
1546
1537
  {
1547
- repoId: repository.repoId,
1548
- checkoutId: repository.activeCheckoutId,
1538
+ repoId: repository.repoId,
1539
+ checkoutId: repository.activeCheckoutId,
1549
1540
  mode: args.mode === 'fast' || args.mode === 'durable' || args.mode === 'auto' ? args.mode : 'auto',
1550
1541
  steps,
1551
1542
  stopOnError: args.stop_on_error !== false,
@@ -1569,8 +1560,8 @@ export async function callRepositoryTool(
1569
1560
  const lanes = await executeLightweightLanes(
1570
1561
  { controllerHome, repository },
1571
1562
  {
1572
- repoId: repository.repoId,
1573
- checkoutId: repository.activeCheckoutId,
1563
+ repoId: repository.repoId,
1564
+ checkoutId: repository.activeCheckoutId,
1574
1565
  readLanes: Array.isArray(args.read_lanes)
1575
1566
  ? args.read_lanes
1576
1567
  .filter((entry): entry is Record<string, unknown> => typeof entry === 'object' && entry !== null)
@@ -38,6 +38,11 @@ export const DEFAULT_CONTROLLER_TOOL_NAMES = [
38
38
  'plugin_action_execute',
39
39
 
40
40
  // Managed Process Runtime lifecycle (attach / poll / cancel — never re-exec).
41
+ // process_exec is the canonical host-local command lane: the Forge instance is
42
+ // the target, cwd is an execution argument, and it is authorized by one
43
+ // explicit `process:exec` canonical Grant. repository_command_execute stays as
44
+ // translation-only compatibility over the repository target.
45
+ 'process_exec',
41
46
  'process_get',
42
47
  'process_wait',
43
48
  'process_logs',
@@ -11,6 +11,8 @@ import { runtimeToolDefinitions } from './runtime-gateway/runtime-tool-definitio
11
11
  import { executionToolDefinitions } from './runtime-gateway/execution-tools';
12
12
  import { processToolDefinitions } from './runtime-gateway/process-tools';
13
13
  import { injectDurableCommandFields } from './runtime-gateway/router';
14
+ import { injectAutomationEnvelopeFields } from './runtime-gateway/automation-receipt-adapter';
15
+ import { injectCognitionSettlementFields } from './runtime-gateway/cognition-settlement';
14
16
  import { DEFAULT_CONTROLLER_TOOL_NAMES, PREFERRED_FACADE_TOOL_NAMES, STABLE_CONTROLLER_TOOL_NAMES } from './toolset-names';
15
17
  export { BOOTSTRAP_CONTROLLER_TOOL_NAMES, CORE_CONTROLLER_TOOL_NAMES, DEFAULT_CONTROLLER_TOOL_NAMES, PREFERRED_FACADE_TOOL_NAMES, STABLE_CONTROLLER_TOOL_NAMES } from './toolset-names';
16
18
  import type { McpToolset } from './types';
@@ -197,10 +199,9 @@ function buildStaticControllerExposureSnapshot(
197
199
  const definitions = expectedToolNames
198
200
  .map((name) => definitionByName.get(name))
199
201
  .filter((definition): definition is McpToolDefinition => Boolean(definition))
200
- // Fingerprint the definitions that ListTools actually returns. The server
201
- // adds durable command fields to every object schema, so calculating the
202
- // fence from the pre-injection form would miss a change to those fields.
203
- .map(injectDurableCommandFields);
202
+ // Fingerprint the exact definitions that ListTools returns. Shared transport
203
+ // contracts are injected here once rather than re-declared by domain registries.
204
+ .map((definition) => injectCognitionSettlementFields(injectAutomationEnvelopeFields(injectDurableCommandFields(definition))));
204
205
  const actualToolNames = definitions.map((tool) => tool.name);
205
206
  const actualSet = new Set(actualToolNames);
206
207
  const expectedSet = new Set(expectedToolNames);
@@ -272,7 +273,7 @@ export function clearControllerExposureCacheForTest(): void {
272
273
  export function allControllerToolDefinitions(ctx: MultiRepositoryMcpToolContext): McpToolDefinition[] {
273
274
  return uniqueDefinitions(
274
275
  runtimeToolDefinitions.concat(executionToolDefinitions, processToolDefinitions, accessToolDefinitions, repositoryToolDefinitions, buildMultiRepositoryToolDefinitions(ctx)),
275
- ).definitions;
276
+ ).definitions.map((definition) => injectCognitionSettlementFields(injectAutomationEnvelopeFields(injectDurableCommandFields(definition))));
276
277
  }
277
278
 
278
279
  export function controllerExposureSnapshot(ctx: MultiRepositoryMcpToolContext): ControllerExposureSnapshot {