@sema-agent/server 3.6.1 → 3.7.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.
@@ -25,13 +25,12 @@ export declare class FleetUsageAccumulator {
25
25
  private cells;
26
26
  private runsSeen;
27
27
  /**
28
- * 🔴 RB-368 边界(core 2.3.0):`d.costMicroUsd` **可缺席 = 未知**(unpriced 部署,budget.ts 如实不带键)。
29
- * 这里只能折成「不计入已知和」(`?? 0`)——**不是**因为未知等于 0,而是因为 wire 上表达不了:
30
- * registry-core `UsageEntry.costMicroUsd` `z.number()` **必填**,batch 报文没有缺席位。
31
- * 后果如实记账:center 侧看到的是**低估**($ 轴少算),不是「未知」;配额轴(weightedTokens)不受影响,
32
- * 仍逐笔精确 —— 也就是说 lease/配额治理在 unpriced 部署下靠 token 轴仍然咬得住,$ 轴形同未启用。
33
- * 要真治:registry-core 把该键改 optional(或加 `costUnknownCalls`)+ center 聚合面同改,再回本处透传。
34
- * 在那之前,请**不要**把这个 `?? 0` 读成「已裁定未知=0」——裁定见 budget.ts 的 #59/RB-368 块。
28
+ * 🔴 RB-368(core 2.3.0;registry-core 0.11.0 收口,[2103]):`d.costMicroUsd` **可缺席 = 未知**
29
+ * (unpriced 部署,budget.ts 如实不带键)。wire 0.11.0 起有缺席位(UsageEntry.costMicroUsd
30
+ * optional)⇒ 本处**整键透传缺席**,不再折 0 低估。cell 级累加语义与 budget.ts ModelUsageTracker
31
+ * 同款=**传染**(同为单 producer 累加器:已知+未知=未知);center 聚合面的「下界 + costUnknown
32
+ * 标记」语义在 registry-core aggregateUsage(跨 worker 审计总账层,两层判据见 [2103])。
33
+ * 配额轴(weightedTokens)不受影响,仍逐笔精确。
35
34
  */
36
35
  record(principal: string | undefined, model: string, taskId: string, d: {
37
36
  inputTokens: number;
@@ -25,13 +25,12 @@ export class FleetUsageAccumulator {
25
25
  cells = new Map(); // key = principal <NUL> model
26
26
  runsSeen = new Set(); // taskId per window → runs count (first brain.call of a run in this window)
27
27
  /**
28
- * 🔴 RB-368 边界(core 2.3.0):`d.costMicroUsd` **可缺席 = 未知**(unpriced 部署,budget.ts 如实不带键)。
29
- * 这里只能折成「不计入已知和」(`?? 0`)——**不是**因为未知等于 0,而是因为 wire 上表达不了:
30
- * registry-core `UsageEntry.costMicroUsd` `z.number()` **必填**,batch 报文没有缺席位。
31
- * 后果如实记账:center 侧看到的是**低估**($ 轴少算),不是「未知」;配额轴(weightedTokens)不受影响,
32
- * 仍逐笔精确 —— 也就是说 lease/配额治理在 unpriced 部署下靠 token 轴仍然咬得住,$ 轴形同未启用。
33
- * 要真治:registry-core 把该键改 optional(或加 `costUnknownCalls`)+ center 聚合面同改,再回本处透传。
34
- * 在那之前,请**不要**把这个 `?? 0` 读成「已裁定未知=0」——裁定见 budget.ts 的 #59/RB-368 块。
28
+ * 🔴 RB-368(core 2.3.0;registry-core 0.11.0 收口,[2103]):`d.costMicroUsd` **可缺席 = 未知**
29
+ * (unpriced 部署,budget.ts 如实不带键)。wire 0.11.0 起有缺席位(UsageEntry.costMicroUsd
30
+ * optional)⇒ 本处**整键透传缺席**,不再折 0 低估。cell 级累加语义与 budget.ts ModelUsageTracker
31
+ * 同款=**传染**(同为单 producer 累加器:已知+未知=未知);center 聚合面的「下界 + costUnknown
32
+ * 标记」语义在 registry-core aggregateUsage(跨 worker 审计总账层,两层判据见 [2103])。
33
+ * 配额轴(weightedTokens)不受影响,仍逐笔精确。
35
34
  */
36
35
  record(principal, model, taskId, d) {
37
36
  const p = principal ?? "__anonymous__"; // single-user turnkey: no principal — still meter, under a stable bucket
@@ -45,7 +44,8 @@ export class FleetUsageAccumulator {
45
44
  if (cur) {
46
45
  cur.inputTokens += d.inputTokens;
47
46
  cur.outputTokens += d.outputTokens;
48
- cur.costMicroUsd += d.costMicroUsd ?? 0; // 缺席=未知 ⇒ 不计入已知和(wire 必填,见上方旁注)
47
+ // 缺席=未知 ⇒ 传染(见上方旁注);两边都已知才相加
48
+ cur.costMicroUsd = cur.costMicroUsd === undefined || d.costMicroUsd === undefined ? undefined : cur.costMicroUsd + d.costMicroUsd;
49
49
  cur.weightedTokens += d.weightedTokens ?? 0;
50
50
  if (d.quotaWeightAtUse !== undefined)
51
51
  cur.quotaWeightAtUse = d.quotaWeightAtUse; // 审计尾迹=最新倍率(窗口内基本恒定)
@@ -53,7 +53,7 @@ export class FleetUsageAccumulator {
53
53
  cur.runs += 1;
54
54
  }
55
55
  else {
56
- this.cells.set(key, { inputTokens: d.inputTokens, outputTokens: d.outputTokens, costMicroUsd: d.costMicroUsd ?? 0, weightedTokens: d.weightedTokens ?? 0, quotaWeightAtUse: d.quotaWeightAtUse ?? 1, runs: firstOfRun ? 1 : 0 });
56
+ this.cells.set(key, { inputTokens: d.inputTokens, outputTokens: d.outputTokens, costMicroUsd: d.costMicroUsd, weightedTokens: d.weightedTokens ?? 0, quotaWeightAtUse: d.quotaWeightAtUse ?? 1, runs: firstOfRun ? 1 : 0 });
57
57
  }
58
58
  }
59
59
  /** Drain the window into UsageReport entries and RESET. Empty window → []. */
@@ -61,7 +61,7 @@ export class FleetUsageAccumulator {
61
61
  const out = [];
62
62
  for (const [key, c] of this.cells) {
63
63
  const sep = key.indexOf("\u0000");
64
- out.push({ principal: key.slice(0, sep), model: key.slice(sep + 1), inputTokens: c.inputTokens, outputTokens: c.outputTokens, costMicroUsd: c.costMicroUsd, weightedTokens: c.weightedTokens, quotaWeightAtUse: c.quotaWeightAtUse, ...(c.runs > 0 ? { runs: c.runs } : {}) });
64
+ out.push({ principal: key.slice(0, sep), model: key.slice(sep + 1), inputTokens: c.inputTokens, outputTokens: c.outputTokens, ...(c.costMicroUsd !== undefined ? { costMicroUsd: c.costMicroUsd } : {}), weightedTokens: c.weightedTokens, quotaWeightAtUse: c.quotaWeightAtUse, ...(c.runs > 0 ? { runs: c.runs } : {}) });
65
65
  }
66
66
  this.cells.clear();
67
67
  this.runsSeen.clear();
@@ -80,7 +80,7 @@ export class FleetUsageAccumulator {
80
80
  if (cur) {
81
81
  cur.inputTokens += e.inputTokens;
82
82
  cur.outputTokens += e.outputTokens;
83
- cur.costMicroUsd += e.costMicroUsd;
83
+ cur.costMicroUsd = cur.costMicroUsd === undefined || e.costMicroUsd === undefined ? undefined : cur.costMicroUsd + e.costMicroUsd; // 回携未知同款传染
84
84
  cur.weightedTokens += w;
85
85
  if (qw !== undefined)
86
86
  cur.quotaWeightAtUse = qw;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sema-agent/server",
3
- "version": "3.6.1",
3
+ "version": "3.7.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",
@@ -54,7 +54,7 @@
54
54
  },
55
55
  "dependencies": {
56
56
  "@sema-agent/core": "^2.3.0",
57
- "@sema-agent/registry-core": "^0.10.24",
57
+ "@sema-agent/registry-core": "^0.11.0",
58
58
  "e2b": "^2.28.0",
59
59
  "libsodium-wrappers": "^0.8.4",
60
60
  "mysql2": "^3.22.4",