@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
@@ -1,4 +1,5 @@
1
1
  import { createHash, randomUUID } from 'crypto';
2
+
2
3
  import { isWslWindowsRuntime } from '../../../cli/chatgpt-browser/bridge-provider';
3
4
  import { createChatgptBrowserDeliveryHost } from '../../../../adapters/chatgpt/browser-delivery-host';
4
5
  import { createChatgptWslBridgeDeliveryHost } from '../../../../adapters/chatgpt/wsl-bridge-delivery-host';
@@ -7,6 +8,7 @@ import {
7
8
  DEFAULT_CHATGPT_AUTOMATION_MODEL,
8
9
  DEFAULT_CHATGPT_AUTOMATION_REASONING,
9
10
  DEFAULT_CHATGPT_AUTOMATION_TAB_POLICY,
11
+ dispatchWithChatgptProviderBackpressure,
10
12
  type ChatgptAutomationReasoning,
11
13
  type ChatgptAutomationTabCleanupStatus,
12
14
  type ChatgptAutomationTabPolicy,
@@ -21,16 +23,6 @@ import {
21
23
  submitChatgptPrompt,
22
24
  withChatgptBrowserActionOrigin,
23
25
  } from '../../../../adapters/chatgpt/browser-delivery-runtime';
24
- import { getWorkContract } from '../../../../packages/kernel/work/api/index';
25
- import { readForgeInstanceIdentity } from '../../../../packages/kernel/identity/api/index';
26
- import {
27
- bindChatgptWorkConversation,
28
- getChatgptWorkConversationBinding,
29
- hasChatgptConversationIdentity,
30
- parseChatgptConversationIdentity,
31
- rebindChatgptWorkConversation,
32
- type ChatgptWorkConversationBinding,
33
- } from '../../../../adapters/chatgpt/work-conversation-binding-store';
34
26
 
35
27
  export {
36
28
  CHATGPT_AUTOMATION_SUBMISSION_OUTCOME_UNKNOWN,
@@ -56,48 +48,8 @@ export {
56
48
  settleWorkChatgptAutomationTab,
57
49
  } from '../../../../adapters/chatgpt/browser-delivery-runtime';
58
50
 
59
- const LEGACY_CONTROLLER_CHATGPT_SESSION_ID = 'forge-chatgpt-supercontroller';
60
51
  export const DEFAULT_CHATGPT_AUTOMATION_PLUGIN_MENTION = '@forge';
61
52
 
62
- export class ChatgptExecutionPlacementError extends Error {
63
- readonly code = 'CHATGPT_EXECUTION_PLACEMENT_MISMATCH';
64
- readonly targetForgeInstanceId: string;
65
- readonly currentForgeInstanceId?: string;
66
-
67
- constructor(targetForgeInstanceId: string, currentForgeInstanceId?: string) {
68
- super(`CHATGPT_EXECUTION_PLACEMENT_MISMATCH: target=${targetForgeInstanceId} current=${currentForgeInstanceId ?? 'unavailable'}`);
69
- this.name = 'ChatgptExecutionPlacementError';
70
- this.targetForgeInstanceId = targetForgeInstanceId;
71
- this.currentForgeInstanceId = currentForgeInstanceId;
72
- }
73
- }
74
-
75
-
76
- export interface WorkChatgptContinuationInput {
77
- controllerHome: string;
78
- repoId: string;
79
- repoRoot: string;
80
- workId: string;
81
- prompt: string;
82
- /** Durable per-round capability minted before ChatGPT dispatch. */
83
- controllerAuthorityId?: string;
84
- /** Durable semantic relay scope paired with controllerAuthorityId. */
85
- relayScopeId?: string;
86
- title?: string;
87
- browserSessionId?: string;
88
- conversationUrl?: string;
89
- model?: string;
90
- reasoning?: ChatgptAutomationReasoning;
91
- tabPolicy?: ChatgptAutomationTabPolicy;
92
- /** Transport-only conversation policy. `fresh` starts a new ChatGPT conversation while preserving the same durable Work/ControllerRound authority. */
93
- transportConversation?: 'bound' | 'fresh';
94
- timeoutMs?: number;
95
- /** Authorization provenance for Browser actions. Immediate/source launches default to chatgpt-action; Scheduler resume must pass schedule. */
96
- originSurface?: 'chatgpt-action' | 'schedule';
97
- /** Explicit controller-scoped Browser grant refs already authorized for this Work transport. */
98
- authorizationGrantRefs?: readonly string[];
99
- }
100
-
101
53
  export interface WorkChatgptContinuationDependencies {
102
54
  bridgeRuntime?: boolean;
103
55
  browserHost?: ChatgptProviderDeliveryHost;
@@ -137,27 +89,8 @@ export interface StandaloneChatgptPromptInput {
137
89
  reasoning?: ChatgptAutomationReasoning;
138
90
  tabPolicy?: ChatgptAutomationTabPolicy;
139
91
  timeoutMs?: number;
140
- }
141
-
142
- function workflowToolAttributionInstruction(input: WorkChatgptContinuationInput): string {
143
- const workId = input.workId;
144
- const authorityId = input.controllerAuthorityId?.trim();
145
- const relayScopeId = input.relayScopeId?.trim();
146
- const requirementScoped = relayScopeId?.startsWith('requirement:') === true;
147
- const repositoryAttribution = requirementScoped
148
- ? `本轮普通 repository_command_execute 和 repository_safe_patch_apply 必须显式传入实际被本轮语义选择且已成功 claim 的 repository-change Work 的 work_id;如果仍在推进 origin Work,则使用 work_id=${workId}。不得把只读/编排 Supervisor Work 的 work_id 用来归属 child Work 的源码修改,也不得省略 work_id。`
149
- : `本轮每一次 repository_command_execute 和 repository_safe_patch_apply 都必须显式传 work_id=${workId},不得省略。`;
150
- if (authorityId && relayScopeId) {
151
- return `Forge Workflow 执行契约:精确 Work ${workId}。本次启动的 controller round 已具备 durable controller authority:controller_authority_id=${authorityId},relay_scope_id=${relayScopeId}。第一次 controller_claim 必须使用这组完全相同的 authority;不得先调用不带 scope 的 controller_claim,也不得等待 claim 响应后再生成另一份 authority。如果当前 client 暴露 controller_authority_id 与 relay_scope_id,controller_claim 时必须同时传入。如果当前 frozen client schema 缺少任一字段,调用 rh_work operation=repair, work_id=${workId}, capability_id=controller.round:controller_claim:${authorityId}:${relayScopeId};Forge 会把它映射到同一个 fenced claim。claim 成功后,data.controllerAuthorityId 必须等于 ${authorityId};continue、verify、finalize、stop、controller_release 必须原样沿用同一 durable authority,必要时使用对应 compatibility capability。绝不能把 data.session.sessionId 当作 durable capability,因为 MCP execution session 可能轮换。${repositoryAttribution}唯一例外是 prompt 明确标记为 exact current-source Controller lifecycle invocation 的 repository_command_execute,它必须使用给定 source checkout_id 且不得传 wrapper work_id,因为 CLI 内部 --work-id 与 ControllerRound authority 才是该控制面变更的 fenced authority。`;
152
- }
153
- return `Forge Workflow 执行契约:首先 claim 精确 Work ${workId}。从成功的 controller_claim 响应中取得 data.controllerAuthorityId;此后该 Work 的每一次 rh_work lifecycle 调用(continue、verify、finalize、stop、controller_release)都必须把它原样作为 controller_authority_id 传入。如果当前 frozen client schema 不暴露 controller_authority_id,则把同一个 opaque value 作为 session_id compatibility carrier。绝不能把 data.session.sessionId 当作 durable capability,因为 MCP execution session 可能在工具调用之间被替换或失效。本轮每一次 repository_command_execute 和 repository_safe_patch_apply 都必须显式传 work_id=${workId},不得省略;唯一例外是 prompt 明确标记为 exact current-source Controller lifecycle invocation 的 repository_command_execute,它必须使用给定 source checkout_id 且不得传 wrapper work_id,因为 CLI 内部 --work-id 与 ControllerRound authority 才是该控制面变更的 fenced authority。`;
154
- }
155
-
156
- function controllerRoundAuthorityInputError(input: WorkChatgptContinuationInput): Error | undefined {
157
- const hasAuthority = Boolean(input.controllerAuthorityId?.trim());
158
- const hasRelayScope = Boolean(input.relayScopeId?.trim());
159
- if (hasAuthority === hasRelayScope) return undefined;
160
- return new Error('CHATGPT_CONTROLLER_ROUND_AUTHORITY_INCOMPLETE: controllerAuthorityId and relayScopeId must be supplied together');
92
+ /** Explicit Browser grant refs already authorized by the owning durable workflow/controller binding. */
93
+ authorizationGrantRefs?: readonly string[];
161
94
  }
162
95
 
163
96
  function normalizeModel(value?: string): string {
@@ -170,12 +103,6 @@ function normalizeReasoning(value?: ChatgptAutomationReasoning): ChatgptAutomati
170
103
  return value ?? DEFAULT_CHATGPT_AUTOMATION_REASONING;
171
104
  }
172
105
 
173
- const DEFAULT_CHATGPT_CONTROLLER_REASONING: ChatgptAutomationReasoning = 'xhigh';
174
-
175
- function normalizeControllerReasoning(value?: ChatgptAutomationReasoning): ChatgptAutomationReasoning {
176
- return value ?? DEFAULT_CHATGPT_CONTROLLER_REASONING;
177
- }
178
-
179
106
  function normalizeTabPolicy(value?: ChatgptAutomationTabPolicy): ChatgptAutomationTabPolicy {
180
107
  return value ?? DEFAULT_CHATGPT_AUTOMATION_TAB_POLICY;
181
108
  }
@@ -195,18 +122,13 @@ function resolveChatgptProviderDeliveryHost(
195
122
  return { bridgeRuntime, host };
196
123
  }
197
124
 
198
- export function stableChatgptWorkBrowserSessionId(repoId: string, workId: string): string {
199
- const digest = createHash('sha256').update(`${repoId}\n${workId}`).digest('hex').slice(0, 20);
200
- return `forge-chatgpt-work-${digest}`;
201
- }
202
-
203
- export function stableChatgptWorkBridgeSessionId(repoId: string, workId: string): string {
204
- const digest = createHash('sha256').update(`${repoId}\nbridge\n${workId}`).digest('hex').slice(0, 20);
125
+ export function stableChatgptWorkBridgeSessionId(_repoId: string, workId: string): string {
126
+ const digest = createHash('sha256').update(`bridge\n${workId}`).digest('hex').slice(0, 20);
205
127
  return `forge-chatgpt-bridge-${digest}`;
206
128
  }
207
129
 
208
- export function stableStandaloneChatgptBrowserSessionId(repoId: string, scopeId: string): string {
209
- const digest = createHash('sha256').update(`${repoId}\nstandalone\n${scopeId}`).digest('hex').slice(0, 20);
130
+ export function stableStandaloneChatgptBrowserSessionId(_repoId: string, scopeId: string): string {
131
+ const digest = createHash('sha256').update(`standalone\n${scopeId}`).digest('hex').slice(0, 20);
210
132
  return `forge-chatgpt-standalone-${digest}`;
211
133
  }
212
134
 
@@ -217,23 +139,6 @@ function resolveStandaloneChatgptBrowserSessionId(input: StandaloneChatgptPrompt
217
139
  return input.browserSessionId?.trim() || stable;
218
140
  }
219
141
 
220
- export function resolveChatgptWorkBrowserSessionId(input: {
221
- repoId: string;
222
- workId: string;
223
- tabPolicy?: ChatgptAutomationTabPolicy;
224
- explicitSessionId?: string;
225
- boundSessionId?: string;
226
- }): string {
227
- const policy = normalizeTabPolicy(input.tabPolicy);
228
- const stable = stableChatgptWorkBrowserSessionId(input.repoId, input.workId);
229
- if (policy === 'new') return `${stable}-${randomUUID().slice(0, 8)}`;
230
- const explicit = input.explicitSessionId?.trim();
231
- if (explicit && explicit !== LEGACY_CONTROLLER_CHATGPT_SESSION_ID) return explicit;
232
- const bound = input.boundSessionId?.trim();
233
- if (bound && bound !== LEGACY_CONTROLLER_CHATGPT_SESSION_ID) return bound;
234
- return stable;
235
- }
236
-
237
142
  export function withForgePluginMention(prompt: string): string {
238
143
  const value = prompt.trim();
239
144
  if (!value) throw new Error('CHATGPT_AUTOMATION_PROMPT_REQUIRED');
@@ -260,20 +165,27 @@ export async function runStandaloneChatgptPrompt(
260
165
  ? stableChatgptWorkBridgeSessionId(input.repoId, browserScopeId)
261
166
  : resolveStandaloneChatgptBrowserSessionId(input);
262
167
  const targetUrl = seedUrl ?? 'https://chatgpt.com/';
168
+ const authorizationGrantRefs = new Set(
169
+ (input.authorizationGrantRefs ?? []).map((ref) => ref.trim()).filter(Boolean),
170
+ );
263
171
 
264
172
  try {
265
- const delivery = await host.dispatch({
266
- controllerHome: input.controllerHome,
267
- repoId: input.repoId,
268
- repoRoot: input.repoRoot ?? process.cwd(),
269
- workId: browserScopeId,
270
- prompt: input.prompt,
271
- browserSessionId: sessionId,
272
- targetUrl,
273
- model,
274
- reasoning,
275
- timeoutMs: input.timeoutMs,
276
- });
173
+ const delivery = await withChatgptBrowserActionOrigin(
174
+ { surface: 'chatgpt-action', actor: 'chatgpt-standalone-prompt' },
175
+ () => dispatchWithChatgptProviderBackpressure(input.controllerHome, () => host.dispatch({
176
+ controllerHome: input.controllerHome,
177
+ repoId: input.repoId,
178
+ repoRoot: input.repoRoot ?? process.cwd(),
179
+ workId: browserScopeId,
180
+ prompt: input.prompt,
181
+ browserSessionId: sessionId,
182
+ targetUrl,
183
+ model,
184
+ reasoning,
185
+ timeoutMs: input.timeoutMs,
186
+ })),
187
+ authorizationGrantRefs,
188
+ );
277
189
  if (delivery.status !== 'dispatch_confirmed') {
278
190
  return {
279
191
  status: 'failed',
@@ -285,6 +197,7 @@ export async function runStandaloneChatgptPrompt(
285
197
  reasoning,
286
198
  tabPolicy,
287
199
  executionPreferenceVerified: delivery.executionPreferenceVerified,
200
+ authorizationGrantRefs: [...authorizationGrantRefs],
288
201
  providerDeliveryStatus: delivery.status,
289
202
  error: delivery.error ?? { code: `CHATGPT_PROVIDER_${delivery.status.toUpperCase()}`, message: delivery.status },
290
203
  };
@@ -322,193 +235,9 @@ export async function runStandaloneChatgptPrompt(
322
235
  reasoning,
323
236
  tabPolicy,
324
237
  executionPreferenceVerified: false,
325
- error: {
326
- code: error instanceof Error && error.message.includes(':') ? error.message.split(':', 1)[0] : bridgeRuntime ? 'CHATGPT_BRIDGE_DISPATCH_FAILED' : 'CHATGPT_CONTROLLER_BROWSER_FAILED',
327
- message: error instanceof Error ? error.message : String(error),
328
- },
329
- };
330
- }
331
- }
332
-
333
- /**
334
- * Dispatches a bounded resume prompt to one controller-owned ChatGPT Web tab.
335
- * Chat history is transport context only. Forge Work/Plan/evidence remain authoritative.
336
- */
337
- export async function runWorkChatgptContinuation(
338
- input: WorkChatgptContinuationInput,
339
- dependencies: WorkChatgptContinuationDependencies = {},
340
- ): Promise<WorkChatgptContinuationResult> {
341
- const store = { controllerHome: input.controllerHome, repoId: input.repoId };
342
- const existing = getChatgptWorkConversationBinding(store, input.workId);
343
- const authorizationGrantRefs = new Set(
344
- [...(existing?.authorizationGrantRefs ?? []), ...(input.authorizationGrantRefs ?? [])]
345
- .map((ref) => ref.trim())
346
- .filter(Boolean),
347
- );
348
- const transportConversation = input.transportConversation ?? 'bound';
349
- const seedUrl = transportConversation === 'fresh' ? undefined : input.conversationUrl?.trim() || existing?.conversationUrl;
350
- const model = normalizeModel(input.model);
351
- const reasoning = normalizeControllerReasoning(input.reasoning);
352
- const tabPolicy = transportConversation === 'fresh' ? 'new' : normalizeTabPolicy(input.tabPolicy);
353
- const { bridgeRuntime, host } = resolveChatgptProviderDeliveryHost(dependencies);
354
- const authorityInputError = controllerRoundAuthorityInputError(input);
355
- if (authorityInputError) {
356
- const browserSessionId = bridgeRuntime
357
- ? stableChatgptWorkBridgeSessionId(input.repoId, input.workId)
358
- : resolveChatgptWorkBrowserSessionId({
359
- repoId: input.repoId,
360
- workId: input.workId,
361
- tabPolicy,
362
- explicitSessionId: input.browserSessionId,
363
- boundSessionId: existing?.latestBrowserSessionId,
364
- });
365
- return {
366
- status: 'failed',
367
- provider: bridgeRuntime ? 'chatgpt-bridge' : 'controller-browser',
368
- browserSessionId,
369
- conversationUrl: seedUrl,
370
- conversationId: existing?.conversationId,
371
- localAlias: existing?.localAlias,
372
- resumedFromBinding: Boolean(existing),
373
- model,
374
- reasoning,
375
- tabPolicy,
376
- executionPreferenceVerified: false,
377
238
  authorizationGrantRefs: [...authorizationGrantRefs],
378
239
  error: {
379
- code: 'CHATGPT_CONTROLLER_ROUND_AUTHORITY_INCOMPLETE',
380
- message: authorityInputError.message,
381
- },
382
- };
383
- }
384
-
385
- const sessionId = resolveChatgptWorkBrowserSessionId({
386
- repoId: input.repoId,
387
- workId: input.workId,
388
- tabPolicy,
389
- explicitSessionId: input.browserSessionId,
390
- boundSessionId: existing?.latestBrowserSessionId,
391
- });
392
- let binding: ChatgptWorkConversationBinding | undefined = existing;
393
- const deliverySessionId = bridgeRuntime
394
- ? stableChatgptWorkBridgeSessionId(input.repoId, input.workId)
395
- : sessionId;
396
-
397
- try {
398
- const work = getWorkContract(store, input.workId);
399
- if (!work || work.repoId !== input.repoId) {
400
- throw new Error(`CHATGPT_WORK_CONTRACT_NOT_FOUND: ${input.repoId}:${input.workId}`);
401
- }
402
- const targetForgeInstanceId = work.executionPlacement?.forgeInstanceId?.trim();
403
- if (targetForgeInstanceId) {
404
- const currentForgeInstanceId = readForgeInstanceIdentity(input.controllerHome)?.instanceId?.trim();
405
- if (currentForgeInstanceId !== targetForgeInstanceId) {
406
- throw new ChatgptExecutionPlacementError(targetForgeInstanceId, currentForgeInstanceId);
407
- }
408
- }
409
- if (!bridgeRuntime && seedUrl && !binding && hasChatgptConversationIdentity(seedUrl)) {
410
- binding = bindChatgptWorkConversation(store, {
411
- workId: input.workId,
412
- conversationUrl: seedUrl,
413
- latestBrowserSessionId: deliverySessionId,
414
- authorizationGrantRefs: [...authorizationGrantRefs],
415
- localAlias: input.title,
416
- });
417
- }
418
- const targetUrl = transportConversation === 'fresh' ? 'https://chatgpt.com/' : binding?.conversationUrl ?? seedUrl ?? 'https://chatgpt.com/';
419
- const renderedPrompt = `${workflowToolAttributionInstruction(input)}\n\n${input.prompt}`;
420
- const delivery = await withChatgptBrowserActionOrigin(
421
- { surface: input.originSurface ?? 'chatgpt-action', actor: 'chatgpt-work-continuation' },
422
- () => host.dispatch({
423
- controllerHome: input.controllerHome,
424
- repoId: input.repoId,
425
- repoRoot: input.repoRoot,
426
- workId: input.workId,
427
- prompt: renderedPrompt,
428
- browserSessionId: deliverySessionId,
429
- targetUrl,
430
- model,
431
- reasoning,
432
- timeoutMs: input.timeoutMs,
433
- }),
434
- authorizationGrantRefs,
435
- );
436
- const observedUrl = delivery.conversationUrl ?? targetUrl;
437
- const mayPersistObservedConversation = delivery.status === 'dispatch_confirmed' || delivery.status === 'outcome_unknown';
438
- if (mayPersistObservedConversation && /\/c\/[^/?#]+/.test(observedUrl)) {
439
- const observedIdentity = parseChatgptConversationIdentity(observedUrl);
440
- binding = binding && binding.conversationId !== observedIdentity.conversationId
441
- ? rebindChatgptWorkConversation(store, {
442
- workId: input.workId,
443
- previousConversationId: binding.conversationId,
444
- conversationUrl: observedUrl,
445
- latestBrowserSessionId: delivery.browserSessionId,
446
- authorizationGrantRefs: [...authorizationGrantRefs],
447
- localAlias: binding.localAlias ?? input.title,
448
- })
449
- : bindChatgptWorkConversation(store, {
450
- workId: input.workId,
451
- conversationUrl: observedUrl,
452
- latestBrowserSessionId: delivery.browserSessionId,
453
- authorizationGrantRefs: [...authorizationGrantRefs],
454
- localAlias: binding?.localAlias ?? input.title,
455
- });
456
- }
457
- if (delivery.status !== 'dispatch_confirmed') {
458
- return {
459
- status: 'failed',
460
- provider: delivery.provider,
461
- browserSessionId: delivery.browserSessionId,
462
- conversationUrl: binding?.conversationUrl ?? delivery.conversationUrl ?? seedUrl,
463
- conversationId: binding?.conversationId,
464
- localAlias: binding?.localAlias,
465
- resumedFromBinding: Boolean(existing),
466
- model,
467
- reasoning,
468
- tabPolicy,
469
- executionPreferenceVerified: delivery.executionPreferenceVerified,
470
- authorizationGrantRefs: [...authorizationGrantRefs],
471
- providerDeliveryStatus: delivery.status,
472
- error: delivery.error ?? { code: `CHATGPT_PROVIDER_${delivery.status.toUpperCase()}`, message: delivery.status },
473
- };
474
- }
475
- return {
476
- status: 'dispatched',
477
- provider: delivery.provider,
478
- browserSessionId: delivery.browserSessionId,
479
- conversationUrl: binding?.conversationUrl ?? observedUrl,
480
- conversationId: binding?.conversationId,
481
- localAlias: binding?.localAlias,
482
- resumedFromBinding: Boolean(existing),
483
- model,
484
- reasoning,
485
- tabPolicy,
486
- executionPreferenceVerified: delivery.executionPreferenceVerified,
487
- authorizationGrantRefs: [...authorizationGrantRefs],
488
- providerDeliveryStatus: delivery.status,
489
- };
490
- } catch (error) {
491
- const provider = bridgeRuntime ? 'chatgpt-bridge' : 'controller-browser';
492
- const fallbackSessionId = bridgeRuntime ? deliverySessionId : sessionId;
493
- return {
494
- status: 'failed',
495
- provider,
496
- browserSessionId: fallbackSessionId,
497
- conversationUrl: binding?.conversationUrl ?? seedUrl,
498
- conversationId: binding?.conversationId,
499
- localAlias: binding?.localAlias,
500
- resumedFromBinding: Boolean(existing),
501
- model,
502
- reasoning,
503
- tabPolicy,
504
- executionPreferenceVerified: false,
505
- authorizationGrantRefs: [...authorizationGrantRefs],
506
- error: {
507
- code: error instanceof ChatgptExecutionPlacementError
508
- ? error.code
509
- : error instanceof Error && error.message.includes(':')
510
- ? error.message.split(':', 1)[0]
511
- : bridgeRuntime ? 'CHATGPT_BRIDGE_DISPATCH_FAILED' : 'CHATGPT_CONTROLLER_BROWSER_FAILED',
240
+ code: error instanceof Error && error.message.includes(':') ? error.message.split(':', 1)[0] : bridgeRuntime ? 'CHATGPT_BRIDGE_DISPATCH_FAILED' : 'CHATGPT_CONTROLLER_BROWSER_FAILED',
512
241
  message: error instanceof Error ? error.message : String(error),
513
242
  },
514
243
  };
@@ -0,0 +1,238 @@
1
+ import { spawn } from 'child_process';
2
+ import { mkdirSync } from 'fs';
3
+ import { tmpdir } from 'os';
4
+ import { join } from 'path';
5
+ import { redactProcessOutput } from '../../../effects/process-runner';
6
+ import { resolveProviderMcpBootstrap } from './provider-mcp-bootstrap';
7
+ import {
8
+ buildCodexControllerInvocation,
9
+ launcherProcessEnvironment,
10
+ resolveLauncherExecutable,
11
+ } from './thin-launcher';
12
+
13
+ const LOCAL_CONVERSATION_TIMEOUT_MS = 5 * 60_000;
14
+ const LOCAL_CONVERSATION_MAX_OUTPUT_BYTES = 4 * 1024 * 1024;
15
+ const LOCAL_CONVERSATION_MAX_PROMPT_CHARS = 20_000;
16
+ const LOCAL_CONVERSATION_ID = /^[A-Za-z0-9._:-]{1,160}$/;
17
+
18
+ export interface LocalConversationProviderStatus {
19
+ provider: 'codex';
20
+ status: 'ready' | 'not_configured' | 'unavailable';
21
+ label: string;
22
+ detail: string;
23
+ streaming: boolean;
24
+ tools: boolean;
25
+ }
26
+
27
+ export interface LocalConversationSendInput {
28
+ controllerHome: string;
29
+ conversationId: string;
30
+ providerSessionId?: string;
31
+ prompt: string;
32
+ repoId?: string;
33
+ timeoutMs?: number;
34
+ }
35
+
36
+ export interface LocalConversationSendResult {
37
+ provider: 'codex';
38
+ status: 'completed';
39
+ conversationId: string;
40
+ providerSessionId: string;
41
+ output: string;
42
+ toolActivityCount: number;
43
+ }
44
+
45
+ export interface ParsedCodexConversationEvents {
46
+ providerSessionId?: string;
47
+ output?: string;
48
+ toolActivityCount: number;
49
+ }
50
+
51
+ function record(value: unknown): Record<string, unknown> | undefined {
52
+ return value && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : undefined;
53
+ }
54
+
55
+ function boundedTimeout(value: number | undefined): number {
56
+ if (!Number.isFinite(value)) return LOCAL_CONVERSATION_TIMEOUT_MS;
57
+ return Math.max(5_000, Math.min(10 * 60_000, Math.trunc(value!)));
58
+ }
59
+
60
+ function agentMessageText(item: Record<string, unknown>): string | undefined {
61
+ if (typeof item.text === 'string' && item.text.trim()) return item.text.trim();
62
+ if (typeof item.output_text === 'string' && item.output_text.trim()) return item.output_text.trim();
63
+ if (!Array.isArray(item.content)) return undefined;
64
+ const text = item.content.map((entry) => {
65
+ const content = record(entry);
66
+ if (!content) return '';
67
+ if (typeof content.text === 'string') return content.text;
68
+ if (typeof content.output_text === 'string') return content.output_text;
69
+ return '';
70
+ }).filter(Boolean).join('\n').trim();
71
+ return text || undefined;
72
+ }
73
+
74
+ export function parseCodexConversationJsonl(stdout: string): ParsedCodexConversationEvents {
75
+ let providerSessionId: string | undefined;
76
+ let output: string | undefined;
77
+ let toolActivityCount = 0;
78
+ for (const line of stdout.split(/\r?\n/)) {
79
+ const trimmed = line.trim();
80
+ if (!trimmed.startsWith('{')) continue;
81
+ let event: Record<string, unknown> | undefined;
82
+ try { event = record(JSON.parse(trimmed)); } catch { continue; }
83
+ if (!event) continue;
84
+ const type = typeof event.type === 'string' ? event.type : '';
85
+ if (type === 'thread.started' && typeof event.thread_id === 'string' && event.thread_id.trim()) {
86
+ providerSessionId = event.thread_id.trim();
87
+ }
88
+ if (type !== 'item.completed') continue;
89
+ const item = record(event.item);
90
+ if (!item) continue;
91
+ const itemType = typeof item.type === 'string' ? item.type : '';
92
+ if (itemType === 'agent_message') {
93
+ output = agentMessageText(item) ?? output;
94
+ continue;
95
+ }
96
+ if (['mcp_tool_call', 'command_execution', 'file_change', 'web_search'].includes(itemType)) {
97
+ toolActivityCount += 1;
98
+ }
99
+ }
100
+ return { providerSessionId, output, toolActivityCount };
101
+ }
102
+
103
+ function localConversationCwd(): string {
104
+ const root = join(tmpdir(), 'forge-local-controller');
105
+ mkdirSync(root, { recursive: true, mode: 0o700 });
106
+ return root;
107
+ }
108
+
109
+ function conversationPrompt(prompt: string, repoId?: string): string {
110
+ return [
111
+ 'You are the Forge Desktop local controller.',
112
+ 'Use the injected Forge MCP capabilities for repository, Runtime, and other Forge operations. Do not create Requirement, Plan, Work, ControllerRound, or a scheduled continuation unless the user explicitly requests that durable lifecycle.',
113
+ repoId
114
+ ? `Attached repository: ${repoId}. Pass repo_id=${repoId} to Forge capabilities that require repository scope.`
115
+ : 'No repository is attached. Do not guess a repository identity.',
116
+ '',
117
+ prompt,
118
+ ].join('\n');
119
+ }
120
+
121
+ export function readLocalConversationProviderStatus(cwd: string = process.cwd()): LocalConversationProviderStatus {
122
+ try {
123
+ resolveLauncherExecutable({ controllerType: 'codex', cwd });
124
+ return {
125
+ provider: 'codex',
126
+ status: 'ready',
127
+ label: 'Codex 已连接',
128
+ detail: '使用 Codex CLI 的现有登录;Forge 操作通过当前 Runtime MCP capability 执行。',
129
+ streaming: false,
130
+ tools: true,
131
+ };
132
+ } catch (error) {
133
+ const message = error instanceof Error ? error.message : String(error);
134
+ const missing = message.startsWith('LAUNCHER_EXECUTABLE_UNAVAILABLE');
135
+ return {
136
+ provider: 'codex',
137
+ status: missing ? 'not_configured' : 'unavailable',
138
+ label: missing ? 'Codex CLI 未安装' : 'Codex 暂不可用',
139
+ detail: missing ? '安装并登录 Codex CLI 后即可使用本地会话。' : message,
140
+ streaming: false,
141
+ tools: false,
142
+ };
143
+ }
144
+ }
145
+
146
+ function runCodexConversation(
147
+ executable: string,
148
+ args: string[],
149
+ env: NodeJS.ProcessEnv,
150
+ cwd: string,
151
+ timeoutMs: number,
152
+ ): Promise<{ stdout: string; stderr: string }> {
153
+ return new Promise((resolve, reject) => {
154
+ const child = spawn(executable, args, {
155
+ cwd,
156
+ env,
157
+ stdio: ['ignore', 'pipe', 'pipe'],
158
+ });
159
+ let stdout = '';
160
+ let stderr = '';
161
+ let settled = false;
162
+ const fail = (error: Error) => {
163
+ if (settled) return;
164
+ settled = true;
165
+ clearTimeout(timer);
166
+ reject(error);
167
+ };
168
+ const append = (current: string, chunk: unknown, stream: 'stdout' | 'stderr'): string => {
169
+ const next = `${current}${Buffer.isBuffer(chunk) ? chunk.toString('utf8') : String(chunk ?? '')}`;
170
+ if (Buffer.byteLength(next, 'utf8') > LOCAL_CONVERSATION_MAX_OUTPUT_BYTES) {
171
+ child.kill('SIGTERM');
172
+ fail(new Error(`LOCAL_CONVERSATION_${stream.toUpperCase()}_TOO_LARGE`));
173
+ return current;
174
+ }
175
+ return next;
176
+ };
177
+ child.stdout?.on('data', (chunk) => { stdout = append(stdout, chunk, 'stdout'); });
178
+ child.stderr?.on('data', (chunk) => { stderr = append(stderr, chunk, 'stderr'); });
179
+ child.once('error', (error) => fail(new Error(`LOCAL_CONVERSATION_PROVIDER_START_FAILED: ${error.message}`)));
180
+ child.once('close', (code, signal) => {
181
+ if (settled) return;
182
+ settled = true;
183
+ clearTimeout(timer);
184
+ if (code !== 0) {
185
+ const detail = redactProcessOutput(stderr.trim() || stdout.trim()).replace(/\s+/g, ' ').slice(0, 1200);
186
+ reject(new Error(`LOCAL_CONVERSATION_PROVIDER_FAILED: code=${String(code ?? 'null')} signal=${signal ?? 'none'}${detail ? `; ${detail}` : ''}`));
187
+ return;
188
+ }
189
+ resolve({ stdout, stderr });
190
+ });
191
+ const timer = setTimeout(() => {
192
+ child.kill('SIGTERM');
193
+ fail(new Error('LOCAL_CONVERSATION_PROVIDER_TIMEOUT'));
194
+ }, timeoutMs);
195
+ });
196
+ }
197
+
198
+ export async function sendLocalConversation(input: LocalConversationSendInput): Promise<LocalConversationSendResult> {
199
+ const conversationId = input.conversationId.trim();
200
+ const prompt = input.prompt.trim();
201
+ const providerSessionId = input.providerSessionId?.trim();
202
+ const repoId = input.repoId?.trim();
203
+ if (!LOCAL_CONVERSATION_ID.test(conversationId)) throw new Error('LOCAL_CONVERSATION_ID_INVALID');
204
+ if (!prompt || prompt.length > LOCAL_CONVERSATION_MAX_PROMPT_CHARS) throw new Error('LOCAL_CONVERSATION_PROMPT_INVALID');
205
+ if (providerSessionId && !LOCAL_CONVERSATION_ID.test(providerSessionId)) throw new Error('LOCAL_CONVERSATION_PROVIDER_SESSION_INVALID');
206
+ if (repoId && repoId.length > 256) throw new Error('LOCAL_CONVERSATION_REPOSITORY_INVALID');
207
+
208
+ const cwd = localConversationCwd();
209
+ const executable = resolveLauncherExecutable({ controllerType: 'codex', cwd });
210
+ const bootstrap = resolveProviderMcpBootstrap(input.controllerHome, 'codex', `local-${conversationId}`);
211
+ const invocation = buildCodexControllerInvocation({
212
+ executable,
213
+ prompt: conversationPrompt(prompt, repoId),
214
+ mcpBootstrap: bootstrap,
215
+ sandbox: 'read-only',
216
+ resumeSessionId: providerSessionId,
217
+ json: true,
218
+ });
219
+ const completed = await runCodexConversation(
220
+ invocation.executable,
221
+ invocation.args,
222
+ launcherProcessEnvironment(bootstrap.env),
223
+ cwd,
224
+ boundedTimeout(input.timeoutMs),
225
+ );
226
+ const parsed = parseCodexConversationJsonl(completed.stdout);
227
+ const resolvedProviderSessionId = parsed.providerSessionId ?? providerSessionId;
228
+ if (!resolvedProviderSessionId) throw new Error('LOCAL_CONVERSATION_PROVIDER_SESSION_MISSING');
229
+ if (!parsed.output?.trim()) throw new Error('LOCAL_CONVERSATION_RESPONSE_MISSING');
230
+ return {
231
+ provider: 'codex',
232
+ status: 'completed',
233
+ conversationId,
234
+ providerSessionId: resolvedProviderSessionId,
235
+ output: parsed.output.trim(),
236
+ toolActivityCount: parsed.toolActivityCount,
237
+ };
238
+ }
@@ -73,8 +73,11 @@ export function codexMcpConfigArgs(bootstrap: ProviderMcpBootstrap): string[] {
73
73
  .map(([key, value]) => `${JSON.stringify(key)}=${JSON.stringify(value)}`)
74
74
  .join(',')}}`;
75
75
  return [
76
+ // Replace the entire table: Codex rejects a merged URL + persisted stdio
77
+ // transport even when command/args are overridden separately.
78
+ '-c', `mcp_servers.forge={url=${JSON.stringify(bootstrap.url)}, bearer_token_env_var=${JSON.stringify(bootstrap.bearerTokenEnvVar)}, http_headers=${headerTable}}`,
79
+ // Keep the explicit URL override visible for diagnostics; the complete
80
+ // table above has already removed the persisted stdio transport.
76
81
  '-c', `mcp_servers.forge.url=${JSON.stringify(bootstrap.url)}`,
77
- '-c', `mcp_servers.forge.bearer_token_env_var=${JSON.stringify(bootstrap.bearerTokenEnvVar)}`,
78
- '-c', `mcp_servers.forge.http_headers=${headerTable}`,
79
82
  ];
80
83
  }