@moretea-labs/forge 1.8.0 → 1.8.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (695) hide show
  1. package/AGENTS.md +73 -7
  2. package/CHANGELOG.md +34 -0
  3. package/CLAUDE.md +17 -2
  4. package/CONTRIBUTING.md +3 -2
  5. package/README.en.md +24 -3
  6. package/README.md +10 -6
  7. package/README.zh-CN.md +5 -3
  8. package/THIRD_PARTY_NOTICES.md +1 -2
  9. package/adapters/chatgpt/browser-delivery-host.ts +7 -1
  10. package/adapters/chatgpt/browser-delivery-runtime.ts +531 -56
  11. package/adapters/chatgpt/controller-binding-store.ts +101 -22
  12. package/adapters/chatgpt/controller-round-host.ts +15 -25
  13. package/adapters/chatgpt/controller-round-settlement-store.ts +58 -4
  14. package/adapters/chatgpt/provider-delivery.ts +229 -2
  15. package/adapters/chatgpt/work-conversation-binding-store.ts +99 -54
  16. package/adapters/computer/chatgpt-extension-target.ts +708 -0
  17. package/adapters/computer/chrome-extension/background.js +541 -0
  18. package/adapters/computer/chrome-extension/content.js +402 -0
  19. package/adapters/computer/chrome-extension/core.js +24 -0
  20. package/adapters/computer/chrome-extension/manifest.json +32 -0
  21. package/adapters/computer/desktop-operator-discovery.ts +11 -31
  22. package/adapters/computer/desktop-operator-provider.ts +18 -6
  23. package/adapters/computer/interaction-target-authority.ts +178 -24
  24. package/adapters/mcp/access-mode.ts +18 -39
  25. package/adapters/mcp/auth.ts +2 -7
  26. package/adapters/mcp/instructions.ts +6 -5
  27. package/adapters/mcp/multi-repository.ts +10 -47
  28. package/adapters/mcp/oauth.ts +73 -0
  29. package/adapters/mcp/paths.ts +4 -1
  30. package/adapters/mcp/runtime-gateway/bounded-result-runtime.ts +62 -0
  31. package/adapters/mcp/runtime-gateway/cognition-settlement.ts +201 -0
  32. package/adapters/mcp/runtime-gateway/context-adapter.ts +490 -113
  33. package/adapters/mcp/runtime-gateway/context-pack-sidecar.ts +83 -0
  34. package/adapters/mcp/runtime-gateway/controller-authority-adapter.ts +20 -5
  35. package/adapters/mcp/runtime-gateway/core-capability-adapter.ts +258 -0
  36. package/adapters/mcp/runtime-gateway/engineering-preconditions.ts +10 -27
  37. package/adapters/mcp/runtime-gateway/engineering-tool-contract.ts +15 -0
  38. package/adapters/mcp/runtime-gateway/execution-tools.ts +14 -54
  39. package/adapters/mcp/runtime-gateway/gateway-execution-adapter.ts +2 -1
  40. package/adapters/mcp/runtime-gateway/plugin-adapter.ts +132 -47
  41. package/adapters/mcp/runtime-gateway/process-tools.ts +173 -23
  42. package/adapters/mcp/runtime-gateway/protected-computer-adapter.ts +16 -4
  43. package/adapters/mcp/runtime-gateway/recovery-adapter.ts +69 -52
  44. package/adapters/mcp/runtime-gateway/repository-compat-adapter.ts +4 -35
  45. package/adapters/mcp/runtime-gateway/result-adapter.ts +10 -4
  46. package/adapters/mcp/runtime-gateway/router.ts +19 -507
  47. package/adapters/mcp/runtime-gateway/routing-policy.ts +506 -0
  48. package/adapters/mcp/runtime-gateway/runtime-observation-adapter.ts +15 -66
  49. package/adapters/mcp/runtime-gateway/runtime-readiness-observation.ts +218 -0
  50. package/adapters/mcp/runtime-gateway/runtime-tool-definitions.ts +123 -178
  51. package/adapters/mcp/runtime-gateway/runtime-tools.ts +11 -5
  52. package/adapters/mcp/runtime-gateway/scheduler-adapter.ts +37 -1
  53. package/adapters/mcp/runtime-gateway/shared-adapter.ts +20 -0
  54. package/adapters/mcp/runtime-gateway/status-inbox-adapter.ts +416 -270
  55. package/adapters/mcp/runtime-gateway/typescript-navigation-sidecar.ts +140 -0
  56. package/adapters/mcp/runtime-gateway/work-adapter.ts +262 -3123
  57. package/adapters/mcp/runtime-gateway/work-controller-operations.ts +257 -0
  58. package/adapters/mcp/runtime-gateway/work-detail-projection.ts +60 -0
  59. package/adapters/mcp/runtime-gateway/work-input-wire-migration.ts +229 -0
  60. package/adapters/mcp/runtime-gateway/work-learning-operations.ts +145 -0
  61. package/adapters/mcp/runtime-gateway/work-list-projection.ts +38 -0
  62. package/adapters/mcp/runtime-gateway/work-plan-operations.ts +382 -0
  63. package/adapters/mcp/runtime-gateway/work-repair-adapter.ts +308 -0
  64. package/adapters/mcp/runtime-gateway/work-requirement-operations.ts +148 -0
  65. package/adapters/mcp/runtime-gateway/work-semantic-operations.ts +320 -0
  66. package/adapters/mcp/runtime-gateway/work-workflow-operations.ts +113 -0
  67. package/adapters/mcp/runtime-gateway/workflow-supervisor-adapter.ts +180 -0
  68. package/adapters/mcp/server.ts +91 -26
  69. package/adapters/mcp/setup.ts +5 -13
  70. package/adapters/mcp/tool-mapping/access-tools.ts +0 -6
  71. package/adapters/mcp/tool-mapping/legacy-tool-service.ts +703 -3092
  72. package/adapters/mcp/tool-mapping/post-finalize-work-attribution.ts +5 -10
  73. package/adapters/mcp/tool-mapping/repository-tools.ts +170 -213
  74. package/adapters/mcp/toolset-names.ts +11 -37
  75. package/adapters/mcp/toolset.ts +19 -92
  76. package/{src/cli → adapters}/mcp/transports/AGENTS.md +5 -5
  77. package/{src/cli → adapters}/mcp/transports/CLAUDE.md +5 -5
  78. package/adapters/mcp/transports/http-observation.ts +377 -0
  79. package/adapters/mcp/transports/http-post-lifecycle.ts +19 -0
  80. package/adapters/mcp/transports/http.ts +200 -683
  81. package/adapters/mcp/transports/oauth-http.ts +322 -0
  82. package/adapters/mcp/transports/session-registry.ts +6 -0
  83. package/adapters/mcp/tunnels/openai-secure-tunnel.ts +89 -5
  84. package/adapters/mcp/types.ts +0 -6
  85. package/assets/hooks/lib/session-state.sh +0 -38
  86. package/assets/hooks/post-bash.sh +1 -1
  87. package/assets/hooks/post-tool-observer.sh +0 -5
  88. package/assets/hooks/prompt-guard.sh +0 -55
  89. package/assets/partials/04-project-structure.partial.md +1 -1
  90. package/assets/partials/07-footer.partial.md +1 -1
  91. package/assets/partials-agents/02-operating-mode.partial.md +1 -1
  92. package/assets/partials-agents/08-deep-docs.partial.md +1 -1
  93. package/assets/plugin-registry.v1.json +6 -4
  94. package/assets/reference-configs/agentic-development-flow.md +26 -1
  95. package/assets/reference-configs/external-tooling.md +0 -76
  96. package/assets/reference-configs/global-working-rules.md +19 -0
  97. package/assets/reference-configs/release-deploy.md +1 -1
  98. package/assets/templates/helpers/architecture-queue.sh +1 -1
  99. package/assets/templates/helpers/check-agent-tooling.sh +1 -327
  100. package/assets/templates/helpers/check-task-workflow.sh +1 -1
  101. package/assets/templates/helpers/ensure-task-workflow.sh +0 -14
  102. package/assets/templates/helpers/migrate-project-template.sh +2 -2
  103. package/assets/workflow-contract.v1.json +0 -2
  104. package/docs/README.md +5 -2
  105. package/docs/architecture/CURRENT.md +205 -51
  106. package/docs/architecture/decisions/20260803-release-identity-binding-and-exit-policy.md +14 -5
  107. package/docs/architecture/decisions/20260823-immediate-controller-relay.md +6 -3
  108. package/docs/architecture/decisions/20260904-ios-device-migration-baseline.md +42 -0
  109. package/docs/architecture/decisions/20260907-assistant-learning-loop.md +2 -0
  110. package/docs/architecture/decisions/20260907-controller-round-transition-policy.md +19 -4
  111. package/docs/architecture/decisions/20260916-workflow-supervisor-authority.md +249 -0
  112. package/docs/architecture/decisions/20260917-cognitive-memory-foundation.md +82 -0
  113. package/docs/architecture/decisions/20260918-stable-candidate-release-lifecycle.md +234 -0
  114. package/docs/architecture/decisions/20260919-autonomous-work-liveness.md +62 -0
  115. package/docs/architecture/decisions/20260924-thin-semantic-working-context.md +74 -0
  116. package/docs/architecture/decisions/20261001-supervisor-turn-authority.md +342 -0
  117. package/docs/architecture/decisions/20261005-forge-v3-desktop-client-boundary.md +77 -0
  118. package/docs/architecture/decisions/20261009-exact-code-context-discovery.md +19 -0
  119. package/docs/architecture/decisions/20261009-generated-xcode-cache-retention.md +37 -0
  120. package/docs/architecture/decisions/20261011-autonomous-continuation-convergence.md +597 -0
  121. package/docs/architecture/decisions/20261017-edit-session-finalization-reconciliation.md +17 -0
  122. package/docs/architecture/decisions/20261019-retire-host-skills.md +16 -0
  123. package/docs/architecture/diagrams/agentic-dev-plugin-architecture.html +1 -1
  124. package/docs/architecture/domains/public-surface.md +3 -5
  125. package/docs/architecture/domains/verification.md +6 -5
  126. package/docs/architecture/domains/workflow-engine.md +6 -0
  127. package/docs/architecture/modules/controller-runtime/transport-lifecycle.md +3 -3
  128. package/docs/architecture/requests/2026-09-04-computer-plugin-workflow-taxonomy.md +4 -4
  129. package/docs/architecture/reviews/20261015-code-search-runtime-acceptance.md +75 -0
  130. package/docs/forge-plugin-management.md +16 -4
  131. package/docs/operations/controller-browser-plugin.md +23 -0
  132. package/docs/operations/controller-performance-and-502.md +17 -0
  133. package/docs/operations/controller-reliability-runbook.md +2 -2
  134. package/docs/operations/features.md +6 -7
  135. package/docs/operations/features.zh-CN.md +1 -1
  136. package/docs/operations/github-repository.md +4 -4
  137. package/docs/operations/github-semantic-release-projection.md +20 -0
  138. package/docs/operations/homebrew.md +2 -2
  139. package/docs/operations/mcp-tool-exposure.md +13 -52
  140. package/docs/operations/releasing.md +2 -0
  141. package/docs/operations/runtime-performance-diagnostics.md +8 -0
  142. package/docs/operations/standalone-disaster-recovery.md +15 -7
  143. package/docs/tutorials/01-install-and-start.zh-CN.md +1 -1
  144. package/docs/tutorials/03-first-repository-task.md +2 -0
  145. package/docs/wiki/Computer-and-Plugins.md +78 -0
  146. package/docs/wiki/Computer-and-Plugins.zh-CN.md +88 -0
  147. package/docs/wiki/Home.md +16 -2
  148. package/docs/wiki/Implementation.md +25 -13
  149. package/docs/wiki/Installation.md +28 -32
  150. package/docs/wiki/Integrations.md +4 -0
  151. package/docs/wiki/Quick-Start.md +35 -22
  152. package/docs/wiki/Releases-and-Upgrades.md +15 -25
  153. package/docs/wiki/_Sidebar.md +5 -1
  154. package/package.json +25 -25
  155. package/packages/kernel/cognition/api/index.ts +6 -0
  156. package/packages/kernel/cognition/application/activation-service.ts +451 -0
  157. package/packages/kernel/cognition/application/consolidation-service.ts +185 -0
  158. package/packages/kernel/cognition/application/legacy-experience-adapter.ts +38 -0
  159. package/packages/kernel/cognition/application/memory-service.ts +64 -0
  160. package/packages/kernel/cognition/domain/learning.ts +106 -0
  161. package/packages/kernel/cognition/domain/memory.ts +254 -0
  162. package/packages/kernel/controller/api/index.ts +1 -0
  163. package/packages/kernel/controller/application/continuation-service.ts +281 -0
  164. package/packages/kernel/controller/application/controller-round-service.ts +12 -0
  165. package/packages/kernel/controller/domain/controller-round-transition-policy.ts +242 -21
  166. package/packages/kernel/controller/domain/controller-round.ts +4 -1
  167. package/packages/kernel/controller/domain/execution-quality.ts +3 -1
  168. package/packages/kernel/controller/infrastructure/controller-round-store.ts +689 -103
  169. package/packages/kernel/controller/infrastructure/controller-session-store.ts +348 -97
  170. package/packages/kernel/controller/ports/controller-host.ts +2 -0
  171. package/packages/kernel/identity/api/index.ts +10 -0
  172. package/packages/kernel/identity/domain/activity-projection.ts +43 -0
  173. package/packages/kernel/identity/domain/capability-broker.ts +60 -0
  174. package/packages/kernel/identity/domain/grant.ts +72 -0
  175. package/packages/kernel/identity/domain/owned-resource.ts +116 -0
  176. package/packages/kernel/identity/domain/user-request.ts +93 -0
  177. package/packages/kernel/identity/infrastructure/activity-projection-store.ts +87 -0
  178. package/packages/kernel/identity/infrastructure/capability-broker.ts +81 -0
  179. package/packages/kernel/identity/infrastructure/grant-store.ts +284 -0
  180. package/packages/kernel/identity/infrastructure/owned-resource-store.ts +259 -0
  181. package/packages/kernel/identity/infrastructure/user-request-store.ts +182 -0
  182. package/packages/kernel/scheduler/api/index.ts +0 -2
  183. package/packages/kernel/scheduler/application/eligibility.ts +4 -1
  184. package/packages/kernel/scheduler/application/schedule-service.ts +3 -0
  185. package/packages/kernel/scheduler/application/settlement.ts +0 -15
  186. package/packages/kernel/scheduler/domain/schedule.ts +87 -0
  187. package/packages/kernel/scheduler/infrastructure/schedule-store.ts +166 -143
  188. package/packages/kernel/work/api/index.ts +3 -2
  189. package/packages/kernel/work/application/work-service.ts +18 -42
  190. package/packages/kernel/work/domain/current-task-lineage.ts +104 -0
  191. package/packages/kernel/work/domain/engineering-design.ts +10 -5
  192. package/packages/kernel/work/domain/engineering-profile.ts +8 -12
  193. package/packages/kernel/work/domain/evaluation-promotion-receipt.ts +186 -0
  194. package/packages/kernel/work/domain/execution-concurrency.ts +19 -26
  195. package/packages/kernel/work/domain/execution-snapshot.ts +0 -31
  196. package/packages/kernel/work/domain/implementation-review.ts +14 -331
  197. package/packages/kernel/work/domain/objective-graph.ts +119 -0
  198. package/packages/kernel/work/domain/project-engineering-contract.ts +23 -1
  199. package/packages/kernel/work/domain/repository-completion-receipt.ts +1 -1
  200. package/packages/kernel/work/domain/state-machine.ts +34 -65
  201. package/packages/kernel/work/domain/types.ts +57 -51
  202. package/packages/kernel/work/infrastructure/work-contract-store.ts +847 -729
  203. package/packages/kernel/work/ports/work-contract-store.ts +5 -2
  204. package/packages/plugin-runtime/browser/provider-registry.ts +12 -36
  205. package/packages/plugin-runtime/browser/session-authority.ts +2 -1
  206. package/packages/plugin-runtime/computer/chatgpt-identity.ts +24 -0
  207. package/packages/plugin-runtime/computer/conversation-target.ts +153 -0
  208. package/packages/plugin-runtime/computer/index.ts +2 -0
  209. package/packages/plugin-runtime/computer/target-authority.ts +26 -1
  210. package/packages/plugin-runtime/external/unix-jsonl-transport.ts +142 -18
  211. package/packages/protocols/computer/contract.ts +27 -1
  212. package/scripts/activate-source-baseline.ts +7 -9
  213. package/scripts/assemble-template.ts +11 -72
  214. package/scripts/canary-controller-semantic-wait.ts +12 -24
  215. package/scripts/check-mcp-compatibility.ts +94 -201
  216. package/scripts/check-package-identity.mjs +0 -5
  217. package/scripts/check-runtime-architecture.mjs +921 -239
  218. package/scripts/forge-local-recovery-helper.mjs +93 -15
  219. package/scripts/init-project.sh +0 -46
  220. package/scripts/install-ios-hid-toolchain.sh +60 -0
  221. package/scripts/install-standalone-recovery.ts +1 -1
  222. package/scripts/lib/project-init-lib.sh +6 -3
  223. package/scripts/migrate-windows-wsl-controller-home.ts +2 -0
  224. package/scripts/open-source-audit-allowlist.txt +1 -3
  225. package/scripts/run-bounded-command.mjs +5 -0
  226. package/scripts/run-governed-gate.ts +2 -1
  227. package/scripts/run-mobile-monitor-bridge.ts +0 -1
  228. package/scripts/smoke-control-plane-failure-domain.ts +94 -0
  229. package/scripts/smoke-ios-physical-device.ts +38 -10
  230. package/scripts/smoke-mcp-http-runtime.ts +12 -8
  231. package/scripts/smoke-mcp-tool-surface.ts +27 -41
  232. package/scripts/smoke-runtime-recovery.ts +12 -43
  233. package/scripts/smoke-schedule-engine.ts +23 -15
  234. package/scripts/smoke-unattended-transport-recovery.ts +223 -0
  235. package/scripts/smoke-user-request-continuation-restart.ts +232 -0
  236. package/scripts/smoke-workflow-supervisor-chrome-adapter.ts +95 -0
  237. package/scripts/smoke-workflow-supervisor-process-restart.ts +276 -0
  238. package/scripts/smoke-workflow-supervisor-restart-recovery.ts +150 -0
  239. package/scripts/smoke-workflow-supervisor.ts +103 -0
  240. package/scripts/sync-generated-authority.mjs +0 -1
  241. package/scripts/verify-forge-runtime.sh +2 -1
  242. package/src/cli/agent-jobs/executor-health.ts +12 -35
  243. package/src/cli/agent-jobs/integration.ts +20 -51
  244. package/src/cli/agent-jobs/job-manager.ts +7 -3
  245. package/src/cli/chatgpt-browser/file-policy.ts +2 -2
  246. package/src/cli/commands/brain-assistant.ts +27 -13
  247. package/src/cli/commands/brain.ts +13 -15
  248. package/src/cli/commands/chatgpt.ts +1 -163
  249. package/src/cli/commands/doctor.ts +1 -143
  250. package/src/cli/commands/global-runtime.ts +3 -196
  251. package/src/cli/commands/init-hook.ts +6 -23
  252. package/src/cli/commands/init.ts +3 -252
  253. package/src/cli/commands/mcp.ts +0 -5
  254. package/src/cli/commands/prompt-guard-decision.ts +0 -2
  255. package/src/cli/commands/recovery.ts +137 -135
  256. package/src/cli/commands/repository.ts +17 -1
  257. package/src/cli/commands/runtime.ts +3 -3
  258. package/src/cli/commands/setup-execution.ts +41 -0
  259. package/src/cli/commands/setup-profile.ts +8 -0
  260. package/src/cli/controller/check-runner.ts +13 -2
  261. package/src/cli/controller/completion-backlog.ts +3 -3
  262. package/src/cli/controller/completion-orchestrator.ts +5 -44
  263. package/src/cli/controller/completion-target.ts +3 -72
  264. package/src/cli/controller/composite-operations.ts +1 -1
  265. package/src/cli/controller/context/instruction-context.ts +1 -1
  266. package/src/cli/controller/context/known-paths.ts +2 -2
  267. package/src/cli/controller/context/query-planning.ts +11 -4
  268. package/src/cli/controller/context/rule-resolution.ts +2 -2
  269. package/src/cli/controller/context/source-materializer.ts +83 -102
  270. package/src/cli/controller/context/structural-provider.ts +84 -0
  271. package/src/cli/controller/context/structural.ts +6 -6
  272. package/src/cli/controller/context/types.ts +8 -9
  273. package/src/cli/controller/context-pack.ts +107 -84
  274. package/src/cli/controller/execution-completion.ts +4 -7
  275. package/src/cli/controller/execution-policy.ts +36 -153
  276. package/src/cli/controller/governance.ts +2 -3
  277. package/src/cli/controller/issue-store.ts +4 -99
  278. package/src/cli/controller/launch-agents.ts +59 -18
  279. package/src/cli/controller/operational-plan.ts +25 -52
  280. package/src/cli/controller/runtime-config.ts +5 -1
  281. package/src/cli/controller/stuck-state-migration.ts +2 -3
  282. package/src/cli/controller/systemd-user.ts +42 -10
  283. package/src/cli/editing/edit-session.ts +18 -12
  284. package/src/cli/github/github.ts +4 -4
  285. package/src/cli/github/semantic-projection.ts +174 -0
  286. package/src/cli/hook/prompt-intents.ts +0 -9
  287. package/src/cli/index.ts +1 -43
  288. package/src/cli/local-bridge/connector-freshness.ts +1 -12
  289. package/src/cli/local-bridge/console-automations.ts +19 -14
  290. package/src/cli/local-bridge/console-view-models.ts +4 -13
  291. package/src/cli/local-bridge/facade-api.ts +64 -193
  292. package/src/cli/local-bridge/server.ts +24 -147
  293. package/src/cli/local-bridge/types.ts +0 -1
  294. package/src/cli/mcp/oauth-client-retirement.ts +74 -0
  295. package/src/cli/repositories/command-classifier.ts +0 -9
  296. package/src/cli/repositories/command-executor.ts +29 -23
  297. package/src/cli/repositories/command-scope.ts +37 -18
  298. package/src/cli/repositories/controller-home.ts +48 -0
  299. package/src/cli/repositories/ephemeral-workspace.ts +20 -30
  300. package/src/cli/repositories/git-command-executor.ts +2 -2
  301. package/src/cli/repositories/locks.ts +20 -0
  302. package/src/cli/repositories/registry.ts +79 -12
  303. package/src/cli/repositories/safe-patch.ts +2 -12
  304. package/src/cli/repositories/structured-git.ts +101 -5
  305. package/src/cli/repository/inspector.ts +185 -343
  306. package/src/cli/repository/session-cache.ts +92 -6
  307. package/src/effects/process-runner.ts +17 -1
  308. package/src/runtime/context/assistant-context.ts +20 -7
  309. package/src/runtime/context/assistant-work-context.ts +89 -27
  310. package/src/runtime/context/automatic-learning.ts +565 -0
  311. package/src/runtime/context/cognitive-attention.ts +173 -0
  312. package/src/runtime/context/cognitive-skill-canary.ts +158 -0
  313. package/src/runtime/context/context-closure.ts +46 -9
  314. package/src/runtime/context/context-pack-process.ts +103 -0
  315. package/src/runtime/context/context-plane.ts +1 -9
  316. package/src/runtime/context/direct-controller-learning.ts +298 -0
  317. package/src/runtime/context/generic-lsp-provider.ts +1 -1
  318. package/src/runtime/context/semantic-navigation-contract.ts +16 -0
  319. package/src/runtime/context/semantic-navigation.ts +7 -35
  320. package/src/runtime/context/typescript-navigation-process.ts +145 -0
  321. package/src/runtime/context/typescript-navigation.ts +89 -3
  322. package/src/runtime/control-plane/cleanup-artifact-retention.ts +215 -12
  323. package/src/runtime/control-plane/concurrency/work-execution-concurrency.ts +9 -47
  324. package/src/runtime/control-plane/execution/controller-authority-recovery.ts +34 -4
  325. package/src/runtime/control-plane/execution/edit-validation-coordinator.ts +29 -20
  326. package/src/runtime/control-plane/execution/execution-identity.ts +23 -3
  327. package/src/runtime/control-plane/execution/repository-work-attribution.ts +7 -30
  328. package/src/runtime/control-plane/execution/retained-work-resume.ts +206 -199
  329. package/src/runtime/control-plane/execution/session-store.ts +31 -1
  330. package/src/runtime/control-plane/execution/validation.ts +6 -8
  331. package/src/runtime/control-plane/execution/work-authority-reconciler.ts +13 -42
  332. package/src/runtime/control-plane/execution/work-check-evidence.ts +137 -0
  333. package/src/runtime/control-plane/execution/work-completion-authority.ts +30 -85
  334. package/src/runtime/control-plane/execution/work-delivery-service.ts +616 -0
  335. package/src/runtime/control-plane/execution/work-evidence-policy.ts +12 -50
  336. package/src/runtime/control-plane/execution/work-execution-support.ts +50 -149
  337. package/src/runtime/control-plane/execution/work-handle-authority.ts +197 -110
  338. package/src/runtime/control-plane/execution/work-handle-store.ts +72 -44
  339. package/src/runtime/control-plane/execution/work-head-settlement.ts +53 -20
  340. package/src/runtime/control-plane/execution/work-lifecycle-audit.ts +52 -29
  341. package/src/runtime/control-plane/execution/work-operation-service.ts +60 -34
  342. package/src/runtime/control-plane/execution/work-preparation-service.ts +231 -267
  343. package/src/runtime/control-plane/execution/work-process-evidence.ts +2 -2
  344. package/src/runtime/control-plane/execution/work-remote-delivery.ts +2 -3
  345. package/src/runtime/control-plane/execution/work-revision-diff.ts +39 -0
  346. package/src/runtime/control-plane/execution/work-terminal-cleanup.ts +201 -199
  347. package/src/runtime/control-plane/execution/work-validation-reconciler.ts +33 -85
  348. package/src/runtime/control-plane/execution/work-verification-service.ts +406 -50
  349. package/src/runtime/control-plane/execution/work-verification-snapshot.ts +6 -2
  350. package/src/runtime/control-plane/facade/capability-registry.ts +364 -37
  351. package/src/runtime/control-plane/facade/check-normalization.ts +3 -9
  352. package/src/runtime/control-plane/facade/codex-delegation.ts +10 -11
  353. package/src/runtime/control-plane/facade/controller-connection.ts +135 -0
  354. package/src/runtime/control-plane/facade/goal-workloop-access.ts +1 -20
  355. package/src/runtime/control-plane/facade/goal-workloop.ts +281 -1753
  356. package/src/runtime/control-plane/facade/handoff-inbox-application.ts +12 -25
  357. package/src/runtime/control-plane/facade/handoff-inbox-store.ts +256 -52
  358. package/src/runtime/control-plane/facade/index.ts +0 -1
  359. package/src/runtime/control-plane/facade/operation-digest.ts +12 -15
  360. package/src/runtime/control-plane/facade/plan-contract-store.ts +451 -991
  361. package/src/runtime/control-plane/facade/policy-gate.ts +0 -23
  362. package/src/runtime/control-plane/facade/repository-work-admission.ts +12 -22
  363. package/src/runtime/control-plane/facade/requirement-authority.ts +102 -199
  364. package/src/runtime/control-plane/facade/requirement-board.ts +3 -3
  365. package/src/runtime/control-plane/facade/rh-work-operation-contract.ts +51 -14
  366. package/src/runtime/control-plane/facade/self-healing-loop.ts +18 -53
  367. package/src/runtime/control-plane/facade/suggested-actions.ts +15 -18
  368. package/src/runtime/control-plane/facade/types.ts +49 -108
  369. package/src/runtime/control-plane/facade/work-continuation.ts +9 -9
  370. package/src/runtime/control-plane/generated-cache-retention.ts +206 -59
  371. package/src/runtime/control-plane/global-scheduler/autonomous-continuation.ts +248 -0
  372. package/src/runtime/control-plane/global-scheduler/durable-admission.ts +1 -1
  373. package/src/runtime/control-plane/global-scheduler/maintenance.ts +256 -117
  374. package/src/runtime/control-plane/global-scheduler/reconciliation.ts +3 -12
  375. package/src/runtime/control-plane/global-scheduler/scheduler.ts +66 -40
  376. package/src/runtime/control-plane/global-scheduler/wake-signal.ts +42 -2
  377. package/src/runtime/control-plane/governance/access-policy.ts +19 -2
  378. package/src/runtime/control-plane/governance/authorization.ts +20 -3
  379. package/src/runtime/control-plane/governance/external-effects.ts +1 -1
  380. package/src/runtime/control-plane/launcher/chatgpt-round-continuation.ts +63 -300
  381. package/src/runtime/control-plane/launcher/chatgpt-work-continuation.ts +29 -300
  382. package/src/runtime/control-plane/launcher/local-conversation-controller.ts +238 -0
  383. package/src/runtime/control-plane/launcher/provider-mcp-bootstrap.ts +5 -2
  384. package/src/runtime/control-plane/launcher/thin-launcher.ts +96 -240
  385. package/src/runtime/control-plane/persistence/cognition-store.ts +820 -0
  386. package/src/runtime/control-plane/persistence/experience-store.ts +162 -29
  387. package/src/runtime/control-plane/persistence/requirement-store.ts +216 -74
  388. package/src/runtime/control-plane/persistence/sqlite-store.ts +113 -6
  389. package/src/runtime/control-plane/release-retention.ts +135 -47
  390. package/src/runtime/control-plane/repository-namespace-retention.ts +2 -2
  391. package/src/runtime/control-plane/runtime-cleanup.ts +295 -107
  392. package/src/runtime/control-plane/workspace/project-onboarding.ts +80 -0
  393. package/src/runtime/control-plane/workspace/semantic-sync-service.ts +19 -5
  394. package/src/runtime/control-plane/workspace/workspace-store.ts +169 -0
  395. package/src/runtime/diagnostics/incident-repair.ts +313 -146
  396. package/src/runtime/diagnostics/mcp-timing.ts +114 -0
  397. package/src/runtime/evidence/artifact-store.ts +158 -40
  398. package/src/runtime/evidence/evidence-store.ts +112 -8
  399. package/src/runtime/evidence/output-handle-index.ts +225 -0
  400. package/src/runtime/evidence/result-store.ts +158 -44
  401. package/src/runtime/evidence/sensitive-output.ts +22 -2
  402. package/src/runtime/execution/jobs/child-reference.ts +11 -0
  403. package/src/runtime/execution/jobs/receipt-recovery.ts +1 -11
  404. package/src/runtime/execution/jobs/store.ts +3 -4
  405. package/src/runtime/execution/managed-workspace.ts +57 -0
  406. package/src/runtime/execution/process-runtime/check-facade.ts +1 -1
  407. package/src/runtime/execution/process-runtime/check-result-retention.ts +2 -2
  408. package/src/runtime/execution/process-runtime/check-result.ts +105 -1
  409. package/src/runtime/execution/process-runtime/check-runner-sidecar.ts +18 -8
  410. package/src/runtime/execution/process-runtime/command-facade.ts +82 -30
  411. package/src/runtime/execution/process-runtime/gc.ts +15 -2
  412. package/src/runtime/execution/process-runtime/handle-index.ts +176 -0
  413. package/src/runtime/execution/process-runtime/host-command-lane.ts +139 -0
  414. package/src/runtime/execution/process-runtime/index.ts +3 -0
  415. package/src/runtime/execution/process-runtime/lightweight-managed.ts +251 -72
  416. package/src/runtime/execution/process-runtime/persisted-check.ts +3 -3
  417. package/src/runtime/execution/process-runtime/process-runner-entry.ts +47 -5
  418. package/src/runtime/execution/process-runtime/process-scope.ts +160 -0
  419. package/src/runtime/execution/process-runtime/resource-claims.ts +65 -61
  420. package/src/runtime/execution/process-runtime/runtime.ts +55 -18
  421. package/src/runtime/execution/process-runtime/store.ts +30 -2
  422. package/src/runtime/execution/process-runtime/types.ts +6 -1
  423. package/src/runtime/execution/thin-harness/execution-router.ts +16 -16
  424. package/src/runtime/execution/thin-harness/fast-executor.ts +2 -2
  425. package/src/runtime/execution/thin-harness/search-worker.ts +2 -2
  426. package/src/runtime/execution/workers/executor.ts +3 -8
  427. package/src/runtime/maintenance/cleanup.ts +41 -5
  428. package/src/runtime/platform/service-inventory.ts +130 -0
  429. package/src/runtime/platform/service-manager.ts +8 -0
  430. package/src/runtime/plugins/action-application.ts +97 -29
  431. package/src/runtime/plugins/app-store-connect-adapter.ts +290 -18
  432. package/src/runtime/plugins/browser-adapter.ts +1124 -333
  433. package/src/runtime/plugins/browser-automation-service.ts +23 -3
  434. package/src/runtime/plugins/browser-macos-bridge.ts +431 -137
  435. package/src/runtime/plugins/browser-manifest-surface.ts +47 -12
  436. package/src/runtime/plugins/browser-native-session-service.ts +63 -13
  437. package/src/runtime/plugins/browser-registration.ts +18 -0
  438. package/src/runtime/plugins/browser-runtime.ts +40 -36
  439. package/src/runtime/plugins/browser-session-authority.ts +2 -2
  440. package/src/runtime/plugins/browser-session-store.ts +46 -76
  441. package/src/runtime/plugins/capability-authorization-grants.ts +258 -62
  442. package/src/runtime/plugins/computer-chatgpt-browser-adapter-installer.ts +228 -0
  443. package/src/runtime/plugins/computer-registration.ts +298 -20
  444. package/src/runtime/plugins/desktop-operator-external-policy.ts +36 -4
  445. package/src/runtime/plugins/desktop-operator-registration.ts +12 -4
  446. package/src/runtime/plugins/external-adapter.ts +42 -6
  447. package/src/runtime/plugins/external-registration.ts +21 -1
  448. package/src/runtime/plugins/github-adapter.ts +30 -3
  449. package/src/runtime/plugins/gmail-adapter.ts +189 -3
  450. package/src/runtime/plugins/google-calendar-adapter.ts +2 -2
  451. package/src/runtime/plugins/google-shared.ts +24 -12
  452. package/src/runtime/plugins/google-tasks-adapter.ts +2 -2
  453. package/src/runtime/plugins/ios/remote-xpc-hid.ts +70 -30
  454. package/src/runtime/plugins/ios-adapter.ts +46 -41
  455. package/src/runtime/plugins/ios-agent-device.ts +54 -4
  456. package/src/runtime/plugins/ios-device-ownership.ts +103 -0
  457. package/src/runtime/plugins/ios-physical-device.ts +497 -79
  458. package/src/runtime/plugins/lightweight-action.ts +208 -2
  459. package/src/runtime/plugins/local-system-adapter.ts +12 -100
  460. package/src/runtime/plugins/managed-process-adapter.ts +12 -5
  461. package/src/runtime/plugins/plugin-action-sidecar.ts +17 -13
  462. package/src/runtime/plugins/plugin-management-adapter.ts +1 -1
  463. package/src/runtime/plugins/store.ts +682 -435
  464. package/src/runtime/plugins/types.ts +24 -0
  465. package/src/runtime/plugins/xiaohongshu-publish.ts +16 -0
  466. package/src/runtime/projections/git-status-sampler.ts +2 -19
  467. package/src/runtime/projections/invalidation.ts +7 -3
  468. package/src/runtime/projections/materialized-view.ts +80 -36
  469. package/src/runtime/recovery/actions.ts +4 -4
  470. package/src/runtime/recovery/capability-action-application.ts +46 -45
  471. package/src/runtime/recovery/lifecycle-inventory.ts +30 -40
  472. package/src/runtime/recovery/maintenance-executor.ts +374 -123
  473. package/src/runtime/recovery/probe.ts +2 -2
  474. package/src/runtime/recovery/store.ts +29 -11
  475. package/src/runtime/release/release-coordinator.ts +312 -0
  476. package/src/runtime/release/release-session.ts +716 -0
  477. package/src/runtime/release/release-state-migration.ts +25 -0
  478. package/src/runtime/resources/leases/store.ts +56 -25
  479. package/src/runtime/root/computer-composition.ts +191 -6
  480. package/src/runtime/root/controller-progression-composition.ts +254 -0
  481. package/src/runtime/root/controller-round-composition.ts +20 -1
  482. package/src/runtime/root/deployment-topology.ts +106 -0
  483. package/src/runtime/root/entry.ts +4 -3
  484. package/src/runtime/root/known-good-recovery.ts +184 -0
  485. package/src/runtime/root/local-bridge.ts +0 -1
  486. package/src/runtime/root/mcp-transport.ts +111 -18
  487. package/src/runtime/root/ownership.ts +261 -9
  488. package/src/runtime/root/package-connector-service.ts +227 -29
  489. package/src/runtime/root/package-runtime-release.ts +117 -30
  490. package/src/runtime/root/package-runtime-service.ts +24 -24
  491. package/src/runtime/root/release-execution-canary.ts +57 -12
  492. package/src/runtime/root/release-loader.ts +90 -8
  493. package/src/runtime/root/release-manifest.ts +80 -40
  494. package/src/runtime/root/release-materialize.ts +372 -106
  495. package/src/runtime/root/release-store.ts +395 -36
  496. package/src/runtime/root/runtime-lane.ts +191 -0
  497. package/src/runtime/root/runtime.ts +160 -29
  498. package/src/runtime/root/scheduled-controller-composition.ts +29 -3
  499. package/src/runtime/root/service-runner.ts +2 -2
  500. package/src/runtime/root/service.ts +126 -44
  501. package/src/runtime/root/status.ts +48 -0
  502. package/src/runtime/root/types.ts +32 -9
  503. package/src/runtime/root/workflow-supervisor-composition.ts +681 -0
  504. package/src/runtime/root/workflow-supervisor-runtime.ts +564 -0
  505. package/src/runtime/root/write-fence.ts +50 -2
  506. package/src/runtime/safe-tooling/google-credential-store.ts +67 -22
  507. package/src/runtime/safe-tooling/google-oauth-broker.ts +25 -7
  508. package/src/runtime/safe-tooling/ios-development.ts +22 -8
  509. package/src/runtime/safe-tooling/job-summary.ts +1 -1
  510. package/src/runtime/safe-tooling/workspace-auth.ts +5 -2
  511. package/src/runtime/shared/atomic-text-file.ts +21 -0
  512. package/src/runtime/shared/bounded-child-supervisor.ts +9 -1
  513. package/src/runtime/shared/json-files.ts +8 -3
  514. package/src/runtime/shared/process-environment.ts +20 -9
  515. package/src/runtime/shared/response-budget.ts +1 -3
  516. package/src/runtime/standalone-recovery/controller-home-migration.ts +16 -24
  517. package/src/runtime/standalone-recovery/core.ts +3792 -417
  518. package/src/runtime/standalone-recovery/entry.ts +507 -45
  519. package/src/runtime/standalone-recovery/installer.ts +262 -148
  520. package/src/runtime/standalone-recovery/mcp-server.ts +29 -193
  521. package/src/runtime/standalone-recovery/operation-lock.ts +12 -2
  522. package/src/runtime/standalone-recovery/performance.ts +54 -16
  523. package/src/runtime/standalone-recovery/release.ts +53 -5
  524. package/src/runtime/standalone-recovery/service-labels.ts +5 -2
  525. package/src/runtime/standalone-recovery/watchdog-heartbeat.ts +5 -2
  526. package/src/runtime/workflow/schedules/browser-probe.ts +17 -6
  527. package/src/runtime/workflow/schedules/chatgpt-automation-migration.ts +11 -3
  528. package/src/runtime/workflow/schedules/engine.ts +166 -178
  529. package/src/runtime/workflow/schedules/pending-activation.ts +11 -4
  530. package/src/runtime/workflow/schedules/work-continuation.ts +95 -11
  531. package/src/runtime/workflows/runtime.ts +15 -19
  532. package/src/testing/test-governance.ts +5 -1
  533. package/supervisor/chatgpt-conversation.ts +23 -0
  534. package/supervisor/client.ts +218 -0
  535. package/supervisor/control-plane.ts +963 -0
  536. package/supervisor/entry.ts +15 -0
  537. package/supervisor/forge-validators.ts +147 -0
  538. package/supervisor/index.ts +5 -0
  539. package/supervisor/native-browser-adapter.ts +1151 -0
  540. package/supervisor/native-messaging/host.ts +58 -0
  541. package/supervisor/native-messaging/manifest.ts +26 -0
  542. package/supervisor/native-messaging/protocol.ts +27 -0
  543. package/supervisor/paths.ts +18 -0
  544. package/supervisor/protocol.ts +250 -0
  545. package/supervisor/server.ts +412 -0
  546. package/supervisor/store.ts +1870 -0
  547. package/supervisor/tsconfig.json +8 -0
  548. package/supervisor/types.ts +261 -0
  549. package/SKILL.md +0 -427
  550. package/adapters/chatgpt/controller-host.ts +0 -119
  551. package/adapters/mcp/controller-round-compatibility.ts +0 -184
  552. package/adapters/mcp/frozen-client-semantic-compatibility.ts +0 -292
  553. package/adapters/mcp/runtime-gateway/work-compat-adapter.ts +0 -502
  554. package/adapters/mcp/runtime-gateway/work-validation-reconciler.ts +0 -1
  555. package/adapters/mcp/toolset-selection.ts +0 -41
  556. package/agents/openai.yaml +0 -4
  557. package/assets/skill-hooks.json +0 -41
  558. package/assets/skill-version.json +0 -189
  559. package/assets/skills/claude-review/SKILL.md +0 -231
  560. package/assets/skills/codex-review/SKILL.md +0 -103
  561. package/assets/templates/helpers/check-skill-version.ts +0 -193
  562. package/packages/kernel/progression/api/index.ts +0 -2
  563. package/packages/kernel/progression/application/projector.ts +0 -211
  564. package/packages/kernel/progression/domain/types.ts +0 -116
  565. package/packages/kernel/progression/index.ts +0 -1
  566. package/packages/kernel/scheduler/application/continuation-service.ts +0 -212
  567. package/packages/kernel/scheduler/domain/continuation.ts +0 -38
  568. package/packages/kernel/scheduler/infrastructure/continuation-dispatch-store.ts +0 -38
  569. package/packages/kernel/work/domain/admission-policy.ts +0 -34
  570. package/scripts/benchmark-background-check-overlap.ts +0 -228
  571. package/scripts/benchmark-computer-hotpath.ts +0 -255
  572. package/scripts/benchmark-controller-hotpath.ts +0 -212
  573. package/scripts/benchmark-controller-round2.ts +0 -191
  574. package/scripts/benchmark-ios-agent-device.ts +0 -511
  575. package/scripts/benchmark-mcp-host.sh +0 -117
  576. package/scripts/benchmark-mcp-transport.ts +0 -169
  577. package/scripts/benchmark-operational-memory-activation.ts +0 -235
  578. package/scripts/benchmark-operational-shadow.ts +0 -28
  579. package/scripts/benchmark-quality-harness.ts +0 -146
  580. package/scripts/benchmark-route-session-concurrency.ts +0 -915
  581. package/scripts/benchmark-thin-harness-gateway-ab.ts +0 -632
  582. package/scripts/benchmark-thin-harness-mcp-e2e.ts +0 -498
  583. package/scripts/benchmark-thin-harness.ts +0 -251
  584. package/scripts/benchmark-typescript-navigation.ts +0 -186
  585. package/scripts/benchmark-work-efficiency.ts +0 -334
  586. package/scripts/build-controller-ui.ts +0 -28
  587. package/scripts/check-npm-release.sh +0 -32
  588. package/scripts/check-public-release-surface.sh +0 -19
  589. package/scripts/check-release-published.sh +0 -57
  590. package/scripts/check-release-readiness.sh +0 -37
  591. package/scripts/check-release-version.mjs +0 -74
  592. package/scripts/check-skill-version.ts +0 -5
  593. package/scripts/check-tarball-install-smoke.sh +0 -150
  594. package/scripts/ensure-codegraph.sh +0 -16
  595. package/scripts/package-source-archive.sh +0 -147
  596. package/scripts/public-release-files.txt +0 -39
  597. package/scripts/public-release.ts +0 -174
  598. package/scripts/publish-release-tarball.sh +0 -27
  599. package/scripts/route-nl-vs-ts-eval.ts +0 -679
  600. package/scripts/run-skill-hook.ts +0 -244
  601. package/scripts/stage-runtime-release.ts +0 -44
  602. package/scripts/sync-codex-installed-copies.sh +0 -182
  603. package/src/cli/commands/tools.ts +0 -167
  604. package/src/cli/controller/progress.ts +0 -656
  605. package/src/cli/controller/work-mode.ts +0 -181
  606. package/src/cli/local-bridge/console-assets.ts +0 -17
  607. package/src/cli/local-bridge/dashboard.ts +0 -17
  608. package/src/cli/local-bridge/frontend/src/App.tsx +0 -10
  609. package/src/cli/local-bridge/frontend/src/components/Button.tsx +0 -1
  610. package/src/cli/local-bridge/frontend/src/components/DetailPane.tsx +0 -3
  611. package/src/cli/local-bridge/frontend/src/components/SearchField.tsx +0 -1
  612. package/src/cli/local-bridge/frontend/src/components/SectionHeader.tsx +0 -1
  613. package/src/cli/local-bridge/frontend/src/components/Segmented.tsx +0 -1
  614. package/src/cli/local-bridge/frontend/src/components/StatusText.tsx +0 -3
  615. package/src/cli/local-bridge/frontend/src/design/icons.tsx +0 -11
  616. package/src/cli/local-bridge/frontend/src/design/tokens.css +0 -8
  617. package/src/cli/local-bridge/frontend/src/features/automations/AutomationsView.tsx +0 -153
  618. package/src/cli/local-bridge/frontend/src/features/capabilities/CapabilitiesView.tsx +0 -37
  619. package/src/cli/local-bridge/frontend/src/features/overview/OverviewView.tsx +0 -183
  620. package/src/cli/local-bridge/frontend/src/features/repositories/RepositoriesView.tsx +0 -2
  621. package/src/cli/local-bridge/frontend/src/features/system/SystemView.tsx +0 -2
  622. package/src/cli/local-bridge/frontend/src/features/work/WorkView.tsx +0 -4
  623. package/src/cli/local-bridge/frontend/src/lib/api.ts +0 -30
  624. package/src/cli/local-bridge/frontend/src/lib/format.ts +0 -4
  625. package/src/cli/local-bridge/frontend/src/lib/routes.ts +0 -7
  626. package/src/cli/local-bridge/frontend/src/main.tsx +0 -1
  627. package/src/cli/local-bridge/frontend/src/shell/AppShell.tsx +0 -1
  628. package/src/cli/local-bridge/frontend/src/shell/CommandBar.tsx +0 -2
  629. package/src/cli/local-bridge/frontend/src/shell/Sidebar.tsx +0 -4
  630. package/src/cli/local-bridge/frontend/src/styles.css +0 -28
  631. package/src/cli/local-bridge/frontend/src/types.ts +0 -15
  632. package/src/cli/local-bridge/frontend/src/vite-env.d.ts +0 -1
  633. package/src/cli/local-bridge/frontend/vite.config.ts +0 -27
  634. package/src/cli/local-bridge/ui-dist/app.css +0 -1
  635. package/src/cli/local-bridge/ui-dist/app.js +0 -11228
  636. package/src/cli/mcp/access-mode.ts +0 -2
  637. package/src/cli/mcp/access-tools.ts +0 -2
  638. package/src/cli/mcp/audit.ts +0 -2
  639. package/src/cli/mcp/auth.ts +0 -2
  640. package/src/cli/mcp/instructions.ts +0 -2
  641. package/src/cli/mcp/legacy-context.ts +0 -2
  642. package/src/cli/mcp/legacy-tool-service.ts +0 -2
  643. package/src/cli/mcp/multi-repository.ts +0 -2
  644. package/src/cli/mcp/oauth.ts +0 -2
  645. package/src/cli/mcp/openai-secure-tunnel.ts +0 -2
  646. package/src/cli/mcp/paths.ts +0 -2
  647. package/src/cli/mcp/policy.ts +0 -2
  648. package/src/cli/mcp/post-finalize-work-attribution.ts +0 -2
  649. package/src/cli/mcp/proxy-env.ts +0 -2
  650. package/src/cli/mcp/readiness-projection.ts +0 -2
  651. package/src/cli/mcp/redaction.ts +0 -2
  652. package/src/cli/mcp/repo.ts +0 -2
  653. package/src/cli/mcp/repository-tools.ts +0 -2
  654. package/src/cli/mcp/server.ts +0 -2
  655. package/src/cli/mcp/setup.ts +0 -2
  656. package/src/cli/mcp/tool-capability-cache.ts +0 -2
  657. package/src/cli/mcp/tool-contract.ts +0 -2
  658. package/src/cli/mcp/tools.ts +0 -2
  659. package/src/cli/mcp/toolset-names.ts +0 -2
  660. package/src/cli/mcp/toolset-selection.ts +0 -2
  661. package/src/cli/mcp/toolset.ts +0 -2
  662. package/src/cli/mcp/transports/http.ts +0 -2
  663. package/src/cli/mcp/transports/session-registry.ts +0 -2
  664. package/src/cli/mcp/transports/stdio.ts +0 -2
  665. package/src/cli/mcp/types.ts +0 -2
  666. package/src/cli/mcp/umbrella-tools.ts +0 -2
  667. package/src/cli/tools/codegraph.ts +0 -695
  668. package/src/core/adoption/helper-wrapper-plan.ts +0 -159
  669. package/src/runtime/context/codegraph-cache-boundary.ts +0 -255
  670. package/src/runtime/context/codegraph-read-provider.ts +0 -611
  671. package/src/runtime/context/codegraph-sidecar.cjs +0 -248
  672. package/src/runtime/control-plane/codegraph-cache-retention.ts +0 -164
  673. package/src/runtime/control-plane/execution/content-equivalent-commit-authority.ts +0 -169
  674. package/src/runtime/control-plane/execution/direct-canonical-work-reconciliation.ts +0 -85
  675. package/src/runtime/control-plane/execution/direct-edit-work-completion.ts +0 -655
  676. package/src/runtime/control-plane/execution/work-finalization-service.ts +0 -2850
  677. package/src/runtime/control-plane/execution/work-path-scope.ts +0 -37
  678. package/src/runtime/control-plane/execution/work-task-receipt.ts +0 -468
  679. package/src/runtime/control-plane/facade/controller-round-relay.ts +0 -3
  680. package/src/runtime/control-plane/facade/work-admission-policy.ts +0 -142
  681. package/src/runtime/control-plane/facade/work-implementation-review.ts +0 -2
  682. package/src/runtime/control-plane/facade/work-state-machine.ts +0 -2
  683. package/src/runtime/control-plane/facade/work-task-projection.ts +0 -66
  684. package/src/runtime/control-plane/routing/index.ts +0 -1
  685. package/src/runtime/control-plane/routing/route-policy.ts +0 -401
  686. package/src/runtime/control-plane/routing/workspace-admission.ts +0 -70
  687. package/src/runtime/gateway/mcp/execution-tools.ts +0 -2
  688. package/src/runtime/gateway/mcp/legacy-ios-tool-adapter.ts +0 -2
  689. package/src/runtime/gateway/mcp/persisted-check-process.ts +0 -2
  690. package/src/runtime/gateway/mcp/process-tools.ts +0 -2
  691. package/src/runtime/gateway/mcp/router.ts +0 -2
  692. package/src/runtime/gateway/mcp/runtime-tool-definitions.ts +0 -2
  693. package/src/runtime/gateway/mcp/runtime-tools.ts +0 -2
  694. package/src/runtime/gateway/mcp/work-validation-reconciler.ts +0 -2
  695. package/src/runtime/plugins/browser-provider-registry.ts +0 -2
@@ -0,0 +1,322 @@
1
+ import { timingSafeEqual } from 'crypto';
2
+ import express, { type Express, type NextFunction, type Request, type Response } from 'express';
3
+ import type { OAuthClientInformationFull } from '@modelcontextprotocol/server';
4
+ import { clientRegistrationHandler, redirectUriMatches, revocationHandler, tokenHandler } from '@modelcontextprotocol/server-legacy/auth';
5
+ import type { McpLocalConfig } from '../auth';
6
+ import { createMcpOAuthProvider } from '../oauth';
7
+
8
+ export function getConfiguredPublicOrigin(config: McpLocalConfig | null): string | undefined {
9
+ const configured = process.env.FORGE_MCP_PUBLIC_ORIGIN?.trim();
10
+ if (configured) {
11
+ try {
12
+ return new URL(configured).origin;
13
+ } catch (_error) {
14
+ // Fall through to service or legacy config.
15
+ }
16
+ }
17
+ const endpoint = config?.chatgpt?.endpoint?.trim();
18
+ if (!endpoint) return undefined;
19
+ try {
20
+ return new URL(endpoint).origin;
21
+ } catch (_error) {
22
+ return undefined;
23
+ }
24
+ }
25
+
26
+ export function getPublicOrigin(req: Request, configuredOrigin: string | undefined): string {
27
+ if (configuredOrigin) return configuredOrigin;
28
+ const proto = (req.headers['x-forwarded-proto'] as string | undefined) ?? 'https';
29
+ const host = (req.headers['x-forwarded-host'] as string | undefined) ?? req.headers.host ?? '127.0.0.1:8765';
30
+ return `${proto}://${host}`;
31
+ }
32
+
33
+ export function isAllowedMcpOAuthRedirectUri(redirectUri: string): boolean {
34
+ try {
35
+ const url = new URL(redirectUri);
36
+ if (url.protocol === 'http:' && ['localhost', '127.0.0.1', '[::1]'].includes(url.hostname)) return true;
37
+ return url.protocol === 'https:'
38
+ && (url.origin === 'https://chatgpt.com' || url.origin === 'https://chat.openai.com')
39
+ && url.pathname.startsWith('/connector/oauth/');
40
+ } catch (_error) {
41
+ return false;
42
+ }
43
+ }
44
+
45
+ function isRegisteredRedirectUri(redirectUri: string, client: { redirect_uris?: string[] }): boolean {
46
+ return (client.redirect_uris ?? []).some((registered) => redirectUriMatches(redirectUri, registered));
47
+ }
48
+
49
+ function isRegisteredExternalHttpsRedirectUri(redirectUri: string, client: { redirect_uris?: string[] }): boolean {
50
+ try {
51
+ const url = new URL(redirectUri);
52
+ return url.protocol === 'https:' && !url.username && !url.password && isRegisteredRedirectUri(redirectUri, client);
53
+ } catch (_error) {
54
+ return false;
55
+ }
56
+ }
57
+
58
+ function isSafeOAuthFallbackRedirectUri(redirectUri: string): boolean {
59
+ try {
60
+ const url = new URL(redirectUri);
61
+ if (url.username || url.password) return false;
62
+ if (url.protocol === 'http:' && ['localhost', '127.0.0.1', '[::1]'].includes(url.hostname)) return true;
63
+ return url.protocol === 'https:';
64
+ } catch (_error) {
65
+ return false;
66
+ }
67
+ }
68
+
69
+ function oauthAuthorizeParamSource(req: Request): Record<string, unknown> {
70
+ if (req.method === 'POST' && req.body && typeof req.body === 'object' && !Buffer.isBuffer(req.body)) {
71
+ return req.body as Record<string, unknown>;
72
+ }
73
+ return req.query as Record<string, unknown>;
74
+ }
75
+
76
+ function readOAuthAuthorizeString(source: Record<string, unknown>, key: string): string {
77
+ const value = source[key];
78
+ return typeof value === 'string' ? value.trim() : '';
79
+ }
80
+
81
+ export function isIncompleteOAuthAuthorizeRequest(source: Record<string, unknown>): boolean {
82
+ const clientId = readOAuthAuthorizeString(source, 'client_id');
83
+ const responseType = readOAuthAuthorizeString(source, 'response_type');
84
+ const codeChallenge = readOAuthAuthorizeString(source, 'code_challenge');
85
+ const redirectUri = readOAuthAuthorizeString(source, 'redirect_uri');
86
+ const hasRedirectContext = Boolean(redirectUri) || Boolean(clientId);
87
+ return !clientId || !responseType || !codeChallenge || !hasRedirectContext;
88
+ }
89
+
90
+ function incompleteOAuthAuthorizeResponseBody() {
91
+ return {
92
+ error: 'invalid_request' as const,
93
+ error_description: 'OAuth authorization request is incomplete. Required: client_id, response_type, code_challenge, and a usable redirect context (redirect_uri or a registered client).',
94
+ message: 'This endpoint expects a complete OAuth authorization request (PKCE). Non-OAuth MCP clients should use /mcp-bearer with Authorization: Bearer <token> instead of /authorize.',
95
+ hint: 'Use POST/GET /mcp-bearer with a forge bearer token for clients that cannot complete OAuth dynamic registration and PKCE.',
96
+ };
97
+ }
98
+
99
+ function isOAuthDebugTraceEnabled(): boolean {
100
+ return process.env.FORGE_MCP_OAUTH_TRACE === '1' || process.env.FORGE_MCP_OAUTH_TRACE === 'true';
101
+ }
102
+
103
+ const SENSITIVE_OAUTH_FIELDS = new Set(['passphrase', 'code', 'code_verifier', 'client_secret', 'access_token', 'refresh_token', 'token', 'authorization']);
104
+
105
+ function safeOAuthFieldNames(source: Record<string, unknown>): string[] {
106
+ return Object.keys(source).filter((key) => !SENSITIVE_OAUTH_FIELDS.has(key.toLowerCase())).sort();
107
+ }
108
+
109
+ function oauthTrace(req: Request, event: string, extra: Record<string, unknown> = {}): void {
110
+ if (!isOAuthDebugTraceEnabled()) return;
111
+ const source = oauthAuthorizeParamSource(req);
112
+ const userAgent = typeof req.headers['user-agent'] === 'string' ? req.headers['user-agent'].split(/[\s/]/)[0] : undefined;
113
+ console.error(`[forge:mcp-oauth] ${JSON.stringify({
114
+ event,
115
+ method: req.method,
116
+ path: req.path,
117
+ fieldNames: safeOAuthFieldNames(source),
118
+ hasClientId: Boolean(readOAuthAuthorizeString(source, 'client_id')),
119
+ hasRedirectUri: Boolean(readOAuthAuthorizeString(source, 'redirect_uri')),
120
+ hasCodeChallenge: Boolean(readOAuthAuthorizeString(source, 'code_challenge')),
121
+ responseType: readOAuthAuthorizeString(source, 'response_type') || undefined,
122
+ codeChallengeMethod: readOAuthAuthorizeString(source, 'code_challenge_method') || undefined,
123
+ grantType: readOAuthAuthorizeString(source, 'grant_type') || undefined,
124
+ hasResource: Boolean(readOAuthAuthorizeString(source, 'resource')),
125
+ userAgent,
126
+ ...extra,
127
+ })}`);
128
+ }
129
+
130
+ function oauthTraceMiddleware(event: string): (req: Request, res: Response, next: NextFunction) => void {
131
+ return (req, res, next) => {
132
+ oauthTrace(req, `${event}:request`);
133
+ res.once('finish', () => oauthTrace(req, `${event}:response`, { statusCode: res.statusCode }));
134
+ next();
135
+ };
136
+ }
137
+
138
+ function rejectIncompleteOAuthAuthorize(req: Request, res: Response, next: NextFunction): void {
139
+ const source = oauthAuthorizeParamSource(req);
140
+ if (isIncompleteOAuthAuthorizeRequest(source)) {
141
+ oauthTrace(req, 'authorize:incomplete');
142
+ res.status(400).json(incompleteOAuthAuthorizeResponseBody());
143
+ return;
144
+ }
145
+ oauthTrace(req, 'authorize:complete');
146
+ next();
147
+ }
148
+
149
+ function escapeHtmlAttribute(value: string): string {
150
+ return value.replace(/&/g, '&amp;').replace(/"/g, '&quot;').replace(/'/g, '&#39;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
151
+ }
152
+
153
+ function renderPassphrasePage(params: URLSearchParams): string {
154
+ const hiddenFields = Array.from(params.entries())
155
+ .filter(([key]) => key !== 'passphrase')
156
+ .map(([key, value]) => `<input type="hidden" name="${escapeHtmlAttribute(key)}" value="${escapeHtmlAttribute(value)}">`)
157
+ .join('\n');
158
+ return `<!doctype html>
159
+ <html lang="en">
160
+ <head><meta charset="utf-8"><title>Authorize forge</title>
161
+ <meta name="viewport" content="width=device-width,initial-scale=1">
162
+ <style>
163
+ body{font-family:-apple-system,BlinkMacSystemFont,sans-serif;display:flex;align-items:center;justify-content:center;min-height:100vh;margin:0;background:#f6f6f3;color:#1f2328}
164
+ .card{width:min(420px,92vw);background:#fff;border:1px solid #d8d8d0;border-radius:12px;padding:32px;box-shadow:0 12px 40px rgba(0,0,0,.08)}
165
+ h1{font-size:20px;margin:0 0 8px}p{margin:0 0 20px;color:#60666d;line-height:1.45}
166
+ input{width:100%;box-sizing:border-box;border:1px solid #bfc4c9;border-radius:8px;padding:12px;font-size:16px}
167
+ button{width:100%;margin-top:14px;border:0;border-radius:8px;padding:12px;background:#1f2328;color:#fff;font-size:16px;font-weight:600}
168
+ </style></head>
169
+ <body><main class="card">
170
+ <h1>Authorize forge</h1>
171
+ <p>Enter the local MCP passphrase to let this MCP client use this workflow-scoped connector.</p>
172
+ <form method="POST" action="/authorize">
173
+ ${hiddenFields}
174
+ <input type="password" name="passphrase" placeholder="Passphrase" autofocus>
175
+ <button type="submit">Authorize</button>
176
+ </form>
177
+ </main></body></html>`;
178
+ }
179
+
180
+ function requirePassphrase(passphrase: string): (req: Request, res: Response, next: NextFunction) => void {
181
+ return (req, res, next) => {
182
+ const provided = typeof req.body?.passphrase === 'string' ? req.body.passphrase : undefined;
183
+ if (provided) {
184
+ const a = Buffer.from(provided);
185
+ const b = Buffer.from(passphrase);
186
+ if (a.length === b.length && timingSafeEqual(a, b)) {
187
+ next();
188
+ return;
189
+ }
190
+ }
191
+ const source = oauthAuthorizeParamSource(req);
192
+ const params = new URLSearchParams();
193
+ for (const [key, value] of Object.entries(source)) {
194
+ if (key !== 'passphrase' && typeof value === 'string') params.set(key, value);
195
+ }
196
+ if ([...params.keys()].length === 0 && req.url.includes('?')) {
197
+ const fromUrl = new URLSearchParams(req.url.slice(req.url.indexOf('?')));
198
+ for (const [key, value] of fromUrl.entries()) if (key !== 'passphrase') params.set(key, value);
199
+ }
200
+ res.type('html').send(renderPassphrasePage(params));
201
+ };
202
+ }
203
+
204
+ async function getOrRegisterPublicOAuthClient(
205
+ provider: ReturnType<typeof createMcpOAuthProvider>,
206
+ clientId: string,
207
+ redirectUri: string | undefined,
208
+ req: Request,
209
+ ): Promise<OAuthClientInformationFull | undefined> {
210
+ const existing = await provider.clientsStore.getClient(clientId);
211
+ if (existing) return existing as OAuthClientInformationFull;
212
+ if (!redirectUri || !isSafeOAuthFallbackRedirectUri(redirectUri) || !provider.clientsStore.registerClient) return undefined;
213
+ oauthTrace(req, 'authorize:auto_register_public_client', {
214
+ redirectScheme: new URL(redirectUri).protocol,
215
+ redirectHost: new URL(redirectUri).hostname,
216
+ });
217
+ return provider.clientsStore.registerClient({
218
+ client_id: clientId,
219
+ client_id_issued_at: Math.floor(Date.now() / 1000),
220
+ client_name: 'forge OAuth fallback client',
221
+ redirect_uris: [redirectUri],
222
+ token_endpoint_auth_method: 'none',
223
+ grant_types: ['authorization_code', 'refresh_token'],
224
+ response_types: ['code'],
225
+ } as unknown as Omit<OAuthClientInformationFull, 'client_id' | 'client_id_issued_at'>) as OAuthClientInformationFull;
226
+ }
227
+
228
+ function oauthAuthorizationHandler(provider: ReturnType<typeof createMcpOAuthProvider>) {
229
+ return async (req: Request, res: Response) => {
230
+ const query = req.method === 'POST' ? req.body : req.query;
231
+ const clientId = typeof query.client_id === 'string' ? query.client_id : '';
232
+ const responseType = typeof query.response_type === 'string' ? query.response_type : '';
233
+ const codeChallenge = typeof query.code_challenge === 'string' ? query.code_challenge : '';
234
+ const codeChallengeMethod = typeof query.code_challenge_method === 'string' ? query.code_challenge_method : '';
235
+ const state = typeof query.state === 'string' ? query.state : undefined;
236
+ const scope = typeof query.scope === 'string' ? query.scope : undefined;
237
+ let redirectUri = typeof query.redirect_uri === 'string' ? query.redirect_uri : undefined;
238
+ if (responseType !== 'code') {
239
+ res.status(400).json({ error: 'unsupported_response_type', error_description: 'Only code response type is supported' });
240
+ return;
241
+ }
242
+ if (!codeChallenge || codeChallengeMethod !== 'S256') {
243
+ res.status(400).json({ error: 'invalid_request', error_description: 'PKCE S256 is required' });
244
+ return;
245
+ }
246
+ const client = await getOrRegisterPublicOAuthClient(provider, clientId, redirectUri, req);
247
+ if (!client) {
248
+ res.status(400).json({ error: 'invalid_client', error_description: 'Unknown client_id' });
249
+ return;
250
+ }
251
+ if (!redirectUri && client.redirect_uris.length === 1) redirectUri = client.redirect_uris[0];
252
+ if (!redirectUri || (!isAllowedMcpOAuthRedirectUri(redirectUri) && !isRegisteredExternalHttpsRedirectUri(redirectUri, client))) {
253
+ res.status(400).json({ error: 'invalid_request', error_description: 'redirect_uri must be localhost, a ChatGPT connector callback URL, or a registered HTTPS client redirect_uri' });
254
+ return;
255
+ }
256
+ if (!isRegisteredRedirectUri(redirectUri, client)) {
257
+ res.status(400).json({ error: 'invalid_request', error_description: 'redirect_uri must match a registered client redirect_uri' });
258
+ return;
259
+ }
260
+ await provider.authorize(client as OAuthClientInformationFull, {
261
+ state,
262
+ scopes: scope ? scope.split(' ') : [],
263
+ redirectUri,
264
+ codeChallenge,
265
+ }, res);
266
+ };
267
+ }
268
+
269
+ export function registerMcpOAuthHttpRoutes(
270
+ app: Express,
271
+ provider: ReturnType<typeof createMcpOAuthProvider>,
272
+ passphrase: string,
273
+ configuredOrigin: string | undefined,
274
+ ): void {
275
+ app.use('/authorize', express.urlencoded({ extended: false, limit: '10kb' }));
276
+ app.use('/authorize', oauthTraceMiddleware('authorize'));
277
+ app.use('/authorize', rejectIncompleteOAuthAuthorize);
278
+ app.use('/authorize', requirePassphrase(passphrase));
279
+ app.use('/authorize', oauthAuthorizationHandler(provider));
280
+ app.use('/token', oauthTraceMiddleware('token'));
281
+ app.use('/token', tokenHandler({ provider, rateLimit: false }));
282
+ app.use('/revoke', oauthTraceMiddleware('revoke'));
283
+ app.use('/revoke', revocationHandler({ provider, rateLimit: false }));
284
+ app.use('/register', oauthTraceMiddleware('register'));
285
+ app.use('/register', clientRegistrationHandler({ clientsStore: provider.clientsStore, rateLimit: false }));
286
+ app.get('/.well-known/oauth-authorization-server', (req, res) => {
287
+ const origin = getPublicOrigin(req, configuredOrigin);
288
+ res.json({
289
+ issuer: origin,
290
+ authorization_endpoint: `${origin}/authorize`,
291
+ token_endpoint: `${origin}/token`,
292
+ revocation_endpoint: `${origin}/revoke`,
293
+ registration_endpoint: `${origin}/register`,
294
+ response_types_supported: ['code'],
295
+ grant_types_supported: ['authorization_code', 'refresh_token'],
296
+ code_challenge_methods_supported: ['S256'],
297
+ token_endpoint_auth_methods_supported: ['client_secret_post', 'client_secret_basic', 'none'],
298
+ scopes_supported: ['forge'],
299
+ });
300
+ });
301
+ app.get('/.well-known/openid-configuration', (req, res) => {
302
+ const origin = getPublicOrigin(req, configuredOrigin);
303
+ res.json({
304
+ issuer: origin,
305
+ authorization_endpoint: `${origin}/authorize`,
306
+ token_endpoint: `${origin}/token`,
307
+ registration_endpoint: `${origin}/register`,
308
+ response_types_supported: ['code'],
309
+ grant_types_supported: ['authorization_code', 'refresh_token'],
310
+ code_challenge_methods_supported: ['S256'],
311
+ token_endpoint_auth_methods_supported: ['client_secret_post', 'client_secret_basic', 'none'],
312
+ scopes_supported: ['forge'],
313
+ });
314
+ });
315
+ const protectedResourceMetadata = (resourcePath: '/mcp' | '/mcp-grok' | '/mcp-bearer') => (req: Request, res: Response): void => {
316
+ const origin = getPublicOrigin(req, configuredOrigin);
317
+ res.json({ resource: `${origin}${resourcePath}`, authorization_servers: [origin], scopes_supported: ['forge'], bearer_methods_supported: ['header'] });
318
+ };
319
+ app.get('/.well-known/oauth-protected-resource/mcp', protectedResourceMetadata('/mcp'));
320
+ app.get('/.well-known/oauth-protected-resource/mcp-grok', protectedResourceMetadata('/mcp-grok'));
321
+ app.get('/.well-known/oauth-protected-resource/mcp-bearer', protectedResourceMetadata('/mcp-bearer'));
322
+ }
@@ -76,6 +76,8 @@ export interface McpSessionSnapshot {
76
76
  protected: number;
77
77
  activePosts: number;
78
78
  activeStreams: number;
79
+ /** Time since the most recent transport activity among live MCP sessions. */
80
+ latestActivityAgeMs?: number;
79
81
  oldestStreamAgeMs: number;
80
82
  oldestPostAgeMs: number;
81
83
  recoveryRecommended: boolean;
@@ -445,6 +447,9 @@ export class McpSessionRegistry<
445
447
  const reserved = reservations.length;
446
448
  const protectedCount = sessions.length - evictable + reserved;
447
449
  const capacityAvailable = Math.max(0, this.maximumSessions - sessions.length - reserved);
450
+ const latestActivityAt = sessions.length > 0
451
+ ? Math.max(...sessions.map((session) => session.lastActivityAt))
452
+ : undefined;
448
453
  const streamOpenedAt = sessions
449
454
  .filter((session) => session.inFlightGets > 0 && session.streamOpenedAt !== undefined)
450
455
  .map((session) => session.streamOpenedAt!);
@@ -467,6 +472,7 @@ export class McpSessionRegistry<
467
472
  protected: protectedCount,
468
473
  activePosts,
469
474
  activeStreams,
475
+ ...(latestActivityAt !== undefined ? { latestActivityAgeMs: Math.max(0, this.now() - latestActivityAt) } : {}),
470
476
  oldestStreamAgeMs,
471
477
  oldestPostAgeMs,
472
478
  recoveryRecommended: !acceptingNewSessions && oldestPostAgeMs >= this.activePostStallMs,
@@ -21,6 +21,14 @@ export interface OpenAiSecureTunnelRuntimeStatusPayload {
21
21
  profile_path?: string;
22
22
  runtime_state?: string;
23
23
  error?: string;
24
+ remote_lookup_attempted?: boolean;
25
+ remote_error?: string;
26
+ remote?: unknown;
27
+ control_plane_poll_health?: { state?: string; reason?: string };
28
+ local?: {
29
+ control_plane_poll_health?: { state?: string; reason?: string };
30
+ log?: { tail?: string };
31
+ };
24
32
  }
25
33
 
26
34
  export interface OpenAiSecureTunnelRuntimeObservation {
@@ -30,9 +38,13 @@ export interface OpenAiSecureTunnelRuntimeObservation {
30
38
  ready: boolean;
31
39
  tunnelMatches: boolean;
32
40
  endpointMatches: boolean;
41
+ controlPlaneState: 'ready' | 'degraded' | 'unknown';
42
+ controlPlaneDetail: string;
33
43
  alias: string;
34
44
  tunnelId: string;
35
45
  observedTunnelId?: string;
46
+ clientInstanceId?: string;
47
+ remoteLookupAttempted?: boolean;
36
48
  detail: string;
37
49
  profilePath?: string;
38
50
  }
@@ -90,6 +102,65 @@ export function openAiSecureTunnelConnectArgs(config: OpenAiSecureTunnelRuntimeC
90
102
  return args;
91
103
  }
92
104
 
105
+ function controlPlaneEvidence(value: OpenAiSecureTunnelRuntimeStatusPayload): {
106
+ state: OpenAiSecureTunnelRuntimeObservation['controlPlaneState'];
107
+ detail: string;
108
+ clientInstanceId?: string;
109
+ } {
110
+ let clientInstanceId: string | undefined;
111
+ let latestControlPlane: { level?: string; msg?: string; error?: string } | undefined;
112
+ const tail = value.local?.log?.tail;
113
+ if (typeof tail === 'string') {
114
+ for (const line of tail.trim().split('\n').reverse()) {
115
+ try {
116
+ const event = JSON.parse(line) as Record<string, unknown>;
117
+ if (!clientInstanceId && typeof event.client_instance_id === 'string') clientInstanceId = event.client_instance_id;
118
+ if (!latestControlPlane && event.component === 'controlplane') {
119
+ latestControlPlane = {
120
+ level: typeof event.level === 'string' ? event.level : undefined,
121
+ msg: typeof event.msg === 'string' ? event.msg : undefined,
122
+ error: typeof event.error === 'string' ? event.error : undefined,
123
+ };
124
+ }
125
+ if (clientInstanceId && latestControlPlane) break;
126
+ } catch { /* bounded diagnostic tail may contain non-JSON lines */ }
127
+ }
128
+ }
129
+
130
+ const remoteError = typeof value.remote_error === 'string' ? value.remote_error.trim() : '';
131
+ if (value.remote_lookup_attempted === true) {
132
+ if (remoteError) return { state: 'degraded', detail: `remote lookup failed: ${remoteError}`, ...(clientInstanceId ? { clientInstanceId } : {}) };
133
+ if (value.remote && typeof value.remote === 'object') {
134
+ return { state: 'ready', detail: 'remote tunnel lookup succeeded', ...(clientInstanceId ? { clientInstanceId } : {}) };
135
+ }
136
+ }
137
+
138
+ const pollHealth = value.control_plane_poll_health ?? value.local?.control_plane_poll_health;
139
+ const pollState = pollHealth?.state?.trim().toLowerCase();
140
+ if (pollState === 'ready' || pollState === 'healthy') {
141
+ return { state: 'ready', detail: pollHealth?.reason?.trim() || `control-plane poll state is ${pollState}`, ...(clientInstanceId ? { clientInstanceId } : {}) };
142
+ }
143
+ if (pollState === 'degraded' || pollState === 'error' || pollState === 'failed') {
144
+ return { state: 'degraded', detail: pollHealth?.reason?.trim() || `control-plane poll state is ${pollState}`, ...(clientInstanceId ? { clientInstanceId } : {}) };
145
+ }
146
+
147
+ if (latestControlPlane) {
148
+ const message = [latestControlPlane.msg, latestControlPlane.error].filter(Boolean).join(': ');
149
+ if (/poller recovered|polling operational/i.test(message)) {
150
+ return { state: 'ready', detail: message, ...(clientInstanceId ? { clientInstanceId } : {}) };
151
+ }
152
+ if (latestControlPlane.level === 'WARN' || latestControlPlane.level === 'ERROR' || /timed out|timeout|deadline|reset by peer|lookup .*i\/o timeout|context canceled/i.test(message)) {
153
+ return { state: 'degraded', detail: message || 'latest control-plane event is degraded', ...(clientInstanceId ? { clientInstanceId } : {}) };
154
+ }
155
+ }
156
+
157
+ return {
158
+ state: 'unknown',
159
+ detail: pollHealth?.reason?.trim() || 'remote control-plane reachability was not established',
160
+ ...(clientInstanceId ? { clientInstanceId } : {}),
161
+ };
162
+ }
163
+
93
164
  export function parseOpenAiSecureTunnelRuntimeStatus(
94
165
  stdout: string,
95
166
  expected: Pick<OpenAiSecureTunnelRuntimeConfig, 'alias' | 'tunnelId' | 'mcpServerUrl'>,
@@ -105,6 +176,8 @@ export function parseOpenAiSecureTunnelRuntimeStatus(
105
176
  ready: false,
106
177
  tunnelMatches: false,
107
178
  endpointMatches: false,
179
+ controlPlaneState: 'unknown',
180
+ controlPlaneDetail: 'status payload was not valid JSON',
108
181
  alias: expected.alias,
109
182
  tunnelId: expected.tunnelId,
110
183
  detail: 'OpenAI tunnel runtime status was not valid JSON',
@@ -115,14 +188,21 @@ export function parseOpenAiSecureTunnelRuntimeStatus(
115
188
  const ready = value.ready === true;
116
189
  const tunnelMatches = value.tunnel_id === expected.tunnelId;
117
190
  const endpointMatches = tunnelRuntimeProfileTargetsEndpoint(value.profile_path, expected.mcpServerUrl);
118
- const ok = running && healthy && ready && tunnelMatches && endpointMatches;
191
+ const controlPlane = controlPlaneEvidence(value);
192
+ // `process_running` only describes runtimes that tunnel-client supervises
193
+ // itself. An externally owned service manager (launchd/systemd) reports the
194
+ // runtime as not running while the tunnel is healthy, reachable, and bound to
195
+ // the expected identity. Health, readiness, tunnel id, and endpoint binding are
196
+ // the transport facts; process registry state is diagnostic only.
197
+ const localReady = healthy && ready && tunnelMatches && endpointMatches;
198
+ const ok = localReady && controlPlane.state === 'ready';
119
199
  const mismatches: string[] = [];
120
200
  if (!tunnelMatches && value.tunnel_id) mismatches.push(`tunnel id mismatch (${value.tunnel_id})`);
121
201
  if (!endpointMatches && value.profile_path) mismatches.push('runtime profile targets a different MCP endpoint');
122
- if (!running) mismatches.push(`runtime is ${value.runtime_state ?? 'not running'}`);
123
- if (running && !healthy) mismatches.push('runtime is not healthy');
124
- if (running && !ready) mismatches.push('runtime is not ready');
202
+ if (!healthy) mismatches.push(`runtime is ${value.runtime_state ?? 'not running'}`);
203
+ if (healthy && !ready) mismatches.push('runtime is not ready');
125
204
  if (value.error) mismatches.push(value.error);
205
+ if (controlPlane.state !== 'ready') mismatches.push(`control plane ${controlPlane.state}: ${controlPlane.detail}`);
126
206
  return {
127
207
  ok,
128
208
  running,
@@ -130,10 +210,14 @@ export function parseOpenAiSecureTunnelRuntimeStatus(
130
210
  ready,
131
211
  tunnelMatches,
132
212
  endpointMatches,
213
+ controlPlaneState: controlPlane.state,
214
+ controlPlaneDetail: controlPlane.detail,
133
215
  alias: expected.alias,
134
216
  tunnelId: expected.tunnelId,
135
217
  ...(value.tunnel_id ? { observedTunnelId: value.tunnel_id } : {}),
136
- detail: ok ? `managed runtime ${expected.alias} is ready for ${expected.tunnelId}` : (mismatches.join('; ') || 'OpenAI tunnel runtime is not ready'),
218
+ ...(controlPlane.clientInstanceId ? { clientInstanceId: controlPlane.clientInstanceId } : {}),
219
+ ...(value.remote_lookup_attempted === undefined ? {} : { remoteLookupAttempted: value.remote_lookup_attempted }),
220
+ detail: ok ? `managed runtime ${expected.alias} is locally ready and its OpenAI control plane is reachable for ${expected.tunnelId}` : (mismatches.join('; ') || 'OpenAI tunnel runtime is not ready'),
137
221
  ...(value.profile_path ? { profilePath: value.profile_path } : {}),
138
222
  };
139
223
  }
@@ -1,12 +1,6 @@
1
1
  export type McpProfileName = 'planner' | 'executor' | 'orchestrator' | 'controller';
2
2
  export type McpPathIntent = 'read' | 'write';
3
3
  export type McpAgentRunnerName = 'codex' | 'claude';
4
- /** Controller MCP tools/list exposure profile.
5
- * - facade: explicit five-tool ChatGPT orchestration surface
6
- * - core/advanced (default compatibility labels): bounded stable controller surface
7
- * - full: compatibility mode — all legacy + runtime tools
8
- */
9
- export type McpToolset = 'facade' | 'core' | 'advanced' | 'full';
10
4
 
11
5
  export interface McpPolicy {
12
6
  profile: McpProfileName;
@@ -69,41 +69,3 @@ session_state_read_count() {
69
69
 
70
70
  printf '%s' "$count"
71
71
  }
72
-
73
- session_state_codegraph_dir() {
74
- printf '%s' ".claude/.codegraph-state"
75
- }
76
-
77
- session_state_codegraph_marker_file() {
78
- local key="$1"
79
- local suffix="$2"
80
- local safe_key
81
- safe_key="$(session_state_safe_key "$key")"
82
- printf '%s/%s.%s' "$(session_state_codegraph_dir)" "$safe_key" "$suffix"
83
- }
84
-
85
- session_state_mark_codegraph_used() {
86
- local key="$1"
87
- local marker
88
- marker="$(session_state_codegraph_marker_file "$key" "used")"
89
- mkdir -p "$(dirname "$marker")"
90
- : > "$marker"
91
- }
92
-
93
- session_state_codegraph_used() {
94
- local key="$1"
95
- [[ -f "$(session_state_codegraph_marker_file "$key" "used")" ]]
96
- }
97
-
98
- session_state_mark_codegraph_nudged() {
99
- local key="$1"
100
- local marker
101
- marker="$(session_state_codegraph_marker_file "$key" "nudged")"
102
- mkdir -p "$(dirname "$marker")"
103
- : > "$marker"
104
- }
105
-
106
- session_state_codegraph_nudged() {
107
- local key="$1"
108
- [[ -f "$(session_state_codegraph_marker_file "$key" "nudged")" ]]
109
- }
@@ -121,7 +121,7 @@ broad_command=false
121
121
  recommended_next_tool=""
122
122
  if post_bash_broad_command "$COMMAND_TEXT"; then
123
123
  broad_command=true
124
- recommended_next_tool="codegraph_context"
124
+ recommended_next_tool="rh_context"
125
125
  fi
126
126
  output_line_count="$(post_bash_output_line_count "$TOOL_OUTPUT")"
127
127
  raw_output_bytes="$(post_bash_output_byte_count "$TOOL_OUTPUT")"
@@ -41,11 +41,6 @@ duration_ms="${duration_ms:-0}"
41
41
  run_id="${run_id:-unknown}"
42
42
  session_source="${session_source:-unknown}"
43
43
 
44
- case "$tool_name" in
45
- mcp__codegraph__*|codegraph_*)
46
- session_state_mark_codegraph_used "$SESSION_KEY" || true
47
- ;;
48
- esac
49
44
 
50
45
  # An event source is explicit evidence. Inherited host variables are only a
51
46
  # fallback for payloads that omit it, such as local compatibility shims.
@@ -566,59 +566,6 @@ emit_agentic_packaging_hint() {
566
566
  fi
567
567
  }
568
568
 
569
- resolve_codegraph_bin() {
570
- local common_git_dir canonical_root candidate
571
- if [[ -x "node_modules/.bin/codegraph" ]]; then
572
- printf '%s\n' "node_modules/.bin/codegraph"
573
- return 0
574
- fi
575
-
576
- # Linked worktrees normally reuse the canonical checkout's dependency tree.
577
- # Resolve it before falling back to a user-global CodeGraph installation.
578
- common_git_dir="$(git rev-parse --path-format=absolute --git-common-dir 2>/dev/null || true)"
579
- if [[ -n "$common_git_dir" ]]; then
580
- canonical_root="$(dirname "$common_git_dir")"
581
- candidate="$canonical_root/node_modules/.bin/codegraph"
582
- if [[ -x "$candidate" ]]; then
583
- printf '%s\n' "$candidate"
584
- return 0
585
- fi
586
- fi
587
-
588
- command -v codegraph 2>/dev/null || return 1
589
- }
590
-
591
- run_codegraph_init_command() {
592
- local codegraph_bin status cursor_dir_existed cursor_rules_dir_existed cursor_rule_existed
593
- codegraph_bin="$(resolve_codegraph_bin)" || return 127
594
-
595
- cursor_dir_existed=false
596
- cursor_rules_dir_existed=false
597
- cursor_rule_existed=false
598
- [[ -d ".cursor" ]] && cursor_dir_existed=true
599
- [[ -d ".cursor/rules" ]] && cursor_rules_dir_existed=true
600
- [[ -e ".cursor/rules/codegraph.mdc" ]] && cursor_rule_existed=true
601
-
602
- set +e
603
- CODEGRAPH_NO_DAEMON=1 "$codegraph_bin" init -i .
604
- status=$?
605
- set -e
606
-
607
- if [[ "$cursor_rule_existed" == "false" && -f ".cursor/rules/codegraph.mdc" ]]; then
608
- rm -f ".cursor/rules/codegraph.mdc"
609
- [[ "$cursor_rules_dir_existed" == "false" ]] && rmdir ".cursor/rules" 2>/dev/null || true
610
- [[ "$cursor_dir_existed" == "false" ]] && rmdir ".cursor" 2>/dev/null || true
611
- fi
612
-
613
- return "$status"
614
- }
615
-
616
- emit_codegraph_route_hint() {
617
- if pg_fact CODEGRAPH_ROUTE || pg_fact NONTRIVIAL_CODE_TASK; then
618
- echo "[CodegraphRoute] Structural code-navigation intent detected. Prefer Forge rh_context/semantic navigation or an already-configured structural provider; do not initialize repo-local .codegraph state from a prompt hook."
619
- fi
620
- }
621
-
622
569
  modern_controller_home_workflow() {
623
570
  [[ -f "forge.config.json" ]]
624
571
  }
@@ -839,7 +786,6 @@ prompt_guard_engine_call
839
786
  if modern_controller_home_workflow; then
840
787
  emit_agentic_packaging_hint
841
788
  emit_forge_route_hint
842
- emit_codegraph_route_hint
843
789
  emit_modern_controller_home_guidance
844
790
  exit 0
845
791
  fi
@@ -858,7 +804,6 @@ fi
858
804
 
859
805
  emit_agentic_packaging_hint
860
806
  emit_forge_route_hint
861
- emit_codegraph_route_hint
862
807
  emit_pending_orchestration_discussion
863
808
 
864
809
  implement_intent=0
@@ -50,7 +50,7 @@
50
50
  - Route knowledge sync and handoff retrieval to `gbrain`.
51
51
  - Register valuable repo-authored docs in `.ai/harness/brain-manifest.json` with `sync.direction=repo-to-brain`; `.ai/harness/scripts/sync-brain-docs.sh` and the PostEdit hook mirror only those explicit entries into the default brain vault.
52
52
  - Codex automation profile is runtime-referenced, not vendored: required skills are `health`, `check`, and `mermaid` from `~/.codex/skills`.
53
- - CodeGraph is required agent readiness for code navigation; keep `.codegraph/` ignored and use it for P1/P2 discovery, not hook correctness.
53
+ - Code navigation uses bounded ripgrep discovery and explicit language-service symbol navigation; no graph index is required.
54
54
  - Treat third-party host skills as optional. Their installation state must not change Forge workflow correctness.
55
55
  - Use `docs/reference-configs/agentic-development-flow.md` for routing details and `docs/reference-configs/external-tooling.md` plus `bash .ai/harness/scripts/check-agent-tooling.sh --host both --check-updates` for environment checks.
56
56
  - If repo state conflicts with the task, use an isolated `codex/<task-slug>` worktree, validate with Forge `/review`, and merge back to `main` without unrelated dirty changes.
@@ -35,4 +35,4 @@ CLAUDE.md is a routing card. Keep context minimal and load only what the current
35
35
  ---
36
36
 
37
37
  *Template Version: {{TEMPLATE_VERSION}}*
38
- *Generated by forge@{{SKILL_VERSION}}*
38
+ *Generated by forge@{{FORGE_VERSION}}*