@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
@@ -50,6 +50,8 @@ export interface AssistantPluginActionDescriptor {
50
50
  readOnly: boolean;
51
51
  risk: AssistantPluginActionRisk;
52
52
  confirmation: AssistantPluginActionConfirmation;
53
+ /** Requires an existing explicit reusable grant; this action cannot implicitly create its own grant. */
54
+ requiresExplicitCapabilityGrant?: boolean;
53
55
  requiredConfirmationText?: string;
54
56
  defaultTimeoutMs: number;
55
57
  cancellable: boolean;
@@ -90,6 +92,24 @@ export interface AssistantPluginManifest {
90
92
  duplicateStateAllowed: false;
91
93
  sourceOfTruth: string[];
92
94
  };
95
+ /**
96
+ * A temporary transport projection. It is descriptive only: the replacement
97
+ * owner remains the sole execution and persistence authority.
98
+ */
99
+ compatibility?: {
100
+ replacementOwner: string;
101
+ boundedConsumers: Array<{
102
+ surface: 'plugin_action_execute';
103
+ pluginId: string;
104
+ actionIds: string[];
105
+ }>;
106
+ removalCondition: {
107
+ kind: 'no_supported_frozen_contract_actions';
108
+ surface: 'plugin_action_execute';
109
+ pluginId: string;
110
+ actionIds: string[];
111
+ };
112
+ };
93
113
  enabled: boolean;
94
114
  lifecycle: {
95
115
  state: AssistantPluginLifecycleState;
@@ -140,6 +160,8 @@ export interface AssistantPluginActionRequest {
140
160
 
141
161
  export interface AssistantPluginActionExecutionInput {
142
162
  controllerHome: string;
163
+ /** Explicit per-invocation authorization for protected plugin actions. */
164
+ confirmAuthorization?: boolean;
143
165
  repoId: string;
144
166
  repoRoot: string;
145
167
  pluginId: string;
@@ -174,6 +196,8 @@ export interface AssistantPluginAdapter {
174
196
  /** Internal adapters remain exactly addressable by trusted composition but are omitted from normal user-facing plugin listings. */
175
197
  exposure?: AssistantPluginExposure;
176
198
  buildManifest(previousRevision?: number, previousUpdatedAt?: string, repoRoot?: string, context?: AssistantPluginBuildContext): AssistantPluginManifest;
199
+ /** Pure plugin-owned schema conversion/validation; the config store alone commits migrated bytes. */
200
+ normalizeLegacyConfig?(raw: unknown): object;
177
201
  /** Resolve an exact stable resource identity for reusable authorization-class actions. */
178
202
  resolveAuthorizationContext?(input: AssistantPluginActionExecutionInput): Promise<AssistantPluginAuthorizationContext | undefined>;
179
203
  executeAction(input: AssistantPluginActionExecutionInput): Promise<Record<string, unknown>>;
@@ -158,6 +158,22 @@ export function buildXiaohongshuPluginManifest(previousRevision = 0, previousUpd
158
158
  'browser-profile:authentication-and-session',
159
159
  ],
160
160
  },
161
+ compatibility: {
162
+ replacementOwner: 'Workflow Runtime (rh_work workflow_execute) and the versioned xiaohongshu Workflow assets',
163
+ boundedConsumers: [
164
+ {
165
+ surface: 'plugin_action_execute',
166
+ pluginId: PLUGIN_ID,
167
+ actionIds: ['get_publish_recipe', 'publish_note'],
168
+ },
169
+ ],
170
+ removalCondition: {
171
+ kind: 'no_supported_frozen_contract_actions',
172
+ surface: 'plugin_action_execute',
173
+ pluginId: PLUGIN_ID,
174
+ actionIds: ['get_publish_recipe', 'publish_note'],
175
+ },
176
+ },
161
177
  enabled: true,
162
178
  lifecycle: { state: 'enabled', reason: 'Compatibility translation is available; all publishing effects are Workflow-owned.' },
163
179
  health: health(), permissions: permissions(), capabilities: capabilities(), actions: actions(), updatedAt: previousUpdatedAt ?? now(),
@@ -1,7 +1,7 @@
1
1
  import { join } from 'path';
2
2
  import { repositoryControllerRoot } from '../../cli/repositories/controller-home';
3
3
  import { selectRepositoryCheckout } from '../../cli/repositories/registry';
4
- import type { RepositoryGitStatusSnapshot } from '../../cli/repositories/structured-git';
4
+ import { splitRepositoryGitStatus, type RepositoryGitStatusSnapshot } from '../../cli/repositories/structured-git';
5
5
  import type { RepositoryRecord } from '../../cli/repositories/types';
6
6
  import { runBoundedGit } from '../execution/thin-harness/async-process';
7
7
  import { readJsonFile, sanitizeFileComponent, writeJsonAtomic } from '../shared/json-files';
@@ -23,23 +23,6 @@ function samplePath(controllerHome: string, repoId: string, checkoutId: string):
23
23
  const GIT_STATUS_SAMPLE_TIMEOUT_MS = 5_000;
24
24
  const GIT_STATUS_SAMPLE_MAX_BYTES = 512 * 1024;
25
25
 
26
- function splitStatus(porcelain: string): Pick<RepositoryGitStatusSnapshot, 'staged' | 'unstaged' | 'untracked'> {
27
- const staged: string[] = [];
28
- const unstaged: string[] = [];
29
- const untracked: string[] = [];
30
- for (const line of porcelain.split(/\r?\n/)) {
31
- if (!line || line.startsWith('## ')) continue;
32
- const code = line.slice(0, 2);
33
- const path = line.slice(3).trim();
34
- if (code === '??') untracked.push(path);
35
- else {
36
- if (code[0] !== ' ' && code[0] !== '?') staged.push(path);
37
- if (code[1] !== ' ' && code[1] !== '?') unstaged.push(path);
38
- }
39
- }
40
- return { staged, unstaged, untracked };
41
- }
42
-
43
26
  async function gitSample(repository: RepositoryRecord, args: readonly string[], maxOutputBytes = GIT_STATUS_SAMPLE_MAX_BYTES) {
44
27
  return runBoundedGit(repository.canonicalRoot, args, {
45
28
  timeoutMs: GIT_STATUS_SAMPLE_TIMEOUT_MS,
@@ -63,7 +46,7 @@ export async function writeRepositoryGitStatusSample(
63
46
  throw new Error(`GIT_STATUS_SAMPLE_FAILED: ${porcelainResult.stderr || `exit ${porcelainResult.exitCode}`}`);
64
47
  }
65
48
  const porcelain = porcelainResult.stdout;
66
- const split = splitStatus(porcelain);
49
+ const split = splitRepositoryGitStatus(porcelain);
67
50
  const sample: RepositoryGitStatusSample = {
68
51
  repoId: repository.repoId,
69
52
  checkoutId: repository.activeCheckoutId,
@@ -146,7 +146,7 @@ export function updateRepositoryProjectionRefreshRequest(
146
146
  sourceRevision?: string;
147
147
  nowMs?: number;
148
148
  },
149
- options: { lock?: boolean } = {},
149
+ options: { lock?: boolean; supersedeAttempt?: boolean } = {},
150
150
  ): ProjectionDirtyMarker | undefined {
151
151
  try {
152
152
  const fence = assertRuntimeMayWrite('update_active_projection', controllerHome);
@@ -170,7 +170,11 @@ export function updateRepositoryProjectionRefreshRequest(
170
170
  ),
171
171
  );
172
172
 
173
- if (current && sameSource) {
173
+ const supersedeAttempt = options.supersedeAttempt === true
174
+ && current?.refreshStatus !== undefined
175
+ && current.refreshStatus !== 'pending';
176
+
177
+ if (current && sameSource && !supersedeAttempt) {
174
178
  const normalized = normalizeMarker(current);
175
179
  const enriched: ProjectionDirtyMarker = {
176
180
  ...normalized,
@@ -214,7 +218,7 @@ export function markRepositoryProjectionDirty(
214
218
  reason,
215
219
  sourceRevision: options.sourceRevision,
216
220
  nowMs: options.nowMs,
217
- });
221
+ }, { supersedeAttempt: true });
218
222
  }
219
223
 
220
224
  export function readRepositoryProjectionDirty(controllerHome: string, repoId: string): ProjectionDirtyMarker | undefined {
@@ -27,7 +27,7 @@ import type { ProjectionObservation, ProjectionSourceReconciliation } from '../h
27
27
  import { RUNTIME_HEALTH_THRESHOLDS } from '../health/evaluator';
28
28
  import { isProcessAlive } from '../shared/process-tree';
29
29
  import type { TaskLedgerProjection } from '../../cli/controller/task-ledger';
30
- import { collectWorkLifecycleAttention } from '../control-plane/execution/work-lifecycle-audit';
30
+ import { collectWorkLifecycleAttention, workLifecycleAttentionBlocksReadiness } from '../control-plane/execution/work-lifecycle-audit';
31
31
 
32
32
  export interface ProjectionMetadata {
33
33
  contentRevision: number;
@@ -164,7 +164,9 @@ function projectionWithExecutionIndexOverlay(
164
164
  const activeJobIds = new Set(activeJobSummaries.map((job) => job.jobId));
165
165
  const attentionJobs = recentJobs?.filter((job) => ATTENTION_JOB_STATUSES.has(job.status));
166
166
  const materializedLifecycleAttention = base.attention.filter((entry) => entry.jobId.startsWith('lifecycle:'));
167
- const materializedCurrentLifecycleAttention = base.currentAttention.filter((entry) => entry.jobId.startsWith('lifecycle:'));
167
+ const materializedCurrentLifecycleAttention = base.currentAttention
168
+ .filter((entry) => entry.jobId.startsWith('lifecycle:'))
169
+ .filter(workLifecycleAttentionBlocksReadiness);
168
170
  const attention = attentionJobs
169
171
  ? attentionJobs.map(attentionSummary)
170
172
  : base.attention.filter((entry) => !entry.jobId.startsWith('lifecycle:'));
@@ -190,6 +192,8 @@ function projectionWithExecutionIndexOverlay(
190
192
  // Lifecycle attention is producer-owned materialized state. Hot reads overlay
191
193
  // only lightweight ExecutionJob/Lease indexes and must never synchronously
192
194
  // re-run Git/Work lifecycle reconciliation on the MCP request event loop.
195
+ // Re-apply the current readiness classifier to persisted lifecycle entries so
196
+ // a policy cutover cannot leave obsolete blockers stuck in currentAttention.
193
197
  currentAttention: [...currentAttention, ...materializedCurrentLifecycleAttention].slice(0, 100),
194
198
  attention: [...attention, ...materializedLifecycleAttention].slice(0, 100),
195
199
  };
@@ -247,7 +251,7 @@ function buildRepositoryProjection(
247
251
  activeLeases: leases.length,
248
252
  currentAttention: [
249
253
  ...currentAttentionJobs.map((job) => ({ jobId: job.jobId, status: job.status, message: job.error?.message })),
250
- ...lifecycleAttention,
254
+ ...lifecycleAttention.filter(workLifecycleAttentionBlocksReadiness),
251
255
  ].slice(0, 100),
252
256
  attention: [
253
257
  ...attentionJobs.map((job) => ({ jobId: job.jobId, status: job.status, message: job.error?.message })),
@@ -474,10 +478,15 @@ function refreshRepositoryProjection(
474
478
  const nowMs = options.nowMs ?? Date.now();
475
479
  const acquiredAt = nowIso(nowMs);
476
480
  const owner = refreshOwner(options, acquiredAt);
477
- return withRepositoryProjectionRefreshLock(
481
+ const lockOwner = `projection-refresh:${owner.pid}`;
482
+
483
+ // Claim one refresh generation under the repository projection lock, then release
484
+ // it before the expensive materialization. Real jobs/leases/finalizers must be
485
+ // able to invalidate the projection while a refresh is building.
486
+ const claim = withRepositoryProjectionRefreshLock(
478
487
  controllerHome,
479
488
  repoId,
480
- `projection-refresh:${owner.pid}`,
489
+ lockOwner,
481
490
  () => {
482
491
  dirtyProjectionReadCache.delete(dirtyProjectionReadCacheKey(controllerHome, repoId));
483
492
  const previous = readJsonFile<RepositoryRuntimeProjection | undefined>(projectionPath(controllerHome, repoId), undefined);
@@ -497,13 +506,26 @@ function refreshRepositoryProjection(
497
506
  sourceRevision,
498
507
  nowMs,
499
508
  }, { lock: false });
500
- if (!marker) return { refreshed: false, skippedReason: 'passive_runtime' };
509
+ if (!marker) {
510
+ return {
511
+ kind: 'skip' as const,
512
+ result: { refreshed: false, skippedReason: 'passive_runtime' as const },
513
+ };
514
+ }
515
+ }
516
+ if (!marker) {
517
+ return {
518
+ kind: 'skip' as const,
519
+ result: { refreshed: false, skippedReason: 'clean' as const, projection: previous },
520
+ };
501
521
  }
502
- if (!marker) return { refreshed: false, skippedReason: 'clean', projection: previous };
503
522
 
504
523
  const currentOwner = refreshOwner(options, acquiredAt);
505
524
  if (ownerStillOwnsRefresh(marker, nowMs, currentOwner)) {
506
- return { refreshed: false, skippedReason: 'running', marker, projection: previous };
525
+ return {
526
+ kind: 'skip' as const,
527
+ result: { refreshed: false, skippedReason: 'running' as const, marker, projection: previous },
528
+ };
507
529
  }
508
530
  if (marker.refreshStatus === 'running' && !ownerStillOwnsRefresh(marker, nowMs, currentOwner)) {
509
531
  marker = recoverStaleOwner(controllerHome, repoId, marker, acquiredAt, 'stale_owner_or_restart');
@@ -514,42 +536,64 @@ function refreshRepositoryProjection(
514
536
  && marker.nextAttemptAt
515
537
  && Date.parse(marker.nextAttemptAt) > nowMs
516
538
  ) {
517
- return { refreshed: false, skippedReason: 'retry_deferred', marker, projection: previous };
539
+ return {
540
+ kind: 'skip' as const,
541
+ result: { refreshed: false, skippedReason: 'retry_deferred' as const, marker, projection: previous },
542
+ };
518
543
  }
519
544
 
520
545
  const running = markRunning(controllerHome, repoId, {
521
546
  ...marker,
522
547
  sourceRevision: marker.sourceRevision ?? sourceRevision,
523
548
  }, owner, acquiredAt);
524
- try {
525
- const latestPrevious = readJsonFile<RepositoryRuntimeProjection | undefined>(projectionPath(controllerHome, repoId), undefined);
526
- const buildRevision = normalizeGitRevision(running.sourceRevision) ?? sourceRevision;
527
- const projection = buildRepositoryProjection(controllerHome, repoId, latestPrevious, buildRevision);
528
- const current = readRepositoryProjectionDirty(controllerHome, repoId);
529
- if (
530
- !current
531
- || current.nonce !== running.nonce
532
- || (
533
- running.sourceRevision
534
- && current.sourceRevision
535
- && !gitRevisionsEquivalent(running.sourceRevision, current.sourceRevision)
536
- )
537
- ) {
538
- return { refreshed: false, skippedReason: 'superseded', marker: current, projection: latestPrevious };
539
- }
540
- writeJsonAtomic(projectionPath(controllerHome, repoId), projection);
541
- clearRepositoryProjectionDirty(controllerHome, repoId, current, projection.metadata?.generatedFromRevision);
542
- dirtyProjectionReadCache.delete(dirtyProjectionReadCacheKey(controllerHome, repoId));
543
- return { refreshed: true, projection };
544
- } catch (error) {
545
- const current = readRepositoryProjectionDirty(controllerHome, repoId);
546
- if (current?.nonce === running.nonce) {
547
- markFailed(controllerHome, repoId, running, owner, error, options.nowMs ?? Date.now());
548
- }
549
- throw error;
550
- }
549
+ return {
550
+ kind: 'build' as const,
551
+ running,
552
+ previous: readJsonFile<RepositoryRuntimeProjection | undefined>(projectionPath(controllerHome, repoId), undefined),
553
+ buildRevision: normalizeGitRevision(running.sourceRevision) ?? sourceRevision,
554
+ };
551
555
  },
552
556
  );
557
+
558
+ if (claim.kind === 'skip') return claim.result;
559
+
560
+ let projection: RepositoryRuntimeProjection;
561
+ try {
562
+ projection = buildRepositoryProjection(controllerHome, repoId, claim.previous, claim.buildRevision);
563
+ } catch (error) {
564
+ // Failure bookkeeping is another short CAS section. If a real mutation already
565
+ // superseded this nonce, it owns the dirty marker and must not be overwritten.
566
+ withRepositoryProjectionRefreshLock(controllerHome, repoId, lockOwner, () => {
567
+ const current = readRepositoryProjectionDirty(controllerHome, repoId);
568
+ if (current?.nonce === claim.running.nonce) {
569
+ markFailed(controllerHome, repoId, claim.running, owner, error, options.nowMs ?? Date.now());
570
+ }
571
+ });
572
+ throw error;
573
+ }
574
+
575
+ // Publish only if the exact claimed nonce still owns the refresh. A concurrent
576
+ // mutation either superseded it while build ran or will mark dirty after this
577
+ // short publish section, so no invalidation can be lost.
578
+ return withRepositoryProjectionRefreshLock(controllerHome, repoId, lockOwner, () => {
579
+ const current = readRepositoryProjectionDirty(controllerHome, repoId);
580
+ const currentProjection = readJsonFile<RepositoryRuntimeProjection | undefined>(projectionPath(controllerHome, repoId), undefined);
581
+ if (
582
+ !current
583
+ || current.nonce !== claim.running.nonce
584
+ || (
585
+ claim.running.sourceRevision
586
+ && current.sourceRevision
587
+ && !gitRevisionsEquivalent(claim.running.sourceRevision, current.sourceRevision)
588
+ )
589
+ ) {
590
+ return { refreshed: false, skippedReason: 'superseded', marker: current, projection: currentProjection };
591
+ }
592
+ writeJsonAtomic(projectionPath(controllerHome, repoId), projection);
593
+ clearRepositoryProjectionDirty(controllerHome, repoId, current, projection.metadata?.generatedFromRevision);
594
+ dirtyProjectionReadCache.delete(dirtyProjectionReadCacheKey(controllerHome, repoId));
595
+ return { refreshed: true, projection };
596
+ });
553
597
  }
554
598
 
555
599
  export function refreshRepositoryProjectionForRepository(
@@ -44,7 +44,7 @@ export const RECOVERY_ACTIONS = {
44
44
  localJobsReconcile: {
45
45
  id: 'recovery.local_jobs_reconcile',
46
46
  title: 'Reconcile Local Jobs',
47
- description: 'Terminalize stale active Local Jobs and rebuild the Local Bridge active index without using repository_command_execute.',
47
+ description: 'Terminalize stale active Local Jobs and rebuild the Local Bridge active index without invoking execute_command.',
48
48
  class: 'local_jobs_reconciliation_required',
49
49
  risk: 'low',
50
50
  confirmation: 'authorization',
@@ -93,13 +93,13 @@ export const RECOVERY_ACTIONS = {
93
93
  },
94
94
  stageAndActivateRuntimeRelease: {
95
95
  id: 'recovery.stage_and_activate_runtime_release',
96
- title: 'Stage and activate canonical Runtime release',
97
- description: 'Build one immutable Runtime release from the selected registered repository, then hand lifecycle activation to the standalone Recovery transaction.',
96
+ title: 'Prepare isolated Runtime ReleaseSession',
97
+ description: 'Compatibility action id: ask standalone Recovery to freeze its configured source and Stable A authority, create isolated Candidate B, and build a portable release. It no longer activates Stable A.',
98
98
  class: 'stale_runtime_state',
99
99
  risk: 'medium',
100
100
  confirmation: 'authorization',
101
101
  localOnly: true,
102
- boundedTo: ['registered_repository', 'runtime_release_storage', 'external_runtime_lifecycle'],
102
+ boundedTo: ['registered_repository', 'runtime_release_storage'],
103
103
  },
104
104
  restartPrimaryConnector: {
105
105
  id: 'recovery.restart_primary_connector',
@@ -3,15 +3,14 @@ import { ensureRepositoryRuntimeStorage } from '../../cli/repositories/runtime-s
3
3
  import { prepareTransferArtifacts } from '../../cli/repositories/selected-path-actions';
4
4
  import { applyRuntimeCleanup, previewRuntimeCleanup } from '../maintenance/cleanup';
5
5
  import { rebuildRepositoryProjection } from '../projections/materialized-view';
6
- import { assertRuntimeReleaseFiles, stageRuntimeReleaseFromCandidateSource } from '../root/release-materialize';
7
6
  import { recoveryActionById } from './actions';
8
7
  import { assertRecoveryAuthorized, buildRecoveryAuditRecord } from './audit';
9
8
  import { applyRuntimeMaintenance } from './maintenance-executor';
10
- import { writeRecoveryAuditRecord } from './store';
9
+ import { writeInstanceRecoveryAuditRecord, writeRecoveryAuditRecord } from './store';
11
10
 
12
11
  export interface CapabilityRecoveryApplicationInput {
13
12
  controllerHome: string;
14
- repository: RepositoryRecord;
13
+ repository?: RepositoryRecord;
15
14
  actionId: string;
16
15
  reason: string;
17
16
  confirmAuthorization: boolean;
@@ -23,17 +22,30 @@ export interface CapabilityRecoveryApplicationInput {
23
22
  }
24
23
 
25
24
  export interface CapabilityRecoveryApplicationResult {
26
- repoId: string;
25
+ repoId?: string;
26
+ scope: 'forge_instance' | 'repository';
27
27
  action: NonNullable<ReturnType<typeof recoveryActionById>>;
28
28
  audit: ReturnType<typeof writeRecoveryAuditRecord>;
29
29
  result: Record<string, unknown>;
30
30
  }
31
31
 
32
+ const INSTANCE_RECOVERY_ACTION_IDS = new Set([
33
+ 'recovery.stage_and_activate_runtime_release',
34
+ 'recovery.restart_primary_connector',
35
+ 'recovery.probe_again',
36
+ 'recovery.workspace_auth_login_prepare',
37
+ 'recovery.external_filesystem_grant_preview',
38
+ ]);
39
+
40
+ export function recoveryActionScope(actionId: string): 'forge_instance' | 'repository' {
41
+ return INSTANCE_RECOVERY_ACTION_IDS.has(actionId) ? 'forge_instance' : 'repository';
42
+ }
43
+
32
44
  export class RecoveryApplicationError extends Error {
33
- readonly code: 'RECOVERY_ACTION_UNKNOWN';
45
+ readonly code: 'RECOVERY_ACTION_UNKNOWN' | 'RECOVERY_REPOSITORY_CONTEXT_REQUIRED';
34
46
  readonly actionId: string;
35
47
 
36
- constructor(code: 'RECOVERY_ACTION_UNKNOWN', actionId: string) {
48
+ constructor(code: RecoveryApplicationError['code'], actionId: string) {
37
49
  super(`${code}: ${actionId}`);
38
50
  this.name = 'RecoveryApplicationError';
39
51
  this.code = code;
@@ -85,29 +97,19 @@ export async function executeCapabilityRecoveryAction(
85
97
  : undefined,
86
98
  );
87
99
 
100
+ const scope = recoveryActionScope(action.id);
101
+ const repository = scope === 'repository'
102
+ ? input.repository ?? (() => { throw new RecoveryApplicationError('RECOVERY_REPOSITORY_CONTEXT_REQUIRED', action.id); })()
103
+ : undefined;
104
+
88
105
  let payload: Record<string, unknown>;
89
106
  let affectedPaths: string[] = [];
90
107
  switch (action.id) {
91
108
  case 'recovery.stage_and_activate_runtime_release': {
92
- const staged = stageRuntimeReleaseFromCandidateSource({
93
- controllerHome: input.controllerHome,
94
- sourceRoot: input.repository.canonicalRoot,
95
- sourceRepositoryId: input.repository.repoId,
109
+ payload = await input.callStandaloneRecoveryTool('prepare_runtime_release_session', {
110
+ request_id: `runtime-release-session-${Date.now()}`,
96
111
  });
97
- assertRuntimeReleaseFiles(staged);
98
- payload = {
99
- staged: {
100
- releaseId: staged.releaseId,
101
- sourceCommit: staged.sourceCommit,
102
- artifactIdentity: staged.artifactIdentity,
103
- manifestSha256: staged.manifestSha256,
104
- },
105
- activation: await input.callStandaloneRecoveryTool('activate_runtime_release', {
106
- request_id: `runtime-cutover-${Date.now()}`,
107
- release_path: staged.manifestPath,
108
- }),
109
- };
110
- affectedPaths = ['controllerHome/runtime/releases', 'controllerHome/runtime/releases/authority.json'];
112
+ affectedPaths = ['controllerHome/recovery/state/release-sessions', 'candidate-runtime-lanes'];
111
113
  break;
112
114
  }
113
115
  case 'recovery.restart_primary_connector': {
@@ -121,20 +123,20 @@ export async function executeCapabilityRecoveryAction(
121
123
  payload = { recovery: await input.recoverySnapshot() };
122
124
  break;
123
125
  case 'recovery.rebuild_projection': {
124
- const projection = rebuildRepositoryProjection(input.controllerHome, input.repository.repoId);
126
+ const projection = rebuildRepositoryProjection(input.controllerHome, repository!.repoId);
125
127
  payload = { projection };
126
128
  affectedPaths = ['.ai/harness/controller/projections'];
127
129
  break;
128
130
  }
129
131
  case 'recovery.refresh_repository': {
130
- const runtimeStorage = ensureRepositoryRuntimeStorage(input.repository, input.controllerHome);
131
- const projection = rebuildRepositoryProjection(input.controllerHome, input.repository.repoId);
132
+ const runtimeStorage = ensureRepositoryRuntimeStorage(repository!, input.controllerHome);
133
+ const projection = rebuildRepositoryProjection(input.controllerHome, repository!.repoId);
132
134
  payload = { runtimeStorage, projection };
133
135
  affectedPaths = ['.ai/harness/controller', '.ai/harness/local-bridge'];
134
136
  break;
135
137
  }
136
138
  case 'recovery.cleanup_preview': {
137
- payload = previewRuntimeCleanup(input.repository.canonicalRoot, {
139
+ payload = previewRuntimeCleanup(repository!.canonicalRoot, {
138
140
  minAgeMinutes: input.minAgeMinutes,
139
141
  includeTempDirs: true,
140
142
  includeTerminalLocalJobs: true,
@@ -145,7 +147,7 @@ export async function executeCapabilityRecoveryAction(
145
147
  break;
146
148
  }
147
149
  case 'recovery.cleanup_apply': {
148
- payload = applyRuntimeCleanup(input.repository.canonicalRoot, {
150
+ payload = applyRuntimeCleanup(repository!.canonicalRoot, {
149
151
  minAgeMinutes: input.minAgeMinutes,
150
152
  includeTempDirs: true,
151
153
  includeTerminalLocalJobs: true,
@@ -159,7 +161,7 @@ export async function executeCapabilityRecoveryAction(
159
161
  }
160
162
  case 'recovery.reconcile_jobs':
161
163
  case 'recovery.local_jobs_reconcile': {
162
- const maintenance = applyRuntimeMaintenance(input.repository, input.controllerHome, {
164
+ const maintenance = applyRuntimeMaintenance(repository!, input.controllerHome, {
163
165
  actionId: 'local_jobs_reconcile',
164
166
  confirmMaintenance: true,
165
167
  minAgeMinutes: input.minAgeMinutes ?? 10,
@@ -170,7 +172,7 @@ export async function executeCapabilityRecoveryAction(
170
172
  break;
171
173
  }
172
174
  case 'recovery.local_jobs_quarantine_unreadable': {
173
- const maintenance = applyRuntimeMaintenance(input.repository, input.controllerHome, {
175
+ const maintenance = applyRuntimeMaintenance(repository!, input.controllerHome, {
174
176
  actionId: 'quarantine_unreadable_local_jobs',
175
177
  confirmMaintenance: true,
176
178
  minAgeMinutes: input.minAgeMinutes ?? 0,
@@ -181,7 +183,7 @@ export async function executeCapabilityRecoveryAction(
181
183
  break;
182
184
  }
183
185
  case 'recovery.runtime_storage_finalize_relocation': {
184
- const maintenance = applyRuntimeMaintenance(input.repository, input.controllerHome, {
186
+ const maintenance = applyRuntimeMaintenance(repository!, input.controllerHome, {
185
187
  actionId: 'runtime_storage_finalize_relocation',
186
188
  confirmMaintenance: true,
187
189
  minAgeMinutes: input.minAgeMinutes ?? 0,
@@ -192,7 +194,7 @@ export async function executeCapabilityRecoveryAction(
192
194
  break;
193
195
  }
194
196
  case 'recovery.create_patch_handoff':
195
- payload = prepareTransferArtifacts(input.repository, { reason: input.reason }) as unknown as Record<string, unknown>;
197
+ payload = prepareTransferArtifacts(repository!, { reason: input.reason }) as unknown as Record<string, unknown>;
196
198
  affectedPaths = ['.ai/harness/transfers', '.ai/harness/session'];
197
199
  break;
198
200
  case 'recovery.workspace_auth_login_prepare':
@@ -213,16 +215,15 @@ export async function executeCapabilityRecoveryAction(
213
215
  payload = { skipped: true, reason: `No executor is registered for ${action.id}.` };
214
216
  }
215
217
 
216
- const audit = writeRecoveryAuditRecord(
217
- input.controllerHome,
218
- input.repository.repoId,
219
- buildRecoveryAuditRecord({
220
- actor: 'capability_recovery_apply',
221
- action,
222
- result: payload.skipped === true ? 'skipped' : 'succeeded',
223
- reason: input.reason,
224
- affectedPaths,
225
- }),
226
- );
227
- return { repoId: input.repository.repoId, action, audit, result: payload };
218
+ const auditRecord = buildRecoveryAuditRecord({
219
+ actor: 'capability_recovery_apply',
220
+ action,
221
+ result: payload.skipped === true ? 'skipped' : 'succeeded',
222
+ reason: input.reason,
223
+ affectedPaths,
224
+ });
225
+ const audit = repository
226
+ ? writeRecoveryAuditRecord(input.controllerHome, repository.repoId, auditRecord)
227
+ : writeInstanceRecoveryAuditRecord(input.controllerHome, auditRecord);
228
+ return { ...(repository ? { repoId: repository.repoId } : {}), scope, action, audit, result: payload };
228
229
  }