@moretea-labs/forge 1.8.0 → 1.8.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (695) hide show
  1. package/AGENTS.md +73 -7
  2. package/CHANGELOG.md +34 -0
  3. package/CLAUDE.md +17 -2
  4. package/CONTRIBUTING.md +3 -2
  5. package/README.en.md +24 -3
  6. package/README.md +10 -6
  7. package/README.zh-CN.md +5 -3
  8. package/THIRD_PARTY_NOTICES.md +1 -2
  9. package/adapters/chatgpt/browser-delivery-host.ts +7 -1
  10. package/adapters/chatgpt/browser-delivery-runtime.ts +531 -56
  11. package/adapters/chatgpt/controller-binding-store.ts +101 -22
  12. package/adapters/chatgpt/controller-round-host.ts +15 -25
  13. package/adapters/chatgpt/controller-round-settlement-store.ts +58 -4
  14. package/adapters/chatgpt/provider-delivery.ts +229 -2
  15. package/adapters/chatgpt/work-conversation-binding-store.ts +99 -54
  16. package/adapters/computer/chatgpt-extension-target.ts +708 -0
  17. package/adapters/computer/chrome-extension/background.js +541 -0
  18. package/adapters/computer/chrome-extension/content.js +402 -0
  19. package/adapters/computer/chrome-extension/core.js +24 -0
  20. package/adapters/computer/chrome-extension/manifest.json +32 -0
  21. package/adapters/computer/desktop-operator-discovery.ts +11 -31
  22. package/adapters/computer/desktop-operator-provider.ts +18 -6
  23. package/adapters/computer/interaction-target-authority.ts +178 -24
  24. package/adapters/mcp/access-mode.ts +18 -39
  25. package/adapters/mcp/auth.ts +2 -7
  26. package/adapters/mcp/instructions.ts +6 -5
  27. package/adapters/mcp/multi-repository.ts +10 -47
  28. package/adapters/mcp/oauth.ts +73 -0
  29. package/adapters/mcp/paths.ts +4 -1
  30. package/adapters/mcp/runtime-gateway/bounded-result-runtime.ts +62 -0
  31. package/adapters/mcp/runtime-gateway/cognition-settlement.ts +201 -0
  32. package/adapters/mcp/runtime-gateway/context-adapter.ts +490 -113
  33. package/adapters/mcp/runtime-gateway/context-pack-sidecar.ts +83 -0
  34. package/adapters/mcp/runtime-gateway/controller-authority-adapter.ts +20 -5
  35. package/adapters/mcp/runtime-gateway/core-capability-adapter.ts +258 -0
  36. package/adapters/mcp/runtime-gateway/engineering-preconditions.ts +10 -27
  37. package/adapters/mcp/runtime-gateway/engineering-tool-contract.ts +15 -0
  38. package/adapters/mcp/runtime-gateway/execution-tools.ts +14 -54
  39. package/adapters/mcp/runtime-gateway/gateway-execution-adapter.ts +2 -1
  40. package/adapters/mcp/runtime-gateway/plugin-adapter.ts +132 -47
  41. package/adapters/mcp/runtime-gateway/process-tools.ts +173 -23
  42. package/adapters/mcp/runtime-gateway/protected-computer-adapter.ts +16 -4
  43. package/adapters/mcp/runtime-gateway/recovery-adapter.ts +69 -52
  44. package/adapters/mcp/runtime-gateway/repository-compat-adapter.ts +4 -35
  45. package/adapters/mcp/runtime-gateway/result-adapter.ts +10 -4
  46. package/adapters/mcp/runtime-gateway/router.ts +19 -507
  47. package/adapters/mcp/runtime-gateway/routing-policy.ts +506 -0
  48. package/adapters/mcp/runtime-gateway/runtime-observation-adapter.ts +15 -66
  49. package/adapters/mcp/runtime-gateway/runtime-readiness-observation.ts +218 -0
  50. package/adapters/mcp/runtime-gateway/runtime-tool-definitions.ts +123 -178
  51. package/adapters/mcp/runtime-gateway/runtime-tools.ts +11 -5
  52. package/adapters/mcp/runtime-gateway/scheduler-adapter.ts +37 -1
  53. package/adapters/mcp/runtime-gateway/shared-adapter.ts +20 -0
  54. package/adapters/mcp/runtime-gateway/status-inbox-adapter.ts +416 -270
  55. package/adapters/mcp/runtime-gateway/typescript-navigation-sidecar.ts +140 -0
  56. package/adapters/mcp/runtime-gateway/work-adapter.ts +262 -3123
  57. package/adapters/mcp/runtime-gateway/work-controller-operations.ts +257 -0
  58. package/adapters/mcp/runtime-gateway/work-detail-projection.ts +60 -0
  59. package/adapters/mcp/runtime-gateway/work-input-wire-migration.ts +229 -0
  60. package/adapters/mcp/runtime-gateway/work-learning-operations.ts +145 -0
  61. package/adapters/mcp/runtime-gateway/work-list-projection.ts +38 -0
  62. package/adapters/mcp/runtime-gateway/work-plan-operations.ts +382 -0
  63. package/adapters/mcp/runtime-gateway/work-repair-adapter.ts +308 -0
  64. package/adapters/mcp/runtime-gateway/work-requirement-operations.ts +148 -0
  65. package/adapters/mcp/runtime-gateway/work-semantic-operations.ts +320 -0
  66. package/adapters/mcp/runtime-gateway/work-workflow-operations.ts +113 -0
  67. package/adapters/mcp/runtime-gateway/workflow-supervisor-adapter.ts +180 -0
  68. package/adapters/mcp/server.ts +91 -26
  69. package/adapters/mcp/setup.ts +5 -13
  70. package/adapters/mcp/tool-mapping/access-tools.ts +0 -6
  71. package/adapters/mcp/tool-mapping/legacy-tool-service.ts +703 -3092
  72. package/adapters/mcp/tool-mapping/post-finalize-work-attribution.ts +5 -10
  73. package/adapters/mcp/tool-mapping/repository-tools.ts +170 -213
  74. package/adapters/mcp/toolset-names.ts +11 -37
  75. package/adapters/mcp/toolset.ts +19 -92
  76. package/{src/cli → adapters}/mcp/transports/AGENTS.md +5 -5
  77. package/{src/cli → adapters}/mcp/transports/CLAUDE.md +5 -5
  78. package/adapters/mcp/transports/http-observation.ts +377 -0
  79. package/adapters/mcp/transports/http-post-lifecycle.ts +19 -0
  80. package/adapters/mcp/transports/http.ts +200 -683
  81. package/adapters/mcp/transports/oauth-http.ts +322 -0
  82. package/adapters/mcp/transports/session-registry.ts +6 -0
  83. package/adapters/mcp/tunnels/openai-secure-tunnel.ts +89 -5
  84. package/adapters/mcp/types.ts +0 -6
  85. package/assets/hooks/lib/session-state.sh +0 -38
  86. package/assets/hooks/post-bash.sh +1 -1
  87. package/assets/hooks/post-tool-observer.sh +0 -5
  88. package/assets/hooks/prompt-guard.sh +0 -55
  89. package/assets/partials/04-project-structure.partial.md +1 -1
  90. package/assets/partials/07-footer.partial.md +1 -1
  91. package/assets/partials-agents/02-operating-mode.partial.md +1 -1
  92. package/assets/partials-agents/08-deep-docs.partial.md +1 -1
  93. package/assets/plugin-registry.v1.json +6 -4
  94. package/assets/reference-configs/agentic-development-flow.md +26 -1
  95. package/assets/reference-configs/external-tooling.md +0 -76
  96. package/assets/reference-configs/global-working-rules.md +19 -0
  97. package/assets/reference-configs/release-deploy.md +1 -1
  98. package/assets/templates/helpers/architecture-queue.sh +1 -1
  99. package/assets/templates/helpers/check-agent-tooling.sh +1 -327
  100. package/assets/templates/helpers/check-task-workflow.sh +1 -1
  101. package/assets/templates/helpers/ensure-task-workflow.sh +0 -14
  102. package/assets/templates/helpers/migrate-project-template.sh +2 -2
  103. package/assets/workflow-contract.v1.json +0 -2
  104. package/docs/README.md +5 -2
  105. package/docs/architecture/CURRENT.md +205 -51
  106. package/docs/architecture/decisions/20260803-release-identity-binding-and-exit-policy.md +14 -5
  107. package/docs/architecture/decisions/20260823-immediate-controller-relay.md +6 -3
  108. package/docs/architecture/decisions/20260904-ios-device-migration-baseline.md +42 -0
  109. package/docs/architecture/decisions/20260907-assistant-learning-loop.md +2 -0
  110. package/docs/architecture/decisions/20260907-controller-round-transition-policy.md +19 -4
  111. package/docs/architecture/decisions/20260916-workflow-supervisor-authority.md +249 -0
  112. package/docs/architecture/decisions/20260917-cognitive-memory-foundation.md +82 -0
  113. package/docs/architecture/decisions/20260918-stable-candidate-release-lifecycle.md +234 -0
  114. package/docs/architecture/decisions/20260919-autonomous-work-liveness.md +62 -0
  115. package/docs/architecture/decisions/20260924-thin-semantic-working-context.md +74 -0
  116. package/docs/architecture/decisions/20261001-supervisor-turn-authority.md +342 -0
  117. package/docs/architecture/decisions/20261005-forge-v3-desktop-client-boundary.md +77 -0
  118. package/docs/architecture/decisions/20261009-exact-code-context-discovery.md +19 -0
  119. package/docs/architecture/decisions/20261009-generated-xcode-cache-retention.md +37 -0
  120. package/docs/architecture/decisions/20261011-autonomous-continuation-convergence.md +597 -0
  121. package/docs/architecture/decisions/20261017-edit-session-finalization-reconciliation.md +17 -0
  122. package/docs/architecture/decisions/20261019-retire-host-skills.md +16 -0
  123. package/docs/architecture/diagrams/agentic-dev-plugin-architecture.html +1 -1
  124. package/docs/architecture/domains/public-surface.md +3 -5
  125. package/docs/architecture/domains/verification.md +6 -5
  126. package/docs/architecture/domains/workflow-engine.md +6 -0
  127. package/docs/architecture/modules/controller-runtime/transport-lifecycle.md +3 -3
  128. package/docs/architecture/requests/2026-09-04-computer-plugin-workflow-taxonomy.md +4 -4
  129. package/docs/architecture/reviews/20261015-code-search-runtime-acceptance.md +75 -0
  130. package/docs/forge-plugin-management.md +16 -4
  131. package/docs/operations/controller-browser-plugin.md +23 -0
  132. package/docs/operations/controller-performance-and-502.md +17 -0
  133. package/docs/operations/controller-reliability-runbook.md +2 -2
  134. package/docs/operations/features.md +6 -7
  135. package/docs/operations/features.zh-CN.md +1 -1
  136. package/docs/operations/github-repository.md +4 -4
  137. package/docs/operations/github-semantic-release-projection.md +20 -0
  138. package/docs/operations/homebrew.md +2 -2
  139. package/docs/operations/mcp-tool-exposure.md +13 -52
  140. package/docs/operations/releasing.md +2 -0
  141. package/docs/operations/runtime-performance-diagnostics.md +8 -0
  142. package/docs/operations/standalone-disaster-recovery.md +15 -7
  143. package/docs/tutorials/01-install-and-start.zh-CN.md +1 -1
  144. package/docs/tutorials/03-first-repository-task.md +2 -0
  145. package/docs/wiki/Computer-and-Plugins.md +78 -0
  146. package/docs/wiki/Computer-and-Plugins.zh-CN.md +88 -0
  147. package/docs/wiki/Home.md +16 -2
  148. package/docs/wiki/Implementation.md +25 -13
  149. package/docs/wiki/Installation.md +28 -32
  150. package/docs/wiki/Integrations.md +4 -0
  151. package/docs/wiki/Quick-Start.md +35 -22
  152. package/docs/wiki/Releases-and-Upgrades.md +15 -25
  153. package/docs/wiki/_Sidebar.md +5 -1
  154. package/package.json +25 -25
  155. package/packages/kernel/cognition/api/index.ts +6 -0
  156. package/packages/kernel/cognition/application/activation-service.ts +451 -0
  157. package/packages/kernel/cognition/application/consolidation-service.ts +185 -0
  158. package/packages/kernel/cognition/application/legacy-experience-adapter.ts +38 -0
  159. package/packages/kernel/cognition/application/memory-service.ts +64 -0
  160. package/packages/kernel/cognition/domain/learning.ts +106 -0
  161. package/packages/kernel/cognition/domain/memory.ts +254 -0
  162. package/packages/kernel/controller/api/index.ts +1 -0
  163. package/packages/kernel/controller/application/continuation-service.ts +281 -0
  164. package/packages/kernel/controller/application/controller-round-service.ts +12 -0
  165. package/packages/kernel/controller/domain/controller-round-transition-policy.ts +242 -21
  166. package/packages/kernel/controller/domain/controller-round.ts +4 -1
  167. package/packages/kernel/controller/domain/execution-quality.ts +3 -1
  168. package/packages/kernel/controller/infrastructure/controller-round-store.ts +689 -103
  169. package/packages/kernel/controller/infrastructure/controller-session-store.ts +348 -97
  170. package/packages/kernel/controller/ports/controller-host.ts +2 -0
  171. package/packages/kernel/identity/api/index.ts +10 -0
  172. package/packages/kernel/identity/domain/activity-projection.ts +43 -0
  173. package/packages/kernel/identity/domain/capability-broker.ts +60 -0
  174. package/packages/kernel/identity/domain/grant.ts +72 -0
  175. package/packages/kernel/identity/domain/owned-resource.ts +116 -0
  176. package/packages/kernel/identity/domain/user-request.ts +93 -0
  177. package/packages/kernel/identity/infrastructure/activity-projection-store.ts +87 -0
  178. package/packages/kernel/identity/infrastructure/capability-broker.ts +81 -0
  179. package/packages/kernel/identity/infrastructure/grant-store.ts +284 -0
  180. package/packages/kernel/identity/infrastructure/owned-resource-store.ts +259 -0
  181. package/packages/kernel/identity/infrastructure/user-request-store.ts +182 -0
  182. package/packages/kernel/scheduler/api/index.ts +0 -2
  183. package/packages/kernel/scheduler/application/eligibility.ts +4 -1
  184. package/packages/kernel/scheduler/application/schedule-service.ts +3 -0
  185. package/packages/kernel/scheduler/application/settlement.ts +0 -15
  186. package/packages/kernel/scheduler/domain/schedule.ts +87 -0
  187. package/packages/kernel/scheduler/infrastructure/schedule-store.ts +166 -143
  188. package/packages/kernel/work/api/index.ts +3 -2
  189. package/packages/kernel/work/application/work-service.ts +18 -42
  190. package/packages/kernel/work/domain/current-task-lineage.ts +104 -0
  191. package/packages/kernel/work/domain/engineering-design.ts +10 -5
  192. package/packages/kernel/work/domain/engineering-profile.ts +8 -12
  193. package/packages/kernel/work/domain/evaluation-promotion-receipt.ts +186 -0
  194. package/packages/kernel/work/domain/execution-concurrency.ts +19 -26
  195. package/packages/kernel/work/domain/execution-snapshot.ts +0 -31
  196. package/packages/kernel/work/domain/implementation-review.ts +14 -331
  197. package/packages/kernel/work/domain/objective-graph.ts +119 -0
  198. package/packages/kernel/work/domain/project-engineering-contract.ts +23 -1
  199. package/packages/kernel/work/domain/repository-completion-receipt.ts +1 -1
  200. package/packages/kernel/work/domain/state-machine.ts +34 -65
  201. package/packages/kernel/work/domain/types.ts +57 -51
  202. package/packages/kernel/work/infrastructure/work-contract-store.ts +847 -729
  203. package/packages/kernel/work/ports/work-contract-store.ts +5 -2
  204. package/packages/plugin-runtime/browser/provider-registry.ts +12 -36
  205. package/packages/plugin-runtime/browser/session-authority.ts +2 -1
  206. package/packages/plugin-runtime/computer/chatgpt-identity.ts +24 -0
  207. package/packages/plugin-runtime/computer/conversation-target.ts +153 -0
  208. package/packages/plugin-runtime/computer/index.ts +2 -0
  209. package/packages/plugin-runtime/computer/target-authority.ts +26 -1
  210. package/packages/plugin-runtime/external/unix-jsonl-transport.ts +142 -18
  211. package/packages/protocols/computer/contract.ts +27 -1
  212. package/scripts/activate-source-baseline.ts +7 -9
  213. package/scripts/assemble-template.ts +11 -72
  214. package/scripts/canary-controller-semantic-wait.ts +12 -24
  215. package/scripts/check-mcp-compatibility.ts +94 -201
  216. package/scripts/check-package-identity.mjs +0 -5
  217. package/scripts/check-runtime-architecture.mjs +921 -239
  218. package/scripts/forge-local-recovery-helper.mjs +93 -15
  219. package/scripts/init-project.sh +0 -46
  220. package/scripts/install-ios-hid-toolchain.sh +60 -0
  221. package/scripts/install-standalone-recovery.ts +1 -1
  222. package/scripts/lib/project-init-lib.sh +6 -3
  223. package/scripts/migrate-windows-wsl-controller-home.ts +2 -0
  224. package/scripts/open-source-audit-allowlist.txt +1 -3
  225. package/scripts/run-bounded-command.mjs +5 -0
  226. package/scripts/run-governed-gate.ts +2 -1
  227. package/scripts/run-mobile-monitor-bridge.ts +0 -1
  228. package/scripts/smoke-control-plane-failure-domain.ts +94 -0
  229. package/scripts/smoke-ios-physical-device.ts +38 -10
  230. package/scripts/smoke-mcp-http-runtime.ts +12 -8
  231. package/scripts/smoke-mcp-tool-surface.ts +27 -41
  232. package/scripts/smoke-runtime-recovery.ts +12 -43
  233. package/scripts/smoke-schedule-engine.ts +23 -15
  234. package/scripts/smoke-unattended-transport-recovery.ts +223 -0
  235. package/scripts/smoke-user-request-continuation-restart.ts +232 -0
  236. package/scripts/smoke-workflow-supervisor-chrome-adapter.ts +95 -0
  237. package/scripts/smoke-workflow-supervisor-process-restart.ts +276 -0
  238. package/scripts/smoke-workflow-supervisor-restart-recovery.ts +150 -0
  239. package/scripts/smoke-workflow-supervisor.ts +103 -0
  240. package/scripts/sync-generated-authority.mjs +0 -1
  241. package/scripts/verify-forge-runtime.sh +2 -1
  242. package/src/cli/agent-jobs/executor-health.ts +12 -35
  243. package/src/cli/agent-jobs/integration.ts +20 -51
  244. package/src/cli/agent-jobs/job-manager.ts +7 -3
  245. package/src/cli/chatgpt-browser/file-policy.ts +2 -2
  246. package/src/cli/commands/brain-assistant.ts +27 -13
  247. package/src/cli/commands/brain.ts +13 -15
  248. package/src/cli/commands/chatgpt.ts +1 -163
  249. package/src/cli/commands/doctor.ts +1 -143
  250. package/src/cli/commands/global-runtime.ts +3 -196
  251. package/src/cli/commands/init-hook.ts +6 -23
  252. package/src/cli/commands/init.ts +3 -252
  253. package/src/cli/commands/mcp.ts +0 -5
  254. package/src/cli/commands/prompt-guard-decision.ts +0 -2
  255. package/src/cli/commands/recovery.ts +137 -135
  256. package/src/cli/commands/repository.ts +17 -1
  257. package/src/cli/commands/runtime.ts +3 -3
  258. package/src/cli/commands/setup-execution.ts +41 -0
  259. package/src/cli/commands/setup-profile.ts +8 -0
  260. package/src/cli/controller/check-runner.ts +13 -2
  261. package/src/cli/controller/completion-backlog.ts +3 -3
  262. package/src/cli/controller/completion-orchestrator.ts +5 -44
  263. package/src/cli/controller/completion-target.ts +3 -72
  264. package/src/cli/controller/composite-operations.ts +1 -1
  265. package/src/cli/controller/context/instruction-context.ts +1 -1
  266. package/src/cli/controller/context/known-paths.ts +2 -2
  267. package/src/cli/controller/context/query-planning.ts +11 -4
  268. package/src/cli/controller/context/rule-resolution.ts +2 -2
  269. package/src/cli/controller/context/source-materializer.ts +83 -102
  270. package/src/cli/controller/context/structural-provider.ts +84 -0
  271. package/src/cli/controller/context/structural.ts +6 -6
  272. package/src/cli/controller/context/types.ts +8 -9
  273. package/src/cli/controller/context-pack.ts +107 -84
  274. package/src/cli/controller/execution-completion.ts +4 -7
  275. package/src/cli/controller/execution-policy.ts +36 -153
  276. package/src/cli/controller/governance.ts +2 -3
  277. package/src/cli/controller/issue-store.ts +4 -99
  278. package/src/cli/controller/launch-agents.ts +59 -18
  279. package/src/cli/controller/operational-plan.ts +25 -52
  280. package/src/cli/controller/runtime-config.ts +5 -1
  281. package/src/cli/controller/stuck-state-migration.ts +2 -3
  282. package/src/cli/controller/systemd-user.ts +42 -10
  283. package/src/cli/editing/edit-session.ts +18 -12
  284. package/src/cli/github/github.ts +4 -4
  285. package/src/cli/github/semantic-projection.ts +174 -0
  286. package/src/cli/hook/prompt-intents.ts +0 -9
  287. package/src/cli/index.ts +1 -43
  288. package/src/cli/local-bridge/connector-freshness.ts +1 -12
  289. package/src/cli/local-bridge/console-automations.ts +19 -14
  290. package/src/cli/local-bridge/console-view-models.ts +4 -13
  291. package/src/cli/local-bridge/facade-api.ts +64 -193
  292. package/src/cli/local-bridge/server.ts +24 -147
  293. package/src/cli/local-bridge/types.ts +0 -1
  294. package/src/cli/mcp/oauth-client-retirement.ts +74 -0
  295. package/src/cli/repositories/command-classifier.ts +0 -9
  296. package/src/cli/repositories/command-executor.ts +29 -23
  297. package/src/cli/repositories/command-scope.ts +37 -18
  298. package/src/cli/repositories/controller-home.ts +48 -0
  299. package/src/cli/repositories/ephemeral-workspace.ts +20 -30
  300. package/src/cli/repositories/git-command-executor.ts +2 -2
  301. package/src/cli/repositories/locks.ts +20 -0
  302. package/src/cli/repositories/registry.ts +79 -12
  303. package/src/cli/repositories/safe-patch.ts +2 -12
  304. package/src/cli/repositories/structured-git.ts +101 -5
  305. package/src/cli/repository/inspector.ts +185 -343
  306. package/src/cli/repository/session-cache.ts +92 -6
  307. package/src/effects/process-runner.ts +17 -1
  308. package/src/runtime/context/assistant-context.ts +20 -7
  309. package/src/runtime/context/assistant-work-context.ts +89 -27
  310. package/src/runtime/context/automatic-learning.ts +565 -0
  311. package/src/runtime/context/cognitive-attention.ts +173 -0
  312. package/src/runtime/context/cognitive-skill-canary.ts +158 -0
  313. package/src/runtime/context/context-closure.ts +46 -9
  314. package/src/runtime/context/context-pack-process.ts +103 -0
  315. package/src/runtime/context/context-plane.ts +1 -9
  316. package/src/runtime/context/direct-controller-learning.ts +298 -0
  317. package/src/runtime/context/generic-lsp-provider.ts +1 -1
  318. package/src/runtime/context/semantic-navigation-contract.ts +16 -0
  319. package/src/runtime/context/semantic-navigation.ts +7 -35
  320. package/src/runtime/context/typescript-navigation-process.ts +145 -0
  321. package/src/runtime/context/typescript-navigation.ts +89 -3
  322. package/src/runtime/control-plane/cleanup-artifact-retention.ts +215 -12
  323. package/src/runtime/control-plane/concurrency/work-execution-concurrency.ts +9 -47
  324. package/src/runtime/control-plane/execution/controller-authority-recovery.ts +34 -4
  325. package/src/runtime/control-plane/execution/edit-validation-coordinator.ts +29 -20
  326. package/src/runtime/control-plane/execution/execution-identity.ts +23 -3
  327. package/src/runtime/control-plane/execution/repository-work-attribution.ts +7 -30
  328. package/src/runtime/control-plane/execution/retained-work-resume.ts +206 -199
  329. package/src/runtime/control-plane/execution/session-store.ts +31 -1
  330. package/src/runtime/control-plane/execution/validation.ts +6 -8
  331. package/src/runtime/control-plane/execution/work-authority-reconciler.ts +13 -42
  332. package/src/runtime/control-plane/execution/work-check-evidence.ts +137 -0
  333. package/src/runtime/control-plane/execution/work-completion-authority.ts +30 -85
  334. package/src/runtime/control-plane/execution/work-delivery-service.ts +616 -0
  335. package/src/runtime/control-plane/execution/work-evidence-policy.ts +12 -50
  336. package/src/runtime/control-plane/execution/work-execution-support.ts +50 -149
  337. package/src/runtime/control-plane/execution/work-handle-authority.ts +197 -110
  338. package/src/runtime/control-plane/execution/work-handle-store.ts +72 -44
  339. package/src/runtime/control-plane/execution/work-head-settlement.ts +53 -20
  340. package/src/runtime/control-plane/execution/work-lifecycle-audit.ts +52 -29
  341. package/src/runtime/control-plane/execution/work-operation-service.ts +60 -34
  342. package/src/runtime/control-plane/execution/work-preparation-service.ts +231 -267
  343. package/src/runtime/control-plane/execution/work-process-evidence.ts +2 -2
  344. package/src/runtime/control-plane/execution/work-remote-delivery.ts +2 -3
  345. package/src/runtime/control-plane/execution/work-revision-diff.ts +39 -0
  346. package/src/runtime/control-plane/execution/work-terminal-cleanup.ts +201 -199
  347. package/src/runtime/control-plane/execution/work-validation-reconciler.ts +33 -85
  348. package/src/runtime/control-plane/execution/work-verification-service.ts +406 -50
  349. package/src/runtime/control-plane/execution/work-verification-snapshot.ts +6 -2
  350. package/src/runtime/control-plane/facade/capability-registry.ts +364 -37
  351. package/src/runtime/control-plane/facade/check-normalization.ts +3 -9
  352. package/src/runtime/control-plane/facade/codex-delegation.ts +10 -11
  353. package/src/runtime/control-plane/facade/controller-connection.ts +135 -0
  354. package/src/runtime/control-plane/facade/goal-workloop-access.ts +1 -20
  355. package/src/runtime/control-plane/facade/goal-workloop.ts +281 -1753
  356. package/src/runtime/control-plane/facade/handoff-inbox-application.ts +12 -25
  357. package/src/runtime/control-plane/facade/handoff-inbox-store.ts +256 -52
  358. package/src/runtime/control-plane/facade/index.ts +0 -1
  359. package/src/runtime/control-plane/facade/operation-digest.ts +12 -15
  360. package/src/runtime/control-plane/facade/plan-contract-store.ts +451 -991
  361. package/src/runtime/control-plane/facade/policy-gate.ts +0 -23
  362. package/src/runtime/control-plane/facade/repository-work-admission.ts +12 -22
  363. package/src/runtime/control-plane/facade/requirement-authority.ts +102 -199
  364. package/src/runtime/control-plane/facade/requirement-board.ts +3 -3
  365. package/src/runtime/control-plane/facade/rh-work-operation-contract.ts +51 -14
  366. package/src/runtime/control-plane/facade/self-healing-loop.ts +18 -53
  367. package/src/runtime/control-plane/facade/suggested-actions.ts +15 -18
  368. package/src/runtime/control-plane/facade/types.ts +49 -108
  369. package/src/runtime/control-plane/facade/work-continuation.ts +9 -9
  370. package/src/runtime/control-plane/generated-cache-retention.ts +206 -59
  371. package/src/runtime/control-plane/global-scheduler/autonomous-continuation.ts +248 -0
  372. package/src/runtime/control-plane/global-scheduler/durable-admission.ts +1 -1
  373. package/src/runtime/control-plane/global-scheduler/maintenance.ts +256 -117
  374. package/src/runtime/control-plane/global-scheduler/reconciliation.ts +3 -12
  375. package/src/runtime/control-plane/global-scheduler/scheduler.ts +66 -40
  376. package/src/runtime/control-plane/global-scheduler/wake-signal.ts +42 -2
  377. package/src/runtime/control-plane/governance/access-policy.ts +19 -2
  378. package/src/runtime/control-plane/governance/authorization.ts +20 -3
  379. package/src/runtime/control-plane/governance/external-effects.ts +1 -1
  380. package/src/runtime/control-plane/launcher/chatgpt-round-continuation.ts +63 -300
  381. package/src/runtime/control-plane/launcher/chatgpt-work-continuation.ts +29 -300
  382. package/src/runtime/control-plane/launcher/local-conversation-controller.ts +238 -0
  383. package/src/runtime/control-plane/launcher/provider-mcp-bootstrap.ts +5 -2
  384. package/src/runtime/control-plane/launcher/thin-launcher.ts +96 -240
  385. package/src/runtime/control-plane/persistence/cognition-store.ts +820 -0
  386. package/src/runtime/control-plane/persistence/experience-store.ts +162 -29
  387. package/src/runtime/control-plane/persistence/requirement-store.ts +216 -74
  388. package/src/runtime/control-plane/persistence/sqlite-store.ts +113 -6
  389. package/src/runtime/control-plane/release-retention.ts +135 -47
  390. package/src/runtime/control-plane/repository-namespace-retention.ts +2 -2
  391. package/src/runtime/control-plane/runtime-cleanup.ts +295 -107
  392. package/src/runtime/control-plane/workspace/project-onboarding.ts +80 -0
  393. package/src/runtime/control-plane/workspace/semantic-sync-service.ts +19 -5
  394. package/src/runtime/control-plane/workspace/workspace-store.ts +169 -0
  395. package/src/runtime/diagnostics/incident-repair.ts +313 -146
  396. package/src/runtime/diagnostics/mcp-timing.ts +114 -0
  397. package/src/runtime/evidence/artifact-store.ts +158 -40
  398. package/src/runtime/evidence/evidence-store.ts +112 -8
  399. package/src/runtime/evidence/output-handle-index.ts +225 -0
  400. package/src/runtime/evidence/result-store.ts +158 -44
  401. package/src/runtime/evidence/sensitive-output.ts +22 -2
  402. package/src/runtime/execution/jobs/child-reference.ts +11 -0
  403. package/src/runtime/execution/jobs/receipt-recovery.ts +1 -11
  404. package/src/runtime/execution/jobs/store.ts +3 -4
  405. package/src/runtime/execution/managed-workspace.ts +57 -0
  406. package/src/runtime/execution/process-runtime/check-facade.ts +1 -1
  407. package/src/runtime/execution/process-runtime/check-result-retention.ts +2 -2
  408. package/src/runtime/execution/process-runtime/check-result.ts +105 -1
  409. package/src/runtime/execution/process-runtime/check-runner-sidecar.ts +18 -8
  410. package/src/runtime/execution/process-runtime/command-facade.ts +82 -30
  411. package/src/runtime/execution/process-runtime/gc.ts +15 -2
  412. package/src/runtime/execution/process-runtime/handle-index.ts +176 -0
  413. package/src/runtime/execution/process-runtime/host-command-lane.ts +139 -0
  414. package/src/runtime/execution/process-runtime/index.ts +3 -0
  415. package/src/runtime/execution/process-runtime/lightweight-managed.ts +251 -72
  416. package/src/runtime/execution/process-runtime/persisted-check.ts +3 -3
  417. package/src/runtime/execution/process-runtime/process-runner-entry.ts +47 -5
  418. package/src/runtime/execution/process-runtime/process-scope.ts +160 -0
  419. package/src/runtime/execution/process-runtime/resource-claims.ts +65 -61
  420. package/src/runtime/execution/process-runtime/runtime.ts +55 -18
  421. package/src/runtime/execution/process-runtime/store.ts +30 -2
  422. package/src/runtime/execution/process-runtime/types.ts +6 -1
  423. package/src/runtime/execution/thin-harness/execution-router.ts +16 -16
  424. package/src/runtime/execution/thin-harness/fast-executor.ts +2 -2
  425. package/src/runtime/execution/thin-harness/search-worker.ts +2 -2
  426. package/src/runtime/execution/workers/executor.ts +3 -8
  427. package/src/runtime/maintenance/cleanup.ts +41 -5
  428. package/src/runtime/platform/service-inventory.ts +130 -0
  429. package/src/runtime/platform/service-manager.ts +8 -0
  430. package/src/runtime/plugins/action-application.ts +97 -29
  431. package/src/runtime/plugins/app-store-connect-adapter.ts +290 -18
  432. package/src/runtime/plugins/browser-adapter.ts +1124 -333
  433. package/src/runtime/plugins/browser-automation-service.ts +23 -3
  434. package/src/runtime/plugins/browser-macos-bridge.ts +431 -137
  435. package/src/runtime/plugins/browser-manifest-surface.ts +47 -12
  436. package/src/runtime/plugins/browser-native-session-service.ts +63 -13
  437. package/src/runtime/plugins/browser-registration.ts +18 -0
  438. package/src/runtime/plugins/browser-runtime.ts +40 -36
  439. package/src/runtime/plugins/browser-session-authority.ts +2 -2
  440. package/src/runtime/plugins/browser-session-store.ts +46 -76
  441. package/src/runtime/plugins/capability-authorization-grants.ts +258 -62
  442. package/src/runtime/plugins/computer-chatgpt-browser-adapter-installer.ts +228 -0
  443. package/src/runtime/plugins/computer-registration.ts +298 -20
  444. package/src/runtime/plugins/desktop-operator-external-policy.ts +36 -4
  445. package/src/runtime/plugins/desktop-operator-registration.ts +12 -4
  446. package/src/runtime/plugins/external-adapter.ts +42 -6
  447. package/src/runtime/plugins/external-registration.ts +21 -1
  448. package/src/runtime/plugins/github-adapter.ts +30 -3
  449. package/src/runtime/plugins/gmail-adapter.ts +189 -3
  450. package/src/runtime/plugins/google-calendar-adapter.ts +2 -2
  451. package/src/runtime/plugins/google-shared.ts +24 -12
  452. package/src/runtime/plugins/google-tasks-adapter.ts +2 -2
  453. package/src/runtime/plugins/ios/remote-xpc-hid.ts +70 -30
  454. package/src/runtime/plugins/ios-adapter.ts +46 -41
  455. package/src/runtime/plugins/ios-agent-device.ts +54 -4
  456. package/src/runtime/plugins/ios-device-ownership.ts +103 -0
  457. package/src/runtime/plugins/ios-physical-device.ts +497 -79
  458. package/src/runtime/plugins/lightweight-action.ts +208 -2
  459. package/src/runtime/plugins/local-system-adapter.ts +12 -100
  460. package/src/runtime/plugins/managed-process-adapter.ts +12 -5
  461. package/src/runtime/plugins/plugin-action-sidecar.ts +17 -13
  462. package/src/runtime/plugins/plugin-management-adapter.ts +1 -1
  463. package/src/runtime/plugins/store.ts +682 -435
  464. package/src/runtime/plugins/types.ts +24 -0
  465. package/src/runtime/plugins/xiaohongshu-publish.ts +16 -0
  466. package/src/runtime/projections/git-status-sampler.ts +2 -19
  467. package/src/runtime/projections/invalidation.ts +7 -3
  468. package/src/runtime/projections/materialized-view.ts +80 -36
  469. package/src/runtime/recovery/actions.ts +4 -4
  470. package/src/runtime/recovery/capability-action-application.ts +46 -45
  471. package/src/runtime/recovery/lifecycle-inventory.ts +30 -40
  472. package/src/runtime/recovery/maintenance-executor.ts +374 -123
  473. package/src/runtime/recovery/probe.ts +2 -2
  474. package/src/runtime/recovery/store.ts +29 -11
  475. package/src/runtime/release/release-coordinator.ts +312 -0
  476. package/src/runtime/release/release-session.ts +716 -0
  477. package/src/runtime/release/release-state-migration.ts +25 -0
  478. package/src/runtime/resources/leases/store.ts +56 -25
  479. package/src/runtime/root/computer-composition.ts +191 -6
  480. package/src/runtime/root/controller-progression-composition.ts +254 -0
  481. package/src/runtime/root/controller-round-composition.ts +20 -1
  482. package/src/runtime/root/deployment-topology.ts +106 -0
  483. package/src/runtime/root/entry.ts +4 -3
  484. package/src/runtime/root/known-good-recovery.ts +184 -0
  485. package/src/runtime/root/local-bridge.ts +0 -1
  486. package/src/runtime/root/mcp-transport.ts +111 -18
  487. package/src/runtime/root/ownership.ts +261 -9
  488. package/src/runtime/root/package-connector-service.ts +227 -29
  489. package/src/runtime/root/package-runtime-release.ts +117 -30
  490. package/src/runtime/root/package-runtime-service.ts +24 -24
  491. package/src/runtime/root/release-execution-canary.ts +57 -12
  492. package/src/runtime/root/release-loader.ts +90 -8
  493. package/src/runtime/root/release-manifest.ts +80 -40
  494. package/src/runtime/root/release-materialize.ts +372 -106
  495. package/src/runtime/root/release-store.ts +395 -36
  496. package/src/runtime/root/runtime-lane.ts +191 -0
  497. package/src/runtime/root/runtime.ts +160 -29
  498. package/src/runtime/root/scheduled-controller-composition.ts +29 -3
  499. package/src/runtime/root/service-runner.ts +2 -2
  500. package/src/runtime/root/service.ts +126 -44
  501. package/src/runtime/root/status.ts +48 -0
  502. package/src/runtime/root/types.ts +32 -9
  503. package/src/runtime/root/workflow-supervisor-composition.ts +681 -0
  504. package/src/runtime/root/workflow-supervisor-runtime.ts +564 -0
  505. package/src/runtime/root/write-fence.ts +50 -2
  506. package/src/runtime/safe-tooling/google-credential-store.ts +67 -22
  507. package/src/runtime/safe-tooling/google-oauth-broker.ts +25 -7
  508. package/src/runtime/safe-tooling/ios-development.ts +22 -8
  509. package/src/runtime/safe-tooling/job-summary.ts +1 -1
  510. package/src/runtime/safe-tooling/workspace-auth.ts +5 -2
  511. package/src/runtime/shared/atomic-text-file.ts +21 -0
  512. package/src/runtime/shared/bounded-child-supervisor.ts +9 -1
  513. package/src/runtime/shared/json-files.ts +8 -3
  514. package/src/runtime/shared/process-environment.ts +20 -9
  515. package/src/runtime/shared/response-budget.ts +1 -3
  516. package/src/runtime/standalone-recovery/controller-home-migration.ts +16 -24
  517. package/src/runtime/standalone-recovery/core.ts +3792 -417
  518. package/src/runtime/standalone-recovery/entry.ts +507 -45
  519. package/src/runtime/standalone-recovery/installer.ts +262 -148
  520. package/src/runtime/standalone-recovery/mcp-server.ts +29 -193
  521. package/src/runtime/standalone-recovery/operation-lock.ts +12 -2
  522. package/src/runtime/standalone-recovery/performance.ts +54 -16
  523. package/src/runtime/standalone-recovery/release.ts +53 -5
  524. package/src/runtime/standalone-recovery/service-labels.ts +5 -2
  525. package/src/runtime/standalone-recovery/watchdog-heartbeat.ts +5 -2
  526. package/src/runtime/workflow/schedules/browser-probe.ts +17 -6
  527. package/src/runtime/workflow/schedules/chatgpt-automation-migration.ts +11 -3
  528. package/src/runtime/workflow/schedules/engine.ts +166 -178
  529. package/src/runtime/workflow/schedules/pending-activation.ts +11 -4
  530. package/src/runtime/workflow/schedules/work-continuation.ts +95 -11
  531. package/src/runtime/workflows/runtime.ts +15 -19
  532. package/src/testing/test-governance.ts +5 -1
  533. package/supervisor/chatgpt-conversation.ts +23 -0
  534. package/supervisor/client.ts +218 -0
  535. package/supervisor/control-plane.ts +963 -0
  536. package/supervisor/entry.ts +15 -0
  537. package/supervisor/forge-validators.ts +147 -0
  538. package/supervisor/index.ts +5 -0
  539. package/supervisor/native-browser-adapter.ts +1151 -0
  540. package/supervisor/native-messaging/host.ts +58 -0
  541. package/supervisor/native-messaging/manifest.ts +26 -0
  542. package/supervisor/native-messaging/protocol.ts +27 -0
  543. package/supervisor/paths.ts +18 -0
  544. package/supervisor/protocol.ts +250 -0
  545. package/supervisor/server.ts +412 -0
  546. package/supervisor/store.ts +1870 -0
  547. package/supervisor/tsconfig.json +8 -0
  548. package/supervisor/types.ts +261 -0
  549. package/SKILL.md +0 -427
  550. package/adapters/chatgpt/controller-host.ts +0 -119
  551. package/adapters/mcp/controller-round-compatibility.ts +0 -184
  552. package/adapters/mcp/frozen-client-semantic-compatibility.ts +0 -292
  553. package/adapters/mcp/runtime-gateway/work-compat-adapter.ts +0 -502
  554. package/adapters/mcp/runtime-gateway/work-validation-reconciler.ts +0 -1
  555. package/adapters/mcp/toolset-selection.ts +0 -41
  556. package/agents/openai.yaml +0 -4
  557. package/assets/skill-hooks.json +0 -41
  558. package/assets/skill-version.json +0 -189
  559. package/assets/skills/claude-review/SKILL.md +0 -231
  560. package/assets/skills/codex-review/SKILL.md +0 -103
  561. package/assets/templates/helpers/check-skill-version.ts +0 -193
  562. package/packages/kernel/progression/api/index.ts +0 -2
  563. package/packages/kernel/progression/application/projector.ts +0 -211
  564. package/packages/kernel/progression/domain/types.ts +0 -116
  565. package/packages/kernel/progression/index.ts +0 -1
  566. package/packages/kernel/scheduler/application/continuation-service.ts +0 -212
  567. package/packages/kernel/scheduler/domain/continuation.ts +0 -38
  568. package/packages/kernel/scheduler/infrastructure/continuation-dispatch-store.ts +0 -38
  569. package/packages/kernel/work/domain/admission-policy.ts +0 -34
  570. package/scripts/benchmark-background-check-overlap.ts +0 -228
  571. package/scripts/benchmark-computer-hotpath.ts +0 -255
  572. package/scripts/benchmark-controller-hotpath.ts +0 -212
  573. package/scripts/benchmark-controller-round2.ts +0 -191
  574. package/scripts/benchmark-ios-agent-device.ts +0 -511
  575. package/scripts/benchmark-mcp-host.sh +0 -117
  576. package/scripts/benchmark-mcp-transport.ts +0 -169
  577. package/scripts/benchmark-operational-memory-activation.ts +0 -235
  578. package/scripts/benchmark-operational-shadow.ts +0 -28
  579. package/scripts/benchmark-quality-harness.ts +0 -146
  580. package/scripts/benchmark-route-session-concurrency.ts +0 -915
  581. package/scripts/benchmark-thin-harness-gateway-ab.ts +0 -632
  582. package/scripts/benchmark-thin-harness-mcp-e2e.ts +0 -498
  583. package/scripts/benchmark-thin-harness.ts +0 -251
  584. package/scripts/benchmark-typescript-navigation.ts +0 -186
  585. package/scripts/benchmark-work-efficiency.ts +0 -334
  586. package/scripts/build-controller-ui.ts +0 -28
  587. package/scripts/check-npm-release.sh +0 -32
  588. package/scripts/check-public-release-surface.sh +0 -19
  589. package/scripts/check-release-published.sh +0 -57
  590. package/scripts/check-release-readiness.sh +0 -37
  591. package/scripts/check-release-version.mjs +0 -74
  592. package/scripts/check-skill-version.ts +0 -5
  593. package/scripts/check-tarball-install-smoke.sh +0 -150
  594. package/scripts/ensure-codegraph.sh +0 -16
  595. package/scripts/package-source-archive.sh +0 -147
  596. package/scripts/public-release-files.txt +0 -39
  597. package/scripts/public-release.ts +0 -174
  598. package/scripts/publish-release-tarball.sh +0 -27
  599. package/scripts/route-nl-vs-ts-eval.ts +0 -679
  600. package/scripts/run-skill-hook.ts +0 -244
  601. package/scripts/stage-runtime-release.ts +0 -44
  602. package/scripts/sync-codex-installed-copies.sh +0 -182
  603. package/src/cli/commands/tools.ts +0 -167
  604. package/src/cli/controller/progress.ts +0 -656
  605. package/src/cli/controller/work-mode.ts +0 -181
  606. package/src/cli/local-bridge/console-assets.ts +0 -17
  607. package/src/cli/local-bridge/dashboard.ts +0 -17
  608. package/src/cli/local-bridge/frontend/src/App.tsx +0 -10
  609. package/src/cli/local-bridge/frontend/src/components/Button.tsx +0 -1
  610. package/src/cli/local-bridge/frontend/src/components/DetailPane.tsx +0 -3
  611. package/src/cli/local-bridge/frontend/src/components/SearchField.tsx +0 -1
  612. package/src/cli/local-bridge/frontend/src/components/SectionHeader.tsx +0 -1
  613. package/src/cli/local-bridge/frontend/src/components/Segmented.tsx +0 -1
  614. package/src/cli/local-bridge/frontend/src/components/StatusText.tsx +0 -3
  615. package/src/cli/local-bridge/frontend/src/design/icons.tsx +0 -11
  616. package/src/cli/local-bridge/frontend/src/design/tokens.css +0 -8
  617. package/src/cli/local-bridge/frontend/src/features/automations/AutomationsView.tsx +0 -153
  618. package/src/cli/local-bridge/frontend/src/features/capabilities/CapabilitiesView.tsx +0 -37
  619. package/src/cli/local-bridge/frontend/src/features/overview/OverviewView.tsx +0 -183
  620. package/src/cli/local-bridge/frontend/src/features/repositories/RepositoriesView.tsx +0 -2
  621. package/src/cli/local-bridge/frontend/src/features/system/SystemView.tsx +0 -2
  622. package/src/cli/local-bridge/frontend/src/features/work/WorkView.tsx +0 -4
  623. package/src/cli/local-bridge/frontend/src/lib/api.ts +0 -30
  624. package/src/cli/local-bridge/frontend/src/lib/format.ts +0 -4
  625. package/src/cli/local-bridge/frontend/src/lib/routes.ts +0 -7
  626. package/src/cli/local-bridge/frontend/src/main.tsx +0 -1
  627. package/src/cli/local-bridge/frontend/src/shell/AppShell.tsx +0 -1
  628. package/src/cli/local-bridge/frontend/src/shell/CommandBar.tsx +0 -2
  629. package/src/cli/local-bridge/frontend/src/shell/Sidebar.tsx +0 -4
  630. package/src/cli/local-bridge/frontend/src/styles.css +0 -28
  631. package/src/cli/local-bridge/frontend/src/types.ts +0 -15
  632. package/src/cli/local-bridge/frontend/src/vite-env.d.ts +0 -1
  633. package/src/cli/local-bridge/frontend/vite.config.ts +0 -27
  634. package/src/cli/local-bridge/ui-dist/app.css +0 -1
  635. package/src/cli/local-bridge/ui-dist/app.js +0 -11228
  636. package/src/cli/mcp/access-mode.ts +0 -2
  637. package/src/cli/mcp/access-tools.ts +0 -2
  638. package/src/cli/mcp/audit.ts +0 -2
  639. package/src/cli/mcp/auth.ts +0 -2
  640. package/src/cli/mcp/instructions.ts +0 -2
  641. package/src/cli/mcp/legacy-context.ts +0 -2
  642. package/src/cli/mcp/legacy-tool-service.ts +0 -2
  643. package/src/cli/mcp/multi-repository.ts +0 -2
  644. package/src/cli/mcp/oauth.ts +0 -2
  645. package/src/cli/mcp/openai-secure-tunnel.ts +0 -2
  646. package/src/cli/mcp/paths.ts +0 -2
  647. package/src/cli/mcp/policy.ts +0 -2
  648. package/src/cli/mcp/post-finalize-work-attribution.ts +0 -2
  649. package/src/cli/mcp/proxy-env.ts +0 -2
  650. package/src/cli/mcp/readiness-projection.ts +0 -2
  651. package/src/cli/mcp/redaction.ts +0 -2
  652. package/src/cli/mcp/repo.ts +0 -2
  653. package/src/cli/mcp/repository-tools.ts +0 -2
  654. package/src/cli/mcp/server.ts +0 -2
  655. package/src/cli/mcp/setup.ts +0 -2
  656. package/src/cli/mcp/tool-capability-cache.ts +0 -2
  657. package/src/cli/mcp/tool-contract.ts +0 -2
  658. package/src/cli/mcp/tools.ts +0 -2
  659. package/src/cli/mcp/toolset-names.ts +0 -2
  660. package/src/cli/mcp/toolset-selection.ts +0 -2
  661. package/src/cli/mcp/toolset.ts +0 -2
  662. package/src/cli/mcp/transports/http.ts +0 -2
  663. package/src/cli/mcp/transports/session-registry.ts +0 -2
  664. package/src/cli/mcp/transports/stdio.ts +0 -2
  665. package/src/cli/mcp/types.ts +0 -2
  666. package/src/cli/mcp/umbrella-tools.ts +0 -2
  667. package/src/cli/tools/codegraph.ts +0 -695
  668. package/src/core/adoption/helper-wrapper-plan.ts +0 -159
  669. package/src/runtime/context/codegraph-cache-boundary.ts +0 -255
  670. package/src/runtime/context/codegraph-read-provider.ts +0 -611
  671. package/src/runtime/context/codegraph-sidecar.cjs +0 -248
  672. package/src/runtime/control-plane/codegraph-cache-retention.ts +0 -164
  673. package/src/runtime/control-plane/execution/content-equivalent-commit-authority.ts +0 -169
  674. package/src/runtime/control-plane/execution/direct-canonical-work-reconciliation.ts +0 -85
  675. package/src/runtime/control-plane/execution/direct-edit-work-completion.ts +0 -655
  676. package/src/runtime/control-plane/execution/work-finalization-service.ts +0 -2850
  677. package/src/runtime/control-plane/execution/work-path-scope.ts +0 -37
  678. package/src/runtime/control-plane/execution/work-task-receipt.ts +0 -468
  679. package/src/runtime/control-plane/facade/controller-round-relay.ts +0 -3
  680. package/src/runtime/control-plane/facade/work-admission-policy.ts +0 -142
  681. package/src/runtime/control-plane/facade/work-implementation-review.ts +0 -2
  682. package/src/runtime/control-plane/facade/work-state-machine.ts +0 -2
  683. package/src/runtime/control-plane/facade/work-task-projection.ts +0 -66
  684. package/src/runtime/control-plane/routing/index.ts +0 -1
  685. package/src/runtime/control-plane/routing/route-policy.ts +0 -401
  686. package/src/runtime/control-plane/routing/workspace-admission.ts +0 -70
  687. package/src/runtime/gateway/mcp/execution-tools.ts +0 -2
  688. package/src/runtime/gateway/mcp/legacy-ios-tool-adapter.ts +0 -2
  689. package/src/runtime/gateway/mcp/persisted-check-process.ts +0 -2
  690. package/src/runtime/gateway/mcp/process-tools.ts +0 -2
  691. package/src/runtime/gateway/mcp/router.ts +0 -2
  692. package/src/runtime/gateway/mcp/runtime-tool-definitions.ts +0 -2
  693. package/src/runtime/gateway/mcp/runtime-tools.ts +0 -2
  694. package/src/runtime/gateway/mcp/work-validation-reconciler.ts +0 -2
  695. package/src/runtime/plugins/browser-provider-registry.ts +0 -2
@@ -0,0 +1,254 @@
1
+ import {
2
+ beginControllerRoundRelayAfterRelease,
3
+ bindControllerSessionToCurrentRuntime,
4
+ controllerRoundBlockerClass,
5
+ controllerSessionPrincipalId,
6
+ getControllerRoundRelay,
7
+ getControllerWorkBinding,
8
+ getRetainedControllerSession,
9
+ prepareControllerRoundOccurrence,
10
+ resumeControllerRoundOccurrence,
11
+ type ControllerBinding,
12
+ type ControllerHost,
13
+ type ControllerSession,
14
+ } from '../../../packages/kernel/controller/api/index';
15
+ import { getWorkContract, semanticWorkState } from '../../../packages/kernel/work/api/index';
16
+ import {
17
+ controllerHostForScheduledBinding,
18
+ ensureScheduledControllerBindingForWork,
19
+ } from './scheduled-controller-composition';
20
+ import {
21
+ ensureWorkflowSupervisorEnrollmentForWork,
22
+ wakeWorkflowSupervisorScheduledTaskForWork,
23
+ type WorkflowSupervisorEnrollmentStatus,
24
+ } from './workflow-supervisor-composition';
25
+ import { getRuntimeWriteClaim } from './write-fence';
26
+
27
+ export interface ControllerProgressionInput {
28
+ workId: string;
29
+ occurrenceId: string;
30
+ relayScopeId?: string;
31
+ continuationHint?: string;
32
+ allowSemanticWaitRecovery?: boolean;
33
+ scheduleName?: string;
34
+ scheduleId?: string;
35
+ scheduleOccurrenceId?: string;
36
+ bindingArgs?: Record<string, unknown>;
37
+ }
38
+
39
+ export interface ControllerProgressionDependencies {
40
+ ensureBinding?: typeof ensureScheduledControllerBindingForWork;
41
+ hostForBinding?: typeof controllerHostForScheduledBinding;
42
+ prepareOccurrence?: typeof prepareControllerRoundOccurrence;
43
+ resumeOccurrence?: typeof resumeControllerRoundOccurrence;
44
+ ensureSupervisorEnrollment?: typeof ensureWorkflowSupervisorEnrollmentForWork;
45
+ wakeScheduledSupervisorTask?: typeof wakeWorkflowSupervisorScheduledTaskForWork;
46
+ }
47
+
48
+ export type ControllerProgressionResult =
49
+ | { status: 'terminal_or_missing'; reason: string }
50
+ | { status: 'retained_session_missing'; reason: string }
51
+ | { status: 'human_controller'; reason: string }
52
+ | { status: 'semantic_wait'; reason?: string; binding: ControllerBinding }
53
+ | { status: 'wait_for_user'; reason?: string; binding: ControllerBinding }
54
+ | { status: 'rejected'; reason?: string; binding: ControllerBinding }
55
+ | {
56
+ status: 'chatgpt_enrolled';
57
+ binding: ControllerBinding;
58
+ relayScopeId: string;
59
+ reused: boolean;
60
+ supervisorEnrollment: {
61
+ status: WorkflowSupervisorEnrollmentStatus;
62
+ taskId?: string;
63
+ effectId?: string;
64
+ reason?: string;
65
+ };
66
+ }
67
+ | {
68
+ status: 'scheduled_supervisor_woken';
69
+ binding: ControllerBinding;
70
+ taskId: string;
71
+ effectId: string;
72
+ }
73
+ | {
74
+ status: 'chatgpt_not_enrolled';
75
+ binding: ControllerBinding;
76
+ relayScopeId: string;
77
+ reused: boolean;
78
+ supervisorEnrollment: {
79
+ status: WorkflowSupervisorEnrollmentStatus;
80
+ taskId?: string;
81
+ effectId?: string;
82
+ reason?: string;
83
+ };
84
+ }
85
+ | {
86
+ status: 'provider_dispatched';
87
+ binding: ControllerBinding;
88
+ relayScopeId: string;
89
+ reused: boolean;
90
+ providerDispatchReceiptId?: string;
91
+ };
92
+
93
+ /**
94
+ * Stateless composition for one already-authorized Controller progression
95
+ * occurrence. It owns no persistence and introduces no lifecycle state.
96
+ *
97
+ * Work decides semantic terminality. ControllerSession/ControllerRound provide
98
+ * retained execution identity and one mechanical occurrence. Workflow Supervisor
99
+ * exclusively reserves and delivers Work-bound ChatGPT effects. Non-ChatGPT
100
+ * ControllerHost remains the direct provider boundary.
101
+ */
102
+ function rebindRetainedSessionToCurrentRuntime(
103
+ options: { controllerHome: string; repoId: string },
104
+ session: ControllerSession,
105
+ ): ControllerSession {
106
+ const currentRuntimeInstanceId = getRuntimeWriteClaim()?.runtimeInstanceId?.trim();
107
+ if (!currentRuntimeInstanceId || currentRuntimeInstanceId === session.controllerInstanceId?.trim()) return session;
108
+ return bindControllerSessionToCurrentRuntime({
109
+ controllerHome: options.controllerHome,
110
+ repoId: options.repoId,
111
+ }, {
112
+ workId: session.workId,
113
+ controllerId: session.controllerId,
114
+ controllerType: session.controllerType,
115
+ sessionId: session.sessionId,
116
+ principalId: controllerSessionPrincipalId(session),
117
+ controllerInstanceId: currentRuntimeInstanceId,
118
+ currentRuntimeInstanceId,
119
+ allowClaimIfMissing: true,
120
+ });
121
+ }
122
+
123
+ export async function reconcileControllerProgression(
124
+ options: { controllerHome: string; repoId: string; repoRoot: string },
125
+ input: ControllerProgressionInput,
126
+ dependencies: ControllerProgressionDependencies = {},
127
+ ): Promise<ControllerProgressionResult> {
128
+ const store = { controllerHome: options.controllerHome, repoId: options.repoId };
129
+ const work = getWorkContract(store, input.workId);
130
+ if (!work || semanticWorkState(work) !== 'open') {
131
+ return { status: 'terminal_or_missing', reason: work ? `WORK_TERMINAL:${semanticWorkState(work)}` : 'WORK_NOT_FOUND' };
132
+ }
133
+
134
+ const retainedSession = getRetainedControllerSession(store, input.workId);
135
+ if (!retainedSession) return { status: 'retained_session_missing', reason: 'CONTROLLER_SESSION_NOT_RETAINED' };
136
+ if (retainedSession.controllerType === 'human') return { status: 'human_controller', reason: 'HUMAN_CONTROLLER' };
137
+
138
+ let existingRound = retainedSession.controllerType === 'chatgpt'
139
+ ? getControllerRoundRelay(store, input.workId)
140
+ : undefined;
141
+ if (existingRound?.status === 'pending_release') {
142
+ // The release fence belongs to the previous Controller epoch. Consume it
143
+ // before migrating the retained session to the new Runtime epoch.
144
+ existingRound = beginControllerRoundRelayAfterRelease(store, {
145
+ workId: input.workId,
146
+ releasedSession: retainedSession,
147
+ }) ?? getControllerRoundRelay(store, input.workId);
148
+ }
149
+ const session = rebindRetainedSessionToCurrentRuntime(store, retainedSession);
150
+
151
+ const ensureBinding = dependencies.ensureBinding ?? ensureScheduledControllerBindingForWork;
152
+ const existingBinding = getControllerWorkBinding(store, input.workId)?.binding;
153
+ const binding = existingBinding ?? ensureBinding(store, {
154
+ workId: input.workId,
155
+ session,
156
+ scheduleName: input.scheduleName,
157
+ args: input.bindingArgs ?? {},
158
+ });
159
+
160
+ if (session.controllerType === 'chatgpt' && input.scheduleId && input.scheduleOccurrenceId) {
161
+ const wakeScheduledSupervisorTask = dependencies.wakeScheduledSupervisorTask ?? wakeWorkflowSupervisorScheduledTaskForWork;
162
+ const wake = await wakeScheduledSupervisorTask(
163
+ store, input.workId, input.scheduleId, input.scheduleOccurrenceId,
164
+ );
165
+ if (wake.status === 'woken' && wake.taskId && wake.effectId) {
166
+ return {
167
+ status: 'scheduled_supervisor_woken',
168
+ binding,
169
+ taskId: wake.taskId,
170
+ effectId: wake.effectId,
171
+ };
172
+ }
173
+ }
174
+
175
+ if (session.controllerType === 'chatgpt') {
176
+ const ensureSupervisorEnrollment = dependencies.ensureSupervisorEnrollment ?? ensureWorkflowSupervisorEnrollmentForWork;
177
+ let controllerRoundOccurrenceId = input.occurrenceId;
178
+ if (existingRound?.status === 'pending_release') {
179
+ // The semantic turn already chose continue_immediately. Once its exact
180
+ // ControllerSession lease has been released, reopen that same durable
181
+ // ControllerRound for dispatch before reserving another Supervisor effect.
182
+ // Schedule occurrence ids are trigger evidence, not a replacement
183
+ // ControllerRound identity for an already-open continuation chain.
184
+ existingRound = beginControllerRoundRelayAfterRelease(store, {
185
+ workId: input.workId,
186
+ releasedSession: retainedSession,
187
+ }) ?? getControllerRoundRelay(store, input.workId);
188
+ }
189
+ // An already-open recoverable ControllerRound keeps its durable occurrence
190
+ // identity across Scheduler wake attempts. A fresh ScheduleOccurrence is
191
+ // trigger/evidence identity only; replacing the round occurrence here would
192
+ // manufacture a second open round and permanently self-block continuation.
193
+ if (existingRound?.occurrenceId?.trim()
194
+ && ['dispatching', 'dispatched', 'claimed'].includes(existingRound.status)) {
195
+ controllerRoundOccurrenceId = existingRound.occurrenceId.trim();
196
+ }
197
+ if (existingRound?.status === 'blocked'
198
+ && controllerRoundBlockerClass(existingRound) === 'provider_dispatch_outcome_unknown') {
199
+ const supervisorEnrollment = await ensureSupervisorEnrollment(store, input.workId, input.scheduleId, input.scheduleOccurrenceId);
200
+ return {
201
+ status: supervisorEnrollment.status === 'enrolled' ? 'chatgpt_enrolled' : 'chatgpt_not_enrolled',
202
+ binding,
203
+ relayScopeId: existingRound.relayScopeId,
204
+ reused: true,
205
+ supervisorEnrollment,
206
+ };
207
+ }
208
+
209
+ const prepareOccurrence = dependencies.prepareOccurrence ?? prepareControllerRoundOccurrence;
210
+ const prepared = prepareOccurrence(store, {
211
+ occurrenceId: controllerRoundOccurrenceId,
212
+ workId: input.workId,
213
+ controllerBindingId: binding.bindingId,
214
+ relayScopeId: input.relayScopeId,
215
+ continuationHint: input.continuationHint,
216
+ allowSemanticWaitRecovery: input.allowSemanticWaitRecovery,
217
+ });
218
+ if (prepared.outcome === 'semantic_wait') return { status: 'semantic_wait', reason: prepared.reason, binding };
219
+ if (prepared.outcome === 'wait_for_user') return { status: 'wait_for_user', reason: prepared.reason, binding };
220
+ if (prepared.outcome === 'rejected') return { status: 'rejected', reason: prepared.reason, binding };
221
+
222
+ const supervisorEnrollment = await ensureSupervisorEnrollment(store, input.workId, input.scheduleId, input.scheduleOccurrenceId);
223
+ return {
224
+ status: supervisorEnrollment.status === 'enrolled' ? 'chatgpt_enrolled' : 'chatgpt_not_enrolled',
225
+ binding,
226
+ relayScopeId: prepared.relay.relayScopeId,
227
+ reused: prepared.reused,
228
+ supervisorEnrollment,
229
+ };
230
+ }
231
+
232
+ const hostForBinding = dependencies.hostForBinding ?? controllerHostForScheduledBinding;
233
+ const host: ControllerHost = hostForBinding(options, binding);
234
+ const resumeOccurrence = dependencies.resumeOccurrence ?? resumeControllerRoundOccurrence;
235
+ const resumed = await resumeOccurrence(store, {
236
+ occurrenceId: input.occurrenceId,
237
+ workId: input.workId,
238
+ controllerBindingId: binding.bindingId,
239
+ relayScopeId: input.relayScopeId,
240
+ continuationHint: input.continuationHint,
241
+ allowSemanticWaitRecovery: input.allowSemanticWaitRecovery,
242
+ }, host);
243
+
244
+ if (resumed.outcome === 'semantic_wait') return { status: 'semantic_wait', reason: resumed.reason, binding };
245
+ if (resumed.outcome === 'wait_for_user') return { status: 'wait_for_user', reason: resumed.reason, binding };
246
+ if (resumed.outcome === 'rejected') return { status: 'rejected', reason: resumed.reason, binding };
247
+ return {
248
+ status: 'provider_dispatched',
249
+ binding,
250
+ relayScopeId: resumed.relay.relayScopeId,
251
+ reused: resumed.reused,
252
+ providerDispatchReceiptId: resumed.providerDispatchReceiptId,
253
+ };
254
+ }
@@ -3,6 +3,11 @@ import type { AssistantContextSnapshot, ControllerRoundRelayRecord } from '../..
3
3
  import { prepareAssistantWorkContext } from '../context/assistant-work-context';
4
4
  import { renderAssistantContext, type AssistantContextResolution } from '../context/assistant-context';
5
5
  import { getChatgptWorkConversationBinding } from '../../../adapters/chatgpt/work-conversation-binding-store';
6
+ import {
7
+ chatgptControllerProviderBindingId,
8
+ upsertChatgptControllerBinding,
9
+ type ChatgptControllerBindingPayload,
10
+ } from '../../../adapters/chatgpt/controller-binding-store';
6
11
  import {
7
12
  buildChatgptControllerRoundPrompt,
8
13
  chatgptControllerRoundBindingAuthorizesRecovery,
@@ -22,6 +27,18 @@ export interface ChatgptControllerRoundBindingSnapshot {
22
27
  bindingId?: string;
23
28
  browserSessionId?: string;
24
29
  conversationUrl?: string;
30
+ authorizationGrantRefs?: string[];
31
+ }
32
+
33
+ export function chatgptControllerRoundBindingId(workId: string): string {
34
+ return chatgptControllerProviderBindingId(workId);
35
+ }
36
+
37
+ export function upsertChatgptControllerRoundTransportBinding(
38
+ store: ControllerRoundCompositionStore,
39
+ input: Omit<ChatgptControllerBindingPayload, 'schemaVersion' | 'bindingId' | 'repoId' | 'createdAt' | 'updatedAt'>,
40
+ ) {
41
+ return upsertChatgptControllerBinding(store, input);
25
42
  }
26
43
 
27
44
  export function chatgptControllerRoundBinding(
@@ -34,6 +51,7 @@ export function chatgptControllerRoundBinding(
34
51
  bindingId: binding.bindingId,
35
52
  browserSessionId: binding.latestBrowserSessionId,
36
53
  conversationUrl: binding.conversationUrl,
54
+ authorizationGrantRefs: [...(binding.authorizationGrantRefs ?? [])],
37
55
  };
38
56
  }
39
57
 
@@ -65,6 +83,7 @@ export function recordChatgptControllerRoundTabSettlement(
65
83
  relayScopeId: string;
66
84
  status: ChatgptControllerRoundSettlementStatus;
67
85
  error?: string;
86
+ attemptIdentity?: string;
68
87
  },
69
88
  ): void {
70
89
  recordChatgptControllerRoundSettlement(store, input);
@@ -79,7 +98,7 @@ function controllerAssistantContextSnapshot(resolution: AssistantContextResoluti
79
98
  sourceRevision: item.provenance.sourceRevision,
80
99
  }));
81
100
  const identity = {
82
- projectId: resolution.projectId,
101
+ ...(resolution.projectId ? { projectId: resolution.projectId } : {}),
83
102
  items,
84
103
  gaps: resolution.gaps,
85
104
  missingRequiredSources: resolution.missingRequiredSources,
@@ -0,0 +1,106 @@
1
+ export type RuntimeRemoteControllerKind = 'chatgpt' | 'mcp';
2
+
3
+ export interface RuntimeDeploymentTopology {
4
+ schemaVersion: 1;
5
+ remoteControllers: RuntimeRemoteControllerKind[];
6
+ capabilityIntents: string[];
7
+ persistentRuntimeRequired: boolean;
8
+ components: {
9
+ workflowSupervisor: boolean;
10
+ workflowSupervisorNativeBrowser: boolean;
11
+ };
12
+ }
13
+
14
+ const REMOTE_CONTROLLERS = new Set<RuntimeRemoteControllerKind>(['chatgpt', 'mcp']);
15
+
16
+ function normalizeCapabilityIntent(value: string): string {
17
+ const normalized = value.trim().toLowerCase();
18
+ if (!/^[-a-z0-9_.]{3,128}$/.test(normalized)) throw new Error(`RUNTIME_TOPOLOGY_CAPABILITY_INTENT_INVALID: ${value}`);
19
+ return normalized;
20
+ }
21
+
22
+ function normalizedRemoteControllers(values: readonly string[] | undefined): RuntimeRemoteControllerKind[] {
23
+ return Array.from(new Set(
24
+ (values ?? [])
25
+ .map((value) => value.trim().toLowerCase())
26
+ .filter((value): value is RuntimeRemoteControllerKind => REMOTE_CONTROLLERS.has(value as RuntimeRemoteControllerKind)),
27
+ )).sort();
28
+ }
29
+
30
+ export function deriveRuntimeDeploymentTopology(input: {
31
+ controllers?: readonly string[];
32
+ capabilityIntents?: readonly string[];
33
+ }): RuntimeDeploymentTopology {
34
+ const remoteControllers = normalizedRemoteControllers(input.controllers);
35
+ const capabilityIntents = Array.from(new Set(
36
+ (input.capabilityIntents ?? []).map(normalizeCapabilityIntent),
37
+ )).sort();
38
+ const chatgpt = remoteControllers.includes('chatgpt');
39
+ return {
40
+ schemaVersion: 1,
41
+ remoteControllers,
42
+ capabilityIntents,
43
+ persistentRuntimeRequired: remoteControllers.length > 0,
44
+ components: {
45
+ // Requirement-level ChatGPT continuation uses Supervisor Core as its
46
+ // outer-turn authority. Generic remote MCP transport does not.
47
+ workflowSupervisor: chatgpt,
48
+ // ChatGPT Work has one controlled outer-turn executor: the Supervisor's
49
+ // Computer adapter. It owns exact-conversation delivery and its durable
50
+ // effect ledger; Scheduler must never fall back to direct Browser delivery.
51
+ workflowSupervisorNativeBrowser: chatgpt,
52
+ },
53
+ };
54
+ }
55
+
56
+ /**
57
+ * Missing topology means an installation predates this contract. Preserve the
58
+ * complete ChatGPT Supervisor composition during upgrade.
59
+ */
60
+ export function legacyRuntimeDeploymentTopology(): RuntimeDeploymentTopology {
61
+ return deriveRuntimeDeploymentTopology({ controllers: ['chatgpt'] });
62
+ }
63
+
64
+ export function normalizeRuntimeDeploymentTopology(value: unknown): RuntimeDeploymentTopology {
65
+ if (value === undefined || value === null) return legacyRuntimeDeploymentTopology();
66
+ if (!value || typeof value !== 'object' || Array.isArray(value)) throw new Error('RUNTIME_TOPOLOGY_INVALID');
67
+ const record = value as Record<string, unknown>;
68
+ if (record.schemaVersion !== 1) throw new Error('RUNTIME_TOPOLOGY_VERSION_UNSUPPORTED');
69
+ if (!Array.isArray(record.remoteControllers)
70
+ || record.remoteControllers.some((entry) => typeof entry !== 'string' || !REMOTE_CONTROLLERS.has(entry as RuntimeRemoteControllerKind))) {
71
+ throw new Error('RUNTIME_TOPOLOGY_REMOTE_CONTROLLERS_INVALID');
72
+ }
73
+ if (!Array.isArray(record.capabilityIntents)
74
+ || record.capabilityIntents.some((entry) => typeof entry !== 'string')) {
75
+ throw new Error('RUNTIME_TOPOLOGY_CAPABILITY_INTENTS_INVALID');
76
+ }
77
+ const remoteControllers = normalizedRemoteControllers(record.remoteControllers as string[]);
78
+ const capabilityIntents = Array.from(new Set(
79
+ (record.capabilityIntents as string[]).map(normalizeCapabilityIntent),
80
+ )).sort();
81
+ const canonical = deriveRuntimeDeploymentTopology({ controllers: remoteControllers, capabilityIntents });
82
+ const components = record.components;
83
+ if (!components || typeof components !== 'object' || Array.isArray(components)) throw new Error('RUNTIME_TOPOLOGY_COMPONENTS_REQUIRED');
84
+ const componentRecord = components as Record<string, unknown>;
85
+ if (typeof componentRecord.workflowSupervisor !== 'boolean'
86
+ || typeof componentRecord.workflowSupervisorNativeBrowser !== 'boolean') {
87
+ throw new Error('RUNTIME_TOPOLOGY_COMPONENTS_INVALID');
88
+ }
89
+ if (componentRecord.workflowSupervisor !== canonical.components.workflowSupervisor
90
+ || record.persistentRuntimeRequired !== canonical.persistentRuntimeRequired) {
91
+ throw new Error('RUNTIME_TOPOLOGY_DERIVATION_MISMATCH');
92
+ }
93
+ // The flag is derived, so stale persisted topology cannot disable the sole
94
+ // autonomous delivery owner or reintroduce an alternate Browser path.
95
+ return canonical;
96
+ }
97
+
98
+ export function parseRuntimeDeploymentTopologyArgument(value: string | undefined): RuntimeDeploymentTopology {
99
+ if (!value?.trim()) return legacyRuntimeDeploymentTopology();
100
+ try {
101
+ return normalizeRuntimeDeploymentTopology(JSON.parse(value));
102
+ } catch (error) {
103
+ const detail = error instanceof Error ? error.message : String(error);
104
+ throw new Error(`RUNTIME_TOPOLOGY_ARGUMENT_INVALID: ${detail}`);
105
+ }
106
+ }
@@ -3,6 +3,7 @@ import { resolve } from 'path';
3
3
  import { pathToFileURL } from 'url';
4
4
  import { Command } from 'commander';
5
5
  import { CanonicalForgeRuntime } from './runtime';
6
+ import { parseRuntimeDeploymentTopologyArgument } from './deployment-topology';
6
7
 
7
8
  interface CliOptions {
8
9
  controllerHome: string;
@@ -11,7 +12,7 @@ interface CliOptions {
11
12
  host: string;
12
13
  port: string;
13
14
  authTokenFile: string;
14
- exclusiveWorkId?: string;
15
+ deploymentTopology?: string;
15
16
  }
16
17
 
17
18
  function readAuthToken(path: string): string {
@@ -29,7 +30,7 @@ export async function runCanonicalRuntimeCli(argv = process.argv): Promise<void>
29
30
  .requiredOption('--host <host>', 'MCP listener host')
30
31
  .requiredOption('--port <port>', 'MCP listener port')
31
32
  .requiredOption('--auth-token-file <path>', 'Bearer token file')
32
- .option('--exclusive-work-id <id>', 'Persistently admit only this P0 Work while migration is active');
33
+ .option('--deployment-topology <json>', 'Normalized product-level Runtime deployment topology');
33
34
  command.parse(argv);
34
35
  const options = command.opts<CliOptions>();
35
36
  const port = Number(options.port);
@@ -40,8 +41,8 @@ export async function runCanonicalRuntimeCli(argv = process.argv): Promise<void>
40
41
  releaseManifestPath: resolve(options.releaseManifest),
41
42
  host: options.host,
42
43
  port,
44
+ topology: parseRuntimeDeploymentTopologyArgument(options.deploymentTopology),
43
45
  authToken: readAuthToken(options.authTokenFile),
44
- exclusiveWorkId: options.exclusiveWorkId,
45
46
  });
46
47
  await runtime.start();
47
48
  process.stderr.write(`${JSON.stringify({
@@ -0,0 +1,184 @@
1
+ import { createHash } from 'crypto';
2
+ import { closeSync, existsSync, openSync, readFileSync, readSync, realpathSync } from 'fs';
3
+ import { basename, dirname, join, relative, resolve } from 'path';
4
+ import { inspectControlPlaneDatabaseFile, type ControlPlaneDatabaseInspection } from '../control-plane/persistence/sqlite-store';
5
+ import { loadRuntimeReleaseManifest } from './release-manifest';
6
+ import { forgeRuntimeServicePaths, validateForgeRuntimeServiceConfig, type ForgeRuntimeServiceConfig } from './service';
7
+
8
+ /**
9
+ * A Recovery-owned, bounded restore point. The release is immutable Runtime
10
+ * authority; the SQLite copy and service contract are the state and bootstrap
11
+ * material needed to make that release useful after the Kernel is dead.
12
+ */
13
+ export interface KnownGoodRecoveryBundle {
14
+ schemaVersion: 1;
15
+ attestationId: string;
16
+ root: string;
17
+ database: {
18
+ path: string;
19
+ sha256: string;
20
+ schemaVersion: number;
21
+ recordCount: number;
22
+ auditEventCount: number;
23
+ };
24
+ serviceContract: {
25
+ path: string;
26
+ sha256: string;
27
+ };
28
+ createdAt: string;
29
+ }
30
+
31
+ export interface KnownGoodReleaseIdentity {
32
+ path: string;
33
+ revision: string;
34
+ artifactIdentity: string;
35
+ manifestSha256: string;
36
+ workerProtocolVersion: number;
37
+ controllerHome?: string;
38
+ recoveryBundle?: KnownGoodRecoveryBundle;
39
+ }
40
+
41
+ export interface InspectedKnownGoodRecoveryBundle {
42
+ releaseRoot: string;
43
+ database: ControlPlaneDatabaseInspection;
44
+ serviceConfig: ForgeRuntimeServiceConfig;
45
+ }
46
+
47
+ const SHA256_FILE_CHUNK_BYTES = 1024 * 1024;
48
+
49
+ /** Hash arbitrarily large Recovery artifacts without allocating the whole file. */
50
+ export function sha256FileBounded(path: string): string {
51
+ const descriptor = openSync(path, 'r');
52
+ const hash = createHash('sha256');
53
+ const buffer = Buffer.allocUnsafe(SHA256_FILE_CHUNK_BYTES);
54
+ try {
55
+ for (;;) {
56
+ const bytesRead = readSync(descriptor, buffer, 0, buffer.length, null);
57
+ if (bytesRead === 0) break;
58
+ hash.update(buffer.subarray(0, bytesRead));
59
+ }
60
+ return hash.digest('hex');
61
+ } finally {
62
+ closeSync(descriptor);
63
+ }
64
+ }
65
+
66
+ function canonical(path: string): string {
67
+ try { return realpathSync(path); }
68
+ catch { return resolve(path); }
69
+ }
70
+
71
+ function directChild(root: string, path: string): boolean {
72
+ return canonical(dirname(path)) === canonical(root);
73
+ }
74
+
75
+ function inside(root: string, path: string): boolean {
76
+ const value = relative(canonical(root), canonical(path));
77
+ return value === '' || (!value.startsWith('..') && value !== '..');
78
+ }
79
+
80
+ function requiredText(value: unknown, code: string): string {
81
+ if (typeof value !== 'string' || !value.trim()) throw new Error(code);
82
+ return value.trim();
83
+ }
84
+
85
+ function requiredPositiveInteger(value: unknown, code: string): number {
86
+ if (!Number.isInteger(value) || Number(value) < 1) throw new Error(code);
87
+ return Number(value);
88
+ }
89
+
90
+ function validateRecoveryBundleShape(entry: KnownGoodReleaseIdentity, controllerHome: string): KnownGoodRecoveryBundle {
91
+ const bundle = entry.recoveryBundle;
92
+ if (!bundle || bundle.schemaVersion !== 1) throw new Error('KNOWN_GOOD_RECOVERY_BUNDLE_MISSING');
93
+ const home = resolve(controllerHome);
94
+ const root = resolve(bundle.root);
95
+ const expectedBundlesRoot = resolve(home, 'recovery', 'bundles', 'known-good');
96
+ const attestationId = requiredText(bundle.attestationId, 'KNOWN_GOOD_RECOVERY_BUNDLE_ID_INVALID');
97
+ if (basename(root) !== attestationId || !directChild(expectedBundlesRoot, root)) {
98
+ throw new Error('KNOWN_GOOD_RECOVERY_BUNDLE_OUTSIDE_AUTHORITY');
99
+ }
100
+ if (!/^[-a-zA-Z0-9_]{8,160}$/.test(attestationId)) throw new Error('KNOWN_GOOD_RECOVERY_BUNDLE_ID_INVALID');
101
+ if (!inside(root, bundle.database.path) || basename(resolve(bundle.database.path)) !== 'controller.sqlite') {
102
+ throw new Error('KNOWN_GOOD_RECOVERY_DATABASE_PATH_INVALID');
103
+ }
104
+ if (!inside(root, bundle.serviceContract.path) || basename(resolve(bundle.serviceContract.path)) !== 'service-contract.json') {
105
+ throw new Error('KNOWN_GOOD_RECOVERY_SERVICE_CONTRACT_PATH_INVALID');
106
+ }
107
+ requiredText(bundle.database.sha256, 'KNOWN_GOOD_RECOVERY_DATABASE_HASH_INVALID');
108
+ requiredText(bundle.serviceContract.sha256, 'KNOWN_GOOD_RECOVERY_SERVICE_CONTRACT_HASH_INVALID');
109
+ requiredPositiveInteger(bundle.database.schemaVersion, 'KNOWN_GOOD_RECOVERY_DATABASE_SCHEMA_INVALID');
110
+ return {
111
+ ...bundle,
112
+ attestationId,
113
+ root,
114
+ database: { ...bundle.database, path: resolve(bundle.database.path) },
115
+ serviceContract: { ...bundle.serviceContract, path: resolve(bundle.serviceContract.path) },
116
+ };
117
+ }
118
+
119
+ /**
120
+ * Validate the exact three-way restore invariant used by both Recovery and
121
+ * release retention. Legacy evidence without a Recovery bundle is historical
122
+ * audit data only: it must never be promoted to recoverable authority.
123
+ */
124
+ export function inspectKnownGoodRecoveryBundle(
125
+ controllerHome: string,
126
+ entry: KnownGoodReleaseIdentity,
127
+ ): InspectedKnownGoodRecoveryBundle {
128
+ const home = resolve(controllerHome);
129
+ if (entry.controllerHome && canonical(entry.controllerHome) !== canonical(home)) {
130
+ throw new Error('KNOWN_GOOD_RECOVERY_CONTROLLER_HOME_MISMATCH');
131
+ }
132
+ const manifestPath = resolve(requiredText(entry.path, 'KNOWN_GOOD_RELEASE_MANIFEST_PATH_INVALID'));
133
+ const releasesRoot = resolve(home, 'runtime', 'releases');
134
+ const releaseRoot = dirname(manifestPath);
135
+ if (
136
+ basename(manifestPath) !== 'manifest.json'
137
+ || basename(releaseRoot) !== entry.revision
138
+ || !directChild(releasesRoot, releaseRoot)
139
+ || !existsSync(manifestPath)
140
+ ) throw new Error('KNOWN_GOOD_RELEASE_OUTSIDE_AUTHORITY');
141
+ const manifest = loadRuntimeReleaseManifest(manifestPath, home);
142
+ if (
143
+ manifest.releaseId !== entry.revision
144
+ || manifest.artifactIdentity !== entry.artifactIdentity
145
+ || manifest.workerProtocolVersion !== entry.workerProtocolVersion
146
+ || sha256FileBounded(manifestPath) !== entry.manifestSha256
147
+ ) throw new Error('KNOWN_GOOD_RELEASE_IDENTITY_MISMATCH');
148
+
149
+ const bundle = validateRecoveryBundleShape(entry, home);
150
+ if (!existsSync(bundle.database.path)) throw new Error('KNOWN_GOOD_RECOVERY_DATABASE_MISSING');
151
+ if (sha256FileBounded(bundle.database.path) !== bundle.database.sha256) throw new Error('KNOWN_GOOD_RECOVERY_DATABASE_HASH_MISMATCH');
152
+ const database = inspectControlPlaneDatabaseFile(bundle.database.path);
153
+ if (
154
+ database.schemaVersion !== bundle.database.schemaVersion
155
+ || database.recordCount !== bundle.database.recordCount
156
+ || database.auditEventCount !== bundle.database.auditEventCount
157
+ ) throw new Error('KNOWN_GOOD_RECOVERY_DATABASE_INSPECTION_MISMATCH');
158
+
159
+ if (!existsSync(bundle.serviceContract.path)) throw new Error('KNOWN_GOOD_RECOVERY_SERVICE_CONTRACT_MISSING');
160
+ if (sha256FileBounded(bundle.serviceContract.path) !== bundle.serviceContract.sha256) {
161
+ throw new Error('KNOWN_GOOD_RECOVERY_SERVICE_CONTRACT_HASH_MISMATCH');
162
+ }
163
+ let rawContract: unknown;
164
+ try { rawContract = JSON.parse(readFileSync(bundle.serviceContract.path, 'utf8')); }
165
+ catch { throw new Error('KNOWN_GOOD_RECOVERY_SERVICE_CONTRACT_INVALID'); }
166
+ if (!rawContract || typeof rawContract !== 'object' || Array.isArray(rawContract)) {
167
+ throw new Error('KNOWN_GOOD_RECOVERY_SERVICE_CONTRACT_INVALID');
168
+ }
169
+ const contract = rawContract as Record<string, unknown>;
170
+ if (contract.schemaVersion !== 1 || !contract.serviceConfig || typeof contract.serviceConfig !== 'object' || Array.isArray(contract.serviceConfig)) {
171
+ throw new Error('KNOWN_GOOD_RECOVERY_SERVICE_CONTRACT_INVALID');
172
+ }
173
+ const serviceConfig = validateForgeRuntimeServiceConfig(contract.serviceConfig as ForgeRuntimeServiceConfig);
174
+ if (canonical(serviceConfig.controllerHome) !== canonical(home)) throw new Error('KNOWN_GOOD_RECOVERY_SERVICE_HOME_MISMATCH');
175
+ const expectedConfigPath = forgeRuntimeServicePaths(home).configPath;
176
+ if (canonical(requiredText(contract.configPath, 'KNOWN_GOOD_RECOVERY_SERVICE_PATH_INVALID')) !== canonical(expectedConfigPath)) {
177
+ throw new Error('KNOWN_GOOD_RECOVERY_SERVICE_PATH_INVALID');
178
+ }
179
+ return { releaseRoot, database, serviceConfig };
180
+ }
181
+
182
+ export function knownGoodRecoveryBundleRoot(controllerHome: string): string {
183
+ return join(resolve(controllerHome), 'recovery', 'bundles', 'known-good');
184
+ }
@@ -35,7 +35,6 @@ export async function startConfiguredRuntimeLocalBridge(input: {
35
35
  controllerHome: input.controllerHome,
36
36
  host: local.host ?? '127.0.0.1',
37
37
  port: local.port ?? 8766,
38
- openBrowser: local.autoOpen === true,
39
38
  mode: 'embedded',
40
39
  });
41
40
  const generation = readRuntimeGeneration(input.controllerHome)?.generation;