@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,10 +1,13 @@
1
+ import { writeAtomicTextFile } from '../shared/atomic-text-file';
1
2
  import { createHash } from 'crypto';
2
- import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from 'fs';
3
+ import { chmodSync, copyFileSync, existsSync, lstatSync, mkdirSync, readFileSync, renameSync, rmSync, statSync } from 'fs';
3
4
  import { homedir } from 'os';
4
5
  import { basename, dirname, join, resolve } from 'path';
5
- import { loadMcpServiceLocalConfig } from '../../cli/mcp/auth';
6
+ import { loadMcpServiceLocalConfig } from '../../../adapters/mcp/auth';
7
+ import { runtimeAuthorityFreeEnvironment } from '../shared/process-environment';
6
8
  import type { PackageRuntimeRelease } from './package-runtime-release';
7
9
  import { createPlatformServiceManagerHost, platformLaunchdInstalledPath, type PlatformServiceManagerHost, type SystemdUserUnitInput } from '../platform/service-manager';
10
+ import { forgeConnectorPersistentServiceLabel } from '../platform/service-inventory';
8
11
 
9
12
  export interface PackageConnectorServicePaths {
10
13
  label: string;
@@ -14,9 +17,13 @@ export interface PackageConnectorServicePaths {
14
17
  stdoutPath: string;
15
18
  stderrPath: string;
16
19
  authorityPath: string;
20
+ activeEntrypointPath: string;
17
21
  }
18
22
 
19
- export type PackageConnectorReleaseBinding = Pick<PackageRuntimeRelease, 'releaseId' | 'releaseRoot' | 'packageRoot'>;
23
+ export type PackageConnectorReleaseBinding = Pick<PackageRuntimeRelease, 'releaseId' | 'releaseRoot' | 'packageRoot'> & {
24
+ connectorEntrypoint?: 'forge-mcp-gateway';
25
+ connectorArtifactIdentity?: string;
26
+ };
20
27
 
21
28
  export interface PackageConnectorServiceAuthority {
22
29
  schemaVersion: 1;
@@ -27,6 +34,7 @@ export interface PackageConnectorServiceAuthority {
27
34
  mode: 'launchd' | 'systemd-user' | 'portable';
28
35
  persistent: boolean;
29
36
  servicePath?: string;
37
+ connectorArtifactIdentity?: string;
30
38
  installedAt: string;
31
39
  }
32
40
 
@@ -37,27 +45,30 @@ export interface PackageConnectorServiceResult {
37
45
  servicePath?: string;
38
46
  pid?: number;
39
47
  reused?: boolean;
48
+ rebound?: boolean;
40
49
  releaseId?: string;
41
50
  releaseRoot?: string;
42
51
  }
43
52
 
53
+ export interface PackageConnectorCutoverDrainMarker {
54
+ schemaVersion: 1;
55
+ sessionId: string;
56
+ stableReleaseId: string;
57
+ connectorEndpoint: string;
58
+ connectorInstalledAt: string;
59
+ ownerPid: number;
60
+ armedAt: string;
61
+ }
62
+
44
63
  export type PackageConnectorAuthMode = 'oauth' | 'none';
45
64
 
46
65
  function xml(value: string): string {
47
66
  return value.replaceAll('&', '&amp;').replaceAll('<', '&lt;').replaceAll('>', '&gt;').replaceAll('"', '&quot;');
48
67
  }
49
68
 
50
- function atomicWrite(path: string, content: string, mode = 0o600): void {
51
- mkdirSync(dirname(path), { recursive: true, mode: 0o700 });
52
- const temporary = `${path}.${process.pid}.tmp`;
53
- writeFileSync(temporary, content, { encoding: 'utf8', mode });
54
- renameSync(temporary, path);
55
- }
56
-
57
69
  export function packageConnectorServicePaths(controllerHome: string, accountHome = process.env.HOME ?? homedir()): PackageConnectorServicePaths {
58
70
  const home = resolve(controllerHome);
59
- const suffix = createHash('sha256').update(home).digest('hex').slice(0, 12);
60
- const label = `com.moretea.forge.mcp-gateway.${suffix}`;
71
+ const label = forgeConnectorPersistentServiceLabel(home);
61
72
  const serviceRoot = join(home, 'runtime', 'connector-service');
62
73
  return {
63
74
  label,
@@ -67,9 +78,118 @@ export function packageConnectorServicePaths(controllerHome: string, accountHome
67
78
  stdoutPath: join(serviceRoot, 'logs', 'stdout.log'),
68
79
  stderrPath: join(serviceRoot, 'logs', 'stderr.log'),
69
80
  authorityPath: join(serviceRoot, 'authority.json'),
81
+ activeEntrypointPath: join(serviceRoot, 'active-forge-mcp-gateway'),
70
82
  };
71
83
  }
72
84
 
85
+ const PACKAGE_CONNECTOR_CUTOVER_DRAIN_TTL_MS = 10 * 60_000;
86
+
87
+ export function packageConnectorCutoverDrainMarkerPath(controllerHome: string): string {
88
+ return join(packageConnectorServicePaths(controllerHome).serviceRoot, 'cutover-draining.json');
89
+ }
90
+
91
+ function removePackageConnectorCutoverDrainMarker(controllerHome: string): void {
92
+ rmSync(packageConnectorCutoverDrainMarkerPath(controllerHome), { force: true });
93
+ }
94
+
95
+ function livePackageConnectorCutoverDrainMarker(
96
+ controllerHome: string,
97
+ now = Date.now(),
98
+ ): PackageConnectorCutoverDrainMarker | undefined {
99
+ const path = packageConnectorCutoverDrainMarkerPath(controllerHome);
100
+ if (!existsSync(path)) return undefined;
101
+ try {
102
+ const marker = JSON.parse(readFileSync(path, 'utf8')) as Partial<PackageConnectorCutoverDrainMarker>;
103
+ const armedAt = typeof marker.armedAt === 'string' ? Date.parse(marker.armedAt) : Number.NaN;
104
+ if (
105
+ marker.schemaVersion !== 1
106
+ || typeof marker.sessionId !== 'string'
107
+ || !marker.sessionId.trim()
108
+ || typeof marker.stableReleaseId !== 'string'
109
+ || !marker.stableReleaseId.trim()
110
+ || typeof marker.connectorEndpoint !== 'string'
111
+ || !marker.connectorEndpoint.trim()
112
+ || typeof marker.connectorInstalledAt !== 'string'
113
+ || !marker.connectorInstalledAt.trim()
114
+ || !Number.isInteger(marker.ownerPid)
115
+ || Number(marker.ownerPid) <= 0
116
+ || !Number.isFinite(armedAt)
117
+ || now - armedAt > PACKAGE_CONNECTOR_CUTOVER_DRAIN_TTL_MS
118
+ ) {
119
+ removePackageConnectorCutoverDrainMarker(controllerHome);
120
+ return undefined;
121
+ }
122
+ try {
123
+ process.kill(Number(marker.ownerPid), 0);
124
+ } catch (error) {
125
+ if ((error as NodeJS.ErrnoException).code !== 'EPERM') {
126
+ removePackageConnectorCutoverDrainMarker(controllerHome);
127
+ return undefined;
128
+ }
129
+ }
130
+ return marker as PackageConnectorCutoverDrainMarker;
131
+ } catch {
132
+ removePackageConnectorCutoverDrainMarker(controllerHome);
133
+ return undefined;
134
+ }
135
+ }
136
+
137
+ export function armPackageConnectorCutoverDrain(input: {
138
+ controllerHome: string;
139
+ sessionId: string;
140
+ stableReleaseId: string;
141
+ connectorAuthority: PackageConnectorServiceAuthority;
142
+ }): PackageConnectorCutoverDrainMarker {
143
+ if (input.connectorAuthority.releaseId !== input.stableReleaseId) {
144
+ throw new Error(`PACKAGE_CONNECTOR_CUTOVER_DRAIN_STABLE_MISMATCH: expected ${input.stableReleaseId}, observed ${input.connectorAuthority.releaseId}`);
145
+ }
146
+ const currentAuthority = readPackageConnectorServiceAuthority(input.controllerHome);
147
+ if (
148
+ !currentAuthority
149
+ || currentAuthority.releaseId !== input.connectorAuthority.releaseId
150
+ || currentAuthority.endpoint !== input.connectorAuthority.endpoint
151
+ || currentAuthority.installedAt !== input.connectorAuthority.installedAt
152
+ ) {
153
+ throw new Error('PACKAGE_CONNECTOR_CUTOVER_DRAIN_AUTHORITY_CHANGED');
154
+ }
155
+ const marker: PackageConnectorCutoverDrainMarker = {
156
+ schemaVersion: 1,
157
+ sessionId: input.sessionId,
158
+ stableReleaseId: input.stableReleaseId,
159
+ connectorEndpoint: input.connectorAuthority.endpoint,
160
+ connectorInstalledAt: input.connectorAuthority.installedAt,
161
+ ownerPid: process.pid,
162
+ armedAt: new Date().toISOString(),
163
+ };
164
+ const path = packageConnectorCutoverDrainMarkerPath(input.controllerHome);
165
+ mkdirSync(dirname(path), { recursive: true, mode: 0o700 });
166
+ writeAtomicTextFile(path, `${JSON.stringify(marker, null, 2)}\n`, 0o600);
167
+ return marker;
168
+ }
169
+
170
+ export function clearPackageConnectorCutoverDrain(controllerHome: string): void {
171
+ removePackageConnectorCutoverDrainMarker(controllerHome);
172
+ }
173
+
174
+ export function packageConnectorCutoverDrainIsActive(
175
+ controllerHome: string,
176
+ connectorEndpoint: string,
177
+ now = Date.now(),
178
+ ): boolean {
179
+ const marker = livePackageConnectorCutoverDrainMarker(controllerHome, now);
180
+ if (!marker || marker.connectorEndpoint !== connectorEndpoint) return false;
181
+ let authority: PackageConnectorServiceAuthority | undefined;
182
+ try {
183
+ authority = readPackageConnectorServiceAuthority(controllerHome);
184
+ } catch {
185
+ return true;
186
+ }
187
+ if (!authority) return true;
188
+ return authority.releaseId === marker.stableReleaseId
189
+ && authority.endpoint === marker.connectorEndpoint
190
+ && authority.installedAt === marker.connectorInstalledAt;
191
+ }
192
+
73
193
  export function readPackageConnectorServiceAuthority(controllerHome: string): PackageConnectorServiceAuthority | undefined {
74
194
  const path = packageConnectorServicePaths(controllerHome).authorityPath;
75
195
  if (!existsSync(path)) return undefined;
@@ -82,13 +202,15 @@ export function readPackageConnectorServiceAuthority(controllerHome: string): Pa
82
202
  || typeof parsed.packageRoot !== 'string'
83
203
  || !['launchd', 'systemd-user', 'portable'].includes(String(parsed.mode))
84
204
  || typeof parsed.persistent !== 'boolean'
205
+ || (parsed.connectorArtifactIdentity !== undefined && !/^sha256:[a-f0-9]{64}$/i.test(parsed.connectorArtifactIdentity))
85
206
  || typeof parsed.installedAt !== 'string'
86
207
  ) throw new Error('FORGE_PACKAGE_CONNECTOR_AUTHORITY_INVALID');
87
208
  return parsed as PackageConnectorServiceAuthority;
88
209
  }
89
210
 
90
- function writePackageConnectorServiceAuthority(input: { release: PackageConnectorReleaseBinding; controllerHome: string; result: PackageConnectorServiceResult }): void {
211
+ function writePackageConnectorServiceAuthority(input: { release: PackageConnectorReleaseBinding; controllerHome: string; result: PackageConnectorServiceResult; installedAt?: string }): void {
91
212
  const paths = packageConnectorServicePaths(input.controllerHome);
213
+ const artifact = attestedCompiledConnector(input.release);
92
214
  const authority: PackageConnectorServiceAuthority = {
93
215
  schemaVersion: 1,
94
216
  endpoint: input.result.endpoint,
@@ -98,9 +220,10 @@ function writePackageConnectorServiceAuthority(input: { release: PackageConnecto
98
220
  mode: input.result.mode,
99
221
  persistent: input.result.persistent,
100
222
  ...(input.result.servicePath ? { servicePath: input.result.servicePath } : {}),
101
- installedAt: new Date().toISOString(),
223
+ ...(artifact ? { connectorArtifactIdentity: artifact.identity } : {}),
224
+ installedAt: input.installedAt ?? new Date().toISOString(),
102
225
  };
103
- atomicWrite(paths.authorityPath, `${JSON.stringify(authority, null, 2)}\n`);
226
+ writeAtomicTextFile(paths.authorityPath, `${JSON.stringify(authority, null, 2)}\n`);
104
227
  }
105
228
 
106
229
  export function packageConnectorEndpointStatusHealthy(status: number, authMode: PackageConnectorAuthMode = 'oauth'): boolean {
@@ -173,13 +296,73 @@ export function packageConnectorAuthMode(controllerHome: string): PackageConnect
173
296
  : 'oauth';
174
297
  }
175
298
 
299
+ function attestedCompiledConnector(release: PackageConnectorReleaseBinding): { target: string; identity: string } | undefined {
300
+ const entrypoint = release.connectorEntrypoint;
301
+ const identity = release.connectorArtifactIdentity?.trim();
302
+ if (!entrypoint && !identity) return undefined;
303
+ if (entrypoint !== 'forge-mcp-gateway' || !identity || !/^sha256:[a-f0-9]{64}$/i.test(identity)) {
304
+ throw new Error('FORGE_PACKAGE_CONNECTOR_ARTIFACT_ATTESTATION_INVALID');
305
+ }
306
+ const target = resolve(release.releaseRoot, entrypoint);
307
+ const root = resolve(release.releaseRoot);
308
+ if (dirname(target) !== root || !existsSync(target)) throw new Error('FORGE_PACKAGE_CONNECTOR_ARTIFACT_MISSING');
309
+ const status = lstatSync(target);
310
+ if (!status.isFile() || status.isSymbolicLink()) throw new Error('FORGE_PACKAGE_CONNECTOR_ARTIFACT_INVALID');
311
+ const actual = `sha256:${createHash('sha256').update(readFileSync(target)).digest('hex')}`;
312
+ if (actual !== identity.toLowerCase()) throw new Error('FORGE_PACKAGE_CONNECTOR_ARTIFACT_IDENTITY_MISMATCH');
313
+ return { target, identity: actual };
314
+ }
315
+
316
+ function stableConnectorEntrypointMatches(path: string, target: string): boolean {
317
+ try {
318
+ const current = lstatSync(path);
319
+ const desired = statSync(target);
320
+ if (!current.isFile() || current.isSymbolicLink() || !desired.isFile()) return false;
321
+ if (current.size !== desired.size || (current.mode & 0o777) !== (desired.mode & 0o777)) return false;
322
+ return readFileSync(path).equals(readFileSync(target));
323
+ } catch {
324
+ return false;
325
+ }
326
+ }
327
+
328
+ export function syncPackageConnectorActiveEntrypoint(input: { release: PackageConnectorReleaseBinding; controllerHome: string; accountHome?: string }): { path: string; target?: string; artifactIdentity?: string; changed: boolean } {
329
+ const paths = packageConnectorServicePaths(input.controllerHome, input.accountHome);
330
+ const artifact = attestedCompiledConnector(input.release);
331
+ if (!artifact) return { path: paths.activeEntrypointPath, changed: false };
332
+ if (stableConnectorEntrypointMatches(paths.activeEntrypointPath, artifact.target)) {
333
+ return { path: paths.activeEntrypointPath, target: artifact.target, artifactIdentity: artifact.identity, changed: false };
334
+ }
335
+ mkdirSync(dirname(paths.activeEntrypointPath), { recursive: true, mode: 0o700 });
336
+ const temporary = `${paths.activeEntrypointPath}.${process.pid}.tmp`;
337
+ rmSync(temporary, { force: true, recursive: true });
338
+ try {
339
+ copyFileSync(artifact.target, temporary);
340
+ chmodSync(temporary, statSync(artifact.target).mode & 0o777);
341
+ renameSync(temporary, paths.activeEntrypointPath);
342
+ } finally {
343
+ rmSync(temporary, { force: true, recursive: true });
344
+ }
345
+ if (!stableConnectorEntrypointMatches(paths.activeEntrypointPath, artifact.target)) {
346
+ throw new Error('FORGE_PACKAGE_CONNECTOR_STABLE_ENTRYPOINT_MIRROR_FAILED');
347
+ }
348
+ return { path: paths.activeEntrypointPath, target: artifact.target, artifactIdentity: artifact.identity, changed: true };
349
+ }
350
+
176
351
  export function packageConnectorLaunchSpec(input: { release: PackageConnectorReleaseBinding; controllerHome: string; endpoint: string; executable?: string }): { executable: string; args: string[]; environment: Record<string, string>; port: number; authMode: PackageConnectorAuthMode } {
177
352
  const parsed = new URL(input.endpoint);
178
353
  const port = Number(parsed.port);
179
354
  if (parsed.protocol !== 'http:' || parsed.hostname !== '127.0.0.1' || parsed.pathname !== '/mcp' || !Number.isInteger(port) || port < 1 || port > 65_535) {
180
355
  throw new Error('FORGE_PACKAGE_CONNECTOR_ENDPOINT_INVALID');
181
356
  }
182
- const executable = resolve(input.executable ?? process.env.FORGE_CONNECTOR_EXECUTABLE ?? process.execPath);
357
+ const attestedConnector = attestedCompiledConnector(input.release);
358
+ const legacyCompiledConnector = join(resolve(input.release.releaseRoot), 'forge-mcp-gateway');
359
+ const hasLegacyCompiledConnector = !attestedConnector && existsSync(legacyCompiledConnector);
360
+ const hasCompiledConnector = Boolean(attestedConnector) || hasLegacyCompiledConnector;
361
+ const executable = resolve(attestedConnector
362
+ ? packageConnectorServicePaths(input.controllerHome).activeEntrypointPath
363
+ : hasLegacyCompiledConnector
364
+ ? legacyCompiledConnector
365
+ : input.executable ?? process.env.FORGE_CONNECTOR_EXECUTABLE ?? process.execPath);
183
366
  if (/^forge-recovery-(?:gateway|watchdog)$/i.test(basename(executable))) {
184
367
  throw new Error('FORGE_PACKAGE_CONNECTOR_EXECUTABLE_INVALID');
185
368
  }
@@ -201,7 +384,7 @@ export function packageConnectorLaunchSpec(input: { release: PackageConnectorRel
201
384
  ];
202
385
  return {
203
386
  executable,
204
- args: isBun ? [cliEntry, ...cliArgs] : ['--loader', nodeLoader, cliEntry, ...cliArgs],
387
+ args: hasCompiledConnector ? cliArgs : isBun ? [cliEntry, ...cliArgs] : ['--loader', nodeLoader, cliEntry, ...cliArgs],
205
388
  environment: {
206
389
  FORGE_CONTROLLER_HOME: resolve(input.controllerHome),
207
390
  FORGE_CONTROLLER_LIFECYCLE_OWNER: '1',
@@ -253,9 +436,14 @@ export function packageConnectorServiceMatchesRelease(input: {
253
436
  executable?: string;
254
437
  }): boolean {
255
438
  try {
256
- if (
257
- input.authority.endpoint !== input.endpoint
258
- || input.authority.releaseId !== input.release.releaseId
439
+ if (input.authority.endpoint !== input.endpoint) return false;
440
+ const artifact = attestedCompiledConnector(input.release);
441
+ if (artifact) {
442
+ const paths = packageConnectorServicePaths(input.controllerHome, input.env?.HOME);
443
+ if (input.authority.connectorArtifactIdentity !== artifact.identity) return false;
444
+ if (!stableConnectorEntrypointMatches(paths.activeEntrypointPath, artifact.target)) return false;
445
+ } else if (
446
+ input.authority.releaseId !== input.release.releaseId
259
447
  || resolve(input.authority.releaseRoot) !== resolve(input.release.releaseRoot)
260
448
  || resolve(input.authority.packageRoot) !== resolve(input.release.packageRoot)
261
449
  ) return false;
@@ -295,11 +483,7 @@ function installSystemd(paths: PackageConnectorServicePaths, launch: ReturnType<
295
483
  function startPortable(paths: PackageConnectorServicePaths, launch: ReturnType<typeof packageConnectorLaunchSpec>, env: NodeJS.ProcessEnv, host: PlatformServiceManagerHost): number {
296
484
  // A connector is not the Canonical Runtime writer. Never let a transient
297
485
  // installer/worker write claim escape into this long-lived process.
298
- const childEnv = { ...env };
299
- for (const key of [
300
- 'FORGE_RUNTIME_INSTANCE_ID', 'FORGE_RUNTIME_OWNER_PID', 'FORGE_RELEASE_AUTHORITY_REVISION',
301
- 'FORGE_RELEASE_FENCING_TOKEN', 'FORGE_RELEASE_ID', 'FORGE_ARTIFACT_IDENTITY', 'FORGE_WORKER_PROTOCOL_VERSION',
302
- ]) delete childEnv[key];
486
+ const childEnv = runtimeAuthorityFreeEnvironment(env);
303
487
  return host.startDetached({
304
488
  executable: launch.executable,
305
489
  args: launch.args,
@@ -313,6 +497,7 @@ function startPortable(paths: PackageConnectorServicePaths, launch: ReturnType<t
313
497
  export async function installPackageConnectorService(input: { release: PackageConnectorReleaseBinding; controllerHome: string; endpoint: string; executable?: string; platform?: NodeJS.Platform; env?: NodeJS.ProcessEnv; forcePortable?: boolean; probeEndpoint?: (endpoint: string) => Promise<boolean> }): Promise<PackageConnectorServiceResult> {
314
498
  const paths = packageConnectorServicePaths(input.controllerHome, input.env?.HOME);
315
499
  mkdirSync(join(paths.serviceRoot, 'logs'), { recursive: true, mode: 0o700 });
500
+ syncPackageConnectorActiveEntrypoint({ release: input.release, controllerHome: input.controllerHome, accountHome: input.env?.HOME });
316
501
  const launch = packageConnectorLaunchSpec({
317
502
  release: input.release,
318
503
  controllerHome: input.controllerHome,
@@ -330,7 +515,7 @@ export async function installPackageConnectorService(input: { release: PackageCo
330
515
  port: launch.port,
331
516
  requiredArguments: ['mcp', 'serve', '--auth', launch.authMode],
332
517
  });
333
- atomicWrite(paths.sourcePlistPath, renderPackageConnectorLaunchAgent({ paths, launch }), 0o600);
518
+ writeAtomicTextFile(paths.sourcePlistPath, renderPackageConnectorLaunchAgent({ paths, launch }), 0o600);
334
519
  serviceHost.installLaunchd(paths.sourcePlistPath, paths.label);
335
520
  const result = await serviceHost.bootstrapLaunchd({ label: paths.label, plistPath: paths.installedPlistPath });
336
521
  if (!result.ok) throw new Error(`FORGE_PACKAGE_CONNECTOR_LAUNCHD_INSTALL_FAILED: ${result.diagnostics.join('; ')}`);
@@ -393,15 +578,28 @@ export async function ensurePackageConnectorService(input: {
393
578
  })
394
579
  && await (input.probeEndpoint ?? defaultConnectorEndpointProbe)(input.endpoint)
395
580
  ) {
396
- return {
581
+ const rebound = authority.releaseId !== input.release.releaseId
582
+ || resolve(authority.releaseRoot) !== resolve(input.release.releaseRoot)
583
+ || resolve(authority.packageRoot) !== resolve(input.release.packageRoot);
584
+ const reused: PackageConnectorServiceResult = {
397
585
  endpoint: authority.endpoint,
398
586
  mode: authority.mode,
399
587
  persistent: true,
400
588
  ...(authority.servicePath ? { servicePath: authority.servicePath } : {}),
401
589
  reused: true,
402
- releaseId: authority.releaseId,
403
- releaseRoot: authority.releaseRoot,
590
+ ...(rebound ? { rebound: true } : {}),
591
+ releaseId: input.release.releaseId,
592
+ releaseRoot: input.release.releaseRoot,
404
593
  };
594
+ if (rebound) {
595
+ writePackageConnectorServiceAuthority({
596
+ release: input.release,
597
+ controllerHome: input.controllerHome,
598
+ result: reused,
599
+ installedAt: authority.installedAt,
600
+ });
601
+ }
602
+ return reused;
405
603
  }
406
604
  }
407
605
  return installPackageConnectorService(input);
@@ -1,3 +1,4 @@
1
+ import { writeAtomicTextFile } from '../shared/atomic-text-file';
1
2
  import { createHash, randomUUID } from 'crypto';
2
3
  import { chmodSync, existsSync, lstatSync, mkdirSync, readFileSync, readdirSync, renameSync, rmSync, statSync, writeFileSync } from 'fs';
3
4
  import { dirname, join, relative, resolve } from 'path';
@@ -35,22 +36,38 @@ export interface PackageRuntimeRelease {
35
36
  // TypeScript entrypoints import both `src/` and the top-level modular-monolith
36
37
  // roots at runtime, so retaining only `src/` creates a release that passes
37
38
  // staging but cannot start after the installed package moves or disappears.
38
- const PACKAGE_RUNTIME_ROOTS = ['src', 'adapters', 'packages', 'bin', 'assets', 'scripts', 'node_modules'] as const;
39
+ const PACKAGE_RUNTIME_ROOTS = ['src', 'adapters', 'packages', 'supervisor', 'bin', 'assets', 'scripts', 'node_modules'] as const;
39
40
  const PACKAGE_RUNTIME_FILES = ['package.json'] as const;
41
+ // Compiled releases execute only compiled/bundled artifacts. Keep a tiny package
42
+ // projection for browser-extension installation plus two legacy Recovery
43
+ // recognition sentinels; neither sentinel is executed when the compiled
44
+ // Connector sidecar is present.
45
+ const COMPILED_RUNTIME_PACKAGE_ROOTS = ['adapters/computer/chrome-extension'] as const;
46
+ const COMPILED_RUNTIME_PACKAGE_FILES = [
47
+ 'package.json',
48
+ 'src/cli/index.ts',
49
+ 'src/runtime/shared/node-ts-loader.mjs',
50
+ ] as const;
40
51
  const PACKAGE_RUNTIME_STAGING_RESERVE_BYTES = 256 * 1024 * 1024;
41
52
 
42
- function sha256(value: Buffer | string): string {
43
- return createHash('sha256').update(value).digest('hex');
53
+ function isNonRuntimePackageHelper(path: string): boolean {
54
+ if (path.startsWith('scripts/benchmark-')) return true;
55
+ if (path.startsWith('scripts/check-release-')) return true;
56
+ if (path.startsWith('scripts/public-release')) return true;
57
+ return path === 'scripts/route-nl-vs-ts-eval.ts'
58
+ || path === 'scripts/check-npm-release.sh'
59
+ || path === 'scripts/check-public-release-surface.sh'
60
+ || path === 'scripts/check-tarball-install-smoke.sh'
61
+ || path === 'scripts/publish-release-tarball.sh'
62
+ || path === 'scripts/stage-runtime-release.ts'
63
+ || path === 'scripts/package-source-archive.sh';
44
64
  }
45
65
 
46
- function atomicWrite(path: string, content: string, mode = 0o600): void {
47
- mkdirSync(dirname(path), { recursive: true, mode: 0o700 });
48
- const temporary = `${path}.${process.pid}.${randomUUID().slice(0, 8)}.tmp`;
49
- writeFileSync(temporary, content, { encoding: 'utf8', mode });
50
- renameSync(temporary, path);
66
+ function sha256(value: Buffer | string): string {
67
+ return createHash('sha256').update(value).digest('hex');
51
68
  }
52
69
 
53
- function walkRegularFiles(root: string, current: string, output: string[]): void {
70
+ function walkRegularFiles(root: string, current: string, output: string[], prefix = ''): void {
54
71
  if (!existsSync(current)) return;
55
72
  const stat = lstatSync(current);
56
73
  // Package managers such as Bun can materialize dependency files as
@@ -59,38 +76,89 @@ function walkRegularFiles(root: string, current: string, output: string[]): void
59
76
  // regular files beneath its own immutable package root.
60
77
  if (stat.isSymbolicLink()) {
61
78
  const target = statSync(current);
62
- if (target.isFile()) output.push(relative(root, current).split('\\').join('/'));
79
+ if (target.isFile()) {
80
+ const relativePath = relative(root, current).split('\\').join('/');
81
+ output.push(prefix ? `${prefix}/${relativePath}` : relativePath);
82
+ }
63
83
  return;
64
84
  }
65
85
  if (stat.isFile()) {
66
- output.push(relative(root, current).split('\\').join('/'));
86
+ const relativePath = relative(root, current).split('\\').join('/');
87
+ output.push(prefix ? `${prefix}/${relativePath}` : relativePath);
67
88
  return;
68
89
  }
69
90
  if (!stat.isDirectory()) return;
70
- for (const entry of readdirSync(current).sort()) walkRegularFiles(root, join(current, entry), output);
91
+ for (const entry of readdirSync(current).sort()) walkRegularFiles(root, join(current, entry), output, prefix);
92
+ }
93
+
94
+ function packageSourcePath(packageRoot: string, path: string, dependencyRoot = packageRoot): string {
95
+ return path === 'node_modules' || path.startsWith('node_modules/')
96
+ ? join(resolve(dependencyRoot), path)
97
+ : join(resolve(packageRoot), path);
71
98
  }
72
99
 
73
- export function packageRuntimeFileIndex(packageRoot = packageRuntimeSourceRoot()): PackageRuntimeFileRecord[] {
100
+ function packageFileIndex(
101
+ packageRoot: string,
102
+ roots: readonly string[],
103
+ files: readonly string[],
104
+ dependencyRoot = packageRoot,
105
+ ): PackageRuntimeFileRecord[] {
74
106
  const root = resolve(packageRoot);
107
+ const dependencies = resolve(dependencyRoot);
75
108
  const paths: string[] = [];
76
- for (const directory of PACKAGE_RUNTIME_ROOTS) walkRegularFiles(root, join(root, directory), paths);
77
- for (const file of PACKAGE_RUNTIME_FILES) walkRegularFiles(root, join(root, file), paths);
78
- const unique = [...new Set(paths)].sort();
79
- if (!unique.includes('package.json') || !unique.some((path) => path === 'bin/forge-runtime.mjs')) {
80
- throw new Error(`PACKAGE_RUNTIME_SURFACE_INCOMPLETE: ${root}`);
109
+ for (const directory of roots) {
110
+ if (directory === 'node_modules' && dependencies !== root) {
111
+ const dependencyNodeModules = join(dependencies, 'node_modules');
112
+ walkRegularFiles(dependencyNodeModules, dependencyNodeModules, paths, 'node_modules');
113
+ } else {
114
+ walkRegularFiles(root, join(root, directory), paths);
115
+ }
81
116
  }
82
- return unique.map((path) => {
83
- const bytes = readFileSync(join(root, path));
117
+ for (const file of files) walkRegularFiles(root, join(root, file), paths);
118
+ return [...new Set(paths)].sort().map((path) => {
119
+ const bytes = readFileSync(packageSourcePath(root, path, dependencies));
84
120
  return { path, sha256: sha256(bytes), bytes: bytes.length };
85
121
  });
86
122
  }
87
123
 
124
+ export function packageRuntimeFileIndex(packageRoot = packageRuntimeSourceRoot(), dependencyRoot = packageRoot): PackageRuntimeFileRecord[] {
125
+ const root = resolve(packageRoot);
126
+ const records = packageFileIndex(root, PACKAGE_RUNTIME_ROOTS, PACKAGE_RUNTIME_FILES, dependencyRoot)
127
+ .filter((record) => !isNonRuntimePackageHelper(record.path));
128
+ const paths = new Set(records.map((record) => record.path));
129
+ if (!paths.has('package.json') || !paths.has('bin/forge-runtime.mjs')) {
130
+ throw new Error(`PACKAGE_RUNTIME_SURFACE_INCOMPLETE: ${root}`);
131
+ }
132
+ return records;
133
+ }
134
+
135
+ export function compiledRuntimePackageFileIndex(packageRoot = packageRuntimeSourceRoot()): PackageRuntimeFileRecord[] {
136
+ const root = resolve(packageRoot);
137
+ const records = packageFileIndex(root, COMPILED_RUNTIME_PACKAGE_ROOTS, COMPILED_RUNTIME_PACKAGE_FILES);
138
+ const paths = new Set(records.map((record) => record.path));
139
+ for (const required of COMPILED_RUNTIME_PACKAGE_FILES) {
140
+ if (!paths.has(required)) throw new Error(`COMPILED_RUNTIME_PACKAGE_SURFACE_INCOMPLETE: ${required}`);
141
+ }
142
+ if (![...paths].some((path) => path.startsWith('adapters/computer/chrome-extension/'))) {
143
+ throw new Error('COMPILED_RUNTIME_PACKAGE_SURFACE_INCOMPLETE: adapters/computer/chrome-extension');
144
+ }
145
+ return records;
146
+ }
147
+
88
148
  export function packageRuntimeFingerprint(records: PackageRuntimeFileRecord[]): string {
89
149
  const hash = createHash('sha256');
90
150
  for (const record of records) hash.update(record.path).update('\0').update(record.sha256).update('\0').update(String(record.bytes)).update('\n');
91
151
  return hash.digest('hex');
92
152
  }
93
153
 
154
+ function packageRuntimeArtifactIdentity(root: string, records: PackageRuntimeFileRecord[]): string {
155
+ const hash = createHash('sha256');
156
+ for (const record of records) {
157
+ hash.update(record.path).update('\0').update(readFileSync(join(root, record.path))).update('\0');
158
+ }
159
+ return `sha256:${hash.digest('hex')}`;
160
+ }
161
+
94
162
  function assertPackageRuntimeSnapshot(snapshotRoot: string, records: PackageRuntimeFileRecord[]): void {
95
163
  if (!existsSync(snapshotRoot)) throw new Error('PACKAGE_RUNTIME_RELEASE_IMMUTABILITY_VIOLATION: package snapshot is missing');
96
164
  const rootStat = lstatSync(snapshotRoot);
@@ -111,10 +179,15 @@ function assertPackageRuntimeSnapshot(snapshotRoot: string, records: PackageRunt
111
179
  }
112
180
  }
113
181
 
114
- export function stagePackageRuntimeSnapshot(sourceRoot: string, snapshotRoot: string, records: PackageRuntimeFileRecord[]): void {
182
+ export function stagePackageRuntimeSnapshot(
183
+ sourceRoot: string,
184
+ snapshotRoot: string,
185
+ records: PackageRuntimeFileRecord[],
186
+ dependencyRoot = sourceRoot,
187
+ ): void {
115
188
  mkdirSync(snapshotRoot, { recursive: false, mode: 0o700 });
116
189
  for (const record of records) {
117
- const source = join(sourceRoot, record.path);
190
+ const source = packageSourcePath(sourceRoot, record.path, dependencyRoot);
118
191
  const link = lstatSync(source);
119
192
  const stat = link.isSymbolicLink() ? statSync(source) : link;
120
193
  if (!stat.isFile()) throw new Error(`PACKAGE_RUNTIME_SOURCE_CHANGED_DURING_STAGE: ${record.path}`);
@@ -154,7 +227,12 @@ function launcherSource(input: {
154
227
  + `import { dirname, join } from 'node:path';\n`
155
228
  + `import { fileURLToPath } from 'node:url';\n`
156
229
  + `import { spawn } from 'node:child_process';\n`
157
- + `const releaseRoot=dirname(fileURLToPath(import.meta.url));\n`
230
+ // macOS runs a byte-for-byte mirror of this launcher from its fixed,
231
+ // TCC-stable service path. The mirrored file is not its immutable release
232
+ // directory, so use the launch contract's attested release binding when it
233
+ // is present. Direct execution from the immutable release still derives
234
+ // the same root from the entrypoint location.
235
+ + `const releaseRoot=process.env.FORGE_RELEASE_PATH?.trim()||dirname(fileURLToPath(import.meta.url));\n`
158
236
  + `const packageRoot=join(releaseRoot,'package');\n`
159
237
  + `const indexPath=join(releaseRoot,'package-files.json');\n`
160
238
  + `const expectedIndex=${JSON.stringify(input.indexSha256)};\n`
@@ -224,7 +302,12 @@ function assertImmutablePackageRuntimeRelease(input: {
224
302
  && manifest.checkRunnerArtifactIdentity === expected.checkRunnerArtifactIdentity
225
303
  && JSON.stringify(manifest.arguments ?? []) === JSON.stringify(expected.arguments ?? [])
226
304
  && manifest.configurationSchemaVersion === expected.configurationSchemaVersion
227
- && resolve(manifest.controllerHome) === resolve(expected.controllerHome)
305
+ && manifest.deploymentScope === expected.deploymentScope
306
+ && (manifest.deploymentScope === 'portable'
307
+ ? expected.deploymentScope === 'portable'
308
+ : typeof manifest.controllerHome === 'string'
309
+ && typeof expected.controllerHome === 'string'
310
+ && resolve(manifest.controllerHome) === resolve(expected.controllerHome))
228
311
  && JSON.stringify(manifest.databaseSchemaCompatibility) === JSON.stringify(expected.databaseSchemaCompatibility)
229
312
  && manifest.workerProtocolVersion === expected.workerProtocolVersion
230
313
  && manifest.releaseRevision === expected.releaseRevision
@@ -232,6 +315,7 @@ function assertImmutablePackageRuntimeRelease(input: {
232
315
  && typeof manifest.createdAt === 'string'
233
316
  && Number.isFinite(Date.parse(manifest.createdAt));
234
317
  if (!compatible) throw new Error('PACKAGE_RUNTIME_RELEASE_IMMUTABILITY_VIOLATION: manifest identity changed');
318
+ if (!expected.controllerHome) throw new Error('PACKAGE_RUNTIME_RELEASE_IMMUTABILITY_VIOLATION: package release must remain ControllerHome-bound');
235
319
  assertRuntimeReleaseExecutionSurface(input.manifestPath, expected.controllerHome);
236
320
  }
237
321
 
@@ -245,8 +329,9 @@ export function materializePackageRuntimeRelease(input: {
245
329
  const version = packageVersion(sourcePackageRoot);
246
330
  const records = packageRuntimeFileIndex(sourcePackageRoot);
247
331
  const fingerprint = packageRuntimeFingerprint(records);
332
+ const packageArtifactIdentity = packageRuntimeArtifactIdentity(sourcePackageRoot, records);
248
333
  const safeVersion = version.replace(/[^A-Za-z0-9._-]+/g, '-');
249
- const launcherBinding = sha256(`${resolve(process.execPath)}\0package-launcher-v5`);
334
+ const launcherBinding = sha256(`${resolve(process.execPath)}\0package-launcher-v9`);
250
335
  const releaseId = `package-${safeVersion}-${fingerprint.slice(0, 16)}-${launcherBinding.slice(0, 12)}`;
251
336
  const releasesRoot = join(controllerHome, 'runtime', 'releases');
252
337
  const releaseRoot = join(releasesRoot, releaseId);
@@ -280,6 +365,8 @@ export function materializePackageRuntimeRelease(input: {
280
365
  processRunnerArtifactIdentity,
281
366
  checkRunnerEntrypoint,
282
367
  checkRunnerArtifactIdentity,
368
+ packageRoot: 'package',
369
+ packageArtifactIdentity,
283
370
  arguments: [],
284
371
  configurationSchemaVersion: 1,
285
372
  controllerHome,
@@ -314,16 +401,16 @@ export function materializePackageRuntimeRelease(input: {
314
401
  try {
315
402
  mkdirSync(stagingRoot, { recursive: false, mode: 0o700 });
316
403
  stagePackageRuntimeSnapshot(sourcePackageRoot, join(stagingRoot, 'package'), records);
317
- atomicWrite(join(stagingRoot, 'package-files.json'), indexJson);
318
- atomicWrite(join(stagingRoot, 'forge-runtime'), launcher, 0o700);
404
+ writeAtomicTextFile(join(stagingRoot, 'package-files.json'), indexJson);
405
+ writeAtomicTextFile(join(stagingRoot, 'forge-runtime'), launcher, 0o700);
319
406
  chmodSync(join(stagingRoot, 'forge-runtime'), 0o700);
320
- atomicWrite(join(stagingRoot, processRunnerEntrypoint), processRunnerLauncher, 0o700);
407
+ writeAtomicTextFile(join(stagingRoot, processRunnerEntrypoint), processRunnerLauncher, 0o700);
321
408
  chmodSync(join(stagingRoot, processRunnerEntrypoint), 0o700);
322
- atomicWrite(join(stagingRoot, checkRunnerEntrypoint), checkRunnerLauncher, 0o700);
409
+ writeAtomicTextFile(join(stagingRoot, checkRunnerEntrypoint), checkRunnerLauncher, 0o700);
323
410
  chmodSync(join(stagingRoot, checkRunnerEntrypoint), 0o700);
324
411
  const manifest: RuntimeReleaseManifest = { ...expectedManifest, createdAt: new Date().toISOString() };
325
412
  const stagingManifestPath = join(stagingRoot, 'manifest.json');
326
- atomicWrite(stagingManifestPath, `${JSON.stringify(manifest, null, 2)}\n`);
413
+ writeAtomicTextFile(stagingManifestPath, `${JSON.stringify(manifest, null, 2)}\n`);
327
414
  // A failed execution surface is still a staging failure. Do not promote an
328
415
  // immutable release directory until both manifest-owned runners execute
329
416
  // their bounded no-op canary successfully.