@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,3 +1,4 @@
1
+ import { closeSync, existsSync, openSync, readSync, statSync } from 'fs';
1
2
  import { appendFile, mkdir, rename, rm, stat } from 'fs/promises';
2
3
  import { join, resolve } from 'path';
3
4
 
@@ -35,12 +36,28 @@ export interface McpTimingTrace {
35
36
  gatewayProxyConnectionState?: 'reused' | 'cold_connect' | 'coalesced_connect' | 'identity_reconnect';
36
37
  totalToolDurationMs: number;
37
38
  sessionId?: string;
39
+ /** Request-scoped ChatGPT conversation correlation from MCP host metadata; diagnostic only, never semantic authority. */
40
+ hostConversationSessionId?: string;
38
41
  repoId?: string;
39
42
  workId?: string;
40
43
  processId?: string;
41
44
  route?: string;
42
45
  }
43
46
 
47
+
48
+ export type McpTransportEventKind = 'interruption' | 'session_initialized';
49
+
50
+ export interface McpTransportEvent {
51
+ schemaVersion: 1;
52
+ at: string;
53
+ kind: McpTransportEventKind;
54
+ sessionId: string;
55
+ connectionId: string;
56
+ route: string;
57
+ principalId: string;
58
+ reason?: string;
59
+ }
60
+
44
61
  export interface McpIncident {
45
62
  traceId: string;
46
63
  requestId: string;
@@ -60,6 +77,8 @@ const MCP_DIAGNOSTIC_MAX_PENDING_ENTRIES = 4_096;
60
77
  const MCP_DIAGNOSTIC_MAX_BATCH_BYTES = 256 * 1024;
61
78
  const MCP_INCIDENT_MEMORY_WINDOW_LIMIT = 1_024;
62
79
  const MCP_INCIDENT_MEMORY_LEDGER_LIMIT = 64;
80
+ const MCP_TRANSPORT_EVENT_TAIL_BYTES = 256 * 1024;
81
+ const MCP_TRANSPORT_EVENT_READ_LIMIT = 64;
63
82
 
64
83
  interface PendingDiagnosticLedger {
65
84
  readonly root: string;
@@ -71,6 +90,7 @@ interface PendingDiagnosticLedger {
71
90
 
72
91
  const diagnosticLedgers = new Map<string, PendingDiagnosticLedger>();
73
92
  const recentIncidents = new Map<string, Array<McpIncident & { at: string }>>();
93
+ const recentTransportEvents = new Map<string, McpTransportEvent[]>();
74
94
 
75
95
  function ledgerFor(controllerHome: string, fileName: string): PendingDiagnosticLedger {
76
96
  const root = join(resolve(controllerHome), 'audit');
@@ -200,3 +220,97 @@ export function recordMcpIncident(controllerHome: string, incident: McpIncident)
200
220
  export function recentMcpIncidents(controllerHome: string): Array<McpIncident & { at: string }> {
201
221
  return [...(recentIncidents.get(resolve(controllerHome)) ?? [])];
202
222
  }
223
+
224
+
225
+ function readDiagnosticTail<T>(controllerHome: string, fileName: string, maxBytes: number): T[] {
226
+ const path = join(resolve(controllerHome), 'audit', fileName);
227
+ if (!existsSync(path)) return [];
228
+ let fd: number | undefined;
229
+ try {
230
+ const size = statSync(path).size;
231
+ const length = Math.min(size, maxBytes);
232
+ const start = Math.max(0, size - length);
233
+ const buffer = Buffer.alloc(length);
234
+ fd = openSync(path, 'r');
235
+ const read = readSync(fd, buffer, 0, length, start);
236
+ let text = buffer.subarray(0, read).toString('utf8');
237
+ if (start > 0) {
238
+ const newline = text.indexOf('\n');
239
+ text = newline >= 0 ? text.slice(newline + 1) : '';
240
+ }
241
+ return text.split(/\r?\n/).filter(Boolean).flatMap((line) => {
242
+ try {
243
+ const parsed = JSON.parse(line) as T;
244
+ return parsed && typeof parsed === 'object' ? [parsed] : [];
245
+ } catch {
246
+ return [];
247
+ }
248
+ });
249
+ } catch {
250
+ return [];
251
+ } finally {
252
+ if (fd !== undefined) closeSync(fd);
253
+ }
254
+ }
255
+
256
+ /**
257
+ * Durable transport evidence only. It is deliberately separate from MCP tool
258
+ * incidents so normal reconnects cannot trigger incident-repair Work. The
259
+ * bounded JSONL tail survives Gateway restart without owning any lifecycle.
260
+ */
261
+ export function recordMcpTransportEvent(
262
+ controllerHome: string,
263
+ event: Omit<McpTransportEvent, 'schemaVersion' | 'at'> & { at?: string },
264
+ ): void {
265
+ try {
266
+ const root = resolve(controllerHome);
267
+ const record: McpTransportEvent = {
268
+ schemaVersion: 1,
269
+ at: event.at ?? new Date().toISOString(),
270
+ kind: event.kind,
271
+ sessionId: event.sessionId,
272
+ connectionId: event.connectionId,
273
+ route: event.route,
274
+ principalId: event.principalId,
275
+ ...(event.reason ? { reason: event.reason } : {}),
276
+ };
277
+ const remembered = recentTransportEvents.get(root) ?? [];
278
+ remembered.push(record);
279
+ if (remembered.length > MCP_TRANSPORT_EVENT_READ_LIMIT) {
280
+ remembered.splice(0, remembered.length - MCP_TRANSPORT_EVENT_READ_LIMIT);
281
+ }
282
+ recentTransportEvents.set(root, remembered);
283
+ appendDiagnostic(controllerHome, 'mcp-transport-events.jsonl', { ...record });
284
+ } catch {
285
+ // Transport observability is diagnostic-only and must never affect protocol
286
+ // initialization, request routing, or session lifecycle.
287
+ }
288
+ }
289
+
290
+ export function readRecentMcpTransportEvents(
291
+ controllerHome: string,
292
+ limit = MCP_TRANSPORT_EVENT_READ_LIMIT,
293
+ ): McpTransportEvent[] {
294
+ const boundedLimit = Math.max(1, Math.min(limit, MCP_TRANSPORT_EVENT_READ_LIMIT));
295
+ const durable = readDiagnosticTail<McpTransportEvent>(
296
+ controllerHome,
297
+ 'mcp-transport-events.jsonl',
298
+ MCP_TRANSPORT_EVENT_TAIL_BYTES,
299
+ );
300
+ const memory = recentTransportEvents.get(resolve(controllerHome)) ?? [];
301
+ const unique = new Map<string, McpTransportEvent>();
302
+ for (const event of [...durable, ...memory]) {
303
+ if (event.schemaVersion !== 1
304
+ || (event.kind !== 'interruption' && event.kind !== 'session_initialized')
305
+ || typeof event.at !== 'string'
306
+ || !Number.isFinite(Date.parse(event.at))
307
+ || typeof event.sessionId !== 'string'
308
+ || typeof event.connectionId !== 'string'
309
+ || typeof event.route !== 'string'
310
+ || typeof event.principalId !== 'string') continue;
311
+ unique.set(`${event.at}\0${event.kind}\0${event.sessionId}`, event);
312
+ }
313
+ return [...unique.values()]
314
+ .sort((a, b) => Date.parse(b.at) - Date.parse(a.at))
315
+ .slice(0, boundedLimit);
316
+ }
@@ -1,15 +1,18 @@
1
- import { randomUUID } from 'crypto';
1
+ import { createHash, randomUUID } from 'crypto';
2
2
  import { closeSync, existsSync, mkdirSync, opendirSync, openSync, readSync, 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 type { ExecutionJob } from '../execution/jobs/types';
6
6
  import { readJsonFile, removeFile, sanitizeFileComponent, writeJsonAtomic } from '../shared/json-files';
7
+ import { deleteOutputHandleIndexEntry, recordOutputHandleIndexEntry, readOutputHandleIndexEntry, type OutputHandleStorage } from './output-handle-index';
7
8
 
8
9
  export interface ExecutionArtifactRecord {
9
10
  schemaVersion: 1;
10
11
  artifactId: string;
11
- repoId: string;
12
+ /** Repository provenance only. */
13
+ repoId?: string;
12
14
  jobId: string;
15
+ principalId?: string;
13
16
  kind: 'job-result' | 'job-error' | 'command-output' | 'evidence';
14
17
  mediaType: 'application/json' | 'text/plain';
15
18
  path: string;
@@ -17,18 +20,123 @@ export interface ExecutionArtifactRecord {
17
20
  createdAt: string;
18
21
  }
19
22
 
20
- function artifactRoot(controllerHome: string, repoId: string): string {
21
- const root = join(repositoryControllerRoot(controllerHome, repoId), 'artifacts');
22
- mkdirSync(root, { recursive: true });
23
+ function canonicalArtifactRoot(controllerHome: string): string {
24
+ const root = join(controllerSystemRoot(controllerHome), 'outputs', 'artifacts');
25
+ mkdirSync(join(root, 'data'), { recursive: true });
26
+ mkdirSync(join(root, 'records'), { recursive: true });
23
27
  return root;
24
28
  }
25
29
 
26
- function artifactDataPath(controllerHome: string, repoId: string, artifactId: string): string {
27
- return join(artifactRoot(controllerHome, repoId), 'data', `${sanitizeFileComponent(artifactId)}.json`);
30
+ function legacyArtifactRoot(controllerHome: string, repoId: string): string {
31
+ return join(repositoryControllerRoot(controllerHome, repoId), 'artifacts');
28
32
  }
29
33
 
30
- function metadataPath(controllerHome: string, repoId: string, artifactId: string): string {
31
- return join(artifactRoot(controllerHome, repoId), 'records', `${sanitizeFileComponent(artifactId)}.json`);
34
+ function artifactRoot(controllerHome: string, storage: OutputHandleStorage): string {
35
+ return storage.scope === 'instance'
36
+ ? canonicalArtifactRoot(controllerHome)
37
+ : legacyArtifactRoot(controllerHome, storage.repositoryId);
38
+ }
39
+
40
+ function artifactDataPath(controllerHome: string, storage: OutputHandleStorage, artifactId: string): string {
41
+ return join(artifactRoot(controllerHome, storage), 'data', `${sanitizeFileComponent(artifactId)}.json`);
42
+ }
43
+
44
+ function metadataPath(controllerHome: string, storage: OutputHandleStorage, artifactId: string): string {
45
+ return join(artifactRoot(controllerHome, storage), 'records', `${sanitizeFileComponent(artifactId)}.json`);
46
+ }
47
+
48
+ function artifactFingerprint(record: ExecutionArtifactRecord, value: unknown): string {
49
+ return createHash('sha256').update(JSON.stringify({
50
+ artifactId: record.artifactId,
51
+ jobId: record.jobId,
52
+ principalId: record.principalId ?? null,
53
+ kind: record.kind,
54
+ mediaType: record.mediaType,
55
+ createdAt: record.createdAt,
56
+ value,
57
+ })).digest('hex');
58
+ }
59
+
60
+ function registerArtifact(
61
+ controllerHome: string,
62
+ record: ExecutionArtifactRecord,
63
+ value: unknown,
64
+ storage: OutputHandleStorage,
65
+ ): void {
66
+ recordOutputHandleIndexEntry(controllerHome, {
67
+ handleId: record.artifactId,
68
+ kind: 'artifact',
69
+ storage,
70
+ repositoryId: record.repoId,
71
+ principalId: record.principalId,
72
+ operationId: record.jobId,
73
+ fingerprint: artifactFingerprint(record, value),
74
+ });
75
+ }
76
+
77
+ function loadArtifactAt(
78
+ controllerHome: string,
79
+ artifactId: string,
80
+ storage: OutputHandleStorage,
81
+ ): { artifact: ExecutionArtifactRecord; content: unknown; dataPath: string } {
82
+ const stored = readJsonFile<ExecutionArtifactRecord>(metadataPath(controllerHome, storage, artifactId));
83
+ if (stored.artifactId !== artifactId) throw new Error('ARTIFACT_IDENTITY_MISMATCH');
84
+ if (storage.scope === 'legacy_repository' && stored.repoId && stored.repoId !== storage.repositoryId) {
85
+ throw new Error('ARTIFACT_REPOSITORY_PROVENANCE_MISMATCH');
86
+ }
87
+ const path = artifactDataPath(controllerHome, storage, artifactId);
88
+ const content = readJsonFile<unknown>(path);
89
+ return {
90
+ artifact: {
91
+ ...stored,
92
+ ...(storage.scope === 'legacy_repository' && !stored.repoId ? { repoId: storage.repositoryId } : {}),
93
+ path,
94
+ },
95
+ content,
96
+ dataPath: path,
97
+ };
98
+ }
99
+
100
+ function resolveArtifact(
101
+ controllerHome: string,
102
+ artifactId: string,
103
+ legacyRepoId?: string,
104
+ ): { artifact: ExecutionArtifactRecord; content: unknown; dataPath: string; storage: OutputHandleStorage } {
105
+ if (legacyRepoId) {
106
+ const storage: OutputHandleStorage = { scope: 'legacy_repository', repositoryId: legacyRepoId };
107
+ const loaded = loadArtifactAt(controllerHome, artifactId, storage);
108
+ registerArtifact(controllerHome, loaded.artifact, loaded.content, storage);
109
+ return { ...loaded, storage };
110
+ }
111
+
112
+ const indexed = readOutputHandleIndexEntry(controllerHome, artifactId);
113
+ if (indexed) {
114
+ if (indexed.kind !== 'artifact') throw new Error(`OUTPUT_HANDLE_KIND_MISMATCH: ${artifactId}`);
115
+ const loaded = loadArtifactAt(controllerHome, artifactId, indexed.storage);
116
+ if (artifactFingerprint(loaded.artifact, loaded.content) !== indexed.fingerprint) {
117
+ throw new Error(`OUTPUT_HANDLE_FINGERPRINT_MISMATCH: ${artifactId}`);
118
+ }
119
+ return { ...loaded, storage: indexed.storage };
120
+ }
121
+
122
+ const storage: OutputHandleStorage = { scope: 'instance' };
123
+ if (!existsSync(metadataPath(controllerHome, storage, artifactId))) {
124
+ throw new Error(`ARTIFACT_LOCATOR_NOT_FOUND: ${artifactId}; supply repo_id only once when adopting a historical repository artifact`);
125
+ }
126
+ const loaded = loadArtifactAt(controllerHome, artifactId, storage);
127
+ registerArtifact(controllerHome, loaded.artifact, loaded.content, storage);
128
+ return { ...loaded, storage };
129
+ }
130
+
131
+ function assertArtifactAccess(record: ExecutionArtifactRecord, principalId?: string): void {
132
+ // Omitting principalId is reserved for trusted in-process integrity readers.
133
+ // External adapters must always provide an explicit principal (or anonymous).
134
+ if (principalId === undefined) return;
135
+ const owner = record.principalId?.trim();
136
+ const caller = principalId.trim();
137
+ if (owner && caller !== owner) {
138
+ throw new Error('ARTIFACT_ACCESS_DENIED: artifact belongs to another principal');
139
+ }
32
140
  }
33
141
 
34
142
  export function writeExecutionArtifact(
@@ -38,20 +146,24 @@ export function writeExecutionArtifact(
38
146
  value: unknown,
39
147
  ): ExecutionArtifactRecord {
40
148
  const artifactId = `ART-${Date.now()}-${randomUUID().slice(0, 8)}`;
41
- const dataPath = artifactDataPath(controllerHome, job.repoId, artifactId);
149
+ const storage: OutputHandleStorage = { scope: 'instance' };
150
+ const dataPath = artifactDataPath(controllerHome, storage, artifactId);
42
151
  writeJsonAtomic(dataPath, value);
152
+ const principalId = job.origin.actor?.trim();
43
153
  const record: ExecutionArtifactRecord = {
44
154
  schemaVersion: 1,
45
155
  artifactId,
46
- repoId: job.repoId,
156
+ ...(job.repoId?.trim() ? { repoId: job.repoId.trim() } : {}),
47
157
  jobId: job.jobId,
158
+ ...(principalId ? { principalId } : {}),
48
159
  kind,
49
160
  mediaType: 'application/json',
50
161
  path: dataPath,
51
162
  byteLength: statSync(dataPath).size,
52
163
  createdAt: new Date().toISOString(),
53
164
  };
54
- writeJsonAtomic(metadataPath(controllerHome, job.repoId, artifactId), record);
165
+ writeJsonAtomic(metadataPath(controllerHome, storage, artifactId), record);
166
+ registerArtifact(controllerHome, record, value, storage);
55
167
  return record;
56
168
  }
57
169
 
@@ -65,9 +177,9 @@ export interface ExecutionArtifactJobCleanupReport {
65
177
  }
66
178
 
67
179
  /**
68
- * Reclaim only artifacts whose immutable metadata names the exact retired Job.
69
- * Stored path strings are never followed; metadata/data paths are re-derived
70
- * from the validated artifact id under this repository's Controller Home.
180
+ * Reclaim only canonical instance artifacts whose immutable metadata names the
181
+ * exact retired Job. Historical repository partitions are intentionally
182
+ * read-only after the output-handle cutover.
71
183
  */
72
184
  export function cleanupExecutionArtifactsForJob(
73
185
  controllerHome: string,
@@ -78,7 +190,8 @@ export function cleanupExecutionArtifactsForJob(
78
190
  const report: ExecutionArtifactJobCleanupReport = {
79
191
  policyVersion: 'execution-artifact-job-cleanup-v1', inspected: 0, matched: 0, removed: 0, scanTruncated: false, blockers: [],
80
192
  };
81
- const root = join(repositoryControllerRoot(controllerHome, repoId), 'artifacts');
193
+ const storage: OutputHandleStorage = { scope: 'instance' };
194
+ const root = canonicalArtifactRoot(controllerHome);
82
195
  const recordsRoot = join(root, 'records');
83
196
  if (!existsSync(recordsRoot)) return report;
84
197
  const maxScan = Math.max(1, Math.min(Math.trunc(options.maxScan ?? 5_000), 5_000));
@@ -96,7 +209,7 @@ export function cleanupExecutionArtifactsForJob(
96
209
  report.blockers.push(`invalid_metadata:${entry.name}`);
97
210
  continue;
98
211
  }
99
- if (record.schemaVersion !== 1 || record.repoId !== repoId || !record.artifactId || !record.jobId) {
212
+ if (record.schemaVersion !== 1 || !record.artifactId || !record.jobId) {
100
213
  report.blockers.push(`identity_mismatch:${entry.name}`);
101
214
  continue;
102
215
  }
@@ -105,9 +218,23 @@ export function cleanupExecutionArtifactsForJob(
105
218
  report.blockers.push(`artifact_key_mismatch:${entry.name}`);
106
219
  continue;
107
220
  }
108
- if (record.jobId !== jobId) continue;
221
+ if (record.jobId !== jobId || (record.repoId && record.repoId !== repoId)) continue;
109
222
  report.matched += 1;
110
- removeFile(join(root, 'data', expectedName));
223
+ const dataPath = artifactDataPath(controllerHome, storage, record.artifactId);
224
+ let value: unknown;
225
+ try {
226
+ value = readJsonFile<unknown>(dataPath);
227
+ } catch {
228
+ report.blockers.push(`artifact_data_missing:${record.artifactId}`);
229
+ continue;
230
+ }
231
+ const fingerprint = artifactFingerprint(record, value);
232
+ deleteOutputHandleIndexEntry(controllerHome, {
233
+ handleId: record.artifactId,
234
+ kind: 'artifact',
235
+ expectedFingerprint: fingerprint,
236
+ });
237
+ removeFile(dataPath);
111
238
  removeFile(recordPath);
112
239
  report.removed += 1;
113
240
  }
@@ -120,25 +247,23 @@ export function cleanupExecutionArtifactsForJob(
120
247
 
121
248
  export function readExecutionArtifact(
122
249
  controllerHome: string,
123
- repoId: string,
124
250
  artifactId: string,
125
251
  maxBytes = 512 * 1024,
252
+ options: { legacyRepoId?: string; principalId?: string } = {},
126
253
  ): { artifact: ExecutionArtifactRecord; content: unknown; truncated: boolean } {
127
- const artifact = readJsonFile<ExecutionArtifactRecord>(metadataPath(controllerHome, repoId, artifactId));
128
- if (artifact.repoId !== repoId || artifact.artifactId !== artifactId) throw new Error('ARTIFACT_IDENTITY_MISMATCH');
254
+ const resolved = resolveArtifact(controllerHome, artifactId, options.legacyRepoId);
255
+ assertArtifactAccess(resolved.artifact, options.principalId);
129
256
  const bounded = Math.max(1_024, Math.min(maxBytes, 2 * 1024 * 1024));
130
- // Derive the path from trusted identifiers. Never follow a path stored in mutable metadata.
131
- const dataPath = artifactDataPath(controllerHome, repoId, artifactId);
132
- const byteLength = statSync(dataPath).size;
257
+ const byteLength = statSync(resolved.dataPath).size;
133
258
  const length = Math.min(byteLength, bounded);
134
259
  const buffer = Buffer.alloc(length);
135
- const descriptor = openSync(dataPath, 'r');
260
+ const descriptor = openSync(resolved.dataPath, 'r');
136
261
  try { readSync(descriptor, buffer, 0, length, 0); } finally { closeSync(descriptor); }
137
262
  if (byteLength <= bounded) {
138
- return { artifact: { ...artifact, path: dataPath, byteLength }, content: JSON.parse(buffer.toString('utf8')), truncated: false };
263
+ return { artifact: { ...resolved.artifact, byteLength }, content: JSON.parse(buffer.toString('utf8')), truncated: false };
139
264
  }
140
265
  return {
141
- artifact: { ...artifact, path: dataPath, byteLength },
266
+ artifact: { ...resolved.artifact, byteLength },
142
267
  content: {
143
268
  preview: buffer.toString('utf8'),
144
269
  byteLength,
@@ -154,8 +279,6 @@ export function boundExecutionResult(
154
279
  result: Record<string, unknown>,
155
280
  kind: ExecutionArtifactRecord['kind'] = 'job-result',
156
281
  ): { result: Record<string, unknown>; artifact?: ExecutionArtifactRecord } {
157
- // Default success budget stays compact (~16KB). Callers still fetch full
158
- // content via get_artifact when externalized.
159
282
  const DEFAULT_INLINE_SUCCESS = 16 * 1024;
160
283
  const DEFAULT_INLINE_ERROR = 32 * 1024;
161
284
  const configured = typeof job.payload.maxOutputBytes === 'number' ? job.payload.maxOutputBytes : DEFAULT_INLINE_SUCCESS;
@@ -175,25 +298,21 @@ export function boundExecutionResult(
175
298
  referenceType: 'artifact',
176
299
  artifactId: artifact.artifactId,
177
300
  artifactKind: artifact.kind,
178
- // Keep a short human message, never the full JSON dump.
179
301
  message: typeof result.message === 'string'
180
302
  ? String(result.message).slice(0, 800)
181
303
  : (typeof result.error === 'string' ? String(result.error).slice(0, 800) : 'Job failed; full details externalized.'),
182
304
  detailPointer: {
183
305
  tool: 'get_artifact',
184
- repoId: job.repoId,
185
306
  artifactId: artifact.artifactId,
186
307
  maxBytes,
187
308
  },
188
- next: `Call get_artifact with repo_id=${job.repoId} and artifact_id=${artifact.artifactId} (ART-..., not EVD-...).`,
309
+ next: `Call get_artifact with artifact_id=${artifact.artifactId} (ART-..., not EVD-...).`,
189
310
  },
190
311
  };
191
312
  }
192
313
 
193
- if (bytes <= maxBytes) {
194
- // Prefer inlining compact stdout/stderr when present.
195
- return { result };
196
- }
314
+ if (bytes <= maxBytes) return { result };
315
+
197
316
  const artifact = writeExecutionArtifact(controllerHome, job, kind, result);
198
317
  return {
199
318
  artifact,
@@ -207,11 +326,10 @@ export function boundExecutionResult(
207
326
  preview: serialized.slice(0, Math.min(2 * 1024, serialized.length)),
208
327
  detailPointer: {
209
328
  tool: 'get_artifact',
210
- repoId: job.repoId,
211
329
  artifactId: artifact.artifactId,
212
330
  maxBytes,
213
331
  },
214
- next: `Call get_artifact with repo_id=${job.repoId} and artifact_id=${artifact.artifactId} (ART-..., not EVD-...).`,
332
+ next: `Call get_artifact with artifact_id=${artifact.artifactId} (ART-..., not EVD-...).`,
215
333
  },
216
334
  };
217
335
  }
@@ -1,16 +1,20 @@
1
1
  import { createHash, randomUUID } from 'crypto';
2
+ import { existsSync } from 'fs';
2
3
  import { spawnSync } from 'child_process';
3
4
  import { join } from 'path';
4
- import { repositoryControllerRoot } from '../../cli/repositories/controller-home';
5
+ import { controllerSystemRoot, repositoryControllerRoot } from '../../cli/repositories/controller-home';
5
6
  import { readJsonFile, sanitizeFileComponent, writeJsonAtomic } from '../shared/json-files';
6
7
  import type { ExecutionJob } from '../execution/jobs/types';
8
+ import { recordOutputHandleIndexEntry, readOutputHandleIndexEntry, type OutputHandleStorage } from './output-handle-index';
7
9
 
8
10
  export interface ExecutionEvidence {
9
11
  schemaVersion: 1;
10
12
  evidenceId: string;
11
- repoId: string;
13
+ /** Repository provenance only. */
14
+ repoId?: string;
12
15
  checkoutId?: string;
13
16
  jobId: string;
17
+ principalId?: string;
14
18
  revision: string;
15
19
  operation: string;
16
20
  environmentFingerprint: string;
@@ -33,13 +37,109 @@ function environmentFingerprint(): string {
33
37
  })).digest('hex').slice(0, 24);
34
38
  }
35
39
 
36
- function executionEvidencePath(controllerHome: string, repoId: string, evidenceId: string): string {
40
+ function canonicalEvidencePath(controllerHome: string, evidenceId: string): string {
41
+ return join(controllerSystemRoot(controllerHome), 'outputs', 'evidence', `${sanitizeFileComponent(evidenceId)}.json`);
42
+ }
43
+
44
+ function legacyEvidencePath(controllerHome: string, repoId: string, evidenceId: string): string {
37
45
  return join(repositoryControllerRoot(controllerHome, repoId), 'evidence', `${sanitizeFileComponent(evidenceId)}.json`);
38
46
  }
39
47
 
40
- export function readExecutionEvidence(controllerHome: string, repoId: string, evidenceId: string): ExecutionEvidence {
41
- const evidence = readJsonFile<ExecutionEvidence>(executionEvidencePath(controllerHome, repoId, evidenceId));
42
- if (evidence.repoId !== repoId || evidence.evidenceId !== evidenceId) throw new Error('EVIDENCE_IDENTITY_MISMATCH');
48
+ function evidencePath(controllerHome: string, storage: OutputHandleStorage, evidenceId: string): string {
49
+ return storage.scope === 'instance'
50
+ ? canonicalEvidencePath(controllerHome, evidenceId)
51
+ : legacyEvidencePath(controllerHome, storage.repositoryId, evidenceId);
52
+ }
53
+
54
+ function evidenceFingerprint(evidence: ExecutionEvidence): string {
55
+ return createHash('sha256').update(JSON.stringify({
56
+ evidenceId: evidence.evidenceId,
57
+ checkoutId: evidence.checkoutId ?? null,
58
+ jobId: evidence.jobId,
59
+ principalId: evidence.principalId ?? null,
60
+ revision: evidence.revision,
61
+ operation: evidence.operation,
62
+ environmentFingerprint: evidence.environmentFingerprint,
63
+ executedAt: evidence.executedAt,
64
+ outcome: evidence.outcome,
65
+ details: evidence.details ?? null,
66
+ })).digest('hex');
67
+ }
68
+
69
+ function registerEvidence(
70
+ controllerHome: string,
71
+ evidence: ExecutionEvidence,
72
+ storage: OutputHandleStorage,
73
+ ): void {
74
+ recordOutputHandleIndexEntry(controllerHome, {
75
+ handleId: evidence.evidenceId,
76
+ kind: 'evidence',
77
+ storage,
78
+ repositoryId: evidence.repoId,
79
+ principalId: evidence.principalId,
80
+ operationId: evidence.jobId,
81
+ fingerprint: evidenceFingerprint(evidence),
82
+ });
83
+ }
84
+
85
+ function loadEvidenceAt(
86
+ controllerHome: string,
87
+ evidenceId: string,
88
+ storage: OutputHandleStorage,
89
+ ): ExecutionEvidence {
90
+ const stored = readJsonFile<ExecutionEvidence>(evidencePath(controllerHome, storage, evidenceId));
91
+ if (stored.evidenceId !== evidenceId) throw new Error('EVIDENCE_IDENTITY_MISMATCH');
92
+ if (storage.scope === 'legacy_repository' && stored.repoId && stored.repoId !== storage.repositoryId) {
93
+ throw new Error('EVIDENCE_REPOSITORY_PROVENANCE_MISMATCH');
94
+ }
95
+ return {
96
+ ...stored,
97
+ ...(storage.scope === 'legacy_repository' && !stored.repoId ? { repoId: storage.repositoryId } : {}),
98
+ };
99
+ }
100
+
101
+ function assertEvidenceAccess(evidence: ExecutionEvidence, principalId?: string): void {
102
+ // Omitting principalId is reserved for trusted in-process integrity readers.
103
+ // External adapters must always provide an explicit principal (or anonymous).
104
+ if (principalId === undefined) return;
105
+ const owner = evidence.principalId?.trim();
106
+ const caller = principalId.trim();
107
+ if (owner && owner !== caller) {
108
+ throw new Error('EVIDENCE_ACCESS_DENIED: evidence belongs to another principal');
109
+ }
110
+ }
111
+
112
+ export function readExecutionEvidence(
113
+ controllerHome: string,
114
+ evidenceId: string,
115
+ options: { legacyRepoId?: string; principalId?: string } = {},
116
+ ): ExecutionEvidence {
117
+ if (options.legacyRepoId) {
118
+ const storage: OutputHandleStorage = { scope: 'legacy_repository', repositoryId: options.legacyRepoId };
119
+ const evidence = loadEvidenceAt(controllerHome, evidenceId, storage);
120
+ registerEvidence(controllerHome, evidence, storage);
121
+ assertEvidenceAccess(evidence, options.principalId);
122
+ return evidence;
123
+ }
124
+
125
+ const indexed = readOutputHandleIndexEntry(controllerHome, evidenceId);
126
+ if (indexed) {
127
+ if (indexed.kind !== 'evidence') throw new Error(`OUTPUT_HANDLE_KIND_MISMATCH: ${evidenceId}`);
128
+ const evidence = loadEvidenceAt(controllerHome, evidenceId, indexed.storage);
129
+ if (evidenceFingerprint(evidence) !== indexed.fingerprint) {
130
+ throw new Error(`OUTPUT_HANDLE_FINGERPRINT_MISMATCH: ${evidenceId}`);
131
+ }
132
+ assertEvidenceAccess(evidence, options.principalId);
133
+ return evidence;
134
+ }
135
+
136
+ const storage: OutputHandleStorage = { scope: 'instance' };
137
+ if (!existsSync(evidencePath(controllerHome, storage, evidenceId))) {
138
+ throw new Error(`EVIDENCE_LOCATOR_NOT_FOUND: ${evidenceId}; supply repo_id only once when adopting historical repository evidence`);
139
+ }
140
+ const evidence = loadEvidenceAt(controllerHome, evidenceId, storage);
141
+ registerEvidence(controllerHome, evidence, storage);
142
+ assertEvidenceAccess(evidence, options.principalId);
43
143
  return evidence;
44
144
  }
45
145
 
@@ -50,12 +150,14 @@ export function recordExecutionEvidence(
50
150
  outcome: 'succeeded' | 'failed',
51
151
  details?: Record<string, unknown>,
52
152
  ): ExecutionEvidence {
153
+ const principalId = job.origin.actor?.trim();
53
154
  const evidence: ExecutionEvidence = {
54
155
  schemaVersion: 1,
55
156
  evidenceId: `EVD-${Date.now()}-${randomUUID().slice(0, 8)}`,
56
- repoId: job.repoId,
157
+ ...(job.repoId?.trim() ? { repoId: job.repoId.trim() } : {}),
57
158
  checkoutId: job.checkoutId,
58
159
  jobId: job.jobId,
160
+ ...(principalId ? { principalId } : {}),
59
161
  revision: gitRevision(repoRoot),
60
162
  operation: job.payload.operation,
61
163
  environmentFingerprint: environmentFingerprint(),
@@ -63,6 +165,8 @@ export function recordExecutionEvidence(
63
165
  outcome,
64
166
  details,
65
167
  };
66
- writeJsonAtomic(executionEvidencePath(controllerHome, job.repoId, evidence.evidenceId), evidence);
168
+ const storage: OutputHandleStorage = { scope: 'instance' };
169
+ writeJsonAtomic(evidencePath(controllerHome, storage, evidence.evidenceId), evidence);
170
+ registerEvidence(controllerHome, evidence, storage);
67
171
  return evidence;
68
172
  }