@sema-agent/server 7.43.0 → 7.44.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 (345) hide show
  1. package/USAGE.md +18 -0
  2. package/dist/adoption/plan.js +31 -192
  3. package/dist/adoption/quiesce.js +3 -86
  4. package/dist/adoption/runner.js +3 -140
  5. package/dist/adoption/sql.js +0 -74
  6. package/dist/adoption/wire.js +0 -80
  7. package/dist/approval-ask-machine.js +0 -75
  8. package/dist/approval-card.js +0 -323
  9. package/dist/approval-deny-reasons.js +0 -42
  10. package/dist/approval-hmac.js +0 -35
  11. package/dist/approval-reconciler.js +8 -166
  12. package/dist/approval.js +4 -67
  13. package/dist/audit.js +1 -44
  14. package/dist/auth-bridge.js +4 -47
  15. package/dist/auth-keys.js +0 -23
  16. package/dist/bake-runner/main.js +4 -65
  17. package/dist/bake-runner/protocol.js +3 -58
  18. package/dist/bake-runner/runner.js +5 -91
  19. package/dist/bench/l8/artifact.js +2 -61
  20. package/dist/bench/l8/escape.js +0 -25
  21. package/dist/bench/l8/index.js +0 -14
  22. package/dist/bench/l8/probes.js +0 -60
  23. package/dist/bench/l8/run-probes.js +2 -45
  24. package/dist/bench/s1/arms.js +14 -189
  25. package/dist/bench/s1/live-deps.js +11 -253
  26. package/dist/bench/s1/oracle.js +1 -36
  27. package/dist/bench/s1/repair-oracle-adapter.js +0 -30
  28. package/dist/bench/s1/reviewer.js +0 -34
  29. package/dist/bench/s1/row.js +0 -62
  30. package/dist/bench/s1/run-firm.js +4 -70
  31. package/dist/bench/s1/runner-ctx.js +0 -40
  32. package/dist/bench/s1/tasks.js +0 -115
  33. package/dist/boot/adoption.js +0 -20
  34. package/dist/boot/budget-tracing.js +3 -55
  35. package/dist/boot/config-center.js +43 -551
  36. package/dist/boot/coordinators.js +1 -69
  37. package/dist/boot/crash-last.js +0 -18
  38. package/dist/boot/deferred-sandbox-path-env.js +3 -119
  39. package/dist/boot/execution-env.js +5 -171
  40. package/dist/boot/governance-seams.js +0 -92
  41. package/dist/boot/leader.js +0 -69
  42. package/dist/boot/limit-sync.js +0 -2
  43. package/dist/boot/memory-boundary.js +3 -91
  44. package/dist/boot/org-memory.js +1 -25
  45. package/dist/boot/parked-revive-gate.js +0 -150
  46. package/dist/boot/permission-rules-audit.js +1 -56
  47. package/dist/boot/reapers.js +15 -273
  48. package/dist/boot/resolve-spec.js +9 -768
  49. package/dist/boot/retention-lane.js +4 -87
  50. package/dist/boot/runner-deps.js +3 -297
  51. package/dist/boot/runtime-caps.js +0 -40
  52. package/dist/boot/session-faces.js +2 -133
  53. package/dist/boot/shutdown.js +9 -83
  54. package/dist/boot/side-query-lane.js +2 -137
  55. package/dist/boot/stores.js +15 -215
  56. package/dist/boot/task-list-lane.js +0 -18
  57. package/dist/boot/webfetch-summarize-lane.js +0 -47
  58. package/dist/boot/workflow-orchestration.js +3 -99
  59. package/dist/boot-reclaim.js +0 -20
  60. package/dist/bounded-session-map.js +0 -19
  61. package/dist/brain.js +2 -139
  62. package/dist/budget.js +9 -244
  63. package/dist/capabilities/builtin-tools.js +0 -3
  64. package/dist/capabilities/center-plugins.js +6 -51
  65. package/dist/capabilities/center-prompts.js +6 -71
  66. package/dist/capabilities/code-review-council.js +7 -40
  67. package/dist/capabilities/collab-workflows.js +1 -44
  68. package/dist/capabilities/hands-lane.js +0 -65
  69. package/dist/capabilities/memory-notice.js +0 -70
  70. package/dist/capabilities/prompt.js +0 -14
  71. package/dist/capabilities/prompts/code-review.js +0 -14
  72. package/dist/capabilities/prompts/identity.js +0 -6
  73. package/dist/capabilities/prompts/team.js +0 -4
  74. package/dist/capabilities/repo-tools.js +0 -34
  75. package/dist/capabilities/sandbox-file-send.js +3 -92
  76. package/dist/capabilities/scenarios.d.ts +0 -1
  77. package/dist/capabilities/scenarios.js +18 -279
  78. package/dist/capabilities/select-environment-tool.js +0 -32
  79. package/dist/capabilities/send-user-file-tool.js +2 -66
  80. package/dist/capabilities/skills.d.ts +1 -2
  81. package/dist/capabilities/skills.js +3 -21
  82. package/dist/capabilities/team.d.ts +3 -11
  83. package/dist/capabilities/team.js +3 -51
  84. package/dist/capabilities/tool-defer.js +0 -3
  85. package/dist/config-center/apply-effective.js +15 -330
  86. package/dist/config-center/apply-ledger.js +5 -38
  87. package/dist/config-center/facade.js +0 -41
  88. package/dist/config-center/hot-keys-registry.js +0 -20
  89. package/dist/config-center/http-client.js +2 -125
  90. package/dist/config-center/mcp-revocation.js +2 -34
  91. package/dist/config-center/read-face.js +0 -59
  92. package/dist/config-center/restart-signal.js +1 -85
  93. package/dist/config-center/skills-mcp.d.ts +1 -1
  94. package/dist/config-center/skills-mcp.js +9 -76
  95. package/dist/config-center/stage-limits.js +8 -35
  96. package/dist/config-invariants.js +0 -16
  97. package/dist/config-lkg.js +0 -42
  98. package/dist/config-provider.js +3 -186
  99. package/dist/config-types.js +0 -5
  100. package/dist/config.js +107 -1145
  101. package/dist/degenerate-instrument.js +3 -67
  102. package/dist/deployment-governance.js +0 -124
  103. package/dist/digest-form.js +0 -12
  104. package/dist/elicitation.js +3 -86
  105. package/dist/env-facts.js +7 -75
  106. package/dist/fleet/fleet-bus.js +34 -507
  107. package/dist/fleet/fleet-reconciler.js +9 -149
  108. package/dist/fleet/fleet-terminal-window.js +10 -178
  109. package/dist/fleet/subagent-tail-bus.js +3 -72
  110. package/dist/fleet-client.js +10 -70
  111. package/dist/fleet-lease.js +5 -79
  112. package/dist/git-api-kind.js +0 -3
  113. package/dist/governance-ask-marks.js +2 -78
  114. package/dist/hooks/branch-transcript.js +0 -74
  115. package/dist/hooks/cc-agent-hook-prompt.js +0 -29
  116. package/dist/hooks/cc-stop-prompt.js +1 -46
  117. package/dist/hooks/hook-llm.js +1 -53
  118. package/dist/hooks/hook-runner.js +20 -414
  119. package/dist/http/active-run-conflict.js +4 -129
  120. package/dist/http/cursor-fingerprint.d.ts +5 -0
  121. package/dist/http/cursor-fingerprint.js +5 -0
  122. package/dist/http/idempotency.js +0 -37
  123. package/dist/http/principal-gate.js +3 -40
  124. package/dist/http/route-ctx.js +0 -9
  125. package/dist/http/routes/a2a-serve.js +7 -319
  126. package/dist/http/routes/admin-config-refresh.js +0 -4
  127. package/dist/http/routes/admin-drain.js +0 -10
  128. package/dist/http/routes/adoption.js +1 -29
  129. package/dist/http/routes/agents-roster.js +1 -47
  130. package/dist/http/routes/approvals-assistant.js +32 -395
  131. package/dist/http/routes/attachments.js +4 -22
  132. package/dist/http/routes/capabilities.js +3 -420
  133. package/dist/http/routes/diagnostics.js +1 -81
  134. package/dist/http/routes/fleet.js +9 -185
  135. package/dist/http/routes/images.js +14 -239
  136. package/dist/http/routes/leader.js +0 -13
  137. package/dist/http/routes/memory-bundle.js +1 -61
  138. package/dist/http/routes/memory-policy.js +9 -99
  139. package/dist/http/routes/notify-wake.js +3 -37
  140. package/dist/http/routes/observability.js +2 -19
  141. package/dist/http/routes/retention-ops.js +2 -34
  142. package/dist/http/routes/rules.js +1 -93
  143. package/dist/http/routes/runs.js +64 -873
  144. package/dist/http/routes/session-sync.js +19 -258
  145. package/dist/http/routes/sessions-list.js +17 -43
  146. package/dist/http/routes/sessions.js +34 -226
  147. package/dist/http/routes/shared-memory.js +5 -36
  148. package/dist/http/routes/side-query.js +1 -87
  149. package/dist/http/routes/tasks.js +52 -722
  150. package/dist/http/routes/trace-usage.js +32 -195
  151. package/dist/http/routes/workflows.js +19 -195
  152. package/dist/http/run-meta.js +0 -6
  153. package/dist/http/send.js +0 -32
  154. package/dist/http/server.js +92 -1597
  155. package/dist/http/sse-lifecycle.js +2 -13
  156. package/dist/http/sse-log.js +3 -48
  157. package/dist/http/tar.js +5 -21
  158. package/dist/http/verify-rounds.js +0 -5
  159. package/dist/http/wire-gate.js +0 -9
  160. package/dist/http/workspace-content.js +0 -10
  161. package/dist/images/bake-validate.js +1 -70
  162. package/dist/images/manifest.js +1 -6
  163. package/dist/index.js +0 -21
  164. package/dist/key-resolver.js +2 -17
  165. package/dist/leader/diffout.js +1 -20
  166. package/dist/leader/diffup.js +0 -47
  167. package/dist/leader/endpoint.js +2 -57
  168. package/dist/leader/fanout.js +3 -45
  169. package/dist/leader/grader-env-factory.js +3 -72
  170. package/dist/leader/leader.js +5 -156
  171. package/dist/leader/merge.js +8 -115
  172. package/dist/leader/planner.js +3 -54
  173. package/dist/leader/repair-oracle.js +1 -60
  174. package/dist/leader/repair-wire.js +2 -79
  175. package/dist/leader/wire.js +8 -307
  176. package/dist/lsp/e2b-bridge.js +4 -64
  177. package/dist/lsp/e2b-manager.js +6 -94
  178. package/dist/lsp/lsp-frames.js +0 -12
  179. package/dist/lsp/manager.js +4 -96
  180. package/dist/lsp/ws-transport.js +5 -55
  181. package/dist/lsp-evict.js +1 -15
  182. package/dist/main.js +57 -765
  183. package/dist/memory-bundle-engine.js +0 -55
  184. package/dist/memory-export.js +0 -4
  185. package/dist/memory-posture.js +1 -15
  186. package/dist/memory-scope.js +11 -148
  187. package/dist/memory-sync-client.js +2 -44
  188. package/dist/memory-sync.js +1 -80
  189. package/dist/model-select.js +3 -80
  190. package/dist/observability/cost-quota.js +1 -17
  191. package/dist/observability/cost-taxonomy.js +0 -34
  192. package/dist/observability/fail-open.js +7 -86
  193. package/dist/observability/logger.js +0 -6
  194. package/dist/observability/metrics.js +0 -94
  195. package/dist/observability/otel-exporter.js +3 -13
  196. package/dist/observability/principal-context.js +0 -9
  197. package/dist/observability/prompt-manifest.js +1 -37
  198. package/dist/observability/rate-limit.js +0 -4
  199. package/dist/observability/secret-env-scrub.js +2 -56
  200. package/dist/observability/tool-trace.js +1 -70
  201. package/dist/orchestration/hardened-vm-runner.js +4 -118
  202. package/dist/orchestration/hardened-vm-worker-runner.js +1 -26
  203. package/dist/orchestration/hardened-vm-worker.js +0 -27
  204. package/dist/orchestration/subagent-steer.js +1 -45
  205. package/dist/orchestration/workflow-agent-steer.js +1 -80
  206. package/dist/orchestration/workflow-completion-inbox.js +32 -285
  207. package/dist/orchestration/workflow-notify-journal.js +16 -259
  208. package/dist/org-memory-admission.js +3 -47
  209. package/dist/parent-watch.js +2 -48
  210. package/dist/parked-decide.js +1 -109
  211. package/dist/per-task-image.js +0 -57
  212. package/dist/plan-cache-probe.js +3 -27
  213. package/dist/plugins/adoption-log-sql.js +2 -119
  214. package/dist/plugins/approval-ask-store-memory.js +3 -38
  215. package/dist/plugins/approval-ask-store-sql.js +6 -188
  216. package/dist/plugins/approval-exemption-store.js +2 -28
  217. package/dist/plugins/background-agent-store-sql.js +4 -105
  218. package/dist/plugins/background-shell-support.js +14 -122
  219. package/dist/plugins/blob-backend.js +6 -169
  220. package/dist/plugins/breaker-state-sql.js +8 -46
  221. package/dist/plugins/caching-session-store.js +4 -106
  222. package/dist/plugins/checkpoint-store-sql.js +18 -505
  223. package/dist/plugins/e2b-orphan-reclaim.js +0 -45
  224. package/dist/plugins/file-outcome-sink.js +0 -9
  225. package/dist/plugins/file-resume-anchor-store.js +4 -43
  226. package/dist/plugins/file-run-store.js +26 -364
  227. package/dist/plugins/file-snapshot-store-sql.js +10 -181
  228. package/dist/plugins/fork-routing-session-store.js +8 -111
  229. package/dist/plugins/host-platform.js +2 -91
  230. package/dist/plugins/image-bake-store-sql.js +7 -250
  231. package/dist/plugins/image-index-sql.js +4 -123
  232. package/dist/plugins/k8s-bg-scripts.js +4 -88
  233. package/dist/plugins/k8s-exec-protocol.js +0 -41
  234. package/dist/plugins/leader-run-store-sql.js +0 -101
  235. package/dist/plugins/local-checkpoint-store.js +8 -128
  236. package/dist/plugins/local-session-store.js +34 -296
  237. package/dist/plugins/local-task-attachment-store.js +2 -16
  238. package/dist/plugins/mailbox-store-sql.js +8 -65
  239. package/dist/plugins/memory-embedder-fingerprint.js +5 -166
  240. package/dist/plugins/memory-embedder.js +4 -70
  241. package/dist/plugins/memory-engine-pg.js +6 -170
  242. package/dist/plugins/memory-engine-tidb.js +7 -155
  243. package/dist/plugins/memory-engine-vector-util.js +0 -10
  244. package/dist/plugins/memory-key-guards.js +0 -34
  245. package/dist/plugins/memory-origin-law.js +0 -187
  246. package/dist/plugins/memory-resume-anchor-store.js +0 -17
  247. package/dist/plugins/memory-run-store.js +12 -89
  248. package/dist/plugins/memory-session-policy-store.js +0 -17
  249. package/dist/plugins/memory-sync-store-pg.js +4 -49
  250. package/dist/plugins/memory-sync-store-tidb.js +3 -35
  251. package/dist/plugins/outcome-ledger-sql.js +3 -97
  252. package/dist/plugins/permission-rule-store-file.js +5 -133
  253. package/dist/plugins/permission-rule-store-sql.d.ts +3 -0
  254. package/dist/plugins/permission-rule-store-sql.js +50 -307
  255. package/dist/plugins/pg-cost-quota.js +0 -7
  256. package/dist/plugins/pg-pool.js +0 -92
  257. package/dist/plugins/pg-rate-limiter.js +2 -13
  258. package/dist/plugins/pg-safe-json.js +4 -40
  259. package/dist/plugins/pg-session-storage.js +25 -189
  260. package/dist/plugins/posix-shell-fs.js +1 -31
  261. package/dist/plugins/remote-env-adb.js +12 -101
  262. package/dist/plugins/remote-env-e2b.js +40 -371
  263. package/dist/plugins/remote-env-file-error.js +0 -37
  264. package/dist/plugins/remote-env-host.js +63 -483
  265. package/dist/plugins/remote-env-k8s.js +32 -326
  266. package/dist/plugins/remote-env-local-docker.js +24 -157
  267. package/dist/plugins/remote-env-ssh.js +20 -128
  268. package/dist/plugins/remote-scratchpad.js +2 -32
  269. package/dist/plugins/remote-shell.js +1 -32
  270. package/dist/plugins/resume-anchor-store-sql.js +0 -11
  271. package/dist/plugins/retention-lane-store-sql.js +0 -108
  272. package/dist/plugins/retention-store-sql.js +4 -383
  273. package/dist/plugins/roster-store-sql.js +0 -55
  274. package/dist/plugins/run-store-sql.js +14 -251
  275. package/dist/plugins/s3-presign.js +2 -49
  276. package/dist/plugins/scheduler-support.js +3 -80
  277. package/dist/plugins/send-file-ledger.js +4 -53
  278. package/dist/plugins/send-user-file.js +4 -94
  279. package/dist/plugins/session-placement.js +1 -89
  280. package/dist/plugins/session-policy-store-sql.js +3 -81
  281. package/dist/plugins/session-store.js +0 -57
  282. package/dist/plugins/shared-memory-store-sql.js +4 -167
  283. package/dist/plugins/sql-driver.js +0 -17
  284. package/dist/plugins/sql-errors.js +0 -7
  285. package/dist/plugins/sql-escape.js +0 -8
  286. package/dist/plugins/sql-row-helpers.js +0 -25
  287. package/dist/plugins/store-backend.js +42 -222
  288. package/dist/plugins/store-contracts.js +2 -46
  289. package/dist/plugins/task-attachment-store.js +3 -49
  290. package/dist/plugins/task-list-store-sql.js +0 -79
  291. package/dist/plugins/tidb-cost-quota.js +1 -4
  292. package/dist/plugins/tidb-pool.js +1 -207
  293. package/dist/plugins/tidb-rate-limiter.js +3 -9
  294. package/dist/plugins/tidb-session-storage.js +4 -70
  295. package/dist/plugins/tidb-session-store.js +19 -341
  296. package/dist/plugins/tool-result-store-sql.js +4 -179
  297. package/dist/plugins/usage-window-store-sql.js +0 -8
  298. package/dist/plugins/web-search.js +10 -132
  299. package/dist/plugins/workflow-journal-store-sql.js +2 -58
  300. package/dist/plugins/workflow-run-store-sql.js +6 -91
  301. package/dist/plugins/worktree-isolation.js +6 -126
  302. package/dist/plugins/write-behind-counter.js +16 -75
  303. package/dist/principal-jwt.js +5 -60
  304. package/dist/project-memory.js +15 -146
  305. package/dist/prompts-domain-validate.js +1 -51
  306. package/dist/question.js +2 -111
  307. package/dist/resource-suspend.js +0 -18
  308. package/dist/router/route-orchestration.js +0 -77
  309. package/dist/rules-consent.d.ts +44 -5
  310. package/dist/rules-consent.js +75 -215
  311. package/dist/run-local.js +14 -381
  312. package/dist/runs.js +29 -617
  313. package/dist/runtime-caps-resolver.js +6 -132
  314. package/dist/runtime-governance.js +1 -232
  315. package/dist/sandbox-pkg-source.js +0 -37
  316. package/dist/sealed-key.js +3 -68
  317. package/dist/security.js +6 -291
  318. package/dist/session-leaf-bus.js +0 -32
  319. package/dist/session-sync-content.js +1 -69
  320. package/dist/session-sync-kernel.js +3 -60
  321. package/dist/session-sync.js +3 -66
  322. package/dist/session-titler.js +7 -41
  323. package/dist/session-watch.js +9 -73
  324. package/dist/shared-memory-scope-authorizer.js +0 -18
  325. package/dist/sighup-idle.js +1 -12
  326. package/dist/spec-fields.js +4 -143
  327. package/dist/store-live-probe.js +3 -49
  328. package/dist/task-a2a.js +1 -126
  329. package/dist/task-cwd.js +1 -103
  330. package/dist/task-mcp.js +1 -89
  331. package/dist/task-settings.js +10 -300
  332. package/dist/task-workflow.js +8 -75
  333. package/dist/tool-approval.d.ts +28 -1
  334. package/dist/tool-approval.js +70 -1430
  335. package/dist/trace/artifacts.js +5 -20
  336. package/dist/trace/engine-notice-wire.js +6 -138
  337. package/dist/trace/ledger-sink.js +7 -96
  338. package/dist/trace/project.js +4 -448
  339. package/dist/trace/redact.js +9 -77
  340. package/dist/turn-activity.js +1 -27
  341. package/dist/usage-analytics.js +4 -34
  342. package/dist/wall-clock-jump-guard.js +1 -68
  343. package/package.json +3 -3
  344. package/dist/capabilities/scenario-alias.d.ts +0 -27
  345. package/dist/capabilities/scenario-alias.js +0 -61
@@ -1,31 +1,10 @@
1
- import { recordFailOpen } from "../observability/fail-open.js"; // #157:上报臂的登记式兜底(F 类,census 第 28 行)
2
- /** 同 domain 连续失败多少次算「卡住了」(fail-loud 的阈值)。`5` 与 reaper 家族的
3
- * `REAPER_FAILURE_WARN_THRESHOLD` 同值同理由:一次抖动(一次重连、一次超时)正是容错要吸收的,
4
- * 只有**连败**才越过「可诊断」这条线。 */
1
+ import { recordFailOpen } from "../observability/fail-open.js";
5
2
  export const RETENTION_SWEEP_STUCK_THRESHOLD = 5;
6
- /** 租约 TTL = 本倍数 × sweep 间隔(设计稿 §3)。`2` = 允许一轮跑满一个完整间隔还有余量,再多就该让位。 */
7
3
  export const RETENTION_LEASE_TTL_FACTOR = 2;
8
- /** 一天的毫秒数(cutoff 换算;本地常量,避免为一个数字引一整只时间工具)。 */
9
4
  const DAY_MS = 86_400_000;
10
- /**
11
- * lane **自持的** boot 不变式(设计稿 §7,codex F3)—— 与 core 的 `assertRetentionCapability` 是两道门,
12
- * 各答各的问题:
13
- * · core 那道问的是「**锁着**的策略会不会盖在一只删不了的店上」——只在 locked 时说话;
14
- * · **本道**问的是「lane 开着的时候,它真的能删吗」——**不看 locked 状态**。
15
- *
16
- * 为什么后者必须存在:core 的门在 `locked=false` 时整条放行,于是
17
- * ① `RETENTION_SWEEP_INTERVAL_SEC>0` 而 policy 缺席 = 没有有效 cutoff 的 sweep(每 tick 什么都算不出来,
18
- * 读数一路 0,看起来像"没有候选");
19
- * ② unlocked policy × 一只 `"none"` 的店照样过检 —— 部署于是**广告了一个不执行的留存面**:能力位说
20
- * `{mode,maxAgeDays}`、审计表也在长,而那只店的行谁都没在删。
21
- * 两者都在**启动期**拒(安全控件不得半开),不是让运维从一台"启动成功、什么也没删"的机器上猜。
22
- *
23
- * @param locked 只进文案(让拒启信息能说清"你锁没锁都一样拒");**判据本身不读它** —— 这一格的存在
24
- * 就是为了让"不看 locked"这句话在签名上可见,而不是靠注释声明。
25
- */
26
5
  export function assertRetentionLaneWirable(input) {
27
6
  if (input.intervalSec <= 0)
28
- return; // lane 关 ⇒ 本门整条不判(缺省姿态,#210「缺席不在律内」)
7
+ return;
29
8
  const lockNote = input.locked === true ? " (the retentionPolicy key is LOCKED, but this gate refuses either way)" : "";
30
9
  if (input.policy === undefined) {
31
10
  throw new Error(`RETENTION_SWEEP_INTERVAL_SEC=${input.intervalSec} arms the managed-retention sweep lane, but RETENTION_MAX_AGE_DAYS is not ` +
@@ -38,11 +17,6 @@ export function assertRetentionLaneWirable(input) {
38
17
  `executor — the destructive store methods live on the SQL backends only (DB_BACKEND=mysql|pg); the local/file backend honestly ` +
39
18
  `declares retention:"none" and nothing would delete a row${lockNote}. Run a SQL backend, or set RETENTION_SWEEP_INTERVAL_SEC=0.`);
40
19
  }
41
- // 三方法俱全:声明位说 `managed` 不等于方法在场(一个第三方 store 可以只写声明)。逐个点名缺的那个,
42
- // 因为运维要能从这句话直接查到是哪一面没接上。
43
- // 逐个方法名走**闭集常量**而不是断言成 `Record<string, unknown>`:`executor[m]` 在 `m` 是键联合时
44
- // 类型上就是「那几个方法的联合」,`typeof … !== "function"` 直接判得了 —— 一处宽松断言都不需要,
45
- // 而且契约面加一个方法时这张表漏补是**编译红**(`satisfies` 那一行),不是运行期漏检。
46
20
  const executor = input.executor;
47
21
  const CONTRACT_METHODS = ["listRetentionDomains", "previewRetention", "expireCheckpoints", "deleteExpiredSessions", "deleteOrphanToolResults"];
48
22
  for (const m of CONTRACT_METHODS) {
@@ -52,8 +26,6 @@ export function assertRetentionLaneWirable(input) {
52
26
  `half-implemented retention face.`);
53
27
  }
54
28
  }
55
- // 每只被 lane 消费的店都必须诚实声明 managed。`store: undefined` 的行跳过(那一面这台压根没装,
56
- // 与 core 的同款判据逐字同姿势 —— 缺席的店不是"不删",它是"没有行")。
57
29
  const notManaged = input.stores.filter((s) => s.store !== undefined && s.store.retention !== "managed").map((s) => s.name);
58
30
  if (notManaged.length > 0) {
59
31
  throw new Error(`RETENTION_SWEEP_INTERVAL_SEC=${input.intervalSec} arms the managed-retention sweep lane, but these wired store(s) do NOT declare ` +
@@ -61,10 +33,6 @@ export function assertRetentionLaneWirable(input) {
61
33
  `while nothing deletes them. Wire a backend whose stores are managed, or set RETENTION_SWEEP_INTERVAL_SEC=0.`);
62
34
  }
63
35
  }
64
- /**
65
- * 跑**一轮** sweep(纯函数式的一拍:自己不排期、不建定时器)。导出是判据面的需要 ——
66
- * 一个只能靠真定时器推进的 lane 要么让判据睡真时间,要么让判据去证一个假时钟。
67
- */
68
36
  export async function runRetentionSweepOnce(ctx) {
69
37
  const claim = await ctx.lease.acquire();
70
38
  if (!claim.held)
@@ -77,8 +45,6 @@ export async function runRetentionSweepOnce(ctx) {
77
45
  let ranDomains = 0;
78
46
  let lostLease = false;
79
47
  for (const domain of domains) {
80
- // ── 丢租即停:复核在**每 domain 前**(文件头时序契约②)。中止后不写任何"我中止了"的审计行 ——
81
- // 那一行会带着一个已经不属于我们的 fencing token 落进不可变账。
82
48
  if (!(await ctx.lease.renew(fencingToken))) {
83
49
  lostLease = true;
84
50
  ctx.logger.warn("retention_sweep_lease_lost", {
@@ -90,16 +56,12 @@ export async function runRetentionSweepOnce(ctx) {
90
56
  break;
91
57
  }
92
58
  try {
93
- // hold 预检(§5 v1.3:**省调优化,不承重**)。它省掉的是「一个冻结的大租户每轮仍然跑三条跨表
94
- // 事务」;承重的判据在店事务内的哨兵行锁上,所以这里读到 false 而事务内读到 true 是**合法**的
95
- // (那时店自己零删全 skip)。
96
59
  if (ctx.holdInForce !== undefined && (await ctx.holdInForce(domain))) {
97
60
  await ctx.audit.append({ domain, action: "skipped_legal_hold", mode: ctx.mode, policyDays, fencingToken, deleted: 0, skipped: 0, tombstones: 0 });
98
61
  ranDomains++;
99
62
  streaks?.set(domain, 0);
100
63
  continue;
101
64
  }
102
- // ── 模式分家(§4)。两支**物理分开**:破坏性方法名只出现在 enforce 那一支里。
103
65
  if (ctx.mode === "audit-only") {
104
66
  await sweepDomainAuditOnly(ctx, { domain, cutoffMs, policyDays, fencingToken });
105
67
  }
@@ -116,11 +78,8 @@ export async function runRetentionSweepOnce(ctx) {
116
78
  }
117
79
  return { ranDomains, totalDomains: domains.length, lostLease, held: true, fencingToken };
118
80
  }
119
- /** audit-only 支(§4):**一条破坏性方法都不调**,只把候选计数记进一行 `audit_only`。 */
120
81
  async function sweepDomainAuditOnly(ctx, d) {
121
82
  const p = await ctx.executor.previewRetention({ domain: d.domain, cutoffMs: d.cutoffMs });
122
- // 三候选数进 receipt 的三列(设计稿 §6 逐字:「audit_only 行 = preview 三数」)。列名沿用
123
- // deleted/skipped/tombstones 而不是另开三列:同一张追加表两套列语义会让读它的 SQL 必须先分支 action。
124
83
  await ctx.audit.append({
125
84
  domain: d.domain,
126
85
  action: "audit_only",
@@ -132,13 +91,6 @@ async function sweepDomainAuditOnly(ctx, d) {
132
91
  tombstones: p.toolResults,
133
92
  });
134
93
  }
135
- /**
136
- * enforce 支(§3):三方法按**依赖序** —— 先让过期的 checkpoint 过门(它是会话树的一条活引用腿),
137
- * 再删会话树(它落的墓碑是孤儿结果的域归属证据),最后清孤儿结果。倒过来任何一步都会让下一步少删一批,
138
- * 靠"下一拍自然收敛"补 —— 那是把一个可以现在做对的顺序换成一个延迟。
139
- *
140
- * 🔴 破坏性审计行**不在这里写**(§6 F5:店在删除同事务内已写)。receipt 只做二次确认与日志。
141
- */
142
94
  async function sweepDomainEnforce(ctx, d) {
143
95
  const input = {
144
96
  domain: d.domain,
@@ -150,7 +102,7 @@ async function sweepDomainEnforce(ctx, d) {
150
102
  const toolResults = await ctx.executor.deleteOrphanToolResults(input);
151
103
  const touched = checkpoints.deleted + sessions.deleted + toolResults.deleted;
152
104
  if (touched > 0) {
153
- ctx.metrics.inc("retention_rows_swept_total", { domain: "" }, touched); // 域不进标签(高基数);域维在审计表上
105
+ ctx.metrics.inc("retention_rows_swept_total", { domain: "" }, touched);
154
106
  ctx.logger.info("retention_swept", {
155
107
  domain: d.domain,
156
108
  fencingToken: d.fencingToken,
@@ -162,16 +114,7 @@ async function sweepDomainEnforce(ctx, d) {
162
114
  });
163
115
  }
164
116
  }
165
- /**
166
- * 单 domain 失败的记账(§3:`failed` 行 + 继续下一 domain;连败 ≥ 阈值 ⇒ 指标 + 一次性 warn)。
167
- *
168
- * 🔴 整段**总不抛**:它是 catch 臂里的收尾,一个 poison error(`Symbol.toPrimitive` 抛)或一条抛异常的
169
- * 日志/审计写口若从这里逃出去,就会打断 for 循环、饿死后面每一个 domain —— 那正是 per-domain 隔离
170
- * 存在的理由的反面(reapers.ts 的 per-scope 循环踩过同一形,注释在彼)。
171
- */
172
117
  async function recordDomainFailure(ctx, d) {
173
- // poison error(抛异常的 `Symbol.toPrimitive`/`toString`)⇒ 落一句**自陈**的占位文案而不是空转:
174
- // 审计行里写着「原因取不出来」比写着 "unknown error" 诚实,读账的人据此知道该去看进程日志。
175
118
  let message;
176
119
  try {
177
120
  message = d.err instanceof Error ? d.err.message : String(d.err);
@@ -179,8 +122,6 @@ async function recordDomainFailure(ctx, d) {
179
122
  catch {
180
123
  message = "<error object whose toString() itself threw — see the process log for the raw rejection>";
181
124
  }
182
- /** 审计行落地了吗 —— 进下面那条 warn 的 meta。**不是装饰**:审计写不进去时,`retention_audit` 里
183
- * 会缺这一条 `failed` 行,而运维只有从日志里读到这一位才知道"账本自己也断了"。 */
184
125
  let auditRowWritten = true;
185
126
  try {
186
127
  await ctx.audit.append({
@@ -196,8 +137,6 @@ async function recordDomainFailure(ctx, d) {
196
137
  });
197
138
  }
198
139
  catch {
199
- // 审计写口自己坏了(库不可达 —— 通常就是上一步失败的同一个原因)。下面那条 warn 仍要发出去,
200
- // 并且**带上这一位**:否则「审计表里没有这条 failed 行」看起来会像"这一轮根本没跑到这个域"。
201
140
  auditRowWritten = false;
202
141
  }
203
142
  const streaks = ctx.streaks;
@@ -207,8 +146,6 @@ async function recordDomainFailure(ctx, d) {
207
146
  ctx.logger.warn("retention_sweep_domain_failed", { domain: d.domain, fencingToken: d.fencingToken, consecutiveFailures: streak, auditRowWritten, err: message });
208
147
  if (streak >= RETENTION_SWEEP_STUCK_THRESHOLD) {
209
148
  ctx.metrics.inc("retention_sweep_stuck", {}, 1);
210
- // 一次性:阈值一到就打一条、并把计数归零,于是**仍然坏着**的域每再连败一个完整阈值才报一次
211
- // (不是首次之后永远静音,也不是每轮刷屏)——与 `createThrottledReaperCatch` 逐字同形。
212
149
  ctx.logger.warn("retention_sweep_stuck", {
213
150
  domain: d.domain,
214
151
  consecutiveFailures: streak,
@@ -219,29 +156,13 @@ async function recordDomainFailure(ctx, d) {
219
156
  }
220
157
  }
221
158
  catch {
222
- // 上报**自己**抛了(poison error 的 toString / 一条抛异常的 logger transport)。这里绝不能让它逃出去:
223
- // 逃出去会打断 per-domain 循环、饿死后面每一个域 —— 而 per-domain 隔离正是这条腿存在的理由
224
- // (reapers.ts 的 per-scope 循环踩过同一形)。走登记过的 F 类兜底口,于是这条臂有计数、有探针行、
225
- // 有一次性 warn,而不是一次无痕的沉默(#157 / FAIL-OPEN-CENSUS 第 28 行)。
226
159
  recordFailOpen("server.retention.sweep-report-dropped", `domain=${d.domain}`);
227
160
  }
228
161
  }
229
- /**
230
- * 起 lane,返回控制器(`undefined` = lane 关着,**根本没建**定时器)。
231
- *
232
- * 三条与 reaper 家族同款的纪律:
233
- * · `unref()` 紧跟 `setInterval` —— 定时器绝不可持住进程;
234
- * · **重入守卫**:一轮的时长随域数与库延迟增长,越过 interval 就会叠罗汉压同一批行(邻居五腿同形)。
235
- * ⚠️ 守卫的代价是「一轮里只有轮首那一次续租机会」——所以每 domain 前那条 `renew` 是承重的,不是装饰;
236
- * · 一轮内部的任何异常都在轮内被吞掉并记账(`runRetentionSweepOnce` 的 per-domain catch),这里再兜一层
237
- * 是为了「租约抢占本身失败」这种**轮外**故障 —— 它不该变成一条 unhandled rejection 把进程带走。
238
- */
239
162
  export function startRetentionLane(ctx) {
240
163
  if (ctx.intervalSec <= 0)
241
164
  return undefined;
242
- const streaks = ctx.streaks ?? new Map(); // 跨轮存活:必须建在 setInterval **之外**
243
- /** 在飞那一轮(`undefined` = 空闲)。它同时是重入守卫与 `stop()` 的等待对象 —— 一个变量两用刻意为之:
244
- * 两个变量必然在某次改动后不同步,而不同步的方向是「stop 以为没人在跑」。 */
165
+ const streaks = ctx.streaks ?? new Map();
245
166
  let inFlight;
246
167
  let stopped = false;
247
168
  const runOnce = () => {
@@ -254,8 +175,6 @@ export function startRetentionLane(ctx) {
254
175
  ctx.logger.warn("retention_sweep_round_failed", { err: err instanceof Error ? err.message : String(err) });
255
176
  }
256
177
  catch {
257
- // 同 `recordDomainFailure` 的上报臂:一条抛异常的 logger transport 不许把这条 `.catch` 变成
258
- // 一个 floating rejection(Node 默认处理下会带走整个进程)。
259
178
  recordFailOpen("server.retention.sweep-report-dropped", "round");
260
179
  }
261
180
  })
@@ -270,8 +189,6 @@ export function startRetentionLane(ctx) {
270
189
  stop: async () => {
271
190
  stopped = true;
272
191
  clearInterval(timer);
273
- // 等在飞那一轮落地。`inFlight` 自己已经把所有异常吞掉了(上面的 catch),所以这里不会抛;
274
- // 再挂一条 catch 是因为收尾链绝不该被一条清理腿打断 —— 哪怕是被将来某次改动引入的新抛点。
275
192
  await inFlight?.catch(() => undefined);
276
193
  },
277
194
  };