@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
@@ -35,6 +35,35 @@ export function touchSchedulerWakeSignal(controllerHome: string, reason: string)
35
35
  return next;
36
36
  }
37
37
 
38
+ export function isSchedulerWakeSignalEvent(filename: string | Buffer | null | undefined): boolean {
39
+ // The wake file shares a directory with scheduler health/state persistence.
40
+ // Atomic writes to those sibling files can emit multiple directory events.
41
+ // Node/macOS reports the final filename, while Bun/macOS may report only the
42
+ // wake file's atomic temporary name; both belong to the same wake authority.
43
+ // Platforms that omit the filename remain conservative and re-check revision.
44
+ if (filename == null) return true;
45
+ const observed = filename.toString();
46
+ return observed === 'wake-signal.json'
47
+ || (observed.startsWith('wake-signal.json.') && observed.endsWith('.tmp'));
48
+ }
49
+
50
+ export function shouldWakeForSchedulerEvent(
51
+ filename: string | Buffer | null | undefined,
52
+ expectedRevision: number,
53
+ observedRevision: number,
54
+ ): boolean {
55
+ if (!isSchedulerWakeSignalEvent(filename)) return false;
56
+ // A null filename is an ambiguous directory event on some Bun/macOS
57
+ // combinations. Only treat it as a wake when the durable revision changed;
58
+ // otherwise the Scheduler's own state.json write would wake it immediately
59
+ // and turn the idle loop into a CPU-consuming self-trigger cycle.
60
+ if (filename == null) return observedRevision !== expectedRevision;
61
+ // A named wake-file event is authoritative even when the revision is equal:
62
+ // concurrent writers may coalesce onto one revision, while the lifecycle
63
+ // truth remains in the canonical stores.
64
+ return true;
65
+ }
66
+
38
67
  export async function waitForSchedulerWakeSignal(
39
68
  controllerHome: string,
40
69
  expectedRevision: number,
@@ -71,7 +100,18 @@ export async function waitForSchedulerWakeSignal(
71
100
 
72
101
  signal?.addEventListener('abort', onAbort, { once: true });
73
102
  try {
74
- watcher = watch(dirname(path), maybeWake);
103
+ watcher = watch(dirname(path), (_eventType, filename) => {
104
+ if (!shouldWakeForSchedulerEvent(
105
+ filename,
106
+ expectedRevision,
107
+ readSchedulerWakeSignal(controllerHome).revision,
108
+ )) return;
109
+ // A named canonical wake-file event is itself the notification. Do not
110
+ // make event delivery depend on observing a strictly newer JSON
111
+ // revision: concurrent writers may legitimately coalesce onto one
112
+ // revision, while lifecycle truth is read from canonical stores.
113
+ finish('wakeup');
114
+ });
75
115
  watcher.on?.('error', maybeWake);
76
116
  } catch {
77
117
  watcher = undefined;
@@ -79,7 +119,7 @@ export async function waitForSchedulerWakeSignal(
79
119
  // fs.watch is the primary wake path. Polling is only a lost-event safety
80
120
  // net, so keep it coarse enough that an idle scheduler does not perform a
81
121
  // read/stat storm while still bounding cross-platform wake loss.
82
- const fallbackPollMs = Math.min(2_000, Math.max(250, Math.trunc(options.fallbackPollMs ?? 1_000)));
122
+ const fallbackPollMs = Math.min(10_000, Math.max(250, Math.trunc(options.fallbackPollMs ?? 1_000)));
83
123
  poller = setInterval(maybeWake, fallbackPollMs);
84
124
  poller.unref?.();
85
125
  timer = setTimeout(() => finish('timeout'), Math.max(0, timeoutMs));
@@ -6,6 +6,7 @@ import {
6
6
  writeFileSync,
7
7
  } from 'fs';
8
8
  import { dirname, join, resolve } from 'path';
9
+ import { isWorkspaceScopeKey, workspaceScopeRoot } from '../../../cli/repositories/controller-home';
9
10
 
10
11
  export const ACCESS_MODES = ['request', 'full_access'] as const;
11
12
  export type AccessMode = (typeof ACCESS_MODES)[number];
@@ -75,7 +76,23 @@ export function normalizeAccessMode(value: unknown, fallback: AccessMode = 'full
75
76
  }
76
77
 
77
78
  export function repositoryAccessPolicyPath(controllerHome: string, repoId: string): string {
78
- return join(resolve(controllerHome), 'repositories', repoId, 'controller', 'access-policy.json');
79
+ // A workspace scope keeps its own access policy in the workspace partition
80
+ // instead of a synthetic repository partition. Repository/controller scopes
81
+ // keep their established location.
82
+ return isWorkspaceScopeKey(repoId)
83
+ ? join(workspaceScopeRoot(controllerHome, repoId), 'controller', 'access-policy.json')
84
+ : join(resolve(controllerHome), 'repositories', repoId, 'controller', 'access-policy.json');
85
+ }
86
+
87
+ /**
88
+ * Bounded migration read: a workspace policy written to the legacy repository
89
+ * location still applies until it is rewritten in the workspace partition.
90
+ */
91
+ function readableAccessPolicyPath(controllerHome: string, repoId: string): string {
92
+ const current = repositoryAccessPolicyPath(controllerHome, repoId);
93
+ if (existsSync(current) || !isWorkspaceScopeKey(repoId)) return current;
94
+ const legacy = join(resolve(controllerHome), 'repositories', repoId, 'controller', 'access-policy.json');
95
+ return existsSync(legacy) ? legacy : current;
79
96
  }
80
97
 
81
98
  function defaultPolicy(repoId: string): RepositoryAccessPolicy {
@@ -90,7 +107,7 @@ function defaultPolicy(repoId: string): RepositoryAccessPolicy {
90
107
  }
91
108
 
92
109
  export function readRepositoryAccessPolicy(controllerHome: string, repoId: string): RepositoryAccessPolicy {
93
- const path = repositoryAccessPolicyPath(controllerHome, repoId);
110
+ const path = readableAccessPolicyPath(controllerHome, repoId);
94
111
  if (!existsSync(path)) return defaultPolicy(repoId);
95
112
  try {
96
113
  const parsed = JSON.parse(readFileSync(path, 'utf-8')) as Partial<RepositoryAccessPolicy>;
@@ -1,7 +1,7 @@
1
1
  import { randomUUID } from 'crypto';
2
2
  import { existsSync, mkdirSync } from 'fs';
3
3
  import { join, relative, resolve } from 'path';
4
- import { repositoryControllerRoot } from '../../../cli/repositories/controller-home';
4
+ import { isWorkspaceScopeKey, repositoryControllerRoot, scopedOperationRoot } from '../../../cli/repositories/controller-home';
5
5
  import { readJsonFile, sanitizeFileComponent, writeJsonAtomic } from '../../shared/json-files';
6
6
  import type { AccessMode } from './access-policy';
7
7
 
@@ -81,7 +81,7 @@ export interface AuthorizationContext {
81
81
  }
82
82
 
83
83
  function requestRoot(controllerHome: string, repoId: string): string {
84
- const root = join(repositoryControllerRoot(controllerHome, repoId), 'controller', 'approval-requests');
84
+ const root = join(scopedOperationRoot(controllerHome, repoId), 'controller', 'approval-requests');
85
85
  mkdirSync(root, { recursive: true, mode: 0o700 });
86
86
  return root;
87
87
  }
@@ -90,6 +90,23 @@ function requestPath(controllerHome: string, repoId: string, requestId: string):
90
90
  return join(requestRoot(controllerHome, repoId), `${sanitizeFileComponent(requestId)}.json`);
91
91
  }
92
92
 
93
+ /**
94
+ * Bounded migration read: an approval issued for a workspace scope before the
95
+ * workspace partition existed is still resolvable instead of failing closed as
96
+ * a missing request.
97
+ */
98
+ function readableRequestPath(controllerHome: string, repoId: string, requestId: string): string {
99
+ const current = requestPath(controllerHome, repoId, requestId);
100
+ if (existsSync(current) || !isWorkspaceScopeKey(repoId)) return current;
101
+ const legacy = join(
102
+ repositoryControllerRoot(controllerHome, repoId),
103
+ 'controller',
104
+ 'approval-requests',
105
+ `${sanitizeFileComponent(requestId)}.json`,
106
+ );
107
+ return existsSync(legacy) ? legacy : current;
108
+ }
109
+
93
110
  function scopeMatches(context: AuthorizationContext): boolean {
94
111
  if (context.currentRepositoryId && context.repositoryId !== context.currentRepositoryId) return false;
95
112
  if (context.workId && context.boundWorkId && context.workId !== context.boundWorkId) return false;
@@ -163,7 +180,7 @@ export function createGoalDelegation(input: Omit<GoalDelegation, 'schemaVersion'
163
180
  }
164
181
 
165
182
  export function readAuthorizationRequest(controllerHome: string, repositoryId: string, approvalRequestId: string): AuthorizationRequestRecord {
166
- const path = requestPath(controllerHome, repositoryId, approvalRequestId);
183
+ const path = readableRequestPath(controllerHome, repositoryId, approvalRequestId);
167
184
  if (!existsSync(path)) throw new Error(`APPROVAL_REQUEST_NOT_FOUND: ${approvalRequestId}`);
168
185
  const request = readJsonFile<AuthorizationRequestRecord>(path);
169
186
  if (request.repositoryId !== repositoryId || request.approvalRequestId !== approvalRequestId) throw new Error('APPROVAL_REQUEST_IDENTITY_MISMATCH');
@@ -3,7 +3,7 @@ const EXPLICIT_AUTHORIZATION_OPERATIONS = new Set([
3
3
  'close_github_issue',
4
4
  'repository_remove',
5
5
  'repository_disable',
6
- 'repository_command_execute',
6
+ 'execute_command',
7
7
  'configure_github_plugin',
8
8
  ]);
9
9
 
@@ -1,10 +1,5 @@
1
- import { randomUUID } from 'crypto';
2
- import { realpathSync } from 'fs';
3
1
  import {
4
2
  acknowledgeControllerRoundClaim,
5
- beginInitialControllerRoundDispatch,
6
- beginControllerRoundRelayAfterRelease,
7
- finishControllerRoundRelayDispatch,
8
3
  getControllerRoundRelay,
9
4
  getControllerSession,
10
5
  releaseControllerSessionWithAuthority,
@@ -12,166 +7,8 @@ import {
12
7
  submitControllerRoundDisposition,
13
8
  type ControllerRoundDisposition,
14
9
  } from '../../../../packages/kernel/controller/api/index';
15
- import { chatgptControllerRoundBinding, recordChatgptControllerRoundTabSettlement, renderChatgptControllerRoundPrompt } from '../../root/controller-round-composition';
10
+ import { chatgptControllerRoundBinding } from '../../root/controller-round-composition';
16
11
  import { readExecutionSession, updateExecutionSession } from '../execution/session-store';
17
- import { runWorkChatgptContinuation, type WorkChatgptContinuationResult } from './chatgpt-work-continuation';
18
- import { getRepository } from '../../../cli/repositories/registry';
19
-
20
- export const SOURCE_ROUND_CONTINUATION_INSTRUCTION =
21
- '当前为 Forge V2 源码自动续跑模式。不要用已安装旧 Runtime 直接结束本轮,因为旧 Runtime 可能只建立 Work owner 而未 reconciliation provider_dispatch_outcome_unknown。若 Goal 尚未完成且无真实 blocker,必须使用 prompt 提供的 exact current-source round-continue invocation;若本轮应 wait、wait_for_user 或 goal_complete,则必须使用 current-source round-close,它只做 canonical claim acknowledgement、semantic disposition 和 release,绝不派发 successor。不得重新探测 Controller Home、repo/work identity、controller authority 或 relay scope。';
22
-
23
- function sourceCheckoutId(controllerHome: string, repoId: string, repoRoot: string): string {
24
- const repository = getRepository(repoId, controllerHome);
25
- const sourceRoot = realpathSync(repoRoot);
26
- const matches = repository.checkouts.filter((checkout) => {
27
- if (checkout.lifecycle === 'removed') return false;
28
- try { return realpathSync(checkout.canonicalRoot) === sourceRoot; } catch { return false; }
29
- });
30
- if (matches.length !== 1) {
31
- throw new Error(`SOURCE_ROUND_CHECKOUT_IDENTITY_AMBIGUOUS: ${repoId}:${repoRoot}:${matches.length}`);
32
- }
33
- return matches[0]!.checkoutId;
34
- }
35
-
36
- export function renderSourceRoundContinuationInstruction(input: {
37
- controllerHome: string;
38
- repoId: string;
39
- repoRoot: string;
40
- workId: string;
41
- controllerAuthorityId: string;
42
- relayScopeId: string;
43
- }): string {
44
- const checkoutId = sourceCheckoutId(input.controllerHome, input.repoId, input.repoRoot);
45
- const command = [
46
- 'bun',
47
- 'src/cli/index.ts',
48
- 'chatgpt',
49
- 'round-continue',
50
- '--controller-home', input.controllerHome,
51
- '--repo-id', input.repoId,
52
- '--work-id', input.workId,
53
- '--controller-authority-id', input.controllerAuthorityId,
54
- '--relay-scope-id', input.relayScopeId,
55
- ];
56
- const requestId = `source-round-continue:${input.controllerAuthorityId}`;
57
- const closeWaitCommand = [
58
- 'bun',
59
- 'src/cli/index.ts',
60
- 'chatgpt',
61
- 'round-close',
62
- '--controller-home', input.controllerHome,
63
- '--repo-id', input.repoId,
64
- '--work-id', input.workId,
65
- '--controller-authority-id', input.controllerAuthorityId,
66
- '--relay-scope-id', input.relayScopeId,
67
- '--disposition', 'wait',
68
- ];
69
- const closeWaitRequestId = `source-round-close:wait:${input.controllerAuthorityId}`;
70
- return [
71
- SOURCE_ROUND_CONTINUATION_INSTRUCTION,
72
- `Exact current-source continue invocation: repository_command_execute(repo_id=${JSON.stringify(input.repoId)}, checkout_id=${JSON.stringify(checkoutId)}, command=${JSON.stringify(command)}, request_id=${JSON.stringify(requestId)}).`,
73
- `Exact current-source wait/close invocation: repository_command_execute(repo_id=${JSON.stringify(input.repoId)}, checkout_id=${JSON.stringify(checkoutId)}, command=${JSON.stringify(closeWaitCommand)}, request_id=${JSON.stringify(closeWaitRequestId)}).`,
74
- `For wait_for_user or goal_complete use the same round-close command with only --disposition changed; wait_for_user must additionally provide --handoff-id for the active Handoff.`,
75
- `These exact lifecycle invocations are the sole repository_command_execute exception: do not pass wrapper work_id; CLI --work-id=${input.workId}, --controller-authority-id=${input.controllerAuthorityId}, and --relay-scope-id=${input.relayScopeId} remain the fenced Controller lifecycle authority.`,
76
- ].join(' ');
77
- }
78
-
79
-
80
- export interface SourceChatgptRoundOpenInput {
81
- controllerHome: string;
82
- repoId: string;
83
- repoRoot: string;
84
- workId: string;
85
- controllerId: string;
86
- principalId: string;
87
- controllerInstanceId?: string;
88
- continuationPrompt?: string;
89
- timeoutMs?: number;
90
- }
91
-
92
- export interface SourceChatgptRoundOpenResult {
93
- relayStatus: string;
94
- controllerAuthorityId: string;
95
- relayScopeId: string;
96
- dispatch: WorkChatgptContinuationResult;
97
- }
98
-
99
- export async function openChatgptControllerRoundFromSource(
100
- input: SourceChatgptRoundOpenInput,
101
- dependencies: { dispatch?: typeof runWorkChatgptContinuation } = {},
102
- ): Promise<SourceChatgptRoundOpenResult> {
103
- const store = { controllerHome: input.controllerHome, repoId: input.repoId };
104
- const binding = chatgptControllerRoundBinding(store, input.workId);
105
- const relay = beginInitialControllerRoundDispatch(store, {
106
- workId: input.workId,
107
- identity: {
108
- controllerId: input.controllerId.trim(),
109
- controllerType: 'chatgpt',
110
- principalId: input.principalId.trim(),
111
- controllerInstanceId: input.controllerInstanceId?.trim() || 'source-v2-launcher',
112
- sessionId: `source-v2-launch-${randomUUID()}`,
113
- },
114
- bindingId: binding?.bindingId,
115
- });
116
- if (relay.status === 'blocked' || !relay.authorityId) {
117
- throw new Error(`CONTROLLER_RELAY_LAUNCH_BLOCKED: ${relay.blockedReason ?? relay.relayScopeId}`);
118
- }
119
- const prompt = [
120
- renderChatgptControllerRoundPrompt(store, relay, { exactOriginWork: true }),
121
- renderSourceRoundContinuationInstruction({
122
- controllerHome: input.controllerHome,
123
- repoId: input.repoId,
124
- repoRoot: input.repoRoot,
125
- workId: input.workId,
126
- controllerAuthorityId: relay.authorityId,
127
- relayScopeId: relay.relayScopeId,
128
- }),
129
- input.continuationPrompt?.trim() ? `Continuation: ${input.continuationPrompt.trim()}` : '',
130
- ].filter(Boolean).join('\n\n');
131
- const dispatch = dependencies.dispatch ?? runWorkChatgptContinuation;
132
- const dispatched = await dispatch({
133
- controllerHome: input.controllerHome,
134
- repoId: input.repoId,
135
- repoRoot: input.repoRoot,
136
- workId: input.workId,
137
- prompt,
138
- controllerAuthorityId: relay.authorityId,
139
- relayScopeId: relay.relayScopeId,
140
- browserSessionId: binding?.browserSessionId,
141
- conversationUrl: binding?.conversationUrl,
142
- tabPolicy: 'reuse',
143
- timeoutMs: input.timeoutMs,
144
- });
145
- if (dispatched.status === 'failed') {
146
- const message = `${dispatched.error?.code ?? 'CONTROLLER_RELAY_DISPATCH_FAILED'}:${dispatched.error?.message ?? 'Controller relay dispatch failed'}`;
147
- const outcomeUnknown = dispatched.providerDeliveryStatus === 'outcome_unknown';
148
- const completed = finishControllerRoundRelayDispatch(store, {
149
- workId: input.workId,
150
- ok: false,
151
- error: message,
152
- outcomeUnknown,
153
- });
154
- if (!outcomeUnknown) throw new Error(message);
155
- return {
156
- relayStatus: completed?.status ?? 'blocked',
157
- controllerAuthorityId: relay.authorityId,
158
- relayScopeId: relay.relayScopeId,
159
- dispatch: dispatched,
160
- };
161
- }
162
- const updatedBinding = chatgptControllerRoundBinding(store, input.workId);
163
- const completed = finishControllerRoundRelayDispatch(store, {
164
- workId: input.workId,
165
- ok: true,
166
- bindingId: updatedBinding?.bindingId,
167
- });
168
- return {
169
- relayStatus: completed?.status ?? 'missing',
170
- controllerAuthorityId: relay.authorityId,
171
- relayScopeId: relay.relayScopeId,
172
- dispatch: dispatched,
173
- };
174
- }
175
12
 
176
13
  type SourceChatgptRoundTerminalDisposition = Exclude<ControllerRoundDisposition, 'continue_immediately'>;
177
14
 
@@ -191,57 +28,73 @@ interface ReconciledSourceRound {
191
28
  bindingId?: string;
192
29
  }
193
30
 
31
+ /**
32
+ * Compatibility close-only path for a ControllerRound that was already opened
33
+ * by a pre-convergence current-source canary. New source-mode open/continue
34
+ * dispatch is intentionally removed: candidate Runtime must be activated and
35
+ * all new Work-bound ChatGPT turns flow through Workflow Supervisor.
36
+ */
194
37
  function reconcileClaimedSourceRound(input: {
195
- controllerHome: string; repoId: string; workId: string; controllerAuthorityId: string; relayScopeId: string;
196
- }, options: { allowPendingReleaseContinuation?: boolean } = {}): ReconciledSourceRound {
38
+ controllerHome: string;
39
+ repoId: string;
40
+ workId: string;
41
+ controllerAuthorityId: string;
42
+ relayScopeId: string;
43
+ }): ReconciledSourceRound {
197
44
  const store = { controllerHome: input.controllerHome, repoId: input.repoId };
198
45
  const initialRelay = getControllerRoundRelay(store, input.workId);
199
46
  if (!initialRelay) throw new Error(`CONTROLLER_RELAY_ROUND_NOT_OPEN: ${input.workId}`);
200
- if (initialRelay.authorityId !== input.controllerAuthorityId.trim()) throw new Error(`CONTROLLER_RELAY_AUTHORITY_MISMATCH: ${input.workId}`);
201
- if (initialRelay.relayScopeId !== input.relayScopeId.trim()) throw new Error(`CONTROLLER_RELAY_SCOPE_MISMATCH: ${input.workId}`);
47
+ if (initialRelay.authorityId !== input.controllerAuthorityId.trim()) {
48
+ throw new Error(`CONTROLLER_RELAY_AUTHORITY_MISMATCH: ${input.workId}`);
49
+ }
50
+ if (initialRelay.relayScopeId !== input.relayScopeId.trim()) {
51
+ throw new Error(`CONTROLLER_RELAY_SCOPE_MISMATCH: ${input.workId}`);
52
+ }
202
53
 
203
54
  const owner = getControllerSession(store, input.workId);
204
55
  if (!owner) throw new Error(`CONTROLLER_RELAY_ACTIVE_CLAIM_REQUIRED: ${input.workId}`);
205
56
  if (owner.controllerType !== 'chatgpt') throw new Error(`CONTROLLER_RELAY_CHATGPT_ONLY: ${input.workId}`);
206
57
  const ownerAuthority = requireControllerOwnershipAuthority(owner, input.workId);
207
- const resumablePendingRelease = options.allowPendingReleaseContinuation === true
208
- && initialRelay.status === 'pending_release'
209
- && initialRelay.disposition === 'continue_immediately'
210
- && initialRelay.lifecycleStage === 'semantic_round_closed';
211
- const relay = resumablePendingRelease
212
- ? initialRelay
213
- : acknowledgeControllerRoundClaim(store, { workId: input.workId, session: owner });
58
+ const relay = acknowledgeControllerRoundClaim(store, { workId: input.workId, session: owner });
214
59
  if (!relay) throw new Error(`CONTROLLER_RELAY_ROUND_NOT_OPEN: ${input.workId}`);
215
- if (relay.authorityId !== input.controllerAuthorityId.trim()) throw new Error(`CONTROLLER_RELAY_AUTHORITY_MISMATCH: ${input.workId}`);
216
- if (relay.relayScopeId !== input.relayScopeId.trim()) throw new Error(`CONTROLLER_RELAY_SCOPE_MISMATCH: ${input.workId}`);
217
- if (resumablePendingRelease) {
218
- if (relay.controllerId !== owner.controllerId
219
- || relay.controllerType !== owner.controllerType
220
- || relay.principalId !== ownerAuthority.principalId
221
- || relay.controllerInstanceId !== ownerAuthority.controllerInstanceId) {
222
- throw new Error(`CONTROLLER_RELAY_PENDING_RELEASE_OWNER_MISMATCH: ${input.workId}`);
223
- }
224
- } else if (relay.status !== 'claimed') {
60
+ if (relay.authorityId !== input.controllerAuthorityId.trim()) {
61
+ throw new Error(`CONTROLLER_RELAY_AUTHORITY_MISMATCH: ${input.workId}`);
62
+ }
63
+ if (relay.relayScopeId !== input.relayScopeId.trim()) {
64
+ throw new Error(`CONTROLLER_RELAY_SCOPE_MISMATCH: ${input.workId}`);
65
+ }
66
+ if (relay.status !== 'claimed') {
225
67
  throw new Error(`CONTROLLER_RELAY_ROUND_NOT_CLAIMED: ${relay.status}`);
226
68
  }
227
- const identity = {
228
- controllerId: owner.controllerId,
229
- controllerType: 'chatgpt' as const,
230
- principalId: ownerAuthority.principalId,
231
- controllerInstanceId: ownerAuthority.controllerInstanceId,
232
- sessionId: owner.sessionId,
233
- claimGeneration: ownerAuthority.claimGeneration,
69
+
70
+ return {
71
+ store,
72
+ owner,
73
+ ownerAuthority,
74
+ relay,
75
+ identity: {
76
+ controllerId: owner.controllerId,
77
+ controllerType: 'chatgpt',
78
+ principalId: ownerAuthority.principalId,
79
+ controllerInstanceId: ownerAuthority.controllerInstanceId,
80
+ sessionId: owner.sessionId,
81
+ claimGeneration: ownerAuthority.claimGeneration,
82
+ },
83
+ bindingId: chatgptControllerRoundBinding(store, input.workId)?.bindingId,
234
84
  };
235
- return { store, owner, ownerAuthority, relay, identity, bindingId: chatgptControllerRoundBinding(store, input.workId)?.bindingId };
236
85
  }
237
86
 
238
- function releaseReconciledSourceRound(input: { controllerHome: string; workId: string }, reconciled: ReconciledSourceRound, actorPrefix: string): void {
87
+ function releaseReconciledSourceRound(
88
+ input: { controllerHome: string; workId: string },
89
+ reconciled: ReconciledSourceRound,
90
+ ): void {
239
91
  const released = releaseControllerSessionWithAuthority(reconciled.store, {
240
92
  workId: input.workId,
241
- actor: `${actorPrefix}:${reconciled.owner.controllerId}`,
93
+ actor: `source-chatgpt-round-close:${reconciled.owner.controllerId}`,
242
94
  authority: reconciled.ownerAuthority,
243
95
  });
244
96
  if (!released.allowed) throw new Error(`WORK_CONTROLLER_RELEASE_FENCED: ${input.workId}:${released.reason}`);
97
+
245
98
  const sessionIdentity = {
246
99
  sessionId: reconciled.owner.sessionId,
247
100
  principalId: reconciled.ownerAuthority.principalId,
@@ -249,7 +102,10 @@ function releaseReconciledSourceRound(input: { controllerHome: string; workId: s
249
102
  };
250
103
  const executionSession = readExecutionSession(input.controllerHome, sessionIdentity);
251
104
  if (executionSession?.activeWorkId === input.workId) {
252
- updateExecutionSession(input.controllerHome, sessionIdentity, { activeWorkId: undefined, lastValidatedAt: new Date().toISOString() });
105
+ updateExecutionSession(input.controllerHome, sessionIdentity, {
106
+ activeWorkId: undefined,
107
+ lastValidatedAt: new Date().toISOString(),
108
+ });
253
109
  }
254
110
  }
255
111
 
@@ -270,7 +126,9 @@ export interface SourceChatgptRoundCloseResult {
270
126
  relayScopeId: string;
271
127
  }
272
128
 
273
- export function closeChatgptControllerRoundFromSource(input: SourceChatgptRoundCloseInput): SourceChatgptRoundCloseResult {
129
+ export function closeChatgptControllerRoundFromSource(
130
+ input: SourceChatgptRoundCloseInput,
131
+ ): SourceChatgptRoundCloseResult {
274
132
  if (input.disposition === 'wait_for_user' && !input.handoffId?.trim()) {
275
133
  throw new Error('CONTROLLER_RELAY_WAIT_FOR_USER_HANDOFF_REQUIRED');
276
134
  }
@@ -285,113 +143,18 @@ export function closeChatgptControllerRoundFromSource(input: SourceChatgptRoundC
285
143
  ...(input.handoffId?.trim() ? { handoffId: input.handoffId.trim() } : {}),
286
144
  reason: input.reason ?? `source_v2_${input.disposition}`,
287
145
  });
288
- const expectedStatus = input.disposition === 'wait' ? 'waiting' : input.disposition === 'wait_for_user' ? 'waiting_for_user' : 'goal_complete';
146
+ const expectedStatus = input.disposition === 'wait'
147
+ ? 'waiting'
148
+ : input.disposition === 'wait_for_user'
149
+ ? 'waiting_for_user'
150
+ : 'goal_complete';
289
151
  if (disposition.status !== expectedStatus) {
290
152
  throw new Error(`CONTROLLER_RELAY_CLOSE_STATUS_INVALID: ${disposition.status}`);
291
153
  }
292
- releaseReconciledSourceRound(input, reconciled, 'source-chatgpt-round-close');
293
- return { disposition: input.disposition, dispositionStatus: disposition.status, relayScopeId: disposition.relayScopeId };
294
- }
295
-
296
- export interface SourceChatgptRoundContinueInput {
297
- controllerHome: string;
298
- repoId: string;
299
- repoRoot: string;
300
- workId: string;
301
- controllerAuthorityId: string;
302
- relayScopeId: string;
303
- reason?: string;
304
- timeoutMs?: number;
305
- }
306
-
307
- export interface SourceChatgptRoundContinueResult {
308
- dispositionStatus: string;
309
- relayStatus: string;
310
- relayWorkId: string;
311
- dispatch: WorkChatgptContinuationResult;
312
- }
313
-
314
- export async function continueChatgptControllerRoundFromSource(
315
- input: SourceChatgptRoundContinueInput,
316
- dependencies: { dispatch?: typeof runWorkChatgptContinuation } = {},
317
- ): Promise<SourceChatgptRoundContinueResult> {
318
- // The installed Runtime may be older than the source under canary. It is authoritative only
319
- // for establishing the exact live ControllerSession owner. Reconcile that durable owner
320
- // through the current source state machine before deciding whether this round is claimed.
321
- const reconciled = reconcileClaimedSourceRound(input, { allowPendingReleaseContinuation: true });
322
- const { store, owner, relay } = reconciled;
323
- // A transport/session failure can happen after the semantic disposition is durably
324
- // recorded but before owner release. Retry from that exact post-disposition boundary
325
- // instead of resubmitting continue_immediately (which would double-consume round budget).
326
- const disposition = relay.status === 'pending_release'
327
- ? relay
328
- : submitControllerRoundDisposition(store, {
329
- workId: input.workId,
330
- identity: reconciled.identity,
331
- disposition: 'continue_immediately',
332
- relayScopeId: input.relayScopeId,
333
- requirementId: relay.requirementId,
334
- bindingId: reconciled.bindingId,
335
- reason: input.reason ?? 'source_v2_immediate_continuation',
336
- });
337
- if (disposition.status !== 'pending_release') {
338
- throw new Error(`CONTROLLER_RELAY_CONTINUATION_NOT_PENDING_RELEASE: ${disposition.status}`);
339
- }
340
-
341
- releaseReconciledSourceRound(input, reconciled, 'source-chatgpt-round-continue');
342
-
343
- const nextRelay = beginControllerRoundRelayAfterRelease(store, { workId: input.workId, releasedSession: owner });
344
- if (!nextRelay || nextRelay.status !== 'dispatching' || !nextRelay.authorityId) {
345
- throw new Error(`CONTROLLER_RELAY_IMMEDIATE_DISPATCH_NOT_READY: ${nextRelay?.status ?? 'missing'}`);
346
- }
347
- const relayWorkId = nextRelay.originWorkId;
348
- const prompt = `${renderChatgptControllerRoundPrompt(store, nextRelay)}\n\n${renderSourceRoundContinuationInstruction({
349
- controllerHome: input.controllerHome,
350
- repoId: input.repoId,
351
- repoRoot: input.repoRoot,
352
- workId: relayWorkId,
353
- controllerAuthorityId: nextRelay.authorityId,
354
- relayScopeId: nextRelay.relayScopeId,
355
- })}`;
356
- const dispatch = dependencies.dispatch ?? runWorkChatgptContinuation;
357
- const dispatched = await dispatch({
358
- controllerHome: input.controllerHome,
359
- repoId: input.repoId,
360
- repoRoot: input.repoRoot,
361
- workId: relayWorkId,
362
- prompt,
363
- controllerAuthorityId: nextRelay.authorityId,
364
- relayScopeId: nextRelay.relayScopeId,
365
- tabPolicy: 'new',
366
- transportConversation: 'fresh',
367
- timeoutMs: input.timeoutMs,
368
- });
369
- if (dispatched.status === 'failed') {
370
- const message = `${dispatched.error?.code ?? 'CONTROLLER_RELAY_DISPATCH_FAILED'}:${dispatched.error?.message ?? 'Controller relay dispatch failed'}`;
371
- finishControllerRoundRelayDispatch(store, {
372
- workId: relayWorkId,
373
- ok: false,
374
- error: message,
375
- outcomeUnknown: dispatched.providerDeliveryStatus === 'outcome_unknown',
376
- });
377
- throw new Error(message);
378
- }
379
-
380
- recordChatgptControllerRoundTabSettlement(store, {
381
- workId: relayWorkId,
382
- relayScopeId: nextRelay.relayScopeId,
383
- status: 'retained_for_immediate_continuation',
384
- });
385
- const updatedBinding = chatgptControllerRoundBinding(store, relayWorkId);
386
- const completed = finishControllerRoundRelayDispatch(store, {
387
- workId: relayWorkId,
388
- ok: true,
389
- bindingId: updatedBinding?.bindingId,
390
- });
154
+ releaseReconciledSourceRound(input, reconciled);
391
155
  return {
156
+ disposition: input.disposition,
392
157
  dispositionStatus: disposition.status,
393
- relayStatus: completed?.status ?? 'missing',
394
- relayWorkId,
395
- dispatch: dispatched,
158
+ relayScopeId: disposition.relayScopeId,
396
159
  };
397
160
  }