@moretea-labs/forge 1.8.0 → 1.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (528) hide show
  1. package/AGENTS.md +70 -7
  2. package/CHANGELOG.md +14 -0
  3. package/CLAUDE.md +17 -2
  4. package/CONTRIBUTING.md +3 -2
  5. package/THIRD_PARTY_NOTICES.md +1 -1
  6. package/adapters/chatgpt/browser-delivery-host.ts +7 -1
  7. package/adapters/chatgpt/browser-delivery-runtime.ts +529 -56
  8. package/adapters/chatgpt/controller-binding-store.ts +101 -22
  9. package/adapters/chatgpt/controller-round-host.ts +15 -25
  10. package/adapters/chatgpt/controller-round-settlement-store.ts +58 -4
  11. package/adapters/chatgpt/provider-delivery.ts +228 -1
  12. package/adapters/chatgpt/work-conversation-binding-store.ts +79 -53
  13. package/adapters/computer/chatgpt-extension-target.ts +463 -0
  14. package/adapters/computer/chatgpt-target-router.ts +103 -0
  15. package/adapters/computer/chrome-extension/background.js +385 -0
  16. package/adapters/computer/chrome-extension/content.js +378 -0
  17. package/adapters/computer/chrome-extension/core.js +24 -0
  18. package/adapters/computer/chrome-extension/manifest.json +30 -0
  19. package/adapters/computer/desktop-operator-discovery.ts +11 -31
  20. package/adapters/computer/interaction-target-authority.ts +142 -18
  21. package/adapters/mcp/auth.ts +0 -1
  22. package/adapters/mcp/instructions.ts +5 -4
  23. package/adapters/mcp/multi-repository.ts +3 -19
  24. package/adapters/mcp/oauth.ts +73 -0
  25. package/adapters/mcp/paths.ts +4 -1
  26. package/adapters/mcp/runtime-gateway/automation-receipt-adapter.ts +87 -0
  27. package/adapters/mcp/runtime-gateway/bounded-result-runtime.ts +62 -0
  28. package/adapters/mcp/runtime-gateway/cognition-settlement.ts +201 -0
  29. package/adapters/mcp/runtime-gateway/context-adapter.ts +411 -73
  30. package/adapters/mcp/runtime-gateway/context-pack-sidecar.ts +91 -0
  31. package/adapters/mcp/runtime-gateway/controller-authority-adapter.ts +20 -5
  32. package/adapters/mcp/runtime-gateway/core-capability-adapter.ts +258 -0
  33. package/adapters/mcp/runtime-gateway/engineering-preconditions.ts +10 -27
  34. package/adapters/mcp/runtime-gateway/engineering-tool-contract.ts +15 -0
  35. package/adapters/mcp/runtime-gateway/execution-tools.ts +8 -42
  36. package/adapters/mcp/runtime-gateway/gateway-execution-adapter.ts +2 -1
  37. package/adapters/mcp/runtime-gateway/plugin-adapter.ts +117 -45
  38. package/adapters/mcp/runtime-gateway/process-tools.ts +190 -22
  39. package/adapters/mcp/runtime-gateway/protected-computer-adapter.ts +16 -4
  40. package/adapters/mcp/runtime-gateway/recovery-adapter.ts +69 -52
  41. package/adapters/mcp/runtime-gateway/repository-compat-adapter.ts +4 -35
  42. package/adapters/mcp/runtime-gateway/result-adapter.ts +10 -4
  43. package/adapters/mcp/runtime-gateway/router.ts +18 -504
  44. package/adapters/mcp/runtime-gateway/routing-policy.ts +499 -0
  45. package/adapters/mcp/runtime-gateway/runtime-observation-adapter.ts +14 -65
  46. package/adapters/mcp/runtime-gateway/runtime-readiness-observation.ts +218 -0
  47. package/adapters/mcp/runtime-gateway/runtime-tool-definitions.ts +113 -173
  48. package/adapters/mcp/runtime-gateway/runtime-tools.ts +15 -5
  49. package/adapters/mcp/runtime-gateway/scheduler-adapter.ts +1 -0
  50. package/adapters/mcp/runtime-gateway/shared-adapter.ts +20 -0
  51. package/adapters/mcp/runtime-gateway/status-inbox-adapter.ts +358 -266
  52. package/adapters/mcp/runtime-gateway/typescript-navigation-sidecar.ts +136 -0
  53. package/adapters/mcp/runtime-gateway/work-adapter.ts +261 -3122
  54. package/adapters/mcp/runtime-gateway/work-controller-operations.ts +257 -0
  55. package/adapters/mcp/runtime-gateway/work-detail-projection.ts +60 -0
  56. package/adapters/mcp/runtime-gateway/work-input-wire-migration.ts +246 -0
  57. package/adapters/mcp/runtime-gateway/work-learning-operations.ts +145 -0
  58. package/adapters/mcp/runtime-gateway/work-list-projection.ts +38 -0
  59. package/adapters/mcp/runtime-gateway/work-plan-operations.ts +382 -0
  60. package/adapters/mcp/runtime-gateway/work-repair-adapter.ts +308 -0
  61. package/adapters/mcp/runtime-gateway/work-requirement-operations.ts +148 -0
  62. package/adapters/mcp/runtime-gateway/work-semantic-operations.ts +263 -0
  63. package/adapters/mcp/runtime-gateway/work-workflow-operations.ts +113 -0
  64. package/adapters/mcp/runtime-gateway/workflow-supervisor-adapter.ts +156 -0
  65. package/adapters/mcp/server.ts +67 -23
  66. package/adapters/mcp/setup.ts +1 -3
  67. package/adapters/mcp/tool-mapping/legacy-tool-service.ts +44 -170
  68. package/adapters/mcp/tool-mapping/post-finalize-work-attribution.ts +4 -9
  69. package/adapters/mcp/tool-mapping/repository-tools.ts +133 -142
  70. package/adapters/mcp/toolset-names.ts +5 -0
  71. package/adapters/mcp/toolset.ts +6 -5
  72. package/adapters/mcp/transports/http-observation.ts +365 -0
  73. package/adapters/mcp/transports/http.ts +154 -677
  74. package/adapters/mcp/transports/oauth-http.ts +322 -0
  75. package/adapters/mcp/transports/session-registry.ts +6 -0
  76. package/adapters/mcp/tunnels/openai-secure-tunnel.ts +89 -5
  77. package/assets/plugin-registry.v1.json +6 -4
  78. package/assets/reference-configs/agentic-development-flow.md +25 -0
  79. package/assets/reference-configs/global-working-rules.md +19 -0
  80. package/assets/skill-version.json +2 -2
  81. package/docs/architecture/CURRENT.md +111 -41
  82. package/docs/architecture/decisions/20260803-release-identity-binding-and-exit-policy.md +14 -5
  83. package/docs/architecture/decisions/20260823-immediate-controller-relay.md +6 -3
  84. package/docs/architecture/decisions/20260907-assistant-learning-loop.md +2 -0
  85. package/docs/architecture/decisions/20260907-controller-round-transition-policy.md +19 -4
  86. package/docs/architecture/decisions/20260916-workflow-supervisor-authority.md +249 -0
  87. package/docs/architecture/decisions/20260917-cognitive-memory-foundation.md +82 -0
  88. package/docs/architecture/decisions/20260918-stable-candidate-release-lifecycle.md +221 -0
  89. package/docs/architecture/decisions/20260919-autonomous-work-liveness.md +62 -0
  90. package/docs/architecture/decisions/20260924-thin-semantic-working-context.md +72 -0
  91. package/docs/architecture/decisions/20261001-supervisor-turn-authority.md +237 -0
  92. package/docs/architecture/decisions/20261005-forge-v3-desktop-client-boundary.md +77 -0
  93. package/docs/architecture/domains/verification.md +1 -0
  94. package/docs/architecture/domains/workflow-engine.md +6 -0
  95. package/docs/architecture/modules/controller-runtime/transport-lifecycle.md +1 -1
  96. package/docs/forge-plugin-management.md +2 -2
  97. package/docs/operations/controller-performance-and-502.md +17 -0
  98. package/docs/operations/controller-reliability-runbook.md +2 -2
  99. package/docs/operations/features.md +1 -1
  100. package/docs/operations/features.zh-CN.md +1 -1
  101. package/docs/operations/homebrew.md +2 -2
  102. package/docs/operations/mcp-tool-exposure.md +2 -0
  103. package/docs/operations/releasing.md +2 -0
  104. package/docs/operations/standalone-disaster-recovery.md +14 -6
  105. package/docs/wiki/Implementation.md +1 -1
  106. package/package.json +25 -14
  107. package/packages/kernel/cognition/api/index.ts +6 -0
  108. package/packages/kernel/cognition/application/activation-service.ts +451 -0
  109. package/packages/kernel/cognition/application/consolidation-service.ts +185 -0
  110. package/packages/kernel/cognition/application/legacy-experience-adapter.ts +38 -0
  111. package/packages/kernel/cognition/application/memory-service.ts +64 -0
  112. package/packages/kernel/cognition/domain/learning.ts +106 -0
  113. package/packages/kernel/cognition/domain/memory.ts +254 -0
  114. package/packages/kernel/controller/api/index.ts +1 -0
  115. package/packages/kernel/controller/application/continuation-service.ts +281 -0
  116. package/packages/kernel/controller/application/controller-round-service.ts +12 -0
  117. package/packages/kernel/controller/domain/controller-round-transition-policy.ts +242 -21
  118. package/packages/kernel/controller/domain/controller-round.ts +4 -1
  119. package/packages/kernel/controller/domain/execution-quality.ts +3 -1
  120. package/packages/kernel/controller/infrastructure/controller-round-store.ts +689 -103
  121. package/packages/kernel/controller/infrastructure/controller-session-store.ts +297 -71
  122. package/packages/kernel/controller/ports/controller-host.ts +2 -0
  123. package/packages/kernel/identity/api/index.ts +10 -0
  124. package/packages/kernel/identity/domain/activity-projection.ts +43 -0
  125. package/packages/kernel/identity/domain/capability-broker.ts +60 -0
  126. package/packages/kernel/identity/domain/grant.ts +72 -0
  127. package/packages/kernel/identity/domain/owned-resource.ts +116 -0
  128. package/packages/kernel/identity/domain/user-request.ts +93 -0
  129. package/packages/kernel/identity/infrastructure/activity-projection-store.ts +77 -0
  130. package/packages/kernel/identity/infrastructure/capability-broker.ts +81 -0
  131. package/packages/kernel/identity/infrastructure/grant-store.ts +284 -0
  132. package/packages/kernel/identity/infrastructure/owned-resource-store.ts +259 -0
  133. package/packages/kernel/identity/infrastructure/user-request-store.ts +182 -0
  134. package/packages/kernel/scheduler/api/index.ts +0 -2
  135. package/packages/kernel/scheduler/application/schedule-service.ts +3 -0
  136. package/packages/kernel/scheduler/application/settlement.ts +0 -15
  137. package/packages/kernel/scheduler/domain/schedule.ts +87 -0
  138. package/packages/kernel/scheduler/infrastructure/schedule-store.ts +153 -133
  139. package/packages/kernel/work/api/index.ts +3 -2
  140. package/packages/kernel/work/application/work-service.ts +17 -42
  141. package/packages/kernel/work/domain/current-task-lineage.ts +104 -0
  142. package/packages/kernel/work/domain/engineering-design.ts +10 -5
  143. package/packages/kernel/work/domain/engineering-profile.ts +8 -12
  144. package/packages/kernel/work/domain/evaluation-promotion-receipt.ts +186 -0
  145. package/packages/kernel/work/domain/execution-concurrency.ts +19 -26
  146. package/packages/kernel/work/domain/execution-snapshot.ts +0 -31
  147. package/packages/kernel/work/domain/implementation-review.ts +14 -331
  148. package/packages/kernel/work/domain/objective-graph.ts +119 -0
  149. package/packages/kernel/work/domain/project-engineering-contract.ts +23 -1
  150. package/packages/kernel/work/domain/repository-completion-receipt.ts +1 -1
  151. package/packages/kernel/work/domain/state-machine.ts +25 -63
  152. package/packages/kernel/work/domain/types.ts +57 -51
  153. package/packages/kernel/work/infrastructure/work-contract-store.ts +819 -728
  154. package/packages/kernel/work/ports/work-contract-store.ts +5 -2
  155. package/packages/plugin-runtime/browser/session-authority.ts +2 -1
  156. package/packages/plugin-runtime/computer/chatgpt-identity.ts +24 -0
  157. package/packages/plugin-runtime/computer/conversation-target.ts +143 -0
  158. package/packages/plugin-runtime/computer/index.ts +2 -0
  159. package/packages/plugin-runtime/computer/target-authority.ts +26 -1
  160. package/packages/plugin-runtime/external/unix-jsonl-transport.ts +142 -18
  161. package/packages/protocols/computer/contract.ts +27 -1
  162. package/scripts/activate-source-baseline.ts +7 -9
  163. package/scripts/canary-controller-semantic-wait.ts +12 -24
  164. package/scripts/check-mcp-compatibility.ts +48 -136
  165. package/scripts/check-runtime-architecture.mjs +622 -217
  166. package/scripts/forge-local-recovery-helper.mjs +93 -15
  167. package/scripts/lib/project-init-lib.sh +3 -0
  168. package/scripts/open-source-audit-allowlist.txt +1 -2
  169. package/scripts/run-bounded-command.mjs +5 -0
  170. package/scripts/run-governed-gate.ts +0 -1
  171. package/scripts/run-mobile-monitor-bridge.ts +0 -1
  172. package/scripts/smoke-control-plane-failure-domain.ts +94 -0
  173. package/scripts/smoke-mcp-http-runtime.ts +5 -0
  174. package/scripts/smoke-runtime-recovery.ts +12 -43
  175. package/scripts/smoke-schedule-engine.ts +23 -15
  176. package/scripts/smoke-unattended-transport-recovery.ts +223 -0
  177. package/scripts/smoke-user-request-continuation-restart.ts +232 -0
  178. package/scripts/smoke-workflow-supervisor-chrome-adapter.ts +92 -0
  179. package/scripts/smoke-workflow-supervisor-process-restart.ts +276 -0
  180. package/scripts/smoke-workflow-supervisor-restart-recovery.ts +150 -0
  181. package/scripts/smoke-workflow-supervisor.ts +103 -0
  182. package/scripts/verify-forge-runtime.sh +2 -1
  183. package/src/cli/agent-jobs/executor-health.ts +11 -34
  184. package/src/cli/agent-jobs/integration.ts +18 -49
  185. package/src/cli/agent-jobs/job-manager.ts +7 -3
  186. package/src/cli/commands/brain-assistant.ts +27 -13
  187. package/src/cli/commands/brain.ts +13 -15
  188. package/src/cli/commands/chatgpt.ts +1 -163
  189. package/src/cli/commands/recovery.ts +135 -121
  190. package/src/cli/commands/runtime.ts +3 -3
  191. package/src/cli/commands/setup-profile.ts +8 -0
  192. package/src/cli/controller/check-runner.ts +13 -2
  193. package/src/cli/controller/completion-backlog.ts +3 -3
  194. package/src/cli/controller/completion-orchestrator.ts +4 -43
  195. package/src/cli/controller/completion-target.ts +3 -72
  196. package/src/cli/controller/context/source-materializer.ts +81 -100
  197. package/src/cli/controller/context-pack.ts +10 -8
  198. package/src/cli/controller/execution-completion.ts +4 -7
  199. package/src/cli/controller/execution-policy.ts +36 -153
  200. package/src/cli/controller/governance.ts +2 -3
  201. package/src/cli/controller/issue-store.ts +4 -99
  202. package/src/cli/controller/launch-agents.ts +59 -18
  203. package/src/cli/controller/operational-plan.ts +24 -51
  204. package/src/cli/controller/runtime-config.ts +5 -1
  205. package/src/cli/controller/stuck-state-migration.ts +2 -3
  206. package/src/cli/controller/systemd-user.ts +39 -1
  207. package/src/cli/editing/edit-session.ts +1 -7
  208. package/src/cli/local-bridge/console-automations.ts +18 -13
  209. package/src/cli/local-bridge/console-view-models.ts +3 -12
  210. package/src/cli/local-bridge/facade-api.ts +64 -191
  211. package/src/cli/local-bridge/server.ts +24 -147
  212. package/src/cli/local-bridge/types.ts +0 -1
  213. package/src/cli/mcp/oauth-client-retirement.ts +74 -0
  214. package/src/cli/repositories/command-executor.ts +29 -23
  215. package/src/cli/repositories/command-scope.ts +35 -16
  216. package/src/cli/repositories/controller-home.ts +48 -0
  217. package/src/cli/repositories/ephemeral-workspace.ts +20 -30
  218. package/src/cli/repositories/git-command-executor.ts +2 -2
  219. package/src/cli/repositories/registry.ts +77 -11
  220. package/src/cli/repositories/structured-git.ts +62 -2
  221. package/src/cli/repository/session-cache.ts +92 -6
  222. package/src/runtime/context/assistant-context.ts +20 -7
  223. package/src/runtime/context/assistant-work-context.ts +89 -27
  224. package/src/runtime/context/automatic-learning.ts +565 -0
  225. package/src/runtime/context/cognitive-attention.ts +173 -0
  226. package/src/runtime/context/cognitive-skill-canary.ts +158 -0
  227. package/src/runtime/context/context-closure.ts +46 -9
  228. package/src/runtime/context/context-pack-process.ts +103 -0
  229. package/src/runtime/context/context-plane.ts +1 -9
  230. package/src/runtime/context/direct-controller-learning.ts +298 -0
  231. package/src/runtime/context/semantic-navigation-contract.ts +9 -0
  232. package/src/runtime/context/semantic-navigation.ts +6 -34
  233. package/src/runtime/context/typescript-navigation-process.ts +145 -0
  234. package/src/runtime/context/typescript-navigation.ts +89 -3
  235. package/src/runtime/control-plane/cleanup-artifact-retention.ts +212 -9
  236. package/src/runtime/control-plane/concurrency/work-execution-concurrency.ts +9 -47
  237. package/src/runtime/control-plane/execution/controller-authority-recovery.ts +34 -4
  238. package/src/runtime/control-plane/execution/edit-validation-coordinator.ts +29 -20
  239. package/src/runtime/control-plane/execution/execution-identity.ts +23 -3
  240. package/src/runtime/control-plane/execution/repository-work-attribution.ts +7 -30
  241. package/src/runtime/control-plane/execution/retained-work-resume.ts +206 -199
  242. package/src/runtime/control-plane/execution/session-store.ts +31 -1
  243. package/src/runtime/control-plane/execution/validation.ts +6 -8
  244. package/src/runtime/control-plane/execution/work-authority-reconciler.ts +13 -42
  245. package/src/runtime/control-plane/execution/work-check-evidence.ts +137 -0
  246. package/src/runtime/control-plane/execution/work-completion-authority.ts +30 -85
  247. package/src/runtime/control-plane/execution/work-delivery-service.ts +497 -0
  248. package/src/runtime/control-plane/execution/work-evidence-policy.ts +12 -50
  249. package/src/runtime/control-plane/execution/work-execution-support.ts +50 -149
  250. package/src/runtime/control-plane/execution/work-handle-authority.ts +188 -109
  251. package/src/runtime/control-plane/execution/work-handle-store.ts +19 -43
  252. package/src/runtime/control-plane/execution/work-head-settlement.ts +53 -20
  253. package/src/runtime/control-plane/execution/work-lifecycle-audit.ts +52 -29
  254. package/src/runtime/control-plane/execution/work-operation-service.ts +43 -27
  255. package/src/runtime/control-plane/execution/work-preparation-service.ts +126 -266
  256. package/src/runtime/control-plane/execution/work-remote-delivery.ts +2 -3
  257. package/src/runtime/control-plane/execution/work-revision-diff.ts +39 -0
  258. package/src/runtime/control-plane/execution/work-terminal-cleanup.ts +173 -186
  259. package/src/runtime/control-plane/execution/work-validation-reconciler.ts +28 -84
  260. package/src/runtime/control-plane/execution/work-verification-service.ts +406 -50
  261. package/src/runtime/control-plane/execution/work-verification-snapshot.ts +5 -1
  262. package/src/runtime/control-plane/facade/capability-registry.ts +362 -37
  263. package/src/runtime/control-plane/facade/check-normalization.ts +3 -9
  264. package/src/runtime/control-plane/facade/codex-delegation.ts +10 -11
  265. package/src/runtime/control-plane/facade/controller-connection.ts +135 -0
  266. package/src/runtime/control-plane/facade/goal-workloop-access.ts +1 -20
  267. package/src/runtime/control-plane/facade/goal-workloop.ts +281 -1753
  268. package/src/runtime/control-plane/facade/handoff-inbox-application.ts +12 -25
  269. package/src/runtime/control-plane/facade/handoff-inbox-store.ts +256 -52
  270. package/src/runtime/control-plane/facade/index.ts +0 -1
  271. package/src/runtime/control-plane/facade/operation-digest.ts +12 -15
  272. package/src/runtime/control-plane/facade/plan-contract-store.ts +451 -991
  273. package/src/runtime/control-plane/facade/policy-gate.ts +0 -23
  274. package/src/runtime/control-plane/facade/repository-work-admission.ts +12 -22
  275. package/src/runtime/control-plane/facade/requirement-authority.ts +102 -199
  276. package/src/runtime/control-plane/facade/requirement-board.ts +3 -3
  277. package/src/runtime/control-plane/facade/rh-work-operation-contract.ts +51 -14
  278. package/src/runtime/control-plane/facade/self-healing-loop.ts +18 -53
  279. package/src/runtime/control-plane/facade/suggested-actions.ts +15 -18
  280. package/src/runtime/control-plane/facade/types.ts +49 -108
  281. package/src/runtime/control-plane/facade/work-continuation.ts +8 -8
  282. package/src/runtime/control-plane/generated-cache-retention.ts +97 -1
  283. package/src/runtime/control-plane/global-scheduler/autonomous-continuation.ts +248 -0
  284. package/src/runtime/control-plane/global-scheduler/durable-admission.ts +1 -1
  285. package/src/runtime/control-plane/global-scheduler/maintenance.ts +239 -112
  286. package/src/runtime/control-plane/global-scheduler/reconciliation.ts +2 -1
  287. package/src/runtime/control-plane/global-scheduler/scheduler.ts +66 -40
  288. package/src/runtime/control-plane/global-scheduler/wake-signal.ts +42 -2
  289. package/src/runtime/control-plane/governance/access-policy.ts +19 -2
  290. package/src/runtime/control-plane/governance/authorization.ts +20 -3
  291. package/src/runtime/control-plane/launcher/chatgpt-round-continuation.ts +63 -300
  292. package/src/runtime/control-plane/launcher/chatgpt-work-continuation.ts +28 -300
  293. package/src/runtime/control-plane/launcher/local-conversation-controller.ts +238 -0
  294. package/src/runtime/control-plane/launcher/provider-mcp-bootstrap.ts +5 -2
  295. package/src/runtime/control-plane/launcher/thin-launcher.ts +96 -240
  296. package/src/runtime/control-plane/persistence/cognition-store.ts +820 -0
  297. package/src/runtime/control-plane/persistence/experience-store.ts +162 -29
  298. package/src/runtime/control-plane/persistence/requirement-store.ts +216 -74
  299. package/src/runtime/control-plane/persistence/sqlite-store.ts +113 -6
  300. package/src/runtime/control-plane/release-retention.ts +135 -47
  301. package/src/runtime/control-plane/repository-namespace-retention.ts +2 -2
  302. package/src/runtime/control-plane/runtime-cleanup.ts +290 -21
  303. package/src/runtime/control-plane/workspace/project-onboarding.ts +80 -0
  304. package/src/runtime/control-plane/workspace/semantic-sync-service.ts +19 -5
  305. package/src/runtime/control-plane/workspace/workspace-store.ts +169 -0
  306. package/src/runtime/diagnostics/incident-repair.ts +313 -146
  307. package/src/runtime/diagnostics/mcp-timing.ts +114 -0
  308. package/src/runtime/evidence/artifact-store.ts +158 -40
  309. package/src/runtime/evidence/evidence-store.ts +112 -8
  310. package/src/runtime/evidence/output-handle-index.ts +225 -0
  311. package/src/runtime/evidence/result-store.ts +158 -44
  312. package/src/runtime/execution/jobs/store.ts +3 -4
  313. package/src/runtime/execution/managed-workspace.ts +57 -0
  314. package/src/runtime/execution/process-runtime/check-facade.ts +1 -1
  315. package/src/runtime/execution/process-runtime/check-result-retention.ts +2 -2
  316. package/src/runtime/execution/process-runtime/check-result.ts +105 -1
  317. package/src/runtime/execution/process-runtime/check-runner-sidecar.ts +18 -8
  318. package/src/runtime/execution/process-runtime/command-facade.ts +79 -27
  319. package/src/runtime/execution/process-runtime/gc.ts +15 -2
  320. package/src/runtime/execution/process-runtime/handle-index.ts +176 -0
  321. package/src/runtime/execution/process-runtime/host-command-lane.ts +139 -0
  322. package/src/runtime/execution/process-runtime/index.ts +3 -0
  323. package/src/runtime/execution/process-runtime/lightweight-managed.ts +251 -72
  324. package/src/runtime/execution/process-runtime/persisted-check.ts +3 -3
  325. package/src/runtime/execution/process-runtime/process-runner-entry.ts +47 -5
  326. package/src/runtime/execution/process-runtime/process-scope.ts +160 -0
  327. package/src/runtime/execution/process-runtime/resource-claims.ts +65 -61
  328. package/src/runtime/execution/process-runtime/runtime.ts +35 -2
  329. package/src/runtime/execution/process-runtime/store.ts +30 -2
  330. package/src/runtime/execution/process-runtime/types.ts +6 -1
  331. package/src/runtime/execution/workers/executor.ts +2 -6
  332. package/src/runtime/platform/service-inventory.ts +130 -0
  333. package/src/runtime/platform/service-manager.ts +8 -0
  334. package/src/runtime/plugins/action-application.ts +85 -28
  335. package/src/runtime/plugins/app-store-connect-adapter.ts +38 -14
  336. package/src/runtime/plugins/browser-adapter.ts +757 -34
  337. package/src/runtime/plugins/browser-automation-service.ts +23 -3
  338. package/src/runtime/plugins/browser-macos-bridge.ts +321 -29
  339. package/src/runtime/plugins/browser-manifest-surface.ts +45 -11
  340. package/src/runtime/plugins/browser-native-session-service.ts +63 -13
  341. package/src/runtime/plugins/browser-registration.ts +16 -0
  342. package/src/runtime/plugins/browser-runtime.ts +14 -1
  343. package/src/runtime/plugins/browser-session-authority.ts +2 -2
  344. package/src/runtime/plugins/browser-session-store.ts +46 -76
  345. package/src/runtime/plugins/capability-authorization-grants.ts +258 -62
  346. package/src/runtime/plugins/computer-chatgpt-browser-adapter-installer.ts +219 -0
  347. package/src/runtime/plugins/computer-chatgpt-macos-target.ts +891 -0
  348. package/src/runtime/plugins/computer-registration.ts +222 -11
  349. package/src/runtime/plugins/desktop-operator-external-policy.ts +36 -4
  350. package/src/runtime/plugins/desktop-operator-registration.ts +12 -4
  351. package/src/runtime/plugins/external-adapter.ts +42 -6
  352. package/src/runtime/plugins/external-registration.ts +21 -1
  353. package/src/runtime/plugins/gmail-adapter.ts +23 -2
  354. package/src/runtime/plugins/google-calendar-adapter.ts +2 -2
  355. package/src/runtime/plugins/google-shared.ts +14 -7
  356. package/src/runtime/plugins/google-tasks-adapter.ts +2 -2
  357. package/src/runtime/plugins/ios-adapter.ts +1 -1
  358. package/src/runtime/plugins/lightweight-action.ts +208 -2
  359. package/src/runtime/plugins/local-system-adapter.ts +12 -2
  360. package/src/runtime/plugins/managed-process-adapter.ts +12 -5
  361. package/src/runtime/plugins/plugin-action-sidecar.ts +17 -13
  362. package/src/runtime/plugins/plugin-management-adapter.ts +1 -1
  363. package/src/runtime/plugins/store.ts +602 -428
  364. package/src/runtime/plugins/types.ts +20 -0
  365. package/src/runtime/plugins/xiaohongshu-publish.ts +16 -0
  366. package/src/runtime/projections/invalidation.ts +7 -3
  367. package/src/runtime/projections/materialized-view.ts +80 -36
  368. package/src/runtime/recovery/actions.ts +3 -3
  369. package/src/runtime/recovery/capability-action-application.ts +46 -45
  370. package/src/runtime/recovery/lifecycle-inventory.ts +29 -29
  371. package/src/runtime/recovery/maintenance-executor.ts +374 -123
  372. package/src/runtime/recovery/store.ts +29 -11
  373. package/src/runtime/release/release-coordinator.ts +296 -0
  374. package/src/runtime/release/release-session.ts +716 -0
  375. package/src/runtime/release/release-state-migration.ts +25 -0
  376. package/src/runtime/resources/leases/store.ts +56 -25
  377. package/src/runtime/root/computer-composition.ts +191 -6
  378. package/src/runtime/root/controller-progression-composition.ts +192 -0
  379. package/src/runtime/root/controller-round-composition.ts +20 -1
  380. package/src/runtime/root/deployment-topology.ts +106 -0
  381. package/src/runtime/root/entry.ts +4 -3
  382. package/src/runtime/root/known-good-recovery.ts +184 -0
  383. package/src/runtime/root/local-bridge.ts +0 -1
  384. package/src/runtime/root/mcp-transport.ts +111 -18
  385. package/src/runtime/root/ownership.ts +261 -9
  386. package/src/runtime/root/package-connector-service.ts +105 -19
  387. package/src/runtime/root/package-runtime-release.ts +117 -18
  388. package/src/runtime/root/package-runtime-service.ts +17 -11
  389. package/src/runtime/root/release-execution-canary.ts +44 -12
  390. package/src/runtime/root/release-loader.ts +90 -8
  391. package/src/runtime/root/release-manifest.ts +80 -6
  392. package/src/runtime/root/release-materialize.ts +372 -28
  393. package/src/runtime/root/release-store.ts +395 -36
  394. package/src/runtime/root/runtime-lane.ts +191 -0
  395. package/src/runtime/root/runtime.ts +159 -27
  396. package/src/runtime/root/scheduled-controller-composition.ts +28 -3
  397. package/src/runtime/root/service-runner.ts +2 -2
  398. package/src/runtime/root/service.ts +36 -33
  399. package/src/runtime/root/status.ts +48 -0
  400. package/src/runtime/root/types.ts +32 -3
  401. package/src/runtime/root/workflow-supervisor-composition.ts +493 -0
  402. package/src/runtime/root/workflow-supervisor-runtime.ts +209 -0
  403. package/src/runtime/root/write-fence.ts +50 -2
  404. package/src/runtime/safe-tooling/google-credential-store.ts +76 -21
  405. package/src/runtime/safe-tooling/google-oauth-broker.ts +25 -7
  406. package/src/runtime/safe-tooling/workspace-auth.ts +1 -1
  407. package/src/runtime/shared/bounded-child-supervisor.ts +9 -1
  408. package/src/runtime/shared/process-environment.ts +20 -9
  409. package/src/runtime/shared/response-budget.ts +1 -3
  410. package/src/runtime/standalone-recovery/controller-home-migration.ts +16 -24
  411. package/src/runtime/standalone-recovery/core.ts +3702 -342
  412. package/src/runtime/standalone-recovery/entry.ts +469 -39
  413. package/src/runtime/standalone-recovery/installer.ts +262 -148
  414. package/src/runtime/standalone-recovery/mcp-server.ts +29 -193
  415. package/src/runtime/standalone-recovery/operation-lock.ts +1 -1
  416. package/src/runtime/standalone-recovery/performance.ts +54 -16
  417. package/src/runtime/standalone-recovery/release.ts +53 -5
  418. package/src/runtime/standalone-recovery/service-labels.ts +5 -2
  419. package/src/runtime/standalone-recovery/watchdog-heartbeat.ts +5 -2
  420. package/src/runtime/workflow/schedules/browser-probe.ts +17 -6
  421. package/src/runtime/workflow/schedules/chatgpt-automation-migration.ts +10 -3
  422. package/src/runtime/workflow/schedules/engine.ts +138 -172
  423. package/src/runtime/workflow/schedules/work-continuation.ts +44 -5
  424. package/src/runtime/workflows/runtime.ts +15 -19
  425. package/src/testing/test-governance.ts +5 -1
  426. package/supervisor/chatgpt-conversation.ts +23 -0
  427. package/supervisor/client.ts +201 -0
  428. package/supervisor/control-plane.ts +868 -0
  429. package/supervisor/entry.ts +15 -0
  430. package/supervisor/forge-validators.ts +80 -0
  431. package/supervisor/index.ts +5 -0
  432. package/supervisor/native-browser-adapter.ts +786 -0
  433. package/supervisor/native-messaging/host.ts +39 -0
  434. package/supervisor/native-messaging/manifest.ts +26 -0
  435. package/supervisor/native-messaging/protocol.ts +27 -0
  436. package/supervisor/paths.ts +18 -0
  437. package/supervisor/protocol.ts +202 -0
  438. package/supervisor/server.ts +404 -0
  439. package/supervisor/store.ts +1451 -0
  440. package/supervisor/tsconfig.json +8 -0
  441. package/supervisor/types.ts +255 -0
  442. package/adapters/chatgpt/controller-host.ts +0 -119
  443. package/adapters/mcp/controller-round-compatibility.ts +0 -184
  444. package/adapters/mcp/frozen-client-semantic-compatibility.ts +0 -292
  445. package/adapters/mcp/runtime-gateway/work-compat-adapter.ts +0 -502
  446. package/packages/kernel/progression/api/index.ts +0 -2
  447. package/packages/kernel/progression/application/projector.ts +0 -211
  448. package/packages/kernel/progression/domain/types.ts +0 -116
  449. package/packages/kernel/progression/index.ts +0 -1
  450. package/packages/kernel/scheduler/application/continuation-service.ts +0 -212
  451. package/packages/kernel/scheduler/domain/continuation.ts +0 -38
  452. package/packages/kernel/scheduler/infrastructure/continuation-dispatch-store.ts +0 -38
  453. package/packages/kernel/work/domain/admission-policy.ts +0 -34
  454. package/scripts/benchmark-background-check-overlap.ts +0 -228
  455. package/scripts/benchmark-computer-hotpath.ts +0 -255
  456. package/scripts/benchmark-controller-hotpath.ts +0 -212
  457. package/scripts/benchmark-controller-round2.ts +0 -191
  458. package/scripts/benchmark-ios-agent-device.ts +0 -511
  459. package/scripts/benchmark-mcp-host.sh +0 -117
  460. package/scripts/benchmark-mcp-transport.ts +0 -169
  461. package/scripts/benchmark-operational-memory-activation.ts +0 -235
  462. package/scripts/benchmark-operational-shadow.ts +0 -28
  463. package/scripts/benchmark-quality-harness.ts +0 -146
  464. package/scripts/benchmark-route-session-concurrency.ts +0 -915
  465. package/scripts/benchmark-thin-harness-gateway-ab.ts +0 -632
  466. package/scripts/benchmark-thin-harness-mcp-e2e.ts +0 -498
  467. package/scripts/benchmark-thin-harness.ts +0 -251
  468. package/scripts/benchmark-typescript-navigation.ts +0 -186
  469. package/scripts/benchmark-work-efficiency.ts +0 -334
  470. package/scripts/build-controller-ui.ts +0 -28
  471. package/scripts/check-npm-release.sh +0 -32
  472. package/scripts/check-public-release-surface.sh +0 -19
  473. package/scripts/check-release-published.sh +0 -57
  474. package/scripts/check-release-readiness.sh +0 -37
  475. package/scripts/check-release-version.mjs +0 -74
  476. package/scripts/check-tarball-install-smoke.sh +0 -150
  477. package/scripts/package-source-archive.sh +0 -147
  478. package/scripts/public-release-files.txt +0 -39
  479. package/scripts/public-release.ts +0 -174
  480. package/scripts/publish-release-tarball.sh +0 -27
  481. package/scripts/route-nl-vs-ts-eval.ts +0 -679
  482. package/scripts/stage-runtime-release.ts +0 -44
  483. package/src/cli/controller/progress.ts +0 -656
  484. package/src/cli/controller/work-mode.ts +0 -181
  485. package/src/cli/local-bridge/console-assets.ts +0 -17
  486. package/src/cli/local-bridge/dashboard.ts +0 -17
  487. package/src/cli/local-bridge/frontend/src/App.tsx +0 -10
  488. package/src/cli/local-bridge/frontend/src/components/Button.tsx +0 -1
  489. package/src/cli/local-bridge/frontend/src/components/DetailPane.tsx +0 -3
  490. package/src/cli/local-bridge/frontend/src/components/SearchField.tsx +0 -1
  491. package/src/cli/local-bridge/frontend/src/components/SectionHeader.tsx +0 -1
  492. package/src/cli/local-bridge/frontend/src/components/Segmented.tsx +0 -1
  493. package/src/cli/local-bridge/frontend/src/components/StatusText.tsx +0 -3
  494. package/src/cli/local-bridge/frontend/src/design/icons.tsx +0 -11
  495. package/src/cli/local-bridge/frontend/src/design/tokens.css +0 -8
  496. package/src/cli/local-bridge/frontend/src/features/automations/AutomationsView.tsx +0 -153
  497. package/src/cli/local-bridge/frontend/src/features/capabilities/CapabilitiesView.tsx +0 -37
  498. package/src/cli/local-bridge/frontend/src/features/overview/OverviewView.tsx +0 -183
  499. package/src/cli/local-bridge/frontend/src/features/repositories/RepositoriesView.tsx +0 -2
  500. package/src/cli/local-bridge/frontend/src/features/system/SystemView.tsx +0 -2
  501. package/src/cli/local-bridge/frontend/src/features/work/WorkView.tsx +0 -4
  502. package/src/cli/local-bridge/frontend/src/lib/api.ts +0 -30
  503. package/src/cli/local-bridge/frontend/src/lib/format.ts +0 -4
  504. package/src/cli/local-bridge/frontend/src/lib/routes.ts +0 -7
  505. package/src/cli/local-bridge/frontend/src/main.tsx +0 -1
  506. package/src/cli/local-bridge/frontend/src/shell/AppShell.tsx +0 -1
  507. package/src/cli/local-bridge/frontend/src/shell/CommandBar.tsx +0 -2
  508. package/src/cli/local-bridge/frontend/src/shell/Sidebar.tsx +0 -4
  509. package/src/cli/local-bridge/frontend/src/styles.css +0 -28
  510. package/src/cli/local-bridge/frontend/src/types.ts +0 -15
  511. package/src/cli/local-bridge/frontend/src/vite-env.d.ts +0 -1
  512. package/src/cli/local-bridge/frontend/vite.config.ts +0 -27
  513. package/src/cli/local-bridge/ui-dist/app.css +0 -1
  514. package/src/cli/local-bridge/ui-dist/app.js +0 -11228
  515. package/src/runtime/control-plane/execution/content-equivalent-commit-authority.ts +0 -169
  516. package/src/runtime/control-plane/execution/direct-canonical-work-reconciliation.ts +0 -85
  517. package/src/runtime/control-plane/execution/direct-edit-work-completion.ts +0 -655
  518. package/src/runtime/control-plane/execution/work-finalization-service.ts +0 -2850
  519. package/src/runtime/control-plane/execution/work-path-scope.ts +0 -37
  520. package/src/runtime/control-plane/execution/work-task-receipt.ts +0 -468
  521. package/src/runtime/control-plane/facade/controller-round-relay.ts +0 -3
  522. package/src/runtime/control-plane/facade/work-admission-policy.ts +0 -142
  523. package/src/runtime/control-plane/facade/work-implementation-review.ts +0 -2
  524. package/src/runtime/control-plane/facade/work-state-machine.ts +0 -2
  525. package/src/runtime/control-plane/facade/work-task-projection.ts +0 -66
  526. package/src/runtime/control-plane/routing/index.ts +0 -1
  527. package/src/runtime/control-plane/routing/route-policy.ts +0 -401
  528. package/src/runtime/control-plane/routing/workspace-admission.ts +0 -70
@@ -1,66 +0,0 @@
1
- import type { ControllerTask, TaskStatus } from '../../../cli/controller/types';
2
- import { isRepositoryCompletionReceipt, type WorkContract, type WorkRisk } from './types';
3
-
4
- /**
5
- * Legacy Task statuses are a read-model vocabulary. They are intentionally
6
- * derived from Work and never fed back into Work or Requirement state.
7
- */
8
- export function taskStatusFromWork(work: Pick<WorkContract, 'status' | 'phase'>): TaskStatus {
9
- if (work.status === 'completed') return 'done';
10
- if (work.status === 'cancelled') return 'cancelled';
11
- if (work.status === 'failed') return 'changes_requested';
12
- if (work.status === 'blocked') return 'blocked';
13
- if (work.status === 'running') {
14
- return work.phase === 'verification' ? 'verifying' : work.phase === 'delivery' ? 'integrating' : work.phase === 'cleanup' ? 'cleanup_pending' : 'running';
15
- }
16
- if (work.status === 'ready') return 'ready_to_integrate';
17
- return 'planned';
18
- }
19
-
20
- function workRiskToTaskRisk(risk: WorkRisk): ControllerTask['risk'] {
21
- return risk;
22
- }
23
-
24
- /**
25
- * Project one Work into the old ControllerTask shape for compatibility UIs and
26
- * readers. The source Task object is not mutated and its duplicated contract
27
- * fields are never consulted by this projection.
28
- */
29
- export function projectControllerTaskFromWork(
30
- task: ControllerTask,
31
- work: WorkContract,
32
- ): ControllerTask {
33
- const projected: ControllerTask = {
34
- ...task,
35
- workId: work.workId,
36
- objective: work.objective,
37
- allowedPaths: [...work.allowedPaths],
38
- forbiddenPaths: [...work.forbiddenPaths],
39
- checks: [...work.checks],
40
- acceptanceCriteria: [...work.acceptanceCriteria],
41
- risk: workRiskToTaskRisk(work.risk),
42
- // A reviewed legacy outcome is user-facing evidence. Historical failed or
43
- // cancelled execution facts cannot move it backwards.
44
- status: task.status === 'done' && work.status !== 'completed' ? 'done' : taskStatusFromWork(work),
45
- };
46
- if (work.completionReceipt && projected.verification && isRepositoryCompletionReceipt(work.completionReceipt)) {
47
- projected.verification = {
48
- ...projected.verification,
49
- completionReceipt: work.completionReceipt,
50
- };
51
- }
52
- return projected;
53
- }
54
-
55
- export function taskExecutionContractFromWork(work: WorkContract): Pick<ControllerTask, 'workId' | 'objective' | 'allowedPaths' | 'forbiddenPaths' | 'checks' | 'acceptanceCriteria' | 'risk' | 'status'> {
56
- return {
57
- workId: work.workId,
58
- objective: work.objective,
59
- allowedPaths: [...work.allowedPaths],
60
- forbiddenPaths: [...work.forbiddenPaths],
61
- checks: [...work.checks],
62
- acceptanceCriteria: [...work.acceptanceCriteria],
63
- risk: workRiskToTaskRisk(work.risk),
64
- status: taskStatusFromWork(work),
65
- };
66
- }
@@ -1 +0,0 @@
1
- export * from './route-policy';
@@ -1,401 +0,0 @@
1
- import { createHash } from 'crypto';
2
-
3
- export const ROUTE_POLICY_VERSION = 'route-policy-v5' as const;
4
-
5
- export type RouteExecutionMode = 'direct_control' | 'goal_workloop' | 'handoff_only';
6
- export type RouteWorkMode = 'direct_edit' | 'bounded_work' | 'quick_agent' | 'issue_task';
7
- export type RouteExecutionPath = 'fast' | 'durable';
8
- export type RouteExecutorKind = 'direct_edit' | 'local_cli' | 'remote_api' | 'cloud_agent' | 'external_controller' | 'handoff_only';
9
- export type RouteApprovalState = 'approval_not_required' | 'normal_authorization_required' | 'strong_confirmation_required' | 'blocked_by_policy';
10
- export type ExplicitTaskMode = 'direct' | 'plan' | 'debug' | 'review' | 'release' | 'scale';
11
-
12
- export interface RouteReason {
13
- code: string;
14
- message: string;
15
- }
16
-
17
- export interface RouteContextHints {
18
- preferredProviderId?: string;
19
- allowedProviderIds?: readonly string[];
20
- forbiddenProviderIds?: readonly string[];
21
- }
22
-
23
- export interface RouteProviderSnapshot {
24
- providerId: string;
25
- kind: 'direct_edit' | 'local_cli' | 'remote_api' | 'cloud_agent' | 'handoff_only';
26
- status: string;
27
- capabilities: readonly string[];
28
- directDispatch: boolean;
29
- }
30
-
31
- export interface RoutePolicyInput {
32
- intent: {
33
- objective: string;
34
- scopeClear: boolean;
35
- mutation?: boolean;
36
- taskIntent?: string;
37
- expectedFiles?: number;
38
- expectedChangedLines?: number;
39
- requiresInvestigation?: boolean;
40
- requiresLongRunningChecks?: boolean;
41
- requiresParallelism?: boolean;
42
- needsDependencies?: boolean;
43
- requiresIndependentDeliverables?: boolean;
44
- independentTaskCount?: number;
45
- agentRequested?: boolean;
46
- /** Explicit operator mode. It overrides heuristic topology, never policy gates. */
47
- explicitMode?: ExplicitTaskMode;
48
- preferredProviderId?: string;
49
- allowedProviderIds?: readonly string[];
50
- forbiddenProviderIds?: readonly string[];
51
- lastProviderId?: string;
52
- lastFailureClass?: string;
53
- };
54
- workspace: {
55
- knownPaths?: readonly string[];
56
- dirty?: boolean;
57
- checkoutId?: string;
58
- fingerprint?: string;
59
- /** Canonical typed placement constraint resolved before routing. */
60
- placement?: 'current' | 'isolated' | 'auto';
61
- /** Admission fence: Direct Control/current-main mutation is not permitted. */
62
- directMainProhibited?: boolean;
63
- };
64
- policy: {
65
- risk?: string;
66
- policyBlocked?: boolean;
67
- requiresApproval?: boolean;
68
- requiresUserApproval?: boolean;
69
- approvalConfirmed?: boolean;
70
- destructive?: boolean;
71
- remoteWrite?: boolean;
72
- secretAccess?: boolean;
73
- };
74
- capabilities: {
75
- requiresWorker?: boolean;
76
- requiresExternalEffect?: boolean;
77
- requiredProviderCapabilities?: readonly string[];
78
- providers?: readonly RouteProviderSnapshot[];
79
- routingOrders?: Readonly<Record<string, readonly string[] | undefined>>;
80
- defaultProviders?: Readonly<Record<string, string | undefined>>;
81
- };
82
- recovery: {
83
- required?: boolean;
84
- isolationRequired?: boolean;
85
- };
86
- }
87
-
88
- export interface RouteDecision {
89
- executionMode: RouteExecutionMode;
90
- executorKind: RouteExecutorKind;
91
- selectedProviderId: string | null;
92
- workMode: RouteWorkMode;
93
- executionPath: RouteExecutionPath;
94
- requiresWork: boolean;
95
- requiresApproval: boolean;
96
- requiresIsolation: boolean;
97
- requiresRecovery: boolean;
98
- createHandoff: boolean;
99
- waitForUser: boolean;
100
- approvalState: RouteApprovalState;
101
- alternatives: string[];
102
- reasons: RouteReason[];
103
- inputFingerprint: string;
104
- policyVersion: typeof ROUTE_POLICY_VERSION;
105
- }
106
-
107
- const PROTECTED_PATH = /(^|\/)(\.github|\.git|.*\.xcodeproj|.*\.xcworkspace)(\/|$)/;
108
-
109
- function canonical(value: unknown): unknown {
110
- if (Array.isArray(value)) return value.map(canonical);
111
- if (!value || typeof value !== 'object') return value;
112
- return Object.fromEntries(Object.entries(value as Record<string, unknown>)
113
- .filter(([, item]) => item !== undefined)
114
- .sort(([left], [right]) => left.localeCompare(right))
115
- .map(([key, item]) => [key, canonical(item)]));
116
- }
117
-
118
- export function routePolicyInputFingerprint(input: RoutePolicyInput): string {
119
- return createHash('sha256').update(JSON.stringify(canonical(input))).digest('hex');
120
- }
121
-
122
- export function applyRouteContextHints(input: RoutePolicyInput, hints: RouteContextHints | undefined): RoutePolicyInput {
123
- if (!hints) return input;
124
- return {
125
- ...input,
126
- intent: {
127
- ...input.intent,
128
- preferredProviderId: input.intent.preferredProviderId ?? hints.preferredProviderId,
129
- allowedProviderIds: input.intent.allowedProviderIds ?? hints.allowedProviderIds,
130
- forbiddenProviderIds: input.intent.forbiddenProviderIds ?? hints.forbiddenProviderIds,
131
- },
132
- };
133
- }
134
-
135
- function ready(provider: RouteProviderSnapshot, required: readonly string[]): boolean {
136
- return provider.directDispatch
137
- && provider.status === 'ready'
138
- && provider.kind !== 'handoff_only'
139
- && provider.providerId !== 'chatgpt_handoff'
140
- && required.every((capability) => provider.capabilities.includes(capability));
141
- }
142
-
143
- function routingKey(input: RoutePolicyInput): string {
144
- const taskIntent = input.intent.taskIntent ?? 'implementation';
145
- const failure = input.intent.lastFailureClass;
146
- const repair = taskIntent === 'code_repair'
147
- || taskIntent === 'verification_repair'
148
- || failure === 'test_failure'
149
- || failure === 'typecheck_failure'
150
- || failure === 'source_defect'
151
- || (input.intent.lastProviderId === 'codex_cli' && (failure === 'provider_unavailable' || failure === 'unknown'));
152
- if (taskIntent === 'deterministic_edit') return 'deterministic_edit';
153
- if (repair) return 'repair';
154
- if (taskIntent === 'architecture_planning') return 'planning';
155
- if (taskIntent === 'review') return 'review';
156
- if (taskIntent === 'browser_automation') return 'browser_planning';
157
- if (taskIntent === 'ios_build_or_sim') return 'ios_analysis';
158
- return 'implementation';
159
- }
160
-
161
- const KIND_RANK: Record<RouteProviderSnapshot['kind'], number> = {
162
- direct_edit: 0,
163
- local_cli: 10,
164
- remote_api: 20,
165
- cloud_agent: 30,
166
- handoff_only: 90,
167
- };
168
-
169
- const PREFERRED_CAPABILITY: Record<string, string | undefined> = {
170
- deterministic_edit: 'code_patch',
171
- implementation: 'code_patch',
172
- repair: 'test_failure_repair',
173
- planning: 'architecture_planning',
174
- review: 'code_review',
175
- browser_planning: 'browser_planning',
176
- ios_analysis: 'ios_log_analysis',
177
- };
178
-
179
- function providerOrder(input: RoutePolicyInput, key: string, providers: readonly RouteProviderSnapshot[]): string[] {
180
- const configured = input.capabilities.routingOrders?.[key];
181
- let order = configured?.length
182
- ? [...configured]
183
- : providers
184
- .map((provider, index) => ({ provider, index }))
185
- .filter(({ provider }) => provider.kind !== 'handoff_only' && provider.providerId !== 'chatgpt_handoff')
186
- .filter(({ provider }) => key === 'deterministic_edit' || provider.kind !== 'direct_edit')
187
- .sort((left, right) => {
188
- const preferred = PREFERRED_CAPABILITY[key];
189
- const leftSupports = preferred ? left.provider.capabilities.includes(preferred) : true;
190
- const rightSupports = preferred ? right.provider.capabilities.includes(preferred) : true;
191
- if (leftSupports !== rightSupports) return leftSupports ? -1 : 1;
192
- return KIND_RANK[left.provider.kind] - KIND_RANK[right.provider.kind]
193
- || left.index - right.index
194
- || left.provider.providerId.localeCompare(right.provider.providerId);
195
- })
196
- .map(({ provider }) => provider.providerId);
197
- const configuredDefault = input.capabilities.defaultProviders?.[key];
198
- if (configuredDefault && configuredDefault !== 'chatgpt_handoff') {
199
- order = [configuredDefault, ...order.filter((providerId) => providerId !== configuredDefault)];
200
- }
201
- if (input.intent.preferredProviderId) {
202
- order = [input.intent.preferredProviderId, ...order.filter((providerId) => providerId !== input.intent.preferredProviderId)];
203
- }
204
- if (key === 'repair' && input.intent.lastProviderId) {
205
- order = [...order.filter((providerId) => providerId !== input.intent.lastProviderId), input.intent.lastProviderId];
206
- }
207
- return [...new Set([...order, 'chatgpt_handoff'])];
208
- }
209
-
210
- function selectProvider(input: RoutePolicyInput): { provider: RouteProviderSnapshot | null; alternatives: string[]; key: string } {
211
- const providers = input.capabilities.providers;
212
- if (!providers) return { provider: null, alternatives: [], key: routingKey(input) };
213
- const required = input.capabilities.requiredProviderCapabilities ?? [];
214
- const allowed = new Set(input.intent.allowedProviderIds ?? []);
215
- const forbidden = new Set(input.intent.forbiddenProviderIds ?? []);
216
- const alternatives = providers
217
- .filter((provider) => ready(provider, required))
218
- .filter((provider) => !forbidden.has(provider.providerId))
219
- .filter((provider) => allowed.size === 0 || allowed.has(provider.providerId))
220
- .map((provider) => provider.providerId)
221
- .sort();
222
- const key = routingKey(input);
223
- const byId = new Map(providers.map((provider) => [provider.providerId, provider]));
224
- for (const providerId of providerOrder(input, key, providers)) {
225
- if (providerId === 'chatgpt_handoff' || forbidden.has(providerId)) continue;
226
- if (allowed.size > 0 && !allowed.has(providerId)) continue;
227
- const provider = byId.get(providerId);
228
- if (provider && ready(provider, required)) return { provider, alternatives, key };
229
- }
230
- const fallback = input.capabilities.routingOrders?.fallback ?? [];
231
- for (const providerId of fallback) {
232
- if (forbidden.has(providerId) || (allowed.size > 0 && !allowed.has(providerId))) continue;
233
- const provider = byId.get(providerId);
234
- if (provider && ready(provider, required)) return { provider, alternatives, key: 'fallback' };
235
- }
236
- return { provider: null, alternatives, key };
237
- }
238
-
239
- function decisionBase(input: RoutePolicyInput, reasons: RouteReason[]): Pick<RouteDecision, 'inputFingerprint' | 'policyVersion' | 'reasons'> {
240
- return { inputFingerprint: routePolicyInputFingerprint(input), policyVersion: ROUTE_POLICY_VERSION, reasons };
241
- }
242
-
243
- export function decideRoute(input: RoutePolicyInput): RouteDecision {
244
- const reasons: RouteReason[] = [];
245
- const objective = input.intent.objective.trim();
246
- const paths = [...new Set((input.workspace.knownPaths ?? []).map((path) => path.trim()).filter(Boolean))].sort();
247
- const expectedFiles = Math.max(0, Math.trunc(input.intent.expectedFiles ?? paths.length));
248
- const expectedChangedLines = Math.max(0, Math.trunc(input.intent.expectedChangedLines ?? 0));
249
- const independentTaskCount = Math.max(0, Math.trunc(input.intent.independentTaskCount ?? 0));
250
- const risk = input.policy.risk ?? (input.intent.mutation === false ? 'readonly' : 'local_repo_write');
251
- const mutation = input.intent.mutation ?? risk !== 'readonly';
252
- const destructive = input.policy.destructive === true || risk === 'destructive' || risk === 'destructive_remote';
253
- const remoteWrite = input.policy.remoteWrite === true || risk === 'remote_write' || risk === 'destructive_remote';
254
- const secretAccess = input.policy.secretAccess === true || risk === 'raw_secret_config';
255
- const approvalRequired = input.policy.requiresApproval === true || input.policy.requiresUserApproval === true || destructive || remoteWrite || secretAccess;
256
- const approvalConfirmed = input.policy.approvalConfirmed === true;
257
- const protectedPath = paths.some((path) => PROTECTED_PATH.test(path));
258
- const explicitMode = input.intent.explicitMode;
259
- const explicitParallelMode = explicitMode === 'scale';
260
- const placementIsolationRequired = input.workspace.placement === 'isolated'
261
- || input.workspace.directMainProhibited === true;
262
- const requiresIsolation = placementIsolationRequired
263
- || input.recovery.isolationRequired === true
264
- || explicitParallelMode;
265
- const requiresRecovery = input.recovery.required === true
266
- || explicitMode === 'release'
267
- || explicitMode === 'scale';
268
- const coordinationRequired = explicitParallelMode || input.intent.requiresIndependentDeliverables === true
269
- || independentTaskCount >= 3;
270
-
271
- if (input.policy.policyBlocked === true) {
272
- reasons.push({ code: 'policy_blocked', message: 'Policy blocks execution until authorization or scope changes.' });
273
- return {
274
- executionMode: 'handoff_only', executorKind: 'handoff_only', selectedProviderId: null,
275
- workMode: 'direct_edit', executionPath: 'durable', requiresWork: false, requiresApproval: true,
276
- requiresIsolation, requiresRecovery, createHandoff: true, waitForUser: true,
277
- approvalState: 'blocked_by_policy', alternatives: [], ...decisionBase(input, reasons),
278
- };
279
- }
280
- if (!objective) {
281
- reasons.push({ code: 'objective_missing', message: 'A non-empty objective is required before execution.' });
282
- return {
283
- executionMode: 'handoff_only', executorKind: 'handoff_only', selectedProviderId: null,
284
- workMode: 'direct_edit', executionPath: 'durable', requiresWork: false, requiresApproval: false,
285
- requiresIsolation, requiresRecovery, createHandoff: true, waitForUser: true,
286
- approvalState: 'approval_not_required', alternatives: [], ...decisionBase(input, reasons),
287
- };
288
- }
289
- if (input.policy.requiresUserApproval === true && !approvalConfirmed) {
290
- reasons.push({ code: 'user_decision_required', message: 'The architecture or execution strategy change requires an explicit user decision.' });
291
- return {
292
- executionMode: 'handoff_only', executorKind: 'handoff_only', selectedProviderId: null,
293
- workMode: 'direct_edit', executionPath: 'durable', requiresWork: false, requiresApproval: true,
294
- requiresIsolation, requiresRecovery, createHandoff: true, waitForUser: true,
295
- approvalState: 'normal_authorization_required', alternatives: [], ...decisionBase(input, reasons),
296
- };
297
- }
298
- if ((!input.intent.scopeClear && (destructive || remoteWrite || secretAccess)) || (approvalRequired && !approvalConfirmed)) {
299
- reasons.push({
300
- code: !input.intent.scopeClear ? 'high_risk_scope_incomplete' : 'authorization_required',
301
- message: !input.intent.scopeClear
302
- ? 'High-risk work requires a complete scope before execution.'
303
- : 'The requested side effect requires explicit authorization before execution.',
304
- });
305
- return {
306
- executionMode: 'handoff_only', executorKind: 'handoff_only', selectedProviderId: null,
307
- workMode: 'direct_edit', executionPath: 'durable', requiresWork: false, requiresApproval: true,
308
- requiresIsolation, requiresRecovery, createHandoff: true, waitForUser: true,
309
- approvalState: destructive || secretAccess ? 'strong_confirmation_required' : 'normal_authorization_required',
310
- alternatives: [], ...decisionBase(input, reasons),
311
- };
312
- }
313
-
314
- if (input.workspace.dirty && mutation) {
315
- reasons.push({
316
- code: 'dirty_workspace_preserve_existing_changes',
317
- message: 'The checkout is already dirty; preserve unrelated changes and treat inspected/actual scope as evidence instead of creating Work solely for adoption.',
318
- });
319
- }
320
- if (explicitMode) reasons.push({ code: `explicit_${explicitMode}`, message: `Explicit -${explicitMode} mode overrides automatic work topology while policy gates remain authoritative.` });
321
- if (protectedPath) reasons.push({ code: 'protected_path', message: 'The predicted scope includes a protected or release-sensitive path.' });
322
- if (requiresRecovery) reasons.push({ code: 'recovery_required', message: 'The operation needs resumable Work and bounded recovery.' });
323
- if (input.workspace.placement === 'isolated') reasons.push({ code: 'placement_isolated', message: 'Typed Work admission requires an isolated workspace.' });
324
- if (input.workspace.directMainProhibited === true) reasons.push({ code: 'direct_main_prohibited', message: 'Typed Work admission forbids the Direct Control/current-main mutation lane.' });
325
- if (requiresIsolation) reasons.push({ code: 'isolation_required', message: 'The operation requires an isolated checkout or serialized lane.' });
326
- if (input.intent.requiresLongRunningChecks) reasons.push({ code: 'long_checks', message: 'Long-running checks may use a lightweight handle; duration alone does not require durable Work.' });
327
- if (input.intent.requiresInvestigation) reasons.push({ code: 'investigation', message: 'Investigation is required before or during implementation.' });
328
- if (input.intent.needsDependencies) reasons.push({ code: 'dependencies', message: 'Dependency ordering requires durable Work.' });
329
- if (coordinationRequired) reasons.push({ code: 'independent_deliverables', message: 'Multiple independent deliverables require durable PlanContract/Work coordination.' });
330
-
331
- const explicitBoundedMode = explicitMode === 'plan'
332
- || explicitMode === 'release';
333
- const directModeCanRemainFast = explicitMode === 'direct'
334
- && !requiresIsolation
335
- && !requiresRecovery
336
- && !coordinationRequired;
337
- const complex = directModeCanRemainFast
338
- ? false
339
- : coordinationRequired
340
- || explicitBoundedMode
341
- || requiresRecovery
342
- || requiresIsolation
343
- || input.intent.agentRequested === true
344
- || input.capabilities.requiresWorker === true
345
- || input.capabilities.requiresExternalEffect === true
346
- || input.intent.needsDependencies === true
347
- || destructive
348
- || remoteWrite
349
- || secretAccess;
350
- const executionMode: RouteExecutionMode = complex ? 'goal_workloop' : 'direct_control';
351
- // Work topology is independent from executor/provider choice. Independent or
352
- // parallel deliverables stay in the durable Goal Workloop and are decomposed by
353
- // PlanContract/Work rather than introducing another project-level lifecycle.
354
- const workMode: RouteWorkMode = directModeCanRemainFast
355
- ? 'direct_edit'
356
- : coordinationRequired
357
- ? 'bounded_work'
358
- : input.intent.agentRequested
359
- ? expectedFiles > 10 || expectedChangedLines > 1_500 ? 'issue_task' : 'quick_agent'
360
- : complex
361
- ? 'bounded_work'
362
- : 'direct_edit';
363
- const executionPath: RouteExecutionPath = complex ? 'durable' : 'fast';
364
- const providerSelection = selectProvider(input);
365
- const providersWereSupplied = input.capabilities.providers !== undefined;
366
- if (providersWereSupplied && !providerSelection.provider) {
367
- reasons.push({ code: 'provider_unavailable', message: 'No allowed provider with the required capabilities is ready.' });
368
- return {
369
- executionMode: 'handoff_only', executorKind: 'handoff_only', selectedProviderId: 'chatgpt_handoff',
370
- workMode, executionPath: 'durable', requiresWork: mutation || requiresRecovery, requiresApproval: false,
371
- requiresIsolation, requiresRecovery, createHandoff: true, waitForUser: false,
372
- approvalState: 'approval_not_required', alternatives: providerSelection.alternatives,
373
- ...decisionBase(input, reasons),
374
- };
375
- }
376
- const selectedProvider = providerSelection.provider;
377
- const executorKind: RouteExecutorKind = selectedProvider?.kind
378
- ?? (input.capabilities.requiresWorker ? 'external_controller' : 'direct_edit');
379
- if (selectedProvider) reasons.push({ code: 'provider_selected', message: `Selected ${selectedProvider.providerId} using ${providerSelection.key} order.` });
380
- if (reasons.length === 0) reasons.push({ code: executionMode === 'direct_control' ? 'bounded_direct' : 'durable_work', message: executionMode === 'direct_control' ? 'Bounded supervised work stays on Direct Control.' : 'The operation requires a durable Goal Workloop.' });
381
-
382
- return {
383
- executionMode,
384
- executorKind,
385
- selectedProviderId: selectedProvider?.providerId ?? null,
386
- workMode,
387
- executionPath,
388
- // Direct Control is intentionally contract-free. Persistence belongs to
389
- // Goal Workloop/Agent tiers; bounded direct edits rely on the
390
- // existing permission, patch, Process, and evidence boundaries instead.
391
- requiresWork: executionMode !== 'direct_control',
392
- requiresApproval: approvalRequired,
393
- requiresIsolation,
394
- requiresRecovery,
395
- createHandoff: false,
396
- waitForUser: false,
397
- approvalState: 'approval_not_required',
398
- alternatives: providerSelection.alternatives,
399
- ...decisionBase(input, reasons),
400
- };
401
- }
@@ -1,70 +0,0 @@
1
- export type WorkspacePlacementMode = 'current' | 'isolated' | 'auto';
2
-
3
- export interface WorkspaceAdmissionConstraintInput {
4
- workspaceMode?: WorkspacePlacementMode;
5
- requireWorktree?: boolean;
6
- /**
7
- * Forbid repository mutation through the current/direct-main lane. This is
8
- * an admission constraint, not a routing hint: callers must never silently
9
- * downgrade it to Direct Control.
10
- */
11
- directMainProhibited?: boolean;
12
- }
13
-
14
- export interface WorkspaceAdmissionConstraint {
15
- workspaceMode: WorkspacePlacementMode;
16
- requireWorktree: boolean;
17
- directMainProhibited: boolean;
18
- requiresIsolation: boolean;
19
- }
20
-
21
- export type WorkspaceAdmissionResolution =
22
- | { ok: true; constraint: WorkspaceAdmissionConstraint }
23
- | { ok: false; code: 'WORKSPACE_PLACEMENT_CONSTRAINT_CONFLICT'; message: string };
24
-
25
- /**
26
- * Canonicalize Work placement before Route Policy runs. Placement is a policy
27
- * fence: explicit isolation / direct-main prohibition has precedence over an
28
- * operator request for the fast Direct Control topology.
29
- */
30
- export function resolveWorkspaceAdmissionConstraint(
31
- input: WorkspaceAdmissionConstraintInput = {},
32
- ): WorkspaceAdmissionResolution {
33
- const workspaceMode = input.workspaceMode ?? 'auto';
34
- const directMainProhibited = input.directMainProhibited === true;
35
-
36
- if (workspaceMode === 'current' && input.requireWorktree === true) {
37
- return {
38
- ok: false,
39
- code: 'WORKSPACE_PLACEMENT_CONSTRAINT_CONFLICT',
40
- message: 'workspaceMode=current conflicts with requireWorktree=true.',
41
- };
42
- }
43
- if (workspaceMode === 'isolated' && input.requireWorktree === false) {
44
- return {
45
- ok: false,
46
- code: 'WORKSPACE_PLACEMENT_CONSTRAINT_CONFLICT',
47
- message: 'workspaceMode=isolated conflicts with requireWorktree=false.',
48
- };
49
- }
50
- if (workspaceMode === 'current' && directMainProhibited) {
51
- return {
52
- ok: false,
53
- code: 'WORKSPACE_PLACEMENT_CONSTRAINT_CONFLICT',
54
- message: 'workspaceMode=current conflicts with directMainProhibited=true because the current lane cannot prove a non-main placement at admission time.',
55
- };
56
- }
57
-
58
- const requiresIsolation = workspaceMode === 'isolated'
59
- || input.requireWorktree === true
60
- || directMainProhibited;
61
- return {
62
- ok: true,
63
- constraint: {
64
- workspaceMode: requiresIsolation ? 'isolated' : workspaceMode,
65
- requireWorktree: requiresIsolation,
66
- directMainProhibited,
67
- requiresIsolation,
68
- },
69
- };
70
- }