@moretea-labs/forge 1.8.0 → 1.8.2

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 (695) hide show
  1. package/AGENTS.md +73 -7
  2. package/CHANGELOG.md +34 -0
  3. package/CLAUDE.md +17 -2
  4. package/CONTRIBUTING.md +3 -2
  5. package/README.en.md +24 -3
  6. package/README.md +10 -6
  7. package/README.zh-CN.md +5 -3
  8. package/THIRD_PARTY_NOTICES.md +1 -2
  9. package/adapters/chatgpt/browser-delivery-host.ts +7 -1
  10. package/adapters/chatgpt/browser-delivery-runtime.ts +531 -56
  11. package/adapters/chatgpt/controller-binding-store.ts +101 -22
  12. package/adapters/chatgpt/controller-round-host.ts +15 -25
  13. package/adapters/chatgpt/controller-round-settlement-store.ts +58 -4
  14. package/adapters/chatgpt/provider-delivery.ts +229 -2
  15. package/adapters/chatgpt/work-conversation-binding-store.ts +99 -54
  16. package/adapters/computer/chatgpt-extension-target.ts +708 -0
  17. package/adapters/computer/chrome-extension/background.js +541 -0
  18. package/adapters/computer/chrome-extension/content.js +402 -0
  19. package/adapters/computer/chrome-extension/core.js +24 -0
  20. package/adapters/computer/chrome-extension/manifest.json +32 -0
  21. package/adapters/computer/desktop-operator-discovery.ts +11 -31
  22. package/adapters/computer/desktop-operator-provider.ts +18 -6
  23. package/adapters/computer/interaction-target-authority.ts +178 -24
  24. package/adapters/mcp/access-mode.ts +18 -39
  25. package/adapters/mcp/auth.ts +2 -7
  26. package/adapters/mcp/instructions.ts +6 -5
  27. package/adapters/mcp/multi-repository.ts +10 -47
  28. package/adapters/mcp/oauth.ts +73 -0
  29. package/adapters/mcp/paths.ts +4 -1
  30. package/adapters/mcp/runtime-gateway/bounded-result-runtime.ts +62 -0
  31. package/adapters/mcp/runtime-gateway/cognition-settlement.ts +201 -0
  32. package/adapters/mcp/runtime-gateway/context-adapter.ts +490 -113
  33. package/adapters/mcp/runtime-gateway/context-pack-sidecar.ts +83 -0
  34. package/adapters/mcp/runtime-gateway/controller-authority-adapter.ts +20 -5
  35. package/adapters/mcp/runtime-gateway/core-capability-adapter.ts +258 -0
  36. package/adapters/mcp/runtime-gateway/engineering-preconditions.ts +10 -27
  37. package/adapters/mcp/runtime-gateway/engineering-tool-contract.ts +15 -0
  38. package/adapters/mcp/runtime-gateway/execution-tools.ts +14 -54
  39. package/adapters/mcp/runtime-gateway/gateway-execution-adapter.ts +2 -1
  40. package/adapters/mcp/runtime-gateway/plugin-adapter.ts +132 -47
  41. package/adapters/mcp/runtime-gateway/process-tools.ts +173 -23
  42. package/adapters/mcp/runtime-gateway/protected-computer-adapter.ts +16 -4
  43. package/adapters/mcp/runtime-gateway/recovery-adapter.ts +69 -52
  44. package/adapters/mcp/runtime-gateway/repository-compat-adapter.ts +4 -35
  45. package/adapters/mcp/runtime-gateway/result-adapter.ts +10 -4
  46. package/adapters/mcp/runtime-gateway/router.ts +19 -507
  47. package/adapters/mcp/runtime-gateway/routing-policy.ts +506 -0
  48. package/adapters/mcp/runtime-gateway/runtime-observation-adapter.ts +15 -66
  49. package/adapters/mcp/runtime-gateway/runtime-readiness-observation.ts +218 -0
  50. package/adapters/mcp/runtime-gateway/runtime-tool-definitions.ts +123 -178
  51. package/adapters/mcp/runtime-gateway/runtime-tools.ts +11 -5
  52. package/adapters/mcp/runtime-gateway/scheduler-adapter.ts +37 -1
  53. package/adapters/mcp/runtime-gateway/shared-adapter.ts +20 -0
  54. package/adapters/mcp/runtime-gateway/status-inbox-adapter.ts +416 -270
  55. package/adapters/mcp/runtime-gateway/typescript-navigation-sidecar.ts +140 -0
  56. package/adapters/mcp/runtime-gateway/work-adapter.ts +262 -3123
  57. package/adapters/mcp/runtime-gateway/work-controller-operations.ts +257 -0
  58. package/adapters/mcp/runtime-gateway/work-detail-projection.ts +60 -0
  59. package/adapters/mcp/runtime-gateway/work-input-wire-migration.ts +229 -0
  60. package/adapters/mcp/runtime-gateway/work-learning-operations.ts +145 -0
  61. package/adapters/mcp/runtime-gateway/work-list-projection.ts +38 -0
  62. package/adapters/mcp/runtime-gateway/work-plan-operations.ts +382 -0
  63. package/adapters/mcp/runtime-gateway/work-repair-adapter.ts +308 -0
  64. package/adapters/mcp/runtime-gateway/work-requirement-operations.ts +148 -0
  65. package/adapters/mcp/runtime-gateway/work-semantic-operations.ts +320 -0
  66. package/adapters/mcp/runtime-gateway/work-workflow-operations.ts +113 -0
  67. package/adapters/mcp/runtime-gateway/workflow-supervisor-adapter.ts +180 -0
  68. package/adapters/mcp/server.ts +91 -26
  69. package/adapters/mcp/setup.ts +5 -13
  70. package/adapters/mcp/tool-mapping/access-tools.ts +0 -6
  71. package/adapters/mcp/tool-mapping/legacy-tool-service.ts +703 -3092
  72. package/adapters/mcp/tool-mapping/post-finalize-work-attribution.ts +5 -10
  73. package/adapters/mcp/tool-mapping/repository-tools.ts +170 -213
  74. package/adapters/mcp/toolset-names.ts +11 -37
  75. package/adapters/mcp/toolset.ts +19 -92
  76. package/{src/cli → adapters}/mcp/transports/AGENTS.md +5 -5
  77. package/{src/cli → adapters}/mcp/transports/CLAUDE.md +5 -5
  78. package/adapters/mcp/transports/http-observation.ts +377 -0
  79. package/adapters/mcp/transports/http-post-lifecycle.ts +19 -0
  80. package/adapters/mcp/transports/http.ts +200 -683
  81. package/adapters/mcp/transports/oauth-http.ts +322 -0
  82. package/adapters/mcp/transports/session-registry.ts +6 -0
  83. package/adapters/mcp/tunnels/openai-secure-tunnel.ts +89 -5
  84. package/adapters/mcp/types.ts +0 -6
  85. package/assets/hooks/lib/session-state.sh +0 -38
  86. package/assets/hooks/post-bash.sh +1 -1
  87. package/assets/hooks/post-tool-observer.sh +0 -5
  88. package/assets/hooks/prompt-guard.sh +0 -55
  89. package/assets/partials/04-project-structure.partial.md +1 -1
  90. package/assets/partials/07-footer.partial.md +1 -1
  91. package/assets/partials-agents/02-operating-mode.partial.md +1 -1
  92. package/assets/partials-agents/08-deep-docs.partial.md +1 -1
  93. package/assets/plugin-registry.v1.json +6 -4
  94. package/assets/reference-configs/agentic-development-flow.md +26 -1
  95. package/assets/reference-configs/external-tooling.md +0 -76
  96. package/assets/reference-configs/global-working-rules.md +19 -0
  97. package/assets/reference-configs/release-deploy.md +1 -1
  98. package/assets/templates/helpers/architecture-queue.sh +1 -1
  99. package/assets/templates/helpers/check-agent-tooling.sh +1 -327
  100. package/assets/templates/helpers/check-task-workflow.sh +1 -1
  101. package/assets/templates/helpers/ensure-task-workflow.sh +0 -14
  102. package/assets/templates/helpers/migrate-project-template.sh +2 -2
  103. package/assets/workflow-contract.v1.json +0 -2
  104. package/docs/README.md +5 -2
  105. package/docs/architecture/CURRENT.md +205 -51
  106. package/docs/architecture/decisions/20260803-release-identity-binding-and-exit-policy.md +14 -5
  107. package/docs/architecture/decisions/20260823-immediate-controller-relay.md +6 -3
  108. package/docs/architecture/decisions/20260904-ios-device-migration-baseline.md +42 -0
  109. package/docs/architecture/decisions/20260907-assistant-learning-loop.md +2 -0
  110. package/docs/architecture/decisions/20260907-controller-round-transition-policy.md +19 -4
  111. package/docs/architecture/decisions/20260916-workflow-supervisor-authority.md +249 -0
  112. package/docs/architecture/decisions/20260917-cognitive-memory-foundation.md +82 -0
  113. package/docs/architecture/decisions/20260918-stable-candidate-release-lifecycle.md +234 -0
  114. package/docs/architecture/decisions/20260919-autonomous-work-liveness.md +62 -0
  115. package/docs/architecture/decisions/20260924-thin-semantic-working-context.md +74 -0
  116. package/docs/architecture/decisions/20261001-supervisor-turn-authority.md +342 -0
  117. package/docs/architecture/decisions/20261005-forge-v3-desktop-client-boundary.md +77 -0
  118. package/docs/architecture/decisions/20261009-exact-code-context-discovery.md +19 -0
  119. package/docs/architecture/decisions/20261009-generated-xcode-cache-retention.md +37 -0
  120. package/docs/architecture/decisions/20261011-autonomous-continuation-convergence.md +597 -0
  121. package/docs/architecture/decisions/20261017-edit-session-finalization-reconciliation.md +17 -0
  122. package/docs/architecture/decisions/20261019-retire-host-skills.md +16 -0
  123. package/docs/architecture/diagrams/agentic-dev-plugin-architecture.html +1 -1
  124. package/docs/architecture/domains/public-surface.md +3 -5
  125. package/docs/architecture/domains/verification.md +6 -5
  126. package/docs/architecture/domains/workflow-engine.md +6 -0
  127. package/docs/architecture/modules/controller-runtime/transport-lifecycle.md +3 -3
  128. package/docs/architecture/requests/2026-09-04-computer-plugin-workflow-taxonomy.md +4 -4
  129. package/docs/architecture/reviews/20261015-code-search-runtime-acceptance.md +75 -0
  130. package/docs/forge-plugin-management.md +16 -4
  131. package/docs/operations/controller-browser-plugin.md +23 -0
  132. package/docs/operations/controller-performance-and-502.md +17 -0
  133. package/docs/operations/controller-reliability-runbook.md +2 -2
  134. package/docs/operations/features.md +6 -7
  135. package/docs/operations/features.zh-CN.md +1 -1
  136. package/docs/operations/github-repository.md +4 -4
  137. package/docs/operations/github-semantic-release-projection.md +20 -0
  138. package/docs/operations/homebrew.md +2 -2
  139. package/docs/operations/mcp-tool-exposure.md +13 -52
  140. package/docs/operations/releasing.md +2 -0
  141. package/docs/operations/runtime-performance-diagnostics.md +8 -0
  142. package/docs/operations/standalone-disaster-recovery.md +15 -7
  143. package/docs/tutorials/01-install-and-start.zh-CN.md +1 -1
  144. package/docs/tutorials/03-first-repository-task.md +2 -0
  145. package/docs/wiki/Computer-and-Plugins.md +78 -0
  146. package/docs/wiki/Computer-and-Plugins.zh-CN.md +88 -0
  147. package/docs/wiki/Home.md +16 -2
  148. package/docs/wiki/Implementation.md +25 -13
  149. package/docs/wiki/Installation.md +28 -32
  150. package/docs/wiki/Integrations.md +4 -0
  151. package/docs/wiki/Quick-Start.md +35 -22
  152. package/docs/wiki/Releases-and-Upgrades.md +15 -25
  153. package/docs/wiki/_Sidebar.md +5 -1
  154. package/package.json +25 -25
  155. package/packages/kernel/cognition/api/index.ts +6 -0
  156. package/packages/kernel/cognition/application/activation-service.ts +451 -0
  157. package/packages/kernel/cognition/application/consolidation-service.ts +185 -0
  158. package/packages/kernel/cognition/application/legacy-experience-adapter.ts +38 -0
  159. package/packages/kernel/cognition/application/memory-service.ts +64 -0
  160. package/packages/kernel/cognition/domain/learning.ts +106 -0
  161. package/packages/kernel/cognition/domain/memory.ts +254 -0
  162. package/packages/kernel/controller/api/index.ts +1 -0
  163. package/packages/kernel/controller/application/continuation-service.ts +281 -0
  164. package/packages/kernel/controller/application/controller-round-service.ts +12 -0
  165. package/packages/kernel/controller/domain/controller-round-transition-policy.ts +242 -21
  166. package/packages/kernel/controller/domain/controller-round.ts +4 -1
  167. package/packages/kernel/controller/domain/execution-quality.ts +3 -1
  168. package/packages/kernel/controller/infrastructure/controller-round-store.ts +689 -103
  169. package/packages/kernel/controller/infrastructure/controller-session-store.ts +348 -97
  170. package/packages/kernel/controller/ports/controller-host.ts +2 -0
  171. package/packages/kernel/identity/api/index.ts +10 -0
  172. package/packages/kernel/identity/domain/activity-projection.ts +43 -0
  173. package/packages/kernel/identity/domain/capability-broker.ts +60 -0
  174. package/packages/kernel/identity/domain/grant.ts +72 -0
  175. package/packages/kernel/identity/domain/owned-resource.ts +116 -0
  176. package/packages/kernel/identity/domain/user-request.ts +93 -0
  177. package/packages/kernel/identity/infrastructure/activity-projection-store.ts +87 -0
  178. package/packages/kernel/identity/infrastructure/capability-broker.ts +81 -0
  179. package/packages/kernel/identity/infrastructure/grant-store.ts +284 -0
  180. package/packages/kernel/identity/infrastructure/owned-resource-store.ts +259 -0
  181. package/packages/kernel/identity/infrastructure/user-request-store.ts +182 -0
  182. package/packages/kernel/scheduler/api/index.ts +0 -2
  183. package/packages/kernel/scheduler/application/eligibility.ts +4 -1
  184. package/packages/kernel/scheduler/application/schedule-service.ts +3 -0
  185. package/packages/kernel/scheduler/application/settlement.ts +0 -15
  186. package/packages/kernel/scheduler/domain/schedule.ts +87 -0
  187. package/packages/kernel/scheduler/infrastructure/schedule-store.ts +166 -143
  188. package/packages/kernel/work/api/index.ts +3 -2
  189. package/packages/kernel/work/application/work-service.ts +18 -42
  190. package/packages/kernel/work/domain/current-task-lineage.ts +104 -0
  191. package/packages/kernel/work/domain/engineering-design.ts +10 -5
  192. package/packages/kernel/work/domain/engineering-profile.ts +8 -12
  193. package/packages/kernel/work/domain/evaluation-promotion-receipt.ts +186 -0
  194. package/packages/kernel/work/domain/execution-concurrency.ts +19 -26
  195. package/packages/kernel/work/domain/execution-snapshot.ts +0 -31
  196. package/packages/kernel/work/domain/implementation-review.ts +14 -331
  197. package/packages/kernel/work/domain/objective-graph.ts +119 -0
  198. package/packages/kernel/work/domain/project-engineering-contract.ts +23 -1
  199. package/packages/kernel/work/domain/repository-completion-receipt.ts +1 -1
  200. package/packages/kernel/work/domain/state-machine.ts +34 -65
  201. package/packages/kernel/work/domain/types.ts +57 -51
  202. package/packages/kernel/work/infrastructure/work-contract-store.ts +847 -729
  203. package/packages/kernel/work/ports/work-contract-store.ts +5 -2
  204. package/packages/plugin-runtime/browser/provider-registry.ts +12 -36
  205. package/packages/plugin-runtime/browser/session-authority.ts +2 -1
  206. package/packages/plugin-runtime/computer/chatgpt-identity.ts +24 -0
  207. package/packages/plugin-runtime/computer/conversation-target.ts +153 -0
  208. package/packages/plugin-runtime/computer/index.ts +2 -0
  209. package/packages/plugin-runtime/computer/target-authority.ts +26 -1
  210. package/packages/plugin-runtime/external/unix-jsonl-transport.ts +142 -18
  211. package/packages/protocols/computer/contract.ts +27 -1
  212. package/scripts/activate-source-baseline.ts +7 -9
  213. package/scripts/assemble-template.ts +11 -72
  214. package/scripts/canary-controller-semantic-wait.ts +12 -24
  215. package/scripts/check-mcp-compatibility.ts +94 -201
  216. package/scripts/check-package-identity.mjs +0 -5
  217. package/scripts/check-runtime-architecture.mjs +921 -239
  218. package/scripts/forge-local-recovery-helper.mjs +93 -15
  219. package/scripts/init-project.sh +0 -46
  220. package/scripts/install-ios-hid-toolchain.sh +60 -0
  221. package/scripts/install-standalone-recovery.ts +1 -1
  222. package/scripts/lib/project-init-lib.sh +6 -3
  223. package/scripts/migrate-windows-wsl-controller-home.ts +2 -0
  224. package/scripts/open-source-audit-allowlist.txt +1 -3
  225. package/scripts/run-bounded-command.mjs +5 -0
  226. package/scripts/run-governed-gate.ts +2 -1
  227. package/scripts/run-mobile-monitor-bridge.ts +0 -1
  228. package/scripts/smoke-control-plane-failure-domain.ts +94 -0
  229. package/scripts/smoke-ios-physical-device.ts +38 -10
  230. package/scripts/smoke-mcp-http-runtime.ts +12 -8
  231. package/scripts/smoke-mcp-tool-surface.ts +27 -41
  232. package/scripts/smoke-runtime-recovery.ts +12 -43
  233. package/scripts/smoke-schedule-engine.ts +23 -15
  234. package/scripts/smoke-unattended-transport-recovery.ts +223 -0
  235. package/scripts/smoke-user-request-continuation-restart.ts +232 -0
  236. package/scripts/smoke-workflow-supervisor-chrome-adapter.ts +95 -0
  237. package/scripts/smoke-workflow-supervisor-process-restart.ts +276 -0
  238. package/scripts/smoke-workflow-supervisor-restart-recovery.ts +150 -0
  239. package/scripts/smoke-workflow-supervisor.ts +103 -0
  240. package/scripts/sync-generated-authority.mjs +0 -1
  241. package/scripts/verify-forge-runtime.sh +2 -1
  242. package/src/cli/agent-jobs/executor-health.ts +12 -35
  243. package/src/cli/agent-jobs/integration.ts +20 -51
  244. package/src/cli/agent-jobs/job-manager.ts +7 -3
  245. package/src/cli/chatgpt-browser/file-policy.ts +2 -2
  246. package/src/cli/commands/brain-assistant.ts +27 -13
  247. package/src/cli/commands/brain.ts +13 -15
  248. package/src/cli/commands/chatgpt.ts +1 -163
  249. package/src/cli/commands/doctor.ts +1 -143
  250. package/src/cli/commands/global-runtime.ts +3 -196
  251. package/src/cli/commands/init-hook.ts +6 -23
  252. package/src/cli/commands/init.ts +3 -252
  253. package/src/cli/commands/mcp.ts +0 -5
  254. package/src/cli/commands/prompt-guard-decision.ts +0 -2
  255. package/src/cli/commands/recovery.ts +137 -135
  256. package/src/cli/commands/repository.ts +17 -1
  257. package/src/cli/commands/runtime.ts +3 -3
  258. package/src/cli/commands/setup-execution.ts +41 -0
  259. package/src/cli/commands/setup-profile.ts +8 -0
  260. package/src/cli/controller/check-runner.ts +13 -2
  261. package/src/cli/controller/completion-backlog.ts +3 -3
  262. package/src/cli/controller/completion-orchestrator.ts +5 -44
  263. package/src/cli/controller/completion-target.ts +3 -72
  264. package/src/cli/controller/composite-operations.ts +1 -1
  265. package/src/cli/controller/context/instruction-context.ts +1 -1
  266. package/src/cli/controller/context/known-paths.ts +2 -2
  267. package/src/cli/controller/context/query-planning.ts +11 -4
  268. package/src/cli/controller/context/rule-resolution.ts +2 -2
  269. package/src/cli/controller/context/source-materializer.ts +83 -102
  270. package/src/cli/controller/context/structural-provider.ts +84 -0
  271. package/src/cli/controller/context/structural.ts +6 -6
  272. package/src/cli/controller/context/types.ts +8 -9
  273. package/src/cli/controller/context-pack.ts +107 -84
  274. package/src/cli/controller/execution-completion.ts +4 -7
  275. package/src/cli/controller/execution-policy.ts +36 -153
  276. package/src/cli/controller/governance.ts +2 -3
  277. package/src/cli/controller/issue-store.ts +4 -99
  278. package/src/cli/controller/launch-agents.ts +59 -18
  279. package/src/cli/controller/operational-plan.ts +25 -52
  280. package/src/cli/controller/runtime-config.ts +5 -1
  281. package/src/cli/controller/stuck-state-migration.ts +2 -3
  282. package/src/cli/controller/systemd-user.ts +42 -10
  283. package/src/cli/editing/edit-session.ts +18 -12
  284. package/src/cli/github/github.ts +4 -4
  285. package/src/cli/github/semantic-projection.ts +174 -0
  286. package/src/cli/hook/prompt-intents.ts +0 -9
  287. package/src/cli/index.ts +1 -43
  288. package/src/cli/local-bridge/connector-freshness.ts +1 -12
  289. package/src/cli/local-bridge/console-automations.ts +19 -14
  290. package/src/cli/local-bridge/console-view-models.ts +4 -13
  291. package/src/cli/local-bridge/facade-api.ts +64 -193
  292. package/src/cli/local-bridge/server.ts +24 -147
  293. package/src/cli/local-bridge/types.ts +0 -1
  294. package/src/cli/mcp/oauth-client-retirement.ts +74 -0
  295. package/src/cli/repositories/command-classifier.ts +0 -9
  296. package/src/cli/repositories/command-executor.ts +29 -23
  297. package/src/cli/repositories/command-scope.ts +37 -18
  298. package/src/cli/repositories/controller-home.ts +48 -0
  299. package/src/cli/repositories/ephemeral-workspace.ts +20 -30
  300. package/src/cli/repositories/git-command-executor.ts +2 -2
  301. package/src/cli/repositories/locks.ts +20 -0
  302. package/src/cli/repositories/registry.ts +79 -12
  303. package/src/cli/repositories/safe-patch.ts +2 -12
  304. package/src/cli/repositories/structured-git.ts +101 -5
  305. package/src/cli/repository/inspector.ts +185 -343
  306. package/src/cli/repository/session-cache.ts +92 -6
  307. package/src/effects/process-runner.ts +17 -1
  308. package/src/runtime/context/assistant-context.ts +20 -7
  309. package/src/runtime/context/assistant-work-context.ts +89 -27
  310. package/src/runtime/context/automatic-learning.ts +565 -0
  311. package/src/runtime/context/cognitive-attention.ts +173 -0
  312. package/src/runtime/context/cognitive-skill-canary.ts +158 -0
  313. package/src/runtime/context/context-closure.ts +46 -9
  314. package/src/runtime/context/context-pack-process.ts +103 -0
  315. package/src/runtime/context/context-plane.ts +1 -9
  316. package/src/runtime/context/direct-controller-learning.ts +298 -0
  317. package/src/runtime/context/generic-lsp-provider.ts +1 -1
  318. package/src/runtime/context/semantic-navigation-contract.ts +16 -0
  319. package/src/runtime/context/semantic-navigation.ts +7 -35
  320. package/src/runtime/context/typescript-navigation-process.ts +145 -0
  321. package/src/runtime/context/typescript-navigation.ts +89 -3
  322. package/src/runtime/control-plane/cleanup-artifact-retention.ts +215 -12
  323. package/src/runtime/control-plane/concurrency/work-execution-concurrency.ts +9 -47
  324. package/src/runtime/control-plane/execution/controller-authority-recovery.ts +34 -4
  325. package/src/runtime/control-plane/execution/edit-validation-coordinator.ts +29 -20
  326. package/src/runtime/control-plane/execution/execution-identity.ts +23 -3
  327. package/src/runtime/control-plane/execution/repository-work-attribution.ts +7 -30
  328. package/src/runtime/control-plane/execution/retained-work-resume.ts +206 -199
  329. package/src/runtime/control-plane/execution/session-store.ts +31 -1
  330. package/src/runtime/control-plane/execution/validation.ts +6 -8
  331. package/src/runtime/control-plane/execution/work-authority-reconciler.ts +13 -42
  332. package/src/runtime/control-plane/execution/work-check-evidence.ts +137 -0
  333. package/src/runtime/control-plane/execution/work-completion-authority.ts +30 -85
  334. package/src/runtime/control-plane/execution/work-delivery-service.ts +616 -0
  335. package/src/runtime/control-plane/execution/work-evidence-policy.ts +12 -50
  336. package/src/runtime/control-plane/execution/work-execution-support.ts +50 -149
  337. package/src/runtime/control-plane/execution/work-handle-authority.ts +197 -110
  338. package/src/runtime/control-plane/execution/work-handle-store.ts +72 -44
  339. package/src/runtime/control-plane/execution/work-head-settlement.ts +53 -20
  340. package/src/runtime/control-plane/execution/work-lifecycle-audit.ts +52 -29
  341. package/src/runtime/control-plane/execution/work-operation-service.ts +60 -34
  342. package/src/runtime/control-plane/execution/work-preparation-service.ts +231 -267
  343. package/src/runtime/control-plane/execution/work-process-evidence.ts +2 -2
  344. package/src/runtime/control-plane/execution/work-remote-delivery.ts +2 -3
  345. package/src/runtime/control-plane/execution/work-revision-diff.ts +39 -0
  346. package/src/runtime/control-plane/execution/work-terminal-cleanup.ts +201 -199
  347. package/src/runtime/control-plane/execution/work-validation-reconciler.ts +33 -85
  348. package/src/runtime/control-plane/execution/work-verification-service.ts +406 -50
  349. package/src/runtime/control-plane/execution/work-verification-snapshot.ts +6 -2
  350. package/src/runtime/control-plane/facade/capability-registry.ts +364 -37
  351. package/src/runtime/control-plane/facade/check-normalization.ts +3 -9
  352. package/src/runtime/control-plane/facade/codex-delegation.ts +10 -11
  353. package/src/runtime/control-plane/facade/controller-connection.ts +135 -0
  354. package/src/runtime/control-plane/facade/goal-workloop-access.ts +1 -20
  355. package/src/runtime/control-plane/facade/goal-workloop.ts +281 -1753
  356. package/src/runtime/control-plane/facade/handoff-inbox-application.ts +12 -25
  357. package/src/runtime/control-plane/facade/handoff-inbox-store.ts +256 -52
  358. package/src/runtime/control-plane/facade/index.ts +0 -1
  359. package/src/runtime/control-plane/facade/operation-digest.ts +12 -15
  360. package/src/runtime/control-plane/facade/plan-contract-store.ts +451 -991
  361. package/src/runtime/control-plane/facade/policy-gate.ts +0 -23
  362. package/src/runtime/control-plane/facade/repository-work-admission.ts +12 -22
  363. package/src/runtime/control-plane/facade/requirement-authority.ts +102 -199
  364. package/src/runtime/control-plane/facade/requirement-board.ts +3 -3
  365. package/src/runtime/control-plane/facade/rh-work-operation-contract.ts +51 -14
  366. package/src/runtime/control-plane/facade/self-healing-loop.ts +18 -53
  367. package/src/runtime/control-plane/facade/suggested-actions.ts +15 -18
  368. package/src/runtime/control-plane/facade/types.ts +49 -108
  369. package/src/runtime/control-plane/facade/work-continuation.ts +9 -9
  370. package/src/runtime/control-plane/generated-cache-retention.ts +206 -59
  371. package/src/runtime/control-plane/global-scheduler/autonomous-continuation.ts +248 -0
  372. package/src/runtime/control-plane/global-scheduler/durable-admission.ts +1 -1
  373. package/src/runtime/control-plane/global-scheduler/maintenance.ts +256 -117
  374. package/src/runtime/control-plane/global-scheduler/reconciliation.ts +3 -12
  375. package/src/runtime/control-plane/global-scheduler/scheduler.ts +66 -40
  376. package/src/runtime/control-plane/global-scheduler/wake-signal.ts +42 -2
  377. package/src/runtime/control-plane/governance/access-policy.ts +19 -2
  378. package/src/runtime/control-plane/governance/authorization.ts +20 -3
  379. package/src/runtime/control-plane/governance/external-effects.ts +1 -1
  380. package/src/runtime/control-plane/launcher/chatgpt-round-continuation.ts +63 -300
  381. package/src/runtime/control-plane/launcher/chatgpt-work-continuation.ts +29 -300
  382. package/src/runtime/control-plane/launcher/local-conversation-controller.ts +238 -0
  383. package/src/runtime/control-plane/launcher/provider-mcp-bootstrap.ts +5 -2
  384. package/src/runtime/control-plane/launcher/thin-launcher.ts +96 -240
  385. package/src/runtime/control-plane/persistence/cognition-store.ts +820 -0
  386. package/src/runtime/control-plane/persistence/experience-store.ts +162 -29
  387. package/src/runtime/control-plane/persistence/requirement-store.ts +216 -74
  388. package/src/runtime/control-plane/persistence/sqlite-store.ts +113 -6
  389. package/src/runtime/control-plane/release-retention.ts +135 -47
  390. package/src/runtime/control-plane/repository-namespace-retention.ts +2 -2
  391. package/src/runtime/control-plane/runtime-cleanup.ts +295 -107
  392. package/src/runtime/control-plane/workspace/project-onboarding.ts +80 -0
  393. package/src/runtime/control-plane/workspace/semantic-sync-service.ts +19 -5
  394. package/src/runtime/control-plane/workspace/workspace-store.ts +169 -0
  395. package/src/runtime/diagnostics/incident-repair.ts +313 -146
  396. package/src/runtime/diagnostics/mcp-timing.ts +114 -0
  397. package/src/runtime/evidence/artifact-store.ts +158 -40
  398. package/src/runtime/evidence/evidence-store.ts +112 -8
  399. package/src/runtime/evidence/output-handle-index.ts +225 -0
  400. package/src/runtime/evidence/result-store.ts +158 -44
  401. package/src/runtime/evidence/sensitive-output.ts +22 -2
  402. package/src/runtime/execution/jobs/child-reference.ts +11 -0
  403. package/src/runtime/execution/jobs/receipt-recovery.ts +1 -11
  404. package/src/runtime/execution/jobs/store.ts +3 -4
  405. package/src/runtime/execution/managed-workspace.ts +57 -0
  406. package/src/runtime/execution/process-runtime/check-facade.ts +1 -1
  407. package/src/runtime/execution/process-runtime/check-result-retention.ts +2 -2
  408. package/src/runtime/execution/process-runtime/check-result.ts +105 -1
  409. package/src/runtime/execution/process-runtime/check-runner-sidecar.ts +18 -8
  410. package/src/runtime/execution/process-runtime/command-facade.ts +82 -30
  411. package/src/runtime/execution/process-runtime/gc.ts +15 -2
  412. package/src/runtime/execution/process-runtime/handle-index.ts +176 -0
  413. package/src/runtime/execution/process-runtime/host-command-lane.ts +139 -0
  414. package/src/runtime/execution/process-runtime/index.ts +3 -0
  415. package/src/runtime/execution/process-runtime/lightweight-managed.ts +251 -72
  416. package/src/runtime/execution/process-runtime/persisted-check.ts +3 -3
  417. package/src/runtime/execution/process-runtime/process-runner-entry.ts +47 -5
  418. package/src/runtime/execution/process-runtime/process-scope.ts +160 -0
  419. package/src/runtime/execution/process-runtime/resource-claims.ts +65 -61
  420. package/src/runtime/execution/process-runtime/runtime.ts +55 -18
  421. package/src/runtime/execution/process-runtime/store.ts +30 -2
  422. package/src/runtime/execution/process-runtime/types.ts +6 -1
  423. package/src/runtime/execution/thin-harness/execution-router.ts +16 -16
  424. package/src/runtime/execution/thin-harness/fast-executor.ts +2 -2
  425. package/src/runtime/execution/thin-harness/search-worker.ts +2 -2
  426. package/src/runtime/execution/workers/executor.ts +3 -8
  427. package/src/runtime/maintenance/cleanup.ts +41 -5
  428. package/src/runtime/platform/service-inventory.ts +130 -0
  429. package/src/runtime/platform/service-manager.ts +8 -0
  430. package/src/runtime/plugins/action-application.ts +97 -29
  431. package/src/runtime/plugins/app-store-connect-adapter.ts +290 -18
  432. package/src/runtime/plugins/browser-adapter.ts +1124 -333
  433. package/src/runtime/plugins/browser-automation-service.ts +23 -3
  434. package/src/runtime/plugins/browser-macos-bridge.ts +431 -137
  435. package/src/runtime/plugins/browser-manifest-surface.ts +47 -12
  436. package/src/runtime/plugins/browser-native-session-service.ts +63 -13
  437. package/src/runtime/plugins/browser-registration.ts +18 -0
  438. package/src/runtime/plugins/browser-runtime.ts +40 -36
  439. package/src/runtime/plugins/browser-session-authority.ts +2 -2
  440. package/src/runtime/plugins/browser-session-store.ts +46 -76
  441. package/src/runtime/plugins/capability-authorization-grants.ts +258 -62
  442. package/src/runtime/plugins/computer-chatgpt-browser-adapter-installer.ts +228 -0
  443. package/src/runtime/plugins/computer-registration.ts +298 -20
  444. package/src/runtime/plugins/desktop-operator-external-policy.ts +36 -4
  445. package/src/runtime/plugins/desktop-operator-registration.ts +12 -4
  446. package/src/runtime/plugins/external-adapter.ts +42 -6
  447. package/src/runtime/plugins/external-registration.ts +21 -1
  448. package/src/runtime/plugins/github-adapter.ts +30 -3
  449. package/src/runtime/plugins/gmail-adapter.ts +189 -3
  450. package/src/runtime/plugins/google-calendar-adapter.ts +2 -2
  451. package/src/runtime/plugins/google-shared.ts +24 -12
  452. package/src/runtime/plugins/google-tasks-adapter.ts +2 -2
  453. package/src/runtime/plugins/ios/remote-xpc-hid.ts +70 -30
  454. package/src/runtime/plugins/ios-adapter.ts +46 -41
  455. package/src/runtime/plugins/ios-agent-device.ts +54 -4
  456. package/src/runtime/plugins/ios-device-ownership.ts +103 -0
  457. package/src/runtime/plugins/ios-physical-device.ts +497 -79
  458. package/src/runtime/plugins/lightweight-action.ts +208 -2
  459. package/src/runtime/plugins/local-system-adapter.ts +12 -100
  460. package/src/runtime/plugins/managed-process-adapter.ts +12 -5
  461. package/src/runtime/plugins/plugin-action-sidecar.ts +17 -13
  462. package/src/runtime/plugins/plugin-management-adapter.ts +1 -1
  463. package/src/runtime/plugins/store.ts +682 -435
  464. package/src/runtime/plugins/types.ts +24 -0
  465. package/src/runtime/plugins/xiaohongshu-publish.ts +16 -0
  466. package/src/runtime/projections/git-status-sampler.ts +2 -19
  467. package/src/runtime/projections/invalidation.ts +7 -3
  468. package/src/runtime/projections/materialized-view.ts +80 -36
  469. package/src/runtime/recovery/actions.ts +4 -4
  470. package/src/runtime/recovery/capability-action-application.ts +46 -45
  471. package/src/runtime/recovery/lifecycle-inventory.ts +30 -40
  472. package/src/runtime/recovery/maintenance-executor.ts +374 -123
  473. package/src/runtime/recovery/probe.ts +2 -2
  474. package/src/runtime/recovery/store.ts +29 -11
  475. package/src/runtime/release/release-coordinator.ts +312 -0
  476. package/src/runtime/release/release-session.ts +716 -0
  477. package/src/runtime/release/release-state-migration.ts +25 -0
  478. package/src/runtime/resources/leases/store.ts +56 -25
  479. package/src/runtime/root/computer-composition.ts +191 -6
  480. package/src/runtime/root/controller-progression-composition.ts +254 -0
  481. package/src/runtime/root/controller-round-composition.ts +20 -1
  482. package/src/runtime/root/deployment-topology.ts +106 -0
  483. package/src/runtime/root/entry.ts +4 -3
  484. package/src/runtime/root/known-good-recovery.ts +184 -0
  485. package/src/runtime/root/local-bridge.ts +0 -1
  486. package/src/runtime/root/mcp-transport.ts +111 -18
  487. package/src/runtime/root/ownership.ts +261 -9
  488. package/src/runtime/root/package-connector-service.ts +227 -29
  489. package/src/runtime/root/package-runtime-release.ts +117 -30
  490. package/src/runtime/root/package-runtime-service.ts +24 -24
  491. package/src/runtime/root/release-execution-canary.ts +57 -12
  492. package/src/runtime/root/release-loader.ts +90 -8
  493. package/src/runtime/root/release-manifest.ts +80 -40
  494. package/src/runtime/root/release-materialize.ts +372 -106
  495. package/src/runtime/root/release-store.ts +395 -36
  496. package/src/runtime/root/runtime-lane.ts +191 -0
  497. package/src/runtime/root/runtime.ts +160 -29
  498. package/src/runtime/root/scheduled-controller-composition.ts +29 -3
  499. package/src/runtime/root/service-runner.ts +2 -2
  500. package/src/runtime/root/service.ts +126 -44
  501. package/src/runtime/root/status.ts +48 -0
  502. package/src/runtime/root/types.ts +32 -9
  503. package/src/runtime/root/workflow-supervisor-composition.ts +681 -0
  504. package/src/runtime/root/workflow-supervisor-runtime.ts +564 -0
  505. package/src/runtime/root/write-fence.ts +50 -2
  506. package/src/runtime/safe-tooling/google-credential-store.ts +67 -22
  507. package/src/runtime/safe-tooling/google-oauth-broker.ts +25 -7
  508. package/src/runtime/safe-tooling/ios-development.ts +22 -8
  509. package/src/runtime/safe-tooling/job-summary.ts +1 -1
  510. package/src/runtime/safe-tooling/workspace-auth.ts +5 -2
  511. package/src/runtime/shared/atomic-text-file.ts +21 -0
  512. package/src/runtime/shared/bounded-child-supervisor.ts +9 -1
  513. package/src/runtime/shared/json-files.ts +8 -3
  514. package/src/runtime/shared/process-environment.ts +20 -9
  515. package/src/runtime/shared/response-budget.ts +1 -3
  516. package/src/runtime/standalone-recovery/controller-home-migration.ts +16 -24
  517. package/src/runtime/standalone-recovery/core.ts +3792 -417
  518. package/src/runtime/standalone-recovery/entry.ts +507 -45
  519. package/src/runtime/standalone-recovery/installer.ts +262 -148
  520. package/src/runtime/standalone-recovery/mcp-server.ts +29 -193
  521. package/src/runtime/standalone-recovery/operation-lock.ts +12 -2
  522. package/src/runtime/standalone-recovery/performance.ts +54 -16
  523. package/src/runtime/standalone-recovery/release.ts +53 -5
  524. package/src/runtime/standalone-recovery/service-labels.ts +5 -2
  525. package/src/runtime/standalone-recovery/watchdog-heartbeat.ts +5 -2
  526. package/src/runtime/workflow/schedules/browser-probe.ts +17 -6
  527. package/src/runtime/workflow/schedules/chatgpt-automation-migration.ts +11 -3
  528. package/src/runtime/workflow/schedules/engine.ts +166 -178
  529. package/src/runtime/workflow/schedules/pending-activation.ts +11 -4
  530. package/src/runtime/workflow/schedules/work-continuation.ts +95 -11
  531. package/src/runtime/workflows/runtime.ts +15 -19
  532. package/src/testing/test-governance.ts +5 -1
  533. package/supervisor/chatgpt-conversation.ts +23 -0
  534. package/supervisor/client.ts +218 -0
  535. package/supervisor/control-plane.ts +963 -0
  536. package/supervisor/entry.ts +15 -0
  537. package/supervisor/forge-validators.ts +147 -0
  538. package/supervisor/index.ts +5 -0
  539. package/supervisor/native-browser-adapter.ts +1151 -0
  540. package/supervisor/native-messaging/host.ts +58 -0
  541. package/supervisor/native-messaging/manifest.ts +26 -0
  542. package/supervisor/native-messaging/protocol.ts +27 -0
  543. package/supervisor/paths.ts +18 -0
  544. package/supervisor/protocol.ts +250 -0
  545. package/supervisor/server.ts +412 -0
  546. package/supervisor/store.ts +1870 -0
  547. package/supervisor/tsconfig.json +8 -0
  548. package/supervisor/types.ts +261 -0
  549. package/SKILL.md +0 -427
  550. package/adapters/chatgpt/controller-host.ts +0 -119
  551. package/adapters/mcp/controller-round-compatibility.ts +0 -184
  552. package/adapters/mcp/frozen-client-semantic-compatibility.ts +0 -292
  553. package/adapters/mcp/runtime-gateway/work-compat-adapter.ts +0 -502
  554. package/adapters/mcp/runtime-gateway/work-validation-reconciler.ts +0 -1
  555. package/adapters/mcp/toolset-selection.ts +0 -41
  556. package/agents/openai.yaml +0 -4
  557. package/assets/skill-hooks.json +0 -41
  558. package/assets/skill-version.json +0 -189
  559. package/assets/skills/claude-review/SKILL.md +0 -231
  560. package/assets/skills/codex-review/SKILL.md +0 -103
  561. package/assets/templates/helpers/check-skill-version.ts +0 -193
  562. package/packages/kernel/progression/api/index.ts +0 -2
  563. package/packages/kernel/progression/application/projector.ts +0 -211
  564. package/packages/kernel/progression/domain/types.ts +0 -116
  565. package/packages/kernel/progression/index.ts +0 -1
  566. package/packages/kernel/scheduler/application/continuation-service.ts +0 -212
  567. package/packages/kernel/scheduler/domain/continuation.ts +0 -38
  568. package/packages/kernel/scheduler/infrastructure/continuation-dispatch-store.ts +0 -38
  569. package/packages/kernel/work/domain/admission-policy.ts +0 -34
  570. package/scripts/benchmark-background-check-overlap.ts +0 -228
  571. package/scripts/benchmark-computer-hotpath.ts +0 -255
  572. package/scripts/benchmark-controller-hotpath.ts +0 -212
  573. package/scripts/benchmark-controller-round2.ts +0 -191
  574. package/scripts/benchmark-ios-agent-device.ts +0 -511
  575. package/scripts/benchmark-mcp-host.sh +0 -117
  576. package/scripts/benchmark-mcp-transport.ts +0 -169
  577. package/scripts/benchmark-operational-memory-activation.ts +0 -235
  578. package/scripts/benchmark-operational-shadow.ts +0 -28
  579. package/scripts/benchmark-quality-harness.ts +0 -146
  580. package/scripts/benchmark-route-session-concurrency.ts +0 -915
  581. package/scripts/benchmark-thin-harness-gateway-ab.ts +0 -632
  582. package/scripts/benchmark-thin-harness-mcp-e2e.ts +0 -498
  583. package/scripts/benchmark-thin-harness.ts +0 -251
  584. package/scripts/benchmark-typescript-navigation.ts +0 -186
  585. package/scripts/benchmark-work-efficiency.ts +0 -334
  586. package/scripts/build-controller-ui.ts +0 -28
  587. package/scripts/check-npm-release.sh +0 -32
  588. package/scripts/check-public-release-surface.sh +0 -19
  589. package/scripts/check-release-published.sh +0 -57
  590. package/scripts/check-release-readiness.sh +0 -37
  591. package/scripts/check-release-version.mjs +0 -74
  592. package/scripts/check-skill-version.ts +0 -5
  593. package/scripts/check-tarball-install-smoke.sh +0 -150
  594. package/scripts/ensure-codegraph.sh +0 -16
  595. package/scripts/package-source-archive.sh +0 -147
  596. package/scripts/public-release-files.txt +0 -39
  597. package/scripts/public-release.ts +0 -174
  598. package/scripts/publish-release-tarball.sh +0 -27
  599. package/scripts/route-nl-vs-ts-eval.ts +0 -679
  600. package/scripts/run-skill-hook.ts +0 -244
  601. package/scripts/stage-runtime-release.ts +0 -44
  602. package/scripts/sync-codex-installed-copies.sh +0 -182
  603. package/src/cli/commands/tools.ts +0 -167
  604. package/src/cli/controller/progress.ts +0 -656
  605. package/src/cli/controller/work-mode.ts +0 -181
  606. package/src/cli/local-bridge/console-assets.ts +0 -17
  607. package/src/cli/local-bridge/dashboard.ts +0 -17
  608. package/src/cli/local-bridge/frontend/src/App.tsx +0 -10
  609. package/src/cli/local-bridge/frontend/src/components/Button.tsx +0 -1
  610. package/src/cli/local-bridge/frontend/src/components/DetailPane.tsx +0 -3
  611. package/src/cli/local-bridge/frontend/src/components/SearchField.tsx +0 -1
  612. package/src/cli/local-bridge/frontend/src/components/SectionHeader.tsx +0 -1
  613. package/src/cli/local-bridge/frontend/src/components/Segmented.tsx +0 -1
  614. package/src/cli/local-bridge/frontend/src/components/StatusText.tsx +0 -3
  615. package/src/cli/local-bridge/frontend/src/design/icons.tsx +0 -11
  616. package/src/cli/local-bridge/frontend/src/design/tokens.css +0 -8
  617. package/src/cli/local-bridge/frontend/src/features/automations/AutomationsView.tsx +0 -153
  618. package/src/cli/local-bridge/frontend/src/features/capabilities/CapabilitiesView.tsx +0 -37
  619. package/src/cli/local-bridge/frontend/src/features/overview/OverviewView.tsx +0 -183
  620. package/src/cli/local-bridge/frontend/src/features/repositories/RepositoriesView.tsx +0 -2
  621. package/src/cli/local-bridge/frontend/src/features/system/SystemView.tsx +0 -2
  622. package/src/cli/local-bridge/frontend/src/features/work/WorkView.tsx +0 -4
  623. package/src/cli/local-bridge/frontend/src/lib/api.ts +0 -30
  624. package/src/cli/local-bridge/frontend/src/lib/format.ts +0 -4
  625. package/src/cli/local-bridge/frontend/src/lib/routes.ts +0 -7
  626. package/src/cli/local-bridge/frontend/src/main.tsx +0 -1
  627. package/src/cli/local-bridge/frontend/src/shell/AppShell.tsx +0 -1
  628. package/src/cli/local-bridge/frontend/src/shell/CommandBar.tsx +0 -2
  629. package/src/cli/local-bridge/frontend/src/shell/Sidebar.tsx +0 -4
  630. package/src/cli/local-bridge/frontend/src/styles.css +0 -28
  631. package/src/cli/local-bridge/frontend/src/types.ts +0 -15
  632. package/src/cli/local-bridge/frontend/src/vite-env.d.ts +0 -1
  633. package/src/cli/local-bridge/frontend/vite.config.ts +0 -27
  634. package/src/cli/local-bridge/ui-dist/app.css +0 -1
  635. package/src/cli/local-bridge/ui-dist/app.js +0 -11228
  636. package/src/cli/mcp/access-mode.ts +0 -2
  637. package/src/cli/mcp/access-tools.ts +0 -2
  638. package/src/cli/mcp/audit.ts +0 -2
  639. package/src/cli/mcp/auth.ts +0 -2
  640. package/src/cli/mcp/instructions.ts +0 -2
  641. package/src/cli/mcp/legacy-context.ts +0 -2
  642. package/src/cli/mcp/legacy-tool-service.ts +0 -2
  643. package/src/cli/mcp/multi-repository.ts +0 -2
  644. package/src/cli/mcp/oauth.ts +0 -2
  645. package/src/cli/mcp/openai-secure-tunnel.ts +0 -2
  646. package/src/cli/mcp/paths.ts +0 -2
  647. package/src/cli/mcp/policy.ts +0 -2
  648. package/src/cli/mcp/post-finalize-work-attribution.ts +0 -2
  649. package/src/cli/mcp/proxy-env.ts +0 -2
  650. package/src/cli/mcp/readiness-projection.ts +0 -2
  651. package/src/cli/mcp/redaction.ts +0 -2
  652. package/src/cli/mcp/repo.ts +0 -2
  653. package/src/cli/mcp/repository-tools.ts +0 -2
  654. package/src/cli/mcp/server.ts +0 -2
  655. package/src/cli/mcp/setup.ts +0 -2
  656. package/src/cli/mcp/tool-capability-cache.ts +0 -2
  657. package/src/cli/mcp/tool-contract.ts +0 -2
  658. package/src/cli/mcp/tools.ts +0 -2
  659. package/src/cli/mcp/toolset-names.ts +0 -2
  660. package/src/cli/mcp/toolset-selection.ts +0 -2
  661. package/src/cli/mcp/toolset.ts +0 -2
  662. package/src/cli/mcp/transports/http.ts +0 -2
  663. package/src/cli/mcp/transports/session-registry.ts +0 -2
  664. package/src/cli/mcp/transports/stdio.ts +0 -2
  665. package/src/cli/mcp/types.ts +0 -2
  666. package/src/cli/mcp/umbrella-tools.ts +0 -2
  667. package/src/cli/tools/codegraph.ts +0 -695
  668. package/src/core/adoption/helper-wrapper-plan.ts +0 -159
  669. package/src/runtime/context/codegraph-cache-boundary.ts +0 -255
  670. package/src/runtime/context/codegraph-read-provider.ts +0 -611
  671. package/src/runtime/context/codegraph-sidecar.cjs +0 -248
  672. package/src/runtime/control-plane/codegraph-cache-retention.ts +0 -164
  673. package/src/runtime/control-plane/execution/content-equivalent-commit-authority.ts +0 -169
  674. package/src/runtime/control-plane/execution/direct-canonical-work-reconciliation.ts +0 -85
  675. package/src/runtime/control-plane/execution/direct-edit-work-completion.ts +0 -655
  676. package/src/runtime/control-plane/execution/work-finalization-service.ts +0 -2850
  677. package/src/runtime/control-plane/execution/work-path-scope.ts +0 -37
  678. package/src/runtime/control-plane/execution/work-task-receipt.ts +0 -468
  679. package/src/runtime/control-plane/facade/controller-round-relay.ts +0 -3
  680. package/src/runtime/control-plane/facade/work-admission-policy.ts +0 -142
  681. package/src/runtime/control-plane/facade/work-implementation-review.ts +0 -2
  682. package/src/runtime/control-plane/facade/work-state-machine.ts +0 -2
  683. package/src/runtime/control-plane/facade/work-task-projection.ts +0 -66
  684. package/src/runtime/control-plane/routing/index.ts +0 -1
  685. package/src/runtime/control-plane/routing/route-policy.ts +0 -401
  686. package/src/runtime/control-plane/routing/workspace-admission.ts +0 -70
  687. package/src/runtime/gateway/mcp/execution-tools.ts +0 -2
  688. package/src/runtime/gateway/mcp/legacy-ios-tool-adapter.ts +0 -2
  689. package/src/runtime/gateway/mcp/persisted-check-process.ts +0 -2
  690. package/src/runtime/gateway/mcp/process-tools.ts +0 -2
  691. package/src/runtime/gateway/mcp/router.ts +0 -2
  692. package/src/runtime/gateway/mcp/runtime-tool-definitions.ts +0 -2
  693. package/src/runtime/gateway/mcp/runtime-tools.ts +0 -2
  694. package/src/runtime/gateway/mcp/work-validation-reconciler.ts +0 -2
  695. package/src/runtime/plugins/browser-provider-registry.ts +0 -2
@@ -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, 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
  }),
@@ -245,25 +244,23 @@ export const repositoryToolDefinitions: McpToolDefinition[] = [
245
244
  validation_only: { type: 'boolean', description: 'When true, do not edit. Reconcile/reuse the existing session validation Processes identified by session_id/check_ids/validation_request_id.' },
246
245
  apply_mode: { type: 'string', enum: ['sync', 'async'], description: 'Defaults to sync for interactive development. Set async only for a separately durable operation.' },
247
246
  }),
248
- definition('repository_command_preview', 'Preview one repository-scoped local command with classification, approval token, and Git snapshots.', {
247
+ definition('execute_command', 'Single terminal entry. Repository and authorized workspace commands need no Work or Plan. Explicit scope=host uses the existing ForgeInstance process:exec Grant. Process Runtime owns execution, process handles and timeouts; Git ownership checks remain mechanical.', {
249
248
  repo_id: repoId,
250
249
  checkout_id: { type: 'string', description: 'Optional checkout identity for repositories with multiple local clones.' },
251
- command: { anyOf: [{ type: 'string' }, { type: 'array', items: { type: 'string' }, minItems: 1 }], description: 'Legacy shell string or typed argv array. Typed argv executes without a shell.' },
250
+ work_id: { type: 'string', description: 'Optional Work provenance; ordinary commands never require a Work. Work-attributed effects require a stable request_id.' },
251
+ scope: { type: 'string', enum: ['repository', 'host'], description: 'Defaults to repository; host requires an explicit process:exec ForgeInstance Grant.' },
252
+ command: { anyOf: [{ type: 'string' }, { type: 'array', items: { type: 'string' }, minItems: 1 }], description: 'Repository: typed argv or shell string; host: typed argv only.' },
253
+ shell_command: { type: 'string', description: 'Host shell only; mutually exclusive with command and requires scope=host.' },
254
+ request_id: { type: 'string', description: 'Stable invocation id for reconnect without duplicate effects.' },
252
255
  cwd: { type: 'string', description: 'Optional root-relative working directory.' },
253
256
  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
- }, ['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.', {
256
- repo_id: repoId,
257
- checkout_id: { type: 'string', description: 'Optional checkout identity for repositories with multiple local clones.' },
258
- 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.' },
259
- command: { anyOf: [{ type: 'string' }, { type: 'array', items: { type: 'string' }, minItems: 1 }], description: 'Legacy shell string or typed argv array. Typed argv executes without a shell.' },
260
- cwd: { type: 'string', description: 'Optional root-relative working directory.' },
261
- 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.' },
262
- approval_token: { type: 'string', description: 'Exact approval token returned by repository_command_preview.' },
257
+ dry_run: { type: 'boolean', description: 'Preview without executing: returns command classification, approval token and Git snapshots for repository/workspace target.' },
258
+ approval_token: { type: 'string', description: 'Exact approval token returned by execute_command(dry_run=true).' },
263
259
  approval_request_id: { type: 'string', description: 'Resolved approvalRequestId returned by approval_resolve.' },
264
260
  timeout_ms: { type: 'number', description: 'Optional execution timeout in milliseconds.' },
265
- max_output_bytes: { type: 'number', description: 'Optional cap for captured stdout/stderr.' },
266
- }, ['command']),
261
+ max_output_bytes: { type: 'number', minimum: 1024, maximum: 1048576, description: 'Captured output limit 1024–1048576 bytes.' },
262
+ interactive_wait_ms: { type: 'number', description: 'Optional short attachment window; long-running processes return a handle.' },
263
+ }),
267
264
 
268
265
  // Thin Harness V1 is exposed through repository_workbench operations to keep the stable tool surface bounded.
269
266
  ];
@@ -306,11 +303,10 @@ export function claimedSessionEditBinding(
306
303
  if (!work) return undefined;
307
304
  return {
308
305
  workId,
309
- repoId: repository.repoId,
310
- checkoutId: repository.activeCheckoutId,
306
+ repoId: repository.repoId,
307
+ checkoutId: repository.activeCheckoutId,
311
308
  principalId: caller.principalId.trim(),
312
309
  controllerInstanceId: caller.controllerInstanceId,
313
- routeDecisionFingerprint: work.routeDecisionFingerprint,
314
310
  };
315
311
  }
316
312
 
@@ -341,21 +337,49 @@ function resolveRepositorySelectionForClaimedWork(
341
337
  ): ReturnType<typeof resolveRepositorySelection> {
342
338
  const checkoutId = typeof args.checkout_id === 'string' ? args.checkout_id.trim() : '';
343
339
  const explicitWorkId = typeof args.work_id === 'string' ? args.work_id.trim() : '';
344
- const repository = resolveRepositorySelection({
340
+ let repository = resolveRepositorySelection({
345
341
  repoId: repoIdValue || undefined,
346
342
  checkoutId: checkoutId || undefined,
347
343
  controllerHome,
348
344
  allowSoleRepository: true,
349
345
  });
350
- if (!explicitWorkId || checkoutId) return repository;
346
+ if (!explicitWorkId) return repository;
347
+ const recordedWork = getWorkContract({ controllerHome, repoId: repository.repoId }, explicitWorkId);
348
+ const recordedHandle = readWorkHandle(controllerHome, repository.repoId, explicitWorkId);
349
+ const workCheckoutId = recordedHandle?.checkoutId?.trim() || recordedWork?.checkoutId?.trim();
350
+ if (!checkoutId && workCheckoutId && workCheckoutId !== repository.activeCheckoutId) {
351
+ repository = resolveRepositorySelection({
352
+ repoId: repository.repoId,
353
+ checkoutId: workCheckoutId,
354
+ controllerHome,
355
+ allowSoleRepository: true,
356
+ });
357
+ }
351
358
  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
- });
359
+ if (!work) return repository;
360
+ const principalId = caller?.principalId?.trim();
361
+ const sessionId = caller?.sessionId?.trim();
362
+ const controllerInstanceId = caller?.controllerInstanceId?.trim();
363
+ if (principalId && sessionId && controllerInstanceId) {
364
+ ensureRunningRepositoryWorkCheckout({
365
+ controllerHome,
366
+ repository,
367
+ workId: work.workId,
368
+ identity: { principalId, sessionId, controllerInstanceId },
369
+ });
370
+ const refreshedWork = getWorkContract({ controllerHome, repoId: repository.repoId }, work.workId);
371
+ const refreshedHandle = readWorkHandle(controllerHome, repository.repoId, work.workId);
372
+ const refreshedCheckoutId = refreshedHandle?.checkoutId?.trim() || refreshedWork?.checkoutId?.trim();
373
+ if (refreshedCheckoutId && refreshedCheckoutId !== repository.activeCheckoutId) {
374
+ repository = resolveRepositorySelection({
375
+ repoId: repository.repoId,
376
+ checkoutId: refreshedCheckoutId,
377
+ controllerHome,
378
+ allowSoleRepository: true,
379
+ });
380
+ }
381
+ }
382
+ return repository;
359
383
  }
360
384
 
361
385
  function rawDefaultBranchMergeCommand(repository: ReturnType<typeof resolveRepositorySelection>, command: unknown): boolean {
@@ -372,7 +396,7 @@ function rawDefaultBranchMergeCommand(repository: ReturnType<typeof resolveRepos
372
396
 
373
397
  interface HistoricalReadOnlyWorkContext {
374
398
  workId: string;
375
- status: string;
399
+ state: WorkContract['semanticState'];
376
400
  mode: 'historical_read_only_observation';
377
401
  attribution: 'not_active_work';
378
402
  }
@@ -385,12 +409,12 @@ function historicalReadOnlyWorkContext(
385
409
  const requestedWorkId = typeof args.work_id === 'string' ? args.work_id.trim() : '';
386
410
  if (!requestedWorkId) return undefined;
387
411
  const work = getWorkContract({ controllerHome, repoId: repository.repoId }, requestedWorkId);
388
- if (!work || !isTerminalWorkContractStatus(work.status)) return undefined;
412
+ if (!work || semanticWorkState(work) === 'open') return undefined;
389
413
  const classification = classifyRepositoryCommand(args.command as string | string[], repository.defaultBranch);
390
414
  if (classification.risk !== 'readonly') return undefined;
391
415
  return {
392
416
  workId: work.workId,
393
- status: work.status,
417
+ state: work.semanticState,
394
418
  mode: 'historical_read_only_observation',
395
419
  attribution: 'not_active_work',
396
420
  };
@@ -402,7 +426,10 @@ function resolveRepositoryCommandTarget(
402
426
  repoIdValue: string,
403
427
  caller?: RepositoryToolCallerContext,
404
428
  ): {
405
- repository: ReturnType<typeof resolveRepositorySelection>;
429
+ /** Present only for a repository target; absent for an arbitrary workspace. */
430
+ repository?: ReturnType<typeof resolveRepositorySelection>;
431
+ /** Typed command target used for scope, cwd, policy, audit and approval storage. */
432
+ commandTarget: RepositoryCommandScopeTarget;
406
433
  executionIdentity: ResolvedExecutionIdentity;
407
434
  workspace?: { workspaceId: string; root: string; registered: false };
408
435
  historicalWorkContext?: HistoricalReadOnlyWorkContext;
@@ -415,7 +442,7 @@ function resolveRepositoryCommandTarget(
415
442
  }
416
443
  const target = resolveEphemeralWorkspaceTarget(workspaceRoot, controllerHome);
417
444
  return {
418
- repository: target.repository,
445
+ commandTarget: target.commandTarget,
419
446
  executionIdentity: {
420
447
  schemaVersion: 1,
421
448
  authority: 'ephemeral_workspace',
@@ -442,6 +469,7 @@ function resolveRepositoryCommandTarget(
442
469
  if (historicalWorkContext) {
443
470
  return {
444
471
  repository: selectedRepository,
472
+ commandTarget: selectedRepository,
445
473
  executionIdentity: {
446
474
  schemaVersion: 1,
447
475
  authority: 'repository',
@@ -460,6 +488,7 @@ function resolveRepositoryCommandTarget(
460
488
  : undefined;
461
489
  return {
462
490
  repository,
491
+ commandTarget: repository,
463
492
  executionIdentity: {
464
493
  schemaVersion: 1,
465
494
  authority: 'repository',
@@ -557,33 +586,6 @@ function failure(error: unknown): RepositoryToolResult {
557
586
  return { ...result({ error: { code, message, ...(compactDetails !== undefined ? { details: compactDetails } : {}) } }), isError: true };
558
587
  }
559
588
 
560
- interface RepositoryExplorationGuidance {
561
- code: 'FRAGMENTED_REPOSITORY_EXPLORATION';
562
- recommendedTool: 'rh_context';
563
- recommendedOperation: 'search';
564
- message: string;
565
- }
566
-
567
- function fragmentedRepositoryExplorationGuidance(command: unknown): RepositoryExplorationGuidance | undefined {
568
- if (typeof command !== 'string') return undefined;
569
- const segments = command.split(/(?:&&|\|\||[;|])/g);
570
- const readPrograms = new Set<string>();
571
- let readStepCount = 0;
572
- for (const segment of segments) {
573
- const match = segment.trim().match(/^(?:(?:command|env)\s+)?(?:[A-Za-z_][A-Za-z0-9_]*=[^\s]+\s+)*(rg|grep|sed|cat|head|tail)\b/i);
574
- if (!match) continue;
575
- readStepCount += 1;
576
- readPrograms.add(match[1]!.toLowerCase());
577
- }
578
- if (readStepCount < 2) return undefined;
579
- return {
580
- code: 'FRAGMENTED_REPOSITORY_EXPLORATION',
581
- recommendedTool: 'rh_context',
582
- recommendedOperation: 'search',
583
- message: `Detected ${readStepCount} chained repository read steps (${[...readPrograms].join(', ')}). Prefer a broad rh_context request first, then repeat rh_context with selected paths or relationships when more evidence can improve correctness; keep shell search as fallback when the Context Plane cannot supply the needed evidence.`,
584
- };
585
- }
586
-
587
589
  function compactProcessCommandPayload(input: {
588
590
  accepted?: boolean;
589
591
  mode: string;
@@ -591,7 +593,10 @@ function compactProcessCommandPayload(input: {
591
593
  route?: string;
592
594
  reasons: string[];
593
595
  decision?: unknown;
594
- repoId: string;
596
+ /** Repository id for a repository target; absent for an arbitrary workspace target. */
597
+ repoId?: string;
598
+ /** Workspace scope id when the target is an arbitrary workspace. */
599
+ scopeId?: string;
595
600
  checkoutId?: string;
596
601
  workspace?: { workspaceId: string; root: string; registered: false };
597
602
  historicalWorkContext?: HistoricalReadOnlyWorkContext;
@@ -607,7 +612,6 @@ function compactProcessCommandPayload(input: {
607
612
  /** summary (default) omits nested process / routing dumps; detail restores diagnostics. */
608
613
  detailLevel?: 'summary' | 'detail';
609
614
  includeFullProcess?: boolean;
610
- guidance?: RepositoryExplorationGuidance;
611
615
  }): Record<string, unknown> {
612
616
  const output = compactCommandOutput(input.stdout, input.stderr, { ok: input.ok === true });
613
617
  const detail = input.detailLevel === 'detail' || input.includeFullProcess === true;
@@ -643,7 +647,6 @@ function compactProcessCommandPayload(input: {
643
647
  stderr: output.stderr ?? '',
644
648
  ...(output.stdoutTruncated ? { stdoutTruncated: true, stdoutBytes: output.stdoutBytes } : {}),
645
649
  ...(output.stderrTruncated ? { stderrTruncated: true, stderrBytes: output.stderrBytes } : {}),
646
- ...(input.guidance ? { guidance: input.guidance, suggestedOperation: 'rh_context' } : {}),
647
650
  };
648
651
  if (completed && !ok) {
649
652
  payload.error = {
@@ -692,7 +695,6 @@ function compactProcessCommandPayload(input: {
692
695
  }
693
696
  : {}),
694
697
  durableSideEffects: effects,
695
- ...(input.guidance ? { guidance: input.guidance, suggestedOperation: 'rh_context' } : {}),
696
698
  next: input.next,
697
699
  detailLevel: 'detail',
698
700
  };
@@ -700,8 +702,8 @@ function compactProcessCommandPayload(input: {
700
702
 
701
703
  function emptyRepositoryMigration(repository: ReturnType<typeof registerRepository>) {
702
704
  return {
703
- repoId: repository.repoId,
704
- checkoutId: repository.activeCheckoutId,
705
+ repoId: repository.repoId,
706
+ checkoutId: repository.activeCheckoutId,
705
707
  scanned: 0,
706
708
  updated: 0,
707
709
  unresolved: 0,
@@ -734,7 +736,7 @@ export async function callRepositoryTool(
734
736
  args: Record<string, unknown>,
735
737
  caller?: RepositoryToolCallerContext,
736
738
  ): Promise<RepositoryToolResult | undefined> {
737
- if (!name.startsWith('repository_') && name !== 'read_repository_file') return undefined;
739
+ if (!name.startsWith('repository_') && name !== 'read_repository_file' && name !== 'execute_command') return undefined;
738
740
  try {
739
741
  const repoIdValue = typeof args.repo_id === 'string' ? args.repo_id.trim() : '';
740
742
  switch (name) {
@@ -867,39 +869,6 @@ export async function callRepositoryTool(
867
869
  const payload = typeof args.payload === 'object' && args.payload !== null
868
870
  ? args.payload as Record<string, unknown>
869
871
  : {};
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
872
  const internalTool = {
904
873
  batch_execute: 'repository_batch_execute',
905
874
  lanes_execute: 'repository_lanes_execute',
@@ -920,12 +889,12 @@ export async function callRepositoryTool(
920
889
  case 'repository_git_status': {
921
890
  const repository = resolveRepositorySelection({ repoId: repoIdValue || undefined, checkoutId: typeof args.checkout_id === 'string' ? args.checkout_id : undefined, controllerHome, allowSoleRepository: true });
922
891
  const status = args.refresh === true
923
- ? writeRepositoryGitStatusSample(controllerHome, repository)
892
+ ? await writeRepositoryGitStatusSample(controllerHome, repository)
924
893
  : readRepositoryGitStatusSample(controllerHome, repository.repoId, repository.activeCheckoutId);
925
894
  return result({
926
895
  status: status ?? {
927
- repoId: repository.repoId,
928
- checkoutId: repository.activeCheckoutId,
896
+ repoId: repository.repoId,
897
+ checkoutId: repository.activeCheckoutId,
929
898
  sampleSource: 'daemon-sample',
930
899
  sampled: false,
931
900
  observedAt: null,
@@ -972,24 +941,14 @@ export async function callRepositoryTool(
972
941
  allowSoleRepository: true,
973
942
  });
974
943
  return result({
975
- repoId: repository.repoId,
976
- checkoutId: repository.activeCheckoutId,
944
+ repoId: repository.repoId,
945
+ checkoutId: repository.activeCheckoutId,
977
946
  plan: buildSafePatchPlan(repository, { operations: args.operations, chunkSize: args.chunk_size }),
978
947
  });
979
948
  }
980
949
  case 'repository_safe_patch_apply': {
981
950
  const repository = resolveRepositorySelectionForClaimedWork(controllerHome, args, repoIdValue, caller);
982
951
  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
952
  const applied = withControllerLock(
994
953
  controllerHome,
995
954
  { scope: 'repository', repoId: repository.repoId },
@@ -1003,12 +962,15 @@ export async function callRepositoryTool(
1003
962
  workId: binding?.workId,
1004
963
  });
1005
964
  }
1006
- const mutationAuthority = binding?.workId
965
+ // A validation-only reattachment is not repository mutation admission;
966
+ // it must never promote a thin investigation to repository_change.
967
+ const mutationAuthority = binding?.workId && args.validation_only !== true
1007
968
  ? ensureRepositoryMutationWorkHandle({
1008
969
  controllerHome,
1009
970
  repository,
1010
971
  workId: binding.workId,
1011
972
  principalId: binding.principalId ?? caller?.principalId ?? '',
973
+ sessionId: caller?.sessionId,
1012
974
  })
1013
975
  : undefined;
1014
976
  const patchResult = applySafePatch(repository, {
@@ -1080,8 +1042,8 @@ export async function callRepositoryTool(
1080
1042
  errorMessage: firstFailure?.message,
1081
1043
  });
1082
1044
  const payload = {
1083
- repoId: repository.repoId,
1084
- checkoutId: repository.activeCheckoutId,
1045
+ repoId: repository.repoId,
1046
+ checkoutId: repository.activeCheckoutId,
1085
1047
  ...applied as unknown as Record<string, unknown>,
1086
1048
  phase: digest.phase,
1087
1049
  statusLabel: digest.statusLabel,
@@ -1094,38 +1056,47 @@ export async function callRepositoryTool(
1094
1056
  };
1095
1057
  return ok ? result(payload) : { ...result(payload), isError: true };
1096
1058
  }
1097
- case 'repository_command_preview': {
1098
- const target = resolveRepositoryCommandTarget(controllerHome, args, repoIdValue, caller);
1099
- const { repository } = target;
1100
- const execution = withControllerLock(
1101
- controllerHome,
1102
- { scope: 'repository', repoId: repository.repoId },
1103
- 'mcp:repository_command_preview',
1104
- () => executeRepositoryCommand(controllerHome, repository, {
1105
- command: args.command as string | string[],
1106
- cwd: typeof args.cwd === 'string' ? args.cwd : undefined,
1107
- dryRun: true,
1108
- allowNonGitWorkspace: target.workspace !== undefined,
1109
- }),
1110
- 60_000,
1111
- );
1112
- return result({
1113
- ...execution as unknown as Record<string, unknown>,
1114
- ...(target.workspace ? { workspace: target.workspace } : {}),
1115
- });
1116
- }
1117
- case 'repository_command_execute': {
1118
- const explorationGuidance = fragmentedRepositoryExplorationGuidance(args.command);
1059
+ case 'execute_command': {
1060
+ if (args.scope !== undefined && args.scope !== 'repository') throw new Error('COMMAND_SCOPE_INVALID: host scope uses the authorized host command lane');
1061
+ if (args.shell_command !== undefined) throw new Error('COMMAND_SCOPE_INVALID: shell_command requires scope=host');
1062
+ if (args.command === undefined) throw new Error('COMMAND_REQUIRED: repository commands require command');
1063
+ if (args.dry_run === true) {
1064
+ const target = resolveRepositoryCommandTarget(controllerHome, args, repoIdValue, caller);
1065
+ const { commandTarget } = target;
1066
+ const execution = withControllerLock(
1067
+ controllerHome,
1068
+ { scope: 'repository', repoId: commandExecutionScopeKey(commandTarget) },
1069
+ 'mcp:execute_command:preview',
1070
+ () => executeRepositoryCommand(controllerHome, commandTarget, {
1071
+ command: args.command as string | string[],
1072
+ cwd: typeof args.cwd === 'string' ? args.cwd : undefined,
1073
+ dryRun: true,
1074
+ allowNonGitWorkspace: target.workspace !== undefined,
1075
+ }),
1076
+ 60_000,
1077
+ );
1078
+ const { repoId: _previewRepoId, checkoutId: _previewCheckoutId, ...workspacePreviewFields } = execution as unknown as Record<string, unknown>;
1079
+ return result({
1080
+ ...(commandTarget.repoId ? execution as unknown as Record<string, unknown> : workspacePreviewFields),
1081
+ ...(commandTarget.repoId ? {} : { scopeId: commandExecutionScopeKey(commandTarget) }),
1082
+ ...(target.workspace ? { workspace: target.workspace } : {}),
1083
+ });
1084
+ }
1119
1085
  let target = resolveRepositoryCommandTarget(controllerHome, args, repoIdValue, caller);
1120
- let { repository, executionIdentity, historicalWorkContext } = target;
1086
+ let { repository, commandTarget, executionIdentity, historicalWorkContext } = target;
1087
+ // Repository targets keep their established identity fields. An arbitrary
1088
+ // workspace target reports a workspace scope id and never a repository id.
1089
+ const commandScopeKey = commandExecutionScopeKey(commandTarget);
1090
+ const scopeFields: Record<string, unknown> = repository
1091
+ ? { repoId: commandScopeKey, checkoutId: commandTarget.activeCheckoutId }
1092
+ : { scopeId: commandScopeKey };
1121
1093
  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
- }
1094
+ // Repository-semantic checks apply only when a repository target exists;
1095
+ // an arbitrary workspace has no bound session, default branch, or Work.
1096
+ if (repository && !explicitWorkId) assertNoBoundExecutionSessionMutation(controllerHome, repository, caller);
1097
+ // Git integration is a capability with its own repository, scope and
1098
+ // concurrency checks. A Work's semantic completion and any optional
1099
+ // verification/review evidence never admit or deny this operation.
1129
1100
  const timeoutMs = typeof args.timeout_ms === 'number'
1130
1101
  ? args.timeout_ms
1131
1102
  : typeof args.timeout_ms === 'string'
@@ -1155,7 +1126,7 @@ export async function callRepositoryTool(
1155
1126
  const routeClass = classifyRepositoryCommandRoute(args.command as string | string[], {
1156
1127
  forceDurable,
1157
1128
  workId: executionIdentity.workId,
1158
- defaultBranch: repository.defaultBranch,
1129
+ defaultBranch: commandTarget.defaultBranch,
1159
1130
  timeoutMs,
1160
1131
  });
1161
1132
  const processRequestId = typeof args.request_id === 'string' ? args.request_id.trim() : '';
@@ -1168,7 +1139,7 @@ export async function callRepositoryTool(
1168
1139
  );
1169
1140
  }
1170
1141
  let mutationAuthority: ReturnType<typeof ensureRepositoryMutationWorkHandle> | undefined;
1171
- const mutationClassification = classifyRepositoryCommand(args.command as string | string[], repository.defaultBranch);
1142
+ const mutationClassification = classifyRepositoryCommand(args.command as string | string[], commandTarget.defaultBranch);
1172
1143
  if (
1173
1144
  (mutationClassification.risk === 'workspace_write' || mutationClassification.risk === 'destructive')
1174
1145
  && (routeClass.route === 'process_direct' || routeClass.route === 'process_managed')
@@ -1176,54 +1147,46 @@ export async function callRepositoryTool(
1176
1147
  if (executionIdentity.workId) {
1177
1148
  mutationAuthority = withControllerLock(
1178
1149
  controllerHome,
1179
- { scope: 'repository', repoId: repository.repoId },
1180
- 'mcp:repository_command_execute:mutation-authority',
1150
+ { scope: 'repository', repoId: commandExecutionScopeKey(commandTarget) },
1151
+ 'mcp:execute_command:mutation-authority',
1181
1152
  () => ensureRepositoryMutationWorkHandle({
1182
1153
  controllerHome,
1183
- repository,
1154
+ repository: repository!,
1184
1155
  workId: executionIdentity.workId!,
1185
1156
  principalId: caller?.principalId ?? '',
1157
+ sessionId: caller?.sessionId,
1186
1158
  deferEffectPromotion: true,
1187
1159
  }),
1188
1160
  60_000,
1189
1161
  );
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);
1162
+ // Pre-mutation reconciliation may advance expectedHead. Preserve the
1163
+ // complete WorkHandle identity after that CAS; rebuilding a generic
1164
+ // repository identity here drops branch/expectedHead and prevents the
1165
+ // successful command from settling its legitimate successor HEAD.
1166
+ executionIdentity = executionIdentityForWork(repository!, mutationAuthority.handle);
1194
1167
  } else {
1195
1168
  withControllerLock(
1196
1169
  controllerHome,
1197
- { scope: 'repository', repoId: repository.repoId },
1198
- 'mcp:repository_command_execute:unattributed-mutation-authority',
1170
+ { scope: 'repository', repoId: commandExecutionScopeKey(commandTarget) },
1171
+ 'mcp:execute_command:unattributed-mutation-authority',
1199
1172
  () => assertCanonicalRepositoryMutationWorkHandleAvailable({
1200
1173
  controllerHome,
1201
- repositoryId: repository.repoId,
1202
- checkoutId: repository.activeCheckoutId,
1174
+ repositoryId: commandExecutionScopeKey(commandTarget),
1175
+ checkoutId: commandTarget.activeCheckoutId ?? '',
1203
1176
  }),
1204
1177
  60_000,
1205
1178
  );
1206
1179
  }
1207
1180
  }
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.
1181
+ // Compatibility boundary only: this facade owns repository-domain
1182
+ // context (target resolution, Git/source mutation fencing and legacy
1183
+ // response translation), while Unified Process Runtime owns execution,
1184
+ // handles, cancellation and persistence. Do not create another generic
1185
+ // command executor here. Thin Harness is consulted only for an explicit
1186
+ // external durable boundary, not as a second command classifier.
1224
1187
  const routingDecision = forceDurable
1225
1188
  ? routeExecution({
1226
- operation: 'repository_command_execute',
1189
+ operation: 'execute_command',
1227
1190
  mode: 'durable',
1228
1191
  timeoutMs,
1229
1192
  background: args.background === true || args.async === true,
@@ -1255,8 +1218,7 @@ export async function callRepositoryTool(
1255
1218
  path: routeClass.reason,
1256
1219
  route: 'reject',
1257
1220
  status: 'rejected',
1258
- repoId: repository.repoId,
1259
- checkoutId: repository.activeCheckoutId,
1221
+ ...scopeFields,
1260
1222
  workspace: target.workspace,
1261
1223
  message: routeClass.reason === 'standalone_recovery_lifecycle_required'
1262
1224
  ? '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 +1239,7 @@ export async function callRepositoryTool(
1277
1239
  accepted: false,
1278
1240
  mode: 'durable',
1279
1241
  path: 'ephemeral_workspace_promotion_required',
1280
- repoId: repository.repoId,
1281
- checkoutId: repository.activeCheckoutId,
1242
+ ...scopeFields,
1282
1243
  workspace: target.workspace,
1283
1244
  message: 'Ephemeral workspaces must be registered before durable remote effects so Process identity and reconciliation have a stable repository authority.',
1284
1245
  suggestedOperation: 'repository_register',
@@ -1287,7 +1248,7 @@ export async function callRepositoryTool(
1287
1248
  if (routeClass.route === 'process_direct' || routeClass.route === 'process_managed' || routeClass.route === 'durable') {
1288
1249
  const processResult = await executeRepositoryCommandViaProcessRuntime({
1289
1250
  controllerHome,
1290
- repository,
1251
+ repository: commandTarget,
1291
1252
  command: args.command as string | string[],
1292
1253
  cwd: typeof args.cwd === 'string' ? args.cwd : undefined,
1293
1254
  timeoutMs,
@@ -1300,19 +1261,19 @@ export async function callRepositoryTool(
1300
1261
  workId: executionIdentity.workId,
1301
1262
  executionIdentity,
1302
1263
  allowNonGitWorkspace: target.workspace !== undefined,
1264
+ principalId: caller?.principalId ?? undefined,
1303
1265
  });
1304
- if (mutationAuthority && (processResult.route === 'process_direct' || processResult.route === 'process_managed')) {
1266
+ if (repository && mutationAuthority && (processResult.route === 'process_direct' || processResult.route === 'process_managed')) {
1305
1267
  const processHandle = processResult.process;
1306
1268
  const postStatus = repositoryGitStatus(repository);
1307
1269
  const expectedHead = mutationAuthority.handle.expectedHead;
1308
- const mutationObserved = (processHandle !== undefined && processHandle.completed !== true)
1309
- || !postStatus.clean
1270
+ const mutationObserved = !postStatus.clean
1310
1271
  || (Boolean(postStatus.head) && postStatus.head !== expectedHead);
1311
1272
  if (mutationObserved) {
1312
1273
  withControllerLock(
1313
1274
  controllerHome,
1314
- { scope: 'repository', repoId: repository.repoId },
1315
- 'mcp:repository_command_execute:mutation-started',
1275
+ { scope: 'repository', repoId: commandExecutionScopeKey(commandTarget) },
1276
+ 'mcp:execute_command:mutation-started',
1316
1277
  () => markRepositoryMutationStarted({
1317
1278
  controllerHome,
1318
1279
  repository,
@@ -1342,8 +1303,7 @@ export async function callRepositoryTool(
1342
1303
  mode: processResult.route,
1343
1304
  path: processResult.reason ?? routeClass.reason,
1344
1305
  route: processResult.route,
1345
- repoId: repository.repoId,
1346
- checkoutId: repository.activeCheckoutId,
1306
+ ...scopeFields,
1347
1307
  workspace: target.workspace,
1348
1308
  status: processResult.executionStatus,
1349
1309
  policyDecision: processResult.policyDecision ?? 'approval_required',
@@ -1352,7 +1312,7 @@ export async function callRepositoryTool(
1352
1312
  message: authorization.decision === 'user_confirmation_required'
1353
1313
  ? authorization.humanSummary
1354
1314
  : authorization.reason,
1355
- suggestedOperation: 'repository_command_preview',
1315
+ suggestedOperation: 'execute_command(dry_run=true)',
1356
1316
  });
1357
1317
  }
1358
1318
  const completed = directWithoutHandle || handle?.completed === true;
@@ -1370,8 +1330,7 @@ export async function callRepositoryTool(
1370
1330
  route: processResult.route,
1371
1331
  reasons: [processResult.reason ?? routeClass.reason, ...routingDecision.reasons],
1372
1332
  decision: detailLevel === 'detail' ? routingDecision : undefined,
1373
- repoId: repository.repoId,
1374
- checkoutId: repository.activeCheckoutId,
1333
+ ...scopeFields,
1375
1334
  workspace: target.workspace,
1376
1335
  historicalWorkContext,
1377
1336
  processId: handle?.processId,
@@ -1382,7 +1341,6 @@ export async function callRepositoryTool(
1382
1341
  stdout: processResult.stdout,
1383
1342
  stderr: processResult.stderr,
1384
1343
  durableSideEffects: processResult.durableSideEffects,
1385
- guidance: explorationGuidance,
1386
1344
  next: directWithoutHandle
1387
1345
  ? processResult.reason === 'readonly_fast_path'
1388
1346
  ? 'Bounded readonly execution completed without Process record / Lease / Local Job / ExecutionJob / Worker.'
@@ -1424,7 +1382,7 @@ export async function callRepositoryTool(
1424
1382
  // Process Runtime is authoritative. Falling through could spawn the
1425
1383
  // same command again through the legacy Fast/Local Job path.
1426
1384
  if (process.env.FORGE_DEBUG_PROCESS_RUNTIME === '1') {
1427
- console.error('[repository_command_execute] process runtime error', error);
1385
+ console.error('[execute_command] process runtime error', error);
1428
1386
  }
1429
1387
  return failure(error);
1430
1388
  }
@@ -1434,8 +1392,7 @@ export async function callRepositoryTool(
1434
1392
  accepted: false,
1435
1393
  mode: 'durable',
1436
1394
  path: 'ephemeral_workspace_promotion_required',
1437
- repoId: repository.repoId,
1438
- checkoutId: repository.activeCheckoutId,
1395
+ ...scopeFields,
1439
1396
  workspace: target.workspace,
1440
1397
  message: 'Ephemeral workspaces support bounded local Direct/Managed execution only. Register the directory before durable, remote, release, or resumable Work.',
1441
1398
  suggestedOperation: 'repository_register',
@@ -1449,13 +1406,13 @@ export async function callRepositoryTool(
1449
1406
  try {
1450
1407
  const routeClass = classifyRepositoryCommandRoute(args.command as string | string[], {
1451
1408
  forceDurable: false,
1452
- defaultBranch: repository.defaultBranch,
1409
+ defaultBranch: commandTarget.defaultBranch,
1453
1410
  timeoutMs,
1454
1411
  });
1455
1412
  if (routeClass.route === 'process_direct') {
1456
1413
  const processResult = await executeRepositoryCommandViaProcessRuntime({
1457
1414
  controllerHome,
1458
- repository,
1415
+ repository: commandTarget,
1459
1416
  command: args.command as string | string[],
1460
1417
  cwd: typeof args.cwd === 'string' ? args.cwd : undefined,
1461
1418
  timeoutMs,
@@ -1463,6 +1420,7 @@ export async function callRepositoryTool(
1463
1420
  requestId: typeof args.request_id === 'string' ? args.request_id : undefined,
1464
1421
  workId: executionIdentity.workId,
1465
1422
  executionIdentity,
1423
+ principalId: caller?.principalId ?? undefined,
1466
1424
  });
1467
1425
  if (processResult.route === 'process_direct') {
1468
1426
  const execRecord = processResult.process as unknown as Record<string, unknown> | undefined;
@@ -1476,8 +1434,7 @@ export async function callRepositoryTool(
1476
1434
  mode: 'durable',
1477
1435
  reasons: ['durable_worker_inline_process_direct', routeClass.reason, ...routingDecision.reasons],
1478
1436
  }),
1479
- repoId: repository.repoId,
1480
- checkoutId: repository.activeCheckoutId,
1437
+ ...scopeFields,
1481
1438
  ok,
1482
1439
  processId: typeof execRecord?.processId === 'string' ? execRecord.processId : undefined,
1483
1440
  status: typeof execRecord?.status === 'string' ? execRecord.status : undefined,
@@ -1495,7 +1452,7 @@ export async function callRepositoryTool(
1495
1452
  }
1496
1453
  } catch (error) {
1497
1454
  if (process.env.FORGE_DEBUG_PROCESS_RUNTIME === '1') {
1498
- console.error('[repository_command_execute] durable worker inline process runtime error', error);
1455
+ console.error('[execute_command] durable worker inline process runtime error', error);
1499
1456
  }
1500
1457
  }
1501
1458
  }
@@ -1505,7 +1462,7 @@ export async function callRepositoryTool(
1505
1462
  path: 'external_controller_required',
1506
1463
  routing: compactRoutingSummary({ path: 'durable', mode: 'durable', reasons: [routingDecision.reasons.join(','), 'local_bridge_execution_retired'] }),
1507
1464
  message: 'This command requires explicit external Controller handling; Local Bridge Jobs are retired for repository commands.',
1508
- suggestedOperation: 'Create or claim WorkContract, then use rh_work.launcher_start or a Process Runtime-compatible command.',
1465
+ next: 'This execution boundary requires separate external authority; the model chooses an authorized domain capability or alternative command based on the task.',
1509
1466
  externalEffect: {
1510
1467
  outcome: 'not_started',
1511
1468
  ambiguousFailureOutcome: 'outcome_unknown',
@@ -1544,8 +1501,8 @@ export async function callRepositoryTool(
1544
1501
  const batch = await executeRepositoryBatch(
1545
1502
  { controllerHome, repository },
1546
1503
  {
1547
- repoId: repository.repoId,
1548
- checkoutId: repository.activeCheckoutId,
1504
+ repoId: repository.repoId,
1505
+ checkoutId: repository.activeCheckoutId,
1549
1506
  mode: args.mode === 'fast' || args.mode === 'durable' || args.mode === 'auto' ? args.mode : 'auto',
1550
1507
  steps,
1551
1508
  stopOnError: args.stop_on_error !== false,
@@ -1569,8 +1526,8 @@ export async function callRepositoryTool(
1569
1526
  const lanes = await executeLightweightLanes(
1570
1527
  { controllerHome, repository },
1571
1528
  {
1572
- repoId: repository.repoId,
1573
- checkoutId: repository.activeCheckoutId,
1529
+ repoId: repository.repoId,
1530
+ checkoutId: repository.activeCheckoutId,
1574
1531
  readLanes: Array.isArray(args.read_lanes)
1575
1532
  ? args.read_lanes
1576
1533
  .filter((entry): entry is Record<string, unknown> => typeof entry === 'object' && entry !== null)