@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
@@ -6,37 +6,54 @@ import { buildContextClosureReceipt } from "../../../src/runtime/context/context
6
6
  import { codegraphRepositoryCacheRoot } from "../../../src/runtime/context/codegraph-cache-boundary";
7
7
  import type { MultiRepositoryMcpToolContext } from "../multi-repository";
8
8
  import { result } from "./result-adapter";
9
+ import { boundedRuntimeResult } from "./bounded-result-runtime";
9
10
  import { selected } from "./shared-adapter";
10
11
  import { resolveMcpPath } from "../paths";
11
12
  import { freshGitIdentity } from "../../../src/cli/repository/inspector";
12
13
  import { repositoryCheckoutLifecycle, repositorySummary, resolveRepositorySelection } from "../../../src/cli/repositories/registry";
13
14
  import { getExecutionJob, listExecutionJobs } from "../../../src/runtime/execution/jobs/store";
14
15
  import { isManagedProcessActive, listProcessRecords, listRecoverableProcessRecords, processRuntimeResourceDiagnostics } from "../../../src/runtime/execution/process-runtime";
15
- import { buildControllerContextPackAsync, CONTROLLER_CONTEXT_IMPACT_DOMAINS, type ControllerContextImpactDomain } from "../../../src/cli/controller/context-pack";
16
+ import { CONTROLLER_CONTEXT_IMPACT_DOMAINS, type ControllerContextImpactDomain } from "../../../src/cli/controller/context/types";
17
+ import { buildControllerContextPackInSidecar } from "../../../src/runtime/context/context-pack-process";
16
18
  import { listControllerChecks } from "../../../src/cli/controller/check-runner";
17
- import { controllerPluginRepository, getAssistantPluginManifest, listAssistantPluginManifests } from "../../../src/runtime/plugins/store";
18
- import { allowedFacadeOperations, buildFacadeResult, listCapabilityDescriptors, getCapabilityDescriptor, getPluginActionCapabilitySchema, searchCapabilityDescriptors, summarizeCapabilityGroups, listHandoffItems, normalizeCheckIds, summarizeHandoffItem, buildWorkContinuationSnapshot } from "../../../src/runtime/control-plane/facade";
19
- import { getWorkContract, readActiveWorkCandidates, type InvalidActiveWorkCandidate } from "../../../packages/kernel/work/api/index";
19
+ import { getAssistantPluginManifest, getControllerPluginManifest, listAssistantPluginManifests, listControllerPluginManifests } from "../../../src/runtime/plugins/store";
20
+ import { allowedFacadeOperations, buildFacadeResult, listCapabilityDescriptors, getCapabilityDescriptor, getCoreCapabilityExecutionSchema, getPluginActionCapabilitySchema, searchCapabilityDescriptors, summarizeCapabilityGroups, listHandoffAttentionItems, listHandoffItems, normalizeCheckIds, summarizeHandoffItem, buildWorkContinuationSnapshot, getPlanContract, planSemanticView, FACADE_TOOLS } from "../../../src/runtime/control-plane/facade";
21
+ import { currentTaskLineageWorkIds, currentTaskSemanticProjectionForWork, getWorkContract, readActiveWorkCandidates, readWorkContractStore, workSemanticView, type InvalidActiveWorkCandidate, type WorkContract } from "../../../packages/kernel/work/api/index";
22
+ import { readRequirement, requirementSemanticView } from '../../../src/runtime/control-plane/persistence/requirement-store';
23
+ import { readForgeInstanceIdentity, type ScopeRef } from "../../../packages/kernel/identity/api/index";
24
+ import { memoryAddressKey } from "../../../packages/kernel/cognition/api/index";
20
25
  import { currentControllerInstanceId } from "../../../src/runtime/control-plane/execution/session-store";
21
26
  import { getControllerSession } from "../../../packages/kernel/controller/api/index";
27
+ import { resolveProjectForRepositoryPlacement } from "../../../src/runtime/control-plane/workspace/workspace-store";
28
+ import { cognitiveScopesForWork } from "../../../src/runtime/control-plane/persistence/experience-store";
29
+ import { activateCognitiveMemory, auditCognitiveMemory } from "../../../src/runtime/control-plane/persistence/cognition-store";
30
+ import { cognitiveUsageFeedbackForContext, resolveCognitiveAttention } from "../../../src/runtime/context/cognitive-attention";
22
31
  import { invalidFacadeOperation, repositoryExecutionReadiness, summarizeInvalidActiveWorkCandidate, summarizeWorkListItem } from './status-inbox-adapter';
23
32
  import type { CallToolResult } from '../../../packages/protocols/mcp/tool-contract';
24
33
 
25
- const RH_CONTEXT_CURRENT_WINDOW_MS = 24 * 60 * 60 * 1_000;
34
+ const RH_CONTEXT_RECENT_ACTIVITY_WINDOW_MS = 24 * 60 * 60 * 1_000;
35
+ const RH_CONTEXT_AUTOMATIC_RECALL_LIMIT = 4;
26
36
 
27
- function timestampIsCurrent(value: string | undefined, cutoffMs: number): boolean {
37
+ function timestampIsRecent(value: string | undefined, cutoffMs: number): boolean {
28
38
  if (!value) return false;
29
39
  const timestamp = Date.parse(value);
30
40
  return Number.isFinite(timestamp) && timestamp >= cutoffMs;
31
41
  }
32
42
 
33
- function isCurrentRhContextWork(
34
- contract: { status: string; updatedAt?: string },
43
+ const RESUME_CONTEXT_HUMAN_REQUEST_REASONS = new Set([
44
+ 'policy_approval_required',
45
+ 'missing_authorization',
46
+ 'invalid_objective',
47
+ 'destructive_action_requires_confirmation',
48
+ ]);
49
+
50
+ function isRecentRhContextWork(
51
+ contract: Pick<WorkContract, 'semanticState' | 'dispatchState' | 'updatedAt'>,
35
52
  cutoffMs: number,
36
53
  ): boolean {
37
- if (contract.status === 'running') return true;
38
- if (contract.status !== 'ready' && contract.status !== 'open' && contract.status !== 'blocked') return false;
39
- return timestampIsCurrent(contract.updatedAt, cutoffMs);
54
+ if (contract.semanticState !== 'open') return false;
55
+ if (contract.dispatchState === 'running' || contract.dispatchState === 'launching' || contract.dispatchState === 'claimed') return true;
56
+ return timestampIsRecent(contract.updatedAt, cutoffMs);
40
57
  }
41
58
 
42
59
  function rhContextReadSessionId(ctx: MultiRepositoryMcpToolContext): string | undefined {
@@ -49,6 +66,173 @@ function rhContextReadSessionId(ctx: MultiRepositoryMcpToolContext): string | un
49
66
  return transportSession ? `transport:${transportSession}` : undefined;
50
67
  }
51
68
 
69
+ function rhContextKnowledgeAuditRequested(args: Record<string, unknown>): boolean {
70
+ return [
71
+ 'knowledge_query', 'knowledge_memory_id', 'knowledge_scope_kind', 'knowledge_scope_id',
72
+ 'knowledge_concept', 'knowledge_facet', 'knowledge_source_kind', 'knowledge_source_work_id',
73
+ ].some(key => typeof args[key] === 'string' && String(args[key]).trim().length > 0)
74
+ || typeof args.knowledge_limit === 'number';
75
+ }
76
+
77
+ function rhContextKnowledgeScopes(
78
+ ctx: MultiRepositoryMcpToolContext,
79
+ repository: ReturnType<typeof selected>,
80
+ workId: string | undefined,
81
+ ): { scopes: ScopeRef[]; projectId?: string; gaps: string[] } {
82
+ const store = { controllerHome: ctx.controllerHome, repoId: repository.repoId };
83
+ const work = workId ? getWorkContract(store, workId) : undefined;
84
+ if (work) {
85
+ const scopes = cognitiveScopesForWork(work, ctx.controllerHome);
86
+ return { scopes, projectId: scopes.find(scope => scope.kind === 'project')?.id, gaps: [] };
87
+ }
88
+ const instance = readForgeInstanceIdentity(ctx.controllerHome);
89
+ if (!instance) return { scopes: [], gaps: ['forge_instance_identity_unavailable'] };
90
+ const project = resolveProjectForRepositoryPlacement({
91
+ controllerHome: ctx.controllerHome,
92
+ forgeInstanceId: instance.instanceId,
93
+ repositoryId: repository.repoId,
94
+ checkoutId: repository.activeCheckoutId,
95
+ });
96
+ if (!project) return { scopes: [], gaps: ['project_placement_unavailable'] };
97
+ return {
98
+ projectId: project.projectId,
99
+ scopes: [
100
+ { schemaVersion: 1, kind: 'project', id: project.projectId },
101
+ { schemaVersion: 1, kind: 'workspace', id: project.workspaceId },
102
+ ],
103
+ gaps: [],
104
+ };
105
+ }
106
+
107
+ function rhContextKnowledgeAudit(
108
+ ctx: MultiRepositoryMcpToolContext,
109
+ repository: ReturnType<typeof selected>,
110
+ args: Record<string, unknown>,
111
+ ): Record<string, unknown> {
112
+ const workId = typeof args.work_id === 'string' && args.work_id.trim() ? args.work_id.trim() : undefined;
113
+ const resolved = rhContextKnowledgeScopes(ctx, repository, workId);
114
+ const requestedKind = typeof args.knowledge_scope_kind === 'string' ? args.knowledge_scope_kind.trim() : '';
115
+ const requestedId = typeof args.knowledge_scope_id === 'string' ? args.knowledge_scope_id.trim() : '';
116
+ const scopes = resolved.scopes.filter(scope =>
117
+ (!requestedKind || scope.kind === requestedKind) && (!requestedId || scope.id === requestedId));
118
+ const scopeMismatch = resolved.scopes.length > 0 && scopes.length === 0 && Boolean(requestedKind || requestedId);
119
+ const rawQuery = typeof args.knowledge_query === 'string' ? args.knowledge_query.trim() : '';
120
+ const query = rawQuery === '*' ? '' : rawQuery;
121
+ const audit = auditCognitiveMemory(ctx.controllerHome, {
122
+ scopes,
123
+ ...(query ? { query } : {}),
124
+ ...(typeof args.knowledge_memory_id === 'string' && args.knowledge_memory_id.trim()
125
+ ? { memoryId: args.knowledge_memory_id.trim() } : {}),
126
+ ...(typeof args.knowledge_concept === 'string' && args.knowledge_concept.trim()
127
+ ? { concept: args.knowledge_concept.trim() } : {}),
128
+ ...(typeof args.knowledge_facet === 'string' && args.knowledge_facet.trim()
129
+ ? { facet: args.knowledge_facet.trim() } : {}),
130
+ ...(typeof args.knowledge_source_kind === 'string' && args.knowledge_source_kind.trim()
131
+ ? { sourceKind: args.knowledge_source_kind.trim() as 'experience' | 'outcome' | 'knowledge' | 'controller' | 'system' | 'external' } : {}),
132
+ ...(typeof args.knowledge_source_work_id === 'string' && args.knowledge_source_work_id.trim()
133
+ ? { sourceWorkId: args.knowledge_source_work_id.trim() } : {}),
134
+ ...(typeof args.knowledge_limit === 'number' ? { limit: args.knowledge_limit } : {}),
135
+ });
136
+ const usage = cognitiveUsageFeedbackForContext({
137
+ controllerHome: ctx.controllerHome,
138
+ repoId: repository.repoId,
139
+ scopes,
140
+ ...(resolved.projectId ? { projectId: resolved.projectId } : {}),
141
+ });
142
+ const usageByAddress = new Map(usage.map(item => [memoryAddressKey(item.address), item]));
143
+ const activation = query
144
+ ? activateCognitiveMemory(ctx.controllerHome, scopes, query, {
145
+ maxItems: Math.min(32, Math.max(1, typeof args.knowledge_limit === 'number' ? Math.trunc(args.knowledge_limit) : 24)),
146
+ usageFeedback: usage,
147
+ })
148
+ : undefined;
149
+ const activationByAddress = new Map((activation?.items ?? []).map(item => [
150
+ memoryAddressKey({ scope: item.memory.scope, id: item.memory.id }),
151
+ { score: item.score, reasons: item.reasons, activationPath: item.activationPath },
152
+ ]));
153
+ return {
154
+ readonly: true,
155
+ advisoryOnly: true,
156
+ authorityBoundary: 'Learned memory never overrides project contracts, authorization, verification, Requirement/Plan/Work, or semantic acceptance.',
157
+ scopes,
158
+ filters: {
159
+ ...(rawQuery ? { query: rawQuery } : {}),
160
+ ...(requestedKind ? { scopeKind: requestedKind } : {}),
161
+ ...(requestedId ? { scopeId: requestedId } : {}),
162
+ ...(typeof args.knowledge_memory_id === 'string' && args.knowledge_memory_id.trim() ? { memoryId: args.knowledge_memory_id.trim() } : {}),
163
+ ...(typeof args.knowledge_concept === 'string' && args.knowledge_concept.trim() ? { concept: args.knowledge_concept.trim() } : {}),
164
+ ...(typeof args.knowledge_facet === 'string' && args.knowledge_facet.trim() ? { facet: args.knowledge_facet.trim() } : {}),
165
+ ...(typeof args.knowledge_source_kind === 'string' && args.knowledge_source_kind.trim() ? { sourceKind: args.knowledge_source_kind.trim() } : {}),
166
+ ...(typeof args.knowledge_source_work_id === 'string' && args.knowledge_source_work_id.trim() ? { sourceWorkId: args.knowledge_source_work_id.trim() } : {}),
167
+ },
168
+ items: audit.items.map(entry => {
169
+ const address = memoryAddressKey({ scope: entry.memory.scope, id: entry.memory.id });
170
+ return {
171
+ memory: entry.memory,
172
+ relations: entry.relations,
173
+ recentUsage: usageByAddress.get(address),
174
+ activation: activationByAddress.get(address),
175
+ };
176
+ }),
177
+ inspected: audit.inspected,
178
+ truncated: audit.truncated,
179
+ gaps: [...resolved.gaps, ...(scopeMismatch ? ['requested_cognitive_scope_not_reachable'] : [])],
180
+ };
181
+ }
182
+
183
+ function rhContextLearningRecall(
184
+ ctx: MultiRepositoryMcpToolContext,
185
+ repository: ReturnType<typeof selected>,
186
+ query: string,
187
+ workId?: string,
188
+ limit = RH_CONTEXT_AUTOMATIC_RECALL_LIMIT,
189
+ ): Record<string, unknown> {
190
+ const resolved = rhContextKnowledgeScopes(ctx, repository, workId);
191
+ if (!query.trim() || resolved.scopes.length === 0) {
192
+ return { advisoryOnly: true, scopes: resolved.scopes, items: [], gaps: resolved.gaps };
193
+ }
194
+ const usage = cognitiveUsageFeedbackForContext({
195
+ controllerHome: ctx.controllerHome,
196
+ repoId: repository.repoId,
197
+ scopes: resolved.scopes,
198
+ ...(resolved.projectId ? { projectId: resolved.projectId } : {}),
199
+ });
200
+ const activation = resolveCognitiveAttention({
201
+ controllerHome: ctx.controllerHome,
202
+ scopes: resolved.scopes,
203
+ query: query.slice(0, 4_000),
204
+ now: new Date().toISOString(),
205
+ maxItems: Math.min(8, Math.max(1, limit)),
206
+ maxBytes: 12 * 1024,
207
+ usageFeedback: usage,
208
+ });
209
+ return {
210
+ advisoryOnly: true,
211
+ authorityBoundary: 'Learned context may guide model decisions but never grants execution, lifecycle, or acceptance authority.',
212
+ scopePolicy: 'unified_relevance_with_narrow_scope_prior',
213
+ scopes: resolved.scopes,
214
+ items: activation.items.map(entry => ({
215
+ memoryId: memoryAddressKey({ scope: entry.memory.scope, id: entry.memory.id }),
216
+ text: entry.memory.canonicalText,
217
+ score: entry.score,
218
+ reasons: entry.reasons,
219
+ activationPath: entry.activationPath,
220
+ facets: entry.memory.facets,
221
+ concepts: entry.memory.concepts,
222
+ provenance: entry.memory.provenance,
223
+ })),
224
+ gaps: [...resolved.gaps, ...activation.gaps],
225
+ progressiveAttention: {
226
+ workingSetBounded: true,
227
+ moreCandidatesAvailable: activation.truncated,
228
+ inspectedCandidates: activation.inspectedCandidates,
229
+ modelDecision: activation.truncated
230
+ ? 'This is an initial working set, not semantic completeness. If the current decision still lacks relevant prior context, issue a narrower rh_context query or an explicit knowledge_query/knowledge_limit expansion; otherwise reuse this working set through routine micro-steps.'
231
+ : 'Decide whether this working set is semantically sufficient. Reuse it through routine micro-steps; only recall again when the task meaning/strategy changes or missing prior context could change the decision.',
232
+ },
233
+ };
234
+ }
235
+
52
236
  const RH_CONTEXT_SEMANTIC_QUERY_LIMIT = 8;
53
237
 
54
238
  const RH_CONTEXT_SEMANTIC_LOCATION_LIMIT = 200;
@@ -171,6 +355,12 @@ async function rhContextSemanticNavigation(
171
355
  cacheScope: `mcp:${semanticAccessScope}`,
172
356
  sourceIdentity: sourceFingerprintBefore,
173
357
  profile: policy.profile,
358
+ readPolicy: {
359
+ profile: policy.profile,
360
+ readGlobs: [...policy.readGlobs],
361
+ denyGlobs: [...policy.denyGlobs],
362
+ maxFileBytes: policy.maxFileBytes,
363
+ },
174
364
  allowRepositoryPath,
175
365
  });
176
366
 
@@ -180,6 +370,15 @@ async function rhContextSemanticNavigation(
180
370
  continue;
181
371
  }
182
372
  const semantic = outcome.result;
373
+ const sidecarDeniedReads = Math.max(0, Number(semantic.policyDeniedReads ?? 0));
374
+ policyDeniedReads += sidecarDeniedReads;
375
+ const sidecarDeniedSamples = semantic.details?.policyDeniedReadSamples;
376
+ if (Array.isArray(sidecarDeniedSamples)) {
377
+ for (const sample of sidecarDeniedSamples) {
378
+ if (policyDeniedReadSamples.size >= 20) break;
379
+ if (typeof sample === 'string' && sample.trim()) policyDeniedReadSamples.add(sample);
380
+ }
381
+ }
183
382
  const allowedLocations = semantic.locations.filter((location) => {
184
383
  const decision = resolveMcpPath(repoRoot, location.path, policy, 'read');
185
384
  if (decision.ok) return true;
@@ -302,15 +501,38 @@ export async function callContextAdapter(ctx: MultiRepositoryMcpToolContext, nam
302
501
  }
303
502
  if (operation === 'search') {
304
503
  const query = typeof args.query === 'string' ? args.query.trim() : '';
305
- if (!query) {
504
+ const knowledgeAuditRequested = rhContextKnowledgeAuditRequested(args);
505
+ if (!query && !knowledgeAuditRequested) {
306
506
  const facade = buildFacadeResult({
307
507
  status: 'failed',
308
- summary: 'rh_context.search requires a non-empty query.',
508
+ summary: 'rh_context.search requires a non-empty code query or explicit knowledge audit fields.',
309
509
  data: { operation, repoId: repository.repoId },
310
510
  suggestedNextActions: [],
311
511
  });
312
512
  return result(facade as unknown as Record<string, unknown>, true);
313
513
  }
514
+ const cognitionAudit = knowledgeAuditRequested ? rhContextKnowledgeAudit(ctx, repository, args) : undefined;
515
+ const includeLearningRecall = args.include_learning_recall !== false;
516
+ const learningRecall = query && !knowledgeAuditRequested && includeLearningRecall
517
+ ? rhContextLearningRecall(ctx, repository, query, typeof args.work_id === 'string' ? args.work_id.trim() || undefined : undefined)
518
+ : undefined;
519
+ if (!query && cognitionAudit) {
520
+ const items = Array.isArray(cognitionAudit.items) ? cognitionAudit.items : [];
521
+ const facade = buildFacadeResult({
522
+ status: 'ok',
523
+ summary: `Retrieved ${items.length} bounded learned-memory audit item(s).`,
524
+ data: { operation, repoId: repository.repoId, cognitionAudit },
525
+ warnings: [],
526
+ suggestedNextActions: [],
527
+ detailLevel: args.detail_level === 'detail' || args.detail_level === 'raw' ? args.detail_level : 'summary',
528
+ rawAvailable: false,
529
+ });
530
+ // cognitionAudit is already bounded by scope/item/relation/usage/activation budgets.
531
+ // Preserve its nested provenance and reasoning rather than letting generic facade depth
532
+ // bounding turn the read-only audit contract into opaque "[bounded-depth]" markers.
533
+ (facade.data as typeof facade.data & { cognitionAudit: typeof cognitionAudit }).cognitionAudit = cognitionAudit;
534
+ return result(facade as unknown as Record<string, unknown>);
535
+ }
314
536
  const legacySemanticQuery = rhContextLegacySemanticQuery(query);
315
537
  const retrievalQuery = legacySemanticQuery.retrievalQuery;
316
538
  const list = (value: unknown): string[] => Array.isArray(value)
@@ -340,7 +562,10 @@ export async function callContextAdapter(ctx: MultiRepositoryMcpToolContext, nam
340
562
  checkoutId: repository.activeCheckoutId,
341
563
  })
342
564
  : undefined;
343
- const pack = await buildControllerContextPackAsync(repository.canonicalRoot, ctx.policy, {
565
+ const pack = await buildControllerContextPackInSidecar({
566
+ repoRoot: repository.canonicalRoot,
567
+ policy: ctx.policy,
568
+ options: {
344
569
  description: retrievalQuery,
345
570
  // Short code-like queries remain useful exact lexical needles. Long
346
571
  // semantic prompts are already tokenized from description; adding the
@@ -356,9 +581,10 @@ export async function callContextAdapter(ctx: MultiRepositoryMcpToolContext, nam
356
581
  structuralIndexRoot: structuralContext === 'off' ? undefined : resolveStructuralIndexRoot(ctx.controllerHome, repository),
357
582
  retrievalMode,
358
583
  impactDomains,
359
- session: rhContextReadSessionId(ctx)
360
- ? { sessionId: rhContextReadSessionId(ctx)!, repoId: repository.repoId, checkoutId: repository.activeCheckoutId }
361
- : undefined,
584
+ session: rhContextReadSessionId(ctx)
585
+ ? { sessionId: rhContextReadSessionId(ctx)!, repoId: repository.repoId, checkoutId: repository.activeCheckoutId }
586
+ : undefined,
587
+ },
362
588
  });
363
589
  const explicitSemanticNavigation = Array.isArray(args.semantic_navigation) ? args.semantic_navigation : [];
364
590
  const semanticRequests = [...explicitSemanticNavigation, ...legacySemanticQuery.requests];
@@ -446,6 +672,8 @@ export async function callContextAdapter(ctx: MultiRepositoryMcpToolContext, nam
446
672
  omitted: pack.omitted,
447
673
  limits: pack.limits,
448
674
  contextContract: pack.contextContract,
675
+ ...(cognitionAudit ? { cognitionAudit } : {}),
676
+ ...(learningRecall ? { learningRecall } : {}),
449
677
  ...(executionReadiness ? {
450
678
  executionReadiness,
451
679
  registeredChecks: checks.slice(0, 80).map((check) => ({ id: check.id, description: check.description, source: check.source, effects: check.effects })),
@@ -460,7 +688,7 @@ export async function callContextAdapter(ctx: MultiRepositoryMcpToolContext, nam
460
688
  },
461
689
  warnings,
462
690
  suggestedNextActions: [],
463
- detailLevel: 'summary',
691
+ detailLevel: args.detail_level === 'detail' || args.detail_level === 'raw' ? args.detail_level : 'summary',
464
692
  rawAvailable: true,
465
693
  });
466
694
  // ContextClosureReceipt already enforces bounded paths, tests, skills, semantic providers,
@@ -468,6 +696,41 @@ export async function callContextAdapter(ctx: MultiRepositoryMcpToolContext, nam
468
696
  // but it must not corrupt this runtime-issued round-trip contract because rh_work validates
469
697
  // the exact full receipt digest supplied by the Controller during engineering re-entry.
470
698
  (facade.data as typeof facade.data & { contextClosure: typeof contextClosure }).contextClosure = contextClosure;
699
+ // Individual snippets are bounded, but broad searches can still aggregate
700
+ // a very large direct MCP payload. Keep ContextClosure authority inline and
701
+ // externalize only the heavy file collection through the existing Result Store.
702
+ const boundedFiles = boundedRuntimeResult({
703
+ controllerHome: ctx.controllerHome,
704
+ repoId: repository.repoId,
705
+ sessionId: ctx.sessionId,
706
+ principalId: ctx.principalId,
707
+ controllerInstanceId: ctx.controllerInstanceId,
708
+ workId: typeof args.work_id === 'string' ? args.work_id.trim() || undefined : undefined,
709
+ }, pack.files);
710
+ const data = facade.data as typeof facade.data & {
711
+ files: typeof pack.files;
712
+ filesResult?: unknown;
713
+ filesTruncated?: boolean;
714
+ fileCount?: number;
715
+ filePreview?: Array<{ path: string; reasons: string[]; hitLines: number[]; snippetCount: number }>;
716
+ };
717
+ if (boundedFiles.externalized) {
718
+ data.files = [];
719
+ data.filesResult = boundedFiles.value;
720
+ data.filesTruncated = true;
721
+ data.fileCount = pack.files.length;
722
+ data.filePreview = pack.files.slice(0, 10).map((file) => ({
723
+ path: file.path,
724
+ reasons: file.reasons.slice(0, 4),
725
+ hitLines: file.hitLines.slice(0, 12),
726
+ snippetCount: file.snippetCount,
727
+ }));
728
+ } else {
729
+ data.files = pack.files;
730
+ }
731
+ if (cognitionAudit) {
732
+ (facade.data as typeof facade.data & { cognitionAudit: typeof cognitionAudit }).cognitionAudit = cognitionAudit;
733
+ }
471
734
  return result(facade as unknown as Record<string, unknown>);
472
735
  }
473
736
  const startedAt = performance.now();
@@ -476,20 +739,20 @@ export async function callContextAdapter(ctx: MultiRepositoryMcpToolContext, nam
476
739
  const pluginMatch = /^plugin\.([^.]+)\.(.+)$/.exec(requestedCapabilityId);
477
740
  const manifests = pluginMatch ? (() => {
478
741
  const pluginId = pluginMatch[1];
479
- const targets = [repository];
480
- const controllerRepository = controllerPluginRepository(ctx.controllerHome);
481
- if (controllerRepository.repoId !== repository.repoId) targets.push(controllerRepository);
482
- for (const target of targets) {
483
- try {
484
- return [getAssistantPluginManifest(ctx.controllerHome, target, pluginId)];
485
- } catch (error) {
486
- if (error instanceof Error && error.message.startsWith('PLUGIN_NOT_FOUND:')) continue;
487
- throw error;
488
- }
742
+ try {
743
+ return [getAssistantPluginManifest(ctx.controllerHome, repository, pluginId)];
744
+ } catch (error) {
745
+ if (!(error instanceof Error) || !error.message.startsWith('PLUGIN_NOT_FOUND:')) throw error;
746
+ }
747
+ try {
748
+ return [getControllerPluginManifest(ctx.controllerHome, pluginId)];
749
+ } catch (error) {
750
+ if (!(error instanceof Error) || !error.message.startsWith('PLUGIN_NOT_FOUND:')) throw error;
489
751
  }
490
752
  return [];
491
753
  })() : [];
492
754
  const descriptor = getCapabilityDescriptor(requestedCapabilityId, manifests);
755
+ const coreCapability = getCoreCapabilityExecutionSchema(requestedCapabilityId);
493
756
  const pluginAction = getPluginActionCapabilitySchema(requestedCapabilityId, manifests);
494
757
  const facade = buildFacadeResult({
495
758
  status: 'ok',
@@ -509,10 +772,11 @@ export async function callContextAdapter(ctx: MultiRepositoryMcpToolContext, nam
509
772
  requestedCapabilityId,
510
773
  found: Boolean(descriptor),
511
774
  descriptor,
775
+ coreCapability,
512
776
  pluginAction,
513
777
  },
514
778
  toolArchitecture: {
515
- facadeTools: ['rh_access', 'rh_status', 'rh_inbox', 'rh_context', 'rh_work'],
779
+ facadeTools: [...FACADE_TOOLS],
516
780
  domainSchemaLoading: 'exact_capability_fast_path',
517
781
  },
518
782
  bounded: true,
@@ -534,18 +798,19 @@ export async function callContextAdapter(ctx: MultiRepositoryMcpToolContext, nam
534
798
  ? args.query.trim()
535
799
  : '';
536
800
  if (capabilityIntentQuery) {
801
+ const learningRecall = args.include_learning_recall === false
802
+ ? undefined
803
+ : rhContextLearningRecall(ctx, repository, capabilityIntentQuery);
537
804
  const manifestOptions = { preferStored: true };
538
805
  const repositoryManifests = listAssistantPluginManifests(ctx.controllerHome, repository, manifestOptions);
539
- const controllerRepository = controllerPluginRepository(ctx.controllerHome);
540
- const controllerManifests = repository.repoId === controllerRepository.repoId
541
- ? []
542
- : listAssistantPluginManifests(ctx.controllerHome, controllerRepository, manifestOptions);
806
+ const controllerManifests = listControllerPluginManifests(ctx.controllerHome, manifestOptions);
543
807
  const manifests = [...new Map(
544
808
  [...repositoryManifests, ...controllerManifests].map((manifest) => [manifest.pluginId, manifest] as const),
545
809
  ).values()];
546
810
  const matches = searchCapabilityDescriptors(capabilityIntentQuery, manifests, 12)
547
811
  .map((match) => ({
548
812
  ...match,
813
+ coreCapability: getCoreCapabilityExecutionSchema(match.capabilityId),
549
814
  pluginAction: getPluginActionCapabilitySchema(match.capabilityId, manifests),
550
815
  }));
551
816
  const facade = buildFacadeResult({
@@ -560,10 +825,11 @@ export async function callContextAdapter(ctx: MultiRepositoryMcpToolContext, nam
560
825
  query: capabilityIntentQuery,
561
826
  matches,
562
827
  readOnlyDiscovery: true,
563
- executeWith: 'plugin_action_execute',
828
+ executeWith: 'capability-specific',
564
829
  },
830
+ ...(learningRecall ? { learningRecall } : {}),
565
831
  toolArchitecture: {
566
- facadeTools: ['rh_access', 'rh_status', 'rh_inbox', 'rh_context', 'rh_work'],
832
+ facadeTools: [...FACADE_TOOLS],
567
833
  domainSchemaLoading: 'intent_ranked_capability_search',
568
834
  exactCapabilityLookupStillAvailable: true,
569
835
  },
@@ -598,20 +864,25 @@ export async function callContextAdapter(ctx: MultiRepositoryMcpToolContext, nam
598
864
  ? readActiveWorkCandidates({ ...store, limit: 20 })
599
865
  : { contracts: [], invalid: [] as InvalidActiveWorkCandidate[] };
600
866
  const activeContractScan = activeWorkProjection.contracts;
601
- const currentCutoffMs = Date.now() - RH_CONTEXT_CURRENT_WINDOW_MS;
602
- const currentContractScan = isSummary
603
- ? activeContractScan.filter((contract) => isCurrentRhContextWork(contract, currentCutoffMs))
867
+ const currentLineageWorkIds = work
868
+ ? currentTaskLineageWorkIds([work.workId], readWorkContractStore(store).contracts)
869
+ : new Set<string>();
870
+ const recentActivityCutoffMs = Date.now() - RH_CONTEXT_RECENT_ACTIVITY_WINDOW_MS;
871
+ const recentActiveContractScan = isSummary
872
+ ? activeContractScan.filter((contract) => isRecentRhContextWork(contract, recentActivityCutoffMs))
604
873
  : activeContractScan;
605
- const activeContracts = isSummary ? currentContractScan.slice(0, 3) : activeContractScan;
874
+ const activeContracts = isSummary ? recentActiveContractScan.slice(0, 3) : activeContractScan;
606
875
  const recentJobs = !isSummary && (operation === 'list' || !workId)
607
876
  ? listExecutionJobs(ctx.controllerHome, repository.repoId, 20)
608
- .filter((job) => timestampIsCurrent(job.updatedAt, currentCutoffMs))
877
+ .filter((job) => timestampIsRecent(job.updatedAt, recentActivityCutoffMs))
609
878
  .slice(0, 5)
610
879
  : [];
611
880
  const processScan = isSummary
612
881
  ? listRecoverableProcessRecords(ctx.controllerHome, repository.repoId)
613
882
  : listProcessRecords(ctx.controllerHome, repository.repoId, workId ? 100 : 50);
614
- const relevantProcesses = processScan.filter((process) => workId ? process.workId === workId : timestampIsCurrent(process.updatedAt, currentCutoffMs));
883
+ const relevantProcesses = processScan.filter((process) => work
884
+ ? Boolean(process.workId && currentLineageWorkIds.has(process.workId))
885
+ : timestampIsRecent(process.updatedAt, recentActivityCutoffMs));
615
886
  const liveProcessIds = new Set(processRuntimeResourceDiagnostics().activeProcessIds);
616
887
  const activeProcesses = relevantProcesses.filter((process) => liveProcessIds.has(process.processId) && isManagedProcessActive(process));
617
888
  const workController = work ? getControllerSession(store, work.workId) : undefined;
@@ -620,10 +891,7 @@ export async function callContextAdapter(ctx: MultiRepositoryMcpToolContext, nam
620
891
  ? []
621
892
  : (() => {
622
893
  const repositoryManifests = listAssistantPluginManifests(ctx.controllerHome, repository, manifestOptions);
623
- const controllerRepository = controllerPluginRepository(ctx.controllerHome);
624
- const controllerManifests = repository.repoId === controllerRepository.repoId
625
- ? []
626
- : listAssistantPluginManifests(ctx.controllerHome, controllerRepository, manifestOptions);
894
+ const controllerManifests = listControllerPluginManifests(ctx.controllerHome, manifestOptions);
627
895
  return [...new Map(
628
896
  [...repositoryManifests, ...controllerManifests].map((manifest) => [manifest.pluginId, manifest] as const),
629
897
  ).values()];
@@ -636,17 +904,86 @@ export async function callContextAdapter(ctx: MultiRepositoryMcpToolContext, nam
636
904
  .filter((check): check is (typeof checks)[number] => Boolean(check))
637
905
  .map((check) => ({ id: check.id, description: check.description, source: check.source }));
638
906
  const pendingAttention = listHandoffItems({ ...store, status: 'pending', limit: isSummary ? 20 : 5 });
639
- const currentWorkIds = new Set(currentContractScan.map((entry) => entry.workId));
640
- const currentAttentionScan = isSummary
641
- ? pendingAttention.filter((item) => (
642
- Boolean(item.workId && currentWorkIds.has(item.workId))
643
- || timestampIsCurrent(item.updatedAt, currentCutoffMs)
644
- ))
645
- : pendingAttention;
646
- const workAttention = work ? currentAttentionScan.find((item) => item.workId === work.workId) : undefined;
647
- const currentAttentionItems = isSummary
648
- ? currentAttentionScan.slice(0, 3)
649
- : pendingAttention;
907
+ const currentAttentionScan = listHandoffAttentionItems(store, isSummary ? 20 : 5);
908
+ const workAttentionItems = work
909
+ ? currentAttentionScan.filter((item) => Boolean(item.workId && currentLineageWorkIds.has(item.workId)))
910
+ : [];
911
+ const workAttention = workAttentionItems[0];
912
+ const resumeContext = work ? (() => {
913
+ const semanticWork = workSemanticView(work);
914
+ const requirementRecord = work.requirementId?.trim()
915
+ ? readRequirement({ controllerHome: ctx.controllerHome }, work.requirementId.trim())
916
+ : undefined;
917
+ const semanticRequirement = requirementRecord ? requirementSemanticView(requirementRecord.value) : undefined;
918
+ const plan = work.planId?.trim() ? getPlanContract(store, work.planId.trim()) : undefined;
919
+ const semanticPlan = plan ? planSemanticView(plan) : undefined;
920
+ const exactCheckout = work.checkoutId?.trim()
921
+ ? repository.checkouts.find((candidate) => candidate.checkoutId === work.checkoutId)
922
+ : repository.checkouts.find((candidate) => candidate.checkoutId === repository.activeCheckoutId);
923
+ const source = freshGitIdentity(exactCheckout?.canonicalRoot ?? repository.canonicalRoot);
924
+ const unresolvedHumanRequests = workAttentionItems
925
+ .filter((item) => Boolean(item.creationReason && RESUME_CONTEXT_HUMAN_REQUEST_REASONS.has(item.creationReason)))
926
+ .slice(0, 8)
927
+ .map((item) => ({
928
+ id: item.id,
929
+ reason: item.reason.slice(0, 500),
930
+ creationReason: item.creationReason,
931
+ blockingDecision: item.blockingDecision?.slice(0, 500),
932
+ recommendedDecision: item.recommendedDecision.slice(0, 500),
933
+ }));
934
+ const checkReceiptRefs = work.checkRefs
935
+ .flatMap((record) => record.receipt?.receiptId?.trim() ? [record.receipt.receiptId.trim()] : [])
936
+ .slice(-24);
937
+ return {
938
+ schemaVersion: 1 as const,
939
+ derived: true as const,
940
+ semantic: {
941
+ ...(semanticRequirement ? { requirement: semanticRequirement } : {}),
942
+ ...(semanticPlan ? { plan: semanticPlan } : {}),
943
+ work: semanticWork,
944
+ },
945
+ source: {
946
+ checkoutId: exactCheckout?.checkoutId ?? work.checkoutId,
947
+ worktree: exactCheckout?.worktree ?? false,
948
+ head: source.head,
949
+ branch: source.branch,
950
+ dirty: source.dirty,
951
+ workingTreeFingerprint: source.workingTreeFingerprint,
952
+ observedAt: new Date(source.sampledAt).toISOString(),
953
+ },
954
+ staleness: {
955
+ requirementBasisStale: Boolean(semanticRequirement && semanticPlan?.requirementBasisRevision && semanticRequirement.revision !== semanticPlan.requirementBasisRevision),
956
+ workRequirementBasisStale: Boolean(semanticRequirement && semanticWork.requirementRevision && semanticRequirement.revision !== semanticWork.requirementRevision),
957
+ workPlanBasisStale: Boolean(semanticPlan && semanticWork.planRevision && semanticPlan.revision !== semanticWork.planRevision),
958
+ sourceBasisStale: Boolean(semanticPlan?.sourceBasisRevision && source.head && semanticPlan.sourceBasisRevision !== source.head),
959
+ advisoryOnly: true as const,
960
+ },
961
+ unresolvedHumanRequests,
962
+ durableHandles: {
963
+ processes: relevantProcesses.slice(0, 8).map((process) => ({
964
+ processId: process.processId,
965
+ status: process.status,
966
+ workId: process.workId,
967
+ updatedAt: process.updatedAt,
968
+ })),
969
+ ...(workController ? { controller: {
970
+ controllerType: workController.controllerType,
971
+ sessionId: workController.sessionId,
972
+ leaseExpiresAt: workController.leaseExpiresAt,
973
+ } } : {}),
974
+ },
975
+ receipts: {
976
+ resultRefs: semanticWork.resultRefs,
977
+ ...(work.completionReceipt?.receiptId?.trim() ? { completionReceiptRef: work.completionReceipt.receiptId.trim() } : {}),
978
+ checkReceiptRefs,
979
+ },
980
+ };
981
+ })() : undefined;
982
+ const currentAttentionItems = work
983
+ ? workAttentionItems
984
+ : isSummary
985
+ ? currentAttentionScan.slice(0, 3)
986
+ : currentAttentionScan;
650
987
  const attention = isSummary
651
988
  ? currentAttentionItems.map((item) => ({
652
989
  id: item.id,
@@ -695,8 +1032,7 @@ export async function callContextAdapter(ctx: MultiRepositoryMcpToolContext, nam
695
1032
  work: work
696
1033
  ? {
697
1034
  workId: work.workId,
698
- status: work.status,
699
- mode: work.mode,
1035
+ state: work.semanticState,
700
1036
  objective: work.objective.slice(0, 160),
701
1037
  continuation: buildWorkContinuationSnapshot(work),
702
1038
  }
@@ -706,14 +1042,13 @@ export async function callContextAdapter(ctx: MultiRepositoryMcpToolContext, nam
706
1042
  activeController: workController ? { controllerType: workController.controllerType, sessionId: workController.sessionId, leaseExpiresAt: workController.leaseExpiresAt } : undefined,
707
1043
  activeProcesses: activeProcesses.slice(0, 3).map((process) => ({ processId: process.processId, workId: process.workId, status: process.status, route: process.route, startedAt: process.startedAt, updatedAt: process.updatedAt })),
708
1044
  recentProcesses: relevantProcesses.slice(0, 5).map((process) => ({ processId: process.processId, workId: process.workId, status: process.status, route: process.route, startedAt: process.startedAt, updatedAt: process.updatedAt })),
1045
+ currentTask: work ? currentTaskSemanticProjectionForWork(work) : undefined,
1046
+ ...(resumeContext ? { resumeContext } : {}),
709
1047
  activeWork: activeContracts.map((entry) => ({
1048
+ relation: 'repository_inventory' as const,
1049
+ relevance: ['ownership', 'conflict', 'release_admission'] as const,
710
1050
  workId: entry.workId,
711
- status: entry.status,
712
- mode: entry.mode,
713
- objective: entry.objective.slice(0, 160),
714
- semantics: buildWorkContinuationSnapshot(entry).semantics,
715
- reconciliationRequired: buildWorkContinuationSnapshot(entry).reconciliationRequired,
716
- nextSafeAction: buildWorkContinuationSnapshot(entry).nextSafeAction,
1051
+ state: entry.semanticState,
717
1052
  })),
718
1053
  invalidActiveWork: activeWorkProjection.invalid.slice(0, 3).map(summarizeInvalidActiveWorkCandidate),
719
1054
  activeAttention: attention,
@@ -721,21 +1056,23 @@ export async function callContextAdapter(ctx: MultiRepositoryMcpToolContext, nam
721
1056
  availableChecks: checks.length,
722
1057
  selectedChecks: selectedChecks.length,
723
1058
  capabilityInventoryDeferred: true,
724
- activeWork: currentContractScan.length,
1059
+ activeWork: recentActiveContractScan.length,
725
1060
  activeWorkShown: activeContracts.length,
1061
+ recentActiveWork: recentActiveContractScan.length,
726
1062
  invalidActiveWork: activeWorkProjection.invalid.length,
727
1063
  invalidActiveWorkShown: Math.min(activeWorkProjection.invalid.length, 3),
728
1064
  storedNonTerminalWork: activeContractScan.length,
729
- currentWork: currentContractScan.length,
730
- historicalNonTerminalWork: Math.max(0, activeContractScan.length - currentContractScan.length),
731
- currentAttention: currentAttentionScan.length,
1065
+ currentWork: work ? 1 : 0,
1066
+ historicalNonTerminalWork: Math.max(0, activeContractScan.length - recentActiveContractScan.length),
1067
+ currentAttention: work ? workAttentionItems.length : 0,
1068
+ repositoryAttention: currentAttentionScan.length,
732
1069
  currentAttentionShown: attention.length,
733
1070
  activeProcesses: activeProcesses.length,
734
1071
  recentProcesses: relevantProcesses.length,
735
1072
  historicalProcessScanDeferred: true,
736
1073
  pendingAttentionScanned: pendingAttention.length,
737
1074
  historicalPendingAttention: Math.max(0, pendingAttention.length - currentAttentionScan.length),
738
- omittedCurrentAttention: Math.max(0, currentAttentionScan.length - attention.length),
1075
+ omittedCurrentAttention: Math.max(0, (work ? workAttentionItems.length : 0) - attention.length),
739
1076
  omittedPendingAttention: Math.max(0, pendingAttention.length - attention.length),
740
1077
  },
741
1078
  historicalExecutionJobsIncluded: false,
@@ -768,6 +1105,8 @@ export async function callContextAdapter(ctx: MultiRepositoryMcpToolContext, nam
768
1105
  domainSchemaLoading: 'static_stable_surface',
769
1106
  dynamicDomainSchemaLoadingSupported: false,
770
1107
  },
1108
+ currentTask: work ? currentTaskSemanticProjectionForWork(work) : undefined,
1109
+ ...(resumeContext ? { resumeContext } : {}),
771
1110
  work: work ? { ...work, continuation: buildWorkContinuationSnapshot(work) } : undefined,
772
1111
  executionJob: executionJob ? summarizeWorkListItem(executionJob) : undefined,
773
1112
  executionState: work ? (workAttention ? 'blocked' : activeProcesses.length > 0 ? 'executing' : workController ? 'controller_active' : 'waiting_trigger') : undefined,
@@ -775,11 +1114,10 @@ export async function callContextAdapter(ctx: MultiRepositoryMcpToolContext, nam
775
1114
  activeProcesses: activeProcesses.slice(0, 10),
776
1115
  recentProcesses: relevantProcesses.slice(0, 20),
777
1116
  activeWork: activeContracts.map((entry) => ({
1117
+ relation: 'repository_inventory' as const,
1118
+ relevance: ['ownership', 'conflict', 'release_admission'] as const,
778
1119
  workId: entry.workId,
779
- status: entry.status,
780
- mode: entry.mode,
781
- objective: entry.objective.slice(0, 240),
782
- continuation: buildWorkContinuationSnapshot(entry),
1120
+ state: entry.semanticState,
783
1121
  })),
784
1122
  invalidActiveWork: activeWorkProjection.invalid.slice(0, 10).map(summarizeInvalidActiveWorkCandidate),
785
1123
  recentExecutionJobs: recentJobs.map(summarizeWorkListItem),