@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
@@ -0,0 +1,191 @@
1
+ import { randomBytes } from 'crypto';
2
+ import { existsSync, mkdirSync, rmSync, statSync, writeFileSync } from 'fs';
3
+ import { chmodSync } from 'fs';
4
+ import { basename, dirname, join, resolve } from 'path';
5
+ import { backupControlPlaneDatabase, type ControlPlaneDatabaseInspection } from '../control-plane/persistence/sqlite-store';
6
+ import { normalizeRuntimeDeploymentTopology } from './deployment-topology';
7
+ import { forgeRuntimeServicePaths, readForgeRuntimeServiceConfig, writeForgeRuntimeServiceConfig, type ForgeRuntimeServiceConfig } from './service';
8
+
9
+ export interface StableExecutionLane {
10
+ schemaVersion: 1;
11
+ kind: 'stable';
12
+ controllerHome: string;
13
+ serviceLabel: string;
14
+ port: number;
15
+ authTokenFile: string;
16
+ }
17
+
18
+ export interface CandidateExecutionLane {
19
+ schemaVersion: 1;
20
+ kind: 'candidate';
21
+ sessionId: string;
22
+ controllerHome: string;
23
+ serviceLabel: string;
24
+ port: number;
25
+ authTokenFile: string;
26
+ databaseSnapshotPath: string;
27
+ sourceStableControllerHome: string;
28
+ createdAt: string;
29
+ }
30
+
31
+ function requireSessionId(value: string): string {
32
+ const sessionId = value.trim();
33
+ if (!/^[A-Za-z0-9][A-Za-z0-9_-]{7,119}$/.test(sessionId)) {
34
+ throw new Error('RUNTIME_CANDIDATE_SESSION_ID_INVALID');
35
+ }
36
+ return sessionId;
37
+ }
38
+
39
+ function requireCandidatePort(port: number, stablePort: number): number {
40
+ if (!Number.isInteger(port) || port < 1 || port > 65_535) throw new Error('RUNTIME_CANDIDATE_PORT_INVALID');
41
+ if (port === stablePort) throw new Error('RUNTIME_CANDIDATE_PORT_COLLIDES_WITH_STABLE');
42
+ return port;
43
+ }
44
+
45
+ function candidateTokenPath(controllerHome: string): string {
46
+ return join(controllerHome, 'mcp', 'runtime-token');
47
+ }
48
+
49
+ export function readStableExecutionLane(controllerHome: string): StableExecutionLane {
50
+ const home = resolve(controllerHome);
51
+ const paths = forgeRuntimeServicePaths(home);
52
+ const config = readForgeRuntimeServiceConfig(paths.configPath, { missingRepositoryRoot: 'omit' });
53
+ return {
54
+ schemaVersion: 1,
55
+ kind: 'stable',
56
+ controllerHome: home,
57
+ serviceLabel: paths.label,
58
+ port: config.port,
59
+ authTokenFile: config.authTokenFile,
60
+ };
61
+ }
62
+
63
+ /** Pure lane derivation. It never starts a service or writes either Home. */
64
+ export function planCandidateExecutionLane(input: {
65
+ stable: StableExecutionLane;
66
+ candidateControllerHome: string;
67
+ candidatePort: number;
68
+ sessionId: string;
69
+ }): CandidateExecutionLane {
70
+ const candidateHome = resolve(input.candidateControllerHome);
71
+ if (candidateHome === resolve(input.stable.controllerHome)) {
72
+ throw new Error('RUNTIME_CANDIDATE_CONTROLLER_HOME_COLLIDES_WITH_STABLE');
73
+ }
74
+ const port = requireCandidatePort(input.candidatePort, input.stable.port);
75
+ const paths = forgeRuntimeServicePaths(candidateHome);
76
+ if (paths.label === input.stable.serviceLabel) throw new Error('RUNTIME_CANDIDATE_SERVICE_LABEL_COLLIDES_WITH_STABLE');
77
+ return {
78
+ schemaVersion: 1,
79
+ kind: 'candidate',
80
+ sessionId: requireSessionId(input.sessionId),
81
+ controllerHome: candidateHome,
82
+ serviceLabel: paths.label,
83
+ port,
84
+ authTokenFile: candidateTokenPath(candidateHome),
85
+ databaseSnapshotPath: join(candidateHome, 'control-plane.sqlite'),
86
+ sourceStableControllerHome: resolve(input.stable.controllerHome),
87
+ createdAt: new Date().toISOString(),
88
+ };
89
+ }
90
+
91
+ function createPrivateCandidateToken(stableTokenPath: string, destination: string): void {
92
+ if (!existsSync(stableTokenPath) || !statSync(stableTokenPath).isFile()) {
93
+ throw new Error('RUNTIME_CANDIDATE_STABLE_AUTH_TOKEN_MISSING');
94
+ }
95
+ mkdirSync(dirname(destination), { recursive: true, mode: 0o700 });
96
+ writeFileSync(destination, `${randomBytes(32).toString('base64url')}\n`, { encoding: 'utf8', mode: 0o600, flag: 'wx' });
97
+ try { chmodSync(destination, 0o600); } catch { /* platform best effort */ }
98
+ }
99
+
100
+ function candidateServiceConfig(stable: ForgeRuntimeServiceConfig, lane: CandidateExecutionLane): ForgeRuntimeServiceConfig {
101
+ const topology = normalizeRuntimeDeploymentTopology(stable.topology);
102
+ return {
103
+ ...stable,
104
+ controllerHome: lane.controllerHome,
105
+ port: lane.port,
106
+ authTokenFile: lane.authTokenFile,
107
+ // Candidate B may verify the Supervisor socket and internal lifecycle,
108
+ // but it must never submit external browser effects against Stable A's
109
+ // real conversation during an isolated canary.
110
+ topology: {
111
+ ...topology,
112
+ components: { ...topology.components },
113
+ },
114
+ };
115
+ }
116
+
117
+ /**
118
+ * Create the only permitted Candidate B mutable foundation: a fresh Controller
119
+ * Home with a consistent SQLite snapshot and an independent declarative
120
+ * service contract. It deliberately does not copy Stable A's Runtime release
121
+ * authority and never starts/stops a service; portable artifacts are published into B under B's own authority.
122
+ */
123
+ export function createCandidateExecutionLane(input: {
124
+ stableControllerHome: string;
125
+ candidateControllerHome: string;
126
+ candidatePort: number;
127
+ sessionId: string;
128
+ }): { stable: StableExecutionLane; candidate: CandidateExecutionLane; database: ControlPlaneDatabaseInspection } {
129
+ const stable = readStableExecutionLane(input.stableControllerHome);
130
+ const candidate = planCandidateExecutionLane({
131
+ stable,
132
+ candidateControllerHome: input.candidateControllerHome,
133
+ candidatePort: input.candidatePort,
134
+ sessionId: input.sessionId,
135
+ });
136
+ if (existsSync(candidate.controllerHome)) throw new Error('RUNTIME_CANDIDATE_CONTROLLER_HOME_ALREADY_EXISTS');
137
+ try {
138
+ createPrivateCandidateToken(stable.authTokenFile, candidate.authTokenFile);
139
+ const database = backupControlPlaneDatabase(stable.controllerHome, candidate.databaseSnapshotPath);
140
+ writeForgeRuntimeServiceConfig(candidateServiceConfig(
141
+ readForgeRuntimeServiceConfig(forgeRuntimeServicePaths(stable.controllerHome).configPath, { missingRepositoryRoot: 'omit' }),
142
+ candidate,
143
+ ));
144
+ assertCandidateExecutionLaneIsolation(stable, candidate);
145
+ return { stable, candidate, database };
146
+ } catch (error) {
147
+ // No recursive cleanup is attempted here: this function never guesses at
148
+ // a pre-existing user directory. The only writable target was required to
149
+ // be absent, so the caller can inspect or explicitly retire a partial B.
150
+ throw error;
151
+ }
152
+ }
153
+
154
+ export function assertCandidateExecutionLaneIsolation(
155
+ stable: StableExecutionLane,
156
+ candidate: CandidateExecutionLane,
157
+ ): void {
158
+ if (resolve(stable.controllerHome) === resolve(candidate.controllerHome)) {
159
+ throw new Error('RUNTIME_CANDIDATE_CONTROLLER_HOME_COLLIDES_WITH_STABLE');
160
+ }
161
+ if (stable.port === candidate.port) throw new Error('RUNTIME_CANDIDATE_PORT_COLLIDES_WITH_STABLE');
162
+ if (stable.serviceLabel === candidate.serviceLabel) throw new Error('RUNTIME_CANDIDATE_SERVICE_LABEL_COLLIDES_WITH_STABLE');
163
+ if (resolve(stable.authTokenFile) === resolve(candidate.authTokenFile)) {
164
+ throw new Error('RUNTIME_CANDIDATE_AUTH_TOKEN_COLLIDES_WITH_STABLE');
165
+ }
166
+ if (resolve(candidate.databaseSnapshotPath) !== resolve(candidate.controllerHome, 'control-plane.sqlite')) {
167
+ throw new Error('RUNTIME_CANDIDATE_DATABASE_PATH_INVALID');
168
+ }
169
+ }
170
+
171
+ /**
172
+ * Remove one retired Candidate B home after its ReleaseSession has reached a
173
+ * terminal state. The path fence is deliberately derived from Stable A and
174
+ * the session identity so terminal cleanup can never target an arbitrary
175
+ * Controller Home.
176
+ */
177
+ export function removeRetiredCandidateExecutionLane(
178
+ stable: StableExecutionLane,
179
+ candidate: Pick<CandidateExecutionLane, 'controllerHome' | 'sessionId'>,
180
+ ): boolean {
181
+ const stableHome = resolve(stable.controllerHome);
182
+ const candidateHome = resolve(candidate.controllerHome);
183
+ const candidateRoot = resolve(dirname(stableHome), 'candidate-runtime-lanes');
184
+ if (candidateHome === stableHome) throw new Error('RUNTIME_CANDIDATE_CLEANUP_STABLE_COLLISION');
185
+ if (resolve(dirname(candidateHome)) !== candidateRoot || basename(candidateHome) !== candidate.sessionId) {
186
+ throw new Error('RUNTIME_CANDIDATE_CLEANUP_PATH_INVALID');
187
+ }
188
+ if (!existsSync(candidateHome)) return false;
189
+ rmSync(candidateHome, { recursive: true, force: true });
190
+ return true;
191
+ }
@@ -1,5 +1,5 @@
1
1
  import { randomUUID } from 'crypto';
2
- import { mkdirSync, statSync } from 'fs';
2
+ import { statSync } from 'fs';
3
3
  import { writeJsonAtomic } from '../shared/json-files';
4
4
  import { ensureForgeInstanceIdentity } from '../../../packages/kernel/identity/api/index';
5
5
  import { dirname, join } from 'path';
@@ -10,8 +10,6 @@ import {
10
10
  enableControlPlaneReadConnectionReuse,
11
11
  inspectControlPlaneDatabase,
12
12
  } from '../control-plane/persistence/sqlite-store';
13
- import { activateExclusiveWorkAdmission } from '../control-plane/facade/work-admission-policy';
14
- import { closeCodeGraphReadProviderSessions } from '../context/codegraph-read-provider';
15
13
  import { cancelAllLightweightProcesses } from '../execution/process-runtime/lightweight-managed';
16
14
  import {
17
15
  collectRuntimeSourceIdentity,
@@ -24,11 +22,14 @@ import { acquireRuntimeOwnership, type RuntimeOwnershipHandle } from './ownershi
24
22
  import { RuntimeReadinessState } from './readiness';
25
23
  import { loadRuntimeReleaseManifest, requireCompleteCompiledRuntimeReleaseManifest } from './release-manifest';
26
24
  import { ensureActiveRuntimeRelease, readRuntimeReleaseAuthority, type RuntimeReleaseAuthority } from './release-store';
25
+ import { migrateReleaseDurableState } from '../release/release-state-migration';
27
26
  import { bindRuntimeWriteClaim, clearRuntimeWriteClaim } from './write-fence';
28
27
  import { startInProcessScheduler, type RuntimeSchedulerHandle } from './scheduler';
29
28
  import { startConfiguredRuntimeLocalBridge, type RuntimeLocalBridgeHandle } from './local-bridge';
30
29
  import { startActiveExecutionPowerAssertion, type RuntimePowerAssertionHandle } from './active-execution-power-assertion';
31
- import { removeRuntimeStatusSnapshot, writeRuntimeStatusSnapshot } from './status';
30
+ import { startWorkflowSupervisorRuntime, type RuntimeWorkflowSupervisorHandle } from './workflow-supervisor-runtime';
31
+ import { normalizeRuntimeDeploymentTopology, type RuntimeDeploymentTopology } from './deployment-topology';
32
+ import { removeRuntimeStartupFailureEvidence, removeRuntimeStatusSnapshot, writeRuntimeStartupFailureEvidence, writeRuntimeStatusSnapshot } from './status';
32
33
  import type {
33
34
  CanonicalRuntimeConfig,
34
35
  CanonicalRuntimeStatusSnapshot,
@@ -43,6 +44,7 @@ export interface RuntimeReleaseAuthorityMonitor {
43
44
 
44
45
  export interface CanonicalRuntimeDependencies {
45
46
  loadReleaseManifest(path: string, controllerHome: string): RuntimeReleaseManifest;
47
+ migrateReleaseState(controllerHome: string): void;
46
48
  ensureReleaseAuthority(controllerHome: string, manifestPath: string): RuntimeReleaseAuthority;
47
49
  readReleaseAuthority(controllerHome: string): RuntimeReleaseAuthority | undefined;
48
50
  startReleaseAuthorityMonitor(observe: () => void): RuntimeReleaseAuthorityMonitor;
@@ -52,6 +54,7 @@ export interface CanonicalRuntimeDependencies {
52
54
  startScheduler(input: Parameters<typeof startInProcessScheduler>[0]): RuntimeSchedulerHandle;
53
55
  startLocalBridge(input: { controllerHome: string; repositoryRoot?: string }): Promise<RuntimeLocalBridgeHandle | undefined>;
54
56
  startPowerAssertion(input: { controllerHome: string; runtimePid: number }): RuntimePowerAssertionHandle;
57
+ startWorkflowSupervisor(controllerHome: string, options?: { nativeBrowserAdapter?: boolean }): Promise<RuntimeWorkflowSupervisorHandle>;
55
58
  startTransport(options: Parameters<typeof startRuntimeMcpTransport>[0]): Promise<RuntimeMcpTransportHandle>;
56
59
  runMcpProbe(endpoint: string, authToken: string): Promise<void>;
57
60
  collectRuntimeSourceIdentity: typeof collectRuntimeSourceIdentity;
@@ -60,7 +63,20 @@ export interface CanonicalRuntimeDependencies {
60
63
  stopContextReadHelpers(): Promise<void>;
61
64
  computeToolSurfaceFingerprint: typeof runtimeGatewayToolSurfaceFingerprint;
62
65
  ensureForgeInstanceIdentity: typeof ensureForgeInstanceIdentity;
63
- startJscSamplingProfiler(directory: string): Promise<void>;
66
+ captureJscSamplingProfile(options: { durationMs: number; sampleIntervalUs: number }): Promise<{
67
+ requestedDurationMs: number;
68
+ elapsedMs: number;
69
+ sampleIntervalUs: number;
70
+ functions: string;
71
+ bytecodes: string;
72
+ stackTraces: {
73
+ interval: number | null;
74
+ totalTraceCount: number;
75
+ retainedTraceCount: number;
76
+ traces: Array<{ timestamp: number | null; frames: Array<Record<string, unknown>> }>;
77
+ sources: Array<Record<string, unknown>>;
78
+ };
79
+ }>;
64
80
  }
65
81
 
66
82
  async function defaultMcpProbe(endpoint: string, authToken: string): Promise<void> {
@@ -87,6 +103,12 @@ async function defaultMcpProbe(endpoint: string, authToken: string): Promise<voi
87
103
  }
88
104
 
89
105
  const DEFAULT_RELEASE_AUTHORITY_MONITOR_INTERVAL_MS = 1_000;
106
+ const JSC_SAMPLING_DURATION_MS = 2_000;
107
+ const JSC_SAMPLING_INTERVAL_US = 1_000;
108
+ const JSC_SAMPLING_TRACE_LIMIT = 2_000;
109
+ const JSC_SAMPLING_FRAME_LIMIT = 32;
110
+ const JSC_SAMPLING_SOURCE_LIMIT = 512;
111
+ const JSC_SAMPLING_REPORT_CHAR_LIMIT = 128 * 1024;
90
112
 
91
113
  function startDefaultReleaseAuthorityMonitor(observe: () => void): RuntimeReleaseAuthorityMonitor {
92
114
  const timer = setInterval(observe, DEFAULT_RELEASE_AUTHORITY_MONITOR_INTERVAL_MS);
@@ -94,14 +116,70 @@ function startDefaultReleaseAuthorityMonitor(observe: () => void): RuntimeReleas
94
116
  return { stop: () => clearInterval(timer) };
95
117
  }
96
118
 
97
- async function startDefaultJscSamplingProfiler(directory: string): Promise<void> {
98
- mkdirSync(directory, { recursive: true });
99
- const { startSamplingProfiler } = await import('bun:jsc');
100
- startSamplingProfiler(directory);
119
+ async function captureDefaultJscSamplingProfile(options: { durationMs: number; sampleIntervalUs: number }): Promise<{
120
+ requestedDurationMs: number;
121
+ elapsedMs: number;
122
+ sampleIntervalUs: number;
123
+ functions: string;
124
+ bytecodes: string;
125
+ stackTraces: {
126
+ interval: number | null;
127
+ totalTraceCount: number;
128
+ retainedTraceCount: number;
129
+ traces: Array<{ timestamp: number | null; frames: Array<Record<string, unknown>> }>;
130
+ sources: Array<Record<string, unknown>>;
131
+ };
132
+ }> {
133
+ const { profile } = await import('bun:jsc');
134
+ const startedAt = performance.now();
135
+ const sampling = await profile(
136
+ () => new Promise<void>((resolve) => setTimeout(resolve, options.durationMs)),
137
+ options.sampleIntervalUs,
138
+ );
139
+ // Bun's current runtime returns an object here even though bun-types still
140
+ // declares SamplingProfile.stackTraces as string[]. Treat the runtime value
141
+ // as diagnostic input and normalize it defensively instead of trusting that
142
+ // stale declaration at the production boundary.
143
+ const rawStackTraces = sampling.stackTraces as unknown as {
144
+ interval?: unknown;
145
+ traces?: unknown;
146
+ sources?: unknown;
147
+ };
148
+ const rawTraces = Array.isArray(rawStackTraces?.traces) ? rawStackTraces.traces : [];
149
+ const traces = rawTraces.slice(-JSC_SAMPLING_TRACE_LIMIT).map((trace) => {
150
+ const record = trace && typeof trace === 'object' && !Array.isArray(trace)
151
+ ? trace as Record<string, unknown>
152
+ : {};
153
+ const frames = Array.isArray(record.frames)
154
+ ? record.frames.filter((frame): frame is Record<string, unknown> => Boolean(frame) && typeof frame === 'object' && !Array.isArray(frame)).slice(0, JSC_SAMPLING_FRAME_LIMIT)
155
+ : [];
156
+ return {
157
+ timestamp: typeof record.timestamp === 'number' ? record.timestamp : null,
158
+ frames,
159
+ };
160
+ });
161
+ const sources = Array.isArray(rawStackTraces?.sources)
162
+ ? rawStackTraces.sources.filter((source): source is Record<string, unknown> => Boolean(source) && typeof source === 'object' && !Array.isArray(source)).slice(0, JSC_SAMPLING_SOURCE_LIMIT)
163
+ : [];
164
+ return {
165
+ requestedDurationMs: options.durationMs,
166
+ elapsedMs: Math.max(0, performance.now() - startedAt),
167
+ sampleIntervalUs: options.sampleIntervalUs,
168
+ functions: sampling.functions.slice(0, JSC_SAMPLING_REPORT_CHAR_LIMIT),
169
+ bytecodes: sampling.bytecodes.slice(0, JSC_SAMPLING_REPORT_CHAR_LIMIT),
170
+ stackTraces: {
171
+ interval: typeof rawStackTraces?.interval === 'number' ? rawStackTraces.interval : null,
172
+ totalTraceCount: rawTraces.length,
173
+ retainedTraceCount: traces.length,
174
+ traces,
175
+ sources,
176
+ },
177
+ };
101
178
  }
102
179
 
103
180
  const DEFAULT_DEPENDENCIES: CanonicalRuntimeDependencies = {
104
181
  loadReleaseManifest: loadRuntimeReleaseManifest,
182
+ migrateReleaseState: migrateReleaseDurableState,
105
183
  ensureReleaseAuthority: ensureActiveRuntimeRelease,
106
184
  readReleaseAuthority: readRuntimeReleaseAuthority,
107
185
  startReleaseAuthorityMonitor: startDefaultReleaseAuthorityMonitor,
@@ -111,26 +189,29 @@ const DEFAULT_DEPENDENCIES: CanonicalRuntimeDependencies = {
111
189
  startScheduler: startInProcessScheduler,
112
190
  startLocalBridge: startConfiguredRuntimeLocalBridge,
113
191
  startPowerAssertion: startActiveExecutionPowerAssertion,
192
+ startWorkflowSupervisor: startWorkflowSupervisorRuntime,
114
193
  startTransport: startRuntimeMcpTransport,
115
194
  runMcpProbe: defaultMcpProbe,
116
195
  collectRuntimeSourceIdentity,
117
196
  rotateRuntimeGeneration,
118
197
  stopLightweightProcesses: cancelAllLightweightProcesses,
119
- stopContextReadHelpers: closeCodeGraphReadProviderSessions,
198
+ stopContextReadHelpers: async () => {},
120
199
  computeToolSurfaceFingerprint: runtimeGatewayToolSurfaceFingerprint,
121
200
  ensureForgeInstanceIdentity,
122
- startJscSamplingProfiler: startDefaultJscSamplingProfiler,
201
+ captureJscSamplingProfile: captureDefaultJscSamplingProfile,
123
202
  };
124
203
 
125
204
  export class CanonicalForgeRuntime {
126
205
  readonly forgeInstanceId: string;
127
206
  readonly runtimeInstanceId: string;
207
+ readonly topology: RuntimeDeploymentTopology;
128
208
  private readonly readinessState = new RuntimeReadinessState();
129
209
  private readonly dependencies: CanonicalRuntimeDependencies;
130
210
  private ownership?: RuntimeOwnershipHandle;
131
211
  private scheduler?: RuntimeSchedulerHandle;
132
212
  private localBridge?: RuntimeLocalBridgeHandle;
133
213
  private powerAssertion?: RuntimePowerAssertionHandle;
214
+ private workflowSupervisor?: RuntimeWorkflowSupervisorHandle;
134
215
  private toolSurfaceFingerprint?: string;
135
216
  private transport?: RuntimeMcpTransportHandle;
136
217
  private controller?: RuntimeControllerServices;
@@ -144,8 +225,7 @@ export class CanonicalForgeRuntime {
144
225
  private jscHeapDiagnosticsSignalHandler?: () => void;
145
226
  private jscHeapDiagnosticsCaptureInFlight = false;
146
227
  private jscSamplingProfilerSignalHandler?: () => void;
147
- private jscSamplingProfilerStartInFlight = false;
148
- private jscSamplingProfilerStarted = false;
228
+ private jscSamplingProfileCaptureInFlight = false;
149
229
  lastExit?: RuntimeExitEvidence;
150
230
 
151
231
  constructor(
@@ -153,6 +233,7 @@ export class CanonicalForgeRuntime {
153
233
  dependencies: Partial<CanonicalRuntimeDependencies> = {},
154
234
  ) {
155
235
  this.runtimeInstanceId = config.runtimeInstanceId?.trim() || `runtime_${randomUUID().replaceAll('-', '')}`;
236
+ this.topology = normalizeRuntimeDeploymentTopology(config.topology);
156
237
  this.dependencies = { ...DEFAULT_DEPENDENCIES, ...dependencies };
157
238
  if (!config.controllerHome.trim()) throw new Error('RUNTIME_CONFIG_REQUIRED: controllerHome');
158
239
  if (config.repositoryRoot?.trim()) {
@@ -183,7 +264,10 @@ export class CanonicalForgeRuntime {
183
264
  const handler = () => {
184
265
  if (this.jscHeapDiagnosticsCaptureInFlight) return;
185
266
  this.jscHeapDiagnosticsCaptureInFlight = true;
186
- void import('bun:jsc').then(({ heapStats, memoryUsage }) => {
267
+ void import('bun:jsc').then(({ fullGC, heapStats, memoryUsage }) => {
268
+ const gcStartedAt = performance.now();
269
+ const fullGcResult = fullGC();
270
+ const fullGcDurationMs = Math.max(0, performance.now() - gcStartedAt);
187
271
  const heap = heapStats();
188
272
  const topTypes = (counts: Record<string, number>, limit: number) => Object.entries(counts)
189
273
  .sort((left, right) => right[1] - left[1])
@@ -195,6 +279,12 @@ export class CanonicalForgeRuntime {
195
279
  pid: process.pid,
196
280
  runtimeInstanceId: this.runtimeInstanceId,
197
281
  releaseId: this.release?.releaseId,
282
+ gc: {
283
+ forced: true,
284
+ kind: 'full',
285
+ durationMs: fullGcDurationMs,
286
+ result: fullGcResult,
287
+ },
198
288
  heap: {
199
289
  heapSize: heap.heapSize,
200
290
  heapCapacity: heap.heapCapacity,
@@ -235,26 +325,41 @@ export class CanonicalForgeRuntime {
235
325
  private installJscSamplingProfilerSignal(): void {
236
326
  if (process.platform === 'win32' || this.jscSamplingProfilerSignalHandler) return;
237
327
  const handler = () => {
238
- if (this.jscSamplingProfilerStarted || this.jscSamplingProfilerStartInFlight) return;
239
- this.jscSamplingProfilerStartInFlight = true;
240
- const directory = join(this.config.controllerHome, 'diagnostics', 'jsc-profile');
241
- void this.dependencies.startJscSamplingProfiler(directory).then(() => {
242
- this.jscSamplingProfilerStarted = true;
328
+ if (this.jscSamplingProfileCaptureInFlight) return;
329
+ this.jscSamplingProfileCaptureInFlight = true;
330
+ void this.dependencies.captureJscSamplingProfile({
331
+ durationMs: JSC_SAMPLING_DURATION_MS,
332
+ sampleIntervalUs: JSC_SAMPLING_INTERVAL_US,
333
+ }).then((sampling) => {
334
+ const path = join(this.config.controllerHome, 'diagnostics', 'jsc-sampling-profile.json');
335
+ writeJsonAtomic(path, {
336
+ schemaVersion: 1,
337
+ capturedAt: new Date().toISOString(),
338
+ pid: process.pid,
339
+ runtimeInstanceId: this.runtimeInstanceId,
340
+ releaseId: this.release?.releaseId,
341
+ bounded: true,
342
+ ...sampling,
343
+ });
243
344
  process.stderr.write(`${JSON.stringify({
244
- event: 'forge_runtime_jsc_sampling_profiler_started',
345
+ event: 'forge_runtime_jsc_sampling_profile_captured',
245
346
  runtimeInstanceId: this.runtimeInstanceId,
246
- directory,
347
+ path,
348
+ requestedDurationMs: sampling.requestedDurationMs,
349
+ elapsedMs: sampling.elapsedMs,
350
+ sampleIntervalUs: sampling.sampleIntervalUs,
351
+ retainedTraceCount: sampling.stackTraces.retainedTraceCount,
247
352
  observedAt: new Date().toISOString(),
248
353
  })}\n`);
249
354
  }).catch((error) => {
250
355
  process.stderr.write(`${JSON.stringify({
251
- event: 'forge_runtime_jsc_sampling_profiler_failed',
356
+ event: 'forge_runtime_jsc_sampling_profile_failed',
252
357
  runtimeInstanceId: this.runtimeInstanceId,
253
358
  message: error instanceof Error ? error.message : String(error),
254
359
  observedAt: new Date().toISOString(),
255
360
  })}\n`);
256
361
  }).finally(() => {
257
- this.jscSamplingProfilerStartInFlight = false;
362
+ this.jscSamplingProfileCaptureInFlight = false;
258
363
  });
259
364
  };
260
365
  process.on('SIGUSR1', handler);
@@ -339,7 +444,7 @@ export class CanonicalForgeRuntime {
339
444
  if (this.started) throw new Error('RUNTIME_ALREADY_STARTED');
340
445
  this.started = true;
341
446
  this.readinessState.markNotReady();
342
- let stage: 'release' | 'ownership' | 'source' | 'database' | 'scheduler' | 'localBridge' | 'transport' | 'probe' = 'release';
447
+ let stage: 'release' | 'ownership' | 'source' | 'database' | 'supervisor' | 'scheduler' | 'localBridge' | 'transport' | 'probe' = 'release';
343
448
  try {
344
449
  this.release = this.dependencies.loadReleaseManifest(this.config.releaseManifestPath, this.config.controllerHome);
345
450
 
@@ -347,6 +452,7 @@ export class CanonicalForgeRuntime {
347
452
  this.ownership = this.dependencies.acquireOwnership(this.config.controllerHome, this.runtimeInstanceId);
348
453
 
349
454
  stage = 'release';
455
+ this.dependencies.migrateReleaseState(this.config.controllerHome);
350
456
  const releaseAuthority = this.dependencies.ensureReleaseAuthority(this.config.controllerHome, this.config.releaseManifestPath);
351
457
  stage = 'source';
352
458
  // A compiled release is a closed execution surface. Fail before Scheduler
@@ -400,11 +506,15 @@ export class CanonicalForgeRuntime {
400
506
  this.installJscSamplingProfilerSignal();
401
507
  this.readinessState.setDiagnostic('database', 'pass');
402
508
  this.publishStatus();
403
- if (this.config.exclusiveWorkId) {
404
- activateExclusiveWorkAdmission(this.config.controllerHome, {
405
- allowedWorkId: this.config.exclusiveWorkId,
406
- reason: 'P0 canonical single Runtime migration isolation',
509
+ if (this.topology.components.workflowSupervisor) {
510
+ stage = 'supervisor';
511
+ this.workflowSupervisor = await this.dependencies.startWorkflowSupervisor(this.config.controllerHome, {
512
+ nativeBrowserAdapter: this.topology.components.workflowSupervisorNativeBrowser,
407
513
  });
514
+ void this.workflowSupervisor.done.then(
515
+ () => this.failCore('WORKFLOW_SUPERVISOR_STOPPED', 'Workflow Supervisor stopped while Runtime was active.'),
516
+ (error) => this.failCore('WORKFLOW_SUPERVISOR_FAILED', error instanceof Error ? error.message : String(error)),
517
+ );
408
518
  }
409
519
 
410
520
  stage = 'scheduler';
@@ -464,12 +574,30 @@ export class CanonicalForgeRuntime {
464
574
  this.readinessState.setDiagnostic('mcpEndToEnd', 'pass');
465
575
  this.readinessState.markReady();
466
576
  this.publishStatus();
577
+ removeRuntimeStartupFailureEvidence(this.config.controllerHome);
467
578
  stage = 'release';
468
579
  this.startReleaseAuthorityMonitor();
469
580
  } catch (error) {
470
581
  const reason = this.startupReason(stage);
582
+ const message = error instanceof Error ? error.message : String(error);
471
583
  this.markStartupFailure(stage, reason);
472
- await this.stop(reason, error instanceof Error ? error.message : String(error));
584
+ try {
585
+ writeRuntimeStartupFailureEvidence(this.config.controllerHome, {
586
+ schemaVersion: 1,
587
+ runtimeInstanceId: this.runtimeInstanceId,
588
+ stage,
589
+ reasonCode: reason,
590
+ message,
591
+ ...(this.release ? {
592
+ releaseId: this.release.releaseId,
593
+ artifactIdentity: this.release.artifactIdentity,
594
+ } : {}),
595
+ observedAt: new Date().toISOString(),
596
+ });
597
+ } catch {
598
+ // Diagnostic persistence must never replace the original startup failure.
599
+ }
600
+ await this.stop(reason, message);
473
601
  throw error;
474
602
  }
475
603
  }
@@ -479,6 +607,7 @@ export class CanonicalForgeRuntime {
479
607
  if (stage === 'ownership') return 'RUNTIME_OWNERSHIP_CONFLICT';
480
608
  if (stage === 'source') return 'RUNTIME_SOURCE_SNAPSHOT_FAILED';
481
609
  if (stage === 'database') return 'DATABASE_UNAVAILABLE';
610
+ if (stage === 'supervisor') return 'WORKFLOW_SUPERVISOR_INITIALIZATION_FAILED';
482
611
  if (stage === 'scheduler') return 'SCHEDULER_INITIALIZATION_FAILED';
483
612
  if (stage === 'localBridge') return 'LOCAL_BRIDGE_STARTUP_FAILED';
484
613
  if (stage === 'transport') return 'MCP_LISTENER_FAILED';
@@ -525,6 +654,8 @@ export class CanonicalForgeRuntime {
525
654
  this.removeJscSamplingProfilerSignal();
526
655
  // Stop accepting new MCP work before quiescing Scheduler activity, then
527
656
  // release the Controller Home claim only after all in-process services stop.
657
+ await this.workflowSupervisor?.close().catch(() => undefined);
658
+ this.workflowSupervisor = undefined;
528
659
  await this.transport?.close().catch(() => undefined);
529
660
  await this.dependencies.stopLightweightProcesses(this.config.controllerHome).catch(() => undefined);
530
661
  await this.dependencies.stopContextReadHelpers().catch(() => undefined);
@@ -1,11 +1,14 @@
1
1
  import {
2
2
  bindControllerSessionBinding,
3
+ getRequirementControllerRoundRelay,
3
4
  type ControllerBinding,
4
5
  type ControllerHost,
5
6
  type ControllerSession,
6
7
  } from '../../../packages/kernel/controller/api/index';
7
- import { createChatgptControllerHost } from '../../../adapters/chatgpt/controller-host';
8
8
  import { upsertChatgptControllerBinding } from '../../../adapters/chatgpt/controller-binding-store';
9
+ import { DEFAULT_CHATGPT_AUTOMATION_REASONING } from '../../../adapters/chatgpt/provider-delivery';
10
+ import { getWorkContract } from '../../../packages/kernel/work/api/index';
11
+ import { inheritWorkflowSupervisorConversationBinding } from './workflow-supervisor-composition';
9
12
  import { getChatgptWorkConversationBinding } from '../../../adapters/chatgpt/work-conversation-binding-store';
10
13
  import { createProcessControllerHost } from '../../../adapters/controller-process/controller-host';
11
14
  import { upsertProcessControllerBinding, type ProcessControllerType } from '../../../adapters/controller-process/binding-store';
@@ -22,9 +25,13 @@ export function ensureScheduledControllerBinding(
22
25
  workId: input.workId, sessionId: input.session.sessionId,
23
26
  browserSessionId: durable?.latestBrowserSessionId ?? (typeof input.args.browser_session_id === 'string' ? input.args.browser_session_id : undefined),
24
27
  conversationUrl: durable?.conversationUrl ?? (typeof input.args.conversation_url === 'string' ? input.args.conversation_url : undefined),
28
+ authorizationGrantRefs: [
29
+ ...(durable?.authorizationGrantRefs ?? []),
30
+ ...(Array.isArray(input.args.authorization_grant_refs) ? input.args.authorization_grant_refs.map(String) : []),
31
+ ].map(value => value.trim()).filter(Boolean).filter((value, index, values) => values.indexOf(value) === index),
25
32
  title: input.scheduleName,
26
33
  model: typeof input.args.model === 'string' ? input.args.model : 'gpt-5.6',
27
- reasoning: input.args.reasoning === 'medium' || input.args.reasoning === 'xhigh' ? input.args.reasoning : 'high',
34
+ reasoning: input.args.reasoning === 'medium' || input.args.reasoning === 'high' || input.args.reasoning === 'xhigh' ? input.args.reasoning : DEFAULT_CHATGPT_AUTOMATION_REASONING,
28
35
  tabPolicy: input.args.tab_policy === 'reuse' || input.args.tab_policy === 'new' ? input.args.tab_policy : 'auto',
29
36
  timeoutMs: typeof input.args.timeout_ms === 'number' ? input.args.timeout_ms : undefined,
30
37
  }).binding;
@@ -43,9 +50,28 @@ export function ensureScheduledControllerBinding(
43
50
  return binding;
44
51
  }
45
52
 
53
+ export function ensureScheduledControllerBindingForWork(
54
+ options: { controllerHome: string; repoId: string },
55
+ input: { workId: string; session: ControllerSession; scheduleName?: string; args: Record<string, unknown> },
56
+ ): ControllerBinding {
57
+ if (input.session.controllerType === 'chatgpt') {
58
+ const work = getWorkContract(options, input.workId);
59
+ if (work?.requirementId && !getChatgptWorkConversationBinding(options, input.workId)) {
60
+ const requirementRelay = getRequirementControllerRoundRelay(options, work.requirementId);
61
+ if (requirementRelay?.originWorkId && requirementRelay.originWorkId !== input.workId) {
62
+ inheritWorkflowSupervisorConversationBinding(options, requirementRelay.originWorkId, input.workId);
63
+ }
64
+ }
65
+ }
66
+ return ensureScheduledControllerBinding(options, input);
67
+ }
68
+
46
69
  export function controllerHostForScheduledBinding(
47
70
  options: { controllerHome: string; repoId: string; repoRoot: string },
48
71
  binding: ControllerBinding,
49
72
  ): ControllerHost {
50
- return binding.hostKind === 'chatgpt' ? createChatgptControllerHost(options) : createProcessControllerHost(options);
73
+ if (binding.hostKind === 'chatgpt') {
74
+ throw new Error('CHATGPT_CONTROLLER_HOST_SUPERVISOR_OWNED');
75
+ }
76
+ return createProcessControllerHost(options);
51
77
  }
@@ -4,6 +4,7 @@ import { spawn, type ChildProcess } from 'child_process';
4
4
  import { loadRuntimeReleaseManifest } from './release-manifest';
5
5
  import { readRuntimeReleaseAuthority } from './release-store';
6
6
  import { readForgeRuntimeServiceConfig } from './service';
7
+ import { runtimeAuthorityFreeEnvironment } from '../shared/process-environment';
7
8
 
8
9
  export interface ForgeRuntimeServiceCommand {
9
10
  executable: string;
@@ -31,10 +32,9 @@ export function resolveForgeRuntimeServiceCommand(controllerHome: string, config
31
32
  '--port', String(config.port),
32
33
  '--auth-token-file', config.authTokenFile,
33
34
  ...activeRuntimeReleaseManifest.arguments,
34
- ...(config.exclusiveWorkId ? ['--exclusive-work-id', config.exclusiveWorkId] : []),
35
35
  ],
36
36
  env: {
37
- ...process.env,
37
+ ...runtimeAuthorityFreeEnvironment(process.env),
38
38
  FORGE_CONTROLLER_HOME: home,
39
39
  FORGE_CONTROLLER_RUNTIME_SOURCE_ROOT: releaseRoot,
40
40
  FORGE_RELEASE_PATH: releaseRoot,