@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
@@ -1,37 +0,0 @@
1
- import { globMatches } from '../../../cli/mcp/paths';
2
- import type { WorkContract } from '../facade/types';
3
-
4
- export interface WorkPathScopeViolation {
5
- kind: 'forbidden' | 'out_of_scope';
6
- path: string;
7
- pattern?: string;
8
- }
9
-
10
- /**
11
- * WorkContract path scope is the durable mutation authority. Edit-session or
12
- * caller-local path filters may narrow this scope, but they can never widen it.
13
- */
14
- export function findWorkPathScopeViolation(
15
- work: Pick<WorkContract, 'allowedPaths' | 'forbiddenPaths'>,
16
- paths: readonly string[],
17
- ): WorkPathScopeViolation | undefined {
18
- for (const path of [...new Set(paths.map((value) => value.trim()).filter(Boolean))]) {
19
- const forbidden = work.forbiddenPaths.find((pattern) => globMatches(pattern, path));
20
- if (forbidden) return { kind: 'forbidden', path, pattern: forbidden };
21
- if (work.allowedPaths.length > 0 && !work.allowedPaths.some((pattern) => globMatches(pattern, path))) {
22
- return { kind: 'out_of_scope', path };
23
- }
24
- }
25
- return undefined;
26
- }
27
-
28
- export function assertWorkPathsWithinScope(
29
- work: Pick<WorkContract, 'allowedPaths' | 'forbiddenPaths'>,
30
- paths: readonly string[],
31
- codes: { forbidden: string; outOfScope: string },
32
- ): void {
33
- const violation = findWorkPathScopeViolation(work, paths);
34
- if (!violation) return;
35
- if (violation.kind === 'forbidden') throw new Error(`${codes.forbidden}: ${violation.path}`);
36
- throw new Error(`${codes.outOfScope}: ${violation.path}`);
37
- }
@@ -1,468 +0,0 @@
1
- import { createHash } from 'crypto';
2
- import { spawnSync } from 'child_process';
3
- import { getIssue, listIssues, recordTaskVerification, acceptVerifiedTask, projectTaskFromWork } from '../../../cli/controller/issue-store';
4
- import { resolveCompletionTargetBranch } from '../../../cli/controller/completion-target';
5
- import type { CompletionReceipt, ControllerIssue } from '../../../cli/controller/types';
6
- import { getWorkContract, updateWorkContract } from '../../../../packages/kernel/work/api/index';
7
- import { completeWorkWithReceipt } from './work-completion-authority';
8
- import { isRepositoryCompletionReceipt, WORK_RECONCILIATION_METHODS, WORK_RECONCILIATION_OUTCOMES } from '../facade/types';
9
- import type {
10
- WorkReconciliationMethod,
11
- WorkReconciliationOutcome,
12
- WorkReconciliationRecord,
13
- } from '../facade/types';
14
- import { readWorkHandle } from './work-handle-store';
15
- import { effectiveVerificationEvidence } from './verification-evidence';
16
-
17
- function gitText(repoRoot: string, args: string[]): string {
18
- const result = spawnSync('git', args, { cwd: repoRoot, encoding: 'utf-8' });
19
- if (result.status !== 0 || result.error || typeof result.stdout !== 'string') {
20
- throw new Error(`CONTROLLER_WORK_RECEIPT_GIT_FAILED: git ${args.join(' ')}`);
21
- }
22
- return result.stdout.trim();
23
- }
24
-
25
- function commitRevision(repoRoot: string, revision: string | undefined, label: string): string {
26
- if (!revision?.trim()) throw new Error(`CONTROLLER_WORK_RECEIPT_${label}_MISSING`);
27
- return gitText(repoRoot, ['rev-parse', `${revision.trim()}^{commit}`]);
28
- }
29
-
30
- export function changedPaths(repoRoot: string, baseRevision: string, targetRevision: string): string[] {
31
- const result = spawnSync('git', ['diff', '--name-only', '-z', baseRevision, targetRevision], {
32
- cwd: repoRoot,
33
- encoding: 'utf-8',
34
- maxBuffer: 8 * 1024 * 1024,
35
- });
36
- if (result.status !== 0 || result.error || typeof result.stdout !== 'string') {
37
- throw new Error('CONTROLLER_WORK_RECEIPT_CHANGED_PATHS_UNAVAILABLE');
38
- }
39
- return [...new Set(result.stdout.split('\0').filter(Boolean))].sort();
40
- }
41
-
42
- /**
43
- * Net tracked paths for a Work whose authoritative repository baseline was an
44
- * unborn HEAD. The baseline is the empty repository, so every tracked path in
45
- * the current target tree is a net implementation path. This remains correct
46
- * after more than one commit, unlike a single-commit diff-tree comparison.
47
- */
48
- export function changedPathsFromUnbornBase(repoRoot: string, targetRevision: string): string[] {
49
- const targetCommit = commitRevision(repoRoot, targetRevision, 'TARGET_REVISION');
50
- const result = spawnSync('git', ['ls-tree', '-r', '--name-only', '-z', targetCommit], {
51
- cwd: repoRoot,
52
- encoding: 'utf-8',
53
- maxBuffer: 8 * 1024 * 1024,
54
- });
55
- if (result.status !== 0 || result.error || typeof result.stdout !== 'string') {
56
- throw new Error('CONTROLLER_WORK_RECEIPT_UNBORN_CHANGED_PATHS_UNAVAILABLE');
57
- }
58
- return [...new Set(result.stdout.split('\0').filter(Boolean))].sort();
59
- }
60
-
61
-
62
- function completionReceiptChangedPaths(
63
- contract: NonNullable<ReturnType<typeof getWorkContract>>,
64
- repoRoot: string,
65
- baseRevision: string,
66
- targetRevision: string,
67
- ): string[] {
68
- const reconciled = contract.reconciliations.find((entry) =>
69
- entry.outcome === 'accepted_equivalence'
70
- && entry.reachable
71
- && entry.baseRevision === baseRevision
72
- && entry.observedTargetRevision === targetRevision);
73
- if (!reconciled) return changedPaths(repoRoot, baseRevision, targetRevision);
74
- return [...new Set(reconciled.comparedPaths.map((path) => path.trim()).filter(Boolean))].sort();
75
- }
76
-
77
- function assertWorkNotBoundElsewhere(repoRoot: string, workId: string, issueId: string, taskId: string): void {
78
- for (const issue of listIssues(repoRoot)) {
79
- for (const task of issue.tasks) {
80
- const receipt = task.verification?.completionReceipt;
81
- if (receipt?.workId !== workId) continue;
82
- if (issue.id === issueId && task.id === taskId) continue;
83
- throw new Error(`CONTROLLER_WORK_RECEIPT_ALREADY_BOUND: ${workId} -> ${issue.id}/${task.id}`);
84
- }
85
- }
86
- }
87
-
88
- function assertCurrentRequiredChecks(contract: NonNullable<ReturnType<typeof getWorkContract>>, targetRevision: string): void {
89
- for (const checkId of contract.checks) {
90
- const current = effectiveVerificationEvidence(contract.checkRefs, {
91
- sourceRevision: targetRevision,
92
- checkId,
93
- requestedChecks: contract.checks,
94
- }).some((entry) => entry.current && entry.record.outcome === 'valid_pass');
95
- if (!current) throw new Error(`CONTROLLER_WORK_RECEIPT_CHECK_EVIDENCE_STALE: ${checkId}`);
96
- }
97
- }
98
-
99
- export interface ControllerWorkTaskReceiptInput {
100
- controllerHome: string;
101
- repoId: string;
102
- repoRoot: string;
103
- issueId: string;
104
- taskId: string;
105
- workId: string;
106
- note?: string;
107
- }
108
-
109
- export interface ControllerWorkTaskReceiptResult {
110
- issue: ControllerIssue;
111
- receipt: CompletionReceipt;
112
- }
113
-
114
- const RECONCILABLE_FINALIZATION_STAGES = new Set([
115
- 'validation', 'commit', 'merge', 'branch_cleanup', 'worktree_cleanup', 'receipt',
116
- ]);
117
-
118
- export interface ControllerWorkReconciliationInput extends ControllerWorkTaskReceiptInput {
119
- method: WorkReconciliationMethod;
120
- outcome: WorkReconciliationOutcome;
121
- /** Exact bounded paths compared by the reviewer, rather than a claim of semantic equality. */
122
- comparedPaths: string[];
123
- reviewer: string;
124
- reviewedAt?: string;
125
- /** Stage facts that cannot be reconstructed from the historical Work. */
126
- unrecoverableStages: string[];
127
- /** Concrete proof that any cleanup is owned and complete, or no cleanup was owned. */
128
- cleanupOwnershipProof: string;
129
- rationale: string;
130
- }
131
-
132
- export interface ControllerWorkReconciliationResult {
133
- contractId: string;
134
- record: WorkReconciliationRecord;
135
- }
136
-
137
- function normalizedReviewedPaths(paths: string[]): string[] {
138
- const normalized = [...new Set(paths.map((path) => path.trim()))].sort();
139
- if (normalized.length === 0 || normalized.length > 50) {
140
- throw new Error('CONTROLLER_WORK_RECONCILIATION_PATHS_INVALID');
141
- }
142
- if (normalized.some((path) => !path || path.startsWith('/') || path.includes('\0') || path.split('/').some((part) => part === '' || part === '.' || part === '..'))) {
143
- throw new Error('CONTROLLER_WORK_RECONCILIATION_PATHS_INVALID');
144
- }
145
- return normalized;
146
- }
147
-
148
- function samePaths(left: string[], right: string[]): boolean {
149
- return left.length === right.length && left.every((path, index) => path === right[index]);
150
- }
151
-
152
- function globMatchesPath(pattern: string, path: string): boolean {
153
- let expression = '^';
154
- for (let index = 0; index < pattern.length; index += 1) {
155
- const character = pattern[index]!;
156
- if (character === '*') {
157
- if (pattern[index + 1] === '*') {
158
- expression += '.*';
159
- index += 1;
160
- } else {
161
- expression += '[^/]*';
162
- }
163
- } else if (character === '?') {
164
- expression += '[^/]';
165
- } else {
166
- expression += character.replace(/[|\\{}()[\]^$+?.]/g, '\\$&');
167
- }
168
- }
169
- return new RegExp(`${expression}$`).test(path);
170
- }
171
-
172
- function assertReviewedPathScope(contract: NonNullable<ReturnType<typeof getWorkContract>>, task: NonNullable<ControllerIssue['tasks'][number]>, paths: string[]): void {
173
- const forbidden = [...new Set([...contract.forbiddenPaths, ...task.forbiddenPaths])];
174
- for (const path of paths) {
175
- if (forbidden.some((pattern) => globMatchesPath(pattern, path))) {
176
- throw new Error(`CONTROLLER_WORK_RECONCILIATION_FORBIDDEN_PATH: ${path}`);
177
- }
178
- if (contract.allowedPaths.length > 0 && !contract.allowedPaths.some((pattern) => globMatchesPath(pattern, path))) {
179
- throw new Error(`CONTROLLER_WORK_RECONCILIATION_PATH_OUT_OF_SCOPE: ${path}`);
180
- }
181
- if (task.allowedPaths.length > 0 && !task.allowedPaths.some((pattern) => globMatchesPath(pattern, path))) {
182
- throw new Error(`CONTROLLER_WORK_RECONCILIATION_PATH_OUT_OF_SCOPE: ${path}`);
183
- }
184
- }
185
- }
186
-
187
- /**
188
- * Record a bounded reviewer-approved exception for manual/equivalent delivery.
189
- * This deliberately does not alter legacy Work status or accept the Task.
190
- */
191
- export function recordControllerWorkReconciliation(input: ControllerWorkReconciliationInput): ControllerWorkReconciliationResult {
192
- if (!WORK_RECONCILIATION_METHODS.includes(input.method) || !WORK_RECONCILIATION_OUTCOMES.includes(input.outcome)) {
193
- throw new Error('CONTROLLER_WORK_RECONCILIATION_KIND_INVALID');
194
- }
195
- const issue = getIssue(input.repoRoot, input.issueId);
196
- const task = issue.tasks.find((entry) => entry.id === input.taskId);
197
- if (!task?.verification || task.status !== 'verified') {
198
- throw new Error(`CONTROLLER_WORK_RECONCILIATION_TASK_NOT_VERIFIED: ${input.issueId}/${input.taskId}`);
199
- }
200
- const handle = readWorkHandle(input.controllerHome, input.repoId, input.workId);
201
- if (!handle) throw new Error(`CONTROLLER_WORK_RECONCILIATION_WORK_NOT_FOUND: ${input.workId}`);
202
- if (handle.repositoryId !== input.repoId) throw new Error(`CONTROLLER_WORK_RECONCILIATION_REPOSITORY_MISMATCH: ${input.workId}`);
203
- const contract = getWorkContract({ controllerHome: input.controllerHome, repoId: input.repoId }, handle.workContractId ?? input.workId);
204
- if (!contract || contract.repoId !== input.repoId) {
205
- throw new Error(`CONTROLLER_WORK_RECONCILIATION_CONTRACT_NOT_FOUND: ${input.workId}`);
206
- }
207
-
208
- const originalExpectedRevision = commitRevision(input.repoRoot, handle.expectedHead, 'ORIGINAL_EXPECTED_REVISION');
209
- const observedTargetRevision = commitRevision(input.repoRoot, task.verification.integratedRevision, 'OBSERVED_TARGET_REVISION');
210
- const baseRevision = commitRevision(input.repoRoot, handle.baseCommit, 'BASE_REVISION');
211
- if (originalExpectedRevision === observedTargetRevision) {
212
- throw new Error('CONTROLLER_WORK_RECONCILIATION_EXACT_REVISION_REQUIRED');
213
- }
214
- const comparedPaths = normalizedReviewedPaths(input.comparedPaths);
215
- const originalPaths = changedPaths(input.repoRoot, baseRevision, originalExpectedRevision);
216
- const observedPaths = changedPaths(input.repoRoot, baseRevision, observedTargetRevision);
217
- if (!samePaths(comparedPaths, originalPaths) || !samePaths(comparedPaths, observedPaths)) {
218
- throw new Error('CONTROLLER_WORK_RECONCILIATION_PATH_COMPARISON_MISMATCH');
219
- }
220
- assertReviewedPathScope(contract, task, comparedPaths);
221
-
222
- const reviewer = input.reviewer.trim();
223
- const rationale = input.rationale.trim();
224
- const cleanupOwnershipProof = input.cleanupOwnershipProof.trim();
225
- const reviewedAt = input.reviewedAt ?? new Date().toISOString();
226
- if (!reviewer || !rationale || !cleanupOwnershipProof || Number.isNaN(Date.parse(reviewedAt))) {
227
- throw new Error('CONTROLLER_WORK_RECONCILIATION_REVIEW_METADATA_INVALID');
228
- }
229
- const unrecoverableStages = [...new Set(input.unrecoverableStages.map((stage) => stage.trim()))].sort();
230
- if (unrecoverableStages.length === 0 || unrecoverableStages.some((stage) => !RECONCILABLE_FINALIZATION_STAGES.has(stage))) {
231
- throw new Error('CONTROLLER_WORK_RECONCILIATION_STAGES_INVALID');
232
- }
233
- const targetBranch = resolveCompletionTargetBranch(input.repoRoot);
234
- const reachableResult = spawnSync('git', ['merge-base', '--is-ancestor', observedTargetRevision, targetBranch], {
235
- cwd: input.repoRoot,
236
- encoding: 'utf-8',
237
- });
238
- const reachable = reachableResult.status === 0 && !reachableResult.error;
239
- const reconciliationId = `RECNC-${createHash('sha256').update([
240
- input.repoId, input.workId, originalExpectedRevision, observedTargetRevision, input.method,
241
- comparedPaths.join('\0'), reviewer, reviewedAt,
242
- ].join('\0')).digest('hex').slice(0, 16)}`;
243
- const record: WorkReconciliationRecord = {
244
- schemaVersion: 1,
245
- reconciliationId,
246
- originalExpectedRevision,
247
- observedTargetRevision,
248
- baseRevision,
249
- targetBranch,
250
- reachable,
251
- method: input.method,
252
- comparedPaths,
253
- reviewer: reviewer.slice(0, 200),
254
- reviewedAt,
255
- unrecoverableStages,
256
- cleanupOwnershipProof: cleanupOwnershipProof.slice(0, 2_000),
257
- rationale: rationale.slice(0, 2_000),
258
- outcome: input.outcome,
259
- };
260
- updateWorkContract({ controllerHome: input.controllerHome, repoId: input.repoId }, contract.workId, {
261
- reconciliations: [record, ...contract.reconciliations.filter((entry) => entry.reconciliationId !== reconciliationId)],
262
- });
263
- return { contractId: contract.workId, record };
264
- }
265
-
266
- /**
267
- * Produce a Task receipt only from an explicit accepted reconciliation record.
268
- * Unlike the normal path this records historical gaps instead of inventing
269
- * finalization stages, then atomically records the accepted Work completion
270
- * before projecting any legacy Task state.
271
- */
272
- export function acceptVerifiedTaskFromReviewedWorkReconciliation(input: ControllerWorkReconciliationInput): ControllerWorkTaskReceiptResult {
273
- const issue = getIssue(input.repoRoot, input.issueId);
274
- const task = issue.tasks.find((entry) => entry.id === input.taskId);
275
- if (!task) throw new Error(`task not found: ${input.issueId}/${input.taskId}`);
276
- if (task.workId && task.workId !== input.workId) throw new Error(`CONTROLLER_WORK_RECEIPT_TASK_WORK_MISMATCH: ${task.workId} != ${input.workId}`);
277
- if (task.status === 'done' && task.verification?.completionReceipt?.workId === input.workId) {
278
- return { issue, receipt: task.verification.completionReceipt };
279
- }
280
- const reconciliation = recordControllerWorkReconciliation(input);
281
- if (reconciliation.record.outcome !== 'accepted_equivalence') {
282
- throw new Error(`CONTROLLER_WORK_RECONCILIATION_NOT_ACCEPTED: ${reconciliation.record.outcome}`);
283
- }
284
- if (!reconciliation.record.reachable) {
285
- throw new Error(`CONTROLLER_WORK_RECONCILIATION_TARGET_UNREACHABLE: ${reconciliation.record.observedTargetRevision}`);
286
- }
287
- const contract = getWorkContract({ controllerHome: input.controllerHome, repoId: input.repoId }, reconciliation.contractId)!;
288
- assertCurrentRequiredChecks(contract, reconciliation.record.observedTargetRevision);
289
- assertWorkNotBoundElsewhere(input.repoRoot, input.workId, input.issueId, input.taskId);
290
-
291
- const recordedAt = new Date().toISOString();
292
- const noChange = contract.workKind === 'completed_no_change';
293
- const receipt: CompletionReceipt = {
294
- schemaVersion: 1,
295
- receiptId: `REC-work-reconciled-${createHash('sha256').update(`${input.repoId}\0${input.issueId}\0${input.taskId}\0${input.workId}\0${reconciliation.record.reconciliationId}`).digest('hex').slice(0, 16)}`,
296
- source: 'controller_work',
297
- issueId: input.issueId,
298
- taskId: input.taskId,
299
- workId: input.workId,
300
- targetBranch: reconciliation.record.targetBranch,
301
- targetRevision: reconciliation.record.observedTargetRevision,
302
- sourceRevision: reconciliation.record.originalExpectedRevision,
303
- baseRevision: reconciliation.record.baseRevision,
304
- changedPaths: noChange ? [] : reconciliation.record.comparedPaths,
305
- delivery: { kind: noChange ? 'no_change' : 'commit', status: 'integrated', strategy: noChange ? 'no_change' : 'already_integrated', reachable: true, recordedAt },
306
- cleanup: { status: 'complete', warnings: [], blockers: [], recordedAt },
307
- verifiedAt: task.verification!.verifiedAt,
308
- recordedAt,
309
- };
310
- const completionOutcome = noChange ? 'completed_no_change' : contract.workKind === 'remote_effect' ? 'completed_remote' : 'completed_changed';
311
- const recorded = completeWorkWithReceipt(
312
- { controllerHome: input.controllerHome, repoId: input.repoId },
313
- input.workId,
314
- receipt,
315
- completionOutcome,
316
- contract.workKind,
317
- );
318
- const recordedReceipt = recorded.completionReceipt;
319
- const projectedReceipt = recordedReceipt && isRepositoryCompletionReceipt(recordedReceipt) ? recordedReceipt : receipt;
320
- const projectedVerification = { ...task.verification!, completionReceipt: projectedReceipt };
321
- const accepted = task.workId
322
- ? projectTaskFromWork(input.repoRoot, input.issueId, input.taskId, recorded, {
323
- verification: projectedVerification,
324
- note: input.note ?? `Projected reviewed Work reconciliation ${reconciliation.record.reconciliationId} for ${input.workId}.`,
325
- })
326
- : (() => {
327
- recordTaskVerification(input.repoRoot, input.issueId, input.taskId, projectedVerification);
328
- return acceptVerifiedTask(
329
- input.repoRoot,
330
- input.issueId,
331
- input.taskId,
332
- input.note ?? `Accepted reviewed Work reconciliation ${reconciliation.record.reconciliationId} for ${input.workId}.`,
333
- );
334
- })();
335
- return { issue: accepted, receipt: projectedReceipt };
336
- }
337
-
338
- /**
339
- * Bind one completed controller-owned Work to one exact verified Task.
340
- * The explicit workId and integratedRevision equality prevent heuristic or
341
- * cross-Task completion. The original Task acceptance gate remains authoritative.
342
- */
343
- export function acceptVerifiedTaskFromControllerWork(input: ControllerWorkTaskReceiptInput): ControllerWorkTaskReceiptResult {
344
- const issue = getIssue(input.repoRoot, input.issueId);
345
- const task = issue.tasks.find((entry) => entry.id === input.taskId);
346
- if (!task) throw new Error(`task not found: ${input.issueId}/${input.taskId}`);
347
- if (task.workId && task.workId !== input.workId) throw new Error(`CONTROLLER_WORK_RECEIPT_TASK_WORK_MISMATCH: ${task.workId} != ${input.workId}`);
348
- if (task.status === 'done' && task.verification?.completionReceipt?.workId === input.workId) {
349
- return { issue, receipt: task.verification.completionReceipt };
350
- }
351
- if (task.status !== 'verified' || !task.verification) {
352
- throw new Error(`CONTROLLER_WORK_RECEIPT_TASK_NOT_VERIFIED: ${input.issueId}/${input.taskId}`);
353
- }
354
-
355
- const handle = readWorkHandle(input.controllerHome, input.repoId, input.workId);
356
- if (!handle) throw new Error(`CONTROLLER_WORK_RECEIPT_WORK_NOT_FOUND: ${input.workId}`);
357
- if (handle.repositoryId !== input.repoId) throw new Error(`CONTROLLER_WORK_RECEIPT_REPOSITORY_MISMATCH: ${input.workId}`);
358
- const contract = getWorkContract({ controllerHome: input.controllerHome, repoId: input.repoId }, handle.workContractId ?? input.workId);
359
- if (!contract || contract.repoId !== input.repoId) {
360
- throw new Error(`CONTROLLER_WORK_RECEIPT_CONTRACT_NOT_FOUND: ${input.workId}`);
361
- }
362
- if (contract.status === 'cancelled') throw new Error(`CONTROLLER_WORK_RECEIPT_CONTRACT_CANCELLED: ${input.workId}`);
363
- const noChange = contract.workKind === 'completed_no_change'
364
- && contract.evidenceState === 'valid';
365
- const stages = handle.finalization;
366
- const complete = noChange
367
- ? handle.state !== 'failed'
368
- && stages.validation === 'done'
369
- && stages.commit === 'skipped'
370
- && stages.merge === 'skipped'
371
- && stages.branchCleanup === 'skipped'
372
- && ['skipped', 'done'].includes(stages.worktreeCleanup)
373
- && !stages.lastError
374
- : handle.state === 'cleaned'
375
- && stages.validation === 'done'
376
- && stages.commit === 'done'
377
- && stages.merge === 'done'
378
- && stages.branchCleanup === 'done'
379
- && stages.worktreeCleanup === 'done'
380
- && !stages.lastError;
381
- if (!complete) throw new Error(`CONTROLLER_WORK_RECEIPT_FINALIZATION_INCOMPLETE: ${input.workId}`);
382
-
383
- const targetRevision = commitRevision(input.repoRoot, handle.expectedHead, 'TARGET_REVISION');
384
- const verifiedRevision = commitRevision(input.repoRoot, task.verification.integratedRevision, 'VERIFIED_REVISION');
385
- if (targetRevision !== verifiedRevision) {
386
- throw new Error(`CONTROLLER_WORK_RECEIPT_REVISION_MISMATCH: work=${targetRevision} task=${verifiedRevision}`);
387
- }
388
- if (noChange && !contract.evidenceRefs.some((entry) => entry.title === 'objective-specific no-change proof' && entry.summary?.trim())) {
389
- throw new Error(`CONTROLLER_WORK_RECEIPT_NO_CHANGE_PROOF_MISSING: ${input.workId}`);
390
- }
391
- assertCurrentRequiredChecks(contract, targetRevision);
392
- const baseRevision = commitRevision(input.repoRoot, handle.baseCommit, 'BASE_REVISION');
393
- const receiptChangedPaths = completionReceiptChangedPaths(contract, input.repoRoot, baseRevision, targetRevision);
394
- if (noChange && receiptChangedPaths.length > 0) {
395
- throw new Error(`CONTROLLER_WORK_RECEIPT_NO_CHANGE_DIRTY: ${input.workId}`);
396
- }
397
- const targetBranch = resolveCompletionTargetBranch(input.repoRoot);
398
- const reachable = spawnSync('git', ['merge-base', '--is-ancestor', targetRevision, targetBranch], {
399
- cwd: input.repoRoot,
400
- encoding: 'utf-8',
401
- });
402
- if (reachable.status !== 0 || reachable.error) {
403
- throw new Error(`CONTROLLER_WORK_RECEIPT_TARGET_UNREACHABLE: ${targetRevision} from ${targetBranch}`);
404
- }
405
- assertWorkNotBoundElsewhere(input.repoRoot, input.workId, input.issueId, input.taskId);
406
-
407
- const recordedAt = new Date().toISOString();
408
- const receipt: CompletionReceipt = {
409
- schemaVersion: 1,
410
- receiptId: `REC-work-${createHash('sha256').update(`${input.repoId}\0${input.issueId}\0${input.taskId}\0${input.workId}\0${targetRevision}`).digest('hex').slice(0, 16)}`,
411
- source: 'controller_work',
412
- issueId: input.issueId,
413
- taskId: input.taskId,
414
- workId: input.workId,
415
- targetBranch,
416
- targetRevision,
417
- sourceRevision: targetRevision,
418
- baseRevision,
419
- changedPaths: receiptChangedPaths,
420
- delivery: {
421
- kind: noChange ? 'no_change' : 'commit',
422
- status: 'integrated',
423
- strategy: noChange ? 'no_change' : 'already_integrated',
424
- reachable: true,
425
- recordedAt,
426
- },
427
- cleanup: {
428
- status: 'complete',
429
- warnings: [],
430
- blockers: [],
431
- recordedAt,
432
- },
433
- verifiedAt: task.verification.verifiedAt,
434
- recordedAt,
435
- };
436
-
437
- // Persist the Work receipt before touching the legacy Task projection. If a
438
- // historical Task write is interrupted, the Work authority is still
439
- // durable and a retry can safely rebuild the projection.
440
- const completionOutcome = noChange ? 'completed_no_change' : contract.workKind === 'remote_effect' ? 'completed_remote' : 'completed_changed';
441
- const recorded = completeWorkWithReceipt(
442
- { controllerHome: input.controllerHome, repoId: input.repoId },
443
- input.workId,
444
- receipt,
445
- completionOutcome,
446
- );
447
- const recordedReceipt = recorded.completionReceipt;
448
- const projectedReceipt = recordedReceipt && isRepositoryCompletionReceipt(recordedReceipt) ? recordedReceipt : receipt;
449
- const projectedVerification = {
450
- ...task.verification,
451
- completionReceipt: projectedReceipt,
452
- };
453
- if (task.workId) {
454
- const projected = projectTaskFromWork(input.repoRoot, input.issueId, input.taskId, recorded, {
455
- verification: projectedVerification,
456
- note: input.note ?? `Projected completed Work ${input.workId} with receipt ${receipt.receiptId}.`,
457
- });
458
- return { issue: projected, receipt: projectedReceipt };
459
- }
460
- recordTaskVerification(input.repoRoot, input.issueId, input.taskId, projectedVerification);
461
- const accepted = acceptVerifiedTask(
462
- input.repoRoot,
463
- input.issueId,
464
- input.taskId,
465
- input.note ?? `Accepted completed controller Work ${input.workId} with receipt ${receipt.receiptId}.`,
466
- );
467
- return { issue: accepted, receipt };
468
- }
@@ -1,3 +0,0 @@
1
- /** @deprecated Kernel V2 compatibility shim. ControllerRound authority is packages/kernel/controller; MCP compatibility is adapters/mcp. */
2
- export * from '../../../../packages/kernel/controller/application/controller-round-service';
3
- export * from '../../../../adapters/mcp/controller-round-compatibility';
@@ -1,142 +0,0 @@
1
- import { readControlPlaneRecord, writeControlPlaneRecord } from '../persistence/sqlite-store';
2
- import { touchSchedulerWakeSignal } from '../global-scheduler/wake-signal';
3
- import {
4
- WORK_ADMISSION_POLICY_KEY as KEY,
5
- WORK_ADMISSION_POLICY_NAMESPACE as NAMESPACE,
6
- WORK_ADMISSION_POLICY_SCOPE as SCOPE,
7
- assertWorkAdmissionPolicyAllows,
8
- normalWorkAdmissionPolicy as normalPolicy,
9
- schedulerDispatchPolicyAllowed,
10
- type WorkAdmissionPolicy,
11
- } from '../../../../packages/kernel/work/api/index';
12
- export type { WorkAdmissionPolicy } from '../../../../packages/kernel/work/api/index';
13
-
14
- export function readWorkAdmissionPolicy(controllerHome: string): WorkAdmissionPolicy {
15
- return readControlPlaneRecord<WorkAdmissionPolicy>(controllerHome, NAMESPACE, SCOPE, KEY)?.value
16
- ?? normalPolicy();
17
- }
18
-
19
- export function activateExclusiveWorkAdmission(
20
- controllerHome: string,
21
- input: { allowedWorkId: string; reason: string; now?: string },
22
- ): WorkAdmissionPolicy {
23
- const allowedWorkId = input.allowedWorkId.trim();
24
- if (!allowedWorkId) throw new Error('WORK_ADMISSION_POLICY_INVALID: allowedWorkId is required');
25
- const at = input.now ?? new Date().toISOString();
26
- const current = readControlPlaneRecord<WorkAdmissionPolicy>(controllerHome, NAMESPACE, SCOPE, KEY);
27
- const value: WorkAdmissionPolicy = {
28
- schemaVersion: 1,
29
- mode: 'exclusive_work',
30
- allowedWorkId,
31
- allowReadOnlyDiagnostics: true,
32
- reason: input.reason.slice(0, 500),
33
- activatedAt: current?.value.mode === 'exclusive_work'
34
- && current.value.allowedWorkId === allowedWorkId
35
- ? current.value.activatedAt ?? at
36
- : at,
37
- updatedAt: at,
38
- };
39
- const written = writeControlPlaneRecord(controllerHome, {
40
- namespace: NAMESPACE,
41
- scope: SCOPE,
42
- key: KEY,
43
- schemaVersion: 1,
44
- value,
45
- action: 'work_admission_exclusive',
46
- expectedRevision: current?.revision ?? null,
47
- }).value;
48
- touchSchedulerWakeSignal(controllerHome, 'work-admission-policy');
49
- return written;
50
- }
51
-
52
- export function activateConvergenceWorkAdmission(
53
- controllerHome: string,
54
- input: { reason: string; now?: string },
55
- ): WorkAdmissionPolicy {
56
- const at = input.now ?? new Date().toISOString();
57
- const current = readControlPlaneRecord<WorkAdmissionPolicy>(controllerHome, NAMESPACE, SCOPE, KEY);
58
- const value: WorkAdmissionPolicy = {
59
- schemaVersion: 1,
60
- mode: 'convergence',
61
- allowReadOnlyDiagnostics: true,
62
- reason: input.reason.slice(0, 500),
63
- activatedAt: current?.value.mode === 'convergence'
64
- ? current.value.activatedAt ?? at
65
- : at,
66
- updatedAt: at,
67
- };
68
- const written = writeControlPlaneRecord(controllerHome, {
69
- namespace: NAMESPACE,
70
- scope: SCOPE,
71
- key: KEY,
72
- schemaVersion: 1,
73
- value,
74
- action: 'work_admission_convergence',
75
- expectedRevision: current?.revision ?? null,
76
- }).value;
77
- touchSchedulerWakeSignal(controllerHome, 'work-admission-policy');
78
- return written;
79
- }
80
-
81
- export function transitionConvergenceToExclusiveWorkAdmission(
82
- controllerHome: string,
83
- input: { allowedWorkId: string; reason: string; now?: string },
84
- ): WorkAdmissionPolicy {
85
- const allowedWorkId = input.allowedWorkId.trim();
86
- if (!allowedWorkId) throw new Error('WORK_ADMISSION_POLICY_INVALID: allowedWorkId is required');
87
- const current = readControlPlaneRecord<WorkAdmissionPolicy>(controllerHome, NAMESPACE, SCOPE, KEY);
88
- if (current?.value.mode === 'exclusive_work' && current.value.allowedWorkId === allowedWorkId) {
89
- return current.value;
90
- }
91
- if (current?.value.mode !== 'convergence') {
92
- throw new Error(`WORK_ADMISSION_TRANSITION_REQUIRES_CONVERGENCE:current=${current?.value.mode ?? 'normal'}`);
93
- }
94
- const at = input.now ?? new Date().toISOString();
95
- const value: WorkAdmissionPolicy = {
96
- schemaVersion: 1,
97
- mode: 'exclusive_work',
98
- allowedWorkId,
99
- allowReadOnlyDiagnostics: true,
100
- reason: input.reason.slice(0, 500),
101
- activatedAt: at,
102
- updatedAt: at,
103
- };
104
- const written = writeControlPlaneRecord(controllerHome, {
105
- namespace: NAMESPACE,
106
- scope: SCOPE,
107
- key: KEY,
108
- schemaVersion: 1,
109
- value,
110
- action: 'work_admission_convergence_to_exclusive',
111
- expectedRevision: current.revision,
112
- }).value;
113
- touchSchedulerWakeSignal(controllerHome, 'work-admission-policy');
114
- return written;
115
- }
116
-
117
- export function restoreNormalWorkAdmission(controllerHome: string, now = new Date().toISOString()): WorkAdmissionPolicy {
118
- const current = readControlPlaneRecord<WorkAdmissionPolicy>(controllerHome, NAMESPACE, SCOPE, KEY);
119
- const value = normalPolicy(now);
120
- const written = writeControlPlaneRecord(controllerHome, {
121
- namespace: NAMESPACE,
122
- scope: SCOPE,
123
- key: KEY,
124
- schemaVersion: 1,
125
- value,
126
- action: 'work_admission_normal',
127
- expectedRevision: current?.revision ?? null,
128
- }).value;
129
- touchSchedulerWakeSignal(controllerHome, 'work-admission-policy');
130
- return written;
131
- }
132
-
133
- export function assertWorkAdmissionAllowed(
134
- controllerHome: string,
135
- input: { operation: 'create' | 'continue' | 'maintenance'; workId?: string },
136
- ): WorkAdmissionPolicy {
137
- return assertWorkAdmissionPolicyAllows(readWorkAdmissionPolicy(controllerHome), input);
138
- }
139
-
140
- export function schedulerDispatchAllowed(controllerHome: string): boolean {
141
- return schedulerDispatchPolicyAllowed(readWorkAdmissionPolicy(controllerHome));
142
- }
@@ -1,2 +0,0 @@
1
- /** @deprecated Kernel V2 compatibility shim. Canonical authority is packages/kernel/work/domain/implementation-review. */
2
- export * from '../../../../packages/kernel/work/domain/implementation-review';
@@ -1,2 +0,0 @@
1
- /** @deprecated Kernel V2 compatibility shim. Canonical authority is packages/kernel/work/domain/state-machine. */
2
- export * from '../../../../packages/kernel/work/domain/state-machine';