@moretea-labs/forge 1.8.0 → 1.8.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (695) hide show
  1. package/AGENTS.md +73 -7
  2. package/CHANGELOG.md +34 -0
  3. package/CLAUDE.md +17 -2
  4. package/CONTRIBUTING.md +3 -2
  5. package/README.en.md +24 -3
  6. package/README.md +10 -6
  7. package/README.zh-CN.md +5 -3
  8. package/THIRD_PARTY_NOTICES.md +1 -2
  9. package/adapters/chatgpt/browser-delivery-host.ts +7 -1
  10. package/adapters/chatgpt/browser-delivery-runtime.ts +531 -56
  11. package/adapters/chatgpt/controller-binding-store.ts +101 -22
  12. package/adapters/chatgpt/controller-round-host.ts +15 -25
  13. package/adapters/chatgpt/controller-round-settlement-store.ts +58 -4
  14. package/adapters/chatgpt/provider-delivery.ts +229 -2
  15. package/adapters/chatgpt/work-conversation-binding-store.ts +99 -54
  16. package/adapters/computer/chatgpt-extension-target.ts +708 -0
  17. package/adapters/computer/chrome-extension/background.js +541 -0
  18. package/adapters/computer/chrome-extension/content.js +402 -0
  19. package/adapters/computer/chrome-extension/core.js +24 -0
  20. package/adapters/computer/chrome-extension/manifest.json +32 -0
  21. package/adapters/computer/desktop-operator-discovery.ts +11 -31
  22. package/adapters/computer/desktop-operator-provider.ts +18 -6
  23. package/adapters/computer/interaction-target-authority.ts +178 -24
  24. package/adapters/mcp/access-mode.ts +18 -39
  25. package/adapters/mcp/auth.ts +2 -7
  26. package/adapters/mcp/instructions.ts +6 -5
  27. package/adapters/mcp/multi-repository.ts +10 -47
  28. package/adapters/mcp/oauth.ts +73 -0
  29. package/adapters/mcp/paths.ts +4 -1
  30. package/adapters/mcp/runtime-gateway/bounded-result-runtime.ts +62 -0
  31. package/adapters/mcp/runtime-gateway/cognition-settlement.ts +201 -0
  32. package/adapters/mcp/runtime-gateway/context-adapter.ts +490 -113
  33. package/adapters/mcp/runtime-gateway/context-pack-sidecar.ts +83 -0
  34. package/adapters/mcp/runtime-gateway/controller-authority-adapter.ts +20 -5
  35. package/adapters/mcp/runtime-gateway/core-capability-adapter.ts +258 -0
  36. package/adapters/mcp/runtime-gateway/engineering-preconditions.ts +10 -27
  37. package/adapters/mcp/runtime-gateway/engineering-tool-contract.ts +15 -0
  38. package/adapters/mcp/runtime-gateway/execution-tools.ts +14 -54
  39. package/adapters/mcp/runtime-gateway/gateway-execution-adapter.ts +2 -1
  40. package/adapters/mcp/runtime-gateway/plugin-adapter.ts +132 -47
  41. package/adapters/mcp/runtime-gateway/process-tools.ts +173 -23
  42. package/adapters/mcp/runtime-gateway/protected-computer-adapter.ts +16 -4
  43. package/adapters/mcp/runtime-gateway/recovery-adapter.ts +69 -52
  44. package/adapters/mcp/runtime-gateway/repository-compat-adapter.ts +4 -35
  45. package/adapters/mcp/runtime-gateway/result-adapter.ts +10 -4
  46. package/adapters/mcp/runtime-gateway/router.ts +19 -507
  47. package/adapters/mcp/runtime-gateway/routing-policy.ts +506 -0
  48. package/adapters/mcp/runtime-gateway/runtime-observation-adapter.ts +15 -66
  49. package/adapters/mcp/runtime-gateway/runtime-readiness-observation.ts +218 -0
  50. package/adapters/mcp/runtime-gateway/runtime-tool-definitions.ts +123 -178
  51. package/adapters/mcp/runtime-gateway/runtime-tools.ts +11 -5
  52. package/adapters/mcp/runtime-gateway/scheduler-adapter.ts +37 -1
  53. package/adapters/mcp/runtime-gateway/shared-adapter.ts +20 -0
  54. package/adapters/mcp/runtime-gateway/status-inbox-adapter.ts +416 -270
  55. package/adapters/mcp/runtime-gateway/typescript-navigation-sidecar.ts +140 -0
  56. package/adapters/mcp/runtime-gateway/work-adapter.ts +262 -3123
  57. package/adapters/mcp/runtime-gateway/work-controller-operations.ts +257 -0
  58. package/adapters/mcp/runtime-gateway/work-detail-projection.ts +60 -0
  59. package/adapters/mcp/runtime-gateway/work-input-wire-migration.ts +229 -0
  60. package/adapters/mcp/runtime-gateway/work-learning-operations.ts +145 -0
  61. package/adapters/mcp/runtime-gateway/work-list-projection.ts +38 -0
  62. package/adapters/mcp/runtime-gateway/work-plan-operations.ts +382 -0
  63. package/adapters/mcp/runtime-gateway/work-repair-adapter.ts +308 -0
  64. package/adapters/mcp/runtime-gateway/work-requirement-operations.ts +148 -0
  65. package/adapters/mcp/runtime-gateway/work-semantic-operations.ts +320 -0
  66. package/adapters/mcp/runtime-gateway/work-workflow-operations.ts +113 -0
  67. package/adapters/mcp/runtime-gateway/workflow-supervisor-adapter.ts +180 -0
  68. package/adapters/mcp/server.ts +91 -26
  69. package/adapters/mcp/setup.ts +5 -13
  70. package/adapters/mcp/tool-mapping/access-tools.ts +0 -6
  71. package/adapters/mcp/tool-mapping/legacy-tool-service.ts +703 -3092
  72. package/adapters/mcp/tool-mapping/post-finalize-work-attribution.ts +5 -10
  73. package/adapters/mcp/tool-mapping/repository-tools.ts +170 -213
  74. package/adapters/mcp/toolset-names.ts +11 -37
  75. package/adapters/mcp/toolset.ts +19 -92
  76. package/{src/cli → adapters}/mcp/transports/AGENTS.md +5 -5
  77. package/{src/cli → adapters}/mcp/transports/CLAUDE.md +5 -5
  78. package/adapters/mcp/transports/http-observation.ts +377 -0
  79. package/adapters/mcp/transports/http-post-lifecycle.ts +19 -0
  80. package/adapters/mcp/transports/http.ts +200 -683
  81. package/adapters/mcp/transports/oauth-http.ts +322 -0
  82. package/adapters/mcp/transports/session-registry.ts +6 -0
  83. package/adapters/mcp/tunnels/openai-secure-tunnel.ts +89 -5
  84. package/adapters/mcp/types.ts +0 -6
  85. package/assets/hooks/lib/session-state.sh +0 -38
  86. package/assets/hooks/post-bash.sh +1 -1
  87. package/assets/hooks/post-tool-observer.sh +0 -5
  88. package/assets/hooks/prompt-guard.sh +0 -55
  89. package/assets/partials/04-project-structure.partial.md +1 -1
  90. package/assets/partials/07-footer.partial.md +1 -1
  91. package/assets/partials-agents/02-operating-mode.partial.md +1 -1
  92. package/assets/partials-agents/08-deep-docs.partial.md +1 -1
  93. package/assets/plugin-registry.v1.json +6 -4
  94. package/assets/reference-configs/agentic-development-flow.md +26 -1
  95. package/assets/reference-configs/external-tooling.md +0 -76
  96. package/assets/reference-configs/global-working-rules.md +19 -0
  97. package/assets/reference-configs/release-deploy.md +1 -1
  98. package/assets/templates/helpers/architecture-queue.sh +1 -1
  99. package/assets/templates/helpers/check-agent-tooling.sh +1 -327
  100. package/assets/templates/helpers/check-task-workflow.sh +1 -1
  101. package/assets/templates/helpers/ensure-task-workflow.sh +0 -14
  102. package/assets/templates/helpers/migrate-project-template.sh +2 -2
  103. package/assets/workflow-contract.v1.json +0 -2
  104. package/docs/README.md +5 -2
  105. package/docs/architecture/CURRENT.md +205 -51
  106. package/docs/architecture/decisions/20260803-release-identity-binding-and-exit-policy.md +14 -5
  107. package/docs/architecture/decisions/20260823-immediate-controller-relay.md +6 -3
  108. package/docs/architecture/decisions/20260904-ios-device-migration-baseline.md +42 -0
  109. package/docs/architecture/decisions/20260907-assistant-learning-loop.md +2 -0
  110. package/docs/architecture/decisions/20260907-controller-round-transition-policy.md +19 -4
  111. package/docs/architecture/decisions/20260916-workflow-supervisor-authority.md +249 -0
  112. package/docs/architecture/decisions/20260917-cognitive-memory-foundation.md +82 -0
  113. package/docs/architecture/decisions/20260918-stable-candidate-release-lifecycle.md +234 -0
  114. package/docs/architecture/decisions/20260919-autonomous-work-liveness.md +62 -0
  115. package/docs/architecture/decisions/20260924-thin-semantic-working-context.md +74 -0
  116. package/docs/architecture/decisions/20261001-supervisor-turn-authority.md +342 -0
  117. package/docs/architecture/decisions/20261005-forge-v3-desktop-client-boundary.md +77 -0
  118. package/docs/architecture/decisions/20261009-exact-code-context-discovery.md +19 -0
  119. package/docs/architecture/decisions/20261009-generated-xcode-cache-retention.md +37 -0
  120. package/docs/architecture/decisions/20261011-autonomous-continuation-convergence.md +597 -0
  121. package/docs/architecture/decisions/20261017-edit-session-finalization-reconciliation.md +17 -0
  122. package/docs/architecture/decisions/20261019-retire-host-skills.md +16 -0
  123. package/docs/architecture/diagrams/agentic-dev-plugin-architecture.html +1 -1
  124. package/docs/architecture/domains/public-surface.md +3 -5
  125. package/docs/architecture/domains/verification.md +6 -5
  126. package/docs/architecture/domains/workflow-engine.md +6 -0
  127. package/docs/architecture/modules/controller-runtime/transport-lifecycle.md +3 -3
  128. package/docs/architecture/requests/2026-09-04-computer-plugin-workflow-taxonomy.md +4 -4
  129. package/docs/architecture/reviews/20261015-code-search-runtime-acceptance.md +75 -0
  130. package/docs/forge-plugin-management.md +16 -4
  131. package/docs/operations/controller-browser-plugin.md +23 -0
  132. package/docs/operations/controller-performance-and-502.md +17 -0
  133. package/docs/operations/controller-reliability-runbook.md +2 -2
  134. package/docs/operations/features.md +6 -7
  135. package/docs/operations/features.zh-CN.md +1 -1
  136. package/docs/operations/github-repository.md +4 -4
  137. package/docs/operations/github-semantic-release-projection.md +20 -0
  138. package/docs/operations/homebrew.md +2 -2
  139. package/docs/operations/mcp-tool-exposure.md +13 -52
  140. package/docs/operations/releasing.md +2 -0
  141. package/docs/operations/runtime-performance-diagnostics.md +8 -0
  142. package/docs/operations/standalone-disaster-recovery.md +15 -7
  143. package/docs/tutorials/01-install-and-start.zh-CN.md +1 -1
  144. package/docs/tutorials/03-first-repository-task.md +2 -0
  145. package/docs/wiki/Computer-and-Plugins.md +78 -0
  146. package/docs/wiki/Computer-and-Plugins.zh-CN.md +88 -0
  147. package/docs/wiki/Home.md +16 -2
  148. package/docs/wiki/Implementation.md +25 -13
  149. package/docs/wiki/Installation.md +28 -32
  150. package/docs/wiki/Integrations.md +4 -0
  151. package/docs/wiki/Quick-Start.md +35 -22
  152. package/docs/wiki/Releases-and-Upgrades.md +15 -25
  153. package/docs/wiki/_Sidebar.md +5 -1
  154. package/package.json +25 -25
  155. package/packages/kernel/cognition/api/index.ts +6 -0
  156. package/packages/kernel/cognition/application/activation-service.ts +451 -0
  157. package/packages/kernel/cognition/application/consolidation-service.ts +185 -0
  158. package/packages/kernel/cognition/application/legacy-experience-adapter.ts +38 -0
  159. package/packages/kernel/cognition/application/memory-service.ts +64 -0
  160. package/packages/kernel/cognition/domain/learning.ts +106 -0
  161. package/packages/kernel/cognition/domain/memory.ts +254 -0
  162. package/packages/kernel/controller/api/index.ts +1 -0
  163. package/packages/kernel/controller/application/continuation-service.ts +281 -0
  164. package/packages/kernel/controller/application/controller-round-service.ts +12 -0
  165. package/packages/kernel/controller/domain/controller-round-transition-policy.ts +242 -21
  166. package/packages/kernel/controller/domain/controller-round.ts +4 -1
  167. package/packages/kernel/controller/domain/execution-quality.ts +3 -1
  168. package/packages/kernel/controller/infrastructure/controller-round-store.ts +689 -103
  169. package/packages/kernel/controller/infrastructure/controller-session-store.ts +348 -97
  170. package/packages/kernel/controller/ports/controller-host.ts +2 -0
  171. package/packages/kernel/identity/api/index.ts +10 -0
  172. package/packages/kernel/identity/domain/activity-projection.ts +43 -0
  173. package/packages/kernel/identity/domain/capability-broker.ts +60 -0
  174. package/packages/kernel/identity/domain/grant.ts +72 -0
  175. package/packages/kernel/identity/domain/owned-resource.ts +116 -0
  176. package/packages/kernel/identity/domain/user-request.ts +93 -0
  177. package/packages/kernel/identity/infrastructure/activity-projection-store.ts +87 -0
  178. package/packages/kernel/identity/infrastructure/capability-broker.ts +81 -0
  179. package/packages/kernel/identity/infrastructure/grant-store.ts +284 -0
  180. package/packages/kernel/identity/infrastructure/owned-resource-store.ts +259 -0
  181. package/packages/kernel/identity/infrastructure/user-request-store.ts +182 -0
  182. package/packages/kernel/scheduler/api/index.ts +0 -2
  183. package/packages/kernel/scheduler/application/eligibility.ts +4 -1
  184. package/packages/kernel/scheduler/application/schedule-service.ts +3 -0
  185. package/packages/kernel/scheduler/application/settlement.ts +0 -15
  186. package/packages/kernel/scheduler/domain/schedule.ts +87 -0
  187. package/packages/kernel/scheduler/infrastructure/schedule-store.ts +166 -143
  188. package/packages/kernel/work/api/index.ts +3 -2
  189. package/packages/kernel/work/application/work-service.ts +18 -42
  190. package/packages/kernel/work/domain/current-task-lineage.ts +104 -0
  191. package/packages/kernel/work/domain/engineering-design.ts +10 -5
  192. package/packages/kernel/work/domain/engineering-profile.ts +8 -12
  193. package/packages/kernel/work/domain/evaluation-promotion-receipt.ts +186 -0
  194. package/packages/kernel/work/domain/execution-concurrency.ts +19 -26
  195. package/packages/kernel/work/domain/execution-snapshot.ts +0 -31
  196. package/packages/kernel/work/domain/implementation-review.ts +14 -331
  197. package/packages/kernel/work/domain/objective-graph.ts +119 -0
  198. package/packages/kernel/work/domain/project-engineering-contract.ts +23 -1
  199. package/packages/kernel/work/domain/repository-completion-receipt.ts +1 -1
  200. package/packages/kernel/work/domain/state-machine.ts +34 -65
  201. package/packages/kernel/work/domain/types.ts +57 -51
  202. package/packages/kernel/work/infrastructure/work-contract-store.ts +847 -729
  203. package/packages/kernel/work/ports/work-contract-store.ts +5 -2
  204. package/packages/plugin-runtime/browser/provider-registry.ts +12 -36
  205. package/packages/plugin-runtime/browser/session-authority.ts +2 -1
  206. package/packages/plugin-runtime/computer/chatgpt-identity.ts +24 -0
  207. package/packages/plugin-runtime/computer/conversation-target.ts +153 -0
  208. package/packages/plugin-runtime/computer/index.ts +2 -0
  209. package/packages/plugin-runtime/computer/target-authority.ts +26 -1
  210. package/packages/plugin-runtime/external/unix-jsonl-transport.ts +142 -18
  211. package/packages/protocols/computer/contract.ts +27 -1
  212. package/scripts/activate-source-baseline.ts +7 -9
  213. package/scripts/assemble-template.ts +11 -72
  214. package/scripts/canary-controller-semantic-wait.ts +12 -24
  215. package/scripts/check-mcp-compatibility.ts +94 -201
  216. package/scripts/check-package-identity.mjs +0 -5
  217. package/scripts/check-runtime-architecture.mjs +921 -239
  218. package/scripts/forge-local-recovery-helper.mjs +93 -15
  219. package/scripts/init-project.sh +0 -46
  220. package/scripts/install-ios-hid-toolchain.sh +60 -0
  221. package/scripts/install-standalone-recovery.ts +1 -1
  222. package/scripts/lib/project-init-lib.sh +6 -3
  223. package/scripts/migrate-windows-wsl-controller-home.ts +2 -0
  224. package/scripts/open-source-audit-allowlist.txt +1 -3
  225. package/scripts/run-bounded-command.mjs +5 -0
  226. package/scripts/run-governed-gate.ts +2 -1
  227. package/scripts/run-mobile-monitor-bridge.ts +0 -1
  228. package/scripts/smoke-control-plane-failure-domain.ts +94 -0
  229. package/scripts/smoke-ios-physical-device.ts +38 -10
  230. package/scripts/smoke-mcp-http-runtime.ts +12 -8
  231. package/scripts/smoke-mcp-tool-surface.ts +27 -41
  232. package/scripts/smoke-runtime-recovery.ts +12 -43
  233. package/scripts/smoke-schedule-engine.ts +23 -15
  234. package/scripts/smoke-unattended-transport-recovery.ts +223 -0
  235. package/scripts/smoke-user-request-continuation-restart.ts +232 -0
  236. package/scripts/smoke-workflow-supervisor-chrome-adapter.ts +95 -0
  237. package/scripts/smoke-workflow-supervisor-process-restart.ts +276 -0
  238. package/scripts/smoke-workflow-supervisor-restart-recovery.ts +150 -0
  239. package/scripts/smoke-workflow-supervisor.ts +103 -0
  240. package/scripts/sync-generated-authority.mjs +0 -1
  241. package/scripts/verify-forge-runtime.sh +2 -1
  242. package/src/cli/agent-jobs/executor-health.ts +12 -35
  243. package/src/cli/agent-jobs/integration.ts +20 -51
  244. package/src/cli/agent-jobs/job-manager.ts +7 -3
  245. package/src/cli/chatgpt-browser/file-policy.ts +2 -2
  246. package/src/cli/commands/brain-assistant.ts +27 -13
  247. package/src/cli/commands/brain.ts +13 -15
  248. package/src/cli/commands/chatgpt.ts +1 -163
  249. package/src/cli/commands/doctor.ts +1 -143
  250. package/src/cli/commands/global-runtime.ts +3 -196
  251. package/src/cli/commands/init-hook.ts +6 -23
  252. package/src/cli/commands/init.ts +3 -252
  253. package/src/cli/commands/mcp.ts +0 -5
  254. package/src/cli/commands/prompt-guard-decision.ts +0 -2
  255. package/src/cli/commands/recovery.ts +137 -135
  256. package/src/cli/commands/repository.ts +17 -1
  257. package/src/cli/commands/runtime.ts +3 -3
  258. package/src/cli/commands/setup-execution.ts +41 -0
  259. package/src/cli/commands/setup-profile.ts +8 -0
  260. package/src/cli/controller/check-runner.ts +13 -2
  261. package/src/cli/controller/completion-backlog.ts +3 -3
  262. package/src/cli/controller/completion-orchestrator.ts +5 -44
  263. package/src/cli/controller/completion-target.ts +3 -72
  264. package/src/cli/controller/composite-operations.ts +1 -1
  265. package/src/cli/controller/context/instruction-context.ts +1 -1
  266. package/src/cli/controller/context/known-paths.ts +2 -2
  267. package/src/cli/controller/context/query-planning.ts +11 -4
  268. package/src/cli/controller/context/rule-resolution.ts +2 -2
  269. package/src/cli/controller/context/source-materializer.ts +83 -102
  270. package/src/cli/controller/context/structural-provider.ts +84 -0
  271. package/src/cli/controller/context/structural.ts +6 -6
  272. package/src/cli/controller/context/types.ts +8 -9
  273. package/src/cli/controller/context-pack.ts +107 -84
  274. package/src/cli/controller/execution-completion.ts +4 -7
  275. package/src/cli/controller/execution-policy.ts +36 -153
  276. package/src/cli/controller/governance.ts +2 -3
  277. package/src/cli/controller/issue-store.ts +4 -99
  278. package/src/cli/controller/launch-agents.ts +59 -18
  279. package/src/cli/controller/operational-plan.ts +25 -52
  280. package/src/cli/controller/runtime-config.ts +5 -1
  281. package/src/cli/controller/stuck-state-migration.ts +2 -3
  282. package/src/cli/controller/systemd-user.ts +42 -10
  283. package/src/cli/editing/edit-session.ts +18 -12
  284. package/src/cli/github/github.ts +4 -4
  285. package/src/cli/github/semantic-projection.ts +174 -0
  286. package/src/cli/hook/prompt-intents.ts +0 -9
  287. package/src/cli/index.ts +1 -43
  288. package/src/cli/local-bridge/connector-freshness.ts +1 -12
  289. package/src/cli/local-bridge/console-automations.ts +19 -14
  290. package/src/cli/local-bridge/console-view-models.ts +4 -13
  291. package/src/cli/local-bridge/facade-api.ts +64 -193
  292. package/src/cli/local-bridge/server.ts +24 -147
  293. package/src/cli/local-bridge/types.ts +0 -1
  294. package/src/cli/mcp/oauth-client-retirement.ts +74 -0
  295. package/src/cli/repositories/command-classifier.ts +0 -9
  296. package/src/cli/repositories/command-executor.ts +29 -23
  297. package/src/cli/repositories/command-scope.ts +37 -18
  298. package/src/cli/repositories/controller-home.ts +48 -0
  299. package/src/cli/repositories/ephemeral-workspace.ts +20 -30
  300. package/src/cli/repositories/git-command-executor.ts +2 -2
  301. package/src/cli/repositories/locks.ts +20 -0
  302. package/src/cli/repositories/registry.ts +79 -12
  303. package/src/cli/repositories/safe-patch.ts +2 -12
  304. package/src/cli/repositories/structured-git.ts +101 -5
  305. package/src/cli/repository/inspector.ts +185 -343
  306. package/src/cli/repository/session-cache.ts +92 -6
  307. package/src/effects/process-runner.ts +17 -1
  308. package/src/runtime/context/assistant-context.ts +20 -7
  309. package/src/runtime/context/assistant-work-context.ts +89 -27
  310. package/src/runtime/context/automatic-learning.ts +565 -0
  311. package/src/runtime/context/cognitive-attention.ts +173 -0
  312. package/src/runtime/context/cognitive-skill-canary.ts +158 -0
  313. package/src/runtime/context/context-closure.ts +46 -9
  314. package/src/runtime/context/context-pack-process.ts +103 -0
  315. package/src/runtime/context/context-plane.ts +1 -9
  316. package/src/runtime/context/direct-controller-learning.ts +298 -0
  317. package/src/runtime/context/generic-lsp-provider.ts +1 -1
  318. package/src/runtime/context/semantic-navigation-contract.ts +16 -0
  319. package/src/runtime/context/semantic-navigation.ts +7 -35
  320. package/src/runtime/context/typescript-navigation-process.ts +145 -0
  321. package/src/runtime/context/typescript-navigation.ts +89 -3
  322. package/src/runtime/control-plane/cleanup-artifact-retention.ts +215 -12
  323. package/src/runtime/control-plane/concurrency/work-execution-concurrency.ts +9 -47
  324. package/src/runtime/control-plane/execution/controller-authority-recovery.ts +34 -4
  325. package/src/runtime/control-plane/execution/edit-validation-coordinator.ts +29 -20
  326. package/src/runtime/control-plane/execution/execution-identity.ts +23 -3
  327. package/src/runtime/control-plane/execution/repository-work-attribution.ts +7 -30
  328. package/src/runtime/control-plane/execution/retained-work-resume.ts +206 -199
  329. package/src/runtime/control-plane/execution/session-store.ts +31 -1
  330. package/src/runtime/control-plane/execution/validation.ts +6 -8
  331. package/src/runtime/control-plane/execution/work-authority-reconciler.ts +13 -42
  332. package/src/runtime/control-plane/execution/work-check-evidence.ts +137 -0
  333. package/src/runtime/control-plane/execution/work-completion-authority.ts +30 -85
  334. package/src/runtime/control-plane/execution/work-delivery-service.ts +616 -0
  335. package/src/runtime/control-plane/execution/work-evidence-policy.ts +12 -50
  336. package/src/runtime/control-plane/execution/work-execution-support.ts +50 -149
  337. package/src/runtime/control-plane/execution/work-handle-authority.ts +197 -110
  338. package/src/runtime/control-plane/execution/work-handle-store.ts +72 -44
  339. package/src/runtime/control-plane/execution/work-head-settlement.ts +53 -20
  340. package/src/runtime/control-plane/execution/work-lifecycle-audit.ts +52 -29
  341. package/src/runtime/control-plane/execution/work-operation-service.ts +60 -34
  342. package/src/runtime/control-plane/execution/work-preparation-service.ts +231 -267
  343. package/src/runtime/control-plane/execution/work-process-evidence.ts +2 -2
  344. package/src/runtime/control-plane/execution/work-remote-delivery.ts +2 -3
  345. package/src/runtime/control-plane/execution/work-revision-diff.ts +39 -0
  346. package/src/runtime/control-plane/execution/work-terminal-cleanup.ts +201 -199
  347. package/src/runtime/control-plane/execution/work-validation-reconciler.ts +33 -85
  348. package/src/runtime/control-plane/execution/work-verification-service.ts +406 -50
  349. package/src/runtime/control-plane/execution/work-verification-snapshot.ts +6 -2
  350. package/src/runtime/control-plane/facade/capability-registry.ts +364 -37
  351. package/src/runtime/control-plane/facade/check-normalization.ts +3 -9
  352. package/src/runtime/control-plane/facade/codex-delegation.ts +10 -11
  353. package/src/runtime/control-plane/facade/controller-connection.ts +135 -0
  354. package/src/runtime/control-plane/facade/goal-workloop-access.ts +1 -20
  355. package/src/runtime/control-plane/facade/goal-workloop.ts +281 -1753
  356. package/src/runtime/control-plane/facade/handoff-inbox-application.ts +12 -25
  357. package/src/runtime/control-plane/facade/handoff-inbox-store.ts +256 -52
  358. package/src/runtime/control-plane/facade/index.ts +0 -1
  359. package/src/runtime/control-plane/facade/operation-digest.ts +12 -15
  360. package/src/runtime/control-plane/facade/plan-contract-store.ts +451 -991
  361. package/src/runtime/control-plane/facade/policy-gate.ts +0 -23
  362. package/src/runtime/control-plane/facade/repository-work-admission.ts +12 -22
  363. package/src/runtime/control-plane/facade/requirement-authority.ts +102 -199
  364. package/src/runtime/control-plane/facade/requirement-board.ts +3 -3
  365. package/src/runtime/control-plane/facade/rh-work-operation-contract.ts +51 -14
  366. package/src/runtime/control-plane/facade/self-healing-loop.ts +18 -53
  367. package/src/runtime/control-plane/facade/suggested-actions.ts +15 -18
  368. package/src/runtime/control-plane/facade/types.ts +49 -108
  369. package/src/runtime/control-plane/facade/work-continuation.ts +9 -9
  370. package/src/runtime/control-plane/generated-cache-retention.ts +206 -59
  371. package/src/runtime/control-plane/global-scheduler/autonomous-continuation.ts +248 -0
  372. package/src/runtime/control-plane/global-scheduler/durable-admission.ts +1 -1
  373. package/src/runtime/control-plane/global-scheduler/maintenance.ts +256 -117
  374. package/src/runtime/control-plane/global-scheduler/reconciliation.ts +3 -12
  375. package/src/runtime/control-plane/global-scheduler/scheduler.ts +66 -40
  376. package/src/runtime/control-plane/global-scheduler/wake-signal.ts +42 -2
  377. package/src/runtime/control-plane/governance/access-policy.ts +19 -2
  378. package/src/runtime/control-plane/governance/authorization.ts +20 -3
  379. package/src/runtime/control-plane/governance/external-effects.ts +1 -1
  380. package/src/runtime/control-plane/launcher/chatgpt-round-continuation.ts +63 -300
  381. package/src/runtime/control-plane/launcher/chatgpt-work-continuation.ts +29 -300
  382. package/src/runtime/control-plane/launcher/local-conversation-controller.ts +238 -0
  383. package/src/runtime/control-plane/launcher/provider-mcp-bootstrap.ts +5 -2
  384. package/src/runtime/control-plane/launcher/thin-launcher.ts +96 -240
  385. package/src/runtime/control-plane/persistence/cognition-store.ts +820 -0
  386. package/src/runtime/control-plane/persistence/experience-store.ts +162 -29
  387. package/src/runtime/control-plane/persistence/requirement-store.ts +216 -74
  388. package/src/runtime/control-plane/persistence/sqlite-store.ts +113 -6
  389. package/src/runtime/control-plane/release-retention.ts +135 -47
  390. package/src/runtime/control-plane/repository-namespace-retention.ts +2 -2
  391. package/src/runtime/control-plane/runtime-cleanup.ts +295 -107
  392. package/src/runtime/control-plane/workspace/project-onboarding.ts +80 -0
  393. package/src/runtime/control-plane/workspace/semantic-sync-service.ts +19 -5
  394. package/src/runtime/control-plane/workspace/workspace-store.ts +169 -0
  395. package/src/runtime/diagnostics/incident-repair.ts +313 -146
  396. package/src/runtime/diagnostics/mcp-timing.ts +114 -0
  397. package/src/runtime/evidence/artifact-store.ts +158 -40
  398. package/src/runtime/evidence/evidence-store.ts +112 -8
  399. package/src/runtime/evidence/output-handle-index.ts +225 -0
  400. package/src/runtime/evidence/result-store.ts +158 -44
  401. package/src/runtime/evidence/sensitive-output.ts +22 -2
  402. package/src/runtime/execution/jobs/child-reference.ts +11 -0
  403. package/src/runtime/execution/jobs/receipt-recovery.ts +1 -11
  404. package/src/runtime/execution/jobs/store.ts +3 -4
  405. package/src/runtime/execution/managed-workspace.ts +57 -0
  406. package/src/runtime/execution/process-runtime/check-facade.ts +1 -1
  407. package/src/runtime/execution/process-runtime/check-result-retention.ts +2 -2
  408. package/src/runtime/execution/process-runtime/check-result.ts +105 -1
  409. package/src/runtime/execution/process-runtime/check-runner-sidecar.ts +18 -8
  410. package/src/runtime/execution/process-runtime/command-facade.ts +82 -30
  411. package/src/runtime/execution/process-runtime/gc.ts +15 -2
  412. package/src/runtime/execution/process-runtime/handle-index.ts +176 -0
  413. package/src/runtime/execution/process-runtime/host-command-lane.ts +139 -0
  414. package/src/runtime/execution/process-runtime/index.ts +3 -0
  415. package/src/runtime/execution/process-runtime/lightweight-managed.ts +251 -72
  416. package/src/runtime/execution/process-runtime/persisted-check.ts +3 -3
  417. package/src/runtime/execution/process-runtime/process-runner-entry.ts +47 -5
  418. package/src/runtime/execution/process-runtime/process-scope.ts +160 -0
  419. package/src/runtime/execution/process-runtime/resource-claims.ts +65 -61
  420. package/src/runtime/execution/process-runtime/runtime.ts +55 -18
  421. package/src/runtime/execution/process-runtime/store.ts +30 -2
  422. package/src/runtime/execution/process-runtime/types.ts +6 -1
  423. package/src/runtime/execution/thin-harness/execution-router.ts +16 -16
  424. package/src/runtime/execution/thin-harness/fast-executor.ts +2 -2
  425. package/src/runtime/execution/thin-harness/search-worker.ts +2 -2
  426. package/src/runtime/execution/workers/executor.ts +3 -8
  427. package/src/runtime/maintenance/cleanup.ts +41 -5
  428. package/src/runtime/platform/service-inventory.ts +130 -0
  429. package/src/runtime/platform/service-manager.ts +8 -0
  430. package/src/runtime/plugins/action-application.ts +97 -29
  431. package/src/runtime/plugins/app-store-connect-adapter.ts +290 -18
  432. package/src/runtime/plugins/browser-adapter.ts +1124 -333
  433. package/src/runtime/plugins/browser-automation-service.ts +23 -3
  434. package/src/runtime/plugins/browser-macos-bridge.ts +431 -137
  435. package/src/runtime/plugins/browser-manifest-surface.ts +47 -12
  436. package/src/runtime/plugins/browser-native-session-service.ts +63 -13
  437. package/src/runtime/plugins/browser-registration.ts +18 -0
  438. package/src/runtime/plugins/browser-runtime.ts +40 -36
  439. package/src/runtime/plugins/browser-session-authority.ts +2 -2
  440. package/src/runtime/plugins/browser-session-store.ts +46 -76
  441. package/src/runtime/plugins/capability-authorization-grants.ts +258 -62
  442. package/src/runtime/plugins/computer-chatgpt-browser-adapter-installer.ts +228 -0
  443. package/src/runtime/plugins/computer-registration.ts +298 -20
  444. package/src/runtime/plugins/desktop-operator-external-policy.ts +36 -4
  445. package/src/runtime/plugins/desktop-operator-registration.ts +12 -4
  446. package/src/runtime/plugins/external-adapter.ts +42 -6
  447. package/src/runtime/plugins/external-registration.ts +21 -1
  448. package/src/runtime/plugins/github-adapter.ts +30 -3
  449. package/src/runtime/plugins/gmail-adapter.ts +189 -3
  450. package/src/runtime/plugins/google-calendar-adapter.ts +2 -2
  451. package/src/runtime/plugins/google-shared.ts +24 -12
  452. package/src/runtime/plugins/google-tasks-adapter.ts +2 -2
  453. package/src/runtime/plugins/ios/remote-xpc-hid.ts +70 -30
  454. package/src/runtime/plugins/ios-adapter.ts +46 -41
  455. package/src/runtime/plugins/ios-agent-device.ts +54 -4
  456. package/src/runtime/plugins/ios-device-ownership.ts +103 -0
  457. package/src/runtime/plugins/ios-physical-device.ts +497 -79
  458. package/src/runtime/plugins/lightweight-action.ts +208 -2
  459. package/src/runtime/plugins/local-system-adapter.ts +12 -100
  460. package/src/runtime/plugins/managed-process-adapter.ts +12 -5
  461. package/src/runtime/plugins/plugin-action-sidecar.ts +17 -13
  462. package/src/runtime/plugins/plugin-management-adapter.ts +1 -1
  463. package/src/runtime/plugins/store.ts +682 -435
  464. package/src/runtime/plugins/types.ts +24 -0
  465. package/src/runtime/plugins/xiaohongshu-publish.ts +16 -0
  466. package/src/runtime/projections/git-status-sampler.ts +2 -19
  467. package/src/runtime/projections/invalidation.ts +7 -3
  468. package/src/runtime/projections/materialized-view.ts +80 -36
  469. package/src/runtime/recovery/actions.ts +4 -4
  470. package/src/runtime/recovery/capability-action-application.ts +46 -45
  471. package/src/runtime/recovery/lifecycle-inventory.ts +30 -40
  472. package/src/runtime/recovery/maintenance-executor.ts +374 -123
  473. package/src/runtime/recovery/probe.ts +2 -2
  474. package/src/runtime/recovery/store.ts +29 -11
  475. package/src/runtime/release/release-coordinator.ts +312 -0
  476. package/src/runtime/release/release-session.ts +716 -0
  477. package/src/runtime/release/release-state-migration.ts +25 -0
  478. package/src/runtime/resources/leases/store.ts +56 -25
  479. package/src/runtime/root/computer-composition.ts +191 -6
  480. package/src/runtime/root/controller-progression-composition.ts +254 -0
  481. package/src/runtime/root/controller-round-composition.ts +20 -1
  482. package/src/runtime/root/deployment-topology.ts +106 -0
  483. package/src/runtime/root/entry.ts +4 -3
  484. package/src/runtime/root/known-good-recovery.ts +184 -0
  485. package/src/runtime/root/local-bridge.ts +0 -1
  486. package/src/runtime/root/mcp-transport.ts +111 -18
  487. package/src/runtime/root/ownership.ts +261 -9
  488. package/src/runtime/root/package-connector-service.ts +227 -29
  489. package/src/runtime/root/package-runtime-release.ts +117 -30
  490. package/src/runtime/root/package-runtime-service.ts +24 -24
  491. package/src/runtime/root/release-execution-canary.ts +57 -12
  492. package/src/runtime/root/release-loader.ts +90 -8
  493. package/src/runtime/root/release-manifest.ts +80 -40
  494. package/src/runtime/root/release-materialize.ts +372 -106
  495. package/src/runtime/root/release-store.ts +395 -36
  496. package/src/runtime/root/runtime-lane.ts +191 -0
  497. package/src/runtime/root/runtime.ts +160 -29
  498. package/src/runtime/root/scheduled-controller-composition.ts +29 -3
  499. package/src/runtime/root/service-runner.ts +2 -2
  500. package/src/runtime/root/service.ts +126 -44
  501. package/src/runtime/root/status.ts +48 -0
  502. package/src/runtime/root/types.ts +32 -9
  503. package/src/runtime/root/workflow-supervisor-composition.ts +681 -0
  504. package/src/runtime/root/workflow-supervisor-runtime.ts +564 -0
  505. package/src/runtime/root/write-fence.ts +50 -2
  506. package/src/runtime/safe-tooling/google-credential-store.ts +67 -22
  507. package/src/runtime/safe-tooling/google-oauth-broker.ts +25 -7
  508. package/src/runtime/safe-tooling/ios-development.ts +22 -8
  509. package/src/runtime/safe-tooling/job-summary.ts +1 -1
  510. package/src/runtime/safe-tooling/workspace-auth.ts +5 -2
  511. package/src/runtime/shared/atomic-text-file.ts +21 -0
  512. package/src/runtime/shared/bounded-child-supervisor.ts +9 -1
  513. package/src/runtime/shared/json-files.ts +8 -3
  514. package/src/runtime/shared/process-environment.ts +20 -9
  515. package/src/runtime/shared/response-budget.ts +1 -3
  516. package/src/runtime/standalone-recovery/controller-home-migration.ts +16 -24
  517. package/src/runtime/standalone-recovery/core.ts +3792 -417
  518. package/src/runtime/standalone-recovery/entry.ts +507 -45
  519. package/src/runtime/standalone-recovery/installer.ts +262 -148
  520. package/src/runtime/standalone-recovery/mcp-server.ts +29 -193
  521. package/src/runtime/standalone-recovery/operation-lock.ts +12 -2
  522. package/src/runtime/standalone-recovery/performance.ts +54 -16
  523. package/src/runtime/standalone-recovery/release.ts +53 -5
  524. package/src/runtime/standalone-recovery/service-labels.ts +5 -2
  525. package/src/runtime/standalone-recovery/watchdog-heartbeat.ts +5 -2
  526. package/src/runtime/workflow/schedules/browser-probe.ts +17 -6
  527. package/src/runtime/workflow/schedules/chatgpt-automation-migration.ts +11 -3
  528. package/src/runtime/workflow/schedules/engine.ts +166 -178
  529. package/src/runtime/workflow/schedules/pending-activation.ts +11 -4
  530. package/src/runtime/workflow/schedules/work-continuation.ts +95 -11
  531. package/src/runtime/workflows/runtime.ts +15 -19
  532. package/src/testing/test-governance.ts +5 -1
  533. package/supervisor/chatgpt-conversation.ts +23 -0
  534. package/supervisor/client.ts +218 -0
  535. package/supervisor/control-plane.ts +963 -0
  536. package/supervisor/entry.ts +15 -0
  537. package/supervisor/forge-validators.ts +147 -0
  538. package/supervisor/index.ts +5 -0
  539. package/supervisor/native-browser-adapter.ts +1151 -0
  540. package/supervisor/native-messaging/host.ts +58 -0
  541. package/supervisor/native-messaging/manifest.ts +26 -0
  542. package/supervisor/native-messaging/protocol.ts +27 -0
  543. package/supervisor/paths.ts +18 -0
  544. package/supervisor/protocol.ts +250 -0
  545. package/supervisor/server.ts +412 -0
  546. package/supervisor/store.ts +1870 -0
  547. package/supervisor/tsconfig.json +8 -0
  548. package/supervisor/types.ts +261 -0
  549. package/SKILL.md +0 -427
  550. package/adapters/chatgpt/controller-host.ts +0 -119
  551. package/adapters/mcp/controller-round-compatibility.ts +0 -184
  552. package/adapters/mcp/frozen-client-semantic-compatibility.ts +0 -292
  553. package/adapters/mcp/runtime-gateway/work-compat-adapter.ts +0 -502
  554. package/adapters/mcp/runtime-gateway/work-validation-reconciler.ts +0 -1
  555. package/adapters/mcp/toolset-selection.ts +0 -41
  556. package/agents/openai.yaml +0 -4
  557. package/assets/skill-hooks.json +0 -41
  558. package/assets/skill-version.json +0 -189
  559. package/assets/skills/claude-review/SKILL.md +0 -231
  560. package/assets/skills/codex-review/SKILL.md +0 -103
  561. package/assets/templates/helpers/check-skill-version.ts +0 -193
  562. package/packages/kernel/progression/api/index.ts +0 -2
  563. package/packages/kernel/progression/application/projector.ts +0 -211
  564. package/packages/kernel/progression/domain/types.ts +0 -116
  565. package/packages/kernel/progression/index.ts +0 -1
  566. package/packages/kernel/scheduler/application/continuation-service.ts +0 -212
  567. package/packages/kernel/scheduler/domain/continuation.ts +0 -38
  568. package/packages/kernel/scheduler/infrastructure/continuation-dispatch-store.ts +0 -38
  569. package/packages/kernel/work/domain/admission-policy.ts +0 -34
  570. package/scripts/benchmark-background-check-overlap.ts +0 -228
  571. package/scripts/benchmark-computer-hotpath.ts +0 -255
  572. package/scripts/benchmark-controller-hotpath.ts +0 -212
  573. package/scripts/benchmark-controller-round2.ts +0 -191
  574. package/scripts/benchmark-ios-agent-device.ts +0 -511
  575. package/scripts/benchmark-mcp-host.sh +0 -117
  576. package/scripts/benchmark-mcp-transport.ts +0 -169
  577. package/scripts/benchmark-operational-memory-activation.ts +0 -235
  578. package/scripts/benchmark-operational-shadow.ts +0 -28
  579. package/scripts/benchmark-quality-harness.ts +0 -146
  580. package/scripts/benchmark-route-session-concurrency.ts +0 -915
  581. package/scripts/benchmark-thin-harness-gateway-ab.ts +0 -632
  582. package/scripts/benchmark-thin-harness-mcp-e2e.ts +0 -498
  583. package/scripts/benchmark-thin-harness.ts +0 -251
  584. package/scripts/benchmark-typescript-navigation.ts +0 -186
  585. package/scripts/benchmark-work-efficiency.ts +0 -334
  586. package/scripts/build-controller-ui.ts +0 -28
  587. package/scripts/check-npm-release.sh +0 -32
  588. package/scripts/check-public-release-surface.sh +0 -19
  589. package/scripts/check-release-published.sh +0 -57
  590. package/scripts/check-release-readiness.sh +0 -37
  591. package/scripts/check-release-version.mjs +0 -74
  592. package/scripts/check-skill-version.ts +0 -5
  593. package/scripts/check-tarball-install-smoke.sh +0 -150
  594. package/scripts/ensure-codegraph.sh +0 -16
  595. package/scripts/package-source-archive.sh +0 -147
  596. package/scripts/public-release-files.txt +0 -39
  597. package/scripts/public-release.ts +0 -174
  598. package/scripts/publish-release-tarball.sh +0 -27
  599. package/scripts/route-nl-vs-ts-eval.ts +0 -679
  600. package/scripts/run-skill-hook.ts +0 -244
  601. package/scripts/stage-runtime-release.ts +0 -44
  602. package/scripts/sync-codex-installed-copies.sh +0 -182
  603. package/src/cli/commands/tools.ts +0 -167
  604. package/src/cli/controller/progress.ts +0 -656
  605. package/src/cli/controller/work-mode.ts +0 -181
  606. package/src/cli/local-bridge/console-assets.ts +0 -17
  607. package/src/cli/local-bridge/dashboard.ts +0 -17
  608. package/src/cli/local-bridge/frontend/src/App.tsx +0 -10
  609. package/src/cli/local-bridge/frontend/src/components/Button.tsx +0 -1
  610. package/src/cli/local-bridge/frontend/src/components/DetailPane.tsx +0 -3
  611. package/src/cli/local-bridge/frontend/src/components/SearchField.tsx +0 -1
  612. package/src/cli/local-bridge/frontend/src/components/SectionHeader.tsx +0 -1
  613. package/src/cli/local-bridge/frontend/src/components/Segmented.tsx +0 -1
  614. package/src/cli/local-bridge/frontend/src/components/StatusText.tsx +0 -3
  615. package/src/cli/local-bridge/frontend/src/design/icons.tsx +0 -11
  616. package/src/cli/local-bridge/frontend/src/design/tokens.css +0 -8
  617. package/src/cli/local-bridge/frontend/src/features/automations/AutomationsView.tsx +0 -153
  618. package/src/cli/local-bridge/frontend/src/features/capabilities/CapabilitiesView.tsx +0 -37
  619. package/src/cli/local-bridge/frontend/src/features/overview/OverviewView.tsx +0 -183
  620. package/src/cli/local-bridge/frontend/src/features/repositories/RepositoriesView.tsx +0 -2
  621. package/src/cli/local-bridge/frontend/src/features/system/SystemView.tsx +0 -2
  622. package/src/cli/local-bridge/frontend/src/features/work/WorkView.tsx +0 -4
  623. package/src/cli/local-bridge/frontend/src/lib/api.ts +0 -30
  624. package/src/cli/local-bridge/frontend/src/lib/format.ts +0 -4
  625. package/src/cli/local-bridge/frontend/src/lib/routes.ts +0 -7
  626. package/src/cli/local-bridge/frontend/src/main.tsx +0 -1
  627. package/src/cli/local-bridge/frontend/src/shell/AppShell.tsx +0 -1
  628. package/src/cli/local-bridge/frontend/src/shell/CommandBar.tsx +0 -2
  629. package/src/cli/local-bridge/frontend/src/shell/Sidebar.tsx +0 -4
  630. package/src/cli/local-bridge/frontend/src/styles.css +0 -28
  631. package/src/cli/local-bridge/frontend/src/types.ts +0 -15
  632. package/src/cli/local-bridge/frontend/src/vite-env.d.ts +0 -1
  633. package/src/cli/local-bridge/frontend/vite.config.ts +0 -27
  634. package/src/cli/local-bridge/ui-dist/app.css +0 -1
  635. package/src/cli/local-bridge/ui-dist/app.js +0 -11228
  636. package/src/cli/mcp/access-mode.ts +0 -2
  637. package/src/cli/mcp/access-tools.ts +0 -2
  638. package/src/cli/mcp/audit.ts +0 -2
  639. package/src/cli/mcp/auth.ts +0 -2
  640. package/src/cli/mcp/instructions.ts +0 -2
  641. package/src/cli/mcp/legacy-context.ts +0 -2
  642. package/src/cli/mcp/legacy-tool-service.ts +0 -2
  643. package/src/cli/mcp/multi-repository.ts +0 -2
  644. package/src/cli/mcp/oauth.ts +0 -2
  645. package/src/cli/mcp/openai-secure-tunnel.ts +0 -2
  646. package/src/cli/mcp/paths.ts +0 -2
  647. package/src/cli/mcp/policy.ts +0 -2
  648. package/src/cli/mcp/post-finalize-work-attribution.ts +0 -2
  649. package/src/cli/mcp/proxy-env.ts +0 -2
  650. package/src/cli/mcp/readiness-projection.ts +0 -2
  651. package/src/cli/mcp/redaction.ts +0 -2
  652. package/src/cli/mcp/repo.ts +0 -2
  653. package/src/cli/mcp/repository-tools.ts +0 -2
  654. package/src/cli/mcp/server.ts +0 -2
  655. package/src/cli/mcp/setup.ts +0 -2
  656. package/src/cli/mcp/tool-capability-cache.ts +0 -2
  657. package/src/cli/mcp/tool-contract.ts +0 -2
  658. package/src/cli/mcp/tools.ts +0 -2
  659. package/src/cli/mcp/toolset-names.ts +0 -2
  660. package/src/cli/mcp/toolset-selection.ts +0 -2
  661. package/src/cli/mcp/toolset.ts +0 -2
  662. package/src/cli/mcp/transports/http.ts +0 -2
  663. package/src/cli/mcp/transports/session-registry.ts +0 -2
  664. package/src/cli/mcp/transports/stdio.ts +0 -2
  665. package/src/cli/mcp/types.ts +0 -2
  666. package/src/cli/mcp/umbrella-tools.ts +0 -2
  667. package/src/cli/tools/codegraph.ts +0 -695
  668. package/src/core/adoption/helper-wrapper-plan.ts +0 -159
  669. package/src/runtime/context/codegraph-cache-boundary.ts +0 -255
  670. package/src/runtime/context/codegraph-read-provider.ts +0 -611
  671. package/src/runtime/context/codegraph-sidecar.cjs +0 -248
  672. package/src/runtime/control-plane/codegraph-cache-retention.ts +0 -164
  673. package/src/runtime/control-plane/execution/content-equivalent-commit-authority.ts +0 -169
  674. package/src/runtime/control-plane/execution/direct-canonical-work-reconciliation.ts +0 -85
  675. package/src/runtime/control-plane/execution/direct-edit-work-completion.ts +0 -655
  676. package/src/runtime/control-plane/execution/work-finalization-service.ts +0 -2850
  677. package/src/runtime/control-plane/execution/work-path-scope.ts +0 -37
  678. package/src/runtime/control-plane/execution/work-task-receipt.ts +0 -468
  679. package/src/runtime/control-plane/facade/controller-round-relay.ts +0 -3
  680. package/src/runtime/control-plane/facade/work-admission-policy.ts +0 -142
  681. package/src/runtime/control-plane/facade/work-implementation-review.ts +0 -2
  682. package/src/runtime/control-plane/facade/work-state-machine.ts +0 -2
  683. package/src/runtime/control-plane/facade/work-task-projection.ts +0 -66
  684. package/src/runtime/control-plane/routing/index.ts +0 -1
  685. package/src/runtime/control-plane/routing/route-policy.ts +0 -401
  686. package/src/runtime/control-plane/routing/workspace-admission.ts +0 -70
  687. package/src/runtime/gateway/mcp/execution-tools.ts +0 -2
  688. package/src/runtime/gateway/mcp/legacy-ios-tool-adapter.ts +0 -2
  689. package/src/runtime/gateway/mcp/persisted-check-process.ts +0 -2
  690. package/src/runtime/gateway/mcp/process-tools.ts +0 -2
  691. package/src/runtime/gateway/mcp/router.ts +0 -2
  692. package/src/runtime/gateway/mcp/runtime-tool-definitions.ts +0 -2
  693. package/src/runtime/gateway/mcp/runtime-tools.ts +0 -2
  694. package/src/runtime/gateway/mcp/work-validation-reconciler.ts +0 -2
  695. package/src/runtime/plugins/browser-provider-registry.ts +0 -2
@@ -0,0 +1,320 @@
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, type BuildFacadeResultOptions } 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
+ import { existsSync } from 'node:fs';
25
+ import { getWorkflowSupervisorTask, stopWorkflowSupervisorTask } from '../../../supervisor/client';
26
+ import { workflowSupervisorSocketPath } from '../../../supervisor/paths';
27
+
28
+ async function stopTerminalWorkSupervisor(
29
+ options: WorkContractStoreOptions,
30
+ workId: string,
31
+ state: 'completed' | 'cancelled',
32
+ ): Promise<{ status: 'stopped' | 'already_terminal' | 'not_enrolled' | 'pending_reconcile'; reason?: string }> {
33
+ const controllerHome = options.controllerHome;
34
+ const repoId = options.repoId?.trim();
35
+ if (!controllerHome || !repoId || !existsSync(workflowSupervisorSocketPath(controllerHome))) {
36
+ return { status: 'pending_reconcile', reason: 'Supervisor socket unavailable; native consumer will reconcile terminal Work on restart.' };
37
+ }
38
+ const taskId = `forge:${repoId}:work:${workId}`;
39
+ try {
40
+ const task = await getWorkflowSupervisorTask(controllerHome, taskId);
41
+ if (!task) return { status: 'not_enrolled' };
42
+ // Fail closed: an unrelated Requirement/standalone Goal must never be
43
+ // stopped by a lower-layer Work transition.
44
+ if (task.taskId !== taskId || task.completionContract?.work_id !== workId
45
+ || task.completionContract?.repo_id !== repoId
46
+ || task.continuationPolicy.kind === 'standalone_supervisor') {
47
+ return { status: 'pending_reconcile', reason: 'Supervisor task contract is not exact Work-owned.' };
48
+ }
49
+ const stopped = await stopWorkflowSupervisorTask(controllerHome, taskId, `Work ${workId} changed to ${state}; its exact Work-owned automatic continuation is closed.`);
50
+ return { status: stopped.deduplicated ? 'already_terminal' : 'stopped' };
51
+ } catch (error) {
52
+ const reason = error instanceof Error ? error.message : String(error);
53
+ const code = reason.split(':', 1)[0]?.trim();
54
+ if (code === 'WORKFLOW_SUPERVISOR_TASK_UNKNOWN') return { status: 'not_enrolled' };
55
+ if (code === 'WORKFLOW_SUPERVISOR_TASK_TERMINAL') return { status: 'already_terminal' };
56
+ return { status: 'pending_reconcile', reason };
57
+ }
58
+ }
59
+
60
+ const RH_WORK_SEMANTIC_OPERATIONS = new Set(['start', 'get', 'revise', 'complete']);
61
+
62
+ type WorkSemanticFacadeData = Record<string, unknown> & {
63
+ work?: ReturnType<typeof workSemanticView>;
64
+ currentWork?: ReturnType<typeof workSemanticView>;
65
+ revisionHistory?: ReturnType<typeof listWorkSemanticRevisionRecords>;
66
+ };
67
+
68
+ export function buildWorkSemanticFacadeResult(options: BuildFacadeResultOptions<WorkSemanticFacadeData>) {
69
+ const facade = buildFacadeResult(options);
70
+ // These authored projections already have domain limits. Generic diagnostic
71
+ // clipping corrupts their read/revise round trip (100 refs become 50, and a
72
+ // valid objective becomes an ellipsis). Keep execution diagnostics bounded.
73
+ if (options.data.work) facade.data.work = options.data.work;
74
+ if (options.data.currentWork) facade.data.currentWork = options.data.currentWork;
75
+ if (options.data.revisionHistory) facade.data.revisionHistory = options.data.revisionHistory;
76
+ return facade;
77
+ }
78
+
79
+ /** Resolve semantic version references against existing canonical heads/history. */
80
+ function workBasis(store: WorkContractStoreOptions, x: { requirementId?: string; requirementRevision?: number; planId?: string; planRevision?: number }) {
81
+ const plan = x.planId ? getPlanContract(store, x.planId) : undefined;
82
+ if (x.planId && !plan) throw new Error(`WORK_PLAN_NOT_FOUND: ${x.planId}`);
83
+ if (x.requirementId && plan?.requirementId && x.requirementId !== plan.requirementId) {
84
+ throw new Error(`WORK_PLAN_REQUIREMENT_MISMATCH: ${x.planId} belongs to ${plan.requirementId}, not ${x.requirementId}`);
85
+ }
86
+ const requirementId = x.requirementId || plan?.requirementId;
87
+ if (x.requirementRevision !== undefined && !requirementId) throw new Error('WORK_REQUIREMENT_ID_REQUIRED_FOR_REVISION');
88
+ if (x.planRevision !== undefined && !x.planId) throw new Error('WORK_PLAN_ID_REQUIRED_FOR_REVISION');
89
+ if (requirementId && !store.controllerHome) throw new Error('WORK_REQUIREMENT_STORE_UNAVAILABLE');
90
+ const requirement = requirementId ? readRequirement({ controllerHome: store.controllerHome! }, requirementId)?.value : undefined;
91
+ if (requirementId && !requirement) throw new Error(`WORK_REQUIREMENT_NOT_FOUND: ${requirementId}`);
92
+ for (const [kind, revision] of [['REQUIREMENT', x.requirementRevision], ['PLAN', x.planRevision]] as const) {
93
+ if (revision !== undefined && (!Number.isInteger(revision) || revision < 1)) throw new Error(`WORK_${kind}_REVISION_INVALID`);
94
+ }
95
+ const requirementRevision = requirement ? x.requirementRevision ?? currentRequirementSemanticRevision(requirement) : undefined;
96
+ const planRevision = plan ? x.planRevision ?? currentPlanSemanticRevision(plan) : undefined;
97
+ if (requirement && requirementRevision !== currentRequirementSemanticRevision(requirement)
98
+ && !getRequirementRevisionRecord({ controllerHome: store.controllerHome! }, requirementId!, requirementRevision!)) {
99
+ throw new Error(`WORK_REQUIREMENT_REVISION_NOT_FOUND: ${requirementId}:r${requirementRevision}`);
100
+ }
101
+ if (plan && planRevision !== currentPlanSemanticRevision(plan)
102
+ && !getPlanSemanticRevisionRecord(store, x.planId!, planRevision!)) {
103
+ throw new Error(`WORK_PLAN_REVISION_NOT_FOUND: ${x.planId}:r${planRevision}`);
104
+ }
105
+ return { requirementId, requirementRevision, planId: x.planId, planRevision };
106
+ }
107
+
108
+ /** On-demand projection for manual and automated continuation; never adopts a head. */
109
+ function versionBinding(store: WorkContractStoreOptions, work: NonNullable<ReturnType<typeof getWorkContract>>, detail: boolean) {
110
+ const req = work.requirementId && store.controllerHome
111
+ ? readRequirement({ controllerHome: store.controllerHome }, work.requirementId)?.value : undefined;
112
+ const plan = work.planId ? getPlanContract(store, work.planId) : undefined;
113
+ const reqHead = req ? requirementSemanticView(req) : undefined;
114
+ const planHead = plan ? planSemanticView(plan) : undefined;
115
+ const reqAdopted = detail && reqHead && work.requirementRevision !== reqHead.revision
116
+ ? getRequirementRevisionRecord({ controllerHome: store.controllerHome! }, work.requirementId!, work.requirementRevision!) : undefined;
117
+ const planAdopted = detail && planHead && work.planRevision !== planHead.revision
118
+ ? getPlanSemanticRevisionRecord(store, work.planId!, work.planRevision!) : undefined;
119
+ return {
120
+ ...(work.requirementId ? { requirement: {
121
+ id: work.requirementId, adoptedRevision: work.requirementRevision, currentRevision: reqHead?.revision,
122
+ updateAvailable: Boolean(reqHead && work.requirementRevision !== reqHead.revision),
123
+ ...(detail ? { current: reqHead, adopted: reqAdopted ?? (work.requirementRevision === reqHead?.revision ? reqHead : undefined) } : {}),
124
+ } } : {}),
125
+ ...(work.planId ? { plan: {
126
+ id: work.planId, adoptedRevision: work.planRevision, currentRevision: planHead?.revision,
127
+ updateAvailable: Boolean(planHead && work.planRevision !== planHead.revision),
128
+ ...(detail ? { current: planHead, adopted: planAdopted ?? (work.planRevision === planHead?.revision ? planHead : undefined) } : {}),
129
+ } } : {}),
130
+ };
131
+ }
132
+
133
+
134
+ export function semanticWorkId(store: WorkContractStoreOptions, args: Record<string, unknown>): string {
135
+ const explicit = typeof args.work_id === 'string' ? args.work_id.trim() : '';
136
+ if (explicit) return explicit;
137
+ const requestId = typeof args.request_id === 'string' ? args.request_id.trim() : '';
138
+ if (requestId) {
139
+ const scopeKey = store.scopeKey?.trim() || store.repoId?.trim() || 'semantic';
140
+ const digest = createHash('sha256').update(`${scopeKey}\0${requestId}`).digest('hex').slice(0, 12);
141
+ return `work-semantic-${digest}`;
142
+ }
143
+ return `work-semantic-${randomUUID().slice(0, 12)}`;
144
+ }
145
+
146
+ function semanticCreateMatches(existing: ReturnType<typeof getWorkContract>, args: Record<string, unknown>, requestId: string): boolean {
147
+ if (!existing) return false;
148
+ const objective = String(args.objective ?? '').trim();
149
+ const requirementId = typeof args.requirement_id === 'string' ? args.requirement_id.trim() : '';
150
+ const planId = typeof args.plan_id === 'string' ? args.plan_id.trim() : '';
151
+ const semanticParentWorkId = typeof args.semantic_parent_work_id === 'string' ? args.semantic_parent_work_id.trim() : '';
152
+ const dependsOnWorkIds = normalizeWorkObjectiveRelationIds(Array.isArray(args.depends_on_work_ids) ? args.depends_on_work_ids.map(String) : []).sort();
153
+ const existingDependencies = normalizeWorkObjectiveRelationIds(existing.dependsOnWorkIds).sort();
154
+ return existing.objective === objective
155
+ && (planId && !requirementId ? true : (existing.requirementId ?? '') === requirementId)
156
+ && (args.requirement_revision === undefined || existing.requirementRevision === args.requirement_revision)
157
+ && (args.plan_revision === undefined || existing.planRevision === args.plan_revision)
158
+ && (existing.planId ?? '') === planId
159
+ && (existing.semanticParentWorkId ?? '') === semanticParentWorkId
160
+ && existingDependencies.length === dependsOnWorkIds.length
161
+ && existingDependencies.every((id, index) => id === dependsOnWorkIds[index])
162
+ && (existing.requestId ?? '') === requestId;
163
+ }
164
+
165
+ export async function callRhWorkSemanticOperation(
166
+ store: WorkContractStoreOptions,
167
+ operation: string,
168
+ args: Record<string, unknown>,
169
+ ): Promise<CallToolResult | undefined> {
170
+ if (!RH_WORK_SEMANTIC_OPERATIONS.has(operation)) return undefined;
171
+ const workId = operation === 'start' ? semanticWorkId(store, args) : String(args.work_id ?? '').trim();
172
+ if (operation === 'start') {
173
+ const objective = String(args.objective ?? '').trim();
174
+ if (!objective) return result(buildWorkSemanticFacadeResult({
175
+ status: 'blocked', summary: 'WORK_OBJECTIVE_REQUIRED', data: { workId },
176
+ }) as unknown as Record<string, unknown>, true);
177
+ const requestId = typeof args.request_id === 'string' ? args.request_id.trim() : '';
178
+ const existing = getWorkContract(store, workId);
179
+ if (existing) {
180
+ if (!semanticCreateMatches(existing, args, requestId)) return result(buildWorkSemanticFacadeResult({
181
+ status: 'blocked',
182
+ summary: `WORK_SEMANTIC_CREATE_CONFLICT: ${workId}`,
183
+ data: { workId, currentWork: workSemanticView(existing) },
184
+ }) as unknown as Record<string, unknown>, true);
185
+ return result(buildWorkSemanticFacadeResult({
186
+ summary: `Work ${workId} already exists; semantic create was deduplicated.`,
187
+ data: { work: workSemanticView(existing), deduplicated: true },
188
+ }) as unknown as Record<string, unknown>);
189
+ }
190
+ try {
191
+ const basis = workBasis(store, {
192
+ requirementId: typeof args.requirement_id === 'string' ? args.requirement_id.trim() || undefined : undefined,
193
+ requirementRevision: typeof args.requirement_revision === 'number' ? args.requirement_revision : undefined,
194
+ planId: typeof args.plan_id === 'string' ? args.plan_id.trim() || undefined : undefined,
195
+ planRevision: typeof args.plan_revision === 'number' ? args.plan_revision : undefined,
196
+ });
197
+ const created = createWorkSemanticContext(store, {
198
+ workId,
199
+ objective,
200
+ requestedBy: 'chatgpt',
201
+ ...basis,
202
+ ...(typeof args.semantic_parent_work_id === 'string' ? { semanticParentWorkId: args.semantic_parent_work_id } : {}),
203
+ ...(Array.isArray(args.depends_on_work_ids) ? { dependsOnWorkIds: args.depends_on_work_ids.map(String) } : {}),
204
+ ...(requestId ? { requestId } : {}),
205
+ });
206
+ return result(buildWorkSemanticFacadeResult({
207
+ summary: `Work ${workId} created as semantic context.`,
208
+ data: { work: workSemanticView(created), deduplicated: false },
209
+ }) as unknown as Record<string, unknown>);
210
+ } catch (error) {
211
+ const raced = getWorkContract(store, workId);
212
+ if (raced && semanticCreateMatches(raced, args, requestId)) return result(buildWorkSemanticFacadeResult({
213
+ summary: `Work ${workId} already exists; semantic create was deduplicated.`,
214
+ data: { work: workSemanticView(raced), deduplicated: true },
215
+ }) as unknown as Record<string, unknown>);
216
+ return result(buildWorkSemanticFacadeResult({
217
+ status: 'blocked',
218
+ summary: error instanceof Error ? error.message : String(error),
219
+ data: { workId },
220
+ }) as unknown as Record<string, unknown>, true);
221
+ }
222
+ }
223
+ if (operation === 'get') {
224
+ const work = workId ? getWorkContract(store, workId) : undefined;
225
+ if (!work) return result(buildWorkSemanticFacadeResult({
226
+ status: 'not_found', summary: `Work ${workId || '(missing)'} not found.`, data: { workId },
227
+ }) as unknown as Record<string, unknown>, true);
228
+ const semantic = workSemanticView(work);
229
+ const detail = args.detail_level === 'detail';
230
+ const revisionHistory = detail ? listWorkSemanticRevisionRecords(store, semantic.workId, 100) : [];
231
+ const objectiveGraph = detail ? projectWorkObjectiveGraph(
232
+ readWorkContractStore(store).contracts.map(workSemanticView),
233
+ listWorkSemanticRevisionRecords(store, undefined, 200),
234
+ semantic.workId,
235
+ ) : undefined;
236
+ return result(buildWorkSemanticFacadeResult({
237
+ summary: `Work ${semantic.workId} retrieved at semantic revision ${semantic.revision}.`,
238
+ data: {
239
+ work: semantic,
240
+ versionBinding: versionBinding(store, work, detail),
241
+ ...(detail ? {
242
+ revisionHistory,
243
+ objectiveGraph,
244
+ executionEvidence: projectWorkExecutionEvidence(work),
245
+ continuation: buildWorkContinuationSnapshot(work),
246
+ } : {}),
247
+ },
248
+ detailLevel: args.detail_level === 'detail' ? 'detail' : 'summary',
249
+ }) as unknown as Record<string, unknown>);
250
+ }
251
+
252
+ const expectedRevision = Number(args.expected_revision);
253
+ const targetState = operation === 'complete'
254
+ ? 'completed'
255
+ : (args.work_state === 'open' || args.work_state === 'completed' || args.work_state === 'cancelled' ? args.work_state : undefined);
256
+ try {
257
+ const current = getWorkContract(store, workId);
258
+ const choosingVersion = typeof args.requirement_revision === 'number' || typeof args.plan_revision === 'number';
259
+ if (choosingVersion && !current) throw new Error(`WORK_NOT_FOUND: ${workId}`);
260
+ if (choosingVersion && current && semanticWorkState(current) !== 'open') throw new Error(`WORK_TERMINAL_BASIS_IMMUTABLE: ${workId}`);
261
+ const basis = choosingVersion ? workBasis(store, {
262
+ requirementId: current?.requirementId,
263
+ requirementRevision: typeof args.requirement_revision === 'number' ? args.requirement_revision : undefined,
264
+ planId: current?.planId,
265
+ planRevision: typeof args.plan_revision === 'number' ? args.plan_revision : undefined,
266
+ }) : undefined;
267
+ const revised = reviseWorkSemanticContext(store, workId, {
268
+ expectedRevision,
269
+ ...(typeof args.objective === 'string' ? { objective: args.objective } : {}),
270
+ ...(targetState ? { state: targetState } : {}),
271
+ ...(typeof args.requirement_revision === 'number' ? { requirementRevision: basis?.requirementRevision } : {}),
272
+ ...(typeof args.plan_revision === 'number' ? { planRevision: basis?.planRevision } : {}),
273
+ ...(operation === 'revise' && typeof args.semantic_parent_work_id === 'string' ? { semanticParentWorkId: args.semantic_parent_work_id } : {}),
274
+ ...(operation === 'revise' && Array.isArray(args.depends_on_work_ids) ? { dependsOnWorkIds: args.depends_on_work_ids.map(String) } : {}),
275
+ ...(Array.isArray(args.work_result_refs) ? { resultRefs: args.work_result_refs.map(String) } : {}),
276
+ });
277
+ const semantic = workSemanticView(revised);
278
+ const supervisorClosure = semantic.state !== 'open'
279
+ ? await stopTerminalWorkSupervisor(store, semantic.workId, semantic.state)
280
+ : undefined;
281
+ let resourceReconciliation: Awaited<ReturnType<typeof reconcileSingleTerminalWorkCleanup>> | undefined;
282
+ if (
283
+ semantic.state !== 'open'
284
+ && store.controllerHome
285
+ && revised.repoId?.trim()
286
+ && readWorkHandle(store.controllerHome, revised.repoId, revised.workId)
287
+ ) {
288
+ try {
289
+ resourceReconciliation = await reconcileSingleTerminalWorkCleanup(
290
+ store.controllerHome,
291
+ revised.repoId,
292
+ revised.workId,
293
+ );
294
+ } catch (error) {
295
+ resourceReconciliation = {
296
+ status: 'blocked',
297
+ workId: revised.workId,
298
+ reason: error instanceof Error ? error.message : String(error),
299
+ };
300
+ }
301
+ }
302
+ return result(buildWorkSemanticFacadeResult({
303
+ summary: `Work ${semantic.workId} revised atomically to semantic revision ${semantic.revision}.`,
304
+ data: {
305
+ work: semantic,
306
+ expectedRevision,
307
+ semanticRevision: semantic.revision,
308
+ versionBinding: versionBinding(store, revised, false),
309
+ ...(supervisorClosure ? { supervisorClosure } : {}),
310
+ ...(resourceReconciliation ? { resourceReconciliation } : {}),
311
+ },
312
+ }) as unknown as Record<string, unknown>);
313
+ } catch (error) {
314
+ const current = workId ? getWorkContract(store, workId) : undefined;
315
+ return result(buildWorkSemanticFacadeResult({
316
+ status: 'blocked', summary: error instanceof Error ? error.message : String(error),
317
+ data: { workId, expectedRevision, ...(current ? { currentWork: workSemanticView(current) } : {}) },
318
+ }) as unknown as Record<string, unknown>, true);
319
+ }
320
+ }
@@ -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,180 @@
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
+ listWorkflowSupervisorTerminalTasks,
9
+ migrateWorkflowSupervisorConversation,
10
+ recoverWorkflowSupervisorTask,
11
+ registerWorkflowSupervisorTask,
12
+ reviseWorkflowSupervisorTaskObjective,
13
+ reserveWorkflowSupervisorEnrollment,
14
+ stopWorkflowSupervisorTask,
15
+ } from '../../../supervisor/client';
16
+ import { resolveWorkflowSupervisorForgeHome } from '../../../supervisor/paths';
17
+ import { workflowSupervisorCompletionContractSha256 } from '../../../supervisor/store';
18
+ import type { MultiRepositoryMcpToolContext } from '../multi-repository';
19
+ import { result } from './result-adapter';
20
+
21
+ function textArg(args: Record<string, unknown>, key: string): string {
22
+ return typeof args[key] === 'string' ? String(args[key]).trim() : '';
23
+ }
24
+
25
+ function standaloneTaskId(repoId: string | undefined, requestId: string): string {
26
+ const digest = createHash('sha256').update(`${repoId ?? 'global'}\0${requestId}`).digest('hex').slice(0, 24);
27
+ return `supervisor:${digest}`;
28
+ }
29
+
30
+ export async function callWorkflowSupervisorAdapter(
31
+ ctx: MultiRepositoryMcpToolContext,
32
+ name: string,
33
+ args: Record<string, unknown>,
34
+ ): Promise<CallToolResult | undefined> {
35
+ if (name !== 'supervisor_task') return undefined;
36
+ const operation = textArg(args, 'operation');
37
+ const forgeHome = resolveWorkflowSupervisorForgeHome(ctx.controllerHome);
38
+ const repoId = textArg(args, 'repo_id') || ctx.explicitRepository?.repoId || ctx.repoId || undefined;
39
+
40
+ if (operation === 'start') {
41
+ const objective = textArg(args, 'objective');
42
+ const requestId = textArg(args, 'request_id');
43
+ if (!objective) throw new Error('WORKFLOW_SUPERVISOR_OBJECTIVE_REQUIRED');
44
+ if (!requestId) throw new Error('WORKFLOW_SUPERVISOR_REQUEST_ID_REQUIRED');
45
+ const workId = textArg(args, 'work_id');
46
+ const requirementId = textArg(args, 'requirement_id');
47
+ if (workId && requirementId) throw new Error('WORKFLOW_SUPERVISOR_SEMANTIC_BINDING_AMBIGUOUS');
48
+ if ((workId || requirementId) && !repoId) throw new Error('WORKFLOW_SUPERVISOR_SEMANTIC_BINDING_REPO_REQUIRED');
49
+ const id = standaloneTaskId(repoId, requestId);
50
+ const task = await registerWorkflowSupervisorTask(forgeHome, {
51
+ taskId: id,
52
+ conversationId: `bootstrap:${id}`,
53
+ conversationUrl: 'https://chatgpt.com/',
54
+ objective,
55
+ completionContract: {
56
+ kind: 'model_semantic_completion',
57
+ ...(repoId ? { repo_id: repoId, controller_home: ctx.controllerHome } : {}),
58
+ ...(workId ? { work_id: workId } : {}),
59
+ ...(requirementId ? { requirement_id: requirementId } : {}),
60
+ },
61
+ continuationPolicy: { kind: 'standalone_supervisor', bootstrap: true, ...(repoId ? { repo_id: repoId } : {}) },
62
+ userBlockerPolicy: { kind: 'model_semantic_user_blocker' },
63
+ });
64
+ const effect = await reserveWorkflowSupervisorEnrollment(forgeHome, task.taskId);
65
+ return result({ task, effect, summary: `Standalone Supervisor task ${task.taskId} started.` });
66
+ }
67
+
68
+ if (operation === 'list') {
69
+ if (args.terminal_only === true) {
70
+ const terminalTasks = await listWorkflowSupervisorTerminalTasks(forgeHome);
71
+ return result({ terminalTasks, count: terminalTasks.length, terminalOnly: true, summary: `${terminalTasks.length} canonically terminal Supervisor task(s) in retained history; conversations are not archived or deleted.` });
72
+ }
73
+ const activeOnly = args.active_only !== false;
74
+ const tasks = await listWorkflowSupervisorTasks(forgeHome, activeOnly);
75
+ return result({ tasks, count: tasks.length, activeOnly, summary: `${tasks.length} Supervisor task(s) listed.` });
76
+ }
77
+
78
+ if (operation === 'revise') {
79
+ const id = textArg(args, 'task_id');
80
+ const objective = textArg(args, 'objective');
81
+ const expectedObjectiveSha256 = textArg(args, 'expected_objective_sha256');
82
+ const expectedCompletionContractSha256 = textArg(args, 'expected_completion_contract_sha256');
83
+ const workId = textArg(args, 'work_id');
84
+ const requirementId = textArg(args, 'requirement_id');
85
+ const requestId = textArg(args, 'request_id');
86
+ if (!id) throw new Error('WORKFLOW_SUPERVISOR_TASK_ID_REQUIRED');
87
+ if (!objective) throw new Error('WORKFLOW_SUPERVISOR_OBJECTIVE_REQUIRED');
88
+ if (!expectedObjectiveSha256) throw new Error('WORKFLOW_SUPERVISOR_OBJECTIVE_REVISION_EXPECTED_SHA_REQUIRED');
89
+ if (!requestId) throw new Error('WORKFLOW_SUPERVISOR_REQUEST_ID_REQUIRED');
90
+ if (workId && requirementId) throw new Error('WORKFLOW_SUPERVISOR_SEMANTIC_BINDING_TARGET_INVALID');
91
+ if ((workId || requirementId) && !expectedCompletionContractSha256) throw new Error('WORKFLOW_SUPERVISOR_COMPLETION_CONTRACT_REVISION_EXPECTED_SHA_REQUIRED');
92
+ if (!(workId || requirementId) && expectedCompletionContractSha256) throw new Error('WORKFLOW_SUPERVISOR_COMPLETION_CONTRACT_REVISION_TARGET_REQUIRED');
93
+ const revised = await reviseWorkflowSupervisorTaskObjective(forgeHome, {
94
+ taskId: id,
95
+ objective,
96
+ expectedObjectiveSha256,
97
+ requestId,
98
+ ...(workId ? { workId } : {}),
99
+ ...(requirementId ? { requirementId } : {}),
100
+ ...(expectedCompletionContractSha256 ? { expectedCompletionContractSha256 } : {}),
101
+ authorizedBy: textArg(args, 'authorized_by') || 'operator',
102
+ });
103
+ const bindingSummary = workId || requirementId
104
+ ? `; semantic completion binding ${revised.semanticBindingChanged ? 'revised' : 'confirmed'}`
105
+ : '';
106
+ return result({ ...revised, summary: `Supervisor task ${id} objective ${revised.changed ? 'revised' : 'confirmed'} in place${bindingSummary}.` });
107
+ }
108
+
109
+ if (operation === 'stop') {
110
+ const id = textArg(args, 'task_id');
111
+ if (!id) throw new Error('WORKFLOW_SUPERVISOR_TASK_ID_REQUIRED');
112
+ const stopped = await stopWorkflowSupervisorTask(forgeHome, id, textArg(args, 'reason') || 'Stopped by operator request.');
113
+ return result({ ...stopped, summary: `Supervisor task ${id} stopped.` });
114
+ }
115
+
116
+ if (operation === 'switch_to_fresh_conversation') {
117
+ const id = textArg(args, 'task_id');
118
+ const expectedConversationId = textArg(args, 'expected_conversation_id');
119
+ const requestId = textArg(args, 'request_id');
120
+ const reason = textArg(args, 'reason');
121
+ if (!id) throw new Error('WORKFLOW_SUPERVISOR_TASK_ID_REQUIRED');
122
+ if (!expectedConversationId) throw new Error('WORKFLOW_SUPERVISOR_MIGRATION_EXPECTED_CONVERSATION_REQUIRED');
123
+ if (!requestId) throw new Error('WORKFLOW_SUPERVISOR_REQUEST_ID_REQUIRED');
124
+ if (!reason) throw new Error('WORKFLOW_SUPERVISOR_MIGRATION_REASON_REQUIRED');
125
+ const migrated = await migrateWorkflowSupervisorConversation(forgeHome, {
126
+ taskId: id, expectedConversationId, requestId, reason, fresh: true,
127
+ authorizedBy: textArg(args, 'authorized_by') || 'operator',
128
+ });
129
+ return result({
130
+ ...migrated,
131
+ status: migrated.migrated ? 'switching_to_fresh_conversation' : 'unchanged',
132
+ summary: migrated.migrated
133
+ ? `Supervisor task ${id} reserved a fresh conversation and will bind it after the enrollment send is observed.`
134
+ : `Supervisor task ${id} conversation was unchanged.`,
135
+ });
136
+ }
137
+
138
+ if (operation === 'recover') {
139
+ const id = textArg(args, 'task_id');
140
+ const requestId = textArg(args, 'request_id');
141
+ const reason = textArg(args, 'reason');
142
+ if (!id) throw new Error('WORKFLOW_SUPERVISOR_TASK_ID_REQUIRED');
143
+ if (!requestId) throw new Error('WORKFLOW_SUPERVISOR_REQUEST_ID_REQUIRED');
144
+ if (!reason) throw new Error('WORKFLOW_SUPERVISOR_RECOVERY_REASON_REQUIRED');
145
+ const recovered = await recoverWorkflowSupervisorTask(forgeHome, {
146
+ taskId: id,
147
+ sourceEffectId: textArg(args, 'source_effect_id') || undefined,
148
+ requestId,
149
+ reason,
150
+ authorizedBy: textArg(args, 'authorized_by') || 'operator',
151
+ ...(args.supersede_unknown === true ? { supersedeUnknown: true } : {}),
152
+ });
153
+ return result({ ...recovered, summary: `Supervisor task ${id} recovery ${recovered.action}.` });
154
+ }
155
+
156
+ if (operation === 'get') {
157
+ const id = textArg(args, 'task_id');
158
+ if (!id) throw new Error('WORKFLOW_SUPERVISOR_TASK_ID_REQUIRED');
159
+ const task = await getWorkflowSupervisorTask(forgeHome, id);
160
+ if (!task) return result({ taskId: id, status: 'not_found', summary: `Supervisor task ${id} not found.` }, true);
161
+ // Derived read-only projection: an effect that exhausted its mechanical
162
+ // retry/resume budget used to make the task silently leave the delivery
163
+ // queue. The stall state names the exact operator action that can move it.
164
+ const stall = await getWorkflowSupervisorTaskStall(forgeHome, id).catch(() => undefined);
165
+ return result({ task, completionContractSha256: workflowSupervisorCompletionContractSha256(task.completionContract), ...(stall ? { stall } : {}), summary: `Supervisor task ${id} retrieved${stall ? ` (${stall.state})` : ''}; canonical completion-contract CAS fingerprint included.` });
166
+ }
167
+
168
+ if (operation === 'proof') {
169
+ const activeReleaseId = textArg(args, 'active_release_id');
170
+ const notBefore = textArg(args, 'not_before');
171
+ if (!activeReleaseId) throw new Error('WORKFLOW_SUPERVISOR_PROOF_RELEASE_REQUIRED');
172
+ if (!notBefore) throw new Error('WORKFLOW_SUPERVISOR_PROOF_BOUNDARY_REQUIRED');
173
+ const proof = await getWorkflowSupervisorContinuationProof(forgeHome, { repoId, activeReleaseId, notBefore });
174
+ return result(proof
175
+ ? { proof, summary: `Standalone Supervisor continuation proof found for ${proof.taskId}.` }
176
+ : { status: 'not_found', summary: 'No matching CONTINUE -> CONTINUE -> DONE proof found.' }, !proof);
177
+ }
178
+
179
+ throw new Error(`WORKFLOW_SUPERVISOR_OPERATION_INVALID:${operation || '(missing)'}`);
180
+ }