@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
@@ -0,0 +1,225 @@
1
+ import { deleteControlPlaneRecord, mutateControlPlaneRecord, readControlPlaneRecord } from '../control-plane/persistence/sqlite-store';
2
+
3
+ export const OUTPUT_HANDLE_INDEX_NAMESPACE = 'output_handle_index';
4
+ const OUTPUT_HANDLE_INDEX_SCOPE = 'instance';
5
+ const OUTPUT_HANDLE_INDEX_SCHEMA_VERSION = 1;
6
+
7
+ export type OutputHandleKind = 'result' | 'artifact' | 'evidence';
8
+ export type OutputHandleStorage =
9
+ | { scope: 'instance' }
10
+ | { scope: 'legacy_repository'; repositoryId: string };
11
+
12
+ export interface OutputHandleIndexEntry {
13
+ schemaVersion: 1;
14
+ handleId: string;
15
+ kind: OutputHandleKind;
16
+ storage: OutputHandleStorage;
17
+ /** Repository provenance is descriptive context, never the locator namespace. */
18
+ repositoryId?: string;
19
+ /** Opaque ids locate this record; authorization is bound separately. */
20
+ principalId?: string;
21
+ sessionId?: string;
22
+ workId?: string;
23
+ operationId?: string;
24
+ fingerprint: string;
25
+ recordedAt: string;
26
+ updatedAt: string;
27
+ }
28
+
29
+ function bounded(value: string | undefined): string | undefined {
30
+ const normalized = value?.trim();
31
+ return normalized ? normalized.slice(0, 512) : undefined;
32
+ }
33
+
34
+ function normalizedStorage(storage: OutputHandleStorage): OutputHandleStorage {
35
+ if (storage.scope === 'instance') return { scope: 'instance' };
36
+ const repositoryId = bounded(storage.repositoryId);
37
+ if (!repositoryId) throw new Error('OUTPUT_HANDLE_LEGACY_REPOSITORY_REQUIRED');
38
+ return { scope: 'legacy_repository', repositoryId };
39
+ }
40
+
41
+ function bindingsConflict(current: OutputHandleIndexEntry, input: {
42
+ principalId?: string;
43
+ sessionId?: string;
44
+ workId?: string;
45
+ operationId?: string;
46
+ }): boolean {
47
+ for (const key of ['principalId', 'sessionId', 'workId', 'operationId'] as const) {
48
+ const left = bounded(current[key]);
49
+ const right = bounded(input[key]);
50
+ if (left && right && left !== right) return true;
51
+ }
52
+ return false;
53
+ }
54
+
55
+ export function recordOutputHandleIndexEntry(
56
+ controllerHome: string,
57
+ input: {
58
+ handleId: string;
59
+ kind: OutputHandleKind;
60
+ storage: OutputHandleStorage;
61
+ repositoryId?: string;
62
+ principalId?: string;
63
+ sessionId?: string;
64
+ workId?: string;
65
+ operationId?: string;
66
+ fingerprint: string;
67
+ now?: string;
68
+ },
69
+ ): OutputHandleIndexEntry {
70
+ const handleId = bounded(input.handleId);
71
+ const fingerprint = bounded(input.fingerprint);
72
+ if (!handleId || !fingerprint) throw new Error('OUTPUT_HANDLE_IDENTITY_REQUIRED');
73
+ const storage = normalizedStorage(input.storage);
74
+ const now = input.now ?? new Date().toISOString();
75
+ const repositoryId = bounded(input.repositoryId);
76
+ const principalId = bounded(input.principalId);
77
+ const sessionId = bounded(input.sessionId);
78
+ const workId = bounded(input.workId);
79
+ const operationId = bounded(input.operationId);
80
+
81
+ const record = mutateControlPlaneRecord<OutputHandleIndexEntry>(controllerHome, {
82
+ namespace: OUTPUT_HANDLE_INDEX_NAMESPACE,
83
+ scope: OUTPUT_HANDLE_INDEX_SCOPE,
84
+ key: handleId,
85
+ schemaVersion: OUTPUT_HANDLE_INDEX_SCHEMA_VERSION,
86
+ action: 'output_handle_index_record',
87
+ mutate: (currentRecord) => {
88
+ const current = currentRecord?.value;
89
+ if (current) {
90
+ if (current.schemaVersion !== OUTPUT_HANDLE_INDEX_SCHEMA_VERSION
91
+ || current.handleId !== handleId
92
+ || current.kind !== input.kind
93
+ || current.fingerprint !== fingerprint
94
+ || bindingsConflict(current, { principalId, sessionId, workId, operationId })) {
95
+ throw new Error(`OUTPUT_HANDLE_ID_COLLISION: ${handleId}`);
96
+ }
97
+ // Identical historical duplicates collapse to one locator. Canonical
98
+ // instance storage always outranks a legacy repository location.
99
+ const nextStorage = current.storage.scope === 'instance' || storage.scope !== 'instance'
100
+ ? current.storage
101
+ : storage;
102
+ return {
103
+ ...current,
104
+ storage: nextStorage,
105
+ ...(current.repositoryId || repositoryId ? { repositoryId: current.repositoryId ?? repositoryId } : {}),
106
+ ...(current.principalId || principalId ? { principalId: current.principalId ?? principalId } : {}),
107
+ ...(current.sessionId || sessionId ? { sessionId: current.sessionId ?? sessionId } : {}),
108
+ ...(current.workId || workId ? { workId: current.workId ?? workId } : {}),
109
+ ...(current.operationId || operationId ? { operationId: current.operationId ?? operationId } : {}),
110
+ updatedAt: now,
111
+ };
112
+ }
113
+ return {
114
+ schemaVersion: OUTPUT_HANDLE_INDEX_SCHEMA_VERSION,
115
+ handleId,
116
+ kind: input.kind,
117
+ storage,
118
+ ...(repositoryId ? { repositoryId } : {}),
119
+ ...(principalId ? { principalId } : {}),
120
+ ...(sessionId ? { sessionId } : {}),
121
+ ...(workId ? { workId } : {}),
122
+ ...(operationId ? { operationId } : {}),
123
+ fingerprint,
124
+ recordedAt: now,
125
+ updatedAt: now,
126
+ };
127
+ },
128
+ });
129
+ return record.value;
130
+ }
131
+
132
+ export function refreshOutputHandleFingerprint(
133
+ controllerHome: string,
134
+ input: {
135
+ handleId: string;
136
+ kind: OutputHandleKind;
137
+ expectedFingerprint: string;
138
+ nextFingerprint: string;
139
+ now?: string;
140
+ },
141
+ ): OutputHandleIndexEntry {
142
+ const handleId = bounded(input.handleId);
143
+ const expectedFingerprint = bounded(input.expectedFingerprint);
144
+ const nextFingerprint = bounded(input.nextFingerprint);
145
+ if (!handleId || !expectedFingerprint || !nextFingerprint) throw new Error('OUTPUT_HANDLE_FINGERPRINT_REFRESH_REQUIRED');
146
+ const now = input.now ?? new Date().toISOString();
147
+ const record = mutateControlPlaneRecord<OutputHandleIndexEntry>(controllerHome, {
148
+ namespace: OUTPUT_HANDLE_INDEX_NAMESPACE,
149
+ scope: OUTPUT_HANDLE_INDEX_SCOPE,
150
+ key: handleId,
151
+ schemaVersion: OUTPUT_HANDLE_INDEX_SCHEMA_VERSION,
152
+ action: 'output_handle_index_fingerprint_refresh',
153
+ mutate: (currentRecord) => {
154
+ const current = currentRecord?.value;
155
+ if (!current
156
+ || current.schemaVersion !== OUTPUT_HANDLE_INDEX_SCHEMA_VERSION
157
+ || current.handleId !== handleId
158
+ || current.kind !== input.kind
159
+ || current.storage.scope !== 'instance') {
160
+ throw new Error(`OUTPUT_HANDLE_FINGERPRINT_REFRESH_SCOPE_MISMATCH: ${handleId}`);
161
+ }
162
+ if (current.fingerprint !== expectedFingerprint) {
163
+ throw new Error(`OUTPUT_HANDLE_FINGERPRINT_REFRESH_CONFLICT: ${handleId}`);
164
+ }
165
+ return { ...current, fingerprint: nextFingerprint, updatedAt: now };
166
+ },
167
+ });
168
+ return record.value;
169
+ }
170
+
171
+ export function deleteOutputHandleIndexEntry(
172
+ controllerHome: string,
173
+ input: { handleId: string; kind: OutputHandleKind; expectedFingerprint?: string },
174
+ ): boolean {
175
+ const handleId = bounded(input.handleId);
176
+ if (!handleId) return false;
177
+ const record = readControlPlaneRecord<OutputHandleIndexEntry>(
178
+ controllerHome,
179
+ OUTPUT_HANDLE_INDEX_NAMESPACE,
180
+ OUTPUT_HANDLE_INDEX_SCOPE,
181
+ handleId,
182
+ );
183
+ if (!record) return false;
184
+ const current = record.value;
185
+ if (current.schemaVersion !== OUTPUT_HANDLE_INDEX_SCHEMA_VERSION
186
+ || current.handleId !== handleId
187
+ || current.kind !== input.kind
188
+ || current.storage.scope !== 'instance') {
189
+ throw new Error(`OUTPUT_HANDLE_INDEX_DELETE_SCOPE_MISMATCH: ${handleId}`);
190
+ }
191
+ const expectedFingerprint = bounded(input.expectedFingerprint);
192
+ if (expectedFingerprint && current.fingerprint !== expectedFingerprint) {
193
+ throw new Error(`OUTPUT_HANDLE_INDEX_DELETE_CONFLICT: ${handleId}`);
194
+ }
195
+ return deleteControlPlaneRecord(controllerHome, {
196
+ namespace: OUTPUT_HANDLE_INDEX_NAMESPACE,
197
+ scope: OUTPUT_HANDLE_INDEX_SCOPE,
198
+ key: handleId,
199
+ action: 'output_handle_index_delete',
200
+ expectedRevision: record.revision,
201
+ });
202
+ }
203
+
204
+ export function readOutputHandleIndexEntry(
205
+ controllerHome: string,
206
+ handleId: string,
207
+ ): OutputHandleIndexEntry | undefined {
208
+ const key = bounded(handleId);
209
+ if (!key) return undefined;
210
+ const record = readControlPlaneRecord<OutputHandleIndexEntry>(
211
+ controllerHome,
212
+ OUTPUT_HANDLE_INDEX_NAMESPACE,
213
+ OUTPUT_HANDLE_INDEX_SCOPE,
214
+ key,
215
+ );
216
+ const value = record?.value;
217
+ if (!value) return undefined;
218
+ if (value.schemaVersion !== OUTPUT_HANDLE_INDEX_SCHEMA_VERSION || value.handleId !== key) {
219
+ throw new Error(`OUTPUT_HANDLE_INDEX_CORRUPT: ${key}`);
220
+ }
221
+ if (!value.fingerprint || !value.kind || !value.storage) {
222
+ throw new Error(`OUTPUT_HANDLE_INDEX_CORRUPT: ${key}`);
223
+ }
224
+ return value;
225
+ }
@@ -1,15 +1,17 @@
1
- import { randomUUID } from 'crypto';
1
+ import { createHash, randomUUID } from 'crypto';
2
2
  import { chmodSync, existsSync, mkdirSync, readdirSync, statSync } from 'fs';
3
3
  import { join } from 'path';
4
- import { repositoryControllerRoot } from '../../cli/repositories/controller-home';
4
+ import { controllerSystemRoot, repositoryControllerRoot } from '../../cli/repositories/controller-home';
5
5
  import { readJsonFile, sanitizeFileComponent, writeJsonAtomic } from '../shared/json-files';
6
+ import { recordOutputHandleIndexEntry, readOutputHandleIndexEntry, refreshOutputHandleFingerprint, type OutputHandleStorage } from './output-handle-index';
6
7
  import { redactSensitiveValue, type SensitiveRedactionCount } from './sensitive-output';
7
8
 
8
9
  export interface ControllerResultRecord {
9
10
  schemaVersion: 1;
10
11
  resultId: string;
11
12
  resultRef: string;
12
- repoId: string;
13
+ /** Repository provenance only. It is not part of the canonical result locator. */
14
+ repoId?: string;
13
15
  sessionId: string;
14
16
  principalId: string;
15
17
  workId?: string;
@@ -24,19 +26,29 @@ export interface ControllerResultRecord {
24
26
  };
25
27
  }
26
28
 
27
- function resultRoot(controllerHome: string, repoId: string): string {
28
- const root = join(repositoryControllerRoot(controllerHome, repoId), 'results');
29
+ function canonicalResultRoot(controllerHome: string): string {
30
+ const root = join(controllerSystemRoot(controllerHome), 'outputs', 'results');
29
31
  mkdirSync(join(root, 'records'), { recursive: true, mode: 0o700 });
30
32
  mkdirSync(join(root, 'data'), { recursive: true, mode: 0o700 });
31
33
  return root;
32
34
  }
33
35
 
34
- function recordPath(controllerHome: string, repoId: string, resultId: string): string {
35
- return join(resultRoot(controllerHome, repoId), 'records', `${sanitizeFileComponent(resultId)}.json`);
36
+ function legacyResultRoot(controllerHome: string, repoId: string): string {
37
+ return join(repositoryControllerRoot(controllerHome, repoId), 'results');
36
38
  }
37
39
 
38
- function dataPath(controllerHome: string, repoId: string, resultId: string): string {
39
- return join(resultRoot(controllerHome, repoId), 'data', `${sanitizeFileComponent(resultId)}.json`);
40
+ function resultRoot(controllerHome: string, storage: OutputHandleStorage): string {
41
+ return storage.scope === 'instance'
42
+ ? canonicalResultRoot(controllerHome)
43
+ : legacyResultRoot(controllerHome, storage.repositoryId);
44
+ }
45
+
46
+ function recordPath(controllerHome: string, storage: OutputHandleStorage, resultId: string): string {
47
+ return join(resultRoot(controllerHome, storage), 'records', `${sanitizeFileComponent(resultId)}.json`);
48
+ }
49
+
50
+ function dataPath(controllerHome: string, storage: OutputHandleStorage, resultId: string): string {
51
+ return join(resultRoot(controllerHome, storage), 'data', `${sanitizeFileComponent(resultId)}.json`);
40
52
  }
41
53
 
42
54
  function writePrivateJson(path: string, value: unknown): void {
@@ -53,33 +65,131 @@ function redactionMetadata(redactions: SensitiveRedactionCount[]): NonNullable<C
53
65
  };
54
66
  }
55
67
 
56
- function sanitizeStoredResult(
68
+ function canonicalResultRef(resultId: string): string {
69
+ return `result://${resultId}`;
70
+ }
71
+
72
+ function resultFingerprint(record: ControllerResultRecord, value: unknown): string {
73
+ return createHash('sha256').update(JSON.stringify({
74
+ resultId: record.resultId,
75
+ sessionId: record.sessionId,
76
+ principalId: record.principalId,
77
+ workId: record.workId ?? null,
78
+ kind: record.kind,
79
+ createdAt: record.createdAt,
80
+ value,
81
+ })).digest('hex');
82
+ }
83
+
84
+ function registerResult(
57
85
  controllerHome: string,
58
86
  record: ControllerResultRecord,
87
+ value: unknown,
88
+ storage: OutputHandleStorage,
89
+ ): void {
90
+ recordOutputHandleIndexEntry(controllerHome, {
91
+ handleId: record.resultId,
92
+ kind: 'result',
93
+ storage,
94
+ repositoryId: record.repoId,
95
+ principalId: record.principalId,
96
+ sessionId: record.sessionId,
97
+ workId: record.workId,
98
+ fingerprint: resultFingerprint(record, value),
99
+ });
100
+ }
101
+
102
+ function parseRef(resultRef: string): { resultId: string; legacyRepoId?: string } {
103
+ const normalized = resultRef.trim();
104
+ const canonical = /^result:\/\/([^/]+)$/.exec(normalized);
105
+ if (canonical) return { resultId: canonical[1]! };
106
+ const legacy = /^result:\/\/([^/]+)\/([^/]+)$/.exec(normalized);
107
+ if (legacy) return { legacyRepoId: legacy[1]!, resultId: legacy[2]! };
108
+ throw new Error('RESULT_REF_INVALID: expected result://<resultId>');
109
+ }
110
+
111
+ function loadResultAt(
112
+ controllerHome: string,
113
+ resultId: string,
114
+ storage: OutputHandleStorage,
115
+ ): { record: ControllerResultRecord; value: unknown } {
116
+ const stored = readJsonFile<ControllerResultRecord>(recordPath(controllerHome, storage, resultId));
117
+ if (stored.resultId !== resultId) throw new Error('RESULT_IDENTITY_MISMATCH');
118
+ const value = readJsonFile<unknown>(dataPath(controllerHome, storage, resultId));
119
+ const record: ControllerResultRecord = {
120
+ ...stored,
121
+ resultRef: canonicalResultRef(resultId),
122
+ ...(storage.scope === 'legacy_repository' && !stored.repoId ? { repoId: storage.repositoryId } : {}),
123
+ };
124
+ return { record, value };
125
+ }
126
+
127
+ function resolveStoredResult(
128
+ controllerHome: string,
129
+ resultId: string,
130
+ legacyRepoId?: string,
131
+ ): { record: ControllerResultRecord; value: unknown; storage: OutputHandleStorage } {
132
+ if (legacyRepoId) {
133
+ const storage: OutputHandleStorage = { scope: 'legacy_repository', repositoryId: legacyRepoId };
134
+ const loaded = loadResultAt(controllerHome, resultId, storage);
135
+ registerResult(controllerHome, loaded.record, loaded.value, storage);
136
+ return { ...loaded, storage };
137
+ }
138
+
139
+ const indexed = readOutputHandleIndexEntry(controllerHome, resultId);
140
+ if (indexed) {
141
+ if (indexed.kind !== 'result') throw new Error(`OUTPUT_HANDLE_KIND_MISMATCH: ${resultId}`);
142
+ const loaded = loadResultAt(controllerHome, resultId, indexed.storage);
143
+ if (resultFingerprint(loaded.record, loaded.value) !== indexed.fingerprint) {
144
+ throw new Error(`OUTPUT_HANDLE_FINGERPRINT_MISMATCH: ${resultId}`);
145
+ }
146
+ return { ...loaded, storage: indexed.storage };
147
+ }
148
+
149
+ const storage: OutputHandleStorage = { scope: 'instance' };
150
+ const canonicalRecord = recordPath(controllerHome, storage, resultId);
151
+ if (!existsSync(canonicalRecord)) {
152
+ throw new Error(`RESULT_LOCATOR_NOT_FOUND: ${resultId}; legacy results require their historical result://<repoId>/<resultId> reference once`);
153
+ }
154
+ const loaded = loadResultAt(controllerHome, resultId, storage);
155
+ registerResult(controllerHome, loaded.record, loaded.value, storage);
156
+ return { ...loaded, storage };
157
+ }
158
+
159
+ function sanitizeResolvedResult(
160
+ controllerHome: string,
161
+ record: ControllerResultRecord,
162
+ value: unknown,
163
+ storage: OutputHandleStorage,
59
164
  ): { record: ControllerResultRecord; value: unknown; changed: boolean } {
60
- const path = dataPath(controllerHome, record.repoId, record.resultId);
61
- const raw = readJsonFile<unknown>(path);
62
- const sanitized = redactSensitiveValue(raw);
63
- if (!sanitized.changed) return { record, value: raw, changed: false };
64
- writePrivateJson(path, sanitized.value);
165
+ const sanitized = redactSensitiveValue(value);
166
+ if (!sanitized.changed) return { record, value, changed: false };
65
167
  const next: ControllerResultRecord = {
66
168
  ...record,
67
- byteLength: statSync(path).size,
68
169
  redaction: redactionMetadata(sanitized.redactions),
69
170
  };
70
- writePrivateJson(recordPath(controllerHome, record.repoId, record.resultId), next);
171
+ if (storage.scope === 'instance') {
172
+ const previousFingerprint = resultFingerprint(record, value);
173
+ const nextFingerprint = resultFingerprint(next, sanitized.value);
174
+ const path = dataPath(controllerHome, storage, record.resultId);
175
+ writePrivateJson(path, sanitized.value);
176
+ next.byteLength = statSync(path).size;
177
+ writePrivateJson(recordPath(controllerHome, storage, record.resultId), next);
178
+ refreshOutputHandleFingerprint(controllerHome, {
179
+ handleId: record.resultId,
180
+ kind: 'result',
181
+ expectedFingerprint: previousFingerprint,
182
+ nextFingerprint,
183
+ });
184
+ }
185
+ // Historical repository partitions are immutable after the cutover. Apply
186
+ // current redaction in-memory without rewriting legacy bytes.
71
187
  return { record: next, value: sanitized.value, changed: true };
72
188
  }
73
189
 
74
- function parseRef(resultRef: string): { repoId: string; resultId: string } {
75
- const match = /^result:\/\/([^/]+)\/([^/]+)$/.exec(resultRef.trim());
76
- if (!match) throw new Error('RESULT_REF_INVALID: expected result://<repoId>/<resultId>');
77
- return { repoId: match[1]!, resultId: match[2]! };
78
- }
79
-
80
190
  export function writeControllerResult(input: {
81
191
  controllerHome: string;
82
- repoId: string;
192
+ repoId?: string;
83
193
  sessionId: string;
84
194
  principalId: string;
85
195
  workId?: string;
@@ -87,15 +197,16 @@ export function writeControllerResult(input: {
87
197
  value: unknown;
88
198
  }): ControllerResultRecord {
89
199
  const resultId = `res_${randomUUID().replace(/-/g, '')}`;
90
- const resultRef = `result://${input.repoId}/${resultId}`;
91
- const path = dataPath(input.controllerHome, input.repoId, resultId);
200
+ const resultRef = canonicalResultRef(resultId);
201
+ const storage: OutputHandleStorage = { scope: 'instance' };
202
+ const path = dataPath(input.controllerHome, storage, resultId);
92
203
  const sanitized = redactSensitiveValue(input.value);
93
204
  writePrivateJson(path, sanitized.value);
94
205
  const record: ControllerResultRecord = {
95
206
  schemaVersion: 1,
96
207
  resultId,
97
208
  resultRef,
98
- repoId: input.repoId,
209
+ ...(input.repoId?.trim() ? { repoId: input.repoId.trim() } : {}),
99
210
  sessionId: input.sessionId,
100
211
  principalId: input.principalId,
101
212
  ...(input.workId ? { workId: input.workId } : {}),
@@ -104,7 +215,8 @@ export function writeControllerResult(input: {
104
215
  createdAt: new Date().toISOString(),
105
216
  ...(sanitized.changed ? { redaction: redactionMetadata(sanitized.redactions) } : {}),
106
217
  };
107
- writePrivateJson(recordPath(input.controllerHome, input.repoId, resultId), record);
218
+ writePrivateJson(recordPath(input.controllerHome, storage, resultId), record);
219
+ registerResult(input.controllerHome, record, sanitized.value, storage);
108
220
  return record;
109
221
  }
110
222
 
@@ -123,10 +235,9 @@ export function readControllerResult(input: {
123
235
  limit?: number;
124
236
  }): { record: ControllerResultRecord; items: unknown; cursor: number; nextCursor?: number; truncated: boolean } {
125
237
  const parsed = parseRef(input.resultRef);
126
- const record = readJsonFile<ControllerResultRecord>(recordPath(input.controllerHome, parsed.repoId, parsed.resultId));
127
- if (record.resultRef !== input.resultRef || record.repoId !== parsed.repoId) throw new Error('RESULT_IDENTITY_MISMATCH');
128
- authorizeRecord(record, input.sessionId, input.principalId, input.workId);
129
- const sanitized = sanitizeStoredResult(input.controllerHome, record);
238
+ const resolved = resolveStoredResult(input.controllerHome, parsed.resultId, parsed.legacyRepoId);
239
+ authorizeRecord(resolved.record, input.sessionId, input.principalId, input.workId);
240
+ const sanitized = sanitizeResolvedResult(input.controllerHome, resolved.record, resolved.value, resolved.storage);
130
241
  const value = sanitized.value;
131
242
  const cursor = Math.max(0, Math.trunc(input.cursor ?? 0));
132
243
  const limit = Math.max(1, Math.min(500, Math.trunc(input.limit ?? 100)));
@@ -143,6 +254,11 @@ export function readControllerResult(input: {
143
254
  const items = source.slice(cursor, cursor + limit);
144
255
  return { record: sanitized.record, items, cursor, ...(cursor + items.length < source.length ? { nextCursor: cursor + items.length } : {}), truncated: cursor + items.length < source.length };
145
256
  }
257
+ if (value && typeof value === 'object') {
258
+ const source = JSON.stringify(value, null, 2);
259
+ const items = source.slice(cursor, cursor + limit * 4_096);
260
+ return { record: sanitized.record, items, cursor, ...(cursor + items.length < source.length ? { nextCursor: cursor + items.length } : {}), truncated: cursor + items.length < source.length };
261
+ }
146
262
  return { record: sanitized.record, items: value, cursor, truncated: false };
147
263
  }
148
264
 
@@ -156,10 +272,9 @@ export function searchControllerResult(input: {
156
272
  limit?: number;
157
273
  }): { record: ControllerResultRecord; matches: Array<{ line: number; text: string }>; truncated: boolean } {
158
274
  const parsed = parseRef(input.resultRef);
159
- const record = readJsonFile<ControllerResultRecord>(recordPath(input.controllerHome, parsed.repoId, parsed.resultId));
160
- if (record.resultRef !== input.resultRef || record.repoId !== parsed.repoId) throw new Error('RESULT_IDENTITY_MISMATCH');
161
- authorizeRecord(record, input.sessionId, input.principalId, input.workId);
162
- const sanitized = sanitizeStoredResult(input.controllerHome, record);
275
+ const resolved = resolveStoredResult(input.controllerHome, parsed.resultId, parsed.legacyRepoId);
276
+ authorizeRecord(resolved.record, input.sessionId, input.principalId, input.workId);
277
+ const sanitized = sanitizeResolvedResult(input.controllerHome, resolved.record, resolved.value, resolved.storage);
163
278
  const value = sanitized.value;
164
279
  const query = input.query.trim().toLowerCase();
165
280
  if (!query) throw new Error('RESULT_QUERY_REQUIRED');
@@ -169,17 +284,15 @@ export function searchControllerResult(input: {
169
284
  return { record: sanitized.record, matches, truncated: lines.filter((text) => text.toLowerCase().includes(query)).length > matches.length };
170
285
  }
171
286
 
172
- /**
173
- * Bounded maintenance entry point for historical result artifacts. It returns
174
- * only counts and ids; sensitive contents are never included in the report.
175
- */
176
- export function sanitizeControllerResultStore(controllerHome: string, repoId: string, limit = 10_000): {
287
+ /** Bounded maintenance of the canonical instance Result store only. */
288
+ export function sanitizeControllerResultStore(controllerHome: string, _repoId: string, limit = 10_000): {
177
289
  scanned: number;
178
290
  changed: number;
179
291
  failed: number;
180
292
  resultIds: string[];
181
293
  } {
182
- const root = resultRoot(controllerHome, repoId);
294
+ const storage: OutputHandleStorage = { scope: 'instance' };
295
+ const root = canonicalResultRoot(controllerHome);
183
296
  const recordsDir = join(root, 'records');
184
297
  let scanned = 0;
185
298
  let changed = 0;
@@ -192,11 +305,12 @@ export function sanitizeControllerResultStore(controllerHome: string, repoId: st
192
305
  scanned += 1;
193
306
  try {
194
307
  const record = readJsonFile<ControllerResultRecord>(join(recordsDir, entry));
195
- if (!record?.resultId || record.repoId !== repoId || !existsSync(dataPath(controllerHome, repoId, record.resultId))) {
308
+ if (!record?.resultId || !existsSync(dataPath(controllerHome, storage, record.resultId))) {
196
309
  failed += 1;
197
310
  continue;
198
311
  }
199
- const sanitized = sanitizeStoredResult(controllerHome, record);
312
+ const raw = readJsonFile<unknown>(dataPath(controllerHome, storage, record.resultId));
313
+ const sanitized = sanitizeResolvedResult(controllerHome, record, raw, storage);
200
314
  if (sanitized.changed) {
201
315
  changed += 1;
202
316
  resultIds.push(record.resultId);
@@ -59,8 +59,8 @@ const SENSITIVE_PATTERNS: readonly SensitivePattern[] = [
59
59
  },
60
60
  {
61
61
  type: 'secret_assignment',
62
- pattern: /((?:^|[^\w]))(["']?)([A-Za-z0-9_.-]*(?:api[_-]?key|access[_-]?key|access[_-]?token|refresh[_-]?token|client[_-]?secret|private[_-]?key|password|passwd|secret|credentials?|auth[_-]?token|token|cookie)[A-Za-z0-9_.-]*)\2(\s*(?:=>|:=|=|:)\s*)(?:"[^"\r\n]*"|'[^'\r\n]*'|[^\s,}\r\n]+)/gim,
63
- replacement: '$1$2$3$2$4[REDACTED]',
62
+ pattern: /((?:^|[^\w]))(["']?)([A-Za-z0-9_.-]*(?:api[_-]?key|access[_-]?key|access[_-]?token|refresh[_-]?token|client[_-]?secret|private[_-]?key|password|passwd|secret|credentials?|auth[_-]?token|token|cookie)[A-Za-z0-9_.-]*)\2(\s*(?:=>|:=|=|:)\s*)((?:[A-Z][A-Za-z0-9_]*(?:[?!])?\s*=\s*)?)(?:"[^"\r\n]*"|'[^'\r\n]*'|[^\s,}\r\n]+)/gim,
63
+ replacement: '$1$2$3$2$4$5[REDACTED]',
64
64
  },
65
65
  {
66
66
  type: 'database_url_assignment',
@@ -136,6 +136,26 @@ export function redactSensitiveText(input: string): SensitiveTextRedactionResult
136
136
  let text = input;
137
137
  const counts = new Map<string, number>();
138
138
  for (const entry of SENSITIVE_PATTERNS) {
139
+ if (entry.type === 'secret_assignment') {
140
+ let redactions = 0;
141
+ text = text.replace(entry.pattern, (matched, boundary: string, quote: string, key: string, separator: string, typeDefault: string) => {
142
+ // Preserve non-credential data flow even when a source symbol ends in "Token".
143
+ // An unquoted floating-point counter or a reference to the local token
144
+ // variable is not a secret literal. Keep unknown opaque/quoted token values
145
+ // redacted, including compound token keys, rather than whitelisting names.
146
+ const prefix = `${boundary}${quote}${key}${quote}${separator}${typeDefault}`;
147
+ const rhs = matched.slice(prefix.length);
148
+ const genericToken = /token$/i.test(key) && !/^(?:token|(?:api|access|refresh|auth|session|bearer|csrf|id|jwt|oauth)[_-]?token)$/i.test(key);
149
+ const sourceCounter = /^[+-]?(?:\d+\.\d*|\.\d+)(?:e[+-]?\d+)?[;)]?$/i.test(rhs);
150
+ const sourceReference = /^token[;)]?$/.test(rhs);
151
+ const sourceType = separator.trim() === ':' && !typeDefault && /^(?:Double|Float|Int|Int8|Int16|Int32|Int64|Bool|String|Character|CGFloat|Date|UUID)[?!]?[),{;]?$/.test(rhs);
152
+ if (genericToken && (sourceCounter || sourceReference || sourceType)) return matched;
153
+ redactions += 1;
154
+ return `${prefix}[REDACTED]`;
155
+ });
156
+ if (redactions) counts.set(entry.type, (counts.get(entry.type) ?? 0) + redactions);
157
+ continue;
158
+ }
139
159
  const matches = text.match(entry.pattern);
140
160
  if (!matches?.length) continue;
141
161
  counts.set(entry.type, (counts.get(entry.type) ?? 0) + matches.length);
@@ -38,6 +38,17 @@ export function isAgentDelegationLocalAction(action: string | undefined): boolea
38
38
  return AGENT_DELEGATION_LOCAL_ACTIONS.has(action);
39
39
  }
40
40
 
41
+ /** Shared delegation classification for Scheduler replay and durable receipt recovery. */
42
+ export function isAgentDelegationJob(job: ExecutionJob): boolean {
43
+ return isAgentDelegationOperation(job.payload.operation)
44
+ || job.type === 'agent-run'
45
+ || job.type === 'dispatch-task'
46
+ || job.payload.arguments?.agentDelegation === true
47
+ || (job.payload.operation === 'legacy-local-job'
48
+ && typeof job.payload.arguments?.localAction === 'string'
49
+ && isAgentDelegationLocalAction(job.payload.arguments.localAction));
50
+ }
51
+
41
52
  function stringField(value: unknown): string | undefined {
42
53
  if (typeof value !== 'string') return undefined;
43
54
  const trimmed = value.trim();
@@ -4,7 +4,7 @@ import {
4
4
  childReferenceFromJob,
5
5
  childReferenceFromReceipt,
6
6
  hasDurableChildReference,
7
- isAgentDelegationOperation,
7
+ isAgentDelegationJob,
8
8
  mergeChildReferences,
9
9
  } from './child-reference';
10
10
  import { operationReceiptMatchesJobOwnership, readOperationReceipt } from './receipt-store';
@@ -18,16 +18,6 @@ export type RecoveredReceiptOutcome = {
18
18
  outcome: 'succeeded' | 'failed' | 'delegated';
19
19
  };
20
20
 
21
- function isAgentDelegationJob(job: ExecutionJob): boolean {
22
- return isAgentDelegationOperation(job.payload.operation)
23
- || job.type === 'agent-run'
24
- || job.type === 'dispatch-task'
25
- || job.payload.arguments?.agentDelegation === true
26
- || (job.payload.operation === 'legacy-local-job'
27
- && typeof job.payload.arguments?.localAction === 'string'
28
- && ['launch-task', 'quick-agent-session'].includes(String(job.payload.arguments.localAction)));
29
- }
30
-
31
21
  /**
32
22
  * Recover a running Job from a matching completed/delegated Worker receipt.
33
23
  *
@@ -10,7 +10,7 @@ import { touchSchedulerWakeSignal } from '../../control-plane/global-scheduler/w
10
10
  import { readJsonFile, removeFile, sanitizeFileComponent, writeJsonAtomic } from '../../shared/json-files';
11
11
  import { terminateProcessTree } from '../../shared/process-tree';
12
12
  import { releaseExecutionLeases } from '../../resources/leases/store';
13
- import { assertRuntimeMayWriteOrThrow } from '../../root/write-fence';
13
+ import { assertRuntimeMayWriteOrThrow, isRuntimeWriteFenceError } from '../../root/write-fence';
14
14
  import {
15
15
  ACTIVE_JOB_STATUSES,
16
16
  TERMINAL_JOB_STATUSES,
@@ -122,11 +122,10 @@ function artifactPointerFor(job: ExecutionJob, artifact: ReturnType<typeof write
122
122
  artifactKind: artifact.kind,
123
123
  detailPointer: {
124
124
  tool: 'get_artifact',
125
- repoId: job.repoId,
126
125
  artifactId: artifact.artifactId,
127
126
  maxBytes: 512 * 1024,
128
127
  },
129
- next: `Call get_artifact with repo_id=${job.repoId} and artifact_id=${artifact.artifactId}.`,
128
+ next: `Call get_artifact with artifact_id=${artifact.artifactId}.`,
130
129
  };
131
130
  }
132
131
 
@@ -439,7 +438,7 @@ export function transitionExecutionJob(
439
438
  try {
440
439
  assertRuntimeMayWriteOrThrow('write_workflow_terminal', controllerHome);
441
440
  } catch (error) {
442
- if (error instanceof Error && error.message.startsWith('WRITER_FENCED:')) throw error;
441
+ if (isRuntimeWriteFenceError(error)) throw error;
443
442
  }
444
443
  }
445
444
  return updateExecutionJob(controllerHome, repoId, jobId, (current) => {