@sema-agent/server 7.52.0 → 7.53.0

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 (328) hide show
  1. package/USAGE.md +22 -5
  2. package/dist/adoption/plan.d.ts +3 -3
  3. package/dist/adoption/quiesce.d.ts +1 -1
  4. package/dist/adoption/sql.d.ts +2 -2
  5. package/dist/adoption/wire.d.ts +1 -1
  6. package/dist/approval-ask-machine.d.ts +2 -2
  7. package/dist/approval-card.d.ts +18 -18
  8. package/dist/approval-deny-reasons.d.ts +1 -1
  9. package/dist/approval-hmac.d.ts +2 -2
  10. package/dist/approval-reconciler.d.ts +14 -14
  11. package/dist/approval.d.ts +2 -2
  12. package/dist/audit.d.ts +4 -4
  13. package/dist/auth-keys.d.ts +6 -6
  14. package/dist/bench/l8/artifact.d.ts +6 -1
  15. package/dist/bench/l8/artifact.js +2 -27
  16. package/dist/bench/l8/escape.d.ts +3 -3
  17. package/dist/bench/l8/index.d.ts +1 -1
  18. package/dist/bench/s1/arms.d.ts +3 -3
  19. package/dist/bench/s1/oracle.d.ts +2 -2
  20. package/dist/bench/s1/reviewer.d.ts +1 -1
  21. package/dist/bench/s1/row.d.ts +5 -5
  22. package/dist/bench/s1/runner-ctx.d.ts +3 -3
  23. package/dist/boot/config-center.d.ts +14 -7
  24. package/dist/boot/config-center.js +2 -0
  25. package/dist/boot/coordinators.d.ts +4 -4
  26. package/dist/boot/crash-last.d.ts +1 -1
  27. package/dist/boot/device-lane.d.ts +3 -3
  28. package/dist/boot/device-lane.js +2 -0
  29. package/dist/boot/engine-lease.d.ts +4 -4
  30. package/dist/boot/governance-seams.d.ts +5 -5
  31. package/dist/boot/leader.d.ts +5 -5
  32. package/dist/boot/limit-sync.d.ts +1 -1
  33. package/dist/boot/memory-boundary.d.ts +5 -5
  34. package/dist/boot/memory-consolidation.d.ts +8 -2
  35. package/dist/boot/memory-consolidation.js +1 -0
  36. package/dist/boot/org-memory.d.ts +5 -5
  37. package/dist/boot/parked-revive-gate.d.ts +6 -6
  38. package/dist/boot/permission-rules-audit.d.ts +2 -2
  39. package/dist/boot/reapers.d.ts +8 -8
  40. package/dist/boot/resolve-spec.d.ts +4 -4
  41. package/dist/boot/retention-lane.d.ts +1 -1
  42. package/dist/boot/runner-deps.d.ts +33 -27
  43. package/dist/boot/runner-deps.js +2 -1
  44. package/dist/boot/runtime-caps.d.ts +4 -4
  45. package/dist/boot/session-faces.d.ts +1 -1
  46. package/dist/boot/shutdown.d.ts +10 -10
  47. package/dist/boot/side-query-lane.d.ts +14 -14
  48. package/dist/boot/stores.js +5 -0
  49. package/dist/boot/task-list-lane.d.ts +3 -3
  50. package/dist/boot/webfetch-summarize-lane.d.ts +9 -9
  51. package/dist/boot/workflow-orchestration.d.ts +1 -1
  52. package/dist/bounded-session-map.d.ts +1 -1
  53. package/dist/brain.d.ts +3 -3
  54. package/dist/budget.d.ts +3 -3
  55. package/dist/canonical-json.d.ts +53 -0
  56. package/dist/canonical-json.js +48 -0
  57. package/dist/capabilities/center-prompts.d.ts +13 -13
  58. package/dist/capabilities/collab-workflows.d.ts +1 -1
  59. package/dist/capabilities/hands-lane.d.ts +4 -4
  60. package/dist/capabilities/memory-notice.d.ts +4 -4
  61. package/dist/capabilities/prompt.d.ts +2 -2
  62. package/dist/capabilities/sandbox-file-send.d.ts +2 -2
  63. package/dist/capabilities/scenarios.d.ts +16 -16
  64. package/dist/capabilities/skills.d.ts +1 -1
  65. package/dist/capabilities/team.d.ts +3 -3
  66. package/dist/capabilities/tool-defer.d.ts +6 -6
  67. package/dist/config-catalog.d.ts +139 -0
  68. package/dist/config-catalog.js +556 -0
  69. package/dist/config-center/apply-effective.d.ts +20 -7
  70. package/dist/config-center/apply-effective.js +45 -0
  71. package/dist/config-center/apply-ledger.d.ts +6 -6
  72. package/dist/config-center/facade.d.ts +3 -2
  73. package/dist/config-center/hot-keys-registry.d.ts +2 -2
  74. package/dist/config-center/http-client.d.ts +5 -5
  75. package/dist/config-center/mcp-revocation.d.ts +6 -4
  76. package/dist/config-center/mcp-revocation.js +2 -12
  77. package/dist/config-center/restart-signal.d.ts +11 -1
  78. package/dist/config-center/restart-signal.js +1 -1
  79. package/dist/config-center/skills-mcp.d.ts +2 -2
  80. package/dist/config-center/stage-limits.d.ts +3 -3
  81. package/dist/config-center/types.d.ts +23 -19
  82. package/dist/config-invariants.d.ts +1 -1
  83. package/dist/config-provider.d.ts +2 -2
  84. package/dist/config-types.d.ts +157 -134
  85. package/dist/config.d.ts +32 -24
  86. package/dist/config.js +48 -6
  87. package/dist/degenerate-instrument.d.ts +1 -1
  88. package/dist/deployment-governance.d.ts +13 -13
  89. package/dist/device-store.d.ts +2 -2
  90. package/dist/device-ws-hub.d.ts +6 -4
  91. package/dist/device-ws-hub.js +9 -3
  92. package/dist/device-ws-protocol.d.ts +3 -3
  93. package/dist/digest-form.d.ts +1 -1
  94. package/dist/elicitation.d.ts +1 -1
  95. package/dist/env-facts.d.ts +7 -7
  96. package/dist/execution-lane-caps.d.ts +5 -5
  97. package/dist/fleet/fleet-bus.d.ts +56 -53
  98. package/dist/fleet/fleet-reconciler.d.ts +2 -2
  99. package/dist/fleet/fleet-terminal-window.d.ts +1 -1
  100. package/dist/fleet/subagent-tail-bus.d.ts +3 -3
  101. package/dist/fleet-client.d.ts +3 -3
  102. package/dist/fleet-lease.d.ts +1 -1
  103. package/dist/hooks/branch-transcript.d.ts +2 -2
  104. package/dist/hooks/cc-agent-hook-prompt.d.ts +2 -2
  105. package/dist/hooks/cc-stop-prompt.d.ts +2 -2
  106. package/dist/hooks/hook-llm.d.ts +1 -1
  107. package/dist/hooks/hook-runner.d.ts +12 -5
  108. package/dist/http/active-run-conflict.d.ts +31 -33
  109. package/dist/http/active-run-conflict.js +4 -2
  110. package/dist/http/route-ctx.d.ts +23 -21
  111. package/dist/http/routes/a2a-serve.d.ts +2 -2
  112. package/dist/http/routes/admin-config-refresh.d.ts +1 -1
  113. package/dist/http/routes/admin-drain.d.ts +4 -4
  114. package/dist/http/routes/admin-memory-optout.d.ts +5 -5
  115. package/dist/http/routes/adoption.d.ts +1 -1
  116. package/dist/http/routes/agents-roster.d.ts +1 -1
  117. package/dist/http/routes/approvals-assistant.d.ts +6 -6
  118. package/dist/http/routes/approvals-assistant.js +4 -1
  119. package/dist/http/routes/capabilities.d.ts +1 -1
  120. package/dist/http/routes/capabilities.js +1 -0
  121. package/dist/http/routes/config-catalog.d.ts +28 -0
  122. package/dist/http/routes/config-catalog.js +42 -0
  123. package/dist/http/routes/diagnostics.d.ts +2 -2
  124. package/dist/http/routes/fleet.d.ts +1 -1
  125. package/dist/http/routes/images.d.ts +1 -1
  126. package/dist/http/routes/leader.d.ts +1 -1
  127. package/dist/http/routes/memory-bundle.d.ts +4 -4
  128. package/dist/http/routes/memory-bundle.js +2 -3
  129. package/dist/http/routes/memory-compliance.d.ts +7 -7
  130. package/dist/http/routes/memory-consolidation.d.ts +1 -1
  131. package/dist/http/routes/memory-origin.d.ts +9 -9
  132. package/dist/http/routes/memory-policy.d.ts +3 -3
  133. package/dist/http/routes/notify-wake.d.ts +1 -1
  134. package/dist/http/routes/observability.d.ts +1 -1
  135. package/dist/http/routes/retention-ops.d.ts +1 -1
  136. package/dist/http/routes/rules.d.ts +3 -3
  137. package/dist/http/routes/run-memory-capture.d.ts +1 -1
  138. package/dist/http/routes/runs.d.ts +3 -3
  139. package/dist/http/routes/runs.js +12 -17
  140. package/dist/http/routes/session-sync.d.ts +2 -2
  141. package/dist/http/routes/sessions-list.d.ts +1 -1
  142. package/dist/http/routes/sessions.d.ts +9 -1
  143. package/dist/http/routes/sessions.js +61 -1
  144. package/dist/http/routes/shared-memory.d.ts +1 -1
  145. package/dist/http/routes/side-query.d.ts +1 -1
  146. package/dist/http/routes/tasks.d.ts +1 -1
  147. package/dist/http/routes/trace-usage.d.ts +1 -1
  148. package/dist/http/routes/workflows.d.ts +1 -1
  149. package/dist/http/run-meta.d.ts +1 -1
  150. package/dist/http/send.d.ts +6 -6
  151. package/dist/http/server.d.ts +84 -67
  152. package/dist/http/server.js +25 -12
  153. package/dist/http/sse-lifecycle.d.ts +1 -1
  154. package/dist/http/sse-log.d.ts +6 -6
  155. package/dist/http/verify-rounds.d.ts +3 -3
  156. package/dist/http/wire-gate.d.ts +2 -2
  157. package/dist/http/wire-types.d.ts +38 -38
  158. package/dist/key-resolver.d.ts +1 -1
  159. package/dist/leader/diffout.d.ts +2 -2
  160. package/dist/leader/diffup.d.ts +1 -1
  161. package/dist/leader/endpoint.d.ts +1 -1
  162. package/dist/leader/fanout.d.ts +6 -6
  163. package/dist/leader/grader-env-factory.d.ts +1 -1
  164. package/dist/leader/leader.d.ts +12 -12
  165. package/dist/leader/merge.d.ts +3 -3
  166. package/dist/leader/planner.d.ts +5 -5
  167. package/dist/leader/repair-oracle.d.ts +1 -1
  168. package/dist/leader/wire.d.ts +9 -9
  169. package/dist/lsp/manager.d.ts +2 -2
  170. package/dist/lsp/types.d.ts +1 -1
  171. package/dist/lsp/ws-transport.d.ts +2 -2
  172. package/dist/main.js +13 -2
  173. package/dist/mcp-content-origin.d.ts +1 -1
  174. package/dist/memory-bundle-engine.d.ts +5 -3
  175. package/dist/memory-bundle-engine.js +2 -2
  176. package/dist/memory-operator-faces.d.ts +41 -11
  177. package/dist/memory-operator-faces.js +12 -0
  178. package/dist/memory-origin-fence.d.ts +20 -35
  179. package/dist/memory-origin-fence.js +41 -1
  180. package/dist/memory-posture.d.ts +6 -6
  181. package/dist/memory-scope.d.ts +7 -7
  182. package/dist/model-select.d.ts +5 -5
  183. package/dist/observability/cost-quota.d.ts +6 -6
  184. package/dist/observability/cost-taxonomy.d.ts +2 -2
  185. package/dist/observability/fail-open.d.ts +1 -5
  186. package/dist/observability/fail-open.js +0 -4
  187. package/dist/observability/metrics.d.ts +1 -1
  188. package/dist/observability/prompt-manifest.d.ts +8 -8
  189. package/dist/observability/rate-limit.d.ts +2 -2
  190. package/dist/observability/secret-env-scrub.d.ts +1 -1
  191. package/dist/observability/tool-trace.d.ts +1 -1
  192. package/dist/orchestration/hardened-vm-runner.d.ts +6 -6
  193. package/dist/orchestration/hardened-vm-worker-runner.d.ts +1 -1
  194. package/dist/orchestration/subagent-steer.d.ts +3 -3
  195. package/dist/orchestration/workflow-agent-steer.d.ts +1 -1
  196. package/dist/orchestration/workflow-completion-inbox.d.ts +6 -6
  197. package/dist/orchestration/workflow-notify-journal.d.ts +6 -6
  198. package/dist/parent-watch.d.ts +1 -1
  199. package/dist/parked-decide.d.ts +11 -11
  200. package/dist/plan-cache-probe.d.ts +1 -1
  201. package/dist/plugins/adoption-log-sql.d.ts +4 -4
  202. package/dist/plugins/approval-ask-store-memory.d.ts +1 -1
  203. package/dist/plugins/approval-ask-store-memory.js +12 -0
  204. package/dist/plugins/approval-ask-store-sql.d.ts +39 -17
  205. package/dist/plugins/approval-ask-store-sql.js +23 -6
  206. package/dist/plugins/approval-payload-fingerprint.d.ts +23 -0
  207. package/dist/plugins/approval-payload-fingerprint.js +23 -0
  208. package/dist/plugins/background-agent-store-sql.d.ts +8 -8
  209. package/dist/plugins/background-shell-support.d.ts +12 -12
  210. package/dist/plugins/blob-backend.d.ts +3 -3
  211. package/dist/plugins/breaker-state-sql.d.ts +3 -3
  212. package/dist/plugins/caching-session-store.d.ts +6 -6
  213. package/dist/plugins/checkpoint-store-sql.d.ts +162 -66
  214. package/dist/plugins/checkpoint-store-sql.js +76 -33
  215. package/dist/plugins/device-store-sql.d.ts +4 -3
  216. package/dist/plugins/e2b-orphan-reclaim.d.ts +3 -3
  217. package/dist/plugins/file-history-store-sql.d.ts +9 -8
  218. package/dist/plugins/file-run-store.d.ts +27 -27
  219. package/dist/plugins/fork-routing-session-store.d.ts +9 -9
  220. package/dist/plugins/image-bake-store-sql.d.ts +1 -1
  221. package/dist/plugins/image-index-sql.d.ts +2 -2
  222. package/dist/plugins/k8s-bg-scripts.d.ts +1 -1
  223. package/dist/plugins/k8s-exec-protocol.d.ts +1 -1
  224. package/dist/plugins/leader-run-store-sql.d.ts +1 -1
  225. package/dist/plugins/local-checkpoint-store.d.ts +26 -17
  226. package/dist/plugins/local-checkpoint-store.js +21 -11
  227. package/dist/plugins/local-session-store.d.ts +5 -5
  228. package/dist/plugins/mailbox-store-sql.d.ts +6 -6
  229. package/dist/plugins/memory-embedder-fingerprint.d.ts +2 -2
  230. package/dist/plugins/memory-engine-pg.d.ts +1 -1
  231. package/dist/plugins/memory-engine-tidb.d.ts +1 -1
  232. package/dist/plugins/memory-key-guards.d.ts +3 -3
  233. package/dist/plugins/memory-optout-grant-store-sql.d.ts +10 -10
  234. package/dist/plugins/memory-origin-law.d.ts +13 -13
  235. package/dist/plugins/memory-run-store.d.ts +12 -12
  236. package/dist/plugins/outcome-ledger-sql.d.ts +3 -3
  237. package/dist/plugins/permission-rule-store-file.d.ts +3 -3
  238. package/dist/plugins/permission-rule-store-sql.d.ts +38 -33
  239. package/dist/plugins/permission-rule-store-sql.js +7 -12
  240. package/dist/plugins/pg-cost-quota.d.ts +2 -2
  241. package/dist/plugins/pg-pool.js +5 -0
  242. package/dist/plugins/pg-query.d.ts +1 -1
  243. package/dist/plugins/pg-rate-limiter.d.ts +2 -2
  244. package/dist/plugins/pg-session-storage.d.ts +9 -9
  245. package/dist/plugins/remote-env-adb.d.ts +1 -1
  246. package/dist/plugins/remote-env-device.d.ts +2 -2
  247. package/dist/plugins/remote-env-e2b.d.ts +11 -11
  248. package/dist/plugins/remote-env-file-error.d.ts +2 -2
  249. package/dist/plugins/remote-env-host.d.ts +10 -10
  250. package/dist/plugins/remote-env-k8s.d.ts +7 -7
  251. package/dist/plugins/remote-env-local-docker.d.ts +1 -1
  252. package/dist/plugins/remote-env-ssh.d.ts +9 -9
  253. package/dist/plugins/remote-scratchpad.d.ts +1 -1
  254. package/dist/plugins/resume-anchor-store-sql.d.ts +1 -1
  255. package/dist/plugins/retention-lane-store-sql.d.ts +2 -2
  256. package/dist/plugins/retention-store-sql.d.ts +11 -11
  257. package/dist/plugins/roster-store-sql.d.ts +5 -5
  258. package/dist/plugins/run-store-sql.d.ts +12 -12
  259. package/dist/plugins/scheduler-support.d.ts +1 -1
  260. package/dist/plugins/send-user-file.d.ts +1 -1
  261. package/dist/plugins/session-capture-record-store-sql.d.ts +99 -0
  262. package/dist/plugins/session-capture-record-store-sql.js +110 -0
  263. package/dist/plugins/session-placement.d.ts +1 -1
  264. package/dist/plugins/session-policy-store-sql.d.ts +2 -2
  265. package/dist/plugins/session-store.d.ts +3 -3
  266. package/dist/plugins/shared-memory-store-sql.d.ts +5 -5
  267. package/dist/plugins/sql-driver.d.ts +7 -7
  268. package/dist/plugins/sql-errors.d.ts +2 -2
  269. package/dist/plugins/sql-escape.d.ts +1 -1
  270. package/dist/plugins/sql-row-helpers.d.ts +1 -1
  271. package/dist/plugins/store-backend.d.ts +32 -19
  272. package/dist/plugins/store-backend.js +4 -0
  273. package/dist/plugins/store-contracts.d.ts +9 -9
  274. package/dist/plugins/task-list-store-sql.d.ts +3 -3
  275. package/dist/plugins/tidb-cost-quota.d.ts +3 -3
  276. package/dist/plugins/tidb-pool.js +9 -0
  277. package/dist/plugins/tidb-rate-limiter.d.ts +2 -2
  278. package/dist/plugins/tidb-session-storage.d.ts +2 -2
  279. package/dist/plugins/tidb-session-store.d.ts +11 -11
  280. package/dist/plugins/tool-result-store-sql.d.ts +8 -8
  281. package/dist/plugins/usage-window-store-sql.d.ts +3 -3
  282. package/dist/plugins/web-search.d.ts +7 -7
  283. package/dist/plugins/workflow-journal-store-sql.d.ts +6 -6
  284. package/dist/plugins/workflow-run-store-sql.d.ts +1 -1
  285. package/dist/plugins/write-behind-counter.d.ts +6 -6
  286. package/dist/principal-jwt.d.ts +2 -2
  287. package/dist/project-memory.d.ts +1 -1
  288. package/dist/prompts-domain-validate.d.ts +8 -8
  289. package/dist/question.d.ts +3 -3
  290. package/dist/resource-suspend.d.ts +4 -4
  291. package/dist/resource-window.d.ts +3 -3
  292. package/dist/router/route-orchestration.d.ts +1 -1
  293. package/dist/rules-consent.d.ts +48 -40
  294. package/dist/run-local.d.ts +5 -5
  295. package/dist/run-local.js +28 -4
  296. package/dist/runs.d.ts +19 -19
  297. package/dist/runtime-caps-resolver.d.ts +6 -6
  298. package/dist/runtime-governance.d.ts +7 -7
  299. package/dist/security.d.ts +13 -13
  300. package/dist/session-leaf-bus.d.ts +1 -1
  301. package/dist/session-sync-content.d.ts +4 -4
  302. package/dist/session-sync-kernel.d.ts +2 -2
  303. package/dist/session-sync.d.ts +13 -13
  304. package/dist/session-titler.d.ts +1 -1
  305. package/dist/session-watch.d.ts +3 -3
  306. package/dist/shared-memory-scope-authorizer.d.ts +4 -4
  307. package/dist/sighup-idle.d.ts +1 -1
  308. package/dist/spec-fields.d.ts +20 -20
  309. package/dist/ssh-host-key.d.ts +5 -5
  310. package/dist/store-live-probe.d.ts +2 -2
  311. package/dist/task-cwd.d.ts +11 -11
  312. package/dist/task-mcp.d.ts +5 -5
  313. package/dist/task-settings.d.ts +35 -35
  314. package/dist/task-workflow.d.ts +3 -3
  315. package/dist/text-bidi.d.ts +1 -1
  316. package/dist/tool-approval.d.ts +171 -160
  317. package/dist/tool-approval.js +33 -28
  318. package/dist/trace/core-keyset-guard.d.ts +21 -7
  319. package/dist/trace/engine-notice-wire.d.ts +6 -6
  320. package/dist/trace/injection-tier.d.ts +2 -2
  321. package/dist/trace/ledger-events.d.ts +3 -3
  322. package/dist/trace/ledger-sink.d.ts +7 -7
  323. package/dist/trace/project.d.ts +35 -30
  324. package/dist/trace/project.js +9 -0
  325. package/dist/turn-activity.d.ts +4 -4
  326. package/dist/usage-analytics.d.ts +1 -1
  327. package/dist/wall-clock-jump-guard.d.ts +3 -3
  328. package/package.json +6 -6
@@ -1,5 +1,5 @@
1
1
  /**
2
- * design/158 A10:composition root 分段 —— 后台 reaper / 维护 tick。
2
+ * [ref] A10:composition root 分段 —— 后台 reaper / 维护 tick。
3
3
  *
4
4
  * 纯搬运:函数体逐字来自 `main.ts`(原 2387-2599 行),缩进不变;新增的只有 import 与
5
5
  * `startReapers(ctx)` 包壳。
@@ -22,7 +22,7 @@ import type { WorkflowNotifyGate, WorkflowNotifyJournalStore } from "../orchestr
22
22
  import type { TaskAttachmentStore } from "../plugins/task-attachment-store.js";
23
23
  import type { CheckpointStoreFull, CostQuotaStore, ImageBake, RateLimiterStore, ServiceWorkflowJournalStore, StoreBackend, ToolResultStoreFull } from "../plugins/store-backend.js";
24
24
  import type { ToolApprovalCoordinator } from "../tool-approval.js";
25
- /** #157 / [2762]§五(sema-comms `audits/failopen-governance-176.md` §7 "Z 类 1 条"):default consecutive-failure
25
+ /** [ref] / [ref]§五(sema-comms `audits/failopen-governance-176.md` §7 "Z 类 1 条"):default consecutive-failure
26
26
  * count before a reaper leg's swallowed error gets a `warn` line. The ~15 `.catch(() => undefined)` sites
27
27
  * below are correct in DIRECTION (a hiccuping periodic sweep must never crash the whole tick loop — one bad
28
28
  * leg cannot be allowed to starve its ~15 siblings), but were zero-observability: an operator watching only
@@ -51,7 +51,7 @@ export interface ThrottledReaperCatch {
51
51
  * survives across ticks — a fresh instance per tick would never accumulate past 1.
52
52
  */
53
53
  export declare function createThrottledReaperCatch(name: string, logger: Logger, threshold?: number): ThrottledReaperCatch;
54
- /** A-010.17 —— 维护 tick 真正消费的那**一手**(窄口;理由见 `ReapersCtx.permissionRuleStores`)。
54
+ /** [ref] —— 维护 tick 真正消费的那**一手**(窄口;理由见 `ReapersCtx.permissionRuleStores`)。
55
55
  * 可选成员:File 车道没有这一面(追加日志的压实是另一件事,如实登记在 `rules-consent.ts` 的
56
56
  * `PermissionRuleStoreBundle.reapExpired` 注里),缺席 ⇒ 本腿零调用。 */
57
57
  export interface PermissionRuleRetentionSweeper {
@@ -74,7 +74,7 @@ export interface ReapersCtx {
74
74
  imageBakes: ImageBake | undefined;
75
75
  worktreeReap: (() => Promise<void>) | undefined;
76
76
  workflowNotifyGate: WorkflowNotifyGate | undefined;
77
- /** [2995]/[2999] recover 的两半 opts(boot 与周期扫描共用,单点合成在 workflow-orchestration)。 */
77
+ /** [ref]/[ref] recover 的两半 opts(boot 与周期扫描共用,单点合成在 workflow-orchestration)。 */
78
78
  workflowRecoverOpts: Parameters<WorkflowNotifyGate["recover"]>[0];
79
79
  workflowJournalStore: ServiceWorkflowJournalStore | undefined;
80
80
  sqlWorkflowRunStore: WorkflowRunStore | undefined;
@@ -82,11 +82,11 @@ export interface ReapersCtx {
82
82
  rosterStore: RunnerDeps["rosterStore"];
83
83
  backgroundAgentStore: RunnerDeps["backgroundAgentStore"];
84
84
  mailboxStore: RunnerDeps["mailboxStore"];
85
- /** #151 车6:流内审批撤卡帧的 live 投递口(收敛器/孤儿代打腿产出的帧经它反查 broker 的活连接)。
85
+ /** [ref] 车6:流内审批撤卡帧的 live 投递口(收敛器/孤儿代打腿产出的帧经它反查 broker 的活连接)。
86
86
  * `TOOL_APPROVAL_ENABLED=false` 的部署恒 undefined ⇒ 收敛器照常收敛,只是不发通知帧(壳侧靠
87
87
  * 重连 preamble 对账,见 approval-card.ts 的 `ApprovalRevokeFrame` 顶注)。 */
88
88
  toolApproval: ToolApprovalCoordinator | undefined;
89
- /** A-010.17:规则店的**保留期口**。`PERMISSION_RULES_ENABLED=false` 或后端没实装 ⇒ undefined
89
+ /** [ref]:规则店的**保留期口**。`PERMISSION_RULES_ENABLED=false` 或后端没实装 ⇒ undefined
90
90
  * ⇒ 本腿根本不注册(零扫描),与它的同族旋钮腿同姿势。
91
91
  *
92
92
  * 🔴 类型刻意窄到 {@link PermissionRuleRetentionSweeper} 而不是整个 `PermissionRuleStoreBundle`:
@@ -141,7 +141,7 @@ interface ReapSessionsInputs {
141
141
  };
142
142
  }
143
143
  /**
144
- * 🔴 #292 C18(core 5.48.0 design/323,[4743] 提货单)——**分区腿武装**的判据本体。
144
+ * 🔴 [ref] C18(core 5.48.0 [ref],[ref] 提货单)——**分区腿武装**的判据本体。
145
145
  *
146
146
  * core 5.48 起 `reapDurableAgents` 的 `deps.sessions` 多一只可选 `listPlaced`:在场即启用**分区收割
147
147
  * 腿** —— 一条 placed 转录的属主行已经不在(put 从未落地 / 上一轮条件删赢了但 release 失败)时,行驱动
@@ -153,7 +153,7 @@ interface ReapSessionsInputs {
153
153
  * · `release` 对 **placed id** 必须走 host 店:路由店(`ForkRoutingSessionStore`)对一个重启后不认识
154
154
  * 的 id 会回落 transient(进程内 no-op),那会让 core 数出一次**从未发生**的 release
155
155
  * (`orphanPlacedReleased` 当场变成谎)而字节还在库里。故先按**持久化元组**判(一次 PK 探针),
156
- * placed 走 host 店的真删除;其余 id 原样保留 [1522] 裁定的双店语义。
156
+ * placed 走 host 店的真删除;其余 id 原样保留 [ref] 裁定的双店语义。
157
157
  * · 🔴 探针本身失败 ⇒ **响亮抛**(codex 交叉复审 R1-[medium],验真后修:本函数的初版把探针错误
158
158
  * 改写成 `undefined` 再落路由店 —— 而重启后路由店不认识 placed id ⇒ transient no-op,core 却因为
159
159
  * release 正常 resolve 而 `orphanPlacedReleased++`。间歇性 DB 故障于是被**伪装成 GC 成功**:监控
@@ -23,7 +23,7 @@ type PrincipalCaps = ReturnType<typeof createPrincipalEntitlementsClient>;
23
23
  /** `resolveSpec` 原先从 `main()` 闭包里拿到的全部 boot 局部量。 */
24
24
  export interface ResolveSpecCtx {
25
25
  config: ServiceConfig;
26
- /** #196:hands lane 登记簿。resolveSpec 在产出 TaskSpec 时按场景判别位登记本请求的表态,HTTP 执行点
26
+ /** [ref]:hands lane 登记簿。resolveSpec 在产出 TaskSpec 时按场景判别位登记本请求的表态,HTTP 执行点
27
27
  * 凭同一只登记簿选 Runner —— **必须与 main.ts 传给 `runnerFor` 的是同一实例**(异实例 = 每个请求都
28
28
  * 落回 full,收窄静默失效)。 */
29
29
  handsLanes: HandsLaneRegistry;
@@ -65,12 +65,12 @@ export interface ResolveSpecCtx {
65
65
  root: string;
66
66
  } | undefined;
67
67
  durableEnabled: boolean;
68
- /** #152 ([2703] 案二):活体 AskUserQuestion 面(QuestionCoordinator 的判决探针切面)。在场(=
68
+ /** [ref] ([ref] 案二):活体 AskUserQuestion 面(QuestionCoordinator 的判决探针切面)。在场(=
69
69
  * ASK_QUESTION_ENABLED)时 durable question 门按活流上下文分腿、spec 不再 stamp QUESTION_AWAITS_RESUME
70
70
  * (否则 spec.onQuestion 恒遮蔽 RunnerDeps.onQuestion 的活人腿);缺席时行为与旧形逐字一致。 */
71
71
  liveQuestionFace: LiveQuestionFace | undefined;
72
72
  /**
73
- * S-46 件C —— 部署级**活体审批席**(`RunnerDeps.onAsk` 的同源铸法,main.ts 递
73
+ * [ref] 件C —— 部署级**活体审批席**(`RunnerDeps.onAsk` 的同源铸法,main.ts 递
74
74
  * `createRunnerDepsOnAsk(toolApproval)`;单一属主同 `boot/runner-deps.ts`,与 `parked-revive-gate.ts`
75
75
  * 的 `approverSeat` 是同一格)。
76
76
  *
@@ -87,7 +87,7 @@ export interface ResolveSpecCtx {
87
87
  imageIndex: ReturnType<NonNullable<StoreBackend["imageIndex"]>> | undefined;
88
88
  perTaskImage: PerTaskImageRegistry;
89
89
  sessionEnvSelection: SessionEnvironmentSelection;
90
- /** design/170 件C:本部署已校验的锁集(boot/governance-seams.ts 的产物,与 `RunnerDeps.lockedConfig`
90
+ /** [ref] 件C:本部署已校验的锁集(boot/governance-seams.ts 的产物,与 `RunnerDeps.lockedConfig`
91
91
  * 同源一次解析)。空集 = 无锁 = 现行为。本域只用它做**同步拒面**(§4.3),不做第二次裁决。 */
92
92
  lockedKeys: ReadonlySet<import("@sema-agent/core").LockedKey>;
93
93
  }
@@ -1,5 +1,5 @@
1
1
  /**
2
- * #270 车2 —— 托管留存的 **sweep lane**(设计稿 `docs/DESIGN-270-retention-lane.md` v1.3 §3/§4/§7)。
2
+ * [ref] 车2 —— 托管留存的 **sweep lane**(设计稿 `docs/DESIGN-270-retention-lane.md` v1.3 §3/§4/§7)。
3
3
  *
4
4
  * ── 为什么是独立文件、独立定时器,而不是折进 `startReapers()`(设计稿 §3 首条)───────────────────
5
5
  * `boot/reapers.ts` 里那二十条腿全都是**容忍多副本**的幂等清理:每台副本各扫各的,重复扫一遍只是浪费。
@@ -1,5 +1,5 @@
1
1
  /**
2
- * design/158 A10:composition root 分段 —— `RunnerDeps` 装配(含 self-orchestration 成组段)。
2
+ * [ref] A10:composition root 分段 —— `RunnerDeps` 装配(含 self-orchestration 成组段)。
3
3
  *
4
4
  * 纯搬运:两个字面量逐字来自 `main.ts`(原 1579-1881 行),缩进不变(顶层键仍在 4 空格,
5
5
  * `deps-literal-shape-gate` 的顶层条件展开门覆盖面不变);新增的只有 import 与包壳。
@@ -24,16 +24,16 @@ import { WorkflowNotifyGate, type WorkflowCompletionPayload } from "../orchestra
24
24
  import type { ServiceWorkflowJournalStore, StoreBackend, ToolResultStoreFull } from "../plugins/store-backend.js";
25
25
  import type { QuestionCoordinator } from "../question.js";
26
26
  import type { ToolApprovalCoordinator } from "../tool-approval.js";
27
- import type { MemoryBackend } from "@sema-agent/core";
27
+ import type { MemoryBackend, SessionCaptureRecordStore } from "@sema-agent/core";
28
28
  import type { MemorySyncRunner } from "../memory-sync-client.js";
29
29
  /**
30
- * `RunnerDeps.onAsk` 的装配(#168 件4:从内联闭包提为具名导出,**纯 testability 重构、零行为变化**)。
30
+ * `RunnerDeps.onAsk` 的装配([ref] 件4:从内联闭包提为具名导出,**纯 testability 重构、零行为变化**)。
31
31
  *
32
- * 为什么值得有名字(历史理由,#168 当时):bg / resume 两条腿彼时没有 per-task `spec.onAsk` 装配点,
32
+ * 为什么值得有名字(历史理由,[ref] 当时):bg / resume 两条腿彼时没有 per-task `spec.onAsk` 装配点,
33
33
  * 它们唯一的审批接缝就是这一格。端到端测试此前只能把这一行**照抄**一份,再靠一条读源码
34
34
  * 的正则当漂移告警 —— 那种锚只抓得到「这一行没了/改名了」,抓不到任何语义变化,而且抄件与真件从此是两
35
35
  * 份实现。提成导出之后,测试直接取本函数,接缝与 production 是**同一个符号**。
36
- * ⚠️ S-52 起**三腿都装** per-task `spec.onAsk = boundAsk`(sync=routes/tasks.ts、bg=runs.ts、
36
+ * ⚠️ [ref] 起**三腿都装** per-task `spec.onAsk = boundAsk`(sync=routes/tasks.ts、bg=runs.ts、
37
37
  * resume=server.ts driveResumeLeg;core `resolveAsk` 取 `spec.onAsk ?? deps.onAsk` ⇒ 这三条腿及其继承链
38
38
  * 子代不再落到本格)—— 本格现役的到达面 = 没有 per-task 装配的腿(headless/durable-submit、协调器在场
39
39
  * 但 taskId 缺席的退化 resume 腿)与任何未来新腿的缺省兜底,fail-direction 不变(零 ctx ⇒ 政策口)。
@@ -42,10 +42,10 @@ import type { MemorySyncRunner } from "../memory-sync-client.js";
42
42
  *
43
43
  * 返回型**刻意窄于** `RunnerDeps["onAsk"]`(它还允许 `"allow"`/`"deny"` 两个字符串常量):本仓的接缝
44
44
  * 恒是回调形,而 core 的 sync-first 判据只看 `onAsk !== undefined` ⇒ 字符串模式会顶掉 durable park
45
- * (core backlog #73,黑板 [2897]④ / [2899] 已知悉)。窄返回型把「本仓零受迫于那一形」变成编译期事实。
45
+ * (core backlog #73,黑板 [ref]④ / [ref] 已知悉)。窄返回型把「本仓零受迫于那一形」变成编译期事实。
46
46
  *
47
- * 语义逐字不变:[816]/[820]② 的 live tool-approval 接缝(core `resolveAsk` 读 `spec.onAsk ?? deps.onAsk`),
48
- * ALS 路由同 `onQuestion` —— 被协调器 `runWithContext` 包住的腿才够得着人。[879] G1 终态(core 1.295
47
+ * 语义逐字不变:[ref]/[ref]② 的 live tool-approval 接缝(core `resolveAsk` 读 `spec.onAsk ?? deps.onAsk`),
48
+ * ALS 路由同 `onQuestion` —— 被协调器 `runWithContext` 包住的腿才够得着人。[ref] G1 终态(core 1.295
49
49
  * OnAsk 三值化)下**恒**接线:回调逐 ask 时刻判活人,无附着/卡送达失败 ⇒ 返 `"unavailable"`,core 以
50
50
  * `approverUnavailable` 回路把该 ask 交回 `suspendAsk` 走 durable park;无 park 设施的部署 core 自己
51
51
  * fail-closed deny。协调器缺席(协议未上场)⇒ `undefined`,即「这条部署没有活人接缝」。
@@ -61,7 +61,7 @@ export interface RunnerDepsCtx {
61
61
  rosterStore: RunnerDeps["rosterStore"];
62
62
  backgroundAgentStore: RunnerDeps["backgroundAgentStore"];
63
63
  mailboxStore: RunnerDeps["mailboxStore"];
64
- /** design/166-T1:治理窗账本店(USAGE_WINDOWS 配置时才在场;与 config.usageWindows 成对进 deps)。 */
64
+ /** [ref]-T1:治理窗账本店(USAGE_WINDOWS 配置时才在场;与 config.usageWindows 成对进 deps)。 */
65
65
  usageWindowStore: RunnerDeps["usageWindowStore"];
66
66
  brain: ReturnType<typeof createBrain>;
67
67
  pricing: ReturnType<typeof buildPricing>;
@@ -75,16 +75,22 @@ export interface RunnerDepsCtx {
75
75
  backend: MemoryBackend;
76
76
  root: string;
77
77
  } | undefined;
78
+ /** [ref]②([ref] §2.1b,core 7.0.2 [ref] 件2):会话 capture opt-out 记录的 SQL 载体
79
+ * (`backend.sessionCaptureRecords()`,main.ts 取**一次**、与四只 operator 面引擎同实例 —— 全站同批
80
+ * 注入律,机器钉 = test/memory-capture-optout-lane.test.ts ②)。缺席(local 车道)⇒ core 用控制面
81
+ * 文件三腿,单机字节不变;在场 ⇒ 远端车道 `capture:"off"` 声明从 409 `config.memory_capture_unsupported`
82
+ * 稳态转为真持久(core prepare-memory 的 §2.1b 能力信号)。 */
83
+ sessionCaptureRecordStore: SessionCaptureRecordStore | undefined;
78
84
  memorySyncRunner: MemorySyncRunner | undefined;
79
- /** design/170 件A(#148 件3③):org 记忆准入两 seam 的装配产物(boot/org-memory.ts)。进**共享
85
+ /** [ref] 件A([ref] 件3③):org 记忆准入两 seam 的装配产物(boot/org-memory.ts)。进**共享
80
86
  * 基座**——主/sub 两 Runner 必须同源:委托子代的 prepare 同样跑准入(委托冻结的重判腿),漏挂
81
87
  * subRunner=子代平面跳过目录判决。 */
82
88
  orgMemoryAdmission: import("./org-memory.js").OrgMemoryAdmissionWiring;
83
- /** design/170 件B/C/D(#252 件1):三个部署治理座席的装配产物(boot/governance-seams.ts)。进**共享
89
+ /** [ref] 件B/C/D([ref] 件1):三个部署治理座席的装配产物(boot/governance-seams.ts)。进**共享
84
90
  * 基座** —— 合规否决与锁定层必须同样管住委托子代那条腿(子代 prepare 走同一套 preflight;漏挂
85
91
  * subRunner = 子代平面跳过档位与锁,与件A 同一个理由)。`retentionPolicy` 是纯声明,同源携带。 */
86
92
  governanceSeams: import("./governance-seams.js").GovernanceSeams;
87
- /** design/177 —— org 共享记忆库的供给面(core `RunnerDeps.sharedMemoryStores`)。在场即挂载
93
+ /** [ref] —— org 共享记忆库的供给面(core `RunnerDeps.sharedMemoryStores`)。在场即挂载
88
94
  * `memory_list`/`memory_read` 两只工具(core 没有 TaskSpec 伴生旋钮:dep 的在场**就是**部署意图);
89
95
  * 缺席 ⇒ 两只都不挂,连占位都没有。装配点按「SQL 供给面 ∧ org 折叠面」双在场才铸它,与 HTTP 面
90
96
  * 同一个合取式(main.ts)。 */
@@ -92,17 +98,17 @@ export interface RunnerDepsCtx {
92
98
  toolResultStore: ToolResultStoreFull | undefined;
93
99
  sessionPolicyStore: ReturnType<StoreBackend["sessionPolicy"]> | undefined;
94
100
  runtimeCapsResolver: RunnerDeps["runtimeCapsResolver"];
95
- /** S-15 per-edited-file rewind history (core `RunnerDeps.fileHistoryStore`; replaces the retired E19
101
+ /** [ref] per-edited-file rewind history (core `RunnerDeps.fileHistoryStore`; replaces the retired E19
96
102
  * whole-tree snapshot seat — core 94632197 renamed the seat, not a coexistence). WIRING IS THE OPT-IN. */
97
103
  fileHistoryStore: ReturnType<StoreBackend["fileHistory"]> | undefined;
98
104
  /** S-1 legacy-epoch discriminant (core `RunnerDeps.legacyRewindBoundaryProbe`): lets the rewind refusal
99
105
  * distinguish "never existed / reaped" from "exists in the RETIRED whole-tree epoch". Consulted only on
100
106
  * the refusal path; diagnostic input, never a control input (a bad probe cannot change the outcome). */
101
107
  legacyRewindBoundaryProbe: RunnerDeps["legacyRewindBoundaryProbe"];
102
- /** #154 车二:持久化权限规则店 provider(core `RunnerDeps.permissionRuleStore`)。缺席 ⇒ 引擎的
108
+ /** [ref] 车二:持久化权限规则店 provider(core `RunnerDeps.permissionRuleStore`)。缺席 ⇒ 引擎的
103
109
  * `permissionRules.storeWired` 如实报 false、`AskRequest.ruleOffers` 不铸(诚实缺席)。 */
104
110
  permissionRuleStore: RunnerDeps["permissionRuleStore"];
105
- /** #324(core 5.50 design/338):mid-turn MCP 撤销台账席 —— core 每次 MCP dispatch 前同步探
111
+ /** [ref](core 5.50 [ref]):mid-turn MCP 撤销台账席 —— core 每次 MCP dispatch 前同步探
106
112
  * `isRevoked(serverName)`,被撤服务器的调用结算为 coded 拒绝 `mcp.server_revoked`(known-not-executed)。
107
113
  * 来源=configCenter.takeMcpRevocations()(取走即声明接线,restart 豁免与承接绑同一动作)。
108
114
  * 缺席=undefined=pre-338 语义(纯 env 部署无中心撤销面)。 */
@@ -110,12 +116,12 @@ export interface RunnerDepsCtx {
110
116
  /**
111
117
  * 交接件⑤ —— commit 尾注的署名座(`RunnerDeps.hands.commitCoAuthor`)。
112
118
  *
113
- * 🔴 为什么它属于**共享基座**而不是主 runner 的差异键:署名是**部署身份**([931]① clay 拍:
119
+ * 🔴 为什么它属于**共享基座**而不是主 runner 的差异键:署名是**部署身份**([ref]① clay 拍:
114
120
  * 「署名 = 产品身份资产,归部署」),不是「哪一只 Runner 在跑」的属性。一个被委派出去的子代
115
121
  * 提交进的是**同一个仓**、代表的是**同一个部署** —— 它的 commit 少一行 trailer 没有任何理由。
116
122
  * 修前两条腿都漏:`main.ts` 与 `run-local.ts` 的 subRunner 都只在主 runner 上写了这一键,而两处
117
123
  * 的「差异键」注释块逐条列了 sessionStore / checkpointStore / 四个座位,**都没提 hands**
118
- * —— 也就是说它不是一次有理由的分歧,是漏配(与本函数头注记的 [1543]§三族A 同一个病族)。
124
+ * —— 也就是说它不是一次有理由的分歧,是漏配(与本函数头注记的 [ref]§三族A 同一个病族)。
119
125
  * 由**调用方**给值(而不是在基座里按 `config` 现算):两条腿的判据本就不同(HTTP 腿按
120
126
  * `configProvider === "local"` 分 branded/非 branded,run-local 恒是 Sema 本地形),
121
127
  * 各自算一次、传进来一次,两只 Runner 自动同源。
@@ -134,14 +140,14 @@ export interface RunnerDepsCtx {
134
140
  /** 晚绑(runStore 在本段之后构造)——见文件头「位置即契约」。 */
135
141
  getRunStore: () => ReturnType<StoreBackend["run"]> | undefined;
136
142
  }
137
- /** design/158 A10 留档发现②:main runner `RunnerDeps` 与 main.ts subRunner 字面量之间此前手工重复
143
+ /** [ref] A10 留档发现②:main runner `RunnerDeps` 与 main.ts subRunner 字面量之间此前手工重复
138
144
  * 的 ~15 个键,类型标注见 {@link createSharedRunnerDeps} 头注。 */
139
145
  export type SharedRunnerDeps = Pick<RunnerDeps, "brain" | "readFace" | "readDenyPatterns" | "readDenyBuiltinTiers" | "readDenyBuiltinExclude" | "memoryDelegationEvidence" | "memoryProvenance" | "memoryCapturePolicy" | "delegationEntryCaps" | "models" | "roles" | "tiers" | "pricing" | "tracer" | "promptSource" | "executionEnvFactory" | "lspManager" | "backgroundAgentStore" | "mailboxStore" | "rosterStore" | "hooks" | "toolResultStore" | "hands" | "sessionPolicyStore" | "usageWindows" | "usageWindowStore" | "memoryScopeAdmission" | "deploymentMemoryScopes" | "sharedMemoryStores" | "compliancePostureResolver" | "lockedConfig" | "retentionPolicy" | "onNotice" | "mcpRevocations">;
140
146
  /**
141
- * design/158 A10 留档发现②(review 2026-07-29,[1543]§三族A 同源修补的延续):main runner 的
147
+ * [ref] A10 留档发现②(review 2026-07-29,[ref]§三族A 同源修补的延续):main runner 的
142
148
  * `RunnerDeps` 字面量(下方 `createRunnerDeps`)与 `main.ts` 里 subRunner 的 `new Runner({...})`
143
149
  * 字面量之间,以下 ~15 个键此前是**各自手写、独立展开**的同源值(同一 ctx 变量,两处分别拼字面量,
144
- * 不是同一引用)——正是 [1543]§三族A 那次「主 runner 挂了、subRunner 漏挂」漏配事故的键族(当时的
150
+ * 不是同一引用)——正是 [ref]§三族A 那次「主 runner 挂了、subRunner 漏挂」漏配事故的键族(当时的
145
151
  * 修法是把 onBackgroundChildEvent/loadProjectMemory/probeInstructionSources/onError 四键改成直引
146
152
  * `runnerDeps.X`「同一实例」;这里补的是**剩下未被那次改法覆盖**的 15 个键——两处字面量各自独立
147
153
  * 取值,漏配一个不会有任何编译期或运行期信号)。
@@ -153,21 +159,21 @@ export type SharedRunnerDeps = Pick<RunnerDeps, "brain" | "readFace" | "readDeny
153
159
  * 消费点(复审 2026-07-30 F1 更新,过期「尚未接上」段已删):**两处都已展开**——下方
154
160
  * `createRunnerDeps()`(全量 ctx)与 main.ts 的 subRunner `new Runner({...createSharedRunnerDeps(...)})`
155
161
  * (窄面 {@link SharedRunnerDepsCtx})。新增共享键只需加进本函数返回体,两 Runner 自动同源;
156
- * **不要**再在任一调用点手写同名键(那会 override 展开,回到 [1543] 漏配病)。
162
+ * **不要**再在任一调用点手写同名键(那会 override 展开,回到 [ref] 漏配病)。
157
163
  *
158
164
  * 差异键(为何不在本共享基座、逐一注明):
159
165
  * - `sessionStore`:main runner 用宿主 durable 会话店;subRunner 用私有短 TTL 的
160
166
  * `ForkRoutingSessionStore`(main.ts 现场构造,子代转录生命周期与主会话不同)。
161
167
  * - `checkpointStore`:main runner 走 `spec.checkpointStore` 分支(不进 `RunnerDeps`,本 ctx 根本
162
- * 没有这个字段);subRunner 单独携带(子代执行面的 park 设施,[1584])。
168
+ * 没有这个字段);subRunner 单独携带(子代执行面的 park 设施,[ref])。
163
169
  * - `onBackgroundChildEvent` / `loadProjectMemory` / `probeInstructionSources` / `onError`:
164
- * [1543]§三族A 已用「直引 `runnerDeps.X`」修过(main.ts 两处引用同一个 `runnerDeps` 实例的同一
170
+ * [ref]§三族A 已用「直引 `runnerDeps.X`」修过(main.ts 两处引用同一个 `runnerDeps` 实例的同一
165
171
  * 属性,比再抽一层共享基座更强的同源保证),不重复收纳进这里。
166
172
  */
167
173
  /** 基座真实消费的窄面(Pick)——subRunner 调用点(main.ts)只需凑这 13 个字段,不必造全量 ctx。 */
168
174
  export type SharedRunnerDepsCtx = Pick<RunnerDepsCtx, "config" | "brain" | "pricing" | "tracer" | "promptSource" | "executionEnvFactory" | "lspManager" | "backgroundAgentStore" | "mailboxStore" | "rosterStore" | "deploymentHooks" | "toolResultStore" | "sessionPolicyStore" | "hands" | "usageWindowStore" | "orgMemoryAdmission" | "sharedMemoryStores" | "logger" | "governanceSeams" | "mcpRevocations">;
169
175
  /**
170
- * core `EngineNotice` → 结构化 `engine_notice` 行的**唯一**转发体(#240②)。
176
+ * core `EngineNotice` → 结构化 `engine_notice` 行的**唯一**转发体([ref]②)。
171
177
  *
172
178
  * 🔴 为什么是具名导出而不是就地闭包(合并码重扫):这一席此前只落在共享基座里,于是 leader 车道
173
179
  * (`src/leader/wire.ts` 自拼 deps 的五处 `new Runner({...})`)一处都没有 —— core 的契约是「接线 ⇒ 走
@@ -180,8 +186,8 @@ export type SharedRunnerDepsCtx = Pick<RunnerDepsCtx, "config" | "brain" | "pric
180
186
  * logger」上会把通告**吞掉** —— 比不接线还坏(不接线时 core 至少还打它自己的 `console.warn`)。所以
181
187
  * 「有没有 warn」这个判断留在**装配点**:没有就别铸这一席,让 core 的响亮权留在原处。
182
188
  *
183
- * ## #310:双终点分流器(设计稿 = 黑板 [4630])
184
- * 本体自 #310 起是**分流器**,两个终点:
189
+ * ## [ref]:双终点分流器(设计稿 = 黑板 [ref])
190
+ * 本体自 [ref] 起是**分流器**,两个终点:
185
191
  * 1. **日志(全族,逐字保留)** —— 上面那段契约一个字节不变:任何 code、detail 原样、缺 detail 不铸键。
186
192
  * 运维观察面零回退是本腿的硬前提(wire 半场是**增量**,不是搬家)。
187
193
  * 2. **wire(白名单 + sessionId 路由)** —— `router.route(notice)`:码在
@@ -192,7 +198,7 @@ export type SharedRunnerDepsCtx = Pick<RunnerDepsCtx, "config" | "brain" | "pric
192
198
  * `src/trace/engine-notice-wire.ts`(白名单/归属/消毒/隔离四件同源),这里只负责**先日志后分流**的次序。
193
199
  *
194
200
  * 🔴 次序是承重的:日志在前 ⇒ 即便 wire 半场整条坏掉(路由抛、口抛),事实仍然完整落在运维面。
195
- * 反过来写就是「wire 故障吃掉运维日志」,那正是本仓 #157 纪律要根除的形。route 自身按 sink 隔离 +
201
+ * 反过来写就是「wire 故障吃掉运维日志」,那正是本仓 [ref] 纪律要根除的形。route 自身按 sink 隔离 +
196
202
  * F 类留痕(`server.engine-notice.wire-sink-threw`),不向 core 回抛。
197
203
  *
198
204
  * 🔴 `router` **有默认值**(进程单例)而不是必填:这一席有五个以上装配点(共享基座 / leader 车道四处 /
@@ -65,7 +65,7 @@ export function createSharedRunnerDeps(ctx) {
65
65
  return shared;
66
66
  }
67
67
  export function createRunnerDeps(ctx) {
68
- const { config, logger, metrics, localRoot, outcomeSink, elicitation, question, toolApproval, sessionStore, memoryEngine, memorySyncRunner, runtimeCapsResolver, fileHistoryStore, legacyRewindBoundaryProbe, permissionRuleStore, fleetBus, workflowRunStore, workflowJournalStore, workflowAgentRegistry, workflowNotifyGate, workflowCompletionInbox, deliverWorkflowCompletion, getRunStore, } = ctx;
68
+ const { config, logger, metrics, localRoot, outcomeSink, elicitation, question, toolApproval, sessionStore, memoryEngine, sessionCaptureRecordStore, memorySyncRunner, runtimeCapsResolver, fileHistoryStore, legacyRewindBoundaryProbe, permissionRuleStore, fleetBus, workflowRunStore, workflowJournalStore, workflowAgentRegistry, workflowNotifyGate, workflowCompletionInbox, deliverWorkflowCompletion, getRunStore, } = ctx;
69
69
  const sharedRunnerDeps = createSharedRunnerDeps(ctx);
70
70
  const workflowModelAllowlist = workflowModelAllowlistFor(config);
71
71
  const selfOrchestrationDeps = config.selfOrchestrationEnabled
@@ -138,6 +138,7 @@ export function createRunnerDeps(ctx) {
138
138
  sessionStore,
139
139
  memoryBackend: memoryEngine ? memoryEngine.backend : undefined,
140
140
  memoryEngineDir: memoryEngine ? memoryEngine.root : undefined,
141
+ memoryCaptureRecordStore: sessionCaptureRecordStore !== undefined ? () => sessionCaptureRecordStore : undefined,
141
142
  onMemoryHarvestReport: memoryEngine
142
143
  ? (report, info) => {
143
144
  metrics.inc("memory_harvest_total", { ok: String(report.ok), phase: info.phase, incident: report.incident?.kind ?? "none" });
@@ -1,5 +1,5 @@
1
1
  /**
2
- * design/158 A10:composition root 分段 —— per-principal 运行期准入(design/99 §K caps 客户端)。
2
+ * [ref] A10:composition root 分段 —— per-principal 运行期准入([ref] §K caps 客户端)。
3
3
  *
4
4
  * 纯搬运:函数体逐字来自 `main.ts`(原 1520-1577 行),缩进不变;新增的只有 import 与包壳。
5
5
  *
@@ -13,12 +13,12 @@ import { type MemoryOptOutVerdictSource } from "../runtime-caps-resolver.js";
13
13
  export interface RuntimeCapsCtx {
14
14
  config: ServiceConfig;
15
15
  logger: Logger;
16
- /** design/383 S-2:`RuntimeCaps.allowMemoryOptOut` 的本地 verdict 源(`backend.memoryOptOutGrant()`;
16
+ /** [ref] S-2:`RuntimeCaps.allowMemoryOptOut` 的本地 verdict 源(`backend.memoryOptOutGrant()`;
17
17
  * SQL 后端在场才有,local 车道 undefined)。缺席 ⇒ 本键不合成(零行为差)。 */
18
18
  memoryOptOutGrant?: MemoryOptOutVerdictSource | undefined;
19
19
  }
20
20
  /**
21
- * design/383 §3.1(S-49 S-1b)—— `MEMORY_CAPTURE_POLICY=governed` 的**半配置拒启**(`boot/memory-consolidation.ts`
21
+ * [ref] §3.1([ref] S-1b)—— `MEMORY_CAPTURE_POLICY=governed` 的**半配置拒启**(`boot/memory-consolidation.ts`
22
22
  * D1 / `boot/retention-lane.ts` 同姿态:安全/合规控件不得半开)。
23
23
  *
24
24
  * governed 的语义是「per-principal verdict **必答**」:core 对 verdict 缺席一律**拒跑**(fail-closed,部署显式
@@ -29,7 +29,7 @@ export interface RuntimeCapsCtx {
29
29
  * ensureSchema 建),要么改姿态。`open`/`capture-required`/缺席 不依赖源(前者故障放行、后者全拒,
30
30
  * 都不问 verdict)。
31
31
  *
32
- * ⚠️ center 键 `EntitlementRuntimeCaps.allowMemoryOptOut` 是 settings-schema 的独立小件(S-50 §四 开放问题①),
32
+ * ⚠️ center 键 `EntitlementRuntimeCaps.allowMemoryOptOut` 是 settings-schema 的独立小件([ref] §四 开放问题①),
33
33
  * 到货前**不算源**;到货后本断言加一条「center 在场」析取臂即可,判据不变。
34
34
  */
35
35
  export declare function assertMemoryCapturePolicyWirable(input: {
@@ -25,7 +25,7 @@ export interface SessionFacesCtx {
25
25
  taskAttachmentStore: TaskAttachmentStore | undefined;
26
26
  fileHistoryStore: ReturnType<StoreBackend["fileHistory"]> | undefined;
27
27
  workflowCompletionInbox: WorkflowCompletionInbox | undefined;
28
- /** #318:会话级任务清单车道(E21 级联的一条腿)。缺席 = 装配未接本车道 ⇒ 无清单可删。 */
28
+ /** [ref]:会话级任务清单车道(E21 级联的一条腿)。缺席 = 装配未接本车道 ⇒ 无清单可删。 */
29
29
  taskListLane: TaskListLane | undefined;
30
30
  /** device lane 的四表店(E21 级联的一条腿:`device_session` 绑定行随会话删)。缺席 = 非 SQL 后端。 */
31
31
  deviceStore: DeviceStore | undefined;
@@ -1,5 +1,5 @@
1
1
  /**
2
- * design/158 A10:composition root 分段 —— 进程收尾(hardShutdown / drain / 三个信号处理器)。
2
+ * [ref] A10:composition root 分段 —— 进程收尾(hardShutdown / drain / 三个信号处理器)。
3
3
  *
4
4
  * 纯搬运:函数体逐字来自 `main.ts`(原 4385-4488 行),缩进不变;新增的只有 import 与
5
5
  * `installShutdownHandlers(ctx)` 包壳。
@@ -12,7 +12,7 @@
12
12
  * "第二个信号"的语义读数。
13
13
  * 3. `clearInterval(reaper)` 必须是 hardShutdown 的第一件事(在 `server.close()` 之前),否则
14
14
  * 收尾期还会有 reaper tick 打向正在关闭的池。
15
- * 4. **进程级监听一律成对**(A-070 二轮件4):本函数装的五只(三信号 + #320① 双钩)只能经返回的
15
+ * 4. **进程级监听一律成对**([ref] 二轮件4):本函数装的五只(三信号 + [ref]① 双钩)只能经返回的
16
16
  * {@link ShutdownHandle} 摘 —— 调用方手写「摘三信号」的收尾会把双钩漏在进程上,而陈旧的那只
17
17
  * rejection 钩仍握着 `process.exit(1)`,会对后续无关的 rejection 把进程打掉。
18
18
  */
@@ -29,12 +29,12 @@ import type { BreakerStateStore, CostQuotaStore, RateLimiterStore, StoreBackend
29
29
  import type { WorkflowNotifyJournalStore } from "../orchestration/workflow-notify-journal.js";
30
30
  export interface ShutdownCtx {
31
31
  config: ServiceConfig;
32
- /** #320①:崩溃遗言的 version 键(与 /v1/capabilities.version 同源=main 的 serviceVersion())。 */
32
+ /** [ref]①:崩溃遗言的 version 键(与 /v1/capabilities.version 同源=main 的 serviceVersion())。 */
33
33
  version: string;
34
34
  logger: Logger;
35
35
  server: ReturnType<typeof createHttpServer>;
36
36
  reaper: NodeJS.Timeout;
37
- /** #261:fleet 存活对账腿(60s 定时器 + 总线订阅)。与 `reaper` 同列文件头契约 3 —— 收尾期不该再有
37
+ /** [ref]:fleet 存活对账腿(60s 定时器 + 总线订阅)。与 `reaper` 同列文件头契约 3 —— 收尾期不该再有
38
38
  * 对账 tick 打向正在关闭的池,订阅也要摘(否则 bus 的扇出还在往一个已停的观察者写)。 */
39
39
  fleetReconcile: {
40
40
  timer: NodeJS.Timeout;
@@ -42,11 +42,11 @@ export interface ShutdownCtx {
42
42
  stop(): void;
43
43
  };
44
44
  };
45
- /** #270 车2:托管留存 sweep lane 的**控制器**(`undefined` = lane 关着,压根没建定时器)。与 `reaper`
45
+ /** [ref] 车2:托管留存 sweep lane 的**控制器**(`undefined` = lane 关着,压根没建定时器)。与 `reaper`
46
46
  * 同列文件头契约 3,但严格更强:那些腿只要停表就够了,本腿的 tick 打的是跨十余张表的**破坏性**事务
47
47
  * ⇒ 必须 `await stop()` 等在飞那一轮真正落地,**然后**才让租、才关连接池(见 hardShutdown 内的三步注)。 */
48
48
  retentionLane: RetentionLaneController | undefined;
49
- /** #270 车2:主动让租(把 sweep 租约的到期时间归零)—— 优雅停机后另一副本不必等满一个 TTL 才接手。
49
+ /** [ref] 车2:主动让租(把 sweep 租约的到期时间归零)—— 优雅停机后另一副本不必等满一个 TTL 才接手。
50
50
  * best-effort:一次失败只意味着"下一位等 TTL",绝不阻塞停机。缺席 = lane 关着。 */
51
51
  releaseRetentionLease: (() => Promise<void>) | undefined;
52
52
  otelExporter: ReturnType<typeof startOtlpExporter> | undefined;
@@ -67,7 +67,7 @@ export interface ShutdownCtx {
67
67
  attachedStreams?: () => number;
68
68
  lastAttachEndedAt?: () => number;
69
69
  };
70
- /** #131-2:store 活体探针(main 建)——不停的话 hardShutdown 后仍对正在关闭的池发探针,刷假
70
+ /** [ref]-2:store 活体探针(main 建)——不停的话 hardShutdown 后仍对正在关闭的池发探针,刷假
71
71
  * store_probe_dead 告警(文件头契约 3 的同族漏网)。缺席 = 该部署形没建探针。 */
72
72
  storeLiveProbe: {
73
73
  stop(): void;
@@ -80,16 +80,16 @@ export interface ShutdownCtx {
80
80
  * HTTP 层不能自作主张。所以 `drainState.draining` 翻真的那一刻,这里同步调 `beginDrain()`。
81
81
  */
82
82
  deviceHub: import("../device-ws-hub.js").DeviceWsHub | undefined;
83
- /** #131-2:config 60s 刷新环(config-center startRefreshLoop)——不停的话停机中途还可能热应用
83
+ /** [ref]-2:config 60s 刷新环(config-center startRefreshLoop)——不停的话停机中途还可能热应用
84
84
  * 一份新配置。缺席 = 纯 env 部署没起环。 */
85
85
  configCenter: {
86
86
  stopRefreshLoop(): void;
87
87
  } | undefined;
88
88
  }
89
89
  /**
90
- * `installShutdownHandlers` 的**摘除把手**(A-070 二轮重扫件4)。
90
+ * `installShutdownHandlers` 的**摘除把手**([ref] 二轮重扫件4)。
91
91
  *
92
- * 存在理由:本函数装的是**进程级**监听(三信号 + #320① 双钩),而进程级注册表是全局单例 —— 一个进程里
92
+ * 存在理由:本函数装的是**进程级**监听(三信号 + [ref]① 双钩),而进程级注册表是全局单例 —— 一个进程里
93
93
  * 装两次就是两套 handler 同时在场。生产进程只装一次、装到死,所以这把手服务的是**同进程内反复装配**的
94
94
  * 那一族调用方(测试):此前它们各自手写「只摘三信号」的收尾,双钩每次净泄漏两只,而陈旧 handler 会对
95
95
  * **后续无关**的 rejection 执行 `process.exit(1)`。注册/摘除配对因此必须由装配方给,不许调用方各猜一份。
@@ -1,8 +1,8 @@
1
1
  /**
2
- * #303([4610] test 报「/model 中途切换校验探针经 POST /v1/side-query 对有效 key 返回上游 401」)——
2
+ * [ref]([ref] test 报「/model 中途切换校验探针经 POST /v1/side-query 对有效 key 返回上游 401」)——
3
3
  * side-query 面的 **per-model key plane** 装配。
4
4
  *
5
- * ## 病灶(#303 立案时亲验 core 5.43.0 dist 实现行)
5
+ * ## 病灶([ref] 立案时亲验 core 5.43.0 dist 实现行)
6
6
  *
7
7
  * core 的 side-query verb 当时**结构性没有 key 座位**:
8
8
  * · `core/side-query.d.ts` 的 `SideQuerySpec` 无 `apiKey` / `getApiKeyAndHeaders` 字段;
@@ -16,7 +16,7 @@
16
16
  * 当时的窄修 = 一只 **key 注入 brain wrapper**(`createPerModelKeyBrain`),并在顶注写明「core 一旦
17
17
  * 给 `SideQuerySpec` 补上 key 座位,本 wrapper 即可撤」,撤除信号挂机器钉。
18
18
  *
19
- * ## #341 换装(core 5.46.0 提货,[4615] 座位到货 —— 撤除条件已满足)
19
+ * ## [ref] 换装(core 5.46.0 提货,[ref] 座位到货 —— 撤除条件已满足)
20
20
  *
21
21
  * core 5.46.0 的 `SideQuerySpec` 有了 `getApiKeyAndHeaders?: TaskSpec["getApiKeyAndHeaders"]`,
22
22
  * `runSideQuery` 每次调用按**解析后的** `Model` 调它,并把 `{apiKey, headers}` 铸进 brain options
@@ -32,22 +32,22 @@
32
32
  *
33
33
  * 🔴 **poison(sealed key 不可解)上抛,绝不静默回落网关 key** —— `resolveModelApiKey` 抛
34
34
  * `SealedKeyPoisonedError` 是「这个模型配了托管密钥但解不开」的响亮态;吞成 undefined 等于用共享
35
- * 网关账号去打这只模型的上游,正是毒丸机制存在的理由(CLAUDE.md #157 安全轴 fail-closed)。换装后
35
+ * 网关账号去打这只模型的上游,正是毒丸机制存在的理由(CLAUDE.md [ref] 安全轴 fail-closed)。换装后
36
36
  * 这条语义由 core 承载得更彻底:座位抛 ⇒ `runSideQuery` 的 `await` 直接上抛,brain 一个字节都没发。
37
37
  *
38
- * ## 具名残余已在**源头**清偿(core 5.57.0,#345 提货批)—— 本席的 P-DEBT 腿随之撤线
38
+ * ## 具名残余已在**源头**清偿(core 5.57.0,[ref] 提货批)—— 本席的 P-DEBT 腿随之撤线
39
39
  *
40
40
  * 曾经的具名残余是「无 per-model key 的 **off-route** 模型仍收网关 key」(codex R1-F1):座位回
41
41
  * `undefined` ⇒ core 用网关 key,而选路仍按 `model.baseUrl` ⇒ 这一次调用真把共享网关凭据发给了别家
42
42
  * 主机。当年**刻意不在本面收严**,理由是「与主推理链逐字同语义,单面收严 = 同一只模型跑任务能用、
43
- * 问一句 401」,收严件挂在跨面件 #309;补偿是一条 `P-DEBT` 计数(census 第 32 行)。
43
+ * 问一句 401」,收严件挂在跨面件 [ref];补偿是一条 `P-DEBT` 计数(census 第 32 行)。
44
44
  *
45
45
  * core 5.57.0 把这件事**在唯一正确的层**做了:`adjudicateModelRoute`(`brain/route-adjudicator.ts`)
46
46
  * 是配对法的单一实现,三只一方 brain(openai / anthropic / open-responses)在 `buildRequest` 里逐次
47
47
  * 复判 —— 部署声明了 `config.baseUrl` 而 entry URL 不在那个根上、凭据又只有部署级那一份 ⇒
48
48
  * `route.credential_mismatch` 响亮拒;连部署级凭据都没有 ⇒ `route.credential_missing`。**三面同批**
49
49
  * (主推理链 / side-query / WebFetch 摘要走的是同一只 brain 栈),旋钮 = 给模型自己的凭据、或不声明
50
- * `config.baseUrl`(core 的 `"unpinned"` 快速起步姿态)。⇒ #309 要的「三面同批 + 旋钮」由上游一次交齐。
50
+ * `config.baseUrl`(core 的 `"unpinned"` 快速起步姿态)。⇒ [ref] 要的「三面同批 + 旋钮」由上游一次交齐。
51
51
  *
52
52
  * 于是本席的 `isOffRouteBaseUrl` + `recordFailOpen("server.model-key.off-route-model-uses-gateway-key")`
53
53
  * 两件**一并撤线**:那条计数的语义是「这一次调用真把网关凭据发给了别家」,而在 5.57 上那次调用根本
@@ -67,7 +67,7 @@ export type PerModelAuthSeat = NonNullable<SideQuerySpec["getApiKeyAndHeaders"]>
67
67
  /** side-query 执行席:HTTP 路由(`routes/side-query.ts`)唯一的 brain 出口。 */
68
68
  export type SideQueryLane = (spec: SideQuerySpec) => Promise<SideQueryResult>;
69
69
  export interface SideQueryLaneCtx {
70
- /** 与 `RunnerDeps.brain` **同一只**实例(#341 换装后本席不再包它 —— key 走 spec 座位)。 */
70
+ /** 与 `RunnerDeps.brain` **同一只**实例([ref] 换装后本席不再包它 —— key 走 spec 座位)。 */
71
71
  brain: Brain;
72
72
  /** 活配置引用:目录/角色表/网关地址被 config-center 就地热应用(`mutateInPlace`),按调用取值才跟得上。 */
73
73
  config: ServiceConfig;
@@ -75,7 +75,7 @@ export interface SideQueryLaneCtx {
75
75
  getKeyResolver: () => KeyResolver;
76
76
  }
77
77
  /**
78
- * per-model auth 座(#341,core 5.46.0 `SideQuerySpec.getApiKeyAndHeaders` 的 server 侧填充物)。
78
+ * per-model auth 座([ref],core 5.46.0 `SideQuerySpec.getApiKeyAndHeaders` 的 server 侧填充物)。
79
79
  *
80
80
  * 语义(逐条对齐主推理链 `getApiKeyAndHeaders`,也逐条对齐它取代的 wrapper 那三条臂):
81
81
  * · `upstream`(spec 自带的座位)**解出凭据** ⇒ 原样透传,含 `headers`(上游/装饰器已经定了凭据,
@@ -86,8 +86,8 @@ export interface SideQueryLaneCtx {
86
86
  * · resolver 抛(sealed key 中毒)⇒ **上抛**,`runSideQuery` 的 `await` 直接把它扔给调用方,
87
87
  * 本次调用整体失败,一个字节都不发。
88
88
  *
89
- * 🔴 A-057.59 [PARTIAL high](2026-08-19 立;**2026-08-24 / core 5.57.0 源头清偿,本席腿撤线**)——
90
- * 「无 per-model key 的 off-route 模型仍收网关 key」这条具名残余的收严件曾挂在跨面件 #309,补偿是一条
89
+ * 🔴 [ref] [PARTIAL high](2026-08-19 立;**2026-08-24 / core 5.57.0 源头清偿,本席腿撤线**)——
90
+ * 「无 per-model key 的 off-route 模型仍收网关 key」这条具名残余的收严件曾挂在跨面件 [ref],补偿是一条
91
91
  * `P-DEBT` 计数。core 5.57.0 的 `adjudicateModelRoute` 在**三只一方 brain 的 request gate** 上把它改成
92
92
  * 响亮拒(`route.credential_mismatch` / `route.credential_missing`),三面同批、旋钮成文 ⇒ 那条计数的
93
93
  * 前提(「这一次调用真把网关凭据发给了别家」)不再成立,`isOffRouteBaseUrl` 与 `recordFailOpen` 一并
@@ -98,8 +98,8 @@ export declare function createPerModelAuthSeat(getKeyResolver: () => KeyResolver
98
98
  readonly upstream?: SideQuerySpec["getApiKeyAndHeaders"];
99
99
  }): PerModelAuthSeat;
100
100
  /**
101
- * per-model key 注入 brain wrapper —— **#341 后只服务 WebFetch 摘要面**
102
- * (`boot/webfetch-summarize-lane.ts`)。side-query 面已换到 core 的 spec 座位(见顶注「#341 换装」);
101
+ * per-model key 注入 brain wrapper —— **[ref] 后只服务 WebFetch 摘要面**
102
+ * (`boot/webfetch-summarize-lane.ts`)。side-query 面已换到 core 的 spec 座位(见顶注「[ref] 换装」);
103
103
  * core 的 `WebFetchSummarizerOptions` 至今只有 `maxContentChars`(亲验 5.46.0 `dist/tools/web.d.ts`),
104
104
  * 那一面**没有座位可换**,只能继续在 brain 层补凭据。
105
105
  *
@@ -116,7 +116,7 @@ export declare function createPerModelKeyBrain(brain: Brain, getKeyResolver: ()
116
116
  * 装配 side-query 执行席 = 真 `runSideQuery` + core 的 per-model auth 座,models/roles 与 Runner 同源。
117
117
  *
118
118
  * **按调用**取两件活值(`models` / `getKeyResolver`),因为它们是**同一次** center 下发里成对换代的
119
- * (#303 codex R1-F2:目录与密钥表零 await 窗成对换代):
119
+ * ([ref] codex R1-F2:目录与密钥表零 await 窗成对换代):
120
120
  * · `models` = `expandTiers(config.models, config.tiers)` —— 档位词 / CC 别名(`flash`/`opus`/…)在
121
121
  * side-query 上照常可选路(core 的 `Runner` 构造时做同一件事),且 `Runner` 那次展开是**构造时快照**,
122
122
  * 而本路由的模型白名单门(`routes/side-query.ts` 的 `isModelAllowlisted`)按请求现算同一张增广目录 ——
@@ -23,6 +23,7 @@ import { buildMemoryRemoteLaneWarn, memoryEngineBackendFor, memoryEngineRemoteLa
23
23
  import { assertToolResultProvenanceSchema } from "../plugins/tool-result-store-sql.js";
24
24
  import { assertPermissionRuleApprovalSchema, assertPermissionRuleTicketSchema } from "../plugins/permission-rule-store-sql.js";
25
25
  import { assertApprovalAskRuleMaterialSchema } from "../plugins/approval-ask-store-sql.js";
26
+ import { assertCheckpointBidiColumnSchema } from "../plugins/checkpoint-store-sql.js";
26
27
  import { assertFileHistorySchema } from "../plugins/file-history-store-sql.js";
27
28
  import { resolveStreamApprovalGate } from "../tool-approval.js";
28
29
  import { buildMemoryWriteBoundaryAudit, effectiveMemoryPersistenceCapable } from "./memory-boundary.js";
@@ -52,6 +53,10 @@ export async function openStores(ctx) {
52
53
  await assertToolResultProvenanceSchema(async (sql) => ({ rows: (await pgPool.query(sql)).rows }), "pg");
53
54
  else if (mysqlPool)
54
55
  await assertToolResultProvenanceSchema(async (sql) => ({ rows: (await mysqlPool.query(sql))[0] }), "tidb");
56
+ if (pgPool)
57
+ await assertCheckpointBidiColumnSchema(async (sql) => ({ rows: (await pgPool.query(sql)).rows }), "pg");
58
+ else if (mysqlPool)
59
+ await assertCheckpointBidiColumnSchema(async (sql) => ({ rows: (await mysqlPool.query(sql))[0] }), "tidb");
55
60
  if (config.permissionRulesEnabled) {
56
61
  if (pgPool)
57
62
  await assertPermissionRuleApprovalSchema(async (sql) => ({ rows: (await pgPool.query(sql)).rows }), "pg");
@@ -1,5 +1,5 @@
1
1
  /**
2
- * 会话级任务清单店车道(#318;黑板 [4659] F2 症状 → [4692] 定谳)。
2
+ * 会话级任务清单店车道([ref];黑板 [ref] F2 症状 → [ref] 定谳)。
3
3
  *
4
4
  * core 的 task-list 家族(TaskCreate/TaskGet/TaskUpdate/TaskList)把持久化做成了注入缝:
5
5
  * `assembleCodeTools({ taskList: true, taskListStore })` —— **不传** `taskListStore` 时 core 落
@@ -13,7 +13,7 @@
13
13
  *
14
14
  * ## 分区语义:listKey = 会话
15
15
  * 任务清单是**会话级待办**:同 session 跨 turn / 跨 resume 连续,不同 session 互不可见。
16
- * (design/147 §6 D2 的「团队共享清单」是同一张表的另一族分区键 —— 见 {@link taskListKeyFor}
16
+ * ([ref] §6 D2 的「团队共享清单」是同一张表的另一族分区键 —— 见 {@link taskListKeyFor}
17
17
  * 的 `session:` 命名空间位。)
18
18
  *
19
19
  * ## 后端三态(与 roster / mailbox / background-agent 同姿势)
@@ -25,7 +25,7 @@
25
25
  * 这与 local 形其余会话态设施(perSessionCwd / TtlSessionStore)是同一姿势。
26
26
  *
27
27
  * ## 为什么 SQL 形也进同一只缓存
28
- * SQL twin 是池上的无状态薄壳,每 turn 新铸一只在**行**的层面完全等价(真源在表里,`[4692]`
28
+ * SQL twin 是池上的无状态薄壳,每 turn 新铸一只在**行**的层面完全等价(真源在表里,`[ref]`
29
29
  * 的 T2 三条就钉这个)。仍然缓存实例的理由是 core 的另一半契约:`createTaskListTools` 对
30
30
  * **同一只 store 实例**维护一条 per-store promise 链来串行 read-modify-write。同副本内复用实例
31
31
  * ⇒ 本进程内的串行化真生效,跨副本仍由 SQL twin 自己的分区锁兜底;缓存被逐出也只是回到「靠