@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
@@ -0,0 +1,263 @@
1
+ import { createHash, randomUUID } from 'crypto';
2
+ import type { CallToolResult } from '../../../packages/protocols/mcp/tool-contract';
3
+ import {
4
+ createWorkSemanticContext,
5
+ getWorkContract,
6
+ listWorkSemanticRevisionRecords,
7
+ readWorkContractStore,
8
+ normalizeWorkObjectiveRelationIds,
9
+ projectWorkObjectiveGraph,
10
+ reviseWorkSemanticContext,
11
+ workSemanticView,
12
+ semanticWorkState,
13
+ type WorkContractStoreOptions,
14
+ } from '../../../packages/kernel/work/api/index';
15
+ import { buildFacadeResult } from '../../../src/runtime/control-plane/facade';
16
+ import { getPlanContract, currentPlanSemanticRevision, getPlanSemanticRevisionRecord, planSemanticView } from '../../../src/runtime/control-plane/facade/plan-contract-store';
17
+ import { readRequirement, currentRequirementSemanticRevision, getRequirementRevisionRecord, requirementSemanticView } from '../../../src/runtime/control-plane/persistence/requirement-store';
18
+ import { buildWorkContinuationSnapshot } from '../../../src/runtime/control-plane/facade/work-continuation';
19
+ import { result } from './result-adapter';
20
+ import { projectWorkExecutionEvidence } from './work-detail-projection';
21
+ import { readWorkHandle } from '../../../src/runtime/control-plane/execution/work-handle-store';
22
+ import { reconcileSingleTerminalWorkCleanup } from '../../../src/runtime/control-plane/execution/work-terminal-cleanup';
23
+
24
+ const RH_WORK_SEMANTIC_OPERATIONS = new Set(['start', 'get', 'revise', 'complete']);
25
+
26
+ /** Resolve semantic version references against existing canonical heads/history. */
27
+ function workBasis(store: WorkContractStoreOptions, x: { requirementId?: string; requirementRevision?: number; planId?: string; planRevision?: number }) {
28
+ const plan = x.planId ? getPlanContract(store, x.planId) : undefined;
29
+ if (x.planId && !plan) throw new Error(`WORK_PLAN_NOT_FOUND: ${x.planId}`);
30
+ if (x.requirementId && plan?.requirementId && x.requirementId !== plan.requirementId) {
31
+ throw new Error(`WORK_PLAN_REQUIREMENT_MISMATCH: ${x.planId} belongs to ${plan.requirementId}, not ${x.requirementId}`);
32
+ }
33
+ const requirementId = x.requirementId || plan?.requirementId;
34
+ if (x.requirementRevision !== undefined && !requirementId) throw new Error('WORK_REQUIREMENT_ID_REQUIRED_FOR_REVISION');
35
+ if (x.planRevision !== undefined && !x.planId) throw new Error('WORK_PLAN_ID_REQUIRED_FOR_REVISION');
36
+ if (requirementId && !store.controllerHome) throw new Error('WORK_REQUIREMENT_STORE_UNAVAILABLE');
37
+ const requirement = requirementId ? readRequirement({ controllerHome: store.controllerHome! }, requirementId)?.value : undefined;
38
+ if (requirementId && !requirement) throw new Error(`WORK_REQUIREMENT_NOT_FOUND: ${requirementId}`);
39
+ for (const [kind, revision] of [['REQUIREMENT', x.requirementRevision], ['PLAN', x.planRevision]] as const) {
40
+ if (revision !== undefined && (!Number.isInteger(revision) || revision < 1)) throw new Error(`WORK_${kind}_REVISION_INVALID`);
41
+ }
42
+ const requirementRevision = requirement ? x.requirementRevision ?? currentRequirementSemanticRevision(requirement) : undefined;
43
+ const planRevision = plan ? x.planRevision ?? currentPlanSemanticRevision(plan) : undefined;
44
+ if (requirement && requirementRevision !== currentRequirementSemanticRevision(requirement)
45
+ && !getRequirementRevisionRecord({ controllerHome: store.controllerHome! }, requirementId!, requirementRevision!)) {
46
+ throw new Error(`WORK_REQUIREMENT_REVISION_NOT_FOUND: ${requirementId}:r${requirementRevision}`);
47
+ }
48
+ if (plan && planRevision !== currentPlanSemanticRevision(plan)
49
+ && !getPlanSemanticRevisionRecord(store, x.planId!, planRevision!)) {
50
+ throw new Error(`WORK_PLAN_REVISION_NOT_FOUND: ${x.planId}:r${planRevision}`);
51
+ }
52
+ return { requirementId, requirementRevision, planId: x.planId, planRevision };
53
+ }
54
+
55
+ /** On-demand projection for manual and automated continuation; never adopts a head. */
56
+ function versionBinding(store: WorkContractStoreOptions, work: NonNullable<ReturnType<typeof getWorkContract>>, detail: boolean) {
57
+ const req = work.requirementId && store.controllerHome
58
+ ? readRequirement({ controllerHome: store.controllerHome }, work.requirementId)?.value : undefined;
59
+ const plan = work.planId ? getPlanContract(store, work.planId) : undefined;
60
+ const reqHead = req ? requirementSemanticView(req) : undefined;
61
+ const planHead = plan ? planSemanticView(plan) : undefined;
62
+ const reqAdopted = detail && reqHead && work.requirementRevision !== reqHead.revision
63
+ ? getRequirementRevisionRecord({ controllerHome: store.controllerHome! }, work.requirementId!, work.requirementRevision!) : undefined;
64
+ const planAdopted = detail && planHead && work.planRevision !== planHead.revision
65
+ ? getPlanSemanticRevisionRecord(store, work.planId!, work.planRevision!) : undefined;
66
+ return {
67
+ ...(work.requirementId ? { requirement: {
68
+ id: work.requirementId, adoptedRevision: work.requirementRevision, currentRevision: reqHead?.revision,
69
+ updateAvailable: Boolean(reqHead && work.requirementRevision !== reqHead.revision),
70
+ ...(detail ? { current: reqHead, adopted: reqAdopted ?? (work.requirementRevision === reqHead?.revision ? reqHead : undefined) } : {}),
71
+ } } : {}),
72
+ ...(work.planId ? { plan: {
73
+ id: work.planId, adoptedRevision: work.planRevision, currentRevision: planHead?.revision,
74
+ updateAvailable: Boolean(planHead && work.planRevision !== planHead.revision),
75
+ ...(detail ? { current: planHead, adopted: planAdopted ?? (work.planRevision === planHead?.revision ? planHead : undefined) } : {}),
76
+ } } : {}),
77
+ };
78
+ }
79
+
80
+
81
+ export function semanticWorkId(store: WorkContractStoreOptions, args: Record<string, unknown>): string {
82
+ const explicit = typeof args.work_id === 'string' ? args.work_id.trim() : '';
83
+ if (explicit) return explicit;
84
+ const requestId = typeof args.request_id === 'string' ? args.request_id.trim() : '';
85
+ if (requestId) {
86
+ const scopeKey = store.scopeKey?.trim() || store.repoId?.trim() || 'semantic';
87
+ const digest = createHash('sha256').update(`${scopeKey}\0${requestId}`).digest('hex').slice(0, 12);
88
+ return `work-semantic-${digest}`;
89
+ }
90
+ return `work-semantic-${randomUUID().slice(0, 12)}`;
91
+ }
92
+
93
+ function semanticCreateMatches(existing: ReturnType<typeof getWorkContract>, args: Record<string, unknown>, requestId: string): boolean {
94
+ if (!existing) return false;
95
+ const objective = String(args.objective ?? '').trim();
96
+ const requirementId = typeof args.requirement_id === 'string' ? args.requirement_id.trim() : '';
97
+ const planId = typeof args.plan_id === 'string' ? args.plan_id.trim() : '';
98
+ const semanticParentWorkId = typeof args.semantic_parent_work_id === 'string' ? args.semantic_parent_work_id.trim() : '';
99
+ const dependsOnWorkIds = normalizeWorkObjectiveRelationIds(Array.isArray(args.depends_on_work_ids) ? args.depends_on_work_ids.map(String) : []).sort();
100
+ const existingDependencies = normalizeWorkObjectiveRelationIds(existing.dependsOnWorkIds).sort();
101
+ return existing.objective === objective
102
+ && (planId && !requirementId ? true : (existing.requirementId ?? '') === requirementId)
103
+ && (args.requirement_revision === undefined || existing.requirementRevision === args.requirement_revision)
104
+ && (args.plan_revision === undefined || existing.planRevision === args.plan_revision)
105
+ && (existing.planId ?? '') === planId
106
+ && (existing.semanticParentWorkId ?? '') === semanticParentWorkId
107
+ && existingDependencies.length === dependsOnWorkIds.length
108
+ && existingDependencies.every((id, index) => id === dependsOnWorkIds[index])
109
+ && (existing.requestId ?? '') === requestId;
110
+ }
111
+
112
+ export async function callRhWorkSemanticOperation(
113
+ store: WorkContractStoreOptions,
114
+ operation: string,
115
+ args: Record<string, unknown>,
116
+ ): Promise<CallToolResult | undefined> {
117
+ if (!RH_WORK_SEMANTIC_OPERATIONS.has(operation)) return undefined;
118
+ const workId = operation === 'start' ? semanticWorkId(store, args) : String(args.work_id ?? '').trim();
119
+ if (operation === 'start') {
120
+ const objective = String(args.objective ?? '').trim();
121
+ if (!objective) return result(buildFacadeResult({
122
+ status: 'blocked', summary: 'WORK_OBJECTIVE_REQUIRED', data: { workId },
123
+ }) as unknown as Record<string, unknown>, true);
124
+ const requestId = typeof args.request_id === 'string' ? args.request_id.trim() : '';
125
+ const existing = getWorkContract(store, workId);
126
+ if (existing) {
127
+ if (!semanticCreateMatches(existing, args, requestId)) return result(buildFacadeResult({
128
+ status: 'blocked',
129
+ summary: `WORK_SEMANTIC_CREATE_CONFLICT: ${workId}`,
130
+ data: { workId, currentWork: workSemanticView(existing) },
131
+ }) as unknown as Record<string, unknown>, true);
132
+ return result(buildFacadeResult({
133
+ summary: `Work ${workId} already exists; semantic create was deduplicated.`,
134
+ data: { work: workSemanticView(existing), deduplicated: true },
135
+ }) as unknown as Record<string, unknown>);
136
+ }
137
+ try {
138
+ const basis = workBasis(store, {
139
+ requirementId: typeof args.requirement_id === 'string' ? args.requirement_id.trim() || undefined : undefined,
140
+ requirementRevision: typeof args.requirement_revision === 'number' ? args.requirement_revision : undefined,
141
+ planId: typeof args.plan_id === 'string' ? args.plan_id.trim() || undefined : undefined,
142
+ planRevision: typeof args.plan_revision === 'number' ? args.plan_revision : undefined,
143
+ });
144
+ const created = createWorkSemanticContext(store, {
145
+ workId,
146
+ objective,
147
+ requestedBy: 'chatgpt',
148
+ ...basis,
149
+ ...(typeof args.semantic_parent_work_id === 'string' ? { semanticParentWorkId: args.semantic_parent_work_id } : {}),
150
+ ...(Array.isArray(args.depends_on_work_ids) ? { dependsOnWorkIds: args.depends_on_work_ids.map(String) } : {}),
151
+ ...(requestId ? { requestId } : {}),
152
+ });
153
+ return result(buildFacadeResult({
154
+ summary: `Work ${workId} created as semantic context.`,
155
+ data: { work: workSemanticView(created), deduplicated: false },
156
+ }) as unknown as Record<string, unknown>);
157
+ } catch (error) {
158
+ const raced = getWorkContract(store, workId);
159
+ if (raced && semanticCreateMatches(raced, args, requestId)) return result(buildFacadeResult({
160
+ summary: `Work ${workId} already exists; semantic create was deduplicated.`,
161
+ data: { work: workSemanticView(raced), deduplicated: true },
162
+ }) as unknown as Record<string, unknown>);
163
+ return result(buildFacadeResult({
164
+ status: 'blocked',
165
+ summary: error instanceof Error ? error.message : String(error),
166
+ data: { workId },
167
+ }) as unknown as Record<string, unknown>, true);
168
+ }
169
+ }
170
+ if (operation === 'get') {
171
+ const work = workId ? getWorkContract(store, workId) : undefined;
172
+ if (!work) return result(buildFacadeResult({
173
+ status: 'not_found', summary: `Work ${workId || '(missing)'} not found.`, data: { workId },
174
+ }) as unknown as Record<string, unknown>, true);
175
+ const semantic = workSemanticView(work);
176
+ const detail = args.detail_level === 'detail';
177
+ const revisionHistory = detail ? listWorkSemanticRevisionRecords(store, semantic.workId, 100) : [];
178
+ const objectiveGraph = detail ? projectWorkObjectiveGraph(
179
+ readWorkContractStore(store).contracts.map(workSemanticView),
180
+ listWorkSemanticRevisionRecords(store, undefined, 200),
181
+ semantic.workId,
182
+ ) : undefined;
183
+ return result(buildFacadeResult({
184
+ summary: `Work ${semantic.workId} retrieved at semantic revision ${semantic.revision}.`,
185
+ data: {
186
+ work: semantic,
187
+ versionBinding: versionBinding(store, work, detail),
188
+ ...(detail ? {
189
+ revisionHistory,
190
+ objectiveGraph,
191
+ executionEvidence: projectWorkExecutionEvidence(work),
192
+ continuation: buildWorkContinuationSnapshot(work),
193
+ } : {}),
194
+ },
195
+ detailLevel: args.detail_level === 'detail' ? 'detail' : 'summary',
196
+ }) as unknown as Record<string, unknown>);
197
+ }
198
+
199
+ const expectedRevision = Number(args.expected_revision);
200
+ const targetState = operation === 'complete'
201
+ ? 'completed'
202
+ : (args.work_state === 'open' || args.work_state === 'completed' || args.work_state === 'cancelled' ? args.work_state : undefined);
203
+ try {
204
+ const current = getWorkContract(store, workId);
205
+ const choosingVersion = typeof args.requirement_revision === 'number' || typeof args.plan_revision === 'number';
206
+ if (choosingVersion && !current) throw new Error(`WORK_NOT_FOUND: ${workId}`);
207
+ if (choosingVersion && current && semanticWorkState(current) !== 'open') throw new Error(`WORK_TERMINAL_BASIS_IMMUTABLE: ${workId}`);
208
+ const basis = choosingVersion ? workBasis(store, {
209
+ requirementId: current?.requirementId,
210
+ requirementRevision: typeof args.requirement_revision === 'number' ? args.requirement_revision : undefined,
211
+ planId: current?.planId,
212
+ planRevision: typeof args.plan_revision === 'number' ? args.plan_revision : undefined,
213
+ }) : undefined;
214
+ const revised = reviseWorkSemanticContext(store, workId, {
215
+ expectedRevision,
216
+ ...(typeof args.objective === 'string' ? { objective: args.objective } : {}),
217
+ ...(targetState ? { state: targetState } : {}),
218
+ ...(typeof args.requirement_revision === 'number' ? { requirementRevision: basis?.requirementRevision } : {}),
219
+ ...(typeof args.plan_revision === 'number' ? { planRevision: basis?.planRevision } : {}),
220
+ ...(operation === 'revise' && typeof args.semantic_parent_work_id === 'string' ? { semanticParentWorkId: args.semantic_parent_work_id } : {}),
221
+ ...(operation === 'revise' && Array.isArray(args.depends_on_work_ids) ? { dependsOnWorkIds: args.depends_on_work_ids.map(String) } : {}),
222
+ ...(Array.isArray(args.work_result_refs) ? { resultRefs: args.work_result_refs.map(String) } : {}),
223
+ });
224
+ const semantic = workSemanticView(revised);
225
+ let resourceReconciliation: Awaited<ReturnType<typeof reconcileSingleTerminalWorkCleanup>> | undefined;
226
+ if (
227
+ operation === 'complete'
228
+ && store.controllerHome
229
+ && revised.repoId?.trim()
230
+ && readWorkHandle(store.controllerHome, revised.repoId, revised.workId)
231
+ ) {
232
+ try {
233
+ resourceReconciliation = await reconcileSingleTerminalWorkCleanup(
234
+ store.controllerHome,
235
+ revised.repoId,
236
+ revised.workId,
237
+ );
238
+ } catch (error) {
239
+ resourceReconciliation = {
240
+ status: 'blocked',
241
+ workId: revised.workId,
242
+ reason: error instanceof Error ? error.message : String(error),
243
+ };
244
+ }
245
+ }
246
+ return result(buildFacadeResult({
247
+ summary: `Work ${semantic.workId} revised atomically to semantic revision ${semantic.revision}.`,
248
+ data: {
249
+ work: semantic,
250
+ expectedRevision,
251
+ semanticRevision: semantic.revision,
252
+ versionBinding: versionBinding(store, revised, false),
253
+ ...(resourceReconciliation ? { resourceReconciliation } : {}),
254
+ },
255
+ }) as unknown as Record<string, unknown>);
256
+ } catch (error) {
257
+ const current = workId ? getWorkContract(store, workId) : undefined;
258
+ return result(buildFacadeResult({
259
+ status: 'blocked', summary: error instanceof Error ? error.message : String(error),
260
+ data: { workId, expectedRevision, ...(current ? { currentWork: workSemanticView(current) } : {}) },
261
+ }) as unknown as Record<string, unknown>, true);
262
+ }
263
+ }
@@ -0,0 +1,113 @@
1
+ import type { CallToolResult } from '../../../packages/protocols/mcp/tool-contract';
2
+ import type { WorkflowJsonValue } from '../../../packages/workflow-runtime/api/index';
3
+ import { getWorkContract } from '../../../packages/kernel/work/api/index';
4
+ import { selectRepositoryCheckout } from '../../../src/cli/repositories/registry';
5
+ import { executionIdentityForRepository } from '../../../src/runtime/control-plane/execution/execution-identity';
6
+ import { readWorkflowRun } from '../../../src/runtime/control-plane/persistence/workflow-run-store';
7
+ import { schedulePublicationOutcomeCollection } from '../../../src/runtime/root/assistant-learning-loop';
8
+ import { ensureXiaohongshuWorkflowInstalled, XIAOHONGSHU_WORKFLOW_IDS } from '../../../src/runtime/workflows/first-party/xiaohongshu';
9
+ import { executeRegisteredWorkflow, observeAndReconcileRegisteredWorkflow } from '../../../src/runtime/workflows/runtime';
10
+ import { buildFacadeResult } from '../../../src/runtime/control-plane/facade';
11
+ import type { MultiRepositoryMcpToolContext } from '../multi-repository';
12
+ import { result } from './result-adapter';
13
+
14
+ type RepositorySelection = Parameters<typeof selectRepositoryCheckout>[0];
15
+
16
+ /**
17
+ * Dedicated rh_work Workflow domain dispatch. Workflow execution is fenced by
18
+ * its typed Work/target/effect identities rather than Work-wide Controller ownership;
19
+ * this adapter does not own Work lifecycle transitions or semantic completion.
20
+ */
21
+ export async function callRhWorkWorkflowOperation(
22
+ ctx: MultiRepositoryMcpToolContext,
23
+ repository: RepositorySelection,
24
+ operation: string,
25
+ args: Record<string, unknown>,
26
+ ): Promise<CallToolResult | undefined> {
27
+ if (operation !== 'workflow_execute' && operation !== 'workflow_reconcile') return undefined;
28
+ const store = { controllerHome: ctx.controllerHome, repoId: repository.repoId };
29
+ try {
30
+ const workId = String(args.work_id ?? '').trim();
31
+ const workflowId = String(args.workflow_id ?? '').trim();
32
+ const runId = String(args.workflow_run_id ?? '').trim();
33
+ if (!workId || !workflowId || !runId) throw new Error('WORKFLOW_FACADE_IDENTITY_REQUIRED');
34
+ const work = getWorkContract(store, workId);
35
+ if (!work) throw new Error(`WORK_NOT_FOUND: ${workId}`);
36
+
37
+ const workRepository = selectRepositoryCheckout(repository, work.checkoutId);
38
+ const executionIdentity = executionIdentityForRepository(workRepository, { workId });
39
+ if (Object.values(XIAOHONGSHU_WORKFLOW_IDS).includes(workflowId as never)) {
40
+ ensureXiaohongshuWorkflowInstalled(ctx.controllerHome, workflowId);
41
+ }
42
+ const projectId = typeof args.workflow_scope_project_id === 'string' ? args.workflow_scope_project_id.trim() : '';
43
+ const registryScope = projectId ? { kind: 'project' as const, projectId } : { kind: 'controller' as const };
44
+ const workflowInputs = args.workflow_inputs && typeof args.workflow_inputs === 'object' && !Array.isArray(args.workflow_inputs)
45
+ ? args.workflow_inputs as Record<string, WorkflowJsonValue>
46
+ : {};
47
+ const base = {
48
+ controllerHome: ctx.controllerHome,
49
+ repository: workRepository,
50
+ executionIdentity,
51
+ workId,
52
+ runId,
53
+ registryScope,
54
+ workflowId,
55
+ inputs: workflowInputs,
56
+ timeoutMs: typeof args.timeout_ms === 'number' ? args.timeout_ms : undefined,
57
+ };
58
+ const learningMetadata = (workflow: Awaited<ReturnType<typeof executeRegisteredWorkflow>>) => {
59
+ const persisted = readWorkflowRun(ctx.controllerHome, workId, runId)?.value;
60
+ let outcomeCollectionSchedule;
61
+ let outcomeCollectionError: string | undefined;
62
+ if (workflow.status === 'succeeded' && workflow.publicationReceipt) {
63
+ try {
64
+ outcomeCollectionSchedule = schedulePublicationOutcomeCollection({
65
+ controllerHome: ctx.controllerHome,
66
+ repoId: repository.repoId,
67
+ workId,
68
+ publication: workflow.publicationReceipt,
69
+ workflowInputs,
70
+ });
71
+ } catch (error) {
72
+ outcomeCollectionError = error instanceof Error ? error.message : 'OUTCOME_COLLECTION_SCHEDULE_FAILED';
73
+ }
74
+ }
75
+ return {
76
+ ...(persisted?.evidenceRef ? { workflowEvidenceRef: persisted.evidenceRef } : {}),
77
+ ...(outcomeCollectionSchedule ? { outcomeCollectionSchedule } : {}),
78
+ ...(outcomeCollectionError ? { outcomeCollectionError } : {}),
79
+ };
80
+ };
81
+
82
+ if (operation === 'workflow_reconcile') {
83
+ const reconciliationRequestId = String(args.workflow_reconciliation_request_id ?? '').trim();
84
+ if (!reconciliationRequestId) throw new Error('WORKFLOW_RECONCILIATION_REQUEST_ID_REQUIRED');
85
+ const reconciled = await observeAndReconcileRegisteredWorkflow({ ...base, reconciliationRequestId });
86
+ if (reconciled.status === 'running') {
87
+ const resumed = await executeRegisteredWorkflow(base);
88
+ return result(buildFacadeResult({
89
+ summary: `Workflow ${workflowId}/${runId} reconciled from canonical observation and resumed without replaying the uncertain effect.`,
90
+ data: { workflow: resumed, ...learningMetadata(resumed) },
91
+ }) as unknown as Record<string, unknown>);
92
+ }
93
+ return result(buildFacadeResult({
94
+ status: reconciled.status === 'failed' ? 'blocked' : 'ok',
95
+ summary: `Workflow ${workflowId}/${runId} reconciliation settled as ${reconciled.status}.`,
96
+ data: { workflow: reconciled },
97
+ }) as unknown as Record<string, unknown>, reconciled.status === 'failed');
98
+ }
99
+
100
+ const executed = await executeRegisteredWorkflow(base);
101
+ return result(buildFacadeResult({
102
+ status: executed.status === 'failed' || executed.status === 'reconcile_required' ? 'blocked' : 'ok',
103
+ summary: `Workflow ${workflowId}/${runId} is ${executed.status}.`,
104
+ data: { workflow: executed, ...learningMetadata(executed) },
105
+ }) as unknown as Record<string, unknown>, executed.status === 'failed' || executed.status === 'reconcile_required');
106
+ } catch (error) {
107
+ return result(buildFacadeResult({
108
+ status: 'blocked',
109
+ summary: error instanceof Error ? error.message : 'Workflow execution failed.',
110
+ data: { workflowExecuted: false },
111
+ }) as unknown as Record<string, unknown>, true);
112
+ }
113
+ }
@@ -0,0 +1,156 @@
1
+ import { createHash } from 'node:crypto';
2
+ import type { CallToolResult } from '../../../packages/protocols/mcp/tool-contract';
3
+ import {
4
+ getWorkflowSupervisorContinuationProof,
5
+ getWorkflowSupervisorTask,
6
+ getWorkflowSupervisorTaskStall,
7
+ listWorkflowSupervisorTasks,
8
+ migrateWorkflowSupervisorConversation,
9
+ recoverWorkflowSupervisorTask,
10
+ registerWorkflowSupervisorTask,
11
+ reviseWorkflowSupervisorTaskObjective,
12
+ reserveWorkflowSupervisorEnrollment,
13
+ stopWorkflowSupervisorTask,
14
+ } from '../../../supervisor/client';
15
+ import { resolveWorkflowSupervisorForgeHome } from '../../../supervisor/paths';
16
+ import type { MultiRepositoryMcpToolContext } from '../multi-repository';
17
+ import { result } from './result-adapter';
18
+
19
+ function textArg(args: Record<string, unknown>, key: string): string {
20
+ return typeof args[key] === 'string' ? String(args[key]).trim() : '';
21
+ }
22
+
23
+ function standaloneTaskId(repoId: string | undefined, requestId: string): string {
24
+ const digest = createHash('sha256').update(`${repoId ?? 'global'}\0${requestId}`).digest('hex').slice(0, 24);
25
+ return `supervisor:${digest}`;
26
+ }
27
+
28
+ export async function callWorkflowSupervisorAdapter(
29
+ ctx: MultiRepositoryMcpToolContext,
30
+ name: string,
31
+ args: Record<string, unknown>,
32
+ ): Promise<CallToolResult | undefined> {
33
+ if (name !== 'supervisor_task') return undefined;
34
+ const operation = textArg(args, 'operation');
35
+ const forgeHome = resolveWorkflowSupervisorForgeHome(ctx.controllerHome);
36
+ const repoId = textArg(args, 'repo_id') || ctx.explicitRepository?.repoId || ctx.repoId || undefined;
37
+
38
+ if (operation === 'start') {
39
+ const objective = textArg(args, 'objective');
40
+ const requestId = textArg(args, 'request_id');
41
+ if (!objective) throw new Error('WORKFLOW_SUPERVISOR_OBJECTIVE_REQUIRED');
42
+ if (!requestId) throw new Error('WORKFLOW_SUPERVISOR_REQUEST_ID_REQUIRED');
43
+ const id = standaloneTaskId(repoId, requestId);
44
+ const task = await registerWorkflowSupervisorTask(forgeHome, {
45
+ taskId: id,
46
+ conversationId: `bootstrap:${id}`,
47
+ conversationUrl: 'https://chatgpt.com/',
48
+ objective,
49
+ completionContract: {
50
+ kind: 'model_semantic_completion',
51
+ ...(repoId ? { repo_id: repoId, controller_home: ctx.controllerHome } : {}),
52
+ },
53
+ continuationPolicy: { kind: 'standalone_supervisor', bootstrap: true, ...(repoId ? { repo_id: repoId } : {}) },
54
+ userBlockerPolicy: { kind: 'model_semantic_user_blocker' },
55
+ });
56
+ const effect = await reserveWorkflowSupervisorEnrollment(forgeHome, task.taskId);
57
+ return result({ task, effect, summary: `Standalone Supervisor task ${task.taskId} started.` });
58
+ }
59
+
60
+ if (operation === 'list') {
61
+ const activeOnly = args.active_only !== false;
62
+ const tasks = await listWorkflowSupervisorTasks(forgeHome, activeOnly);
63
+ return result({ tasks, count: tasks.length, activeOnly, summary: `${tasks.length} Supervisor task(s) listed.` });
64
+ }
65
+
66
+ if (operation === 'revise') {
67
+ const id = textArg(args, 'task_id');
68
+ const objective = textArg(args, 'objective');
69
+ const expectedObjectiveSha256 = textArg(args, 'expected_objective_sha256');
70
+ const requestId = textArg(args, 'request_id');
71
+ if (!id) throw new Error('WORKFLOW_SUPERVISOR_TASK_ID_REQUIRED');
72
+ if (!objective) throw new Error('WORKFLOW_SUPERVISOR_OBJECTIVE_REQUIRED');
73
+ if (!expectedObjectiveSha256) throw new Error('WORKFLOW_SUPERVISOR_OBJECTIVE_REVISION_EXPECTED_SHA_REQUIRED');
74
+ if (!requestId) throw new Error('WORKFLOW_SUPERVISOR_REQUEST_ID_REQUIRED');
75
+ const revised = await reviseWorkflowSupervisorTaskObjective(forgeHome, {
76
+ taskId: id,
77
+ objective,
78
+ expectedObjectiveSha256,
79
+ requestId,
80
+ authorizedBy: textArg(args, 'authorized_by') || 'operator',
81
+ });
82
+ return result({ ...revised, summary: `Supervisor task ${id} objective ${revised.changed ? 'revised' : 'confirmed'} in place.` });
83
+ }
84
+
85
+ if (operation === 'stop') {
86
+ const id = textArg(args, 'task_id');
87
+ if (!id) throw new Error('WORKFLOW_SUPERVISOR_TASK_ID_REQUIRED');
88
+ const stopped = await stopWorkflowSupervisorTask(forgeHome, id, textArg(args, 'reason') || 'Stopped by operator request.');
89
+ return result({ ...stopped, summary: `Supervisor task ${id} stopped.` });
90
+ }
91
+
92
+ if (operation === 'switch_to_fresh_conversation') {
93
+ const id = textArg(args, 'task_id');
94
+ const expectedConversationId = textArg(args, 'expected_conversation_id');
95
+ const requestId = textArg(args, 'request_id');
96
+ const reason = textArg(args, 'reason');
97
+ if (!id) throw new Error('WORKFLOW_SUPERVISOR_TASK_ID_REQUIRED');
98
+ if (!expectedConversationId) throw new Error('WORKFLOW_SUPERVISOR_MIGRATION_EXPECTED_CONVERSATION_REQUIRED');
99
+ if (!requestId) throw new Error('WORKFLOW_SUPERVISOR_REQUEST_ID_REQUIRED');
100
+ if (!reason) throw new Error('WORKFLOW_SUPERVISOR_MIGRATION_REASON_REQUIRED');
101
+ const migrated = await migrateWorkflowSupervisorConversation(forgeHome, {
102
+ taskId: id, expectedConversationId, requestId, reason, fresh: true,
103
+ authorizedBy: textArg(args, 'authorized_by') || 'operator',
104
+ });
105
+ return result({
106
+ ...migrated,
107
+ status: migrated.migrated ? 'switching_to_fresh_conversation' : 'unchanged',
108
+ summary: migrated.migrated
109
+ ? `Supervisor task ${id} reserved a fresh conversation and will bind it after the enrollment send is observed.`
110
+ : `Supervisor task ${id} conversation was unchanged.`,
111
+ });
112
+ }
113
+
114
+ if (operation === 'recover') {
115
+ const id = textArg(args, 'task_id');
116
+ const requestId = textArg(args, 'request_id');
117
+ const reason = textArg(args, 'reason');
118
+ if (!id) throw new Error('WORKFLOW_SUPERVISOR_TASK_ID_REQUIRED');
119
+ if (!requestId) throw new Error('WORKFLOW_SUPERVISOR_REQUEST_ID_REQUIRED');
120
+ if (!reason) throw new Error('WORKFLOW_SUPERVISOR_RECOVERY_REASON_REQUIRED');
121
+ const recovered = await recoverWorkflowSupervisorTask(forgeHome, {
122
+ taskId: id,
123
+ sourceEffectId: textArg(args, 'source_effect_id') || undefined,
124
+ requestId,
125
+ reason,
126
+ authorizedBy: textArg(args, 'authorized_by') || 'operator',
127
+ ...(args.supersede_unknown === true ? { supersedeUnknown: true } : {}),
128
+ });
129
+ return result({ ...recovered, summary: `Supervisor task ${id} recovery ${recovered.action}.` });
130
+ }
131
+
132
+ if (operation === 'get') {
133
+ const id = textArg(args, 'task_id');
134
+ if (!id) throw new Error('WORKFLOW_SUPERVISOR_TASK_ID_REQUIRED');
135
+ const task = await getWorkflowSupervisorTask(forgeHome, id);
136
+ if (!task) return result({ taskId: id, status: 'not_found', summary: `Supervisor task ${id} not found.` }, true);
137
+ // Derived read-only projection: an effect that exhausted its mechanical
138
+ // retry/resume budget used to make the task silently leave the delivery
139
+ // queue. The stall state names the exact operator action that can move it.
140
+ const stall = await getWorkflowSupervisorTaskStall(forgeHome, id).catch(() => undefined);
141
+ return result({ task, ...(stall ? { stall } : {}), summary: `Supervisor task ${id} retrieved${stall ? ` (${stall.state})` : ''}.` });
142
+ }
143
+
144
+ if (operation === 'proof') {
145
+ const activeReleaseId = textArg(args, 'active_release_id');
146
+ const notBefore = textArg(args, 'not_before');
147
+ if (!activeReleaseId) throw new Error('WORKFLOW_SUPERVISOR_PROOF_RELEASE_REQUIRED');
148
+ if (!notBefore) throw new Error('WORKFLOW_SUPERVISOR_PROOF_BOUNDARY_REQUIRED');
149
+ const proof = await getWorkflowSupervisorContinuationProof(forgeHome, { repoId, activeReleaseId, notBefore });
150
+ return result(proof
151
+ ? { proof, summary: `Standalone Supervisor continuation proof found for ${proof.taskId}.` }
152
+ : { status: 'not_found', summary: 'No matching CONTINUE -> CONTINUE -> DONE proof found.' }, !proof);
153
+ }
154
+
155
+ throw new Error(`WORKFLOW_SUPERVISOR_OPERATION_INVALID:${operation || '(missing)'}`);
156
+ }