@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
@@ -25,6 +25,8 @@ export interface GeneratedCacheRetentionOptions {
25
25
  maxEntries?: number;
26
26
  maxRemovals?: number;
27
27
  processCommands?: string[];
28
+ rootStartIndex?: number;
29
+ scanStartIndex?: number;
28
30
  }
29
31
 
30
32
  export interface GeneratedCacheRetentionReport {
@@ -37,6 +39,19 @@ export interface GeneratedCacheRetentionReport {
37
39
  budgetExhausted: boolean;
38
40
  }
39
41
 
42
+ export interface GeneratedCacheRepositoryRootSet {
43
+ canonicalRoot: string;
44
+ checkouts: ReadonlyArray<{
45
+ localRoot: string;
46
+ worktree: boolean;
47
+ lifecycle?: 'active' | 'removed' | 'archived';
48
+ }>;
49
+ }
50
+
51
+ export interface RepositoryGeneratedCacheRetentionReport extends GeneratedCacheRetentionReport {
52
+ rootsInspected: number;
53
+ }
54
+
40
55
  export type BrowserDisposableArtifactKind = 'screenshots' | 'downloads' | 'diagnostics';
41
56
 
42
57
  export interface BrowserArtifactRetentionOptions {
@@ -81,6 +96,7 @@ export interface XCTestDeviceCleanupReport {
81
96
 
82
97
  interface Candidate {
83
98
  path: string;
99
+ cacheRoot?: string;
84
100
  kind:
85
101
  | 'forge_ios_derived_data'
86
102
  | 'harness_derived_data'
@@ -105,7 +121,7 @@ function pathInside(root: string, path: string): boolean {
105
121
  return rel !== '' && rel !== '..' && !rel.startsWith(`..${sep}`);
106
122
  }
107
123
 
108
- function collectProcessCommands(): string[] {
124
+ function collectProcessCommands(): string[] | undefined {
109
125
  try {
110
126
  return execFileSync('ps', ['-axo', 'command='], {
111
127
  encoding: 'utf8',
@@ -113,7 +129,8 @@ function collectProcessCommands(): string[] {
113
129
  maxBuffer: 2 * 1024 * 1024,
114
130
  }).split('\n').map((line) => line.trim()).filter(Boolean);
115
131
  } catch {
116
- return [];
132
+ // Missing process evidence is not proof that a cache is idle.
133
+ return undefined;
117
134
  }
118
135
  }
119
136
 
@@ -128,6 +145,19 @@ function commandReferencesPath(commands: readonly string[], repoRoot: string, pa
128
145
  || (canonicalRelative && command.includes(canonicalRelative)));
129
146
  }
130
147
 
148
+ function hasSymlinkAncestor(root: string, path: string): boolean {
149
+ const rel = relative(resolve(root), resolve(path));
150
+ if (!rel || rel === '..' || rel.startsWith(`..${sep}`)) return true;
151
+ let current = resolve(root);
152
+ try {
153
+ for (const part of rel.split(sep)) {
154
+ current = join(current, part);
155
+ if (lstatSync(current).isSymbolicLink()) return true;
156
+ }
157
+ return false;
158
+ } catch { return true; }
159
+ }
160
+
131
161
  function containsTrackedFiles(repoRoot: string, path: string): boolean {
132
162
  const rel = relative(resolve(repoRoot), resolve(path));
133
163
  if (!rel || rel === '..' || rel.startsWith(`..${sep}`)) return true;
@@ -144,88 +174,106 @@ function containsTrackedFiles(repoRoot: string, path: string): boolean {
144
174
  }
145
175
  }
146
176
 
147
- function directChildDirectories(root: string, predicate: (name: string) => boolean, budget: { remaining: number }): string[] {
148
- if (!existsSync(root) || budget.remaining <= 0) return [];
177
+ const REBUILDABLE_XCODE_CHILDREN = [
178
+ 'Build', 'ModuleCache.noindex', 'Index.noindex', 'CompilationCache.noindex',
179
+ 'SDKExplicitPrecompiledModules', 'SDKStatCaches.noindex',
180
+ ] as const;
181
+
182
+ function rotatedEntries(root: string, round: number) {
183
+ try {
184
+ const entries = readdirSync(root, { withFileTypes: true }).sort((a, b) => String(a.name).localeCompare(String(b.name)));
185
+ if (entries.length > 1) {
186
+ const offset = ((Math.trunc(round) % entries.length) + entries.length) % entries.length;
187
+ entries.push(...entries.splice(0, offset));
188
+ }
189
+ return entries;
190
+ } catch { return []; }
191
+ }
192
+
193
+ function directChildDirectories(root: string, predicate: (name: string) => boolean, budget: { remaining: number }, round = 0): string[] {
149
194
  const found: string[] = [];
150
- let entries;
151
- try { entries = readdirSync(root, { withFileTypes: true }); } catch { return found; }
152
- for (const entry of entries) {
195
+ if (budget.remaining <= 0) return found;
196
+ for (const entry of rotatedEntries(root, round)) {
153
197
  if (budget.remaining <= 0) break;
154
198
  budget.remaining -= 1;
155
- const name = String(entry.name);
156
- if (entry.isDirectory() && predicate(name)) found.push(join(root, name));
199
+ if (entry.isDirectory() && predicate(String(entry.name))) found.push(join(root, String(entry.name)));
157
200
  }
158
201
  return found;
159
202
  }
160
203
 
161
204
  function directChildFiles(root: string, budget: { remaining: number }): string[] {
162
- if (!existsSync(root) || budget.remaining <= 0) return [];
163
205
  const found: string[] = [];
164
- let entries;
165
- try { entries = readdirSync(root, { withFileTypes: true }); } catch { return found; }
166
- for (const entry of entries) {
206
+ if (budget.remaining <= 0) return found;
207
+ for (const entry of rotatedEntries(root, 0)) {
167
208
  if (budget.remaining <= 0) break;
168
209
  budget.remaining -= 1;
169
- if (entry.isFile()) found.push(join(root, entry.name));
210
+ if (entry.isFile()) found.push(join(root, String(entry.name)));
170
211
  }
171
212
  return found;
172
213
  }
173
214
 
174
- function nestedDerivedDataDirectories(root: string, maxDepth: number, budget: { remaining: number }): string[] {
175
- if (!existsSync(root) || budget.remaining <= 0) return [];
215
+ function isXcodeCacheRoot(root: string): boolean {
216
+ try {
217
+ const info = lstatSync(join(root, 'info.plist'));
218
+ return info.isFile() && !info.isSymbolicLink() && REBUILDABLE_XCODE_CHILDREN.some((name) => {
219
+ try { const stat = lstatSync(join(root, name)); return stat.isDirectory() && !stat.isSymbolicLink(); } catch { return false; }
220
+ });
221
+ } catch { return false; }
222
+ }
223
+
224
+ function nestedDerivedDataDirectories(root: string, maxDepth: number, budget: { remaining: number }, round: number): string[] {
176
225
  const found: string[] = [];
177
- const visit = (dir: string, depth: number): void => {
226
+ const visit = (dir: string, depth: number, visitRound: number): void => {
178
227
  if (depth > maxDepth || budget.remaining <= 0) return;
179
- let entries;
180
- try { entries = readdirSync(dir, { withFileTypes: true }); } catch { return; }
228
+ const entries = rotatedEntries(dir, visitRound);
229
+ // Divide at each level rather than correlating parent/child rotations.
230
+ const childRound = Math.floor(visitRound / Math.max(1, entries.length));
181
231
  for (const entry of entries) {
182
232
  if (budget.remaining <= 0) return;
183
233
  budget.remaining -= 1;
184
- if (!entry.isDirectory()) continue;
185
- const path = join(dir, String(entry.name));
186
- if (String(entry.name) === 'DerivedData') {
187
- found.push(path);
188
- continue;
189
- }
190
- visit(path, depth + 1);
234
+ const name = String(entry.name);
235
+ if (!entry.isDirectory() || ['.git', 'node_modules', 'SourcePackages', 'Logs', ...REBUILDABLE_XCODE_CHILDREN].includes(name) || name.endsWith('.xcresult')) continue;
236
+ const path = join(dir, name);
237
+ if (isXcodeCacheRoot(path)) found.push(path);
238
+ else visit(path, depth + 1, childRound);
191
239
  }
192
240
  };
193
- visit(root, 0);
241
+ visit(root, 0, round);
194
242
  return found;
195
243
  }
196
244
 
197
- function discoverCandidates(repoRoot: string, maxEntries: number): { candidates: Candidate[]; inspected: number; truncated: boolean } {
245
+ function discoverCandidates(repoRoot: string, maxEntries: number, scanRound: number): { candidates: Candidate[]; inspected: number; truncated: boolean } {
198
246
  const root = resolve(repoRoot);
199
247
  const budget = { remaining: Math.max(1, maxEntries) };
200
248
  const initial = budget.remaining;
201
249
  const candidates: Candidate[] = [];
202
-
203
- // Browser artifacts are direct children of small, explicitly owned roots.
204
- // Scan them before recursively walking potentially high-cardinality cache
205
- // trees so cache history cannot starve their retention policy.
206
- for (const path of directChildFiles(join(root, '.forge', 'browser', 'uploads'), budget)) {
207
- candidates.push({ path, kind: 'forge_browser_upload' });
208
- }
209
- for (const path of directChildFiles(join(root, '.forge', 'browser', 'screenshots'), budget)) {
210
- candidates.push({ path, kind: 'forge_browser_screenshot' });
211
- }
212
- for (const path of directChildDirectories(join(root, '.forge', 'ios', 'DerivedData'), () => true, budget)) {
213
- candidates.push({ path, kind: 'forge_ios_derived_data' });
214
- }
215
- for (const path of directChildDirectories(join(root, '.ai', 'harness'), (name) => name.startsWith('deriveddata-'), budget)) {
216
- candidates.push({ path, kind: 'harness_derived_data' });
217
- }
218
- for (const path of nestedDerivedDataDirectories(join(root, '.repo-harness'), 5, budget)) {
219
- candidates.push({ path, kind: 'repo_harness_derived_data' });
220
- }
221
- for (const path of nestedDerivedDataDirectories(join(root, '.tmp'), 6, budget)) {
222
- candidates.push({ path, kind: 'tmp_derived_data' });
250
+ // Preserve browser staging priority. Cache namespace and nested entry rotations
251
+ // use independent visit ordinals, so protected early entries cannot starve peers.
252
+ for (const path of directChildFiles(join(root, '.forge', 'browser', 'uploads'), budget)) candidates.push({ path, kind: 'forge_browser_upload' });
253
+ for (const path of directChildFiles(join(root, '.forge', 'browser', 'screenshots'), budget)) candidates.push({ path, kind: 'forge_browser_screenshot' });
254
+ const namespaces: Array<{ root: string; kind: Candidate['kind']; depth?: number }> = [
255
+ { root: join(root, '.forge', 'ios', 'DerivedData'), kind: 'forge_ios_derived_data' },
256
+ { root: join(root, '.ai', 'harness'), kind: 'harness_derived_data' },
257
+ { root: join(root, '.repo-harness'), kind: 'repo_harness_derived_data', depth: 5 },
258
+ { root: join(root, '.tmp'), kind: 'tmp_derived_data', depth: 6 },
259
+ ];
260
+ const offset = ((Math.trunc(scanRound) % namespaces.length) + namespaces.length) % namespaces.length;
261
+ namespaces.push(...namespaces.splice(0, offset));
262
+ const entryRound = Math.floor(scanRound / namespaces.length);
263
+ for (const namespace of namespaces) {
264
+ const cacheRoots = namespace.depth === undefined
265
+ ? directChildDirectories(namespace.root, () => true, budget, entryRound).filter(isXcodeCacheRoot)
266
+ : nestedDerivedDataDirectories(namespace.root, namespace.depth, budget, entryRound);
267
+ for (const cacheRoot of cacheRoots) {
268
+ // Never remove the bucket: Logs, results, SourcePackages and unknown files
269
+ // are evidence/dependencies, not disposable build cache.
270
+ for (const name of REBUILDABLE_XCODE_CHILDREN) {
271
+ const path = join(cacheRoot, name);
272
+ if (existsSync(path)) candidates.push({ path, kind: namespace.kind, cacheRoot });
273
+ }
274
+ }
223
275
  }
224
- return {
225
- candidates: candidates.filter((candidate, index, values) => values.findIndex((item) => resolve(item.path) === resolve(candidate.path)) === index),
226
- inspected: initial - budget.remaining,
227
- truncated: budget.remaining <= 0,
228
- };
276
+ return { candidates, inspected: initial - budget.remaining, truncated: budget.remaining <= 0 };
229
277
  }
230
278
 
231
279
  function retentionGraceMs(candidate: Candidate, explicitGraceMs: number | undefined): number {
@@ -261,7 +309,7 @@ export function cleanupGeneratedRepositoryCaches(
261
309
  const maxEntries = Math.max(1, Math.floor(options.maxEntries ?? DEFAULT_SCAN_BUDGET));
262
310
  let remainingRemovals = Math.max(1, Math.floor(options.maxRemovals ?? DEFAULT_REMOVAL_BUDGET));
263
311
  const commands = options.processCommands ?? collectProcessCommands();
264
- const discovered = discoverCandidates(repoRoot, maxEntries);
312
+ const discovered = discoverCandidates(repoRoot, maxEntries, options.scanStartIndex ?? 0);
265
313
  const report: GeneratedCacheRetentionReport = {
266
314
  inspected: discovered.inspected,
267
315
  eligible: 0,
@@ -272,26 +320,34 @@ export function cleanupGeneratedRepositoryCaches(
272
320
  budgetExhausted: discovered.truncated,
273
321
  };
274
322
 
323
+ if (commands === undefined) {
324
+ report.errors.push('process_inventory_unavailable: generated-cache reclamation skipped');
325
+ report.skippedByReason.process_inventory_unavailable = 1;
326
+ return report;
327
+ }
275
328
  for (const candidate of discovered.candidates) {
276
329
  const ownedRoot = candidateOwnedRoot(repoRoot, candidate);
277
330
  const fileCandidate = candidate.kind === 'forge_browser_upload' || candidate.kind === 'forge_browser_screenshot';
278
331
  try {
279
332
  const stat = lstatSync(candidate.path);
280
- if ((fileCandidate ? !stat.isFile() : !stat.isDirectory()) || stat.isSymbolicLink() || !pathInside(ownedRoot, candidate.path)) {
333
+ if ((fileCandidate ? !stat.isFile() : !stat.isDirectory()) || stat.isSymbolicLink() || hasSymlinkAncestor(repoRoot, candidate.path) || !pathInside(ownedRoot, candidate.path)) {
281
334
  increment(report.skippedByReason, 'ownership_unproven');
282
335
  report.retainedPaths.push(relative(repoRoot, candidate.path));
283
336
  continue;
284
337
  }
285
- if (nowMs - stat.mtimeMs < retentionGraceMs(candidate, options.graceMs)) {
338
+ const usedAt = candidate.cacheRoot ? Math.max(stat.mtimeMs, lstatSync(candidate.cacheRoot).mtimeMs) : stat.mtimeMs;
339
+ if (nowMs - usedAt < retentionGraceMs(candidate, options.graceMs)) {
286
340
  increment(report.skippedByReason, 'retention_grace');
287
341
  continue;
288
342
  }
289
- if (commandReferencesPath(commands, repoRoot, candidate.path)) {
343
+ if (commandReferencesPath(commands, repoRoot, candidate.cacheRoot ?? candidate.path)
344
+ || (candidate.cacheRoot && commands.some((command) => /(?:^|[/\s])xcodebuild(?:\s|$)/.test(command)
345
+ && !/(?:^|\s)-derivedDataPath(?:\s|=)/.test(command)))) {
290
346
  increment(report.skippedByReason, 'active_process');
291
347
  report.retainedPaths.push(relative(repoRoot, candidate.path));
292
348
  continue;
293
349
  }
294
- if (containsTrackedFiles(repoRoot, candidate.path)) {
350
+ if (containsTrackedFiles(repoRoot, candidate.cacheRoot ?? candidate.path)) {
295
351
  increment(report.skippedByReason, 'tracked_content');
296
352
  report.retainedPaths.push(relative(repoRoot, candidate.path));
297
353
  continue;
@@ -302,6 +358,12 @@ export function cleanupGeneratedRepositoryCaches(
302
358
  increment(report.skippedByReason, 'cleanup_budget_exhausted');
303
359
  continue;
304
360
  }
361
+ // Recheck last-use immediately before removal: discovery and Git probes
362
+ // may overlap a cache reuse that refreshed the bucket after our first stat.
363
+ if (candidate.cacheRoot && lstatSync(candidate.cacheRoot).mtimeMs !== usedAt && nowMs - lstatSync(candidate.cacheRoot).mtimeMs < retentionGraceMs(candidate, options.graceMs)) {
364
+ increment(report.skippedByReason, 'retention_grace');
365
+ continue;
366
+ }
305
367
  remainingRemovals -= 1;
306
368
  rmSync(candidate.path, { recursive: true, force: true });
307
369
  report.removedPaths.push(relative(repoRoot, candidate.path).replace(/\\/g, '/'));
@@ -313,6 +375,90 @@ export function cleanupGeneratedRepositoryCaches(
313
375
  return report;
314
376
  }
315
377
 
378
+ /**
379
+ * Apply the same generated-cache policy to the canonical checkout and every
380
+ * active managed worktree, sharing one scan/removal budget across the whole
381
+ * repository. Work lifecycle is intentionally not cache authority: stale but
382
+ * recoverable Work may keep its source checkout while rebuildable caches age
383
+ * out independently. Active build/test processes are still protected by
384
+ * cleanupGeneratedRepositoryCaches().
385
+ */
386
+ export function cleanupGeneratedRepositoryCheckoutCaches(
387
+ repository: GeneratedCacheRepositoryRootSet,
388
+ options: GeneratedCacheRetentionOptions = {},
389
+ ): RepositoryGeneratedCacheRetentionReport {
390
+ let remainingEntries = Math.max(1, Math.floor(options.maxEntries ?? DEFAULT_SCAN_BUDGET));
391
+ let remainingRemovals = Math.max(1, Math.floor(options.maxRemovals ?? DEFAULT_REMOVAL_BUDGET));
392
+ const processCommands = options.processCommands ?? collectProcessCommands();
393
+ const roots = [
394
+ repository.canonicalRoot,
395
+ ...repository.checkouts
396
+ .filter((checkout) => checkout.worktree && (checkout.lifecycle ?? 'active') === 'active')
397
+ .map((checkout) => checkout.localRoot),
398
+ ].filter((root, index, values) => values.findIndex((item) => canonical(item) === canonical(root)) === index);
399
+ if (roots.length > 1) {
400
+ const offset = ((Math.trunc(options.rootStartIndex ?? 0) % roots.length) + roots.length) % roots.length;
401
+ roots.push(...roots.splice(0, offset));
402
+ }
403
+ const rawRoots = roots.map((root) => resolve(root));
404
+ const canonicalRoots = roots.map((root) => canonical(root));
405
+ const processCommandsForRoot = (root: string): string[] | undefined => {
406
+ const rawRoot = resolve(root);
407
+ const canonicalRoot = canonical(root);
408
+ return processCommands?.filter((command) => {
409
+ const referencedRootIndexes = rawRoots
410
+ .map((candidate, index) => command.includes(candidate) || command.includes(canonicalRoots[index]!) ? index : -1)
411
+ .filter((index) => index >= 0);
412
+ if (referencedRootIndexes.length === 0) return true;
413
+ return referencedRootIndexes.some((index) => rawRoots[index] === rawRoot || canonicalRoots[index] === canonicalRoot);
414
+ });
415
+ };
416
+
417
+ const aggregate: RepositoryGeneratedCacheRetentionReport = {
418
+ rootsInspected: 0,
419
+ inspected: 0,
420
+ eligible: 0,
421
+ removedPaths: [],
422
+ retainedPaths: [],
423
+ skippedByReason: {},
424
+ errors: [],
425
+ budgetExhausted: false,
426
+ };
427
+
428
+ if (processCommands === undefined) {
429
+ aggregate.errors.push('process_inventory_unavailable: generated-cache reclamation skipped');
430
+ aggregate.skippedByReason.process_inventory_unavailable = 1;
431
+ return aggregate;
432
+ }
433
+ for (const root of roots) {
434
+ if (remainingEntries <= 0 || remainingRemovals <= 0) {
435
+ aggregate.budgetExhausted = true;
436
+ break;
437
+ }
438
+ const report = cleanupGeneratedRepositoryCaches(root, {
439
+ ...options,
440
+ processCommands: processCommandsForRoot(root),
441
+ scanStartIndex: options.scanStartIndex ?? Math.floor((options.rootStartIndex ?? 0) / Math.max(1, roots.length)),
442
+ maxEntries: remainingEntries,
443
+ maxRemovals: remainingRemovals,
444
+ });
445
+ aggregate.rootsInspected += 1;
446
+ aggregate.inspected += report.inspected;
447
+ aggregate.eligible += report.eligible;
448
+ aggregate.removedPaths.push(...report.removedPaths.map((path) => `${root}:${path}`));
449
+ aggregate.retainedPaths.push(...report.retainedPaths.map((path) => `${root}:${path}`));
450
+ for (const [reason, count] of Object.entries(report.skippedByReason)) {
451
+ aggregate.skippedByReason[reason] = (aggregate.skippedByReason[reason] ?? 0) + count;
452
+ }
453
+ aggregate.errors.push(...report.errors.map((error) => `${root}:${error}`));
454
+ remainingEntries = Math.max(0, remainingEntries - report.inspected);
455
+ remainingRemovals = Math.max(0, remainingRemovals - report.removedPaths.length);
456
+ aggregate.budgetExhausted ||= report.budgetExhausted;
457
+ }
458
+ if (remainingEntries <= 0 || remainingRemovals <= 0) aggregate.budgetExhausted = true;
459
+ return aggregate;
460
+ }
461
+
316
462
  function emptyBrowserArtifactClassReport(): BrowserArtifactClassRetentionReport {
317
463
  return {
318
464
  inspected: 0,
@@ -469,6 +615,7 @@ export function cleanupIdleXCTestDevices(controllerHome: string): XCTestDeviceCl
469
615
  if (deviceDirectories <= 4) return { attempted: false, removedDevices: 0, skippedReason: 'below_cleanup_threshold' };
470
616
 
471
617
  const commands = collectProcessCommands();
618
+ if (commands === undefined) return { attempted: false, removedDevices: 0, skippedReason: 'process_inventory_unavailable' };
472
619
  if (commands.some((command) => /(?:^|\/)(?:xcodebuild|xctest|swiftc)(?:\s|$)/.test(command))) {
473
620
  return { attempted: false, removedDevices: 0, skippedReason: 'active_xcode_process' };
474
621
  }
@@ -0,0 +1,248 @@
1
+ import { createHash } from 'crypto';
2
+ import type { RepositoryRecord } from '../../../cli/repositories/types';
3
+ import {
4
+ controllerRoundBlockerClass,
5
+ controllerSessionBlocksRecovery,
6
+ getControllerRoundRelay,
7
+ listCurrentControllerRoundRelays,
8
+ getControllerSession,
9
+ getRetainedControllerSession,
10
+ } from '../../../../packages/kernel/controller/api/index';
11
+ import {
12
+ currentTaskSemanticProjectionForWork,
13
+ getWorkContract,
14
+ readActiveWorkCandidates,
15
+ semanticWorkState,
16
+ workSemanticView,
17
+ } from '../../../../packages/kernel/work/api/index';
18
+ import { workHasActiveExecution } from '../../execution/work-activity';
19
+ import { readRequirement } from '../persistence/requirement-store';
20
+ import { assertAutomatedOperationAllowed } from '../governance/external-effects';
21
+ import {
22
+ controllerHostForScheduledBinding,
23
+ ensureScheduledControllerBindingForWork,
24
+ } from '../../root/scheduled-controller-composition';
25
+ import { ensureWorkflowSupervisorEnrollmentForWork } from '../../root/workflow-supervisor-composition';
26
+ import { reconcileControllerProgression } from '../../root/controller-progression-composition';
27
+ import { prepareControllerRoundOccurrence, resumeControllerRoundOccurrence } from '../../../../packages/kernel/controller/api/index';
28
+ import { ensureControllerDispositionContinuation } from '../../workflow/schedules/work-continuation';
29
+ import { deriveForgeActionableFailureCode, maybeRegisterForgeActionableFailureRepair } from '../../diagnostics/incident-repair';
30
+
31
+ const DEFAULT_MAX_CONTINUATIONS = 2;
32
+
33
+ export interface SchedulerAutonomousContinuationResult {
34
+ scanned: number;
35
+ eligible: number;
36
+ dispatched: number;
37
+ supervisorEnrolled: number;
38
+ failed: number;
39
+ skippedByReason: Record<string, number>;
40
+ }
41
+
42
+ export interface SchedulerAutonomousContinuationDependencies {
43
+ hasActiveExecution?: typeof workHasActiveExecution;
44
+ authorizeWake?: typeof assertAutomatedOperationAllowed;
45
+ ensureSupervisorEnrollment?: typeof ensureWorkflowSupervisorEnrollmentForWork;
46
+ hostForBinding?: typeof controllerHostForScheduledBinding;
47
+ ensureBinding?: typeof ensureScheduledControllerBindingForWork;
48
+ prepareOccurrence?: typeof prepareControllerRoundOccurrence;
49
+ resumeOccurrence?: typeof resumeControllerRoundOccurrence;
50
+ }
51
+
52
+ function skip(counts: Record<string, number>, reason: string): void {
53
+ counts[reason] = (counts[reason] ?? 0) + 1;
54
+ }
55
+
56
+ function planlessOccurrenceId(workId: string, semanticRevision: number): string {
57
+ const digest = createHash('sha256').update(workId + '\0semantic:' + semanticRevision).digest('hex').slice(0, 32);
58
+ return 'work-liveness:v2:' + digest;
59
+ }
60
+
61
+ function livenessMayReconcileExistingRound(record: ReturnType<typeof getControllerRoundRelay>): boolean {
62
+ if (!record) return true;
63
+ if (record.status === 'pending_release' || record.status === 'claimed') return true;
64
+ if (record.status === 'waiting') return true;
65
+ if (record.status === 'dispatching') return !record.providerDispatchStartedAt;
66
+ if (record.status === 'dispatched') return true;
67
+ return record.status === 'blocked' && controllerRoundBlockerClass(record) === 'provider_dispatch_outcome_unknown';
68
+ }
69
+
70
+ /**
71
+ * Single Scheduler liveness scanner. Scheduler selects only which open Work
72
+ * needs another mechanical opportunity; reconcileControllerProgression owns the
73
+ * stateless composition of existing authorities.
74
+ */
75
+ export async function runSchedulerAutonomousContinuationReconciliation(input: {
76
+ controllerHome: string;
77
+ nowMs: number;
78
+ repositories: readonly Pick<RepositoryRecord, 'repoId' | 'canonicalRoot' | 'localRoot'>[];
79
+ maxContinuations?: number;
80
+ dependencies?: SchedulerAutonomousContinuationDependencies;
81
+ }): Promise<SchedulerAutonomousContinuationResult> {
82
+ const maxContinuations = Math.max(1, Math.min(Math.trunc(input.maxContinuations ?? DEFAULT_MAX_CONTINUATIONS), 8));
83
+ const hasActiveExecution = input.dependencies?.hasActiveExecution ?? workHasActiveExecution;
84
+ const authorizeWake = input.dependencies?.authorizeWake ?? assertAutomatedOperationAllowed;
85
+
86
+ let scanned = 0;
87
+ let eligible = 0;
88
+ let dispatched = 0;
89
+ let supervisorEnrolled = 0;
90
+ let failed = 0;
91
+ let materialized = 0;
92
+ const skippedByReason: Record<string, number> = {};
93
+
94
+ for (const repository of input.repositories) {
95
+ if (materialized >= maxContinuations) break;
96
+ const store = { controllerHome: input.controllerHome, repoId: repository.repoId };
97
+ let works: ReturnType<typeof readActiveWorkCandidates>['contracts'];
98
+ try {
99
+ const active = readActiveWorkCandidates({ ...store, limit: 100 });
100
+ const candidates = new Map(active.contracts.map((work) => [work.workId, work]));
101
+ for (const invalid of active.invalid) {
102
+ skip(skippedByReason, 'invalid_work_contract');
103
+ console.error('[forge liveness] skipped invalid Work authority ' + repository.repoId + '/' + invalid.workId + ': ' + invalid.error);
104
+ }
105
+ // Semantic Work authority is Forge-scoped; the repository list is only
106
+ // an execution projection. Existing relay references must use the same
107
+ // canonical lookup as launcher admission, never infer deletion from a list.
108
+ for (const relay of listCurrentControllerRoundRelays(store, 100)) {
109
+ try {
110
+ const work = getWorkContract(store, relay.originWorkId);
111
+ if (work) candidates.set(work.workId, work);
112
+ } catch (error) {
113
+ skip(skippedByReason, 'invalid_relay_work_contract');
114
+ console.error('[forge liveness] skipped invalid relay Work authority ' + repository.repoId + '/' + relay.originWorkId + ':', error);
115
+ }
116
+ }
117
+ works = [...candidates.values()];
118
+ } catch (error) {
119
+ failed += 1;
120
+ console.error('[forge liveness] failed to read current Work authority for ' + repository.repoId + ':', error);
121
+ continue;
122
+ }
123
+
124
+ for (const work of works) {
125
+ if (materialized >= maxContinuations) break;
126
+ scanned += 1;
127
+ if (semanticWorkState(work) !== 'open') { skip(skippedByReason, 'semantic_work_terminal'); continue; }
128
+ if (hasActiveExecution(input.controllerHome, repository.repoId, work.workId)) { skip(skippedByReason, 'active_execution'); continue; }
129
+
130
+ const liveOwner = getControllerSession(store, work.workId);
131
+ if (liveOwner && controllerSessionBlocksRecovery(store, work.workId, { nowMs: input.nowMs })) {
132
+ skip(skippedByReason, 'active_controller_session');
133
+ continue;
134
+ }
135
+
136
+ const currentTask = currentTaskSemanticProjectionForWork(work);
137
+ const relayScopeId = currentTask.requirementId ? 'requirement:' + currentTask.requirementId : undefined;
138
+ const continuationHint = 'Resume exact Work ' + currentTask.workId + '; scheduler observed no active execution or live Controller owner and no unresolved semantic blocker.';
139
+
140
+ const requirementRecord = work.requirementId
141
+ ? readRequirement({ controllerHome: input.controllerHome }, work.requirementId)
142
+ : undefined;
143
+ if (work.requirementId && !requirementRecord) { skip(skippedByReason, 'requirement_missing'); continue; }
144
+ const requirementState = requirementRecord?.value.state;
145
+ if (requirementState === 'waiting_for_user') { skip(skippedByReason, 'requirement_waiting_for_user'); continue; }
146
+ if (requirementState === 'done' || requirementState === 'cancelled') { skip(skippedByReason, 'requirement:' + requirementState); continue; }
147
+
148
+ const existingRound = getControllerRoundRelay(store, work.workId);
149
+ if (!livenessMayReconcileExistingRound(existingRound)) {
150
+ skip(skippedByReason, `controller_round_${existingRound!.status}`);
151
+ continue;
152
+ }
153
+ const occurrenceId = existingRound?.occurrenceId
154
+ ?? planlessOccurrenceId(work.workId, workSemanticView(work).revision);
155
+
156
+ const retainedSession = getRetainedControllerSession(store, work.workId);
157
+ if (!retainedSession) { skip(skippedByReason, 'retained_controller_session_missing'); continue; }
158
+ if (retainedSession.controllerType === 'human') { skip(skippedByReason, 'human_controller'); continue; }
159
+
160
+ eligible += 1;
161
+ try {
162
+ authorizeWake('external_controller_wake', {
163
+ work_id: work.workId,
164
+ controller_type: retainedSession.controllerType,
165
+ relay_scope_id: relayScopeId,
166
+ recovery_reason: 'ownerless_work_ready_to_continue',
167
+ });
168
+
169
+ const progression = await reconcileControllerProgression(
170
+ {
171
+ controllerHome: input.controllerHome,
172
+ repoId: repository.repoId,
173
+ repoRoot: repository.canonicalRoot ?? repository.localRoot,
174
+ },
175
+ {
176
+ occurrenceId,
177
+ workId: work.workId,
178
+ relayScopeId,
179
+ continuationHint,
180
+ scheduleName: 'autonomous-work-liveness',
181
+ },
182
+ {
183
+ ...(input.dependencies?.ensureSupervisorEnrollment
184
+ ? { ensureSupervisorEnrollment: input.dependencies.ensureSupervisorEnrollment }
185
+ : {}),
186
+ ...(input.dependencies?.ensureBinding ? { ensureBinding: input.dependencies.ensureBinding } : {}),
187
+ ...(input.dependencies?.prepareOccurrence ? { prepareOccurrence: input.dependencies.prepareOccurrence } : {}),
188
+ ...(input.dependencies?.resumeOccurrence ? { resumeOccurrence: input.dependencies.resumeOccurrence } : {}),
189
+ ...(input.dependencies?.hostForBinding ? { hostForBinding: input.dependencies.hostForBinding } : {}),
190
+ },
191
+ );
192
+
193
+ if (progression.status === 'chatgpt_enrolled') {
194
+ supervisorEnrolled += 1;
195
+ materialized += 1;
196
+ continue;
197
+ }
198
+ if (progression.status === 'provider_dispatched') {
199
+ // The occurrence identity is the dedupe fence. A reused dispatched
200
+ // relay is already complete; reporting it as a fresh dispatch makes
201
+ // repeated scheduler scans look like new progress even though no
202
+ // provider call occurred.
203
+ if (progression.reused) {
204
+ skip(skippedByReason, 'controller_progression:already_dispatched');
205
+ continue;
206
+ }
207
+ dispatched += 1;
208
+ materialized += 1;
209
+ continue;
210
+ }
211
+ if (progression.status === 'wait_for_user') {
212
+ const settledRound = getControllerRoundRelay(store, work.workId);
213
+ if (settledRound?.status === 'waiting_for_user' && settledRound.handoffId) {
214
+ ensureControllerDispositionContinuation(input.controllerHome, repository.repoId, settledRound);
215
+ }
216
+ }
217
+ if (progression.status === 'chatgpt_not_enrolled') {
218
+ skip(skippedByReason, 'workflow_supervisor:' + progression.supervisorEnrollment.status);
219
+ } else {
220
+ skip(skippedByReason, 'controller_progression:' + progression.status);
221
+ }
222
+ } catch (error) {
223
+ failed += 1;
224
+ const reason = error instanceof Error ? error.message : String(error);
225
+ if (retainedSession.controllerType !== 'chatgpt') {
226
+ try {
227
+ maybeRegisterForgeActionableFailureRepair({
228
+ controllerHome: input.controllerHome,
229
+ now: () => input.nowMs,
230
+ observation: {
231
+ observationId: `progression:liveness:${repository.repoId}:${work.workId}:${input.nowMs}`,
232
+ source: 'progression',
233
+ code: deriveForgeActionableFailureCode('SCHEDULER_AUTONOMOUS_CONTINUATION_FAILED', reason),
234
+ message: reason,
235
+ at: new Date(input.nowMs).toISOString(),
236
+ repoId: repository.repoId,
237
+ workId: work.workId,
238
+ },
239
+ });
240
+ } catch {}
241
+ }
242
+ console.error('[forge liveness] autonomous continuation failed for ' + repository.repoId + '/' + work.workId + ':', reason);
243
+ }
244
+ }
245
+ }
246
+
247
+ return { scanned, eligible, dispatched, supervisorEnrolled, failed, skippedByReason };
248
+ }
@@ -5,7 +5,7 @@ import {
5
5
  import { tickSchedules } from '../../workflow/schedules/engine';
6
6
  import type { ExecutionJob } from '../../execution/jobs/types';
7
7
 
8
- const SCHEDULE_TICK_INTERVAL_MS = 30_000;
8
+ export const SCHEDULE_TICK_INTERVAL_MS = 30_000;
9
9
 
10
10
  export function schedulerDurableAdmissionRequiresPolicy(input: {
11
11
  activeJobs: readonly ExecutionJob[];