@sema-agent/client-core 0.72.14 → 0.73.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.
- package/CHANGELOG.md +23 -0
- package/README.md +1 -1
- package/dist/engineAgentPanelStore.js +10 -2
- package/dist/fleet/fleetLedger.d.ts +0 -4
- package/dist/fleet/fleetLedger.js +12 -4
- package/dist/fleet/fleetProjection.d.ts +20 -8
- package/dist/fleet/fleetProjection.js +20 -8
- package/dist/fleetAgentPanelProjection.js +26 -11
- package/dist/workflowClient.js +23 -6
- package/dist/workflowMonitor.d.ts +2 -1
- package/docs/INTEGRATION-CLIENTS.md +51 -2
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -49,6 +49,29 @@
|
|
|
49
49
|
> 挡住 ⇒ 本批把它机械化——④a0 对 `pending` 行**要求段头已是日期形**(`(未发布)` 直接红),阶段一
|
|
50
50
|
> commit 漏转在发布前就红,不再靠人记。
|
|
51
51
|
|
|
52
|
+
## 0.73.0(2026-09-18)
|
|
53
|
+
|
|
54
|
+
> 主题:**fleet 视图的数值键不再把「不知道」编成 0**(CC-52;审计 #62 A-18,「缺席被折成正向值」同族的数值形)。**minor,型面 BREAKING**:`FleetTaskView` 的 `elapsedMs` / `tokens` / `queuedCount` 与 `FleetWorkflowView` 的 `doneCount` / `totalCount` / `elapsedMs` / `tokens` / `failedCount`、以及 `WorkflowRunState.totalTokens` 由必填改**可选** —— 消费方 `tsc` 会红一次(`number | undefined`),那正是通知。公面导出名零增减(1019);零 wire 新键;peer 不动。接入面 §62。
|
|
55
|
+
|
|
56
|
+
### Changed(BREAKING)
|
|
57
|
+
|
|
58
|
+
- **八个数值键:有键 ⇒ 真值(含真 0);缺键 ⇒ 不知道**。此前 `projectTasks` / `projectWorkflows` 对 wire 缺席一律 `?? 0`,于是屏上的「0s」「0 tokens」「0/0 agents done」里有一部分是本包替引擎编的。现在 wire 缺席 ⇒ 视图键缺席;坏形(负数 / NaN / Infinity / 非数;计数位另加非整数)同样缺席,不折 0 也不原样过境。sdk 的行型上这些键本来就是可选,本版只是不再在投影层把可选抹掉。
|
|
59
|
+
- **逐键缺席语义**(端按语义分渲,不是一律「—」):
|
|
60
|
+
- `FleetTaskView.elapsedMs` 缺席 = **这一行没有时长基数**:既没有 launch 锚 `startedAt`、也没有引擎快照 `elapsedMs`(很老的引擎 / 极早期首帧)。渲「—」。有 `startedAt`(且不晚于本端时钟)的行台账自算 `now - startedAt`;`startedAt` 晚于本端时钟的行退到引擎快照 + 空窗,连快照也没有就缺席。
|
|
61
|
+
- `FleetTaskView.tokens` 缺席 = **引擎还没为这一行报过用量**(排队中 / 刚起 / 该车道不报)。渲「—」或不渲这一段;**不是** 0 tokens。
|
|
62
|
+
- `FleetTaskView.queuedCount` 缺席 = **引擎没报这一位**(本包不保证任何引擎版本上报它;sdk 行型上它是可选整数)。缺席 ⇒ 不渲排队徽标、不渲 `0 queued`;有键即真值。
|
|
63
|
+
- `FleetWorkflowView.doneCount` / `totalCount` / `failedCount` / `tokens` / `elapsedMs` 缺席 = **本拍没报**:现役引擎的 workflow 行铸点五键恒发,缺席只出现在更老的引擎或乱序的部分增量上。渲「—」;🔴 **不互相推导**(`failedCount` 缺席不读作 0;`totalCount` 缺席不拿 `doneCount` 顶;`startedCount` 缺席时 `doneCount + failedCount` 这个下界只在两键都在场时成立)。
|
|
64
|
+
- **台账的帧间时钟补偿只给有基数的行推进**(`fleetLedger` 两处):基数 = 引擎快照 `elapsedMs`,且**先验再算**(非负有限数;负基数加上空窗会被洗成一个看着合法的正数)。基数缺席时此前 `(elapsedMs ?? 0) + 本端空窗` 把「本端收到这一行多久了」渲成「它跑了多久」—— 那是本端的钟,不是这一行的时长 ⇒ 现在保持缺席。有 `startedAt` 的行(现役引擎恒带)走 `now - startedAt`,不受影响。
|
|
65
|
+
|
|
66
|
+
- **同轴两条读面一并改**(发车前异源复审查漏抓出;它们不经过上面两只投影函数):
|
|
67
|
+
- **agent 面板投影** `projectFleetAgentRows`:行上没有 `tokens` 时此前发布 `fleet-row{ totalTokens: 0 }`,已知用量之后来一帧缺席又发布 0 把它清零。现在缺席 / 坏形 ⇒ `totalTokens` 键不落;已知值在**同一周期内**粘住不被缺席帧覆盖(行已 settle 后同 id 复活、或 launch 锚换了 = 新周期,不继承上一周期的数);终态帧只有用量变了也会在 `end` 之前先发一条带最终用量的 `fleet-row`(消费端通常不再更新非 running 行);同周期内每一条 `fleet-row` 都带上本周期已知的 `startedAt`(不只是它变化的那一帧),未订阅期间的事件缓冲据此把 launch 锚变化当作合并屏障(跨周期不逐键合并,回放与在线投递同果);🔴 `fleet-row` 是部分帧(省略的键 = 沿用行上旧值),`startedAt` 变了时清掉行上旧用量是消费端的义务;引擎真报的 0 逐字发布。(事件型上该键本来就是可选,类型面零变化。)
|
|
68
|
+
- **workflow monitor** `projectWorkflowRun`:`WorkflowRunState.totalTokens` 由必填改**可选**(BREAKING)。有键 ⇒ 一个**完整**的总数。引擎聚合 `stats.tokens` 合法 ⇒ 用它(有 nested 载体时其 `tokens` 也得合法才相加);聚合残缺(own 缺席而 nested 在场、或 nested 载体在场但读不出数)⇒ 键缺席,不按 0 补齐;两者都没有时只在**每条腿都报过合法用量**时才求和;有腿未报 / 非法数(负 / NaN / 小数)/ 零条腿 ⇒ 键缺席。此前未报的腿按 0 加进去,monitor 显示一个确定的「0」或偏小的总数。
|
|
69
|
+
|
|
70
|
+
### 取舍
|
|
71
|
+
|
|
72
|
+
- 这是一次**故意的编译期打断**:additive 的做法(另加一组 `*Known` 布尔)会让老代码继续把编出来的 0 渲上屏,而这一类病的全部问题就是「没人知道那个 0 是编的」。三端在预告期内均未要求延后。
|
|
73
|
+
- 🔴 **不改消费代码只换包不是安全的**:类型检查会红,但绕过类型(纯 JS 调用 / 只转译不查型的构建)时,运行期的后果不止是屏上出现 `undefined` / `NaN` 字样 —— **凡是拿这些键做算术或阈值比较的地方会静默改变行为**。典型形:规模告警一类的判定里 `totalCount` / `tokens` 缺席 ⇒ 比较恒 false、预测量为 NaN ⇒ **告警不再触发**(此前编出来的 0 反而会让它触发)。迁移要求见 §62y:未知的规模不能被当作规模正常。
|
|
74
|
+
|
|
52
75
|
## 0.72.14(2026-09-18)
|
|
53
76
|
|
|
54
77
|
> 主题:**悬挂的流内 ask 的拉半场**(CC-55;cli L-397 P1)。流内 ask 在铸造那一刻若没有活着的宿主流可投,引擎把它转成悬挂(窗约一小时,不补发),此后只在 `GET /v1/approvals` 回体的 `livePending` 段可发现 —— 后台 workflow 的子代恒落这一形(宿主 turn 先结束),用户面零帧零卡、代理静默卡到窗尽。**patch**:型面纯 additive(+1 常量 +7 函数,公面 1011 → 1019;`ApprovalsFeedSnapshot` / `ApprovalsFeedStats` / `ApprovalsFeedOptions` / `ToolApprovalFrameLaneOpts` / `ApprovalCardRequest` / `ToolApprovalFrameOutcome` 各加一可选或新增位;零 wire 新键;peer 不动)。接入面 §61。
|
package/README.md
CHANGED
|
@@ -35,7 +35,7 @@ Renamed from **`@sema-agent/wire-cc-adapter`** (0.1.x, deprecated — see *Migra
|
|
|
35
35
|
|
|
36
36
|
## Scope
|
|
37
37
|
|
|
38
|
-
**Version:** 0.
|
|
38
|
+
**Version:** 0.73.0
|
|
39
39
|
|
|
40
40
|
- **Today** — the adapter seam, the whole `adapt()` pipeline (all 14 A-layer arms plus the
|
|
41
41
|
B/D/E tool-card layers), the notification/caps/model families, the adapter kernel (stream driver
|
|
@@ -52,6 +52,12 @@ export function isEnginePanelTaskResident(taskId) {
|
|
|
52
52
|
const MAX_BUFFER = 200;
|
|
53
53
|
let listener = null;
|
|
54
54
|
const buffer = [];
|
|
55
|
+
/** 两条 fleet-row 都带 launch 锚且不相等 ⇒ 新周期(任一条没带锚 = 这一帧没说,不算变化)。 */
|
|
56
|
+
function launchAnchorChanged(prev, next) {
|
|
57
|
+
if (prev.kind !== 'fleet-row' || next.kind !== 'fleet-row')
|
|
58
|
+
return false;
|
|
59
|
+
return prev.startedAt !== undefined && next.startedAt !== undefined && prev.startedAt !== next.startedAt;
|
|
60
|
+
}
|
|
55
61
|
export function publishEngineAgentPanelEvent(ev) {
|
|
56
62
|
// 同 taskId 的任何主通道事实(tick / fleet-row = 行在场;end = 真终态)都让**缓冲里**那条缺席过期 —— 迟订阅的消费者
|
|
57
63
|
// 不许先恢复了行、再被一条旧缺席标成 unknown(已递达订阅者的缺席由订阅者按契约在这些事件上撤标)。
|
|
@@ -123,9 +129,11 @@ export function publishEngineAgentPanelEvent(ev) {
|
|
|
123
129
|
}
|
|
124
130
|
if (b.taskId !== taskId)
|
|
125
131
|
continue; // another task's progress — irrelevant to this row
|
|
126
|
-
|
|
132
|
+
// 0.73.0:launch 锚变了 = 同一个 taskId 的**新周期**,也是一道屏障。逐键合并的「省略的键沿用旧值」只在同一周期内
|
|
133
|
+
// 成立;跨周期合并会把上一周期的 totalTokens / toolUses 继承进新周期(投影层刻意省略的键被缓冲层补了回来)。
|
|
134
|
+
if (b.kind === kind && !launchAnchorChanged(b, ev))
|
|
127
135
|
i = at;
|
|
128
|
-
break; // same lane ⇒ merge target; other lane ⇒ barrier
|
|
136
|
+
break; // same lane & same cycle ⇒ merge target; other lane / new cycle ⇒ barrier
|
|
129
137
|
}
|
|
130
138
|
if (i >= 0) {
|
|
131
139
|
// 🔴 Coalescing must not DROP sticky keys either (0.41.0 adversarial review #4). Both progress
|
|
@@ -385,10 +385,6 @@ export interface FleetLedger {
|
|
|
385
385
|
/** 测试直取:当前 task 行原样(顺序 = 插入序)。 */
|
|
386
386
|
__rowsForTest(): FleetTaskRow[];
|
|
387
387
|
}
|
|
388
|
-
/**
|
|
389
|
-
* 建一个 fleet 帧台账。**不开流、不构造 client** —— 宿主的 consume 循环把解码后的帧喂进来。
|
|
390
|
-
* (这条切缝就是设计稿 §2.5 给 fleetClient 划的那一刀:帧体归库、连接归端。)
|
|
391
|
-
*/
|
|
392
388
|
export declare function createFleetLedger(hooks?: FleetLedgerHooks, opts?: CreateFleetLedgerOptions): FleetLedger;
|
|
393
389
|
/**
|
|
394
390
|
* `bg_notification` 帧的通知体 wire 形(SDK `FleetFrame` 联合的具名臂投影)。
|
|
@@ -109,6 +109,10 @@ export function fleetSnapshotOptions(opts) {
|
|
|
109
109
|
* 建一个 fleet 帧台账。**不开流、不构造 client** —— 宿主的 consume 循环把解码后的帧喂进来。
|
|
110
110
|
* (这条切缝就是设计稿 §2.5 给 fleetClient 划的那一刀:帧体归库、连接归端。)
|
|
111
111
|
*/
|
|
112
|
+
/** 补偿链的基数判据:非负有限数才算(先验再算 —— 负基数加上空窗会被洗成一个看着合法的正数;异源对抗复审)。 */
|
|
113
|
+
function isElapsedBase(v) {
|
|
114
|
+
return typeof v === 'number' && Number.isFinite(v) && v >= 0;
|
|
115
|
+
}
|
|
112
116
|
export function createFleetLedger(hooks = {}, opts = {}) {
|
|
113
117
|
const sessionKey = opts.sessionKey ?? DEFAULT_SESSION_KEY;
|
|
114
118
|
const nowFn = opts.nowFn ?? Date.now;
|
|
@@ -289,7 +293,7 @@ export function createFleetLedger(hooks = {}, opts = {}) {
|
|
|
289
293
|
rowMeta.set(row.id, { receivedAtMs });
|
|
290
294
|
debug(`[fleet-row] id=${row.id} parent=${row.parentId ?? '-'} agentType=${row.agentType ?? '-'}` +
|
|
291
295
|
` agentName=${row.agentName ?? '-'} name=${row.name ?? '-'} status=${row.status ?? '-'}` +
|
|
292
|
-
` tokens=${row.tokens ??
|
|
296
|
+
` tokens=${row.tokens ?? '-'} parentToolCallId=${row.parentToolCallId ?? '-'}`);
|
|
293
297
|
// [1491] subagentOutput 寻址:子代行出生帧带 parentId(spawn run)——记映射供查看态终报读面。
|
|
294
298
|
// 归属判别与通知臂同锚(R1/F1,2026-07-22):
|
|
295
299
|
// · parent ∈ own-run 台账 → own:登映射 + 把本行 taskId 也登进台账(F1 闭包 —— 嵌套孙代的
|
|
@@ -586,8 +590,8 @@ export function createFleetLedger(hooks = {}, opts = {}) {
|
|
|
586
590
|
const meta = rowMeta.get(id);
|
|
587
591
|
const frozenElapsed = typeof started === 'number' && started > 0 && started <= nowMs
|
|
588
592
|
? nowMs - started
|
|
589
|
-
: meta !== undefined
|
|
590
|
-
?
|
|
593
|
+
: meta !== undefined && isElapsedBase(known.elapsedMs)
|
|
594
|
+
? known.elapsedMs + Math.max(0, nowMs - meta.receivedAtMs) // 0.73.0:无基数不铸(同 project() 的补偿链)
|
|
591
595
|
: known.elapsedMs;
|
|
592
596
|
taskMap.delete(id);
|
|
593
597
|
rowMeta.delete(id);
|
|
@@ -707,7 +711,11 @@ export function createFleetLedger(hooks = {}, opts = {}) {
|
|
|
707
711
|
if (!meta)
|
|
708
712
|
return r;
|
|
709
713
|
const idle = Math.max(0, nowMs - meta.receivedAtMs);
|
|
710
|
-
|
|
714
|
+
// 0.73.0:补偿链只给**真有基数**的行推进(基数 = 引擎快照 elapsedMs)。基数缺席时 `?? 0` 会把「本端收到这一行多久了」
|
|
715
|
+
// 渲成「它跑了多久」—— 那是本端的钟,不是这一行的时长 ⇒ 保持缺席。
|
|
716
|
+
if (!isElapsedBase(r.elapsedMs))
|
|
717
|
+
return r;
|
|
718
|
+
return idle > 0 ? { ...r, elapsedMs: r.elapsedMs + idle } : r;
|
|
711
719
|
});
|
|
712
720
|
// ② 终态留存池:live 集没有的行在宽限窗内继续投影;被查看中的行不过期。
|
|
713
721
|
const retainedRows = [];
|
|
@@ -46,10 +46,17 @@ export interface FleetTaskView {
|
|
|
46
46
|
depth: number;
|
|
47
47
|
parentId?: string;
|
|
48
48
|
status: FleetTaskStatus;
|
|
49
|
-
|
|
50
|
-
|
|
49
|
+
/**
|
|
50
|
+
* 🔴 0.73.0(BREAKING):三个数值键由必填改**可选** —— 有键 ⇒ 真值(含真 0);缺键 ⇒ 「不知道」。此前 `?? 0` 把 wire
|
|
51
|
+
* 缺席编成 0(「0 秒」「0 tokens」「0 个排队」都是本包替引擎编的话)。坏形(负数 / NaN / 非数)同样缺席。
|
|
52
|
+
* · `elapsedMs` 缺席 = 这一行既没有 launch 锚也没有引擎快照(极早期的首帧 / 很老的引擎);渲「—」,不渲 0s。
|
|
53
|
+
* · `tokens` 缺席 = 引擎还没为这一行报过用量(排队中 / 刚起 / 该车道不报);渲「—」,不渲 0。
|
|
54
|
+
* · `queuedCount` 缺席 = 引擎没报这一位(本包不保证任何引擎版本上报它);不渲排队徽标,不渲「0 queued」。
|
|
55
|
+
*/
|
|
56
|
+
elapsedMs?: number;
|
|
57
|
+
tokens?: number;
|
|
51
58
|
tokenDir: 'down' | 'up';
|
|
52
|
-
queuedCount
|
|
59
|
+
queuedCount?: number;
|
|
53
60
|
/** REF-CC-050(fleet2-12):投影器无条件赋值(`?? false`),门 `ALWAYS_EMITTED_TASK_VIEW_KEYS`
|
|
54
61
|
* 已把它钉成「恒发」——类型必填而不是留一条测不到的缺席分支。 */
|
|
55
62
|
awaitingPlanApproval: boolean;
|
|
@@ -121,11 +128,16 @@ export interface FleetWorkflowView {
|
|
|
121
128
|
name: string;
|
|
122
129
|
description: string;
|
|
123
130
|
status: FleetTaskStatus;
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
131
|
+
/**
|
|
132
|
+
* 🔴 0.73.0(BREAKING):五个数值键由必填改**可选**(读法同 {@link FleetTaskView.elapsedMs})。现役引擎的 workflow 行
|
|
133
|
+
* 铸点五键**恒发**,缺席只出现在更老的引擎 / 乱序的部分增量上 —— 那时渲「—」,**不互相推导**
|
|
134
|
+
* (`failedCount` 缺席不读作 0;`totalCount` 缺席不拿 `doneCount` 顶)。
|
|
135
|
+
*/
|
|
136
|
+
doneCount?: number;
|
|
137
|
+
totalCount?: number;
|
|
138
|
+
elapsedMs?: number;
|
|
139
|
+
tokens?: number;
|
|
140
|
+
failedCount?: number;
|
|
129
141
|
/** 🔴 缺席 ≠ 0:0 = 引擎说「一个都没起」,undefined = 老引擎「不知道」(退 done+failed 下界)。 */
|
|
130
142
|
startedCount?: number;
|
|
131
143
|
}
|
|
@@ -327,11 +327,11 @@ export function projectTasks(allRows, opts) {
|
|
|
327
327
|
depth: depthOf(r),
|
|
328
328
|
...(parentId !== undefined ? { parentId } : {}),
|
|
329
329
|
status: coerceTaskStatus(r.status),
|
|
330
|
-
elapsedMs
|
|
331
|
-
tokens
|
|
330
|
+
...wireNumberKey('elapsedMs', wireDuration(r.elapsedMs)),
|
|
331
|
+
...wireNumberKey('tokens', wireCount(r.tokens)),
|
|
332
332
|
// 🔴 wire 从无 tokenDir(#50 门禁盘出的真类型错:读点恒 undefined 曾靠 ?? 掩住)——恒壳侧缺省。
|
|
333
333
|
tokenDir: 'down',
|
|
334
|
-
queuedCount
|
|
334
|
+
...wireNumberKey('queuedCount', wireCount(r.queuedCount)),
|
|
335
335
|
awaitingPlanApproval: r.awaitingPlanApproval ?? false,
|
|
336
336
|
descendantCount: childCount.get(r.id) ?? 0,
|
|
337
337
|
// 198 isViewed:这一行就是被查看的那个 agent(行 id 尾段 = 引擎 taskId)。
|
|
@@ -357,6 +357,18 @@ export function projectTasks(allRows, opts) {
|
|
|
357
357
|
return task;
|
|
358
358
|
});
|
|
359
359
|
}
|
|
360
|
+
/** 计数位的窄读:非负**整数**才算数(0 是真 0);其余(缺席 / 负数 / 小数 / NaN / Infinity / 非数)⇒ `undefined`。 */
|
|
361
|
+
function wireCount(v) {
|
|
362
|
+
return typeof v === 'number' && Number.isInteger(v) && v >= 0 ? v : undefined;
|
|
363
|
+
}
|
|
364
|
+
/** 时长位的窄读:非负有限数才算数;其余 ⇒ `undefined`。 */
|
|
365
|
+
function wireDuration(v) {
|
|
366
|
+
return typeof v === 'number' && Number.isFinite(v) && v >= 0 ? v : undefined;
|
|
367
|
+
}
|
|
368
|
+
/** 有值才落键(缺席 ⇒ 空对象 ⇒ 视图上键缺席,不铸 0)。 */
|
|
369
|
+
function wireNumberKey(key, v) {
|
|
370
|
+
return (v !== undefined ? { [key]: v } : {});
|
|
371
|
+
}
|
|
360
372
|
/** wire workflow 行 → 渲染行。 */
|
|
361
373
|
export function projectWorkflows(rows) {
|
|
362
374
|
return rows.map(r => {
|
|
@@ -367,11 +379,11 @@ export function projectWorkflows(rows) {
|
|
|
367
379
|
name: collapseLabel(r.name ?? '') || 'Dynamic workflow',
|
|
368
380
|
description: projectDescription(r.description),
|
|
369
381
|
status: coerceWorkflowStatus(r.status),
|
|
370
|
-
doneCount
|
|
371
|
-
totalCount
|
|
372
|
-
elapsedMs
|
|
373
|
-
tokens
|
|
374
|
-
failedCount
|
|
382
|
+
...wireNumberKey('doneCount', wireCount(r.doneCount)),
|
|
383
|
+
...wireNumberKey('totalCount', wireCount(r.totalCount)),
|
|
384
|
+
...wireNumberKey('elapsedMs', wireDuration(r.elapsedMs)),
|
|
385
|
+
...wireNumberKey('tokens', wireCount(r.tokens)),
|
|
386
|
+
...wireNumberKey('failedCount', wireCount(r.failedCount)),
|
|
375
387
|
...(startedCount !== undefined ? { startedCount } : {}),
|
|
376
388
|
};
|
|
377
389
|
});
|
|
@@ -134,7 +134,10 @@ export function projectFleetAgentRowsFor(sessionKey, rows, nowMs = Date.now()) {
|
|
|
134
134
|
continue;
|
|
135
135
|
present.add(taskId);
|
|
136
136
|
const status = row.status ?? 'running';
|
|
137
|
-
|
|
137
|
+
// 0.73.0:三态 —— 帧上真给了非负整数才算数;缺席 / 坏形 ⇒ 沿用已知值(粘性),从没报过就是 undefined。
|
|
138
|
+
// 此前 `?? 0`:首帧发布 `totalTokens:0`(面板渲「0 tokens」),已知之后来一帧缺席又发布 0 把用量清零。
|
|
139
|
+
const wireTokens = typeof row.tokens === 'number' && Number.isInteger(row.tokens) && row.tokens >= 0 ? row.tokens : undefined;
|
|
140
|
+
const tokens = wireTokens; // 粘性在下面(拿到 prev 与周期锚之后)补
|
|
138
141
|
// 🔴 三态直取:`row.toolUses` 缺席就是 undefined,这里**不许**兜 0(见 FleetAgentRowLike 注)。
|
|
139
142
|
const toolUses = typeof row.toolUses === 'number' ? row.toolUses : undefined;
|
|
140
143
|
const transcriptId = row.transcriptId || undefined;
|
|
@@ -142,12 +145,24 @@ export function projectFleetAgentRowsFor(sessionKey, rows, nowMs = Date.now()) {
|
|
|
142
145
|
const currentTool = currentToolKeyOf(row.currentTool) !== undefined ? row.currentTool : undefined;
|
|
143
146
|
const currentToolKey = currentToolKeyOf(row.currentTool);
|
|
144
147
|
const prev = seenMap.get(taskId);
|
|
148
|
+
// 🔴 粘性只在**同一周期**内成立:上一条已 settle(同 id 复活 = 新周期)或 launch 锚换了 ⇒ 不继承上一周期的用量
|
|
149
|
+
// (否则新周期首帧没报 tokens 时会把上一周期的数当成当前读数发布;异源对抗复审)。
|
|
150
|
+
const sameCycle = prev !== undefined &&
|
|
151
|
+
!prev.settled &&
|
|
152
|
+
(startedAt === undefined || prev.startedAt === undefined || prev.startedAt === startedAt);
|
|
153
|
+
const knownTokens = tokens !== undefined ? tokens : sameCycle ? prev?.tokens : undefined;
|
|
154
|
+
// 本周期已知的 launch 锚:帧上给了用帧上的,没给则同周期沿用。🔴 它随**每一条** fleet-row 发布(不只是变化那一帧)——
|
|
155
|
+
// 事件缓冲靠它判「这两条部分帧是不是同一周期」;缺锚的部分帧会让跨周期合并绕过屏障(异源对抗复审 [high])。
|
|
156
|
+
const knownStartedAt = startedAt !== undefined ? startedAt : sameCycle ? prev?.startedAt : undefined;
|
|
145
157
|
if (TERMINAL_FLEET_TASK_STATUSES.has(status)) {
|
|
146
158
|
// ② 终态一次性 settle(幂等台账;消费端 settle 也幂等)。
|
|
147
159
|
if (!prev?.settled) {
|
|
148
160
|
// 终态行也把最后一拍的累计工具数/转录锚带上:详情页在行翻终态后仍要显示真计数与
|
|
149
161
|
// 委派 prompt,而终态帧常常是这一行**唯一**带全 usage 的一帧(bg lane 只在活动边界发行帧)。
|
|
150
|
-
if (
|
|
162
|
+
if (
|
|
163
|
+
// 最终用量也算(终态帧常是唯一带全 usage 的一帧;消费端不更新非 running 行 ⇒ 必须赶在 end 之前发)
|
|
164
|
+
(tokens !== undefined && prev?.tokens !== tokens) ||
|
|
165
|
+
(toolUses !== undefined && prev?.toolUses !== toolUses) ||
|
|
151
166
|
(transcriptId !== undefined && prev?.transcriptId !== transcriptId) ||
|
|
152
167
|
(startedAt !== undefined && prev?.startedAt !== startedAt)) {
|
|
153
168
|
publishEngineAgentPanelEvent({
|
|
@@ -155,10 +170,10 @@ export function projectFleetAgentRowsFor(sessionKey, rows, nowMs = Date.now()) {
|
|
|
155
170
|
taskId,
|
|
156
171
|
...(row.name ? { name: row.name } : {}),
|
|
157
172
|
...(row.description ? { description: row.description } : {}),
|
|
158
|
-
totalTokens:
|
|
173
|
+
...(knownTokens !== undefined ? { totalTokens: knownTokens } : {}),
|
|
159
174
|
...(toolUses !== undefined ? { toolUses } : {}),
|
|
160
175
|
...(transcriptId !== undefined ? { transcriptId } : {}),
|
|
161
|
-
...(
|
|
176
|
+
...(knownStartedAt !== undefined ? { startedAt: knownStartedAt } : {}),
|
|
162
177
|
});
|
|
163
178
|
}
|
|
164
179
|
publishEngineAgentPanelEvent({
|
|
@@ -172,10 +187,10 @@ export function projectFleetAgentRowsFor(sessionKey, rows, nowMs = Date.now()) {
|
|
|
172
187
|
}
|
|
173
188
|
seenMap.set(taskId, {
|
|
174
189
|
status,
|
|
175
|
-
tokens,
|
|
190
|
+
tokens: knownTokens,
|
|
176
191
|
toolUses: toolUses !== undefined ? toolUses : prev?.toolUses,
|
|
177
192
|
transcriptId: transcriptId !== undefined ? transcriptId : prev?.transcriptId,
|
|
178
|
-
startedAt:
|
|
193
|
+
startedAt: knownStartedAt,
|
|
179
194
|
currentToolKey: currentToolKey !== undefined ? currentToolKey : prev?.currentToolKey,
|
|
180
195
|
lastSeenAt: nowMs,
|
|
181
196
|
settled: true,
|
|
@@ -193,7 +208,7 @@ export function projectFleetAgentRowsFor(sessionKey, rows, nowMs = Date.now()) {
|
|
|
193
208
|
prev.settled ||
|
|
194
209
|
prev.absentReportedAtMs !== undefined || // 行回来了:即使值未变也发一条,消费端据此撤掉 absent 标
|
|
195
210
|
prev.status !== status ||
|
|
196
|
-
prev.tokens !==
|
|
211
|
+
prev.tokens !== knownTokens ||
|
|
197
212
|
(toolUses !== undefined && prev.toolUses !== toolUses) ||
|
|
198
213
|
(transcriptId !== undefined && prev.transcriptId !== transcriptId) ||
|
|
199
214
|
(startedAt !== undefined && prev.startedAt !== startedAt) ||
|
|
@@ -203,21 +218,21 @@ export function projectFleetAgentRowsFor(sessionKey, rows, nowMs = Date.now()) {
|
|
|
203
218
|
taskId,
|
|
204
219
|
...(row.name ? { name: row.name } : {}),
|
|
205
220
|
...(row.description ? { description: row.description } : {}),
|
|
206
|
-
totalTokens:
|
|
221
|
+
...(knownTokens !== undefined ? { totalTokens: knownTokens } : {}),
|
|
207
222
|
// 🔴 缺席即不落键(消费端据「键在不在」判三态)。
|
|
208
223
|
...(toolUses !== undefined ? { toolUses } : {}),
|
|
209
224
|
...(transcriptId !== undefined ? { transcriptId } : {}),
|
|
210
|
-
...(
|
|
225
|
+
...(knownStartedAt !== undefined ? { startedAt: knownStartedAt } : {}),
|
|
211
226
|
...(currentTool !== undefined ? { currentTool } : {}),
|
|
212
227
|
});
|
|
213
228
|
}
|
|
214
229
|
// 台账对这几位是**粘性**的:缺席帧不擦掉已知值(同上的单向语义)。
|
|
215
230
|
seenMap.set(taskId, {
|
|
216
231
|
status,
|
|
217
|
-
tokens,
|
|
232
|
+
tokens: knownTokens,
|
|
218
233
|
toolUses: toolUses !== undefined ? toolUses : prev?.toolUses,
|
|
219
234
|
transcriptId: transcriptId !== undefined ? transcriptId : prev?.transcriptId,
|
|
220
|
-
startedAt:
|
|
235
|
+
startedAt: knownStartedAt,
|
|
221
236
|
currentToolKey: currentToolKey !== undefined ? currentToolKey : prev?.currentToolKey,
|
|
222
237
|
lastSeenAt: nowMs,
|
|
223
238
|
settled: false,
|
package/dist/workflowClient.js
CHANGED
|
@@ -385,11 +385,28 @@ export function projectWorkflowRun(run) {
|
|
|
385
385
|
const parks = readWorkflowParks(run);
|
|
386
386
|
const agents = (run.agents ?? []).map((r, i) => projectAgent(r, i));
|
|
387
387
|
const phases = projectPhases(run, agents);
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
388
|
+
// 0.73.0:总用量三态 —— 有键 ⇒ 一个**完整**的总数(含真 0);缺键 ⇒ 没有完整总数。判据(每个分量都先验非负整数):
|
|
389
|
+
// ① 引擎聚合 `stats.tokens` 在场且合法:无 nested 载体 ⇒ 就是它;nested 载体在场 ⇒ 其 tokens 也得合法才相加,否则缺席
|
|
390
|
+
// (残缺的聚合不按 0 补齐 —— 那会发布一个偏小的「总数」);
|
|
391
|
+
// ② `stats.tokens` 缺席但 nested 载体在场 ⇒ 聚合残缺 ⇒ 缺席(不退到腿上求和:腿只覆盖本 run,会把嵌套的那部分漏掉);
|
|
392
|
+
// ③ 两者都没有 ⇒ 退到腿上求和,但只在**每条腿都报过合法用量**且至少一条腿时成立;有腿未报 / 非法 / 零条腿 ⇒ 缺席。
|
|
393
|
+
const validTokens = (v) => typeof v === 'number' && Number.isInteger(v) && v >= 0 ? v : undefined;
|
|
394
|
+
const ownTokens = validTokens(run.stats?.tokens);
|
|
395
|
+
const nestedCarrier = run.stats?.nested;
|
|
396
|
+
const hasNestedCarrier = nestedCarrier !== undefined && nestedCarrier !== null;
|
|
397
|
+
const nestedTokens = hasNestedCarrier ? validTokens(nestedCarrier.tokens) : undefined;
|
|
398
|
+
const legTokens = agents.map(a => validTokens(a.tokens));
|
|
399
|
+
const totalTokens = ownTokens !== undefined
|
|
400
|
+
? !hasNestedCarrier
|
|
401
|
+
? ownTokens
|
|
402
|
+
: nestedTokens !== undefined
|
|
403
|
+
? ownTokens + nestedTokens
|
|
404
|
+
: undefined
|
|
405
|
+
: hasNestedCarrier
|
|
406
|
+
? undefined
|
|
407
|
+
: legTokens.length > 0 && legTokens.every(t => t !== undefined)
|
|
408
|
+
? legTokens.reduce((s, t) => s + t, 0)
|
|
409
|
+
: undefined;
|
|
393
410
|
const state = {
|
|
394
411
|
workflowRunId: run.id,
|
|
395
412
|
// 0.72.12 CC-51(异源对抗复审 R2 [medium]):run 状态词认不出 / 缺席时先看腿上的**活跃证据** —— 有腿在跑 / 排队 ⇒ running
|
|
@@ -404,7 +421,7 @@ export function projectWorkflowRun(run) {
|
|
|
404
421
|
// a script we do not have. scriptPath is likewise absent until the service projects it.
|
|
405
422
|
script: '',
|
|
406
423
|
agentCount: agents.length,
|
|
407
|
-
totalTokens,
|
|
424
|
+
...(totalTokens !== undefined ? { totalTokens } : {}),
|
|
408
425
|
phases,
|
|
409
426
|
};
|
|
410
427
|
if (run.name)
|
|
@@ -90,7 +90,8 @@ export interface WorkflowRunState {
|
|
|
90
90
|
status: 'running' | 'done' | 'failed' | 'stopped' | 'paused' | 'parked' | 'unknown';
|
|
91
91
|
cloud?: boolean;
|
|
92
92
|
agentCount: number;
|
|
93
|
-
|
|
93
|
+
/** 🔴 0.73.0(BREAKING):可选。有键 ⇒ 总用量(含真 0);缺键 ⇒ 没有权威总数且有腿未报(或零条腿)—— 渲「—」,不渲 0。 */
|
|
94
|
+
totalTokens?: number;
|
|
94
95
|
/** phases as authored; the component derives the active/clamped windows itself. */
|
|
95
96
|
phases: WorkflowPhase[];
|
|
96
97
|
/**
|
|
@@ -19,11 +19,11 @@
|
|
|
19
19
|
|
|
20
20
|
| 项 | 值 | 真源 |
|
|
21
21
|
|---|---|---|
|
|
22
|
-
| 本包 | `@sema-agent/client-core` **0.
|
|
22
|
+
| 本包 | `@sema-agent/client-core` **0.73.0**(本批发布版 = **minor,型面 BREAKING**:fleet 视图八个数值键改可选 —— CC-52 `FleetTaskView.elapsedMs` / `tokens` / `queuedCount` 与 `FleetWorkflowView.doneCount` / `totalCount` / `failedCount` / `tokens` / `elapsedMs` 不再 `?? 0`(有键 = 真值含真 0,缺键 = 不知道;逐键缺席语义见 §62b)+ 台账补偿链无基数不铸;公面导出名零增减 1019、零 wire 变化、peer 不动;§62。上一版 0.72.14 = **patch**:悬挂的流内 ask 拉半场 —— CC-55 `startApprovalsFeed` 快照加 `livePending` 段并进变化摘要(键缺席 = 未报,不铸空)+ 视图 / 去重账 / 与流内帧腿同链的决断口(入参不可见上卡明说、改写不转发)+ 宿主闸对账节拍 + 待决计数读口(不知道 = null);型面纯 additive、公面 1019、peer 不动;§61。上一版 0.72.13 = **patch**:server 7.86.0 提货 —— CC-46 plan_review `permissionModeAfter` 发口(三选卡双闸:宿主声明只读起步 ∧ 引擎 ≥7.86.0;400 field_conflict 两种处置)+ CC-54 `capabilities.executionLane` 四态读面(键缺席 ≠ 不是本机车道;`toolsRunHere` 判据归包)+ CC-53 detach 版本闸三态;型面 additive(另撤回 0.72.12 的主通道 `absent` 臂,改独立缺席订阅口)、公面 1011、peer 不动;§60;**预告 0.73.0 BREAKING**:fleet 视图数值键改可选。上一版 0.72.12 = **patch**:「缺席被折成正向终态」按类清剿 —— CC-50 M1 头条(fleet 行缺席改发 `absent` 不再铸 `end{isError:false}`)+ 六站一次改齐(缺席 ⇒ `unknown`)+ 结果边界 fail-closed 取舍 + `_sema_outcome` + `Outcome unknown:` 行 + CC-51 M6(default 臂不再谎报 running)+ 普查门 + DS-06;型面 additive、公面 993、peer 不动;行为面三处真变化见 CHANGELOG 取舍段;§59。上一版 0.72.11 = **patch**:core 7.23.0 提货 —— CC-49 通告码 66 → 67 `config.write_protection_unresolved`(operator;兄弟码 `target_view_absent` = 没有视图,这枚 = 有视图解析不出)+ `permission_denials` 自动升级腿通电(`gates[].toolCallId` ⇒ `tool_use_id`;CC-34 引擎半场);型面零变化、公面 989、peer 不动、devDep core ~7.23.0;§58。上一版 0.72.10 = **patch**:CC-41 leader run 终局 `needs_human` + `result.conflict` 三形读面(none 缺席不可分 / unreadable 在场读不懂 / conflict;`salvaged[]` 原样给落盘口;措辞单源不提重试);型面纯 additive、公面 989、peer 不动;§57。上一版 0.72.9 = **patch**:server 7.85.0 提货 —— CC-30 会话内 MCP re-dial 消费口(`reconnectMcpServer` 三态 / unsupported 恒五键 / 交易文案单源)+ CC-39② memory-status `autoConsolidationArmed` 三态 + CC-45 resume 补充句渲保留秒数;型面纯 additive、公面 985、peer 不动;§56。上一版 0.72.8 = **patch**:清账三票 —— `memory:"off"` 请求键(CC-39③,server 7.84.0 S-405)+ `runStream` 第二条中性臂 `Model output error:`(CC-43)+ 注入件撞活 run 自动 steer 零卡(CC-44);型面纯 additive、公面 977、peer 不动;§55。上一版 0.72.7 = **patch**:core 7.22.0 提货 —— 通告码 66 `mcp.server_redialed` + 读器 `readMcpServerRedialed` + `wiring_manifest.readDeny` 第九段 `_sema_readDeny`(缺席 = 没有内置行判这条腿);型面纯 additive、公面 971、peer 不动、devDep core ~7.22.0;§54。上一版 0.72.6 = **patch**:cli L-379 包侧半场 —— `steerFollowIntent` steer 后续听意图三态(tail / after-decision / after-wake)+ `activeRunSelfHealRow` 续听声明第五参;型面纯 additive、公面 969、peer 不动;§53。上一版 0.72.5 = **patch**:server 7.82.1 提货 —— `capabilities.webSearch.backend` 部署默认 WebSearch 后端四态读面(键缺席 = 老引擎判不了 ≠ `none`);型面纯 additive、公面 968、peer 不动;§52。上一版 0.72.4 = **patch**:core 7.21.x 三件经 server 7.82.0 提货 —— `wiring_manifest.autoConsolidation` 第八段 `_sema_autoConsolidation`(缺席 = indeterminate 不折 false);型面纯 additive、公面 962、peer 不动;§51。上一版 0.72.3 = **patch**:core #863 记忆单系统半场 ① —— `projectAgentsForWire` 投影 `agents[].memory`(user|project|local 三词同映射引擎平面 agent:<type>);型面纯 additive、公面 962、零 wire 新键、peer 不动;§50。上一版 0.72.2 = **patch**:workflow 视图两票 —— `LiveWorkflowController.resolution()` 六态(snapshot() 的 null 三义拆开)+ `noteOwnWorkflowRun` own 台账同拍登记;型面纯 additive、公面 961、零 wire 键、peer 不动;§49。上一版 0.72.1 = **patch**:server 7.80.1 提货 —— 409 `conflict.resume_context_unavailable` 结构读数(`staleAfterSec` / `runId`;sdk 9.6.0 尚未带键,经 sdk 今天恒缺席)+ `SkillSpec.baseDir`(只在本机车道带);型面纯 additive、公面 960、peer 不动;§48。上一版 0.72.0 = **minor**:型面 BREAKING —— 39 个零消费导出退出公面(CC-32 退役批,[7419] §45 预告 / cli [7422] 同意 / web-client·desktop 过节拍沉默 = 同意;名单见 §47a S-1);运行期零 BREAKING、公面 956、peer 不动、devDep core ~7.20.1;随批:已退役名账 `removed` + export-liveness 门 G 段 + 冻结账门 ⑧c;§47。上一版 0.71.4 = **patch**:core 7.20.1 提货 —— `ENGINE_NOTICE_CODES` 65 + `wiring_manifest.writeProtection` 第七段 `_sema_writeProtection`;型面纯 additive、公面 995、peer 不动、devDep core `~7.20.1`;§46。上一版 0.71.3 = **patch**:门体系清账批 —— CC-24 export-liveness 门 + 39 个导出退役预告(0.72.0 删,表态制)/ CC-26 `as unknown as` 铸链棘轮 / CC-25 冻结账门 ⑧ 段 / CC-06 B-081 包侧半场(终帧 `_sema_effective_reasoning` / `_sema_effective_memory_scopes` + resume reopen 族 + `routePairingVerdict`);型面纯 additive、公面 986 → 995、peer 不动;§45。上一版 0.71.2 = **patch**:接入方验收两票归包 —— CC-28 B-132 decide 拒体三句去内部车道词 / CC-29 B-133 committedUuids 唯一性(重复 ⇒ 形 f);零型面变化、公面 986、peer 不动;§44。上一版 0.71.1 = **patch**:接入档打回修正 —— CC-27 `ApprovalCardRequest.readRootCandidate?` 帧→卡透传位 + 新导出型 `ReadRootCandidateView`;型面纯 additive、公面 986 不变、peer 不动;§43。上一版 0.71.0 = **minor**:型面 BREAKING 六件 —— peer sdk 地板 >=9.6.0 + agent-types >=0.3.0 / `SkillsListingTruncatedFactsView` 删 `requestedBudgetBytes?`·`laneClamped?` / `WiringManifestMcpEntry` → `WiringManifestMcpEntryView` / `MAX_AGENT_SKILLS` 删 / `decide.workflow_host_not_parked` 退役;运行期零 BREAKING。内容:core 7.20.0 提货(闭集 +5 六十四码)/ 🔴 CC-16 `text_segment_end.committedUuids[]` / CC-08 全五件(tool_disclosure / tool_progress 两 chrome 臂、wiring_manifest tools·hooks·lsp 进切片、tool_roster_delta 接上、context_usage 进切片、`readRootCandidate` 镜像)/ CC-19 `mcpEngineLegPresence` 归包 / CC-20 not_parked clean-cut;公面 986;§42 / 42y 八条)|
|
|
23
23
|
| peer:wire 契约 | `@sema-agent/sdk` **>=9.6.0**(value-level,非 type-only;**0.71.0 抬版**:`tool_disclosure` / `tool_progress` 两帧型与 `ToolApprovalFrame.readRootCandidate` 自 9.6.0 起;0.69.0 曾抬到 >=9.4.0(`reasoning_end` / `lastLegMcp`),0.60.0 抬到 >=8.4.0;地板由 `scripts/run-sdk-floor-test.mjs` 的 `FLOOR` 与 public-surface 门 C-CC-3「不低于见证到的最低实装版」双钉)| `package.json` `peerDependencies` |
|
|
24
24
|
| peer:会话词汇表 | `@sema-agent/agent-types` **>=0.3.0**(type-only,零运行时;0.71.0 抬版:devDep 与 peer 同步,type-superset 门 ④ 撞名预警对着 0.3.0 的 .d.ts 求值) | 同上 |
|
|
25
25
|
| runtime dep | `diff` ^9.0.0(**唯一**一条;portability 门按**等值**钉死) | `package.json` `dependencies` |
|
|
26
|
-
| 公开导出面 | **1019** 个运行期符号(+ 47 个测试钩;= 0.72.14 的值:相对 0.72.13 +8 —— CC-55 八件,名单见 §2b 域 3;1011 = 0.72.13 的值:相对 0.72.12 +18 —— CC-46 八件 / CC-54 六件 / CC-53 两件 / CC-50 缺席口两件,名单见 §2b 域 3 / 4 / 9 / 10;993 = 0.72.12 的值(测试钩 45):相对 0.72.11 +4 —— CC-50 `OUTCOME_UNKNOWN_ROW_PREFIX` / `isOutcomeUnknownRowText` / `TASK_NOTIFICATION_TERMINAL_STATUSES` / `isTaskNotificationTerminalStatus`;989 = 0.72.10 的值:相对 0.72.9 +4 —— CC-41 `LEADER_RUN_STATUSES` / `LEADER_REJ_HEAD_DISPLAY_MAX` / `projectLeaderConflict` / `leaderConflictDetail`;985 = 0.72.9 的值:相对 0.72.8 +8 —— CC-30 `MCP_RECONNECT_OUTCOMES` / `MCP_RECONNECT_TRANSACTION_NOTICE` / `projectMcpReconnectResult` / `classifyMcpReconnectFailure` / `reconnectMcpServer` / `projectMcpReconnectCapability` / `mcpReconnectOutcomeDetail`、CC-39② `readAutoConsolidationArmed`;977 = 0.72.8 的值:相对 0.72.7 +6 —— CC-39③ `MEMORY_OFF` / `memoryOffDeclarationField` / `memoryOffDeclared`、CC-43 `MODEL_OUTPUT_ERROR_PREFIX` / `isModelOutputErrorText` / `isModelOutputErrorRowText`;971 = 0.72.7 的值:相对 0.72.6 +2 —— CC-42 core 7.22.0 提货 `MCP_REDIAL_OUTCOMES` / `readMcpServerRedialed`;969 = 0.72.6 的值:相对 0.72.5 +1 —— CC-40 `steerFollowIntent`;968 = 0.72.5 的值:相对 0.72.4 +6 —— CC-31 server 7.82.1 提货 `capabilities.webSearch.backend` 四态读面:`WEB_SEARCH_BACKEND_NONE` / `projectWebSearchBackendCapability` / `observedWebSearchBackend` / `noteEngineCapsForWebSearchBackend` / `forgetWebSearchBackendReading` / `webSearchBackendDoctorDetail`;962 = 0.72.3 的值:相对 0.72.2 +1 —— CC-39① `AGENT_MEMORY_WORDS`;0.72.2 相对 0.72.1 +1 —— CC-37 `noteOwnWorkflowRun`;0.72.1 相对 0.72.0 +4 —— CC-33 server 7.80.1 提货:`RESUME_CONTEXT_UNAVAILABLE` / `resumeContextUnavailableFromError` / `resumeContextUnavailableContent` / `skillBaseDirOf`;0.72.0 相对 0.71.4 −39 —— CC-32 退役批删 export-liveness 登记 retire 的 39 个零消费导出(23 常量 + 16 函数,名单见 §47);995 = 0.71.3 的值:相对 0.71.2 +9 —— CC-06 `readEffectiveReasoning` / `readEffectiveMemoryScopes` / `resumeReopenFromError` / `resumeReopenContent` / `routePairingVerdict` 五函数 + `RESUME_REOPEN_CODES` / `RESUME_ENV_FAILED` / `RESUME_TOOL_UNAVAILABLE` / `RESUME_TOOL_CONTRACT_MISMATCH` 四常量;986 = 0.71.0 的值:相对 0.70.2 −`MAX_AGENT_SKILLS` −`DECIDE_WORKFLOW_HOST_NOT_PARKED` +`projectToolRosterDelta` +`mcpEngineLegPresence`;986 = 0.70.0 的值:相对 0.69.2 **一件 additive(`readSkillsListingTruncated`,§39)、零删除**;985 = 0.69.2 的值:相对 0.69.1 **三件 additive、零删除**(CC-13 `isSubFlowSegmentEnd` / `SEGMENT_END_IDENTITY_KEYS` / `droppedWhySentence`,§38);982 = 0.69.0 未发布版的值(原排 0.68.3,因 peer 地板抬升改 minor)= 相对 0.68.2 **十七件 additive、零删除**:`fetchMcpPanel`(CC-03 补件,§36e)+ `readWorkflowResumeAdmissionIncomplete`(CC-05 core 7.18.0 #755)+ `installCoreValuePorts`/`hasCoreValuePorts`/`hasCoreValuePort`/`coreValuePortMisses`/`CORE_VALUE_PORT_NAMES` + 十读口(CC-07 core 值级端口,§36d);0.68.2 相对 0.68.1 十三件 additive:`SEMA_SEGMENT_ID_KEY`(CC-01 段身份键,§35f)/ `projectMcpPanel`+`mcpPanelLastLegDetail`+`projectMcpSection`(CC-03 `/mcp` 面板读视图,§35g)/ `resolveTextSegmentAuthority`/`createTextSegmentLedger`(L-318 `text_end` 权威段替换的判决单源 + print 形段账,详见 §35b/§35c)/ `memoryCaptureDeclarationField`/`MEMORY_CAPTURE_OFF`(L-316 会话级隐私声明的字面唯一铸点,§35d)/ `engineUrl`/`probeHealth`(L-61 件④ SDK 纯工具面原样转口,§35d)/ `AgentClient`/`isApprovalRequestFrameV1`/`isApprovalRevokeFrameV1`(L-61 存量清零:SDK **wire 面**原样转口,§35e)。`0.68.1`/`0.68.0` 是 **952**,那批是相对 0.67.2 **二十件 additive、🔴 两件删除(BREAKING)**:additive = `TERMINAL_CAUSE_KINDS`/`isTerminalCauseKind`/`RUN_TERMINAL_NOT_SUCCESS_STATUSES`/`RUN_TERMINAL_STATUSES`(L-247 终态词两表分源,详见 §33b)/ `SEMA_SUBAGENT_USAGE_PARTIAL_KEY`/`subagentUsageIsPartial`(L-244 子代下界位自有名,§33g)/ `ASK_UNRESOLVABLE_CAUSES`/`readAskUnresolvable`/`DURABLE_MANDATE_SOURCES`/`readDurableGateUnavailable`(core 7.17.0 #709 ①② 两只通告事实窄读器,§33c)/ `WORKFLOW_PARK_TRUTH_UNREADABLE`/`WORKFLOW_PARK_NOT_PENDING`/`WORKFLOW_PARK_BINDING_BROKEN`/`WORKFLOW_PARK_REQUIRES_RUN_STORE`(四个单码常量 🔧 0.72.0 退役)/`WORKFLOW_PARK_REFUSAL_CODES`/`isWorkflowParkRefusalCode`/`readWorkflowParks`(core 7.17.0 #652 park 真相四码 + parks 三键读器,§33d)/ `ENGINE_STOP_REASONS`/`engineStopReasonToCc`(L-246 A13 停止原词映射下沉,§33g)/ `readCancelRequested`(L-230 读面,§33f);🔴 **删除两件** `TERMINAL_NOT_SUCCESS_STATUSES`/`TERMINAL_STATUSES`(随 L-247 两表分源更名成 `RUN_TERMINAL_*`,clean-cut **不留别名** —— 留一个别名等于让端可以继续按合起来的那张表读,分源就白做了,详见 §33b)。`0.67.0` 是 **934**,那批是相对 0.66.0 **七件 additive、🔴 两件删除**:additive = `CLASSIFIER_DENY_CAUSES`/`isClassifierDenyCause`/`classifierDenyCauseOf`/`classifierDenyCauseDetail`(core 7.14.0 退役 `classifierUnavailable` 之后的**拒绝面**继任读器与措辞,详见 §32b)/ `RULE_STORE_UNREADABLE_KINDS`/`isRuleStoreUnreadableKind`/`ruleStoreUnreadableDetail`(core 7.14.0 #688 C3 的规则店机制位三件,详见 §32d);🔴 **删除两件** `classifierUnavailableOf`/`classifierUnavailableDetail`(随 core 7.14.0 的 Retired keys 表整族退役,clean-cut 不留别名,详见 §32b;同批删的还有**型** `ClassifierUnavailableView`、卡位与帧位 `classifierUnavailable`、以及一条恒真的型面钉 `_askOriginWordsPin`)。`0.66.0` 是 **929**,那批是一件 additive、零删除:`readRunCostFacts`(终局成本事实的唯一读器:`costBreakdown` / `nested` 窄读 + 对账三段与两个判别位,终帧超集键与 chrome 对账臂共用它;详见 §31c);已发的 **0.65.x 十一件 additive、两件删除**:additive = `DECIDE_WORKFLOW_HOST_UNKNOWN`/`DECIDE_WORKFLOW_HOST_NOT_PARKED`/`DECIDE_WORKFLOW_REMEMBER_UNSUPPORTED`/`DECIDE_WORKFLOW_LANE_CODES`/`readDecideReceipt`/`decideAcceptedNotResolved`/`decideRefusalFromError`(B-070 `/decide` 回执读面与三码人话,详见 §30h)/ `TERMINAL_NOT_SUCCESS_STATUSES`/`isTerminalNotSuccess`/`TERMINAL_STATUSES`/`isTerminalStatus`(L-215② 终局词汇单铸谓词,详见 §30j);🔴 **删除两件** `AUTO_MODE_BREAKER_CAUSES`/`classifierBreakerOf`(熔断族随 core 7.12.0 的 Removed(BREAKING) 整只退役,clean-cut 不留别名,详见 §30k②;同批删的还有**型** `ClassifierBreakerView` 与 `ClassifierStatusView.breaker` 一位)。`0.64.2` 是 **919**,那批是一件 additive、零删除:`readDenialLimitFallback`(限额回落卡的窄读器上公面,壳侧同判据副本退役,详见 §29③);`0.64.0` 是 **918**,那批是件①+件② 十三件 additive、零删除:`CLASSIFIER_STATUS_STATES`/`classifierBreakerOf`/`classifierStatusOf`/`classifierStatusDetail`(分类器状态面,详见 §28②)/ `THINKING_FORMATS`/`THINKING_FORMAT_WIRE_TWINS`/`THINKING_DISABLE_PROBE_ORDER`/`MODEL_PROBE_VERDICTS`/`PROBE_PROMPT`/`PROBE_MAX_TOKENS`(两个探针常量 🔧 0.72.0 退役)/`probeRequestBody`/`probeModelCapability`/`applyProbeToEntry`(模型思考能力探测,详见 §28①);`0.63.0` 是 **905**,那批是八件 additive、零删除:`projectServerGateKnobs`/`postureKnobSourceOf`/`postureSourceIsOperatorPinned`/`postureKnobDetail`/`POSTURE_SOURCE_WORDS`(S-178 三根 posture 旋钮读数,详见 §27b)/ `PERSISTED_RULE_BEHAVIORS`/`PERSISTED_RULE_BEHAVIOR_UNKNOWN`/`persistedRuleBehaviorOf`/`persistedRuleBehaviorLabel`/`revokeTargetFromPersistedRule`(三态规则身份,§27c)/ `engineIdentityOf`/`engineIdentityVerdict`/`engineIdentityChanged`/`engineIdentityChangedBy`/`ENGINE_IDENTITY_ANCHORS`(S-179 代际锚,§27d)/ `GATE_DENIED_BY_WORDS`/`gateDeniedByDetail`/`ASK_ORIGIN_WORDS`/`askOriginDetail`(门词汇 +2,§27e)/ `PERMISSION_RULE_ISSUE_CODES`/`RETIRED_PERMISSION_RULE_ISSUE_CODES`/`permissionRuleIssueDetail`(规则 lint 码表,§27f)/ `projectToolRoster`/`toolRosterNames`/`toolShimFromRoster`/`applyToolRosterDelta`(L-161 工具名册,§27g)/ `ENGINE_NOTICE_CODES`/`ENGINE_NOTICE_AUDIENCE`/`noticeAudienceOf`/`engineNoticeInCatalog`/`MCP_INJECTION_DROP_REASONS`/`readMcpInjectionDrop`(L-167 通告码册,§27h)/ `AUTO_MODE_UNAVAILABLE_CAUSES`/`AUTO_MODE_BREAKER_CAUSES`/`classifierUnavailableOf`/`classifierUnavailableDetail`(件⑧ 分类器不可用事实,§27h2);`0.62.0` 是 **869**,那批是五件 additive、**零删除**:`capForDisplay`(呈前消毒 + 封长的共用铸点,详见 §26⑦)/ `SEAT_SEND_MESSAGE_KEY_ORIGINS`(座位载荷逐键出身表,详见 §26③)/ `configureSubagentContentStore`+`subagentContentStoreConfig`+`SUBAGENT_CONTENT_STORE_DEFAULTS`(子代内容账本字节预算,测试钩 `__resetSubagentContentStoreConfigForTests` +1,详见 §26②);`0.61.0` 是 **864**,那批是三件 additive、**零删除**:`projectReadFacePosture`/`readFacePostureDetail`/`readFaceDisagreement`(S-167 READ 容纳面 operator 读器,详见 §25);`0.60.0` 是 **861**,那批是二十五件 additive、**零删除**:`readRunTerminal`/`runTerminalCode`/`runTerminalGateKind`/`runTerminalGateToolName`/`isReviewPark`/`REVIEW_PARK_GATE_KINDS` 六件终局因由读器 + `gateOutcomeOf`/`isDeniedGate`/`gateDeniedBy`/`gateApprover`/`isApprovalWindowExpiredGate`/`isDenialLimitAutoDeniedGate`/`isParkSlaExpiredGate`/`isHumanSettledGate` 八件门记录读器 + `projectWriteProtectionCapability`/`noteEngineCapsForWriteProtection`/`observedWriteProtection`/`forgetWriteProtectionReading`/`writeProtectionDoctorDetail`/`projectWriteProtectionPosture`/`writeProtectionPostureDetail` 七件写保护读面(测试钩 `__resetWriteProtectionReadingsForTests` +1)+ `readWireErrorCode` + 真机边界①的两件 `isGateParkedToolEnd`/`GATE_PARKED_ERROR_CODE` + 异源复审逼出的 `engineCapsGeneration`;`0.59.0` 是 **836**,那批是八件 additive:`RULE_OFFERS_ABSENCE_REASONS`/`DENIAL_LIMIT_KINDS` 两张闭词表再导出 + `engineCapValue` 能力位四态通用读口 + `projectSqlEngineCapability`/`observedSqlEngine`/`noteEngineCapsForSqlEngine`/`forgetSqlEngineReading`/`sqlEngineDoctorDetail` 五件 SQL 姿态读面(测试钩 `__resetSqlEngineReadingsForTests` +1);`0.58.0` 是 **828**,那批是三件 additive:`RULE_OFFER_MATCHES`/`RULE_OFFER_BATCH_MEMBER_KINDS`/`RULE_OFFER_UNCOVERED_REASONS` 三张闭词表再导出 + `RESUME_REFUSAL_CODES`/`RESUME_PLACEMENT_MISMATCH`/`resumeRefusalFromError`/`resumeRefusalContent` 四件文案铸点;`0.57.0` 是 **821**;`0.56.0`/`0.55.0` 是 **815**;已发 `0.54.0`(design/385 十件 additive 含 `AUTHORITY_ENVELOPE_TAGS` 🔧 0.72.0 退役);`0.52.0` 是 **805**(L-69⑨ 两件);`0.51.0` 是 **803**;`0.50.0` 是 **800**(S-81 五件);`0.49.0` 是 **795**;`0.48.0` 是 **794**;npm `0.47.0` 是 **790**,`0.46.0` 是 **787**,`0.44.0` 是 **783**,`0.43.1`/`0.43.0` 是 **776**,`0.42.0` 是 **771**,`0.41.0` 是 **767**,`0.39.0` 是 **766**,`0.38.0` 是 **764**;`0.37.0` 是 **753**,见 `CHANGELOG.md`) | `scripts/public-export-baseline.json` 的 `count` / `testHookCount` —— **别手抄进别处,以该文件为准** |
|
|
26
|
+
| 公开导出面 | **1019** 个运行期符号(+ 47 个测试钩;= 0.73.0 的值(导出名零增减,BREAKING 在类型面);= 0.72.14 的值:相对 0.72.13 +8 —— CC-55 八件,名单见 §2b 域 3;1011 = 0.72.13 的值:相对 0.72.12 +18 —— CC-46 八件 / CC-54 六件 / CC-53 两件 / CC-50 缺席口两件,名单见 §2b 域 3 / 4 / 9 / 10;993 = 0.72.12 的值(测试钩 45):相对 0.72.11 +4 —— CC-50 `OUTCOME_UNKNOWN_ROW_PREFIX` / `isOutcomeUnknownRowText` / `TASK_NOTIFICATION_TERMINAL_STATUSES` / `isTaskNotificationTerminalStatus`;989 = 0.72.10 的值:相对 0.72.9 +4 —— CC-41 `LEADER_RUN_STATUSES` / `LEADER_REJ_HEAD_DISPLAY_MAX` / `projectLeaderConflict` / `leaderConflictDetail`;985 = 0.72.9 的值:相对 0.72.8 +8 —— CC-30 `MCP_RECONNECT_OUTCOMES` / `MCP_RECONNECT_TRANSACTION_NOTICE` / `projectMcpReconnectResult` / `classifyMcpReconnectFailure` / `reconnectMcpServer` / `projectMcpReconnectCapability` / `mcpReconnectOutcomeDetail`、CC-39② `readAutoConsolidationArmed`;977 = 0.72.8 的值:相对 0.72.7 +6 —— CC-39③ `MEMORY_OFF` / `memoryOffDeclarationField` / `memoryOffDeclared`、CC-43 `MODEL_OUTPUT_ERROR_PREFIX` / `isModelOutputErrorText` / `isModelOutputErrorRowText`;971 = 0.72.7 的值:相对 0.72.6 +2 —— CC-42 core 7.22.0 提货 `MCP_REDIAL_OUTCOMES` / `readMcpServerRedialed`;969 = 0.72.6 的值:相对 0.72.5 +1 —— CC-40 `steerFollowIntent`;968 = 0.72.5 的值:相对 0.72.4 +6 —— CC-31 server 7.82.1 提货 `capabilities.webSearch.backend` 四态读面:`WEB_SEARCH_BACKEND_NONE` / `projectWebSearchBackendCapability` / `observedWebSearchBackend` / `noteEngineCapsForWebSearchBackend` / `forgetWebSearchBackendReading` / `webSearchBackendDoctorDetail`;962 = 0.72.3 的值:相对 0.72.2 +1 —— CC-39① `AGENT_MEMORY_WORDS`;0.72.2 相对 0.72.1 +1 —— CC-37 `noteOwnWorkflowRun`;0.72.1 相对 0.72.0 +4 —— CC-33 server 7.80.1 提货:`RESUME_CONTEXT_UNAVAILABLE` / `resumeContextUnavailableFromError` / `resumeContextUnavailableContent` / `skillBaseDirOf`;0.72.0 相对 0.71.4 −39 —— CC-32 退役批删 export-liveness 登记 retire 的 39 个零消费导出(23 常量 + 16 函数,名单见 §47);995 = 0.71.3 的值:相对 0.71.2 +9 —— CC-06 `readEffectiveReasoning` / `readEffectiveMemoryScopes` / `resumeReopenFromError` / `resumeReopenContent` / `routePairingVerdict` 五函数 + `RESUME_REOPEN_CODES` / `RESUME_ENV_FAILED` / `RESUME_TOOL_UNAVAILABLE` / `RESUME_TOOL_CONTRACT_MISMATCH` 四常量;986 = 0.71.0 的值:相对 0.70.2 −`MAX_AGENT_SKILLS` −`DECIDE_WORKFLOW_HOST_NOT_PARKED` +`projectToolRosterDelta` +`mcpEngineLegPresence`;986 = 0.70.0 的值:相对 0.69.2 **一件 additive(`readSkillsListingTruncated`,§39)、零删除**;985 = 0.69.2 的值:相对 0.69.1 **三件 additive、零删除**(CC-13 `isSubFlowSegmentEnd` / `SEGMENT_END_IDENTITY_KEYS` / `droppedWhySentence`,§38);982 = 0.69.0 未发布版的值(原排 0.68.3,因 peer 地板抬升改 minor)= 相对 0.68.2 **十七件 additive、零删除**:`fetchMcpPanel`(CC-03 补件,§36e)+ `readWorkflowResumeAdmissionIncomplete`(CC-05 core 7.18.0 #755)+ `installCoreValuePorts`/`hasCoreValuePorts`/`hasCoreValuePort`/`coreValuePortMisses`/`CORE_VALUE_PORT_NAMES` + 十读口(CC-07 core 值级端口,§36d);0.68.2 相对 0.68.1 十三件 additive:`SEMA_SEGMENT_ID_KEY`(CC-01 段身份键,§35f)/ `projectMcpPanel`+`mcpPanelLastLegDetail`+`projectMcpSection`(CC-03 `/mcp` 面板读视图,§35g)/ `resolveTextSegmentAuthority`/`createTextSegmentLedger`(L-318 `text_end` 权威段替换的判决单源 + print 形段账,详见 §35b/§35c)/ `memoryCaptureDeclarationField`/`MEMORY_CAPTURE_OFF`(L-316 会话级隐私声明的字面唯一铸点,§35d)/ `engineUrl`/`probeHealth`(L-61 件④ SDK 纯工具面原样转口,§35d)/ `AgentClient`/`isApprovalRequestFrameV1`/`isApprovalRevokeFrameV1`(L-61 存量清零:SDK **wire 面**原样转口,§35e)。`0.68.1`/`0.68.0` 是 **952**,那批是相对 0.67.2 **二十件 additive、🔴 两件删除(BREAKING)**:additive = `TERMINAL_CAUSE_KINDS`/`isTerminalCauseKind`/`RUN_TERMINAL_NOT_SUCCESS_STATUSES`/`RUN_TERMINAL_STATUSES`(L-247 终态词两表分源,详见 §33b)/ `SEMA_SUBAGENT_USAGE_PARTIAL_KEY`/`subagentUsageIsPartial`(L-244 子代下界位自有名,§33g)/ `ASK_UNRESOLVABLE_CAUSES`/`readAskUnresolvable`/`DURABLE_MANDATE_SOURCES`/`readDurableGateUnavailable`(core 7.17.0 #709 ①② 两只通告事实窄读器,§33c)/ `WORKFLOW_PARK_TRUTH_UNREADABLE`/`WORKFLOW_PARK_NOT_PENDING`/`WORKFLOW_PARK_BINDING_BROKEN`/`WORKFLOW_PARK_REQUIRES_RUN_STORE`(四个单码常量 🔧 0.72.0 退役)/`WORKFLOW_PARK_REFUSAL_CODES`/`isWorkflowParkRefusalCode`/`readWorkflowParks`(core 7.17.0 #652 park 真相四码 + parks 三键读器,§33d)/ `ENGINE_STOP_REASONS`/`engineStopReasonToCc`(L-246 A13 停止原词映射下沉,§33g)/ `readCancelRequested`(L-230 读面,§33f);🔴 **删除两件** `TERMINAL_NOT_SUCCESS_STATUSES`/`TERMINAL_STATUSES`(随 L-247 两表分源更名成 `RUN_TERMINAL_*`,clean-cut **不留别名** —— 留一个别名等于让端可以继续按合起来的那张表读,分源就白做了,详见 §33b)。`0.67.0` 是 **934**,那批是相对 0.66.0 **七件 additive、🔴 两件删除**:additive = `CLASSIFIER_DENY_CAUSES`/`isClassifierDenyCause`/`classifierDenyCauseOf`/`classifierDenyCauseDetail`(core 7.14.0 退役 `classifierUnavailable` 之后的**拒绝面**继任读器与措辞,详见 §32b)/ `RULE_STORE_UNREADABLE_KINDS`/`isRuleStoreUnreadableKind`/`ruleStoreUnreadableDetail`(core 7.14.0 #688 C3 的规则店机制位三件,详见 §32d);🔴 **删除两件** `classifierUnavailableOf`/`classifierUnavailableDetail`(随 core 7.14.0 的 Retired keys 表整族退役,clean-cut 不留别名,详见 §32b;同批删的还有**型** `ClassifierUnavailableView`、卡位与帧位 `classifierUnavailable`、以及一条恒真的型面钉 `_askOriginWordsPin`)。`0.66.0` 是 **929**,那批是一件 additive、零删除:`readRunCostFacts`(终局成本事实的唯一读器:`costBreakdown` / `nested` 窄读 + 对账三段与两个判别位,终帧超集键与 chrome 对账臂共用它;详见 §31c);已发的 **0.65.x 十一件 additive、两件删除**:additive = `DECIDE_WORKFLOW_HOST_UNKNOWN`/`DECIDE_WORKFLOW_HOST_NOT_PARKED`/`DECIDE_WORKFLOW_REMEMBER_UNSUPPORTED`/`DECIDE_WORKFLOW_LANE_CODES`/`readDecideReceipt`/`decideAcceptedNotResolved`/`decideRefusalFromError`(B-070 `/decide` 回执读面与三码人话,详见 §30h)/ `TERMINAL_NOT_SUCCESS_STATUSES`/`isTerminalNotSuccess`/`TERMINAL_STATUSES`/`isTerminalStatus`(L-215② 终局词汇单铸谓词,详见 §30j);🔴 **删除两件** `AUTO_MODE_BREAKER_CAUSES`/`classifierBreakerOf`(熔断族随 core 7.12.0 的 Removed(BREAKING) 整只退役,clean-cut 不留别名,详见 §30k②;同批删的还有**型** `ClassifierBreakerView` 与 `ClassifierStatusView.breaker` 一位)。`0.64.2` 是 **919**,那批是一件 additive、零删除:`readDenialLimitFallback`(限额回落卡的窄读器上公面,壳侧同判据副本退役,详见 §29③);`0.64.0` 是 **918**,那批是件①+件② 十三件 additive、零删除:`CLASSIFIER_STATUS_STATES`/`classifierBreakerOf`/`classifierStatusOf`/`classifierStatusDetail`(分类器状态面,详见 §28②)/ `THINKING_FORMATS`/`THINKING_FORMAT_WIRE_TWINS`/`THINKING_DISABLE_PROBE_ORDER`/`MODEL_PROBE_VERDICTS`/`PROBE_PROMPT`/`PROBE_MAX_TOKENS`(两个探针常量 🔧 0.72.0 退役)/`probeRequestBody`/`probeModelCapability`/`applyProbeToEntry`(模型思考能力探测,详见 §28①);`0.63.0` 是 **905**,那批是八件 additive、零删除:`projectServerGateKnobs`/`postureKnobSourceOf`/`postureSourceIsOperatorPinned`/`postureKnobDetail`/`POSTURE_SOURCE_WORDS`(S-178 三根 posture 旋钮读数,详见 §27b)/ `PERSISTED_RULE_BEHAVIORS`/`PERSISTED_RULE_BEHAVIOR_UNKNOWN`/`persistedRuleBehaviorOf`/`persistedRuleBehaviorLabel`/`revokeTargetFromPersistedRule`(三态规则身份,§27c)/ `engineIdentityOf`/`engineIdentityVerdict`/`engineIdentityChanged`/`engineIdentityChangedBy`/`ENGINE_IDENTITY_ANCHORS`(S-179 代际锚,§27d)/ `GATE_DENIED_BY_WORDS`/`gateDeniedByDetail`/`ASK_ORIGIN_WORDS`/`askOriginDetail`(门词汇 +2,§27e)/ `PERMISSION_RULE_ISSUE_CODES`/`RETIRED_PERMISSION_RULE_ISSUE_CODES`/`permissionRuleIssueDetail`(规则 lint 码表,§27f)/ `projectToolRoster`/`toolRosterNames`/`toolShimFromRoster`/`applyToolRosterDelta`(L-161 工具名册,§27g)/ `ENGINE_NOTICE_CODES`/`ENGINE_NOTICE_AUDIENCE`/`noticeAudienceOf`/`engineNoticeInCatalog`/`MCP_INJECTION_DROP_REASONS`/`readMcpInjectionDrop`(L-167 通告码册,§27h)/ `AUTO_MODE_UNAVAILABLE_CAUSES`/`AUTO_MODE_BREAKER_CAUSES`/`classifierUnavailableOf`/`classifierUnavailableDetail`(件⑧ 分类器不可用事实,§27h2);`0.62.0` 是 **869**,那批是五件 additive、**零删除**:`capForDisplay`(呈前消毒 + 封长的共用铸点,详见 §26⑦)/ `SEAT_SEND_MESSAGE_KEY_ORIGINS`(座位载荷逐键出身表,详见 §26③)/ `configureSubagentContentStore`+`subagentContentStoreConfig`+`SUBAGENT_CONTENT_STORE_DEFAULTS`(子代内容账本字节预算,测试钩 `__resetSubagentContentStoreConfigForTests` +1,详见 §26②);`0.61.0` 是 **864**,那批是三件 additive、**零删除**:`projectReadFacePosture`/`readFacePostureDetail`/`readFaceDisagreement`(S-167 READ 容纳面 operator 读器,详见 §25);`0.60.0` 是 **861**,那批是二十五件 additive、**零删除**:`readRunTerminal`/`runTerminalCode`/`runTerminalGateKind`/`runTerminalGateToolName`/`isReviewPark`/`REVIEW_PARK_GATE_KINDS` 六件终局因由读器 + `gateOutcomeOf`/`isDeniedGate`/`gateDeniedBy`/`gateApprover`/`isApprovalWindowExpiredGate`/`isDenialLimitAutoDeniedGate`/`isParkSlaExpiredGate`/`isHumanSettledGate` 八件门记录读器 + `projectWriteProtectionCapability`/`noteEngineCapsForWriteProtection`/`observedWriteProtection`/`forgetWriteProtectionReading`/`writeProtectionDoctorDetail`/`projectWriteProtectionPosture`/`writeProtectionPostureDetail` 七件写保护读面(测试钩 `__resetWriteProtectionReadingsForTests` +1)+ `readWireErrorCode` + 真机边界①的两件 `isGateParkedToolEnd`/`GATE_PARKED_ERROR_CODE` + 异源复审逼出的 `engineCapsGeneration`;`0.59.0` 是 **836**,那批是八件 additive:`RULE_OFFERS_ABSENCE_REASONS`/`DENIAL_LIMIT_KINDS` 两张闭词表再导出 + `engineCapValue` 能力位四态通用读口 + `projectSqlEngineCapability`/`observedSqlEngine`/`noteEngineCapsForSqlEngine`/`forgetSqlEngineReading`/`sqlEngineDoctorDetail` 五件 SQL 姿态读面(测试钩 `__resetSqlEngineReadingsForTests` +1);`0.58.0` 是 **828**,那批是三件 additive:`RULE_OFFER_MATCHES`/`RULE_OFFER_BATCH_MEMBER_KINDS`/`RULE_OFFER_UNCOVERED_REASONS` 三张闭词表再导出 + `RESUME_REFUSAL_CODES`/`RESUME_PLACEMENT_MISMATCH`/`resumeRefusalFromError`/`resumeRefusalContent` 四件文案铸点;`0.57.0` 是 **821**;`0.56.0`/`0.55.0` 是 **815**;已发 `0.54.0`(design/385 十件 additive 含 `AUTHORITY_ENVELOPE_TAGS` 🔧 0.72.0 退役);`0.52.0` 是 **805**(L-69⑨ 两件);`0.51.0` 是 **803**;`0.50.0` 是 **800**(S-81 五件);`0.49.0` 是 **795**;`0.48.0` 是 **794**;npm `0.47.0` 是 **790**,`0.46.0` 是 **787**,`0.44.0` 是 **783**,`0.43.1`/`0.43.0` 是 **776**,`0.42.0` 是 **771**,`0.41.0` 是 **767**,`0.39.0` 是 **766**,`0.38.0` 是 **764**;`0.37.0` 是 **753**,见 `CHANGELOG.md`) | `scripts/public-export-baseline.json` 的 `count` / `testHookCount` —— **别手抄进别处,以该文件为准** |
|
|
27
27
|
| 常驻门 | 以 `scripts/gates-manifest.json` 的 `suites` 长度为准(**本档不抄这个数**) | `scripts/gates-manifest.json`;`npm test` 的名单等值门与它逐名对账 |
|
|
28
28
|
| 沿革档 | 0.29.0 起建 `CHANGELOG.md`;更早批次记账在 `src/index.ts` 文件头 + `docs/REFACTOR-LEDGER.md` | — |
|
|
29
29
|
|
|
@@ -8734,3 +8734,52 @@ installCoreValuePorts({ resolveAutonomousLoopPrompt, loosenReasons, combinePolic
|
|
|
8734
8734
|
3. peer sdk >=9.6.0 / agent-types >=0.3.0 不动;引擎不报 `livePending`(较老版本)⇒ 快照键缺席、tracker 恒空、计数 `null`。
|
|
8735
8735
|
|
|
8736
8736
|
**包侧缺口:** ⓪ CC-52 M4 fleet 视图数值键改可选 = **0.73.0(minor,型面 BREAKING,窗 09-20)**,已预告,候三端表态;① 悬挂 ask 卡上的工具入参摘要(候引擎在 `livePending` 段出键);② 引擎为 `livePending` 的出现 / 结算 / 过期发 `approvals.stream` 事件后对账节拍降为兜底(候引擎);③ CC-34 `permission_denials` 自动升级验证(候引擎透传半场);④ CC-36 托管 MCP 活性三态读口(候上游);⑤ `staleAfterSec` / `runId` 经 sdk 到端(候 sdk 出键);⑥ 九件 wire 面经 sdk 声明(含 `livePending` 行型经 barrel 导出;候 sdk);⑦ `agents.listing_truncated` detail 读器候消费场景(by-design);⑧ `ClassifierSeat.defaulted?` 候 sdk 出键(by-design);⑨ §NNz「declined 键真零命中」机读第二刀(候形式化);⑩ 缺席上报附 `removeReason`(候引擎 + 壳透传);⑪ 三选卡宿主声明闸候引擎投影判别键。
|
|
8737
|
+
|
|
8738
|
+
## §62 🆕 0.73.0 fleet 视图八个数值键改可选(CC-52:不再把「不知道」编成 0);minor,型面 BREAKING
|
|
8739
|
+
|
|
8740
|
+
> **minor / BREAKING**(类型面 + 缺席时的运行期值由 0 变为键缺席):`FleetTaskView.elapsedMs` / `.tokens` / `.queuedCount` 与 `FleetWorkflowView.doneCount` / `.totalCount` / `.elapsedMs` / `.tokens` / `.failedCount` 与 `WorkflowRunState.totalTokens` 由 `number` 改 `number | undefined`(可选键)。公面导出名零增减(1019;测试钩 47);零 wire 新键;peer 不动。票来源:审计 #62 A-18;0.72.13 / 0.72.14 两版预告。
|
|
8741
|
+
|
|
8742
|
+
### 62a. 处置表
|
|
8743
|
+
|
|
8744
|
+
| # | 面 | 本包做了什么 | 端要做什么 |
|
|
8745
|
+
|---|---|---|---|
|
|
8746
|
+
| S-1 | `projectTasks` 的 `elapsedMs` / `tokens` / `queuedCount` | **changed(BREAKING)**:wire 缺席 / 坏形 ⇒ 视图键缺席(此前 `?? 0`);真 0 逐字在场 | 读点改三态:`'tokens' in row`(或 `!== undefined`)才渲数,否则按 62b 的语义分渲;🔴 **别在端里再写一遍 `?? 0`** —— 那是把同一个病下沉一层 |
|
|
8747
|
+
| S-2 | `projectWorkflows` 的 `doneCount` / `totalCount` / `failedCount` / `tokens` / `elapsedMs` | **changed(BREAKING)**:同上 | `N/M agents done` 这类拼句:任一键缺席就整段渲「—」,不拼 `undefined/undefined`,不互相推导 |
|
|
8748
|
+
| S-3 | 台账帧间时钟补偿(`createFleetLedger().project`) | **changed**:只给有基数(引擎快照 `elapsedMs`,先验非负有限数再算)的行推进;有可用 `startedAt` 的行不受影响 | 零接线;老引擎上无锚无快照的行,计时器由「从 0 起跳的本端空窗」变成「—」 |
|
|
8749
|
+
| S-4 | agent 面板投影 `projectFleetAgentRows` 的 `fleet-row.totalTokens` | **changed**:行上无 `tokens` / 坏形 ⇒ 键不落(此前发布 0);已知值粘住,缺席帧不清零;真 0 逐字 | 面板行的 token 段按「键在不在」渲;类型面零变化(该键本来就可选) |
|
|
8750
|
+
| S-5 | workflow monitor `projectWorkflowRun` 的 `WorkflowRunState.totalTokens` | **changed(BREAKING)**:必填改可选;有 `run.stats` 用它,否则只在每条腿都报过时求和,其余键缺席 | monitor 总用量读点改三态;缺席渲「—」 |
|
|
8751
|
+
|
|
8752
|
+
### 62b. 🔴 逐键缺席语义(端按语义分渲)
|
|
8753
|
+
|
|
8754
|
+
> 🔴 **键缺席不区分成因**:视图上只有「有键 / 缺键」两态。缺键可能是「引擎这一拍没报」「引擎从没为这一行报过」「报了但形坏被剥掉」三者之一,**不能由键缺席反推上报历史**。下表的「可能成因」是帮端选渲法,不是断言。
|
|
8755
|
+
|
|
8756
|
+
| 键 | 缺席时的可能成因 | 建议渲法 |
|
|
8757
|
+
|---|---|---|
|
|
8758
|
+
| `FleetTaskView.elapsedMs` | 这一行没有可用的时长基数:无 `startedAt`(或它晚于本端时钟)且无合法的引擎快照 | 「—」,不渲 `0s` |
|
|
8759
|
+
| `FleetTaskView.tokens` | 引擎还没为这一行报过用量(排队中 / 刚起 / 该车道不报),或报的不是非负整数 | 「—」或不渲这一段;**不是** 0 tokens |
|
|
8760
|
+
| `FleetTaskView.queuedCount` | 引擎没报这一位(本包不保证任何引擎版本上报它;sdk 行型上是可选整数) | 不渲排队徽标;不渲 `0 queued` |
|
|
8761
|
+
| `FleetWorkflowView.doneCount` / `totalCount` / `failedCount` | 较老的引擎 / 乱序的部分增量 / 坏形 | 整段「—」;🔴 **不互相推导**(`failedCount` 缺席不读作 0;`totalCount` 缺席不拿 `doneCount` 顶) |
|
|
8762
|
+
| `FleetWorkflowView.tokens` / `elapsedMs` | 同上 | 「—」 |
|
|
8763
|
+
| `WorkflowRunState.totalTokens` | 没有完整总数:引擎聚合缺席或残缺,且腿上有未报 / 非法的用量(或零条腿) | 「—」;不拿已报的腿求个小计冒充总数 |
|
|
8764
|
+
| `fleet-row` 事件的 `totalTokens` | 本周期内引擎还没为这一行报过合法用量(同周期内已知值粘住;新周期不继承;同周期内每条 `fleet-row` 都带已知的 `startedAt`,未订阅期间的缓冲据此不跨周期合并) | 不渲 token 段。🔴 **消费端义务**:该事件是部分帧,省略的键 = 沿用你行上的旧值;所以**`startedAt` 变了(同 id 新周期)时由你清掉行上的用量 / 工具计数**,包只保证不把旧数发给你 |
|
|
8765
|
+
|
|
8766
|
+
### 62z. 逐键处置表
|
|
8767
|
+
|
|
8768
|
+
| # | 键 / 面 | 处置 | 坐标 / 理由 |
|
|
8769
|
+
|---|---|---|---|
|
|
8770
|
+
| 1 | fleet task 行 `elapsedMs` / `tokens` / `queuedCount` | **consumed(三态;坏形缺席)** | `src/fleet/fleetProjection.ts` `#projectTasks` + `wireCount` / `wireDuration`;键集门 B / C2 |
|
|
8771
|
+
| 2 | fleet workflow 行 `doneCount` / `totalCount` / `failedCount` / `tokens` / `elapsedMs` | **consumed(三态;坏形缺席)** | `#projectWorkflows`;键集门 C / C2 |
|
|
8772
|
+
| 3 | fleet workflow 行 `startedCount` | **consumed(不变:此前就是三态)** | 同文件的包内窄读(不出公面) |
|
|
8773
|
+
| 4 | fleet task 行 `startedAt` | **consumed(不变:> 0 才落键;台账拿它自算 elapsed)** | `src/fleet/fleetLedger.ts` `#project` |
|
|
8774
|
+
| 5 | 台账补偿链的基数 | **changed(无基数 / 坏基数不铸)** | `fleetLedger.ts` 两处;键集门 C3 五格 |
|
|
8775
|
+
| 6 | agent 面板投影的 `tokens` → `totalTokens` | **changed(三态 + 粘性)** | `src/fleetAgentPanelProjection.ts`;键集门 C4 四格 |
|
|
8776
|
+
| 7 | workflow run `stats.tokens` / `stats.nested.tokens` / `agents[].tokens` → `totalTokens` | **changed(无权威总数且有腿未报 ⇒ 缺席)** | `src/workflowClient.ts` `#projectWorkflowRun`;键集门 C4 四格 |
|
|
8777
|
+
|
|
8778
|
+
### 62y. 🔴 三端升级必读(固定段式,[C295])
|
|
8779
|
+
|
|
8780
|
+
1. 换钉 `^0.73.0`:`tsc` 会在每一个读这九个键(八个视图键 + `WorkflowRunState.totalTokens`)的地方红一次 —— 逐处按 62b 改成三态。拼句(`done/total`、`N failed`)任一键缺席就整段「—」。
|
|
8781
|
+
2. 🔴 **做算术 / 阈值比较的读点必须显式处理缺席,不能只让它「不报错」**:规模告警、配额预测、进度比这类判定里,`totalCount` / `tokens` / `startedCount` 缺席会让比较恒 false、预测量变 NaN ⇒ **判定静默不触发**。迁移要求:**未知的规模不能被当作规模正常** —— 要么显式走「未知」分支(渲一条「规模未知」或跳过并留痕),要么保留你原来的保守下界并在注释里写明它是下界。同理,端里现存的 `?? 0`(把缺席再补回 0)要逐处判:它是不是把本版撤掉的那个假 0 又铸了一遍。
|
|
8782
|
+
3. 不改代码只换钉:过类型检查的构建编译不过;不查型的构建(纯 JS / 只转译)运行期**不保证**只是难看 —— 见上一条,算术读点会静默改变行为。**请把「换包后这几类读点逐个核过」列进你的提货验收。**
|
|
8783
|
+
4. peer sdk >=9.6.0 / agent-types >=0.3.0 不动;引擎版本无要求(本版零 wire 变化)。
|
|
8784
|
+
|
|
8785
|
+
**包侧缺口:** ⓪ CC-56 wire 错误码人话面两格(cancel 409 按码分家 / 提交面 429 用量窗;窗 09-22,0.73.1);① 悬挂 ask 卡上的工具入参摘要(候引擎在 `livePending` 段出键);② 引擎为 `livePending` 发 stream 事件后对账节拍降为兜底(候引擎);③ CC-34 `permission_denials` 自动升级验证(候引擎透传半场);④ CC-36 托管 MCP 活性三态读口(候上游);⑤ `staleAfterSec` / `runId` 经 sdk 到端(候 sdk 出键);⑥ 九件 wire 面经 sdk 声明(候 sdk);⑦ `agents.listing_truncated` detail 读器候消费场景(by-design);⑧ `ClassifierSeat.defaulted?` 候 sdk 出键(by-design);⑨ §NNz「declined 键真零命中」机读第二刀(候形式化);⑩ 缺席上报附 `removeReason`(候引擎 + 壳透传);⑪ 三选卡宿主声明闸候引擎投影判别键;⑫ fleet task 行 `queuedCount` 的上报与否属引擎侧(本包只按在场读)。
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sema-agent/client-core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.73.0",
|
|
4
4
|
"description": "Client-side session runtime shared by every sema human client (TUI / web / desktop): sema wire frames (AgentEvent) -> CC session vocabulary (SDKMessage) with dual-plane output (transcript/chrome), deterministic transcript ids, lane discipline as a type, and the notification/dedup ledgers. Every CC-skin shape is collected here so the wire itself stays neutral. Renamed from @sema-agent/wire-cc-adapter (0.1.x).",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|