@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,7 @@
1
1
  import { resolve } from 'path';
2
2
  import { resolveControllerHome } from '../../cli/repositories/controller-home';
3
3
  import { isProcessAlive } from '../shared/process-tree';
4
- import { readRuntimeOwner, type RuntimeOwnerRecord } from './ownership';
4
+ import { readRuntimeIncarnation, readRuntimeOwner, type RuntimeOwnerRecord } from './ownership';
5
5
  import {
6
6
  readRuntimeReleaseAuthority,
7
7
  type RuntimeReleaseAuthority,
@@ -29,6 +29,7 @@ export type RuntimeWriteAction = (typeof RUNTIME_WRITE_ACTIONS)[number];
29
29
  export interface RuntimeWriteClaim {
30
30
  controllerHome: string;
31
31
  runtimeInstanceId: string;
32
+ fencingGeneration: number;
32
33
  ownerPid: number;
33
34
  releaseAuthorityRevision: number;
34
35
  releaseFencingToken: string;
@@ -50,6 +51,7 @@ export interface RuntimeWriteFenceCheck {
50
51
  export const RUNTIME_WRITE_CLAIM_ENV = {
51
52
  controllerHome: 'FORGE_CONTROLLER_HOME',
52
53
  runtimeInstanceId: 'FORGE_RUNTIME_INSTANCE_ID',
54
+ fencingGeneration: 'FORGE_RUNTIME_INCARNATION_GENERATION',
53
55
  ownerPid: 'FORGE_RUNTIME_OWNER_PID',
54
56
  releaseAuthorityRevision: 'FORGE_RELEASE_AUTHORITY_REVISION',
55
57
  releaseFencingToken: 'FORGE_RELEASE_FENCING_TOKEN',
@@ -75,6 +77,7 @@ function claimFromAuthority(
75
77
  return {
76
78
  controllerHome: resolveControllerHome(controllerHome),
77
79
  runtimeInstanceId: owner.runtimeInstanceId,
80
+ fencingGeneration: owner.fencingGeneration ?? 0,
78
81
  ownerPid: owner.pid,
79
82
  releaseAuthorityRevision: authority.revision,
80
83
  releaseFencingToken: authority.fencingToken,
@@ -85,11 +88,22 @@ function claimFromAuthority(
85
88
  };
86
89
  }
87
90
 
91
+ export function currentRuntimeWriteClaimEnvironment(controllerHome: string): Record<string, string> {
92
+ const home = resolveControllerHome(controllerHome);
93
+ const owner = readRuntimeOwner(home);
94
+ const authority = readRuntimeReleaseAuthority(home);
95
+ if (!owner || !authority) {
96
+ throw new Error('RUNTIME_WRITE_CLAIM_BIND_FAILED: Runtime owner or release authority is missing');
97
+ }
98
+ return runtimeWriteClaimEnvironment(claimFromAuthority(home, owner, authority));
99
+ }
100
+
88
101
  export function runtimeWriteClaimEnvironment(claim: RuntimeWriteClaim): Record<string, string> {
89
102
  if (claim.unmanaged) return {};
90
103
  return {
91
104
  [RUNTIME_WRITE_CLAIM_ENV.controllerHome]: claim.controllerHome,
92
105
  [RUNTIME_WRITE_CLAIM_ENV.runtimeInstanceId]: claim.runtimeInstanceId,
106
+ [RUNTIME_WRITE_CLAIM_ENV.fencingGeneration]: String(claim.fencingGeneration),
93
107
  [RUNTIME_WRITE_CLAIM_ENV.ownerPid]: String(claim.ownerPid),
94
108
  [RUNTIME_WRITE_CLAIM_ENV.releaseAuthorityRevision]: String(claim.releaseAuthorityRevision),
95
109
  [RUNTIME_WRITE_CLAIM_ENV.releaseFencingToken]: claim.releaseFencingToken,
@@ -130,6 +144,7 @@ export const clearRuntimeWriteClaimForTests = clearRuntimeWriteClaim;
130
144
  export function bindRuntimeWriteClaim(input: {
131
145
  controllerHome: string;
132
146
  runtimeInstanceId?: string;
147
+ fencingGeneration?: number;
133
148
  ownerPid?: number;
134
149
  releaseAuthorityRevision?: number;
135
150
  releaseFencingToken?: string;
@@ -146,6 +161,7 @@ export function bindRuntimeWriteClaim(input: {
146
161
 
147
162
  const explicit = {
148
163
  runtimeInstanceId: input.runtimeInstanceId?.trim(),
164
+ fencingGeneration: input.fencingGeneration,
149
165
  ownerPid: input.ownerPid,
150
166
  releaseAuthorityRevision: input.releaseAuthorityRevision,
151
167
  releaseFencingToken: input.releaseFencingToken?.trim(),
@@ -157,6 +173,7 @@ export function bindRuntimeWriteClaim(input: {
157
173
  const hasAnyExplicit = explicitValues.some((value) => value !== undefined && value !== '');
158
174
  const hasFullExplicit = Boolean(
159
175
  explicit.runtimeInstanceId
176
+ && Number.isInteger(explicit.fencingGeneration) && explicit.fencingGeneration! > 0
160
177
  && Number.isInteger(explicit.ownerPid) && explicit.ownerPid! > 0
161
178
  && Number.isInteger(explicit.releaseAuthorityRevision) && explicit.releaseAuthorityRevision! > 0
162
179
  && explicit.releaseFencingToken
@@ -169,6 +186,7 @@ export function bindRuntimeWriteClaim(input: {
169
186
  return installClaim({
170
187
  controllerHome: home,
171
188
  runtimeInstanceId: explicit.runtimeInstanceId!,
189
+ fencingGeneration: explicit.fencingGeneration!,
172
190
  ownerPid: explicit.ownerPid!,
173
191
  releaseAuthorityRevision: explicit.releaseAuthorityRevision!,
174
192
  releaseFencingToken: explicit.releaseFencingToken!,
@@ -190,6 +208,7 @@ export function bindRuntimeWriteClaim(input: {
190
208
  return installClaim({
191
209
  controllerHome: home,
192
210
  runtimeInstanceId: `unmanaged-${process.pid}`,
211
+ fencingGeneration: 0,
193
212
  ownerPid: process.pid,
194
213
  releaseAuthorityRevision: 0,
195
214
  releaseFencingToken: 'unmanaged',
@@ -220,6 +239,7 @@ export function bindInheritedRuntimeWriteClaimFromEnvironment(
220
239
  return bindRuntimeWriteClaim({
221
240
  controllerHome,
222
241
  runtimeInstanceId,
242
+ fencingGeneration: positiveInteger(env[RUNTIME_WRITE_CLAIM_ENV.fencingGeneration]),
223
243
  ownerPid: positiveInteger(env[RUNTIME_WRITE_CLAIM_ENV.ownerPid]),
224
244
  releaseAuthorityRevision: positiveInteger(env[RUNTIME_WRITE_CLAIM_ENV.releaseAuthorityRevision]),
225
245
  releaseFencingToken: env[RUNTIME_WRITE_CLAIM_ENV.releaseFencingToken]?.trim(),
@@ -256,6 +276,7 @@ export function assertRuntimeMayWrite(
256
276
  const home = explicitHome ?? claim?.controllerHome;
257
277
  if (!home) return { allowed: true, reason: 'unbound_no_controller_home' };
258
278
  const owner = readRuntimeOwner(home);
279
+ const incarnation = readRuntimeIncarnation(home);
259
280
  const authority = readRuntimeReleaseAuthority(home);
260
281
  if (!claim) {
261
282
  if (!owner && !authority) return { allowed: true, reason: 'unbound_no_runtime_authority' };
@@ -276,9 +297,18 @@ export function assertRuntimeMayWrite(
276
297
  }
277
298
  if (!owner) return { allowed: false, reason: 'runtime_owner_missing', authority };
278
299
  if (!isProcessAlive(owner.pid)) return { allowed: false, reason: 'runtime_owner_dead', owner, authority };
300
+ if (!incarnation) return { allowed: false, reason: 'runtime_incarnation_missing', owner, authority };
301
+ if (
302
+ incarnation.runtimeInstanceId !== owner.runtimeInstanceId
303
+ || incarnation.pid !== owner.pid
304
+ || incarnation.fencingGeneration !== (owner.fencingGeneration ?? 0)
305
+ ) return { allowed: false, reason: 'runtime_incarnation_authority_mismatch', owner, authority };
279
306
  if (owner.runtimeInstanceId !== claim.runtimeInstanceId) {
280
307
  return { allowed: false, reason: 'runtime_instance_fenced', owner, authority };
281
308
  }
309
+ if (incarnation.fencingGeneration !== claim.fencingGeneration) {
310
+ return { allowed: false, reason: 'runtime_incarnation_generation_fenced', owner, authority };
311
+ }
282
312
  if (owner.pid !== claim.ownerPid) return { allowed: false, reason: 'runtime_owner_pid_fenced', owner, authority };
283
313
  if (!authority) return { allowed: false, reason: 'runtime_release_authority_missing', owner };
284
314
  if (authority.revision !== claim.releaseAuthorityRevision) {
@@ -299,11 +329,29 @@ export function assertRuntimeMayWrite(
299
329
  return { allowed: true, owner, authority };
300
330
  }
301
331
 
332
+ export class RuntimeWriteFenceError extends Error {
333
+ readonly code = 'WRITER_FENCED' as const;
334
+
335
+ constructor(
336
+ readonly action: RuntimeWriteAction,
337
+ readonly reason: string,
338
+ ) {
339
+ super(`WRITER_FENCED:${action}:${reason}`);
340
+ this.name = 'RuntimeWriteFenceError';
341
+ }
342
+ }
343
+
344
+ export function isRuntimeWriteFenceError(error: unknown): error is RuntimeWriteFenceError {
345
+ return Boolean(error
346
+ && typeof error === 'object'
347
+ && (error as { code?: unknown }).code === 'WRITER_FENCED');
348
+ }
349
+
302
350
  export function assertRuntimeMayWriteOrThrow(
303
351
  action: RuntimeWriteAction,
304
352
  controllerHomeOverride?: string,
305
353
  ): RuntimeReleaseAuthority | undefined {
306
354
  const check = assertRuntimeMayWrite(action, controllerHomeOverride);
307
- if (!check.allowed) throw new Error(`WRITER_FENCED:${action}:${check.reason ?? 'denied'}`);
355
+ if (!check.allowed) throw new RuntimeWriteFenceError(action, check.reason ?? 'denied');
308
356
  return check.authority;
309
357
  }
@@ -1,16 +1,19 @@
1
1
  import { execFileSync } from 'child_process';
2
2
 
3
3
  export type StoredGoogleService = 'gmail' | 'calendar' | 'tasks' | 'google-workspace';
4
+ export type StoredGoogleCredentialKind = 'refresh-token' | 'client-secret';
4
5
 
5
6
  export interface GoogleCredentialStoreAdapter {
6
7
  available(): boolean;
7
- read(service: StoredGoogleService): string | undefined;
8
- write(service: StoredGoogleService, refreshToken: string): void;
8
+ read(service: StoredGoogleService, kind?: StoredGoogleCredentialKind): string | undefined;
9
+ write(service: StoredGoogleService, value: string, kind?: StoredGoogleCredentialKind): void;
9
10
  }
10
11
 
11
12
  const KEYCHAIN_SERVICE_PREFIX = 'forge.google-oauth';
12
- const KEYCHAIN_ACCOUNT = 'refresh-token';
13
- const memoryCache = new Map<StoredGoogleService, string>();
13
+ const KEYCHAIN_ACCOUNT: Record<StoredGoogleCredentialKind, string> = {
14
+ 'refresh-token': 'refresh-token',
15
+ 'client-secret': 'client-secret',
16
+ };
14
17
 
15
18
  function keychainService(service: StoredGoogleService): string {
16
19
  return `${KEYCHAIN_SERVICE_PREFIX}.${service}`;
@@ -18,13 +21,13 @@ function keychainService(service: StoredGoogleService): string {
18
21
 
19
22
  const macKeychainAdapter: GoogleCredentialStoreAdapter = {
20
23
  available: () => process.platform === 'darwin',
21
- read(service) {
24
+ read(service, kind = 'refresh-token') {
22
25
  if (process.platform !== 'darwin') return undefined;
23
26
  try {
24
27
  const value = execFileSync('/usr/bin/security', [
25
28
  'find-generic-password',
26
29
  '-s', keychainService(service),
27
- '-a', KEYCHAIN_ACCOUNT,
30
+ '-a', KEYCHAIN_ACCOUNT[kind],
28
31
  '-w',
29
32
  ], {
30
33
  encoding: 'utf-8',
@@ -36,7 +39,7 @@ const macKeychainAdapter: GoogleCredentialStoreAdapter = {
36
39
  return undefined;
37
40
  }
38
41
  },
39
- write(service, refreshToken) {
42
+ write(service, value, kind = 'refresh-token') {
40
43
  if (process.platform !== 'darwin') {
41
44
  throw new Error('GOOGLE_CREDENTIAL_STORE_UNAVAILABLE: macOS Keychain is required for local OAuth credential persistence');
42
45
  }
@@ -44,8 +47,8 @@ const macKeychainAdapter: GoogleCredentialStoreAdapter = {
44
47
  'add-generic-password',
45
48
  '-U',
46
49
  '-s', keychainService(service),
47
- '-a', KEYCHAIN_ACCOUNT,
48
- '-w', refreshToken,
50
+ '-a', KEYCHAIN_ACCOUNT[kind],
51
+ '-w', value,
49
52
  ], {
50
53
  encoding: 'utf-8',
51
54
  stdio: ['ignore', 'ignore', 'pipe'],
@@ -58,7 +61,6 @@ let adapter: GoogleCredentialStoreAdapter = macKeychainAdapter;
58
61
 
59
62
  export function setGoogleCredentialStoreAdapterForTest(next?: GoogleCredentialStoreAdapter): void {
60
63
  adapter = next ?? macKeychainAdapter;
61
- memoryCache.clear();
62
64
  }
63
65
 
64
66
  export function googleCredentialStoreStatus(): Record<string, unknown> {
@@ -67,29 +69,72 @@ export function googleCredentialStoreStatus(): Record<string, unknown> {
67
69
  available: adapter.available(),
68
70
  repositoryPersistence: false,
69
71
  controllerStatePersistence: false,
72
+ credentialKinds: ['refresh-token', 'client-secret'],
70
73
  };
71
74
  }
72
75
 
73
- export function readStoredGoogleRefreshToken(service: StoredGoogleService): { token: string; source: string } | undefined {
76
+ function readStoredGoogleCredential(
77
+ service: StoredGoogleService,
78
+ kind: StoredGoogleCredentialKind,
79
+ ): { value: string; source: string } | undefined {
74
80
  const candidates: StoredGoogleService[] = service === 'google-workspace'
75
81
  ? ['google-workspace']
76
82
  : [service, 'google-workspace'];
77
83
  for (const candidate of candidates) {
78
- const cached = memoryCache.get(candidate);
79
- if (cached) return { token: cached, source: `keychain:${candidate}` };
80
84
  if (!adapter.available()) continue;
81
- const token = adapter.read(candidate)?.trim();
82
- if (!token) continue;
83
- memoryCache.set(candidate, token);
84
- return { token, source: `keychain:${candidate}` };
85
+ // Keychain is the authority: another Forge process may have rotated this credential.
86
+ const value = adapter.read(candidate, kind)?.trim();
87
+ if (!value) continue;
88
+ return { value, source: `keychain:${candidate}:${kind}` };
85
89
  }
86
90
  return undefined;
87
91
  }
88
92
 
89
- export function writeStoredGoogleRefreshToken(service: StoredGoogleService, refreshToken: string): void {
90
- const token = refreshToken.trim();
91
- if (!token) throw new Error('GOOGLE_REFRESH_TOKEN_REQUIRED');
93
+ function writeStoredGoogleCredential(service: StoredGoogleService, kind: StoredGoogleCredentialKind, value: string): void {
94
+ const normalized = value.trim();
95
+ if (!normalized) throw new Error(kind === 'refresh-token' ? 'GOOGLE_REFRESH_TOKEN_REQUIRED' : 'GOOGLE_CLIENT_SECRET_REQUIRED');
92
96
  if (!adapter.available()) throw new Error('GOOGLE_CREDENTIAL_STORE_UNAVAILABLE');
93
- adapter.write(service, token);
94
- memoryCache.set(service, token);
97
+ adapter.write(service, normalized, kind);
98
+ }
99
+
100
+ export function readStoredGoogleRefreshToken(service: StoredGoogleService): { token: string; source: string } | undefined {
101
+ const stored = readStoredGoogleCredential(service, 'refresh-token');
102
+ return stored ? { token: stored.value, source: stored.source } : undefined;
103
+ }
104
+
105
+ export function writeStoredGoogleRefreshToken(service: StoredGoogleService, refreshToken: string): void {
106
+ writeStoredGoogleCredential(service, 'refresh-token', refreshToken);
107
+ }
108
+
109
+ export function readStoredGoogleClientSecret(service: StoredGoogleService): { secret: string; source: string } | undefined {
110
+ const stored = readStoredGoogleCredential(service, 'client-secret');
111
+ return stored ? { secret: stored.value, source: stored.source } : undefined;
112
+ }
113
+
114
+ export function writeStoredGoogleClientSecret(service: StoredGoogleService, clientSecret: string): void {
115
+ writeStoredGoogleCredential(service, 'client-secret', clientSecret);
116
+ }
117
+
118
+ export function importStoredGoogleClientSecretFromClipboard(service: StoredGoogleService): Record<string, unknown> {
119
+ if (process.platform !== 'darwin' || !adapter.available()) throw new Error('GOOGLE_CREDENTIAL_STORE_UNAVAILABLE');
120
+ const secret = execFileSync('/usr/bin/pbpaste', [], {
121
+ encoding: 'utf-8',
122
+ stdio: ['ignore', 'pipe', 'ignore'],
123
+ timeout: 2_000,
124
+ }).trim();
125
+ if (!secret || secret.length > 1024 || /\s/.test(secret)) throw new Error('GOOGLE_CLIENT_SECRET_CLIPBOARD_INVALID');
126
+ writeStoredGoogleClientSecret(service, secret);
127
+ execFileSync('/usr/bin/pbcopy', [], {
128
+ encoding: 'utf-8',
129
+ input: '',
130
+ stdio: ['pipe', 'ignore', 'ignore'],
131
+ timeout: 2_000,
132
+ });
133
+ return {
134
+ stored: true,
135
+ service,
136
+ backend: 'macos-keychain',
137
+ clipboardCleared: true,
138
+ credentialMaterialReturned: false,
139
+ };
95
140
  }
@@ -5,6 +5,7 @@ import { URLSearchParams } from 'url';
5
5
  import { installGoogleAccessToken } from '../plugins/google-shared';
6
6
  import {
7
7
  googleCredentialStoreStatus,
8
+ readStoredGoogleClientSecret,
8
9
  type StoredGoogleService,
9
10
  writeStoredGoogleRefreshToken,
10
11
  } from './google-credential-store';
@@ -138,16 +139,33 @@ function base64Url(value: Buffer): string {
138
139
  return value.toString('base64url');
139
140
  }
140
141
 
141
- function clientId(): string | undefined {
142
- return process.env.FORGE_GOOGLE_WORKSPACE_CLIENT_ID?.trim()
142
+ function clientId(service: GoogleOAuthService): string | undefined {
143
+ const serviceSpecific = service === 'gmail'
144
+ ? process.env.FORGE_GMAIL_CLIENT_ID?.trim()
145
+ : service === 'calendar'
146
+ ? process.env.FORGE_GOOGLE_CALENDAR_CLIENT_ID?.trim()
147
+ : service === 'tasks'
148
+ ? process.env.FORGE_GOOGLE_TASKS_CLIENT_ID?.trim()
149
+ : undefined;
150
+ return serviceSpecific
151
+ || process.env.FORGE_GOOGLE_WORKSPACE_CLIENT_ID?.trim()
143
152
  || process.env.FORGE_GOOGLE_CLIENT_ID?.trim()
144
153
  || process.env.GOOGLE_CLIENT_ID?.trim();
145
154
  }
146
155
 
147
- function clientSecret(): string | undefined {
148
- return process.env.FORGE_GOOGLE_WORKSPACE_CLIENT_SECRET?.trim()
156
+ function clientSecret(service: GoogleOAuthService): string | undefined {
157
+ const serviceSpecific = service === 'gmail'
158
+ ? process.env.FORGE_GMAIL_CLIENT_SECRET?.trim()
159
+ : service === 'calendar'
160
+ ? process.env.FORGE_GOOGLE_CALENDAR_CLIENT_SECRET?.trim()
161
+ : service === 'tasks'
162
+ ? process.env.FORGE_GOOGLE_TASKS_CLIENT_SECRET?.trim()
163
+ : undefined;
164
+ return serviceSpecific
165
+ || process.env.FORGE_GOOGLE_WORKSPACE_CLIENT_SECRET?.trim()
149
166
  || process.env.FORGE_GOOGLE_CLIENT_SECRET?.trim()
150
- || process.env.GOOGLE_CLIENT_SECRET?.trim();
167
+ || process.env.GOOGLE_CLIENT_SECRET?.trim()
168
+ || readStoredGoogleClientSecret(service)?.secret;
151
169
  }
152
170
 
153
171
  export function prepareGoogleOAuthLogin(
@@ -157,7 +175,7 @@ export function prepareGoogleOAuthLogin(
157
175
  pruneOAuthRequests(controllerHome);
158
176
  const redirectUri = validateRedirectUri(input.redirectUri);
159
177
  const scopes = validateScopes(input.service, input.scopes);
160
- const configuredClientId = clientId();
178
+ const configuredClientId = clientId(input.service);
161
179
  if (!configuredClientId) {
162
180
  return {
163
181
  schemaVersion: 1,
@@ -236,7 +254,7 @@ export async function completeGoogleOAuthLogin(
236
254
  }
237
255
  const code = input.code?.trim();
238
256
  if (!code) throw new Error('GOOGLE_OAUTH_CODE_REQUIRED');
239
- const configuredSecret = clientSecret();
257
+ const configuredSecret = clientSecret(selected.record.service);
240
258
  if (!configuredSecret) throw new Error('GOOGLE_OAUTH_CLIENT_SECRET_REQUIRED');
241
259
  const body = new URLSearchParams({
242
260
  grant_type: 'authorization_code',
@@ -1,5 +1,5 @@
1
1
  import { createHash } from 'crypto';
2
- import { existsSync, mkdirSync, readdirSync, readFileSync, realpathSync, writeFileSync } from 'fs';
2
+ import { existsSync, mkdirSync, readdirSync, readFileSync, realpathSync, utimesSync, writeFileSync } from 'fs';
3
3
  import { basename, dirname, join, relative, resolve, sep } from 'path';
4
4
  import { spawnSync } from 'child_process';
5
5
  import type { RepositoryRecord } from '../../cli/repositories/types';
@@ -155,13 +155,26 @@ function sanitize(value: string): string {
155
155
 
156
156
  function stableBuildDerivedDataPath(
157
157
  repository: RepositoryRecord,
158
- input: { workspace?: string; project?: string; scheme: string; configuration: string; destination: string },
158
+ input: { workspace?: string; project?: string; scheme: string; configuration: string; destinationPlatform: 'ios_simulator' | 'ios' },
159
159
  ): string {
160
- const identity = JSON.stringify([input.workspace ?? '', input.project ?? '', input.scheme, input.configuration, input.destination]);
160
+ const identity = JSON.stringify([input.workspace ?? '', input.project ?? '', input.scheme, input.configuration, input.destinationPlatform]);
161
161
  const digest = createHash('sha256').update(identity).digest('hex').slice(0, 16);
162
162
  return join(safeArtifactDir(repository, 'DerivedData'), `build-${sanitize(input.scheme)}-${digest}`);
163
163
  }
164
164
 
165
+ // Xcode owns invalidation within this checkout-local, platform/configuration bucket.
166
+ // Device identity and test selectors affect execution, not the reusable build cache.
167
+ function runCachedXcodeCommand(repository: RepositoryRecord, derivedDataPath: string, args: string[], timeoutMs: number): IosCommandResult {
168
+ const touch = (): void => { const usedAt = now(); utimesSync(derivedDataPath, usedAt, usedAt); };
169
+ touch();
170
+ try {
171
+ return runCommand('xcodebuild', args, { cwd: repository.canonicalRoot, timeoutMs });
172
+ } finally {
173
+ // Reuse may only modify descendants; keep last-use grace on the bucket itself.
174
+ touch();
175
+ }
176
+ }
177
+
165
178
  function boundedText(value: string, maxBytes = 20_000): { content: string; truncated: boolean } {
166
179
  const buffer = Buffer.from(value, 'utf-8');
167
180
  if (buffer.byteLength <= maxBytes) return { content: value, truncated: false };
@@ -427,7 +440,7 @@ export function iosAppBuild(repository: RepositoryRecord, input: {
427
440
  : udid
428
441
  ? `platform=iOS Simulator,id=${udid}`
429
442
  : `platform=iOS Simulator,name=${input.simulatorName ?? 'iPhone 16 Pro'}`;
430
- const derivedDataPath = stableBuildDerivedDataPath(repository, { workspace, project, scheme, configuration, destination });
443
+ const derivedDataPath = stableBuildDerivedDataPath(repository, { workspace, project, scheme, configuration, destinationPlatform });
431
444
  const derivedDataReused = existsSync(derivedDataPath);
432
445
  mkdirSync(derivedDataPath, { recursive: true });
433
446
  const priorBuiltApps = derivedDataReused ? findBuiltApps(repository, derivedDataPath) : [];
@@ -445,7 +458,7 @@ export function iosAppBuild(repository: RepositoryRecord, input: {
445
458
  '-authenticationKeyIssuerID', authentication.issuerId,
446
459
  );
447
460
  }
448
- const result = runCommand('xcodebuild', args, { cwd: repository.canonicalRoot, timeoutMs: input.timeoutMs ?? 10 * 60_000 });
461
+ const result = runCachedXcodeCommand(repository, derivedDataPath, args, input.timeoutMs ?? 10 * 60_000);
449
462
  const sensitiveValues = authentication
450
463
  ? [authentication.privateKeyPath, authentication.keyId, authentication.issuerId]
451
464
  : [];
@@ -509,8 +522,9 @@ export function iosXcodeTest(repository: RepositoryRecord, input: {
509
522
  if (!scheme) throw new Error('IOS_SCHEME_REQUIRED: provide scheme or share at least one Xcode scheme');
510
523
  const workspace = safeRepoRelativePath(repository.canonicalRoot, input.workspace ?? listedReady.workspace);
511
524
  const project = safeRepoRelativePath(repository.canonicalRoot, input.project ?? listedReady.project);
512
- const derivedDataPath = join(safeArtifactDir(repository, 'DerivedData'), `tests-${sanitize(scheme)}`);
513
- const resultBundlePath = join(safeArtifactDir(repository, 'test-results'), `${timestamp()}-${sanitize(scheme)}.xcresult`);
525
+ const configuration = input.configuration ?? 'Debug';
526
+ const derivedDataPath = stableBuildDerivedDataPath(repository, { workspace, project, scheme, configuration, destinationPlatform: 'ios_simulator' });
527
+ const resultBundlePath = join(safeArtifactDir(repository, 'test-results'), `${artifactStamp()}-${sanitize(scheme)}.xcresult`);
514
528
  mkdirSync(derivedDataPath, { recursive: true });
515
529
  const args = ['test'];
516
530
  if (workspace) args.push('-workspace', workspace);
@@ -531,7 +545,7 @@ export function iosXcodeTest(repository: RepositoryRecord, input: {
531
545
  if (normalized) args.push(`-only-testing:${normalized}`);
532
546
  }
533
547
  args.push('-derivedDataPath', derivedDataPath, '-resultBundlePath', resultBundlePath);
534
- const result = runCommand('xcodebuild', args, { cwd: repository.canonicalRoot, timeoutMs: input.timeoutMs ?? 15 * 60_000 });
548
+ const result = runCachedXcodeCommand(repository, derivedDataPath, args, input.timeoutMs ?? 15 * 60_000);
535
549
  return {
536
550
  ready: result.ok,
537
551
  ok: result.ok,
@@ -1,4 +1,4 @@
1
- import { redactMcpText } from '../../cli/mcp/redaction';
1
+ import { redactMcpText } from '../../../adapters/mcp/redaction';
2
2
  import type { ExecutionJob } from '../execution/jobs/types';
3
3
  import { buildJobOperationDigest } from '../control-plane/facade/operation-digest';
4
4
  import {
@@ -56,6 +56,7 @@ function pluginAuthSummary(manifest: AssistantPluginManifest): Record<string, un
56
56
  lifecycleReason: manifest.lifecycle.reason,
57
57
  healthState: manifest.health.state,
58
58
  ready: manifest.health.ready,
59
+ readinessMode: manifest.health.details?.readinessMode,
59
60
  authRequired: manifest.health.errors.some((error) => /access token|auth|authorization|oauth/i.test(error)),
60
61
  errors: manifest.health.errors.slice(0, 5),
61
62
  warnings: manifest.health.warnings.slice(0, 5),
@@ -74,7 +75,9 @@ export function buildWorkspaceAuthStatus(manifests: AssistantPluginManifest[]):
74
75
  actionRequired: summaries.filter((entry) => entry.authRequired === true || entry.ready !== true).map((entry) => ({
75
76
  pluginId: entry.pluginId,
76
77
  reason: entry.lifecycleReason,
77
- next: 'Call workspace_auth_login_prepare and open the returned local OAuth URL. The callback stores the refresh token in macOS Keychain.',
78
+ next: entry.readinessMode === 'live_token_unverified'
79
+ ? 'Run a read-only provider action. If Google requires client_secret, restore the matching OAuth client secret in macOS Keychain; if it cannot be recovered, configure a dedicated OAuth client ID and matching secret, then reauthorize.'
80
+ : 'Call workspace_auth_login_prepare and open the returned local OAuth URL. The callback stores the refresh token in macOS Keychain.',
78
81
  })),
79
82
  safety: {
80
83
  credentialMaterialReturned: false,
@@ -88,10 +91,10 @@ export function prepareWorkspaceAuthLogin(
88
91
  controllerHomeOrInput: string | WorkspaceAuthLoginInput = {},
89
92
  maybeInput: WorkspaceAuthLoginInput = {},
90
93
  ): Record<string, unknown> {
91
- bootstrapManagedRuntimeEnv();
92
94
  const controllerHome = typeof controllerHomeOrInput === 'string'
93
95
  ? controllerHomeOrInput
94
96
  : process.env.FORGE_CONTROLLER_HOME?.trim() || process.cwd();
97
+ bootstrapManagedRuntimeEnv({ controllerHome });
95
98
  const input = typeof controllerHomeOrInput === 'string' ? maybeInput : controllerHomeOrInput;
96
99
  const service = normalizeService(input.service);
97
100
  const redirectUri = input.redirectUri || process.env.FORGE_GOOGLE_REDIRECT_URI || 'http://127.0.0.1:8766/oauth/google/callback';
@@ -0,0 +1,21 @@
1
+ import { randomUUID } from 'crypto';
2
+ import { mkdirSync, renameSync, rmSync, writeFileSync } from 'fs';
3
+ import { dirname } from 'path';
4
+
5
+ /**
6
+ * The single atomic text writer for Forge-managed service and release files.
7
+ * Create private parent directories, use a collision-resistant temporary file,
8
+ * preserve the caller-selected target mode, and remove abandoned temp files
9
+ * after a failed write or rename. An atomic rename is not an fsync guarantee.
10
+ */
11
+ export function writeAtomicTextFile(path: string, content: string, mode = 0o600): void {
12
+ mkdirSync(dirname(path), { recursive: true, mode: 0o700 });
13
+ const temporary = `${path}.${process.pid}.${randomUUID()}.tmp`;
14
+ try {
15
+ writeFileSync(temporary, content, { encoding: 'utf8', mode, flag: 'wx' });
16
+ renameSync(temporary, path);
17
+ } catch (error) {
18
+ try { rmSync(temporary, { force: true }); } catch { /* preserve original write failure */ }
19
+ throw error;
20
+ }
21
+ }
@@ -39,6 +39,8 @@ export interface BoundedChildRunOptions {
39
39
  env?: NodeJS.ProcessEnv;
40
40
  timeoutMs: number;
41
41
  maxOutputBytes?: number;
42
+ /** Optional bounded stdin payload for request/response sidecars. */
43
+ input?: string | Buffer;
42
44
  stdio?: 'capture' | 'inherit';
43
45
  forwardSignals?: boolean;
44
46
  onSpawn?: (pid: number) => void;
@@ -120,7 +122,7 @@ export async function runBoundedChild(
120
122
  const maxOutputBytes = options.maxOutputBytes ?? DEFAULT_MAX_OUTPUT_BYTES;
121
123
  const stdio: StdioOptions = options.stdio === 'inherit'
122
124
  ? ['ignore', 'inherit', 'inherit']
123
- : ['ignore', 'pipe', 'pipe'];
125
+ : [options.input === undefined ? 'ignore' : 'pipe', 'pipe', 'pipe'];
124
126
  let child: ChildProcess;
125
127
  try {
126
128
  child = spawn(command, [...args], {
@@ -147,6 +149,12 @@ export async function runBoundedChild(
147
149
 
148
150
  const pid = child.pid;
149
151
  if (pid) options.onSpawn?.(pid);
152
+ if (options.input !== undefined && child.stdin) {
153
+ // A canary or validation failure may close stdin before the parent writes.
154
+ // The child outcome is authoritative; a late EPIPE must not crash the host.
155
+ child.stdin.on('error', () => undefined);
156
+ child.stdin.end(options.input);
157
+ }
150
158
  let stdout = '';
151
159
  let stderr = '';
152
160
  child.stdout?.on('data', (chunk) => { stdout = appendBounded(stdout, chunk, maxOutputBytes); });
@@ -16,11 +16,16 @@ export function readJsonFile<T>(path: string, fallback?: T): T {
16
16
  }
17
17
  }
18
18
 
19
- export function writeJsonAtomic(path: string, value: unknown): void {
19
+ export function writeJsonAtomic(path: string, value: unknown, options?: { mode?: number }): void {
20
20
  ensureParent(path);
21
21
  const temporary = `${path}.${process.pid}.${randomUUID()}.tmp`;
22
- writeFileSync(temporary, `${JSON.stringify(value, null, 2)}\n`, 'utf8');
23
- renameSync(temporary, path);
22
+ try {
23
+ writeFileSync(temporary, `${JSON.stringify(value, null, 2)}\n`, { encoding: 'utf8', ...(options?.mode === undefined ? {} : { mode: options.mode }) });
24
+ renameSync(temporary, path);
25
+ } catch (error) {
26
+ rmSync(temporary, { force: true });
27
+ throw error;
28
+ }
24
29
  }
25
30
 
26
31
  export function appendJsonLine(path: string, value: unknown): void {
@@ -22,11 +22,30 @@ const RUNTIME_PRIVATE_ENV_PREFIXES = [
22
22
 
23
23
  const RUNTIME_PRIVATE_ENV_KEYS = new Set([
24
24
  'FORGE_BUILD_VERSION',
25
+ 'FORGE_INSTANCE_ID',
25
26
  'FORGE_MCP_INSTANCE_ID',
26
27
  'FORGE_MCP_PUBLIC_ORIGIN',
27
28
  'FORGE_STABLE_SUPERVISOR',
28
29
  ]);
29
30
 
31
+ /**
32
+ * Remove the hosting Runtime's private authority before starting a service or
33
+ * child. Callers may then add the exact contract they own. This prevents an
34
+ * ambient writer slot/claim from becoming an accidental second writer.
35
+ */
36
+ export function runtimeAuthorityFreeEnvironment(
37
+ env: NodeJS.ProcessEnv = process.env,
38
+ ): NodeJS.ProcessEnv {
39
+ const sanitized = { ...env };
40
+ for (const key of Object.keys(sanitized)) {
41
+ if (
42
+ RUNTIME_PRIVATE_ENV_KEYS.has(key)
43
+ || RUNTIME_PRIVATE_ENV_PREFIXES.some((prefix) => key.startsWith(prefix))
44
+ ) delete sanitized[key];
45
+ }
46
+ return sanitized;
47
+ }
48
+
30
49
  function appendExecutableDirectory(pathEntries: string[], candidate: string | undefined): void {
31
50
  if (!candidate || !isAbsolute(candidate) || pathEntries.includes(candidate)) return;
32
51
  pathEntries.push(candidate);
@@ -70,15 +89,7 @@ export function repositoryChildProcessEnvironment(
70
89
  env: NodeJS.ProcessEnv = process.env,
71
90
  platform: NodeJS.Platform = process.platform,
72
91
  ): NodeJS.ProcessEnv {
73
- const sanitized = { ...env };
74
- for (const key of Object.keys(sanitized)) {
75
- if (
76
- RUNTIME_PRIVATE_ENV_KEYS.has(key)
77
- || RUNTIME_PRIVATE_ENV_PREFIXES.some((prefix) => key.startsWith(prefix))
78
- ) {
79
- delete sanitized[key];
80
- }
81
- }
92
+ const sanitized = runtimeAuthorityFreeEnvironment(env);
82
93
 
83
94
  if (platform === 'win32') {
84
95
  let inheritedPath: string | undefined;
@@ -222,9 +222,7 @@ export function artifactRef(input: {
222
222
  ...(typeof input.byteLength === 'number' ? { byteLength: input.byteLength } : {}),
223
223
  ...(input.repoId ? { repoId: input.repoId } : {}),
224
224
  ...(input.jobId ? { jobId: input.jobId } : {}),
225
- next: input.repoId
226
- ? `Call get_artifact with repo_id=${input.repoId} and artifact_id=${input.artifactId}.`
227
- : `Call get_artifact with artifact_id=${input.artifactId}.`,
225
+ next: `Call get_artifact with artifact_id=${input.artifactId}.`,
228
226
  };
229
227
  }
230
228