@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,211 +0,0 @@
1
- import { createHash } from 'crypto';
2
- import type {
3
- AutonomousGoalProgressionAction,
4
- AutonomousGoalProgressionDecision,
5
- AutonomousGoalProgressionReason,
6
- AutonomousGoalProgressionSnapshot,
7
- ProgressionControllerRoundSnapshot,
8
- ProgressionPlanStepSnapshot,
9
- ProgressionWorkSnapshot,
10
- } from '../domain/types';
11
-
12
- const EXECUTABLE_PLAN_STATUSES = new Set(['approved', 'executing', 'verifying', 'ready_to_finalize']);
13
- const ACTIVE_WORK_STATUSES = new Set(['open', 'running', 'ready']);
14
- const IN_FLIGHT_ROUND_STATUSES = new Set(['pending_release', 'dispatching', 'dispatched', 'claimed', 'waiting']);
15
-
16
- function stableSnapshot(snapshot: AutonomousGoalProgressionSnapshot): unknown {
17
- return {
18
- requirement: snapshot.requirement,
19
- plan: {
20
- planId: snapshot.plan.planId,
21
- requirementId: snapshot.plan.requirementId,
22
- sourceRevision: snapshot.plan.sourceRevision,
23
- status: snapshot.plan.status,
24
- steps: snapshot.plan.steps.map((step) => ({
25
- id: step.id,
26
- dependencies: [...step.dependencies],
27
- status: step.status,
28
- workId: step.workId,
29
- })),
30
- },
31
- currentSourceRevision: snapshot.currentSourceRevision,
32
- works: [...snapshot.works]
33
- .map((work) => ({ ...work }))
34
- .sort((left, right) => left.workId.localeCompare(right.workId)),
35
- controllerRounds: [...(snapshot.controllerRounds ?? [])]
36
- .map((round) => ({ ...round }))
37
- .sort((left, right) => left.originWorkId.localeCompare(right.originWorkId) || left.roundCount - right.roundCount),
38
- schedules: [...(snapshot.schedules ?? [])]
39
- .map((schedule) => ({ ...schedule }))
40
- .sort((left, right) => left.scheduleId.localeCompare(right.scheduleId)),
41
- };
42
- }
43
-
44
- function decision(
45
- snapshot: AutonomousGoalProgressionSnapshot,
46
- kind: AutonomousGoalProgressionAction,
47
- reasonCode: AutonomousGoalProgressionReason,
48
- detail: Pick<AutonomousGoalProgressionDecision, 'planStepId' | 'workId' | 'dependencyStepIds'> = {},
49
- ): AutonomousGoalProgressionDecision {
50
- const identityInput = JSON.stringify({
51
- snapshot: stableSnapshot(snapshot),
52
- decision: { kind, reasonCode, ...detail },
53
- });
54
- return {
55
- schemaVersion: 1,
56
- kind,
57
- reasonCode,
58
- requirementId: snapshot.requirement.requirementId,
59
- planId: snapshot.plan.planId,
60
- ...detail,
61
- idempotencyKey: `goal-progression:v1:${createHash('sha256').update(identityInput).digest('hex').slice(0, 32)}`,
62
- };
63
- }
64
-
65
- function latestRoundForWork(
66
- rounds: readonly ProgressionControllerRoundSnapshot[] | undefined,
67
- workId: string,
68
- ): ProgressionControllerRoundSnapshot | undefined {
69
- return (rounds ?? [])
70
- .filter((round) => round.originWorkId === workId)
71
- .reduce<ProgressionControllerRoundSnapshot | undefined>(
72
- (latest, round) => !latest || round.roundCount > latest.roundCount ? round : latest,
73
- undefined,
74
- );
75
- }
76
-
77
- function boundWork(
78
- snapshot: AutonomousGoalProgressionSnapshot,
79
- step: ProgressionPlanStepSnapshot,
80
- ): ProgressionWorkSnapshot | undefined {
81
- if (!step.workId) return undefined;
82
- return snapshot.works.find((work) => work.workId === step.workId);
83
- }
84
-
85
- function invalidDependency(
86
- steps: readonly ProgressionPlanStepSnapshot[],
87
- ): { stepId: string; dependencyIds: string[] } | undefined {
88
- const ids = new Set(steps.map((step) => step.id));
89
- for (const step of steps) {
90
- const missing = step.dependencies.filter((dependencyId) => dependencyId === step.id || !ids.has(dependencyId));
91
- if (missing.length > 0) return { stepId: step.id, dependencyIds: [...missing] };
92
- }
93
- return undefined;
94
- }
95
-
96
- /**
97
- * Pure Goal-level progression projection. It never writes lifecycle state and
98
- * never equates machine delivery with Controller semantic acceptance.
99
- */
100
- export function projectAutonomousGoalProgression(
101
- snapshot: AutonomousGoalProgressionSnapshot,
102
- ): AutonomousGoalProgressionDecision {
103
- const { requirement, plan } = snapshot;
104
-
105
- if (requirement.state === 'done') return decision(snapshot, 'goal_complete', 'REQUIREMENT_ALREADY_DONE');
106
- if (requirement.state === 'waiting_for_user') return decision(snapshot, 'wait_for_user', 'REQUIREMENT_WAITING_FOR_USER');
107
- if (requirement.state === 'cancelled') return decision(snapshot, 'blocked_invalid_state', 'REQUIREMENT_CANCELLED');
108
- if (plan.requirementId && plan.requirementId !== requirement.requirementId) {
109
- return decision(snapshot, 'blocked_invalid_state', 'PLAN_REQUIREMENT_MISMATCH');
110
- }
111
-
112
- // A terminal Work may legitimately advance repository source A -> B before
113
- // Controller semantic acceptance advances Plan.sourceRevision to B. Only that
114
- // exact Work completion target may cross the drift boundary. Any later C is
115
- // unrelated drift and still requires explicit re-evaluation.
116
- const validatingDelivery = plan.steps
117
- .filter((step) => step.status === 'executing' || step.status === 'validating')
118
- .map((step) => ({ step, work: boundWork(snapshot, step) }))
119
- .find(({ work }) => work?.status === 'completed'
120
- && work.baseRevision === plan.sourceRevision
121
- && work.completionTargetRevision === snapshot.currentSourceRevision);
122
- const expectedDeliveryAdvance = Boolean(validatingDelivery && plan.sourceRevision !== snapshot.currentSourceRevision);
123
- if (plan.sourceRevision !== snapshot.currentSourceRevision && !expectedDeliveryAdvance) {
124
- return decision(snapshot, 'request_replan', 'PLAN_SOURCE_DRIFT');
125
- }
126
- if (plan.status === 'replanning' || plan.status === 'invalidated_by_drift') return decision(snapshot, 'request_replan', 'PLAN_REPLAN_REQUIRED');
127
- if (plan.status === 'finalized') {
128
- if (!plan.steps.every((step) => step.status === 'completed')) {
129
- return decision(snapshot, 'blocked_invalid_state', 'PLAN_COMPLETION_STATE_CONTRADICTION');
130
- }
131
- return decision(snapshot, 'request_requirement_acceptance', 'PLAN_FINALIZED_REQUIRES_REQUIREMENT_ACCEPTANCE');
132
- }
133
- if (plan.status === 'superseded' || plan.status === 'cancelled') return decision(snapshot, 'blocked_invalid_state', 'PLAN_TERMINAL_INVALID');
134
- if (!EXECUTABLE_PLAN_STATUSES.has(plan.status)) return decision(snapshot, 'blocked_invalid_state', 'PLAN_NOT_EXECUTABLE');
135
- if (plan.steps.length === 0) return decision(snapshot, 'blocked_invalid_state', 'PLAN_EMPTY');
136
-
137
- const ids = new Set(plan.steps.map((step) => step.id));
138
- if (ids.size !== plan.steps.length) return decision(snapshot, 'blocked_invalid_state', 'PLAN_STEP_ID_DUPLICATE');
139
- const badDependency = invalidDependency(plan.steps);
140
- if (badDependency) {
141
- return decision(snapshot, 'blocked_invalid_state', 'PLAN_DEPENDENCY_INVALID', {
142
- planStepId: badDependency.stepId,
143
- dependencyStepIds: badDependency.dependencyIds,
144
- });
145
- }
146
-
147
- for (const step of plan.steps) {
148
- if (step.status !== 'executing' && step.status !== 'validating') continue;
149
- const work = boundWork(snapshot, step);
150
- if (!work) return decision(snapshot, 'blocked_invalid_state', 'PLAN_STEP_WORK_MISSING', { planStepId: step.id, workId: step.workId });
151
- if (work.planId !== plan.planId || work.planStepId !== step.id || (work.requirementId && work.requirementId !== requirement.requirementId)) {
152
- return decision(snapshot, 'blocked_invalid_state', 'WORK_IDENTITY_MISMATCH', { planStepId: step.id, workId: work.workId });
153
- }
154
- if ((work.status === 'completed' || work.status === 'failed' || work.status === 'cancelled') && step.status === 'executing') {
155
- return decision(snapshot, 'blocked_invalid_state', 'PLAN_STEP_TERMINAL_WORK_RECONCILIATION_REQUIRED', { planStepId: step.id, workId: work.workId });
156
- }
157
- if (work.status === 'failed' || work.status === 'cancelled') {
158
- return decision(snapshot, 'request_replan', 'WORK_FAILED_REPLAN', { planStepId: step.id, workId: work.workId });
159
- }
160
- if (work.status === 'blocked') return decision(snapshot, 'wait_current_work', 'WORK_BLOCKED', { planStepId: step.id, workId: work.workId });
161
- if (work.status === 'completed') {
162
- return decision(snapshot, 'request_controller_acceptance', 'MACHINE_COMPLETE_REQUIRES_CONTROLLER_ACCEPTANCE', {
163
- planStepId: step.id,
164
- workId: work.workId,
165
- });
166
- }
167
- if (ACTIVE_WORK_STATUSES.has(work.status)) {
168
- const round = latestRoundForWork(snapshot.controllerRounds, work.workId);
169
- if (round?.status === 'waiting_for_user') {
170
- return decision(snapshot, 'wait_for_user', 'CONTROLLER_ROUND_WAITING_FOR_USER', { planStepId: step.id, workId: work.workId });
171
- }
172
- if (round?.status === 'goal_complete') {
173
- return decision(snapshot, 'blocked_invalid_state', 'CONTROLLER_ROUND_TERMINAL_CONTRADICTION', { planStepId: step.id, workId: work.workId });
174
- }
175
- if (round && (IN_FLIGHT_ROUND_STATUSES.has(round.status) || round.status === 'blocked' || round.status === 'failed')) {
176
- return decision(snapshot, 'wait_current_work', 'CONTROLLER_ROUND_IN_FLIGHT', { planStepId: step.id, workId: work.workId });
177
- }
178
- return decision(snapshot, 'continue_current_work', 'WORK_READY_TO_CONTINUE', { planStepId: step.id, workId: work.workId });
179
- }
180
- }
181
-
182
- if (plan.steps.every((step) => step.status === 'completed')) {
183
- return decision(snapshot, 'blocked_invalid_state', 'PLAN_COMPLETION_STATE_CONTRADICTION');
184
- }
185
-
186
- const completedIds = new Set(plan.steps.filter((step) => step.status === 'completed').map((step) => step.id));
187
- const dependencyReady = plan.steps.filter((step) =>
188
- step.status !== 'completed'
189
- && step.dependencies.every((dependencyId) => completedIds.has(dependencyId)),
190
- );
191
- const explicitReady = dependencyReady.filter((step) => step.status === 'ready');
192
-
193
- if (explicitReady.length === 1) {
194
- return decision(snapshot, 'start_next_plan_step', 'NEXT_PLAN_STEP_READY', { planStepId: explicitReady[0].id });
195
- }
196
- if (explicitReady.length > 1) {
197
- return decision(snapshot, 'blocked_invalid_state', 'MULTIPLE_READY_PLAN_STEPS', {
198
- dependencyStepIds: explicitReady.map((step) => step.id),
199
- });
200
- }
201
- const readinessNotProjected = dependencyReady.find((step) => step.status === 'pending');
202
- if (readinessNotProjected) {
203
- return decision(snapshot, 'blocked_invalid_state', 'PLAN_STEP_READINESS_NOT_PROJECTED', { planStepId: readinessNotProjected.id });
204
- }
205
-
206
- const blocked = plan.steps.find((step) => step.status !== 'completed');
207
- return decision(snapshot, 'wait_dependency', 'PLAN_DEPENDENCY_WAIT', {
208
- planStepId: blocked?.id,
209
- dependencyStepIds: blocked?.dependencies.filter((dependencyId) => !completedIds.has(dependencyId)) ?? [],
210
- });
211
- }
@@ -1,116 +0,0 @@
1
- import type { ControllerRoundRelayStatus } from '../../controller/api/index';
2
- import type { RequirementState, PlanContractStatus, PlanStepStatus } from '../../goal/api/index';
3
- import type { RepositorySchedule } from '../../scheduler/api/index';
4
- import type { WorkContractStatus } from '../../work/api/index';
5
-
6
- /**
7
- * Read-only lifecycle facts consumed by the Goal Progression projector.
8
- * These are projections of existing authorities, never a persistence schema.
9
- */
10
- export interface ProgressionRequirementSnapshot {
11
- requirementId: string;
12
- state: RequirementState;
13
- revision: number;
14
- }
15
-
16
- export interface ProgressionPlanStepSnapshot {
17
- id: string;
18
- dependencies: readonly string[];
19
- status: PlanStepStatus;
20
- workId?: string;
21
- }
22
-
23
- export interface ProgressionPlanSnapshot {
24
- planId: string;
25
- requirementId?: string;
26
- sourceRevision: string;
27
- status: PlanContractStatus;
28
- steps: readonly ProgressionPlanStepSnapshot[];
29
- }
30
-
31
- export interface ProgressionWorkSnapshot {
32
- workId: string;
33
- requirementId?: string;
34
- planId?: string;
35
- planStepId?: string;
36
- status: WorkContractStatus;
37
- /** Exact source revision from which this Work execution started. */
38
- baseRevision?: string;
39
- /** Exact integrated target revision from the canonical Work completion receipt, when delivery changed source. */
40
- completionTargetRevision?: string;
41
- }
42
-
43
- export type ProgressionScheduleSnapshot = Pick<RepositorySchedule, 'scheduleId' | 'revision' | 'enabled' | 'nextEligibleAt' | 'pausedReason'>;
44
-
45
- export interface ProgressionControllerRoundSnapshot {
46
- originWorkId: string;
47
- status: ControllerRoundRelayStatus;
48
- roundCount: number;
49
- }
50
-
51
- export interface AutonomousGoalProgressionSnapshot {
52
- requirement: ProgressionRequirementSnapshot;
53
- plan: ProgressionPlanSnapshot;
54
- currentSourceRevision: string;
55
- works: readonly ProgressionWorkSnapshot[];
56
- controllerRounds?: readonly ProgressionControllerRoundSnapshot[];
57
- schedules?: readonly ProgressionScheduleSnapshot[];
58
- }
59
-
60
- export const AUTONOMOUS_GOAL_PROGRESSION_ACTIONS = [
61
- 'continue_current_work',
62
- 'wait_current_work',
63
- 'request_controller_acceptance',
64
- 'request_requirement_acceptance',
65
- 'start_next_plan_step',
66
- 'wait_dependency',
67
- 'request_replan',
68
- 'wait_for_user',
69
- 'goal_complete',
70
- 'blocked_invalid_state',
71
- ] as const;
72
- export type AutonomousGoalProgressionAction = (typeof AUTONOMOUS_GOAL_PROGRESSION_ACTIONS)[number];
73
-
74
- export const AUTONOMOUS_GOAL_PROGRESSION_REASONS = [
75
- 'REQUIREMENT_ALREADY_DONE',
76
- 'REQUIREMENT_WAITING_FOR_USER',
77
- 'REQUIREMENT_CANCELLED',
78
- 'PLAN_REQUIREMENT_MISMATCH',
79
- 'PLAN_SOURCE_DRIFT',
80
- 'PLAN_REPLAN_REQUIRED',
81
- 'PLAN_TERMINAL_INVALID',
82
- 'PLAN_NOT_EXECUTABLE',
83
- 'PLAN_EMPTY',
84
- 'PLAN_STEP_ID_DUPLICATE',
85
- 'PLAN_DEPENDENCY_INVALID',
86
- 'PLAN_STEP_WORK_MISSING',
87
- 'WORK_IDENTITY_MISMATCH',
88
- 'PLAN_STEP_TERMINAL_WORK_RECONCILIATION_REQUIRED',
89
- 'WORK_FAILED_REPLAN',
90
- 'WORK_BLOCKED',
91
- 'CONTROLLER_ROUND_IN_FLIGHT',
92
- 'CONTROLLER_ROUND_WAITING_FOR_USER',
93
- 'CONTROLLER_ROUND_TERMINAL_CONTRADICTION',
94
- 'WORK_READY_TO_CONTINUE',
95
- 'MACHINE_COMPLETE_REQUIRES_CONTROLLER_ACCEPTANCE',
96
- 'PLAN_FINALIZED_REQUIRES_REQUIREMENT_ACCEPTANCE',
97
- 'PLAN_COMPLETION_STATE_CONTRADICTION',
98
- 'NEXT_PLAN_STEP_READY',
99
- 'PLAN_DEPENDENCY_WAIT',
100
- 'MULTIPLE_READY_PLAN_STEPS',
101
- 'PLAN_STEP_READINESS_NOT_PROJECTED',
102
- ] as const;
103
- export type AutonomousGoalProgressionReason = (typeof AUTONOMOUS_GOAL_PROGRESSION_REASONS)[number];
104
-
105
- export interface AutonomousGoalProgressionDecision {
106
- schemaVersion: 1;
107
- kind: AutonomousGoalProgressionAction;
108
- reasonCode: AutonomousGoalProgressionReason;
109
- requirementId: string;
110
- planId: string;
111
- planStepId?: string;
112
- workId?: string;
113
- dependencyStepIds?: string[];
114
- /** Stable replay identity derived only from the immutable input snapshot + decision. */
115
- idempotencyKey: string;
116
- }
@@ -1 +0,0 @@
1
- export * from './api/index';
@@ -1,212 +0,0 @@
1
- import {
2
- beginInitialControllerRoundDispatch,
3
- bindLegacyControllerRoundOccurrence,
4
- controllerSessionPrincipalId,
5
- finishControllerRoundRelayDispatch,
6
- getControllerRoundRelay,
7
- readControllerRoundSemanticStateFingerprint,
8
- getControllerWorkBinding,
9
- getRetainedControllerSession,
10
- type ControllerHost,
11
- } from '../../controller/api/index';
12
- import { getWorkContract, isTerminalWorkContractStatus } from '../../work/api/index';
13
- import type { ScheduledControllerContinuationInput, ScheduledContinuationDispatch } from '../domain/continuation';
14
- import {
15
- getScheduledContinuationDispatch,
16
- updateScheduledContinuationDispatch,
17
- type SchedulerContinuationStoreOptions,
18
- } from '../infrastructure/continuation-dispatch-store';
19
-
20
- export interface ScheduledControllerContinuationResult {
21
- dispatch: ScheduledContinuationDispatch;
22
- reused: boolean;
23
- }
24
-
25
- /**
26
- * Canonical Scheduler continuation path:
27
- * Schedule occurrence -> exact Work -> Work-scoped durable ControllerBinding -> current Controller delivery session -> ControllerHost.resume.
28
- * The occurrence record fences external replay independently of transport/provider behavior; ControllerSession ids are observation, not semantic continuation identity.
29
- */
30
- export async function resumeScheduledControllerContinuation(
31
- options: SchedulerContinuationStoreOptions,
32
- input: ScheduledControllerContinuationInput,
33
- host: ControllerHost,
34
- ): Promise<ScheduledControllerContinuationResult> {
35
- const previous = getScheduledContinuationDispatch(options, input.occurrenceId);
36
- if (previous) {
37
- if (
38
- previous.scheduleId !== input.scheduleId
39
- || previous.workId !== input.workId
40
- || previous.controllerBindingId !== input.controllerBindingId
41
- ) throw new Error(`SCHEDULE_CONTINUATION_OCCURRENCE_IDENTITY_CONFLICT: ${input.occurrenceId}`);
42
- if (previous.status === 'dispatched' || previous.status === 'wait_for_user' || previous.status === 'semantic_wait' || previous.status === 'rejected') return { dispatch: previous, reused: true };
43
- if (previous.status === 'outcome_unknown') throw new Error(`SCHEDULE_CONTINUATION_OUTCOME_UNKNOWN: ${input.occurrenceId}`);
44
- if (previous.status === 'dispatching') throw new Error(`SCHEDULE_CONTINUATION_ALREADY_DISPATCHING: ${input.occurrenceId}`);
45
- }
46
-
47
- const work = getWorkContract(options, input.workId);
48
- if (!work) throw new Error(`WORK_NOT_FOUND: ${input.workId}`);
49
- if (isTerminalWorkContractStatus(work.status)) throw new Error(`WORK_ALREADY_TERMINAL: ${work.workId}:${work.status}`);
50
-
51
- const session = getRetainedControllerSession(options, work.workId);
52
- if (!session) throw new Error(`CONTROLLER_SESSION_NOT_RETAINED: ${work.workId}`);
53
- const bindingRecord = getControllerWorkBinding(options, work.workId);
54
- if (!bindingRecord) throw new Error(`CONTROLLER_WORK_BINDING_NOT_FOUND: ${work.workId}`);
55
- if (bindingRecord.binding.bindingId !== input.controllerBindingId) {
56
- throw new Error(`SCHEDULE_CONTINUATION_BINDING_DRIFT: ${work.workId}:expected=${input.controllerBindingId}:actual=${bindingRecord.binding.bindingId}`);
57
- }
58
- if (bindingRecord.binding.hostKind !== session.controllerType) {
59
- throw new Error(`SCHEDULE_CONTINUATION_HOST_KIND_MISMATCH: ${work.workId}`);
60
- }
61
-
62
- const requestedRelayScopeId = input.relayScopeId?.trim() || undefined;
63
- const canonicalRelayScopeId = requestedRelayScopeId
64
- ?? (work.requirementId ? `requirement:${work.requirementId}` : `goal:${work.workId}`);
65
-
66
- // A semantic `wait` is quiescent, not a request to periodically reread the same
67
- // state. Suppress unchanged schedule/manual wakes before a provider host is even
68
- // selected. A new occurrence may proceed only after Kernel semantic state changes.
69
- const waitingRelay = getControllerRoundRelay(options, work.workId);
70
- if (waitingRelay?.status === 'waiting' && waitingRelay.relayScopeId === canonicalRelayScopeId) {
71
- const currentFingerprint = readControllerRoundSemanticStateFingerprint(options, work.workId);
72
- if (currentFingerprint && currentFingerprint === waitingRelay.stateFingerprint) {
73
- const quiesced = updateScheduledContinuationDispatch(options, input.occurrenceId, 'scheduler_continuation_semantic_wait', (current, at) => current ?? ({
74
- schemaVersion: 1, repoId: options.repoId, scheduleId: input.scheduleId, occurrenceId: input.occurrenceId,
75
- workId: work.workId, controllerSessionId: session.sessionId, controllerBindingId: bindingRecord.binding.bindingId,
76
- relayScopeId: canonicalRelayScopeId, status: 'semantic_wait',
77
- reason: `Controller semantic wait remains unchanged for ${canonicalRelayScopeId}; provider dispatch suppressed.`,
78
- createdAt: at, updatedAt: at,
79
- }));
80
- return { dispatch: quiesced, reused: Boolean(previous) };
81
- }
82
- }
83
-
84
- // Reserve the exact occurrence before creating a ControllerRound. If Forge dies
85
- // after the round write but before the authority is copied back here, the next
86
- // attempt can safely adopt only the exact still-dispatching round for this
87
- // retained session/binding instead of minting or replaying another wake.
88
- let prepared = updateScheduledContinuationDispatch(options, input.occurrenceId, 'scheduler_continuation_prepare', (current, at) => current ?? ({
89
- schemaVersion: 1, repoId: options.repoId, scheduleId: input.scheduleId, occurrenceId: input.occurrenceId,
90
- workId: work.workId, controllerSessionId: session.sessionId, controllerBindingId: bindingRecord.binding.bindingId,
91
- relayScopeId: canonicalRelayScopeId, status: 'prepared', createdAt: at, updatedAt: at,
92
- }));
93
- if (prepared.status === 'dispatched' || prepared.status === 'wait_for_user' || prepared.status === 'semantic_wait' || prepared.status === 'rejected') return { dispatch: prepared, reused: true };
94
- if (prepared.status === 'outcome_unknown') throw new Error(`SCHEDULE_CONTINUATION_OUTCOME_UNKNOWN: ${input.occurrenceId}`);
95
- if (prepared.status === 'dispatching') throw new Error(`SCHEDULE_CONTINUATION_ALREADY_DISPATCHING: ${input.occurrenceId}`);
96
-
97
- const currentControllerPrincipalId = controllerSessionPrincipalId(session);
98
- const roundMatchesReservedOccurrence = (candidate: ReturnType<typeof getControllerRoundRelay>): boolean => Boolean(
99
- candidate
100
- && candidate.status === 'dispatching'
101
- && candidate.relayScopeId === prepared.relayScopeId
102
- && candidate.occurrenceId === prepared.occurrenceId
103
- && candidate.controllerId === session.controllerId
104
- && candidate.controllerType === session.controllerType
105
- && candidate.authorityId,
106
- );
107
- const bindRecoveredLegacyOccurrence = (candidate: ReturnType<typeof getControllerRoundRelay>) => {
108
- if (!candidate
109
- || candidate.status !== 'dispatching'
110
- || candidate.occurrenceId
111
- || candidate.relayScopeId !== prepared.relayScopeId
112
- || candidate.controllerId !== session.controllerId
113
- || candidate.controllerType !== session.controllerType
114
- || (candidate.principalId?.trim() || candidate.controllerId) !== currentControllerPrincipalId
115
- || !candidate.authorityId
116
- || (candidate.providerRecoveryEpoch ?? 0) < 1
117
- || !candidate.providerRecoveryEvidenceId) return candidate;
118
- return bindLegacyControllerRoundOccurrence(options, {
119
- workId: work.workId,
120
- relayScopeId: prepared.relayScopeId,
121
- occurrenceId: prepared.occurrenceId,
122
- authorityId: candidate.authorityId,
123
- expectedUpdatedAt: candidate.updatedAt,
124
- identity: { controllerId: session.controllerId, controllerType: session.controllerType, principalId: currentControllerPrincipalId },
125
- });
126
- };
127
-
128
- let relay = previous ? getControllerRoundRelay(options, work.workId) : undefined;
129
- if (relay && !roundMatchesReservedOccurrence(relay)) {
130
- relay = bindRecoveredLegacyOccurrence(relay);
131
- if (!roundMatchesReservedOccurrence(relay)) {
132
- throw new Error(`SCHEDULE_CONTINUATION_ROUND_ALREADY_OPEN: ${input.occurrenceId}:${relay?.relayScopeId ?? canonicalRelayScopeId}`);
133
- }
134
- }
135
- if (!relay) {
136
- try {
137
- relay = beginInitialControllerRoundDispatch(options, {
138
- workId: work.workId,
139
- relayScopeId: requestedRelayScopeId,
140
- requirementId: work.requirementId,
141
- bindingId: bindingRecord.binding.bindingId,
142
- occurrenceId: input.occurrenceId,
143
- identity: {
144
- controllerId: session.controllerId,
145
- controllerType: session.controllerType,
146
- principalId: controllerSessionPrincipalId(session),
147
- controllerInstanceId: session.controllerInstanceId?.trim() || session.controllerId,
148
- sessionId: session.sessionId,
149
- },
150
- });
151
- } catch (error) {
152
- if (error instanceof Error && error.message.startsWith('CONTROLLER_RELAY_ROUND_ALREADY_OPEN:')) {
153
- let existing = getControllerRoundRelay(options, work.workId);
154
- if (!roundMatchesReservedOccurrence(existing)) existing = bindRecoveredLegacyOccurrence(existing);
155
- if (roundMatchesReservedOccurrence(existing)) relay = existing;
156
- else throw new Error(`SCHEDULE_CONTINUATION_ROUND_ALREADY_OPEN: ${input.occurrenceId}:${canonicalRelayScopeId}`);
157
- } else {
158
- throw error;
159
- }
160
- }
161
- }
162
- if (!relay) throw new Error(`SCHEDULE_CONTINUATION_ROUND_MISSING: ${input.occurrenceId}`);
163
- if (relay.status === 'blocked') throw new Error(`CONTROLLER_RELAY_LAUNCH_BLOCKED: ${relay.blockedReason ?? relay.relayScopeId}`);
164
- if (!relay.authorityId) throw new Error(`CONTROLLER_ROUND_AUTHORITY_REQUIRED: ${relay.relayScopeId}`);
165
-
166
- prepared = updateScheduledContinuationDispatch(options, input.occurrenceId, 'scheduler_continuation_bind_round', (current, at) => ({
167
- ...(current ?? prepared), relayScopeId: relay.relayScopeId, controllerAuthorityId: relay.authorityId, status: 'prepared', updatedAt: at,
168
- }));
169
-
170
- updateScheduledContinuationDispatch(options, input.occurrenceId, 'scheduler_continuation_dispatch_begin', (current, at) => ({
171
- ...(current ?? prepared), status: 'dispatching', updatedAt: at,
172
- }));
173
- try {
174
- const result = await host.resume(bindingRecord.binding, {
175
- workId: work.workId,
176
- relayScopeId: relay.relayScopeId,
177
- roundNumber: relay.roundCount,
178
- authorityId: relay.authorityId,
179
- occurrenceId: input.occurrenceId,
180
- exactOriginWork: true,
181
- continuationHint: input.continuationHint?.trim() || undefined,
182
- });
183
- if (!result.accepted) {
184
- const reason = result.reason ?? 'CONTROLLER_HOST_RESUME_REJECTED';
185
- if (result.waitForUser) {
186
- finishControllerRoundRelayDispatch(options, { workId: work.workId, ok: false, waitForUser: true, handoffId: result.handoffId, error: reason });
187
- const waiting = updateScheduledContinuationDispatch(options, input.occurrenceId, 'scheduler_continuation_wait_for_user', (current, at) => ({
188
- ...(current ?? prepared), status: 'wait_for_user', reason, ...(result.handoffId ? { handoffId: result.handoffId } : {}), updatedAt: at,
189
- }));
190
- return { dispatch: waiting, reused: false };
191
- }
192
- finishControllerRoundRelayDispatch(options, { workId: work.workId, ok: false, error: reason });
193
- const rejected = updateScheduledContinuationDispatch(options, input.occurrenceId, 'scheduler_continuation_rejected', (current, at) => ({
194
- ...(current ?? prepared), status: 'rejected', reason, updatedAt: at,
195
- }));
196
- return { dispatch: rejected, reused: false };
197
- }
198
- finishControllerRoundRelayDispatch(options, { workId: work.workId, ok: true, bindingId: bindingRecord.binding.bindingId, providerDispatchReceiptId: result.dispatchId });
199
- const dispatched = updateScheduledContinuationDispatch(options, input.occurrenceId, 'scheduler_continuation_dispatched', (current, at) => ({
200
- ...(current ?? prepared), status: 'dispatched', ...(result.dispatchId ? { hostDispatchId: result.dispatchId } : {}), updatedAt: at,
201
- }));
202
- return { dispatch: dispatched, reused: false };
203
- } catch (error) {
204
- const reason = error instanceof Error ? error.message : String(error);
205
- const providerDispatchOutcomeUnknown = /CONTROLLER_HOST_PROVIDER_DISPATCH_OUTCOME_UNKNOWN|CHATGPT_AUTOMATION_SUBMISSION_OUTCOME_UNKNOWN/i.test(reason);
206
- try { finishControllerRoundRelayDispatch(options, { workId: work.workId, ok: false, error: reason, outcomeUnknown: providerDispatchOutcomeUnknown }); } catch {}
207
- updateScheduledContinuationDispatch(options, input.occurrenceId, 'scheduler_continuation_outcome_unknown', (current, at) => ({
208
- ...(current ?? prepared), status: 'outcome_unknown', reason, updatedAt: at,
209
- }));
210
- throw error;
211
- }
212
- }
@@ -1,38 +0,0 @@
1
- export type ScheduledContinuationDispatchStatus =
2
- | 'prepared'
3
- | 'dispatching'
4
- | 'dispatched'
5
- | 'wait_for_user'
6
- | 'semantic_wait'
7
- | 'rejected'
8
- | 'outcome_unknown';
9
-
10
- export interface ScheduledContinuationDispatch {
11
- schemaVersion: 1;
12
- repoId: string;
13
- scheduleId: string;
14
- occurrenceId: string;
15
- workId: string;
16
- /** Observed transport/session at initial dispatch; never part of semantic occurrence identity. */
17
- controllerSessionId: string;
18
- controllerBindingId: string;
19
- relayScopeId: string;
20
- controllerAuthorityId?: string;
21
- status: ScheduledContinuationDispatchStatus;
22
- /** Projection of ControllerRound.providerDispatchReceiptId for occurrence replay diagnostics. */
23
- hostDispatchId?: string;
24
- handoffId?: string;
25
- reason?: string;
26
- createdAt: string;
27
- updatedAt: string;
28
- }
29
-
30
- export interface ScheduledControllerContinuationInput {
31
- scheduleId: string;
32
- occurrenceId: string;
33
- workId: string;
34
- /** Observed transport/session at initial dispatch; never part of semantic occurrence identity. */
35
- controllerBindingId: string;
36
- relayScopeId?: string;
37
- continuationHint?: string;
38
- }
@@ -1,38 +0,0 @@
1
- import { withControllerLock } from '../../../../src/cli/repositories/locks';
2
- import { readControlPlaneRecord, writeControlPlaneRecord } from '../../../../src/runtime/control-plane/persistence/sqlite-store';
3
- import type { ScheduledContinuationDispatch } from '../domain/continuation';
4
-
5
- const NAMESPACE = 'scheduler_continuation_dispatch';
6
-
7
- export interface SchedulerContinuationStoreOptions {
8
- controllerHome: string;
9
- repoId: string;
10
- now?: () => string;
11
- }
12
-
13
- export function getScheduledContinuationDispatch(
14
- options: SchedulerContinuationStoreOptions,
15
- occurrenceId: string,
16
- ): ScheduledContinuationDispatch | undefined {
17
- return readControlPlaneRecord<ScheduledContinuationDispatch>(
18
- options.controllerHome, NAMESPACE, options.repoId, occurrenceId,
19
- )?.value;
20
- }
21
-
22
- export function updateScheduledContinuationDispatch(
23
- options: SchedulerContinuationStoreOptions,
24
- occurrenceId: string,
25
- actor: string,
26
- update: (current: ScheduledContinuationDispatch | undefined, now: string) => ScheduledContinuationDispatch,
27
- ): ScheduledContinuationDispatch {
28
- return withControllerLock(options.controllerHome, { scope: 'task', repoId: options.repoId, taskId: `schedule-continuation-${occurrenceId}` }, actor, () => {
29
- const current = readControlPlaneRecord<ScheduledContinuationDispatch>(options.controllerHome, NAMESPACE, options.repoId, occurrenceId);
30
- const at = options.now?.() ?? new Date().toISOString();
31
- const value = update(current?.value, at);
32
- writeControlPlaneRecord(options.controllerHome, {
33
- namespace: NAMESPACE, scope: options.repoId, key: occurrenceId, schemaVersion: 1, value,
34
- action: actor, expectedRevision: current?.revision ?? null,
35
- });
36
- return value;
37
- });
38
- }
@@ -1,34 +0,0 @@
1
- export interface WorkAdmissionPolicy {
2
- schemaVersion: 1;
3
- mode: 'normal' | 'exclusive_work' | 'convergence';
4
- allowedWorkId?: string;
5
- allowReadOnlyDiagnostics: true;
6
- reason?: string;
7
- activatedAt?: string;
8
- updatedAt: string;
9
- }
10
-
11
- export const WORK_ADMISSION_POLICY_NAMESPACE = 'runtime_policy';
12
- export const WORK_ADMISSION_POLICY_SCOPE = 'global';
13
- export const WORK_ADMISSION_POLICY_KEY = 'work_admission';
14
-
15
- export function normalWorkAdmissionPolicy(now = new Date().toISOString()): WorkAdmissionPolicy {
16
- return { schemaVersion: 1, mode: 'normal', allowReadOnlyDiagnostics: true, updatedAt: now };
17
- }
18
-
19
- export function assertWorkAdmissionPolicyAllows(
20
- policy: WorkAdmissionPolicy,
21
- input: { operation: 'create' | 'continue' | 'maintenance'; workId?: string },
22
- ): WorkAdmissionPolicy {
23
- if (policy.mode === 'normal' || input.operation === 'maintenance') return policy;
24
- if (policy.mode === 'convergence') {
25
- if (input.operation !== 'create') return policy;
26
- throw new Error('WORK_ADMISSION_BLOCKED:CONVERGENCE:operation=create');
27
- }
28
- if (input.workId?.trim() === policy.allowedWorkId) return policy;
29
- throw new Error(`WORK_ADMISSION_BLOCKED:P0_EXCLUSIVE_WORK:operation=${input.operation}:allowed=${policy.allowedWorkId ?? 'none'}`);
30
- }
31
-
32
- export function schedulerDispatchPolicyAllowed(policy: WorkAdmissionPolicy): boolean {
33
- return policy.mode !== 'exclusive_work';
34
- }