@moretea-labs/forge 1.8.0 → 1.8.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (695) hide show
  1. package/AGENTS.md +73 -7
  2. package/CHANGELOG.md +34 -0
  3. package/CLAUDE.md +17 -2
  4. package/CONTRIBUTING.md +3 -2
  5. package/README.en.md +24 -3
  6. package/README.md +10 -6
  7. package/README.zh-CN.md +5 -3
  8. package/THIRD_PARTY_NOTICES.md +1 -2
  9. package/adapters/chatgpt/browser-delivery-host.ts +7 -1
  10. package/adapters/chatgpt/browser-delivery-runtime.ts +531 -56
  11. package/adapters/chatgpt/controller-binding-store.ts +101 -22
  12. package/adapters/chatgpt/controller-round-host.ts +15 -25
  13. package/adapters/chatgpt/controller-round-settlement-store.ts +58 -4
  14. package/adapters/chatgpt/provider-delivery.ts +229 -2
  15. package/adapters/chatgpt/work-conversation-binding-store.ts +99 -54
  16. package/adapters/computer/chatgpt-extension-target.ts +708 -0
  17. package/adapters/computer/chrome-extension/background.js +541 -0
  18. package/adapters/computer/chrome-extension/content.js +402 -0
  19. package/adapters/computer/chrome-extension/core.js +24 -0
  20. package/adapters/computer/chrome-extension/manifest.json +32 -0
  21. package/adapters/computer/desktop-operator-discovery.ts +11 -31
  22. package/adapters/computer/desktop-operator-provider.ts +18 -6
  23. package/adapters/computer/interaction-target-authority.ts +178 -24
  24. package/adapters/mcp/access-mode.ts +18 -39
  25. package/adapters/mcp/auth.ts +2 -7
  26. package/adapters/mcp/instructions.ts +6 -5
  27. package/adapters/mcp/multi-repository.ts +10 -47
  28. package/adapters/mcp/oauth.ts +73 -0
  29. package/adapters/mcp/paths.ts +4 -1
  30. package/adapters/mcp/runtime-gateway/bounded-result-runtime.ts +62 -0
  31. package/adapters/mcp/runtime-gateway/cognition-settlement.ts +201 -0
  32. package/adapters/mcp/runtime-gateway/context-adapter.ts +490 -113
  33. package/adapters/mcp/runtime-gateway/context-pack-sidecar.ts +83 -0
  34. package/adapters/mcp/runtime-gateway/controller-authority-adapter.ts +20 -5
  35. package/adapters/mcp/runtime-gateway/core-capability-adapter.ts +258 -0
  36. package/adapters/mcp/runtime-gateway/engineering-preconditions.ts +10 -27
  37. package/adapters/mcp/runtime-gateway/engineering-tool-contract.ts +15 -0
  38. package/adapters/mcp/runtime-gateway/execution-tools.ts +14 -54
  39. package/adapters/mcp/runtime-gateway/gateway-execution-adapter.ts +2 -1
  40. package/adapters/mcp/runtime-gateway/plugin-adapter.ts +132 -47
  41. package/adapters/mcp/runtime-gateway/process-tools.ts +173 -23
  42. package/adapters/mcp/runtime-gateway/protected-computer-adapter.ts +16 -4
  43. package/adapters/mcp/runtime-gateway/recovery-adapter.ts +69 -52
  44. package/adapters/mcp/runtime-gateway/repository-compat-adapter.ts +4 -35
  45. package/adapters/mcp/runtime-gateway/result-adapter.ts +10 -4
  46. package/adapters/mcp/runtime-gateway/router.ts +19 -507
  47. package/adapters/mcp/runtime-gateway/routing-policy.ts +506 -0
  48. package/adapters/mcp/runtime-gateway/runtime-observation-adapter.ts +15 -66
  49. package/adapters/mcp/runtime-gateway/runtime-readiness-observation.ts +218 -0
  50. package/adapters/mcp/runtime-gateway/runtime-tool-definitions.ts +123 -178
  51. package/adapters/mcp/runtime-gateway/runtime-tools.ts +11 -5
  52. package/adapters/mcp/runtime-gateway/scheduler-adapter.ts +37 -1
  53. package/adapters/mcp/runtime-gateway/shared-adapter.ts +20 -0
  54. package/adapters/mcp/runtime-gateway/status-inbox-adapter.ts +416 -270
  55. package/adapters/mcp/runtime-gateway/typescript-navigation-sidecar.ts +140 -0
  56. package/adapters/mcp/runtime-gateway/work-adapter.ts +262 -3123
  57. package/adapters/mcp/runtime-gateway/work-controller-operations.ts +257 -0
  58. package/adapters/mcp/runtime-gateway/work-detail-projection.ts +60 -0
  59. package/adapters/mcp/runtime-gateway/work-input-wire-migration.ts +229 -0
  60. package/adapters/mcp/runtime-gateway/work-learning-operations.ts +145 -0
  61. package/adapters/mcp/runtime-gateway/work-list-projection.ts +38 -0
  62. package/adapters/mcp/runtime-gateway/work-plan-operations.ts +382 -0
  63. package/adapters/mcp/runtime-gateway/work-repair-adapter.ts +308 -0
  64. package/adapters/mcp/runtime-gateway/work-requirement-operations.ts +148 -0
  65. package/adapters/mcp/runtime-gateway/work-semantic-operations.ts +320 -0
  66. package/adapters/mcp/runtime-gateway/work-workflow-operations.ts +113 -0
  67. package/adapters/mcp/runtime-gateway/workflow-supervisor-adapter.ts +180 -0
  68. package/adapters/mcp/server.ts +91 -26
  69. package/adapters/mcp/setup.ts +5 -13
  70. package/adapters/mcp/tool-mapping/access-tools.ts +0 -6
  71. package/adapters/mcp/tool-mapping/legacy-tool-service.ts +703 -3092
  72. package/adapters/mcp/tool-mapping/post-finalize-work-attribution.ts +5 -10
  73. package/adapters/mcp/tool-mapping/repository-tools.ts +170 -213
  74. package/adapters/mcp/toolset-names.ts +11 -37
  75. package/adapters/mcp/toolset.ts +19 -92
  76. package/{src/cli → adapters}/mcp/transports/AGENTS.md +5 -5
  77. package/{src/cli → adapters}/mcp/transports/CLAUDE.md +5 -5
  78. package/adapters/mcp/transports/http-observation.ts +377 -0
  79. package/adapters/mcp/transports/http-post-lifecycle.ts +19 -0
  80. package/adapters/mcp/transports/http.ts +200 -683
  81. package/adapters/mcp/transports/oauth-http.ts +322 -0
  82. package/adapters/mcp/transports/session-registry.ts +6 -0
  83. package/adapters/mcp/tunnels/openai-secure-tunnel.ts +89 -5
  84. package/adapters/mcp/types.ts +0 -6
  85. package/assets/hooks/lib/session-state.sh +0 -38
  86. package/assets/hooks/post-bash.sh +1 -1
  87. package/assets/hooks/post-tool-observer.sh +0 -5
  88. package/assets/hooks/prompt-guard.sh +0 -55
  89. package/assets/partials/04-project-structure.partial.md +1 -1
  90. package/assets/partials/07-footer.partial.md +1 -1
  91. package/assets/partials-agents/02-operating-mode.partial.md +1 -1
  92. package/assets/partials-agents/08-deep-docs.partial.md +1 -1
  93. package/assets/plugin-registry.v1.json +6 -4
  94. package/assets/reference-configs/agentic-development-flow.md +26 -1
  95. package/assets/reference-configs/external-tooling.md +0 -76
  96. package/assets/reference-configs/global-working-rules.md +19 -0
  97. package/assets/reference-configs/release-deploy.md +1 -1
  98. package/assets/templates/helpers/architecture-queue.sh +1 -1
  99. package/assets/templates/helpers/check-agent-tooling.sh +1 -327
  100. package/assets/templates/helpers/check-task-workflow.sh +1 -1
  101. package/assets/templates/helpers/ensure-task-workflow.sh +0 -14
  102. package/assets/templates/helpers/migrate-project-template.sh +2 -2
  103. package/assets/workflow-contract.v1.json +0 -2
  104. package/docs/README.md +5 -2
  105. package/docs/architecture/CURRENT.md +205 -51
  106. package/docs/architecture/decisions/20260803-release-identity-binding-and-exit-policy.md +14 -5
  107. package/docs/architecture/decisions/20260823-immediate-controller-relay.md +6 -3
  108. package/docs/architecture/decisions/20260904-ios-device-migration-baseline.md +42 -0
  109. package/docs/architecture/decisions/20260907-assistant-learning-loop.md +2 -0
  110. package/docs/architecture/decisions/20260907-controller-round-transition-policy.md +19 -4
  111. package/docs/architecture/decisions/20260916-workflow-supervisor-authority.md +249 -0
  112. package/docs/architecture/decisions/20260917-cognitive-memory-foundation.md +82 -0
  113. package/docs/architecture/decisions/20260918-stable-candidate-release-lifecycle.md +234 -0
  114. package/docs/architecture/decisions/20260919-autonomous-work-liveness.md +62 -0
  115. package/docs/architecture/decisions/20260924-thin-semantic-working-context.md +74 -0
  116. package/docs/architecture/decisions/20261001-supervisor-turn-authority.md +342 -0
  117. package/docs/architecture/decisions/20261005-forge-v3-desktop-client-boundary.md +77 -0
  118. package/docs/architecture/decisions/20261009-exact-code-context-discovery.md +19 -0
  119. package/docs/architecture/decisions/20261009-generated-xcode-cache-retention.md +37 -0
  120. package/docs/architecture/decisions/20261011-autonomous-continuation-convergence.md +597 -0
  121. package/docs/architecture/decisions/20261017-edit-session-finalization-reconciliation.md +17 -0
  122. package/docs/architecture/decisions/20261019-retire-host-skills.md +16 -0
  123. package/docs/architecture/diagrams/agentic-dev-plugin-architecture.html +1 -1
  124. package/docs/architecture/domains/public-surface.md +3 -5
  125. package/docs/architecture/domains/verification.md +6 -5
  126. package/docs/architecture/domains/workflow-engine.md +6 -0
  127. package/docs/architecture/modules/controller-runtime/transport-lifecycle.md +3 -3
  128. package/docs/architecture/requests/2026-09-04-computer-plugin-workflow-taxonomy.md +4 -4
  129. package/docs/architecture/reviews/20261015-code-search-runtime-acceptance.md +75 -0
  130. package/docs/forge-plugin-management.md +16 -4
  131. package/docs/operations/controller-browser-plugin.md +23 -0
  132. package/docs/operations/controller-performance-and-502.md +17 -0
  133. package/docs/operations/controller-reliability-runbook.md +2 -2
  134. package/docs/operations/features.md +6 -7
  135. package/docs/operations/features.zh-CN.md +1 -1
  136. package/docs/operations/github-repository.md +4 -4
  137. package/docs/operations/github-semantic-release-projection.md +20 -0
  138. package/docs/operations/homebrew.md +2 -2
  139. package/docs/operations/mcp-tool-exposure.md +13 -52
  140. package/docs/operations/releasing.md +2 -0
  141. package/docs/operations/runtime-performance-diagnostics.md +8 -0
  142. package/docs/operations/standalone-disaster-recovery.md +15 -7
  143. package/docs/tutorials/01-install-and-start.zh-CN.md +1 -1
  144. package/docs/tutorials/03-first-repository-task.md +2 -0
  145. package/docs/wiki/Computer-and-Plugins.md +78 -0
  146. package/docs/wiki/Computer-and-Plugins.zh-CN.md +88 -0
  147. package/docs/wiki/Home.md +16 -2
  148. package/docs/wiki/Implementation.md +25 -13
  149. package/docs/wiki/Installation.md +28 -32
  150. package/docs/wiki/Integrations.md +4 -0
  151. package/docs/wiki/Quick-Start.md +35 -22
  152. package/docs/wiki/Releases-and-Upgrades.md +15 -25
  153. package/docs/wiki/_Sidebar.md +5 -1
  154. package/package.json +25 -25
  155. package/packages/kernel/cognition/api/index.ts +6 -0
  156. package/packages/kernel/cognition/application/activation-service.ts +451 -0
  157. package/packages/kernel/cognition/application/consolidation-service.ts +185 -0
  158. package/packages/kernel/cognition/application/legacy-experience-adapter.ts +38 -0
  159. package/packages/kernel/cognition/application/memory-service.ts +64 -0
  160. package/packages/kernel/cognition/domain/learning.ts +106 -0
  161. package/packages/kernel/cognition/domain/memory.ts +254 -0
  162. package/packages/kernel/controller/api/index.ts +1 -0
  163. package/packages/kernel/controller/application/continuation-service.ts +281 -0
  164. package/packages/kernel/controller/application/controller-round-service.ts +12 -0
  165. package/packages/kernel/controller/domain/controller-round-transition-policy.ts +242 -21
  166. package/packages/kernel/controller/domain/controller-round.ts +4 -1
  167. package/packages/kernel/controller/domain/execution-quality.ts +3 -1
  168. package/packages/kernel/controller/infrastructure/controller-round-store.ts +689 -103
  169. package/packages/kernel/controller/infrastructure/controller-session-store.ts +348 -97
  170. package/packages/kernel/controller/ports/controller-host.ts +2 -0
  171. package/packages/kernel/identity/api/index.ts +10 -0
  172. package/packages/kernel/identity/domain/activity-projection.ts +43 -0
  173. package/packages/kernel/identity/domain/capability-broker.ts +60 -0
  174. package/packages/kernel/identity/domain/grant.ts +72 -0
  175. package/packages/kernel/identity/domain/owned-resource.ts +116 -0
  176. package/packages/kernel/identity/domain/user-request.ts +93 -0
  177. package/packages/kernel/identity/infrastructure/activity-projection-store.ts +87 -0
  178. package/packages/kernel/identity/infrastructure/capability-broker.ts +81 -0
  179. package/packages/kernel/identity/infrastructure/grant-store.ts +284 -0
  180. package/packages/kernel/identity/infrastructure/owned-resource-store.ts +259 -0
  181. package/packages/kernel/identity/infrastructure/user-request-store.ts +182 -0
  182. package/packages/kernel/scheduler/api/index.ts +0 -2
  183. package/packages/kernel/scheduler/application/eligibility.ts +4 -1
  184. package/packages/kernel/scheduler/application/schedule-service.ts +3 -0
  185. package/packages/kernel/scheduler/application/settlement.ts +0 -15
  186. package/packages/kernel/scheduler/domain/schedule.ts +87 -0
  187. package/packages/kernel/scheduler/infrastructure/schedule-store.ts +166 -143
  188. package/packages/kernel/work/api/index.ts +3 -2
  189. package/packages/kernel/work/application/work-service.ts +18 -42
  190. package/packages/kernel/work/domain/current-task-lineage.ts +104 -0
  191. package/packages/kernel/work/domain/engineering-design.ts +10 -5
  192. package/packages/kernel/work/domain/engineering-profile.ts +8 -12
  193. package/packages/kernel/work/domain/evaluation-promotion-receipt.ts +186 -0
  194. package/packages/kernel/work/domain/execution-concurrency.ts +19 -26
  195. package/packages/kernel/work/domain/execution-snapshot.ts +0 -31
  196. package/packages/kernel/work/domain/implementation-review.ts +14 -331
  197. package/packages/kernel/work/domain/objective-graph.ts +119 -0
  198. package/packages/kernel/work/domain/project-engineering-contract.ts +23 -1
  199. package/packages/kernel/work/domain/repository-completion-receipt.ts +1 -1
  200. package/packages/kernel/work/domain/state-machine.ts +34 -65
  201. package/packages/kernel/work/domain/types.ts +57 -51
  202. package/packages/kernel/work/infrastructure/work-contract-store.ts +847 -729
  203. package/packages/kernel/work/ports/work-contract-store.ts +5 -2
  204. package/packages/plugin-runtime/browser/provider-registry.ts +12 -36
  205. package/packages/plugin-runtime/browser/session-authority.ts +2 -1
  206. package/packages/plugin-runtime/computer/chatgpt-identity.ts +24 -0
  207. package/packages/plugin-runtime/computer/conversation-target.ts +153 -0
  208. package/packages/plugin-runtime/computer/index.ts +2 -0
  209. package/packages/plugin-runtime/computer/target-authority.ts +26 -1
  210. package/packages/plugin-runtime/external/unix-jsonl-transport.ts +142 -18
  211. package/packages/protocols/computer/contract.ts +27 -1
  212. package/scripts/activate-source-baseline.ts +7 -9
  213. package/scripts/assemble-template.ts +11 -72
  214. package/scripts/canary-controller-semantic-wait.ts +12 -24
  215. package/scripts/check-mcp-compatibility.ts +94 -201
  216. package/scripts/check-package-identity.mjs +0 -5
  217. package/scripts/check-runtime-architecture.mjs +921 -239
  218. package/scripts/forge-local-recovery-helper.mjs +93 -15
  219. package/scripts/init-project.sh +0 -46
  220. package/scripts/install-ios-hid-toolchain.sh +60 -0
  221. package/scripts/install-standalone-recovery.ts +1 -1
  222. package/scripts/lib/project-init-lib.sh +6 -3
  223. package/scripts/migrate-windows-wsl-controller-home.ts +2 -0
  224. package/scripts/open-source-audit-allowlist.txt +1 -3
  225. package/scripts/run-bounded-command.mjs +5 -0
  226. package/scripts/run-governed-gate.ts +2 -1
  227. package/scripts/run-mobile-monitor-bridge.ts +0 -1
  228. package/scripts/smoke-control-plane-failure-domain.ts +94 -0
  229. package/scripts/smoke-ios-physical-device.ts +38 -10
  230. package/scripts/smoke-mcp-http-runtime.ts +12 -8
  231. package/scripts/smoke-mcp-tool-surface.ts +27 -41
  232. package/scripts/smoke-runtime-recovery.ts +12 -43
  233. package/scripts/smoke-schedule-engine.ts +23 -15
  234. package/scripts/smoke-unattended-transport-recovery.ts +223 -0
  235. package/scripts/smoke-user-request-continuation-restart.ts +232 -0
  236. package/scripts/smoke-workflow-supervisor-chrome-adapter.ts +95 -0
  237. package/scripts/smoke-workflow-supervisor-process-restart.ts +276 -0
  238. package/scripts/smoke-workflow-supervisor-restart-recovery.ts +150 -0
  239. package/scripts/smoke-workflow-supervisor.ts +103 -0
  240. package/scripts/sync-generated-authority.mjs +0 -1
  241. package/scripts/verify-forge-runtime.sh +2 -1
  242. package/src/cli/agent-jobs/executor-health.ts +12 -35
  243. package/src/cli/agent-jobs/integration.ts +20 -51
  244. package/src/cli/agent-jobs/job-manager.ts +7 -3
  245. package/src/cli/chatgpt-browser/file-policy.ts +2 -2
  246. package/src/cli/commands/brain-assistant.ts +27 -13
  247. package/src/cli/commands/brain.ts +13 -15
  248. package/src/cli/commands/chatgpt.ts +1 -163
  249. package/src/cli/commands/doctor.ts +1 -143
  250. package/src/cli/commands/global-runtime.ts +3 -196
  251. package/src/cli/commands/init-hook.ts +6 -23
  252. package/src/cli/commands/init.ts +3 -252
  253. package/src/cli/commands/mcp.ts +0 -5
  254. package/src/cli/commands/prompt-guard-decision.ts +0 -2
  255. package/src/cli/commands/recovery.ts +137 -135
  256. package/src/cli/commands/repository.ts +17 -1
  257. package/src/cli/commands/runtime.ts +3 -3
  258. package/src/cli/commands/setup-execution.ts +41 -0
  259. package/src/cli/commands/setup-profile.ts +8 -0
  260. package/src/cli/controller/check-runner.ts +13 -2
  261. package/src/cli/controller/completion-backlog.ts +3 -3
  262. package/src/cli/controller/completion-orchestrator.ts +5 -44
  263. package/src/cli/controller/completion-target.ts +3 -72
  264. package/src/cli/controller/composite-operations.ts +1 -1
  265. package/src/cli/controller/context/instruction-context.ts +1 -1
  266. package/src/cli/controller/context/known-paths.ts +2 -2
  267. package/src/cli/controller/context/query-planning.ts +11 -4
  268. package/src/cli/controller/context/rule-resolution.ts +2 -2
  269. package/src/cli/controller/context/source-materializer.ts +83 -102
  270. package/src/cli/controller/context/structural-provider.ts +84 -0
  271. package/src/cli/controller/context/structural.ts +6 -6
  272. package/src/cli/controller/context/types.ts +8 -9
  273. package/src/cli/controller/context-pack.ts +107 -84
  274. package/src/cli/controller/execution-completion.ts +4 -7
  275. package/src/cli/controller/execution-policy.ts +36 -153
  276. package/src/cli/controller/governance.ts +2 -3
  277. package/src/cli/controller/issue-store.ts +4 -99
  278. package/src/cli/controller/launch-agents.ts +59 -18
  279. package/src/cli/controller/operational-plan.ts +25 -52
  280. package/src/cli/controller/runtime-config.ts +5 -1
  281. package/src/cli/controller/stuck-state-migration.ts +2 -3
  282. package/src/cli/controller/systemd-user.ts +42 -10
  283. package/src/cli/editing/edit-session.ts +18 -12
  284. package/src/cli/github/github.ts +4 -4
  285. package/src/cli/github/semantic-projection.ts +174 -0
  286. package/src/cli/hook/prompt-intents.ts +0 -9
  287. package/src/cli/index.ts +1 -43
  288. package/src/cli/local-bridge/connector-freshness.ts +1 -12
  289. package/src/cli/local-bridge/console-automations.ts +19 -14
  290. package/src/cli/local-bridge/console-view-models.ts +4 -13
  291. package/src/cli/local-bridge/facade-api.ts +64 -193
  292. package/src/cli/local-bridge/server.ts +24 -147
  293. package/src/cli/local-bridge/types.ts +0 -1
  294. package/src/cli/mcp/oauth-client-retirement.ts +74 -0
  295. package/src/cli/repositories/command-classifier.ts +0 -9
  296. package/src/cli/repositories/command-executor.ts +29 -23
  297. package/src/cli/repositories/command-scope.ts +37 -18
  298. package/src/cli/repositories/controller-home.ts +48 -0
  299. package/src/cli/repositories/ephemeral-workspace.ts +20 -30
  300. package/src/cli/repositories/git-command-executor.ts +2 -2
  301. package/src/cli/repositories/locks.ts +20 -0
  302. package/src/cli/repositories/registry.ts +79 -12
  303. package/src/cli/repositories/safe-patch.ts +2 -12
  304. package/src/cli/repositories/structured-git.ts +101 -5
  305. package/src/cli/repository/inspector.ts +185 -343
  306. package/src/cli/repository/session-cache.ts +92 -6
  307. package/src/effects/process-runner.ts +17 -1
  308. package/src/runtime/context/assistant-context.ts +20 -7
  309. package/src/runtime/context/assistant-work-context.ts +89 -27
  310. package/src/runtime/context/automatic-learning.ts +565 -0
  311. package/src/runtime/context/cognitive-attention.ts +173 -0
  312. package/src/runtime/context/cognitive-skill-canary.ts +158 -0
  313. package/src/runtime/context/context-closure.ts +46 -9
  314. package/src/runtime/context/context-pack-process.ts +103 -0
  315. package/src/runtime/context/context-plane.ts +1 -9
  316. package/src/runtime/context/direct-controller-learning.ts +298 -0
  317. package/src/runtime/context/generic-lsp-provider.ts +1 -1
  318. package/src/runtime/context/semantic-navigation-contract.ts +16 -0
  319. package/src/runtime/context/semantic-navigation.ts +7 -35
  320. package/src/runtime/context/typescript-navigation-process.ts +145 -0
  321. package/src/runtime/context/typescript-navigation.ts +89 -3
  322. package/src/runtime/control-plane/cleanup-artifact-retention.ts +215 -12
  323. package/src/runtime/control-plane/concurrency/work-execution-concurrency.ts +9 -47
  324. package/src/runtime/control-plane/execution/controller-authority-recovery.ts +34 -4
  325. package/src/runtime/control-plane/execution/edit-validation-coordinator.ts +29 -20
  326. package/src/runtime/control-plane/execution/execution-identity.ts +23 -3
  327. package/src/runtime/control-plane/execution/repository-work-attribution.ts +7 -30
  328. package/src/runtime/control-plane/execution/retained-work-resume.ts +206 -199
  329. package/src/runtime/control-plane/execution/session-store.ts +31 -1
  330. package/src/runtime/control-plane/execution/validation.ts +6 -8
  331. package/src/runtime/control-plane/execution/work-authority-reconciler.ts +13 -42
  332. package/src/runtime/control-plane/execution/work-check-evidence.ts +137 -0
  333. package/src/runtime/control-plane/execution/work-completion-authority.ts +30 -85
  334. package/src/runtime/control-plane/execution/work-delivery-service.ts +616 -0
  335. package/src/runtime/control-plane/execution/work-evidence-policy.ts +12 -50
  336. package/src/runtime/control-plane/execution/work-execution-support.ts +50 -149
  337. package/src/runtime/control-plane/execution/work-handle-authority.ts +197 -110
  338. package/src/runtime/control-plane/execution/work-handle-store.ts +72 -44
  339. package/src/runtime/control-plane/execution/work-head-settlement.ts +53 -20
  340. package/src/runtime/control-plane/execution/work-lifecycle-audit.ts +52 -29
  341. package/src/runtime/control-plane/execution/work-operation-service.ts +60 -34
  342. package/src/runtime/control-plane/execution/work-preparation-service.ts +231 -267
  343. package/src/runtime/control-plane/execution/work-process-evidence.ts +2 -2
  344. package/src/runtime/control-plane/execution/work-remote-delivery.ts +2 -3
  345. package/src/runtime/control-plane/execution/work-revision-diff.ts +39 -0
  346. package/src/runtime/control-plane/execution/work-terminal-cleanup.ts +201 -199
  347. package/src/runtime/control-plane/execution/work-validation-reconciler.ts +33 -85
  348. package/src/runtime/control-plane/execution/work-verification-service.ts +406 -50
  349. package/src/runtime/control-plane/execution/work-verification-snapshot.ts +6 -2
  350. package/src/runtime/control-plane/facade/capability-registry.ts +364 -37
  351. package/src/runtime/control-plane/facade/check-normalization.ts +3 -9
  352. package/src/runtime/control-plane/facade/codex-delegation.ts +10 -11
  353. package/src/runtime/control-plane/facade/controller-connection.ts +135 -0
  354. package/src/runtime/control-plane/facade/goal-workloop-access.ts +1 -20
  355. package/src/runtime/control-plane/facade/goal-workloop.ts +281 -1753
  356. package/src/runtime/control-plane/facade/handoff-inbox-application.ts +12 -25
  357. package/src/runtime/control-plane/facade/handoff-inbox-store.ts +256 -52
  358. package/src/runtime/control-plane/facade/index.ts +0 -1
  359. package/src/runtime/control-plane/facade/operation-digest.ts +12 -15
  360. package/src/runtime/control-plane/facade/plan-contract-store.ts +451 -991
  361. package/src/runtime/control-plane/facade/policy-gate.ts +0 -23
  362. package/src/runtime/control-plane/facade/repository-work-admission.ts +12 -22
  363. package/src/runtime/control-plane/facade/requirement-authority.ts +102 -199
  364. package/src/runtime/control-plane/facade/requirement-board.ts +3 -3
  365. package/src/runtime/control-plane/facade/rh-work-operation-contract.ts +51 -14
  366. package/src/runtime/control-plane/facade/self-healing-loop.ts +18 -53
  367. package/src/runtime/control-plane/facade/suggested-actions.ts +15 -18
  368. package/src/runtime/control-plane/facade/types.ts +49 -108
  369. package/src/runtime/control-plane/facade/work-continuation.ts +9 -9
  370. package/src/runtime/control-plane/generated-cache-retention.ts +206 -59
  371. package/src/runtime/control-plane/global-scheduler/autonomous-continuation.ts +248 -0
  372. package/src/runtime/control-plane/global-scheduler/durable-admission.ts +1 -1
  373. package/src/runtime/control-plane/global-scheduler/maintenance.ts +256 -117
  374. package/src/runtime/control-plane/global-scheduler/reconciliation.ts +3 -12
  375. package/src/runtime/control-plane/global-scheduler/scheduler.ts +66 -40
  376. package/src/runtime/control-plane/global-scheduler/wake-signal.ts +42 -2
  377. package/src/runtime/control-plane/governance/access-policy.ts +19 -2
  378. package/src/runtime/control-plane/governance/authorization.ts +20 -3
  379. package/src/runtime/control-plane/governance/external-effects.ts +1 -1
  380. package/src/runtime/control-plane/launcher/chatgpt-round-continuation.ts +63 -300
  381. package/src/runtime/control-plane/launcher/chatgpt-work-continuation.ts +29 -300
  382. package/src/runtime/control-plane/launcher/local-conversation-controller.ts +238 -0
  383. package/src/runtime/control-plane/launcher/provider-mcp-bootstrap.ts +5 -2
  384. package/src/runtime/control-plane/launcher/thin-launcher.ts +96 -240
  385. package/src/runtime/control-plane/persistence/cognition-store.ts +820 -0
  386. package/src/runtime/control-plane/persistence/experience-store.ts +162 -29
  387. package/src/runtime/control-plane/persistence/requirement-store.ts +216 -74
  388. package/src/runtime/control-plane/persistence/sqlite-store.ts +113 -6
  389. package/src/runtime/control-plane/release-retention.ts +135 -47
  390. package/src/runtime/control-plane/repository-namespace-retention.ts +2 -2
  391. package/src/runtime/control-plane/runtime-cleanup.ts +295 -107
  392. package/src/runtime/control-plane/workspace/project-onboarding.ts +80 -0
  393. package/src/runtime/control-plane/workspace/semantic-sync-service.ts +19 -5
  394. package/src/runtime/control-plane/workspace/workspace-store.ts +169 -0
  395. package/src/runtime/diagnostics/incident-repair.ts +313 -146
  396. package/src/runtime/diagnostics/mcp-timing.ts +114 -0
  397. package/src/runtime/evidence/artifact-store.ts +158 -40
  398. package/src/runtime/evidence/evidence-store.ts +112 -8
  399. package/src/runtime/evidence/output-handle-index.ts +225 -0
  400. package/src/runtime/evidence/result-store.ts +158 -44
  401. package/src/runtime/evidence/sensitive-output.ts +22 -2
  402. package/src/runtime/execution/jobs/child-reference.ts +11 -0
  403. package/src/runtime/execution/jobs/receipt-recovery.ts +1 -11
  404. package/src/runtime/execution/jobs/store.ts +3 -4
  405. package/src/runtime/execution/managed-workspace.ts +57 -0
  406. package/src/runtime/execution/process-runtime/check-facade.ts +1 -1
  407. package/src/runtime/execution/process-runtime/check-result-retention.ts +2 -2
  408. package/src/runtime/execution/process-runtime/check-result.ts +105 -1
  409. package/src/runtime/execution/process-runtime/check-runner-sidecar.ts +18 -8
  410. package/src/runtime/execution/process-runtime/command-facade.ts +82 -30
  411. package/src/runtime/execution/process-runtime/gc.ts +15 -2
  412. package/src/runtime/execution/process-runtime/handle-index.ts +176 -0
  413. package/src/runtime/execution/process-runtime/host-command-lane.ts +139 -0
  414. package/src/runtime/execution/process-runtime/index.ts +3 -0
  415. package/src/runtime/execution/process-runtime/lightweight-managed.ts +251 -72
  416. package/src/runtime/execution/process-runtime/persisted-check.ts +3 -3
  417. package/src/runtime/execution/process-runtime/process-runner-entry.ts +47 -5
  418. package/src/runtime/execution/process-runtime/process-scope.ts +160 -0
  419. package/src/runtime/execution/process-runtime/resource-claims.ts +65 -61
  420. package/src/runtime/execution/process-runtime/runtime.ts +55 -18
  421. package/src/runtime/execution/process-runtime/store.ts +30 -2
  422. package/src/runtime/execution/process-runtime/types.ts +6 -1
  423. package/src/runtime/execution/thin-harness/execution-router.ts +16 -16
  424. package/src/runtime/execution/thin-harness/fast-executor.ts +2 -2
  425. package/src/runtime/execution/thin-harness/search-worker.ts +2 -2
  426. package/src/runtime/execution/workers/executor.ts +3 -8
  427. package/src/runtime/maintenance/cleanup.ts +41 -5
  428. package/src/runtime/platform/service-inventory.ts +130 -0
  429. package/src/runtime/platform/service-manager.ts +8 -0
  430. package/src/runtime/plugins/action-application.ts +97 -29
  431. package/src/runtime/plugins/app-store-connect-adapter.ts +290 -18
  432. package/src/runtime/plugins/browser-adapter.ts +1124 -333
  433. package/src/runtime/plugins/browser-automation-service.ts +23 -3
  434. package/src/runtime/plugins/browser-macos-bridge.ts +431 -137
  435. package/src/runtime/plugins/browser-manifest-surface.ts +47 -12
  436. package/src/runtime/plugins/browser-native-session-service.ts +63 -13
  437. package/src/runtime/plugins/browser-registration.ts +18 -0
  438. package/src/runtime/plugins/browser-runtime.ts +40 -36
  439. package/src/runtime/plugins/browser-session-authority.ts +2 -2
  440. package/src/runtime/plugins/browser-session-store.ts +46 -76
  441. package/src/runtime/plugins/capability-authorization-grants.ts +258 -62
  442. package/src/runtime/plugins/computer-chatgpt-browser-adapter-installer.ts +228 -0
  443. package/src/runtime/plugins/computer-registration.ts +298 -20
  444. package/src/runtime/plugins/desktop-operator-external-policy.ts +36 -4
  445. package/src/runtime/plugins/desktop-operator-registration.ts +12 -4
  446. package/src/runtime/plugins/external-adapter.ts +42 -6
  447. package/src/runtime/plugins/external-registration.ts +21 -1
  448. package/src/runtime/plugins/github-adapter.ts +30 -3
  449. package/src/runtime/plugins/gmail-adapter.ts +189 -3
  450. package/src/runtime/plugins/google-calendar-adapter.ts +2 -2
  451. package/src/runtime/plugins/google-shared.ts +24 -12
  452. package/src/runtime/plugins/google-tasks-adapter.ts +2 -2
  453. package/src/runtime/plugins/ios/remote-xpc-hid.ts +70 -30
  454. package/src/runtime/plugins/ios-adapter.ts +46 -41
  455. package/src/runtime/plugins/ios-agent-device.ts +54 -4
  456. package/src/runtime/plugins/ios-device-ownership.ts +103 -0
  457. package/src/runtime/plugins/ios-physical-device.ts +497 -79
  458. package/src/runtime/plugins/lightweight-action.ts +208 -2
  459. package/src/runtime/plugins/local-system-adapter.ts +12 -100
  460. package/src/runtime/plugins/managed-process-adapter.ts +12 -5
  461. package/src/runtime/plugins/plugin-action-sidecar.ts +17 -13
  462. package/src/runtime/plugins/plugin-management-adapter.ts +1 -1
  463. package/src/runtime/plugins/store.ts +682 -435
  464. package/src/runtime/plugins/types.ts +24 -0
  465. package/src/runtime/plugins/xiaohongshu-publish.ts +16 -0
  466. package/src/runtime/projections/git-status-sampler.ts +2 -19
  467. package/src/runtime/projections/invalidation.ts +7 -3
  468. package/src/runtime/projections/materialized-view.ts +80 -36
  469. package/src/runtime/recovery/actions.ts +4 -4
  470. package/src/runtime/recovery/capability-action-application.ts +46 -45
  471. package/src/runtime/recovery/lifecycle-inventory.ts +30 -40
  472. package/src/runtime/recovery/maintenance-executor.ts +374 -123
  473. package/src/runtime/recovery/probe.ts +2 -2
  474. package/src/runtime/recovery/store.ts +29 -11
  475. package/src/runtime/release/release-coordinator.ts +312 -0
  476. package/src/runtime/release/release-session.ts +716 -0
  477. package/src/runtime/release/release-state-migration.ts +25 -0
  478. package/src/runtime/resources/leases/store.ts +56 -25
  479. package/src/runtime/root/computer-composition.ts +191 -6
  480. package/src/runtime/root/controller-progression-composition.ts +254 -0
  481. package/src/runtime/root/controller-round-composition.ts +20 -1
  482. package/src/runtime/root/deployment-topology.ts +106 -0
  483. package/src/runtime/root/entry.ts +4 -3
  484. package/src/runtime/root/known-good-recovery.ts +184 -0
  485. package/src/runtime/root/local-bridge.ts +0 -1
  486. package/src/runtime/root/mcp-transport.ts +111 -18
  487. package/src/runtime/root/ownership.ts +261 -9
  488. package/src/runtime/root/package-connector-service.ts +227 -29
  489. package/src/runtime/root/package-runtime-release.ts +117 -30
  490. package/src/runtime/root/package-runtime-service.ts +24 -24
  491. package/src/runtime/root/release-execution-canary.ts +57 -12
  492. package/src/runtime/root/release-loader.ts +90 -8
  493. package/src/runtime/root/release-manifest.ts +80 -40
  494. package/src/runtime/root/release-materialize.ts +372 -106
  495. package/src/runtime/root/release-store.ts +395 -36
  496. package/src/runtime/root/runtime-lane.ts +191 -0
  497. package/src/runtime/root/runtime.ts +160 -29
  498. package/src/runtime/root/scheduled-controller-composition.ts +29 -3
  499. package/src/runtime/root/service-runner.ts +2 -2
  500. package/src/runtime/root/service.ts +126 -44
  501. package/src/runtime/root/status.ts +48 -0
  502. package/src/runtime/root/types.ts +32 -9
  503. package/src/runtime/root/workflow-supervisor-composition.ts +681 -0
  504. package/src/runtime/root/workflow-supervisor-runtime.ts +564 -0
  505. package/src/runtime/root/write-fence.ts +50 -2
  506. package/src/runtime/safe-tooling/google-credential-store.ts +67 -22
  507. package/src/runtime/safe-tooling/google-oauth-broker.ts +25 -7
  508. package/src/runtime/safe-tooling/ios-development.ts +22 -8
  509. package/src/runtime/safe-tooling/job-summary.ts +1 -1
  510. package/src/runtime/safe-tooling/workspace-auth.ts +5 -2
  511. package/src/runtime/shared/atomic-text-file.ts +21 -0
  512. package/src/runtime/shared/bounded-child-supervisor.ts +9 -1
  513. package/src/runtime/shared/json-files.ts +8 -3
  514. package/src/runtime/shared/process-environment.ts +20 -9
  515. package/src/runtime/shared/response-budget.ts +1 -3
  516. package/src/runtime/standalone-recovery/controller-home-migration.ts +16 -24
  517. package/src/runtime/standalone-recovery/core.ts +3792 -417
  518. package/src/runtime/standalone-recovery/entry.ts +507 -45
  519. package/src/runtime/standalone-recovery/installer.ts +262 -148
  520. package/src/runtime/standalone-recovery/mcp-server.ts +29 -193
  521. package/src/runtime/standalone-recovery/operation-lock.ts +12 -2
  522. package/src/runtime/standalone-recovery/performance.ts +54 -16
  523. package/src/runtime/standalone-recovery/release.ts +53 -5
  524. package/src/runtime/standalone-recovery/service-labels.ts +5 -2
  525. package/src/runtime/standalone-recovery/watchdog-heartbeat.ts +5 -2
  526. package/src/runtime/workflow/schedules/browser-probe.ts +17 -6
  527. package/src/runtime/workflow/schedules/chatgpt-automation-migration.ts +11 -3
  528. package/src/runtime/workflow/schedules/engine.ts +166 -178
  529. package/src/runtime/workflow/schedules/pending-activation.ts +11 -4
  530. package/src/runtime/workflow/schedules/work-continuation.ts +95 -11
  531. package/src/runtime/workflows/runtime.ts +15 -19
  532. package/src/testing/test-governance.ts +5 -1
  533. package/supervisor/chatgpt-conversation.ts +23 -0
  534. package/supervisor/client.ts +218 -0
  535. package/supervisor/control-plane.ts +963 -0
  536. package/supervisor/entry.ts +15 -0
  537. package/supervisor/forge-validators.ts +147 -0
  538. package/supervisor/index.ts +5 -0
  539. package/supervisor/native-browser-adapter.ts +1151 -0
  540. package/supervisor/native-messaging/host.ts +58 -0
  541. package/supervisor/native-messaging/manifest.ts +26 -0
  542. package/supervisor/native-messaging/protocol.ts +27 -0
  543. package/supervisor/paths.ts +18 -0
  544. package/supervisor/protocol.ts +250 -0
  545. package/supervisor/server.ts +412 -0
  546. package/supervisor/store.ts +1870 -0
  547. package/supervisor/tsconfig.json +8 -0
  548. package/supervisor/types.ts +261 -0
  549. package/SKILL.md +0 -427
  550. package/adapters/chatgpt/controller-host.ts +0 -119
  551. package/adapters/mcp/controller-round-compatibility.ts +0 -184
  552. package/adapters/mcp/frozen-client-semantic-compatibility.ts +0 -292
  553. package/adapters/mcp/runtime-gateway/work-compat-adapter.ts +0 -502
  554. package/adapters/mcp/runtime-gateway/work-validation-reconciler.ts +0 -1
  555. package/adapters/mcp/toolset-selection.ts +0 -41
  556. package/agents/openai.yaml +0 -4
  557. package/assets/skill-hooks.json +0 -41
  558. package/assets/skill-version.json +0 -189
  559. package/assets/skills/claude-review/SKILL.md +0 -231
  560. package/assets/skills/codex-review/SKILL.md +0 -103
  561. package/assets/templates/helpers/check-skill-version.ts +0 -193
  562. package/packages/kernel/progression/api/index.ts +0 -2
  563. package/packages/kernel/progression/application/projector.ts +0 -211
  564. package/packages/kernel/progression/domain/types.ts +0 -116
  565. package/packages/kernel/progression/index.ts +0 -1
  566. package/packages/kernel/scheduler/application/continuation-service.ts +0 -212
  567. package/packages/kernel/scheduler/domain/continuation.ts +0 -38
  568. package/packages/kernel/scheduler/infrastructure/continuation-dispatch-store.ts +0 -38
  569. package/packages/kernel/work/domain/admission-policy.ts +0 -34
  570. package/scripts/benchmark-background-check-overlap.ts +0 -228
  571. package/scripts/benchmark-computer-hotpath.ts +0 -255
  572. package/scripts/benchmark-controller-hotpath.ts +0 -212
  573. package/scripts/benchmark-controller-round2.ts +0 -191
  574. package/scripts/benchmark-ios-agent-device.ts +0 -511
  575. package/scripts/benchmark-mcp-host.sh +0 -117
  576. package/scripts/benchmark-mcp-transport.ts +0 -169
  577. package/scripts/benchmark-operational-memory-activation.ts +0 -235
  578. package/scripts/benchmark-operational-shadow.ts +0 -28
  579. package/scripts/benchmark-quality-harness.ts +0 -146
  580. package/scripts/benchmark-route-session-concurrency.ts +0 -915
  581. package/scripts/benchmark-thin-harness-gateway-ab.ts +0 -632
  582. package/scripts/benchmark-thin-harness-mcp-e2e.ts +0 -498
  583. package/scripts/benchmark-thin-harness.ts +0 -251
  584. package/scripts/benchmark-typescript-navigation.ts +0 -186
  585. package/scripts/benchmark-work-efficiency.ts +0 -334
  586. package/scripts/build-controller-ui.ts +0 -28
  587. package/scripts/check-npm-release.sh +0 -32
  588. package/scripts/check-public-release-surface.sh +0 -19
  589. package/scripts/check-release-published.sh +0 -57
  590. package/scripts/check-release-readiness.sh +0 -37
  591. package/scripts/check-release-version.mjs +0 -74
  592. package/scripts/check-skill-version.ts +0 -5
  593. package/scripts/check-tarball-install-smoke.sh +0 -150
  594. package/scripts/ensure-codegraph.sh +0 -16
  595. package/scripts/package-source-archive.sh +0 -147
  596. package/scripts/public-release-files.txt +0 -39
  597. package/scripts/public-release.ts +0 -174
  598. package/scripts/publish-release-tarball.sh +0 -27
  599. package/scripts/route-nl-vs-ts-eval.ts +0 -679
  600. package/scripts/run-skill-hook.ts +0 -244
  601. package/scripts/stage-runtime-release.ts +0 -44
  602. package/scripts/sync-codex-installed-copies.sh +0 -182
  603. package/src/cli/commands/tools.ts +0 -167
  604. package/src/cli/controller/progress.ts +0 -656
  605. package/src/cli/controller/work-mode.ts +0 -181
  606. package/src/cli/local-bridge/console-assets.ts +0 -17
  607. package/src/cli/local-bridge/dashboard.ts +0 -17
  608. package/src/cli/local-bridge/frontend/src/App.tsx +0 -10
  609. package/src/cli/local-bridge/frontend/src/components/Button.tsx +0 -1
  610. package/src/cli/local-bridge/frontend/src/components/DetailPane.tsx +0 -3
  611. package/src/cli/local-bridge/frontend/src/components/SearchField.tsx +0 -1
  612. package/src/cli/local-bridge/frontend/src/components/SectionHeader.tsx +0 -1
  613. package/src/cli/local-bridge/frontend/src/components/Segmented.tsx +0 -1
  614. package/src/cli/local-bridge/frontend/src/components/StatusText.tsx +0 -3
  615. package/src/cli/local-bridge/frontend/src/design/icons.tsx +0 -11
  616. package/src/cli/local-bridge/frontend/src/design/tokens.css +0 -8
  617. package/src/cli/local-bridge/frontend/src/features/automations/AutomationsView.tsx +0 -153
  618. package/src/cli/local-bridge/frontend/src/features/capabilities/CapabilitiesView.tsx +0 -37
  619. package/src/cli/local-bridge/frontend/src/features/overview/OverviewView.tsx +0 -183
  620. package/src/cli/local-bridge/frontend/src/features/repositories/RepositoriesView.tsx +0 -2
  621. package/src/cli/local-bridge/frontend/src/features/system/SystemView.tsx +0 -2
  622. package/src/cli/local-bridge/frontend/src/features/work/WorkView.tsx +0 -4
  623. package/src/cli/local-bridge/frontend/src/lib/api.ts +0 -30
  624. package/src/cli/local-bridge/frontend/src/lib/format.ts +0 -4
  625. package/src/cli/local-bridge/frontend/src/lib/routes.ts +0 -7
  626. package/src/cli/local-bridge/frontend/src/main.tsx +0 -1
  627. package/src/cli/local-bridge/frontend/src/shell/AppShell.tsx +0 -1
  628. package/src/cli/local-bridge/frontend/src/shell/CommandBar.tsx +0 -2
  629. package/src/cli/local-bridge/frontend/src/shell/Sidebar.tsx +0 -4
  630. package/src/cli/local-bridge/frontend/src/styles.css +0 -28
  631. package/src/cli/local-bridge/frontend/src/types.ts +0 -15
  632. package/src/cli/local-bridge/frontend/src/vite-env.d.ts +0 -1
  633. package/src/cli/local-bridge/frontend/vite.config.ts +0 -27
  634. package/src/cli/local-bridge/ui-dist/app.css +0 -1
  635. package/src/cli/local-bridge/ui-dist/app.js +0 -11228
  636. package/src/cli/mcp/access-mode.ts +0 -2
  637. package/src/cli/mcp/access-tools.ts +0 -2
  638. package/src/cli/mcp/audit.ts +0 -2
  639. package/src/cli/mcp/auth.ts +0 -2
  640. package/src/cli/mcp/instructions.ts +0 -2
  641. package/src/cli/mcp/legacy-context.ts +0 -2
  642. package/src/cli/mcp/legacy-tool-service.ts +0 -2
  643. package/src/cli/mcp/multi-repository.ts +0 -2
  644. package/src/cli/mcp/oauth.ts +0 -2
  645. package/src/cli/mcp/openai-secure-tunnel.ts +0 -2
  646. package/src/cli/mcp/paths.ts +0 -2
  647. package/src/cli/mcp/policy.ts +0 -2
  648. package/src/cli/mcp/post-finalize-work-attribution.ts +0 -2
  649. package/src/cli/mcp/proxy-env.ts +0 -2
  650. package/src/cli/mcp/readiness-projection.ts +0 -2
  651. package/src/cli/mcp/redaction.ts +0 -2
  652. package/src/cli/mcp/repo.ts +0 -2
  653. package/src/cli/mcp/repository-tools.ts +0 -2
  654. package/src/cli/mcp/server.ts +0 -2
  655. package/src/cli/mcp/setup.ts +0 -2
  656. package/src/cli/mcp/tool-capability-cache.ts +0 -2
  657. package/src/cli/mcp/tool-contract.ts +0 -2
  658. package/src/cli/mcp/tools.ts +0 -2
  659. package/src/cli/mcp/toolset-names.ts +0 -2
  660. package/src/cli/mcp/toolset-selection.ts +0 -2
  661. package/src/cli/mcp/toolset.ts +0 -2
  662. package/src/cli/mcp/transports/http.ts +0 -2
  663. package/src/cli/mcp/transports/session-registry.ts +0 -2
  664. package/src/cli/mcp/transports/stdio.ts +0 -2
  665. package/src/cli/mcp/types.ts +0 -2
  666. package/src/cli/mcp/umbrella-tools.ts +0 -2
  667. package/src/cli/tools/codegraph.ts +0 -695
  668. package/src/core/adoption/helper-wrapper-plan.ts +0 -159
  669. package/src/runtime/context/codegraph-cache-boundary.ts +0 -255
  670. package/src/runtime/context/codegraph-read-provider.ts +0 -611
  671. package/src/runtime/context/codegraph-sidecar.cjs +0 -248
  672. package/src/runtime/control-plane/codegraph-cache-retention.ts +0 -164
  673. package/src/runtime/control-plane/execution/content-equivalent-commit-authority.ts +0 -169
  674. package/src/runtime/control-plane/execution/direct-canonical-work-reconciliation.ts +0 -85
  675. package/src/runtime/control-plane/execution/direct-edit-work-completion.ts +0 -655
  676. package/src/runtime/control-plane/execution/work-finalization-service.ts +0 -2850
  677. package/src/runtime/control-plane/execution/work-path-scope.ts +0 -37
  678. package/src/runtime/control-plane/execution/work-task-receipt.ts +0 -468
  679. package/src/runtime/control-plane/facade/controller-round-relay.ts +0 -3
  680. package/src/runtime/control-plane/facade/work-admission-policy.ts +0 -142
  681. package/src/runtime/control-plane/facade/work-implementation-review.ts +0 -2
  682. package/src/runtime/control-plane/facade/work-state-machine.ts +0 -2
  683. package/src/runtime/control-plane/facade/work-task-projection.ts +0 -66
  684. package/src/runtime/control-plane/routing/index.ts +0 -1
  685. package/src/runtime/control-plane/routing/route-policy.ts +0 -401
  686. package/src/runtime/control-plane/routing/workspace-admission.ts +0 -70
  687. package/src/runtime/gateway/mcp/execution-tools.ts +0 -2
  688. package/src/runtime/gateway/mcp/legacy-ios-tool-adapter.ts +0 -2
  689. package/src/runtime/gateway/mcp/persisted-check-process.ts +0 -2
  690. package/src/runtime/gateway/mcp/process-tools.ts +0 -2
  691. package/src/runtime/gateway/mcp/router.ts +0 -2
  692. package/src/runtime/gateway/mcp/runtime-tool-definitions.ts +0 -2
  693. package/src/runtime/gateway/mcp/runtime-tools.ts +0 -2
  694. package/src/runtime/gateway/mcp/work-validation-reconciler.ts +0 -2
  695. package/src/runtime/plugins/browser-provider-registry.ts +0 -2
@@ -1,7 +1,10 @@
1
- import type { WorkContract, WorkContractStore, WorkContractStatus } from '../domain/types';
1
+ import type { SemanticWorkState, WorkContract, WorkContractStore } from '../domain/types';
2
2
 
3
3
  export interface WorkContractStoreLocation {
4
4
  controllerHome?: string;
5
+ /** Canonical storage scope. Semantic Work uses the portable semantic scope; repository Work may omit this and use repoId. */
6
+ scopeKey?: string;
7
+ /** Legacy/repository execution storage scope and optional placement context. */
5
8
  repoId?: string;
6
9
  root?: string;
7
10
  }
@@ -14,5 +17,5 @@ export interface WorkContractStoreOptions extends WorkContractStoreLocation {
14
17
  export interface WorkContractPersistencePort {
15
18
  read(options: WorkContractStoreOptions): WorkContractStore;
16
19
  get(options: WorkContractStoreOptions, workId: string): WorkContract | undefined;
17
- list(options: WorkContractStoreOptions & { status?: WorkContractStatus | 'active' | 'all'; limit?: number }): WorkContract[];
20
+ list(options: WorkContractStoreOptions & { state?: SemanticWorkState | 'active' | 'all'; limit?: number }): WorkContract[];
18
21
  }
@@ -6,8 +6,6 @@ import {
6
6
  } from './runtime-contract';
7
7
 
8
8
  export interface BrowserRuntimeProvider<TInput, TResult> extends BrowserProviderCapabilities {
9
- /** Lower values are preferred when multiple providers satisfy the same capability contract. */
10
- priority: number;
11
9
  /** Availability is decided before execution; ordinary provider failures are never fallback signals. */
12
10
  supportsInput(input: TInput): boolean;
13
11
  execute(input: TInput): Promise<TResult>;
@@ -37,22 +35,6 @@ export class BrowserProviderSelectionError extends Error {
37
35
  }
38
36
  }
39
37
 
40
- /**
41
- * A typed pre-action rejection. Runtime may select another provider because this proves the action
42
- * was not attempted. Arbitrary provider errors are intentionally not mapped to this signal.
43
- */
44
- export class BrowserProviderUnavailableBeforeActionError extends Error {
45
- readonly providerId: string;
46
- readonly reason: string;
47
-
48
- constructor(providerId: string, reason: string) {
49
- super(`${providerId} unavailable before action: ${reason}`);
50
- this.name = 'BrowserProviderUnavailableBeforeActionError';
51
- this.providerId = providerId;
52
- this.reason = reason;
53
- }
54
- }
55
-
56
38
  function foregroundCompatible(
57
39
  provider: BrowserProviderCapabilities,
58
40
  requested: BrowserForegroundRequirement,
@@ -61,24 +43,23 @@ function foregroundCompatible(
61
43
  }
62
44
 
63
45
  export class BrowserProviderRegistry<TInput, TResult> {
64
- private readonly providers = new Map<string, BrowserProviderState<TInput, TResult>>();
46
+ private state?: BrowserProviderState<TInput, TResult>;
65
47
 
66
48
  register(provider: BrowserRuntimeProvider<TInput, TResult>): void {
67
- const current = this.providers.get(provider.providerId);
68
- if (current) {
69
- current.provider = provider;
49
+ if (this.state?.provider.providerId === provider.providerId) {
50
+ this.state.provider = provider;
70
51
  return;
71
52
  }
72
- this.providers.set(provider.providerId, { provider, generation: 1 });
53
+ // A configuration change replaces the binding; it never accumulates candidates.
54
+ this.state = { provider, generation: 1 };
73
55
  }
74
56
 
75
57
  invalidate(providerId: string, reason: string): void {
76
- const state = this.providers.get(providerId);
77
- if (state) state.invalidatedReason = reason;
58
+ if (this.state?.provider.providerId === providerId) this.state.invalidatedReason = reason;
78
59
  }
79
60
 
80
61
  invalidateAll(reason: string): void {
81
- for (const state of this.providers.values()) state.invalidatedReason = reason;
62
+ if (this.state) this.state.invalidatedReason = reason;
82
63
  }
83
64
 
84
65
  private async prepare(state: BrowserProviderState<TInput, TResult>): Promise<void> {
@@ -92,17 +73,12 @@ export class BrowserProviderRegistry<TInput, TResult> {
92
73
  input: TInput;
93
74
  requiredCapabilities: readonly BrowserProviderCapability[];
94
75
  foreground: BrowserForegroundRequirement;
95
- excludedProviderIds?: ReadonlySet<string>;
96
76
  }): Promise<BrowserProviderSelection<TInput, TResult>> {
97
- const candidates = [...this.providers.values()]
98
- .filter(({ provider }) => !options.excludedProviderIds?.has(provider.providerId))
99
- .filter(({ provider }) => provider.supportsInput(options.input))
100
- .filter(({ provider }) => providerSupports(provider, options.requiredCapabilities))
101
- .filter(({ provider }) => foregroundCompatible(provider, options.foreground))
102
- .sort((left, right) => left.provider.priority - right.provider.priority
103
- || left.provider.providerId.localeCompare(right.provider.providerId));
104
-
105
- const selected = candidates[0];
77
+ const selected = this.state
78
+ && this.state.provider.supportsInput(options.input)
79
+ && providerSupports(this.state.provider, options.requiredCapabilities)
80
+ && foregroundCompatible(this.state.provider, options.foreground)
81
+ ? this.state : undefined;
106
82
  if (!selected) throw new BrowserProviderSelectionError(options.requiredCapabilities);
107
83
  await this.prepare(selected);
108
84
  return { provider: selected.provider, generation: selected.generation };
@@ -4,7 +4,8 @@ export const MAX_BROWSER_SESSION_LIST_LIMIT = 200;
4
4
  /** State-free Browser execution scope. Durable interaction identity belongs to Computer SurfaceTarget authority. */
5
5
  export interface BrowserSessionExecutionContext {
6
6
  controllerHome: string;
7
- repoId: string;
7
+ /** Optional repository visibility/migration context; never Browser session authority. */
8
+ repoId?: string;
8
9
  }
9
10
 
10
11
  /** @deprecated Compatibility alias for frozen callers; this is context, not an authority capability. */
@@ -0,0 +1,24 @@
1
+ const CHATGPT_HOSTS = new Set(['chatgpt.com', 'www.chatgpt.com', 'chat.openai.com']);
2
+ const MAX_CONVERSATION_ID_CHARS = 256;
3
+
4
+ export interface CanonicalChatgptConversationIdentity {
5
+ conversationUrl: string;
6
+ conversationId: string;
7
+ }
8
+
9
+ export function parseCanonicalChatgptConversationIdentity(value: string): CanonicalChatgptConversationIdentity {
10
+ let url: URL;
11
+ try { url = new URL(value); } catch { throw new Error('CHATGPT_CONVERSATION_URL_INVALID'); }
12
+ if (url.protocol !== 'https:' || !CHATGPT_HOSTS.has(url.hostname)) throw new Error('CHATGPT_CONVERSATION_URL_INVALID');
13
+ const parts = url.pathname.split('/').filter(Boolean);
14
+ const marker = parts.lastIndexOf('c');
15
+ if (marker < 0 || marker + 2 !== parts.length) throw new Error('CHATGPT_CONVERSATION_ID_MISSING');
16
+ const conversationId = parts[marker + 1]?.trim() ?? '';
17
+ if (!conversationId) throw new Error('CHATGPT_CONVERSATION_ID_MISSING');
18
+ if (conversationId.length > MAX_CONVERSATION_ID_CHARS) throw new Error('CHATGPT_CONVERSATION_ID_INVALID');
19
+ url.protocol = 'https:';
20
+ url.hostname = 'chatgpt.com';
21
+ url.search = '';
22
+ url.hash = '';
23
+ return { conversationUrl: url.toString(), conversationId };
24
+ }
@@ -0,0 +1,153 @@
1
+ import type { ComputerSurfaceProviderBinding } from './target-authority';
2
+
3
+ export interface ComputerChatgptConversationIdentity {
4
+ namespace: 'chatgpt.conversation';
5
+ conversationId: string;
6
+ canonicalUrl: string;
7
+ }
8
+
9
+ export interface ComputerChatgptBootstrapIdentity {
10
+ namespace: 'chatgpt.bootstrap';
11
+ bootstrapKey: string;
12
+ projectUrl: string;
13
+ }
14
+
15
+ export type ComputerChatgptTargetIdentity = ComputerChatgptConversationIdentity | ComputerChatgptBootstrapIdentity;
16
+
17
+ export interface ComputerChatgptConversationObservation {
18
+ url: string;
19
+ title: string;
20
+ latestUserText: string;
21
+ latestAssistantResponse: string;
22
+ userMessages?: string[];
23
+ assistantMessages?: string[];
24
+ composerText?: string;
25
+ /** Read-only content-script selector attestation; undefined on older loaded scripts. */
26
+ composerSelectorVersion?: 'visible-single-v2';
27
+ /** Exact loaded content-script contract; file projection/version on disk is not a live browser attestation. */
28
+ composerReplacementContract?: 'exact-backed-up-project-draft-v1';
29
+ providerActivityText: string;
30
+ providerFailureText: string;
31
+ pageText?: string;
32
+ latestTurnRole?: 'user' | 'assistant';
33
+ isGenerating: boolean;
34
+ }
35
+
36
+ export interface ComputerChatgptConversationObservationOptions {
37
+ includeUserHistory?: boolean;
38
+ includePageText?: boolean;
39
+ }
40
+
41
+ /**
42
+ * Opaque exact-conversation attachment. The targetId is durable Computer
43
+ * identity; provider ids and tab/window handles remain inside the Computer
44
+ * implementation and can be replaced without changing Supervisor authority.
45
+ */
46
+ export interface ComputerChatgptConversationTarget {
47
+ targetId: string;
48
+ identity: ComputerChatgptTargetIdentity;
49
+ observe(options?: ComputerChatgptConversationObservationOptions): Promise<ComputerChatgptConversationObservation>;
50
+ /** UI-only preparation. Must never click Send or create a provider turn. */
51
+ prepare(prompt: string, options?: { mode?: 'send' | 'resume' | 'recover' }): Promise<{ ready: true } | { ready: false; reasonCode: string }>;
52
+ dispatch(
53
+ prompt: string,
54
+ options?: { mode?: 'send' | 'resume' | 'recover' },
55
+ ): Promise<
56
+ | { mutation: 'not_attempted'; reasonCode: string }
57
+ | { mutation: 'attempted'; confirmed?: boolean }
58
+ >;
59
+ }
60
+
61
+ export type ComputerChatgptTargetFailure = {
62
+ code: string;
63
+ retryable: boolean;
64
+ /** Failover is legal only while provider mutation is mechanically impossible. */
65
+ phase: 'pre_mutation';
66
+ /** False when provider resource recovery is itself outcome-unknown. */
67
+ failoverSafe?: boolean;
68
+ humanAction?: 'login' | 'grant_permission';
69
+ };
70
+
71
+ export type ComputerChatgptTargetResult =
72
+ | { state: 'ready'; target: ComputerChatgptConversationTarget; observation?: ComputerChatgptConversationObservation }
73
+ | { state: 'unavailable'; failure: ComputerChatgptTargetFailure };
74
+
75
+ export interface ComputerObservedChatgptConversation {
76
+ conversationId: string;
77
+ canonicalUrl: string;
78
+ title?: string;
79
+ projectTitle?: string;
80
+ projectUrl?: string;
81
+ isCurrent?: boolean;
82
+ }
83
+
84
+ export interface ComputerChatgptConversationInventory {
85
+ conversations: ComputerObservedChatgptConversation[];
86
+ /** Full coverage of all supported browser families, not only active providers. */
87
+ complete: boolean;
88
+ /** At least one provider completed its own inventory; not exact-target/send proof. */
89
+ providerInventoryReady?: boolean;
90
+ unavailableProviders: string[];
91
+ }
92
+
93
+ /**
94
+ * Browser/Computer-owned target boundary consumed by Workflow Supervisor.
95
+ * Implementations own discovery, exact target recovery, provider binding and
96
+ * transport replacement. They never decide effect admission or effect outcome.
97
+ */
98
+ export type ComputerChatgptExtensionCommand =
99
+ | { commandId: string; kind: 'ensure'; identity: ComputerChatgptTargetIdentity; providerBinding?: ComputerSurfaceProviderBinding }
100
+ | { commandId: string; kind: 'observe'; identity: ComputerChatgptTargetIdentity; providerBinding?: ComputerSurfaceProviderBinding; options?: ComputerChatgptConversationObservationOptions }
101
+ | { commandId: string; kind: 'dispatch' | 'prepare'; identity: ComputerChatgptTargetIdentity; providerBinding?: ComputerSurfaceProviderBinding; prompt: string; mode?: 'send' | 'resume' | 'recover' }
102
+ | { commandId: string; kind: 'find_marker'; marker: string; bootstrapKey?: string }
103
+ | { commandId: string; kind: 'close'; identity: ComputerChatgptTargetIdentity; providerBinding?: ComputerSurfaceProviderBinding };
104
+ export type ComputerChatgptExtensionCommandInput = ComputerChatgptExtensionCommand extends infer Command
105
+ ? Command extends { commandId: string }
106
+ ? Omit<Command, 'commandId'>
107
+ : never
108
+ : never;
109
+
110
+
111
+ export type ComputerChatgptExtensionCommandResult =
112
+ | { kind: 'ensured'; providerBinding?: ComputerSurfaceProviderBinding; observation?: ComputerChatgptConversationObservation }
113
+ | { kind: 'observation'; providerBinding?: ComputerSurfaceProviderBinding; observation: ComputerChatgptConversationObservation }
114
+ | { kind: 'prepared'; ready: true }
115
+ | { kind: 'prepared'; ready: false; reasonCode: string }
116
+ | { kind: 'dispatch'; mutation: 'not_attempted'; reasonCode: string }
117
+ | { kind: 'dispatch'; mutation: 'attempted'; confirmed?: boolean; observation?: ComputerChatgptConversationObservation }
118
+ | { kind: 'marker_matches'; matches: Array<{ identity: ComputerChatgptConversationIdentity; providerBinding?: ComputerSurfaceProviderBinding; observation: ComputerChatgptConversationObservation }> }
119
+ | { kind: 'closed' }
120
+ | { kind: 'failed'; code: string; retryable?: boolean; failoverSafe?: boolean; humanAction?: 'login' | 'grant_permission';
121
+ /** Exact attachment retained after ensure hydration failed; never Send/readiness authority. */
122
+ providerBinding?: ComputerSurfaceProviderBinding };
123
+
124
+ export interface ComputerChatgptExtensionHeartbeat {
125
+ providerId: string;
126
+ /** Ephemeral browser/profile provider runtime identity; mechanical binding only. */
127
+ providerInstanceId: string;
128
+ observedAt: string;
129
+ conversations: Array<ComputerObservedChatgptConversation & { providerBinding?: ComputerSurfaceProviderBinding }>;
130
+ }
131
+
132
+ export interface ComputerChatgptExtensionBrokerRpc {
133
+ heartbeat(input: ComputerChatgptExtensionHeartbeat): void;
134
+ claim(providerInstanceId: string): ComputerChatgptExtensionCommand | undefined;
135
+ complete(providerInstanceId: string, commandId: string, result: ComputerChatgptExtensionCommandResult): boolean;
136
+ }
137
+
138
+ export interface ComputerChatgptConversationTargetPort {
139
+ inventory(): Promise<ComputerChatgptConversationInventory>;
140
+ /** Read-only reconciliation cannot create a missing tab. Only a separately authorized new send may opt in to exact conversation creation. */
141
+ ensureExact(identity: ComputerChatgptConversationIdentity, options?: { createIfMissing?: boolean }): Promise<ComputerChatgptTargetResult>;
142
+ openBootstrap(projectUrl: string, bootstrapKey: string): Promise<ComputerChatgptTargetResult>;
143
+ findBySubmittedMarker(
144
+ marker: string,
145
+ bootstrapKey?: string,
146
+ betweenObservations?: () => Promise<void>,
147
+ ): Promise<ComputerChatgptTargetResult[]>;
148
+ promoteBootstrap(targetId: string, identity: ComputerChatgptConversationIdentity): Promise<ComputerChatgptTargetResult>;
149
+ /** Mechanical cleanup of provider-owned attachments; semantic target identity remains durable. */
150
+ cleanup(activeResourceKeys: readonly string[]): Promise<void>;
151
+ release(targetId: string): Promise<void>;
152
+ close(): Promise<void>;
153
+ }
@@ -4,3 +4,5 @@ export * from './provider-error';
4
4
  export * from './provider-registration';
5
5
  export * from './target-authority';
6
6
  export * from './target-persistence';
7
+ export * from './conversation-target';
8
+ export * from './chatgpt-identity';
@@ -8,8 +8,14 @@ export interface ComputerProviderTargetBinding {
8
8
  providerId: string;
9
9
  providerSessionId: string;
10
10
  observedAt: string;
11
+ /** Rebuildable exact native process observation for cross-target lifecycle fencing. */
12
+ processId?: number;
11
13
  }
12
14
 
15
+ export type ComputerApplicationLaunchProvenance =
16
+ | { kind: 'preexisting' }
17
+ | { kind: 'provider_launched'; processId: number };
18
+
13
19
  export type ComputerSurfaceType = 'browser-tab' | 'browser-page';
14
20
  export type ComputerSurfaceOwnership = 'plugin_owned' | 'user_owned' | 'provider_owned';
15
21
  export type ComputerSurfaceVisibility = 'repositories' | 'controller';
@@ -18,10 +24,19 @@ export type ComputerSurfaceVisibility = 'repositories' | 'controller';
18
24
  * Durable semantic description of a Computer surface. Mutable URL/title and
19
25
  * provider-specific tab/window handles are deliberately excluded.
20
26
  */
27
+ export interface ComputerSurfaceResourceIdentity {
28
+ /** Stable semantic namespace, for example chatgpt.conversation. */
29
+ namespace: string;
30
+ /** Provider-independent durable resource key inside the namespace. */
31
+ key: string;
32
+ }
33
+
21
34
  export interface ComputerSurfaceStableIdentity {
22
35
  surfaceType: ComputerSurfaceType;
23
36
  ownership: ComputerSurfaceOwnership;
24
37
  application?: ComputerApplicationStableIdentity;
38
+ /** Durable semantic identity. Provider tab/window/session ids never belong here. */
39
+ resource?: ComputerSurfaceResourceIdentity;
25
40
  }
26
41
 
27
42
  /**
@@ -52,6 +67,8 @@ export interface ComputerApplicationTarget {
52
67
  targetId: string;
53
68
  kind: 'application';
54
69
  stableIdentity: ComputerApplicationStableIdentity;
70
+ /** Durable launch fact. Missing means a legacy provider supplied no trustworthy provenance. */
71
+ launchProvenance?: ComputerApplicationLaunchProvenance;
55
72
  providerBinding?: ComputerProviderTargetBinding;
56
73
  createdAt: string;
57
74
  updatedAt: string;
@@ -93,6 +110,8 @@ export interface ComputerApplicationTargetLease {
93
110
  export interface ComputerSurfaceTargetLease {
94
111
  current(): ComputerSurfaceTarget;
95
112
  bind(binding: ComputerSurfaceProviderBinding): ComputerSurfaceTarget;
113
+ /** Provider attachment is rebuildable and may be cleared without changing target identity. */
114
+ clearBinding(): ComputerSurfaceTarget;
96
115
  mergeCompatibility(input: { compatibilityAliases?: string[]; repositoryIds?: string[] }): ComputerSurfaceTarget;
97
116
  putCompatibility(record: ComputerSurfaceCompatibilityRecord): ComputerSurfaceTarget;
98
117
  tombstone(): ComputerSurfaceTarget;
@@ -146,10 +165,15 @@ export interface ComputerInteractionTargetCleanupReport {
146
165
  export interface ComputerInteractionTargetAuthorityPort {
147
166
  create(
148
167
  controllerHome: string,
149
- input: { stableIdentity: ComputerApplicationStableIdentity; providerBinding?: ComputerProviderTargetBinding },
168
+ input: {
169
+ stableIdentity: ComputerApplicationStableIdentity;
170
+ launchProvenance?: ComputerApplicationLaunchProvenance;
171
+ providerBinding?: ComputerProviderTargetBinding;
172
+ },
150
173
  ): ComputerApplicationTarget;
151
174
  get(controllerHome: string, targetId: string): ComputerApplicationTarget | undefined;
152
175
  require(controllerHome: string, targetId: string): ComputerApplicationTarget;
176
+ listAllApplications(controllerHome: string): ComputerApplicationTarget[];
153
177
  withLease<T>(
154
178
  controllerHome: string,
155
179
  targetId: string,
@@ -171,6 +195,7 @@ export interface ComputerInteractionTargetAuthorityPort {
171
195
  getSurface(controllerHome: string, targetId: string): ComputerSurfaceTarget | undefined;
172
196
  requireSurface(controllerHome: string, targetId: string): ComputerSurfaceTarget;
173
197
  findSurfaceByAlias(controllerHome: string, alias: string, repoId?: string): ComputerSurfaceTarget | undefined;
198
+ findSurfaceByStableIdentity(controllerHome: string, identity: ComputerSurfaceStableIdentity, repoId?: string): ComputerSurfaceTarget | undefined;
174
199
  findSurfaceByProviderBinding(controllerHome: string, binding: ComputerSurfaceProviderBinding): ComputerSurfaceTarget | undefined;
175
200
  listSurfaces(controllerHome: string, options?: { repoId?: string; limit?: number }): ComputerSurfaceTarget[];
176
201
  listAllSurfaces(controllerHome: string, options?: { repoId?: string }): ComputerSurfaceTarget[];
@@ -5,7 +5,14 @@ const DEFAULT_TIMEOUT_MS = 30_000;
5
5
  const DEFAULT_HEALTH_TIMEOUT_MS = 2_000;
6
6
  const DEFAULT_MAX_REQUEST_BYTES = 1_048_576;
7
7
  const DEFAULT_MAX_RESPONSE_BYTES = 1_048_576;
8
- const MAX_TIMEOUT_MS = 120_000;
8
+ export const MAX_PLUGIN_ACTION_TIMEOUT_MS = 10 * 60_000;
9
+ /**
10
+ * How long an already-dispatched request keeps its connection open after the
11
+ * caller stopped waiting. Destroying that socket makes the provider's own write
12
+ * fail (SIGPIPE / EPIPE) and can terminate a long-running provider service that
13
+ * is still completing bounded work. Draining absorbs the late response instead.
14
+ */
15
+ const UNANSWERED_DRAIN_TIMEOUT_MS = 15_000;
9
16
  export const EXTERNAL_RPC_METHOD_PATTERN = /^[a-z][a-z0-9_]{0,127}$/;
10
17
 
11
18
  export type ExternalUnixJsonlMethod = string;
@@ -98,6 +105,61 @@ function transportError(
98
105
  return new ExternalUnixJsonlTransportError(code, message, options);
99
106
  }
100
107
 
108
+ /**
109
+ * Absorb a response that nobody is waiting for any more.
110
+ *
111
+ * A client that abandons a dispatched request must not tear the connection down
112
+ * underneath the provider: an in-flight provider write to a closed peer raises
113
+ * SIGPIPE and kills single-threaded provider services, which then restart into
114
+ * the same request forever. Keeping the connection open until the provider's
115
+ * own response arrives preserves the provider lifecycle while discarding the
116
+ * now-meaningless payload.
117
+ */
118
+ function drainUnansweredResponse(options: {
119
+ socket: Socket;
120
+ maxResponseBytes: number;
121
+ onFinished: (socket: Socket) => void;
122
+ }): void {
123
+ const { socket, maxResponseBytes, onFinished } = options;
124
+ if (socket.destroyed) {
125
+ onFinished(socket);
126
+ return;
127
+ }
128
+ let buffer = Buffer.alloc(0);
129
+ let settled = false;
130
+ const settle = (destroy: boolean): void => {
131
+ if (settled) return;
132
+ settled = true;
133
+ clearTimeout(timer);
134
+ socket.removeListener('data', onData);
135
+ socket.removeListener('end', onEnd);
136
+ socket.removeListener('error', onEnd);
137
+ socket.removeListener('close', onEnd);
138
+ if (!socket.destroyed) {
139
+ // The provider finished writing its late response: a graceful half-close
140
+ // is enough, and it never turns into a provider-side write failure.
141
+ if (destroy) socket.destroy();
142
+ else socket.end();
143
+ }
144
+ onFinished(socket);
145
+ };
146
+ const onData = (chunk: Buffer): void => {
147
+ if (buffer.length + chunk.length > maxResponseBytes) {
148
+ settle(true);
149
+ return;
150
+ }
151
+ buffer = Buffer.concat([buffer, chunk]);
152
+ if (buffer.indexOf(0x0A) >= 0) settle(false);
153
+ };
154
+ const onEnd = (): void => settle(true);
155
+ const timer = setTimeout(() => settle(true), UNANSWERED_DRAIN_TIMEOUT_MS);
156
+ timer.unref?.();
157
+ socket.on('data', onData);
158
+ socket.once('end', onEnd);
159
+ socket.once('error', onEnd);
160
+ socket.once('close', onEnd);
161
+ }
162
+
101
163
  function normalizeTransportError(error: unknown): ExternalUnixJsonlTransportError {
102
164
  return error instanceof ExternalUnixJsonlTransportError
103
165
  ? error
@@ -152,7 +214,7 @@ export function normalizeExternalUnixJsonlCall(
152
214
  const params = options.params ?? {};
153
215
  const maxRequestBytes = boundedInteger(options.maxRequestBytes, DEFAULT_MAX_REQUEST_BYTES, 1_024, 4 * DEFAULT_MAX_REQUEST_BYTES);
154
216
  const maxResponseBytes = boundedInteger(options.maxResponseBytes, DEFAULT_MAX_RESPONSE_BYTES, 1_024, 4 * DEFAULT_MAX_RESPONSE_BYTES);
155
- const timeoutMs = boundedInteger(options.timeoutMs, health ? DEFAULT_HEALTH_TIMEOUT_MS : DEFAULT_TIMEOUT_MS, 100, MAX_TIMEOUT_MS);
217
+ const timeoutMs = boundedInteger(options.timeoutMs, health ? DEFAULT_HEALTH_TIMEOUT_MS : DEFAULT_TIMEOUT_MS, 100, MAX_PLUGIN_ACTION_TIMEOUT_MS);
156
218
  const envelope = `${JSON.stringify({ id: options.requestId, method, params })}\n`;
157
219
  if (Buffer.byteLength(envelope, 'utf8') > maxRequestBytes) {
158
220
  throw transportError('EXTERNAL_PLUGIN_REQUEST_TOO_LARGE', 'External provider request exceeded the bounded input limit.', { retryable: false });
@@ -200,6 +262,9 @@ export class ExternalUnixJsonlChannel {
200
262
  private queue: Promise<void> = Promise.resolve();
201
263
  private generationValue = 0;
202
264
  private disposed = false;
265
+ private outstandingDispatched = 0;
266
+ private outstandingMaxResponseBytes = DEFAULT_MAX_RESPONSE_BYTES;
267
+ private readonly draining = new Set<Socket>();
203
268
 
204
269
  constructor(readonly socketPath: string) {
205
270
  validateSocketPath(socketPath);
@@ -235,6 +300,10 @@ export class ExternalUnixJsonlChannel {
235
300
 
236
301
  close(): void {
237
302
  this.disposed = true;
303
+ if (this.outstandingDispatched > 0 && this.socket) {
304
+ this.retireForDrain(this.socket, this.outstandingMaxResponseBytes);
305
+ return;
306
+ }
238
307
  this.resetSocket();
239
308
  }
240
309
 
@@ -245,6 +314,24 @@ export class ExternalUnixJsonlChannel {
245
314
  this.buffer = Buffer.alloc(0);
246
315
  }
247
316
 
317
+ /**
318
+ * Retire a connection whose request was abandoned by the caller. The socket
319
+ * leaves service immediately, but stays open until the provider's own
320
+ * response is absorbed so the provider is never killed by its late write.
321
+ */
322
+ private retireForDrain(socket: Socket, maxResponseBytes: number): void {
323
+ if (this.socket === socket) this.socket = undefined;
324
+ this.connecting = undefined;
325
+ this.buffer = Buffer.alloc(0);
326
+ if (socket.destroyed) return;
327
+ this.draining.add(socket);
328
+ drainUnansweredResponse({
329
+ socket,
330
+ maxResponseBytes,
331
+ onFinished: (finished) => { this.draining.delete(finished); },
332
+ });
333
+ }
334
+
248
335
  private async ensureConnected(): Promise<void> {
249
336
  if (this.connected) return;
250
337
  if (this.connecting) return await this.connecting;
@@ -299,7 +386,7 @@ export class ExternalUnixJsonlChannel {
299
386
  let settled = false;
300
387
  let dispatched = false;
301
388
  let socket: Socket | undefined;
302
- const finish = (callback: () => void, reset = false): void => {
389
+ const finish = (callback: () => void, disposition: 'keep' | 'reset' | 'drain' = 'keep'): void => {
303
390
  if (settled) return;
304
391
  settled = true;
305
392
  if (timer) clearTimeout(timer);
@@ -307,15 +394,20 @@ export class ExternalUnixJsonlChannel {
307
394
  socket?.removeListener('data', onData);
308
395
  socket?.removeListener('error', onError);
309
396
  socket?.removeListener('end', onEnd);
310
- if (reset) this.resetSocket(socket);
397
+ if (dispatched) this.outstandingDispatched = Math.max(0, this.outstandingDispatched - 1);
398
+ if (disposition === 'reset') this.resetSocket(socket);
399
+ else if (disposition === 'drain' && socket) this.retireForDrain(socket, normalized.maxResponseBytes);
311
400
  callback();
312
401
  };
313
- const fail = (error: unknown, reset = true): void => {
402
+ const fail = (error: unknown, disposition: 'keep' | 'reset' | 'drain' = 'reset'): void => {
314
403
  const normalizedError = normalizeTransportError(error);
315
404
  const classified = dispatched && mayHaveEffects ? markOutcomeUnknown(normalizedError) : normalizedError;
316
- finish(() => reject(classified), reset);
405
+ finish(() => reject(classified), disposition);
317
406
  };
318
- const onAbort = (): void => fail(transportError('EXTERNAL_PLUGIN_ABORTED', 'External provider request was cancelled.'));
407
+ const onAbort = (): void => fail(
408
+ transportError('EXTERNAL_PLUGIN_ABORTED', 'External provider request was cancelled.'),
409
+ dispatched ? 'drain' : 'reset',
410
+ );
319
411
  const onError = (error: Error): void => fail(transportError('EXTERNAL_PLUGIN_SOCKET_UNAVAILABLE', error.message));
320
412
  const onEnd = (): void => fail(transportError('EXTERNAL_PLUGIN_PROTOCOL_ERROR', 'External provider closed the socket before returning a complete response.'));
321
413
  const onData = (chunk: Buffer): void => {
@@ -338,14 +430,22 @@ export class ExternalUnixJsonlChannel {
338
430
  finish(() => resolve(decoded));
339
431
  } catch (error) {
340
432
  if (error instanceof ExternalUnixJsonlTransportError && error.source === 'provider') {
341
- fail(error, false);
433
+ fail(error, 'keep');
342
434
  } else {
343
435
  fail(error);
344
436
  }
345
437
  }
346
438
  };
347
439
 
348
- timer = setTimeout(() => fail(transportError('EXTERNAL_PLUGIN_TIMEOUT', `External provider request timed out after ${normalized.timeoutMs}ms.`)), normalized.timeoutMs);
440
+ // A request the caller stopped waiting for is not a reason to kill the
441
+ // provider: retire the connection into a bounded drain instead.
442
+ timer = setTimeout(
443
+ () => fail(
444
+ transportError('EXTERNAL_PLUGIN_TIMEOUT', `External provider request timed out after ${normalized.timeoutMs}ms.`),
445
+ dispatched ? 'drain' : 'reset',
446
+ ),
447
+ normalized.timeoutMs,
448
+ );
349
449
  timer.unref?.();
350
450
  options.signal?.addEventListener('abort', onAbort, { once: true });
351
451
 
@@ -361,7 +461,7 @@ export class ExternalUnixJsonlChannel {
361
461
  'EXTERNAL_PLUGIN_CHANNEL_GENERATION_CHANGED',
362
462
  `External provider connection changed from generation ${expectedGeneration} to ${this.generation}; renegotiate before executing the action.`,
363
463
  { retryable: true },
364
- ), false);
464
+ ), 'keep');
365
465
  return;
366
466
  }
367
467
  socket = this.socket;
@@ -373,6 +473,8 @@ export class ExternalUnixJsonlChannel {
373
473
  socket.once('error', onError);
374
474
  socket.once('end', onEnd);
375
475
  dispatched = true;
476
+ this.outstandingDispatched += 1;
477
+ this.outstandingMaxResponseBytes = normalized.maxResponseBytes;
376
478
  socket.write(normalized.envelope, (error) => {
377
479
  if (error) fail(transportError('EXTERNAL_PLUGIN_TRANSPORT_FAILED', error.message));
378
480
  });
@@ -399,21 +501,32 @@ export async function callExternalUnixJsonl(
399
501
  let dispatched = false;
400
502
  let buffer = Buffer.alloc(0);
401
503
 
402
- const cleanup = (): void => {
504
+ const cleanup = (disposition: 'destroy' | 'drain'): void => {
403
505
  if (timer) clearTimeout(timer);
404
506
  options.signal?.removeEventListener('abort', onAbort);
405
- if (socket && !socket.destroyed) socket.destroy();
507
+ if (!socket || socket.destroyed) return;
508
+ if (disposition === 'drain') {
509
+ // The socket is dead to this one-shot caller, so only the drain reader
510
+ // may keep observing it.
511
+ socket.removeAllListeners('data');
512
+ socket.removeAllListeners('error');
513
+ socket.removeAllListeners('end');
514
+ socket.removeAllListeners('close');
515
+ drainUnansweredResponse({ socket, maxResponseBytes: normalized.maxResponseBytes, onFinished: () => undefined });
516
+ return;
517
+ }
518
+ socket.destroy();
406
519
  };
407
- const finish = (callback: () => void): void => {
520
+ const finish = (callback: () => void, disposition: 'destroy' | 'drain' = 'destroy'): void => {
408
521
  if (settled) return;
409
522
  settled = true;
410
- cleanup();
523
+ cleanup(disposition);
411
524
  callback();
412
525
  };
413
- const fail = (error: unknown): void => {
526
+ const fail = (error: unknown, disposition: 'destroy' | 'drain' = 'destroy'): void => {
414
527
  const normalizedError = normalizeTransportError(error);
415
528
  const classified = dispatched && mayHaveEffects ? markOutcomeUnknown(normalizedError) : normalizedError;
416
- finish(() => reject(classified));
529
+ finish(() => reject(classified), disposition);
417
530
  };
418
531
  const succeed = (raw: string): void => finish(() => {
419
532
  try {
@@ -422,9 +535,20 @@ export async function callExternalUnixJsonl(
422
535
  reject(error);
423
536
  }
424
537
  });
425
- const onAbort = (): void => fail(transportError('EXTERNAL_PLUGIN_ABORTED', 'External provider request was cancelled.'));
538
+ const onAbort = (): void => fail(
539
+ transportError('EXTERNAL_PLUGIN_ABORTED', 'External provider request was cancelled.'),
540
+ dispatched ? 'drain' : 'destroy',
541
+ );
426
542
 
427
- timer = setTimeout(() => fail(transportError('EXTERNAL_PLUGIN_TIMEOUT', `External provider request timed out after ${normalized.timeoutMs}ms.`)), normalized.timeoutMs);
543
+ // Preserve the provider lifecycle: an abandoned request is drained instead
544
+ // of being answered with a closed connection.
545
+ timer = setTimeout(
546
+ () => fail(
547
+ transportError('EXTERNAL_PLUGIN_TIMEOUT', `External provider request timed out after ${normalized.timeoutMs}ms.`),
548
+ dispatched ? 'drain' : 'destroy',
549
+ ),
550
+ normalized.timeoutMs,
551
+ );
428
552
  timer.unref?.();
429
553
  options.signal?.addEventListener('abort', onAbort, { once: true });
430
554