@moretea-labs/forge 1.8.0 → 1.8.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (695) hide show
  1. package/AGENTS.md +73 -7
  2. package/CHANGELOG.md +34 -0
  3. package/CLAUDE.md +17 -2
  4. package/CONTRIBUTING.md +3 -2
  5. package/README.en.md +24 -3
  6. package/README.md +10 -6
  7. package/README.zh-CN.md +5 -3
  8. package/THIRD_PARTY_NOTICES.md +1 -2
  9. package/adapters/chatgpt/browser-delivery-host.ts +7 -1
  10. package/adapters/chatgpt/browser-delivery-runtime.ts +531 -56
  11. package/adapters/chatgpt/controller-binding-store.ts +101 -22
  12. package/adapters/chatgpt/controller-round-host.ts +15 -25
  13. package/adapters/chatgpt/controller-round-settlement-store.ts +58 -4
  14. package/adapters/chatgpt/provider-delivery.ts +229 -2
  15. package/adapters/chatgpt/work-conversation-binding-store.ts +99 -54
  16. package/adapters/computer/chatgpt-extension-target.ts +708 -0
  17. package/adapters/computer/chrome-extension/background.js +541 -0
  18. package/adapters/computer/chrome-extension/content.js +402 -0
  19. package/adapters/computer/chrome-extension/core.js +24 -0
  20. package/adapters/computer/chrome-extension/manifest.json +32 -0
  21. package/adapters/computer/desktop-operator-discovery.ts +11 -31
  22. package/adapters/computer/desktop-operator-provider.ts +18 -6
  23. package/adapters/computer/interaction-target-authority.ts +178 -24
  24. package/adapters/mcp/access-mode.ts +18 -39
  25. package/adapters/mcp/auth.ts +2 -7
  26. package/adapters/mcp/instructions.ts +6 -5
  27. package/adapters/mcp/multi-repository.ts +10 -47
  28. package/adapters/mcp/oauth.ts +73 -0
  29. package/adapters/mcp/paths.ts +4 -1
  30. package/adapters/mcp/runtime-gateway/bounded-result-runtime.ts +62 -0
  31. package/adapters/mcp/runtime-gateway/cognition-settlement.ts +201 -0
  32. package/adapters/mcp/runtime-gateway/context-adapter.ts +490 -113
  33. package/adapters/mcp/runtime-gateway/context-pack-sidecar.ts +83 -0
  34. package/adapters/mcp/runtime-gateway/controller-authority-adapter.ts +20 -5
  35. package/adapters/mcp/runtime-gateway/core-capability-adapter.ts +258 -0
  36. package/adapters/mcp/runtime-gateway/engineering-preconditions.ts +10 -27
  37. package/adapters/mcp/runtime-gateway/engineering-tool-contract.ts +15 -0
  38. package/adapters/mcp/runtime-gateway/execution-tools.ts +14 -54
  39. package/adapters/mcp/runtime-gateway/gateway-execution-adapter.ts +2 -1
  40. package/adapters/mcp/runtime-gateway/plugin-adapter.ts +132 -47
  41. package/adapters/mcp/runtime-gateway/process-tools.ts +173 -23
  42. package/adapters/mcp/runtime-gateway/protected-computer-adapter.ts +16 -4
  43. package/adapters/mcp/runtime-gateway/recovery-adapter.ts +69 -52
  44. package/adapters/mcp/runtime-gateway/repository-compat-adapter.ts +4 -35
  45. package/adapters/mcp/runtime-gateway/result-adapter.ts +10 -4
  46. package/adapters/mcp/runtime-gateway/router.ts +19 -507
  47. package/adapters/mcp/runtime-gateway/routing-policy.ts +506 -0
  48. package/adapters/mcp/runtime-gateway/runtime-observation-adapter.ts +15 -66
  49. package/adapters/mcp/runtime-gateway/runtime-readiness-observation.ts +218 -0
  50. package/adapters/mcp/runtime-gateway/runtime-tool-definitions.ts +123 -178
  51. package/adapters/mcp/runtime-gateway/runtime-tools.ts +11 -5
  52. package/adapters/mcp/runtime-gateway/scheduler-adapter.ts +37 -1
  53. package/adapters/mcp/runtime-gateway/shared-adapter.ts +20 -0
  54. package/adapters/mcp/runtime-gateway/status-inbox-adapter.ts +416 -270
  55. package/adapters/mcp/runtime-gateway/typescript-navigation-sidecar.ts +140 -0
  56. package/adapters/mcp/runtime-gateway/work-adapter.ts +262 -3123
  57. package/adapters/mcp/runtime-gateway/work-controller-operations.ts +257 -0
  58. package/adapters/mcp/runtime-gateway/work-detail-projection.ts +60 -0
  59. package/adapters/mcp/runtime-gateway/work-input-wire-migration.ts +229 -0
  60. package/adapters/mcp/runtime-gateway/work-learning-operations.ts +145 -0
  61. package/adapters/mcp/runtime-gateway/work-list-projection.ts +38 -0
  62. package/adapters/mcp/runtime-gateway/work-plan-operations.ts +382 -0
  63. package/adapters/mcp/runtime-gateway/work-repair-adapter.ts +308 -0
  64. package/adapters/mcp/runtime-gateway/work-requirement-operations.ts +148 -0
  65. package/adapters/mcp/runtime-gateway/work-semantic-operations.ts +320 -0
  66. package/adapters/mcp/runtime-gateway/work-workflow-operations.ts +113 -0
  67. package/adapters/mcp/runtime-gateway/workflow-supervisor-adapter.ts +180 -0
  68. package/adapters/mcp/server.ts +91 -26
  69. package/adapters/mcp/setup.ts +5 -13
  70. package/adapters/mcp/tool-mapping/access-tools.ts +0 -6
  71. package/adapters/mcp/tool-mapping/legacy-tool-service.ts +703 -3092
  72. package/adapters/mcp/tool-mapping/post-finalize-work-attribution.ts +5 -10
  73. package/adapters/mcp/tool-mapping/repository-tools.ts +170 -213
  74. package/adapters/mcp/toolset-names.ts +11 -37
  75. package/adapters/mcp/toolset.ts +19 -92
  76. package/{src/cli → adapters}/mcp/transports/AGENTS.md +5 -5
  77. package/{src/cli → adapters}/mcp/transports/CLAUDE.md +5 -5
  78. package/adapters/mcp/transports/http-observation.ts +377 -0
  79. package/adapters/mcp/transports/http-post-lifecycle.ts +19 -0
  80. package/adapters/mcp/transports/http.ts +200 -683
  81. package/adapters/mcp/transports/oauth-http.ts +322 -0
  82. package/adapters/mcp/transports/session-registry.ts +6 -0
  83. package/adapters/mcp/tunnels/openai-secure-tunnel.ts +89 -5
  84. package/adapters/mcp/types.ts +0 -6
  85. package/assets/hooks/lib/session-state.sh +0 -38
  86. package/assets/hooks/post-bash.sh +1 -1
  87. package/assets/hooks/post-tool-observer.sh +0 -5
  88. package/assets/hooks/prompt-guard.sh +0 -55
  89. package/assets/partials/04-project-structure.partial.md +1 -1
  90. package/assets/partials/07-footer.partial.md +1 -1
  91. package/assets/partials-agents/02-operating-mode.partial.md +1 -1
  92. package/assets/partials-agents/08-deep-docs.partial.md +1 -1
  93. package/assets/plugin-registry.v1.json +6 -4
  94. package/assets/reference-configs/agentic-development-flow.md +26 -1
  95. package/assets/reference-configs/external-tooling.md +0 -76
  96. package/assets/reference-configs/global-working-rules.md +19 -0
  97. package/assets/reference-configs/release-deploy.md +1 -1
  98. package/assets/templates/helpers/architecture-queue.sh +1 -1
  99. package/assets/templates/helpers/check-agent-tooling.sh +1 -327
  100. package/assets/templates/helpers/check-task-workflow.sh +1 -1
  101. package/assets/templates/helpers/ensure-task-workflow.sh +0 -14
  102. package/assets/templates/helpers/migrate-project-template.sh +2 -2
  103. package/assets/workflow-contract.v1.json +0 -2
  104. package/docs/README.md +5 -2
  105. package/docs/architecture/CURRENT.md +205 -51
  106. package/docs/architecture/decisions/20260803-release-identity-binding-and-exit-policy.md +14 -5
  107. package/docs/architecture/decisions/20260823-immediate-controller-relay.md +6 -3
  108. package/docs/architecture/decisions/20260904-ios-device-migration-baseline.md +42 -0
  109. package/docs/architecture/decisions/20260907-assistant-learning-loop.md +2 -0
  110. package/docs/architecture/decisions/20260907-controller-round-transition-policy.md +19 -4
  111. package/docs/architecture/decisions/20260916-workflow-supervisor-authority.md +249 -0
  112. package/docs/architecture/decisions/20260917-cognitive-memory-foundation.md +82 -0
  113. package/docs/architecture/decisions/20260918-stable-candidate-release-lifecycle.md +234 -0
  114. package/docs/architecture/decisions/20260919-autonomous-work-liveness.md +62 -0
  115. package/docs/architecture/decisions/20260924-thin-semantic-working-context.md +74 -0
  116. package/docs/architecture/decisions/20261001-supervisor-turn-authority.md +342 -0
  117. package/docs/architecture/decisions/20261005-forge-v3-desktop-client-boundary.md +77 -0
  118. package/docs/architecture/decisions/20261009-exact-code-context-discovery.md +19 -0
  119. package/docs/architecture/decisions/20261009-generated-xcode-cache-retention.md +37 -0
  120. package/docs/architecture/decisions/20261011-autonomous-continuation-convergence.md +597 -0
  121. package/docs/architecture/decisions/20261017-edit-session-finalization-reconciliation.md +17 -0
  122. package/docs/architecture/decisions/20261019-retire-host-skills.md +16 -0
  123. package/docs/architecture/diagrams/agentic-dev-plugin-architecture.html +1 -1
  124. package/docs/architecture/domains/public-surface.md +3 -5
  125. package/docs/architecture/domains/verification.md +6 -5
  126. package/docs/architecture/domains/workflow-engine.md +6 -0
  127. package/docs/architecture/modules/controller-runtime/transport-lifecycle.md +3 -3
  128. package/docs/architecture/requests/2026-09-04-computer-plugin-workflow-taxonomy.md +4 -4
  129. package/docs/architecture/reviews/20261015-code-search-runtime-acceptance.md +75 -0
  130. package/docs/forge-plugin-management.md +16 -4
  131. package/docs/operations/controller-browser-plugin.md +23 -0
  132. package/docs/operations/controller-performance-and-502.md +17 -0
  133. package/docs/operations/controller-reliability-runbook.md +2 -2
  134. package/docs/operations/features.md +6 -7
  135. package/docs/operations/features.zh-CN.md +1 -1
  136. package/docs/operations/github-repository.md +4 -4
  137. package/docs/operations/github-semantic-release-projection.md +20 -0
  138. package/docs/operations/homebrew.md +2 -2
  139. package/docs/operations/mcp-tool-exposure.md +13 -52
  140. package/docs/operations/releasing.md +2 -0
  141. package/docs/operations/runtime-performance-diagnostics.md +8 -0
  142. package/docs/operations/standalone-disaster-recovery.md +15 -7
  143. package/docs/tutorials/01-install-and-start.zh-CN.md +1 -1
  144. package/docs/tutorials/03-first-repository-task.md +2 -0
  145. package/docs/wiki/Computer-and-Plugins.md +78 -0
  146. package/docs/wiki/Computer-and-Plugins.zh-CN.md +88 -0
  147. package/docs/wiki/Home.md +16 -2
  148. package/docs/wiki/Implementation.md +25 -13
  149. package/docs/wiki/Installation.md +28 -32
  150. package/docs/wiki/Integrations.md +4 -0
  151. package/docs/wiki/Quick-Start.md +35 -22
  152. package/docs/wiki/Releases-and-Upgrades.md +15 -25
  153. package/docs/wiki/_Sidebar.md +5 -1
  154. package/package.json +25 -25
  155. package/packages/kernel/cognition/api/index.ts +6 -0
  156. package/packages/kernel/cognition/application/activation-service.ts +451 -0
  157. package/packages/kernel/cognition/application/consolidation-service.ts +185 -0
  158. package/packages/kernel/cognition/application/legacy-experience-adapter.ts +38 -0
  159. package/packages/kernel/cognition/application/memory-service.ts +64 -0
  160. package/packages/kernel/cognition/domain/learning.ts +106 -0
  161. package/packages/kernel/cognition/domain/memory.ts +254 -0
  162. package/packages/kernel/controller/api/index.ts +1 -0
  163. package/packages/kernel/controller/application/continuation-service.ts +281 -0
  164. package/packages/kernel/controller/application/controller-round-service.ts +12 -0
  165. package/packages/kernel/controller/domain/controller-round-transition-policy.ts +242 -21
  166. package/packages/kernel/controller/domain/controller-round.ts +4 -1
  167. package/packages/kernel/controller/domain/execution-quality.ts +3 -1
  168. package/packages/kernel/controller/infrastructure/controller-round-store.ts +689 -103
  169. package/packages/kernel/controller/infrastructure/controller-session-store.ts +348 -97
  170. package/packages/kernel/controller/ports/controller-host.ts +2 -0
  171. package/packages/kernel/identity/api/index.ts +10 -0
  172. package/packages/kernel/identity/domain/activity-projection.ts +43 -0
  173. package/packages/kernel/identity/domain/capability-broker.ts +60 -0
  174. package/packages/kernel/identity/domain/grant.ts +72 -0
  175. package/packages/kernel/identity/domain/owned-resource.ts +116 -0
  176. package/packages/kernel/identity/domain/user-request.ts +93 -0
  177. package/packages/kernel/identity/infrastructure/activity-projection-store.ts +87 -0
  178. package/packages/kernel/identity/infrastructure/capability-broker.ts +81 -0
  179. package/packages/kernel/identity/infrastructure/grant-store.ts +284 -0
  180. package/packages/kernel/identity/infrastructure/owned-resource-store.ts +259 -0
  181. package/packages/kernel/identity/infrastructure/user-request-store.ts +182 -0
  182. package/packages/kernel/scheduler/api/index.ts +0 -2
  183. package/packages/kernel/scheduler/application/eligibility.ts +4 -1
  184. package/packages/kernel/scheduler/application/schedule-service.ts +3 -0
  185. package/packages/kernel/scheduler/application/settlement.ts +0 -15
  186. package/packages/kernel/scheduler/domain/schedule.ts +87 -0
  187. package/packages/kernel/scheduler/infrastructure/schedule-store.ts +166 -143
  188. package/packages/kernel/work/api/index.ts +3 -2
  189. package/packages/kernel/work/application/work-service.ts +18 -42
  190. package/packages/kernel/work/domain/current-task-lineage.ts +104 -0
  191. package/packages/kernel/work/domain/engineering-design.ts +10 -5
  192. package/packages/kernel/work/domain/engineering-profile.ts +8 -12
  193. package/packages/kernel/work/domain/evaluation-promotion-receipt.ts +186 -0
  194. package/packages/kernel/work/domain/execution-concurrency.ts +19 -26
  195. package/packages/kernel/work/domain/execution-snapshot.ts +0 -31
  196. package/packages/kernel/work/domain/implementation-review.ts +14 -331
  197. package/packages/kernel/work/domain/objective-graph.ts +119 -0
  198. package/packages/kernel/work/domain/project-engineering-contract.ts +23 -1
  199. package/packages/kernel/work/domain/repository-completion-receipt.ts +1 -1
  200. package/packages/kernel/work/domain/state-machine.ts +34 -65
  201. package/packages/kernel/work/domain/types.ts +57 -51
  202. package/packages/kernel/work/infrastructure/work-contract-store.ts +847 -729
  203. package/packages/kernel/work/ports/work-contract-store.ts +5 -2
  204. package/packages/plugin-runtime/browser/provider-registry.ts +12 -36
  205. package/packages/plugin-runtime/browser/session-authority.ts +2 -1
  206. package/packages/plugin-runtime/computer/chatgpt-identity.ts +24 -0
  207. package/packages/plugin-runtime/computer/conversation-target.ts +153 -0
  208. package/packages/plugin-runtime/computer/index.ts +2 -0
  209. package/packages/plugin-runtime/computer/target-authority.ts +26 -1
  210. package/packages/plugin-runtime/external/unix-jsonl-transport.ts +142 -18
  211. package/packages/protocols/computer/contract.ts +27 -1
  212. package/scripts/activate-source-baseline.ts +7 -9
  213. package/scripts/assemble-template.ts +11 -72
  214. package/scripts/canary-controller-semantic-wait.ts +12 -24
  215. package/scripts/check-mcp-compatibility.ts +94 -201
  216. package/scripts/check-package-identity.mjs +0 -5
  217. package/scripts/check-runtime-architecture.mjs +921 -239
  218. package/scripts/forge-local-recovery-helper.mjs +93 -15
  219. package/scripts/init-project.sh +0 -46
  220. package/scripts/install-ios-hid-toolchain.sh +60 -0
  221. package/scripts/install-standalone-recovery.ts +1 -1
  222. package/scripts/lib/project-init-lib.sh +6 -3
  223. package/scripts/migrate-windows-wsl-controller-home.ts +2 -0
  224. package/scripts/open-source-audit-allowlist.txt +1 -3
  225. package/scripts/run-bounded-command.mjs +5 -0
  226. package/scripts/run-governed-gate.ts +2 -1
  227. package/scripts/run-mobile-monitor-bridge.ts +0 -1
  228. package/scripts/smoke-control-plane-failure-domain.ts +94 -0
  229. package/scripts/smoke-ios-physical-device.ts +38 -10
  230. package/scripts/smoke-mcp-http-runtime.ts +12 -8
  231. package/scripts/smoke-mcp-tool-surface.ts +27 -41
  232. package/scripts/smoke-runtime-recovery.ts +12 -43
  233. package/scripts/smoke-schedule-engine.ts +23 -15
  234. package/scripts/smoke-unattended-transport-recovery.ts +223 -0
  235. package/scripts/smoke-user-request-continuation-restart.ts +232 -0
  236. package/scripts/smoke-workflow-supervisor-chrome-adapter.ts +95 -0
  237. package/scripts/smoke-workflow-supervisor-process-restart.ts +276 -0
  238. package/scripts/smoke-workflow-supervisor-restart-recovery.ts +150 -0
  239. package/scripts/smoke-workflow-supervisor.ts +103 -0
  240. package/scripts/sync-generated-authority.mjs +0 -1
  241. package/scripts/verify-forge-runtime.sh +2 -1
  242. package/src/cli/agent-jobs/executor-health.ts +12 -35
  243. package/src/cli/agent-jobs/integration.ts +20 -51
  244. package/src/cli/agent-jobs/job-manager.ts +7 -3
  245. package/src/cli/chatgpt-browser/file-policy.ts +2 -2
  246. package/src/cli/commands/brain-assistant.ts +27 -13
  247. package/src/cli/commands/brain.ts +13 -15
  248. package/src/cli/commands/chatgpt.ts +1 -163
  249. package/src/cli/commands/doctor.ts +1 -143
  250. package/src/cli/commands/global-runtime.ts +3 -196
  251. package/src/cli/commands/init-hook.ts +6 -23
  252. package/src/cli/commands/init.ts +3 -252
  253. package/src/cli/commands/mcp.ts +0 -5
  254. package/src/cli/commands/prompt-guard-decision.ts +0 -2
  255. package/src/cli/commands/recovery.ts +137 -135
  256. package/src/cli/commands/repository.ts +17 -1
  257. package/src/cli/commands/runtime.ts +3 -3
  258. package/src/cli/commands/setup-execution.ts +41 -0
  259. package/src/cli/commands/setup-profile.ts +8 -0
  260. package/src/cli/controller/check-runner.ts +13 -2
  261. package/src/cli/controller/completion-backlog.ts +3 -3
  262. package/src/cli/controller/completion-orchestrator.ts +5 -44
  263. package/src/cli/controller/completion-target.ts +3 -72
  264. package/src/cli/controller/composite-operations.ts +1 -1
  265. package/src/cli/controller/context/instruction-context.ts +1 -1
  266. package/src/cli/controller/context/known-paths.ts +2 -2
  267. package/src/cli/controller/context/query-planning.ts +11 -4
  268. package/src/cli/controller/context/rule-resolution.ts +2 -2
  269. package/src/cli/controller/context/source-materializer.ts +83 -102
  270. package/src/cli/controller/context/structural-provider.ts +84 -0
  271. package/src/cli/controller/context/structural.ts +6 -6
  272. package/src/cli/controller/context/types.ts +8 -9
  273. package/src/cli/controller/context-pack.ts +107 -84
  274. package/src/cli/controller/execution-completion.ts +4 -7
  275. package/src/cli/controller/execution-policy.ts +36 -153
  276. package/src/cli/controller/governance.ts +2 -3
  277. package/src/cli/controller/issue-store.ts +4 -99
  278. package/src/cli/controller/launch-agents.ts +59 -18
  279. package/src/cli/controller/operational-plan.ts +25 -52
  280. package/src/cli/controller/runtime-config.ts +5 -1
  281. package/src/cli/controller/stuck-state-migration.ts +2 -3
  282. package/src/cli/controller/systemd-user.ts +42 -10
  283. package/src/cli/editing/edit-session.ts +18 -12
  284. package/src/cli/github/github.ts +4 -4
  285. package/src/cli/github/semantic-projection.ts +174 -0
  286. package/src/cli/hook/prompt-intents.ts +0 -9
  287. package/src/cli/index.ts +1 -43
  288. package/src/cli/local-bridge/connector-freshness.ts +1 -12
  289. package/src/cli/local-bridge/console-automations.ts +19 -14
  290. package/src/cli/local-bridge/console-view-models.ts +4 -13
  291. package/src/cli/local-bridge/facade-api.ts +64 -193
  292. package/src/cli/local-bridge/server.ts +24 -147
  293. package/src/cli/local-bridge/types.ts +0 -1
  294. package/src/cli/mcp/oauth-client-retirement.ts +74 -0
  295. package/src/cli/repositories/command-classifier.ts +0 -9
  296. package/src/cli/repositories/command-executor.ts +29 -23
  297. package/src/cli/repositories/command-scope.ts +37 -18
  298. package/src/cli/repositories/controller-home.ts +48 -0
  299. package/src/cli/repositories/ephemeral-workspace.ts +20 -30
  300. package/src/cli/repositories/git-command-executor.ts +2 -2
  301. package/src/cli/repositories/locks.ts +20 -0
  302. package/src/cli/repositories/registry.ts +79 -12
  303. package/src/cli/repositories/safe-patch.ts +2 -12
  304. package/src/cli/repositories/structured-git.ts +101 -5
  305. package/src/cli/repository/inspector.ts +185 -343
  306. package/src/cli/repository/session-cache.ts +92 -6
  307. package/src/effects/process-runner.ts +17 -1
  308. package/src/runtime/context/assistant-context.ts +20 -7
  309. package/src/runtime/context/assistant-work-context.ts +89 -27
  310. package/src/runtime/context/automatic-learning.ts +565 -0
  311. package/src/runtime/context/cognitive-attention.ts +173 -0
  312. package/src/runtime/context/cognitive-skill-canary.ts +158 -0
  313. package/src/runtime/context/context-closure.ts +46 -9
  314. package/src/runtime/context/context-pack-process.ts +103 -0
  315. package/src/runtime/context/context-plane.ts +1 -9
  316. package/src/runtime/context/direct-controller-learning.ts +298 -0
  317. package/src/runtime/context/generic-lsp-provider.ts +1 -1
  318. package/src/runtime/context/semantic-navigation-contract.ts +16 -0
  319. package/src/runtime/context/semantic-navigation.ts +7 -35
  320. package/src/runtime/context/typescript-navigation-process.ts +145 -0
  321. package/src/runtime/context/typescript-navigation.ts +89 -3
  322. package/src/runtime/control-plane/cleanup-artifact-retention.ts +215 -12
  323. package/src/runtime/control-plane/concurrency/work-execution-concurrency.ts +9 -47
  324. package/src/runtime/control-plane/execution/controller-authority-recovery.ts +34 -4
  325. package/src/runtime/control-plane/execution/edit-validation-coordinator.ts +29 -20
  326. package/src/runtime/control-plane/execution/execution-identity.ts +23 -3
  327. package/src/runtime/control-plane/execution/repository-work-attribution.ts +7 -30
  328. package/src/runtime/control-plane/execution/retained-work-resume.ts +206 -199
  329. package/src/runtime/control-plane/execution/session-store.ts +31 -1
  330. package/src/runtime/control-plane/execution/validation.ts +6 -8
  331. package/src/runtime/control-plane/execution/work-authority-reconciler.ts +13 -42
  332. package/src/runtime/control-plane/execution/work-check-evidence.ts +137 -0
  333. package/src/runtime/control-plane/execution/work-completion-authority.ts +30 -85
  334. package/src/runtime/control-plane/execution/work-delivery-service.ts +616 -0
  335. package/src/runtime/control-plane/execution/work-evidence-policy.ts +12 -50
  336. package/src/runtime/control-plane/execution/work-execution-support.ts +50 -149
  337. package/src/runtime/control-plane/execution/work-handle-authority.ts +197 -110
  338. package/src/runtime/control-plane/execution/work-handle-store.ts +72 -44
  339. package/src/runtime/control-plane/execution/work-head-settlement.ts +53 -20
  340. package/src/runtime/control-plane/execution/work-lifecycle-audit.ts +52 -29
  341. package/src/runtime/control-plane/execution/work-operation-service.ts +60 -34
  342. package/src/runtime/control-plane/execution/work-preparation-service.ts +231 -267
  343. package/src/runtime/control-plane/execution/work-process-evidence.ts +2 -2
  344. package/src/runtime/control-plane/execution/work-remote-delivery.ts +2 -3
  345. package/src/runtime/control-plane/execution/work-revision-diff.ts +39 -0
  346. package/src/runtime/control-plane/execution/work-terminal-cleanup.ts +201 -199
  347. package/src/runtime/control-plane/execution/work-validation-reconciler.ts +33 -85
  348. package/src/runtime/control-plane/execution/work-verification-service.ts +406 -50
  349. package/src/runtime/control-plane/execution/work-verification-snapshot.ts +6 -2
  350. package/src/runtime/control-plane/facade/capability-registry.ts +364 -37
  351. package/src/runtime/control-plane/facade/check-normalization.ts +3 -9
  352. package/src/runtime/control-plane/facade/codex-delegation.ts +10 -11
  353. package/src/runtime/control-plane/facade/controller-connection.ts +135 -0
  354. package/src/runtime/control-plane/facade/goal-workloop-access.ts +1 -20
  355. package/src/runtime/control-plane/facade/goal-workloop.ts +281 -1753
  356. package/src/runtime/control-plane/facade/handoff-inbox-application.ts +12 -25
  357. package/src/runtime/control-plane/facade/handoff-inbox-store.ts +256 -52
  358. package/src/runtime/control-plane/facade/index.ts +0 -1
  359. package/src/runtime/control-plane/facade/operation-digest.ts +12 -15
  360. package/src/runtime/control-plane/facade/plan-contract-store.ts +451 -991
  361. package/src/runtime/control-plane/facade/policy-gate.ts +0 -23
  362. package/src/runtime/control-plane/facade/repository-work-admission.ts +12 -22
  363. package/src/runtime/control-plane/facade/requirement-authority.ts +102 -199
  364. package/src/runtime/control-plane/facade/requirement-board.ts +3 -3
  365. package/src/runtime/control-plane/facade/rh-work-operation-contract.ts +51 -14
  366. package/src/runtime/control-plane/facade/self-healing-loop.ts +18 -53
  367. package/src/runtime/control-plane/facade/suggested-actions.ts +15 -18
  368. package/src/runtime/control-plane/facade/types.ts +49 -108
  369. package/src/runtime/control-plane/facade/work-continuation.ts +9 -9
  370. package/src/runtime/control-plane/generated-cache-retention.ts +206 -59
  371. package/src/runtime/control-plane/global-scheduler/autonomous-continuation.ts +248 -0
  372. package/src/runtime/control-plane/global-scheduler/durable-admission.ts +1 -1
  373. package/src/runtime/control-plane/global-scheduler/maintenance.ts +256 -117
  374. package/src/runtime/control-plane/global-scheduler/reconciliation.ts +3 -12
  375. package/src/runtime/control-plane/global-scheduler/scheduler.ts +66 -40
  376. package/src/runtime/control-plane/global-scheduler/wake-signal.ts +42 -2
  377. package/src/runtime/control-plane/governance/access-policy.ts +19 -2
  378. package/src/runtime/control-plane/governance/authorization.ts +20 -3
  379. package/src/runtime/control-plane/governance/external-effects.ts +1 -1
  380. package/src/runtime/control-plane/launcher/chatgpt-round-continuation.ts +63 -300
  381. package/src/runtime/control-plane/launcher/chatgpt-work-continuation.ts +29 -300
  382. package/src/runtime/control-plane/launcher/local-conversation-controller.ts +238 -0
  383. package/src/runtime/control-plane/launcher/provider-mcp-bootstrap.ts +5 -2
  384. package/src/runtime/control-plane/launcher/thin-launcher.ts +96 -240
  385. package/src/runtime/control-plane/persistence/cognition-store.ts +820 -0
  386. package/src/runtime/control-plane/persistence/experience-store.ts +162 -29
  387. package/src/runtime/control-plane/persistence/requirement-store.ts +216 -74
  388. package/src/runtime/control-plane/persistence/sqlite-store.ts +113 -6
  389. package/src/runtime/control-plane/release-retention.ts +135 -47
  390. package/src/runtime/control-plane/repository-namespace-retention.ts +2 -2
  391. package/src/runtime/control-plane/runtime-cleanup.ts +295 -107
  392. package/src/runtime/control-plane/workspace/project-onboarding.ts +80 -0
  393. package/src/runtime/control-plane/workspace/semantic-sync-service.ts +19 -5
  394. package/src/runtime/control-plane/workspace/workspace-store.ts +169 -0
  395. package/src/runtime/diagnostics/incident-repair.ts +313 -146
  396. package/src/runtime/diagnostics/mcp-timing.ts +114 -0
  397. package/src/runtime/evidence/artifact-store.ts +158 -40
  398. package/src/runtime/evidence/evidence-store.ts +112 -8
  399. package/src/runtime/evidence/output-handle-index.ts +225 -0
  400. package/src/runtime/evidence/result-store.ts +158 -44
  401. package/src/runtime/evidence/sensitive-output.ts +22 -2
  402. package/src/runtime/execution/jobs/child-reference.ts +11 -0
  403. package/src/runtime/execution/jobs/receipt-recovery.ts +1 -11
  404. package/src/runtime/execution/jobs/store.ts +3 -4
  405. package/src/runtime/execution/managed-workspace.ts +57 -0
  406. package/src/runtime/execution/process-runtime/check-facade.ts +1 -1
  407. package/src/runtime/execution/process-runtime/check-result-retention.ts +2 -2
  408. package/src/runtime/execution/process-runtime/check-result.ts +105 -1
  409. package/src/runtime/execution/process-runtime/check-runner-sidecar.ts +18 -8
  410. package/src/runtime/execution/process-runtime/command-facade.ts +82 -30
  411. package/src/runtime/execution/process-runtime/gc.ts +15 -2
  412. package/src/runtime/execution/process-runtime/handle-index.ts +176 -0
  413. package/src/runtime/execution/process-runtime/host-command-lane.ts +139 -0
  414. package/src/runtime/execution/process-runtime/index.ts +3 -0
  415. package/src/runtime/execution/process-runtime/lightweight-managed.ts +251 -72
  416. package/src/runtime/execution/process-runtime/persisted-check.ts +3 -3
  417. package/src/runtime/execution/process-runtime/process-runner-entry.ts +47 -5
  418. package/src/runtime/execution/process-runtime/process-scope.ts +160 -0
  419. package/src/runtime/execution/process-runtime/resource-claims.ts +65 -61
  420. package/src/runtime/execution/process-runtime/runtime.ts +55 -18
  421. package/src/runtime/execution/process-runtime/store.ts +30 -2
  422. package/src/runtime/execution/process-runtime/types.ts +6 -1
  423. package/src/runtime/execution/thin-harness/execution-router.ts +16 -16
  424. package/src/runtime/execution/thin-harness/fast-executor.ts +2 -2
  425. package/src/runtime/execution/thin-harness/search-worker.ts +2 -2
  426. package/src/runtime/execution/workers/executor.ts +3 -8
  427. package/src/runtime/maintenance/cleanup.ts +41 -5
  428. package/src/runtime/platform/service-inventory.ts +130 -0
  429. package/src/runtime/platform/service-manager.ts +8 -0
  430. package/src/runtime/plugins/action-application.ts +97 -29
  431. package/src/runtime/plugins/app-store-connect-adapter.ts +290 -18
  432. package/src/runtime/plugins/browser-adapter.ts +1124 -333
  433. package/src/runtime/plugins/browser-automation-service.ts +23 -3
  434. package/src/runtime/plugins/browser-macos-bridge.ts +431 -137
  435. package/src/runtime/plugins/browser-manifest-surface.ts +47 -12
  436. package/src/runtime/plugins/browser-native-session-service.ts +63 -13
  437. package/src/runtime/plugins/browser-registration.ts +18 -0
  438. package/src/runtime/plugins/browser-runtime.ts +40 -36
  439. package/src/runtime/plugins/browser-session-authority.ts +2 -2
  440. package/src/runtime/plugins/browser-session-store.ts +46 -76
  441. package/src/runtime/plugins/capability-authorization-grants.ts +258 -62
  442. package/src/runtime/plugins/computer-chatgpt-browser-adapter-installer.ts +228 -0
  443. package/src/runtime/plugins/computer-registration.ts +298 -20
  444. package/src/runtime/plugins/desktop-operator-external-policy.ts +36 -4
  445. package/src/runtime/plugins/desktop-operator-registration.ts +12 -4
  446. package/src/runtime/plugins/external-adapter.ts +42 -6
  447. package/src/runtime/plugins/external-registration.ts +21 -1
  448. package/src/runtime/plugins/github-adapter.ts +30 -3
  449. package/src/runtime/plugins/gmail-adapter.ts +189 -3
  450. package/src/runtime/plugins/google-calendar-adapter.ts +2 -2
  451. package/src/runtime/plugins/google-shared.ts +24 -12
  452. package/src/runtime/plugins/google-tasks-adapter.ts +2 -2
  453. package/src/runtime/plugins/ios/remote-xpc-hid.ts +70 -30
  454. package/src/runtime/plugins/ios-adapter.ts +46 -41
  455. package/src/runtime/plugins/ios-agent-device.ts +54 -4
  456. package/src/runtime/plugins/ios-device-ownership.ts +103 -0
  457. package/src/runtime/plugins/ios-physical-device.ts +497 -79
  458. package/src/runtime/plugins/lightweight-action.ts +208 -2
  459. package/src/runtime/plugins/local-system-adapter.ts +12 -100
  460. package/src/runtime/plugins/managed-process-adapter.ts +12 -5
  461. package/src/runtime/plugins/plugin-action-sidecar.ts +17 -13
  462. package/src/runtime/plugins/plugin-management-adapter.ts +1 -1
  463. package/src/runtime/plugins/store.ts +682 -435
  464. package/src/runtime/plugins/types.ts +24 -0
  465. package/src/runtime/plugins/xiaohongshu-publish.ts +16 -0
  466. package/src/runtime/projections/git-status-sampler.ts +2 -19
  467. package/src/runtime/projections/invalidation.ts +7 -3
  468. package/src/runtime/projections/materialized-view.ts +80 -36
  469. package/src/runtime/recovery/actions.ts +4 -4
  470. package/src/runtime/recovery/capability-action-application.ts +46 -45
  471. package/src/runtime/recovery/lifecycle-inventory.ts +30 -40
  472. package/src/runtime/recovery/maintenance-executor.ts +374 -123
  473. package/src/runtime/recovery/probe.ts +2 -2
  474. package/src/runtime/recovery/store.ts +29 -11
  475. package/src/runtime/release/release-coordinator.ts +312 -0
  476. package/src/runtime/release/release-session.ts +716 -0
  477. package/src/runtime/release/release-state-migration.ts +25 -0
  478. package/src/runtime/resources/leases/store.ts +56 -25
  479. package/src/runtime/root/computer-composition.ts +191 -6
  480. package/src/runtime/root/controller-progression-composition.ts +254 -0
  481. package/src/runtime/root/controller-round-composition.ts +20 -1
  482. package/src/runtime/root/deployment-topology.ts +106 -0
  483. package/src/runtime/root/entry.ts +4 -3
  484. package/src/runtime/root/known-good-recovery.ts +184 -0
  485. package/src/runtime/root/local-bridge.ts +0 -1
  486. package/src/runtime/root/mcp-transport.ts +111 -18
  487. package/src/runtime/root/ownership.ts +261 -9
  488. package/src/runtime/root/package-connector-service.ts +227 -29
  489. package/src/runtime/root/package-runtime-release.ts +117 -30
  490. package/src/runtime/root/package-runtime-service.ts +24 -24
  491. package/src/runtime/root/release-execution-canary.ts +57 -12
  492. package/src/runtime/root/release-loader.ts +90 -8
  493. package/src/runtime/root/release-manifest.ts +80 -40
  494. package/src/runtime/root/release-materialize.ts +372 -106
  495. package/src/runtime/root/release-store.ts +395 -36
  496. package/src/runtime/root/runtime-lane.ts +191 -0
  497. package/src/runtime/root/runtime.ts +160 -29
  498. package/src/runtime/root/scheduled-controller-composition.ts +29 -3
  499. package/src/runtime/root/service-runner.ts +2 -2
  500. package/src/runtime/root/service.ts +126 -44
  501. package/src/runtime/root/status.ts +48 -0
  502. package/src/runtime/root/types.ts +32 -9
  503. package/src/runtime/root/workflow-supervisor-composition.ts +681 -0
  504. package/src/runtime/root/workflow-supervisor-runtime.ts +564 -0
  505. package/src/runtime/root/write-fence.ts +50 -2
  506. package/src/runtime/safe-tooling/google-credential-store.ts +67 -22
  507. package/src/runtime/safe-tooling/google-oauth-broker.ts +25 -7
  508. package/src/runtime/safe-tooling/ios-development.ts +22 -8
  509. package/src/runtime/safe-tooling/job-summary.ts +1 -1
  510. package/src/runtime/safe-tooling/workspace-auth.ts +5 -2
  511. package/src/runtime/shared/atomic-text-file.ts +21 -0
  512. package/src/runtime/shared/bounded-child-supervisor.ts +9 -1
  513. package/src/runtime/shared/json-files.ts +8 -3
  514. package/src/runtime/shared/process-environment.ts +20 -9
  515. package/src/runtime/shared/response-budget.ts +1 -3
  516. package/src/runtime/standalone-recovery/controller-home-migration.ts +16 -24
  517. package/src/runtime/standalone-recovery/core.ts +3792 -417
  518. package/src/runtime/standalone-recovery/entry.ts +507 -45
  519. package/src/runtime/standalone-recovery/installer.ts +262 -148
  520. package/src/runtime/standalone-recovery/mcp-server.ts +29 -193
  521. package/src/runtime/standalone-recovery/operation-lock.ts +12 -2
  522. package/src/runtime/standalone-recovery/performance.ts +54 -16
  523. package/src/runtime/standalone-recovery/release.ts +53 -5
  524. package/src/runtime/standalone-recovery/service-labels.ts +5 -2
  525. package/src/runtime/standalone-recovery/watchdog-heartbeat.ts +5 -2
  526. package/src/runtime/workflow/schedules/browser-probe.ts +17 -6
  527. package/src/runtime/workflow/schedules/chatgpt-automation-migration.ts +11 -3
  528. package/src/runtime/workflow/schedules/engine.ts +166 -178
  529. package/src/runtime/workflow/schedules/pending-activation.ts +11 -4
  530. package/src/runtime/workflow/schedules/work-continuation.ts +95 -11
  531. package/src/runtime/workflows/runtime.ts +15 -19
  532. package/src/testing/test-governance.ts +5 -1
  533. package/supervisor/chatgpt-conversation.ts +23 -0
  534. package/supervisor/client.ts +218 -0
  535. package/supervisor/control-plane.ts +963 -0
  536. package/supervisor/entry.ts +15 -0
  537. package/supervisor/forge-validators.ts +147 -0
  538. package/supervisor/index.ts +5 -0
  539. package/supervisor/native-browser-adapter.ts +1151 -0
  540. package/supervisor/native-messaging/host.ts +58 -0
  541. package/supervisor/native-messaging/manifest.ts +26 -0
  542. package/supervisor/native-messaging/protocol.ts +27 -0
  543. package/supervisor/paths.ts +18 -0
  544. package/supervisor/protocol.ts +250 -0
  545. package/supervisor/server.ts +412 -0
  546. package/supervisor/store.ts +1870 -0
  547. package/supervisor/tsconfig.json +8 -0
  548. package/supervisor/types.ts +261 -0
  549. package/SKILL.md +0 -427
  550. package/adapters/chatgpt/controller-host.ts +0 -119
  551. package/adapters/mcp/controller-round-compatibility.ts +0 -184
  552. package/adapters/mcp/frozen-client-semantic-compatibility.ts +0 -292
  553. package/adapters/mcp/runtime-gateway/work-compat-adapter.ts +0 -502
  554. package/adapters/mcp/runtime-gateway/work-validation-reconciler.ts +0 -1
  555. package/adapters/mcp/toolset-selection.ts +0 -41
  556. package/agents/openai.yaml +0 -4
  557. package/assets/skill-hooks.json +0 -41
  558. package/assets/skill-version.json +0 -189
  559. package/assets/skills/claude-review/SKILL.md +0 -231
  560. package/assets/skills/codex-review/SKILL.md +0 -103
  561. package/assets/templates/helpers/check-skill-version.ts +0 -193
  562. package/packages/kernel/progression/api/index.ts +0 -2
  563. package/packages/kernel/progression/application/projector.ts +0 -211
  564. package/packages/kernel/progression/domain/types.ts +0 -116
  565. package/packages/kernel/progression/index.ts +0 -1
  566. package/packages/kernel/scheduler/application/continuation-service.ts +0 -212
  567. package/packages/kernel/scheduler/domain/continuation.ts +0 -38
  568. package/packages/kernel/scheduler/infrastructure/continuation-dispatch-store.ts +0 -38
  569. package/packages/kernel/work/domain/admission-policy.ts +0 -34
  570. package/scripts/benchmark-background-check-overlap.ts +0 -228
  571. package/scripts/benchmark-computer-hotpath.ts +0 -255
  572. package/scripts/benchmark-controller-hotpath.ts +0 -212
  573. package/scripts/benchmark-controller-round2.ts +0 -191
  574. package/scripts/benchmark-ios-agent-device.ts +0 -511
  575. package/scripts/benchmark-mcp-host.sh +0 -117
  576. package/scripts/benchmark-mcp-transport.ts +0 -169
  577. package/scripts/benchmark-operational-memory-activation.ts +0 -235
  578. package/scripts/benchmark-operational-shadow.ts +0 -28
  579. package/scripts/benchmark-quality-harness.ts +0 -146
  580. package/scripts/benchmark-route-session-concurrency.ts +0 -915
  581. package/scripts/benchmark-thin-harness-gateway-ab.ts +0 -632
  582. package/scripts/benchmark-thin-harness-mcp-e2e.ts +0 -498
  583. package/scripts/benchmark-thin-harness.ts +0 -251
  584. package/scripts/benchmark-typescript-navigation.ts +0 -186
  585. package/scripts/benchmark-work-efficiency.ts +0 -334
  586. package/scripts/build-controller-ui.ts +0 -28
  587. package/scripts/check-npm-release.sh +0 -32
  588. package/scripts/check-public-release-surface.sh +0 -19
  589. package/scripts/check-release-published.sh +0 -57
  590. package/scripts/check-release-readiness.sh +0 -37
  591. package/scripts/check-release-version.mjs +0 -74
  592. package/scripts/check-skill-version.ts +0 -5
  593. package/scripts/check-tarball-install-smoke.sh +0 -150
  594. package/scripts/ensure-codegraph.sh +0 -16
  595. package/scripts/package-source-archive.sh +0 -147
  596. package/scripts/public-release-files.txt +0 -39
  597. package/scripts/public-release.ts +0 -174
  598. package/scripts/publish-release-tarball.sh +0 -27
  599. package/scripts/route-nl-vs-ts-eval.ts +0 -679
  600. package/scripts/run-skill-hook.ts +0 -244
  601. package/scripts/stage-runtime-release.ts +0 -44
  602. package/scripts/sync-codex-installed-copies.sh +0 -182
  603. package/src/cli/commands/tools.ts +0 -167
  604. package/src/cli/controller/progress.ts +0 -656
  605. package/src/cli/controller/work-mode.ts +0 -181
  606. package/src/cli/local-bridge/console-assets.ts +0 -17
  607. package/src/cli/local-bridge/dashboard.ts +0 -17
  608. package/src/cli/local-bridge/frontend/src/App.tsx +0 -10
  609. package/src/cli/local-bridge/frontend/src/components/Button.tsx +0 -1
  610. package/src/cli/local-bridge/frontend/src/components/DetailPane.tsx +0 -3
  611. package/src/cli/local-bridge/frontend/src/components/SearchField.tsx +0 -1
  612. package/src/cli/local-bridge/frontend/src/components/SectionHeader.tsx +0 -1
  613. package/src/cli/local-bridge/frontend/src/components/Segmented.tsx +0 -1
  614. package/src/cli/local-bridge/frontend/src/components/StatusText.tsx +0 -3
  615. package/src/cli/local-bridge/frontend/src/design/icons.tsx +0 -11
  616. package/src/cli/local-bridge/frontend/src/design/tokens.css +0 -8
  617. package/src/cli/local-bridge/frontend/src/features/automations/AutomationsView.tsx +0 -153
  618. package/src/cli/local-bridge/frontend/src/features/capabilities/CapabilitiesView.tsx +0 -37
  619. package/src/cli/local-bridge/frontend/src/features/overview/OverviewView.tsx +0 -183
  620. package/src/cli/local-bridge/frontend/src/features/repositories/RepositoriesView.tsx +0 -2
  621. package/src/cli/local-bridge/frontend/src/features/system/SystemView.tsx +0 -2
  622. package/src/cli/local-bridge/frontend/src/features/work/WorkView.tsx +0 -4
  623. package/src/cli/local-bridge/frontend/src/lib/api.ts +0 -30
  624. package/src/cli/local-bridge/frontend/src/lib/format.ts +0 -4
  625. package/src/cli/local-bridge/frontend/src/lib/routes.ts +0 -7
  626. package/src/cli/local-bridge/frontend/src/main.tsx +0 -1
  627. package/src/cli/local-bridge/frontend/src/shell/AppShell.tsx +0 -1
  628. package/src/cli/local-bridge/frontend/src/shell/CommandBar.tsx +0 -2
  629. package/src/cli/local-bridge/frontend/src/shell/Sidebar.tsx +0 -4
  630. package/src/cli/local-bridge/frontend/src/styles.css +0 -28
  631. package/src/cli/local-bridge/frontend/src/types.ts +0 -15
  632. package/src/cli/local-bridge/frontend/src/vite-env.d.ts +0 -1
  633. package/src/cli/local-bridge/frontend/vite.config.ts +0 -27
  634. package/src/cli/local-bridge/ui-dist/app.css +0 -1
  635. package/src/cli/local-bridge/ui-dist/app.js +0 -11228
  636. package/src/cli/mcp/access-mode.ts +0 -2
  637. package/src/cli/mcp/access-tools.ts +0 -2
  638. package/src/cli/mcp/audit.ts +0 -2
  639. package/src/cli/mcp/auth.ts +0 -2
  640. package/src/cli/mcp/instructions.ts +0 -2
  641. package/src/cli/mcp/legacy-context.ts +0 -2
  642. package/src/cli/mcp/legacy-tool-service.ts +0 -2
  643. package/src/cli/mcp/multi-repository.ts +0 -2
  644. package/src/cli/mcp/oauth.ts +0 -2
  645. package/src/cli/mcp/openai-secure-tunnel.ts +0 -2
  646. package/src/cli/mcp/paths.ts +0 -2
  647. package/src/cli/mcp/policy.ts +0 -2
  648. package/src/cli/mcp/post-finalize-work-attribution.ts +0 -2
  649. package/src/cli/mcp/proxy-env.ts +0 -2
  650. package/src/cli/mcp/readiness-projection.ts +0 -2
  651. package/src/cli/mcp/redaction.ts +0 -2
  652. package/src/cli/mcp/repo.ts +0 -2
  653. package/src/cli/mcp/repository-tools.ts +0 -2
  654. package/src/cli/mcp/server.ts +0 -2
  655. package/src/cli/mcp/setup.ts +0 -2
  656. package/src/cli/mcp/tool-capability-cache.ts +0 -2
  657. package/src/cli/mcp/tool-contract.ts +0 -2
  658. package/src/cli/mcp/tools.ts +0 -2
  659. package/src/cli/mcp/toolset-names.ts +0 -2
  660. package/src/cli/mcp/toolset-selection.ts +0 -2
  661. package/src/cli/mcp/toolset.ts +0 -2
  662. package/src/cli/mcp/transports/http.ts +0 -2
  663. package/src/cli/mcp/transports/session-registry.ts +0 -2
  664. package/src/cli/mcp/transports/stdio.ts +0 -2
  665. package/src/cli/mcp/types.ts +0 -2
  666. package/src/cli/mcp/umbrella-tools.ts +0 -2
  667. package/src/cli/tools/codegraph.ts +0 -695
  668. package/src/core/adoption/helper-wrapper-plan.ts +0 -159
  669. package/src/runtime/context/codegraph-cache-boundary.ts +0 -255
  670. package/src/runtime/context/codegraph-read-provider.ts +0 -611
  671. package/src/runtime/context/codegraph-sidecar.cjs +0 -248
  672. package/src/runtime/control-plane/codegraph-cache-retention.ts +0 -164
  673. package/src/runtime/control-plane/execution/content-equivalent-commit-authority.ts +0 -169
  674. package/src/runtime/control-plane/execution/direct-canonical-work-reconciliation.ts +0 -85
  675. package/src/runtime/control-plane/execution/direct-edit-work-completion.ts +0 -655
  676. package/src/runtime/control-plane/execution/work-finalization-service.ts +0 -2850
  677. package/src/runtime/control-plane/execution/work-path-scope.ts +0 -37
  678. package/src/runtime/control-plane/execution/work-task-receipt.ts +0 -468
  679. package/src/runtime/control-plane/facade/controller-round-relay.ts +0 -3
  680. package/src/runtime/control-plane/facade/work-admission-policy.ts +0 -142
  681. package/src/runtime/control-plane/facade/work-implementation-review.ts +0 -2
  682. package/src/runtime/control-plane/facade/work-state-machine.ts +0 -2
  683. package/src/runtime/control-plane/facade/work-task-projection.ts +0 -66
  684. package/src/runtime/control-plane/routing/index.ts +0 -1
  685. package/src/runtime/control-plane/routing/route-policy.ts +0 -401
  686. package/src/runtime/control-plane/routing/workspace-admission.ts +0 -70
  687. package/src/runtime/gateway/mcp/execution-tools.ts +0 -2
  688. package/src/runtime/gateway/mcp/legacy-ios-tool-adapter.ts +0 -2
  689. package/src/runtime/gateway/mcp/persisted-check-process.ts +0 -2
  690. package/src/runtime/gateway/mcp/process-tools.ts +0 -2
  691. package/src/runtime/gateway/mcp/router.ts +0 -2
  692. package/src/runtime/gateway/mcp/runtime-tool-definitions.ts +0 -2
  693. package/src/runtime/gateway/mcp/runtime-tools.ts +0 -2
  694. package/src/runtime/gateway/mcp/work-validation-reconciler.ts +0 -2
  695. package/src/runtime/plugins/browser-provider-registry.ts +0 -2
@@ -1,14 +1,41 @@
1
1
  import { createHash, randomUUID, timingSafeEqual } from 'crypto';
2
2
  import { join } from 'path';
3
- import { repositoryControllerRoot } from '../../../../src/cli/repositories/controller-home';
3
+ import { FORGE_INSTANCE_SCOPE_KEY, repositoryControllerRoot } from '../../../../src/cli/repositories/controller-home';
4
4
  import { withControllerLock } from '../../../../src/cli/repositories/locks';
5
- import { peekExecutionSession } from '../../../../src/runtime/control-plane/execution/session-store';
5
+ import {
6
+ peekExecutionSession,
7
+ peekExecutionSessionWithinTransaction,
8
+ } from '../../../../src/runtime/control-plane/execution/session-store';
6
9
  import { readJsonFile } from '../../../../src/runtime/shared/json-files';
7
- import { readControlPlaneRecord, readOrImportControlPlaneRecord, writeControlPlaneRecord } from '../../../../src/runtime/control-plane/persistence/sqlite-store';
8
- import { getWorkContract, isTerminalWorkContractStatus } from '../../work/api/index';
10
+ import {
11
+ readControlPlaneRecord,
12
+ readControlPlaneRecordWithinTransaction,
13
+ writeControlPlaneRecord,
14
+ writeControlPlaneRecordWithinTransaction,
15
+ type SqliteDatabase,
16
+ } from '../../../../src/runtime/control-plane/persistence/sqlite-store';
9
17
  import { type ControllerSession, type ControllerSessionStore, type ControllerType } from '../domain/types';
18
+ import { getWorkContract, semanticWorkState } from '../../work/api/index';
10
19
 
11
- export interface ControllerSessionStoreOptions { controllerHome: string; repoId: string; now?: () => string; }
20
+ export interface ControllerSessionStoreOptions {
21
+ controllerHome: string;
22
+ /** Legacy repository provenance/migration hint only; canonical ControllerSession state is ForgeInstance-scoped. */
23
+ repoId: string;
24
+ now?: () => string;
25
+ }
26
+
27
+ const SESSION_STORE_NAMESPACE = 'controller_session_claim_store';
28
+ const SESSION_STORE_KEY = 'index';
29
+ const SESSION_STORE_SCHEMA_VERSION = 1;
30
+
31
+ function assertControllerWorkClaimable(options: ControllerSessionStoreOptions, workId: string): void {
32
+ const work = getWorkContract({ controllerHome: options.controllerHome, repoId: options.repoId }, workId);
33
+ if (!work) return;
34
+ const state = semanticWorkState(work);
35
+ if (state !== 'open') throw new Error(`WORK_CONTROLLER_CLAIM_TERMINAL: ${workId}:${state}`);
36
+ }
37
+
38
+ export type ClaimedControllerSession = ControllerSession & { claimGeneration: number };
12
39
 
13
40
  export interface ControllerSessionClaimInput {
14
41
  workId: string;
@@ -36,23 +63,70 @@ function path(options: ControllerSessionStoreOptions): string {
36
63
 
37
64
  function now(options: ControllerSessionStoreOptions): string { return options.now?.() ?? new Date().toISOString(); }
38
65
 
39
- function read(options: ControllerSessionStoreOptions): ControllerSessionStore {
40
- const legacyPath = path(options);
41
- return readOrImportControlPlaneRecord<ControllerSessionStore>(options.controllerHome, {
42
- namespace: 'controller_session_claim_store',
43
- scope: options.repoId,
44
- key: 'index',
66
+ function legacyStore(options: ControllerSessionStoreOptions): ControllerSessionStore {
67
+ const sqlite = readControlPlaneRecord<ControllerSessionStore>(
68
+ options.controllerHome,
69
+ SESSION_STORE_NAMESPACE,
70
+ options.repoId,
71
+ SESSION_STORE_KEY,
72
+ )?.value;
73
+ if (sqlite) return sqlite;
74
+ return readJsonFile<ControllerSessionStore>(path(options), {
45
75
  schemaVersion: 1,
46
- readLegacy: () => readJsonFile<ControllerSessionStore>(legacyPath, { schemaVersion: 1, updatedAt: now(options), sessions: [] }),
47
- })?.value ?? { schemaVersion: 1, updatedAt: now(options), sessions: [] };
76
+ updatedAt: now(options),
77
+ sessions: [],
78
+ });
79
+ }
80
+
81
+ function mergeSessionStores(
82
+ canonical: ControllerSessionStore,
83
+ legacy: ControllerSessionStore,
84
+ ): ControllerSessionStore {
85
+ const sessions = new Map(canonical.sessions.map((session) => [session.workId, session]));
86
+ for (const candidate of legacy.sessions) {
87
+ const existing = sessions.get(candidate.workId);
88
+ if (!existing) {
89
+ sessions.set(candidate.workId, candidate);
90
+ continue;
91
+ }
92
+ if (JSON.stringify(existing) === JSON.stringify(candidate)) continue;
93
+ const existingGeneration = existing.claimGeneration ?? 0;
94
+ const candidateGeneration = candidate.claimGeneration ?? 0;
95
+ const existingClaimedAt = Date.parse(existing.claimedAt);
96
+ const candidateClaimedAt = Date.parse(candidate.claimedAt);
97
+ if (existingGeneration > candidateGeneration
98
+ || (existingGeneration === candidateGeneration
99
+ && Number.isFinite(existingClaimedAt)
100
+ && Number.isFinite(candidateClaimedAt)
101
+ && existingClaimedAt > candidateClaimedAt)) {
102
+ // Canonical state has advanced since the read-only legacy snapshot.
103
+ continue;
104
+ }
105
+ throw new Error(`CONTROLLER_SESSION_ID_COLLISION: ${candidate.workId}`);
106
+ }
107
+ return {
108
+ schemaVersion: 1,
109
+ updatedAt: canonical.updatedAt >= legacy.updatedAt ? canonical.updatedAt : legacy.updatedAt,
110
+ sessions: [...sessions.values()],
111
+ };
112
+ }
113
+
114
+ function read(options: ControllerSessionStoreOptions): ControllerSessionStore {
115
+ const canonical = readControlPlaneRecord<ControllerSessionStore>(
116
+ options.controllerHome,
117
+ SESSION_STORE_NAMESPACE,
118
+ FORGE_INSTANCE_SCOPE_KEY,
119
+ SESSION_STORE_KEY,
120
+ )?.value ?? { schemaVersion: 1 as const, updatedAt: now(options), sessions: [] };
121
+ return mergeSessionStores(canonical, legacyStore(options));
48
122
  }
49
123
 
50
124
  function write(options: ControllerSessionStoreOptions, store: ControllerSessionStore): void {
51
125
  writeControlPlaneRecord(options.controllerHome, {
52
- namespace: 'controller_session_claim_store',
53
- scope: options.repoId,
54
- key: 'index',
55
- schemaVersion: 1,
126
+ namespace: SESSION_STORE_NAMESPACE,
127
+ scope: FORGE_INSTANCE_SCOPE_KEY,
128
+ key: SESSION_STORE_KEY,
129
+ schemaVersion: SESSION_STORE_SCHEMA_VERSION,
56
130
  value: store,
57
131
  action: 'controller_session_claim_write',
58
132
  });
@@ -67,18 +141,42 @@ interface RetainedControllerSessionRecord {
67
141
  releasedAt?: string;
68
142
  }
69
143
 
144
+ function retainedControllerSessionRecord(
145
+ options: ControllerSessionStoreOptions,
146
+ session: ControllerSession,
147
+ releasedAt?: string,
148
+ ): RetainedControllerSessionRecord {
149
+ const retainedAt = now(options);
150
+ return { schemaVersion: 1, session, retainedAt, ...(releasedAt ? { releasedAt } : {}) };
151
+ }
152
+
70
153
  function persistRetainedControllerSession(
71
154
  options: ControllerSessionStoreOptions,
72
155
  session: ControllerSession,
73
156
  releasedAt?: string,
74
157
  ): void {
75
- const retainedAt = now(options);
76
158
  writeControlPlaneRecord(options.controllerHome, {
77
159
  namespace: RETAINED_SESSION_NAMESPACE,
78
- scope: options.repoId,
160
+ scope: FORGE_INSTANCE_SCOPE_KEY,
161
+ key: session.workId,
162
+ schemaVersion: 1,
163
+ value: retainedControllerSessionRecord(options, session, releasedAt),
164
+ action: releasedAt ? 'controller_session_identity_released' : 'controller_session_identity_retained',
165
+ });
166
+ }
167
+
168
+ function persistRetainedControllerSessionWithinTransaction(
169
+ database: SqliteDatabase,
170
+ options: ControllerSessionStoreOptions,
171
+ session: ControllerSession,
172
+ releasedAt?: string,
173
+ ): void {
174
+ writeControlPlaneRecordWithinTransaction(database, {
175
+ namespace: RETAINED_SESSION_NAMESPACE,
176
+ scope: FORGE_INSTANCE_SCOPE_KEY,
79
177
  key: session.workId,
80
178
  schemaVersion: 1,
81
- value: { schemaVersion: 1, session, retainedAt, ...(releasedAt ? { releasedAt } : {}) } satisfies RetainedControllerSessionRecord,
179
+ value: retainedControllerSessionRecord(options, session, releasedAt),
82
180
  action: releasedAt ? 'controller_session_identity_released' : 'controller_session_identity_retained',
83
181
  });
84
182
  }
@@ -88,14 +186,32 @@ export function getRetainedControllerSession(
88
186
  options: ControllerSessionStoreOptions,
89
187
  workId: string,
90
188
  ): ControllerSession | undefined {
91
- const retained = readControlPlaneRecord<RetainedControllerSessionRecord>(
189
+ const canonical = readControlPlaneRecord<RetainedControllerSessionRecord>(
190
+ options.controllerHome,
191
+ RETAINED_SESSION_NAMESPACE,
192
+ FORGE_INSTANCE_SCOPE_KEY,
193
+ workId,
194
+ )?.value.session;
195
+ const legacy = readControlPlaneRecord<RetainedControllerSessionRecord>(
92
196
  options.controllerHome,
93
197
  RETAINED_SESSION_NAMESPACE,
94
198
  options.repoId,
95
199
  workId,
96
200
  )?.value.session;
97
- if (retained) return retained;
98
- return read(options).sessions.find((entry) => entry.workId === workId);
201
+ if (canonical && legacy && JSON.stringify(canonical) !== JSON.stringify(legacy)) {
202
+ const canonicalGeneration = canonical.claimGeneration ?? 0;
203
+ const legacyGeneration = legacy.claimGeneration ?? 0;
204
+ const canonicalClaimedAt = Date.parse(canonical.claimedAt);
205
+ const legacyClaimedAt = Date.parse(legacy.claimedAt);
206
+ if (!(canonicalGeneration > legacyGeneration
207
+ || (canonicalGeneration === legacyGeneration
208
+ && Number.isFinite(canonicalClaimedAt)
209
+ && Number.isFinite(legacyClaimedAt)
210
+ && canonicalClaimedAt > legacyClaimedAt))) {
211
+ throw new Error(`CONTROLLER_SESSION_ID_COLLISION: ${workId}`);
212
+ }
213
+ }
214
+ return canonical ?? legacy ?? read(options).sessions.find((entry) => entry.workId === workId);
99
215
  }
100
216
 
101
217
  const DEFAULT_CONTROLLER_RECOVERY_GRACE_MS = 5 * 60_000;
@@ -150,19 +266,18 @@ function assertIdentity(input: ControllerSessionClaimInput): void {
150
266
  }
151
267
  }
152
268
 
153
- function assertWorkClaimable(options: ControllerSessionStoreOptions, workId: string): void {
154
- const work = getWorkContract({ controllerHome: options.controllerHome, repoId: options.repoId }, workId);
155
- if (work && isTerminalWorkContractStatus(work.status)) {
156
- throw new Error(`WORK_CONTROLLER_CLAIM_TERMINAL: ${work.workId}:${work.status}`);
157
- }
158
- }
269
+ /**
270
+ * Compatibility no-op. ControllerSession is mechanical dispatch/reattachment
271
+ * state and does not decide whether semantic Work is open or terminal.
272
+ */
273
+ export function assertControllerSessionWorkClaimable(_options: ControllerSessionStoreOptions, _workId: string): void {}
159
274
 
160
275
  function claimedSession(
161
276
  options: ControllerSessionStoreOptions,
162
277
  input: ControllerSessionClaimInput,
163
278
  claimedAt: string,
164
279
  previous?: ControllerSession,
165
- ): ControllerSession {
280
+ ): ClaimedControllerSession {
166
281
  const leaseExpiresAt = new Date(
167
282
  Date.parse(claimedAt) + Math.max(1_000, Math.min(input.leaseMs ?? DEFAULT_CONTROLLER_LEASE_MS, MAX_CONTROLLER_LEASE_MS)),
168
283
  ).toISOString();
@@ -199,12 +314,12 @@ function assertExpectedGeneration(input: ControllerSessionClaimInput, current: C
199
314
  }
200
315
  }
201
316
 
202
- function persistClaim(
317
+ function preparedClaim(
203
318
  options: ControllerSessionStoreOptions,
204
319
  store: ControllerSessionStore,
205
320
  input: ControllerSessionClaimInput,
206
321
  previous?: ControllerSession,
207
- ): ControllerSession {
322
+ ): { claimedAt: string; session: ClaimedControllerSession; nextStore: ControllerSessionStore } {
208
323
  const claimedAt = now(options);
209
324
  const claimedAtMs = Date.parse(claimedAt);
210
325
  const session = claimedSession(options, input, claimedAt, previous);
@@ -212,9 +327,68 @@ function persistClaim(
212
327
  ...store.sessions.filter((entry) => entry.workId !== input.workId && Date.parse(entry.leaseExpiresAt) > claimedAtMs),
213
328
  session,
214
329
  ];
215
- write(options, { schemaVersion: 1, updatedAt: claimedAt, sessions });
216
- persistRetainedControllerSession(options, session);
217
- return session;
330
+ return { claimedAt, session, nextStore: { schemaVersion: 1, updatedAt: claimedAt, sessions } };
331
+ }
332
+
333
+ function persistClaim(
334
+ options: ControllerSessionStoreOptions,
335
+ store: ControllerSessionStore,
336
+ input: ControllerSessionClaimInput,
337
+ previous?: ControllerSession,
338
+ ): ClaimedControllerSession {
339
+ const prepared = preparedClaim(options, store, input, previous);
340
+ write(options, prepared.nextStore);
341
+ persistRetainedControllerSession(options, prepared.session);
342
+ return prepared.session;
343
+ }
344
+
345
+ function readSessionStoreWithinTransaction(
346
+ database: SqliteDatabase,
347
+ options: ControllerSessionStoreOptions,
348
+ ) {
349
+ let current = readControlPlaneRecordWithinTransaction<ControllerSessionStore>(
350
+ database, SESSION_STORE_NAMESPACE, FORGE_INSTANCE_SCOPE_KEY, SESSION_STORE_KEY,
351
+ );
352
+ const legacySqlite = readControlPlaneRecordWithinTransaction<ControllerSessionStore>(
353
+ database, SESSION_STORE_NAMESPACE, options.repoId, SESSION_STORE_KEY,
354
+ )?.value;
355
+ const legacy = legacySqlite ?? readJsonFile<ControllerSessionStore>(path(options), {
356
+ schemaVersion: 1,
357
+ updatedAt: now(options),
358
+ sessions: [],
359
+ });
360
+ if (current) return { ...current, value: mergeSessionStores(current.value, legacy) };
361
+ current = writeControlPlaneRecordWithinTransaction(database, {
362
+ namespace: SESSION_STORE_NAMESPACE,
363
+ scope: FORGE_INSTANCE_SCOPE_KEY,
364
+ key: SESSION_STORE_KEY,
365
+ schemaVersion: SESSION_STORE_SCHEMA_VERSION,
366
+ value: legacy,
367
+ action: 'legacy_controller_session_import',
368
+ expectedRevision: null,
369
+ });
370
+ return current;
371
+ }
372
+
373
+ function persistClaimWithinTransaction(
374
+ database: SqliteDatabase,
375
+ options: ControllerSessionStoreOptions,
376
+ storeRecord: ReturnType<typeof readSessionStoreWithinTransaction>,
377
+ input: ControllerSessionClaimInput,
378
+ previous?: ControllerSession,
379
+ ): ClaimedControllerSession {
380
+ const prepared = preparedClaim(options, storeRecord.value, input, previous);
381
+ writeControlPlaneRecordWithinTransaction(database, {
382
+ namespace: SESSION_STORE_NAMESPACE,
383
+ scope: FORGE_INSTANCE_SCOPE_KEY,
384
+ key: SESSION_STORE_KEY,
385
+ schemaVersion: SESSION_STORE_SCHEMA_VERSION,
386
+ value: prepared.nextStore,
387
+ action: 'controller_session_claim_write',
388
+ expectedRevision: storeRecord.revision,
389
+ });
390
+ persistRetainedControllerSessionWithinTransaction(database, options, prepared.session);
391
+ return prepared.session;
218
392
  }
219
393
 
220
394
  export function getControllerSession(options: ControllerSessionStoreOptions, workId: string): ControllerSession | undefined {
@@ -371,7 +545,7 @@ export function withControllerSessionTerminalizationFence<T>(
371
545
  ): ControllerTerminalizationFenceResult<T> {
372
546
  return withControllerLock(
373
547
  options.controllerHome,
374
- { scope: 'task', repoId: options.repoId, taskId: `controller-session-${input.workId}` },
548
+ { scope: 'global', resource: 'controller-session-store' },
375
549
  input.actor,
376
550
  () => {
377
551
  const owner = activeSession(read(options), input.workId, optionsNowMs(options));
@@ -404,7 +578,7 @@ export function releaseControllerSessionWithAuthority(
404
578
  ): ControllerTerminalizationFenceResult<void> {
405
579
  return withControllerLock(
406
580
  options.controllerHome,
407
- { scope: 'task', repoId: options.repoId, taskId: `controller-session-${input.workId}` },
581
+ { scope: 'global', resource: 'controller-session-store' },
408
582
  input.actor,
409
583
  () => {
410
584
  const store = read(options);
@@ -442,14 +616,14 @@ export function releaseObservedControllerSession(
442
616
  export function claimControllerSession(
443
617
  options: ControllerSessionStoreOptions,
444
618
  input: ControllerSessionClaimInput,
445
- ): ControllerSession {
619
+ ): ClaimedControllerSession {
446
620
  assertIdentity(input);
447
621
  return withControllerLock(
448
622
  options.controllerHome,
449
- { scope: 'task', repoId: options.repoId, taskId: `controller-session-${input.workId}` },
623
+ { scope: 'global', resource: 'controller-session-store' },
450
624
  `controller-claim:${input.controllerId}:${input.sessionId}`,
451
625
  () => {
452
- assertWorkClaimable(options, input.workId);
626
+ assertControllerWorkClaimable(options, input.workId);
453
627
  const store = read(options);
454
628
  const current = activeSession(store, input.workId, optionsNowMs(options));
455
629
  const previous = current ?? store.sessions
@@ -470,45 +644,86 @@ export function claimControllerSession(
470
644
  * A same-principal session rotation therefore preserves ownership generation;
471
645
  * a controller-epoch change is recovery and advances the generation fence.
472
646
  */
647
+ function resumableControllerSessionPrevious(
648
+ options: ControllerSessionStoreOptions,
649
+ store: ControllerSessionStore,
650
+ input: ControllerSessionClaimInput & { principalId: string; controllerInstanceId: string },
651
+ database?: SqliteDatabase,
652
+ ): ControllerSession | undefined {
653
+ assertControllerWorkClaimable(options, input.workId);
654
+ const currentNowMs = optionsNowMs(options);
655
+ const current = activeSession(store, input.workId, currentNowMs);
656
+ assertExpectedGeneration(input, current);
657
+ if (!current) {
658
+ return store.sessions
659
+ .filter((entry) => entry.workId === input.workId)
660
+ .sort((left, right) => (right.claimGeneration ?? 0) - (left.claimGeneration ?? 0))[0];
661
+ }
662
+ const explicitPrincipal = current.principalId?.trim();
663
+ const priorExecution = explicitPrincipal
664
+ ? undefined
665
+ : database
666
+ ? peekExecutionSessionWithinTransaction(database, options.controllerHome, current.sessionId)
667
+ : peekExecutionSession(options.controllerHome, current.sessionId);
668
+ const currentPrincipal = explicitPrincipal || priorExecution?.principalId?.trim() || current.controllerId;
669
+ const staleRecoveryAllowed = input.allowStaleRecovery === true
670
+ && input.expectedClaimGeneration !== undefined
671
+ && !sessionBlocksRecovery(options, current, { nowMs: currentNowMs });
672
+ if (currentPrincipal !== input.principalId.trim() && !staleRecoveryAllowed) {
673
+ throw new Error(`WORK_CONTROLLER_PRINCIPAL_MISMATCH: ${input.workId} is owned by another authenticated principal`);
674
+ }
675
+ if (current.controllerId !== input.controllerId && !staleRecoveryAllowed) {
676
+ throw new Error(`WORK_ALREADY_CLAIMED: ${input.workId} is owned by ${current.controllerId}`);
677
+ }
678
+ if (current.controllerType !== input.controllerType && !staleRecoveryAllowed) {
679
+ throw new Error(`WORK_CONTROLLER_TYPE_MISMATCH: ${input.workId} is owned by ${current.controllerType}`);
680
+ }
681
+ return current;
682
+ }
683
+
684
+ export function withControllerSessionMutationLock<T>(
685
+ options: ControllerSessionStoreOptions,
686
+ workId: string,
687
+ actor: string,
688
+ operation: () => T,
689
+ ): T {
690
+ return withControllerLock(
691
+ options.controllerHome,
692
+ { scope: 'global', resource: 'controller-session-store' },
693
+ actor,
694
+ operation,
695
+ );
696
+ }
697
+
698
+ /** Transaction-aware resume used only by higher-level Controller claim orchestration while the canonical session lock is held. */
699
+ export function resumeControllerSessionWithinTransaction(
700
+ database: SqliteDatabase,
701
+ options: ControllerSessionStoreOptions,
702
+ input: ControllerSessionClaimInput & { principalId: string; controllerInstanceId: string },
703
+ ): ClaimedControllerSession {
704
+ assertIdentity(input);
705
+ if (!input.principalId.trim() || !input.controllerInstanceId.trim()) throw new Error('CONTROLLER_RESUME_AUTHORITY_REQUIRED');
706
+ const storeRecord = readSessionStoreWithinTransaction(database, options);
707
+ const previous = resumableControllerSessionPrevious(options, storeRecord.value, input, database);
708
+ return persistClaimWithinTransaction(database, options, storeRecord, input, previous);
709
+ }
710
+
473
711
  export function resumeControllerSession(
474
712
  options: ControllerSessionStoreOptions,
475
713
  input: ControllerSessionClaimInput & { principalId: string; controllerInstanceId: string },
476
- ): ControllerSession {
714
+ ): ClaimedControllerSession {
477
715
  assertIdentity(input);
478
716
  if (!input.principalId.trim() || !input.controllerInstanceId.trim()) {
479
717
  throw new Error('CONTROLLER_RESUME_AUTHORITY_REQUIRED');
480
718
  }
481
- return withControllerLock(
482
- options.controllerHome,
483
- { scope: 'task', repoId: options.repoId, taskId: `controller-session-${input.workId}` },
719
+ return withControllerSessionMutationLock(
720
+ options,
721
+ input.workId,
484
722
  `controller-resume:${input.controllerId}:${input.sessionId}`,
485
723
  () => {
486
- assertWorkClaimable(options, input.workId);
487
724
  const store = read(options);
488
- const currentNowMs = optionsNowMs(options);
489
- const current = activeSession(store, input.workId, currentNowMs);
490
- assertExpectedGeneration(input, current);
491
- if (!current) {
492
- const previous = store.sessions
493
- .filter((entry) => entry.workId === input.workId)
494
- .sort((left, right) => (right.claimGeneration ?? 0) - (left.claimGeneration ?? 0))[0];
495
- return persistClaim(options, store, input, previous);
496
- }
497
- const priorExecution = peekExecutionSession(options.controllerHome, current.sessionId);
498
- const currentPrincipal = current.principalId?.trim() || priorExecution?.principalId?.trim() || current.controllerId;
499
- const staleRecoveryAllowed = input.allowStaleRecovery === true
500
- && input.expectedClaimGeneration !== undefined
501
- && !sessionBlocksRecovery(options, current, { nowMs: currentNowMs });
502
- if (currentPrincipal !== input.principalId.trim() && !staleRecoveryAllowed) {
503
- throw new Error(`WORK_CONTROLLER_PRINCIPAL_MISMATCH: ${input.workId} is owned by another authenticated principal`);
504
- }
505
- if (current.controllerId !== input.controllerId && !staleRecoveryAllowed) {
506
- throw new Error(`WORK_ALREADY_CLAIMED: ${input.workId} is owned by ${current.controllerId}`);
507
- }
508
- if (current.controllerType !== input.controllerType && !staleRecoveryAllowed) {
509
- throw new Error(`WORK_CONTROLLER_TYPE_MISMATCH: ${input.workId} is owned by ${current.controllerType}`);
510
- }
511
- return persistClaim(options, store, input, current);
725
+ const previous = resumableControllerSessionPrevious(options, store, input);
726
+ return persistClaim(options, store, input, previous);
512
727
  },
513
728
  );
514
729
  }
@@ -531,40 +746,76 @@ export function bindControllerSessionToCurrentRuntime(
531
746
  },
532
747
  ): ControllerSession {
533
748
  assertIdentity(input);
534
- const current = getControllerSession(options, input.workId);
535
- if (!current) {
536
- if (input.allowClaimIfMissing !== true) throw new Error(`WORK_CONTROLLER_OWNER_REQUIRED: ${input.workId}`);
537
- return claimControllerSession(options, { ...input, expectedClaimGeneration: 0 });
538
- }
539
- const currentPrincipal = controllerSessionPrincipalId(current);
540
- if (current.controllerId !== input.controllerId) {
541
- throw new Error(`WORK_CONTROLLER_OWNER_MISMATCH: ${input.workId} is owned by ${current.controllerId}`);
542
- }
543
- if (current.controllerType !== input.controllerType) {
544
- throw new Error(`WORK_CONTROLLER_TYPE_MISMATCH: ${input.workId} is owned by ${current.controllerType}`);
545
- }
546
- if (currentPrincipal !== input.principalId.trim()) {
547
- throw new Error(`WORK_CONTROLLER_PRINCIPAL_MISMATCH: ${input.workId}`);
548
- }
549
- const ownerInstanceId = current.controllerInstanceId?.trim() || '';
550
749
  const requestedInstanceId = input.controllerInstanceId.trim();
551
- if (ownerInstanceId !== requestedInstanceId) {
552
- const currentRuntimeInstanceId = input.currentRuntimeInstanceId?.trim() || '';
553
- if (!currentRuntimeInstanceId || currentRuntimeInstanceId !== requestedInstanceId) {
554
- throw new Error(`WORK_CONTROLLER_INSTANCE_MISMATCH: ${input.workId}`);
555
- }
556
- }
557
- if (ownerInstanceId === requestedInstanceId && current.sessionId === input.sessionId) return current;
558
- return resumeControllerSession(options, {
559
- ...input,
560
- expectedClaimGeneration: current.claimGeneration,
561
- });
750
+ const currentRuntimeInstanceId = input.currentRuntimeInstanceId?.trim() || '';
751
+ return withControllerSessionMutationLock(
752
+ options,
753
+ input.workId,
754
+ `controller-bind-current-runtime:${input.controllerId}:${input.sessionId}`,
755
+ () => {
756
+ assertControllerWorkClaimable(options, input.workId);
757
+ const store = read(options);
758
+ const current = activeSession(store, input.workId, optionsNowMs(options));
759
+ const retained = current ? undefined : getRetainedControllerSession(options, input.workId);
760
+ const retainedMatchesIdentity = Boolean(
761
+ retained
762
+ && retained.controllerId === input.controllerId
763
+ && retained.controllerType === input.controllerType
764
+ && controllerSessionPrincipalId(retained) === input.principalId.trim(),
765
+ );
766
+ const previous = current ?? (input.allowClaimIfMissing === true && retainedMatchesIdentity ? retained : undefined);
767
+
768
+ if (!current && !previous && input.allowClaimIfMissing !== true) {
769
+ throw new Error(`WORK_CONTROLLER_OWNER_REQUIRED: ${input.workId}`);
770
+ }
771
+ if (!current && retainedMatchesIdentity) {
772
+ if (!currentRuntimeInstanceId || currentRuntimeInstanceId !== requestedInstanceId) {
773
+ throw new Error(`WORK_CONTROLLER_INSTANCE_MISMATCH: ${input.workId}`);
774
+ }
775
+ }
776
+
777
+ if (current) {
778
+ const currentPrincipal = controllerSessionPrincipalId(current);
779
+ if (current.controllerId !== input.controllerId) {
780
+ throw new Error(`WORK_CONTROLLER_OWNER_MISMATCH: ${input.workId} is owned by ${current.controllerId}`);
781
+ }
782
+ if (current.controllerType !== input.controllerType) {
783
+ throw new Error(`WORK_CONTROLLER_TYPE_MISMATCH: ${input.workId} is owned by ${current.controllerType}`);
784
+ }
785
+ if (currentPrincipal !== input.principalId.trim()) {
786
+ throw new Error(`WORK_CONTROLLER_PRINCIPAL_MISMATCH: ${input.workId}`);
787
+ }
788
+ const ownerInstanceId = current.controllerInstanceId?.trim() || '';
789
+ if (ownerInstanceId !== requestedInstanceId) {
790
+ if (!currentRuntimeInstanceId || currentRuntimeInstanceId !== requestedInstanceId) {
791
+ throw new Error(`WORK_CONTROLLER_INSTANCE_MISMATCH: ${input.workId}`);
792
+ }
793
+ }
794
+ const requestedAuthorityDigest = input.authorityDigest?.trim() || '';
795
+ const currentAuthorityDigest = current.authorityDigest?.trim() || '';
796
+ if (
797
+ ownerInstanceId === requestedInstanceId
798
+ && current.sessionId === input.sessionId
799
+ && (!requestedAuthorityDigest || requestedAuthorityDigest === currentAuthorityDigest)
800
+ ) return current;
801
+ }
802
+
803
+ // The opaque Work capability belongs to durable ownership, not to one
804
+ // transport or Runtime process. A positively-current Runtime migration keeps
805
+ // the same digest while claim generation fences the new controller epoch.
806
+ const preservedAuthorityDigest = input.authorityDigest?.trim() || previous?.authorityDigest?.trim() || undefined;
807
+ return persistClaim(options, store, {
808
+ ...input,
809
+ ...(preservedAuthorityDigest ? { authorityDigest: preservedAuthorityDigest } : {}),
810
+ }, previous);
811
+ },
812
+ );
562
813
  }
563
814
 
564
815
  export function releaseControllerSession(options: ControllerSessionStoreOptions, workId: string, controllerId: string): void {
565
816
  withControllerLock(
566
817
  options.controllerHome,
567
- { scope: 'task', repoId: options.repoId, taskId: `controller-session-${workId}` },
818
+ { scope: 'global', resource: 'controller-session-store' },
568
819
  `controller-release:${controllerId}`,
569
820
  () => {
570
821
  const store = read(options);
@@ -8,6 +8,8 @@ export interface ControllerHostResumeResult {
8
8
  waitForUser?: boolean;
9
9
  /** Durable user-action Handoff created by the provider adapter when waitForUser=true. */
10
10
  handoffId?: string;
11
+ /** Known non-ambiguous provider failure that may retry the same semantic round under its existing failure budget. */
12
+ recoverable?: boolean;
11
13
  }
12
14
 
13
15
  /** Provider-neutral continuation port. Implementations live in adapters/*. */
@@ -1,5 +1,15 @@
1
1
  export * from '../domain/types';
2
2
  export * from '../domain/scope';
3
+ export * from '../domain/grant';
3
4
  export * from '../application/identity-service';
4
5
  export * from '../domain/workspace';
5
6
  export * from '../domain/semantic-sync';
7
+ export * from '../infrastructure/grant-store';
8
+ export * from '../domain/user-request';
9
+ export * from '../infrastructure/user-request-store';
10
+ export * from '../domain/owned-resource';
11
+ export * from '../infrastructure/owned-resource-store';
12
+ export * from '../domain/capability-broker';
13
+ export * from '../infrastructure/capability-broker';
14
+ export * from '../domain/activity-projection';
15
+ export * from '../infrastructure/activity-projection-store';
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Canonical Activity Projection Model.
3
+ *
4
+ * GUI work tree is an explicit-link projection of Requirement / Plan / Work,
5
+ * while direct capability activity that has no Work appears in Activity/history
6
+ * rather than being forced into a synthetic Work.
7
+ *
8
+ * Realtime progress comes from Process / Operation / Agent / provider snapshots
9
+ * with observedAt/freshness. History combines semantic revisions with selected
10
+ * immutable receipts and terminal operation events.
11
+ */
12
+
13
+ export interface CapabilityActivityItem {
14
+ activityId: string;
15
+ capabilityId: string;
16
+ kind: 'direct_execution' | 'agent_delegation' | 'scheduled_trigger' | 'work_bound';
17
+ targetScope: string;
18
+ principalId: string;
19
+ associatedWorkId?: string;
20
+ status: 'running' | 'completed' | 'failed' | 'cancelled';
21
+ startedAt: string;
22
+ completedAt?: string;
23
+ summary?: string;
24
+ receiptRef?: string;
25
+ }
26
+
27
+ export interface WorkTreeProjectionNode {
28
+ type: 'requirement' | 'plan' | 'work';
29
+ id: string;
30
+ title?: string;
31
+ status: string;
32
+ revision: number;
33
+ updatedAt: string;
34
+ parentId?: string;
35
+ children?: WorkTreeProjectionNode[];
36
+ }
37
+
38
+ export interface UnifiedActivityView {
39
+ workTree: WorkTreeProjectionNode[];
40
+ directActivities: CapabilityActivityItem[];
41
+ observedAt: string;
42
+ freshnessMs: number;
43
+ }