@moretea-labs/forge 1.8.0 → 1.8.1

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 (528) hide show
  1. package/AGENTS.md +70 -7
  2. package/CHANGELOG.md +14 -0
  3. package/CLAUDE.md +17 -2
  4. package/CONTRIBUTING.md +3 -2
  5. package/THIRD_PARTY_NOTICES.md +1 -1
  6. package/adapters/chatgpt/browser-delivery-host.ts +7 -1
  7. package/adapters/chatgpt/browser-delivery-runtime.ts +529 -56
  8. package/adapters/chatgpt/controller-binding-store.ts +101 -22
  9. package/adapters/chatgpt/controller-round-host.ts +15 -25
  10. package/adapters/chatgpt/controller-round-settlement-store.ts +58 -4
  11. package/adapters/chatgpt/provider-delivery.ts +228 -1
  12. package/adapters/chatgpt/work-conversation-binding-store.ts +79 -53
  13. package/adapters/computer/chatgpt-extension-target.ts +463 -0
  14. package/adapters/computer/chatgpt-target-router.ts +103 -0
  15. package/adapters/computer/chrome-extension/background.js +385 -0
  16. package/adapters/computer/chrome-extension/content.js +378 -0
  17. package/adapters/computer/chrome-extension/core.js +24 -0
  18. package/adapters/computer/chrome-extension/manifest.json +30 -0
  19. package/adapters/computer/desktop-operator-discovery.ts +11 -31
  20. package/adapters/computer/interaction-target-authority.ts +142 -18
  21. package/adapters/mcp/auth.ts +0 -1
  22. package/adapters/mcp/instructions.ts +5 -4
  23. package/adapters/mcp/multi-repository.ts +3 -19
  24. package/adapters/mcp/oauth.ts +73 -0
  25. package/adapters/mcp/paths.ts +4 -1
  26. package/adapters/mcp/runtime-gateway/automation-receipt-adapter.ts +87 -0
  27. package/adapters/mcp/runtime-gateway/bounded-result-runtime.ts +62 -0
  28. package/adapters/mcp/runtime-gateway/cognition-settlement.ts +201 -0
  29. package/adapters/mcp/runtime-gateway/context-adapter.ts +411 -73
  30. package/adapters/mcp/runtime-gateway/context-pack-sidecar.ts +91 -0
  31. package/adapters/mcp/runtime-gateway/controller-authority-adapter.ts +20 -5
  32. package/adapters/mcp/runtime-gateway/core-capability-adapter.ts +258 -0
  33. package/adapters/mcp/runtime-gateway/engineering-preconditions.ts +10 -27
  34. package/adapters/mcp/runtime-gateway/engineering-tool-contract.ts +15 -0
  35. package/adapters/mcp/runtime-gateway/execution-tools.ts +8 -42
  36. package/adapters/mcp/runtime-gateway/gateway-execution-adapter.ts +2 -1
  37. package/adapters/mcp/runtime-gateway/plugin-adapter.ts +117 -45
  38. package/adapters/mcp/runtime-gateway/process-tools.ts +190 -22
  39. package/adapters/mcp/runtime-gateway/protected-computer-adapter.ts +16 -4
  40. package/adapters/mcp/runtime-gateway/recovery-adapter.ts +69 -52
  41. package/adapters/mcp/runtime-gateway/repository-compat-adapter.ts +4 -35
  42. package/adapters/mcp/runtime-gateway/result-adapter.ts +10 -4
  43. package/adapters/mcp/runtime-gateway/router.ts +18 -504
  44. package/adapters/mcp/runtime-gateway/routing-policy.ts +499 -0
  45. package/adapters/mcp/runtime-gateway/runtime-observation-adapter.ts +14 -65
  46. package/adapters/mcp/runtime-gateway/runtime-readiness-observation.ts +218 -0
  47. package/adapters/mcp/runtime-gateway/runtime-tool-definitions.ts +113 -173
  48. package/adapters/mcp/runtime-gateway/runtime-tools.ts +15 -5
  49. package/adapters/mcp/runtime-gateway/scheduler-adapter.ts +1 -0
  50. package/adapters/mcp/runtime-gateway/shared-adapter.ts +20 -0
  51. package/adapters/mcp/runtime-gateway/status-inbox-adapter.ts +358 -266
  52. package/adapters/mcp/runtime-gateway/typescript-navigation-sidecar.ts +136 -0
  53. package/adapters/mcp/runtime-gateway/work-adapter.ts +261 -3122
  54. package/adapters/mcp/runtime-gateway/work-controller-operations.ts +257 -0
  55. package/adapters/mcp/runtime-gateway/work-detail-projection.ts +60 -0
  56. package/adapters/mcp/runtime-gateway/work-input-wire-migration.ts +246 -0
  57. package/adapters/mcp/runtime-gateway/work-learning-operations.ts +145 -0
  58. package/adapters/mcp/runtime-gateway/work-list-projection.ts +38 -0
  59. package/adapters/mcp/runtime-gateway/work-plan-operations.ts +382 -0
  60. package/adapters/mcp/runtime-gateway/work-repair-adapter.ts +308 -0
  61. package/adapters/mcp/runtime-gateway/work-requirement-operations.ts +148 -0
  62. package/adapters/mcp/runtime-gateway/work-semantic-operations.ts +263 -0
  63. package/adapters/mcp/runtime-gateway/work-workflow-operations.ts +113 -0
  64. package/adapters/mcp/runtime-gateway/workflow-supervisor-adapter.ts +156 -0
  65. package/adapters/mcp/server.ts +67 -23
  66. package/adapters/mcp/setup.ts +1 -3
  67. package/adapters/mcp/tool-mapping/legacy-tool-service.ts +44 -170
  68. package/adapters/mcp/tool-mapping/post-finalize-work-attribution.ts +4 -9
  69. package/adapters/mcp/tool-mapping/repository-tools.ts +133 -142
  70. package/adapters/mcp/toolset-names.ts +5 -0
  71. package/adapters/mcp/toolset.ts +6 -5
  72. package/adapters/mcp/transports/http-observation.ts +365 -0
  73. package/adapters/mcp/transports/http.ts +154 -677
  74. package/adapters/mcp/transports/oauth-http.ts +322 -0
  75. package/adapters/mcp/transports/session-registry.ts +6 -0
  76. package/adapters/mcp/tunnels/openai-secure-tunnel.ts +89 -5
  77. package/assets/plugin-registry.v1.json +6 -4
  78. package/assets/reference-configs/agentic-development-flow.md +25 -0
  79. package/assets/reference-configs/global-working-rules.md +19 -0
  80. package/assets/skill-version.json +2 -2
  81. package/docs/architecture/CURRENT.md +111 -41
  82. package/docs/architecture/decisions/20260803-release-identity-binding-and-exit-policy.md +14 -5
  83. package/docs/architecture/decisions/20260823-immediate-controller-relay.md +6 -3
  84. package/docs/architecture/decisions/20260907-assistant-learning-loop.md +2 -0
  85. package/docs/architecture/decisions/20260907-controller-round-transition-policy.md +19 -4
  86. package/docs/architecture/decisions/20260916-workflow-supervisor-authority.md +249 -0
  87. package/docs/architecture/decisions/20260917-cognitive-memory-foundation.md +82 -0
  88. package/docs/architecture/decisions/20260918-stable-candidate-release-lifecycle.md +221 -0
  89. package/docs/architecture/decisions/20260919-autonomous-work-liveness.md +62 -0
  90. package/docs/architecture/decisions/20260924-thin-semantic-working-context.md +72 -0
  91. package/docs/architecture/decisions/20261001-supervisor-turn-authority.md +237 -0
  92. package/docs/architecture/decisions/20261005-forge-v3-desktop-client-boundary.md +77 -0
  93. package/docs/architecture/domains/verification.md +1 -0
  94. package/docs/architecture/domains/workflow-engine.md +6 -0
  95. package/docs/architecture/modules/controller-runtime/transport-lifecycle.md +1 -1
  96. package/docs/forge-plugin-management.md +2 -2
  97. package/docs/operations/controller-performance-and-502.md +17 -0
  98. package/docs/operations/controller-reliability-runbook.md +2 -2
  99. package/docs/operations/features.md +1 -1
  100. package/docs/operations/features.zh-CN.md +1 -1
  101. package/docs/operations/homebrew.md +2 -2
  102. package/docs/operations/mcp-tool-exposure.md +2 -0
  103. package/docs/operations/releasing.md +2 -0
  104. package/docs/operations/standalone-disaster-recovery.md +14 -6
  105. package/docs/wiki/Implementation.md +1 -1
  106. package/package.json +25 -14
  107. package/packages/kernel/cognition/api/index.ts +6 -0
  108. package/packages/kernel/cognition/application/activation-service.ts +451 -0
  109. package/packages/kernel/cognition/application/consolidation-service.ts +185 -0
  110. package/packages/kernel/cognition/application/legacy-experience-adapter.ts +38 -0
  111. package/packages/kernel/cognition/application/memory-service.ts +64 -0
  112. package/packages/kernel/cognition/domain/learning.ts +106 -0
  113. package/packages/kernel/cognition/domain/memory.ts +254 -0
  114. package/packages/kernel/controller/api/index.ts +1 -0
  115. package/packages/kernel/controller/application/continuation-service.ts +281 -0
  116. package/packages/kernel/controller/application/controller-round-service.ts +12 -0
  117. package/packages/kernel/controller/domain/controller-round-transition-policy.ts +242 -21
  118. package/packages/kernel/controller/domain/controller-round.ts +4 -1
  119. package/packages/kernel/controller/domain/execution-quality.ts +3 -1
  120. package/packages/kernel/controller/infrastructure/controller-round-store.ts +689 -103
  121. package/packages/kernel/controller/infrastructure/controller-session-store.ts +297 -71
  122. package/packages/kernel/controller/ports/controller-host.ts +2 -0
  123. package/packages/kernel/identity/api/index.ts +10 -0
  124. package/packages/kernel/identity/domain/activity-projection.ts +43 -0
  125. package/packages/kernel/identity/domain/capability-broker.ts +60 -0
  126. package/packages/kernel/identity/domain/grant.ts +72 -0
  127. package/packages/kernel/identity/domain/owned-resource.ts +116 -0
  128. package/packages/kernel/identity/domain/user-request.ts +93 -0
  129. package/packages/kernel/identity/infrastructure/activity-projection-store.ts +77 -0
  130. package/packages/kernel/identity/infrastructure/capability-broker.ts +81 -0
  131. package/packages/kernel/identity/infrastructure/grant-store.ts +284 -0
  132. package/packages/kernel/identity/infrastructure/owned-resource-store.ts +259 -0
  133. package/packages/kernel/identity/infrastructure/user-request-store.ts +182 -0
  134. package/packages/kernel/scheduler/api/index.ts +0 -2
  135. package/packages/kernel/scheduler/application/schedule-service.ts +3 -0
  136. package/packages/kernel/scheduler/application/settlement.ts +0 -15
  137. package/packages/kernel/scheduler/domain/schedule.ts +87 -0
  138. package/packages/kernel/scheduler/infrastructure/schedule-store.ts +153 -133
  139. package/packages/kernel/work/api/index.ts +3 -2
  140. package/packages/kernel/work/application/work-service.ts +17 -42
  141. package/packages/kernel/work/domain/current-task-lineage.ts +104 -0
  142. package/packages/kernel/work/domain/engineering-design.ts +10 -5
  143. package/packages/kernel/work/domain/engineering-profile.ts +8 -12
  144. package/packages/kernel/work/domain/evaluation-promotion-receipt.ts +186 -0
  145. package/packages/kernel/work/domain/execution-concurrency.ts +19 -26
  146. package/packages/kernel/work/domain/execution-snapshot.ts +0 -31
  147. package/packages/kernel/work/domain/implementation-review.ts +14 -331
  148. package/packages/kernel/work/domain/objective-graph.ts +119 -0
  149. package/packages/kernel/work/domain/project-engineering-contract.ts +23 -1
  150. package/packages/kernel/work/domain/repository-completion-receipt.ts +1 -1
  151. package/packages/kernel/work/domain/state-machine.ts +25 -63
  152. package/packages/kernel/work/domain/types.ts +57 -51
  153. package/packages/kernel/work/infrastructure/work-contract-store.ts +819 -728
  154. package/packages/kernel/work/ports/work-contract-store.ts +5 -2
  155. package/packages/plugin-runtime/browser/session-authority.ts +2 -1
  156. package/packages/plugin-runtime/computer/chatgpt-identity.ts +24 -0
  157. package/packages/plugin-runtime/computer/conversation-target.ts +143 -0
  158. package/packages/plugin-runtime/computer/index.ts +2 -0
  159. package/packages/plugin-runtime/computer/target-authority.ts +26 -1
  160. package/packages/plugin-runtime/external/unix-jsonl-transport.ts +142 -18
  161. package/packages/protocols/computer/contract.ts +27 -1
  162. package/scripts/activate-source-baseline.ts +7 -9
  163. package/scripts/canary-controller-semantic-wait.ts +12 -24
  164. package/scripts/check-mcp-compatibility.ts +48 -136
  165. package/scripts/check-runtime-architecture.mjs +622 -217
  166. package/scripts/forge-local-recovery-helper.mjs +93 -15
  167. package/scripts/lib/project-init-lib.sh +3 -0
  168. package/scripts/open-source-audit-allowlist.txt +1 -2
  169. package/scripts/run-bounded-command.mjs +5 -0
  170. package/scripts/run-governed-gate.ts +0 -1
  171. package/scripts/run-mobile-monitor-bridge.ts +0 -1
  172. package/scripts/smoke-control-plane-failure-domain.ts +94 -0
  173. package/scripts/smoke-mcp-http-runtime.ts +5 -0
  174. package/scripts/smoke-runtime-recovery.ts +12 -43
  175. package/scripts/smoke-schedule-engine.ts +23 -15
  176. package/scripts/smoke-unattended-transport-recovery.ts +223 -0
  177. package/scripts/smoke-user-request-continuation-restart.ts +232 -0
  178. package/scripts/smoke-workflow-supervisor-chrome-adapter.ts +92 -0
  179. package/scripts/smoke-workflow-supervisor-process-restart.ts +276 -0
  180. package/scripts/smoke-workflow-supervisor-restart-recovery.ts +150 -0
  181. package/scripts/smoke-workflow-supervisor.ts +103 -0
  182. package/scripts/verify-forge-runtime.sh +2 -1
  183. package/src/cli/agent-jobs/executor-health.ts +11 -34
  184. package/src/cli/agent-jobs/integration.ts +18 -49
  185. package/src/cli/agent-jobs/job-manager.ts +7 -3
  186. package/src/cli/commands/brain-assistant.ts +27 -13
  187. package/src/cli/commands/brain.ts +13 -15
  188. package/src/cli/commands/chatgpt.ts +1 -163
  189. package/src/cli/commands/recovery.ts +135 -121
  190. package/src/cli/commands/runtime.ts +3 -3
  191. package/src/cli/commands/setup-profile.ts +8 -0
  192. package/src/cli/controller/check-runner.ts +13 -2
  193. package/src/cli/controller/completion-backlog.ts +3 -3
  194. package/src/cli/controller/completion-orchestrator.ts +4 -43
  195. package/src/cli/controller/completion-target.ts +3 -72
  196. package/src/cli/controller/context/source-materializer.ts +81 -100
  197. package/src/cli/controller/context-pack.ts +10 -8
  198. package/src/cli/controller/execution-completion.ts +4 -7
  199. package/src/cli/controller/execution-policy.ts +36 -153
  200. package/src/cli/controller/governance.ts +2 -3
  201. package/src/cli/controller/issue-store.ts +4 -99
  202. package/src/cli/controller/launch-agents.ts +59 -18
  203. package/src/cli/controller/operational-plan.ts +24 -51
  204. package/src/cli/controller/runtime-config.ts +5 -1
  205. package/src/cli/controller/stuck-state-migration.ts +2 -3
  206. package/src/cli/controller/systemd-user.ts +39 -1
  207. package/src/cli/editing/edit-session.ts +1 -7
  208. package/src/cli/local-bridge/console-automations.ts +18 -13
  209. package/src/cli/local-bridge/console-view-models.ts +3 -12
  210. package/src/cli/local-bridge/facade-api.ts +64 -191
  211. package/src/cli/local-bridge/server.ts +24 -147
  212. package/src/cli/local-bridge/types.ts +0 -1
  213. package/src/cli/mcp/oauth-client-retirement.ts +74 -0
  214. package/src/cli/repositories/command-executor.ts +29 -23
  215. package/src/cli/repositories/command-scope.ts +35 -16
  216. package/src/cli/repositories/controller-home.ts +48 -0
  217. package/src/cli/repositories/ephemeral-workspace.ts +20 -30
  218. package/src/cli/repositories/git-command-executor.ts +2 -2
  219. package/src/cli/repositories/registry.ts +77 -11
  220. package/src/cli/repositories/structured-git.ts +62 -2
  221. package/src/cli/repository/session-cache.ts +92 -6
  222. package/src/runtime/context/assistant-context.ts +20 -7
  223. package/src/runtime/context/assistant-work-context.ts +89 -27
  224. package/src/runtime/context/automatic-learning.ts +565 -0
  225. package/src/runtime/context/cognitive-attention.ts +173 -0
  226. package/src/runtime/context/cognitive-skill-canary.ts +158 -0
  227. package/src/runtime/context/context-closure.ts +46 -9
  228. package/src/runtime/context/context-pack-process.ts +103 -0
  229. package/src/runtime/context/context-plane.ts +1 -9
  230. package/src/runtime/context/direct-controller-learning.ts +298 -0
  231. package/src/runtime/context/semantic-navigation-contract.ts +9 -0
  232. package/src/runtime/context/semantic-navigation.ts +6 -34
  233. package/src/runtime/context/typescript-navigation-process.ts +145 -0
  234. package/src/runtime/context/typescript-navigation.ts +89 -3
  235. package/src/runtime/control-plane/cleanup-artifact-retention.ts +212 -9
  236. package/src/runtime/control-plane/concurrency/work-execution-concurrency.ts +9 -47
  237. package/src/runtime/control-plane/execution/controller-authority-recovery.ts +34 -4
  238. package/src/runtime/control-plane/execution/edit-validation-coordinator.ts +29 -20
  239. package/src/runtime/control-plane/execution/execution-identity.ts +23 -3
  240. package/src/runtime/control-plane/execution/repository-work-attribution.ts +7 -30
  241. package/src/runtime/control-plane/execution/retained-work-resume.ts +206 -199
  242. package/src/runtime/control-plane/execution/session-store.ts +31 -1
  243. package/src/runtime/control-plane/execution/validation.ts +6 -8
  244. package/src/runtime/control-plane/execution/work-authority-reconciler.ts +13 -42
  245. package/src/runtime/control-plane/execution/work-check-evidence.ts +137 -0
  246. package/src/runtime/control-plane/execution/work-completion-authority.ts +30 -85
  247. package/src/runtime/control-plane/execution/work-delivery-service.ts +497 -0
  248. package/src/runtime/control-plane/execution/work-evidence-policy.ts +12 -50
  249. package/src/runtime/control-plane/execution/work-execution-support.ts +50 -149
  250. package/src/runtime/control-plane/execution/work-handle-authority.ts +188 -109
  251. package/src/runtime/control-plane/execution/work-handle-store.ts +19 -43
  252. package/src/runtime/control-plane/execution/work-head-settlement.ts +53 -20
  253. package/src/runtime/control-plane/execution/work-lifecycle-audit.ts +52 -29
  254. package/src/runtime/control-plane/execution/work-operation-service.ts +43 -27
  255. package/src/runtime/control-plane/execution/work-preparation-service.ts +126 -266
  256. package/src/runtime/control-plane/execution/work-remote-delivery.ts +2 -3
  257. package/src/runtime/control-plane/execution/work-revision-diff.ts +39 -0
  258. package/src/runtime/control-plane/execution/work-terminal-cleanup.ts +173 -186
  259. package/src/runtime/control-plane/execution/work-validation-reconciler.ts +28 -84
  260. package/src/runtime/control-plane/execution/work-verification-service.ts +406 -50
  261. package/src/runtime/control-plane/execution/work-verification-snapshot.ts +5 -1
  262. package/src/runtime/control-plane/facade/capability-registry.ts +362 -37
  263. package/src/runtime/control-plane/facade/check-normalization.ts +3 -9
  264. package/src/runtime/control-plane/facade/codex-delegation.ts +10 -11
  265. package/src/runtime/control-plane/facade/controller-connection.ts +135 -0
  266. package/src/runtime/control-plane/facade/goal-workloop-access.ts +1 -20
  267. package/src/runtime/control-plane/facade/goal-workloop.ts +281 -1753
  268. package/src/runtime/control-plane/facade/handoff-inbox-application.ts +12 -25
  269. package/src/runtime/control-plane/facade/handoff-inbox-store.ts +256 -52
  270. package/src/runtime/control-plane/facade/index.ts +0 -1
  271. package/src/runtime/control-plane/facade/operation-digest.ts +12 -15
  272. package/src/runtime/control-plane/facade/plan-contract-store.ts +451 -991
  273. package/src/runtime/control-plane/facade/policy-gate.ts +0 -23
  274. package/src/runtime/control-plane/facade/repository-work-admission.ts +12 -22
  275. package/src/runtime/control-plane/facade/requirement-authority.ts +102 -199
  276. package/src/runtime/control-plane/facade/requirement-board.ts +3 -3
  277. package/src/runtime/control-plane/facade/rh-work-operation-contract.ts +51 -14
  278. package/src/runtime/control-plane/facade/self-healing-loop.ts +18 -53
  279. package/src/runtime/control-plane/facade/suggested-actions.ts +15 -18
  280. package/src/runtime/control-plane/facade/types.ts +49 -108
  281. package/src/runtime/control-plane/facade/work-continuation.ts +8 -8
  282. package/src/runtime/control-plane/generated-cache-retention.ts +97 -1
  283. package/src/runtime/control-plane/global-scheduler/autonomous-continuation.ts +248 -0
  284. package/src/runtime/control-plane/global-scheduler/durable-admission.ts +1 -1
  285. package/src/runtime/control-plane/global-scheduler/maintenance.ts +239 -112
  286. package/src/runtime/control-plane/global-scheduler/reconciliation.ts +2 -1
  287. package/src/runtime/control-plane/global-scheduler/scheduler.ts +66 -40
  288. package/src/runtime/control-plane/global-scheduler/wake-signal.ts +42 -2
  289. package/src/runtime/control-plane/governance/access-policy.ts +19 -2
  290. package/src/runtime/control-plane/governance/authorization.ts +20 -3
  291. package/src/runtime/control-plane/launcher/chatgpt-round-continuation.ts +63 -300
  292. package/src/runtime/control-plane/launcher/chatgpt-work-continuation.ts +28 -300
  293. package/src/runtime/control-plane/launcher/local-conversation-controller.ts +238 -0
  294. package/src/runtime/control-plane/launcher/provider-mcp-bootstrap.ts +5 -2
  295. package/src/runtime/control-plane/launcher/thin-launcher.ts +96 -240
  296. package/src/runtime/control-plane/persistence/cognition-store.ts +820 -0
  297. package/src/runtime/control-plane/persistence/experience-store.ts +162 -29
  298. package/src/runtime/control-plane/persistence/requirement-store.ts +216 -74
  299. package/src/runtime/control-plane/persistence/sqlite-store.ts +113 -6
  300. package/src/runtime/control-plane/release-retention.ts +135 -47
  301. package/src/runtime/control-plane/repository-namespace-retention.ts +2 -2
  302. package/src/runtime/control-plane/runtime-cleanup.ts +290 -21
  303. package/src/runtime/control-plane/workspace/project-onboarding.ts +80 -0
  304. package/src/runtime/control-plane/workspace/semantic-sync-service.ts +19 -5
  305. package/src/runtime/control-plane/workspace/workspace-store.ts +169 -0
  306. package/src/runtime/diagnostics/incident-repair.ts +313 -146
  307. package/src/runtime/diagnostics/mcp-timing.ts +114 -0
  308. package/src/runtime/evidence/artifact-store.ts +158 -40
  309. package/src/runtime/evidence/evidence-store.ts +112 -8
  310. package/src/runtime/evidence/output-handle-index.ts +225 -0
  311. package/src/runtime/evidence/result-store.ts +158 -44
  312. package/src/runtime/execution/jobs/store.ts +3 -4
  313. package/src/runtime/execution/managed-workspace.ts +57 -0
  314. package/src/runtime/execution/process-runtime/check-facade.ts +1 -1
  315. package/src/runtime/execution/process-runtime/check-result-retention.ts +2 -2
  316. package/src/runtime/execution/process-runtime/check-result.ts +105 -1
  317. package/src/runtime/execution/process-runtime/check-runner-sidecar.ts +18 -8
  318. package/src/runtime/execution/process-runtime/command-facade.ts +79 -27
  319. package/src/runtime/execution/process-runtime/gc.ts +15 -2
  320. package/src/runtime/execution/process-runtime/handle-index.ts +176 -0
  321. package/src/runtime/execution/process-runtime/host-command-lane.ts +139 -0
  322. package/src/runtime/execution/process-runtime/index.ts +3 -0
  323. package/src/runtime/execution/process-runtime/lightweight-managed.ts +251 -72
  324. package/src/runtime/execution/process-runtime/persisted-check.ts +3 -3
  325. package/src/runtime/execution/process-runtime/process-runner-entry.ts +47 -5
  326. package/src/runtime/execution/process-runtime/process-scope.ts +160 -0
  327. package/src/runtime/execution/process-runtime/resource-claims.ts +65 -61
  328. package/src/runtime/execution/process-runtime/runtime.ts +35 -2
  329. package/src/runtime/execution/process-runtime/store.ts +30 -2
  330. package/src/runtime/execution/process-runtime/types.ts +6 -1
  331. package/src/runtime/execution/workers/executor.ts +2 -6
  332. package/src/runtime/platform/service-inventory.ts +130 -0
  333. package/src/runtime/platform/service-manager.ts +8 -0
  334. package/src/runtime/plugins/action-application.ts +85 -28
  335. package/src/runtime/plugins/app-store-connect-adapter.ts +38 -14
  336. package/src/runtime/plugins/browser-adapter.ts +757 -34
  337. package/src/runtime/plugins/browser-automation-service.ts +23 -3
  338. package/src/runtime/plugins/browser-macos-bridge.ts +321 -29
  339. package/src/runtime/plugins/browser-manifest-surface.ts +45 -11
  340. package/src/runtime/plugins/browser-native-session-service.ts +63 -13
  341. package/src/runtime/plugins/browser-registration.ts +16 -0
  342. package/src/runtime/plugins/browser-runtime.ts +14 -1
  343. package/src/runtime/plugins/browser-session-authority.ts +2 -2
  344. package/src/runtime/plugins/browser-session-store.ts +46 -76
  345. package/src/runtime/plugins/capability-authorization-grants.ts +258 -62
  346. package/src/runtime/plugins/computer-chatgpt-browser-adapter-installer.ts +219 -0
  347. package/src/runtime/plugins/computer-chatgpt-macos-target.ts +891 -0
  348. package/src/runtime/plugins/computer-registration.ts +222 -11
  349. package/src/runtime/plugins/desktop-operator-external-policy.ts +36 -4
  350. package/src/runtime/plugins/desktop-operator-registration.ts +12 -4
  351. package/src/runtime/plugins/external-adapter.ts +42 -6
  352. package/src/runtime/plugins/external-registration.ts +21 -1
  353. package/src/runtime/plugins/gmail-adapter.ts +23 -2
  354. package/src/runtime/plugins/google-calendar-adapter.ts +2 -2
  355. package/src/runtime/plugins/google-shared.ts +14 -7
  356. package/src/runtime/plugins/google-tasks-adapter.ts +2 -2
  357. package/src/runtime/plugins/ios-adapter.ts +1 -1
  358. package/src/runtime/plugins/lightweight-action.ts +208 -2
  359. package/src/runtime/plugins/local-system-adapter.ts +12 -2
  360. package/src/runtime/plugins/managed-process-adapter.ts +12 -5
  361. package/src/runtime/plugins/plugin-action-sidecar.ts +17 -13
  362. package/src/runtime/plugins/plugin-management-adapter.ts +1 -1
  363. package/src/runtime/plugins/store.ts +602 -428
  364. package/src/runtime/plugins/types.ts +20 -0
  365. package/src/runtime/plugins/xiaohongshu-publish.ts +16 -0
  366. package/src/runtime/projections/invalidation.ts +7 -3
  367. package/src/runtime/projections/materialized-view.ts +80 -36
  368. package/src/runtime/recovery/actions.ts +3 -3
  369. package/src/runtime/recovery/capability-action-application.ts +46 -45
  370. package/src/runtime/recovery/lifecycle-inventory.ts +29 -29
  371. package/src/runtime/recovery/maintenance-executor.ts +374 -123
  372. package/src/runtime/recovery/store.ts +29 -11
  373. package/src/runtime/release/release-coordinator.ts +296 -0
  374. package/src/runtime/release/release-session.ts +716 -0
  375. package/src/runtime/release/release-state-migration.ts +25 -0
  376. package/src/runtime/resources/leases/store.ts +56 -25
  377. package/src/runtime/root/computer-composition.ts +191 -6
  378. package/src/runtime/root/controller-progression-composition.ts +192 -0
  379. package/src/runtime/root/controller-round-composition.ts +20 -1
  380. package/src/runtime/root/deployment-topology.ts +106 -0
  381. package/src/runtime/root/entry.ts +4 -3
  382. package/src/runtime/root/known-good-recovery.ts +184 -0
  383. package/src/runtime/root/local-bridge.ts +0 -1
  384. package/src/runtime/root/mcp-transport.ts +111 -18
  385. package/src/runtime/root/ownership.ts +261 -9
  386. package/src/runtime/root/package-connector-service.ts +105 -19
  387. package/src/runtime/root/package-runtime-release.ts +117 -18
  388. package/src/runtime/root/package-runtime-service.ts +17 -11
  389. package/src/runtime/root/release-execution-canary.ts +44 -12
  390. package/src/runtime/root/release-loader.ts +90 -8
  391. package/src/runtime/root/release-manifest.ts +80 -6
  392. package/src/runtime/root/release-materialize.ts +372 -28
  393. package/src/runtime/root/release-store.ts +395 -36
  394. package/src/runtime/root/runtime-lane.ts +191 -0
  395. package/src/runtime/root/runtime.ts +159 -27
  396. package/src/runtime/root/scheduled-controller-composition.ts +28 -3
  397. package/src/runtime/root/service-runner.ts +2 -2
  398. package/src/runtime/root/service.ts +36 -33
  399. package/src/runtime/root/status.ts +48 -0
  400. package/src/runtime/root/types.ts +32 -3
  401. package/src/runtime/root/workflow-supervisor-composition.ts +493 -0
  402. package/src/runtime/root/workflow-supervisor-runtime.ts +209 -0
  403. package/src/runtime/root/write-fence.ts +50 -2
  404. package/src/runtime/safe-tooling/google-credential-store.ts +76 -21
  405. package/src/runtime/safe-tooling/google-oauth-broker.ts +25 -7
  406. package/src/runtime/safe-tooling/workspace-auth.ts +1 -1
  407. package/src/runtime/shared/bounded-child-supervisor.ts +9 -1
  408. package/src/runtime/shared/process-environment.ts +20 -9
  409. package/src/runtime/shared/response-budget.ts +1 -3
  410. package/src/runtime/standalone-recovery/controller-home-migration.ts +16 -24
  411. package/src/runtime/standalone-recovery/core.ts +3702 -342
  412. package/src/runtime/standalone-recovery/entry.ts +469 -39
  413. package/src/runtime/standalone-recovery/installer.ts +262 -148
  414. package/src/runtime/standalone-recovery/mcp-server.ts +29 -193
  415. package/src/runtime/standalone-recovery/operation-lock.ts +1 -1
  416. package/src/runtime/standalone-recovery/performance.ts +54 -16
  417. package/src/runtime/standalone-recovery/release.ts +53 -5
  418. package/src/runtime/standalone-recovery/service-labels.ts +5 -2
  419. package/src/runtime/standalone-recovery/watchdog-heartbeat.ts +5 -2
  420. package/src/runtime/workflow/schedules/browser-probe.ts +17 -6
  421. package/src/runtime/workflow/schedules/chatgpt-automation-migration.ts +10 -3
  422. package/src/runtime/workflow/schedules/engine.ts +138 -172
  423. package/src/runtime/workflow/schedules/work-continuation.ts +44 -5
  424. package/src/runtime/workflows/runtime.ts +15 -19
  425. package/src/testing/test-governance.ts +5 -1
  426. package/supervisor/chatgpt-conversation.ts +23 -0
  427. package/supervisor/client.ts +201 -0
  428. package/supervisor/control-plane.ts +868 -0
  429. package/supervisor/entry.ts +15 -0
  430. package/supervisor/forge-validators.ts +80 -0
  431. package/supervisor/index.ts +5 -0
  432. package/supervisor/native-browser-adapter.ts +786 -0
  433. package/supervisor/native-messaging/host.ts +39 -0
  434. package/supervisor/native-messaging/manifest.ts +26 -0
  435. package/supervisor/native-messaging/protocol.ts +27 -0
  436. package/supervisor/paths.ts +18 -0
  437. package/supervisor/protocol.ts +202 -0
  438. package/supervisor/server.ts +404 -0
  439. package/supervisor/store.ts +1451 -0
  440. package/supervisor/tsconfig.json +8 -0
  441. package/supervisor/types.ts +255 -0
  442. package/adapters/chatgpt/controller-host.ts +0 -119
  443. package/adapters/mcp/controller-round-compatibility.ts +0 -184
  444. package/adapters/mcp/frozen-client-semantic-compatibility.ts +0 -292
  445. package/adapters/mcp/runtime-gateway/work-compat-adapter.ts +0 -502
  446. package/packages/kernel/progression/api/index.ts +0 -2
  447. package/packages/kernel/progression/application/projector.ts +0 -211
  448. package/packages/kernel/progression/domain/types.ts +0 -116
  449. package/packages/kernel/progression/index.ts +0 -1
  450. package/packages/kernel/scheduler/application/continuation-service.ts +0 -212
  451. package/packages/kernel/scheduler/domain/continuation.ts +0 -38
  452. package/packages/kernel/scheduler/infrastructure/continuation-dispatch-store.ts +0 -38
  453. package/packages/kernel/work/domain/admission-policy.ts +0 -34
  454. package/scripts/benchmark-background-check-overlap.ts +0 -228
  455. package/scripts/benchmark-computer-hotpath.ts +0 -255
  456. package/scripts/benchmark-controller-hotpath.ts +0 -212
  457. package/scripts/benchmark-controller-round2.ts +0 -191
  458. package/scripts/benchmark-ios-agent-device.ts +0 -511
  459. package/scripts/benchmark-mcp-host.sh +0 -117
  460. package/scripts/benchmark-mcp-transport.ts +0 -169
  461. package/scripts/benchmark-operational-memory-activation.ts +0 -235
  462. package/scripts/benchmark-operational-shadow.ts +0 -28
  463. package/scripts/benchmark-quality-harness.ts +0 -146
  464. package/scripts/benchmark-route-session-concurrency.ts +0 -915
  465. package/scripts/benchmark-thin-harness-gateway-ab.ts +0 -632
  466. package/scripts/benchmark-thin-harness-mcp-e2e.ts +0 -498
  467. package/scripts/benchmark-thin-harness.ts +0 -251
  468. package/scripts/benchmark-typescript-navigation.ts +0 -186
  469. package/scripts/benchmark-work-efficiency.ts +0 -334
  470. package/scripts/build-controller-ui.ts +0 -28
  471. package/scripts/check-npm-release.sh +0 -32
  472. package/scripts/check-public-release-surface.sh +0 -19
  473. package/scripts/check-release-published.sh +0 -57
  474. package/scripts/check-release-readiness.sh +0 -37
  475. package/scripts/check-release-version.mjs +0 -74
  476. package/scripts/check-tarball-install-smoke.sh +0 -150
  477. package/scripts/package-source-archive.sh +0 -147
  478. package/scripts/public-release-files.txt +0 -39
  479. package/scripts/public-release.ts +0 -174
  480. package/scripts/publish-release-tarball.sh +0 -27
  481. package/scripts/route-nl-vs-ts-eval.ts +0 -679
  482. package/scripts/stage-runtime-release.ts +0 -44
  483. package/src/cli/controller/progress.ts +0 -656
  484. package/src/cli/controller/work-mode.ts +0 -181
  485. package/src/cli/local-bridge/console-assets.ts +0 -17
  486. package/src/cli/local-bridge/dashboard.ts +0 -17
  487. package/src/cli/local-bridge/frontend/src/App.tsx +0 -10
  488. package/src/cli/local-bridge/frontend/src/components/Button.tsx +0 -1
  489. package/src/cli/local-bridge/frontend/src/components/DetailPane.tsx +0 -3
  490. package/src/cli/local-bridge/frontend/src/components/SearchField.tsx +0 -1
  491. package/src/cli/local-bridge/frontend/src/components/SectionHeader.tsx +0 -1
  492. package/src/cli/local-bridge/frontend/src/components/Segmented.tsx +0 -1
  493. package/src/cli/local-bridge/frontend/src/components/StatusText.tsx +0 -3
  494. package/src/cli/local-bridge/frontend/src/design/icons.tsx +0 -11
  495. package/src/cli/local-bridge/frontend/src/design/tokens.css +0 -8
  496. package/src/cli/local-bridge/frontend/src/features/automations/AutomationsView.tsx +0 -153
  497. package/src/cli/local-bridge/frontend/src/features/capabilities/CapabilitiesView.tsx +0 -37
  498. package/src/cli/local-bridge/frontend/src/features/overview/OverviewView.tsx +0 -183
  499. package/src/cli/local-bridge/frontend/src/features/repositories/RepositoriesView.tsx +0 -2
  500. package/src/cli/local-bridge/frontend/src/features/system/SystemView.tsx +0 -2
  501. package/src/cli/local-bridge/frontend/src/features/work/WorkView.tsx +0 -4
  502. package/src/cli/local-bridge/frontend/src/lib/api.ts +0 -30
  503. package/src/cli/local-bridge/frontend/src/lib/format.ts +0 -4
  504. package/src/cli/local-bridge/frontend/src/lib/routes.ts +0 -7
  505. package/src/cli/local-bridge/frontend/src/main.tsx +0 -1
  506. package/src/cli/local-bridge/frontend/src/shell/AppShell.tsx +0 -1
  507. package/src/cli/local-bridge/frontend/src/shell/CommandBar.tsx +0 -2
  508. package/src/cli/local-bridge/frontend/src/shell/Sidebar.tsx +0 -4
  509. package/src/cli/local-bridge/frontend/src/styles.css +0 -28
  510. package/src/cli/local-bridge/frontend/src/types.ts +0 -15
  511. package/src/cli/local-bridge/frontend/src/vite-env.d.ts +0 -1
  512. package/src/cli/local-bridge/frontend/vite.config.ts +0 -27
  513. package/src/cli/local-bridge/ui-dist/app.css +0 -1
  514. package/src/cli/local-bridge/ui-dist/app.js +0 -11228
  515. package/src/runtime/control-plane/execution/content-equivalent-commit-authority.ts +0 -169
  516. package/src/runtime/control-plane/execution/direct-canonical-work-reconciliation.ts +0 -85
  517. package/src/runtime/control-plane/execution/direct-edit-work-completion.ts +0 -655
  518. package/src/runtime/control-plane/execution/work-finalization-service.ts +0 -2850
  519. package/src/runtime/control-plane/execution/work-path-scope.ts +0 -37
  520. package/src/runtime/control-plane/execution/work-task-receipt.ts +0 -468
  521. package/src/runtime/control-plane/facade/controller-round-relay.ts +0 -3
  522. package/src/runtime/control-plane/facade/work-admission-policy.ts +0 -142
  523. package/src/runtime/control-plane/facade/work-implementation-review.ts +0 -2
  524. package/src/runtime/control-plane/facade/work-state-machine.ts +0 -2
  525. package/src/runtime/control-plane/facade/work-task-projection.ts +0 -66
  526. package/src/runtime/control-plane/routing/index.ts +0 -1
  527. package/src/runtime/control-plane/routing/route-policy.ts +0 -401
  528. package/src/runtime/control-plane/routing/workspace-admission.ts +0 -70
@@ -11,12 +11,31 @@ export interface SessionCacheMetrics {
11
11
  invalidations: number;
12
12
  }
13
13
 
14
+ export interface SessionCacheEntryCounts {
15
+ ranges: number;
16
+ searches: number;
17
+ structural: number;
18
+ gitSnapshots: number;
19
+ checks: number;
20
+ total: number;
21
+ }
22
+
23
+ export interface SessionCacheEntryLimits {
24
+ ranges: number;
25
+ searches: number;
26
+ structural: number;
27
+ gitSnapshots: number;
28
+ checks: number;
29
+ }
30
+
14
31
  export interface SessionCacheGlobalDiagnostics {
15
32
  activeEntries: number;
16
33
  maxEntries: number;
17
34
  ttlMs: number;
18
35
  evictions: number;
19
36
  sessionIds: string[];
37
+ derivedEntries: SessionCacheEntryCounts;
38
+ derivedEntryLimitsPerSession: SessionCacheEntryLimits;
20
39
  }
21
40
 
22
41
  export interface SessionIdentity {
@@ -99,6 +118,32 @@ function rangeKey(path: string, start: number, end: number): string {
99
118
  return `${path}:${start}-${end}`;
100
119
  }
101
120
 
121
+ // One Context Plane request materializes at most ~30 files and one aggregate
122
+ // lexical/structural result. Keep several progressive waves hot without letting
123
+ // one long-lived MCP session retain an unbounded history of derived object graphs.
124
+ const SESSION_CACHE_ENTRY_LIMITS: SessionCacheEntryLimits = {
125
+ ranges: 96,
126
+ searches: 48,
127
+ structural: 24,
128
+ gitSnapshots: 4,
129
+ checks: 32,
130
+ };
131
+
132
+ function putBoundedLru<K, V>(map: Map<K, V>, key: K, value: V, maxEntries: number): void {
133
+ if (map.has(key)) map.delete(key);
134
+ map.set(key, value);
135
+ while (map.size > maxEntries) {
136
+ const oldest = map.keys().next().value as K | undefined;
137
+ if (oldest === undefined) break;
138
+ map.delete(oldest);
139
+ }
140
+ }
141
+
142
+ function promoteLruHit<K, V>(map: Map<K, V>, key: K, value: V): void {
143
+ map.delete(key);
144
+ map.set(key, value);
145
+ }
146
+
102
147
  export class RepositorySessionCache {
103
148
  private identity: SessionIdentity;
104
149
  private readonly repoRoot: string;
@@ -146,6 +191,22 @@ export class RepositorySessionCache {
146
191
  };
147
192
  }
148
193
 
194
+ entryCounts(): SessionCacheEntryCounts {
195
+ const ranges = this.ranges.size;
196
+ const searches = this.searches.size;
197
+ const structural = this.structural.size;
198
+ const gitSnapshots = this.gitSnapshots.size;
199
+ const checks = this.checks.size;
200
+ return {
201
+ ranges,
202
+ searches,
203
+ structural,
204
+ gitSnapshots,
205
+ checks,
206
+ total: ranges + searches + structural + gitSnapshots + checks,
207
+ };
208
+ }
209
+
149
210
  currentIdentity(): SessionIdentity {
150
211
  return { ...this.identity };
151
212
  }
@@ -205,18 +266,20 @@ export class RepositorySessionCache {
205
266
  const key = rangeKey(relativePath, startLine, endLine);
206
267
  const exact = this.ranges.get(key);
207
268
  if (exact && exact.fileSha === sha) {
269
+ promoteLruHit(this.ranges, key, exact);
208
270
  this.metrics.cacheHit += 1;
209
271
  this.metrics.bytesAvoided += exact.bytes;
210
272
  return exact;
211
273
  }
212
274
  // Try covering supersets: same path/sha with wider range.
213
- for (const entry of this.ranges.values()) {
275
+ for (const [coveringKey, entry] of this.ranges) {
214
276
  if (
215
277
  entry.path === relativePath
216
278
  && entry.fileSha === sha
217
279
  && entry.startLine <= startLine
218
280
  && (entry.endLine >= endLine || entry.endLine >= entry.totalLines)
219
281
  ) {
282
+ promoteLruHit(this.ranges, coveringKey, entry);
220
283
  this.metrics.cacheHit += 1;
221
284
  this.metrics.bytesAvoided += Math.max(0, entry.bytes);
222
285
  const resolvedEndLine = Math.min(endLine, entry.totalLines);
@@ -233,13 +296,14 @@ export class RepositorySessionCache {
233
296
  }
234
297
 
235
298
  putRange(entry: FileRangeCacheEntry): void {
236
- this.ranges.set(rangeKey(entry.path, entry.startLine, entry.endLine), entry);
299
+ putBoundedLru(this.ranges, rangeKey(entry.path, entry.startLine, entry.endLine), entry, SESSION_CACHE_ENTRY_LIMITS.ranges);
237
300
  }
238
301
 
239
302
  getSearch(query: string, includeKey: string): SearchCacheEntry | null {
240
303
  const key = `${this.identity.head}|${this.identity.workingTreeFingerprint}|${includeKey}|${query}`;
241
304
  const hit = this.searches.get(key);
242
305
  if (hit) {
306
+ promoteLruHit(this.searches, key, hit);
243
307
  this.metrics.cacheHit += 1;
244
308
  this.metrics.scanAvoided += 1;
245
309
  return hit;
@@ -250,13 +314,14 @@ export class RepositorySessionCache {
250
314
 
251
315
  putSearch(entry: SearchCacheEntry): void {
252
316
  const key = `${this.identity.head}|${this.identity.workingTreeFingerprint}|${entry.includeKey}|${entry.query}`;
253
- this.searches.set(key, entry);
317
+ putBoundedLru(this.searches, key, entry, SESSION_CACHE_ENTRY_LIMITS.searches);
254
318
  }
255
319
 
256
320
  getStructural(key: string, ttlMs = 30_000): unknown | null {
257
321
  const scopedKey = `${this.identity.head}|${this.identity.workingTreeFingerprint}|${key}`;
258
322
  const hit = this.structural.get(scopedKey);
259
323
  if (hit && Date.now() - hit.at <= ttlMs) {
324
+ promoteLruHit(this.structural, scopedKey, hit);
260
325
  this.metrics.cacheHit += 1;
261
326
  this.metrics.scanAvoided += 1;
262
327
  return hit.value;
@@ -277,13 +342,14 @@ export class RepositorySessionCache {
277
342
 
278
343
  putStructural(key: string, value: unknown): void {
279
344
  const scopedKey = `${this.identity.head}|${this.identity.workingTreeFingerprint}|${key}`;
280
- this.structural.set(scopedKey, { at: Date.now(), value });
345
+ putBoundedLru(this.structural, scopedKey, { at: Date.now(), value }, SESSION_CACHE_ENTRY_LIMITS.structural);
281
346
  }
282
347
 
283
348
  getGitSnapshot(): unknown | null {
284
349
  const key = `${this.identity.head}|${this.identity.workingTreeFingerprint}`;
285
350
  const hit = this.gitSnapshots.get(key);
286
351
  if (hit) {
352
+ promoteLruHit(this.gitSnapshots, key, hit);
287
353
  this.metrics.cacheHit += 1;
288
354
  return hit.value;
289
355
  }
@@ -293,13 +359,14 @@ export class RepositorySessionCache {
293
359
 
294
360
  putGitSnapshot(value: unknown): void {
295
361
  const key = `${this.identity.head}|${this.identity.workingTreeFingerprint}`;
296
- this.gitSnapshots.set(key, { at: Date.now(), value });
362
+ putBoundedLru(this.gitSnapshots, key, { at: Date.now(), value }, SESSION_CACHE_ENTRY_LIMITS.gitSnapshots);
297
363
  }
298
364
 
299
365
  getCheck(checkId: string): unknown | null {
300
366
  const key = `${this.identity.workingTreeFingerprint}|${checkId}`;
301
367
  const hit = this.checks.get(key);
302
368
  if (hit !== undefined) {
369
+ promoteLruHit(this.checks, key, hit);
303
370
  this.metrics.cacheHit += 1;
304
371
  return hit;
305
372
  }
@@ -308,7 +375,7 @@ export class RepositorySessionCache {
308
375
  }
309
376
 
310
377
  putCheck(checkId: string, value: unknown): void {
311
- this.checks.set(`${this.identity.workingTreeFingerprint}|${checkId}`, value);
378
+ putBoundedLru(this.checks, `${this.identity.workingTreeFingerprint}|${checkId}`, value, SESSION_CACHE_ENTRY_LIMITS.checks);
312
379
  }
313
380
 
314
381
  /** Precise invalidation when one file changes. */
@@ -460,12 +527,31 @@ export function clearSessionCachesForSession(sessionId: string): number {
460
527
 
461
528
  export function sessionCacheGlobalDiagnostics(): SessionCacheGlobalDiagnostics {
462
529
  pruneSessionCaches();
530
+ const derivedEntries: SessionCacheEntryCounts = {
531
+ ranges: 0,
532
+ searches: 0,
533
+ structural: 0,
534
+ gitSnapshots: 0,
535
+ checks: 0,
536
+ total: 0,
537
+ };
538
+ for (const cache of globalSessions.values()) {
539
+ const counts = cache.entryCounts();
540
+ derivedEntries.ranges += counts.ranges;
541
+ derivedEntries.searches += counts.searches;
542
+ derivedEntries.structural += counts.structural;
543
+ derivedEntries.gitSnapshots += counts.gitSnapshots;
544
+ derivedEntries.checks += counts.checks;
545
+ derivedEntries.total += counts.total;
546
+ }
463
547
  return {
464
548
  activeEntries: globalSessions.size,
465
549
  maxEntries: SESSION_CACHE_MAX_ENTRIES,
466
550
  ttlMs: SESSION_CACHE_TTL_MS,
467
551
  evictions: sessionCacheEvictions,
468
552
  sessionIds: [...new Set([...globalSessions.keys()].map((key) => key.split('|', 1)[0]))],
553
+ derivedEntries,
554
+ derivedEntryLimitsPerSession: { ...SESSION_CACHE_ENTRY_LIMITS },
469
555
  };
470
556
  }
471
557
 
@@ -4,6 +4,7 @@ import { relative, resolve, sep } from 'path';
4
4
  import { performance } from 'perf_hooks';
5
5
  import type { ProjectKnowledgeSource } from '../../../packages/kernel/work/api/index';
6
6
  import { matchesExperienceApplicability, type ExperienceApplicability, type ExperienceRecord } from '../../../packages/kernel/memory/api/index';
7
+ import { memoryAddressKey, memoryAddressLabel, type ActivationPack } from '../../../packages/kernel/cognition/api/index';
7
8
  import { assertControlPlaneMetadataPayload } from '../control-plane/persistence/metadata-payload-policy';
8
9
  import { DEFAULT_CONTEXT_MAX_BYTES, DEFAULT_CONTEXT_MAX_ITEMS, DEFAULT_CONTEXT_MAX_TOKENS, MAX_CONTEXT_MAX_BYTES, MAX_CONTEXT_MAX_ITEMS, MAX_CONTEXT_MAX_TOKENS } from './context-plane';
9
10
 
@@ -16,9 +17,10 @@ export interface AssistantContextItem {
16
17
  kind: 'knowledge' | 'experience'; id: string; text: string; rank: number;
17
18
  sourceCoverage?: Array<{ sourceId: string; uri: string; digest: string; sourceRevision: string; modifiedAt: string }>;
18
19
  provenance: { uri: string; digest?: string; revision?: number; sourceRevision?: string; modifiedAt: string; startLine?: number; endLine?: number; evidenceRefs?: string[] };
20
+ activation?: { score: number; reasons: string[]; path: string[]; facets: string[]; concepts: string[] };
19
21
  }
20
22
  export interface AssistantContextResolution {
21
- schemaVersion: 1; projectId: string; items: AssistantContextItem[];
23
+ schemaVersion: 1; projectId?: string; items: AssistantContextItem[];
22
24
  gaps: string[]; missingRequiredSources: string[]; truncated: boolean; bytes: number; estimatedTokens: number;
23
25
  }
24
26
 
@@ -76,11 +78,12 @@ function budget(value: number | undefined, fallback: number, max: number): numbe
76
78
  }
77
79
 
78
80
  export function resolveAssistantContext(input: {
79
- projectId: string; query: string; sources: readonly ProjectKnowledgeSource[]; knowledge: KnowledgeSourcePort;
80
- experiences?: readonly ExperienceRecord[]; applicability?: ExperienceApplicability; now?: string;
81
+ projectId?: string; query: string; sources: readonly ProjectKnowledgeSource[]; knowledge: KnowledgeSourcePort;
82
+ experiences?: readonly ExperienceRecord[]; activation?: ActivationPack; applicability?: ExperienceApplicability; now?: string;
81
83
  maxItems?: number; maxBytes?: number; maxTokens?: number; maxReadBytes?: number; maxReadMs?: number; gaps?: readonly string[];
82
84
  }): AssistantContextResolution {
83
- if (!input.projectId.trim()) throw new Error('ASSISTANT_CONTEXT_PROJECT_REQUIRED');
85
+ const projectId = input.projectId?.trim() || undefined;
86
+ if (input.sources.length > 0 && !projectId) throw new Error('ASSISTANT_CONTEXT_PROJECT_REQUIRED_FOR_KNOWLEDGE');
84
87
  const now = Date.parse(input.now ?? new Date().toISOString());
85
88
  if (!Number.isFinite(now)) throw new Error('ASSISTANT_CONTEXT_TIME_INVALID');
86
89
  const maxItems = budget(input.maxItems, DEFAULT_CONTEXT_MAX_ITEMS, MAX_CONTEXT_MAX_ITEMS);
@@ -120,13 +123,23 @@ export function resolveAssistantContext(input: {
120
123
  if (source.required) missing.add(source.id);
121
124
  }
122
125
  }
126
+ const activatedAddresses = new Set<string>();
127
+ for (const activated of input.activation?.items ?? []) {
128
+ const memory = activated.memory;
129
+ const address = { scope: memory.scope, id: memory.id };
130
+ const kind: AssistantContextItem['kind'] = ['experience', 'outcome'].includes(memory.provenance.sourceKind) ? 'experience' : 'knowledge';
131
+ candidates.push({ kind, id: memoryAddressKey(address), text: `[memory:${memory.facets.join(',')}] ${memory.canonicalText}${memory.counterEvidenceRefs.length ? '\nCounterevidence: ' + memory.counterEvidenceRefs.join(', ') : ''}`, rank: Math.round(activated.score * 1000), activation: { score: activated.score, reasons: activated.reasons.map(reason => `${reason.signal}:${reason.detail}`), path: activated.activationPath, facets: memory.facets, concepts: memory.concepts }, provenance: { uri: memoryAddressLabel(address), revision: memory.revision, modifiedAt: memory.provenance.recordedAt, evidenceRefs: memory.provenance.evidenceRefs } });
132
+ activatedAddresses.add(memoryAddressKey(address));
133
+ }
134
+ if (input.activation) gaps.push(...input.activation.gaps.map(gap => `cognition:${gap}`));
123
135
  for (const record of (input.experiences ?? []).slice(0, 32)) {
136
+ if (activatedAddresses.has(memoryAddressKey({ scope: record.scope, id: record.id }))) continue;
124
137
  if (record.retractedAt || record.expiresAt && Date.parse(record.expiresAt) <= now || !matchesExperienceApplicability(record.applicability, input.applicability ?? {})) continue;
125
138
  // The caller supplies lineage-filtered records; explicit foreign projects are never admitted.
126
- if (record.scope.kind === 'project' && record.scope.id !== input.projectId) continue;
139
+ if (record.scope.kind === 'project' && (!projectId || record.scope.id !== projectId)) continue;
127
140
  const relevance = score(record.statement, terms);
128
141
  if (!relevance) continue;
129
- candidates.push({ kind: 'experience', id: record.id, text: `[${record.kind}] ${record.statement}${record.counterEvidenceRefs.length ? '\nCounterevidence: ' + record.counterEvidenceRefs.join(', ') : ''}`, rank: relevance * 100,
142
+ candidates.push({ kind: 'experience', id: memoryAddressKey({ scope: record.scope, id: record.id }), text: `[${record.kind}] ${record.statement}${record.counterEvidenceRefs.length ? '\nCounterevidence: ' + record.counterEvidenceRefs.join(', ') : ''}`, rank: relevance * 100,
130
143
  provenance: { uri: `experience:${record.scope.kind}:${record.scope.id}:${record.id}`, revision: record.revision, modifiedAt: record.recordedAt, evidenceRefs: record.evidenceRefs } });
131
144
  }
132
145
  candidates.sort((a, b) => b.rank - a.rank || b.provenance.modifiedAt.localeCompare(a.provenance.modifiedAt) || a.id.localeCompare(b.id));
@@ -145,7 +158,7 @@ export function resolveAssistantContext(input: {
145
158
  }
146
159
  items.push(item); bytes += size; estimatedTokens += tokens;
147
160
  }
148
- return { schemaVersion: 1, projectId: input.projectId, items, gaps: [...new Set(gaps)], missingRequiredSources: [...missing], truncated: gaps.some(g => /budget|limit/.test(g)), bytes, estimatedTokens };
161
+ return { schemaVersion: 1, ...(projectId ? { projectId } : {}), items, gaps: [...new Set(gaps)], missingRequiredSources: [...missing], truncated: gaps.some(g => /budget|limit/.test(g)), bytes, estimatedTokens };
149
162
  }
150
163
 
151
164
  export function renderAssistantContext(context: AssistantContextResolution): string {
@@ -1,14 +1,18 @@
1
1
  import { getRepository } from '../../cli/repositories/registry';
2
2
  import { configuredBrainRoot } from '../../cli/commands/brain-root';
3
- import { getWorkContract } from '../../../packages/kernel/work/api/index';
3
+ import { getWorkContract, semanticWorkState } from '../../../packages/kernel/work/api/index';
4
4
  import type { ScopeRef } from '../../../packages/kernel/identity/api/index';
5
- import { getControllerRoundRelay, getControllerSession } from '../../../packages/kernel/controller/api/index';
5
+ import { getControllerRoundRelay } from '../../../packages/kernel/controller/api/index';
6
6
  import { recordExperience, recordOutcomeObservation, queryExperiences, type ExperienceApplicability, type ExperienceDraft, type ExperienceRecord, type OutcomeObservation } from '../../../packages/kernel/memory/api/index';
7
- import { controllerExperienceStore, controllerOutcomeObservationStore, experienceScopesForWork, type ExperienceWriteIdentity } from '../control-plane/persistence/experience-store';
7
+ import { memoryUnitFromExperience, recordCognitiveMemory, recordCognitiveMemoryEdge, type CognitiveWriteAuthorityPort, type MemoryEdgeDraft, type MemoryProvenance, type MemoryUnit, type MemoryUnitDraft } from '../../../packages/kernel/cognition/api/index';
8
+ import { assertMemoryWriteAuthority, canonicalWorkflowEvidenceAvailable, cognitiveScopesForWork, controllerExperienceStore, controllerOutcomeObservationStore, experienceScopesForWork, type ExperienceWriteIdentity } from '../control-plane/persistence/experience-store';
9
+ import { cognitionMemoryStore } from '../control-plane/persistence/cognition-store';
8
10
  import { listControlPlaneRecords } from '../control-plane/persistence/sqlite-store';
9
11
  import { WORKFLOW_RUN_NAMESPACE, type WorkflowRunRecord } from '../control-plane/persistence/workflow-run-store';
10
12
  import { loadProjectEngineeringContract } from './project-engineering-contract';
11
13
  import { fileKnowledgeSourcePort, renderAssistantContext, resolveAssistantContext, type AssistantContextResolution } from './assistant-context';
14
+ import { applyCognitiveSkillCanary } from './cognitive-skill-canary';
15
+ import { cognitiveUsageFeedbackForContext, resolveCognitiveAttention } from './cognitive-attention';
12
16
 
13
17
  function cleanApplicability(value: ExperienceApplicability | undefined): ExperienceApplicability | undefined {
14
18
  if (!value) return undefined;
@@ -60,26 +64,46 @@ export function prepareAssistantWorkContext(input: {
60
64
  const repository = getRepository(input.repoId, input.controllerHome);
61
65
  const repoRoot = repository.checkouts.find(checkout => checkout.checkoutId === work.checkoutId)?.canonicalRoot ?? repository.canonicalRoot;
62
66
  // Semantic Project identity comes from Work lineage/portable placement. The engineering contract is an optional knowledge-source contract, not identity authority.
63
- const scopes = experienceScopesForWork(work, input.controllerHome);
64
- const boundProject = scopes.find(scope => scope.kind === 'project')?.id;
65
- // Project knowledge is advisory enrichment. A Work that has not yet been
66
- // bound to a Project must still be able to claim and continue its durable
67
- // ControllerRound; missing optional context is not a lifecycle blocker.
68
- if (!boundProject) return undefined;
69
- const loaded = loadProjectEngineeringContract({ repoRoot, sourceRevision: 'working-tree', now: () => input.now ?? new Date().toISOString() });
70
- if (loaded.status === 'ready' && boundProject !== loaded.contract.projectId) throw new Error('ASSISTANT_CONTEXT_PROJECT_BINDING_MISMATCH');
67
+ const experienceScopes = experienceScopesForWork(work, input.controllerHome);
68
+ const cognitiveScopes = cognitiveScopesForWork(work, input.controllerHome);
69
+ const boundProject = experienceScopes.find(scope => scope.kind === 'project')?.id;
70
+ // Project knowledge is optional enrichment. Generic cognition authority is
71
+ // scoped by Work lineage and must remain available even when no Project is bound.
72
+ const loaded = boundProject
73
+ ? loadProjectEngineeringContract({ repoRoot, sourceRevision: 'working-tree', now: () => input.now ?? new Date().toISOString() })
74
+ : undefined;
75
+ if (loaded?.status === 'ready' && boundProject !== loaded.contract.projectId) throw new Error('ASSISTANT_CONTEXT_PROJECT_BINDING_MISMATCH');
71
76
  const now = input.now ?? new Date().toISOString();
72
- const sources = loaded.status === 'ready' ? loaded.contract.knowledgeSources ?? [] : [];
77
+ const sources = loaded?.status === 'ready' ? loaded.contract.knowledgeSources ?? [] : [];
73
78
  const applicability = effectiveApplicability({
74
79
  explicit: input.applicability,
75
80
  declared: sources.map(source => source.applicability),
76
81
  published: publicationApplicability(input.controllerHome, work.workId),
77
82
  });
78
- const experiences = queryExperiences(controllerExperienceStore({ controllerHome: input.controllerHome, repoId: input.repoId, ...(input.now ? { now: () => input.now! } : {}) }), { scopes, applicability: applicability.value, now });
79
- return resolveAssistantContext({ projectId: boundProject, query: input.query ?? work.objective,
83
+ const experiences = queryExperiences(controllerExperienceStore({ controllerHome: input.controllerHome, repoId: input.repoId, ...(input.now ? { now: () => input.now! } : {}) }), { scopes: experienceScopes, applicability: applicability.value, now });
84
+ const query = input.query ?? work.objective;
85
+ const usageFeedback = cognitiveUsageFeedbackForContext({
86
+ controllerHome: input.controllerHome,
87
+ repoId: input.repoId,
88
+ scopes: cognitiveScopes,
89
+ ...(boundProject ? { projectId: boundProject } : {}),
90
+ });
91
+ const transientMemories = experiences.records.map(memoryUnitFromExperience);
92
+ const activation = resolveCognitiveAttention({
93
+ controllerHome: input.controllerHome,
94
+ scopes: cognitiveScopes,
95
+ query,
96
+ now,
97
+ maxItems: 6,
98
+ maxBytes: 12 * 1024,
99
+ transientMemories,
100
+ usageFeedback,
101
+ });
102
+ const context = resolveAssistantContext({ ...(boundProject ? { projectId: boundProject } : {}), query,
80
103
  sources,
81
104
  knowledge: fileKnowledgeSourcePort({ repoRoot, brainRoot: configuredBrainRoot(), sourceRevision: 'working-tree' }),
82
- experiences: experiences.records, gaps: [...experiences.gaps, ...(applicability.conflict ? ['assistant_context_applicability_conflict'] : [])], applicability: applicability.value, now });
105
+ experiences: experiences.records, activation, gaps: [...experiences.gaps, ...(applicability.conflict ? ['assistant_context_applicability_conflict'] : [])], applicability: applicability.value, now });
106
+ return applyCognitiveSkillCanary(context);
83
107
  }
84
108
 
85
109
  export function renderAssistantWorkContext(input: Parameters<typeof prepareAssistantWorkContext>[0]): string | undefined {
@@ -94,25 +118,63 @@ export function renderAssistantWorkContext(input: Parameters<typeof prepareAssis
94
118
 
95
119
  export type ControllerOutcomeObservationDraft = Omit<OutcomeObservation, 'schemaVersion' | 'sourceWorkId' | 'sourceRoundId'>;
96
120
  export type ControllerExperienceDraft = Omit<ExperienceDraft, 'sourceWorkId' | 'sourceRoundId'>;
121
+ export type ControllerMemoryDraft = Omit<MemoryUnitDraft, 'provenance' | 'validFrom'> & {
122
+ provenance: Omit<MemoryProvenance, 'sourceWorkId' | 'sourceRoundId' | 'recordedAt'>;
123
+ validFrom?: string;
124
+ };
125
+ export type ControllerMemoryEdgeDraft = Omit<MemoryEdgeDraft, 'sourceWorkId' | 'sourceRoundId' | 'recordedAt'> & { recordedAt?: string };
97
126
 
98
127
  function learningStoreOptions(input: { controllerHome: string; repoId: string; identity: ExperienceWriteIdentity; now?: string }) {
99
128
  return { controllerHome: input.controllerHome, repoId: input.repoId, identity: input.identity, ...(input.now ? { now: () => input.now! } : {}) };
100
129
  }
101
130
 
102
- function currentLearningRound(input: { controllerHome: string; repoId: string; identity: ExperienceWriteIdentity; now?: string }): { sourceWorkId: string; sourceRoundId: string } {
103
- const store = learningStoreOptions(input);
104
- const relay = getControllerRoundRelay(store, input.identity.workId);
105
- if (relay) {
106
- if (relay.status !== 'claimed' || relay.authorityId !== input.identity.authorityId) throw new Error('LEARNING_LOOP_CONTROLLER_ROUND_AUTHORITY_MISMATCH');
107
- return { sourceWorkId: input.identity.workId, sourceRoundId: `${relay.relayScopeId}:${relay.roundCount}` };
108
- }
109
- const owner = getControllerSession(store, input.identity.workId);
110
- if (!owner || owner.controllerId !== input.identity.controllerId || !owner.claimGeneration) throw new Error('LEARNING_LOOP_CONTROLLER_CLAIM_REQUIRED');
111
- return { sourceWorkId: input.identity.workId, sourceRoundId: `${input.identity.workId}:${owner.claimGeneration}` };
131
+ function currentLearningProvenance(input: { controllerHome: string; repoId: string; identity: ExperienceWriteIdentity; now?: string }): { sourceWorkId: string; sourceRoundId: string } {
132
+ const work = getWorkContract({ controllerHome: input.controllerHome, repoId: input.repoId }, input.identity.workId);
133
+ if (!work || semanticWorkState(work) !== 'open') throw new Error('LEARNING_LOOP_WORK_NOT_ACTIVE');
134
+ const revision = Number(work.semanticRevision);
135
+ return {
136
+ sourceWorkId: work.workId,
137
+ // sourceRoundId is retained as a storage compatibility field. It now records
138
+ // Work semantic provenance rather than granting ControllerRound authority.
139
+ sourceRoundId: `work:${work.workId}:r${Number.isSafeInteger(revision) && revision > 0 ? revision : 'legacy'}`,
140
+ };
141
+ }
142
+
143
+ function controllerCognitionAuthority(input: { controllerHome: string; repoId: string; identity: ExperienceWriteIdentity; now?: string }): CognitiveWriteAuthorityPort {
144
+ const options = learningStoreOptions(input);
145
+ const requireLineage = (sourceWorkId: string | undefined, sourceRoundId: string | undefined, scope: ScopeRef) => {
146
+ if (!sourceWorkId || !sourceRoundId) throw new Error('COGNITION_CONTROLLER_LINEAGE_REQUIRED');
147
+ assertMemoryWriteAuthority(options, scope, sourceWorkId, sourceRoundId);
148
+ };
149
+ return {
150
+ assertMemoryWrite(memory) { requireLineage(memory.provenance.sourceWorkId, memory.provenance.sourceRoundId, memory.scope); },
151
+ assertEdgeWrite(edge) { requireLineage(edge.sourceWorkId, edge.sourceRoundId, edge.scope); },
152
+ evidenceAvailable(ref, scope, sourceWorkId) { return Boolean(sourceWorkId && canonicalWorkflowEvidenceAvailable(options, ref, scope, sourceWorkId)); },
153
+ };
154
+ }
155
+
156
+ export function recordControllerMemory(input: { controllerHome: string; repoId: string; identity: ExperienceWriteIdentity; draft: ControllerMemoryDraft; now?: string }): MemoryUnit {
157
+ const lineage = currentLearningProvenance(input);
158
+ const recordedAt = input.now ?? new Date().toISOString();
159
+ return recordCognitiveMemory(cognitionMemoryStore(input.controllerHome), controllerCognitionAuthority(input), {
160
+ ...input.draft,
161
+ provenance: { ...input.draft.provenance, sourceWorkId: lineage.sourceWorkId, sourceRoundId: lineage.sourceRoundId, recordedAt },
162
+ validFrom: input.draft.validFrom ?? recordedAt,
163
+ });
164
+ }
165
+
166
+ export function recordControllerMemoryEdge(input: { controllerHome: string; repoId: string; identity: ExperienceWriteIdentity; draft: ControllerMemoryEdgeDraft; now?: string }) {
167
+ const lineage = currentLearningProvenance(input);
168
+ return recordCognitiveMemoryEdge(cognitionMemoryStore(input.controllerHome), controllerCognitionAuthority(input), {
169
+ ...input.draft,
170
+ sourceWorkId: lineage.sourceWorkId,
171
+ sourceRoundId: lineage.sourceRoundId,
172
+ recordedAt: input.draft.recordedAt ?? input.now ?? new Date().toISOString(),
173
+ });
112
174
  }
113
175
 
114
176
  export function recordControllerOutcome(input: { controllerHome: string; repoId: string; identity: ExperienceWriteIdentity; draft: ControllerOutcomeObservationDraft; now?: string }): OutcomeObservation {
115
- const lineage = currentLearningRound(input);
177
+ const lineage = currentLearningProvenance(input);
116
178
  return recordOutcomeObservation(controllerOutcomeObservationStore(learningStoreOptions(input)), {
117
179
  ...input.draft, schemaVersion: 1, sourceWorkId: lineage.sourceWorkId, sourceRoundId: lineage.sourceRoundId,
118
180
  }, input.now);
@@ -131,7 +193,7 @@ function outcomeEvidenceWithObservedMetric(input: { controllerHome: string; repo
131
193
  }
132
194
 
133
195
  export function recordControllerExperience(input: { controllerHome: string; repoId: string; identity: ExperienceWriteIdentity; draft: ControllerExperienceDraft; qualityAdjustmentFingerprint?: string; now?: string }): ExperienceRecord {
134
- const lineage = currentLearningRound(input);
196
+ const lineage = currentLearningProvenance(input);
135
197
  let evidenceRefs = [...input.draft.evidenceRefs];
136
198
  if (input.qualityAdjustmentFingerprint) {
137
199
  const relay = getControllerRoundRelay(learningStoreOptions(input), input.identity.workId);