@sema-agent/client-core 0.65.0 → 0.65.1
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 +16 -0
- package/README.md +1 -1
- package/dist/adapt/panelTasks.d.ts +2 -2
- package/dist/adapt/panelTasks.js +20 -15
- package/dist/adapter/runStream.js +5 -1
- package/docs/INTEGRATION-CLIENTS.md +9 -2
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -49,6 +49,22 @@
|
|
|
49
49
|
> 挡住 ⇒ 本批把它机械化——④a0 对 `pending` 行**要求段头已是日期形**(`(未发布)` 直接红),阶段一
|
|
50
50
|
> commit 漏转在发布前就红,不再靠人记。
|
|
51
51
|
|
|
52
|
+
## 0.65.1(2026-09-11)
|
|
53
|
+
|
|
54
|
+
test [6961] 对 0.65.0 十件五路交叉验证全 PASS,对抗复审轨另抓两处带坐标的实现缺口(cli 亲核源码成立,两处都是 patch):
|
|
55
|
+
|
|
56
|
+
- **B-087 通知腿判重次序**(`adapt/panelTasks.ts` `settleFromNotification`):拆分时逐字保留了「先发 `panel_task{kind:'end'}`
|
|
57
|
+
再判重」的旧次序,判重只护着 if-started stop;B-074 让终态 tick 也能结 bg 行之后,`tick(completed) → task_notification`
|
|
58
|
+
这个顺序在面板上落**两条** end(反序只一条)。修=判重移到该腿唯一的 yield 之前,与 tick 腿 / 关卡腿同形;常驻账照清。
|
|
59
|
+
§30d G30-11 补注;门 `run-task-progress-terminal-projection` +B5a/B5b(两个到达顺序都恰一条)。
|
|
60
|
+
- **B-088 裸 `usageMissing` 帧静默**(`adapter/runStream.ts` turn_end 折叠点):`turn_usage` 发臂条件只认「数值
|
|
61
|
+
`outputTokens` ∨ 非空 `stopReason`」,判别位自己不算话 ⇒ core 真铸形(`run-harness-handlers.ts:491`,该轮零 usage
|
|
62
|
+
帧时无 `usage` 字段;core [6962] 证实)`{type:'turn_end', usageMissing:true}` 整条静默,G30-23 那一档在最诚实的帧上
|
|
63
|
+
反而拿不到 `_sema_usage_missing`。修=三者任一在场即发;三者皆缺席仍不发(F4 逐字不变)。§30e 情形表 +一行、
|
|
64
|
+
G30-24b;门 `run-assistant-arm-identity` +F5a–c。
|
|
65
|
+
- 消费方零改:新发的那条臂只带判别位,adapt `turnUsageArm` 以 `typeof outputTokens === 'number'` 开门 ⇒ no-op;
|
|
66
|
+
面板 end 少一条重复,端侧无需处置。
|
|
67
|
+
|
|
52
68
|
## 0.65.0(2026-09-11)
|
|
53
69
|
|
|
54
70
|
> 两半场同版:**① 投影臂族归层修**(B-071 / B-072 / B-073 / B-074 / L-215③)与
|
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.65.
|
|
38
|
+
**Version:** 0.65.1
|
|
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
|
|
@@ -12,8 +12,8 @@
|
|
|
12
12
|
*
|
|
13
13
|
* 🔴 拆分定案两条(矩阵 §3.2 #4/#6):
|
|
14
14
|
* ① `endedPanelTasks` 拆分前被 `settlePanelTasks` **和** task_notification 臂两处直写。
|
|
15
|
-
* 现在通知臂那半场收成 `settleFromNotification()`(clearResident +
|
|
16
|
-
*
|
|
15
|
+
* 现在通知臂那半场收成 `settleFromNotification()`(clearResident + endedPanelTasks 判重 +
|
|
16
|
+
* panel end + if-started stop 整段;0.65.1 起判重在 end 之前),通知臂只调一次 ⇒ 跨臂直写消失。
|
|
17
17
|
* ② `firedSubagentStartHookTaskIds` 的读者(通知臂)随之进了本模块内部 —— 通知臂**不再直读**
|
|
18
18
|
* 实例台账,那条跨模块读同批消失。
|
|
19
19
|
*
|
package/dist/adapt/panelTasks.js
CHANGED
|
@@ -163,31 +163,36 @@ export function createPanelTaskLedger(ctx, cards, inst) {
|
|
|
163
163
|
/**
|
|
164
164
|
* 通知臂(task_notification)那半场,整段收进来 —— 拆分前它在臂里直写 `endedPanelTasks`
|
|
165
165
|
* 与直读 `firedSubagentStartHookTaskIds`,是矩阵点名的两条跨模块面。
|
|
166
|
-
*
|
|
166
|
+
* 🔴 **判重在唯一的 yield 之前**(0.65.1 / B-087;test [6961] 对抗复审轨实抓):拆分时这里
|
|
167
|
+
* 「逐字保持」了拆分前的次序 —— 先发 end 行、再判重 —— 判重只护着 if-started stop,end
|
|
168
|
+
* 行本身无条件发。B-074 让终态 tick 也能结 bg 行之后,`tick(completed) → task_notification`
|
|
169
|
+
* 这个顺序就在面板上落**两条** end(反序只有一条,因为 tick 腿判重在前)。三条腿共用
|
|
170
|
+
* `endedPanelTasks` 的承诺(§30d G30-11)要在**每条腿**的 yield 之前成立;常驻账照清
|
|
171
|
+
* (清一次幂等,真终态权威性不变)。
|
|
167
172
|
*/
|
|
168
173
|
*settleFromNotification(taskId, isError) {
|
|
169
174
|
// #6 通知-settle 边(推送半场):session 常驻的 bg 子代行不再被 turn sweep 假结,
|
|
170
175
|
// 真终态在此落行(failed/killed ⇒ isError 真归因)。
|
|
171
176
|
clearEnginePanelTaskResident(taskId);
|
|
177
|
+
if (endedPanelTasks.has(taskId))
|
|
178
|
+
return;
|
|
179
|
+
endedPanelTasks.add(taskId);
|
|
172
180
|
yield chrome({
|
|
173
181
|
kind: 'panel_task',
|
|
174
182
|
laneProof: MAIN,
|
|
175
183
|
event: { kind: 'end', taskId, isError },
|
|
176
184
|
});
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
guard: 'if-started',
|
|
189
|
-
});
|
|
190
|
-
}
|
|
185
|
+
// SubagentStop 只对**真 fire 过 Start** 的子代(workflow runId / 外来 id 不配对乱 fire)。
|
|
186
|
+
// cli 同门 `firedSubagentStartHookTaskIds.has(taskId)` —— B4 前本臂无条件发 stop,
|
|
187
|
+
// 宿主若照 guard 注释自建台账才不会乱 fire;台账在库里就该库来判。
|
|
188
|
+
if (inst.hasFiredSubagentStart(taskId)) {
|
|
189
|
+
yield chrome({
|
|
190
|
+
kind: 'subagent_lifecycle',
|
|
191
|
+
laneProof: MAIN,
|
|
192
|
+
phase: 'stop',
|
|
193
|
+
taskId,
|
|
194
|
+
guard: 'if-started',
|
|
195
|
+
});
|
|
191
196
|
}
|
|
192
197
|
},
|
|
193
198
|
/**
|
|
@@ -403,7 +403,11 @@ async function* runStreamInner(events, ctx, handle = {}) {
|
|
|
403
403
|
// 旧条件让它整条静默 ⇒ 「这一轮为什么停」这条机读位在最需要它的那一刻(出错/中止)不见了。
|
|
404
404
|
// ⚠️ 旧消费者零影响:`outputTokens` 读不出时**整键不铸**,而 adapt 的 `turnUsageArm`
|
|
405
405
|
// 本来就以 `typeof m.outputTokens === 'number'` 开门 ⇒ 这种帧对它是 no-op。
|
|
406
|
-
|
|
406
|
+
// 🔴 0.65.1 / B-088(test [6961] 对抗复审轨实抓,core [6962] 证实真铸形 run-harness-handlers.ts:491):
|
|
407
|
+
// `usageMissing` 判别位**本身就是话**——core 该轮零 usage 帧时发裸 `{type:'turn_end',
|
|
408
|
+
// usageMissing:true}`(无 usage、无 stopReason),旧条件让它整条静默 ⇒ 最诚实的那一帧
|
|
409
|
+
// 反而丢了 `_sema_usage_missing`(G30-23)。三者任一在场即发;三者皆缺席仍不发(F4)。
|
|
410
|
+
if ((typeof outputTokens === 'number' || stopWord !== undefined || usageMissing) && !isSubFlow) {
|
|
407
411
|
// ── L-215③(0.65.0):assistant 行那两个**算不出来**的键的真值出口 ─────────────────
|
|
408
412
|
// `eventToSdkMessage` 的 `assistantArm` 刻意**不**在内容臂上铸 `usage` / `stop_reason`
|
|
409
413
|
// (帧序:内容臂先到、`turn_end` 后到 ⇒ 臂发出时引擎还没说这一轮花了多少;在那里铸只能
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
|
|
20
20
|
| 项 | 值 | 真源 |
|
|
21
21
|
|---|---|---|
|
|
22
|
-
| 本包 | `@sema-agent/client-core` **0.65.
|
|
22
|
+
| 本包 | `@sema-agent/client-core` **0.65.1**(本批发布版 = patch:内容批 6d04995,B-087 通知腿判重次序 + B-088 裸 `usageMissing` 帧发臂,test [6961] 对抗复审轨两处,零新键零 BREAKING;0.65.0 两半场十件见 §30a–§30n(🔴 0.65.0 有 BREAKING = 熔断族公面 clean-cut);`CHANGELOG.md` `## 0.65.1(2026-09-11)`;bump 与冻结账两阶段由发包批做) | `package.json` `version` |
|
|
23
23
|
| peer:wire 契约 | `@sema-agent/sdk` **>=8.4.0**(value-level,非 type-only;**0.60.0 抬版**,四条硬理由见 §24a 与 `scripts/run-sdk-floor-test.mjs` 的 `FLOOR` 注;上一次是 0.59.0 的 `>=8.3.0`)。🔴 支持窗同批收到 **engine ≥7.64.0**:sdk 8.4.0 与 7.63.0 及以前的 wire **不同窗** | `package.json` `peerDependencies` |
|
|
24
24
|
| peer:会话词汇表 | `@sema-agent/agent-types` **>=0.2.0**(type-only,零运行时) | 同上 |
|
|
25
25
|
| runtime dep | `diff` ^9.0.0(**唯一**一条;portability 门按**等值**钉死) | `package.json` `dependencies` |
|
|
@@ -5546,6 +5546,9 @@ running 拍**逐字节同形**,面板行只能等一次**防御 sweep**(而它
|
|
|
5546
5546
|
isError:false}` 恰一条);修前该行要等到关卡 sweep 或通知帧。
|
|
5547
5547
|
- **G30-10**:子代失败时该 end 的 `isError === true`。
|
|
5548
5548
|
- **G30-11**:同一 taskId 收到两拍终态(重放 / 双腿投递)⇒ `panel_task{kind:'end'}` 仍**恰一条**。
|
|
5549
|
+
🔴 **0.65.0 对「终态 tick → task_notification」这个顺序不成立**(test [6961] 对抗复审轨实抓;B-087):通知腿
|
|
5550
|
+
`settleFromNotification` 拆分时逐字保留了「先发 end 再判重」的旧次序,判重只护着 if-started stop。**0.65.1 起**
|
|
5551
|
+
判重移到该腿唯一的 yield 之前(与 tick 腿 / 关卡腿同形),两个到达顺序都恰一条;门 B5a/B5b 钉。
|
|
5549
5552
|
- **G30-12**(负控):一台**只发 running、不发终态 tick** 的旧引擎上,子代行的行为与修前逐字相同。
|
|
5550
5553
|
- **G30-13**(负控):workflow 子代即使带终态 `status`,前台面板**零事件**(lane 门仍在最前)。
|
|
5551
5554
|
|
|
@@ -5627,7 +5630,8 @@ settle 腿共用的 `endedPanelTasks` **只按 taskId 判重** ⇒ 第一代落
|
|
|
5627
5630
|
| `turn_end.usageMissing === true` | **不铸**镜像,改铸 `_sema_usage_missing: true` | 同行加 `usageMissing: true` |
|
|
5628
5631
|
| 真零账(没有 `usageMissing`) | 照铸镜像(全零),判别位不铸 | 不铸判别位 |
|
|
5629
5632
|
| `usage` 整体缺席但有 `stopReason` | 本臂**照发**(不带 `outputTokens` 键) | 不发(那条腿的 `usage` 是必填位) |
|
|
5630
|
-
|
|
|
5633
|
+
| 裸 `usageMissing: true`(无 `usage`、无 `stopReason`;core 真铸形,该轮零 usage 帧时无 `usage` 字段) | **0.65.1 起照发**:只带 `_sema_usage_missing: true`,三键(`outputTokens`/镜像/`_sema_stop_reason`)都不铸(0.65.0 整条静默 = B-088) | 不发(那条腿的 `usage` 是必填位) |
|
|
5634
|
+
| 三者(`usage`/`stopReason`/`usageMissing`)都缺席 | 不发(既有行为一字未动) | 不发 |
|
|
5631
5635
|
|
|
5632
5636
|
- **`usageMissing`**:core 的臂注逐字「Consumers must treat the missing usage as UNKNOWN — **not
|
|
5633
5637
|
zero**」,而它与 `usage` **可以同帧**。把它剥掉,这条新通道就会把「不知道」渲成一笔全零的**已知**
|
|
@@ -5654,6 +5658,9 @@ settle 腿共用的 `endedPanelTasks` **只按 taskId 判重** ⇒ 第一代落
|
|
|
5654
5658
|
而有 `_sema_usage_missing === true`;换成同形的**真零账**则相反(两档逐字可分)。
|
|
5655
5659
|
- **G30-24**:`turn_end{usageMissing:true, stopReason:"error"}` 产出恰一条 `turn_usage`,带
|
|
5656
5660
|
`_sema_stop_reason === "error"` 且**没有** `outputTokens` 键。
|
|
5661
|
+
- **G30-24b**(0.65.1 / B-088):裸 `turn_end{usageMissing:true}`(无 `usage`、无 `stopReason`)产出**恰一条**
|
|
5662
|
+
`turn_usage`,只带 `_sema_usage_missing === true`;`outputTokens` / `_sema_last_assistant_usage` / `_sema_stop_reason`
|
|
5663
|
+
三键都不在场。`turn_end{}`(三者皆缺席)仍不发。
|
|
5657
5664
|
- **G30-25**:一条 durable run 的每条 assistant 转录行都带 `message.id`/`message.model`;live 分段腿
|
|
5658
5665
|
上 `model` 来自宿主钉的值而 `id` **不出现**。
|
|
5659
5666
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sema-agent/client-core",
|
|
3
|
-
"version": "0.65.
|
|
3
|
+
"version": "0.65.1",
|
|
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",
|