@moretea-labs/forge 1.8.0 → 1.8.1

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 (528) hide show
  1. package/AGENTS.md +70 -7
  2. package/CHANGELOG.md +14 -0
  3. package/CLAUDE.md +17 -2
  4. package/CONTRIBUTING.md +3 -2
  5. package/THIRD_PARTY_NOTICES.md +1 -1
  6. package/adapters/chatgpt/browser-delivery-host.ts +7 -1
  7. package/adapters/chatgpt/browser-delivery-runtime.ts +529 -56
  8. package/adapters/chatgpt/controller-binding-store.ts +101 -22
  9. package/adapters/chatgpt/controller-round-host.ts +15 -25
  10. package/adapters/chatgpt/controller-round-settlement-store.ts +58 -4
  11. package/adapters/chatgpt/provider-delivery.ts +228 -1
  12. package/adapters/chatgpt/work-conversation-binding-store.ts +79 -53
  13. package/adapters/computer/chatgpt-extension-target.ts +463 -0
  14. package/adapters/computer/chatgpt-target-router.ts +103 -0
  15. package/adapters/computer/chrome-extension/background.js +385 -0
  16. package/adapters/computer/chrome-extension/content.js +378 -0
  17. package/adapters/computer/chrome-extension/core.js +24 -0
  18. package/adapters/computer/chrome-extension/manifest.json +30 -0
  19. package/adapters/computer/desktop-operator-discovery.ts +11 -31
  20. package/adapters/computer/interaction-target-authority.ts +142 -18
  21. package/adapters/mcp/auth.ts +0 -1
  22. package/adapters/mcp/instructions.ts +5 -4
  23. package/adapters/mcp/multi-repository.ts +3 -19
  24. package/adapters/mcp/oauth.ts +73 -0
  25. package/adapters/mcp/paths.ts +4 -1
  26. package/adapters/mcp/runtime-gateway/automation-receipt-adapter.ts +87 -0
  27. package/adapters/mcp/runtime-gateway/bounded-result-runtime.ts +62 -0
  28. package/adapters/mcp/runtime-gateway/cognition-settlement.ts +201 -0
  29. package/adapters/mcp/runtime-gateway/context-adapter.ts +411 -73
  30. package/adapters/mcp/runtime-gateway/context-pack-sidecar.ts +91 -0
  31. package/adapters/mcp/runtime-gateway/controller-authority-adapter.ts +20 -5
  32. package/adapters/mcp/runtime-gateway/core-capability-adapter.ts +258 -0
  33. package/adapters/mcp/runtime-gateway/engineering-preconditions.ts +10 -27
  34. package/adapters/mcp/runtime-gateway/engineering-tool-contract.ts +15 -0
  35. package/adapters/mcp/runtime-gateway/execution-tools.ts +8 -42
  36. package/adapters/mcp/runtime-gateway/gateway-execution-adapter.ts +2 -1
  37. package/adapters/mcp/runtime-gateway/plugin-adapter.ts +117 -45
  38. package/adapters/mcp/runtime-gateway/process-tools.ts +190 -22
  39. package/adapters/mcp/runtime-gateway/protected-computer-adapter.ts +16 -4
  40. package/adapters/mcp/runtime-gateway/recovery-adapter.ts +69 -52
  41. package/adapters/mcp/runtime-gateway/repository-compat-adapter.ts +4 -35
  42. package/adapters/mcp/runtime-gateway/result-adapter.ts +10 -4
  43. package/adapters/mcp/runtime-gateway/router.ts +18 -504
  44. package/adapters/mcp/runtime-gateway/routing-policy.ts +499 -0
  45. package/adapters/mcp/runtime-gateway/runtime-observation-adapter.ts +14 -65
  46. package/adapters/mcp/runtime-gateway/runtime-readiness-observation.ts +218 -0
  47. package/adapters/mcp/runtime-gateway/runtime-tool-definitions.ts +113 -173
  48. package/adapters/mcp/runtime-gateway/runtime-tools.ts +15 -5
  49. package/adapters/mcp/runtime-gateway/scheduler-adapter.ts +1 -0
  50. package/adapters/mcp/runtime-gateway/shared-adapter.ts +20 -0
  51. package/adapters/mcp/runtime-gateway/status-inbox-adapter.ts +358 -266
  52. package/adapters/mcp/runtime-gateway/typescript-navigation-sidecar.ts +136 -0
  53. package/adapters/mcp/runtime-gateway/work-adapter.ts +261 -3122
  54. package/adapters/mcp/runtime-gateway/work-controller-operations.ts +257 -0
  55. package/adapters/mcp/runtime-gateway/work-detail-projection.ts +60 -0
  56. package/adapters/mcp/runtime-gateway/work-input-wire-migration.ts +246 -0
  57. package/adapters/mcp/runtime-gateway/work-learning-operations.ts +145 -0
  58. package/adapters/mcp/runtime-gateway/work-list-projection.ts +38 -0
  59. package/adapters/mcp/runtime-gateway/work-plan-operations.ts +382 -0
  60. package/adapters/mcp/runtime-gateway/work-repair-adapter.ts +308 -0
  61. package/adapters/mcp/runtime-gateway/work-requirement-operations.ts +148 -0
  62. package/adapters/mcp/runtime-gateway/work-semantic-operations.ts +263 -0
  63. package/adapters/mcp/runtime-gateway/work-workflow-operations.ts +113 -0
  64. package/adapters/mcp/runtime-gateway/workflow-supervisor-adapter.ts +156 -0
  65. package/adapters/mcp/server.ts +67 -23
  66. package/adapters/mcp/setup.ts +1 -3
  67. package/adapters/mcp/tool-mapping/legacy-tool-service.ts +44 -170
  68. package/adapters/mcp/tool-mapping/post-finalize-work-attribution.ts +4 -9
  69. package/adapters/mcp/tool-mapping/repository-tools.ts +133 -142
  70. package/adapters/mcp/toolset-names.ts +5 -0
  71. package/adapters/mcp/toolset.ts +6 -5
  72. package/adapters/mcp/transports/http-observation.ts +365 -0
  73. package/adapters/mcp/transports/http.ts +154 -677
  74. package/adapters/mcp/transports/oauth-http.ts +322 -0
  75. package/adapters/mcp/transports/session-registry.ts +6 -0
  76. package/adapters/mcp/tunnels/openai-secure-tunnel.ts +89 -5
  77. package/assets/plugin-registry.v1.json +6 -4
  78. package/assets/reference-configs/agentic-development-flow.md +25 -0
  79. package/assets/reference-configs/global-working-rules.md +19 -0
  80. package/assets/skill-version.json +2 -2
  81. package/docs/architecture/CURRENT.md +111 -41
  82. package/docs/architecture/decisions/20260803-release-identity-binding-and-exit-policy.md +14 -5
  83. package/docs/architecture/decisions/20260823-immediate-controller-relay.md +6 -3
  84. package/docs/architecture/decisions/20260907-assistant-learning-loop.md +2 -0
  85. package/docs/architecture/decisions/20260907-controller-round-transition-policy.md +19 -4
  86. package/docs/architecture/decisions/20260916-workflow-supervisor-authority.md +249 -0
  87. package/docs/architecture/decisions/20260917-cognitive-memory-foundation.md +82 -0
  88. package/docs/architecture/decisions/20260918-stable-candidate-release-lifecycle.md +221 -0
  89. package/docs/architecture/decisions/20260919-autonomous-work-liveness.md +62 -0
  90. package/docs/architecture/decisions/20260924-thin-semantic-working-context.md +72 -0
  91. package/docs/architecture/decisions/20261001-supervisor-turn-authority.md +237 -0
  92. package/docs/architecture/decisions/20261005-forge-v3-desktop-client-boundary.md +77 -0
  93. package/docs/architecture/domains/verification.md +1 -0
  94. package/docs/architecture/domains/workflow-engine.md +6 -0
  95. package/docs/architecture/modules/controller-runtime/transport-lifecycle.md +1 -1
  96. package/docs/forge-plugin-management.md +2 -2
  97. package/docs/operations/controller-performance-and-502.md +17 -0
  98. package/docs/operations/controller-reliability-runbook.md +2 -2
  99. package/docs/operations/features.md +1 -1
  100. package/docs/operations/features.zh-CN.md +1 -1
  101. package/docs/operations/homebrew.md +2 -2
  102. package/docs/operations/mcp-tool-exposure.md +2 -0
  103. package/docs/operations/releasing.md +2 -0
  104. package/docs/operations/standalone-disaster-recovery.md +14 -6
  105. package/docs/wiki/Implementation.md +1 -1
  106. package/package.json +25 -14
  107. package/packages/kernel/cognition/api/index.ts +6 -0
  108. package/packages/kernel/cognition/application/activation-service.ts +451 -0
  109. package/packages/kernel/cognition/application/consolidation-service.ts +185 -0
  110. package/packages/kernel/cognition/application/legacy-experience-adapter.ts +38 -0
  111. package/packages/kernel/cognition/application/memory-service.ts +64 -0
  112. package/packages/kernel/cognition/domain/learning.ts +106 -0
  113. package/packages/kernel/cognition/domain/memory.ts +254 -0
  114. package/packages/kernel/controller/api/index.ts +1 -0
  115. package/packages/kernel/controller/application/continuation-service.ts +281 -0
  116. package/packages/kernel/controller/application/controller-round-service.ts +12 -0
  117. package/packages/kernel/controller/domain/controller-round-transition-policy.ts +242 -21
  118. package/packages/kernel/controller/domain/controller-round.ts +4 -1
  119. package/packages/kernel/controller/domain/execution-quality.ts +3 -1
  120. package/packages/kernel/controller/infrastructure/controller-round-store.ts +689 -103
  121. package/packages/kernel/controller/infrastructure/controller-session-store.ts +297 -71
  122. package/packages/kernel/controller/ports/controller-host.ts +2 -0
  123. package/packages/kernel/identity/api/index.ts +10 -0
  124. package/packages/kernel/identity/domain/activity-projection.ts +43 -0
  125. package/packages/kernel/identity/domain/capability-broker.ts +60 -0
  126. package/packages/kernel/identity/domain/grant.ts +72 -0
  127. package/packages/kernel/identity/domain/owned-resource.ts +116 -0
  128. package/packages/kernel/identity/domain/user-request.ts +93 -0
  129. package/packages/kernel/identity/infrastructure/activity-projection-store.ts +77 -0
  130. package/packages/kernel/identity/infrastructure/capability-broker.ts +81 -0
  131. package/packages/kernel/identity/infrastructure/grant-store.ts +284 -0
  132. package/packages/kernel/identity/infrastructure/owned-resource-store.ts +259 -0
  133. package/packages/kernel/identity/infrastructure/user-request-store.ts +182 -0
  134. package/packages/kernel/scheduler/api/index.ts +0 -2
  135. package/packages/kernel/scheduler/application/schedule-service.ts +3 -0
  136. package/packages/kernel/scheduler/application/settlement.ts +0 -15
  137. package/packages/kernel/scheduler/domain/schedule.ts +87 -0
  138. package/packages/kernel/scheduler/infrastructure/schedule-store.ts +153 -133
  139. package/packages/kernel/work/api/index.ts +3 -2
  140. package/packages/kernel/work/application/work-service.ts +17 -42
  141. package/packages/kernel/work/domain/current-task-lineage.ts +104 -0
  142. package/packages/kernel/work/domain/engineering-design.ts +10 -5
  143. package/packages/kernel/work/domain/engineering-profile.ts +8 -12
  144. package/packages/kernel/work/domain/evaluation-promotion-receipt.ts +186 -0
  145. package/packages/kernel/work/domain/execution-concurrency.ts +19 -26
  146. package/packages/kernel/work/domain/execution-snapshot.ts +0 -31
  147. package/packages/kernel/work/domain/implementation-review.ts +14 -331
  148. package/packages/kernel/work/domain/objective-graph.ts +119 -0
  149. package/packages/kernel/work/domain/project-engineering-contract.ts +23 -1
  150. package/packages/kernel/work/domain/repository-completion-receipt.ts +1 -1
  151. package/packages/kernel/work/domain/state-machine.ts +25 -63
  152. package/packages/kernel/work/domain/types.ts +57 -51
  153. package/packages/kernel/work/infrastructure/work-contract-store.ts +819 -728
  154. package/packages/kernel/work/ports/work-contract-store.ts +5 -2
  155. package/packages/plugin-runtime/browser/session-authority.ts +2 -1
  156. package/packages/plugin-runtime/computer/chatgpt-identity.ts +24 -0
  157. package/packages/plugin-runtime/computer/conversation-target.ts +143 -0
  158. package/packages/plugin-runtime/computer/index.ts +2 -0
  159. package/packages/plugin-runtime/computer/target-authority.ts +26 -1
  160. package/packages/plugin-runtime/external/unix-jsonl-transport.ts +142 -18
  161. package/packages/protocols/computer/contract.ts +27 -1
  162. package/scripts/activate-source-baseline.ts +7 -9
  163. package/scripts/canary-controller-semantic-wait.ts +12 -24
  164. package/scripts/check-mcp-compatibility.ts +48 -136
  165. package/scripts/check-runtime-architecture.mjs +622 -217
  166. package/scripts/forge-local-recovery-helper.mjs +93 -15
  167. package/scripts/lib/project-init-lib.sh +3 -0
  168. package/scripts/open-source-audit-allowlist.txt +1 -2
  169. package/scripts/run-bounded-command.mjs +5 -0
  170. package/scripts/run-governed-gate.ts +0 -1
  171. package/scripts/run-mobile-monitor-bridge.ts +0 -1
  172. package/scripts/smoke-control-plane-failure-domain.ts +94 -0
  173. package/scripts/smoke-mcp-http-runtime.ts +5 -0
  174. package/scripts/smoke-runtime-recovery.ts +12 -43
  175. package/scripts/smoke-schedule-engine.ts +23 -15
  176. package/scripts/smoke-unattended-transport-recovery.ts +223 -0
  177. package/scripts/smoke-user-request-continuation-restart.ts +232 -0
  178. package/scripts/smoke-workflow-supervisor-chrome-adapter.ts +92 -0
  179. package/scripts/smoke-workflow-supervisor-process-restart.ts +276 -0
  180. package/scripts/smoke-workflow-supervisor-restart-recovery.ts +150 -0
  181. package/scripts/smoke-workflow-supervisor.ts +103 -0
  182. package/scripts/verify-forge-runtime.sh +2 -1
  183. package/src/cli/agent-jobs/executor-health.ts +11 -34
  184. package/src/cli/agent-jobs/integration.ts +18 -49
  185. package/src/cli/agent-jobs/job-manager.ts +7 -3
  186. package/src/cli/commands/brain-assistant.ts +27 -13
  187. package/src/cli/commands/brain.ts +13 -15
  188. package/src/cli/commands/chatgpt.ts +1 -163
  189. package/src/cli/commands/recovery.ts +135 -121
  190. package/src/cli/commands/runtime.ts +3 -3
  191. package/src/cli/commands/setup-profile.ts +8 -0
  192. package/src/cli/controller/check-runner.ts +13 -2
  193. package/src/cli/controller/completion-backlog.ts +3 -3
  194. package/src/cli/controller/completion-orchestrator.ts +4 -43
  195. package/src/cli/controller/completion-target.ts +3 -72
  196. package/src/cli/controller/context/source-materializer.ts +81 -100
  197. package/src/cli/controller/context-pack.ts +10 -8
  198. package/src/cli/controller/execution-completion.ts +4 -7
  199. package/src/cli/controller/execution-policy.ts +36 -153
  200. package/src/cli/controller/governance.ts +2 -3
  201. package/src/cli/controller/issue-store.ts +4 -99
  202. package/src/cli/controller/launch-agents.ts +59 -18
  203. package/src/cli/controller/operational-plan.ts +24 -51
  204. package/src/cli/controller/runtime-config.ts +5 -1
  205. package/src/cli/controller/stuck-state-migration.ts +2 -3
  206. package/src/cli/controller/systemd-user.ts +39 -1
  207. package/src/cli/editing/edit-session.ts +1 -7
  208. package/src/cli/local-bridge/console-automations.ts +18 -13
  209. package/src/cli/local-bridge/console-view-models.ts +3 -12
  210. package/src/cli/local-bridge/facade-api.ts +64 -191
  211. package/src/cli/local-bridge/server.ts +24 -147
  212. package/src/cli/local-bridge/types.ts +0 -1
  213. package/src/cli/mcp/oauth-client-retirement.ts +74 -0
  214. package/src/cli/repositories/command-executor.ts +29 -23
  215. package/src/cli/repositories/command-scope.ts +35 -16
  216. package/src/cli/repositories/controller-home.ts +48 -0
  217. package/src/cli/repositories/ephemeral-workspace.ts +20 -30
  218. package/src/cli/repositories/git-command-executor.ts +2 -2
  219. package/src/cli/repositories/registry.ts +77 -11
  220. package/src/cli/repositories/structured-git.ts +62 -2
  221. package/src/cli/repository/session-cache.ts +92 -6
  222. package/src/runtime/context/assistant-context.ts +20 -7
  223. package/src/runtime/context/assistant-work-context.ts +89 -27
  224. package/src/runtime/context/automatic-learning.ts +565 -0
  225. package/src/runtime/context/cognitive-attention.ts +173 -0
  226. package/src/runtime/context/cognitive-skill-canary.ts +158 -0
  227. package/src/runtime/context/context-closure.ts +46 -9
  228. package/src/runtime/context/context-pack-process.ts +103 -0
  229. package/src/runtime/context/context-plane.ts +1 -9
  230. package/src/runtime/context/direct-controller-learning.ts +298 -0
  231. package/src/runtime/context/semantic-navigation-contract.ts +9 -0
  232. package/src/runtime/context/semantic-navigation.ts +6 -34
  233. package/src/runtime/context/typescript-navigation-process.ts +145 -0
  234. package/src/runtime/context/typescript-navigation.ts +89 -3
  235. package/src/runtime/control-plane/cleanup-artifact-retention.ts +212 -9
  236. package/src/runtime/control-plane/concurrency/work-execution-concurrency.ts +9 -47
  237. package/src/runtime/control-plane/execution/controller-authority-recovery.ts +34 -4
  238. package/src/runtime/control-plane/execution/edit-validation-coordinator.ts +29 -20
  239. package/src/runtime/control-plane/execution/execution-identity.ts +23 -3
  240. package/src/runtime/control-plane/execution/repository-work-attribution.ts +7 -30
  241. package/src/runtime/control-plane/execution/retained-work-resume.ts +206 -199
  242. package/src/runtime/control-plane/execution/session-store.ts +31 -1
  243. package/src/runtime/control-plane/execution/validation.ts +6 -8
  244. package/src/runtime/control-plane/execution/work-authority-reconciler.ts +13 -42
  245. package/src/runtime/control-plane/execution/work-check-evidence.ts +137 -0
  246. package/src/runtime/control-plane/execution/work-completion-authority.ts +30 -85
  247. package/src/runtime/control-plane/execution/work-delivery-service.ts +497 -0
  248. package/src/runtime/control-plane/execution/work-evidence-policy.ts +12 -50
  249. package/src/runtime/control-plane/execution/work-execution-support.ts +50 -149
  250. package/src/runtime/control-plane/execution/work-handle-authority.ts +188 -109
  251. package/src/runtime/control-plane/execution/work-handle-store.ts +19 -43
  252. package/src/runtime/control-plane/execution/work-head-settlement.ts +53 -20
  253. package/src/runtime/control-plane/execution/work-lifecycle-audit.ts +52 -29
  254. package/src/runtime/control-plane/execution/work-operation-service.ts +43 -27
  255. package/src/runtime/control-plane/execution/work-preparation-service.ts +126 -266
  256. package/src/runtime/control-plane/execution/work-remote-delivery.ts +2 -3
  257. package/src/runtime/control-plane/execution/work-revision-diff.ts +39 -0
  258. package/src/runtime/control-plane/execution/work-terminal-cleanup.ts +173 -186
  259. package/src/runtime/control-plane/execution/work-validation-reconciler.ts +28 -84
  260. package/src/runtime/control-plane/execution/work-verification-service.ts +406 -50
  261. package/src/runtime/control-plane/execution/work-verification-snapshot.ts +5 -1
  262. package/src/runtime/control-plane/facade/capability-registry.ts +362 -37
  263. package/src/runtime/control-plane/facade/check-normalization.ts +3 -9
  264. package/src/runtime/control-plane/facade/codex-delegation.ts +10 -11
  265. package/src/runtime/control-plane/facade/controller-connection.ts +135 -0
  266. package/src/runtime/control-plane/facade/goal-workloop-access.ts +1 -20
  267. package/src/runtime/control-plane/facade/goal-workloop.ts +281 -1753
  268. package/src/runtime/control-plane/facade/handoff-inbox-application.ts +12 -25
  269. package/src/runtime/control-plane/facade/handoff-inbox-store.ts +256 -52
  270. package/src/runtime/control-plane/facade/index.ts +0 -1
  271. package/src/runtime/control-plane/facade/operation-digest.ts +12 -15
  272. package/src/runtime/control-plane/facade/plan-contract-store.ts +451 -991
  273. package/src/runtime/control-plane/facade/policy-gate.ts +0 -23
  274. package/src/runtime/control-plane/facade/repository-work-admission.ts +12 -22
  275. package/src/runtime/control-plane/facade/requirement-authority.ts +102 -199
  276. package/src/runtime/control-plane/facade/requirement-board.ts +3 -3
  277. package/src/runtime/control-plane/facade/rh-work-operation-contract.ts +51 -14
  278. package/src/runtime/control-plane/facade/self-healing-loop.ts +18 -53
  279. package/src/runtime/control-plane/facade/suggested-actions.ts +15 -18
  280. package/src/runtime/control-plane/facade/types.ts +49 -108
  281. package/src/runtime/control-plane/facade/work-continuation.ts +8 -8
  282. package/src/runtime/control-plane/generated-cache-retention.ts +97 -1
  283. package/src/runtime/control-plane/global-scheduler/autonomous-continuation.ts +248 -0
  284. package/src/runtime/control-plane/global-scheduler/durable-admission.ts +1 -1
  285. package/src/runtime/control-plane/global-scheduler/maintenance.ts +239 -112
  286. package/src/runtime/control-plane/global-scheduler/reconciliation.ts +2 -1
  287. package/src/runtime/control-plane/global-scheduler/scheduler.ts +66 -40
  288. package/src/runtime/control-plane/global-scheduler/wake-signal.ts +42 -2
  289. package/src/runtime/control-plane/governance/access-policy.ts +19 -2
  290. package/src/runtime/control-plane/governance/authorization.ts +20 -3
  291. package/src/runtime/control-plane/launcher/chatgpt-round-continuation.ts +63 -300
  292. package/src/runtime/control-plane/launcher/chatgpt-work-continuation.ts +28 -300
  293. package/src/runtime/control-plane/launcher/local-conversation-controller.ts +238 -0
  294. package/src/runtime/control-plane/launcher/provider-mcp-bootstrap.ts +5 -2
  295. package/src/runtime/control-plane/launcher/thin-launcher.ts +96 -240
  296. package/src/runtime/control-plane/persistence/cognition-store.ts +820 -0
  297. package/src/runtime/control-plane/persistence/experience-store.ts +162 -29
  298. package/src/runtime/control-plane/persistence/requirement-store.ts +216 -74
  299. package/src/runtime/control-plane/persistence/sqlite-store.ts +113 -6
  300. package/src/runtime/control-plane/release-retention.ts +135 -47
  301. package/src/runtime/control-plane/repository-namespace-retention.ts +2 -2
  302. package/src/runtime/control-plane/runtime-cleanup.ts +290 -21
  303. package/src/runtime/control-plane/workspace/project-onboarding.ts +80 -0
  304. package/src/runtime/control-plane/workspace/semantic-sync-service.ts +19 -5
  305. package/src/runtime/control-plane/workspace/workspace-store.ts +169 -0
  306. package/src/runtime/diagnostics/incident-repair.ts +313 -146
  307. package/src/runtime/diagnostics/mcp-timing.ts +114 -0
  308. package/src/runtime/evidence/artifact-store.ts +158 -40
  309. package/src/runtime/evidence/evidence-store.ts +112 -8
  310. package/src/runtime/evidence/output-handle-index.ts +225 -0
  311. package/src/runtime/evidence/result-store.ts +158 -44
  312. package/src/runtime/execution/jobs/store.ts +3 -4
  313. package/src/runtime/execution/managed-workspace.ts +57 -0
  314. package/src/runtime/execution/process-runtime/check-facade.ts +1 -1
  315. package/src/runtime/execution/process-runtime/check-result-retention.ts +2 -2
  316. package/src/runtime/execution/process-runtime/check-result.ts +105 -1
  317. package/src/runtime/execution/process-runtime/check-runner-sidecar.ts +18 -8
  318. package/src/runtime/execution/process-runtime/command-facade.ts +79 -27
  319. package/src/runtime/execution/process-runtime/gc.ts +15 -2
  320. package/src/runtime/execution/process-runtime/handle-index.ts +176 -0
  321. package/src/runtime/execution/process-runtime/host-command-lane.ts +139 -0
  322. package/src/runtime/execution/process-runtime/index.ts +3 -0
  323. package/src/runtime/execution/process-runtime/lightweight-managed.ts +251 -72
  324. package/src/runtime/execution/process-runtime/persisted-check.ts +3 -3
  325. package/src/runtime/execution/process-runtime/process-runner-entry.ts +47 -5
  326. package/src/runtime/execution/process-runtime/process-scope.ts +160 -0
  327. package/src/runtime/execution/process-runtime/resource-claims.ts +65 -61
  328. package/src/runtime/execution/process-runtime/runtime.ts +35 -2
  329. package/src/runtime/execution/process-runtime/store.ts +30 -2
  330. package/src/runtime/execution/process-runtime/types.ts +6 -1
  331. package/src/runtime/execution/workers/executor.ts +2 -6
  332. package/src/runtime/platform/service-inventory.ts +130 -0
  333. package/src/runtime/platform/service-manager.ts +8 -0
  334. package/src/runtime/plugins/action-application.ts +85 -28
  335. package/src/runtime/plugins/app-store-connect-adapter.ts +38 -14
  336. package/src/runtime/plugins/browser-adapter.ts +757 -34
  337. package/src/runtime/plugins/browser-automation-service.ts +23 -3
  338. package/src/runtime/plugins/browser-macos-bridge.ts +321 -29
  339. package/src/runtime/plugins/browser-manifest-surface.ts +45 -11
  340. package/src/runtime/plugins/browser-native-session-service.ts +63 -13
  341. package/src/runtime/plugins/browser-registration.ts +16 -0
  342. package/src/runtime/plugins/browser-runtime.ts +14 -1
  343. package/src/runtime/plugins/browser-session-authority.ts +2 -2
  344. package/src/runtime/plugins/browser-session-store.ts +46 -76
  345. package/src/runtime/plugins/capability-authorization-grants.ts +258 -62
  346. package/src/runtime/plugins/computer-chatgpt-browser-adapter-installer.ts +219 -0
  347. package/src/runtime/plugins/computer-chatgpt-macos-target.ts +891 -0
  348. package/src/runtime/plugins/computer-registration.ts +222 -11
  349. package/src/runtime/plugins/desktop-operator-external-policy.ts +36 -4
  350. package/src/runtime/plugins/desktop-operator-registration.ts +12 -4
  351. package/src/runtime/plugins/external-adapter.ts +42 -6
  352. package/src/runtime/plugins/external-registration.ts +21 -1
  353. package/src/runtime/plugins/gmail-adapter.ts +23 -2
  354. package/src/runtime/plugins/google-calendar-adapter.ts +2 -2
  355. package/src/runtime/plugins/google-shared.ts +14 -7
  356. package/src/runtime/plugins/google-tasks-adapter.ts +2 -2
  357. package/src/runtime/plugins/ios-adapter.ts +1 -1
  358. package/src/runtime/plugins/lightweight-action.ts +208 -2
  359. package/src/runtime/plugins/local-system-adapter.ts +12 -2
  360. package/src/runtime/plugins/managed-process-adapter.ts +12 -5
  361. package/src/runtime/plugins/plugin-action-sidecar.ts +17 -13
  362. package/src/runtime/plugins/plugin-management-adapter.ts +1 -1
  363. package/src/runtime/plugins/store.ts +602 -428
  364. package/src/runtime/plugins/types.ts +20 -0
  365. package/src/runtime/plugins/xiaohongshu-publish.ts +16 -0
  366. package/src/runtime/projections/invalidation.ts +7 -3
  367. package/src/runtime/projections/materialized-view.ts +80 -36
  368. package/src/runtime/recovery/actions.ts +3 -3
  369. package/src/runtime/recovery/capability-action-application.ts +46 -45
  370. package/src/runtime/recovery/lifecycle-inventory.ts +29 -29
  371. package/src/runtime/recovery/maintenance-executor.ts +374 -123
  372. package/src/runtime/recovery/store.ts +29 -11
  373. package/src/runtime/release/release-coordinator.ts +296 -0
  374. package/src/runtime/release/release-session.ts +716 -0
  375. package/src/runtime/release/release-state-migration.ts +25 -0
  376. package/src/runtime/resources/leases/store.ts +56 -25
  377. package/src/runtime/root/computer-composition.ts +191 -6
  378. package/src/runtime/root/controller-progression-composition.ts +192 -0
  379. package/src/runtime/root/controller-round-composition.ts +20 -1
  380. package/src/runtime/root/deployment-topology.ts +106 -0
  381. package/src/runtime/root/entry.ts +4 -3
  382. package/src/runtime/root/known-good-recovery.ts +184 -0
  383. package/src/runtime/root/local-bridge.ts +0 -1
  384. package/src/runtime/root/mcp-transport.ts +111 -18
  385. package/src/runtime/root/ownership.ts +261 -9
  386. package/src/runtime/root/package-connector-service.ts +105 -19
  387. package/src/runtime/root/package-runtime-release.ts +117 -18
  388. package/src/runtime/root/package-runtime-service.ts +17 -11
  389. package/src/runtime/root/release-execution-canary.ts +44 -12
  390. package/src/runtime/root/release-loader.ts +90 -8
  391. package/src/runtime/root/release-manifest.ts +80 -6
  392. package/src/runtime/root/release-materialize.ts +372 -28
  393. package/src/runtime/root/release-store.ts +395 -36
  394. package/src/runtime/root/runtime-lane.ts +191 -0
  395. package/src/runtime/root/runtime.ts +159 -27
  396. package/src/runtime/root/scheduled-controller-composition.ts +28 -3
  397. package/src/runtime/root/service-runner.ts +2 -2
  398. package/src/runtime/root/service.ts +36 -33
  399. package/src/runtime/root/status.ts +48 -0
  400. package/src/runtime/root/types.ts +32 -3
  401. package/src/runtime/root/workflow-supervisor-composition.ts +493 -0
  402. package/src/runtime/root/workflow-supervisor-runtime.ts +209 -0
  403. package/src/runtime/root/write-fence.ts +50 -2
  404. package/src/runtime/safe-tooling/google-credential-store.ts +76 -21
  405. package/src/runtime/safe-tooling/google-oauth-broker.ts +25 -7
  406. package/src/runtime/safe-tooling/workspace-auth.ts +1 -1
  407. package/src/runtime/shared/bounded-child-supervisor.ts +9 -1
  408. package/src/runtime/shared/process-environment.ts +20 -9
  409. package/src/runtime/shared/response-budget.ts +1 -3
  410. package/src/runtime/standalone-recovery/controller-home-migration.ts +16 -24
  411. package/src/runtime/standalone-recovery/core.ts +3702 -342
  412. package/src/runtime/standalone-recovery/entry.ts +469 -39
  413. package/src/runtime/standalone-recovery/installer.ts +262 -148
  414. package/src/runtime/standalone-recovery/mcp-server.ts +29 -193
  415. package/src/runtime/standalone-recovery/operation-lock.ts +1 -1
  416. package/src/runtime/standalone-recovery/performance.ts +54 -16
  417. package/src/runtime/standalone-recovery/release.ts +53 -5
  418. package/src/runtime/standalone-recovery/service-labels.ts +5 -2
  419. package/src/runtime/standalone-recovery/watchdog-heartbeat.ts +5 -2
  420. package/src/runtime/workflow/schedules/browser-probe.ts +17 -6
  421. package/src/runtime/workflow/schedules/chatgpt-automation-migration.ts +10 -3
  422. package/src/runtime/workflow/schedules/engine.ts +138 -172
  423. package/src/runtime/workflow/schedules/work-continuation.ts +44 -5
  424. package/src/runtime/workflows/runtime.ts +15 -19
  425. package/src/testing/test-governance.ts +5 -1
  426. package/supervisor/chatgpt-conversation.ts +23 -0
  427. package/supervisor/client.ts +201 -0
  428. package/supervisor/control-plane.ts +868 -0
  429. package/supervisor/entry.ts +15 -0
  430. package/supervisor/forge-validators.ts +80 -0
  431. package/supervisor/index.ts +5 -0
  432. package/supervisor/native-browser-adapter.ts +786 -0
  433. package/supervisor/native-messaging/host.ts +39 -0
  434. package/supervisor/native-messaging/manifest.ts +26 -0
  435. package/supervisor/native-messaging/protocol.ts +27 -0
  436. package/supervisor/paths.ts +18 -0
  437. package/supervisor/protocol.ts +202 -0
  438. package/supervisor/server.ts +404 -0
  439. package/supervisor/store.ts +1451 -0
  440. package/supervisor/tsconfig.json +8 -0
  441. package/supervisor/types.ts +255 -0
  442. package/adapters/chatgpt/controller-host.ts +0 -119
  443. package/adapters/mcp/controller-round-compatibility.ts +0 -184
  444. package/adapters/mcp/frozen-client-semantic-compatibility.ts +0 -292
  445. package/adapters/mcp/runtime-gateway/work-compat-adapter.ts +0 -502
  446. package/packages/kernel/progression/api/index.ts +0 -2
  447. package/packages/kernel/progression/application/projector.ts +0 -211
  448. package/packages/kernel/progression/domain/types.ts +0 -116
  449. package/packages/kernel/progression/index.ts +0 -1
  450. package/packages/kernel/scheduler/application/continuation-service.ts +0 -212
  451. package/packages/kernel/scheduler/domain/continuation.ts +0 -38
  452. package/packages/kernel/scheduler/infrastructure/continuation-dispatch-store.ts +0 -38
  453. package/packages/kernel/work/domain/admission-policy.ts +0 -34
  454. package/scripts/benchmark-background-check-overlap.ts +0 -228
  455. package/scripts/benchmark-computer-hotpath.ts +0 -255
  456. package/scripts/benchmark-controller-hotpath.ts +0 -212
  457. package/scripts/benchmark-controller-round2.ts +0 -191
  458. package/scripts/benchmark-ios-agent-device.ts +0 -511
  459. package/scripts/benchmark-mcp-host.sh +0 -117
  460. package/scripts/benchmark-mcp-transport.ts +0 -169
  461. package/scripts/benchmark-operational-memory-activation.ts +0 -235
  462. package/scripts/benchmark-operational-shadow.ts +0 -28
  463. package/scripts/benchmark-quality-harness.ts +0 -146
  464. package/scripts/benchmark-route-session-concurrency.ts +0 -915
  465. package/scripts/benchmark-thin-harness-gateway-ab.ts +0 -632
  466. package/scripts/benchmark-thin-harness-mcp-e2e.ts +0 -498
  467. package/scripts/benchmark-thin-harness.ts +0 -251
  468. package/scripts/benchmark-typescript-navigation.ts +0 -186
  469. package/scripts/benchmark-work-efficiency.ts +0 -334
  470. package/scripts/build-controller-ui.ts +0 -28
  471. package/scripts/check-npm-release.sh +0 -32
  472. package/scripts/check-public-release-surface.sh +0 -19
  473. package/scripts/check-release-published.sh +0 -57
  474. package/scripts/check-release-readiness.sh +0 -37
  475. package/scripts/check-release-version.mjs +0 -74
  476. package/scripts/check-tarball-install-smoke.sh +0 -150
  477. package/scripts/package-source-archive.sh +0 -147
  478. package/scripts/public-release-files.txt +0 -39
  479. package/scripts/public-release.ts +0 -174
  480. package/scripts/publish-release-tarball.sh +0 -27
  481. package/scripts/route-nl-vs-ts-eval.ts +0 -679
  482. package/scripts/stage-runtime-release.ts +0 -44
  483. package/src/cli/controller/progress.ts +0 -656
  484. package/src/cli/controller/work-mode.ts +0 -181
  485. package/src/cli/local-bridge/console-assets.ts +0 -17
  486. package/src/cli/local-bridge/dashboard.ts +0 -17
  487. package/src/cli/local-bridge/frontend/src/App.tsx +0 -10
  488. package/src/cli/local-bridge/frontend/src/components/Button.tsx +0 -1
  489. package/src/cli/local-bridge/frontend/src/components/DetailPane.tsx +0 -3
  490. package/src/cli/local-bridge/frontend/src/components/SearchField.tsx +0 -1
  491. package/src/cli/local-bridge/frontend/src/components/SectionHeader.tsx +0 -1
  492. package/src/cli/local-bridge/frontend/src/components/Segmented.tsx +0 -1
  493. package/src/cli/local-bridge/frontend/src/components/StatusText.tsx +0 -3
  494. package/src/cli/local-bridge/frontend/src/design/icons.tsx +0 -11
  495. package/src/cli/local-bridge/frontend/src/design/tokens.css +0 -8
  496. package/src/cli/local-bridge/frontend/src/features/automations/AutomationsView.tsx +0 -153
  497. package/src/cli/local-bridge/frontend/src/features/capabilities/CapabilitiesView.tsx +0 -37
  498. package/src/cli/local-bridge/frontend/src/features/overview/OverviewView.tsx +0 -183
  499. package/src/cli/local-bridge/frontend/src/features/repositories/RepositoriesView.tsx +0 -2
  500. package/src/cli/local-bridge/frontend/src/features/system/SystemView.tsx +0 -2
  501. package/src/cli/local-bridge/frontend/src/features/work/WorkView.tsx +0 -4
  502. package/src/cli/local-bridge/frontend/src/lib/api.ts +0 -30
  503. package/src/cli/local-bridge/frontend/src/lib/format.ts +0 -4
  504. package/src/cli/local-bridge/frontend/src/lib/routes.ts +0 -7
  505. package/src/cli/local-bridge/frontend/src/main.tsx +0 -1
  506. package/src/cli/local-bridge/frontend/src/shell/AppShell.tsx +0 -1
  507. package/src/cli/local-bridge/frontend/src/shell/CommandBar.tsx +0 -2
  508. package/src/cli/local-bridge/frontend/src/shell/Sidebar.tsx +0 -4
  509. package/src/cli/local-bridge/frontend/src/styles.css +0 -28
  510. package/src/cli/local-bridge/frontend/src/types.ts +0 -15
  511. package/src/cli/local-bridge/frontend/src/vite-env.d.ts +0 -1
  512. package/src/cli/local-bridge/frontend/vite.config.ts +0 -27
  513. package/src/cli/local-bridge/ui-dist/app.css +0 -1
  514. package/src/cli/local-bridge/ui-dist/app.js +0 -11228
  515. package/src/runtime/control-plane/execution/content-equivalent-commit-authority.ts +0 -169
  516. package/src/runtime/control-plane/execution/direct-canonical-work-reconciliation.ts +0 -85
  517. package/src/runtime/control-plane/execution/direct-edit-work-completion.ts +0 -655
  518. package/src/runtime/control-plane/execution/work-finalization-service.ts +0 -2850
  519. package/src/runtime/control-plane/execution/work-path-scope.ts +0 -37
  520. package/src/runtime/control-plane/execution/work-task-receipt.ts +0 -468
  521. package/src/runtime/control-plane/facade/controller-round-relay.ts +0 -3
  522. package/src/runtime/control-plane/facade/work-admission-policy.ts +0 -142
  523. package/src/runtime/control-plane/facade/work-implementation-review.ts +0 -2
  524. package/src/runtime/control-plane/facade/work-state-machine.ts +0 -2
  525. package/src/runtime/control-plane/facade/work-task-projection.ts +0 -66
  526. package/src/runtime/control-plane/routing/index.ts +0 -1
  527. package/src/runtime/control-plane/routing/route-policy.ts +0 -401
  528. package/src/runtime/control-plane/routing/workspace-admission.ts +0 -70
@@ -325,7 +325,7 @@ export function runSelfHealingLoop(ctx: SelfHealingContext, input: SelfHealingIn
325
325
  if (operation === 'verify') {
326
326
  return buildFacadeResult({
327
327
  status: 'ok',
328
- summary: 'Self-healing verification suggestion only; run real registered checks via rh_work verify or rh_status.',
328
+ summary: 'Self-healing verification is a maintenance observation; run registered repository checks through run_check when code verification is needed.',
329
329
  data: {
330
330
  operation: 'verify',
331
331
  dryRun,
@@ -333,64 +333,29 @@ export function runSelfHealingLoop(ctx: SelfHealingContext, input: SelfHealingIn
333
333
  },
334
334
  suggestedNextActions: validateSuggestedNextActions([
335
335
  verificationSuggestion(input.workId),
336
- {
337
- label: 'Run work verify if work_id known',
338
- tool: 'rh_work',
339
- operation: 'verify',
340
- payload: { work_id: input.workId },
341
- risk: 'workspace_write',
342
- confidence: input.workId ? 'medium' : 'low',
343
- },
344
336
  ]).actions,
345
337
  });
346
338
  }
347
339
 
348
340
  if (operation === 'handoff') {
349
- const handoff = createHandoffItem(ctx.handoffStore, {
350
- id: `hnd-heal-${randomUUID().slice(0, 8)}`,
351
- repoId: ctx.repoId,
352
- workId: input.workId,
353
- title: 'Self-healing needs judgement',
354
- severity: 'needs_review',
355
- creationReason: 'repeated_infrastructure_failure',
356
- reason: 'Self-healing could not safely complete without ChatGPT or user decision.',
357
- summary: issues.map((issue) => issue.summary).join(' | ').slice(0, 500) || 'Manual recovery decision required.',
358
- currentState: {
359
- repoId: ctx.repoId,
360
- workId: input.workId,
361
- statusSummary: 'self-healing handoff pending',
362
- },
363
- attemptedActions: ['self_healing_diagnose', 'self_healing_repair'],
364
- evidenceRefs: [],
365
- blockingDecision: 'Choose bounded metadata repair, external lifecycle handoff, retry later, or re-scope work.',
366
- recommendedDecision: 'Prefer safe dry-run repairs; Runtime lifecycle changes belong to the external lifecycle owner.',
367
- recommendedPrompt: 'Review self-healing handoff and choose repair or stop.',
368
- suggestedNextActions: [
369
- {
370
- label: 'Diagnose again (dry-run)',
371
- tool: 'rh_work',
372
- operation: 'repair',
373
- payload: { repair_operation: 'diagnose', dry_run: true },
374
- risk: 'readonly',
375
- },
376
- ],
377
- });
378
-
341
+ // Infrastructure recovery is internal execution state. Escalate only when a
342
+ // concrete user authorization or product decision has actually been found.
379
343
  return buildFacadeResult({
380
344
  status: 'blocked',
381
- summary: `Self-healing handoff ${handoff.id} created.`,
345
+ summary: 'Self-healing could not safely complete automatically; keep the exact Work blocked for bounded internal recovery rather than escalating infrastructure failure to the user.',
382
346
  data: {
383
347
  operation: 'handoff',
384
- handoffId: handoff.id,
348
+ internalRecoveryRequired: true,
385
349
  isAcceptanceFailure: false,
386
350
  },
387
351
  suggestedNextActions: [
388
352
  {
389
- label: 'Get handoff',
390
- tool: 'rh_inbox',
391
- operation: 'get',
392
- payload: { handoff_id: handoff.id },
393
- risk: 'readonly',
353
+ label: 'Diagnose again (dry-run)',
354
+ tool: 'rh_work',
355
+ operation: 'repair',
356
+ payload: { repair_operation: 'diagnose', dry_run: true, work_id: input.workId },
357
+ risk: 'workspace_write',
358
+ confidence: 'low',
394
359
  },
395
360
  ],
396
361
  });
@@ -541,14 +506,14 @@ export function runSelfHealingLoop(ctx: SelfHealingContext, input: SelfHealingIn
541
506
  },
542
507
  suggestedNextActions: validateSuggestedNextActions([
543
508
  verificationSuggestion(input.workId),
544
- {
545
- label: 'Continue work if applicable',
546
- tool: 'rh_work',
547
- operation: 'continue',
509
+ ...(input.workId ? [{
510
+ label: 'Read current Work semantic state',
511
+ tool: 'rh_work' as const,
512
+ operation: 'get',
548
513
  payload: { work_id: input.workId },
549
- risk: 'readonly',
550
- confidence: input.workId ? 'medium' : 'low',
551
- },
514
+ risk: 'readonly' as const,
515
+ confidence: 'medium' as const,
516
+ }] : []),
552
517
  ]).actions,
553
518
  rawAvailable: false,
554
519
  });
@@ -1,42 +1,38 @@
1
- import { RH_WORK_OPERATIONS } from './rh-work-operation-contract';
1
+ import { RH_WORK_MODEL_OPERATIONS } from './rh-work-operation-contract';
2
2
  import { FACADE_TOOLS, type EvidenceRef, type FacadeTool, type SuggestedNextAction } from './types';
3
3
 
4
4
  function expectedActionRisk(action: SuggestedNextAction): SuggestedNextAction['risk'] | undefined {
5
5
  if (action.tool !== 'rh_work') return undefined;
6
6
  switch (action.operation) {
7
7
  case 'start':
8
- case 'continue':
9
- case 'verify':
10
- case 'review':
11
8
  case 'repair':
12
- case 'stop':
13
- case 'delegate':
14
- case 'controller_claim':
15
- case 'controller_release':
16
- case 'controller_disposition':
17
9
  case 'launcher_start':
18
10
  case 'requirement_create':
19
- case 'requirement_continue':
11
+ case 'requirement_promote_candidate':
20
12
  case 'schedule_create':
21
13
  case 'schedule_pause':
22
14
  case 'schedule_resume':
23
15
  case 'schedule_delete':
24
16
  case 'schedule_trigger':
25
17
  return 'workspace_write';
26
- case 'controller_get_owner':
27
18
  case 'schedule_list':
28
19
  case 'schedule_get':
29
20
  return 'readonly';
30
21
  case 'plan_create':
22
+ case 'plan_revise':
23
+ case 'revise':
24
+ case 'complete':
25
+ case 'workflow_execute':
26
+ case 'workflow_reconcile':
27
+ case 'learning_record':
28
+ case 'learning_feedback':
29
+ case 'outcome_record':
30
+ case 'experience_record':
31
+ return 'workspace_write';
31
32
  case 'plan_get':
32
33
  case 'plan_list':
34
+ case 'get':
33
35
  return 'readonly';
34
- case 'plan_approve':
35
- case 'plan_accept_step':
36
- case 'plan_supersede':
37
- return 'workspace_write';
38
- case 'finalize':
39
- return 'local_repo_write';
40
36
  default:
41
37
  return undefined;
42
38
  }
@@ -47,7 +43,8 @@ const ALLOWED_FACADE_OPERATIONS: Record<FacadeTool, readonly string[]> = {
47
43
  rh_status: ['list', 'get', 'repair'],
48
44
  rh_inbox: ['list', 'get', 'ack', 'accept', 'resolve', 'dismiss', 'create'],
49
45
  rh_context: ['list', 'get', 'search'],
50
- rh_work: RH_WORK_OPERATIONS,
46
+ rh_work: RH_WORK_MODEL_OPERATIONS,
47
+ capability_execute: ['execute'],
51
48
  };
52
49
 
53
50
  export interface SuggestedActionValidationOptions {
@@ -1,20 +1,17 @@
1
1
  import type {
2
2
  WorkContract,
3
3
  VerificationOutcome,
4
- ExecutionMode,
5
4
  FacadeDetailLevel,
6
5
  EvidenceRef,
7
6
  SuggestedNextAction,
8
7
  PolicyDecision,
9
8
  } from '../../../../packages/kernel/work/domain/types';
10
9
  export type {
11
- ExecutionMode,
12
10
  FacadeDetailLevel,
13
11
  EvidenceRef,
14
12
  SuggestedNextAction,
15
13
  PolicyDecision,
16
14
  } from '../../../../packages/kernel/work/domain/types';
17
- import { applyRouteContextHints, decideRoute, type ExplicitTaskMode, type RouteContextHints, type RouteDecision, type RoutePolicyInput } from '../routing/route-policy';
18
15
  import {
19
16
  TERMINAL_PLAN_CONTRACT_STATUSES,
20
17
  type PlanContractStatus,
@@ -28,10 +25,7 @@ export {
28
25
  type PlanStepStatus,
29
26
  } from '../../../../packages/kernel/goal/api/index';
30
27
 
31
- export const EXECUTION_MODES = ['direct_control', 'goal_workloop', 'handoff_only'] as const;
32
- const _executionModesTypeCheck: readonly ExecutionMode[] = EXECUTION_MODES;
33
-
34
- export const FACADE_TOOLS = ['rh_access', 'rh_status', 'rh_inbox', 'rh_context', 'rh_work'] as const;
28
+ export const FACADE_TOOLS = ['rh_access', 'rh_status', 'rh_inbox', 'rh_context', 'rh_work', 'capability_execute'] as const;
35
29
  export type FacadeTool = (typeof FACADE_TOOLS)[number];
36
30
  export type CapabilityExecutionSurface = FacadeTool | 'plugin_action_execute';
37
31
 
@@ -84,11 +78,11 @@ import type { HandoffStatus } from '../../../../packages/protocols/handoff/index
84
78
 
85
79
  // Kernel V2: Work domain contracts are owned by packages/kernel/work/domain.
86
80
  export {
87
- WORK_CONTRACT_STATUSES,
81
+ SEMANTIC_WORK_STATES,
88
82
  WORK_PHASES,
89
83
  WORK_PHASE_EVIDENCE_STATES,
90
84
  WORK_RISKS,
91
- TERMINAL_WORK_CONTRACT_STATUSES,
85
+ TERMINAL_SEMANTIC_WORK_STATES,
92
86
  WORK_KINDS,
93
87
  DISPATCH_STATES,
94
88
  EVIDENCE_STATES,
@@ -100,10 +94,10 @@ export {
100
94
  isReadOnlyReviewCompletionReceipt,
101
95
  isRemoteEffectCompletionReceipt,
102
96
  isDirectEditWorkCompletionReceipt,
103
- isTerminalWorkContractStatus,
97
+ isTerminalSemanticWorkState,
104
98
  } from '../../../../packages/kernel/work/domain/types';
105
99
  export type {
106
- WorkContractStatus,
100
+ SemanticWorkState,
107
101
  WorkPhase,
108
102
  WorkPhaseEvidenceState,
109
103
  WorkPhaseEvidence,
@@ -124,7 +118,6 @@ export type {
124
118
  WorkReconciliationOutcome,
125
119
  VerificationOutcome,
126
120
  WorkContractConstraints,
127
- WorkContractDriverPolicy,
128
121
  WorktreePolicy,
129
122
  EvidencePolicy,
130
123
  ApprovalPolicy,
@@ -140,8 +133,6 @@ export const HANDOFF_CREATION_REASONS = [
140
133
  'ambiguous_outcome',
141
134
  'missing_authorization',
142
135
  'invalid_objective',
143
- 'repeated_infrastructure_failure',
144
- 'codex_worker_requires_review',
145
136
  'destructive_action_requires_confirmation',
146
137
  ] as const;
147
138
  export type HandoffCreationReason = (typeof HANDOFF_CREATION_REASONS)[number];
@@ -163,13 +154,12 @@ export interface HandoffCurrentState {
163
154
  issueId?: string;
164
155
  taskId?: string;
165
156
  workId?: string;
166
- mode?: ExecutionMode;
167
157
  statusSummary: string;
168
158
  blockedBy?: string[];
169
159
  changedFiles?: string[];
170
160
  checks?: Array<{ checkId: string; ok: boolean; summary?: string; outcome?: VerificationOutcome }>;
171
161
  /** Bounded durable Work semantics for a fresh controller session. */
172
- workSemantics?: Pick<WorkContract, 'phase' | 'status' | 'workKind' | 'dispatchState' | 'evidenceState' | 'completionOutcome'>;
162
+ workSemantics?: Pick<WorkContract, 'semanticState' | 'phase' | 'workKind' | 'dispatchState' | 'evidenceState' | 'completionOutcome'>;
173
163
  reconciliationRequired?: boolean;
174
164
  nextSafeAction?: string;
175
165
  }
@@ -187,6 +177,8 @@ export interface HandoffItem {
187
177
  id: string;
188
178
  repoId: string;
189
179
  workId?: string;
180
+ /** Canonical person-only blocker/decision authority when this legacy Handoff projects one. */
181
+ canonicalUserRequestId?: string;
190
182
  issueId?: string;
191
183
  taskId?: string;
192
184
  title: string;
@@ -226,6 +218,26 @@ export type {
226
218
  ControllerLease,
227
219
  ControllerRoundContext,
228
220
  } from '../../../../packages/kernel/controller/domain/types';
221
+ export interface PlanSemanticItem {
222
+ id: string;
223
+ objective: string;
224
+ dependencies: string[];
225
+ }
226
+
227
+ export interface PlanSemanticContext {
228
+ /** Requirement semantic revision used as planning provenance; never an execution gate. */
229
+ requirementBasisRevision?: number;
230
+ sourceBasisRevision: string;
231
+ goal: string;
232
+ nonGoals: string[];
233
+ assumptions: string[];
234
+ resolvedDecisions: string[];
235
+ stopConditions: string[];
236
+ replanConditions: string[];
237
+ integrationStrategy?: string;
238
+ items: PlanSemanticItem[];
239
+ }
240
+
229
241
  export interface PlanStep {
230
242
  id: string;
231
243
  objective: string;
@@ -297,7 +309,8 @@ export interface PlanRevisionDraft {
297
309
  * never own active scope, Work, scheduling, or admission authority. */
298
310
  export interface PlanRevisionRecord {
299
311
  schemaVersion: 1;
300
- repoId: string;
312
+ /** Node-local placement provenance; absent for a ForgeInstance-scoped Plan. */
313
+ repoId?: string;
301
314
  planId: string;
302
315
  revision: number;
303
316
  requirementId?: string;
@@ -323,9 +336,16 @@ export interface PlanRevisionRecord {
323
336
  export interface PlanContract {
324
337
  schemaVersion: 1;
325
338
  planId: string;
326
- /** Current committed semantic revision. Legacy rows without this field normalize to revision 1. */
339
+ /** Legacy PlanContract lifecycle revision retained during authority migration. */
327
340
  revision?: number;
328
- repoId: string;
341
+ /** Thin model-authored Plan revision, independent from lifecycle/step execution updates. */
342
+ semanticRevision?: number;
343
+ /** Timestamp of the model-authored Plan content; lifecycle/step updates must not change it. */
344
+ semanticUpdatedAt?: string;
345
+ /** Thin model-authored working memory. Once present, legacy steps/status cannot rewrite semantic Plan content. */
346
+ semanticContext?: PlanSemanticContext;
347
+ /** @deprecated Node-local placement compatibility field; absent for a ForgeInstance-scoped Plan. */
348
+ repoId?: string;
329
349
  /** Stable Requirement owner. Legacy plans may omit this until portfolio migration. */
330
350
  requirementId?: string;
331
351
  scopeKey: string;
@@ -389,27 +409,18 @@ export interface CapabilityGroupSummary {
389
409
  schemaExposures: CapabilitySchemaExposure[];
390
410
  }
391
411
 
392
- export interface ExecutionModeSelectionInput {
412
+ /**
413
+ * Concrete mechanical facts about one Work start request. Forge validates and
414
+ * persists these; it never derives engineering method, worker/provider choice,
415
+ * verification, review, or completion from them. Choosing durable Work at all
416
+ * is the caller's explicit decision to invoke this capability.
417
+ */
418
+ export interface WorkStartFacts {
393
419
  objective?: string;
394
- expectedFiles?: number;
395
- expectedChangedLines?: number;
396
420
  scopeClear: boolean;
397
- knownPaths?: string[];
398
- workspaceDirty?: boolean;
399
- workspaceFingerprint?: string;
400
- checkoutId?: string;
401
- /** Canonical typed placement constraint; never inferred from objective text. */
402
- workspacePlacement?: 'current' | 'isolated' | 'auto';
403
- /** Admission fence that has precedence over explicit Direct routing. */
404
- directMainProhibited?: boolean;
405
- requiresInvestigation?: boolean;
406
- requiresLongRunningChecks?: boolean;
407
- requiresParallelism?: boolean;
408
- explicitMode?: ExplicitTaskMode;
409
- needsDependencies?: boolean;
421
+ mutation?: boolean;
410
422
  requiresRecovery?: boolean;
411
- /** True only when the user explicitly requested an agent/worker executor. Complexity alone must not enable workers. */
412
- requiresWorker?: boolean;
423
+ /** True when the request causes an effect outside the checkout (plugin action, remote publish). */
413
424
  requiresExternalEffect?: boolean;
414
425
  requiresApproval?: boolean;
415
426
  requiresUserApproval?: boolean;
@@ -417,76 +428,6 @@ export interface ExecutionModeSelectionInput {
417
428
  destructive?: boolean;
418
429
  remoteWrite?: boolean;
419
430
  secretAccess?: boolean;
420
- mutation?: boolean;
421
431
  risk?: CapabilityRisk;
422
- /** Advisory Context Plane routing hints. Explicit request fields still win. */
423
- contextRouteHints?: RouteContextHints;
424
- /** Migration/testing escape hatch: adapters must return this exact policy decision. */
425
- routePolicyInput?: RoutePolicyInput;
426
- }
427
-
428
- export interface ExecutionModeSelection {
429
- mode: ExecutionMode;
430
- reason: string;
431
- missingContractFields: string[];
432
- createWorkContract: boolean;
433
- createHandoff: boolean;
434
- requiresWork: boolean;
435
- routeDecision: RouteDecision;
436
- }
437
-
438
- /** @deprecated Compatibility adapter. Route Policy is the sole routing authority. */
439
- export function selectExecutionMode(input: ExecutionModeSelectionInput): ExecutionModeSelection {
440
- const missingContractFields: string[] = [];
441
- if (!input.scopeClear) missingContractFields.push('scopeSummary', 'acceptanceCriteria', 'allowedPaths');
442
- if (input.objective !== undefined && input.objective.trim().length === 0) missingContractFields.push('objective');
443
- const baseRoutePolicyInput: RoutePolicyInput = input.routePolicyInput ?? {
444
- intent: {
445
- objective: input.objective ?? (input.scopeClear ? 'bounded repository work' : ''),
446
- scopeClear: input.scopeClear,
447
- mutation: input.mutation ?? input.risk !== 'readonly',
448
- expectedFiles: input.expectedFiles,
449
- expectedChangedLines: input.expectedChangedLines,
450
- requiresInvestigation: input.requiresInvestigation,
451
- requiresLongRunningChecks: input.requiresLongRunningChecks,
452
- requiresParallelism: input.requiresParallelism,
453
- explicitMode: input.explicitMode,
454
- needsDependencies: input.needsDependencies,
455
- agentRequested: input.requiresWorker,
456
- },
457
- workspace: {
458
- knownPaths: input.knownPaths,
459
- dirty: input.workspaceDirty,
460
- checkoutId: input.checkoutId,
461
- fingerprint: input.workspaceFingerprint,
462
- placement: input.workspacePlacement,
463
- directMainProhibited: input.directMainProhibited,
464
- },
465
- policy: {
466
- risk: input.risk,
467
- requiresApproval: input.requiresApproval,
468
- requiresUserApproval: input.requiresUserApproval,
469
- approvalConfirmed: input.approvalConfirmed,
470
- destructive: input.destructive,
471
- remoteWrite: input.remoteWrite,
472
- secretAccess: input.secretAccess,
473
- },
474
- capabilities: {
475
- requiresWorker: input.requiresWorker,
476
- requiresExternalEffect: input.requiresExternalEffect,
477
- },
478
- recovery: {
479
- required: input.requiresRecovery,
480
- },
481
- };
482
- const routeDecision = decideRoute(applyRouteContextHints(baseRoutePolicyInput, input.contextRouteHints));
483
- return {
484
- mode: routeDecision.executionMode,
485
- reason: routeDecision.reasons.map((reason) => reason.message).join(' '),
486
- missingContractFields: routeDecision.executionMode === 'handoff_only' && missingContractFields.length > 0 ? missingContractFields : [],
487
- createWorkContract: routeDecision.requiresWork,
488
- createHandoff: routeDecision.createHandoff,
489
- requiresWork: routeDecision.requiresWork,
490
- routeDecision,
491
- };
432
+ workspaceDirty?: boolean;
492
433
  }
@@ -14,8 +14,8 @@ export interface WorkContinuationSnapshot {
14
14
  worktreeRef?: string;
15
15
  };
16
16
  semantics: {
17
+ state: WorkContract['semanticState'];
17
18
  phase: WorkContract['phase'];
18
- status: WorkContract['status'];
19
19
  workKind: WorkContract['workKind'];
20
20
  dispatchState: WorkContract['dispatchState'];
21
21
  evidenceState: WorkContract['evidenceState'];
@@ -43,16 +43,16 @@ function boundedText(value: string | undefined, maximum: number): string | undef
43
43
  function nextSafeAction(contract: WorkContract, reconciliationRequired: boolean): string {
44
44
  if (reconciliationRequired) return 'Inspect the recorded reconciliation and decide whether to accept, reject, or supersede it; do not infer completion.';
45
45
  if (contract.evidenceState === 'stale' || contract.evidenceState === 'contradictory') return 'Re-run required validation against the current bound revision before finalization.';
46
- if (contract.status === 'open' || contract.status === 'ready') return 'Claim controller ownership before starting mutating execution.';
47
- if (contract.status === 'running') return 'Inspect the bound Work and its durable process/check evidence; do not resubmit the same request ID.';
48
- if (contract.status === 'completed') return 'Read the completion receipt and retain the exact revision evidence; no further mutation is implied.';
49
- if (contract.status === 'failed') return 'Inspect failure evidence and choose an explicit repair, reconciliation, or stop action.';
50
- return 'Inspect retained evidence before any further action.';
46
+ if (contract.semanticState === 'completed') return 'Read retained result/evidence references; no further mutation is implied.';
47
+ if (contract.semanticState === 'cancelled') return 'This Work is cancelled and cannot be reopened; create an explicit successor Work if the objective must continue.';
48
+ if (contract.dispatchState === 'running' || contract.dispatchState === 'launching' || contract.dispatchState === 'claimed') return 'Inspect the bound Work and its durable process/check evidence; do not resubmit the same request ID.';
49
+ if (contract.evidenceState === 'failed' || contract.phaseEvidence[contract.phase].state === 'failed') return 'Inspect failure evidence and choose an explicit repair, reconciliation, or stop action.';
50
+ return 'Execute the next authorized step within this Work scope; inspect existing writer and process conflicts before mutating shared resources.';
51
51
  }
52
52
 
53
53
  /**
54
54
  * Redacted, bounded state needed by a fresh controller session. This is a
55
- * projection only: it never upgrades a status or interprets a reconciliation
55
+ * projection only: it never changes semantic state or interprets a reconciliation
56
56
  * as completion.
57
57
  */
58
58
  export function buildWorkContinuationSnapshot(contract: WorkContract): WorkContinuationSnapshot {
@@ -82,8 +82,8 @@ export function buildWorkContinuationSnapshot(contract: WorkContract): WorkConti
82
82
  worktreeRef: contract.worktreeRef,
83
83
  },
84
84
  semantics: {
85
+ state: contract.semanticState,
85
86
  phase: contract.phase,
86
- status: contract.status,
87
87
  workKind: contract.workKind,
88
88
  dispatchState: contract.dispatchState,
89
89
  evidenceState: contract.evidenceState,
@@ -25,6 +25,7 @@ export interface GeneratedCacheRetentionOptions {
25
25
  maxEntries?: number;
26
26
  maxRemovals?: number;
27
27
  processCommands?: string[];
28
+ rootStartIndex?: number;
28
29
  }
29
30
 
30
31
  export interface GeneratedCacheRetentionReport {
@@ -37,6 +38,19 @@ export interface GeneratedCacheRetentionReport {
37
38
  budgetExhausted: boolean;
38
39
  }
39
40
 
41
+ export interface GeneratedCacheRepositoryRootSet {
42
+ canonicalRoot: string;
43
+ checkouts: ReadonlyArray<{
44
+ localRoot: string;
45
+ worktree: boolean;
46
+ lifecycle?: 'active' | 'removed' | 'archived';
47
+ }>;
48
+ }
49
+
50
+ export interface RepositoryGeneratedCacheRetentionReport extends GeneratedCacheRetentionReport {
51
+ rootsInspected: number;
52
+ }
53
+
40
54
  export type BrowserDisposableArtifactKind = 'screenshots' | 'downloads' | 'diagnostics';
41
55
 
42
56
  export interface BrowserArtifactRetentionOptions {
@@ -171,6 +185,10 @@ function directChildFiles(root: string, budget: { remaining: number }): string[]
171
185
  return found;
172
186
  }
173
187
 
188
+ function isDerivedDataDirectoryName(name: string): boolean {
189
+ return name === 'DerivedData' || name.startsWith('DerivedData-');
190
+ }
191
+
174
192
  function nestedDerivedDataDirectories(root: string, maxDepth: number, budget: { remaining: number }): string[] {
175
193
  if (!existsSync(root) || budget.remaining <= 0) return [];
176
194
  const found: string[] = [];
@@ -183,7 +201,7 @@ function nestedDerivedDataDirectories(root: string, maxDepth: number, budget: {
183
201
  budget.remaining -= 1;
184
202
  if (!entry.isDirectory()) continue;
185
203
  const path = join(dir, String(entry.name));
186
- if (String(entry.name) === 'DerivedData') {
204
+ if (isDerivedDataDirectoryName(String(entry.name))) {
187
205
  found.push(path);
188
206
  continue;
189
207
  }
@@ -313,6 +331,84 @@ export function cleanupGeneratedRepositoryCaches(
313
331
  return report;
314
332
  }
315
333
 
334
+ /**
335
+ * Apply the same generated-cache policy to the canonical checkout and every
336
+ * active managed worktree, sharing one scan/removal budget across the whole
337
+ * repository. Work lifecycle is intentionally not cache authority: stale but
338
+ * recoverable Work may keep its source checkout while rebuildable caches age
339
+ * out independently. Active build/test processes are still protected by
340
+ * cleanupGeneratedRepositoryCaches().
341
+ */
342
+ export function cleanupGeneratedRepositoryCheckoutCaches(
343
+ repository: GeneratedCacheRepositoryRootSet,
344
+ options: GeneratedCacheRetentionOptions = {},
345
+ ): RepositoryGeneratedCacheRetentionReport {
346
+ let remainingEntries = Math.max(1, Math.floor(options.maxEntries ?? DEFAULT_SCAN_BUDGET));
347
+ let remainingRemovals = Math.max(1, Math.floor(options.maxRemovals ?? DEFAULT_REMOVAL_BUDGET));
348
+ const processCommands = options.processCommands ?? collectProcessCommands();
349
+ const roots = [
350
+ repository.canonicalRoot,
351
+ ...repository.checkouts
352
+ .filter((checkout) => checkout.worktree && (checkout.lifecycle ?? 'active') === 'active')
353
+ .map((checkout) => checkout.localRoot),
354
+ ].filter((root, index, values) => values.findIndex((item) => canonical(item) === canonical(root)) === index);
355
+ if (roots.length > 1) {
356
+ const offset = ((Math.trunc(options.rootStartIndex ?? 0) % roots.length) + roots.length) % roots.length;
357
+ roots.push(...roots.splice(0, offset));
358
+ }
359
+ const rawRoots = roots.map((root) => resolve(root));
360
+ const canonicalRoots = roots.map((root) => canonical(root));
361
+ const processCommandsForRoot = (root: string): string[] => {
362
+ const rawRoot = resolve(root);
363
+ const canonicalRoot = canonical(root);
364
+ return processCommands.filter((command) => {
365
+ const referencedRootIndexes = rawRoots
366
+ .map((candidate, index) => command.includes(candidate) || command.includes(canonicalRoots[index]!) ? index : -1)
367
+ .filter((index) => index >= 0);
368
+ if (referencedRootIndexes.length === 0) return true;
369
+ return referencedRootIndexes.some((index) => rawRoots[index] === rawRoot || canonicalRoots[index] === canonicalRoot);
370
+ });
371
+ };
372
+
373
+ const aggregate: RepositoryGeneratedCacheRetentionReport = {
374
+ rootsInspected: 0,
375
+ inspected: 0,
376
+ eligible: 0,
377
+ removedPaths: [],
378
+ retainedPaths: [],
379
+ skippedByReason: {},
380
+ errors: [],
381
+ budgetExhausted: false,
382
+ };
383
+
384
+ for (const root of roots) {
385
+ if (remainingEntries <= 0 || remainingRemovals <= 0) {
386
+ aggregate.budgetExhausted = true;
387
+ break;
388
+ }
389
+ const report = cleanupGeneratedRepositoryCaches(root, {
390
+ ...options,
391
+ processCommands: processCommandsForRoot(root),
392
+ maxEntries: remainingEntries,
393
+ maxRemovals: remainingRemovals,
394
+ });
395
+ aggregate.rootsInspected += 1;
396
+ aggregate.inspected += report.inspected;
397
+ aggregate.eligible += report.eligible;
398
+ aggregate.removedPaths.push(...report.removedPaths.map((path) => `${root}:${path}`));
399
+ aggregate.retainedPaths.push(...report.retainedPaths.map((path) => `${root}:${path}`));
400
+ for (const [reason, count] of Object.entries(report.skippedByReason)) {
401
+ aggregate.skippedByReason[reason] = (aggregate.skippedByReason[reason] ?? 0) + count;
402
+ }
403
+ aggregate.errors.push(...report.errors.map((error) => `${root}:${error}`));
404
+ remainingEntries = Math.max(0, remainingEntries - report.inspected);
405
+ remainingRemovals = Math.max(0, remainingRemovals - report.removedPaths.length);
406
+ aggregate.budgetExhausted ||= report.budgetExhausted;
407
+ }
408
+ if (remainingEntries <= 0 || remainingRemovals <= 0) aggregate.budgetExhausted = true;
409
+ return aggregate;
410
+ }
411
+
316
412
  function emptyBrowserArtifactClassReport(): BrowserArtifactClassRetentionReport {
317
413
  return {
318
414
  inspected: 0,