@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,26 +1,73 @@
1
1
  import type { CallToolResult } from '../../../packages/protocols/mcp/tool-contract';
2
+ import { FORGE_INSTANCE_SCOPE_KEY } from '../../../src/cli/repositories/controller-home';
2
3
  import type { MultiRepositoryMcpToolContext } from '../multi-repository';
3
4
  import { buildWorkspaceAuthStatus, prepareWorkspaceAuthLogin, summarizePluginForLowInterception } from '../../../src/runtime/safe-tooling';
4
5
  import {
5
6
  assistantPluginScope,
6
- controllerPluginRepository,
7
7
  getAssistantPluginManifest,
8
+ getControllerPluginManifest,
8
9
  listAssistantPluginManifests,
10
+ listControllerPluginManifests,
9
11
  } from '../../../src/runtime/plugins/store';
10
12
  import { executeAssistantPluginActionApplication } from '../../../src/runtime/plugins/action-application';
11
13
  import { mcpPluginExecutionOrigin } from '../../../src/runtime/plugins/execution-origin';
12
14
  import type { AssistantPluginManifest } from '../../../src/runtime/plugins/types';
13
15
  import { result, resultWithPluginArtifactImages } from './result-adapter';
16
+ import { boundedRuntimeResult } from './bounded-result-runtime';
14
17
  import { selected } from './shared-adapter';
15
18
 
16
- function pluginRepository(
19
+ type PluginTransportScope =
20
+ | { kind: 'controller' }
21
+ | { kind: 'repository'; repository: ReturnType<typeof selected> };
22
+
23
+ function explicitRepositoryContextRequested(args: Record<string, unknown>): boolean {
24
+ return (typeof args.repo_id === 'string' && Boolean(args.repo_id.trim()))
25
+ || (typeof args.checkout_id === 'string' && Boolean(args.checkout_id.trim()));
26
+ }
27
+
28
+ function pluginTransportScope(
17
29
  ctx: MultiRepositoryMcpToolContext,
18
30
  args: Record<string, unknown>,
19
31
  pluginId: string,
20
- ) {
21
- return assistantPluginScope(pluginId, ctx.controllerHome) === 'controller'
22
- ? controllerPluginRepository(ctx.controllerHome)
23
- : selected(ctx, args);
32
+ ): PluginTransportScope {
33
+ const explicitRepoId = typeof args.repo_id === 'string' ? args.repo_id.trim() : '';
34
+ if (explicitRepoId === '__controller__') {
35
+ throw new Error('PLUGIN_CONTROLLER_REPOSITORY_SENTINEL_RETIRED: controller-scoped plugins no longer use a synthetic repository id');
36
+ }
37
+ const scope = assistantPluginScope(pluginId, ctx.controllerHome);
38
+ if (scope === 'controller') return { kind: 'controller' };
39
+ if (scope === 'controller_with_repository_overlay') {
40
+ return explicitRepositoryContextRequested(args)
41
+ ? { kind: 'repository', repository: selected(ctx, args) }
42
+ : { kind: 'controller' };
43
+ }
44
+ return { kind: 'repository', repository: selected(ctx, args) };
45
+ }
46
+
47
+ function pluginManifestForScope(
48
+ ctx: MultiRepositoryMcpToolContext,
49
+ scope: PluginTransportScope,
50
+ pluginId: string,
51
+ ): AssistantPluginManifest {
52
+ return scope.kind === 'controller'
53
+ ? getControllerPluginManifest(ctx.controllerHome, pluginId)
54
+ : getAssistantPluginManifest(ctx.controllerHome, scope.repository, pluginId);
55
+ }
56
+
57
+ function pluginScopeLabel(scope: PluginTransportScope): 'controller' | 'repository' {
58
+ return scope.kind;
59
+ }
60
+
61
+ function detailArgumentsForScope(
62
+ scope: PluginTransportScope,
63
+ pluginId: string,
64
+ actionId?: string,
65
+ ): Record<string, unknown> {
66
+ return {
67
+ ...(scope.kind === 'repository' ? { repo_id: scope.repository.repoId } : {}),
68
+ capability_id: actionId ? `plugin.${pluginId}.${actionId}` : `plugin.${pluginId}`,
69
+ detail_level: 'detail',
70
+ };
24
71
  }
25
72
 
26
73
  function summarizePlugin(manifest: AssistantPluginManifest): Record<string, unknown> {
@@ -93,20 +140,17 @@ export async function callPluginAdapter(
93
140
  ): Promise<CallToolResult | undefined> {
94
141
  switch (name) {
95
142
  case 'list_plugins': {
96
- const controllerRepository = controllerPluginRepository(ctx.controllerHome);
97
- const controllerPlugins = listAssistantPluginManifests(ctx.controllerHome, controllerRepository, {
98
- forceRefresh: true,
143
+ const controllerPlugins = listControllerPluginManifests(ctx.controllerHome, {
144
+ preferStored: true,
99
145
  }).map(summarizePlugin);
100
146
  let repositoryPlugins: ReturnType<typeof summarizePlugin>[] = [];
101
147
  let repositoryId: string | undefined;
102
- try {
148
+ if (explicitRepositoryContextRequested(args) || typeof ctx.repoId === 'string' && ctx.repoId.trim()) {
103
149
  const repository = selected(ctx, args);
104
150
  repositoryId = repository.repoId;
105
151
  repositoryPlugins = listAssistantPluginManifests(ctx.controllerHome, repository, {
106
- forceRefresh: true,
152
+ preferStored: true,
107
153
  }).map(summarizePlugin);
108
- } catch (error) {
109
- if (typeof args.repo_id === 'string' && args.repo_id.trim()) throw error;
110
154
  }
111
155
  return result({
112
156
  scope: repositoryPlugins.length > 0 ? 'combined' : 'controller',
@@ -117,16 +161,16 @@ export async function callPluginAdapter(
117
161
  }
118
162
  case 'get_plugin': {
119
163
  const pluginId = String(args.plugin_id ?? '').trim();
120
- const repository = pluginRepository(ctx, args, pluginId);
164
+ const scope = pluginTransportScope(ctx, args, pluginId);
121
165
  return result({
122
- scope: repository.repoId === '__controller__' ? 'controller' : 'repository',
123
- plugin: summarizePlugin(getAssistantPluginManifest(ctx.controllerHome, repository, pluginId)),
166
+ scope: pluginScopeLabel(scope),
167
+ plugin: summarizePlugin(pluginManifestForScope(ctx, scope, pluginId)),
124
168
  });
125
169
  }
126
170
  case 'plugin_action_execute': {
127
171
  const pluginId = String(args.plugin_id ?? '').trim();
128
172
  const workId = typeof args.work_id === 'string' && args.work_id.trim() ? args.work_id.trim() : undefined;
129
- const repository = pluginRepository(ctx, args, pluginId);
173
+ const scope = pluginTransportScope(ctx, args, pluginId);
130
174
  const workRepository = workId ? selected(ctx, args) : undefined;
131
175
  const actionId = String(args.action_id ?? '').trim();
132
176
  const requestId = String(args.request_id ?? '').trim();
@@ -148,14 +192,25 @@ export async function callPluginAdapter(
148
192
  };
149
193
  const application = await executeAssistantPluginActionApplication({
150
194
  controllerHome: ctx.controllerHome,
151
- repository,
195
+ scope: scope.kind === 'controller'
196
+ ? { kind: 'controller' }
197
+ : { kind: 'repository', repository: scope.repository },
152
198
  request,
153
- interactiveWaitMs: typeof args.interactive_wait_ms === 'number' ? args.interactive_wait_ms : 750,
154
- wait: args.wait === true,
199
+ interactiveWaitMs: args.apply_mode === 'async' ? 0 : (typeof args.interactive_wait_ms === 'number' ? args.interactive_wait_ms : 750),
200
+ wait: args.apply_mode === 'async' ? false : args.wait === true,
155
201
  waitMs: typeof args.wait_ms === 'number' ? args.wait_ms : 15_000,
156
202
  });
157
203
 
158
204
  if (application.kind === 'direct_read') {
205
+ const resultScopeRepoId = scope.kind === 'repository' ? scope.repository.repoId : FORGE_INSTANCE_SCOPE_KEY;
206
+ const boundedPluginResult = boundedRuntimeResult({
207
+ controllerHome: ctx.controllerHome,
208
+ repoId: resultScopeRepoId,
209
+ sessionId: ctx.sessionId,
210
+ principalId: ctx.principalId,
211
+ controllerInstanceId: ctx.controllerInstanceId,
212
+ workId,
213
+ }, application.result);
159
214
  const value = {
160
215
  accepted: true,
161
216
  direct: true,
@@ -166,22 +221,37 @@ export async function callPluginAdapter(
166
221
  risk: application.action.risk,
167
222
  confirmation: application.action.confirmation,
168
223
  },
169
- scope: repository.repoId === '__controller__' ? 'controller' : 'repository',
170
- result: application.result,
224
+ scope: pluginScopeLabel(scope),
225
+ requestId: application.receipt.requestId,
226
+ observationReceiptId: application.receipt.receiptId,
227
+ evidenceRef: application.receipt.receiptId,
228
+ resultDigest: application.receipt.resultDigest,
229
+ result: boundedPluginResult.value,
171
230
  detail: {
172
231
  tool: 'rh_context',
173
232
  arguments: {
174
- ...(repository.repoId === '__controller__' ? {} : { repo_id: repository.repoId }),
175
- capability_id: `plugin.${pluginId}.${actionId}`,
176
- detail_level: 'detail',
233
+ ...detailArgumentsForScope(scope, pluginId, actionId),
177
234
  },
178
235
  },
179
- next: 'Continue with the returned bounded result; use rh_context capability detail only when the typed action schema/policy is needed.',
236
+ next: 'Continue with the returned bounded result. The compact observationReceiptId/evidenceRef may support model-selected learning without creating Work or effect replay state; use rh_context capability detail only when the typed action schema/policy is needed.',
180
237
  };
181
- return resultWithPluginArtifactImages(value, ctx.controllerHome, repository.repoId, application.result);
238
+ return resultWithPluginArtifactImages(
239
+ value,
240
+ ctx.controllerHome,
241
+ resultScopeRepoId,
242
+ application.result,
243
+ );
182
244
  }
183
245
 
184
246
  if (application.kind === 'direct_non_persistent') {
247
+ const boundedPluginResult = boundedRuntimeResult({
248
+ controllerHome: ctx.controllerHome,
249
+ repoId: scope.kind === 'repository' ? scope.repository.repoId : FORGE_INSTANCE_SCOPE_KEY,
250
+ sessionId: ctx.sessionId,
251
+ principalId: ctx.principalId,
252
+ controllerInstanceId: ctx.controllerInstanceId,
253
+ workId,
254
+ }, application.result);
185
255
  return result({
186
256
  accepted: true,
187
257
  direct: true,
@@ -194,27 +264,25 @@ export async function callPluginAdapter(
194
264
  risk: application.action.risk,
195
265
  confirmation: application.action.confirmation,
196
266
  },
197
- scope: repository.repoId === '__controller__' ? 'controller' : 'repository',
267
+ scope: pluginScopeLabel(scope),
198
268
  requestId,
199
- result: application.result,
269
+ result: boundedPluginResult.value,
200
270
  detail: {
201
271
  tool: 'rh_context',
202
272
  arguments: {
203
- ...(repository.repoId === '__controller__' ? {} : { repo_id: repository.repoId }),
204
- capability_id: `plugin.${pluginId}.${actionId}`,
205
- detail_level: 'detail',
273
+ ...detailArgumentsForScope(scope, pluginId, actionId),
206
274
  },
207
275
  },
208
276
  next: 'This protected action completed inline without durable replay state. Use the returned result only for the immediate next protected action.',
209
277
  });
210
278
  }
211
279
 
212
- if (application.kind === 'lightweight_running') {
280
+ if (application.kind === 'managed_running') {
213
281
  return result({
214
282
  accepted: true,
215
283
  direct: false,
216
- durable: false,
217
- mode: 'lightweight_process',
284
+ durable: true,
285
+ mode: 'process_managed',
218
286
  plugin: summarizePluginActionReceipt(application.manifest),
219
287
  action: application.action ? {
220
288
  actionId: application.action.actionId,
@@ -222,21 +290,22 @@ export async function callPluginAdapter(
222
290
  confirmation: application.action.confirmation,
223
291
  requiredConfirmationText: application.action.requiredConfirmationText,
224
292
  } : { actionId },
225
- scope: 'repository',
293
+ scope: pluginScopeLabel(scope),
226
294
  requestId,
227
295
  process: application.process,
228
296
  resultRef: { kind: 'process_logs', processId: application.process.processId },
229
- next: 'The typed plugin action is isolated from the Canonical Runtime. Use process_wait on processId; after completion, call plugin_action_execute again with the same request_id to retrieve the deduplicated structured receipt.',
297
+ observation: { status: 'in_progress', outcome: 'unknown_until_process_terminal', retryPolicy: 'reattach_same_request_id' },
298
+ next: 'Execution is durably detached from this MCP stream. Observe processId/resultRef; after terminal completion, call plugin_action_execute with the same request_id to retrieve the deduplicated structured receipt. Never redispatch with a new request id because observation was interrupted.',
230
299
  });
231
300
  }
232
301
 
233
- if (application.kind === 'lightweight_failed') {
302
+ if (application.kind === 'managed_failed') {
234
303
  const handle = application.process;
235
304
  return result({
236
305
  accepted: true,
237
306
  direct: false,
238
- durable: false,
239
- mode: 'lightweight_process',
307
+ durable: true,
308
+ mode: 'process_managed',
240
309
  requestId,
241
310
  process: handle,
242
311
  error: {
@@ -247,6 +316,19 @@ export async function callPluginAdapter(
247
316
  }
248
317
 
249
318
  const submitted = application.submitted;
319
+ if (submitted.receipt.status === 'failed' && submitted.receipt.effectOutcome !== 'outcome_unknown') {
320
+ return result({
321
+ accepted: true,
322
+ deduplicated: submitted.deduplicated,
323
+ scope: pluginScopeLabel(scope),
324
+ plugin: summarizePluginActionReceipt(submitted.manifest),
325
+ action: { actionId: submitted.action.actionId },
326
+ requestId: submitted.receipt.requestId,
327
+ receiptId: submitted.receipt.receiptId,
328
+ effectOutcome: submitted.receipt.effectOutcome ?? 'failed',
329
+ error: submitted.receipt.error ?? { code: 'PLUGIN_ACTION_FAILED', message: 'Plugin action failed.' },
330
+ }, true);
331
+ }
250
332
  const compactResult = compactSubmittedPluginActionResult(submitted.result);
251
333
  const value = {
252
334
  accepted: true,
@@ -260,7 +342,7 @@ export async function callPluginAdapter(
260
342
  confirmation: submitted.action.confirmation,
261
343
  requiredConfirmationText: submitted.action.requiredConfirmationText,
262
344
  },
263
- scope: repository.repoId === '__controller__' ? 'controller' : 'repository',
345
+ scope: pluginScopeLabel(scope),
264
346
  receiptId: submitted.receipt.receiptId,
265
347
  requestId: submitted.receipt.requestId,
266
348
  ...(submitted.receipt.workId ? { workId: submitted.receipt.workId } : {}),
@@ -269,14 +351,17 @@ export async function callPluginAdapter(
269
351
  detail: {
270
352
  tool: 'rh_context',
271
353
  arguments: {
272
- ...(repository.repoId === '__controller__' ? {} : { repo_id: repository.repoId }),
273
- capability_id: `plugin.${pluginId}.${actionId}`,
274
- detail_level: 'detail',
354
+ ...detailArgumentsForScope(scope, pluginId, actionId),
275
355
  },
276
356
  },
277
357
  next: 'Continue with the returned bounded plugin result; use rh_context capability detail only when the typed action schema/policy is needed.',
278
358
  };
279
- return resultWithPluginArtifactImages(value, ctx.controllerHome, repository.repoId, compactResult);
359
+ return resultWithPluginArtifactImages(
360
+ value,
361
+ ctx.controllerHome,
362
+ scope.kind === 'repository' ? scope.repository.repoId : FORGE_INSTANCE_SCOPE_KEY,
363
+ compactResult,
364
+ );
280
365
  }
281
366
  case 'workspace_auth_status': {
282
367
  const repository = selected(ctx, args);
@@ -292,8 +377,8 @@ export async function callPluginAdapter(
292
377
  }
293
378
  case 'toolchain_plugin_summary': {
294
379
  const pluginId = String(args.plugin_id ?? '').trim();
295
- const repository = pluginRepository(ctx, args, pluginId);
296
- const manifest = getAssistantPluginManifest(ctx.controllerHome, repository, pluginId);
380
+ const scope = pluginTransportScope(ctx, args, pluginId);
381
+ const manifest = pluginManifestForScope(ctx, scope, pluginId);
297
382
  return result({
298
383
  plugin: summarizePluginForLowInterception(manifest),
299
384
  nonOpaque: true,
@@ -11,11 +11,20 @@ import type { McpToolDefinition, CallToolResult } from '../../../packages/protoc
11
11
  import type { MultiRepositoryMcpToolContext } from '../multi-repository';
12
12
  import {
13
13
  cancelRepositoryCommandProcess,
14
+ executeHostCommand,
14
15
  getRepositoryCommandProcess,
15
16
  readRepositoryCommandProcessLogs,
16
17
  waitRepositoryCommandProcess,
17
18
  } from '../../../src/runtime/execution/process-runtime';
18
19
  import { redactSensitiveText, redactSensitiveValue } from '../../../src/runtime/evidence/sensitive-output';
20
+ import { getProcessRecord } from '../../../src/runtime/execution/process-runtime/store';
21
+ import { forgeInstanceIdFor, readProcessHandleIndexEntry } from '../../../src/runtime/execution/process-runtime/handle-index';
22
+ import { isForgeInstanceProcessScopeKey, isRepositoryProcessScopeKey, processScopeKeyForHandle } from '../../../src/runtime/execution/process-runtime/process-scope';
23
+ import { reconcileTerminalWorkVerifications } from '../../../src/runtime/control-plane/execution/work-verification-service';
24
+ import type { WorkHandleState } from '../../../src/runtime/control-plane/execution/work-handle-store';
25
+ import { findControlPlaneRecordsByKey } from '../../../src/runtime/control-plane/persistence/sqlite-store';
26
+ import { sanitizeFileComponent } from '../../../src/runtime/shared/json-files';
27
+ import { selected, stringList } from './shared-adapter';
19
28
 
20
29
  function definition(
21
30
  name: string,
@@ -40,11 +49,11 @@ function definition(
40
49
 
41
50
  const repoIdProp = {
42
51
  type: 'string',
43
- description: 'Repository or ephemeral workspace scope id returned by the originating command. Process must belong to this scope.',
52
+ description: 'Optional repository or ephemeral workspace scope id returned by the originating command. When omitted, the process handle resolves its own recorded execution target.',
44
53
  };
45
54
  const processIdProp = {
46
55
  type: 'string',
47
- description: 'Lightweight or durable process id returned by run_check / repository_command_execute.',
56
+ description: 'Process id returned by execute_command or run_check.',
48
57
  };
49
58
 
50
59
  export const processToolDefinitions: McpToolDefinition[] = [
@@ -74,7 +83,7 @@ export const processToolDefinitions: McpToolDefinition[] = [
74
83
  repo_id: repoIdProp,
75
84
  process_id: processIdProp,
76
85
  },
77
- ['repo_id', 'process_id'],
86
+ ['process_id'],
78
87
  true,
79
88
  ),
80
89
  definition(
@@ -85,7 +94,7 @@ export const processToolDefinitions: McpToolDefinition[] = [
85
94
  process_id: processIdProp,
86
95
  timeout_ms: { type: 'number', description: 'Max wait milliseconds (default 15000).' },
87
96
  },
88
- ['repo_id', 'process_id'],
97
+ ['process_id'],
89
98
  true,
90
99
  ),
91
100
  definition(
@@ -96,7 +105,7 @@ export const processToolDefinitions: McpToolDefinition[] = [
96
105
  process_id: processIdProp,
97
106
  max_bytes: { type: 'number', description: 'Max tail bytes per stream (default 32KiB).' },
98
107
  },
99
- ['repo_id', 'process_id'],
108
+ ['process_id'],
100
109
  true,
101
110
  ),
102
111
  definition(
@@ -106,7 +115,7 @@ export const processToolDefinitions: McpToolDefinition[] = [
106
115
  repo_id: repoIdProp,
107
116
  process_id: processIdProp,
108
117
  },
109
- ['repo_id', 'process_id'],
118
+ ['process_id'],
110
119
  false,
111
120
  true,
112
121
  ),
@@ -114,6 +123,33 @@ export const processToolDefinitions: McpToolDefinition[] = [
114
123
 
115
124
  const processToolNames = new Set(processToolDefinitions.map((tool) => tool.name));
116
125
  const processAttachmentToolNames = new Set(['process_get', 'process_wait', 'process_logs', 'process_cancel']);
126
+
127
+ function reconcileAttachedWorkVerification(
128
+ ctx: MultiRepositoryMcpToolContext,
129
+ repoId: string,
130
+ processId: string,
131
+ handle: { completed?: boolean; workId?: string },
132
+ ): Record<string, unknown> | undefined {
133
+ if (handle.completed !== true || !handle.workId) return undefined;
134
+ const record = getProcessRecord(ctx.controllerHome, repoId, processId);
135
+ if (record?.origin?.workVerificationSnapshot !== true) return undefined;
136
+ try {
137
+ const repository = selected(ctx, { repo_id: repoId, checkout_id: record.checkoutId });
138
+ const reconciled = reconcileTerminalWorkVerifications({
139
+ controllerHome: ctx.controllerHome,
140
+ repository,
141
+ workId: handle.workId,
142
+ });
143
+ return {
144
+ workId: handle.workId,
145
+ processId,
146
+ status: reconciled.reconciledProcessIds.includes(processId) ? 'reconciled' : 'already_current_or_non_authoritative',
147
+ reconciledProcessIds: reconciled.reconciledProcessIds,
148
+ };
149
+ } catch {
150
+ return { workId: handle.workId, processId, status: 'non_authoritative' };
151
+ }
152
+ }
117
153
  // A long-lived MCP wait can monopolize shared Runtime request/transport capacity
118
154
  // even though the underlying Process wait is asynchronous. Keep public waits
119
155
  // short and return a normal running snapshot; the Process continues unchanged
@@ -162,21 +198,58 @@ function failure(error: unknown): CallToolResult {
162
198
  function requireRepoAndProcess(
163
199
  ctx: MultiRepositoryMcpToolContext,
164
200
  args: Record<string, unknown>,
165
- ): { repoId: string; processId: string } {
201
+ ): { repoId?: string; processId: string; handle: NonNullable<ReturnType<typeof getRepositoryCommandProcess>> } {
166
202
  const repoId = typeof args.repo_id === 'string' ? args.repo_id.trim() : '';
167
203
  const processId = typeof args.process_id === 'string' ? args.process_id.trim() : '';
168
- if (!repoId) throw new Error('REPOSITORY_ID_REQUIRED: repo_id is required for process tools');
169
204
  if (!processId) throw new Error('PROCESS_ID_REQUIRED: process_id is required for process tools');
205
+ assertProcessHandleAccess(ctx, processId);
170
206
 
171
- // The Process handle is the scope authority. Ephemeral workspace targets are
172
- // intentionally not registered in Repository Registry, so requiring a live
173
- // repository record here would make their returned managed handles impossible
174
- // to resume. Exact repo/workspace scope + process id still fails closed.
175
- const handle = getRepositoryCommandProcess(ctx.controllerHome, repoId, processId);
207
+ // The Process handle is the scope authority. An explicit repo_id is validated
208
+ // against the handle's recorded target; when it is omitted the handle index
209
+ // resolves the target so attachment never needs placement replay. Ephemeral
210
+ // workspace targets are intentionally not registered in Repository Registry,
211
+ // so requiring a live repository record here would make their returned
212
+ // managed handles impossible to resume.
213
+ const recordedScopeKey = processScopeKeyForHandle(ctx.controllerHome, processId);
214
+ // A ForgeInstance-scoped handle keeps its instance target even when a client
215
+ // always sends repo_id; the index remains the target authority.
216
+ const effectiveScopeKey = recordedScopeKey && isForgeInstanceProcessScopeKey(recordedScopeKey)
217
+ ? recordedScopeKey
218
+ : (repoId || recordedScopeKey);
219
+ const handle = getRepositoryCommandProcess(ctx.controllerHome, effectiveScopeKey, processId);
176
220
  if (!handle) {
177
- throw new Error(`PROCESS_NOT_FOUND: process ${processId} is not registered under repo ${repoId}`);
221
+ throw new Error(repoId
222
+ ? `PROCESS_NOT_FOUND: process ${processId} is not registered under repo ${repoId}`
223
+ : `PROCESS_NOT_FOUND: ${processId}`);
224
+ }
225
+ const resolvedScopeKey = recordedScopeKey && isForgeInstanceProcessScopeKey(recordedScopeKey) ? recordedScopeKey : (repoId || recordedScopeKey);
226
+ const resolvedRepoId = resolvedScopeKey && isRepositoryProcessScopeKey(resolvedScopeKey) ? resolvedScopeKey : undefined;
227
+ return { repoId: resolvedRepoId || undefined, processId, handle };
228
+ }
229
+
230
+ /**
231
+ * A process handle id locates a record; it never authorizes attachment by
232
+ * itself. Instance-level handles are principal-bound and ForgeInstance-bound,
233
+ * and a recorded repository principal is enforced when the caller presents one.
234
+ */
235
+ function assertProcessHandleAccess(ctx: MultiRepositoryMcpToolContext, processId: string): void {
236
+ const entry = readProcessHandleIndexEntry(ctx.controllerHome, processId);
237
+ if (!entry) return;
238
+ const caller = ctx.principalId?.trim();
239
+ const recorded = entry.principalId?.trim();
240
+ if (entry.target.scope === 'forge_instance') {
241
+ const servingInstance = forgeInstanceIdFor(ctx.controllerHome);
242
+ if (entry.target.forgeInstanceId && servingInstance && entry.target.forgeInstanceId !== servingInstance) {
243
+ throw new Error(`PROCESS_HANDLE_INSTANCE_MISMATCH: process ${processId} belongs to ForgeInstance ${entry.target.forgeInstanceId}`);
244
+ }
245
+ if (!recorded) throw new Error(`PROCESS_HANDLE_PRINCIPAL_UNBOUND: process ${processId} has no recorded principal`);
246
+ if (!caller) throw new Error(`PROCESS_HANDLE_PRINCIPAL_REQUIRED: process ${processId} requires an authenticated principal`);
247
+ if (recorded !== caller) throw new Error(`PROCESS_HANDLE_PRINCIPAL_MISMATCH: process ${processId} is owned by another principal`);
248
+ return;
249
+ }
250
+ if (recorded && caller && recorded !== caller) {
251
+ throw new Error(`PROCESS_HANDLE_PRINCIPAL_MISMATCH: process ${processId} is owned by another principal`);
178
252
  }
179
- return { repoId, processId };
180
253
  }
181
254
 
182
255
  function handleToPayload(handle: NonNullable<ReturnType<typeof getRepositoryCommandProcess>>): Record<string, unknown> {
@@ -219,14 +292,17 @@ export async function callProcessTool(
219
292
  // consume an existing process_id here.
220
293
  if (!processAttachmentToolNames.has(name)) return undefined;
221
294
  try {
222
- const { repoId, processId } = requireRepoAndProcess(ctx, args);
295
+ const { repoId, processId, handle: attachedHandle } = requireRepoAndProcess(ctx, args);
296
+ const scopePayload = repoId ? { repoId } : {};
223
297
  switch (name) {
224
298
  case 'process_get': {
225
- const handle = getRepositoryCommandProcess(ctx.controllerHome, repoId, processId);
226
- if (!handle) throw new Error(`PROCESS_NOT_FOUND: ${processId}`);
299
+ const workVerificationReconciliation = repoId
300
+ ? reconcileAttachedWorkVerification(ctx, repoId, processId, attachedHandle)
301
+ : undefined;
227
302
  return result({
228
- repoId,
229
- process: handleToPayload(handle),
303
+ ...scopePayload,
304
+ process: handleToPayload(attachedHandle),
305
+ ...(workVerificationReconciliation ? { workVerificationReconciliation } : {}),
230
306
  });
231
307
  }
232
308
  case 'process_wait': {
@@ -241,9 +317,13 @@ export async function callProcessTool(
241
317
  const handle = await waitRepositoryCommandProcess(ctx.controllerHome, repoId, processId, {
242
318
  timeoutMs: Math.min(requestedWaitMs, attachBudgetMs),
243
319
  });
320
+ const workVerificationReconciliation = repoId
321
+ ? reconcileAttachedWorkVerification(ctx, repoId, processId, handle)
322
+ : undefined;
244
323
  return result({
245
- repoId,
324
+ ...scopePayload,
246
325
  process: handleToPayload(handle),
326
+ ...(workVerificationReconciliation ? { workVerificationReconciliation } : {}),
247
327
  synchronization: handle.completed === true ? 'terminal_result_available' : 'continue_independent_work',
248
328
  waitedMs: Date.now() - startedAt,
249
329
  requestedWaitMs,
@@ -258,7 +338,7 @@ export async function callProcessTool(
258
338
  const logs = readRepositoryCommandProcessLogs(ctx.controllerHome, repoId, processId, maxBytes);
259
339
  if (!logs) throw new Error(`PROCESS_NOT_FOUND: ${processId}`);
260
340
  return result({
261
- repoId,
341
+ ...scopePayload,
262
342
  processId,
263
343
  stdout: logs.stdout,
264
344
  stderr: logs.stderr,
@@ -271,7 +351,7 @@ export async function callProcessTool(
271
351
  case 'process_cancel': {
272
352
  const handle = await cancelRepositoryCommandProcess(ctx.controllerHome, repoId, processId);
273
353
  return result({
274
- repoId,
354
+ ...scopePayload,
275
355
  process: handleToPayload(handle),
276
356
  cancelled: handle.cancelled === true || handle.status === 'cancelled' || handle.status === 'completed_unknown',
277
357
  });
@@ -284,6 +364,76 @@ export async function callProcessTool(
284
364
  }
285
365
  }
286
366
 
367
+ /**
368
+ * Host target of the single execute_command entry: canonical process:exec Grant.
369
+ *
370
+ * Repo-less by construction: the Forge instance is the target and `cwd` is an
371
+ * execution argument. Authorization is one explicit canonical `process:exec`
372
+ * Grant for this instance, enforced in the lane before any spawn.
373
+ */
374
+ function workDefaultCommandCwd(ctx: MultiRepositoryMcpToolContext, workId: string): string | undefined {
375
+ if (!workId) return undefined;
376
+ const matches = findControlPlaneRecordsByKey<WorkHandleState>(ctx.controllerHome, {
377
+ namespace: 'execution_work_handle',
378
+ key: sanitizeFileComponent(workId),
379
+ limit: 2,
380
+ });
381
+ if (matches.length > 1) {
382
+ throw new Error(`WORK_EXECUTION_PLACEMENT_AMBIGUOUS: ${workId} resolves to multiple execution handles`);
383
+ }
384
+ const handle = matches[0]?.value;
385
+ if (!handle) return undefined;
386
+ if (handle.workId !== workId) throw new Error(`WORK_EXECUTION_PLACEMENT_IDENTITY_MISMATCH: ${workId}`);
387
+ const workspace = handle.worktreePath?.trim();
388
+ return workspace || undefined;
389
+ }
390
+
391
+ export async function executeAuthorizedHostCommand(
392
+ ctx: MultiRepositoryMcpToolContext,
393
+ args: Record<string, unknown>,
394
+ ): Promise<CallToolResult> {
395
+ try {
396
+ const command = stringList(args.command);
397
+ const shellCommand = typeof args.shell_command === 'string' && args.shell_command.trim()
398
+ ? args.shell_command
399
+ : undefined;
400
+ if (command.length > 0 && shellCommand) {
401
+ throw new Error('HOST_COMMAND_AMBIGUOUS: provide exactly one of command or shell_command');
402
+ }
403
+ if (command.length === 0 && !shellCommand) {
404
+ throw new Error('HOST_COMMAND_REQUIRED: provide command (argv) or shell_command');
405
+ }
406
+ const requestId = typeof args.request_id === 'string' ? args.request_id.trim() : '';
407
+ const workId = typeof args.work_id === 'string' ? args.work_id.trim() : '';
408
+ const explicitCwd = typeof args.cwd === 'string' ? args.cwd.trim() : '';
409
+ const cwd = explicitCwd || workDefaultCommandCwd(ctx, workId) || '';
410
+ const executed = await executeHostCommand({
411
+ controllerHome: ctx.controllerHome,
412
+ principalId: ctx.principalId ?? '',
413
+ ...(command.length > 0 ? { command } : {}),
414
+ ...(shellCommand ? { shellCommand } : {}),
415
+ cwd,
416
+ ...(typeof args.timeout_ms === 'number' ? { timeoutMs: args.timeout_ms } : {}),
417
+ ...(typeof args.interactive_wait_ms === 'number' ? { interactiveWaitMs: args.interactive_wait_ms } : {}),
418
+ ...(typeof args.max_output_bytes === 'number' ? { maxOutputBytes: args.max_output_bytes } : {}),
419
+ ...(requestId ? { commandId: requestId } : {}),
420
+ ...(workId ? { workId } : {}),
421
+ });
422
+ return result({
423
+ process: handleToPayload(executed.handle),
424
+ target: {
425
+ scope: 'forge_instance',
426
+ forgeInstanceId: executed.target.forgeInstanceId,
427
+ cwd: executed.target.cwd,
428
+ },
429
+ authorization: { capability: 'process:exec', grantId: executed.target.grantId },
430
+ executionMetrics: executed.metrics,
431
+ });
432
+ } catch (error) {
433
+ return failure(error);
434
+ }
435
+ }
436
+
287
437
  export function isProcessTool(name: string): boolean {
288
438
  return processToolNames.has(name);
289
439
  }