@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,681 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { createHash } from 'node:crypto';
3
+ import { getRepository } from '../../cli/repositories/registry';
4
+ import { getWorkContract, semanticWorkState } from '../../../packages/kernel/work/api/index';
5
+ import {
6
+ controllerRoundBlockerClass,
7
+ controllerRoundProviderEffectId,
8
+ finishControllerRoundRelayDispatch,
9
+ getControllerRoundRelay,
10
+ getRequirementControllerRoundRelay,
11
+ } from '../../../packages/kernel/controller/api/index';
12
+ import {
13
+ bindChatgptWorkConversation,
14
+ getChatgptWorkConversationBinding,
15
+ listChatgptWorkBindingsForConversation,
16
+ rebindChatgptWorkConversation,
17
+ type ChatgptWorkConversationBinding,
18
+ } from '../../../adapters/chatgpt/work-conversation-binding-store';
19
+ import { readRequirement } from '../control-plane/persistence/requirement-store';
20
+ import { bindWorkflowSupervisorScheduledWake, getWorkflowSupervisorCurrentConversation, getWorkflowSupervisorTask, getWorkflowSupervisorTaskByConversationId, getWorkflowSupervisorTaskStall, registerWorkflowSupervisorTask, reserveWorkflowSupervisorEnrollment, wakeWorkflowSupervisorScheduledTask } from '../../../supervisor/client';
21
+ import { resolveWorkflowSupervisorForgeHome, workflowSupervisorSocketPath } from '../../../supervisor/paths';
22
+ import type { WorkflowSupervisorLifecycleHooks, WorkflowSupervisorTask } from '../../../supervisor/types';
23
+ import { getRuntimeWriteClaim } from './write-fence';
24
+ import { renderCognitiveAttentionForWork } from '../context/cognitive-attention';
25
+
26
+ export type WorkflowSupervisorBoundary =
27
+ | { status: 'not_eligible' }
28
+ | { status: 'conversation_pending'; reason: 'EXACT_WORK_CONVERSATION_BINDING_REQUIRED' }
29
+ | { status: 'outer_turn'; workId?: string; requirementId?: string; conversationId: string; conversationUrl: string };
30
+
31
+ export type WorkflowSupervisorEnrollmentStatus =
32
+ | 'not_eligible'
33
+ | 'conversation_pending'
34
+ | 'current_conversation_unbound'
35
+ | 'daemon_unavailable'
36
+ | 'enrolled'
37
+ | 'lower_layer_not_ready';
38
+
39
+ export function workflowSupervisorLowerLayerReadyForWork(
40
+ options: { controllerHome: string; repoId: string },
41
+ workId: string,
42
+ ): { ready: true; workId: string; providerEffectId: string } | { ready: false; reason: string } {
43
+ const directRelay = getControllerRoundRelay(options, workId);
44
+ const work = getWorkContract(options, workId);
45
+ const relay = directRelay ?? (work?.requirementId ? getRequirementControllerRoundRelay(options, work.requirementId) : undefined);
46
+ if (!relay) return { ready: false, reason: 'CONTROLLER_ROUND_NOT_PREPARED' };
47
+ if (!relay.authorityId?.trim()) return { ready: false, reason: `CONTROLLER_ROUND_AUTHORITY_REQUIRED:${relay.originWorkId}` };
48
+ const outcomeUnknownEffectAwaitingObservation = relay.status === 'blocked'
49
+ && controllerRoundBlockerClass(relay) === 'provider_dispatch_outcome_unknown'
50
+ && (relay.providerDispatchAttempt ?? 0) > 0
51
+ && Boolean(relay.providerDispatchEffectId?.trim());
52
+ if (!['dispatching', 'dispatched', 'claimed'].includes(relay.status) && !outcomeUnknownEffectAwaitingObservation) {
53
+ return { ready: false, reason: `CONTROLLER_ROUND_NOT_DISPATCHABLE:${relay.status}:${relay.blockedReason ?? relay.originWorkId}` };
54
+ }
55
+ return {
56
+ ready: true,
57
+ workId: relay.originWorkId,
58
+ providerEffectId: relay.providerDispatchEffectId ?? controllerRoundProviderEffectId(relay),
59
+ };
60
+ }
61
+
62
+ function taskIdForWork(repoId: string, workId: string): string {
63
+ return `forge:${repoId}:work:${workId}`;
64
+ }
65
+ export function getWorkflowSupervisorConversationBindingForWork(
66
+ options: { controllerHome: string; repoId: string },
67
+ workId: string,
68
+ ): ChatgptWorkConversationBinding | undefined {
69
+ return getChatgptWorkConversationBinding(options, workId);
70
+ }
71
+
72
+ export function bindWorkflowSupervisorConversationForWork(
73
+ options: { controllerHome: string; repoId: string },
74
+ input: { workId: string; conversationUrl: string; localAlias?: string },
75
+ ): ChatgptWorkConversationBinding {
76
+ return bindChatgptWorkConversation(options, input);
77
+ }
78
+
79
+ /**
80
+ * The boundary is derived from canonical lower-layer facts, never copied into
81
+ * Scheduler or ControllerRound state. Once one Requirement-backed Work has an
82
+ * exact ChatGPT conversation, lower layers may prepare/claim ControllerRounds
83
+ * but may no longer submit the next outer assistant turn.
84
+ */
85
+ export function workflowSupervisorBoundaryForWork(
86
+ options: { controllerHome: string; repoId: string },
87
+ workId: string,
88
+ ): WorkflowSupervisorBoundary {
89
+ const work = getWorkContract(options, workId);
90
+ if (!work || semanticWorkState(work) !== 'open') return { status: 'not_eligible' };
91
+ const binding = getChatgptWorkConversationBinding(options, workId);
92
+ if (!binding) return { status: 'conversation_pending', reason: 'EXACT_WORK_CONVERSATION_BINDING_REQUIRED' };
93
+ return {
94
+ status: 'outer_turn',
95
+ workId: work.workId,
96
+ ...(work.requirementId ? { requirementId: work.requirementId } : {}),
97
+ conversationId: binding.conversationId,
98
+ conversationUrl: binding.conversationUrl,
99
+ };
100
+ }
101
+
102
+ export function inheritWorkflowSupervisorConversationBinding(
103
+ options: { controllerHome: string; repoId: string },
104
+ fromWorkId: string,
105
+ toWorkId: string,
106
+ ): ChatgptWorkConversationBinding | undefined {
107
+ if (fromWorkId === toWorkId) return getChatgptWorkConversationBinding(options, toWorkId);
108
+ const sourceWork = getWorkContract(options, fromWorkId);
109
+ const targetWork = getWorkContract(options, toWorkId);
110
+ if (!sourceWork?.requirementId || sourceWork.requirementId !== targetWork?.requirementId) return undefined;
111
+ // Requirement membership is goal identity, not conversation lineage. Only an
112
+ // explicit Work predecessor edge proves that the successor belongs to the
113
+ // same logical controller conversation. Sibling Works must bind their own
114
+ // current conversation instead of silently reusing historical delivery.
115
+ if (targetWork?.predecessorWorkId?.trim() !== fromWorkId) return undefined;
116
+ const source = getChatgptWorkConversationBinding(options, fromWorkId);
117
+ if (!source) return undefined;
118
+ const existing = getChatgptWorkConversationBinding(options, toWorkId);
119
+ if (existing) {
120
+ if (existing.conversationId !== source.conversationId) {
121
+ throw new Error(`WORKFLOW_SUPERVISOR_CONVERSATION_CONFLICT:${sourceWork.requirementId}`);
122
+ }
123
+ return existing;
124
+ }
125
+ return bindChatgptWorkConversation(options, {
126
+ workId: toWorkId,
127
+ conversationUrl: source.conversationUrl,
128
+ latestBrowserSessionId: source.latestBrowserSessionId,
129
+ authorizationGrantRefs: source.authorizationGrantRefs,
130
+ localAlias: source.localAlias,
131
+ });
132
+ }
133
+
134
+ export function workflowSupervisorContractText(task: WorkflowSupervisorTask, key: string): string | undefined {
135
+ const value = task.completionContract[key] ?? task.userBlockerPolicy[key];
136
+ return typeof value === 'string' && value.trim() ? value.trim() : undefined;
137
+ }
138
+
139
+ function workflowSupervisorOriginWorkId(
140
+ task: WorkflowSupervisorTask,
141
+ repoId: string,
142
+ controllerHome: string,
143
+ conversationId = task.conversationId,
144
+ ): string | undefined {
145
+ const legacyWorkPrefix = `forge:${repoId}:work:`;
146
+ const explicit = workflowSupervisorContractText(task, 'work_id')
147
+ ?? (task.taskId.startsWith(legacyWorkPrefix) ? task.taskId.slice(legacyWorkPrefix.length) || undefined : undefined);
148
+ const original = explicit ? getWorkContract({ controllerHome, repoId }, explicit) : undefined;
149
+ if (explicit && (!original || semanticWorkState(original) === 'open')) return explicit;
150
+ const active = listChatgptWorkBindingsForConversation({ controllerHome, repoId }, conversationId)
151
+ .map(({ workId }) => getWorkContract({ controllerHome, repoId }, workId))
152
+ .filter((work): work is NonNullable<typeof work> => Boolean(work && semanticWorkState(work) === 'open'));
153
+ // A terminal predecessor retains its audit and conversation binding. Only
154
+ // explicit successor lineage within the same Requirement can transfer the
155
+ // active Work projection; siblings cannot inherit the predecessor's task.
156
+ if (explicit) {
157
+ const successors = active.filter((work) => work.predecessorWorkId === explicit
158
+ && original?.requirementId && work.requirementId === original.requirementId);
159
+ return successors.length === 1 && active.length === 1 ? successors[0]!.workId : explicit;
160
+ }
161
+ // Standalone enrollment predates Work binding. It may project into one
162
+ // unambiguous open Work, without creating a second conversation authority.
163
+ if (task.continuationPolicy.kind !== 'standalone_supervisor') return undefined;
164
+ return active.length === 1 ? active[0]!.workId : undefined;
165
+ }
166
+
167
+ /**
168
+ * Mechanical Work projection used to decide whether a provider turn advanced
169
+ * anything. `updatedAt` is deliberately excluded: mechanical Supervisor and
170
+ * Controller bookkeeping touches the record every turn, while only a real Work
171
+ * mutation (authored revision/state, phase evidence, execution evidence,
172
+ * observable changed paths, or a delivery receipt) means the turn did work.
173
+ */
174
+ function workflowSupervisorWorkProgressFingerprint(controllerHome: string, task: WorkflowSupervisorTask): string | undefined {
175
+ const repoId = workflowSupervisorContractText(task, 'repo_id');
176
+ const taskControllerHome = workflowSupervisorContractText(task, 'controller_home');
177
+ if (!repoId || (taskControllerHome && taskControllerHome !== controllerHome)) return undefined;
178
+ const workId = workflowSupervisorOriginWorkId(task, repoId, controllerHome);
179
+ if (!workId) return undefined;
180
+ const work = getWorkContract({ controllerHome, repoId }, workId);
181
+ if (!work) return undefined;
182
+ return createHash('sha256').update(JSON.stringify({
183
+ semanticRevision: work.semanticRevision ?? null,
184
+ semanticState: work.semanticState,
185
+ phase: work.phase,
186
+ phaseEvidence: work.phaseEvidence,
187
+ dispatchState: work.dispatchState,
188
+ evidenceState: work.evidenceState,
189
+ completionOutcome: work.completionOutcome ?? null,
190
+ completionReceipt: work.completionReceipt ?? null,
191
+ evidenceRefs: work.evidenceRefs,
192
+ changedPaths: work.scopeEvidence?.actualChangedPaths ?? [],
193
+ })).digest('hex');
194
+ }
195
+
196
+ function workflowSupervisorProjectAliases(task: WorkflowSupervisorTask): string[] {
197
+ const requirementId = workflowSupervisorContractText(task, 'requirement_id');
198
+ if (!requirementId) return [];
199
+ // Requirement ids intentionally carry the product key before the structural
200
+ // suffix. ChatGPT Project slugs may insert word separators (for example
201
+ // shenbaobao -> shen-bao-bao), so the browser adapter compares compact ids.
202
+ const productKey = /^REQ-([a-z0-9]{4,})-/i.exec(requirementId.trim())?.[1];
203
+ return productKey ? [productKey] : [];
204
+ }
205
+
206
+ /**
207
+ * Enrollment gives Supervisor authority over this exact conversation. Work and
208
+ * ControllerRound are execution context, not another cross-turn lifecycle.
209
+ * Goal cancellation and explicit conversation rebind revoke new-send authority.
210
+ * Provider observation remains governed separately by the effect ledger.
211
+ */
212
+ function createForgeWorkflowSupervisorBrowserTaskActive(controllerHome: string): (task: WorkflowSupervisorTask) => boolean {
213
+ return (task) => {
214
+ if (task.continuationPolicy.kind === 'standalone_supervisor') return true;
215
+ if (task.continuationPolicy.kind !== 'forge_goal_outer_turn') return false;
216
+ const repoId = workflowSupervisorContractText(task, 'repo_id');
217
+ const requirementId = workflowSupervisorContractText(task, 'requirement_id');
218
+ const taskControllerHome = workflowSupervisorContractText(task, 'controller_home');
219
+ if (!repoId || taskControllerHome !== controllerHome) return false;
220
+ if (requirementId && readRequirement({ controllerHome }, requirementId)?.value.state === 'cancelled') return false;
221
+ const workId = workflowSupervisorOriginWorkId(task, repoId, controllerHome);
222
+ if (!requirementId && !workId) return false;
223
+ // An independent Requirement Goal can outlive an execution Work; an exact
224
+ // Work-owned Supervisor cannot initiate another Send after that Work closes.
225
+ if (terminalWorkSupervisorStopReason(controllerHome, task)) return false;
226
+ const binding = workId ? getChatgptWorkConversationBinding({ controllerHome, repoId }, workId) : undefined;
227
+ return !binding || binding.conversationId === task.conversationId;
228
+ };
229
+ }
230
+
231
+ /**
232
+ * Only an exact Work-owned Supervisor task follows that Work's terminal state.
233
+ * Requirement-owned autonomous Goals and standalone tasks keep their own
234
+ * explicit lifecycle; a completed lower-layer carrier is not goal completion.
235
+ */
236
+ function terminalWorkSupervisorStopReason(controllerHome: string, task: WorkflowSupervisorTask): string | undefined {
237
+ const repoId = workflowSupervisorContractText(task, 'repo_id');
238
+ const workId = workflowSupervisorContractText(task, 'work_id');
239
+ const taskHome = workflowSupervisorContractText(task, 'controller_home');
240
+ if (!repoId || !workId || (taskHome && taskHome !== controllerHome)) return undefined;
241
+ if (task.taskId !== `forge:${repoId}:work:${workId}`
242
+ || task.continuationPolicy.kind === 'standalone_supervisor') return undefined;
243
+ const work = getWorkContract({ controllerHome, repoId }, workId);
244
+ if (!work) return undefined;
245
+ const state = semanticWorkState(work);
246
+ return state !== 'open'
247
+ ? `Exact Work ${workId} is ${state}; stop its Work-owned Supervisor continuation without changing the original Work or any successor Schedule.`
248
+ : undefined;
249
+ }
250
+
251
+ export function forgeWorkflowSupervisorLifecycleHooks(controllerHome: string): WorkflowSupervisorLifecycleHooks {
252
+ const browserTaskActive = createForgeWorkflowSupervisorBrowserTaskActive(controllerHome);
253
+ return {
254
+ terminalWorkStopReasonForTask: (task) => terminalWorkSupervisorStopReason(controllerHome, task),
255
+ canonicalObjectiveForTask: (task) => {
256
+ // Standalone Supervisor owns its full objective; Work execution context
257
+ // must never silently replace the original autonomous business goal.
258
+ if (task.continuationPolicy.kind === 'standalone_supervisor') return undefined;
259
+ const repoId = workflowSupervisorContractText(task, 'repo_id');
260
+ const requirementId = workflowSupervisorContractText(task, 'requirement_id');
261
+ const taskControllerHome = workflowSupervisorContractText(task, 'controller_home');
262
+ if (!repoId || (taskControllerHome && taskControllerHome !== controllerHome)) return undefined;
263
+ // Requirement is the durable Goal root. Its outcome is therefore the
264
+ // canonical Supervisor goal; a Work objective is lower-layer execution
265
+ // context and must not become a permanent outer-turn instruction surface.
266
+ if (requirementId) {
267
+ const outcome = readRequirement({ controllerHome }, requirementId)?.value.outcomeStatement?.trim();
268
+ if (outcome) return outcome;
269
+ }
270
+ const workId = workflowSupervisorOriginWorkId(task, repoId, controllerHome);
271
+ if (!workId) return undefined;
272
+ const work = getWorkContract({ controllerHome, repoId }, workId);
273
+ // Legacy / independent Work without Requirement authority keeps the
274
+ // existing fallback. Absence never manufactures a replacement Work.
275
+ return work?.objective;
276
+ },
277
+ advisoryCognitionForTask: (task) => {
278
+ const repoId = workflowSupervisorContractText(task, 'repo_id');
279
+ const taskControllerHome = workflowSupervisorContractText(task, 'controller_home');
280
+ if (!repoId || (taskControllerHome && taskControllerHome !== controllerHome)) return undefined;
281
+ const workId = workflowSupervisorOriginWorkId(task, repoId, controllerHome);
282
+ if (!workId) return undefined;
283
+ const cognitive = renderCognitiveAttentionForWork({ controllerHome, repoId, workId, query: task.objective, maxItems: 6, maxBytes: 5 * 1024 });
284
+ if (task.continuationPolicy.kind !== 'standalone_supervisor') return cognitive;
285
+ const work = getWorkContract({ controllerHome, repoId }, workId);
286
+ if (!work) return cognitive;
287
+ // Thin evidence, not a second task/goal authority. Recent semantic refs
288
+ // carry the concrete next step even when Cognitive recall is empty.
289
+ const refs = (work.semanticResultRefs ?? []).slice(-5).map((ref) => ref.slice(0, 500));
290
+ return [
291
+ `Canonical Work: ${workId} (read-only execution context; Supervisor objective remains authoritative).`,
292
+ `Work objective: ${work.objective.slice(0, 600)}`,
293
+ ...refs.map((ref) => `Work evidence: ${ref}`),
294
+ ...(cognitive ? [cognitive] : []),
295
+ ].join('\n').slice(0, 8_000);
296
+ },
297
+ effectDispatchEvidence: ({ task }) => {
298
+ const claim = getRuntimeWriteClaim();
299
+ const progress = workflowSupervisorWorkProgressFingerprint(controllerHome, task);
300
+ return {
301
+ ...(claim && !claim.unmanaged
302
+ ? {
303
+ runtime_instance_id: claim.runtimeInstanceId,
304
+ runtime_fencing_generation: claim.fencingGeneration,
305
+ active_release_id: claim.releaseId,
306
+ active_release_authority_revision: claim.releaseAuthorityRevision,
307
+ }
308
+ : {}),
309
+ ...(progress ? { work_progress_fingerprint: progress } : {}),
310
+ };
311
+ },
312
+ workProgressFingerprint: (task) => workflowSupervisorWorkProgressFingerprint(controllerHome, task),
313
+ inheritedEffectDispatch: (task, effect) => {
314
+ if (effect.kind !== 'enrollment') return undefined;
315
+ const repoId = workflowSupervisorContractText(task, 'repo_id');
316
+ const requirementId = workflowSupervisorContractText(task, 'requirement_id');
317
+ const workId = repoId ? workflowSupervisorOriginWorkId(task, repoId, controllerHome) : undefined;
318
+ const taskControllerHome = workflowSupervisorContractText(task, 'controller_home');
319
+ if (!repoId || (!requirementId && !workId) || taskControllerHome !== controllerHome) return undefined;
320
+ const store = { controllerHome, repoId };
321
+ const relay = workId
322
+ ? getControllerRoundRelay(store, workId)
323
+ : getRequirementControllerRoundRelay(store, requirementId!);
324
+ const legacyStartedDispatch = Boolean(
325
+ relay
326
+ && (relay.providerDispatchAttempt ?? 0) >= 1
327
+ && relay.providerDispatchEffectId === effect.effectId
328
+ && (
329
+ (relay.status === 'blocked' && controllerRoundBlockerClass(relay) === 'provider_dispatch_outcome_unknown')
330
+ || (relay.status === 'dispatched' && Boolean(relay.providerDispatchReceiptId))
331
+ )
332
+ );
333
+ if (!relay || !legacyStartedDispatch) return undefined;
334
+ const boundary = workflowSupervisorBoundaryForWork(store, relay.originWorkId);
335
+ if (boundary.status !== 'outer_turn'
336
+ || boundary.conversationId !== task.conversationId
337
+ || boundary.conversationUrl !== task.conversationUrl) return undefined;
338
+ return {
339
+ generation: 1,
340
+ dispatchId: `controller-round:${relay.relayScopeId}:${relay.providerDispatchAttempt}`,
341
+ evidence: {
342
+ surface: 'controller_round_reconciliation',
343
+ inherited_provider_dispatch: true,
344
+ relay_scope_id: relay.relayScopeId,
345
+ provider_dispatch_attempt: relay.providerDispatchAttempt,
346
+ ...(relay.providerDispatchStartedAt ? { provider_dispatch_started_at: relay.providerDispatchStartedAt } : {}),
347
+ },
348
+ };
349
+ },
350
+ projectScopeForTask: (task) => {
351
+ const repoId = workflowSupervisorContractText(task, 'repo_id');
352
+ const taskControllerHome = workflowSupervisorContractText(task, 'controller_home');
353
+ if (!repoId) return undefined;
354
+ if (taskControllerHome && taskControllerHome !== controllerHome) return undefined;
355
+ if (!taskControllerHome && task.continuationPolicy.kind !== 'standalone_supervisor') return undefined;
356
+ try {
357
+ const repository = getRepository(repoId, controllerHome);
358
+ const aliases = workflowSupervisorProjectAliases(task);
359
+ return {
360
+ title: repository.displayName,
361
+ ...(aliases.length > 0 ? { aliases } : {}),
362
+ repoId,
363
+ controllerHome,
364
+ };
365
+ } catch { return undefined; }
366
+ },
367
+ browserTaskActive,
368
+ bootstrapConversationBound: (task, context) => {
369
+ const repoId = workflowSupervisorContractText(task, 'repo_id');
370
+ const declaredWorkId = workflowSupervisorContractText(task, 'work_id');
371
+ const taskControllerHome = workflowSupervisorContractText(task, 'controller_home');
372
+ if (!repoId || taskControllerHome !== controllerHome) return;
373
+ // On migration, retain the sole active Work projection even for a
374
+ // standalone task without work_id or a completed predecessor. Prefer
375
+ // a binding already moved to the new conversation on duplicate callbacks.
376
+ const currentWorkId = workflowSupervisorOriginWorkId(task, repoId, controllerHome);
377
+ const bindingWorkId = context?.migratedFromConversationId
378
+ ? (currentWorkId && currentWorkId !== declaredWorkId
379
+ ? currentWorkId
380
+ : workflowSupervisorOriginWorkId(task, repoId, controllerHome, context.migratedFromConversationId) ?? declaredWorkId)
381
+ : declaredWorkId;
382
+ if (!bindingWorkId) return;
383
+ const existing = getChatgptWorkConversationBinding({ controllerHome, repoId }, bindingWorkId);
384
+ if (existing && existing.conversationId !== task.conversationId) {
385
+ if (!context?.migratedFromConversationId || context.migratedFromConversationId !== existing.conversationId) {
386
+ throw new Error('WORKFLOW_SUPERVISOR_BOOTSTRAP_WORK_CONVERSATION_CONFLICT');
387
+ }
388
+ rebindChatgptWorkConversation({ controllerHome, repoId }, {
389
+ workId: bindingWorkId,
390
+ previousConversationId: existing.conversationId,
391
+ conversationUrl: task.conversationUrl,
392
+ localAlias: existing.localAlias,
393
+ });
394
+ return;
395
+ }
396
+ if (!existing) {
397
+ bindChatgptWorkConversation({ controllerHome, repoId }, {
398
+ workId: bindingWorkId,
399
+ conversationUrl: task.conversationUrl,
400
+ localAlias: 'Forge autonomous execution',
401
+ });
402
+ }
403
+ },
404
+ effectApplied: (task, effect, observation) => {
405
+ if (effect.kind !== 'enrollment') return;
406
+ const repoId = workflowSupervisorContractText(task, 'repo_id');
407
+ const requirementId = workflowSupervisorContractText(task, 'requirement_id');
408
+ const workId = repoId ? workflowSupervisorOriginWorkId(task, repoId, controllerHome) : undefined;
409
+ const taskControllerHome = workflowSupervisorContractText(task, 'controller_home');
410
+ if (!repoId || (!requirementId && !workId) || taskControllerHome !== controllerHome) return;
411
+ const store = { controllerHome, repoId };
412
+ const relay = workId
413
+ ? getControllerRoundRelay(store, workId)
414
+ : getRequirementControllerRoundRelay(store, requirementId!);
415
+ if (!relay || !['dispatching', 'blocked'].includes(relay.status)) return;
416
+ // Receipt projection can settle only the enrolled lower effect. A newer
417
+ // occurrence or sibling Work must never inherit an old conversation send.
418
+ if ((relay.providerDispatchEffectId ?? controllerRoundProviderEffectId(relay)) !== effect.effectId) return;
419
+ const boundary = workflowSupervisorBoundaryForWork(store, relay.originWorkId);
420
+ if (boundary.status !== 'outer_turn' || boundary.conversationId !== task.conversationId) return;
421
+ finishControllerRoundRelayDispatch(store, {
422
+ workId: relay.originWorkId,
423
+ ok: true,
424
+ providerDispatchEffectId: effect.effectId,
425
+ providerDispatchReceiptId: `workflow-supervisor:${effect.effectId}:${observation.observationId}`,
426
+ });
427
+ },
428
+ };
429
+ }
430
+ export async function workflowSupervisorCurrentConversationMatchesWork(
431
+ options: { controllerHome: string; repoId: string },
432
+ workId: string,
433
+ ): Promise<boolean> {
434
+ const boundary = workflowSupervisorBoundaryForWork(options, workId);
435
+ if (boundary.status !== 'outer_turn') return false;
436
+ const forgeHome = resolveWorkflowSupervisorForgeHome(options.controllerHome);
437
+ if (!existsSync(workflowSupervisorSocketPath(forgeHome))) return false;
438
+ try {
439
+ const current = await getWorkflowSupervisorCurrentConversation(forgeHome);
440
+ // The same ChatGPT conversation may be rendered with or without its Project
441
+ // route. Its durable conversation id, not that route, proves continuity.
442
+ return Boolean(current
443
+ && current.conversationId === boundary.conversationId);
444
+ } catch {
445
+ return false;
446
+ }
447
+ }
448
+
449
+ export async function bindCurrentWorkflowSupervisorConversationForWork(
450
+ options: { controllerHome: string; repoId: string },
451
+ workId: string,
452
+ ): Promise<
453
+ | { status: 'bound'; binding: ChatgptWorkConversationBinding }
454
+ | { status: 'not_eligible' | 'current_conversation_unbound' | 'daemon_unavailable'; reason?: string }
455
+ > {
456
+ const work = getWorkContract(options, workId);
457
+ if (!work || semanticWorkState(work) !== 'open') return { status: 'not_eligible' };
458
+ const forgeHome = resolveWorkflowSupervisorForgeHome(options.controllerHome);
459
+ if (!existsSync(workflowSupervisorSocketPath(forgeHome))) return { status: 'daemon_unavailable', reason: 'WORKFLOW_SUPERVISOR_DAEMON_UNAVAILABLE' };
460
+ const existing = getChatgptWorkConversationBinding(options, workId);
461
+ const current = await getWorkflowSupervisorCurrentConversation(forgeHome);
462
+ // Browser focus is ephemeral observation, not a second authority over an
463
+ // already-bound Work. When a durable exact binding exists, a missing current
464
+ // marker cannot revoke it; a fresh conflicting marker still fails closed.
465
+ if (existing) {
466
+ if (current && existing.conversationId !== current.conversationId) {
467
+ throw new Error(`WORKFLOW_SUPERVISOR_CURRENT_CONVERSATION_CONFLICT:${workId}:${existing.conversationId}:${current.conversationId}`);
468
+ }
469
+ return { status: 'bound', binding: existing };
470
+ }
471
+ if (!current) return { status: 'current_conversation_unbound', reason: 'WORKFLOW_SUPERVISOR_CURRENT_CONVERSATION_UNBOUND' };
472
+ const binding = bindChatgptWorkConversation(options, {
473
+ workId,
474
+ conversationUrl: current.canonicalUrl,
475
+ localAlias: current.title,
476
+ });
477
+ return { status: 'bound', binding };
478
+ }
479
+
480
+ export async function bindWorkflowSupervisorScheduledWakeForWork(
481
+ options: { controllerHome: string; repoId: string },
482
+ workId: string,
483
+ scheduleId: string,
484
+ ): Promise<{ status: 'bound'; taskId: string } | { status: 'not_enrolled' | 'binding_deferred' }> {
485
+ const forgeHome = resolveWorkflowSupervisorForgeHome(options.controllerHome);
486
+ if (!existsSync(workflowSupervisorSocketPath(forgeHome))) return { status: 'binding_deferred' };
487
+ const exactTaskId = taskIdForWork(options.repoId, workId);
488
+ let task = await getWorkflowSupervisorTask(forgeHome, exactTaskId);
489
+ if (!task) {
490
+ const binding = getChatgptWorkConversationBinding(options, workId);
491
+ if (binding) {
492
+ const authority = await getWorkflowSupervisorTaskByConversationId(forgeHome, binding.conversationId);
493
+ if (authority) {
494
+ const ownerRepoId = typeof authority.task.completionContract.repo_id === 'string'
495
+ ? authority.task.completionContract.repo_id : authority.task.continuationPolicy.repo_id;
496
+ if (ownerRepoId !== options.repoId || authority.task.completionContract.work_id !== workId) {
497
+ throw new Error('WORKFLOW_SUPERVISOR_SCHEDULE_WORK_IDENTITY_MISMATCH');
498
+ }
499
+ task = authority.task;
500
+ }
501
+ }
502
+ }
503
+ if (!task) return { status: 'not_enrolled' };
504
+ const bound = await bindWorkflowSupervisorScheduledWake(forgeHome, {
505
+ taskId: task.taskId,
506
+ repoId: options.repoId,
507
+ workId,
508
+ scheduleId,
509
+ });
510
+ return { status: 'bound', taskId: bound.task.taskId };
511
+ }
512
+
513
+ export async function wakeWorkflowSupervisorScheduledTaskForWork(
514
+ options: { controllerHome: string; repoId: string },
515
+ workId: string,
516
+ scheduleId: string,
517
+ occurrenceId: string,
518
+ ): Promise<{ status: 'woken' | 'not_waiting' | 'not_enrolled' | 'binding_deferred'; taskId?: string; effectId?: string }> {
519
+ const binding = await bindWorkflowSupervisorScheduledWakeForWork(options, workId, scheduleId);
520
+ if (binding.status !== 'bound') return binding;
521
+ if (!binding.taskId) throw new Error('WORKFLOW_SUPERVISOR_SCHEDULE_BINDING_TASK_ID_MISSING');
522
+ const forgeHome = resolveWorkflowSupervisorForgeHome(options.controllerHome);
523
+ const stall = await getWorkflowSupervisorTaskStall(forgeHome, binding.taskId);
524
+ if (stall.state !== 'waiting') return { status: 'not_waiting', taskId: binding.taskId };
525
+ const wake = await wakeWorkflowSupervisorScheduledTask(forgeHome, {
526
+ taskId: binding.taskId, scheduleId, occurrenceId,
527
+ });
528
+ return { status: 'woken', taskId: binding.taskId, effectId: wake.effect.effectId };
529
+ }
530
+
531
+ export async function ensureWorkflowSupervisorEnrollmentForWork(
532
+ options: { controllerHome: string; repoId: string },
533
+ workId: string,
534
+ scheduledWakeScheduleId?: string,
535
+ scheduleOccurrenceId?: string,
536
+ ): Promise<{ status: WorkflowSupervisorEnrollmentStatus; taskId?: string; effectId?: string; reason?: string }> {
537
+ const boundary = workflowSupervisorBoundaryForWork(options, workId);
538
+ if (boundary.status === 'not_eligible') return { status: boundary.status };
539
+ const forgeHome = resolveWorkflowSupervisorForgeHome(options.controllerHome);
540
+ // Work-derived task ids are only bootstrap reservation identities. Once an
541
+ // exact conversation exists, the task-registration RPC returns the canonical
542
+ // Supervisor task already owning that conversation, including across successor Work.
543
+ const taskId = taskIdForWork(options.repoId, workId);
544
+ if (!existsSync(workflowSupervisorSocketPath(forgeHome))) return { status: 'daemon_unavailable', taskId };
545
+
546
+ // A Work-derived Supervisor id is a durable task reservation, not a
547
+ // registration template to rewrite on every Scheduler wake. In particular,
548
+ // an explicitly stopped historical task remains terminal even if its Work is
549
+ // still open, and a live bootstrap retains its original immutable objective
550
+ // and effect when the lower Work wording changes. Do not mint a replacement
551
+ // send, mutate Task identity, or use lower ControllerRound state to revive it.
552
+ const existingWorkTask = await getWorkflowSupervisorTask(forgeHome, taskId);
553
+ if (existingWorkTask) {
554
+ const existingRepoId = typeof existingWorkTask.completionContract.repo_id === 'string'
555
+ ? existingWorkTask.completionContract.repo_id
556
+ : existingWorkTask.continuationPolicy.repo_id;
557
+ const existingWorkId = existingWorkTask.completionContract.work_id;
558
+ if (existingRepoId !== options.repoId || existingWorkId !== workId) {
559
+ throw new Error('WORKFLOW_SUPERVISOR_TASK_ID_CONFLICT');
560
+ }
561
+ let stall = await getWorkflowSupervisorTaskStall(forgeHome, taskId);
562
+ if (stall.state === 'terminal') {
563
+ return { status: 'lower_layer_not_ready', reason: 'WORKFLOW_SUPERVISOR_TASK_TERMINAL' };
564
+ }
565
+ if (scheduledWakeScheduleId) {
566
+ await bindWorkflowSupervisorScheduledWake(forgeHome, {
567
+ taskId,
568
+ repoId: options.repoId,
569
+ workId,
570
+ scheduleId: scheduledWakeScheduleId,
571
+ });
572
+ stall = await getWorkflowSupervisorTaskStall(forgeHome, taskId);
573
+ if (stall.state === 'waiting') {
574
+ if (!scheduleOccurrenceId) return { status: 'lower_layer_not_ready', taskId, reason: 'SCHEDULE_OCCURRENCE_ID_REQUIRED' };
575
+ const wake = await wakeWorkflowSupervisorScheduledTask(forgeHome, {
576
+ taskId, scheduleId: scheduledWakeScheduleId, occurrenceId: scheduleOccurrenceId,
577
+ });
578
+ return { status: 'enrolled', taskId, effectId: wake.effect.effectId };
579
+ }
580
+ }
581
+ const ownedRequirementId = typeof existingWorkTask.completionContract.requirement_id === 'string'
582
+ ? existingWorkTask.completionContract.requirement_id : undefined;
583
+ if (ownedRequirementId !== getWorkContract(options, workId)?.requirementId) {
584
+ throw new Error('WORKFLOW_SUPERVISOR_TASK_REQUIREMENT_CONFLICT');
585
+ }
586
+ if (boundary.status === 'conversation_pending') {
587
+ if (existingWorkTask.continuationPolicy.kind !== 'forge_goal_outer_turn') {
588
+ throw new Error('WORKFLOW_SUPERVISOR_TASK_ID_CONFLICT');
589
+ }
590
+ const effect = await reserveWorkflowSupervisorEnrollment(forgeHome, taskId);
591
+ return { status: 'enrolled', taskId, effectId: effect.effectId };
592
+ }
593
+ }
594
+
595
+ // Once an exact conversation is already owned by a Supervisor task, that
596
+ // task is the outer-turn authority. ControllerRound is only first-admission
597
+ // execution context and must not regain veto power over later continuation.
598
+ // Read before any lower-layer admission check so a blocked/exhausted old
599
+ // Round cannot strand an already-enrolled exact conversation.
600
+ if (boundary.status === 'outer_turn') {
601
+ const existingAuthority = await getWorkflowSupervisorTaskByConversationId(forgeHome, boundary.conversationId);
602
+ if (existingAuthority) {
603
+ const existingRepoId = typeof existingAuthority.task.completionContract.repo_id === 'string'
604
+ ? existingAuthority.task.completionContract.repo_id
605
+ : existingAuthority.task.continuationPolicy.repo_id;
606
+ if (typeof existingRepoId === 'string' && existingRepoId !== options.repoId) {
607
+ throw new Error(`WORKFLOW_SUPERVISOR_TASK_REPOSITORY_CONFLICT:${boundary.conversationId}`);
608
+ }
609
+ if (existingAuthority.terminal) {
610
+ // Terminal Supervisor authority must never be resurrected by a lower
611
+ // ControllerRound. Report the outer-turn boundary as already owned so
612
+ // Scheduler/Controller composition cannot create another provider turn.
613
+ return {
614
+ status: 'enrolled',
615
+ taskId: existingAuthority.task.taskId,
616
+ reason: `WORKFLOW_SUPERVISOR_TASK_TERMINAL:${existingAuthority.terminal}`,
617
+ };
618
+ }
619
+ if (scheduledWakeScheduleId) {
620
+ await bindWorkflowSupervisorScheduledWake(forgeHome, {
621
+ taskId: existingAuthority.task.taskId,
622
+ repoId: options.repoId,
623
+ workId,
624
+ scheduleId: scheduledWakeScheduleId,
625
+ });
626
+ const stall = await getWorkflowSupervisorTaskStall(forgeHome, existingAuthority.task.taskId);
627
+ if (stall.state === 'waiting') {
628
+ if (!scheduleOccurrenceId) return { status: 'lower_layer_not_ready', taskId: existingAuthority.task.taskId, reason: 'SCHEDULE_OCCURRENCE_ID_REQUIRED' };
629
+ const wake = await wakeWorkflowSupervisorScheduledTask(forgeHome, {
630
+ taskId: existingAuthority.task.taskId, scheduleId: scheduledWakeScheduleId, occurrenceId: scheduleOccurrenceId,
631
+ });
632
+ return { status: 'enrolled', taskId: existingAuthority.task.taskId, effectId: wake.effect.effectId };
633
+ }
634
+ }
635
+ const effect = await reserveWorkflowSupervisorEnrollment(forgeHome, existingAuthority.task.taskId);
636
+ return { status: 'enrolled', taskId: existingAuthority.task.taskId, effectId: effect.effectId };
637
+ }
638
+ }
639
+
640
+ const lowerLayer = workflowSupervisorLowerLayerReadyForWork(options, workId);
641
+ if (!lowerLayer.ready) return { status: 'lower_layer_not_ready', reason: lowerLayer.reason };
642
+ const work = getWorkContract(options, workId);
643
+ const requirement = work?.requirementId
644
+ ? readRequirement({ controllerHome: options.controllerHome }, work.requirementId)?.value
645
+ : undefined;
646
+ const registeredTask = await registerWorkflowSupervisorTask(forgeHome, {
647
+ taskId,
648
+ // This is a durable pre-send reservation, not a conversation identity.
649
+ // The Computer adapter replaces it atomically after the first confirmed
650
+ // submission exposes ChatGPT's canonical conversation URL.
651
+ conversationId: boundary.status === 'outer_turn' ? boundary.conversationId : `bootstrap:${workId}`,
652
+ conversationUrl: boundary.status === 'outer_turn' ? boundary.conversationUrl : 'https://chatgpt.com/',
653
+ objective: requirement?.outcomeStatement ?? work?.objective ?? workId,
654
+ completionContract: {
655
+ kind: requirement ? 'forge_requirement_done' : 'forge_work_done',
656
+ controller_home: options.controllerHome,
657
+ repo_id: options.repoId,
658
+ work_id: workId,
659
+ ...(requirement ? { requirement_id: requirement.requirementId } : {}),
660
+ },
661
+ continuationPolicy: {
662
+ kind: 'forge_goal_outer_turn',
663
+ ...(boundary.status === 'outer_turn'
664
+ ? { exact_conversation_id: boundary.conversationId, exact_conversation_url: boundary.conversationUrl }
665
+ : { bootstrap: true }),
666
+ ...(scheduledWakeScheduleId ? { scheduled_wake_schedule_id: scheduledWakeScheduleId } : {}),
667
+ outer_turn_owner: 'workflow_supervisor',
668
+ },
669
+ userBlockerPolicy: {
670
+ kind: requirement ? 'forge_requirement_waiting_for_user' : 'forge_work_waiting_for_user',
671
+ controller_home: options.controllerHome,
672
+ repo_id: options.repoId,
673
+ work_id: workId,
674
+ ...(requirement ? { requirement_id: requirement.requirementId } : {}),
675
+ },
676
+ });
677
+ const effect = await reserveWorkflowSupervisorEnrollment(forgeHome, registeredTask.taskId, lowerLayer.providerEffectId);
678
+ // Runtime owns only enrollment. Provider send/reconcile/re-dispatch budgeting
679
+ // stays entirely inside the Supervisor effect ledger and Browser adapter.
680
+ return { status: 'enrolled', taskId: registeredTask.taskId, effectId: effect.effectId };
681
+ }