@moretea-labs/forge 1.8.0 → 1.8.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (695) hide show
  1. package/AGENTS.md +73 -7
  2. package/CHANGELOG.md +34 -0
  3. package/CLAUDE.md +17 -2
  4. package/CONTRIBUTING.md +3 -2
  5. package/README.en.md +24 -3
  6. package/README.md +10 -6
  7. package/README.zh-CN.md +5 -3
  8. package/THIRD_PARTY_NOTICES.md +1 -2
  9. package/adapters/chatgpt/browser-delivery-host.ts +7 -1
  10. package/adapters/chatgpt/browser-delivery-runtime.ts +531 -56
  11. package/adapters/chatgpt/controller-binding-store.ts +101 -22
  12. package/adapters/chatgpt/controller-round-host.ts +15 -25
  13. package/adapters/chatgpt/controller-round-settlement-store.ts +58 -4
  14. package/adapters/chatgpt/provider-delivery.ts +229 -2
  15. package/adapters/chatgpt/work-conversation-binding-store.ts +99 -54
  16. package/adapters/computer/chatgpt-extension-target.ts +708 -0
  17. package/adapters/computer/chrome-extension/background.js +541 -0
  18. package/adapters/computer/chrome-extension/content.js +402 -0
  19. package/adapters/computer/chrome-extension/core.js +24 -0
  20. package/adapters/computer/chrome-extension/manifest.json +32 -0
  21. package/adapters/computer/desktop-operator-discovery.ts +11 -31
  22. package/adapters/computer/desktop-operator-provider.ts +18 -6
  23. package/adapters/computer/interaction-target-authority.ts +178 -24
  24. package/adapters/mcp/access-mode.ts +18 -39
  25. package/adapters/mcp/auth.ts +2 -7
  26. package/adapters/mcp/instructions.ts +6 -5
  27. package/adapters/mcp/multi-repository.ts +10 -47
  28. package/adapters/mcp/oauth.ts +73 -0
  29. package/adapters/mcp/paths.ts +4 -1
  30. package/adapters/mcp/runtime-gateway/bounded-result-runtime.ts +62 -0
  31. package/adapters/mcp/runtime-gateway/cognition-settlement.ts +201 -0
  32. package/adapters/mcp/runtime-gateway/context-adapter.ts +490 -113
  33. package/adapters/mcp/runtime-gateway/context-pack-sidecar.ts +83 -0
  34. package/adapters/mcp/runtime-gateway/controller-authority-adapter.ts +20 -5
  35. package/adapters/mcp/runtime-gateway/core-capability-adapter.ts +258 -0
  36. package/adapters/mcp/runtime-gateway/engineering-preconditions.ts +10 -27
  37. package/adapters/mcp/runtime-gateway/engineering-tool-contract.ts +15 -0
  38. package/adapters/mcp/runtime-gateway/execution-tools.ts +14 -54
  39. package/adapters/mcp/runtime-gateway/gateway-execution-adapter.ts +2 -1
  40. package/adapters/mcp/runtime-gateway/plugin-adapter.ts +132 -47
  41. package/adapters/mcp/runtime-gateway/process-tools.ts +173 -23
  42. package/adapters/mcp/runtime-gateway/protected-computer-adapter.ts +16 -4
  43. package/adapters/mcp/runtime-gateway/recovery-adapter.ts +69 -52
  44. package/adapters/mcp/runtime-gateway/repository-compat-adapter.ts +4 -35
  45. package/adapters/mcp/runtime-gateway/result-adapter.ts +10 -4
  46. package/adapters/mcp/runtime-gateway/router.ts +19 -507
  47. package/adapters/mcp/runtime-gateway/routing-policy.ts +506 -0
  48. package/adapters/mcp/runtime-gateway/runtime-observation-adapter.ts +15 -66
  49. package/adapters/mcp/runtime-gateway/runtime-readiness-observation.ts +218 -0
  50. package/adapters/mcp/runtime-gateway/runtime-tool-definitions.ts +123 -178
  51. package/adapters/mcp/runtime-gateway/runtime-tools.ts +11 -5
  52. package/adapters/mcp/runtime-gateway/scheduler-adapter.ts +37 -1
  53. package/adapters/mcp/runtime-gateway/shared-adapter.ts +20 -0
  54. package/adapters/mcp/runtime-gateway/status-inbox-adapter.ts +416 -270
  55. package/adapters/mcp/runtime-gateway/typescript-navigation-sidecar.ts +140 -0
  56. package/adapters/mcp/runtime-gateway/work-adapter.ts +262 -3123
  57. package/adapters/mcp/runtime-gateway/work-controller-operations.ts +257 -0
  58. package/adapters/mcp/runtime-gateway/work-detail-projection.ts +60 -0
  59. package/adapters/mcp/runtime-gateway/work-input-wire-migration.ts +229 -0
  60. package/adapters/mcp/runtime-gateway/work-learning-operations.ts +145 -0
  61. package/adapters/mcp/runtime-gateway/work-list-projection.ts +38 -0
  62. package/adapters/mcp/runtime-gateway/work-plan-operations.ts +382 -0
  63. package/adapters/mcp/runtime-gateway/work-repair-adapter.ts +308 -0
  64. package/adapters/mcp/runtime-gateway/work-requirement-operations.ts +148 -0
  65. package/adapters/mcp/runtime-gateway/work-semantic-operations.ts +320 -0
  66. package/adapters/mcp/runtime-gateway/work-workflow-operations.ts +113 -0
  67. package/adapters/mcp/runtime-gateway/workflow-supervisor-adapter.ts +180 -0
  68. package/adapters/mcp/server.ts +91 -26
  69. package/adapters/mcp/setup.ts +5 -13
  70. package/adapters/mcp/tool-mapping/access-tools.ts +0 -6
  71. package/adapters/mcp/tool-mapping/legacy-tool-service.ts +703 -3092
  72. package/adapters/mcp/tool-mapping/post-finalize-work-attribution.ts +5 -10
  73. package/adapters/mcp/tool-mapping/repository-tools.ts +170 -213
  74. package/adapters/mcp/toolset-names.ts +11 -37
  75. package/adapters/mcp/toolset.ts +19 -92
  76. package/{src/cli → adapters}/mcp/transports/AGENTS.md +5 -5
  77. package/{src/cli → adapters}/mcp/transports/CLAUDE.md +5 -5
  78. package/adapters/mcp/transports/http-observation.ts +377 -0
  79. package/adapters/mcp/transports/http-post-lifecycle.ts +19 -0
  80. package/adapters/mcp/transports/http.ts +200 -683
  81. package/adapters/mcp/transports/oauth-http.ts +322 -0
  82. package/adapters/mcp/transports/session-registry.ts +6 -0
  83. package/adapters/mcp/tunnels/openai-secure-tunnel.ts +89 -5
  84. package/adapters/mcp/types.ts +0 -6
  85. package/assets/hooks/lib/session-state.sh +0 -38
  86. package/assets/hooks/post-bash.sh +1 -1
  87. package/assets/hooks/post-tool-observer.sh +0 -5
  88. package/assets/hooks/prompt-guard.sh +0 -55
  89. package/assets/partials/04-project-structure.partial.md +1 -1
  90. package/assets/partials/07-footer.partial.md +1 -1
  91. package/assets/partials-agents/02-operating-mode.partial.md +1 -1
  92. package/assets/partials-agents/08-deep-docs.partial.md +1 -1
  93. package/assets/plugin-registry.v1.json +6 -4
  94. package/assets/reference-configs/agentic-development-flow.md +26 -1
  95. package/assets/reference-configs/external-tooling.md +0 -76
  96. package/assets/reference-configs/global-working-rules.md +19 -0
  97. package/assets/reference-configs/release-deploy.md +1 -1
  98. package/assets/templates/helpers/architecture-queue.sh +1 -1
  99. package/assets/templates/helpers/check-agent-tooling.sh +1 -327
  100. package/assets/templates/helpers/check-task-workflow.sh +1 -1
  101. package/assets/templates/helpers/ensure-task-workflow.sh +0 -14
  102. package/assets/templates/helpers/migrate-project-template.sh +2 -2
  103. package/assets/workflow-contract.v1.json +0 -2
  104. package/docs/README.md +5 -2
  105. package/docs/architecture/CURRENT.md +205 -51
  106. package/docs/architecture/decisions/20260803-release-identity-binding-and-exit-policy.md +14 -5
  107. package/docs/architecture/decisions/20260823-immediate-controller-relay.md +6 -3
  108. package/docs/architecture/decisions/20260904-ios-device-migration-baseline.md +42 -0
  109. package/docs/architecture/decisions/20260907-assistant-learning-loop.md +2 -0
  110. package/docs/architecture/decisions/20260907-controller-round-transition-policy.md +19 -4
  111. package/docs/architecture/decisions/20260916-workflow-supervisor-authority.md +249 -0
  112. package/docs/architecture/decisions/20260917-cognitive-memory-foundation.md +82 -0
  113. package/docs/architecture/decisions/20260918-stable-candidate-release-lifecycle.md +234 -0
  114. package/docs/architecture/decisions/20260919-autonomous-work-liveness.md +62 -0
  115. package/docs/architecture/decisions/20260924-thin-semantic-working-context.md +74 -0
  116. package/docs/architecture/decisions/20261001-supervisor-turn-authority.md +342 -0
  117. package/docs/architecture/decisions/20261005-forge-v3-desktop-client-boundary.md +77 -0
  118. package/docs/architecture/decisions/20261009-exact-code-context-discovery.md +19 -0
  119. package/docs/architecture/decisions/20261009-generated-xcode-cache-retention.md +37 -0
  120. package/docs/architecture/decisions/20261011-autonomous-continuation-convergence.md +597 -0
  121. package/docs/architecture/decisions/20261017-edit-session-finalization-reconciliation.md +17 -0
  122. package/docs/architecture/decisions/20261019-retire-host-skills.md +16 -0
  123. package/docs/architecture/diagrams/agentic-dev-plugin-architecture.html +1 -1
  124. package/docs/architecture/domains/public-surface.md +3 -5
  125. package/docs/architecture/domains/verification.md +6 -5
  126. package/docs/architecture/domains/workflow-engine.md +6 -0
  127. package/docs/architecture/modules/controller-runtime/transport-lifecycle.md +3 -3
  128. package/docs/architecture/requests/2026-09-04-computer-plugin-workflow-taxonomy.md +4 -4
  129. package/docs/architecture/reviews/20261015-code-search-runtime-acceptance.md +75 -0
  130. package/docs/forge-plugin-management.md +16 -4
  131. package/docs/operations/controller-browser-plugin.md +23 -0
  132. package/docs/operations/controller-performance-and-502.md +17 -0
  133. package/docs/operations/controller-reliability-runbook.md +2 -2
  134. package/docs/operations/features.md +6 -7
  135. package/docs/operations/features.zh-CN.md +1 -1
  136. package/docs/operations/github-repository.md +4 -4
  137. package/docs/operations/github-semantic-release-projection.md +20 -0
  138. package/docs/operations/homebrew.md +2 -2
  139. package/docs/operations/mcp-tool-exposure.md +13 -52
  140. package/docs/operations/releasing.md +2 -0
  141. package/docs/operations/runtime-performance-diagnostics.md +8 -0
  142. package/docs/operations/standalone-disaster-recovery.md +15 -7
  143. package/docs/tutorials/01-install-and-start.zh-CN.md +1 -1
  144. package/docs/tutorials/03-first-repository-task.md +2 -0
  145. package/docs/wiki/Computer-and-Plugins.md +78 -0
  146. package/docs/wiki/Computer-and-Plugins.zh-CN.md +88 -0
  147. package/docs/wiki/Home.md +16 -2
  148. package/docs/wiki/Implementation.md +25 -13
  149. package/docs/wiki/Installation.md +28 -32
  150. package/docs/wiki/Integrations.md +4 -0
  151. package/docs/wiki/Quick-Start.md +35 -22
  152. package/docs/wiki/Releases-and-Upgrades.md +15 -25
  153. package/docs/wiki/_Sidebar.md +5 -1
  154. package/package.json +25 -25
  155. package/packages/kernel/cognition/api/index.ts +6 -0
  156. package/packages/kernel/cognition/application/activation-service.ts +451 -0
  157. package/packages/kernel/cognition/application/consolidation-service.ts +185 -0
  158. package/packages/kernel/cognition/application/legacy-experience-adapter.ts +38 -0
  159. package/packages/kernel/cognition/application/memory-service.ts +64 -0
  160. package/packages/kernel/cognition/domain/learning.ts +106 -0
  161. package/packages/kernel/cognition/domain/memory.ts +254 -0
  162. package/packages/kernel/controller/api/index.ts +1 -0
  163. package/packages/kernel/controller/application/continuation-service.ts +281 -0
  164. package/packages/kernel/controller/application/controller-round-service.ts +12 -0
  165. package/packages/kernel/controller/domain/controller-round-transition-policy.ts +242 -21
  166. package/packages/kernel/controller/domain/controller-round.ts +4 -1
  167. package/packages/kernel/controller/domain/execution-quality.ts +3 -1
  168. package/packages/kernel/controller/infrastructure/controller-round-store.ts +689 -103
  169. package/packages/kernel/controller/infrastructure/controller-session-store.ts +348 -97
  170. package/packages/kernel/controller/ports/controller-host.ts +2 -0
  171. package/packages/kernel/identity/api/index.ts +10 -0
  172. package/packages/kernel/identity/domain/activity-projection.ts +43 -0
  173. package/packages/kernel/identity/domain/capability-broker.ts +60 -0
  174. package/packages/kernel/identity/domain/grant.ts +72 -0
  175. package/packages/kernel/identity/domain/owned-resource.ts +116 -0
  176. package/packages/kernel/identity/domain/user-request.ts +93 -0
  177. package/packages/kernel/identity/infrastructure/activity-projection-store.ts +87 -0
  178. package/packages/kernel/identity/infrastructure/capability-broker.ts +81 -0
  179. package/packages/kernel/identity/infrastructure/grant-store.ts +284 -0
  180. package/packages/kernel/identity/infrastructure/owned-resource-store.ts +259 -0
  181. package/packages/kernel/identity/infrastructure/user-request-store.ts +182 -0
  182. package/packages/kernel/scheduler/api/index.ts +0 -2
  183. package/packages/kernel/scheduler/application/eligibility.ts +4 -1
  184. package/packages/kernel/scheduler/application/schedule-service.ts +3 -0
  185. package/packages/kernel/scheduler/application/settlement.ts +0 -15
  186. package/packages/kernel/scheduler/domain/schedule.ts +87 -0
  187. package/packages/kernel/scheduler/infrastructure/schedule-store.ts +166 -143
  188. package/packages/kernel/work/api/index.ts +3 -2
  189. package/packages/kernel/work/application/work-service.ts +18 -42
  190. package/packages/kernel/work/domain/current-task-lineage.ts +104 -0
  191. package/packages/kernel/work/domain/engineering-design.ts +10 -5
  192. package/packages/kernel/work/domain/engineering-profile.ts +8 -12
  193. package/packages/kernel/work/domain/evaluation-promotion-receipt.ts +186 -0
  194. package/packages/kernel/work/domain/execution-concurrency.ts +19 -26
  195. package/packages/kernel/work/domain/execution-snapshot.ts +0 -31
  196. package/packages/kernel/work/domain/implementation-review.ts +14 -331
  197. package/packages/kernel/work/domain/objective-graph.ts +119 -0
  198. package/packages/kernel/work/domain/project-engineering-contract.ts +23 -1
  199. package/packages/kernel/work/domain/repository-completion-receipt.ts +1 -1
  200. package/packages/kernel/work/domain/state-machine.ts +34 -65
  201. package/packages/kernel/work/domain/types.ts +57 -51
  202. package/packages/kernel/work/infrastructure/work-contract-store.ts +847 -729
  203. package/packages/kernel/work/ports/work-contract-store.ts +5 -2
  204. package/packages/plugin-runtime/browser/provider-registry.ts +12 -36
  205. package/packages/plugin-runtime/browser/session-authority.ts +2 -1
  206. package/packages/plugin-runtime/computer/chatgpt-identity.ts +24 -0
  207. package/packages/plugin-runtime/computer/conversation-target.ts +153 -0
  208. package/packages/plugin-runtime/computer/index.ts +2 -0
  209. package/packages/plugin-runtime/computer/target-authority.ts +26 -1
  210. package/packages/plugin-runtime/external/unix-jsonl-transport.ts +142 -18
  211. package/packages/protocols/computer/contract.ts +27 -1
  212. package/scripts/activate-source-baseline.ts +7 -9
  213. package/scripts/assemble-template.ts +11 -72
  214. package/scripts/canary-controller-semantic-wait.ts +12 -24
  215. package/scripts/check-mcp-compatibility.ts +94 -201
  216. package/scripts/check-package-identity.mjs +0 -5
  217. package/scripts/check-runtime-architecture.mjs +921 -239
  218. package/scripts/forge-local-recovery-helper.mjs +93 -15
  219. package/scripts/init-project.sh +0 -46
  220. package/scripts/install-ios-hid-toolchain.sh +60 -0
  221. package/scripts/install-standalone-recovery.ts +1 -1
  222. package/scripts/lib/project-init-lib.sh +6 -3
  223. package/scripts/migrate-windows-wsl-controller-home.ts +2 -0
  224. package/scripts/open-source-audit-allowlist.txt +1 -3
  225. package/scripts/run-bounded-command.mjs +5 -0
  226. package/scripts/run-governed-gate.ts +2 -1
  227. package/scripts/run-mobile-monitor-bridge.ts +0 -1
  228. package/scripts/smoke-control-plane-failure-domain.ts +94 -0
  229. package/scripts/smoke-ios-physical-device.ts +38 -10
  230. package/scripts/smoke-mcp-http-runtime.ts +12 -8
  231. package/scripts/smoke-mcp-tool-surface.ts +27 -41
  232. package/scripts/smoke-runtime-recovery.ts +12 -43
  233. package/scripts/smoke-schedule-engine.ts +23 -15
  234. package/scripts/smoke-unattended-transport-recovery.ts +223 -0
  235. package/scripts/smoke-user-request-continuation-restart.ts +232 -0
  236. package/scripts/smoke-workflow-supervisor-chrome-adapter.ts +95 -0
  237. package/scripts/smoke-workflow-supervisor-process-restart.ts +276 -0
  238. package/scripts/smoke-workflow-supervisor-restart-recovery.ts +150 -0
  239. package/scripts/smoke-workflow-supervisor.ts +103 -0
  240. package/scripts/sync-generated-authority.mjs +0 -1
  241. package/scripts/verify-forge-runtime.sh +2 -1
  242. package/src/cli/agent-jobs/executor-health.ts +12 -35
  243. package/src/cli/agent-jobs/integration.ts +20 -51
  244. package/src/cli/agent-jobs/job-manager.ts +7 -3
  245. package/src/cli/chatgpt-browser/file-policy.ts +2 -2
  246. package/src/cli/commands/brain-assistant.ts +27 -13
  247. package/src/cli/commands/brain.ts +13 -15
  248. package/src/cli/commands/chatgpt.ts +1 -163
  249. package/src/cli/commands/doctor.ts +1 -143
  250. package/src/cli/commands/global-runtime.ts +3 -196
  251. package/src/cli/commands/init-hook.ts +6 -23
  252. package/src/cli/commands/init.ts +3 -252
  253. package/src/cli/commands/mcp.ts +0 -5
  254. package/src/cli/commands/prompt-guard-decision.ts +0 -2
  255. package/src/cli/commands/recovery.ts +137 -135
  256. package/src/cli/commands/repository.ts +17 -1
  257. package/src/cli/commands/runtime.ts +3 -3
  258. package/src/cli/commands/setup-execution.ts +41 -0
  259. package/src/cli/commands/setup-profile.ts +8 -0
  260. package/src/cli/controller/check-runner.ts +13 -2
  261. package/src/cli/controller/completion-backlog.ts +3 -3
  262. package/src/cli/controller/completion-orchestrator.ts +5 -44
  263. package/src/cli/controller/completion-target.ts +3 -72
  264. package/src/cli/controller/composite-operations.ts +1 -1
  265. package/src/cli/controller/context/instruction-context.ts +1 -1
  266. package/src/cli/controller/context/known-paths.ts +2 -2
  267. package/src/cli/controller/context/query-planning.ts +11 -4
  268. package/src/cli/controller/context/rule-resolution.ts +2 -2
  269. package/src/cli/controller/context/source-materializer.ts +83 -102
  270. package/src/cli/controller/context/structural-provider.ts +84 -0
  271. package/src/cli/controller/context/structural.ts +6 -6
  272. package/src/cli/controller/context/types.ts +8 -9
  273. package/src/cli/controller/context-pack.ts +107 -84
  274. package/src/cli/controller/execution-completion.ts +4 -7
  275. package/src/cli/controller/execution-policy.ts +36 -153
  276. package/src/cli/controller/governance.ts +2 -3
  277. package/src/cli/controller/issue-store.ts +4 -99
  278. package/src/cli/controller/launch-agents.ts +59 -18
  279. package/src/cli/controller/operational-plan.ts +25 -52
  280. package/src/cli/controller/runtime-config.ts +5 -1
  281. package/src/cli/controller/stuck-state-migration.ts +2 -3
  282. package/src/cli/controller/systemd-user.ts +42 -10
  283. package/src/cli/editing/edit-session.ts +18 -12
  284. package/src/cli/github/github.ts +4 -4
  285. package/src/cli/github/semantic-projection.ts +174 -0
  286. package/src/cli/hook/prompt-intents.ts +0 -9
  287. package/src/cli/index.ts +1 -43
  288. package/src/cli/local-bridge/connector-freshness.ts +1 -12
  289. package/src/cli/local-bridge/console-automations.ts +19 -14
  290. package/src/cli/local-bridge/console-view-models.ts +4 -13
  291. package/src/cli/local-bridge/facade-api.ts +64 -193
  292. package/src/cli/local-bridge/server.ts +24 -147
  293. package/src/cli/local-bridge/types.ts +0 -1
  294. package/src/cli/mcp/oauth-client-retirement.ts +74 -0
  295. package/src/cli/repositories/command-classifier.ts +0 -9
  296. package/src/cli/repositories/command-executor.ts +29 -23
  297. package/src/cli/repositories/command-scope.ts +37 -18
  298. package/src/cli/repositories/controller-home.ts +48 -0
  299. package/src/cli/repositories/ephemeral-workspace.ts +20 -30
  300. package/src/cli/repositories/git-command-executor.ts +2 -2
  301. package/src/cli/repositories/locks.ts +20 -0
  302. package/src/cli/repositories/registry.ts +79 -12
  303. package/src/cli/repositories/safe-patch.ts +2 -12
  304. package/src/cli/repositories/structured-git.ts +101 -5
  305. package/src/cli/repository/inspector.ts +185 -343
  306. package/src/cli/repository/session-cache.ts +92 -6
  307. package/src/effects/process-runner.ts +17 -1
  308. package/src/runtime/context/assistant-context.ts +20 -7
  309. package/src/runtime/context/assistant-work-context.ts +89 -27
  310. package/src/runtime/context/automatic-learning.ts +565 -0
  311. package/src/runtime/context/cognitive-attention.ts +173 -0
  312. package/src/runtime/context/cognitive-skill-canary.ts +158 -0
  313. package/src/runtime/context/context-closure.ts +46 -9
  314. package/src/runtime/context/context-pack-process.ts +103 -0
  315. package/src/runtime/context/context-plane.ts +1 -9
  316. package/src/runtime/context/direct-controller-learning.ts +298 -0
  317. package/src/runtime/context/generic-lsp-provider.ts +1 -1
  318. package/src/runtime/context/semantic-navigation-contract.ts +16 -0
  319. package/src/runtime/context/semantic-navigation.ts +7 -35
  320. package/src/runtime/context/typescript-navigation-process.ts +145 -0
  321. package/src/runtime/context/typescript-navigation.ts +89 -3
  322. package/src/runtime/control-plane/cleanup-artifact-retention.ts +215 -12
  323. package/src/runtime/control-plane/concurrency/work-execution-concurrency.ts +9 -47
  324. package/src/runtime/control-plane/execution/controller-authority-recovery.ts +34 -4
  325. package/src/runtime/control-plane/execution/edit-validation-coordinator.ts +29 -20
  326. package/src/runtime/control-plane/execution/execution-identity.ts +23 -3
  327. package/src/runtime/control-plane/execution/repository-work-attribution.ts +7 -30
  328. package/src/runtime/control-plane/execution/retained-work-resume.ts +206 -199
  329. package/src/runtime/control-plane/execution/session-store.ts +31 -1
  330. package/src/runtime/control-plane/execution/validation.ts +6 -8
  331. package/src/runtime/control-plane/execution/work-authority-reconciler.ts +13 -42
  332. package/src/runtime/control-plane/execution/work-check-evidence.ts +137 -0
  333. package/src/runtime/control-plane/execution/work-completion-authority.ts +30 -85
  334. package/src/runtime/control-plane/execution/work-delivery-service.ts +616 -0
  335. package/src/runtime/control-plane/execution/work-evidence-policy.ts +12 -50
  336. package/src/runtime/control-plane/execution/work-execution-support.ts +50 -149
  337. package/src/runtime/control-plane/execution/work-handle-authority.ts +197 -110
  338. package/src/runtime/control-plane/execution/work-handle-store.ts +72 -44
  339. package/src/runtime/control-plane/execution/work-head-settlement.ts +53 -20
  340. package/src/runtime/control-plane/execution/work-lifecycle-audit.ts +52 -29
  341. package/src/runtime/control-plane/execution/work-operation-service.ts +60 -34
  342. package/src/runtime/control-plane/execution/work-preparation-service.ts +231 -267
  343. package/src/runtime/control-plane/execution/work-process-evidence.ts +2 -2
  344. package/src/runtime/control-plane/execution/work-remote-delivery.ts +2 -3
  345. package/src/runtime/control-plane/execution/work-revision-diff.ts +39 -0
  346. package/src/runtime/control-plane/execution/work-terminal-cleanup.ts +201 -199
  347. package/src/runtime/control-plane/execution/work-validation-reconciler.ts +33 -85
  348. package/src/runtime/control-plane/execution/work-verification-service.ts +406 -50
  349. package/src/runtime/control-plane/execution/work-verification-snapshot.ts +6 -2
  350. package/src/runtime/control-plane/facade/capability-registry.ts +364 -37
  351. package/src/runtime/control-plane/facade/check-normalization.ts +3 -9
  352. package/src/runtime/control-plane/facade/codex-delegation.ts +10 -11
  353. package/src/runtime/control-plane/facade/controller-connection.ts +135 -0
  354. package/src/runtime/control-plane/facade/goal-workloop-access.ts +1 -20
  355. package/src/runtime/control-plane/facade/goal-workloop.ts +281 -1753
  356. package/src/runtime/control-plane/facade/handoff-inbox-application.ts +12 -25
  357. package/src/runtime/control-plane/facade/handoff-inbox-store.ts +256 -52
  358. package/src/runtime/control-plane/facade/index.ts +0 -1
  359. package/src/runtime/control-plane/facade/operation-digest.ts +12 -15
  360. package/src/runtime/control-plane/facade/plan-contract-store.ts +451 -991
  361. package/src/runtime/control-plane/facade/policy-gate.ts +0 -23
  362. package/src/runtime/control-plane/facade/repository-work-admission.ts +12 -22
  363. package/src/runtime/control-plane/facade/requirement-authority.ts +102 -199
  364. package/src/runtime/control-plane/facade/requirement-board.ts +3 -3
  365. package/src/runtime/control-plane/facade/rh-work-operation-contract.ts +51 -14
  366. package/src/runtime/control-plane/facade/self-healing-loop.ts +18 -53
  367. package/src/runtime/control-plane/facade/suggested-actions.ts +15 -18
  368. package/src/runtime/control-plane/facade/types.ts +49 -108
  369. package/src/runtime/control-plane/facade/work-continuation.ts +9 -9
  370. package/src/runtime/control-plane/generated-cache-retention.ts +206 -59
  371. package/src/runtime/control-plane/global-scheduler/autonomous-continuation.ts +248 -0
  372. package/src/runtime/control-plane/global-scheduler/durable-admission.ts +1 -1
  373. package/src/runtime/control-plane/global-scheduler/maintenance.ts +256 -117
  374. package/src/runtime/control-plane/global-scheduler/reconciliation.ts +3 -12
  375. package/src/runtime/control-plane/global-scheduler/scheduler.ts +66 -40
  376. package/src/runtime/control-plane/global-scheduler/wake-signal.ts +42 -2
  377. package/src/runtime/control-plane/governance/access-policy.ts +19 -2
  378. package/src/runtime/control-plane/governance/authorization.ts +20 -3
  379. package/src/runtime/control-plane/governance/external-effects.ts +1 -1
  380. package/src/runtime/control-plane/launcher/chatgpt-round-continuation.ts +63 -300
  381. package/src/runtime/control-plane/launcher/chatgpt-work-continuation.ts +29 -300
  382. package/src/runtime/control-plane/launcher/local-conversation-controller.ts +238 -0
  383. package/src/runtime/control-plane/launcher/provider-mcp-bootstrap.ts +5 -2
  384. package/src/runtime/control-plane/launcher/thin-launcher.ts +96 -240
  385. package/src/runtime/control-plane/persistence/cognition-store.ts +820 -0
  386. package/src/runtime/control-plane/persistence/experience-store.ts +162 -29
  387. package/src/runtime/control-plane/persistence/requirement-store.ts +216 -74
  388. package/src/runtime/control-plane/persistence/sqlite-store.ts +113 -6
  389. package/src/runtime/control-plane/release-retention.ts +135 -47
  390. package/src/runtime/control-plane/repository-namespace-retention.ts +2 -2
  391. package/src/runtime/control-plane/runtime-cleanup.ts +295 -107
  392. package/src/runtime/control-plane/workspace/project-onboarding.ts +80 -0
  393. package/src/runtime/control-plane/workspace/semantic-sync-service.ts +19 -5
  394. package/src/runtime/control-plane/workspace/workspace-store.ts +169 -0
  395. package/src/runtime/diagnostics/incident-repair.ts +313 -146
  396. package/src/runtime/diagnostics/mcp-timing.ts +114 -0
  397. package/src/runtime/evidence/artifact-store.ts +158 -40
  398. package/src/runtime/evidence/evidence-store.ts +112 -8
  399. package/src/runtime/evidence/output-handle-index.ts +225 -0
  400. package/src/runtime/evidence/result-store.ts +158 -44
  401. package/src/runtime/evidence/sensitive-output.ts +22 -2
  402. package/src/runtime/execution/jobs/child-reference.ts +11 -0
  403. package/src/runtime/execution/jobs/receipt-recovery.ts +1 -11
  404. package/src/runtime/execution/jobs/store.ts +3 -4
  405. package/src/runtime/execution/managed-workspace.ts +57 -0
  406. package/src/runtime/execution/process-runtime/check-facade.ts +1 -1
  407. package/src/runtime/execution/process-runtime/check-result-retention.ts +2 -2
  408. package/src/runtime/execution/process-runtime/check-result.ts +105 -1
  409. package/src/runtime/execution/process-runtime/check-runner-sidecar.ts +18 -8
  410. package/src/runtime/execution/process-runtime/command-facade.ts +82 -30
  411. package/src/runtime/execution/process-runtime/gc.ts +15 -2
  412. package/src/runtime/execution/process-runtime/handle-index.ts +176 -0
  413. package/src/runtime/execution/process-runtime/host-command-lane.ts +139 -0
  414. package/src/runtime/execution/process-runtime/index.ts +3 -0
  415. package/src/runtime/execution/process-runtime/lightweight-managed.ts +251 -72
  416. package/src/runtime/execution/process-runtime/persisted-check.ts +3 -3
  417. package/src/runtime/execution/process-runtime/process-runner-entry.ts +47 -5
  418. package/src/runtime/execution/process-runtime/process-scope.ts +160 -0
  419. package/src/runtime/execution/process-runtime/resource-claims.ts +65 -61
  420. package/src/runtime/execution/process-runtime/runtime.ts +55 -18
  421. package/src/runtime/execution/process-runtime/store.ts +30 -2
  422. package/src/runtime/execution/process-runtime/types.ts +6 -1
  423. package/src/runtime/execution/thin-harness/execution-router.ts +16 -16
  424. package/src/runtime/execution/thin-harness/fast-executor.ts +2 -2
  425. package/src/runtime/execution/thin-harness/search-worker.ts +2 -2
  426. package/src/runtime/execution/workers/executor.ts +3 -8
  427. package/src/runtime/maintenance/cleanup.ts +41 -5
  428. package/src/runtime/platform/service-inventory.ts +130 -0
  429. package/src/runtime/platform/service-manager.ts +8 -0
  430. package/src/runtime/plugins/action-application.ts +97 -29
  431. package/src/runtime/plugins/app-store-connect-adapter.ts +290 -18
  432. package/src/runtime/plugins/browser-adapter.ts +1124 -333
  433. package/src/runtime/plugins/browser-automation-service.ts +23 -3
  434. package/src/runtime/plugins/browser-macos-bridge.ts +431 -137
  435. package/src/runtime/plugins/browser-manifest-surface.ts +47 -12
  436. package/src/runtime/plugins/browser-native-session-service.ts +63 -13
  437. package/src/runtime/plugins/browser-registration.ts +18 -0
  438. package/src/runtime/plugins/browser-runtime.ts +40 -36
  439. package/src/runtime/plugins/browser-session-authority.ts +2 -2
  440. package/src/runtime/plugins/browser-session-store.ts +46 -76
  441. package/src/runtime/plugins/capability-authorization-grants.ts +258 -62
  442. package/src/runtime/plugins/computer-chatgpt-browser-adapter-installer.ts +228 -0
  443. package/src/runtime/plugins/computer-registration.ts +298 -20
  444. package/src/runtime/plugins/desktop-operator-external-policy.ts +36 -4
  445. package/src/runtime/plugins/desktop-operator-registration.ts +12 -4
  446. package/src/runtime/plugins/external-adapter.ts +42 -6
  447. package/src/runtime/plugins/external-registration.ts +21 -1
  448. package/src/runtime/plugins/github-adapter.ts +30 -3
  449. package/src/runtime/plugins/gmail-adapter.ts +189 -3
  450. package/src/runtime/plugins/google-calendar-adapter.ts +2 -2
  451. package/src/runtime/plugins/google-shared.ts +24 -12
  452. package/src/runtime/plugins/google-tasks-adapter.ts +2 -2
  453. package/src/runtime/plugins/ios/remote-xpc-hid.ts +70 -30
  454. package/src/runtime/plugins/ios-adapter.ts +46 -41
  455. package/src/runtime/plugins/ios-agent-device.ts +54 -4
  456. package/src/runtime/plugins/ios-device-ownership.ts +103 -0
  457. package/src/runtime/plugins/ios-physical-device.ts +497 -79
  458. package/src/runtime/plugins/lightweight-action.ts +208 -2
  459. package/src/runtime/plugins/local-system-adapter.ts +12 -100
  460. package/src/runtime/plugins/managed-process-adapter.ts +12 -5
  461. package/src/runtime/plugins/plugin-action-sidecar.ts +17 -13
  462. package/src/runtime/plugins/plugin-management-adapter.ts +1 -1
  463. package/src/runtime/plugins/store.ts +682 -435
  464. package/src/runtime/plugins/types.ts +24 -0
  465. package/src/runtime/plugins/xiaohongshu-publish.ts +16 -0
  466. package/src/runtime/projections/git-status-sampler.ts +2 -19
  467. package/src/runtime/projections/invalidation.ts +7 -3
  468. package/src/runtime/projections/materialized-view.ts +80 -36
  469. package/src/runtime/recovery/actions.ts +4 -4
  470. package/src/runtime/recovery/capability-action-application.ts +46 -45
  471. package/src/runtime/recovery/lifecycle-inventory.ts +30 -40
  472. package/src/runtime/recovery/maintenance-executor.ts +374 -123
  473. package/src/runtime/recovery/probe.ts +2 -2
  474. package/src/runtime/recovery/store.ts +29 -11
  475. package/src/runtime/release/release-coordinator.ts +312 -0
  476. package/src/runtime/release/release-session.ts +716 -0
  477. package/src/runtime/release/release-state-migration.ts +25 -0
  478. package/src/runtime/resources/leases/store.ts +56 -25
  479. package/src/runtime/root/computer-composition.ts +191 -6
  480. package/src/runtime/root/controller-progression-composition.ts +254 -0
  481. package/src/runtime/root/controller-round-composition.ts +20 -1
  482. package/src/runtime/root/deployment-topology.ts +106 -0
  483. package/src/runtime/root/entry.ts +4 -3
  484. package/src/runtime/root/known-good-recovery.ts +184 -0
  485. package/src/runtime/root/local-bridge.ts +0 -1
  486. package/src/runtime/root/mcp-transport.ts +111 -18
  487. package/src/runtime/root/ownership.ts +261 -9
  488. package/src/runtime/root/package-connector-service.ts +227 -29
  489. package/src/runtime/root/package-runtime-release.ts +117 -30
  490. package/src/runtime/root/package-runtime-service.ts +24 -24
  491. package/src/runtime/root/release-execution-canary.ts +57 -12
  492. package/src/runtime/root/release-loader.ts +90 -8
  493. package/src/runtime/root/release-manifest.ts +80 -40
  494. package/src/runtime/root/release-materialize.ts +372 -106
  495. package/src/runtime/root/release-store.ts +395 -36
  496. package/src/runtime/root/runtime-lane.ts +191 -0
  497. package/src/runtime/root/runtime.ts +160 -29
  498. package/src/runtime/root/scheduled-controller-composition.ts +29 -3
  499. package/src/runtime/root/service-runner.ts +2 -2
  500. package/src/runtime/root/service.ts +126 -44
  501. package/src/runtime/root/status.ts +48 -0
  502. package/src/runtime/root/types.ts +32 -9
  503. package/src/runtime/root/workflow-supervisor-composition.ts +681 -0
  504. package/src/runtime/root/workflow-supervisor-runtime.ts +564 -0
  505. package/src/runtime/root/write-fence.ts +50 -2
  506. package/src/runtime/safe-tooling/google-credential-store.ts +67 -22
  507. package/src/runtime/safe-tooling/google-oauth-broker.ts +25 -7
  508. package/src/runtime/safe-tooling/ios-development.ts +22 -8
  509. package/src/runtime/safe-tooling/job-summary.ts +1 -1
  510. package/src/runtime/safe-tooling/workspace-auth.ts +5 -2
  511. package/src/runtime/shared/atomic-text-file.ts +21 -0
  512. package/src/runtime/shared/bounded-child-supervisor.ts +9 -1
  513. package/src/runtime/shared/json-files.ts +8 -3
  514. package/src/runtime/shared/process-environment.ts +20 -9
  515. package/src/runtime/shared/response-budget.ts +1 -3
  516. package/src/runtime/standalone-recovery/controller-home-migration.ts +16 -24
  517. package/src/runtime/standalone-recovery/core.ts +3792 -417
  518. package/src/runtime/standalone-recovery/entry.ts +507 -45
  519. package/src/runtime/standalone-recovery/installer.ts +262 -148
  520. package/src/runtime/standalone-recovery/mcp-server.ts +29 -193
  521. package/src/runtime/standalone-recovery/operation-lock.ts +12 -2
  522. package/src/runtime/standalone-recovery/performance.ts +54 -16
  523. package/src/runtime/standalone-recovery/release.ts +53 -5
  524. package/src/runtime/standalone-recovery/service-labels.ts +5 -2
  525. package/src/runtime/standalone-recovery/watchdog-heartbeat.ts +5 -2
  526. package/src/runtime/workflow/schedules/browser-probe.ts +17 -6
  527. package/src/runtime/workflow/schedules/chatgpt-automation-migration.ts +11 -3
  528. package/src/runtime/workflow/schedules/engine.ts +166 -178
  529. package/src/runtime/workflow/schedules/pending-activation.ts +11 -4
  530. package/src/runtime/workflow/schedules/work-continuation.ts +95 -11
  531. package/src/runtime/workflows/runtime.ts +15 -19
  532. package/src/testing/test-governance.ts +5 -1
  533. package/supervisor/chatgpt-conversation.ts +23 -0
  534. package/supervisor/client.ts +218 -0
  535. package/supervisor/control-plane.ts +963 -0
  536. package/supervisor/entry.ts +15 -0
  537. package/supervisor/forge-validators.ts +147 -0
  538. package/supervisor/index.ts +5 -0
  539. package/supervisor/native-browser-adapter.ts +1151 -0
  540. package/supervisor/native-messaging/host.ts +58 -0
  541. package/supervisor/native-messaging/manifest.ts +26 -0
  542. package/supervisor/native-messaging/protocol.ts +27 -0
  543. package/supervisor/paths.ts +18 -0
  544. package/supervisor/protocol.ts +250 -0
  545. package/supervisor/server.ts +412 -0
  546. package/supervisor/store.ts +1870 -0
  547. package/supervisor/tsconfig.json +8 -0
  548. package/supervisor/types.ts +261 -0
  549. package/SKILL.md +0 -427
  550. package/adapters/chatgpt/controller-host.ts +0 -119
  551. package/adapters/mcp/controller-round-compatibility.ts +0 -184
  552. package/adapters/mcp/frozen-client-semantic-compatibility.ts +0 -292
  553. package/adapters/mcp/runtime-gateway/work-compat-adapter.ts +0 -502
  554. package/adapters/mcp/runtime-gateway/work-validation-reconciler.ts +0 -1
  555. package/adapters/mcp/toolset-selection.ts +0 -41
  556. package/agents/openai.yaml +0 -4
  557. package/assets/skill-hooks.json +0 -41
  558. package/assets/skill-version.json +0 -189
  559. package/assets/skills/claude-review/SKILL.md +0 -231
  560. package/assets/skills/codex-review/SKILL.md +0 -103
  561. package/assets/templates/helpers/check-skill-version.ts +0 -193
  562. package/packages/kernel/progression/api/index.ts +0 -2
  563. package/packages/kernel/progression/application/projector.ts +0 -211
  564. package/packages/kernel/progression/domain/types.ts +0 -116
  565. package/packages/kernel/progression/index.ts +0 -1
  566. package/packages/kernel/scheduler/application/continuation-service.ts +0 -212
  567. package/packages/kernel/scheduler/domain/continuation.ts +0 -38
  568. package/packages/kernel/scheduler/infrastructure/continuation-dispatch-store.ts +0 -38
  569. package/packages/kernel/work/domain/admission-policy.ts +0 -34
  570. package/scripts/benchmark-background-check-overlap.ts +0 -228
  571. package/scripts/benchmark-computer-hotpath.ts +0 -255
  572. package/scripts/benchmark-controller-hotpath.ts +0 -212
  573. package/scripts/benchmark-controller-round2.ts +0 -191
  574. package/scripts/benchmark-ios-agent-device.ts +0 -511
  575. package/scripts/benchmark-mcp-host.sh +0 -117
  576. package/scripts/benchmark-mcp-transport.ts +0 -169
  577. package/scripts/benchmark-operational-memory-activation.ts +0 -235
  578. package/scripts/benchmark-operational-shadow.ts +0 -28
  579. package/scripts/benchmark-quality-harness.ts +0 -146
  580. package/scripts/benchmark-route-session-concurrency.ts +0 -915
  581. package/scripts/benchmark-thin-harness-gateway-ab.ts +0 -632
  582. package/scripts/benchmark-thin-harness-mcp-e2e.ts +0 -498
  583. package/scripts/benchmark-thin-harness.ts +0 -251
  584. package/scripts/benchmark-typescript-navigation.ts +0 -186
  585. package/scripts/benchmark-work-efficiency.ts +0 -334
  586. package/scripts/build-controller-ui.ts +0 -28
  587. package/scripts/check-npm-release.sh +0 -32
  588. package/scripts/check-public-release-surface.sh +0 -19
  589. package/scripts/check-release-published.sh +0 -57
  590. package/scripts/check-release-readiness.sh +0 -37
  591. package/scripts/check-release-version.mjs +0 -74
  592. package/scripts/check-skill-version.ts +0 -5
  593. package/scripts/check-tarball-install-smoke.sh +0 -150
  594. package/scripts/ensure-codegraph.sh +0 -16
  595. package/scripts/package-source-archive.sh +0 -147
  596. package/scripts/public-release-files.txt +0 -39
  597. package/scripts/public-release.ts +0 -174
  598. package/scripts/publish-release-tarball.sh +0 -27
  599. package/scripts/route-nl-vs-ts-eval.ts +0 -679
  600. package/scripts/run-skill-hook.ts +0 -244
  601. package/scripts/stage-runtime-release.ts +0 -44
  602. package/scripts/sync-codex-installed-copies.sh +0 -182
  603. package/src/cli/commands/tools.ts +0 -167
  604. package/src/cli/controller/progress.ts +0 -656
  605. package/src/cli/controller/work-mode.ts +0 -181
  606. package/src/cli/local-bridge/console-assets.ts +0 -17
  607. package/src/cli/local-bridge/dashboard.ts +0 -17
  608. package/src/cli/local-bridge/frontend/src/App.tsx +0 -10
  609. package/src/cli/local-bridge/frontend/src/components/Button.tsx +0 -1
  610. package/src/cli/local-bridge/frontend/src/components/DetailPane.tsx +0 -3
  611. package/src/cli/local-bridge/frontend/src/components/SearchField.tsx +0 -1
  612. package/src/cli/local-bridge/frontend/src/components/SectionHeader.tsx +0 -1
  613. package/src/cli/local-bridge/frontend/src/components/Segmented.tsx +0 -1
  614. package/src/cli/local-bridge/frontend/src/components/StatusText.tsx +0 -3
  615. package/src/cli/local-bridge/frontend/src/design/icons.tsx +0 -11
  616. package/src/cli/local-bridge/frontend/src/design/tokens.css +0 -8
  617. package/src/cli/local-bridge/frontend/src/features/automations/AutomationsView.tsx +0 -153
  618. package/src/cli/local-bridge/frontend/src/features/capabilities/CapabilitiesView.tsx +0 -37
  619. package/src/cli/local-bridge/frontend/src/features/overview/OverviewView.tsx +0 -183
  620. package/src/cli/local-bridge/frontend/src/features/repositories/RepositoriesView.tsx +0 -2
  621. package/src/cli/local-bridge/frontend/src/features/system/SystemView.tsx +0 -2
  622. package/src/cli/local-bridge/frontend/src/features/work/WorkView.tsx +0 -4
  623. package/src/cli/local-bridge/frontend/src/lib/api.ts +0 -30
  624. package/src/cli/local-bridge/frontend/src/lib/format.ts +0 -4
  625. package/src/cli/local-bridge/frontend/src/lib/routes.ts +0 -7
  626. package/src/cli/local-bridge/frontend/src/main.tsx +0 -1
  627. package/src/cli/local-bridge/frontend/src/shell/AppShell.tsx +0 -1
  628. package/src/cli/local-bridge/frontend/src/shell/CommandBar.tsx +0 -2
  629. package/src/cli/local-bridge/frontend/src/shell/Sidebar.tsx +0 -4
  630. package/src/cli/local-bridge/frontend/src/styles.css +0 -28
  631. package/src/cli/local-bridge/frontend/src/types.ts +0 -15
  632. package/src/cli/local-bridge/frontend/src/vite-env.d.ts +0 -1
  633. package/src/cli/local-bridge/frontend/vite.config.ts +0 -27
  634. package/src/cli/local-bridge/ui-dist/app.css +0 -1
  635. package/src/cli/local-bridge/ui-dist/app.js +0 -11228
  636. package/src/cli/mcp/access-mode.ts +0 -2
  637. package/src/cli/mcp/access-tools.ts +0 -2
  638. package/src/cli/mcp/audit.ts +0 -2
  639. package/src/cli/mcp/auth.ts +0 -2
  640. package/src/cli/mcp/instructions.ts +0 -2
  641. package/src/cli/mcp/legacy-context.ts +0 -2
  642. package/src/cli/mcp/legacy-tool-service.ts +0 -2
  643. package/src/cli/mcp/multi-repository.ts +0 -2
  644. package/src/cli/mcp/oauth.ts +0 -2
  645. package/src/cli/mcp/openai-secure-tunnel.ts +0 -2
  646. package/src/cli/mcp/paths.ts +0 -2
  647. package/src/cli/mcp/policy.ts +0 -2
  648. package/src/cli/mcp/post-finalize-work-attribution.ts +0 -2
  649. package/src/cli/mcp/proxy-env.ts +0 -2
  650. package/src/cli/mcp/readiness-projection.ts +0 -2
  651. package/src/cli/mcp/redaction.ts +0 -2
  652. package/src/cli/mcp/repo.ts +0 -2
  653. package/src/cli/mcp/repository-tools.ts +0 -2
  654. package/src/cli/mcp/server.ts +0 -2
  655. package/src/cli/mcp/setup.ts +0 -2
  656. package/src/cli/mcp/tool-capability-cache.ts +0 -2
  657. package/src/cli/mcp/tool-contract.ts +0 -2
  658. package/src/cli/mcp/tools.ts +0 -2
  659. package/src/cli/mcp/toolset-names.ts +0 -2
  660. package/src/cli/mcp/toolset-selection.ts +0 -2
  661. package/src/cli/mcp/toolset.ts +0 -2
  662. package/src/cli/mcp/transports/http.ts +0 -2
  663. package/src/cli/mcp/transports/session-registry.ts +0 -2
  664. package/src/cli/mcp/transports/stdio.ts +0 -2
  665. package/src/cli/mcp/types.ts +0 -2
  666. package/src/cli/mcp/umbrella-tools.ts +0 -2
  667. package/src/cli/tools/codegraph.ts +0 -695
  668. package/src/core/adoption/helper-wrapper-plan.ts +0 -159
  669. package/src/runtime/context/codegraph-cache-boundary.ts +0 -255
  670. package/src/runtime/context/codegraph-read-provider.ts +0 -611
  671. package/src/runtime/context/codegraph-sidecar.cjs +0 -248
  672. package/src/runtime/control-plane/codegraph-cache-retention.ts +0 -164
  673. package/src/runtime/control-plane/execution/content-equivalent-commit-authority.ts +0 -169
  674. package/src/runtime/control-plane/execution/direct-canonical-work-reconciliation.ts +0 -85
  675. package/src/runtime/control-plane/execution/direct-edit-work-completion.ts +0 -655
  676. package/src/runtime/control-plane/execution/work-finalization-service.ts +0 -2850
  677. package/src/runtime/control-plane/execution/work-path-scope.ts +0 -37
  678. package/src/runtime/control-plane/execution/work-task-receipt.ts +0 -468
  679. package/src/runtime/control-plane/facade/controller-round-relay.ts +0 -3
  680. package/src/runtime/control-plane/facade/work-admission-policy.ts +0 -142
  681. package/src/runtime/control-plane/facade/work-implementation-review.ts +0 -2
  682. package/src/runtime/control-plane/facade/work-state-machine.ts +0 -2
  683. package/src/runtime/control-plane/facade/work-task-projection.ts +0 -66
  684. package/src/runtime/control-plane/routing/index.ts +0 -1
  685. package/src/runtime/control-plane/routing/route-policy.ts +0 -401
  686. package/src/runtime/control-plane/routing/workspace-admission.ts +0 -70
  687. package/src/runtime/gateway/mcp/execution-tools.ts +0 -2
  688. package/src/runtime/gateway/mcp/legacy-ios-tool-adapter.ts +0 -2
  689. package/src/runtime/gateway/mcp/persisted-check-process.ts +0 -2
  690. package/src/runtime/gateway/mcp/process-tools.ts +0 -2
  691. package/src/runtime/gateway/mcp/router.ts +0 -2
  692. package/src/runtime/gateway/mcp/runtime-tool-definitions.ts +0 -2
  693. package/src/runtime/gateway/mcp/runtime-tools.ts +0 -2
  694. package/src/runtime/gateway/mcp/work-validation-reconciler.ts +0 -2
  695. package/src/runtime/plugins/browser-provider-registry.ts +0 -2
@@ -0,0 +1,451 @@
1
+ import type { ScopeRef } from '../../identity/api/index';
2
+ import {
3
+ cognitiveTerms,
4
+ memoryAddressKey,
5
+ memoryAddressLabel,
6
+ memoryAddressOf,
7
+ type ActivationItem,
8
+ type ActivationPack,
9
+ type ActivationReason,
10
+ type MemoryAddress,
11
+ type MemoryEdge,
12
+ type MemoryUnit,
13
+ } from '../domain/memory';
14
+
15
+ export interface CognitiveReadPort {
16
+ readByIds(scopes: readonly ScopeRef[], ids: readonly string[]): MemoryUnit[];
17
+ readByAddresses(addresses: readonly MemoryAddress[]): MemoryUnit[];
18
+ exactByConcept(scopes: readonly ScopeRef[], concepts: readonly string[], limit: number, activeAt?: string): MemoryUnit[];
19
+ lexical(scopes: readonly ScopeRef[], terms: readonly string[], limit: number, activeAt?: string): MemoryUnit[];
20
+ neighbors(seeds: readonly MemoryAddress[], limit: number, activeAt?: string): Array<{ edge: MemoryEdge; from: MemoryAddress; memory: MemoryUnit }>;
21
+ }
22
+
23
+ export interface SemanticCandidate {
24
+ address: MemoryAddress;
25
+ score: number;
26
+ }
27
+
28
+ export interface CognitiveSemanticIndex {
29
+ search(query: string, scopes: readonly ScopeRef[], limit: number): SemanticCandidate[];
30
+ }
31
+
32
+ export interface CognitiveUsageFeedback {
33
+ address: MemoryAddress;
34
+ usedCount: number;
35
+ rejectedCount: number;
36
+ conflictCount: number;
37
+ staleCount: number;
38
+ }
39
+
40
+ export interface ActivationOptions {
41
+ maxItems?: number;
42
+ maxCandidates?: number;
43
+ maxGraphDepth?: number;
44
+ maxBytes?: number;
45
+ /** Optional associative-cue floor for opportunistic recall. Explicit audits may leave it unset. */
46
+ minCueScore?: number;
47
+ now?: string;
48
+ semantic?: CognitiveSemanticIndex;
49
+ seedMemoryIds?: string[];
50
+ seedConcepts?: string[];
51
+ transientMemories?: readonly MemoryUnit[];
52
+ /** Rebuildable retrieval feedback derived from canonical ControllerRound observations. */
53
+ usageFeedback?: readonly CognitiveUsageFeedback[];
54
+ /** Small relevance prior; all scopes still compete in one candidate set. */
55
+ scopePriors?: Partial<Record<ScopeRef['kind'], number>>;
56
+ }
57
+
58
+ const DEFAULT_ITEMS = 16;
59
+ const DEFAULT_CANDIDATES = 96;
60
+ const DEFAULT_GRAPH_DEPTH = 2;
61
+ const DEFAULT_BYTES = 24 * 1024;
62
+
63
+ function bounded(value: number | undefined, fallback: number, maximum: number): number {
64
+ if (value !== undefined && (!Number.isFinite(value) || value < 1)) throw new Error('COGNITION_ACTIVATION_BUDGET_INVALID');
65
+ return Math.min(Math.floor(value ?? fallback), maximum);
66
+ }
67
+
68
+ function boundedUnitScore(value: number | undefined, label: string): number {
69
+ if (value === undefined) return 0;
70
+ if (!Number.isFinite(value) || value < 0 || value > 1) throw new Error(`COGNITION_${label}_INVALID`);
71
+ return value;
72
+ }
73
+
74
+ function cognitiveQueryTerms(text: string): Set<string> {
75
+ const terms = cognitiveTerms(text);
76
+ const rawTokens = text.toLocaleLowerCase('en-US').match(/[a-z0-9_.:/-]+/g) ?? [];
77
+ const explicitPlainTerms = new Set(rawTokens.filter(token => !/[._:/-]/.test(token)));
78
+ for (const token of rawTokens) {
79
+ if (!/[._:/-]/.test(token)) continue;
80
+ for (const part of token.split(/[._:/-]+/).filter(Boolean)) {
81
+ // A structured query token is already an exact concept cue. Its parts
82
+ // should not independently widen the query to sibling concepts unless the
83
+ // user also supplied those parts as ordinary natural-language terms.
84
+ if (!explicitPlainTerms.has(part)) terms.delete(part);
85
+ }
86
+ }
87
+ return terms;
88
+ }
89
+
90
+ function associativeLexicalCueScore(memory: MemoryUnit, terms: ReadonlySet<string>, allowCjkQueryCoverage = false): number {
91
+ if (!terms.size) return 0;
92
+ const haystack = cognitiveTerms(`${memory.canonicalText}\n${memory.concepts.join(' ')}\n${memory.facets.join(' ')}`);
93
+ if (!haystack.size) return 0;
94
+ let matches = 0;
95
+ for (const term of terms) if (haystack.has(term)) matches += 1;
96
+ const queryCoverage = matches / terms.size;
97
+ const memoryCoverage = matches / haystack.size;
98
+ const bidirectionalSpecificity = Math.min(queryCoverage, memoryCoverage);
99
+ // CJK bigram tokenization naturally makes a useful memory's haystack large.
100
+ // Keep the historical multi-cue exception only for CJK; ASCII natural-language
101
+ // concept access is handled below through canonical structured concept aliases.
102
+ const multiCueQueryCoverage = allowCjkQueryCoverage && matches >= 2 ? queryCoverage : 0;
103
+ return Math.max(bidirectionalSpecificity, multiCueQueryCoverage);
104
+ }
105
+
106
+ function structuredConceptAliasCueScore(memory: MemoryUnit, queryTerms: ReadonlySet<string>): number {
107
+ let best = 0;
108
+ for (const concept of memory.concepts) {
109
+ if (!/[._:/-]/.test(concept)) continue;
110
+ const parts = concept.toLocaleLowerCase('en-US').split(/[._:/-]+/).filter(Boolean);
111
+ if (parts.length < 2) continue;
112
+ let matches = 0;
113
+ for (const part of parts) if (queryTerms.has(part)) matches += 1;
114
+ // Two independently supplied parts are required. This lets natural language
115
+ // such as "forge cognition" reach forge.cognition without granting the same
116
+ // privilege to arbitrary two-word prose overlap.
117
+ if (matches >= 2) best = Math.max(best, matches / parts.length);
118
+ }
119
+ return best;
120
+ }
121
+
122
+ function retrievalCueScore(item: ActivationItem, queryTerms: ReadonlySet<string>, query: string): number {
123
+ const hasCjkQuery = /[\u3400-\u4dbf\u4e00-\u9fff\uf900-\ufaff]/u.test(query);
124
+ let score = Math.max(
125
+ associativeLexicalCueScore(item.memory, queryTerms, hasCjkQuery),
126
+ structuredConceptAliasCueScore(item.memory, queryTerms),
127
+ );
128
+ for (const reason of item.reasons) {
129
+ if (reason.signal === 'exact' || reason.signal === 'semantic') {
130
+ score = Math.max(score, reason.score);
131
+ }
132
+ }
133
+ // Graph propagation may rank or explain an already-cued memory, but it
134
+ // cannot by itself make a memory enter opportunistic awareness. Deliberate
135
+ // memory audit leaves minCueScore at zero and still sees graph expansion.
136
+ return score;
137
+ }
138
+
139
+ function fairScopedRead(
140
+ scopes: readonly ScopeRef[],
141
+ limit: number,
142
+ read: (scope: ScopeRef, limit: number) => MemoryUnit[],
143
+ ): MemoryUnit[] {
144
+ if (scopes.length <= 1) return scopes.length ? read(scopes[0]!, limit) : [];
145
+ const perScope = Math.max(1, Math.ceil(limit / scopes.length));
146
+ const lanes = scopes.map(scope => read(scope, perScope));
147
+ const seen = new Set<string>();
148
+ const result: MemoryUnit[] = [];
149
+ for (let offset = 0; result.length < limit; offset++) {
150
+ let advanced = false;
151
+ for (const lane of lanes) {
152
+ const memory = lane[offset];
153
+ if (!memory) continue;
154
+ advanced = true;
155
+ const key = memoryAddressKey(memoryAddressOf(memory));
156
+ if (seen.has(key)) continue;
157
+ seen.add(key);
158
+ result.push(memory);
159
+ if (result.length >= limit) break;
160
+ }
161
+ if (!advanced) break;
162
+ }
163
+ return result;
164
+ }
165
+
166
+ function active(memory: MemoryUnit, now: number): boolean {
167
+ return !memory.retractedAt
168
+ && (!memory.expiresAt || Date.parse(memory.expiresAt) > now)
169
+ && Date.parse(memory.validFrom) <= now;
170
+ }
171
+
172
+ function lexicalScore(memory: MemoryUnit, terms: ReadonlySet<string>): number {
173
+ const haystack = cognitiveTerms(`${memory.canonicalText}\n${memory.concepts.join(' ')}\n${memory.facets.join(' ')}`);
174
+ let matches = 0;
175
+ for (const term of terms) if (haystack.has(term)) matches += 1;
176
+ return terms.size ? matches / terms.size : 0;
177
+ }
178
+
179
+ function recencyScore(memory: MemoryUnit, now: number): number {
180
+ const ageDays = Math.max(0, (now - Date.parse(memory.provenance.recordedAt)) / 86_400_000);
181
+ return 1 / (1 + ageDays / 90);
182
+ }
183
+
184
+ function addReason(item: ActivationItem, reason: ActivationReason): void {
185
+ const existing = item.reasons.find(candidate => candidate.signal === reason.signal && candidate.detail === reason.detail);
186
+ if (existing) existing.score = Math.max(existing.score, reason.score);
187
+ else item.reasons.push(reason);
188
+ }
189
+
190
+ function graphRelationFactor(edge: MemoryEdge, from: MemoryAddress): number {
191
+ if (edge.relation === 'supports') return 1;
192
+ if (edge.relation === 'derived_from') return 0.85;
193
+ if (edge.relation === 'analogous_to') return 0.55;
194
+ if (edge.relation === 'contradicts') return 0.4;
195
+ if (edge.relation === 'supersedes') return from.id === edge.toId ? 1 : 0.2;
196
+ return 0.65;
197
+ }
198
+
199
+ function ensureCandidate(map: Map<string, ActivationItem>, memory: MemoryUnit): ActivationItem {
200
+ const key = memoryAddressKey(memoryAddressOf(memory));
201
+ let item = map.get(key);
202
+ if (!item) {
203
+ item = { memory, score: 0, reasons: [], activationPath: [memoryAddressLabel(memoryAddressOf(memory))] };
204
+ map.set(key, item);
205
+ }
206
+ return item;
207
+ }
208
+
209
+ export function activateMemory(
210
+ port: CognitiveReadPort,
211
+ scopes: readonly ScopeRef[],
212
+ query: string,
213
+ options: ActivationOptions = {},
214
+ ): ActivationPack {
215
+ const maxItems = bounded(options.maxItems, DEFAULT_ITEMS, 32);
216
+ const maxCandidates = bounded(options.maxCandidates, DEFAULT_CANDIDATES, 512);
217
+ const maxGraphDepth = bounded(options.maxGraphDepth, DEFAULT_GRAPH_DEPTH, 4);
218
+ const maxBytes = bounded(options.maxBytes, DEFAULT_BYTES, 64 * 1024);
219
+ const minCueScore = boundedUnitScore(options.minCueScore, 'ACTIVATION_MIN_CUE_SCORE');
220
+ const nowText = options.now ?? new Date().toISOString();
221
+ const now = Date.parse(nowText);
222
+ if (!Number.isFinite(now)) throw new Error('COGNITION_ACTIVATION_TIME_INVALID');
223
+ const activeAt = new Date(now).toISOString();
224
+
225
+ const queryTerms = cognitiveQueryTerms(query.slice(0, 8_192));
226
+ const inferredConcepts = [...queryTerms].filter(term => /[._:/-]/.test(term));
227
+ const seedConcepts = [...new Set([...(options.seedConcepts ?? []), ...inferredConcepts])].slice(0, 64);
228
+ const candidates = new Map<string, ActivationItem>();
229
+ const gaps: string[] = [];
230
+ const usageByAddress = new Map((options.usageFeedback ?? []).slice(0, 256).map(feedback => [
231
+ memoryAddressKey(feedback.address),
232
+ feedback,
233
+ ]));
234
+
235
+ for (const memory of options.transientMemories ?? []) {
236
+ if (!active(memory, now)) continue;
237
+ const lexical = lexicalScore(memory, queryTerms);
238
+ const exactHits = memory.concepts.filter(concept => seedConcepts.includes(concept)).length;
239
+ if (!lexical && !exactHits) continue;
240
+ const item = ensureCandidate(candidates, memory);
241
+ if (lexical) {
242
+ item.score += lexical;
243
+ addReason(item, { signal: 'lexical', score: lexical, detail: 'transient-term-overlap' });
244
+ }
245
+ if (exactHits) {
246
+ const exact = Math.min(1, exactHits / Math.max(1, seedConcepts.length));
247
+ item.score += 1.2 * exact;
248
+ addReason(item, { signal: 'exact', score: exact, detail: 'transient-concept' });
249
+ }
250
+ }
251
+
252
+ if (options.seedMemoryIds?.length) {
253
+ for (const memory of port.readByIds(scopes, options.seedMemoryIds.slice(0, 64))) {
254
+ if (!active(memory, now)) continue;
255
+ const item = ensureCandidate(candidates, memory);
256
+ item.score += 1;
257
+ addReason(item, { signal: 'exact', score: 1, detail: 'stable-memory-id' });
258
+ }
259
+ }
260
+
261
+ if (seedConcepts.length) {
262
+ for (const memory of fairScopedRead(
263
+ scopes,
264
+ Math.min(maxCandidates, 64),
265
+ (scope, limit) => port.exactByConcept([scope], seedConcepts, limit, activeAt),
266
+ )) {
267
+ if (!active(memory, now)) continue;
268
+ const hits = memory.concepts.filter(concept => seedConcepts.includes(concept)).length;
269
+ const score = Math.min(1, hits / Math.max(1, seedConcepts.length));
270
+ const item = ensureCandidate(candidates, memory);
271
+ item.score += 1.2 * score;
272
+ addReason(item, { signal: 'exact', score, detail: `concept:${memory.concepts.filter(concept => seedConcepts.includes(concept)).slice(0, 4).join(',')}` });
273
+ }
274
+ }
275
+
276
+ for (const memory of fairScopedRead(
277
+ scopes,
278
+ Math.min(maxCandidates, 128),
279
+ (scope, limit) => port.lexical([scope], [...queryTerms].slice(0, 96), limit, activeAt),
280
+ )) {
281
+ if (!active(memory, now)) continue;
282
+ const score = lexicalScore(memory, queryTerms);
283
+ if (!score) continue;
284
+ const item = ensureCandidate(candidates, memory);
285
+ item.score += score;
286
+ addReason(item, { signal: 'lexical', score, detail: 'term-overlap' });
287
+ }
288
+
289
+ if (options.semantic) {
290
+ try {
291
+ const semantic = options.semantic.search(query, scopes, Math.min(maxCandidates, 64));
292
+ const memories = port.readByAddresses(semantic.map(candidate => candidate.address));
293
+ const scoreByAddress = new Map(semantic.map(candidate => [memoryAddressKey(candidate.address), Math.max(0, Math.min(1, candidate.score))]));
294
+ for (const memory of memories) {
295
+ if (!active(memory, now)) continue;
296
+ const score = scoreByAddress.get(memoryAddressKey(memoryAddressOf(memory))) ?? 0;
297
+ if (!score) continue;
298
+ const item = ensureCandidate(candidates, memory);
299
+ item.score += score;
300
+ addReason(item, { signal: 'semantic', score, detail: 'derived-semantic-index' });
301
+ }
302
+ } catch {
303
+ gaps.push('semantic_index_unavailable');
304
+ }
305
+ }
306
+
307
+ let frontier = [...candidates.values()].slice(0, 64).map(item => memoryAddressOf(item.memory));
308
+ const seen = new Set(frontier.map(memoryAddressKey));
309
+ for (let depth = 1; depth <= maxGraphDepth && frontier.length && candidates.size < maxCandidates; depth++) {
310
+ const next: MemoryAddress[] = [];
311
+ for (const { edge, from, memory } of port.neighbors(frontier, Math.min(maxCandidates * 2, 512), activeAt)) {
312
+ if (!active(memory, now) || edge.retractedAt || edge.expiresAt && Date.parse(edge.expiresAt) <= now) continue;
313
+ const source = candidates.get(memoryAddressKey(from));
314
+ const relationFactor = graphRelationFactor(edge, from);
315
+ const propagated = Math.max(0.01, (source?.score ?? 0.5) * edge.weight * relationFactor * (1 / (depth + 0.5)));
316
+ const item = ensureCandidate(candidates, memory);
317
+ item.score += propagated;
318
+ addReason(item, { signal: 'graph', score: propagated, detail: `${edge.relation}@${depth}` });
319
+ if (source) item.activationPath = [...source.activationPath, edge.id, memoryAddressLabel(memoryAddressOf(memory))].slice(-9);
320
+ const key = memoryAddressKey(memoryAddressOf(memory));
321
+ if (!seen.has(key)) {
322
+ seen.add(key);
323
+ next.push(memoryAddressOf(memory));
324
+ }
325
+ if (candidates.size >= maxCandidates) break;
326
+ }
327
+ frontier = next;
328
+ }
329
+
330
+ // Consolidated representations and their retained sources form one retrieval
331
+ // family. Usage is aggregated mechanically across that family so rejecting a
332
+ // source cannot be bypassed by its semantically identical consolidated copy.
333
+ const familyRootByAddress = new Map<string, string>();
334
+ const familyMembers = new Map<string, Set<string>>();
335
+ const consolidatedCandidates = [...candidates.values()]
336
+ .filter(item => item.memory.facets.includes('consolidated'))
337
+ .slice(0, 64);
338
+ if (consolidatedCandidates.length) {
339
+ for (const item of consolidatedCandidates) {
340
+ const root = memoryAddressKey(memoryAddressOf(item.memory));
341
+ familyRootByAddress.set(root, root);
342
+ familyMembers.set(root, new Set([root]));
343
+ }
344
+ for (const { edge, from, memory } of port.neighbors(
345
+ consolidatedCandidates.map(item => memoryAddressOf(item.memory)),
346
+ 256,
347
+ activeAt,
348
+ )) {
349
+ if (edge.relation !== 'derived_from') continue;
350
+ const root = memoryAddressKey(from);
351
+ const source = memoryAddressKey(memoryAddressOf(memory));
352
+ if (!familyMembers.has(root)) continue;
353
+ familyRootByAddress.set(source, root);
354
+ familyMembers.get(root)!.add(source);
355
+ }
356
+ }
357
+
358
+ const usageFor = (memory: MemoryUnit): CognitiveUsageFeedback | undefined => {
359
+ const address = memoryAddressOf(memory);
360
+ const key = memoryAddressKey(address);
361
+ const root = familyRootByAddress.get(key);
362
+ const members = root ? familyMembers.get(root) : undefined;
363
+ if (!members) return usageByAddress.get(key);
364
+ let usedCount = 0, rejectedCount = 0, conflictCount = 0, staleCount = 0;
365
+ for (const member of members) {
366
+ const feedback = usageByAddress.get(member);
367
+ if (!feedback) continue;
368
+ usedCount += feedback.usedCount;
369
+ rejectedCount += feedback.rejectedCount;
370
+ conflictCount += feedback.conflictCount;
371
+ staleCount += feedback.staleCount;
372
+ }
373
+ return usedCount || rejectedCount || conflictCount || staleCount
374
+ ? { address, usedCount, rejectedCount, conflictCount, staleCount }
375
+ : undefined;
376
+ };
377
+
378
+ for (const item of candidates.values()) {
379
+ const recency = recencyScore(item.memory, now);
380
+ const confidenceContribution = item.memory.confidence * 0.25;
381
+ const storedConflictPenalty = Math.min(0.2, item.memory.counterEvidenceRefs.length * 0.04);
382
+ const feedback = usageFor(item.memory);
383
+ const usedBoost = Math.min(0.3, (feedback?.usedCount ?? 0) * 0.06);
384
+ const rejectedPenalty = Math.min(0.25, (feedback?.rejectedCount ?? 0) * 0.05);
385
+ const feedbackConflictPenalty = Math.min(0.2, ((feedback?.conflictCount ?? 0) + (feedback?.staleCount ?? 0)) * 0.08);
386
+ const usageAdjustment = usedBoost - rejectedPenalty - feedbackConflictPenalty;
387
+ item.score += recency * 0.15 + item.memory.utility * 0.25 + confidenceContribution - storedConflictPenalty + usageAdjustment;
388
+ item.score += options.scopePriors?.[item.memory.scope.kind] ?? 0;
389
+ addReason(item, { signal: 'recency', score: recency, detail: 'temporal-decay' });
390
+ addReason(item, { signal: 'utility', score: item.memory.utility, detail: 'stored-utility' });
391
+ addReason(item, { signal: 'confidence', score: item.memory.confidence, detail: 'stored-confidence' });
392
+ if (feedback && (feedback.usedCount || feedback.rejectedCount)) addReason(item, {
393
+ signal: 'usage',
394
+ score: Math.abs(usageAdjustment),
395
+ detail: `used:${feedback.usedCount};rejected:${feedback.rejectedCount}`,
396
+ });
397
+ const conflictPenalty = storedConflictPenalty + feedbackConflictPenalty;
398
+ if (conflictPenalty) addReason(item, {
399
+ signal: 'conflict',
400
+ score: conflictPenalty,
401
+ detail: feedbackConflictPenalty
402
+ ? `counter-evidence:${item.memory.counterEvidenceRefs.length};feedback-conflict:${feedback?.conflictCount ?? 0};stale:${feedback?.staleCount ?? 0}`
403
+ : `counter-evidence:${item.memory.counterEvidenceRefs.length}`,
404
+ });
405
+ }
406
+
407
+ const ranked = [...candidates.values()].sort((a, b) =>
408
+ b.score - a.score
409
+ || b.memory.provenance.recordedAt.localeCompare(a.memory.provenance.recordedAt)
410
+ || memoryAddressKey(memoryAddressOf(a.memory)).localeCompare(memoryAddressKey(memoryAddressOf(b.memory))));
411
+ const eligible = ranked.filter(item => retrievalCueScore(item, queryTerms, query) >= minCueScore);
412
+ const items: ActivationItem[] = [];
413
+ const seenFamilies = new Set<string>();
414
+ let estimatedBytes = 0;
415
+ for (const item of eligible) {
416
+ // A consolidated view and retained derived_from sources consume one slot.
417
+ // Choose the highest-ranked eligible representative; a non-cued consolidated
418
+ // item can never hide an otherwise eligible source. Conflict/supersession
419
+ // remain separate because they are not members of this representation family.
420
+ const addressKey = memoryAddressKey(memoryAddressOf(item.memory));
421
+ const familyKey = familyRootByAddress.get(addressKey) ?? addressKey;
422
+ if (seenFamilies.has(familyKey)) continue;
423
+ seenFamilies.add(familyKey);
424
+ const size = Buffer.byteLength(JSON.stringify({
425
+ address: memoryAddressLabel(memoryAddressOf(item.memory)),
426
+ facets: item.memory.facets,
427
+ text: item.memory.canonicalText,
428
+ concepts: item.memory.concepts,
429
+ score: item.score,
430
+ reasons: item.reasons,
431
+ evidence: item.memory.provenance.evidenceRefs,
432
+ }), 'utf8');
433
+ if (items.length >= maxItems || estimatedBytes + size > maxBytes) {
434
+ gaps.push('activation_budget');
435
+ continue;
436
+ }
437
+ items.push(item);
438
+ estimatedBytes += size;
439
+ }
440
+
441
+ return {
442
+ schemaVersion: 1,
443
+ query: query.slice(0, 8_192),
444
+ generatedAt: nowText,
445
+ items,
446
+ gaps: [...new Set(gaps)],
447
+ truncated: gaps.includes('activation_budget') || candidates.size >= maxCandidates,
448
+ inspectedCandidates: candidates.size,
449
+ estimatedBytes,
450
+ };
451
+ }
@@ -0,0 +1,185 @@
1
+ import { createHash } from 'node:crypto';
2
+ import type { ScopeRef } from '../../identity/api/index';
3
+ import {
4
+ cognitiveTerms,
5
+ type MemoryEdge,
6
+ type MemoryUnit,
7
+ validateMemoryEdge,
8
+ validateMemoryUnit,
9
+ } from '../domain/memory';
10
+
11
+ export type InferredMemoryRelation = 'supports' | 'contradicts' | 'analogous_to' | 'supersedes';
12
+ export interface MemoryAssociation { relation: InferredMemoryRelation; weight: number; affinity: number }
13
+ export interface ConsolidationCandidate { memory: MemoryUnit; supportingIds: string[]; sourceRetained: true }
14
+ export interface ConsolidationResult { candidates: ConsolidationCandidate[]; edges: MemoryEdge[]; skipped: Array<{ id: string; reason: string }> }
15
+
16
+ function digest(value: string): string { return createHash('sha256').update(value).digest('hex'); }
17
+ function intersection<T>(sets: ReadonlyArray<ReadonlySet<T>>): T[] {
18
+ if (!sets.length) return [];
19
+ return [...sets[0]!].filter(value => sets.every(set => set.has(value)));
20
+ }
21
+ function sameScope(memory: MemoryUnit, scope: ScopeRef): boolean {
22
+ return memory.scope.kind === scope.kind && memory.scope.id === scope.id;
23
+ }
24
+ function overlap(left: ReadonlySet<string>, right: ReadonlySet<string>): number {
25
+ if (!left.size || !right.size) return 0;
26
+ let shared = 0;
27
+ for (const value of left) if (right.has(value)) shared += 1;
28
+ return shared / Math.max(1, Math.min(left.size, right.size));
29
+ }
30
+ function conceptParts(memory: MemoryUnit): Set<string> {
31
+ return new Set(memory.concepts.flatMap(concept => concept.split(/[._:/-]+/))
32
+ .map(value => value.trim().toLowerCase())
33
+ .filter(value => value.length >= 3));
34
+ }
35
+ const GENERIC_ASSOCIATION_FACETS = new Set([
36
+ 'learning', 'admission.advisory', 'knowledge', 'success', 'failure', 'novelty', 'correction',
37
+ 'contradiction', 'pattern', 'preference', 'principle', 'procedure',
38
+ ]);
39
+ function lexicalTerms(memory: MemoryUnit): Set<string> {
40
+ return cognitiveTerms(`${memory.canonicalText}\n${memory.concepts.join(' ')}`);
41
+ }
42
+ function semanticFacets(memory: MemoryUnit): Set<string> {
43
+ return new Set(memory.facets.filter(value => !GENERIC_ASSOCIATION_FACETS.has(value)
44
+ && !value.startsWith('source.') && !value.startsWith('valence.')
45
+ && !value.startsWith('portability.') && !value.startsWith('admission.')));
46
+ }
47
+ function facet(memory: MemoryUnit, value: string): boolean {
48
+ return memory.facets.includes(value);
49
+ }
50
+ function opposedValence(left: MemoryUnit, right: MemoryUnit): boolean {
51
+ return (facet(left, 'valence.positive') && facet(right, 'valence.negative'))
52
+ || (facet(left, 'valence.negative') && facet(right, 'valence.positive'));
53
+ }
54
+
55
+ /**
56
+ * Deterministic semantic association. The Controller has already produced normalized concepts;
57
+ * this layer only compares canonical MemoryUnit data and never invents a second semantic authority.
58
+ */
59
+ export function inferMemoryAssociation(from: MemoryUnit, to: MemoryUnit): MemoryAssociation | undefined {
60
+ if (from.id === to.id || !sameScope(from, to.scope)) return undefined;
61
+ const exactConcept = overlap(new Set(from.concepts), new Set(to.concepts));
62
+ const conceptAffinity = overlap(conceptParts(from), conceptParts(to));
63
+ const lexicalAffinity = overlap(lexicalTerms(from), lexicalTerms(to));
64
+ const facetAffinity = overlap(semanticFacets(from), semanticFacets(to));
65
+ const affinity = Math.min(1, Math.max(
66
+ exactConcept,
67
+ conceptAffinity * 0.72 + lexicalAffinity * 0.18 + facetAffinity * 0.10,
68
+ lexicalAffinity * 0.75 + conceptAffinity * 0.25,
69
+ ));
70
+ if (affinity < 0.28) return undefined;
71
+
72
+ let relation: InferredMemoryRelation;
73
+ if (facet(from, 'correction') && affinity >= 0.45) relation = 'supersedes';
74
+ else if ((facet(from, 'contradiction') || facet(to, 'contradiction') || opposedValence(from, to)) && affinity >= 0.50) relation = 'contradicts';
75
+ else if (affinity >= 0.55) relation = 'supports';
76
+ else relation = 'analogous_to';
77
+
78
+ const confidence = Math.sqrt(Math.max(0, from.confidence) * Math.max(0, to.confidence));
79
+ const weight = Math.max(0.2, Math.min(0.98, affinity * 0.82 + confidence * 0.18));
80
+ return { relation, weight, affinity };
81
+ }
82
+
83
+ function unionFindClusters(memories: readonly MemoryUnit[]): MemoryUnit[][] {
84
+ const parent = memories.map((_, index) => index);
85
+ const find = (index: number): number => {
86
+ let current = index;
87
+ while (parent[current] !== current) {
88
+ parent[current] = parent[parent[current]!]!;
89
+ current = parent[current]!;
90
+ }
91
+ return current;
92
+ };
93
+ const join = (left: number, right: number): void => {
94
+ const a = find(left), b = find(right);
95
+ if (a !== b) parent[b] = a;
96
+ };
97
+ for (let left = 0; left < memories.length; left += 1) {
98
+ for (let right = left + 1; right < memories.length; right += 1) {
99
+ const association = inferMemoryAssociation(memories[left]!, memories[right]!);
100
+ if (association?.relation === 'supports'
101
+ || association?.relation === 'analogous_to' && association.affinity >= 0.48) join(left, right);
102
+ }
103
+ }
104
+ const clusters = new Map<number, MemoryUnit[]>();
105
+ for (let index = 0; index < memories.length; index += 1) {
106
+ const root = find(index);
107
+ const group = clusters.get(root) ?? [];
108
+ group.push(memories[index]!);
109
+ clusters.set(root, group);
110
+ }
111
+ return [...clusters.values()].filter(group => group.length >= 2);
112
+ }
113
+
114
+ export function consolidateMemories(scope: ScopeRef, memories: readonly MemoryUnit[], now = new Date().toISOString()): ConsolidationResult {
115
+ const nowMs = Date.parse(now);
116
+ if (!Number.isFinite(nowMs)) throw new Error('COGNITION_CONSOLIDATION_TIME_INVALID');
117
+
118
+ const active = [...new Map(memories
119
+ .filter(memory => sameScope(memory, scope)
120
+ && !memory.retractedAt
121
+ && (!memory.expiresAt || Date.parse(memory.expiresAt) > nowMs))
122
+ .map(memory => [memory.id, memory])).values()]
123
+ .slice(0, 128);
124
+
125
+ const candidates: ConsolidationCandidate[] = [];
126
+ const edges: MemoryEdge[] = [];
127
+ const skipped: Array<{ id: string; reason: string }> = [];
128
+ for (const group of unionFindClusters(active)) {
129
+ const sources = [...group].sort((a, b) => a.id.localeCompare(b.id));
130
+ const evidence = [...new Set(sources.flatMap(memory => memory.provenance.evidenceRefs))].slice(0, 64);
131
+ const traceable = sources.every(memory => Boolean(
132
+ memory.provenance.sourceRoundId || memory.provenance.sourceId || memory.provenance.evidenceRefs.length));
133
+ if (!traceable) {
134
+ skipped.push({ id: sources.map(memory => memory.id).join(','), reason: 'no_provenance' });
135
+ continue;
136
+ }
137
+
138
+ const sharedFacets = intersection(sources.map(memory => new Set(memory.facets)));
139
+ const averageUtility = sources.reduce((sum, memory) => sum + memory.utility, 0) / sources.length;
140
+ const averageConfidence = sources.reduce((sum, memory) => sum + memory.confidence, 0) / sources.length;
141
+ const sourceObservations = new Set(sources.map(memory => {
142
+ const provenance = memory.provenance;
143
+ if (provenance.sourceRoundId) return `round:${provenance.sourceRoundId}`;
144
+ if (provenance.sourceId) return `${provenance.sourceKind}:${provenance.sourceId}`;
145
+ return `evidence:${[...provenance.evidenceRefs].sort().join('|')}`;
146
+ }));
147
+ const corroborationBoost = Math.min(0.15, Math.max(0, sourceObservations.size - 1) * 0.05);
148
+ const confidence = Math.min(0.99, averageConfidence + corroborationBoost);
149
+ const clusterKey = sources.map(memory => memory.id).sort().join('|');
150
+ const key = digest(`${scope.kind}:${scope.id}:${clusterKey}`).slice(0, 24);
151
+ const orderedByValue = [...sources].sort((a, b) =>
152
+ b.utility - a.utility || b.confidence - a.confidence || b.provenance.recordedAt.localeCompare(a.provenance.recordedAt) || a.id.localeCompare(b.id));
153
+ const representative = orderedByValue[0]!;
154
+ const memory = validateMemoryUnit({
155
+ schemaVersion: 1,
156
+ id: `consolidated:${digest(representative.concepts.join('|') || representative.id).slice(0, 16)}:${key}`,
157
+ revision: 1,
158
+ scope,
159
+ facets: [...new Set(['knowledge', 'pattern', 'consolidated', ...sharedFacets])].slice(0, 16),
160
+ canonicalText: representative.canonicalText,
161
+ concepts: [...new Set(sources.flatMap(item => item.concepts))].slice(0, 64),
162
+ provenance: { sourceKind: 'system', sourceId: `consolidation:${key}`, recordedAt: now, evidenceRefs: evidence },
163
+ confidence,
164
+ utility: Math.min(1, averageUtility + Math.min(0.1, (sources.length - 1) * 0.03)),
165
+ tier: 'warm',
166
+ validFrom: now,
167
+ counterEvidenceRefs: [...new Set(sources.flatMap(memory => memory.counterEvidenceRefs))].slice(0, 64),
168
+ });
169
+ candidates.push({ memory, supportingIds: sources.map(item => item.id), sourceRetained: true });
170
+ for (const source of sources) {
171
+ edges.push(validateMemoryEdge({
172
+ schemaVersion: 1,
173
+ id: `edge:${key}:${digest(source.id).slice(0, 12)}`,
174
+ scope,
175
+ fromId: memory.id,
176
+ toId: source.id,
177
+ relation: 'derived_from',
178
+ weight: Math.max(0.1, source.confidence),
179
+ evidenceRefs: source.provenance.evidenceRefs.slice(0, 64),
180
+ recordedAt: now,
181
+ }));
182
+ }
183
+ }
184
+ return { candidates, edges, skipped };
185
+ }
@@ -0,0 +1,38 @@
1
+ import { cognitiveTerms, validateMemoryUnit, type MemoryUnit } from '../domain/memory';
2
+ import type { ExperienceRecord, OutcomeObservation } from '../../memory/api/index';
3
+
4
+ function stableConcepts(prefix: string, scopeKind: string, scopeId: string, text: string): string[] {
5
+ const lexical = [...cognitiveTerms(text)].filter(term => /^[a-z0-9][a-z0-9._:/-]{0,255}$/i.test(term)).slice(0, 24);
6
+ return [...new Set([prefix, `scope.${scopeKind}:${scopeId}`, ...lexical])].slice(0, 64);
7
+ }
8
+
9
+ /** Compatibility adapter only. It does not persist a second copy of Experience. */
10
+ export function memoryUnitFromExperience(record: ExperienceRecord): MemoryUnit {
11
+ const confidence = record.kind === 'lesson' ? 0.82 : record.kind === 'hypothesis' ? 0.55 : 0.68;
12
+ const utility = record.kind === 'lesson' ? 0.82 : record.kind === 'hypothesis' ? 0.58 : 0.52;
13
+ return validateMemoryUnit({
14
+ schemaVersion: 1,
15
+ id: record.id,
16
+ revision: record.revision,
17
+ scope: record.scope,
18
+ facets: ['knowledge', record.kind],
19
+ canonicalText: record.statement,
20
+ concepts: stableConcepts(`experience.${record.kind}`, record.scope.kind, record.scope.id, record.statement),
21
+ provenance: { sourceKind: 'experience', sourceId: record.id, sourceWorkId: record.sourceWorkId, sourceRoundId: record.sourceRoundId, recordedAt: record.recordedAt, evidenceRefs: record.evidenceRefs },
22
+ confidence,
23
+ utility,
24
+ tier: record.kind === 'observation' ? 'cold' : 'warm',
25
+ validFrom: record.recordedAt,
26
+ ...(record.expiresAt ? { expiresAt: record.expiresAt } : {}),
27
+ ...(record.supersedesId ? { supersedesId: record.supersedesId } : {}),
28
+ counterEvidenceRefs: record.counterEvidenceRefs,
29
+ ...(record.retractedAt ? { retractedAt: record.retractedAt, retractionReason: record.retractionReason } : {}),
30
+ });
31
+ }
32
+
33
+ export function memoryUnitFromOutcome(observation: OutcomeObservation): MemoryUnit {
34
+ const observed = observation.metrics.filter(metric => metric.value !== null).map(metric => `${metric.name}=${metric.value} ${metric.unit}`).join(', ');
35
+ const missing = observation.metrics.filter(metric => metric.value === null).map(metric => `${metric.name}: ${metric.missingReason}`).join(', ');
36
+ const text = [`Outcome for ${observation.remoteObject.channel}/${observation.remoteObject.id}`, observed, missing].filter(Boolean).join('. ');
37
+ return validateMemoryUnit({ schemaVersion: 1, id: observation.id, revision: 1, scope: observation.scope, facets: ['observation', 'outcome'], canonicalText: text, concepts: stableConcepts('outcome.observation', observation.scope.kind, observation.scope.id, `${text} ${observation.remoteObject.channel}`), provenance: { sourceKind: 'outcome', sourceId: observation.id, sourceWorkId: observation.sourceWorkId, sourceRoundId: observation.sourceRoundId, recordedAt: observation.observedAt, evidenceRefs: [observation.evidenceRef] }, confidence: 0.9, utility: 0.6, tier: 'cold', validFrom: observation.observedAt, counterEvidenceRefs: [] });
38
+ }