@moretea-labs/forge 1.7.2 → 1.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (900) hide show
  1. package/AGENTS.md +121 -62
  2. package/CHANGELOG.md +40 -0
  3. package/CLAUDE.md +57 -62
  4. package/CONTRIBUTING.md +3 -2
  5. package/README.md +2 -2
  6. package/SKILL.md +0 -1
  7. package/THIRD_PARTY_NOTICES.md +5 -2
  8. package/adapters/browser/index.ts +2 -0
  9. package/adapters/chatgpt/browser-delivery-host.ts +77 -0
  10. package/adapters/chatgpt/browser-delivery-runtime.ts +1256 -0
  11. package/adapters/chatgpt/controller-binding-store.ts +134 -0
  12. package/adapters/chatgpt/controller-round-host.ts +68 -0
  13. package/adapters/chatgpt/controller-round-settlement-store.ts +99 -0
  14. package/adapters/chatgpt/provider-delivery.ts +340 -0
  15. package/adapters/chatgpt/work-conversation-binding-store.ts +218 -0
  16. package/adapters/chatgpt/wsl-bridge-delivery-host.ts +63 -0
  17. package/adapters/computer/chatgpt-extension-target.ts +463 -0
  18. package/adapters/computer/chatgpt-target-router.ts +103 -0
  19. package/adapters/computer/chrome-extension/background.js +385 -0
  20. package/adapters/computer/chrome-extension/content.js +378 -0
  21. package/adapters/computer/chrome-extension/core.js +24 -0
  22. package/adapters/computer/chrome-extension/manifest.json +30 -0
  23. package/adapters/computer/desktop-operator-contract.ts +7 -0
  24. package/adapters/computer/desktop-operator-discovery.ts +181 -0
  25. package/adapters/computer/desktop-operator-negotiation.ts +174 -0
  26. package/adapters/computer/desktop-operator-provider.ts +312 -0
  27. package/adapters/computer/index.ts +1 -0
  28. package/adapters/computer/interaction-target-authority.ts +1068 -0
  29. package/adapters/controller-process/binding-store.ts +34 -0
  30. package/adapters/controller-process/controller-host.ts +26 -0
  31. package/adapters/mcp/access-mode.ts +132 -0
  32. package/adapters/mcp/audit.ts +32 -0
  33. package/adapters/mcp/auth.ts +406 -0
  34. package/adapters/mcp/instructions.ts +37 -0
  35. package/adapters/mcp/legacy-context.ts +18 -0
  36. package/adapters/mcp/multi-repository.ts +421 -0
  37. package/adapters/mcp/oauth.ts +464 -0
  38. package/adapters/mcp/paths.ts +143 -0
  39. package/adapters/mcp/policy.ts +232 -0
  40. package/adapters/mcp/proxy-env.ts +62 -0
  41. package/adapters/mcp/readiness-projection.ts +24 -0
  42. package/adapters/mcp/redaction.ts +21 -0
  43. package/adapters/mcp/repo.ts +24 -0
  44. package/adapters/mcp/runtime-gateway/artifact-adapter.ts +52 -0
  45. package/adapters/mcp/runtime-gateway/automation-receipt-adapter.ts +87 -0
  46. package/adapters/mcp/runtime-gateway/bounded-result-runtime.ts +62 -0
  47. package/adapters/mcp/runtime-gateway/cognition-settlement.ts +201 -0
  48. package/adapters/mcp/runtime-gateway/context-adapter.ts +1167 -0
  49. package/adapters/mcp/runtime-gateway/context-pack-sidecar.ts +91 -0
  50. package/adapters/mcp/runtime-gateway/controller-authority-adapter.ts +206 -0
  51. package/adapters/mcp/runtime-gateway/core-capability-adapter.ts +258 -0
  52. package/adapters/mcp/runtime-gateway/engineering-preconditions.ts +130 -0
  53. package/adapters/mcp/runtime-gateway/engineering-tool-contract.ts +15 -0
  54. package/adapters/mcp/runtime-gateway/execution-control-adapter.ts +28 -0
  55. package/adapters/mcp/runtime-gateway/execution-tools.ts +173 -0
  56. package/adapters/mcp/runtime-gateway/filesystem-adapter.ts +38 -0
  57. package/adapters/mcp/runtime-gateway/gateway-execution-adapter.ts +412 -0
  58. package/adapters/mcp/runtime-gateway/legacy-ios-tool-adapter.ts +105 -0
  59. package/adapters/mcp/runtime-gateway/maintenance-adapter.ts +44 -0
  60. package/adapters/mcp/runtime-gateway/model-adapter.ts +63 -0
  61. package/adapters/mcp/runtime-gateway/persisted-check-process.ts +3 -0
  62. package/adapters/mcp/runtime-gateway/plugin-adapter.ts +380 -0
  63. package/adapters/mcp/runtime-gateway/process-tools.ts +457 -0
  64. package/adapters/mcp/runtime-gateway/protected-computer-adapter.ts +88 -0
  65. package/adapters/mcp/runtime-gateway/recovery-adapter.ts +285 -0
  66. package/adapters/mcp/runtime-gateway/recovery-client-adapter.ts +70 -0
  67. package/adapters/mcp/runtime-gateway/recovery-tool-contract.ts +99 -0
  68. package/adapters/mcp/runtime-gateway/repository-compat-adapter.ts +79 -0
  69. package/adapters/mcp/runtime-gateway/result-adapter.ts +114 -0
  70. package/adapters/mcp/runtime-gateway/router.ts +242 -0
  71. package/adapters/mcp/runtime-gateway/routing-policy.ts +499 -0
  72. package/adapters/mcp/runtime-gateway/runtime-observation-adapter.ts +1200 -0
  73. package/adapters/mcp/runtime-gateway/runtime-readiness-observation.ts +218 -0
  74. package/adapters/mcp/runtime-gateway/runtime-tool-definitions.ts +574 -0
  75. package/adapters/mcp/runtime-gateway/runtime-tool-shared.ts +27 -0
  76. package/adapters/mcp/runtime-gateway/runtime-tools.ts +78 -0
  77. package/adapters/mcp/runtime-gateway/scheduler-adapter.ts +187 -0
  78. package/adapters/mcp/runtime-gateway/shared-adapter.ts +45 -0
  79. package/adapters/mcp/runtime-gateway/status-inbox-adapter.ts +962 -0
  80. package/adapters/mcp/runtime-gateway/typescript-navigation-sidecar.ts +136 -0
  81. package/adapters/mcp/runtime-gateway/work-adapter.ts +325 -0
  82. package/adapters/mcp/runtime-gateway/work-controller-operations.ts +257 -0
  83. package/adapters/mcp/runtime-gateway/work-detail-projection.ts +60 -0
  84. package/adapters/mcp/runtime-gateway/work-input-wire-migration.ts +246 -0
  85. package/adapters/mcp/runtime-gateway/work-learning-operations.ts +145 -0
  86. package/adapters/mcp/runtime-gateway/work-list-projection.ts +38 -0
  87. package/adapters/mcp/runtime-gateway/work-plan-operations.ts +382 -0
  88. package/adapters/mcp/runtime-gateway/work-repair-adapter.ts +308 -0
  89. package/adapters/mcp/runtime-gateway/work-requirement-operations.ts +148 -0
  90. package/adapters/mcp/runtime-gateway/work-semantic-operations.ts +263 -0
  91. package/adapters/mcp/runtime-gateway/work-validation-reconciler.ts +1 -0
  92. package/adapters/mcp/runtime-gateway/work-workflow-operations.ts +113 -0
  93. package/adapters/mcp/runtime-gateway/workflow-supervisor-adapter.ts +156 -0
  94. package/adapters/mcp/server.ts +1092 -0
  95. package/adapters/mcp/setup.ts +789 -0
  96. package/adapters/mcp/tool-capability-cache.ts +87 -0
  97. package/adapters/mcp/tool-mapping/access-tools.ts +387 -0
  98. package/adapters/mcp/tool-mapping/legacy-tool-service.ts +5139 -0
  99. package/adapters/mcp/tool-mapping/post-finalize-work-attribution.ts +145 -0
  100. package/adapters/mcp/tool-mapping/repository-tools.ts +1682 -0
  101. package/adapters/mcp/tool-mapping/tools.ts +9 -0
  102. package/adapters/mcp/tool-mapping/umbrella-tools.ts +117 -0
  103. package/adapters/mcp/toolset-names.ts +79 -0
  104. package/adapters/mcp/toolset-selection.ts +41 -0
  105. package/adapters/mcp/toolset.ts +337 -0
  106. package/adapters/mcp/transports/http-observation.ts +365 -0
  107. package/adapters/mcp/transports/http.ts +933 -0
  108. package/adapters/mcp/transports/oauth-http.ts +322 -0
  109. package/adapters/mcp/transports/session-registry.ts +519 -0
  110. package/adapters/mcp/transports/stdio.ts +8 -0
  111. package/adapters/mcp/tunnels/openai-secure-tunnel.ts +223 -0
  112. package/adapters/mcp/types.ts +41 -0
  113. package/assets/AGENTS.md +2 -16
  114. package/assets/CLAUDE.md +2 -16
  115. package/assets/hooks/AGENTS.md +3 -14
  116. package/assets/hooks/CLAUDE.md +3 -14
  117. package/assets/hooks/hook-input.sh +9 -2
  118. package/assets/hooks/lib/workflow-state.sh +28 -10
  119. package/assets/hooks/prompt-guard.sh +63 -37
  120. package/assets/hooks/security-sentinel.sh +2 -1
  121. package/assets/hooks/session-start-context.sh +7 -5
  122. package/assets/hooks/stop-orchestrator.sh +13 -3
  123. package/assets/initializer-question-pack.v4.json +11 -7
  124. package/assets/partials/05-workflow.partial.md +18 -73
  125. package/assets/partials/07-footer.partial.md +1 -1
  126. package/assets/partials-agents/02-operating-mode.partial.md +1 -2
  127. package/assets/partials-agents/04-task-protocol.partial.md +14 -59
  128. package/assets/partials-agents/06-quality-safety.partial.md +11 -16
  129. package/assets/partials-agents/08-deep-docs.partial.md +1 -2
  130. package/assets/plan-map.json +11 -11
  131. package/assets/plugin-registry.v1.json +11 -3
  132. package/assets/plugin-trust-policy.v1.json +6 -0
  133. package/assets/recovery/ForgeRecovery.ps1 +100 -0
  134. package/assets/recovery/forge-wsl-rescue +271 -0
  135. package/assets/reference-configs/agentic-development-flow.md +25 -0
  136. package/assets/reference-configs/development-protocol.md +11 -15
  137. package/assets/reference-configs/document-generation.md +1 -1
  138. package/assets/reference-configs/global-working-rules.md +28 -1
  139. package/assets/reference-configs/harness-overview.md +22 -112
  140. package/assets/reference-configs/hook-operations.md +1 -1
  141. package/assets/reference-configs/sprint-contracts.md +2 -2
  142. package/assets/skill-version.json +2 -2
  143. package/assets/templates/helpers/architecture-event.ts +3 -34
  144. package/assets/templates/helpers/architecture-queue.sh +61 -10
  145. package/assets/templates/helpers/archive-workflow.sh +90 -180
  146. package/assets/templates/helpers/capability-config.ts +8 -11
  147. package/assets/templates/helpers/capability-resolver.ts +37 -19
  148. package/assets/templates/helpers/capture-plan.sh +2 -2
  149. package/assets/templates/helpers/check-architecture-sync.sh +1 -9
  150. package/assets/templates/helpers/check-task-sync.sh +82 -11
  151. package/assets/templates/helpers/check-task-workflow.sh +1 -3
  152. package/assets/templates/helpers/context-contract-sync.sh +1 -12
  153. package/assets/templates/helpers/contract-worktree.sh +26 -24
  154. package/assets/templates/helpers/ensure-task-workflow.sh +6 -8
  155. package/assets/templates/helpers/inspect-project-state.ts +1 -1
  156. package/assets/templates/helpers/migrate-project-template.sh +1 -1
  157. package/assets/templates/helpers/migrate-workflow-docs.ts +53 -239
  158. package/assets/templates/helpers/new-plan.sh +2 -2
  159. package/assets/templates/helpers/plan-to-todo.sh +3 -31
  160. package/assets/templates/helpers/sprint-backlog.sh +1 -1
  161. package/assets/templates/helpers/switch-plan.sh +1 -1
  162. package/assets/templates/helpers/workflow-contract.ts +1 -0
  163. package/assets/workflow-contract.v1.json +63 -171
  164. package/assets/workflows/xiaohongshu/xiaohongshu.collect-metrics.v1.draft.json +118 -0
  165. package/assets/workflows/xiaohongshu/xiaohongshu.publish-image-note.v1.draft.json +316 -0
  166. package/assets/workflows/xiaohongshu/xiaohongshu.publish-long-text.v1.draft.json +324 -0
  167. package/docs/architecture/CURRENT.md +233 -28
  168. package/docs/architecture/EVOLUTION.md +13 -0
  169. package/docs/architecture/decisions/20260801-controller-home-sqlite-state.md +2 -1
  170. package/docs/architecture/decisions/20260803-release-identity-binding-and-exit-policy.md +14 -5
  171. package/docs/architecture/decisions/20260823-immediate-controller-relay.md +6 -3
  172. package/docs/architecture/decisions/20260831-independent-windows-wsl-host-rescue.md +59 -0
  173. package/docs/architecture/decisions/20260904-ios-device-migration-baseline.md +120 -0
  174. package/docs/architecture/decisions/20260904-repository-runtime-data-boundary.md +42 -0
  175. package/docs/architecture/decisions/20260907-assistant-learning-loop.md +37 -0
  176. package/docs/architecture/decisions/20260907-controller-round-transition-policy.md +311 -0
  177. package/docs/architecture/decisions/20260907-maintenance-diagnosis-bounded-read.md +39 -0
  178. package/docs/architecture/decisions/20260916-workflow-supervisor-authority.md +249 -0
  179. package/docs/architecture/decisions/20260917-cognitive-memory-foundation.md +82 -0
  180. package/docs/architecture/decisions/20260918-stable-candidate-release-lifecycle.md +221 -0
  181. package/docs/architecture/decisions/20260919-autonomous-work-liveness.md +62 -0
  182. package/docs/architecture/decisions/20260924-thin-semantic-working-context.md +72 -0
  183. package/docs/architecture/decisions/20261001-supervisor-turn-authority.md +237 -0
  184. package/docs/architecture/decisions/20261005-forge-v3-desktop-client-boundary.md +77 -0
  185. package/docs/architecture/domains/verification.md +8 -0
  186. package/docs/architecture/domains/workflow-engine.md +7 -1
  187. package/docs/architecture/index.md +3 -3
  188. package/docs/architecture/modules/controller-runtime/transport-lifecycle.md +19 -8
  189. package/docs/architecture/requests/2026-09-04-computer-plugin-workflow-taxonomy.md +124 -0
  190. package/docs/forge-chatgpt-mcp-setup.md +5 -3
  191. package/docs/forge-plugin-management.md +20 -4
  192. package/docs/forge-runtime-self-healing-loop.md +2 -0
  193. package/docs/operations/benchmark-cross-version-freeze.md +38 -0
  194. package/docs/operations/controller-browser-plugin.md +3 -1
  195. package/docs/operations/controller-performance-and-502.md +17 -0
  196. package/docs/operations/controller-reliability-runbook.md +2 -2
  197. package/docs/operations/features.md +1 -1
  198. package/docs/operations/features.zh-CN.md +1 -1
  199. package/docs/operations/homebrew.md +2 -2
  200. package/docs/operations/mcp-tool-exposure.md +2 -0
  201. package/docs/operations/platform-support.md +16 -8
  202. package/docs/operations/platform-support.zh-CN.md +2 -2
  203. package/docs/operations/releasing.md +2 -0
  204. package/docs/operations/standalone-disaster-recovery.md +38 -5
  205. package/docs/operations/uu-remote-rescue.md +41 -0
  206. package/docs/operations/windows-wsl-host-rescue.md +133 -0
  207. package/docs/public-usage-guide.md +1 -1
  208. package/docs/public-usage-guide.zh-CN.md +1 -1
  209. package/docs/tutorials/01-install-and-start.md +1 -1
  210. package/docs/tutorials/01-install-and-start.zh-CN.md +1 -1
  211. package/docs/tutorials/02-connect-chatgpt.md +4 -4
  212. package/docs/tutorials/02-connect-chatgpt.zh-CN.md +4 -4
  213. package/docs/wiki/Implementation.md +1 -1
  214. package/package.json +46 -26
  215. package/packages/kernel/cognition/api/index.ts +6 -0
  216. package/packages/kernel/cognition/application/activation-service.ts +451 -0
  217. package/packages/kernel/cognition/application/consolidation-service.ts +185 -0
  218. package/packages/kernel/cognition/application/legacy-experience-adapter.ts +38 -0
  219. package/packages/kernel/cognition/application/memory-service.ts +64 -0
  220. package/packages/kernel/cognition/domain/learning.ts +106 -0
  221. package/packages/kernel/cognition/domain/memory.ts +254 -0
  222. package/packages/kernel/controller/api/index.ts +3 -0
  223. package/packages/kernel/controller/application/continuation-service.ts +281 -0
  224. package/packages/kernel/controller/application/controller-round-service.ts +41 -0
  225. package/packages/kernel/controller/application/controller-service.ts +30 -0
  226. package/packages/kernel/controller/domain/controller-round-transition-policy.ts +529 -0
  227. package/packages/kernel/controller/domain/controller-round.ts +110 -0
  228. package/packages/kernel/controller/domain/execution-quality.ts +135 -0
  229. package/packages/kernel/controller/domain/types.ts +56 -0
  230. package/packages/kernel/controller/index.ts +1 -0
  231. package/packages/kernel/controller/infrastructure/controller-binding-store.ts +84 -0
  232. package/packages/kernel/controller/infrastructure/controller-round-store.ts +1970 -0
  233. package/packages/kernel/controller/infrastructure/controller-session-store.ts +804 -0
  234. package/packages/kernel/controller/ports/controller-host.ts +18 -0
  235. package/packages/kernel/goal/api/index.ts +1 -0
  236. package/packages/kernel/goal/domain/types.ts +40 -0
  237. package/packages/kernel/goal/index.ts +1 -0
  238. package/packages/kernel/identity/api/index.ts +15 -0
  239. package/packages/kernel/identity/application/identity-service.ts +67 -0
  240. package/packages/kernel/identity/domain/activity-projection.ts +43 -0
  241. package/packages/kernel/identity/domain/capability-broker.ts +60 -0
  242. package/packages/kernel/identity/domain/grant.ts +72 -0
  243. package/packages/kernel/identity/domain/owned-resource.ts +116 -0
  244. package/packages/kernel/identity/domain/scope.ts +63 -0
  245. package/packages/kernel/identity/domain/semantic-sync.ts +81 -0
  246. package/packages/kernel/identity/domain/types.ts +44 -0
  247. package/packages/kernel/identity/domain/user-request.ts +93 -0
  248. package/packages/kernel/identity/domain/workspace.ts +56 -0
  249. package/packages/kernel/identity/index.ts +1 -0
  250. package/packages/kernel/identity/infrastructure/activity-projection-store.ts +77 -0
  251. package/packages/kernel/identity/infrastructure/capability-broker.ts +81 -0
  252. package/packages/kernel/identity/infrastructure/grant-store.ts +284 -0
  253. package/packages/kernel/identity/infrastructure/identity-store.ts +75 -0
  254. package/packages/kernel/identity/infrastructure/owned-resource-store.ts +259 -0
  255. package/packages/kernel/identity/infrastructure/user-request-store.ts +182 -0
  256. package/packages/kernel/memory/api/index.ts +5 -0
  257. package/packages/kernel/memory/application/experience-service.ts +118 -0
  258. package/packages/kernel/memory/application/outcome-service.ts +77 -0
  259. package/packages/kernel/memory/domain/experience.ts +103 -0
  260. package/packages/kernel/memory/domain/operational-prior.ts +92 -0
  261. package/packages/kernel/memory/index.ts +1 -0
  262. package/packages/kernel/scheduler/api/index.ts +4 -0
  263. package/packages/kernel/scheduler/application/eligibility.ts +252 -0
  264. package/packages/kernel/scheduler/application/schedule-service.ts +27 -0
  265. package/packages/kernel/scheduler/application/settlement.ts +182 -0
  266. package/packages/kernel/scheduler/domain/schedule.ts +236 -0
  267. package/packages/kernel/scheduler/index.ts +1 -0
  268. package/packages/kernel/scheduler/infrastructure/schedule-store.ts +805 -0
  269. package/packages/kernel/work/api/index.ts +16 -0
  270. package/packages/kernel/work/application/work-service.ts +123 -0
  271. package/packages/kernel/work/domain/check-receipt.ts +43 -0
  272. package/packages/kernel/work/domain/context-closure-receipt.ts +32 -0
  273. package/packages/kernel/work/domain/current-task-lineage.ts +104 -0
  274. package/packages/kernel/work/domain/engineering-contracts.ts +157 -0
  275. package/packages/kernel/work/domain/engineering-design.ts +286 -0
  276. package/packages/kernel/work/domain/engineering-profile.ts +238 -0
  277. package/packages/kernel/work/domain/evaluation-promotion-receipt.ts +186 -0
  278. package/packages/kernel/work/domain/execution-concurrency.ts +247 -0
  279. package/packages/kernel/work/domain/execution-snapshot.ts +2 -0
  280. package/packages/kernel/work/domain/implementation-review.ts +193 -0
  281. package/packages/kernel/work/domain/objective-graph.ts +119 -0
  282. package/packages/kernel/work/domain/project-engineering-contract.ts +224 -0
  283. package/packages/kernel/work/domain/repository-completion-receipt.ts +73 -0
  284. package/{src/runtime/control-plane/facade/work-state-machine.ts → packages/kernel/work/domain/state-machine.ts} +37 -66
  285. package/packages/kernel/work/domain/types.ts +534 -0
  286. package/packages/kernel/work/index.ts +1 -0
  287. package/packages/kernel/work/infrastructure/work-contract-store.ts +1967 -0
  288. package/packages/kernel/work/ports/work-contract-store.ts +21 -0
  289. package/packages/plugin-runtime/browser/index.ts +3 -0
  290. package/packages/plugin-runtime/browser/provider-registry.ts +110 -0
  291. package/packages/plugin-runtime/browser/runtime-contract.ts +150 -0
  292. package/packages/plugin-runtime/browser/session-authority.ts +62 -0
  293. package/packages/plugin-runtime/computer/chatgpt-identity.ts +24 -0
  294. package/packages/plugin-runtime/computer/conversation-target.ts +143 -0
  295. package/packages/plugin-runtime/computer/index.ts +8 -0
  296. package/packages/plugin-runtime/computer/provider-error.ts +26 -0
  297. package/packages/plugin-runtime/computer/provider-registration.ts +52 -0
  298. package/packages/plugin-runtime/computer/provider-registry.ts +63 -0
  299. package/packages/plugin-runtime/computer/provider.ts +19 -0
  300. package/packages/plugin-runtime/computer/target-authority.ts +215 -0
  301. package/packages/plugin-runtime/computer/target-persistence.ts +54 -0
  302. package/packages/plugin-runtime/external/index.ts +1 -0
  303. package/packages/plugin-runtime/external/unix-jsonl-transport.ts +581 -0
  304. package/packages/plugin-runtime/index.ts +3 -0
  305. package/packages/protocols/browser/index.ts +1 -0
  306. package/packages/protocols/browser/session.ts +98 -0
  307. package/packages/protocols/computer/contract.ts +225 -0
  308. package/packages/protocols/computer/index.ts +1 -0
  309. package/packages/protocols/failure/contract.ts +158 -0
  310. package/packages/protocols/failure/index.ts +1 -0
  311. package/packages/protocols/handoff/index.ts +1 -0
  312. package/packages/protocols/handoff/status.ts +22 -0
  313. package/packages/protocols/mcp/execution-context.ts +11 -0
  314. package/packages/protocols/mcp/index.ts +2 -0
  315. package/packages/protocols/mcp/tool-contract.ts +42 -0
  316. package/packages/workflow-runtime/api/index.ts +2 -0
  317. package/packages/workflow-runtime/application/interpreter.ts +342 -0
  318. package/packages/workflow-runtime/domain/workflow-asset.ts +223 -0
  319. package/packages/workflow-runtime/index.ts +1 -0
  320. package/scripts/activate-source-baseline.ts +7 -9
  321. package/scripts/assemble-template.ts +1 -1
  322. package/scripts/bootstrap-runtime-maintenance-recovery.sh +4 -1
  323. package/scripts/canary-chatgpt-provider-delivery.ts +97 -0
  324. package/scripts/canary-controller-semantic-wait.ts +183 -0
  325. package/scripts/canary-global-hook.sh +2 -2
  326. package/scripts/check-mcp-compatibility.ts +85 -7
  327. package/scripts/check-platform-support.mjs +28 -2
  328. package/scripts/check-public-docs.sh +1 -1
  329. package/scripts/check-repository-hygiene.mjs +92 -0
  330. package/scripts/check-runtime-architecture.mjs +1643 -127
  331. package/scripts/check-source-duplication.mjs +9 -1
  332. package/scripts/controller-ngrok-rotation.sh +5 -4
  333. package/scripts/create-project-dirs.sh +10 -74
  334. package/scripts/forge-local-recovery-helper.mjs +282 -0
  335. package/scripts/forge-uu-remote-rescue-helper.d.mts +31 -0
  336. package/scripts/forge-uu-remote-rescue-helper.mjs +409 -0
  337. package/scripts/forge-windows-host-recovery-helper.mjs +136 -0
  338. package/scripts/hook-shim.sh +2 -2
  339. package/scripts/init-project.sh +12 -70
  340. package/scripts/install-desktop-operator-registration.ts +4 -2
  341. package/scripts/install-independent-windows-wsl-recovery.ts +125 -0
  342. package/scripts/install-standalone-recovery.ts +122 -10
  343. package/scripts/install-uu-remote-rescue-registration.ts +74 -0
  344. package/scripts/install-windows-host-recovery-registration.ts +22 -0
  345. package/scripts/lib/controller-home-env.sh +6 -3
  346. package/scripts/lib/project-init-lib.sh +42 -582
  347. package/scripts/migrate-chatgpt-automation-schedules.ts +2 -2
  348. package/scripts/migrate-windows-wsl-controller-home.ts +306 -0
  349. package/scripts/open-source-audit-allowlist.txt +11 -1
  350. package/scripts/portability-bindings.mjs +70 -0
  351. package/scripts/run-bounded-command.mjs +60 -0
  352. package/scripts/run-bun-test-file.ts +22 -6
  353. package/scripts/run-governed-gate.ts +4 -2
  354. package/scripts/run-mobile-monitor-bridge.ts +0 -1
  355. package/scripts/smoke-control-plane-failure-domain.ts +94 -0
  356. package/scripts/smoke-mcp-http-runtime.ts +6 -1
  357. package/scripts/smoke-runtime-recovery.ts +13 -11
  358. package/scripts/smoke-schedule-engine.ts +24 -16
  359. package/scripts/smoke-unattended-transport-recovery.ts +223 -0
  360. package/scripts/smoke-user-request-continuation-restart.ts +232 -0
  361. package/scripts/smoke-workflow-supervisor-chrome-adapter.ts +92 -0
  362. package/scripts/smoke-workflow-supervisor-process-restart.ts +276 -0
  363. package/scripts/smoke-workflow-supervisor-restart-recovery.ts +150 -0
  364. package/scripts/smoke-workflow-supervisor.ts +103 -0
  365. package/scripts/test-governance.ts +51 -2
  366. package/scripts/verify-forge-runtime.sh +2 -1
  367. package/src/cli/agent-jobs/executor-health.ts +11 -34
  368. package/src/cli/agent-jobs/integration.ts +18 -49
  369. package/src/cli/agent-jobs/job-manager.ts +17 -4
  370. package/src/cli/chatgpt-browser/bind-server.ts +2 -1
  371. package/src/cli/chatgpt-browser/binding.ts +20 -10
  372. package/src/cli/chatgpt-browser/bridge-extension.ts +75 -0
  373. package/src/cli/chatgpt-browser/bridge-provider.ts +376 -11
  374. package/src/cli/chatgpt-browser/engine.ts +10 -11
  375. package/src/cli/chatgpt-browser/native-provider.ts +24 -83
  376. package/src/cli/chatgpt-browser/oracle-provider.ts +5 -3
  377. package/src/cli/chatgpt-browser/types.ts +1 -0
  378. package/src/cli/commands/bootstrap-control.ts +334 -0
  379. package/src/cli/commands/brain-assistant.ts +52 -0
  380. package/src/cli/commands/brain.ts +191 -40
  381. package/src/cli/commands/chatgpt.ts +32 -67
  382. package/src/cli/commands/computer.ts +437 -0
  383. package/src/cli/commands/doctor.ts +18 -1
  384. package/src/cli/commands/init-hook.ts +71 -61
  385. package/src/cli/commands/init.ts +3 -1
  386. package/src/cli/commands/mcp.ts +16 -10
  387. package/src/cli/commands/plugin.ts +38 -12
  388. package/src/cli/commands/recovery.ts +507 -80
  389. package/src/cli/commands/runtime.ts +12 -7
  390. package/src/cli/commands/setup-profile.ts +97 -39
  391. package/src/cli/commands/status.ts +2 -1
  392. package/src/cli/controller/check-runner.ts +500 -100
  393. package/src/cli/controller/completion-backlog.ts +3 -3
  394. package/src/cli/controller/completion-orchestrator.ts +4 -43
  395. package/src/cli/controller/completion-target.ts +3 -72
  396. package/src/cli/controller/context/source-materializer.ts +81 -100
  397. package/src/cli/controller/context/types.ts +7 -1
  398. package/src/cli/controller/context-pack.ts +28 -6
  399. package/src/cli/controller/execution-completion.ts +4 -7
  400. package/src/cli/controller/execution-policy.ts +36 -153
  401. package/src/cli/controller/governance.ts +2 -3
  402. package/src/cli/controller/issue-store.ts +4 -99
  403. package/src/cli/controller/launch-agents.ts +59 -18
  404. package/src/cli/controller/operational-plan.ts +24 -51
  405. package/src/cli/controller/runtime-config.ts +5 -1
  406. package/src/cli/controller/stuck-state-migration.ts +2 -3
  407. package/src/cli/controller/systemd-user.ts +148 -0
  408. package/src/cli/controller/types.ts +10 -70
  409. package/src/cli/controller/worklog.ts +67 -13
  410. package/src/cli/editing/edit-operation-contract.ts +92 -0
  411. package/src/cli/editing/edit-session.ts +290 -20
  412. package/src/cli/github/plugin.ts +17 -12
  413. package/src/cli/hook/route-registry.ts +3 -5
  414. package/src/cli/hook/runtime.ts +49 -3
  415. package/src/cli/index.ts +3 -0
  416. package/src/cli/local-bridge/connector-freshness.ts +2 -2
  417. package/src/cli/local-bridge/console-automations.ts +20 -15
  418. package/src/cli/local-bridge/console-view-models.ts +3 -12
  419. package/src/cli/local-bridge/facade-api.ts +105 -205
  420. package/src/cli/local-bridge/job-store.ts +1 -1
  421. package/src/cli/local-bridge/server.ts +48 -174
  422. package/src/cli/local-bridge/types.ts +0 -1
  423. package/src/cli/mcp/access-mode.ts +2 -132
  424. package/src/cli/mcp/access-tools.ts +2 -387
  425. package/src/cli/mcp/audit.ts +2 -32
  426. package/src/cli/mcp/auth.ts +2 -404
  427. package/src/cli/mcp/instructions.ts +2 -34
  428. package/src/cli/mcp/legacy-context.ts +2 -16
  429. package/src/cli/mcp/legacy-tool-service.ts +2 -5308
  430. package/src/cli/mcp/multi-repository.ts +2 -436
  431. package/src/cli/mcp/oauth-client-retirement.ts +74 -0
  432. package/src/cli/mcp/oauth.ts +2 -375
  433. package/src/cli/mcp/openai-secure-tunnel.ts +2 -0
  434. package/src/cli/mcp/paths.ts +2 -140
  435. package/src/cli/mcp/policy.ts +2 -232
  436. package/src/cli/mcp/post-finalize-work-attribution.ts +2 -150
  437. package/src/cli/mcp/proxy-env.ts +2 -62
  438. package/src/cli/mcp/readiness-projection.ts +2 -24
  439. package/src/cli/mcp/redaction.ts +2 -21
  440. package/src/cli/mcp/repo.ts +2 -24
  441. package/src/cli/mcp/repository-tools.ts +2 -1613
  442. package/src/cli/mcp/server.ts +2 -951
  443. package/src/cli/mcp/setup.ts +2 -737
  444. package/src/cli/mcp/tool-capability-cache.ts +2 -87
  445. package/src/cli/mcp/tool-contract.ts +2 -14
  446. package/src/cli/mcp/tools.ts +2 -9
  447. package/src/cli/mcp/toolset-names.ts +2 -70
  448. package/src/cli/mcp/toolset-selection.ts +2 -41
  449. package/src/cli/mcp/toolset.ts +2 -336
  450. package/src/cli/mcp/transports/AGENTS.md +1 -10
  451. package/src/cli/mcp/transports/CLAUDE.md +1 -10
  452. package/src/cli/mcp/transports/http.ts +2 -1414
  453. package/src/cli/mcp/transports/session-registry.ts +2 -490
  454. package/src/cli/mcp/transports/stdio.ts +2 -8
  455. package/src/cli/mcp/types.ts +2 -41
  456. package/src/cli/mcp/umbrella-tools.ts +2 -117
  457. package/src/cli/repositories/command-executor.ts +91 -39
  458. package/src/cli/repositories/command-scope.ts +139 -4
  459. package/src/cli/repositories/controller-home.ts +167 -1
  460. package/src/cli/repositories/ephemeral-workspace.ts +20 -30
  461. package/src/cli/repositories/git-command-executor.ts +2 -2
  462. package/src/cli/repositories/identity.ts +13 -0
  463. package/src/cli/repositories/registry.ts +145 -60
  464. package/src/cli/repositories/repository-snapshot.ts +53 -7
  465. package/src/cli/repositories/runtime-storage.ts +27 -2
  466. package/src/cli/repositories/safe-patch.ts +34 -38
  467. package/src/cli/repositories/selected-path-actions.ts +22 -2
  468. package/src/cli/repositories/structured-git.ts +167 -27
  469. package/src/cli/repository/session-cache.ts +92 -6
  470. package/src/cli/runtime/helper-runner.ts +7 -0
  471. package/src/cli/runtime-invocation.ts +8 -1
  472. package/src/cli/tools/codegraph.ts +44 -25
  473. package/src/core/adoption/manifest-templates.ts +1 -1
  474. package/src/core/adoption/plan.ts +3 -26
  475. package/src/core/adoption/workflow-contract-plan.ts +17 -9
  476. package/src/effects/process-runner.ts +8 -14
  477. package/src/runtime/context/assistant-context.ts +167 -0
  478. package/src/runtime/context/assistant-work-context.ts +209 -0
  479. package/src/runtime/context/automatic-learning.ts +565 -0
  480. package/src/runtime/context/codegraph-cache-boundary.ts +255 -0
  481. package/src/runtime/context/codegraph-read-provider.ts +55 -22
  482. package/src/runtime/context/codegraph-sidecar.cjs +8 -1
  483. package/src/runtime/context/cognitive-attention.ts +173 -0
  484. package/src/runtime/context/cognitive-skill-canary.ts +158 -0
  485. package/src/runtime/context/context-closure.ts +305 -0
  486. package/src/runtime/context/context-pack-process.ts +103 -0
  487. package/src/runtime/context/context-plane.ts +203 -0
  488. package/src/runtime/context/direct-controller-learning.ts +298 -0
  489. package/src/runtime/context/project-engineering-contract.ts +60 -0
  490. package/src/runtime/context/semantic-navigation-contract.ts +9 -0
  491. package/src/runtime/context/semantic-navigation.ts +6 -34
  492. package/src/runtime/context/typescript-navigation-process.ts +145 -0
  493. package/src/runtime/context/typescript-navigation.ts +89 -3
  494. package/src/runtime/control-plane/bootstrap/capability-provider.ts +74 -0
  495. package/src/runtime/control-plane/bootstrap/control-api.ts +57 -0
  496. package/src/runtime/control-plane/bootstrap/index.ts +5 -0
  497. package/src/runtime/control-plane/bootstrap/state-machine.ts +141 -0
  498. package/src/runtime/control-plane/bootstrap/store.ts +21 -0
  499. package/src/runtime/control-plane/bootstrap/types.ts +87 -0
  500. package/src/runtime/control-plane/cleanup-artifact-retention.ts +531 -0
  501. package/src/runtime/control-plane/codegraph-cache-retention.ts +164 -0
  502. package/src/runtime/control-plane/concurrency/work-execution-concurrency.ts +282 -0
  503. package/src/runtime/control-plane/execution/controller-authority-recovery.ts +380 -0
  504. package/src/runtime/control-plane/execution/edit-validation-coordinator.ts +113 -16
  505. package/src/runtime/control-plane/execution/execution-identity.ts +23 -3
  506. package/src/runtime/control-plane/execution/implementation-review-content.ts +95 -0
  507. package/src/runtime/control-plane/execution/repository-work-attribution.ts +7 -30
  508. package/src/runtime/control-plane/execution/retained-work-resume.ts +439 -102
  509. package/src/runtime/control-plane/execution/session-store.ts +31 -1
  510. package/src/runtime/control-plane/execution/validation.ts +34 -11
  511. package/src/runtime/control-plane/execution/work-authority-reconciler.ts +87 -0
  512. package/src/runtime/control-plane/execution/work-check-evidence.ts +137 -0
  513. package/src/runtime/control-plane/execution/work-completion-authority.ts +31 -44
  514. package/src/runtime/control-plane/execution/work-delivery-service.ts +497 -0
  515. package/src/runtime/control-plane/execution/work-evidence-policy.ts +46 -53
  516. package/src/runtime/control-plane/execution/work-execution-support.ts +85 -164
  517. package/src/runtime/control-plane/execution/work-handle-authority.ts +349 -73
  518. package/src/runtime/control-plane/execution/work-handle-store.ts +55 -2
  519. package/src/runtime/control-plane/execution/work-head-settlement.ts +108 -0
  520. package/src/runtime/control-plane/execution/work-lifecycle-audit.ts +173 -28
  521. package/src/runtime/control-plane/execution/work-operation-service.ts +92 -40
  522. package/src/runtime/control-plane/execution/work-preparation-service.ts +145 -269
  523. package/src/runtime/control-plane/execution/work-remote-delivery.ts +2 -3
  524. package/src/runtime/control-plane/execution/work-revision-diff.ts +39 -0
  525. package/src/runtime/control-plane/execution/work-terminal-cleanup.ts +543 -225
  526. package/src/runtime/control-plane/execution/work-validation-reconciler.ts +59 -45
  527. package/src/runtime/control-plane/execution/work-verification-context.ts +1 -1
  528. package/src/runtime/control-plane/execution/work-verification-service.ts +662 -52
  529. package/src/runtime/control-plane/execution/work-verification-snapshot.ts +205 -16
  530. package/src/runtime/control-plane/facade/capability-registry.ts +380 -44
  531. package/src/runtime/control-plane/facade/check-normalization.ts +3 -9
  532. package/src/runtime/control-plane/facade/codex-delegation.ts +10 -11
  533. package/src/runtime/control-plane/facade/controller-connection.ts +135 -0
  534. package/src/runtime/control-plane/facade/controller-session-store.ts +2 -488
  535. package/src/runtime/control-plane/facade/goal-workloop-access.ts +6 -22
  536. package/src/runtime/control-plane/facade/goal-workloop.ts +565 -1202
  537. package/src/runtime/control-plane/facade/handoff-inbox-application.ts +145 -0
  538. package/src/runtime/control-plane/facade/handoff-inbox-store.ts +266 -52
  539. package/src/runtime/control-plane/facade/index.ts +4 -3
  540. package/src/runtime/control-plane/facade/operation-digest.ts +34 -73
  541. package/src/runtime/control-plane/facade/plan-contract-store.ts +671 -245
  542. package/src/runtime/control-plane/facade/policy-gate.ts +0 -23
  543. package/src/runtime/control-plane/facade/repository-work-admission.ts +31 -23
  544. package/src/runtime/control-plane/facade/requirement-authority.ts +121 -0
  545. package/src/runtime/control-plane/facade/requirement-board.ts +9 -4
  546. package/src/runtime/control-plane/facade/rh-work-operation-contract.ts +85 -0
  547. package/src/runtime/control-plane/facade/self-healing-loop.ts +18 -53
  548. package/src/runtime/control-plane/facade/semantic-admission.ts +8 -16
  549. package/src/runtime/control-plane/facade/suggested-actions.ts +15 -15
  550. package/src/runtime/control-plane/facade/types.ts +218 -620
  551. package/src/runtime/control-plane/facade/work-continuation.ts +8 -8
  552. package/src/runtime/control-plane/facade/work-contract-store.ts +2 -1043
  553. package/src/runtime/control-plane/generated-cache-retention.ts +336 -19
  554. package/src/runtime/control-plane/global-scheduler/autonomous-continuation.ts +248 -0
  555. package/src/runtime/control-plane/global-scheduler/durable-admission.ts +13 -2
  556. package/src/runtime/control-plane/global-scheduler/maintenance.ts +274 -84
  557. package/src/runtime/control-plane/global-scheduler/periodic-cleanup-entry.ts +55 -0
  558. package/src/runtime/control-plane/global-scheduler/periodic-cleanup-process.ts +98 -0
  559. package/src/runtime/control-plane/global-scheduler/reconciliation.ts +3 -2
  560. package/src/runtime/control-plane/global-scheduler/scheduler-worker-entry.ts +10 -0
  561. package/src/runtime/control-plane/global-scheduler/scheduler.ts +227 -109
  562. package/src/runtime/control-plane/global-scheduler/wake-signal.ts +42 -2
  563. package/src/runtime/control-plane/global-scheduler/worker-launch.ts +18 -6
  564. package/src/runtime/control-plane/governance/access-policy.ts +19 -2
  565. package/src/runtime/control-plane/governance/authorization.ts +20 -3
  566. package/src/runtime/control-plane/launcher/chatgpt-round-continuation.ts +160 -0
  567. package/src/runtime/control-plane/launcher/chatgpt-work-binding-store.ts +2 -177
  568. package/src/runtime/control-plane/launcher/chatgpt-work-continuation.ts +139 -670
  569. package/src/runtime/control-plane/launcher/local-conversation-controller.ts +238 -0
  570. package/src/runtime/control-plane/launcher/provider-mcp-bootstrap.ts +25 -6
  571. package/src/runtime/control-plane/launcher/thin-launcher.ts +96 -194
  572. package/src/runtime/control-plane/lifecycle-retention-metrics.ts +60 -0
  573. package/src/runtime/control-plane/persistence/cognition-store.ts +820 -0
  574. package/src/runtime/control-plane/persistence/experience-store.ts +302 -0
  575. package/src/runtime/control-plane/persistence/operational-prior-store.ts +348 -0
  576. package/src/runtime/control-plane/persistence/requirement-store.ts +230 -80
  577. package/src/runtime/control-plane/persistence/sqlite-store.ts +654 -78
  578. package/src/runtime/control-plane/persistence/workflow-content-store.ts +98 -0
  579. package/src/runtime/control-plane/persistence/workflow-registry-store.ts +186 -0
  580. package/src/runtime/control-plane/persistence/workflow-run-store.ts +123 -0
  581. package/src/runtime/control-plane/release-retention.ts +154 -26
  582. package/src/runtime/control-plane/repository-namespace-retention.ts +208 -0
  583. package/src/runtime/control-plane/runtime-cleanup.ts +844 -38
  584. package/src/runtime/control-plane/runtime-generation.ts +6 -0
  585. package/src/runtime/control-plane/workspace/project-onboarding.ts +80 -0
  586. package/src/runtime/control-plane/workspace/semantic-sync-service.ts +479 -0
  587. package/src/runtime/control-plane/workspace/workspace-store.ts +249 -0
  588. package/src/runtime/diagnostics/incident-repair.ts +573 -0
  589. package/src/runtime/diagnostics/mcp-timing.ts +239 -6
  590. package/src/runtime/diagnostics/performance.ts +6 -14
  591. package/src/runtime/diagnostics/read-only-tool.ts +1 -1
  592. package/src/runtime/evidence/artifact-store.ts +216 -35
  593. package/src/runtime/evidence/evidence-store.ts +112 -8
  594. package/src/runtime/evidence/operational-shadow.ts +38 -0
  595. package/src/runtime/evidence/output-handle-index.ts +225 -0
  596. package/src/runtime/evidence/process-check-receipt.ts +5 -43
  597. package/src/runtime/evidence/result-store.ts +158 -44
  598. package/src/runtime/evidence/sensitive-output.ts +4 -4
  599. package/src/runtime/execution/jobs/receipt-recovery.ts +1 -1
  600. package/src/runtime/execution/jobs/store.ts +124 -6
  601. package/src/runtime/execution/managed-workspace.ts +112 -5
  602. package/src/runtime/execution/process-runtime/canary.ts +19 -5
  603. package/src/runtime/execution/process-runtime/check-classification.ts +48 -0
  604. package/src/runtime/execution/process-runtime/check-facade.ts +24 -10
  605. package/src/runtime/execution/process-runtime/check-receipt.ts +1 -1
  606. package/src/runtime/execution/process-runtime/check-result-retention.ts +132 -0
  607. package/src/runtime/execution/process-runtime/check-result.ts +177 -2
  608. package/src/runtime/execution/process-runtime/check-runner-sidecar.ts +58 -9
  609. package/src/runtime/execution/process-runtime/check-storage.ts +187 -0
  610. package/src/runtime/execution/process-runtime/command-facade.ts +117 -114
  611. package/src/runtime/execution/process-runtime/gc.ts +15 -2
  612. package/src/runtime/execution/process-runtime/handle-index.ts +176 -0
  613. package/src/runtime/execution/process-runtime/host-command-lane.ts +139 -0
  614. package/src/runtime/execution/process-runtime/index.ts +4 -0
  615. package/src/runtime/execution/process-runtime/interactive-admission.ts +2 -1
  616. package/src/runtime/execution/process-runtime/lightweight-managed.ts +283 -73
  617. package/src/runtime/execution/process-runtime/persisted-check.ts +130 -23
  618. package/src/runtime/execution/process-runtime/process-runner-entry.ts +47 -5
  619. package/src/runtime/execution/process-runtime/process-scope.ts +160 -0
  620. package/src/runtime/execution/process-runtime/resource-claims.ts +125 -64
  621. package/src/runtime/execution/process-runtime/runtime.ts +167 -17
  622. package/src/runtime/execution/process-runtime/store.ts +30 -2
  623. package/src/runtime/execution/process-runtime/types.ts +27 -0
  624. package/src/runtime/execution/workers/executor.ts +18 -19
  625. package/src/runtime/execution/workers/worker-entry.ts +1 -1
  626. package/src/runtime/gateway/mcp/execution-tools.ts +2 -207
  627. package/src/runtime/gateway/mcp/legacy-ios-tool-adapter.ts +2 -61
  628. package/src/runtime/gateway/mcp/persisted-check-process.ts +2 -3
  629. package/src/runtime/gateway/mcp/process-tools.ts +2 -289
  630. package/src/runtime/gateway/mcp/router.ts +2 -1125
  631. package/src/runtime/gateway/mcp/runtime-tool-definitions.ts +2 -565
  632. package/src/runtime/gateway/mcp/runtime-tools.ts +2 -6655
  633. package/src/runtime/gateway/mcp/work-validation-reconciler.ts +2 -1
  634. package/src/runtime/maintenance/cleanup.ts +38 -24
  635. package/src/runtime/platform/browser-product-discovery.ts +174 -0
  636. package/src/runtime/platform/computer-platform.ts +14 -0
  637. package/src/runtime/platform/executable-discovery.ts +54 -0
  638. package/src/runtime/platform/fetch-http-server.ts +90 -0
  639. package/src/runtime/platform/service-inventory.ts +130 -0
  640. package/src/runtime/platform/service-manager.ts +146 -0
  641. package/src/runtime/platform/windows-host-discovery.ts +118 -0
  642. package/src/runtime/platform/windows-recovery-deployment.ts +67 -0
  643. package/src/runtime/plugins/action-application.ts +192 -0
  644. package/src/runtime/plugins/app-store-connect-adapter.ts +47 -35
  645. package/src/runtime/plugins/browser-adapter.ts +898 -135
  646. package/src/runtime/plugins/browser-automation-service.ts +33 -34
  647. package/src/runtime/plugins/browser-macos-bridge.ts +386 -46
  648. package/src/runtime/plugins/browser-manifest-surface.ts +75 -17
  649. package/src/runtime/plugins/browser-native-session-service.ts +64 -14
  650. package/src/runtime/plugins/browser-provider-registry.ts +2 -109
  651. package/src/runtime/plugins/browser-registration.ts +32 -0
  652. package/src/runtime/plugins/browser-runtime-contract.ts +2 -154
  653. package/src/runtime/plugins/browser-runtime.ts +55 -10
  654. package/src/runtime/plugins/browser-session-authority.ts +101 -291
  655. package/src/runtime/plugins/browser-session-legacy-migration.ts +203 -0
  656. package/src/runtime/plugins/browser-session-store.ts +243 -80
  657. package/src/runtime/plugins/browser-session-types.ts +2 -98
  658. package/src/runtime/plugins/capability-authorization-grants.ts +272 -59
  659. package/src/runtime/plugins/catalog-trust.ts +82 -0
  660. package/src/runtime/plugins/computer-chatgpt-browser-adapter-installer.ts +219 -0
  661. package/src/runtime/plugins/computer-chatgpt-macos-target.ts +891 -0
  662. package/src/runtime/plugins/computer-registration.ts +1050 -0
  663. package/src/runtime/plugins/config-store.ts +119 -0
  664. package/src/runtime/plugins/desktop-operator-external-policy.ts +964 -0
  665. package/src/runtime/plugins/desktop-operator-registration.ts +123 -12
  666. package/src/runtime/plugins/errors.ts +8 -1
  667. package/src/runtime/plugins/external-adapter.ts +82 -323
  668. package/src/runtime/plugins/external-provider-policy.ts +48 -0
  669. package/src/runtime/plugins/external-registration.ts +30 -2
  670. package/src/runtime/plugins/external-unix-socket-probe.cjs +9 -3
  671. package/src/runtime/plugins/external-unix-socket.ts +64 -193
  672. package/src/runtime/plugins/first-party-external-registration.ts +163 -0
  673. package/src/runtime/plugins/first-party-registry.ts +3 -1
  674. package/src/runtime/plugins/github-adapter.ts +1 -2
  675. package/src/runtime/plugins/gmail-adapter.ts +29 -8
  676. package/src/runtime/plugins/google-calendar-adapter.ts +8 -8
  677. package/src/runtime/plugins/google-shared.ts +45 -53
  678. package/src/runtime/plugins/google-tasks-adapter.ts +8 -8
  679. package/src/runtime/plugins/ios-adapter.ts +2 -3
  680. package/src/runtime/plugins/lightweight-action.ts +208 -2
  681. package/src/runtime/plugins/local-system-adapter.ts +192 -2
  682. package/src/runtime/plugins/macos-capability-broker.ts +15 -105
  683. package/src/runtime/plugins/managed-process-adapter.ts +12 -5
  684. package/src/runtime/plugins/plugin-action-sidecar.ts +17 -13
  685. package/src/runtime/plugins/plugin-management-adapter.ts +1 -1
  686. package/src/runtime/plugins/resend-adapter.ts +15 -24
  687. package/src/runtime/plugins/store.ts +1003 -387
  688. package/src/runtime/plugins/types.ts +28 -1
  689. package/src/runtime/plugins/uu-remote-rescue-registration.ts +155 -0
  690. package/src/runtime/plugins/windows-host-recovery-install.ts +68 -0
  691. package/src/runtime/plugins/windows-host-recovery-registration.ts +85 -0
  692. package/src/runtime/plugins/xiaohongshu-publish.ts +102 -430
  693. package/src/runtime/projections/controller-context.ts +12 -6
  694. package/src/runtime/projections/git-status-sampler.ts +73 -22
  695. package/src/runtime/projections/invalidation.ts +7 -3
  696. package/src/runtime/projections/materialized-view.ts +93 -43
  697. package/src/runtime/recovery/actions.ts +3 -3
  698. package/src/runtime/recovery/capability-action-application.ts +229 -0
  699. package/src/runtime/recovery/index.ts +3 -0
  700. package/src/runtime/recovery/lifecycle-inventory.ts +338 -0
  701. package/src/runtime/recovery/local-jobs-repair.ts +14 -14
  702. package/src/runtime/recovery/maintenance-executor.ts +701 -168
  703. package/src/runtime/recovery/quarantine-retention.ts +256 -0
  704. package/src/runtime/recovery/store.ts +29 -11
  705. package/src/runtime/release/identity.ts +6 -0
  706. package/src/runtime/release/release-coordinator.ts +296 -0
  707. package/src/runtime/release/release-session.ts +716 -0
  708. package/src/runtime/release/release-state-migration.ts +25 -0
  709. package/src/runtime/resources/leases/store.ts +56 -25
  710. package/src/runtime/root/active-execution-power-assertion.ts +139 -0
  711. package/src/runtime/root/assistant-learning-loop.ts +45 -0
  712. package/src/runtime/root/browser-session-composition.ts +59 -0
  713. package/src/runtime/root/computer-composition.ts +376 -0
  714. package/src/runtime/root/computer-target-composition.ts +16 -0
  715. package/src/runtime/root/computer-target-persistence.ts +39 -0
  716. package/src/runtime/root/controller-progression-composition.ts +192 -0
  717. package/src/runtime/root/controller-round-composition.ts +126 -0
  718. package/src/runtime/root/controller-services.ts +2 -0
  719. package/src/runtime/root/deployment-topology.ts +106 -0
  720. package/src/runtime/root/entry.ts +8 -6
  721. package/src/runtime/root/gateway-adapter.ts +3 -3
  722. package/src/runtime/root/known-good-recovery.ts +184 -0
  723. package/src/runtime/root/local-bridge.ts +5 -3
  724. package/src/runtime/root/mcp-transport.ts +116 -23
  725. package/src/runtime/root/ownership.ts +261 -9
  726. package/src/runtime/root/package-connector-service.ts +212 -74
  727. package/src/runtime/root/package-runtime-release.ts +199 -33
  728. package/src/runtime/root/package-runtime-service.ts +77 -108
  729. package/src/runtime/root/release-execution-canary.ts +103 -0
  730. package/src/runtime/root/release-loader.ts +150 -0
  731. package/src/runtime/root/release-manifest.ts +185 -7
  732. package/src/runtime/root/release-materialize.ts +474 -31
  733. package/src/runtime/root/release-store.ts +425 -37
  734. package/src/runtime/root/runtime-lane.ts +191 -0
  735. package/src/runtime/root/runtime.ts +379 -32
  736. package/src/runtime/root/scheduled-controller-composition.ts +76 -0
  737. package/src/runtime/root/scheduler.ts +12 -4
  738. package/src/runtime/root/service-runner.ts +3 -3
  739. package/src/runtime/root/service.ts +73 -45
  740. package/src/runtime/root/status.ts +49 -0
  741. package/src/runtime/root/types.ts +55 -3
  742. package/src/runtime/root/workflow-supervisor-composition.ts +493 -0
  743. package/src/runtime/root/workflow-supervisor-runtime.ts +209 -0
  744. package/src/runtime/root/write-fence.ts +50 -2
  745. package/src/runtime/safe-tooling/google-credential-store.ts +76 -21
  746. package/src/runtime/safe-tooling/google-oauth-broker.ts +25 -7
  747. package/src/runtime/safe-tooling/workspace-auth.ts +1 -1
  748. package/src/runtime/shared/bounded-child-supervisor.ts +9 -1
  749. package/src/runtime/shared/local-bridge-surface.ts +1 -1
  750. package/src/runtime/shared/process-environment.ts +36 -10
  751. package/src/runtime/shared/response-budget.ts +1 -3
  752. package/src/runtime/shared/storage-capacity.ts +68 -0
  753. package/src/runtime/standalone-recovery/controller-home-migration.ts +1108 -0
  754. package/src/runtime/standalone-recovery/core.ts +4609 -495
  755. package/src/runtime/standalone-recovery/entry.ts +642 -81
  756. package/src/runtime/standalone-recovery/independent-host-rescue.ts +172 -0
  757. package/src/runtime/standalone-recovery/installer.ts +399 -177
  758. package/src/runtime/standalone-recovery/mcp-server.ts +79 -0
  759. package/src/runtime/standalone-recovery/mutation-identity-contract.ts +21 -0
  760. package/src/runtime/standalone-recovery/operation-lock.ts +160 -0
  761. package/src/runtime/standalone-recovery/performance.ts +173 -0
  762. package/src/runtime/standalone-recovery/release.ts +58 -5
  763. package/src/runtime/standalone-recovery/service-labels.ts +5 -2
  764. package/src/runtime/standalone-recovery/watchdog-heartbeat.ts +5 -2
  765. package/src/runtime/watchdog/workflow-watchdog.ts +1 -1
  766. package/src/runtime/workflow/schedules/browser-probe.ts +17 -6
  767. package/src/runtime/workflow/schedules/chatgpt-automation-migration.ts +11 -4
  768. package/src/runtime/workflow/schedules/engine.ts +298 -484
  769. package/src/runtime/workflow/schedules/pending-activation.ts +1 -1
  770. package/src/runtime/workflow/schedules/settlement.ts +2 -191
  771. package/src/runtime/workflow/schedules/store.ts +2 -607
  772. package/src/runtime/workflow/schedules/types.ts +2 -127
  773. package/src/runtime/workflow/schedules/work-continuation.ts +220 -16
  774. package/src/runtime/workflows/first-party/xiaohongshu.ts +122 -0
  775. package/src/runtime/workflows/runtime.ts +482 -0
  776. package/src/testing/test-governance.ts +95 -30
  777. package/supervisor/chatgpt-conversation.ts +23 -0
  778. package/supervisor/client.ts +201 -0
  779. package/supervisor/control-plane.ts +868 -0
  780. package/supervisor/entry.ts +15 -0
  781. package/supervisor/forge-validators.ts +80 -0
  782. package/supervisor/index.ts +5 -0
  783. package/supervisor/native-browser-adapter.ts +786 -0
  784. package/supervisor/native-messaging/host.ts +39 -0
  785. package/supervisor/native-messaging/manifest.ts +26 -0
  786. package/supervisor/native-messaging/protocol.ts +27 -0
  787. package/supervisor/paths.ts +18 -0
  788. package/supervisor/protocol.ts +202 -0
  789. package/supervisor/server.ts +404 -0
  790. package/supervisor/store.ts +1451 -0
  791. package/supervisor/tsconfig.json +8 -0
  792. package/supervisor/types.ts +255 -0
  793. package/assets/templates/helpers/archive-architecture-request.sh +0 -244
  794. package/docs/architecture/history/README.md +0 -7
  795. package/docs/architecture/history/chatgpt-handoff-facade.md +0 -397
  796. package/docs/architecture/history/global-hook-runtime.md +0 -166
  797. package/docs/architecture/history/ios-semantic-automation-provider-v2.md +0 -170
  798. package/docs/architecture/requests/archive/2026/20260528-154740-ai-hooks-ai-hooks-hook-input-sh.md +0 -59
  799. package/docs/architecture/requests/archive/2026/20260528-154816-assets-hooks-assets-hooks-hook-input-sh.md +0 -59
  800. package/docs/architecture/requests/archive/2026/20260528-161851-ai-harness-workflow-contract-json-ai-harness-workflow-contract-json.md +0 -59
  801. package/docs/architecture/requests/archive/2026/20260528-161853-scripts-check-task-workflow-sh-scripts-check-task-workflow-sh.md +0 -59
  802. package/docs/architecture/requests/archive/2026/20260528-161911-assets-workflow-contract-v1-json-assets-workflow-contract-v1-json.md +0 -59
  803. package/docs/architecture/requests/archive/2026/20260528-222416-ai-hooks-ai-hooks-hook-input-sh.md +0 -59
  804. package/docs/architecture/requests/archive/2026/20260528-222444-ai-hooks-ai-hooks-pre-edit-guard-sh.md +0 -59
  805. package/docs/architecture/requests/archive/2026/20260528-222457-ai-hooks-ai-hooks-pre-edit-guard-sh.md +0 -59
  806. package/docs/architecture/requests/archive/2026/20260528-222648-ai-hooks-ai-hooks-pre-edit-guard-sh.md +0 -59
  807. package/docs/architecture/requests/archive/2026/20260528-222705-ai-hooks-ai-hooks-worktree-guard-sh.md +0 -59
  808. package/docs/architecture/requests/archive/2026/20260528-222726-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -59
  809. package/docs/architecture/requests/archive/2026/20260528-222727-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -59
  810. package/docs/architecture/requests/archive/2026/20260528-224736-ai-hooks-ai-hooks-hook-input-sh.md +0 -59
  811. package/docs/architecture/requests/archive/2026/20260528-233259-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -59
  812. package/docs/architecture/requests/archive/2026/20260528-233335-assets-hooks-assets-hooks-prompt-guard-sh.md +0 -59
  813. package/docs/architecture/requests/archive/2026/20260528-233456-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -59
  814. package/docs/architecture/requests/archive/2026/20260528-233457-assets-hooks-assets-hooks-prompt-guard-sh.md +0 -59
  815. package/docs/architecture/requests/archive/2026/20260528-233637-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -59
  816. package/docs/architecture/requests/archive/2026/20260528-233638-assets-hooks-assets-hooks-prompt-guard-sh.md +0 -59
  817. package/docs/architecture/requests/archive/2026/20260529-000322-root-package-json.md +0 -59
  818. package/docs/architecture/requests/archive/2026/20260529-004238-ai-hooks-ai-hooks-lib-workflow-state-sh.md +0 -59
  819. package/docs/architecture/requests/archive/2026/20260529-020654-ai-harness-policy-json-ai-harness-policy-json.md +0 -63
  820. package/docs/architecture/requests/archive/2026/20260529-094236-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -60
  821. package/docs/architecture/requests/archive/2026/20260529-094323-assets-hooks-assets-hooks-prompt-guard-sh.md +0 -60
  822. package/docs/architecture/requests/archive/2026/20260529-094331-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -60
  823. package/docs/architecture/requests/archive/2026/20260529-094339-assets-hooks-assets-hooks-prompt-guard-sh.md +0 -60
  824. package/docs/architecture/requests/archive/2026/20260529-094430-assets-hooks-assets-hooks-session-start-context-sh.md +0 -60
  825. package/docs/architecture/requests/archive/2026/20260529-094446-ai-hooks-ai-hooks-session-start-context-sh.md +0 -60
  826. package/docs/architecture/requests/archive/2026/20260613-002040-runtime-harness-hook-adapters.md +0 -68
  827. package/docs/architecture/requests/archive/2026/root.md +0 -68
  828. package/docs/architecture/requests/archive/2026/runtime-harness-hook-adapters.md +0 -76
  829. package/docs/architecture/requests/archive/2026/verification-evals-checks.md +0 -68
  830. package/docs/architecture/requests/archive/2026/workflow-engine-contract-assets.md +0 -69
  831. package/scripts/archive-architecture-request.sh +0 -4
  832. package/scripts/benchmark-background-check-overlap.ts +0 -228
  833. package/scripts/benchmark-controller-hotpath.ts +0 -212
  834. package/scripts/benchmark-controller-round2.ts +0 -139
  835. package/scripts/benchmark-ios-agent-device.ts +0 -514
  836. package/scripts/benchmark-mcp-host.sh +0 -117
  837. package/scripts/benchmark-mcp-transport.ts +0 -170
  838. package/scripts/benchmark-quality-harness.ts +0 -146
  839. package/scripts/benchmark-route-session-concurrency.ts +0 -915
  840. package/scripts/benchmark-thin-harness-gateway-ab.ts +0 -632
  841. package/scripts/benchmark-thin-harness-mcp-e2e.ts +0 -498
  842. package/scripts/benchmark-thin-harness.ts +0 -251
  843. package/scripts/benchmark-typescript-navigation.ts +0 -186
  844. package/scripts/benchmark-work-efficiency.ts +0 -334
  845. package/scripts/build-controller-ui.ts +0 -28
  846. package/scripts/check-npm-release.sh +0 -32
  847. package/scripts/check-public-release-surface.sh +0 -19
  848. package/scripts/check-release-published.sh +0 -57
  849. package/scripts/check-release-readiness.sh +0 -37
  850. package/scripts/check-release-version.mjs +0 -74
  851. package/scripts/check-tarball-install-smoke.sh +0 -67
  852. package/scripts/package-source-archive.sh +0 -147
  853. package/scripts/public-release-files.txt +0 -39
  854. package/scripts/public-release.ts +0 -174
  855. package/scripts/publish-release-tarball.sh +0 -27
  856. package/scripts/route-nl-vs-ts-eval.ts +0 -679
  857. package/scripts/run-skill-evals.ts +0 -1022
  858. package/scripts/stage-runtime-release.ts +0 -39
  859. package/src/cli/controller/progress.ts +0 -656
  860. package/src/cli/controller/work-mode.ts +0 -181
  861. package/src/cli/local-bridge/console-assets.ts +0 -17
  862. package/src/cli/local-bridge/dashboard.ts +0 -17
  863. package/src/cli/local-bridge/frontend/src/App.tsx +0 -10
  864. package/src/cli/local-bridge/frontend/src/components/Button.tsx +0 -1
  865. package/src/cli/local-bridge/frontend/src/components/DetailPane.tsx +0 -3
  866. package/src/cli/local-bridge/frontend/src/components/SearchField.tsx +0 -1
  867. package/src/cli/local-bridge/frontend/src/components/SectionHeader.tsx +0 -1
  868. package/src/cli/local-bridge/frontend/src/components/Segmented.tsx +0 -1
  869. package/src/cli/local-bridge/frontend/src/components/StatusText.tsx +0 -3
  870. package/src/cli/local-bridge/frontend/src/design/icons.tsx +0 -11
  871. package/src/cli/local-bridge/frontend/src/design/tokens.css +0 -8
  872. package/src/cli/local-bridge/frontend/src/features/automations/AutomationsView.tsx +0 -153
  873. package/src/cli/local-bridge/frontend/src/features/capabilities/CapabilitiesView.tsx +0 -37
  874. package/src/cli/local-bridge/frontend/src/features/overview/OverviewView.tsx +0 -183
  875. package/src/cli/local-bridge/frontend/src/features/repositories/RepositoriesView.tsx +0 -2
  876. package/src/cli/local-bridge/frontend/src/features/system/SystemView.tsx +0 -2
  877. package/src/cli/local-bridge/frontend/src/features/work/WorkView.tsx +0 -4
  878. package/src/cli/local-bridge/frontend/src/lib/api.ts +0 -30
  879. package/src/cli/local-bridge/frontend/src/lib/format.ts +0 -4
  880. package/src/cli/local-bridge/frontend/src/lib/routes.ts +0 -7
  881. package/src/cli/local-bridge/frontend/src/main.tsx +0 -1
  882. package/src/cli/local-bridge/frontend/src/shell/AppShell.tsx +0 -1
  883. package/src/cli/local-bridge/frontend/src/shell/CommandBar.tsx +0 -2
  884. package/src/cli/local-bridge/frontend/src/shell/Sidebar.tsx +0 -4
  885. package/src/cli/local-bridge/frontend/src/styles.css +0 -28
  886. package/src/cli/local-bridge/frontend/src/types.ts +0 -15
  887. package/src/cli/local-bridge/frontend/src/vite-env.d.ts +0 -1
  888. package/src/cli/local-bridge/frontend/vite.config.ts +0 -27
  889. package/src/cli/local-bridge/ui-dist/app.css +0 -1
  890. package/src/cli/local-bridge/ui-dist/app.js +0 -11228
  891. package/src/runtime/control-plane/execution/direct-edit-work-completion.ts +0 -385
  892. package/src/runtime/control-plane/execution/work-finalization-service.ts +0 -1913
  893. package/src/runtime/control-plane/execution/work-path-scope.ts +0 -37
  894. package/src/runtime/control-plane/execution/work-task-receipt.ts +0 -449
  895. package/src/runtime/control-plane/facade/controller-round-relay.ts +0 -1118
  896. package/src/runtime/control-plane/facade/work-admission-policy.ts +0 -93
  897. package/src/runtime/control-plane/facade/work-task-projection.ts +0 -66
  898. package/src/runtime/control-plane/routing/index.ts +0 -1
  899. package/src/runtime/control-plane/routing/route-policy.ts +0 -382
  900. package/src/runtime/control-plane/routing/workspace-admission.ts +0 -70
@@ -1,11 +1,15 @@
1
1
  import { randomUUID } from 'crypto';
2
2
  import { statSync } from 'fs';
3
- import { dirname } from 'path';
4
- import { Client } from '@modelcontextprotocol/sdk/client/index.js';
5
- import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
3
+ import { writeJsonAtomic } from '../shared/json-files';
4
+ import { ensureForgeInstanceIdentity } from '../../../packages/kernel/identity/api/index';
5
+ import { dirname, join } from 'path';
6
+ import { Client, StreamableHTTPClientTransport } from "@modelcontextprotocol/client";
6
7
  import type { ControlPlaneDatabaseInspection } from '../control-plane/persistence/sqlite-store';
7
- import { inspectControlPlaneDatabase } from '../control-plane/persistence/sqlite-store';
8
- import { activateExclusiveWorkAdmission } from '../control-plane/facade/work-admission-policy';
8
+ import {
9
+ disableControlPlaneReadConnectionReuse,
10
+ enableControlPlaneReadConnectionReuse,
11
+ inspectControlPlaneDatabase,
12
+ } from '../control-plane/persistence/sqlite-store';
9
13
  import { closeCodeGraphReadProviderSessions } from '../context/codegraph-read-provider';
10
14
  import { cancelAllLightweightProcesses } from '../execution/process-runtime/lightweight-managed';
11
15
  import {
@@ -17,27 +21,41 @@ import { createRuntimeGatewayServer, runtimeGatewayToolSurfaceFingerprint } from
17
21
  import { startRuntimeMcpTransport, type RuntimeMcpTransportHandle } from './mcp-transport';
18
22
  import { acquireRuntimeOwnership, type RuntimeOwnershipHandle } from './ownership';
19
23
  import { RuntimeReadinessState } from './readiness';
20
- import { loadRuntimeReleaseManifest } from './release-manifest';
21
- import { ensureActiveRuntimeRelease, type RuntimeReleaseAuthority } from './release-store';
24
+ import { loadRuntimeReleaseManifest, requireCompleteCompiledRuntimeReleaseManifest } from './release-manifest';
25
+ import { ensureActiveRuntimeRelease, readRuntimeReleaseAuthority, type RuntimeReleaseAuthority } from './release-store';
26
+ import { migrateReleaseDurableState } from '../release/release-state-migration';
22
27
  import { bindRuntimeWriteClaim, clearRuntimeWriteClaim } from './write-fence';
23
28
  import { startInProcessScheduler, type RuntimeSchedulerHandle } from './scheduler';
24
29
  import { startConfiguredRuntimeLocalBridge, type RuntimeLocalBridgeHandle } from './local-bridge';
25
- import { removeRuntimeStatusSnapshot, writeRuntimeStatusSnapshot } from './status';
30
+ import { startActiveExecutionPowerAssertion, type RuntimePowerAssertionHandle } from './active-execution-power-assertion';
31
+ import { startWorkflowSupervisorRuntime, type RuntimeWorkflowSupervisorHandle } from './workflow-supervisor-runtime';
32
+ import { normalizeRuntimeDeploymentTopology, type RuntimeDeploymentTopology } from './deployment-topology';
33
+ import { removeRuntimeStartupFailureEvidence, removeRuntimeStatusSnapshot, writeRuntimeStartupFailureEvidence, writeRuntimeStatusSnapshot } from './status';
26
34
  import type {
27
35
  CanonicalRuntimeConfig,
36
+ CanonicalRuntimeStatusSnapshot,
28
37
  RuntimeExitEvidence,
29
38
  RuntimeReadiness,
30
39
  RuntimeReleaseManifest,
31
40
  } from './types';
32
41
 
42
+ export interface RuntimeReleaseAuthorityMonitor {
43
+ stop(): void;
44
+ }
45
+
33
46
  export interface CanonicalRuntimeDependencies {
34
47
  loadReleaseManifest(path: string, controllerHome: string): RuntimeReleaseManifest;
48
+ migrateReleaseState(controllerHome: string): void;
35
49
  ensureReleaseAuthority(controllerHome: string, manifestPath: string): RuntimeReleaseAuthority;
50
+ readReleaseAuthority(controllerHome: string): RuntimeReleaseAuthority | undefined;
51
+ startReleaseAuthorityMonitor(observe: () => void): RuntimeReleaseAuthorityMonitor;
36
52
  bindWriteClaim(input: { controllerHome: string; owner: RuntimeOwnershipHandle['record']; authority: RuntimeReleaseAuthority }): void;
37
53
  acquireOwnership(controllerHome: string, runtimeInstanceId: string): RuntimeOwnershipHandle;
38
54
  inspectDatabase(controllerHome: string): ControlPlaneDatabaseInspection;
39
- startScheduler(controllerHome: string, timeoutMs?: number): RuntimeSchedulerHandle;
40
- startLocalBridge(input: { controllerHome: string; repositoryRoot: string }): Promise<RuntimeLocalBridgeHandle | undefined>;
55
+ startScheduler(input: Parameters<typeof startInProcessScheduler>[0]): RuntimeSchedulerHandle;
56
+ startLocalBridge(input: { controllerHome: string; repositoryRoot?: string }): Promise<RuntimeLocalBridgeHandle | undefined>;
57
+ startPowerAssertion(input: { controllerHome: string; runtimePid: number }): RuntimePowerAssertionHandle;
58
+ startWorkflowSupervisor(controllerHome: string, options?: { nativeBrowserAdapter?: boolean }): Promise<RuntimeWorkflowSupervisorHandle>;
41
59
  startTransport(options: Parameters<typeof startRuntimeMcpTransport>[0]): Promise<RuntimeMcpTransportHandle>;
42
60
  runMcpProbe(endpoint: string, authToken: string): Promise<void>;
43
61
  collectRuntimeSourceIdentity: typeof collectRuntimeSourceIdentity;
@@ -45,6 +63,21 @@ export interface CanonicalRuntimeDependencies {
45
63
  stopLightweightProcesses(controllerHome: string): Promise<number>;
46
64
  stopContextReadHelpers(): Promise<void>;
47
65
  computeToolSurfaceFingerprint: typeof runtimeGatewayToolSurfaceFingerprint;
66
+ ensureForgeInstanceIdentity: typeof ensureForgeInstanceIdentity;
67
+ captureJscSamplingProfile(options: { durationMs: number; sampleIntervalUs: number }): Promise<{
68
+ requestedDurationMs: number;
69
+ elapsedMs: number;
70
+ sampleIntervalUs: number;
71
+ functions: string;
72
+ bytecodes: string;
73
+ stackTraces: {
74
+ interval: number | null;
75
+ totalTraceCount: number;
76
+ retainedTraceCount: number;
77
+ traces: Array<{ timestamp: number | null; frames: Array<Record<string, unknown>> }>;
78
+ sources: Array<Record<string, unknown>>;
79
+ };
80
+ }>;
48
81
  }
49
82
 
50
83
  async function defaultMcpProbe(endpoint: string, authToken: string): Promise<void> {
@@ -70,14 +103,94 @@ async function defaultMcpProbe(endpoint: string, authToken: string): Promise<voi
70
103
  }
71
104
  }
72
105
 
106
+ const DEFAULT_RELEASE_AUTHORITY_MONITOR_INTERVAL_MS = 1_000;
107
+ const JSC_SAMPLING_DURATION_MS = 2_000;
108
+ const JSC_SAMPLING_INTERVAL_US = 1_000;
109
+ const JSC_SAMPLING_TRACE_LIMIT = 2_000;
110
+ const JSC_SAMPLING_FRAME_LIMIT = 32;
111
+ const JSC_SAMPLING_SOURCE_LIMIT = 512;
112
+ const JSC_SAMPLING_REPORT_CHAR_LIMIT = 128 * 1024;
113
+
114
+ function startDefaultReleaseAuthorityMonitor(observe: () => void): RuntimeReleaseAuthorityMonitor {
115
+ const timer = setInterval(observe, DEFAULT_RELEASE_AUTHORITY_MONITOR_INTERVAL_MS);
116
+ timer.unref?.();
117
+ return { stop: () => clearInterval(timer) };
118
+ }
119
+
120
+ async function captureDefaultJscSamplingProfile(options: { durationMs: number; sampleIntervalUs: number }): Promise<{
121
+ requestedDurationMs: number;
122
+ elapsedMs: number;
123
+ sampleIntervalUs: number;
124
+ functions: string;
125
+ bytecodes: string;
126
+ stackTraces: {
127
+ interval: number | null;
128
+ totalTraceCount: number;
129
+ retainedTraceCount: number;
130
+ traces: Array<{ timestamp: number | null; frames: Array<Record<string, unknown>> }>;
131
+ sources: Array<Record<string, unknown>>;
132
+ };
133
+ }> {
134
+ const { profile } = await import('bun:jsc');
135
+ const startedAt = performance.now();
136
+ const sampling = await profile(
137
+ () => new Promise<void>((resolve) => setTimeout(resolve, options.durationMs)),
138
+ options.sampleIntervalUs,
139
+ );
140
+ // Bun's current runtime returns an object here even though bun-types still
141
+ // declares SamplingProfile.stackTraces as string[]. Treat the runtime value
142
+ // as diagnostic input and normalize it defensively instead of trusting that
143
+ // stale declaration at the production boundary.
144
+ const rawStackTraces = sampling.stackTraces as unknown as {
145
+ interval?: unknown;
146
+ traces?: unknown;
147
+ sources?: unknown;
148
+ };
149
+ const rawTraces = Array.isArray(rawStackTraces?.traces) ? rawStackTraces.traces : [];
150
+ const traces = rawTraces.slice(-JSC_SAMPLING_TRACE_LIMIT).map((trace) => {
151
+ const record = trace && typeof trace === 'object' && !Array.isArray(trace)
152
+ ? trace as Record<string, unknown>
153
+ : {};
154
+ const frames = Array.isArray(record.frames)
155
+ ? record.frames.filter((frame): frame is Record<string, unknown> => Boolean(frame) && typeof frame === 'object' && !Array.isArray(frame)).slice(0, JSC_SAMPLING_FRAME_LIMIT)
156
+ : [];
157
+ return {
158
+ timestamp: typeof record.timestamp === 'number' ? record.timestamp : null,
159
+ frames,
160
+ };
161
+ });
162
+ const sources = Array.isArray(rawStackTraces?.sources)
163
+ ? rawStackTraces.sources.filter((source): source is Record<string, unknown> => Boolean(source) && typeof source === 'object' && !Array.isArray(source)).slice(0, JSC_SAMPLING_SOURCE_LIMIT)
164
+ : [];
165
+ return {
166
+ requestedDurationMs: options.durationMs,
167
+ elapsedMs: Math.max(0, performance.now() - startedAt),
168
+ sampleIntervalUs: options.sampleIntervalUs,
169
+ functions: sampling.functions.slice(0, JSC_SAMPLING_REPORT_CHAR_LIMIT),
170
+ bytecodes: sampling.bytecodes.slice(0, JSC_SAMPLING_REPORT_CHAR_LIMIT),
171
+ stackTraces: {
172
+ interval: typeof rawStackTraces?.interval === 'number' ? rawStackTraces.interval : null,
173
+ totalTraceCount: rawTraces.length,
174
+ retainedTraceCount: traces.length,
175
+ traces,
176
+ sources,
177
+ },
178
+ };
179
+ }
180
+
73
181
  const DEFAULT_DEPENDENCIES: CanonicalRuntimeDependencies = {
74
182
  loadReleaseManifest: loadRuntimeReleaseManifest,
183
+ migrateReleaseState: migrateReleaseDurableState,
75
184
  ensureReleaseAuthority: ensureActiveRuntimeRelease,
185
+ readReleaseAuthority: readRuntimeReleaseAuthority,
186
+ startReleaseAuthorityMonitor: startDefaultReleaseAuthorityMonitor,
76
187
  bindWriteClaim: (input) => { bindRuntimeWriteClaim(input); },
77
188
  acquireOwnership: acquireRuntimeOwnership,
78
189
  inspectDatabase: inspectControlPlaneDatabase,
79
190
  startScheduler: startInProcessScheduler,
80
191
  startLocalBridge: startConfiguredRuntimeLocalBridge,
192
+ startPowerAssertion: startActiveExecutionPowerAssertion,
193
+ startWorkflowSupervisor: startWorkflowSupervisorRuntime,
81
194
  startTransport: startRuntimeMcpTransport,
82
195
  runMcpProbe: defaultMcpProbe,
83
196
  collectRuntimeSourceIdentity,
@@ -85,24 +198,35 @@ const DEFAULT_DEPENDENCIES: CanonicalRuntimeDependencies = {
85
198
  stopLightweightProcesses: cancelAllLightweightProcesses,
86
199
  stopContextReadHelpers: closeCodeGraphReadProviderSessions,
87
200
  computeToolSurfaceFingerprint: runtimeGatewayToolSurfaceFingerprint,
201
+ ensureForgeInstanceIdentity,
202
+ captureJscSamplingProfile: captureDefaultJscSamplingProfile,
88
203
  };
89
204
 
90
205
  export class CanonicalForgeRuntime {
206
+ readonly forgeInstanceId: string;
91
207
  readonly runtimeInstanceId: string;
208
+ readonly topology: RuntimeDeploymentTopology;
92
209
  private readonly readinessState = new RuntimeReadinessState();
93
210
  private readonly dependencies: CanonicalRuntimeDependencies;
94
211
  private ownership?: RuntimeOwnershipHandle;
95
212
  private scheduler?: RuntimeSchedulerHandle;
96
213
  private localBridge?: RuntimeLocalBridgeHandle;
214
+ private powerAssertion?: RuntimePowerAssertionHandle;
215
+ private workflowSupervisor?: RuntimeWorkflowSupervisorHandle;
97
216
  private toolSurfaceFingerprint?: string;
98
217
  private transport?: RuntimeMcpTransportHandle;
99
218
  private controller?: RuntimeControllerServices;
100
219
  private release?: RuntimeReleaseManifest;
220
+ private releaseAuthorityMonitor?: RuntimeReleaseAuthorityMonitor;
101
221
  private stopPromise?: Promise<void>;
102
222
  private stoppedResolve!: () => void;
103
223
  private readonly stopped = new Promise<void>((resolve) => { this.stoppedResolve = resolve; });
104
224
  private started = false;
105
225
  private stopping = false;
226
+ private jscHeapDiagnosticsSignalHandler?: () => void;
227
+ private jscHeapDiagnosticsCaptureInFlight = false;
228
+ private jscSamplingProfilerSignalHandler?: () => void;
229
+ private jscSamplingProfileCaptureInFlight = false;
106
230
  lastExit?: RuntimeExitEvidence;
107
231
 
108
232
  constructor(
@@ -110,13 +234,15 @@ export class CanonicalForgeRuntime {
110
234
  dependencies: Partial<CanonicalRuntimeDependencies> = {},
111
235
  ) {
112
236
  this.runtimeInstanceId = config.runtimeInstanceId?.trim() || `runtime_${randomUUID().replaceAll('-', '')}`;
237
+ this.topology = normalizeRuntimeDeploymentTopology(config.topology);
113
238
  this.dependencies = { ...DEFAULT_DEPENDENCIES, ...dependencies };
114
239
  if (!config.controllerHome.trim()) throw new Error('RUNTIME_CONFIG_REQUIRED: controllerHome');
115
- if (!config.repositoryRoot.trim()) throw new Error('RUNTIME_CONFIG_REQUIRED: repositoryRoot');
116
- try {
117
- if (!statSync(config.repositoryRoot).isDirectory()) throw new Error('not a directory');
118
- } catch {
119
- throw new Error('RUNTIME_CONFIG_INVALID: repositoryRoot must be an existing directory');
240
+ if (config.repositoryRoot?.trim()) {
241
+ try {
242
+ if (!statSync(config.repositoryRoot).isDirectory()) throw new Error('not a directory');
243
+ } catch {
244
+ throw new Error('RUNTIME_CONFIG_INVALID: repositoryRoot must be an existing directory');
245
+ }
120
246
  }
121
247
  if (!config.releaseManifestPath.trim()) throw new Error('RUNTIME_CONFIG_REQUIRED: releaseManifestPath');
122
248
  if (!config.host.trim()) throw new Error('RUNTIME_CONFIG_REQUIRED: host');
@@ -124,17 +250,136 @@ export class CanonicalForgeRuntime {
124
250
  throw new Error('RUNTIME_CONFIG_INVALID: port');
125
251
  }
126
252
  if (!config.authToken.trim()) throw new Error('RUNTIME_CONFIG_REQUIRED: authToken');
253
+ this.forgeInstanceId = this.dependencies.ensureForgeInstanceIdentity({
254
+ controllerHome: config.controllerHome,
255
+ preferredInstanceId: process.env.FORGE_INSTANCE_ID?.trim(),
256
+ }).instanceId;
127
257
  }
128
258
 
129
259
  readiness(): RuntimeReadiness {
130
260
  return this.readinessState.snapshot();
131
261
  }
132
262
 
263
+ private installJscHeapDiagnosticsSignal(): void {
264
+ if (process.platform === 'win32' || this.jscHeapDiagnosticsSignalHandler) return;
265
+ const handler = () => {
266
+ if (this.jscHeapDiagnosticsCaptureInFlight) return;
267
+ this.jscHeapDiagnosticsCaptureInFlight = true;
268
+ void import('bun:jsc').then(({ fullGC, heapStats, memoryUsage }) => {
269
+ const gcStartedAt = performance.now();
270
+ const fullGcResult = fullGC();
271
+ const fullGcDurationMs = Math.max(0, performance.now() - gcStartedAt);
272
+ const heap = heapStats();
273
+ const topTypes = (counts: Record<string, number>, limit: number) => Object.entries(counts)
274
+ .sort((left, right) => right[1] - left[1])
275
+ .slice(0, limit)
276
+ .map(([type, count]) => ({ type, count }));
277
+ writeJsonAtomic(join(this.config.controllerHome, 'diagnostics', 'jsc-heap.json'), {
278
+ schemaVersion: 1,
279
+ capturedAt: new Date().toISOString(),
280
+ pid: process.pid,
281
+ runtimeInstanceId: this.runtimeInstanceId,
282
+ releaseId: this.release?.releaseId,
283
+ gc: {
284
+ forced: true,
285
+ kind: 'full',
286
+ durationMs: fullGcDurationMs,
287
+ result: fullGcResult,
288
+ },
289
+ heap: {
290
+ heapSize: heap.heapSize,
291
+ heapCapacity: heap.heapCapacity,
292
+ extraMemorySize: heap.extraMemorySize,
293
+ objectCount: heap.objectCount,
294
+ protectedObjectCount: heap.protectedObjectCount,
295
+ globalObjectCount: heap.globalObjectCount,
296
+ protectedGlobalObjectCount: heap.protectedGlobalObjectCount,
297
+ objectTypeCount: Object.keys(heap.objectTypeCounts).length,
298
+ protectedObjectTypeCount: Object.keys(heap.protectedObjectTypeCounts).length,
299
+ topObjectTypes: topTypes(heap.objectTypeCounts, 100),
300
+ topProtectedObjectTypes: topTypes(heap.protectedObjectTypeCounts, 50),
301
+ },
302
+ memoryUsage: memoryUsage(),
303
+ });
304
+ }).catch((error) => {
305
+ process.stderr.write(`${JSON.stringify({
306
+ event: 'forge_runtime_jsc_heap_diagnostics_failed',
307
+ runtimeInstanceId: this.runtimeInstanceId,
308
+ message: error instanceof Error ? error.message : String(error),
309
+ observedAt: new Date().toISOString(),
310
+ })}\n`);
311
+ }).finally(() => {
312
+ this.jscHeapDiagnosticsCaptureInFlight = false;
313
+ });
314
+ };
315
+ process.on('SIGUSR2', handler);
316
+ this.jscHeapDiagnosticsSignalHandler = handler;
317
+ }
318
+
319
+ private removeJscHeapDiagnosticsSignal(): void {
320
+ const handler = this.jscHeapDiagnosticsSignalHandler;
321
+ if (!handler) return;
322
+ process.off('SIGUSR2', handler);
323
+ this.jscHeapDiagnosticsSignalHandler = undefined;
324
+ }
325
+
326
+ private installJscSamplingProfilerSignal(): void {
327
+ if (process.platform === 'win32' || this.jscSamplingProfilerSignalHandler) return;
328
+ const handler = () => {
329
+ if (this.jscSamplingProfileCaptureInFlight) return;
330
+ this.jscSamplingProfileCaptureInFlight = true;
331
+ void this.dependencies.captureJscSamplingProfile({
332
+ durationMs: JSC_SAMPLING_DURATION_MS,
333
+ sampleIntervalUs: JSC_SAMPLING_INTERVAL_US,
334
+ }).then((sampling) => {
335
+ const path = join(this.config.controllerHome, 'diagnostics', 'jsc-sampling-profile.json');
336
+ writeJsonAtomic(path, {
337
+ schemaVersion: 1,
338
+ capturedAt: new Date().toISOString(),
339
+ pid: process.pid,
340
+ runtimeInstanceId: this.runtimeInstanceId,
341
+ releaseId: this.release?.releaseId,
342
+ bounded: true,
343
+ ...sampling,
344
+ });
345
+ process.stderr.write(`${JSON.stringify({
346
+ event: 'forge_runtime_jsc_sampling_profile_captured',
347
+ runtimeInstanceId: this.runtimeInstanceId,
348
+ path,
349
+ requestedDurationMs: sampling.requestedDurationMs,
350
+ elapsedMs: sampling.elapsedMs,
351
+ sampleIntervalUs: sampling.sampleIntervalUs,
352
+ retainedTraceCount: sampling.stackTraces.retainedTraceCount,
353
+ observedAt: new Date().toISOString(),
354
+ })}\n`);
355
+ }).catch((error) => {
356
+ process.stderr.write(`${JSON.stringify({
357
+ event: 'forge_runtime_jsc_sampling_profile_failed',
358
+ runtimeInstanceId: this.runtimeInstanceId,
359
+ message: error instanceof Error ? error.message : String(error),
360
+ observedAt: new Date().toISOString(),
361
+ })}\n`);
362
+ }).finally(() => {
363
+ this.jscSamplingProfileCaptureInFlight = false;
364
+ });
365
+ };
366
+ process.on('SIGUSR1', handler);
367
+ this.jscSamplingProfilerSignalHandler = handler;
368
+ }
369
+
370
+ private removeJscSamplingProfilerSignal(): void {
371
+ const handler = this.jscSamplingProfilerSignalHandler;
372
+ if (!handler) return;
373
+ process.off('SIGUSR1', handler);
374
+ this.jscSamplingProfilerSignalHandler = undefined;
375
+ }
376
+
133
377
  private publishStatus(): void {
134
378
  if (!this.ownership || !this.release) return;
135
379
  try {
136
- writeRuntimeStatusSnapshot(this.config.controllerHome, {
380
+ const snapshot: CanonicalRuntimeStatusSnapshot = {
137
381
  schemaVersion: 1,
382
+ forgeInstanceId: this.forgeInstanceId,
138
383
  runtimeInstanceId: this.runtimeInstanceId,
139
384
  pid: this.ownership.record.pid,
140
385
  releaseId: this.release.releaseId,
@@ -144,7 +389,8 @@ export class CanonicalForgeRuntime {
144
389
  readiness: this.readiness(),
145
390
  startedAt: this.ownership.record.acquiredAt,
146
391
  updatedAt: new Date().toISOString(),
147
- });
392
+ };
393
+ writeRuntimeStatusSnapshot(this.config.controllerHome, snapshot);
148
394
  } catch {
149
395
  // Status is a read-only projection. Projection failure cannot become a
150
396
  // second Runtime readiness or lifecycle authority.
@@ -166,11 +412,40 @@ export class CanonicalForgeRuntime {
166
412
  return this.transport?.endpoint;
167
413
  }
168
414
 
415
+ private startReleaseAuthorityMonitor(): void {
416
+ const release = this.release;
417
+ if (!release || this.releaseAuthorityMonitor) return;
418
+ this.releaseAuthorityMonitor = this.dependencies.startReleaseAuthorityMonitor(() => {
419
+ if (this.stopping || this.lastExit) return;
420
+ let authority: RuntimeReleaseAuthority | undefined;
421
+ try {
422
+ authority = this.dependencies.readReleaseAuthority(this.config.controllerHome);
423
+ } catch {
424
+ // A read failure or ambiguous authority is not proof that this Runtime
425
+ // was superseded. Existing write fencing remains authoritative.
426
+ return;
427
+ }
428
+ if (!authority) return;
429
+ const active = authority.active;
430
+ if (
431
+ active.releaseId === release.releaseId
432
+ && active.artifactIdentity === release.artifactIdentity
433
+ && active.workerProtocolVersion === release.workerProtocolVersion
434
+ ) return;
435
+ const reasonCode = 'RUNTIME_RELEASE_SUPERSEDED';
436
+ this.readinessState.setDiagnostic('releaseCoherence', 'fail', reasonCode);
437
+ this.failCore(
438
+ reasonCode,
439
+ `Active Runtime release authority changed from ${release.releaseId}/${release.artifactIdentity} to ${active.releaseId}/${active.artifactIdentity}.`,
440
+ );
441
+ });
442
+ }
443
+
169
444
  async start(): Promise<void> {
170
445
  if (this.started) throw new Error('RUNTIME_ALREADY_STARTED');
171
446
  this.started = true;
172
447
  this.readinessState.markNotReady();
173
- let stage: 'release' | 'ownership' | 'source' | 'database' | 'scheduler' | 'localBridge' | 'transport' | 'probe' = 'release';
448
+ let stage: 'release' | 'ownership' | 'source' | 'database' | 'supervisor' | 'scheduler' | 'localBridge' | 'transport' | 'probe' = 'release';
174
449
  try {
175
450
  this.release = this.dependencies.loadReleaseManifest(this.config.releaseManifestPath, this.config.controllerHome);
176
451
 
@@ -178,15 +453,30 @@ export class CanonicalForgeRuntime {
178
453
  this.ownership = this.dependencies.acquireOwnership(this.config.controllerHome, this.runtimeInstanceId);
179
454
 
180
455
  stage = 'release';
456
+ this.dependencies.migrateReleaseState(this.config.controllerHome);
181
457
  const releaseAuthority = this.dependencies.ensureReleaseAuthority(this.config.controllerHome, this.config.releaseManifestPath);
182
458
  stage = 'source';
183
- // A materialized immutable release carries its frozen source identity in
184
- // the release manifest and must snapshot that release directory. Source/
185
- // fixture manifests without source identity keep the historical explicit
186
- // repositoryRoot behavior so development-mode Runtime drift remains live.
187
- const runtimeSourceRoot = this.release.sourceCommit && this.release.releaseRevision
459
+ // A compiled release is a closed execution surface. Fail before Scheduler
460
+ // composition if a stale/corrupt manifest omits any immutable component;
461
+ // standalone Runtime must never regain source/import.meta.url fallback.
462
+ if (this.release.executionMode === 'standalone-binary') {
463
+ requireCompleteCompiledRuntimeReleaseManifest(this.release);
464
+ }
465
+ // A materialized immutable release carries either a source revision or a
466
+ // package release revision and must snapshot that release directory.
467
+ // Source/fixture manifests without either identity keep the historical
468
+ // explicit repositoryRoot behavior so development-mode Runtime drift
469
+ // remains live.
470
+ const materializedRelease = Boolean(
471
+ this.release.releaseRevision
472
+ && (this.release.sourceCommit || this.release.releaseRevision.startsWith('package:')),
473
+ );
474
+ const runtimeSourceRoot = materializedRelease
188
475
  ? dirname(this.config.releaseManifestPath)
189
476
  : this.config.repositoryRoot;
477
+ if (!runtimeSourceRoot) {
478
+ throw new Error('RUNTIME_CONFIG_REQUIRED: repositoryRoot is required only for non-materialized development Runtime');
479
+ }
190
480
  const runtimeSource = this.dependencies.collectRuntimeSourceIdentity(runtimeSourceRoot);
191
481
  this.dependencies.rotateRuntimeGeneration(this.config.controllerHome, runtimeSource);
192
482
 
@@ -208,20 +498,41 @@ export class CanonicalForgeRuntime {
208
498
  this.dependencies.inspectDatabase,
209
499
  );
210
500
  this.controller.initialize();
501
+ // The Canonical Runtime is the only process that keeps a control-plane
502
+ // reader alive across operations. Writers remain short-lived WAL/CAS
503
+ // transactions, while CLI/tests/workers keep their existing close-on-read
504
+ // semantics.
505
+ enableControlPlaneReadConnectionReuse(this.config.controllerHome);
506
+ this.installJscHeapDiagnosticsSignal();
507
+ this.installJscSamplingProfilerSignal();
211
508
  this.readinessState.setDiagnostic('database', 'pass');
212
509
  this.publishStatus();
213
- if (this.config.exclusiveWorkId) {
214
- activateExclusiveWorkAdmission(this.config.controllerHome, {
215
- allowedWorkId: this.config.exclusiveWorkId,
216
- reason: 'P0 canonical single Runtime migration isolation',
510
+ if (this.topology.components.workflowSupervisor) {
511
+ stage = 'supervisor';
512
+ this.workflowSupervisor = await this.dependencies.startWorkflowSupervisor(this.config.controllerHome, {
513
+ nativeBrowserAdapter: this.topology.components.workflowSupervisorNativeBrowser,
217
514
  });
515
+ void this.workflowSupervisor.done.then(
516
+ () => this.failCore('WORKFLOW_SUPERVISOR_STOPPED', 'Workflow Supervisor stopped while Runtime was active.'),
517
+ (error) => this.failCore('WORKFLOW_SUPERVISOR_FAILED', error instanceof Error ? error.message : String(error)),
518
+ );
218
519
  }
219
520
 
220
521
  stage = 'scheduler';
221
- this.scheduler = this.dependencies.startScheduler(
222
- this.config.controllerHome,
223
- this.config.schedulerReadyTimeoutMs,
224
- );
522
+ const standaloneReleaseRoot = this.release.executionMode === 'standalone-binary'
523
+ ? dirname(this.config.releaseManifestPath)
524
+ : undefined;
525
+ this.scheduler = this.dependencies.startScheduler({
526
+ controllerHome: this.config.controllerHome,
527
+ readyTimeoutMs: this.config.schedulerReadyTimeoutMs,
528
+ runtimeSourceRoot: standaloneReleaseRoot ? undefined : runtimeSourceRoot,
529
+ workerExecutable: standaloneReleaseRoot && this.release.schedulerWorkerEntrypoint
530
+ ? join(standaloneReleaseRoot, this.release.schedulerWorkerEntrypoint)
531
+ : undefined,
532
+ periodicCleanupExecutable: standaloneReleaseRoot && this.release.periodicCleanupEntrypoint
533
+ ? join(standaloneReleaseRoot, this.release.periodicCleanupEntrypoint)
534
+ : undefined,
535
+ });
225
536
  await this.scheduler.ready;
226
537
  this.readinessState.setDiagnostic('scheduler', 'pass');
227
538
  this.publishStatus();
@@ -229,6 +540,10 @@ export class CanonicalForgeRuntime {
229
540
  () => this.failCore('SCHEDULER_STOPPED', 'Scheduler stopped while Runtime was active.'),
230
541
  (error) => this.failCore('SCHEDULER_STALLED', error instanceof Error ? error.message : String(error)),
231
542
  );
543
+ this.powerAssertion = this.dependencies.startPowerAssertion({
544
+ controllerHome: this.config.controllerHome,
545
+ runtimePid: this.ownership.record.pid,
546
+ });
232
547
 
233
548
  stage = 'localBridge';
234
549
  this.localBridge = await this.dependencies.startLocalBridge({
@@ -260,10 +575,30 @@ export class CanonicalForgeRuntime {
260
575
  this.readinessState.setDiagnostic('mcpEndToEnd', 'pass');
261
576
  this.readinessState.markReady();
262
577
  this.publishStatus();
578
+ removeRuntimeStartupFailureEvidence(this.config.controllerHome);
579
+ stage = 'release';
580
+ this.startReleaseAuthorityMonitor();
263
581
  } catch (error) {
264
582
  const reason = this.startupReason(stage);
583
+ const message = error instanceof Error ? error.message : String(error);
265
584
  this.markStartupFailure(stage, reason);
266
- await this.stop(reason, error instanceof Error ? error.message : String(error));
585
+ try {
586
+ writeRuntimeStartupFailureEvidence(this.config.controllerHome, {
587
+ schemaVersion: 1,
588
+ runtimeInstanceId: this.runtimeInstanceId,
589
+ stage,
590
+ reasonCode: reason,
591
+ message,
592
+ ...(this.release ? {
593
+ releaseId: this.release.releaseId,
594
+ artifactIdentity: this.release.artifactIdentity,
595
+ } : {}),
596
+ observedAt: new Date().toISOString(),
597
+ });
598
+ } catch {
599
+ // Diagnostic persistence must never replace the original startup failure.
600
+ }
601
+ await this.stop(reason, message);
267
602
  throw error;
268
603
  }
269
604
  }
@@ -273,6 +608,7 @@ export class CanonicalForgeRuntime {
273
608
  if (stage === 'ownership') return 'RUNTIME_OWNERSHIP_CONFLICT';
274
609
  if (stage === 'source') return 'RUNTIME_SOURCE_SNAPSHOT_FAILED';
275
610
  if (stage === 'database') return 'DATABASE_UNAVAILABLE';
611
+ if (stage === 'supervisor') return 'WORKFLOW_SUPERVISOR_INITIALIZATION_FAILED';
276
612
  if (stage === 'scheduler') return 'SCHEDULER_INITIALIZATION_FAILED';
277
613
  if (stage === 'localBridge') return 'LOCAL_BRIDGE_STARTUP_FAILED';
278
614
  if (stage === 'transport') return 'MCP_LISTENER_FAILED';
@@ -311,13 +647,24 @@ export class CanonicalForgeRuntime {
311
647
  this.stopping = true;
312
648
  this.readinessState.markNotReady(reasonCode);
313
649
  this.publishStatus();
650
+ // Stop the release observer before withdrawing MCP work so no second
651
+ // supersession callback can race the teardown sequence.
652
+ try { this.releaseAuthorityMonitor?.stop(); } catch { /* cleanup is best effort */ }
653
+ this.releaseAuthorityMonitor = undefined;
654
+ this.removeJscHeapDiagnosticsSignal();
655
+ this.removeJscSamplingProfilerSignal();
314
656
  // Stop accepting new MCP work before quiescing Scheduler activity, then
315
657
  // release the Controller Home claim only after all in-process services stop.
658
+ await this.workflowSupervisor?.close().catch(() => undefined);
659
+ this.workflowSupervisor = undefined;
316
660
  await this.transport?.close().catch(() => undefined);
317
661
  await this.dependencies.stopLightweightProcesses(this.config.controllerHome).catch(() => undefined);
318
662
  await this.dependencies.stopContextReadHelpers().catch(() => undefined);
319
663
  await this.localBridge?.close().catch(() => undefined);
320
664
  await this.scheduler?.stop().catch(() => undefined);
665
+ try { this.powerAssertion?.stop(); } catch { /* power assertion cleanup is best effort */ }
666
+ this.powerAssertion = undefined;
667
+ disableControlPlaneReadConnectionReuse(this.config.controllerHome);
321
668
  const ownerPid = this.ownership?.record.pid;
322
669
  this.ownership?.release();
323
670
  clearRuntimeWriteClaim(this.runtimeInstanceId);
@@ -0,0 +1,76 @@
1
+ import {
2
+ bindControllerSessionBinding,
3
+ getRequirementControllerRoundRelay,
4
+ type ControllerBinding,
5
+ type ControllerHost,
6
+ type ControllerSession,
7
+ } from '../../../packages/kernel/controller/api/index';
8
+ import { upsertChatgptControllerBinding } from '../../../adapters/chatgpt/controller-binding-store';
9
+ import { getWorkContract } from '../../../packages/kernel/work/api/index';
10
+ import { inheritWorkflowSupervisorConversationBinding } from './workflow-supervisor-composition';
11
+ import { getChatgptWorkConversationBinding } from '../../../adapters/chatgpt/work-conversation-binding-store';
12
+ import { createProcessControllerHost } from '../../../adapters/controller-process/controller-host';
13
+ import { upsertProcessControllerBinding, type ProcessControllerType } from '../../../adapters/controller-process/binding-store';
14
+
15
+ // Kernel V2 composition root: Scheduler selects Kernel continuation; this file wires concrete provider adapters.
16
+ export function ensureScheduledControllerBinding(
17
+ options: { controllerHome: string; repoId: string },
18
+ input: { workId: string; session: ControllerSession; scheduleName?: string; args: Record<string, unknown> },
19
+ ): ControllerBinding {
20
+ let binding: ControllerBinding;
21
+ if (input.session.controllerType === 'chatgpt') {
22
+ const durable = getChatgptWorkConversationBinding(options, input.workId);
23
+ binding = upsertChatgptControllerBinding(options, {
24
+ workId: input.workId, sessionId: input.session.sessionId,
25
+ browserSessionId: durable?.latestBrowserSessionId ?? (typeof input.args.browser_session_id === 'string' ? input.args.browser_session_id : undefined),
26
+ conversationUrl: durable?.conversationUrl ?? (typeof input.args.conversation_url === 'string' ? input.args.conversation_url : undefined),
27
+ authorizationGrantRefs: [
28
+ ...(durable?.authorizationGrantRefs ?? []),
29
+ ...(Array.isArray(input.args.authorization_grant_refs) ? input.args.authorization_grant_refs.map(String) : []),
30
+ ].map(value => value.trim()).filter(Boolean).filter((value, index, values) => values.indexOf(value) === index),
31
+ title: input.scheduleName,
32
+ model: typeof input.args.model === 'string' ? input.args.model : 'gpt-5.6',
33
+ reasoning: input.args.reasoning === 'medium' || input.args.reasoning === 'high' || input.args.reasoning === 'xhigh' ? input.args.reasoning : 'medium',
34
+ tabPolicy: input.args.tab_policy === 'reuse' || input.args.tab_policy === 'new' ? input.args.tab_policy : 'auto',
35
+ timeoutMs: typeof input.args.timeout_ms === 'number' ? input.args.timeout_ms : undefined,
36
+ }).binding;
37
+ } else if (input.session.controllerType !== 'human') {
38
+ binding = upsertProcessControllerBinding(options, {
39
+ workId: input.workId, sessionId: input.session.sessionId, controllerType: input.session.controllerType as ProcessControllerType,
40
+ executable: typeof input.args.executable === 'string' ? input.args.executable : undefined,
41
+ launchArgs: Array.isArray(input.args.launch_args) ? input.args.launch_args.map(String) : [],
42
+ handoffId: typeof input.args.handoff_id === 'string' ? input.args.handoff_id : undefined,
43
+ launchReservationMs: typeof input.args.launch_reservation_ms === 'number' ? input.args.launch_reservation_ms : undefined,
44
+ }).binding;
45
+ } else {
46
+ throw new Error('SCHEDULE_CONTINUATION_HUMAN_HOST_UNSUPPORTED');
47
+ }
48
+ bindControllerSessionBinding(options, { workId: input.workId, sessionId: input.session.sessionId, binding });
49
+ return binding;
50
+ }
51
+
52
+ export function ensureScheduledControllerBindingForWork(
53
+ options: { controllerHome: string; repoId: string },
54
+ input: { workId: string; session: ControllerSession; scheduleName?: string; args: Record<string, unknown> },
55
+ ): ControllerBinding {
56
+ if (input.session.controllerType === 'chatgpt') {
57
+ const work = getWorkContract(options, input.workId);
58
+ if (work?.requirementId && !getChatgptWorkConversationBinding(options, input.workId)) {
59
+ const requirementRelay = getRequirementControllerRoundRelay(options, work.requirementId);
60
+ if (requirementRelay?.originWorkId && requirementRelay.originWorkId !== input.workId) {
61
+ inheritWorkflowSupervisorConversationBinding(options, requirementRelay.originWorkId, input.workId);
62
+ }
63
+ }
64
+ }
65
+ return ensureScheduledControllerBinding(options, input);
66
+ }
67
+
68
+ export function controllerHostForScheduledBinding(
69
+ options: { controllerHome: string; repoId: string; repoRoot: string },
70
+ binding: ControllerBinding,
71
+ ): ControllerHost {
72
+ if (binding.hostKind === 'chatgpt') {
73
+ throw new Error('CHATGPT_CONTROLLER_HOST_SUPERVISOR_OWNED');
74
+ }
75
+ return createProcessControllerHost(options);
76
+ }