@sema-agent/server 7.30.0-rc.1 → 7.30.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.
@@ -277,11 +277,16 @@ export declare class SqlRetentionStore implements ManagedRetentionCapability {
277
277
  * 视界判据**两条臂都写出来**:`deadline` 在场按 deadline,缺席按 `created_at_ms`。少了后一条臂,一条
278
278
  * 没有审批 TTL 的 pending 行就永远过不了期(design/80 §3 inv#3 的 terminal_at_ms 要挡的正是这种永久泄漏)。
279
279
  *
280
- * 🔴 **不碰 pin**(core [4175] 语义,设计稿 §2 记两说):retention 三方法永不写 session pin,pin 的唯一
281
- * 写者是 reaper。契约 JSDoc 里那句「AND release the associated session pins」与 [4175] 的答复相反,已上板
282
- * 候定谳;durable 店的 pin/unpin 本就是 no-op,两说在行为面无差,故按 [4175] 施工并留本注。
283
- * 边界形( [4175] 建议):**live-pinned 且已过视界**的行(`task_active` 还占着这条会话) skip 计数、
284
- * 不动那行 —— 不在一条活会话脚下抽掉它的 resume 坐标,与 legal-hold skip 同形。
280
+ * 🔴 **pin 释放 = 本方法的 `pending → expired` 翻转本身**(core [4180] 定谳:retention.ts 契约那句
281
+ * AND release the associated session pins」是真意,[4175] 引错了对象——它引的是引擎 live-path reap
282
+ * JSDoc)。本仓 SQL 后端**没有独立的 pin 存储**:钉住 session 的正是 `checkpoint.status='pending'`
283
+ * 这一状态(它是 deleteExpiredSessions 活引用四腿之一,见下方 lineage 注 :79x),所以状态翻转 = 引用
284
+ * 解除 = pin 释放——不需要第二个写操作,而幂等(重跑对已 expired 行零命中)恰好满足 [4180]
285
+ * 「释放已释放 pin=no-op」要求。单写者不变式按 [4180] 改述:**每行的 pin 恰好释放一次,由终局该行
286
+ * 的车道执行**——live 行归 reaper,retention 行归本方法,两行集不交(下一段的 live-pin skip 正是
287
+ * 「不交」的执行判据)。
288
+ * 边界形([4175] 建议,[4180] 确认仍成立):**live-pinned 且已过视界**的行(`task_active` 还占着这条
289
+ * 会话)⇒ skip 计数、不动那行 —— 不在一条活会话脚下抽掉它的 resume 坐标,与 legal-hold 的 skip 同形。
285
290
  *
286
291
  * receipt 口径:`deleted` = **本次 CAS 赢下的行数**(过期销毁的是那道 pending 门,行本身按设计留在库里
287
292
  * 供审计/对账);`tombstones` = 0(没有行被移除,写墓碑会让「墓碑 ⇒ 这行没了」这条读法失真)。
@@ -373,11 +373,16 @@ export class SqlRetentionStore {
373
373
  * 视界判据**两条臂都写出来**:`deadline` 在场按 deadline,缺席按 `created_at_ms`。少了后一条臂,一条
374
374
  * 没有审批 TTL 的 pending 行就永远过不了期(design/80 §3 inv#3 的 terminal_at_ms 要挡的正是这种永久泄漏)。
375
375
  *
376
- * 🔴 **不碰 pin**(core [4175] 语义,设计稿 §2 记两说):retention 三方法永不写 session pin,pin 的唯一
377
- * 写者是 reaper。契约 JSDoc 里那句「AND release the associated session pins」与 [4175] 的答复相反,已上板
378
- * 候定谳;durable 店的 pin/unpin 本就是 no-op,两说在行为面无差,故按 [4175] 施工并留本注。
379
- * 边界形( [4175] 建议):**live-pinned 且已过视界**的行(`task_active` 还占着这条会话) skip 计数、
380
- * 不动那行 —— 不在一条活会话脚下抽掉它的 resume 坐标,与 legal-hold skip 同形。
376
+ * 🔴 **pin 释放 = 本方法的 `pending → expired` 翻转本身**(core [4180] 定谳:retention.ts 契约那句
377
+ * AND release the associated session pins」是真意,[4175] 引错了对象——它引的是引擎 live-path reap
378
+ * JSDoc)。本仓 SQL 后端**没有独立的 pin 存储**:钉住 session 的正是 `checkpoint.status='pending'`
379
+ * 这一状态(它是 deleteExpiredSessions 活引用四腿之一,见下方 lineage 注 :79x),所以状态翻转 = 引用
380
+ * 解除 = pin 释放——不需要第二个写操作,而幂等(重跑对已 expired 行零命中)恰好满足 [4180]
381
+ * 「释放已释放 pin=no-op」要求。单写者不变式按 [4180] 改述:**每行的 pin 恰好释放一次,由终局该行
382
+ * 的车道执行**——live 行归 reaper,retention 行归本方法,两行集不交(下一段的 live-pin skip 正是
383
+ * 「不交」的执行判据)。
384
+ * 边界形([4175] 建议,[4180] 确认仍成立):**live-pinned 且已过视界**的行(`task_active` 还占着这条
385
+ * 会话)⇒ skip 计数、不动那行 —— 不在一条活会话脚下抽掉它的 resume 坐标,与 legal-hold 的 skip 同形。
381
386
  *
382
387
  * receipt 口径:`deleted` = **本次 CAS 赢下的行数**(过期销毁的是那道 pending 门,行本身按设计留在库里
383
388
  * 供审计/对账);`tombstones` = 0(没有行被移除,写墓碑会让「墓碑 ⇒ 这行没了」这条读法失真)。
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sema-agent/server",
3
- "version": "7.30.0-rc.1",
3
+ "version": "7.30.0",
4
4
  "description": "Sema Server — the server/API implementation layer for Sema, wiring core, registry, model providers, and cloud agent execution. Built on @sema-agent/core.",
5
5
  "type": "module",
6
6
  "license": "BUSL-1.1",