@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,564 @@
1
+ import { once } from 'node:events';
2
+ import { createHash } from 'node:crypto';
3
+ import { WorkflowSupervisorControlPlane } from '../../../supervisor/control-plane';
4
+ import { forgeWorkflowSupervisorValidators } from '../../../supervisor/forge-validators';
5
+ import { forgeWorkflowSupervisorLifecycleHooks, workflowSupervisorContractText } from './workflow-supervisor-composition';
6
+ import { resolveWorkflowSupervisorForgeHome, workflowSupervisorSocketPath } from '../../../supervisor/paths';
7
+ import {
8
+ createWorkflowSupervisorServer,
9
+ reconcileWorkflowSupervisorSocket,
10
+ WorkflowSupervisorEphemeralDiscovery,
11
+ } from '../../../supervisor/server';
12
+ import { startWorkflowSupervisorNativeBrowserAdapter, type WorkflowSupervisorNativeBrowserHandle, type WorkflowSupervisorStallProjection, type WorkflowSupervisorTransportProjection } from '../../../supervisor/native-browser-adapter';
13
+ import type { WorkflowSupervisorConsumerStatus } from '../../../supervisor/types';
14
+ import { WorkflowSupervisorStore } from '../../../supervisor/store';
15
+ import { createComputerInteractionTargetAuthority } from '../../../adapters/computer/interaction-target-authority';
16
+ import { ChromeExtensionChatgptConversationTargetPort } from '../../../adapters/computer/chatgpt-extension-target';
17
+ import { createRuntimeComputerTargetPersistence } from './computer-target-persistence';
18
+ import { getDirectActivity, listUserRequests, recordDirectActivity, recordUserRequest, resolveUserRequest } from '../../../packages/kernel/identity/api/index';
19
+ import { getRuntimeWriteClaim } from './write-fence';
20
+ import { getRepository } from '../../cli/repositories/registry';
21
+ import { getWorkContract } from '../../../packages/kernel/work/api/index';
22
+ import { getChatgptWorkConversationBinding, parseChatgptConversationIdentity } from '../../../adapters/chatgpt/work-conversation-binding-store';
23
+ import { isTerminalSemanticWorkState } from '../../../packages/kernel/work/api/index';
24
+ import { findActivePluginCapabilityAuthorization, pluginCapabilityAuthorizationOwnerScope } from '../plugins/capability-authorization-grants';
25
+ import { readPluginActionReceiptForRequest, submitAssistantPluginAction, type PluginActionReceipt } from '../plugins/store';
26
+ import { loadGmailPluginConfig } from '../plugins/google-shared';
27
+ import { GMAIL_OWNER_NOTIFICATION_CAPABILITY_ID, GMAIL_PLUGIN_ID } from '../plugins/gmail-adapter';
28
+
29
+ /** An uncertain external send remains owned by its original immutable plugin receipt. */
30
+ export function recordUnknownSupervisorNotificationReceipt(
31
+ controllerHome: string,
32
+ taskId: string,
33
+ requestId: string,
34
+ receipt: Pick<PluginActionReceipt, 'receiptId' | 'requestId' | 'pluginId' | 'actionId' | 'status' | 'effectOutcome'>,
35
+ ): boolean {
36
+ if (receipt.requestId !== requestId || receipt.pluginId !== GMAIL_PLUGIN_ID
37
+ || receipt.actionId !== 'send_owner_notification'
38
+ || receipt.status !== 'failed' || receipt.effectOutcome !== 'outcome_unknown') return false;
39
+ const activityId = `workflow-supervisor-notification-unknown-${requestId}`;
40
+ const existing = getDirectActivity(controllerHome, activityId);
41
+ if (existing?.receiptRef && existing.receiptRef !== receipt.receiptId) {
42
+ throw new Error(`WORKFLOW_SUPERVISOR_NOTIFICATION_RECEIPT_CONFLICT: ${requestId}`);
43
+ }
44
+ if (!existing) recordDirectActivity(controllerHome, {
45
+ activityId,
46
+ capabilityId: 'workflow-supervisor.notification',
47
+ kind: 'direct_execution',
48
+ targetScope: `workflow-supervisor-task:${taskId}`,
49
+ principalId: 'forge-runtime',
50
+ status: 'failed',
51
+ receiptRef: receipt.receiptId,
52
+ summary: 'Gmail notification delivery outcome is unknown. Preserve the exact provider receipt and request ID; do not resend or rekey without authoritative reconciliation.',
53
+ });
54
+ return true;
55
+ }
56
+
57
+ export interface RuntimeWorkflowSupervisorHandle {
58
+ readonly done: Promise<void>;
59
+ close(): Promise<void>;
60
+ }
61
+
62
+ /**
63
+ * Workflow Supervisor is a distinct lifecycle authority, not a distinct OS
64
+ * service. Canonical Forge Runtime already owns the durable process lifecycle;
65
+ * this composition gives Supervisor one in-process server/writer while keeping
66
+ * its SQLite and Unix socket authority isolated under the exact Controller Home.
67
+ */
68
+ export function startWorkflowSupervisorRuntime(controllerHome: string): Promise<RuntimeWorkflowSupervisorHandle>;
69
+ export function startWorkflowSupervisorRuntime(
70
+ controllerHome: string,
71
+ options: { nativeBrowserAdapter?: boolean },
72
+ ): Promise<RuntimeWorkflowSupervisorHandle>;
73
+ export async function startWorkflowSupervisorRuntime(
74
+ controllerHome: string,
75
+ options: { nativeBrowserAdapter?: boolean } = {},
76
+ ): Promise<RuntimeWorkflowSupervisorHandle> {
77
+ const forgeHome = resolveWorkflowSupervisorForgeHome(controllerHome);
78
+ const socketPath = workflowSupervisorSocketPath(forgeHome);
79
+ const claim = getRuntimeWriteClaim();
80
+ const writer = claim && !claim.unmanaged
81
+ ? { runtimeInstanceId: claim.runtimeInstanceId, fencingGeneration: claim.fencingGeneration, pid: claim.ownerPid }
82
+ : undefined;
83
+ if (writer) await reconcileWorkflowSupervisorSocket({ socketPath, incoming: writer });
84
+ const store = new WorkflowSupervisorStore(forgeHome, {
85
+ activeReleaseId: () => getRuntimeWriteClaim()?.releaseId,
86
+ });
87
+ const controlPlane = new WorkflowSupervisorControlPlane(
88
+ store,
89
+ forgeWorkflowSupervisorValidators(),
90
+ forgeWorkflowSupervisorLifecycleHooks(controllerHome),
91
+ );
92
+ const discovery = new WorkflowSupervisorEphemeralDiscovery();
93
+ const browserAdapterEnabled = true;
94
+ const nativeBrowserAdapterEnabled = options.nativeBrowserAdapter !== false;
95
+ let nativeBrowser: WorkflowSupervisorNativeBrowserHandle | undefined;
96
+ const transportActivityId = (taskId?: string): string => `workflow-supervisor-transport-${(taskId ?? 'instance').replace(/[^a-zA-Z0-9._-]/g, '_')}`;
97
+ const reportTransportState = (projection: WorkflowSupervisorTransportProjection): void => {
98
+ const activityId = transportActivityId(projection.taskId);
99
+ const existing = getDirectActivity(controllerHome, activityId);
100
+ const recovered = projection.state === 'recovered';
101
+ recordDirectActivity(controllerHome, {
102
+ activityId,
103
+ capabilityId: 'workflow-supervisor.transport',
104
+ kind: 'direct_execution',
105
+ targetScope: projection.taskId ? `workflow-supervisor-task:${projection.taskId}` : 'workflow-supervisor:instance',
106
+ principalId: 'forge-runtime',
107
+ status: recovered ? 'completed' : 'running',
108
+ startedAt: existing?.startedAt ?? projection.firstFailureAt ?? projection.observedAt,
109
+ ...(recovered ? { completedAt: projection.observedAt } : {}),
110
+ summary: recovered
111
+ ? 'Workflow Supervisor transport recovered; autonomous continuation resumed without user action.'
112
+ : `Workflow Supervisor transport is temporarily degraded and auto-recovering${projection.code ? ` (${projection.code})` : ''}. Durable task/effect progress is preserved.`,
113
+ });
114
+ if (recovered && projection.taskId) {
115
+ const prefix = `workflow-supervisor.transport-human:${projection.taskId}:`;
116
+ for (const request of listUserRequests(controllerHome, 'pending').filter((item) => item.rootCauseKey.startsWith(prefix))) {
117
+ resolveUserRequest(controllerHome, { requestId: request.requestId, decision: 'transport_recovered', resolvedBy: 'forge-runtime' });
118
+ }
119
+ }
120
+ };
121
+ const stallActivityId = (taskId: string): string => `workflow-supervisor-stall-${taskId.replace(/[^a-zA-Z0-9._-]/g, '_')}`;
122
+ const reportTaskStall = (projection: WorkflowSupervisorStallProjection): void => {
123
+ const activityId = stallActivityId(projection.taskId);
124
+ const existing = getDirectActivity(controllerHome, activityId);
125
+ const exhausted = projection.state === 'exhausted';
126
+ if (!exhausted && !existing) return;
127
+ const budget = projection.generations !== undefined && projection.maxGenerations !== undefined
128
+ ? ` (${projection.generations}/${projection.maxGenerations})`
129
+ : '';
130
+ recordDirectActivity(controllerHome, {
131
+ activityId,
132
+ capabilityId: 'workflow-supervisor.continuation',
133
+ kind: 'direct_execution',
134
+ targetScope: `workflow-supervisor-task:${projection.taskId}`,
135
+ principalId: 'forge-runtime',
136
+ status: exhausted ? 'running' : 'completed',
137
+ startedAt: exhausted && existing?.status !== 'running' ? projection.observedAt : existing?.startedAt ?? projection.observedAt,
138
+ ...(!exhausted ? { completedAt: projection.observedAt } : {}),
139
+ summary: exhausted
140
+ ? projection.stallKind === 'provider_resume_exhausted'
141
+ ? 'Workflow Supervisor exhausted bounded provider-resume attempts. The committed effect is preserved; only read-only reconciliation for late receipt evidence continues, and no duplicate provider turn will be sent.'
142
+ : `Workflow Supervisor exhausted bounded automatic dispatch generations${budget}. The task/effect remains durable, but automatic sending is paused until explicit recovery or new authoritative evidence; no duplicate provider turn will be sent.`
143
+ : 'Workflow Supervisor continuation stall cleared; the durable task/effect can progress again.',
144
+ });
145
+ };
146
+ const requestHumanAction = (input: { taskId: string; effectId?: string; action: 'login' | 'grant_permission'; code: string }): void => {
147
+ const actionLabel = input.action === 'login' ? 'sign in to ChatGPT' : 'restore browser automation permission';
148
+ recordUserRequest(controllerHome, {
149
+ kind: 'user_action_request',
150
+ rootCauseKey: `workflow-supervisor.transport-human:${input.taskId}:${input.action}`,
151
+ title: input.action === 'login' ? 'ChatGPT sign-in required' : 'Browser permission required',
152
+ summary: `Workflow Supervisor cannot continue this task until you ${actionLabel}. The task and effect ledger are preserved and will resume automatically afterward.`,
153
+ actionRequired: input.action,
154
+ targetScope: { scopeKind: 'workflow_supervisor_task', scopeId: input.taskId },
155
+ presentation: {
156
+ severity: 'blocked',
157
+ creationReason: 'workflow_supervisor_transport_human_boundary',
158
+ reason: input.code,
159
+ currentState: { taskId: input.taskId, ...(input.effectId ? { effectId: input.effectId } : {}), transportCode: input.code },
160
+ },
161
+ });
162
+ };
163
+ const notificationRequestId = (...parts: string[]): string => `wfsn_${createHash('sha256').update(parts.join('\u0000')).digest('hex').slice(0, 32)}`;
164
+ const notificationOrigin = { surface: 'system' as const };
165
+ const notificationOwnerScope = pluginCapabilityAuthorizationOwnerScope({ surface: 'system', actor: 'plugin_action_execute' });
166
+ const findNotificationGrant = (repoId: string, target: { kind: 'gmail-mailbox'; id: string; identityFingerprint: string } | undefined) => target && findActivePluginCapabilityAuthorization(controllerHome, {
167
+ ownerScope: notificationOwnerScope,
168
+ repoId,
169
+ pluginId: GMAIL_PLUGIN_ID,
170
+ capabilityId: GMAIL_OWNER_NOTIFICATION_CAPABILITY_ID,
171
+ target,
172
+ scopes: ['gmail.send'],
173
+ risk: 'remote_write',
174
+ });
175
+ const sendSupervisorNotification = async (input: {
176
+ taskId: string;
177
+ requestId: string;
178
+ kind: 'user_action_required' | 'continuation_exhausted';
179
+ subject: string;
180
+ reason: string;
181
+ effectId?: string;
182
+ userRequestId?: string;
183
+ repoId?: string;
184
+ workId?: string;
185
+ conversationUrl?: string;
186
+ objective?: string;
187
+ occurredAt?: string;
188
+ stillActive?: () => boolean;
189
+ }): Promise<void> => {
190
+ if (input.stillActive && !input.stillActive()) return;
191
+ const task = store.getTask(input.taskId);
192
+ const repoId = (task ? workflowSupervisorContractText(task, 'repo_id') : undefined) ?? input.repoId;
193
+ const candidateConversationUrl = task?.conversationUrl ?? input.conversationUrl;
194
+ if (!repoId || !candidateConversationUrl) return;
195
+ let conversationUrl: string;
196
+ try { conversationUrl = parseChatgptConversationIdentity(candidateConversationUrl).conversationUrl; }
197
+ catch { return; } // Never fabricate a ChatGPT session link.
198
+ const repository = getRepository(repoId, controllerHome);
199
+ if (!repository) return;
200
+ // Read the exact prior receipt before grant checks or changing args. An
201
+ // outcome-unknown send must never be resubmitted under any envelope.
202
+ const prior = readPluginActionReceiptForRequest(controllerHome, input.requestId);
203
+ if (prior && recordUnknownSupervisorNotificationReceipt(controllerHome, input.taskId, input.requestId, prior)) return;
204
+ const mailbox = loadGmailPluginConfig(repository.canonicalRoot, { controllerHome, repoId }).accountEmail?.trim().toLowerCase();
205
+ const target = mailbox ? {
206
+ kind: 'gmail-mailbox' as const,
207
+ id: mailbox,
208
+ identityFingerprint: `gmail-profile:${mailbox}`,
209
+ } : undefined;
210
+ const grant = findNotificationGrant(repoId, target);
211
+ if (!grant) {
212
+ recordUserRequest(controllerHome, {
213
+ kind: 'user_action_request',
214
+ rootCauseKey: `workflow-supervisor.notification-auth:${repoId}:${mailbox ?? 'unconfigured'}`,
215
+ title: 'Authorize owner-only Gmail alerts',
216
+ summary: `Forge cannot email owner authorization notices until Gmail action authorize_owner_notifications is approved for the configured and Google-verified owner mailbox${mailbox ? ` (${mailbox})` : ''}. The send-only grant lasts up to 90 days, cannot archive email or contact other recipients, and creates no email when authorized. Unsent events remain in UserRequest.`,
217
+ actionRequired: 'grant_permission',
218
+ targetScope: task ? { scopeKind: 'workflow_supervisor_task', scopeId: input.taskId, repoId, ...(input.workId ? { workId: input.workId } : {}) }
219
+ : { scopeKind: 'work', scopeId: input.workId ?? input.taskId, repoId, ...(input.workId ? { workId: input.workId } : {}) },
220
+ presentation: {
221
+ severity: 'blocked',
222
+ creationReason: 'scheduled_gmail_notification_authorization_required',
223
+ reason: 'EXTERNAL_EFFECT_AUTHORIZATION_REQUIRED',
224
+ currentState: {
225
+ taskId: input.taskId,
226
+ repoId,
227
+ ...(mailbox ? { mailbox } : {}),
228
+ pluginId: GMAIL_PLUGIN_ID,
229
+ capabilityId: GMAIL_OWNER_NOTIFICATION_CAPABILITY_ID,
230
+ authorizationAction: 'authorize_owner_notifications',
231
+ scopes: ['gmail.send'],
232
+ grantLifetimeDays: 90,
233
+ },
234
+ },
235
+ });
236
+ return;
237
+ }
238
+ // Opt-in is prospective. Do not replay a backlog of old blockers or
239
+ // historical terminal completions when the owner first grants email access.
240
+ if (input.occurredAt && Date.parse(input.occurredAt) <= Date.parse(grant.createdAt)) return;
241
+ if (input.stillActive && !input.stillActive()) return;
242
+ const workId = (task ? workflowSupervisorContractText(task, 'work_id') : undefined) ?? input.workId;
243
+ const body = [
244
+ 'Forge Workflow Supervisor 检测到需要人工处理的事件。',
245
+ `事件:${input.kind}`,
246
+ `原因:${input.reason.slice(0, 1800)}`,
247
+ `任务:${task?.taskId ?? input.taskId}`,
248
+ `Work:${workId ?? '未绑定 Work'}`,
249
+ ...(task?.objective || input.objective ? [`目标:${(task?.objective ?? input.objective ?? '').slice(0, 800)}`] : []),
250
+ `ChatGPT 会话链接:${conversationUrl}`,
251
+ ...(repoId && workId ? [`Forge Work 查询:rh_work operation=get repo_id=${repoId} work_id=${workId}`] : []),
252
+ ...(input.effectId ? [`Effect:${input.effectId}`] : []),
253
+ ...(input.userRequestId ? [`UserRequest:${input.userRequestId}`] : []),
254
+ '处理或恢复后,Forge 会继续沿用原有任务与 effect;不要手动重复发送。',
255
+ ].join('\n').slice(0, 11000);
256
+ try {
257
+ const submitted = await submitAssistantPluginAction(controllerHome, repository, {
258
+ pluginId: GMAIL_PLUGIN_ID,
259
+ actionId: 'send_owner_notification',
260
+ requestId: input.requestId,
261
+ args: { subject: input.subject, body_text: body },
262
+ origin: {
263
+ surface: 'system',
264
+ correlationId: input.requestId,
265
+ ...(input.effectId ? { causationId: input.effectId } : {}),
266
+ },
267
+ authorizationGrantRefs: [grant.grantId],
268
+ });
269
+ if (recordUnknownSupervisorNotificationReceipt(controllerHome, input.taskId, input.requestId, submitted.receipt)) {
270
+ process.stderr.write(`[workflow-supervisor-notification] ${input.requestId}: outcome_unknown; receipt ${submitted.receipt.receiptId} retained without resend\n`);
271
+ }
272
+ } catch (error) {
273
+ const failureMessage = error instanceof Error ? error.message : String(error);
274
+ const failureCode = /^([A-Z][A-Z0-9_]+)(?::|$)/.exec(failureMessage)?.[1];
275
+ const loginRequired = failureCode === 'PLUGIN_AUTH_REQUIRED' || failureCode === 'PLUGIN_AUTH_FAILED';
276
+ const authorizationRequired = loginRequired || [
277
+ 'PLUGIN_CAPABILITY_GRANT_REQUIRED',
278
+ 'GMAIL_AUTOMATION_DISABLED',
279
+ 'GMAIL_AUTOMATION_MAILBOX_NOT_CONFIGURED',
280
+ 'GMAIL_AUTOMATION_MAILBOX_MISMATCH',
281
+ 'EXTERNAL_EFFECT_AUTHORIZATION_REQUIRED',
282
+ ].includes(failureCode ?? '');
283
+ if (authorizationRequired && failureCode) {
284
+ const workId = (task ? workflowSupervisorContractText(task, 'work_id') : undefined) ?? input.workId;
285
+ recordUserRequest(controllerHome, {
286
+ kind: 'user_action_request',
287
+ rootCauseKey: `workflow-supervisor.notification-send-auth:${input.taskId}:${input.requestId}`,
288
+ title: loginRequired ? 'Gmail notification reauthorization required' : 'Gmail notification authorization required',
289
+ summary: `Forge could not send the notification to the configured Gmail profile${mailbox ? ` (${mailbox})` : ''} because the exact Gmail provider action failed with ${failureCode}: ${failureMessage}. No alternate provider or automatic resend was used. Restore the Gmail authorization or exact mailbox grant, then continue from the original task.`,
290
+ actionRequired: loginRequired ? 'login' : 'grant_permission',
291
+ targetScope: {
292
+ scopeKind: task ? 'workflow_supervisor_task' : 'work',
293
+ scopeId: task ? input.taskId : (workId ?? input.taskId),
294
+ repoId,
295
+ ...(workId ? { workId } : {}),
296
+ },
297
+ presentation: {
298
+ severity: 'blocked',
299
+ creationReason: 'scheduled_gmail_notification_authorization_failed',
300
+ reason: failureCode,
301
+ currentState: {
302
+ taskId: input.taskId,
303
+ repoId,
304
+ ...(workId ? { workId } : {}),
305
+ ...(mailbox ? { mailbox } : {}),
306
+ pluginId: GMAIL_PLUGIN_ID,
307
+ capabilityId: GMAIL_OWNER_NOTIFICATION_CAPABILITY_ID,
308
+ actionId: 'send_owner_notification',
309
+ requestId: input.requestId,
310
+ ...(input.effectId ? { effectId: input.effectId } : {}),
311
+ errorCode: failureCode,
312
+ },
313
+ },
314
+ });
315
+ }
316
+ process.stderr.write(`[workflow-supervisor-notification] ${input.requestId}: ${failureMessage}\\n`);
317
+ }
318
+ };
319
+ let notificationReconciliationInFlight: Promise<void> | undefined;
320
+ const reconcileSupervisorNotifications = (): void => {
321
+ if (closing || notificationReconciliationInFlight) return;
322
+ notificationReconciliationInFlight = (async () => {
323
+ const allRequests = listUserRequests(controllerHome);
324
+ for (const request of allRequests.filter((item) => item.status === 'pending' && item.rootCauseKey.startsWith('workflow-supervisor.notification-auth:'))) {
325
+ const taskId = request.targetScope?.scopeId;
326
+ if (!taskId) continue;
327
+ const task = store.getTask(taskId);
328
+ if (!task) continue;
329
+ const repoId = workflowSupervisorContractText(task, 'repo_id');
330
+ const workId = workflowSupervisorContractText(task, 'work_id');
331
+ if (!repoId) continue;
332
+ if (workId) {
333
+ const work = getWorkContract({ controllerHome, repoId }, workId);
334
+ if (!work || isTerminalSemanticWorkState(work.semanticState)) {
335
+ resolveUserRequest(controllerHome, { requestId: request.requestId, decision: 'underlying_work_terminal', resolvedBy: 'forge-runtime' });
336
+ continue;
337
+ }
338
+ }
339
+ const repository = getRepository(repoId, controllerHome);
340
+ if (!repository) continue;
341
+ const mailbox = loadGmailPluginConfig(repository.canonicalRoot, { controllerHome, repoId }).accountEmail?.trim().toLowerCase();
342
+ const target = mailbox ? {
343
+ kind: 'gmail-mailbox' as const,
344
+ id: mailbox,
345
+ identityFingerprint: `gmail-profile:${mailbox}`,
346
+ } : undefined;
347
+ if (findNotificationGrant(repoId, target)) {
348
+ resolveUserRequest(controllerHome, { requestId: request.requestId, decision: 'gmail_automation_authorized', resolvedBy: 'forge-runtime' });
349
+ }
350
+ }
351
+
352
+ // One canonical pending UserRequest -> one Gmail notice. Never email
353
+ // our own notification-grant blockers. A request opts in only when it
354
+ // was created after the owner-notification grant, so enabling this
355
+ // capability cannot fan out the backlog that predated authorization.
356
+ for (const request of allRequests.filter((item) => item.status === 'pending'
357
+ && ['grant_permission', 'login', 'confirm_destructive'].includes(item.actionRequired)
358
+ && !item.rootCauseKey.startsWith('workflow-supervisor.notification-'))) {
359
+ const scope = request.targetScope;
360
+ const task = (scope?.scopeKind === 'workflow_supervisor_task' ? store.getTask(scope.scopeId) : undefined)
361
+ ?? (scope?.workId || scope?.scopeKind === 'work'
362
+ ? store.listTasks().find((candidate) => workflowSupervisorContractText(candidate, 'work_id') === (scope?.workId ?? scope?.scopeId))
363
+ : undefined);
364
+ const workId = scope?.workId ?? (scope?.scopeKind === 'work' ? scope.scopeId : undefined);
365
+ const repoId = scope?.repoId ?? (task ? workflowSupervisorContractText(task, 'repo_id') : undefined);
366
+ const bound = !task && workId && repoId
367
+ ? getChatgptWorkConversationBinding({ controllerHome, repoId }, workId) : undefined;
368
+ const taskId = task?.taskId ?? (bound ? `work:${workId}` : undefined);
369
+ if (!taskId || (!task && !bound)) continue;
370
+ const work = repoId && workId ? getWorkContract({ controllerHome, repoId }, workId) : undefined;
371
+ if (repoId && workId) {
372
+ if (!work || isTerminalSemanticWorkState(work.semanticState)) {
373
+ resolveUserRequest(controllerHome, { requestId: request.requestId, decision: 'underlying_work_terminal', resolvedBy: 'forge-runtime' });
374
+ continue;
375
+ }
376
+ }
377
+ const repoIdForMail = repoId;
378
+ const repositoryForMail = repoIdForMail ? getRepository(repoIdForMail, controllerHome) : undefined;
379
+ const configuredMailbox = repositoryForMail && repoIdForMail
380
+ ? loadGmailPluginConfig(repositoryForMail.canonicalRoot, { controllerHome, repoId: repoIdForMail }).accountEmail?.trim().toLowerCase()
381
+ : undefined;
382
+ const grant = repoIdForMail && configuredMailbox ? findNotificationGrant(repoIdForMail, {
383
+ kind: 'gmail-mailbox', id: configuredMailbox, identityFingerprint: `gmail-profile:${configuredMailbox}`,
384
+ }) : undefined;
385
+ if (!grant || Date.parse(request.createdAt) <= Date.parse(grant.createdAt)) continue;
386
+ const effectId = typeof request.presentation?.currentState?.effectId === 'string' ? request.presentation.currentState.effectId : undefined;
387
+ const actionLabel = request.actionRequired === 'login' ? '登录授权' : request.actionRequired === 'confirm_destructive' ? '操作确认' : '执行授权';
388
+ await sendSupervisorNotification({
389
+ taskId,
390
+ repoId: repoIdForMail,
391
+ workId,
392
+ ...(bound ? { conversationUrl: bound.conversationUrl } : {}),
393
+ ...(work?.objective ? { objective: work.objective } : {}),
394
+ requestId: notificationRequestId('user-action', request.requestId),
395
+ occurredAt: request.createdAt,
396
+ kind: 'user_action_required',
397
+ subject: `[Forge] 需要处理:${actionLabel}`,
398
+ reason: request.summary,
399
+ effectId,
400
+ userRequestId: request.requestId,
401
+ stillActive: () => listUserRequests(controllerHome, 'pending').some((item) => item.requestId === request.requestId),
402
+ });
403
+ }
404
+
405
+ for (const task of store.listTasks()) {
406
+ const taskId = task.taskId;
407
+ const activity = getDirectActivity(controllerHome, stallActivityId(taskId));
408
+ if (activity?.capabilityId !== 'workflow-supervisor.continuation'
409
+ || activity.status !== 'running'
410
+ || activity.targetScope !== `workflow-supervisor-task:${taskId}`) continue;
411
+ const stall = controlPlane.taskStall(taskId);
412
+ if (!stall || !(stall.state === 'provider_resume_exhausted'
413
+ || (stall.state === 'retryable' && stall.generations >= stall.maxGenerations))) continue;
414
+ const reason = stall.state === 'provider_resume_exhausted'
415
+ ? 'Supervisor 的 provider resume 尝试已确认耗尽;原 effect 仍被保留,不会盲目重发。'
416
+ : `Supervisor 自动派发尝试已确认耗尽(${stall.generations}/${stall.maxGenerations});原 effect 仍被保留,不会盲目重发。`;
417
+ await sendSupervisorNotification({
418
+ taskId,
419
+ requestId: notificationRequestId('stall', taskId, stall.state, stall.effectId),
420
+ occurredAt: activity.startedAt,
421
+ kind: 'continuation_exhausted',
422
+ subject: `[Forge] 自动续跑已耗尽:${taskId}`,
423
+ reason,
424
+ effectId: stall.effectId,
425
+ stillActive: () => {
426
+ const currentActivity = getDirectActivity(controllerHome, stallActivityId(taskId));
427
+ const currentStall = controlPlane.taskStall(taskId);
428
+ if (!currentStall) return false;
429
+ const currentStallExhausted = currentStall.state === 'provider_resume_exhausted'
430
+ || (currentStall.state === 'retryable' && currentStall.generations >= currentStall.maxGenerations);
431
+ return currentActivity?.status === 'running'
432
+ && currentActivity.targetScope === `workflow-supervisor-task:${taskId}`
433
+ && currentStallExhausted
434
+ && currentStall.state === stall.state
435
+ && currentStall.effectId === stall.effectId;
436
+ },
437
+ });
438
+ }
439
+
440
+ for (const task of store.listTasks()) {
441
+ if (store.terminalAction(task.taskId) !== 'NEEDS_USER') continue;
442
+ const completion = store.getLatestCompletion(task.taskId);
443
+ if (!completion || completion.action !== 'NEEDS_USER') continue;
444
+ const repoId = workflowSupervisorContractText(task, 'repo_id');
445
+ const workId = workflowSupervisorContractText(task, 'work_id');
446
+ if (repoId && workId) {
447
+ const work = getWorkContract({ controllerHome, repoId }, workId);
448
+ if (!work || isTerminalSemanticWorkState(work.semanticState)) continue;
449
+ }
450
+ const relatedRequests = allRequests.filter((request) => request.targetScope?.scopeId === task.taskId
451
+ && request.rootCauseKey.startsWith(`workflow-supervisor.transport-human:${task.taskId}:`));
452
+ if (relatedRequests.some((request) => request.status === 'pending')) continue;
453
+ const completionCommittedAt = Date.parse(completion.committedAt);
454
+ if (relatedRequests.some((request) => {
455
+ const resolvedAt = Date.parse(request.resolution?.resolvedAt ?? '');
456
+ return Number.isFinite(resolvedAt) && Number.isFinite(completionCommittedAt) && resolvedAt >= completionCommittedAt;
457
+ })) continue;
458
+ await sendSupervisorNotification({
459
+ taskId: task.taskId,
460
+ requestId: notificationRequestId('terminal-needs-user', task.taskId, completion.completionFingerprint),
461
+ occurredAt: completion.committedAt,
462
+ kind: 'user_action_required',
463
+ subject: `[Forge] 需要人工处理:${task.taskId}`,
464
+ reason: completion.proposal.reason,
465
+ effectId: completion.sourceEffectId,
466
+ stillActive: () => {
467
+ const currentTask = store.getTask(task.taskId);
468
+ const currentCompletion = store.getLatestCompletion(task.taskId);
469
+ if (store.terminalAction(task.taskId) !== 'NEEDS_USER' || currentCompletion?.completionFingerprint !== completion.completionFingerprint) return false;
470
+ const currentRepoId = currentTask ? workflowSupervisorContractText(currentTask, 'repo_id') : undefined;
471
+ const currentWorkId = currentTask ? workflowSupervisorContractText(currentTask, 'work_id') : undefined;
472
+ if (currentRepoId && currentWorkId) {
473
+ const currentWork = getWorkContract({ controllerHome, repoId: currentRepoId }, currentWorkId);
474
+ if (!currentWork || isTerminalSemanticWorkState(currentWork.semanticState)) return false;
475
+ }
476
+ return true;
477
+ },
478
+ });
479
+ }
480
+ })()
481
+ .catch((error) => { process.stderr.write(`[workflow-supervisor-notification-reconcile] ${error instanceof Error ? error.message : String(error)}\\n`); })
482
+ .finally(() => { notificationReconciliationInFlight = undefined; });
483
+ };
484
+ const targetAuthority = createComputerInteractionTargetAuthority(createRuntimeComputerTargetPersistence());
485
+ const extensionTargetPort = new ChromeExtensionChatgptConversationTargetPort(controllerHome, targetAuthority);
486
+ const targetPort = extensionTargetPort;
487
+ const browserConsumerStatus = (): WorkflowSupervisorConsumerStatus => nativeBrowser?.status() ?? {
488
+ enabled: browserAdapterEnabled,
489
+ running: false,
490
+ observedAt: new Date().toISOString(),
491
+ transportFailureStreak: 0,
492
+ providerBackpressureMs: 0,
493
+ stalled: false,
494
+ };
495
+ const server = createWorkflowSupervisorServer({
496
+ controlPlane,
497
+ socketPath,
498
+ discovery,
499
+ browserAdapterEnabled,
500
+ browserConsumerStatus,
501
+ computerExtensionBroker: extensionTargetPort,
502
+ ...(writer ? { writer } : {}),
503
+ });
504
+ const done = once(server, 'close').then(() => undefined);
505
+ await once(server, 'listening');
506
+ let closing = false;
507
+ let reconciliationInFlight: Promise<void> | undefined;
508
+ const reconcileCommittedContinuations = (): void => {
509
+ if (closing || reconciliationInFlight) return;
510
+ reconciliationInFlight = controlPlane.reconcileCommittedContinuations()
511
+ .then(() => { reconcileSupervisorNotifications(); })
512
+ .catch((error) => { process.stderr.write(`[workflow-supervisor-reconcile] ${error instanceof Error ? error.message : String(error)}\\n`); })
513
+ .finally(() => { reconciliationInFlight = undefined; });
514
+ };
515
+ // Reconcile before browser polling starts so a Runtime restart can finish a
516
+ // previously committed CONTINUE without requiring another user/provider turn.
517
+ reconcileCommittedContinuations();
518
+ // Reconciliation is a core Runtime responsibility. Keep this timer referenced
519
+ // for the whole Runtime lifetime instead of treating continuation delivery as
520
+ // best-effort background work.
521
+ const reconciliationTimer = setInterval(reconcileCommittedContinuations, 2_000);
522
+ if (nativeBrowserAdapterEnabled) {
523
+ nativeBrowser = startWorkflowSupervisorNativeBrowserAdapter(controlPlane, discovery, {
524
+ targetPort,
525
+ nowMs: () => Date.now(),
526
+ // Liveness authority for one applied provider turn. Live evidence: these
527
+ // Supervisor turns run for 10-50 minutes, so any quiet window shorter than
528
+ // that reserved duplicate recovery prompts on turns that were still
529
+ // working (60s and then 3 minutes both fired in production). This is the
530
+ // existing bounded maximum, and the digest itself now tracks live turn
531
+ // activity, so the window only elapses on a genuinely silent surface. A
532
+ // real provider failure is classified from provider failure text
533
+ // independently of this threshold.
534
+ providerIdleGraceMs: 10 * 60_000,
535
+ providerScopeKey: controllerHome,
536
+ sleep: async (ms) => { await new Promise((resolve) => setTimeout(resolve, ms)); },
537
+ setInterval: (handler, ms) => setInterval(handler, ms),
538
+ clearInterval: (timer) => clearInterval(timer),
539
+ onError: (error) => { process.stderr.write(`[workflow-supervisor-computer-target] ${error instanceof Error ? error.message : String(error)}\\n`); },
540
+ reportTransportState,
541
+ reportTaskStall,
542
+ requestHumanAction,
543
+ });
544
+ }
545
+ return {
546
+ done,
547
+ async close(): Promise<void> {
548
+ if (closing) return;
549
+ closing = true;
550
+ clearInterval(reconciliationTimer);
551
+ try {
552
+ await reconciliationInFlight?.catch(() => undefined);
553
+ await nativeBrowser?.close().catch(() => undefined);
554
+ if (server.listening) {
555
+ await new Promise<void>((resolve, reject) => {
556
+ server.close((error) => error ? reject(error) : resolve());
557
+ });
558
+ }
559
+ } finally {
560
+ store.close();
561
+ }
562
+ },
563
+ };
564
+ }