@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,6 +1,6 @@
1
1
  import type { GitHubStatus } from "../github/contracts";
2
2
  import type { McpAgentRunnerName } from "../mcp/types";
3
- import type { ControllerAgent, ControllerTask } from "../controller/types";
3
+ import type { ControllerAgent } from "../controller/types";
4
4
 
5
5
  export type ExecutorHealthStatus =
6
6
  | "available"
@@ -24,7 +24,6 @@ export type ExecutorHealthReason =
24
24
  | "unknown";
25
25
 
26
26
  export type ExecutorHealthFallback =
27
- | "use_direct_edit"
28
27
  | "enable_local_agent"
29
28
  | "run_gh_auth_login"
30
29
  | "enable_copilot_coding_agent"
@@ -64,19 +63,6 @@ function normalize(value: string): string {
64
63
  return value.toLowerCase().replace(/\s+/g, " ").trim();
65
64
  }
66
65
 
67
- function isSmallScopedTask(task: Pick<ControllerTask, "allowedPaths"> | undefined): boolean {
68
- return Array.isArray(task?.allowedPaths) && task.allowedPaths.length > 0 && task.allowedPaths.length <= 3;
69
- }
70
-
71
- function localUnavailableMessage(base: string, task?: Pick<ControllerTask, "allowedPaths">): string {
72
- if (!isSmallScopedTask(task)) return base;
73
- return `${base} Use begin_edit_session/apply_patch/run_check instead of retrying unavailable agents.`;
74
- }
75
-
76
- function localUnavailableFallback(task?: Pick<ControllerTask, "allowedPaths">): ExecutorHealthFallback {
77
- return isSmallScopedTask(task) ? "use_direct_edit" : "enable_local_agent";
78
- }
79
-
80
66
  export function executorHealthCode(health: ExecutorHealth): string {
81
67
  switch (health.reason) {
82
68
  case "local_dev_runner_disabled":
@@ -104,19 +90,15 @@ export function executorHealthCode(health: ExecutorHealth): string {
104
90
  export function classifyLocalExecutorHealth(
105
91
  agent: Exclude<ControllerAgent, "github-copilot">,
106
92
  policy: LocalExecutorPolicy,
107
- task?: Pick<ControllerTask, "allowedPaths">,
108
93
  ): ExecutorHealth | null {
109
94
  if (!policy.agentRunner) {
110
95
  return {
111
96
  agent,
112
97
  status: "disabled",
113
98
  reason: "local_dev_runner_disabled",
114
- message: localUnavailableMessage(
115
- `Local ${agent} runs are disabled because the dev runner is not enabled.`,
116
- task,
117
- ),
99
+ message: `Local ${agent} runs are disabled because the dev runner is not enabled.`,
118
100
  remediation: "Enable the controller dev runner before dispatching local Codex or Claude runs.",
119
- fallback: localUnavailableFallback(task),
101
+ fallback: "enable_local_agent",
120
102
  };
121
103
  }
122
104
  if (!policy.allowedAgents.includes(agent)) {
@@ -124,12 +106,9 @@ export function classifyLocalExecutorHealth(
124
106
  agent,
125
107
  status: "disabled",
126
108
  reason: "local_agent_disabled",
127
- message: localUnavailableMessage(
128
- `Local agent is not enabled: ${agent}.`,
129
- task,
130
- ),
109
+ message: `Local agent is not enabled: ${agent}.`,
131
110
  remediation: `Enable ${agent} in the controller dev-runner allowedAgents list before retrying.`,
132
- fallback: localUnavailableFallback(task),
111
+ fallback: "enable_local_agent",
133
112
  };
134
113
  }
135
114
  return null;
@@ -137,7 +116,6 @@ export function classifyLocalExecutorHealth(
137
116
 
138
117
  export function classifyGitHubCopilotPreflight(
139
118
  status: GitHubStatus,
140
- task?: Pick<ControllerTask, "allowedPaths">,
141
119
  ): ExecutorHealth | null {
142
120
  if (!status.available) {
143
121
  return {
@@ -146,7 +124,7 @@ export function classifyGitHubCopilotPreflight(
146
124
  reason: "github_cli_unavailable",
147
125
  message: "GitHub CLI (gh) is unavailable, so GitHub Copilot cloud sessions cannot start.",
148
126
  remediation: "Install GitHub CLI and ensure `gh --version` works in this repository environment.",
149
- fallback: isSmallScopedTask(task) ? "use_direct_edit" : "install_github_cli",
127
+ fallback: "install_github_cli",
150
128
  };
151
129
  }
152
130
  if (!status.authenticated) {
@@ -175,7 +153,6 @@ export function classifyGitHubCopilotPreflight(
175
153
  export function classifyExecutorFailure(
176
154
  agent: ControllerAgent,
177
155
  message: string,
178
- task?: Pick<ControllerTask, "allowedPaths">,
179
156
  ): ExecutorHealth | null {
180
157
  const text = normalize(message);
181
158
  if (!text) return null;
@@ -193,7 +170,7 @@ export function classifyExecutorFailure(
193
170
  reason: "copilot_cca_disabled",
194
171
  message: "GitHub Copilot cloud agent is not enabled for this account or repository.",
195
172
  remediation: "Enable GitHub Copilot Coding Agent / CCA for the account and repository before retrying cloud sessions.",
196
- fallback: isSmallScopedTask(task) ? "use_direct_edit" : "enable_copilot_coding_agent",
173
+ fallback: "enable_copilot_coding_agent",
197
174
  };
198
175
  }
199
176
  return null;
@@ -207,7 +184,7 @@ export function classifyExecutorFailure(
207
184
  reason: "codex_insufficient_balance",
208
185
  message: "Codex execution is unavailable because the configured API account has insufficient balance.",
209
186
  remediation: "Restore API balance or correct the Codex base URL/account configuration before retrying.",
210
- fallback: isSmallScopedTask(task) ? "use_direct_edit" : "fix_codex_api_balance_or_base_url",
187
+ fallback: "fix_codex_api_balance_or_base_url",
211
188
  };
212
189
  }
213
190
  if (text.includes("usage limit")) {
@@ -217,7 +194,7 @@ export function classifyExecutorFailure(
217
194
  reason: "codex_usage_limit",
218
195
  message: "Codex execution is unavailable because the configured account has reached a usage limit.",
219
196
  remediation: "Raise or wait for the Codex usage limit, or correct the API account/base URL configuration before retrying.",
220
- fallback: isSmallScopedTask(task) ? "use_direct_edit" : "fix_codex_api_balance_or_base_url",
197
+ fallback: "fix_codex_api_balance_or_base_url",
221
198
  };
222
199
  }
223
200
  if (
@@ -232,7 +209,7 @@ export function classifyExecutorFailure(
232
209
  reason: "codex_auth_required",
233
210
  message: "Codex execution is unavailable because authentication is required.",
234
211
  remediation: "Authenticate the Codex executor or correct the configured credentials/base URL before retrying.",
235
- fallback: isSmallScopedTask(task) ? "use_direct_edit" : "authenticate_codex",
212
+ fallback: "authenticate_codex",
236
213
  };
237
214
  }
238
215
  }
@@ -243,7 +220,7 @@ export function classifyExecutorFailure(
243
220
  reason: "unknown",
244
221
  message: `${agent} execution failed for an unclassified reason.`,
245
222
  remediation: "Inspect the bounded run error and executor configuration before retrying.",
246
- fallback: isSmallScopedTask(task) ? "use_direct_edit" : "inspect_executor_configuration",
223
+ fallback: "inspect_executor_configuration",
247
224
  };
248
225
  }
249
226
 
@@ -13,14 +13,11 @@ import {
13
13
  type EditOperation,
14
14
  type EditSession,
15
15
  } from "../editing/edit-session";
16
- import { getIssue, updateTask } from "../controller/issue-store";
17
- import { readTaskRunEvidence } from "../controller/run-evidence";
18
- import { resolveEffectiveTaskState } from "../controller/task-status-resolver";
19
16
  import { resolveMcpPath } from "../mcp/paths";
20
17
  import type { McpPolicy } from "../mcp/types";
21
18
  import { getAgentJob, markAgentJobClosure, markAgentJobIntegrated, markAgentJobIntegrationReview } from "./job-manager";
22
19
  import type { AgentJobMeta, AgentJobPreservationReason } from "./types";
23
- import { assertRuntimeMayWriteOrThrow } from "../../runtime/root/write-fence";
20
+ import { assertRuntimeMayWriteOrThrow, isRuntimeWriteFenceError } from "../../runtime/root/write-fence";
24
21
 
25
22
  type IntegrationChangeOutcome = "changed" | "already_integrated";
26
23
 
@@ -509,21 +506,22 @@ export function integrateAgentJob(
509
506
  ?? undefined;
510
507
  assertRuntimeMayWriteOrThrow('integrate_worktree', controllerHome);
511
508
  } catch (error) {
512
- if (error instanceof Error && error.message.startsWith('WRITER_FENCED:')) throw error;
509
+ if (isRuntimeWriteFenceError(error)) throw error;
513
510
  /* unbound legacy single-runtime */
514
511
  }
515
512
  let run: AgentJobMeta = getAgentJob(repoRoot, runId);
516
- const autoFinalizing = run.status === "running" &&
517
- run.autoIntegrate === true &&
518
- run.executionMode === "worktree" &&
519
- (run.progress?.phase === "finalizing" || run.closureState === "ready_to_integrate");
520
- const userResolvableIntegration = run.status === "waiting_for_user" &&
521
- run.autoIntegrate === true &&
522
- run.executionMode === "worktree" &&
523
- Boolean(run.autoIntegrationError);
524
- if (run.status !== "succeeded" && !autoFinalizing && !userResolvableIntegration)
513
+ // Integration is an explicit decision, so an ordinary Run must have finished
514
+ // successfully. One state is still integrable: a Run that a previous explicit
515
+ // integration attempt preserved after a failure or a required review. That
516
+ // preserved worktree is the durable product of that attempt, and refusing to
517
+ // retry it stranded the isolated work with no path forward.
518
+ const preservedIntegrationRetry = run.status === "waiting_for_user"
519
+ && run.executionMode === "worktree"
520
+ && (run.closureState === "preserved" || run.closureState === "integration_blocked")
521
+ && Boolean(run.autoIntegrationError || run.preservationReason);
522
+ if (run.status !== "succeeded" && !preservedIntegrationRetry)
525
523
  throw new Error(
526
- `only succeeded, auto-finalizing, or preserved waiting_for_user Runs can be integrated (current: ${run.status})`,
524
+ `only a succeeded Run (or an explicitly preserved integration attempt) can be integrated (current: ${run.status})`,
527
525
  );
528
526
  if (run.provider !== "local")
529
527
  throw new Error(
@@ -531,7 +529,7 @@ export function integrateAgentJob(
531
529
  );
532
530
  if (run.worktree === repoRoot || !run.branch || !run.baseRevision)
533
531
  throw new Error(
534
- "Run did not use an isolated Git worktree; its changes are already in the main working tree",
532
+ "Run did not use an isolated Git worktree; its changes are already in the dispatch checkout",
535
533
  );
536
534
  if (run.integratedSessionId) {
537
535
  const existing = getEditSession(repoRoot, run.integratedSessionId);
@@ -548,28 +546,12 @@ export function integrateAgentJob(
548
546
 
549
547
  run = markAgentJobClosure(repoRoot, runId, {
550
548
  state: "integrating",
551
- details: "Applying isolated Run changes to the canonical workspace.",
549
+ details: "Applying isolated Run changes to the dispatch checkout.",
552
550
  });
553
551
 
554
- const issue = getIssue(repoRoot, run.issueId);
555
- const task = issue.tasks.find((entry) => entry.id === run.taskId);
556
- if (!task) throw new Error(`task not found: ${run.issueId}/${run.taskId}`);
557
- const state = resolveEffectiveTaskState({ issue, task, runs: readTaskRunEvidence(repoRoot, task) });
558
- const taskReady = autoFinalizing || userResolvableIntegration
559
- ? !state.terminal && !state.inactive && ["review", "ready_to_integrate", "integrating", "integration_blocked", "integrated", "verified"].includes(task.status)
560
- : !state.terminal && !state.inactive && ["review", "ready_to_integrate", "integrating", "integration_blocked", "verified"].includes(state.effectiveStatus);
561
- if (!taskReady)
562
- throw new Error(
563
- `task must be active and in review before integration (declared: ${task.status}, effective: ${state.effectiveStatus})`,
564
- );
565
-
566
552
  const initialPlan = planFromCurrentWorkspace(repoRoot, run, policy);
567
553
  if (initialPlan.changedPaths.length === 0)
568
554
  throw new Error("task worktree has no changes to integrate");
569
- if (initialPlan.changedPaths.length > 25)
570
- throw new Error(
571
- `task changed ${initialPlan.changedPaths.length} files; split or manually integrate work larger than 25 files`,
572
- );
573
555
  if (initialPlan.conflicts.length > 0)
574
556
  throw createReviewPacket(
575
557
  repoRoot,
@@ -578,10 +560,9 @@ export function integrateAgentJob(
578
560
  initialPlan.conflicts,
579
561
  );
580
562
 
581
- const allowedPaths =
582
- task.allowedPaths.length > 0
583
- ? task.allowedPaths
584
- : initialPlan.changedPaths;
563
+ const allowedPaths = run.allowedPaths?.length
564
+ ? run.allowedPaths
565
+ : initialPlan.changedPaths;
585
566
  if (initialPlan.operations.length === 0) {
586
567
  const applied = finalizeAlreadyIntegratedSession(
587
568
  repoRoot,
@@ -592,10 +573,6 @@ export function integrateAgentJob(
592
573
  changedFiles: initialPlan.changedPaths,
593
574
  changeOutcome: "already_integrated",
594
575
  });
595
- updateTask(repoRoot, run.issueId, run.taskId, {
596
- status: "integrated",
597
- note: `${runId} already matched the main workspace and was recorded through edit session ${applied.sessionId}; run focused checks and record verification before acceptance.`,
598
- });
599
576
  return {
600
577
  session: applied,
601
578
  changedPaths: initialPlan.changedPaths,
@@ -644,10 +621,6 @@ export function integrateAgentJob(
644
621
  changedFiles: refreshedPlan.changedPaths,
645
622
  changeOutcome: "already_integrated",
646
623
  });
647
- updateTask(repoRoot, run.issueId, run.taskId, {
648
- status: "integrated",
649
- note: `${runId} became already integrated while finish was running and was recorded through edit session ${alreadyIntegrated.sessionId}; run focused checks and record verification before acceptance.`,
650
- });
651
624
  return {
652
625
  session: alreadyIntegrated,
653
626
  changedPaths: refreshedPlan.changedPaths,
@@ -683,10 +656,6 @@ export function integrateAgentJob(
683
656
  changedFiles: initialPlan.operations.map((operation) => operation.path),
684
657
  changeOutcome: "changed",
685
658
  });
686
- updateTask(repoRoot, run.issueId, run.taskId, {
687
- status: "integrated",
688
- note: `${runId} integrated through edit session ${applied.sessionId}; run focused checks and record verification before acceptance.`,
689
- });
690
659
  return {
691
660
  session: applied,
692
661
  changedPaths: initialPlan.operations.map((operation) => operation.path),
@@ -122,7 +122,10 @@ function normalizeAgentMeta(
122
122
  : meta.worktree === repoRoot
123
123
  ? "workspace"
124
124
  : "worktree");
125
- meta.autoIntegrate = meta.autoIntegrate ?? meta.executionMode === "worktree";
125
+ // Integration is an explicit model decision. Historical worktree Runs may
126
+ // retain this field for read compatibility, but a missing value must never
127
+ // turn a completed execution into a workflow transition.
128
+ meta.autoIntegrate = meta.autoIntegrate ?? false;
126
129
  meta.closureState = meta.closureState ?? (
127
130
  meta.provider === "local" && meta.executionMode === "worktree"
128
131
  ? meta.worktreeCleanedAt
@@ -1105,7 +1108,7 @@ function attachExecutorFailureHealth(meta: AgentJobMeta, stdoutTail?: string, st
1105
1108
  }
1106
1109
  if (meta.executorHealth) return meta;
1107
1110
  const message = executorFailureMessage(meta, stdoutTail, stderrTail);
1108
- const health = classifyExecutorFailure(meta.agent, message, { allowedPaths: meta.allowedPaths ?? [] });
1111
+ const health = classifyExecutorFailure(meta.agent, message);
1109
1112
  if (health) meta.executorHealth = health;
1110
1113
  return meta;
1111
1114
  }
@@ -1261,7 +1264,8 @@ function baseMeta(
1261
1264
  eventsPath: relative(opts.repoRoot, paths.eventsPath).replace(/\\/g, "/"),
1262
1265
  timeoutMs: opts.timeoutMs,
1263
1266
  startupDeadlineAt: new Date(Date.now() + agentStartupTimeoutMs()).toISOString(),
1264
- autoIntegrate: executionMode === "worktree",
1267
+ // A worktree contains concurrent writes; it does not authorize delivery.
1268
+ autoIntegrate: false,
1265
1269
  progress: {
1266
1270
  phase: "starting",
1267
1271
  currentActivity: "已受理,等待异步启动",
@@ -1,7 +1,8 @@
1
1
  import { readFileSync, statSync } from 'fs';
2
2
  import type { Command } from 'commander';
3
3
  import { recordExperience, retractExperience, supersedeExperience, type ExperienceDraft } from '../../../packages/kernel/memory/api/index';
4
- import { controllerExperienceStore } from '../../runtime/control-plane/persistence/experience-store';
4
+ import { controllerExperienceStore, workExperienceProvenance } from '../../runtime/control-plane/persistence/experience-store';
5
+ import { getWorkContract } from '../../../packages/kernel/work/api/index';
5
6
  import { prepareAssistantWorkContext } from '../../runtime/context/assistant-work-context';
6
7
 
7
8
  function readBoundedJson(path: string): unknown {
@@ -17,21 +18,34 @@ export function addBrainAssistantCommands(brain: Command): void {
17
18
  .action((options: { controllerHome: string; repoId: string; workId: string; query?: string; channel?: string; account?: string; locale?: string }) => {
18
19
  console.log(JSON.stringify(prepareAssistantWorkContext({ ...options, applicability: { channel: options.channel, account: options.account, locale: options.locale } }) ?? { status: 'project_contract_missing' }, null, 2));
19
20
  });
20
- const experience = brain.command('experience').description('Submit or withdraw Controller-authored, evidence-backed experience');
21
+ const experience = brain.command('experience').description('Submit or withdraw Work-authored, evidence-backed advisory experience');
21
22
  for (const operation of ['record', 'supersede', 'retract'] as const) {
22
23
  experience.command(operation)
23
24
  .requiredOption('--controller-home <path>').requiredOption('--repo-id <id>').requiredOption('--work-id <id>')
24
- .requiredOption('--controller-id <id>').requiredOption('--authority-env <name>', 'Environment variable containing the current Controller capability')
25
- .requiredOption('--input <path>', 'Bounded JSON API input; never include the Controller capability')
26
- .action((options: { controllerHome: string; repoId: string; workId: string; controllerId: string; authorityEnv: string; input: string }) => {
27
- if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(options.authorityEnv)) throw new Error('BRAIN_AUTHORITY_ENV_INVALID');
28
- const authorityId = process.env[options.authorityEnv];
29
- if (!authorityId) throw new Error('BRAIN_CONTROLLER_AUTHORITY_REQUIRED');
30
- const store = controllerExperienceStore({ ...options, identity: { workId: options.workId, controllerId: options.controllerId, authorityId } });
31
- const data = readBoundedJson(options.input);
32
- const result = operation === 'record' ? recordExperience(store, data as ExperienceDraft)
33
- : operation === 'supersede' ? supersedeExperience(store, data as Parameters<typeof supersedeExperience>[1])
34
- : retractExperience(store, data as Parameters<typeof retractExperience>[1]);
25
+ .requiredOption('--input <path>', 'Bounded JSON API input; source Work provenance is derived by Forge')
26
+ .action((options: { controllerHome: string; repoId: string; workId: string; input: string }) => {
27
+ const work = getWorkContract({ controllerHome: options.controllerHome, repoId: options.repoId }, options.workId);
28
+ if (!work) throw new Error(`BRAIN_WORK_NOT_FOUND: ${options.workId}`);
29
+ const sourceRoundId = workExperienceProvenance(work);
30
+ const store = controllerExperienceStore({ ...options, identity: { workId: options.workId } });
31
+ const raw = readBoundedJson(options.input);
32
+ if (!raw || typeof raw !== 'object' || Array.isArray(raw)) throw new Error('BRAIN_INPUT_OBJECT_REQUIRED');
33
+ const data = raw as Record<string, unknown>;
34
+ const result = operation === 'record'
35
+ ? recordExperience(store, { ...data, sourceWorkId: options.workId, sourceRoundId } as ExperienceDraft)
36
+ : operation === 'supersede'
37
+ ? (() => {
38
+ const input = data as Parameters<typeof supersedeExperience>[1];
39
+ return supersedeExperience(store, {
40
+ ...input,
41
+ draft: { ...input.draft, sourceWorkId: options.workId, sourceRoundId },
42
+ });
43
+ })()
44
+ : retractExperience(store, {
45
+ ...(data as Parameters<typeof retractExperience>[1]),
46
+ sourceWorkId: options.workId,
47
+ sourceRoundId,
48
+ });
35
49
  console.log(JSON.stringify(result, null, 2));
36
50
  });
37
51
  }
@@ -14,7 +14,7 @@ import { configuredBrainRoot } from './brain-root';
14
14
  import { addBrainAssistantCommands } from './brain-assistant';
15
15
  import { resolveRepoPreferredControllerHome } from '../repositories/controller-home';
16
16
  import { findRegisteredRepositoryByCheckoutRoot } from '../repositories/registry';
17
- import { getWorkContract, validateWorkSemantics } from '../../../packages/kernel/work/api/index';
17
+ import { getWorkContract, semanticWorkState } from '../../../packages/kernel/work/api/index';
18
18
 
19
19
  export type BrainLifecycle = 'always-sync' | 'archive-only' | 'never-sync';
20
20
  export type BrainCategory = 'decisions' | 'runbooks' | 'patterns' | 'references';
@@ -561,38 +561,36 @@ function modernBrainPromotionSource(repoRoot: string, opts: BrainPromoteOptions,
561
561
  return { sources: [], sections: [], relatedPlan: work.planId ?? '', terminalAt: '', outcome: '', sourceWork: workId, completionReceipt: '', workScope: '' };
562
562
  }
563
563
  const workScope = `${work.scopeRef.kind}:${work.scopeRef.id}`;
564
- if (work.status !== 'completed' || !work.completionReceipt) {
565
- issue(issues, 'error', `Brain promotion requires a completed Work with a durable completion receipt: ${workId}`);
564
+ if (semanticWorkState(work) !== 'completed') {
565
+ issue(issues, 'error', `Brain promotion requires a semantically completed Work: ${workId}`);
566
566
  return { sources: [], sections: [], relatedPlan: work.planId ?? '', terminalAt: '', outcome: '', sourceWork: workId, completionReceipt: '', workScope };
567
567
  }
568
- try {
569
- validateWorkSemantics(work);
570
- } catch (error) {
571
- issue(issues, 'error', `Work completion evidence is invalid for Brain promotion: ${error instanceof Error ? error.message : String(error)}`);
572
- return { sources: [], sections: [], relatedPlan: work.planId ?? '', terminalAt: '', outcome: '', sourceWork: workId, completionReceipt: work.completionReceipt.receiptId, workScope };
573
- }
574
568
  const receipt = work.completionReceipt;
575
- const repositoryDetails = ('targetRevision' in receipt)
569
+ const semanticResultRefs = [...new Set((work.semanticResultRefs ?? []).map((value) => value.trim()).filter(Boolean))];
570
+ const repositoryDetails = receipt && 'targetRevision' in receipt
576
571
  ? [`- Target revision: ${receipt.targetRevision}`, `- Changed paths: ${receipt.changedPaths.length}`]
577
572
  : [];
573
+ const legacyReceiptDetails = receipt
574
+ ? [`- Legacy completion receipt: ${receipt.receiptId}`, `- Legacy completion source: ${receipt.source}`]
575
+ : ['- Legacy completion receipt: none (not required for semantic completion)'];
578
576
  const section = [
579
577
  `## Source: work:${work.workId}`,
580
578
  '',
581
579
  `- Objective: ${work.objective}`,
582
580
  `- Completion outcome: ${work.completionOutcome ?? 'completed'}`,
583
- `- Completion receipt: ${receipt.receiptId}`,
584
- `- Completion authority: ${receipt.source}`,
581
+ `- Semantic result refs: ${semanticResultRefs.length ? semanticResultRefs.join(', ') : '(none recorded)'}`,
585
582
  `- Work scope: ${workScope}`,
583
+ ...legacyReceiptDetails,
586
584
  ...repositoryDetails,
587
585
  '',
588
586
  'This entry is promoted from validated durable Work metadata. Raw process logs, credentials, and chat history are not copied into Brain.',
589
587
  '',
590
588
  ].join('\n');
591
589
  return {
592
- sources: [`work:${work.workId}`, `completion:${receipt.receiptId}`],
593
- sections: [section], relatedPlan: work.planId ?? '', terminalAt: receipt.recordedAt,
590
+ sources: [`work:${work.workId}`, ...semanticResultRefs, ...(receipt ? [`completion:${receipt.receiptId}`] : [])],
591
+ sections: [section], relatedPlan: work.planId ?? '', terminalAt: work.semanticUpdatedAt ?? work.updatedAt,
594
592
  outcome: work.completionOutcome ?? 'completed', sourceWork: work.workId,
595
- completionReceipt: receipt.receiptId, workScope,
593
+ completionReceipt: receipt?.receiptId ?? '', workScope,
596
594
  };
597
595
  }
598
596
 
@@ -13,12 +13,7 @@ import {
13
13
  } from '../chatgpt-browser/engine';
14
14
  import type { BrowserProviderName, BrowserSessionStatus, NativeBrowserChannel, ThinkingLevel } from '../chatgpt-browser/types';
15
15
  import { durableControllerHome } from '../repositories/controller-home';
16
- import {
17
- runWorkChatgptContinuation,
18
- type ChatgptAutomationReasoning,
19
- type ChatgptAutomationTabPolicy,
20
- } from '../../runtime/control-plane/launcher/chatgpt-work-continuation';
21
- import { closeChatgptControllerRoundFromSource, continueChatgptControllerRoundFromSource, openChatgptControllerRoundFromSource } from '../../runtime/control-plane/launcher/chatgpt-round-continuation';
16
+ import { closeChatgptControllerRoundFromSource } from '../../runtime/control-plane/launcher/chatgpt-round-continuation';
22
17
 
23
18
  interface BrowserCommonOptions {
24
19
  repo?: string;
@@ -81,43 +76,6 @@ interface BrowserConsultOptions extends BrowserCommonOptions {
81
76
  headless?: boolean;
82
77
  }
83
78
 
84
- interface WorkChatgptContinueOptions extends BrowserCommonOptions {
85
- controllerHome: string;
86
- repoId: string;
87
- workId: string;
88
- prompt: string;
89
- title?: string;
90
- session?: string;
91
- conversationUrl?: string;
92
- model?: string;
93
- reasoning?: string;
94
- tabPolicy?: string;
95
- timeoutMs?: string;
96
- controllerAuthorityId?: string;
97
- relayScopeId?: string;
98
- }
99
-
100
- interface SourceRoundOpenOptions extends BrowserCommonOptions {
101
- controllerHome?: string;
102
- repoId: string;
103
- workId: string;
104
- controllerId: string;
105
- principalId: string;
106
- controllerInstanceId?: string;
107
- continuationPrompt?: string;
108
- timeoutMs?: string;
109
- }
110
-
111
- interface SourceRoundContinueOptions extends BrowserCommonOptions {
112
- controllerHome?: string;
113
- repoId: string;
114
- workId: string;
115
- controllerAuthorityId: string;
116
- relayScopeId: string;
117
- reason?: string;
118
- timeoutMs?: string;
119
- }
120
-
121
79
  interface SourceRoundCloseOptions extends BrowserCommonOptions {
122
80
  controllerHome?: string;
123
81
  repoId: string;
@@ -156,18 +114,6 @@ interface BrowserFollowupOptions extends BrowserCommonOptions {
156
114
  oracleBin?: string;
157
115
  }
158
116
 
159
- function parseAutomationReasoning(value?: string): ChatgptAutomationReasoning | undefined {
160
- if (value === undefined) return undefined;
161
- if (value === 'medium' || value === 'high' || value === 'xhigh') return value;
162
- throw new Error(`invalid --reasoning "${value}" (expected: medium, high, xhigh)`);
163
- }
164
-
165
- function parseAutomationTabPolicy(value?: string): ChatgptAutomationTabPolicy | undefined {
166
- if (value === undefined) return undefined;
167
- if (value === 'auto' || value === 'reuse' || value === 'new') return value;
168
- throw new Error(`invalid --tab-policy "${value}" (expected: auto, reuse, new)`);
169
- }
170
-
171
117
  function parseProvider(value?: string): BrowserProviderName {
172
118
  if (value === undefined || value === 'oracle') return 'oracle';
173
119
  if (value === 'native') return 'native';
@@ -435,114 +381,6 @@ export function buildChatgptCommand(): Command {
435
381
  });
436
382
  });
437
383
 
438
- const workContinue = new Command('work-continue')
439
- .description('Internal: continue one Forge Work in its bound ChatGPT Web conversation')
440
- .option('--repo <path>', 'Repository root for the Work browser session', '.')
441
- .requiredOption('--controller-home <path>', 'Explicit Controller Home containing the authoritative Work and conversation binding')
442
- .requiredOption('--repo-id <repo-id>', 'Stable Forge repository id')
443
- .requiredOption('--work-id <work-id>', 'Stable Forge Work id')
444
- .requiredOption('--prompt <text>', 'Bounded continuation prompt')
445
- .option('--title <title>', 'Human-readable local conversation alias')
446
- .option('--session <session-id>', 'Saved browser session to seed or resume the Work binding')
447
- .option('--conversation-url <url>', 'Explicit ChatGPT conversation URL to seed the binding')
448
- .option('--model <label>', 'Requested ChatGPT automation model', 'gpt-5.6')
449
- .option('--reasoning <level>', 'Reasoning level: medium|high|xhigh', 'high')
450
- .option('--tab-policy <policy>', 'Browser tab policy: auto|reuse|new', 'auto')
451
- .option('--timeout-ms <ms>', 'Assistant timeout in milliseconds')
452
- .option('--controller-authority-id <id>', 'Durable ControllerRound authority for source-mode continuation')
453
- .option('--relay-scope-id <id>', 'Durable ControllerRound relay scope paired with controller authority')
454
- .action((rawOpts: WorkChatgptContinueOptions) => {
455
- void runChatgptAction(async () => {
456
- const result = await runWorkChatgptContinuation({
457
- controllerHome: durableControllerHome(rawOpts.controllerHome),
458
- repoId: rawOpts.repoId,
459
- repoRoot: resolveRepoRoot(rawOpts.repo),
460
- workId: rawOpts.workId,
461
- prompt: rawOpts.prompt,
462
- controllerAuthorityId: rawOpts.controllerAuthorityId,
463
- relayScopeId: rawOpts.relayScopeId,
464
- title: rawOpts.title,
465
- browserSessionId: rawOpts.session,
466
- conversationUrl: rawOpts.conversationUrl,
467
- model: rawOpts.model,
468
- reasoning: parseAutomationReasoning(rawOpts.reasoning),
469
- tabPolicy: parseAutomationTabPolicy(rawOpts.tabPolicy),
470
- timeoutMs: parsePositiveInteger('timeout-ms', rawOpts.timeoutMs),
471
- });
472
- console.log(JSON.stringify({
473
- status: result.status,
474
- provider: result.provider,
475
- sessionId: result.browserSessionId,
476
- conversationUrl: result.conversationUrl,
477
- conversationId: result.conversationId,
478
- localAlias: result.localAlias,
479
- resumedFromBinding: result.resumedFromBinding,
480
- model: result.model,
481
- reasoning: result.reasoning,
482
- tabPolicy: result.tabPolicy,
483
- executionPreferenceVerified: result.executionPreferenceVerified,
484
- error: result.error,
485
- }, null, 2));
486
- });
487
- });
488
- chatgpt.addCommand(workContinue, { hidden: true });
489
-
490
- const roundOpen = new Command('round-open')
491
- .description('Internal: open and dispatch one ChatGPT ControllerRound from current source')
492
- .option('--repo <path>', 'Repository root used by the ChatGPT Browser delivery host', '.')
493
- .option('--controller-home <path>', 'Explicit Controller Home containing ControllerRound authority; defaults to canonical user-level Forge Controller Home')
494
- .requiredOption('--repo-id <repo-id>', 'Stable Forge repository id')
495
- .requiredOption('--work-id <work-id>', 'Forge Work id to dispatch')
496
- .requiredOption('--controller-id <id>', 'Authenticated ChatGPT controller id/principal identity')
497
- .requiredOption('--principal-id <id>', 'Authenticated ChatGPT principal id')
498
- .option('--controller-instance-id <id>', 'Source launcher instance identity')
499
- .option('--continuation-prompt <text>', 'Bounded source-mode continuation instruction')
500
- .option('--timeout-ms <ms>', 'Assistant dispatch timeout in milliseconds')
501
- .action((rawOpts: SourceRoundOpenOptions) => {
502
- void runChatgptAction(async () => {
503
- const result = await openChatgptControllerRoundFromSource({
504
- controllerHome: durableControllerHome(rawOpts.controllerHome),
505
- repoId: rawOpts.repoId,
506
- repoRoot: resolveRepoRoot(rawOpts.repo),
507
- workId: rawOpts.workId,
508
- controllerId: rawOpts.controllerId,
509
- principalId: rawOpts.principalId,
510
- controllerInstanceId: rawOpts.controllerInstanceId,
511
- continuationPrompt: rawOpts.continuationPrompt,
512
- timeoutMs: parsePositiveInteger('timeout-ms', rawOpts.timeoutMs),
513
- });
514
- console.log(JSON.stringify(result, null, 2));
515
- });
516
- });
517
- chatgpt.addCommand(roundOpen, { hidden: true });
518
-
519
- const roundContinue = new Command('round-continue')
520
- .description('Internal: close one claimed ChatGPT ControllerRound and immediately dispatch its successor from current source')
521
- .option('--repo <path>', 'Repository root used by the ChatGPT Browser delivery host', '.')
522
- .option('--controller-home <path>', 'Explicit Controller Home containing ControllerRound authority; defaults to canonical user-level Forge Controller Home')
523
- .requiredOption('--repo-id <repo-id>', 'Stable Forge repository id')
524
- .requiredOption('--work-id <work-id>', 'Currently claimed Forge Work id')
525
- .requiredOption('--controller-authority-id <id>', 'Exact durable ControllerRound authority')
526
- .requiredOption('--relay-scope-id <id>', 'Exact durable ControllerRound relay scope')
527
- .option('--reason <text>', 'Bounded semantic continuation reason')
528
- .option('--timeout-ms <ms>', 'Assistant dispatch timeout in milliseconds')
529
- .action((rawOpts: SourceRoundContinueOptions) => {
530
- void runChatgptAction(async () => {
531
- const result = await continueChatgptControllerRoundFromSource({
532
- controllerHome: durableControllerHome(rawOpts.controllerHome),
533
- repoId: rawOpts.repoId,
534
- repoRoot: resolveRepoRoot(rawOpts.repo),
535
- workId: rawOpts.workId,
536
- controllerAuthorityId: rawOpts.controllerAuthorityId,
537
- relayScopeId: rawOpts.relayScopeId,
538
- reason: rawOpts.reason,
539
- timeoutMs: parsePositiveInteger('timeout-ms', rawOpts.timeoutMs),
540
- });
541
- console.log(JSON.stringify(result, null, 2));
542
- });
543
- });
544
- chatgpt.addCommand(roundContinue, { hidden: true });
545
-
546
384
  const roundClose = new Command('round-close')
547
385
  .description('Internal: reconcile and close one claimed ChatGPT ControllerRound from current source without dispatching a successor')
548
386
  .option('--controller-home <path>', 'Explicit Controller Home containing ControllerRound authority; defaults to canonical user-level Forge Controller Home')