@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
@@ -26,6 +26,14 @@ export interface TypeScriptNavigationResult {
26
26
  locations: TypeScriptNavigationLocation[];
27
27
  }
28
28
 
29
+ export interface TypeScriptSourceSymbolRange {
30
+ startLine: number;
31
+ endLine: number;
32
+ kind: string;
33
+ name?: string;
34
+ enclosing?: string;
35
+ }
36
+
29
37
  export interface TypeScriptNavigationAccess {
30
38
  /** Stable identity for one read-policy scope. Restricted and unrestricted projects must never share a Language Service. */
31
39
  cacheScope: string;
@@ -38,11 +46,13 @@ export interface TypeScriptNavigationAccess {
38
46
  interface CachedProject {
39
47
  repoRoot: string;
40
48
  configPath: string;
49
+ configVersion: string;
50
+ sourceIdentity: string;
41
51
  service: ts.LanguageService;
42
52
  }
43
53
 
44
54
  const projects = new Map<string, CachedProject>();
45
- const MAX_CACHED_TYPESCRIPT_PROJECTS = 32;
55
+ const MAX_CACHED_TYPESCRIPT_PROJECTS = 1;
46
56
 
47
57
  function normalizePath(path: string): string {
48
58
  return path.replace(/\\/g, '/');
@@ -71,13 +81,19 @@ function loadProject(repoRoot: string, tsconfigPath = 'tsconfig.json', access?:
71
81
  if (access && !access.allowRepositoryPath(configRelative)) {
72
82
  throw new Error(`TypeScript navigation tsconfig is denied by read policy: ${configRelative}.`);
73
83
  }
74
- const cacheKey = `${root}\0${configPath}\0${scriptVersion(configPath)}\0${access?.cacheScope ?? 'unrestricted'}\0${access?.sourceIdentity ?? 'unbound-source'}`;
84
+ const configVersion = scriptVersion(configPath);
85
+ const sourceIdentity = access?.sourceIdentity ?? 'unbound-source';
86
+ const cacheKey = `${root}\0${configPath}\0${access?.cacheScope ?? 'unrestricted'}`;
75
87
  const cached = projects.get(cacheKey);
76
- if (cached) {
88
+ if (cached && cached.configVersion === configVersion && cached.sourceIdentity === sourceIdentity) {
77
89
  projects.delete(cacheKey);
78
90
  projects.set(cacheKey, cached);
79
91
  return cached;
80
92
  }
93
+ if (cached) {
94
+ projects.delete(cacheKey);
95
+ cached.service.dispose();
96
+ }
81
97
 
82
98
  const canReadAbsolute = (fileName: string): boolean => {
83
99
  if (!access) return true;
@@ -129,6 +145,8 @@ function loadProject(repoRoot: string, tsconfigPath = 'tsconfig.json', access?:
129
145
  const project = {
130
146
  repoRoot: root,
131
147
  configPath,
148
+ configVersion,
149
+ sourceIdentity,
132
150
  service: ts.createLanguageService(host, ts.createDocumentRegistry()),
133
151
  };
134
152
  projects.set(cacheKey, project);
@@ -176,6 +194,70 @@ function location(
176
194
  };
177
195
  }
178
196
 
197
+ function sourceScriptKind(path: string): ts.ScriptKind | undefined {
198
+ if (/\.tsx$/i.test(path)) return ts.ScriptKind.TSX;
199
+ if (/\.jsx$/i.test(path)) return ts.ScriptKind.JSX;
200
+ if (/\.(?:mts|cts|ts)$/i.test(path)) return ts.ScriptKind.TS;
201
+ if (/\.(?:mjs|cjs|js)$/i.test(path)) return ts.ScriptKind.JS;
202
+ return undefined;
203
+ }
204
+
205
+ function sourceDeclarationName(node: ts.Node): string | undefined {
206
+ const named = node as ts.Node & { name?: ts.Node };
207
+ return named.name ? named.name.getText().slice(0, 200) : undefined;
208
+ }
209
+
210
+ function sourceDeclarationKind(node: ts.Node): string | undefined {
211
+ if (ts.isFunctionDeclaration(node)) return 'function';
212
+ if (ts.isMethodDeclaration(node)) return 'method';
213
+ if (ts.isConstructorDeclaration(node)) return 'constructor';
214
+ if (ts.isGetAccessorDeclaration(node)) return 'getter';
215
+ if (ts.isSetAccessorDeclaration(node)) return 'setter';
216
+ if (ts.isClassDeclaration(node) || ts.isClassExpression(node)) return 'class';
217
+ if (ts.isInterfaceDeclaration(node)) return 'interface';
218
+ if (ts.isTypeAliasDeclaration(node)) return 'type';
219
+ if (ts.isEnumDeclaration(node)) return 'enum';
220
+ if (ts.isModuleDeclaration(node)) return 'module';
221
+ if (ts.isVariableStatement(node) && node.declarationList.declarations.some((declaration) =>
222
+ declaration.initializer && (ts.isArrowFunction(declaration.initializer) || ts.isFunctionExpression(declaration.initializer)))) return 'function-variable';
223
+ return undefined;
224
+ }
225
+
226
+ function sourceEnclosingName(node: ts.Node): string | undefined {
227
+ let current = node.parent;
228
+ while (current) {
229
+ if (ts.isClassDeclaration(current) || ts.isClassExpression(current) || ts.isInterfaceDeclaration(current) || ts.isModuleDeclaration(current)) {
230
+ const kind = sourceDeclarationKind(current) ?? 'container';
231
+ const name = sourceDeclarationName(current);
232
+ return name ? `${kind}:${name}` : kind;
233
+ }
234
+ current = current.parent;
235
+ }
236
+ return undefined;
237
+ }
238
+
239
+ export function extractTypeScriptSourceSymbols(path: string, source: string): TypeScriptSourceSymbolRange[] {
240
+ const kind = sourceScriptKind(path);
241
+ if (kind === undefined) return [];
242
+ const sourceFile = ts.createSourceFile(path, source, ts.ScriptTarget.Latest, true, kind);
243
+ const declarations: TypeScriptSourceSymbolRange[] = [];
244
+ const visit = (node: ts.Node): void => {
245
+ const declarationKind = sourceDeclarationKind(node);
246
+ if (declarationKind) {
247
+ declarations.push({
248
+ startLine: sourceFile.getLineAndCharacterOfPosition(node.getStart(sourceFile)).line + 1,
249
+ endLine: sourceFile.getLineAndCharacterOfPosition(node.end).line + 1,
250
+ kind: declarationKind,
251
+ ...(sourceDeclarationName(node) ? { name: sourceDeclarationName(node) } : {}),
252
+ ...(sourceEnclosingName(node) ? { enclosing: sourceEnclosingName(node) } : {}),
253
+ });
254
+ }
255
+ ts.forEachChild(node, visit);
256
+ };
257
+ visit(sourceFile);
258
+ return declarations;
259
+ }
260
+
179
261
  function dedupe(locations: TypeScriptNavigationLocation[]): TypeScriptNavigationLocation[] {
180
262
  const seen = new Set<string>();
181
263
  return locations.filter((entry) => {
@@ -220,6 +302,10 @@ export function navigateTypeScriptSymbol(
220
302
  };
221
303
  }
222
304
 
305
+ export function typeScriptNavigationCachedProjectCount(): number {
306
+ return projects.size;
307
+ }
308
+
223
309
  export function clearTypeScriptNavigationCache(): void {
224
310
  for (const project of projects.values()) project.service.dispose();
225
311
  projects.clear();
@@ -1,4 +1,4 @@
1
- import { existsSync, readdirSync, rmSync, statSync } from 'fs';
1
+ import { existsSync, lstatSync, readdirSync, rmdirSync, rmSync, statSync } from 'fs';
2
2
  import { spawnSync } from 'child_process';
3
3
  import { join, relative, resolve } from 'path';
4
4
  import { repositoryControllerRoot } from '../../cli/repositories/controller-home';
@@ -37,6 +37,8 @@ export interface CleanupArtifactRetentionOptions {
37
37
  graceMs?: number;
38
38
  maxEntries?: number;
39
39
  maxRemovals?: number;
40
+ scanSequence?: number;
41
+ repositoryIds?: readonly string[];
40
42
  }
41
43
 
42
44
  export interface CleanupArtifactRetentionReport {
@@ -105,14 +107,14 @@ function treeEntry(root: string, ref: string, path: string): string | undefined
105
107
 
106
108
  export function proveWorkPreservationContained(
107
109
  repositoryRoot: string,
108
- handle: Pick<WorkHandleState, 'baseCommit' | 'deliveryBaseCommit' | 'expectedHead' | 'cleanupReceipt'>,
110
+ handle: Pick<WorkHandleState, 'baseCommit' | 'deliveryBaseCommit'>,
109
111
  targetBranch: string,
112
+ protectedCandidate: string | undefined,
110
113
  ): WorkPreservationContainmentProof {
111
114
  const base = workDeliveryBaseRevision(handle);
112
115
  if (!base || !revision(repositoryRoot, base)) {
113
116
  return { contained: false, reason: 'base_revision_unavailable', comparedPaths: [] };
114
117
  }
115
- const protectedCandidate = handle.cleanupReceipt?.preservation.checkpointCommit?.trim() || handle.expectedHead?.trim();
116
118
  if (!protectedCandidate) {
117
119
  return { contained: false, reason: 'protected_revision_unavailable', comparedPaths: [] };
118
120
  }
@@ -190,6 +192,48 @@ function retentionTimestamp(receipt: WorkCleanupReceipt, bundlePath: string): nu
190
192
  }
191
193
  }
192
194
 
195
+ function bundleProtectedRevision(repositoryRoot: string, bundlePath: string): string | undefined {
196
+ if (!git(repositoryRoot, ['bundle', 'verify', bundlePath]).ok) return undefined;
197
+ const heads = git(repositoryRoot, ['bundle', 'list-heads', bundlePath]);
198
+ if (!heads.ok) return undefined;
199
+ const revisions = [...new Set(heads.stdout.split('\n').map((line) => line.trim().split(/\s+/, 1)[0]).filter((value) => /^[a-f0-9]{40,64}$/i.test(value ?? '')))];
200
+ return revisions.length === 1 ? revisions[0] : undefined;
201
+ }
202
+
203
+ function proveOrphanBundleContained(
204
+ repositoryRoot: string,
205
+ bundlePath: string,
206
+ targetBranch: string,
207
+ ): { contained: boolean; reason: string } {
208
+ const protectedRevision = bundleProtectedRevision(repositoryRoot, bundlePath);
209
+ if (!protectedRevision) return { contained: false, reason: 'orphan_bundle_invalid_or_ambiguous' };
210
+ if (!revision(repositoryRoot, protectedRevision)) {
211
+ return { contained: false, reason: 'orphan_protected_revision_unavailable' };
212
+ }
213
+ const targetRevision = revision(repositoryRoot, `refs/heads/${targetBranch}`);
214
+ if (!targetRevision) return { contained: false, reason: 'orphan_target_revision_unavailable' };
215
+ const remoteRevision = revision(repositoryRoot, `refs/remotes/origin/${targetBranch}`);
216
+ if (!remoteRevision) return { contained: false, reason: 'orphan_remote_revision_unavailable' };
217
+ // Anchor the inferred delta against the durable remote target. Using the
218
+ // local target here could collapse the delta to empty when only the local
219
+ // branch contains the preserved tip, falsely treating an undelivered bundle
220
+ // as redundant.
221
+ const base = git(repositoryRoot, ['merge-base', protectedRevision, remoteRevision]);
222
+ if (!base.ok || !base.stdout) return { contained: false, reason: 'orphan_merge_base_unavailable' };
223
+ const paths = changedPaths(repositoryRoot, base.stdout, protectedRevision);
224
+ if (!paths) return { contained: false, reason: 'orphan_diff_unavailable' };
225
+ for (const path of paths) {
226
+ const protectedEntry = treeEntry(repositoryRoot, protectedRevision, path);
227
+ const targetEntry = treeEntry(repositoryRoot, targetRevision, path);
228
+ const remoteEntry = treeEntry(repositoryRoot, remoteRevision, path);
229
+ if (protectedEntry === undefined || targetEntry === undefined || remoteEntry === undefined
230
+ || protectedEntry !== targetEntry || protectedEntry !== remoteEntry) {
231
+ return { contained: false, reason: 'orphan_content_mismatch' };
232
+ }
233
+ }
234
+ return { contained: true, reason: paths.length === 0 ? 'orphan_no_source_delta' : 'orphan_target_and_remote_content_contained' };
235
+ }
236
+
193
237
  function retirementFromProof(
194
238
  proof: WorkPreservationContainmentProof,
195
239
  status: 'eligible' | 'removed' | 'not_needed',
@@ -232,27 +276,36 @@ export function cleanupWorkPreservationArtifacts(
232
276
  const repositoriesRoot = join(controllerHome, 'repositories');
233
277
  let repositoryIds: string[] = [];
234
278
  try {
279
+ const repositoryFilter = options.repositoryIds ? new Set(options.repositoryIds.map((id) => id.trim()).filter(Boolean)) : undefined;
235
280
  repositoryIds = readdirSync(repositoriesRoot, { withFileTypes: true })
236
- .filter((entry) => entry.isDirectory())
281
+ .filter((entry) => entry.isDirectory() && (!repositoryFilter || repositoryFilter.has(entry.name)))
237
282
  .map((entry) => entry.name)
238
283
  .sort();
239
284
  } catch {
240
285
  return report;
241
286
  }
287
+ const scanSequence = Math.trunc(options.scanSequence ?? Math.floor(nowMs / 60_000));
288
+ if (repositoryIds.length > 1) {
289
+ const offset = ((scanSequence % repositoryIds.length) + repositoryIds.length) % repositoryIds.length;
290
+ repositoryIds.push(...repositoryIds.splice(0, offset));
291
+ }
292
+ let handleInspected = 0;
293
+ let physicalInspected = 0;
242
294
 
243
- outer: for (const repositoryId of repositoryIds) {
295
+ for (const repositoryId of repositoryIds) {
244
296
  let repository;
245
297
  try {
246
298
  repository = getRepository(repositoryId, controllerHome, { includeRemoved: true });
247
299
  } catch {
248
300
  continue;
249
301
  }
250
- for (let handle of listWorkHandles(controllerHome, repositoryId)) {
251
- if (report.inspected >= maxEntries) {
252
- report.budgetExhausted = true;
253
- break outer;
254
- }
255
- report.inspected += 1;
302
+ const repositoryHandles = listWorkHandles(controllerHome, repositoryId)
303
+ .sort((left, right) => left.workId.localeCompare(right.workId));
304
+ if (repositoryHandles.length > 1) {
305
+ const offset = ((scanSequence % repositoryHandles.length) + repositoryHandles.length) % repositoryHandles.length;
306
+ repositoryHandles.push(...repositoryHandles.splice(0, offset));
307
+ }
308
+ for (let handle of repositoryHandles) {
256
309
  const receipt = handle.cleanupReceipt;
257
310
  const bundlePath = receipt?.preservation.bundlePath;
258
311
  const retirement = receipt?.preservation.bundleRetirement;
@@ -265,6 +318,12 @@ export function cleanupWorkPreservationArtifacts(
265
318
  }
266
319
  }
267
320
  if (!receipt || !bundlePath) continue;
321
+ if (handleInspected >= maxEntries) {
322
+ report.budgetExhausted = true;
323
+ break;
324
+ }
325
+ handleInspected += 1;
326
+ report.inspected += 1;
268
327
  const expectedPath = resolve(expectedBundlePath(controllerHome, handle));
269
328
  if (resolve(bundlePath) !== expectedPath) {
270
329
  report.retained += 1;
@@ -277,7 +336,7 @@ export function cleanupWorkPreservationArtifacts(
277
336
  skip(report, 'retention_grace');
278
337
  continue;
279
338
  }
280
- const proof = proveWorkPreservationContained(repository.canonicalRoot, handle, receipt.targetBranch);
339
+ const proof = proveWorkPreservationContained(repository.canonicalRoot, handle, receipt.targetBranch, bundleProtectedRevision(repository.canonicalRoot, bundlePath));
281
340
  if (!proof.contained) {
282
341
  report.retained += 1;
283
342
  skip(report, `containment_${proof.reason}`);
@@ -303,6 +362,7 @@ export function cleanupWorkPreservationArtifacts(
303
362
  handle = writeWorkHandle(controllerHome, { ...handle, cleanupReceipt: eligibleReceipt, updatedAt: nowIso });
304
363
  const measurement = existsSync(bundlePath) ? measureReclaimablePath(bundlePath) : { bytes: 0, entries: 0, complete: true };
305
364
  if (existsSync(bundlePath)) rmSync(bundlePath, { force: true });
365
+ try { rmdirSync(join(bundlePath, '..')); } catch { /* Preserve non-empty or concurrently changed directories. */ }
306
366
  if (measurement.complete) report.reclaimedBytes += measurement.bytes;
307
367
  else report.unknownReclaimedByteCount += 1;
308
368
  const currentReceipt = handle.cleanupReceipt!;
@@ -323,6 +383,149 @@ export function cleanupWorkPreservationArtifacts(
323
383
  report.errors.push(`${handle.workId}: ${error instanceof Error ? error.message : String(error)}`);
324
384
  }
325
385
  }
386
+
387
+ // WorkHandle metadata is not physical-retention authority. Discover direct
388
+ // preservation directories as well so a missing or drifted handle cannot
389
+ // make an owned bundle immortal. This pass remains fail-closed: only the
390
+ // canonical direct child containing exactly branch.bundle is considered;
391
+ // symlinks and extra content are retained, and source containment still
392
+ // requires proof.
393
+ const artifactRoot = join(repositoryControllerRoot(controllerHome, repositoryId), 'cleanup-artifacts');
394
+ let artifactEntries;
395
+ try {
396
+ if (!lstatSync(artifactRoot).isDirectory()) continue;
397
+ artifactEntries = readdirSync(artifactRoot, { withFileTypes: true })
398
+ .sort((left, right) => left.name.localeCompare(right.name));
399
+ if (artifactEntries.length > 1) {
400
+ const offset = ((scanSequence % artifactEntries.length) + artifactEntries.length) % artifactEntries.length;
401
+ artifactEntries.push(...artifactEntries.splice(0, offset));
402
+ }
403
+ } catch {
404
+ continue;
405
+ }
406
+ const physicalHandles = repositoryHandles;
407
+ const handles = new Map(physicalHandles.map((handle) => [handle.workId, handle]));
408
+ const referencedBundlePaths = new Set(physicalHandles.flatMap((handle) => {
409
+ const path = handle.cleanupReceipt?.preservation.bundlePath;
410
+ return path ? [resolve(path)] : [];
411
+ }));
412
+ for (const entry of artifactEntries) {
413
+ if (!entry.isDirectory()) continue;
414
+ const directoryPath = join(artifactRoot, entry.name);
415
+ const handle = handles.get(entry.name);
416
+ const canonicalBundlePath = resolve(join(directoryPath, 'branch.bundle'));
417
+ if (referencedBundlePaths.has(canonicalBundlePath)) continue;
418
+ if (physicalInspected >= maxEntries) {
419
+ report.budgetExhausted = true;
420
+ break;
421
+ }
422
+ physicalInspected += 1;
423
+ report.inspected += 1;
424
+ let contents: string[];
425
+ let bundlePath: string;
426
+ try {
427
+ contents = readdirSync(directoryPath).sort();
428
+ if (contents.length !== 1 || contents[0] !== 'branch.bundle') {
429
+ report.retained += 1;
430
+ skip(report, 'physical_bundle_unrecognized_content');
431
+ continue;
432
+ }
433
+ bundlePath = join(directoryPath, 'branch.bundle');
434
+ const bundleStat = lstatSync(bundlePath);
435
+ if (!bundleStat.isFile() || bundleStat.isSymbolicLink()) {
436
+ report.retained += 1;
437
+ skip(report, 'physical_bundle_unrecognized_content');
438
+ continue;
439
+ }
440
+ } catch (error) {
441
+ report.retained += 1;
442
+ skip(report, 'physical_bundle_unreadable');
443
+ report.errors.push(`${repositoryId}:${entry.name}: ${error instanceof Error ? error.message : String(error)}`);
444
+ continue;
445
+ }
446
+ if (handle?.cleanupReceipt?.preservation.bundlePath
447
+ && resolve(handle.cleanupReceipt.preservation.bundlePath) !== resolve(bundlePath)) {
448
+ report.retained += 1;
449
+ skip(report, 'bundle_metadata_conflict');
450
+ continue;
451
+ }
452
+ let timestamp: number | undefined;
453
+ try {
454
+ timestamp = handle?.cleanupReceipt
455
+ ? retentionTimestamp(handle.cleanupReceipt, bundlePath)
456
+ : statSync(bundlePath).mtimeMs;
457
+ } catch (error) {
458
+ report.retained += 1;
459
+ skip(report, 'physical_bundle_unreadable');
460
+ report.errors.push(`${repositoryId}:${entry.name}: ${error instanceof Error ? error.message : String(error)}`);
461
+ continue;
462
+ }
463
+ if (timestamp === undefined || nowMs - timestamp < graceMs) {
464
+ report.retained += 1;
465
+ skip(report, 'retention_grace');
466
+ continue;
467
+ }
468
+
469
+ const receipt = handle?.cleanupReceipt;
470
+ const handleProof = handle && receipt?.complete
471
+ ? proveWorkPreservationContained(repository.canonicalRoot, handle, receipt.targetBranch, bundleProtectedRevision(repository.canonicalRoot, bundlePath))
472
+ : undefined;
473
+ const orphanProof = !handle && repository.defaultBranch
474
+ ? proveOrphanBundleContained(repository.canonicalRoot, bundlePath, repository.defaultBranch)
475
+ : undefined;
476
+ if (handle && (!receipt?.complete || !handleProof?.contained)) {
477
+ report.retained += 1;
478
+ skip(report, !receipt?.complete ? 'physical_bundle_incomplete_handle' : `containment_${handleProof!.reason}`);
479
+ continue;
480
+ }
481
+ if (!handle && !orphanProof?.contained) {
482
+ report.retained += 1;
483
+ skip(report, orphanProof?.reason ?? (repository.defaultBranch
484
+ ? 'orphan_source_containment_unproven'
485
+ : 'orphan_target_branch_unavailable'));
486
+ continue;
487
+ }
488
+ report.eligible += 1;
489
+ if (remaining <= 0) {
490
+ report.budgetExhausted = true;
491
+ skip(report, 'cleanup_budget_exhausted');
492
+ continue;
493
+ }
494
+ report.attempted += 1;
495
+ remaining -= 1;
496
+ try {
497
+ const measurement = measureReclaimablePath(bundlePath);
498
+ if (handle && receipt && handleProof) {
499
+ const eligibleReceipt: WorkCleanupReceipt = {
500
+ ...receipt,
501
+ preservation: { ...receipt.preservation, bundlePath, bundleRetirement: retirementFromProof(handleProof, 'eligible', nowIso) },
502
+ updatedAt: nowIso,
503
+ };
504
+ const updated = writeWorkHandle(controllerHome, { ...handle, cleanupReceipt: eligibleReceipt, updatedAt: nowIso });
505
+ rmSync(bundlePath, { force: true });
506
+ const removedReceipt: WorkCleanupReceipt = {
507
+ ...updated.cleanupReceipt!,
508
+ preservation: {
509
+ ...updated.cleanupReceipt!.preservation,
510
+ bundlePath: undefined,
511
+ bundleSha256: undefined,
512
+ bundleRetirement: retirementFromProof(handleProof, 'removed', nowIso),
513
+ recoveryInstructions: `Preservation bundle retired after ${handleProof.reason}; exact proof is stored in cleanupReceipt.preservation.bundleRetirement.`,
514
+ },
515
+ updatedAt: nowIso,
516
+ };
517
+ writeWorkHandle(controllerHome, { ...updated, cleanupReceipt: removedReceipt, updatedAt: nowIso });
518
+ } else {
519
+ rmSync(bundlePath, { force: true });
520
+ }
521
+ try { rmdirSync(directoryPath); } catch { /* Preserve concurrently populated directories. */ }
522
+ if (measurement.complete) report.reclaimedBytes += measurement.bytes;
523
+ else report.unknownReclaimedByteCount += 1;
524
+ report.removedPaths.push(relative(controllerHome, bundlePath).replace(/\\/g, '/'));
525
+ } catch (error) {
526
+ report.errors.push(`${repositoryId}:${entry.name}: ${error instanceof Error ? error.message : String(error)}`);
527
+ }
528
+ }
326
529
  }
327
530
  return report;
328
531
  }
@@ -2,7 +2,7 @@ import {
2
2
  buildWorkExecutionConcurrencyContract,
3
3
  evaluateWorkExecutionCompatibility,
4
4
  getWorkContract,
5
- isTerminalWorkContractStatus,
5
+ semanticWorkState,
6
6
  readActiveWorkCandidates,
7
7
  workExecutionLaneMutates,
8
8
  updateWorkContract,
@@ -16,7 +16,6 @@ import type { ResourceClaimSpec } from '../../execution/jobs/types';
16
16
  import { listProcessRecords } from '../../execution/process-runtime/store';
17
17
  import { listActiveLeases } from '../../resources/leases/store';
18
18
  import { claimsConflict } from '../../resources/claims/conflicts';
19
- import { getControllerSession } from '../../../../packages/kernel/controller/api/index';
20
19
  import {
21
20
  isManagedProcessActive,
22
21
  type ExecutionConcurrencyWaitProjection,
@@ -101,34 +100,6 @@ export interface RuntimeWorkCompatibilityDecision {
101
100
  wait?: ExecutionConcurrencyWaitProjection;
102
101
  }
103
102
 
104
- function invalidActiveWorkCompatibility(
105
- candidate: WorkExecutionConcurrencyContract,
106
- invalid: ReturnType<typeof readActiveWorkCandidates>['invalid'],
107
- ): ExecutionConcurrencyWaitProjection | undefined {
108
- if (!workExecutionLaneMutates(candidate.lane)) return undefined;
109
- for (const current of invalid) {
110
- if (current.workId === candidate.workId) continue;
111
- const currentScope = new Set(current.semanticScopeKeys);
112
- const overlap = candidate.semanticScopeKeys.filter((key) => currentScope.has(key));
113
- if (overlap.length === 0
114
- && candidate.lane === 'isolated_write'
115
- && candidate.isolation === 'isolated'
116
- && current.isolation === 'isolated') continue;
117
- return executionConcurrencyWaitProjection({
118
- source: 'work_compatibility',
119
- blockerCode: 'work_contract_invalid',
120
- disposition: 'invalid',
121
- blockingWorkId: current.workId,
122
- semanticScopeKeys: overlap.length > 0 ? overlap : current.semanticScopeKeys,
123
- resourceKeys: candidate.resourceIntents
124
- .filter((intent) => intent.mode !== 'read')
125
- .map((intent) => intent.resourceKey),
126
- wakeTrigger: { kind: 'work_contract_change', workId: current.workId },
127
- });
128
- }
129
- return undefined;
130
- }
131
-
132
103
  function contractForProcess(
133
104
  controllerHome: string,
134
105
  repoId: string,
@@ -181,18 +152,12 @@ export function evaluateManagedProcessWorkCompatibility(input: {
181
152
  .filter((record) => record.processId !== input.processId && record.workId && isManagedProcessActive(record))
182
153
  .map((record) => contractForProcess(input.controllerHome, input.repoId, record))
183
154
  .filter((value): value is WorkExecutionConcurrencyContract => Boolean(value));
184
- const worksWithActiveProcesses = new Set(activeProcessContracts.map((contract) => contract.workId));
185
- const activeSnapshot = readActiveWorkCandidates({
186
- controllerHome: input.controllerHome,
187
- repoId: input.repoId,
188
- limit: 1_000,
189
- });
190
- const invalidWait = invalidActiveWorkCompatibility(candidate, activeSnapshot.invalid);
191
- if (invalidWait) return { compatible: false, hardBlocked: true, wait: invalidWait };
192
- const activeWorkContracts = activeSnapshot.contracts
193
- .filter((activeWork) => activeWork.workId !== input.workId && !worksWithActiveProcesses.has(activeWork.workId))
194
- .map((activeWork) => buildWorkExecutionConcurrencyContract(activeWork));
195
- const decision = evaluateWorkExecutionCompatibility(candidate, [...activeProcessContracts, ...activeWorkContracts]);
155
+ // Thin Work is semantic context, not a physical execution lease. An open Work
156
+ // with no running Process must not reserve the shared checkout or make another
157
+ // Process wait for semantic terminalization. Concrete Process contracts own
158
+ // in-flight compatibility here; durable WorkHandle and resource-lease fences
159
+ // separately protect repository mutation across Process lifetimes.
160
+ const decision = evaluateWorkExecutionCompatibility(candidate, activeProcessContracts);
196
161
  const blocker = decision.blockers[0];
197
162
  return blocker
198
163
  ? { compatible: false, hardBlocked: blocker.disposition === 'invalid', wait: blockerProjection(blocker) }
@@ -225,7 +190,7 @@ export function recordWorkExecutionConcurrencyWait(input: {
225
190
  const workId = input.workId?.trim();
226
191
  if (!workId) return undefined;
227
192
  const work = getWorkContract({ controllerHome: input.controllerHome, repoId: input.repoId }, workId);
228
- if (!work || isTerminalWorkContractStatus(work.status)) return undefined;
193
+ if (!work || semanticWorkState(work) !== 'open') return undefined;
229
194
  const projection: WorkExecutionConcurrencyProjection = {
230
195
  schemaVersion: 1,
231
196
  status: input.wait.disposition === 'invalid' ? 'invalid' : 'waiting',
@@ -275,10 +240,7 @@ function workConcurrencyWakeResolved(input: {
275
240
  if (input.projection.status === 'invalid' || wake.kind === 'work_contract_change' || wake.kind === 'scheduler_capacity') return false;
276
241
  if (wake.kind === 'work_terminal') {
277
242
  const blocking = getWorkContract({ controllerHome: input.controllerHome, repoId: input.repoId }, wake.workId);
278
- return Boolean(blocking && isTerminalWorkContractStatus(blocking.status));
279
- }
280
- if (wake.kind === 'controller_release') {
281
- return !getControllerSession({ controllerHome: input.controllerHome, repoId: input.repoId }, wake.workId);
243
+ return Boolean(blocking && semanticWorkState(blocking) !== 'open');
282
244
  }
283
245
  const activeLeases = listActiveLeases(input.controllerHome, input.projection.leaseRepoId?.trim() || input.repoId);
284
246
  return !input.projection.resourceIntents.some((claim) => activeLeases.some((lease) => claimsConflict(claim, lease)));
@@ -12,7 +12,7 @@ import {
12
12
  type ControllerTerminalizationAuthority,
13
13
  type ControllerType,
14
14
  } from '../../../../packages/kernel/controller/api/index';
15
- import { getWorkContract } from '../../../../packages/kernel/work/api/index';
15
+ import { getWorkContract, semanticWorkState } from '../../../../packages/kernel/work/api/index';
16
16
  import { currentPermissionSnapshotVersion } from './validation';
17
17
  import { startExecutionSession, updateExecutionSession } from './session-store';
18
18
 
@@ -55,8 +55,8 @@ export function recoverDirectControllerAuthority(input: {
55
55
  const store = { controllerHome: input.controllerHome, repoId: input.repoId };
56
56
  const work = getWorkContract(store, workId);
57
57
  if (!work) throw new Error(`WORK_NOT_FOUND: ${workId}`);
58
- if (['completed', 'failed', 'cancelled'].includes(work.status)) {
59
- throw new Error(`WORK_CONTROLLER_AUTHORITY_RECOVERY_TERMINAL: ${workId}:${work.status}`);
58
+ if (semanticWorkState(work) !== 'open') {
59
+ throw new Error(`WORK_CONTROLLER_AUTHORITY_RECOVERY_TERMINAL: ${workId}:${semanticWorkState(work)}`);
60
60
  }
61
61
  if (getControllerRoundRelay(store, workId)) {
62
62
  throw new Error(`WORK_CONTROLLER_AUTHORITY_RECOVERY_RELAY_CONFLICT: ${workId}; relay-bound Work must recover through its exact per-round authority.`);
@@ -130,6 +130,7 @@ export function recoverControllerAuthority(input: {
130
130
  repositoryActiveCheckoutId?: string;
131
131
  workId: string;
132
132
  requestedBy?: string;
133
+ recoveryReason?: string;
133
134
  identity: DirectControllerAuthorityRecoveryIdentity;
134
135
  runtime: { running?: boolean; runtimeInstanceId?: string };
135
136
  leaseMs?: number;
@@ -142,6 +143,8 @@ export function recoverControllerAuthority(input: {
142
143
  const relay = recoverControllerRoundRelayAuthority(store, {
143
144
  workId: input.workId,
144
145
  requestedBy: input.requestedBy,
146
+ recoveryReason: input.recoveryReason,
147
+ allowCanonicalRuntimeMigration: true,
145
148
  identity: {
146
149
  controllerId: input.identity.controllerId,
147
150
  controllerType: input.identity.controllerType,
@@ -258,6 +261,31 @@ function assertControllerLifecycleInvocationAuthority(
258
261
  return undefined;
259
262
  }
260
263
 
264
+ /**
265
+ * Modern sessionless MCP replaces its request binding on every call. For a
266
+ * direct Work, omission of an opaque capability is not a semantic ownership
267
+ * change when the exact Work, authenticated controller/principal/type and live
268
+ * canonical Runtime still agree. Relay-bound rounds remain capability-scoped,
269
+ * and an explicitly supplied wrong capability never uses this path.
270
+ */
271
+ export function controllerInvocationCanMechanicallyRebindDirectOwnership(
272
+ input: ControllerInvocationAuthorityContext & { runtime: { running?: boolean; runtimeInstanceId?: string } },
273
+ owner: ControllerSession | undefined = getControllerSession(
274
+ { controllerHome: input.controllerHome, repoId: input.repoId },
275
+ input.workId.trim(),
276
+ ),
277
+ ): boolean {
278
+ const workId = input.workId.trim();
279
+ const store = { controllerHome: input.controllerHome, repoId: input.repoId };
280
+ if (!owner || getControllerRoundRelay(store, workId)) return false;
281
+ if (input.identity.transportSessionId || input.identity.controllerAuthorityId) return false;
282
+ if (owner.controllerId !== input.identity.controllerId || owner.controllerType !== input.identity.controllerType) return false;
283
+ if (controllerSessionPrincipalId(owner) !== input.identity.principalId) return false;
284
+ const requestedInstanceId = input.identity.controllerInstanceId.trim();
285
+ const canonicalRuntimeInstanceId = input.runtime.running ? input.runtime.runtimeInstanceId?.trim() || '' : '';
286
+ return Boolean(requestedInstanceId && canonicalRuntimeInstanceId === requestedInstanceId);
287
+ }
288
+
261
289
  /** Bind one exact Work owner to the current transport/runtime without changing semantic ownership. */
262
290
  export function bindControllerOwnershipForInvocation(input: ControllerInvocationAuthorityContext & {
263
291
  runtime: { running?: boolean; runtimeInstanceId?: string };
@@ -267,7 +295,9 @@ export function bindControllerOwnershipForInvocation(input: ControllerInvocation
267
295
  const store = { controllerHome: input.controllerHome, repoId: input.repoId };
268
296
  const workId = input.workId.trim();
269
297
  const existingOwner = getControllerSession(store, workId);
270
- assertControllerLifecycleInvocationAuthority(input, existingOwner);
298
+ if (!controllerInvocationCanMechanicallyRebindDirectOwnership(input, existingOwner)) {
299
+ assertControllerLifecycleInvocationAuthority(input, existingOwner);
300
+ }
271
301
  return bindControllerSessionToCurrentRuntime(store, {
272
302
  workId,
273
303
  controllerId: input.identity.controllerId,