@sema-agent/client-core 0.77.2 → 0.78.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 +29 -0
- package/README.md +2 -2
- package/dist/gateVocabulary.js +2 -0
- package/dist/hitl/persistedRulesWire.d.ts +10 -13
- package/dist/hitl/persistedRulesWire.js +62 -19
- package/dist/request/taskRequest.d.ts +1 -0
- package/dist/request/taskRequest.js +14 -0
- package/docs/INTEGRATION-CLIENTS.md +49 -5
- package/package.json +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -49,6 +49,35 @@
|
|
|
49
49
|
> 挡住 ⇒ 本批把它机械化——④a0 对 `pending` 行**要求段头已是日期形**(`(未发布)` 直接红),阶段一
|
|
50
50
|
> commit 漏转在发布前就红,不再靠人记。
|
|
51
51
|
|
|
52
|
+
## 0.78.0(2026-09-21)
|
|
53
|
+
|
|
54
|
+
> 主题:**peer sdk 地板抬到 11.x + 单步写口读回按活性判别 + 第十词专句 + 整只工具面卸载进车道表**(🔴 **minor**:peer 地板 `>=9.8.1` → **`>=11.0.1`**;单步写口结局联合**多一臂 `revoked`**、`RulesFacade.write` 转必填、三只自铸型改为 sdk 别名(型面 BREAKING 三处,编译器会报);公面运行期导出 **1143 不变**;wire 新键一枚 `excludeAllTools`(sdk 具名位进车道表))—— 抬地板(CC-106)· 单步写口 200 体按 `stillLive` 判别联合改读(CC-103)· `DeniedBy` 第十词 `read_boundary` 专句(CC-106 ④)· `excludeAllTools` 车道行。**成文改口段见 §82 82y,按表态制点名三端。**
|
|
55
|
+
|
|
56
|
+
### 🔴 BREAKING(型面)
|
|
57
|
+
|
|
58
|
+
- **peer `@sema-agent/sdk` 地板 `>=9.8.1` → `>=11.0.1`**(CC-106):11.x 声明 `DeniedBy` 第十词 `read_boundary`、`rules.write` 200 体按 `stillLive` 判别的联合、`RemovalLiveness` / `RuleWriteRequest` / `RuleWriteResult` / `RuleWriteBehavior` 包根导出、`TaskRequest.excludeAllTools`;本包按 11.0.1 编译,消费端实装已在 10.x / 11.x,9.8.1 失去物料见证。四处同批抬齐(package.json peer + devDep / lockfile 根包两处 / README / 接入文档 §0a),`run-sdk-floor-test.mjs` 的 `FLOOR` 与负控锚同批。装着 <11.0.1 的端:`gateDeniedByDetail('read_boundary')` 仍答专句(镜像表不依赖 sdk 运行期),但 `rules.write` 回体在 sdk 10.x 的型面上看不见 `stillLive`(编译期不报)—— 请同批抬 sdk,别混装。
|
|
59
|
+
- **`writePersistedRule` 结局联合 +1 臂 `{ status: 'revoked', wrote: 'persisted' | 'no_op', rev, message }`**(CC-103;server ≥7.92.2 起可达):写**落了**(`rev` 是真的)而读回它时一条并发撤销已先到 ⇒ 请求的收紧**现在不站着**。🔴 **不要重试**(那会把刚被人撤掉的收紧重新立起来 —— 正是它不能折进 `unknown` 的理由,那一臂的处置是顺序重发);处置只有一个:`listAllPersistedRules` 看现状。键集与其余四臂两两不相交(没有 `rule`:店里没有活行)。穷举式 `switch` 的端在这一臂上编译红,那就是通知。
|
|
60
|
+
- **`RulesFacade.write` 可选 → 必填**:peer 地板 ≥11.0.1 起 sdk 的 `rules` 资源自带这个动词,宿主从真 client 装配一定拼得出;运行期守卫与 `refused / client_too_old` 一格**保留**(注入的假件 / 比这条口老的宿主客户端仍可能没这个动词,「连发都没发」是确知的拒,不折 unknown)。自铸 facade 的测试假件补 `write`。
|
|
61
|
+
- **三只自铸型改为取自 sdk**:`PersistedRuleWriteRequest` = `RuleWriteRequest`、`PersistedRuleWriteWireResult` = `RuleWriteResult`(判别联合:`rule` 只住 `stillLive: "yes"` 支),`PersistedRuleWriteBehavior` 仍由运行期表派生并加编译期等值钉证明与 `RuleWriteBehavior` 是同一张。名字不变;请求体结构不变;回体型变宽(直接读 `facade.write()` 回体的端从此必须先判 `stillLive` 再读 `rule`,不判 = 编译错)。
|
|
62
|
+
|
|
63
|
+
### Added
|
|
64
|
+
|
|
65
|
+
- **`DeniedBy` 第十词 `read_boundary` 专句**(CC-106 ④):`GATE_DENIED_BY_WORDS` 十词(顺序同源 sdk 11.0.1),`gateDeniedByDetail('read_boundary')` = `denied by the read boundary`(读边界站拒:拒表路径命中的读在任何审批之前就被拦,或一次已批准的改写被重判到拒表行)。0.77.2 上这个词走「本版不认识这个层名」兜底句,从此走专句;兜底句仍只给本包不认识的词。
|
|
66
|
+
- **`PersistedRuleLiveness`**(= sdk `RemovalLiveness`,`yes` / `no` / `unknown`):撤销口 `stillLive` 与写口 200 体共用的活性三词以本包的名转口;端从此读包名(此前只能派生 sdk 的 `RuleRevokeResult['stillLive']` 或手抄三词)。
|
|
67
|
+
- **`excludeAllTools` 进请求装配车道表**(sdk 11.x 具名位;server ≥7.90.0 请求面):两条提交车道有座、live 门后;字面 `true` 单成员闭集 —— `true` 才 stamp,`false` 与缺席同义(不发、不进回执:server 只把 literal true 写上任务规格,`false` 是替引擎重申它自己的缺省),坏值(非布尔)构造期 `TypeError` 只报形状不回显值(收紧方向的声明不许被打字错误安静丢掉,与 `memoryCapture` 同律);读序也同律 —— 先于其余键读取并种进快照,排在后面的可执行属性改不掉已读的声明。🔴 与 `excludeTools` 两种语义刻意不折叠:`"*"` 是一个合法的工具名,两键同带各自生效。0.77.2 上这个键会被表外键判据以 `TypeError` 点名拒;从此有座。没接线的 server(≤7.89.x)对它 400 `request.body_shape` 并在 `unknownKeys` 里点名 —— 探测靠键闭集,没有能力位,本包不替它猜。
|
|
68
|
+
|
|
69
|
+
### Changed(判据)
|
|
70
|
+
|
|
71
|
+
- **单步写口 200 体读法**(CC-103):认证字段只凭回包**自有数据属性**一次性快照(`status` / `rev` / `stillLive` / `rule` 任一只在原型链上、或是访问器属性 ⇒ `malformed_result`;getter / Proxy trap 抛错 ⇒ `malformed_result` 而不是 reject;原型链上只有无关键照常读);先读 `stillLive` 再读 `rule` —— `"yes"` 走行窄化 + 身份三元组对账(与 0.77.x 同答);**缺席 = 老服务(≤7.92.1,那一代恒带 `rule`、不带这一格)按行在场读,不补默认值、不合成一个 `yes`**(证据是那一行,不是本包替旧服务说的词);`"no"` 却带 `rule`(两个判别位打架)/ `"unknown"`(本口契约上不可达)/ 表外词 / boolean 时代的 `true` `false` / 键在场读不出 ⇒ `unknown / malformed_result`(读不懂的 200 拒认,不折成 `persisted` 也不折成 `revoked`);`no-op` → `no_op` 的拼法归一收成一处,三臂共用。`unknown / indeterminate`(503 `state.rule_write_failed`)的注解收窄:≥7.92.2 起「写落了而读回时并发撤销先到」走 200 `stillLive: "no"`,不再折在 503 里。
|
|
72
|
+
- 词汇门 `run-gate-vocabulary-test.mjs` 成文改口:A1「上游九词」→ 十词、A5 十句互异、A6 加 `read_boundary` 逐字锚;上游联合解析器改走 TypeScript AST(具名 TypeAliasDeclaration → 字面量成员;逃生口 `(string & {})` 同一棵树判别):sdk 11.0.1 的真形是联合成员之间夹一段带 `;` 与引号串的注释,旧的 `[^;]*` 正则把十词读成八词、A1 假红;行尾注释里的 `;` / 字符串成员里的注释标记 / 注释里的假声明三形各一枚正控。
|
|
73
|
+
- 能力位处置台账门 `run-engine-caps-ledger-test.mjs` 补两行:`peerLane` / `permissionRulesWrite`(0.76.1 起本包已按结构读,sdk 11.x 型面到货 ⇒ 键集对账红,显式登记为 read;读点不变)。
|
|
74
|
+
- `run-sdk-floor-test.mjs` 字符串序正控随地板走:地板 major 进两位数后,原「10.0.0 判绿 ∧ major < 10」自己失去判别力;改为取「数值上高一个位数、字典序却排在地板之前」的版本判绿,并断言字典序确实判反。
|
|
75
|
+
|
|
76
|
+
### Gates
|
|
77
|
+
|
|
78
|
+
- `run-persisted-rule-write-test.mjs` → 319(新 W11 五组:yes 支同答 / no 支 `revoked` 三形 / 打架与表外十三形拒认 / 缺席按行读 / 三型取自 sdk 与 `write` 必填的型面钉)· `run-task-request-omission-receipt-test.mjs` 156 → 174(A6:`excludeAllTools` 两车道座位、非 live 回执、`false` 值级缺席、与 `excludeTools:["*"]` 不折叠、五种坏值响亮拒只报形状、`null` 合法缺席)· `run-client-core-pure-test.mjs` +5(W3b)· `run-gate-vocabulary-test.mjs` → 228(十词 + 解析器两枚正控)· `run-sdk-floor-test.mjs` 地板 11.0.1 · 负控:sdk-floor 锚 11.0.1 → 11.0.2;词汇门负控在 11.0.1 真形上仍于编译期先红。
|
|
79
|
+
- 撤销口假件的 `stillLive` 从 boolean 时代的 `false` 改三词 `'no'`(本包不读这一格,只为假件与 sdk 10.x+ 同形)。
|
|
80
|
+
|
|
52
81
|
## 0.77.2(2026-09-21)
|
|
53
82
|
|
|
54
83
|
> 主题:**出包面结构卫生 + 门词汇兜底句改口**(patch;型面零变、行为零变;制品面:dist 零注释)。
|
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.78.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
|
|
@@ -67,7 +67,7 @@ Renamed from **`@sema-agent/wire-cc-adapter`** (0.1.x, deprecated — see *Migra
|
|
|
67
67
|
against — the tables live upstream precisely so this package does not keep a second copy that can
|
|
68
68
|
fall behind. The browser bundle really bundles the SDK through (the portability guard would
|
|
69
69
|
exit 3 rather than quietly mark it external).
|
|
70
|
-
- The declared floor is `>=9.8.1`
|
|
70
|
+
- The declared floor is `>=11.0.1` (raised from `>=9.8.1` in 0.78.0: `DeniedBy` carries its tenth word `read_boundary`, `rules.write` answers a `stillLive`-discriminated body, `RemovalLiveness` / `RuleWriteRequest` / `RuleWriteResult` / `RuleWriteBehavior` are exported from the SDK root and `TaskRequest.excludeAllTools` is typed from 11.x on, the package now compiles against 11.0.1, and no consumer ships 9.8.x any more, so the older floor lost its witness; before that raised from `>=9.7.1` in 0.75.0: `Capabilities.deviceExecutor.management` is typed from 9.8.x on, the package now compiles against 9.8.1, and no consumer ships 9.7.x any more, so the older floor lost its witness; before that raised from `>=9.6.0` in 0.74.0: `Capabilities.approvalsStreamLive` / `.executionLane`, `LivePendingRow.frame`, the `live_*` approval-stream events and `gates[].toolCallId` are typed from 9.7.x on, and no consumer ships 9.6.0 any more, so the older floor lost its witness; before that raised from `>=9.4.0` in 0.71.0: the `tool_disclosure` / `tool_progress` frames and `ToolApprovalFrame.readRootCandidate` are typed there; earlier: raised from `>=8.8.0` in 0.69.0: the `reasoning_end` frame and `McpStatusPanel.lastLegMcp` are typed from 9.4.0 on), and it is *witnessed*: the guard checks that an actually
|
|
71
71
|
installed SDK at that line still exports every value-level symbol this package imports and still
|
|
72
72
|
declares `TaskStats.costMicroUsd` (the key `costOrNull` reads). A floor nobody ever ran is a
|
|
73
73
|
promise, not a contract.
|
package/dist/gateVocabulary.js
CHANGED
|
@@ -8,6 +8,7 @@ export const GATE_DENIED_BY_WORDS = Object.freeze([
|
|
|
8
8
|
'compliance',
|
|
9
9
|
'write_protection',
|
|
10
10
|
'ask_resolution',
|
|
11
|
+
'read_boundary',
|
|
11
12
|
]);
|
|
12
13
|
const DENIED_BY_SENTENCES = Object.freeze({
|
|
13
14
|
policy: "denied by this deployment's permission policy",
|
|
@@ -19,6 +20,7 @@ const DENIED_BY_SENTENCES = Object.freeze({
|
|
|
19
20
|
compliance: 'denied by a compliance lock',
|
|
20
21
|
write_protection: 'denied because the write landed on a write-protected path',
|
|
21
22
|
ask_resolution: 'denied when the approval was resolved',
|
|
23
|
+
read_boundary: 'denied by the read boundary',
|
|
22
24
|
});
|
|
23
25
|
export function gateDeniedByDetail(deniedBy) {
|
|
24
26
|
if (typeof deniedBy === 'string' && Object.hasOwn(DENIED_BY_SENTENCES, deniedBy)) {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { CcImportLayer, CcImportPrepareResult, CcImportRedeemResult, PersistedRule, RuleBehavior, RuleListParams, RuleListResult, RuleRevokeRequest, RuleRevokeResult } from '@sema-agent/sdk';
|
|
1
|
+
import type { CcImportLayer, CcImportPrepareResult, CcImportRedeemResult, PersistedRule, RuleBehavior, RuleListParams, RuleListResult, RuleRevokeRequest, RemovalLiveness, RuleRevokeResult, RuleWriteRequest, RuleWriteResult } from '@sema-agent/sdk';
|
|
2
2
|
export interface RulesFacade {
|
|
3
3
|
list(params?: RuleListParams, opts?: {
|
|
4
4
|
signal?: AbortSignal;
|
|
@@ -6,7 +6,7 @@ export interface RulesFacade {
|
|
|
6
6
|
revoke(input: RuleRevokeRequest, opts?: {
|
|
7
7
|
signal?: AbortSignal;
|
|
8
8
|
}): Promise<RuleRevokeResult>;
|
|
9
|
-
write
|
|
9
|
+
write(input: PersistedRuleWriteRequest, opts?: {
|
|
10
10
|
signal?: AbortSignal;
|
|
11
11
|
}): Promise<PersistedRuleWriteWireResult>;
|
|
12
12
|
ccImportPrepare(layers: CcImportLayer[], opts?: {
|
|
@@ -90,17 +90,9 @@ export declare function listAllPersistedRules(facade: RulesFacade, params?: Omit
|
|
|
90
90
|
declare const DIRECT_WRITE_EXCLUDED_BEHAVIOR = "allow";
|
|
91
91
|
export declare const PERSISTED_RULE_WRITE_BEHAVIORS: readonly Exclude<RuleBehavior, typeof DIRECT_WRITE_EXCLUDED_BEHAVIOR>[];
|
|
92
92
|
export type PersistedRuleWriteBehavior = (typeof PERSISTED_RULE_WRITE_BEHAVIORS)[number];
|
|
93
|
-
export
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
scope: string;
|
|
97
|
-
principal?: string;
|
|
98
|
-
}
|
|
99
|
-
export interface PersistedRuleWriteWireResult {
|
|
100
|
-
status: 'persisted' | 'no-op';
|
|
101
|
-
rev: number;
|
|
102
|
-
rule: PersistedRule;
|
|
103
|
-
}
|
|
93
|
+
export type PersistedRuleWriteRequest = RuleWriteRequest;
|
|
94
|
+
export type PersistedRuleWriteWireResult = RuleWriteResult;
|
|
95
|
+
export type PersistedRuleLiveness = RemovalLiveness;
|
|
104
96
|
export declare const PERSISTED_RULE_WRITE_REFUSAL_CAUSES: readonly ["unwritable_behavior", "unreadable_identity", "unusable_principal", "client_too_old", "field_refused", "body_shape", "operator_only", "store_absent", "lane_too_old", "route_absent"];
|
|
105
97
|
export type PersistedRuleWriteRefusalCause = (typeof PERSISTED_RULE_WRITE_REFUSAL_CAUSES)[number];
|
|
106
98
|
export declare const PERSISTED_RULE_WRITE_UNKNOWN_REASONS: readonly ["indeterminate", "malformed_result", "identity_mismatch", "unattributed_method_refusal", "unclassified"];
|
|
@@ -113,6 +105,11 @@ export type PersistedRuleWriteOutcome = {
|
|
|
113
105
|
status: 'no_op';
|
|
114
106
|
rev: number;
|
|
115
107
|
rule: PersistedRule;
|
|
108
|
+
} | {
|
|
109
|
+
status: 'revoked';
|
|
110
|
+
wrote: 'persisted' | 'no_op';
|
|
111
|
+
rev: number;
|
|
112
|
+
message: string;
|
|
116
113
|
} | {
|
|
117
114
|
status: 'refused';
|
|
118
115
|
cause: PersistedRuleWriteRefusalCause;
|
|
@@ -218,6 +218,8 @@ export async function listAllPersistedRules(facade, params = {}, opts) {
|
|
|
218
218
|
}
|
|
219
219
|
const DIRECT_WRITE_EXCLUDED_BEHAVIOR = 'allow';
|
|
220
220
|
export const PERSISTED_RULE_WRITE_BEHAVIORS = Object.freeze(PERSISTED_RULE_BEHAVIORS.filter((b) => b !== DIRECT_WRITE_EXCLUDED_BEHAVIOR));
|
|
221
|
+
const _writeBehaviorPin = true;
|
|
222
|
+
void _writeBehaviorPin;
|
|
221
223
|
const WRITE_BEHAVIOR_SET = new Set(PERSISTED_RULE_WRITE_BEHAVIORS);
|
|
222
224
|
function isPersistedRuleWriteBehavior(v) {
|
|
223
225
|
return typeof v === 'string' && WRITE_BEHAVIOR_SET.has(v);
|
|
@@ -264,6 +266,36 @@ function writeOutcomeFromFailure(failure) {
|
|
|
264
266
|
return { status: 'unknown', why: 'unclassified', message };
|
|
265
267
|
}
|
|
266
268
|
}
|
|
269
|
+
function certificationSnapshot(res) {
|
|
270
|
+
const KEYS = ['status', 'rev', 'stillLive', 'rule'];
|
|
271
|
+
const cells = new Map();
|
|
272
|
+
try {
|
|
273
|
+
for (const k of KEYS) {
|
|
274
|
+
const d = Object.getOwnPropertyDescriptor(res, k);
|
|
275
|
+
if (d === undefined) {
|
|
276
|
+
if (k in res)
|
|
277
|
+
return null;
|
|
278
|
+
cells.set(k, { has: false, value: undefined });
|
|
279
|
+
continue;
|
|
280
|
+
}
|
|
281
|
+
if (!Object.hasOwn(d, 'value'))
|
|
282
|
+
return null;
|
|
283
|
+
cells.set(k, { has: true, value: d.value });
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
catch {
|
|
287
|
+
return null;
|
|
288
|
+
}
|
|
289
|
+
const cell = (k) => cells.get(k) ?? { has: false, value: undefined };
|
|
290
|
+
return {
|
|
291
|
+
status: cell('status').value,
|
|
292
|
+
rev: cell('rev').value,
|
|
293
|
+
hasLiveness: cell('stillLive').has,
|
|
294
|
+
liveness: cell('stillLive').value,
|
|
295
|
+
hasRow: cell('rule').has,
|
|
296
|
+
row: cell('rule').value,
|
|
297
|
+
};
|
|
298
|
+
}
|
|
267
299
|
export async function writePersistedRule(facade, input, opts) {
|
|
268
300
|
const port = facade?.write;
|
|
269
301
|
if (typeof port !== 'function') {
|
|
@@ -317,21 +349,36 @@ export async function writePersistedRule(facade, input, opts) {
|
|
|
317
349
|
catch (e) {
|
|
318
350
|
return writeOutcomeFromFailure(classifyRulesFailure(e));
|
|
319
351
|
}
|
|
320
|
-
const
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
return
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
352
|
+
const malformed = () => ({
|
|
353
|
+
status: 'unknown',
|
|
354
|
+
why: 'malformed_result',
|
|
355
|
+
message: 'the rule write answered 2xx with a body this client cannot read (status, rev, liveness or the written row) — refusing to certify it as a standing rule; re-list the rules to reconcile',
|
|
356
|
+
});
|
|
357
|
+
if (res === null || typeof res !== 'object' || Array.isArray(res))
|
|
358
|
+
return malformed();
|
|
359
|
+
const snap = certificationSnapshot(res);
|
|
360
|
+
if (snap === null)
|
|
361
|
+
return malformed();
|
|
362
|
+
const { status, rev, hasLiveness, liveness, hasRow, row } = snap;
|
|
363
|
+
if ((status !== 'persisted' && status !== 'no-op') || typeof rev !== 'number' || !Number.isFinite(rev))
|
|
364
|
+
return malformed();
|
|
365
|
+
const wrote = status === 'persisted' ? 'persisted' : 'no_op';
|
|
366
|
+
if (hasLiveness) {
|
|
367
|
+
if (liveness === 'no') {
|
|
368
|
+
if (hasRow)
|
|
369
|
+
return malformed();
|
|
370
|
+
return {
|
|
371
|
+
status: 'revoked',
|
|
372
|
+
wrote,
|
|
373
|
+
rev,
|
|
374
|
+
message: 'the rule write landed (the revision is real) but a concurrent revoke arrived before it could be read back — the requested tightening is not standing; do not retry (that would re-create what was just revoked): list the rules to see the current state',
|
|
375
|
+
};
|
|
376
|
+
}
|
|
377
|
+
if (liveness !== 'yes')
|
|
378
|
+
return malformed();
|
|
334
379
|
}
|
|
380
|
+
if (!persistedRuleIdentityRowReadable(row))
|
|
381
|
+
return malformed();
|
|
335
382
|
const landed = row;
|
|
336
383
|
if (landed.behavior !== behavior || landed.rule !== rule || landed.scope !== scope) {
|
|
337
384
|
return {
|
|
@@ -340,11 +387,7 @@ export async function writePersistedRule(facade, input, opts) {
|
|
|
340
387
|
message: 'the rule write answered 2xx with a row whose identity triple is not the one that was sent — refusing to report the requested tightening as standing; re-list the rules to reconcile',
|
|
341
388
|
};
|
|
342
389
|
}
|
|
343
|
-
return {
|
|
344
|
-
status: status === 'persisted' ? 'persisted' : 'no_op',
|
|
345
|
-
rev,
|
|
346
|
-
rule: row,
|
|
347
|
-
};
|
|
390
|
+
return { status: wrote, rev, rule: row };
|
|
348
391
|
}
|
|
349
392
|
export function classifySkippedReason(reason) {
|
|
350
393
|
const text = typeof reason === 'string' ? reason : String(reason);
|
|
@@ -30,6 +30,7 @@ export const REQUEST_FIELD_MATRIX = [
|
|
|
30
30
|
{ field: 'maxCostUsd', lanes: ['print'], live: true, why: '花费上限声明(sdk `TaskRequest.maxCostUsd`,请求体**顶层**位;上游向下夹到部署上限 —— 只许要得更少)。与 `limits` 同一条理由只在无人值守车道:交互面由人随时中断。🔴 坏值(非数 / 非有限 / 非正)在本层**响亮拒**:上游对这一位的坏值是安静忽略并回落部署上限,不是 4xx(见 `refuseBadMaxCostUsd`)' },
|
|
31
31
|
{ field: 'attachmentIds', lanes: ['interactive'], live: true, why: '附件**字节通道**(uploadAttachment 回执 id;server ≥1.289 绑定会话并把文件物化进 run 的 attachments/)。有上传入口的端才有 id 可引用:web/desktop 有,壳走 images / 本地文件路径,`-p` 车道连 uploadAttachment 都没有 ⇒ print 缺席是**没有来源**,不是漏。🔴 与上面的 `attachments` 同名不同物(那是 turn 边界的配置键),两条永远不许合并' },
|
|
32
32
|
{ field: 'excludeTools', lanes: ['interactive', 'print'], live: true, why: 'design/161 W3(2026-07-30):真 wire 键(SDK types `excludeTools`)且早在 seatContract `START_SESSION_OPTION_KEYS` 里,却是 desktop 手写 taskReq 的第 9 键、矩阵外——而 stamp 门对未登记键**静默丢弃**,真实危险形=「用户显式排除的工具被静默放回」(权限方向回归,类型层不报)。今天只有 desktop 在发;壳的工具面走 roster/interactiveTools 另一条路。0.77.0 补 print 座(三问:① wire 位与车道无关 —— sdk 具名位、提交体真收 `body.excludeTools`;② 来源 —— print 今天没有排除入口,但这是**收紧方向**的声明,传了只进回执 = 端不读回执就把用户排除的工具放回;③ 口径 —— 仍是 live 门后的位,与交互面同一行)' },
|
|
33
|
+
{ field: 'excludeAllTools', lanes: ['interactive', 'print'], live: true, why: '0.78.0(sdk 11.x 具名位 `excludeAllTools`,server ≥7.90.0 请求面):整只工具面卸载 —— 调用方工具 / 脚手架 / 手 / MCP / A2A / skills 一个都不挂,终局必然纯文本(wire 上 `wiring_manifest.tools.count === 0`,整条流零 tool_start / tool_end / tool_disclosure)。与 excludeTools 是两种语义、刻意不折叠(`"*"` 是一个合法的工具名,「卸全部」不能写成 `excludeTools:["*"]`);两键同带各自生效。类型只收字面 `true`(server 只把 literal true 写上任务规格,`false` = 替引擎重申它自己的缺省 ⇒ 不发、与缺席同义、不进回执);坏值响亮拒(收紧方向的声明不许被打字错误安静丢掉)。两条车道都是提交面 ⇒ 都能声明。探测靠键闭集、没有能力位:没接线的 server(≤7.89.x)400 `request.body_shape` 并在 `unknownKeys` 里逐字点名,本层不替它猜;A2A 入站面不承载本键(零工具面走 skill 路由)' },
|
|
33
34
|
{ field: 'settings.ultracode', lanes: ['interactive'], live: true, why: 'design/111:sticky `/effort ultracode` 拨盘 + 当轮关键词嗅探,两个来源都只在交互面存在', gap: true },
|
|
34
35
|
{ field: 'systemPrompt', lanes: ['interactive', 'print'], live: false, why: '整段替换系统提示(sdk `TaskRequest.systemPrompt`;上游字符数超限 400 响亮拒,本层原样透传)。两条车道都有来源:交互面 = CC QueryParams.systemPrompt,无人值守面 = `--system-prompt[-file]` 一类旗。与追加位 `appendSystemPrompt` 不是一个位(那一位归 live 兜底层,见 `LIVE_DEFAULT_FIELDS`)' },
|
|
35
36
|
{ field: 'reasoningEffort', lanes: ['interactive', 'print'], live: false, why: '思考档位(sdk `TaskRequest.reasoningEffort` 七词闭集;上游对表外词 400 响亮拒 ⇒ 本层不预铸第二判官)。档位是请求级的位、与车道无关:交互面 = `/effort` 拨盘,无人值守面 = 档位旗。🔴 端交的必须是**档位词**:「思考 token 数」今天没有上游对位(见 `UPSTREAM_ABSENT_REQUEST_INTENTS` 的 `maxThinkingTokens`),别把一个数字折成档位词发出去' },
|
|
@@ -81,6 +82,7 @@ const INPUT_KEY_ROUTES = {
|
|
|
81
82
|
attachments: row('attachments'),
|
|
82
83
|
attachmentIds: row('attachmentIds'),
|
|
83
84
|
excludeTools: row('excludeTools'),
|
|
85
|
+
excludeAllTools: row('excludeAllTools'),
|
|
84
86
|
finalVerification: row('finalVerification'),
|
|
85
87
|
limits: row('limits'),
|
|
86
88
|
interactiveTools: row('interactiveTools'),
|
|
@@ -171,6 +173,7 @@ const VALUE_LEVEL_IN_PLAY = Object.freeze({
|
|
|
171
173
|
images: (v) => Array.isArray(v) && v.length > 0,
|
|
172
174
|
attachmentIds: (v) => Array.isArray(v) && v.length > 0,
|
|
173
175
|
excludeTools: (v) => Array.isArray(v) && v.length > 0,
|
|
176
|
+
excludeAllTools: (v) => v === true,
|
|
174
177
|
memoryCapture: (v) => v === 'off',
|
|
175
178
|
memory: (v) => v === 'off',
|
|
176
179
|
rewind: (v) => typeof v === 'object' && v !== null && rewindSubKeys().some((k) => hasOwn(v, k) && present(v[k])),
|
|
@@ -379,6 +382,13 @@ const refuseBadMemoryOff = (v) => {
|
|
|
379
382
|
'`"on"`,`{ enabled: false }` 对象形也不是 wire 拼法)且对坏拼写**响亮拒**(server 400 `request.field_invalid`)。' +
|
|
380
383
|
'本层若静默删键,这一次运行会照常挂上记忆面而声明人不会知道 —— 与 memoryCapture 同一条纪律。错误文本只报形状,不回显值。');
|
|
381
384
|
};
|
|
385
|
+
const refuseBadExcludeAllTools = (v) => {
|
|
386
|
+
if (v === undefined || v === null || v === true || v === false)
|
|
387
|
+
return;
|
|
388
|
+
throw new TypeError('buildTaskRequest: excludeAllTools 只接受字面量 `true`(`false` / 缺席 = 不卸载)—— ' +
|
|
389
|
+
`收到 ${coarseShape(v)}。这一位是**整只工具面卸载**的收紧声明:本层若把坏值静默删键,这一次运行会挂上声明人以为已经卸掉的全部工具。` +
|
|
390
|
+
'错误文本只报形状,不回显值。');
|
|
391
|
+
};
|
|
382
392
|
const refuseBadMemoryCapture = (v) => {
|
|
383
393
|
if (v === undefined || v === null)
|
|
384
394
|
return;
|
|
@@ -416,12 +426,14 @@ export function assembleTaskRequest(input, lane) {
|
|
|
416
426
|
const resolvedOpen = resolvedRoute.via === 'matrix' && omissionCauseOf(standingOf(resolvedRoute), lane, live) === undefined;
|
|
417
427
|
const resolvedWire = resolvedOpen ? resolvedSnapshotForWire(resolvedIn) : {};
|
|
418
428
|
const maxCostUsdIn = input.maxCostUsd;
|
|
429
|
+
const excludeAllToolsIn = input.excludeAllTools;
|
|
419
430
|
const INPUT_KEYS = Object.keys(INPUT_KEY_ROUTES);
|
|
420
431
|
const i = snapshotByName(input, INPUT_KEYS, {
|
|
421
432
|
live,
|
|
422
433
|
memoryCapture: memoryCaptureIn,
|
|
423
434
|
memory: memoryIn,
|
|
424
435
|
maxCostUsd: maxCostUsdIn,
|
|
436
|
+
excludeAllTools: excludeAllToolsIn,
|
|
425
437
|
settings: settingsIn,
|
|
426
438
|
});
|
|
427
439
|
const SETTINGS_KEYS = Object.keys(SETTINGS_KEY_ROUTES);
|
|
@@ -429,6 +441,7 @@ export function assembleTaskRequest(input, lane) {
|
|
|
429
441
|
refuseBadMemoryCapture(memoryCaptureIn);
|
|
430
442
|
refuseBadMemoryOff(memoryIn);
|
|
431
443
|
refuseBadMaxCostUsd(maxCostUsdIn);
|
|
444
|
+
refuseBadExcludeAllTools(excludeAllToolsIn);
|
|
432
445
|
const rewindRoute = INPUT_KEY_ROUTES.rewind;
|
|
433
446
|
const REWIND_KEYS = rewindRoute.via === 'matrix' ? rewindRoute.field.split('/') : [];
|
|
434
447
|
const rewindIn = i.rewind;
|
|
@@ -553,6 +566,7 @@ export function assembleTaskRequest(input, lane) {
|
|
|
553
566
|
...(on('lenses') ? { lenses: i.lenses } : {}),
|
|
554
567
|
...(on('attachmentIds') ? { attachmentIds: [...(i.attachmentIds ?? [])] } : {}),
|
|
555
568
|
...(on('excludeTools') ? { excludeTools: [...(i.excludeTools ?? [])] } : {}),
|
|
569
|
+
...(on('excludeAllTools') ? { excludeAllTools: true } : {}),
|
|
556
570
|
...(on('clientContext') ? { clientContext: i.clientContext } : {}),
|
|
557
571
|
...(on('scratchpadDir') ? { scratchpadDir: i.scratchpadDir } : {}),
|
|
558
572
|
...(on('finalVerification') ? { finalVerification: i.finalVerification } : {}),
|
|
@@ -19,8 +19,8 @@
|
|
|
19
19
|
|
|
20
20
|
| 项 | 值 | 真源 |
|
|
21
21
|
|---|---|---|
|
|
22
|
-
| 本包 | `@sema-agent/client-core` **0.
|
|
23
|
-
| peer:wire 契约 | `@sema-agent/sdk` **>=
|
|
22
|
+
| 本包 | `@sema-agent/client-core` **0.78.0**(本批发布版 = **minor**:peer sdk 地板 >=9.8.1 → >=11.0.1(CC-106)+ 单步写口 200 体按 stillLive 判别联合改读、第五臂 revoked、三型取自 sdk、RulesFacade.write 必填、PersistedRuleLiveness 转口(CC-103)+ DeniedBy 第十词 read_boundary 专句(CC-106 ④)+ excludeAllTools 车道行;型面 BREAKING 三处、行为面同 0.77.2;公面 1143;§82。上一版 0.77.2 = **patch**:出包面结构卫生 —— 构建期 removeComments,dist js / d.ts 零注释(新门 run-dist-comments-test.mjs + 卫生门词表 32 条 + 文档向前执法;CC-100)+ gateDeniedByDetail 表外词兜底句改「本版不认识这个层名」(CC-111 ①);行为 / 型面逐字节同 0.77.1;公面 1143;§81。上一版 0.77.1 = **patch**:外部验收三件回填 —— 读器族边界残留 projectMcpReconnectCapability 只认自有键(CC-107)/ rewind 四子键恰读一次(CC-108)/ 子代输出合并按回体 output.type · retrieval_status 定处置(CC-109,server ≥7.92.0 cursorSemantics 缺席面);型面 additive 一处;公面 1143;§80。上一版 0.77.0 = **minor**:请求装配逐键去向回执 + print 车道补座 + 表外键响亮拒(CC-101,四条行为 BREAKING)/ 会话策略写端口(CC-105)/ 持久规则单步写面(CC-103)/ workflow 子代面板行代际三向恢复(CC-104,零改码)/ 能力位读器族口径整族改齐 + 外部验收 F-A / F-B 处置 + 合并树异源复审两轮处置;公面 1143;§79。上一版 0.76.2 = **patch**:制品卫生 —— 清 dist 重 build 去掉两只已撤出源码的编译产物 + dist ⇄ src 对账门;零源码 / 零型面 / 零行为改动;公面 1122;§78。上一版 0.76.1 = **patch**:能力位读器工厂(CC-75)/ MCP 活性观察读口(CC-36)/ `capabilities.peerLane` · `permissionRulesWrite` 四态读口(CC-102)/ 记忆治理面两只读口 + 三只条目面回体读口(CC-97 a)/ 主车道证明逐次新建(CC-99)+ 修 0.76.0 的 F1 / F2(身份四键一次性快照只修了投影口一侧);公面 1122;§77。上一版 0.76.0 = **minor**:六票一批 —— `prompt_assembled` 投影臂 / 审批 feed 三态(**型面 BREAKING**)/ `ApprovalResolution` 单源联合 / 记忆 spec 读口 / 终态词表上游钉 / `tasks_expand` 退役(**型面 BREAKING**),外加身份四键一次性快照(跨全部内部臂);公面 1081;§76。上一版 0.75.1 = **patch**:面板短命子代反序缓行放不出的残洞(外部复验 D1)+ 同代 running 帧三向定形(B4)+ #969 提货 `spawnName` 透传与 `agentType` 改读诚实来源(CC-95);§75。上一版 0.75.0 = **minor**:压缩的非 compacted 结局上 chrome 面 `compaction_outcome`(新内部臂 —— 自建 print 出口的端先表态)+ peer sdk 地板 `>=9.8.1`;型面 additive(ChromeEvent +1 臂)、公面 1065、零 wire 新键;§74。上一版 0.74.5 = **patch**:core 7.24.0 提货 `_sema_freed_tokens?` + 首见即终态的行零事件(幽灵完成行)+ `isNewEngineAgentPanelCycle` / `approvalOutcomeNoteOf` 上公面;型面 additive、公面 1065、peer 不动;§73。上一版 0.74.4 = **patch**:面板键「先发布的键为准」(tick 归不了一的三序不再两行)+ 前代 UUID 迟到 tick 丢弃 + `readRunCancelContext` 下钻收紧;型面 additive、公面 1061、peer 不动;§72。上一版 0.74.3 = **patch**:面板子代身份归一(tick / end 的 UUID 归到 fleet 尾段,宿主零改)+ run 记录 `cancelContext` 读口与成因四词 + workflow 行 `errorCode` + reopen 第二臂两件;型面纯 additive、公面 1061、peer 不动;§71。上一版 0.74.2 = **patch**:`capabilities.deviceExecutor.management` 四态读口(缺席 ≠ false;`deviceExecutor: false` = 车道缺席;管理动词可用性三态归包);公面 1052;§70。上一版 0.74.1 = **patch**:审批卡无决断收口 + 结局回交;§69。上一版 0.74.0 = **minor**:peer sdk 地板 >=9.7.1 + covers 过境 + 面板周期身份 + 离场读口;§68。上一版 0.73.5 = **patch**:workflow 规模告警判定上收进包(`evaluateWorkflowSize` 三态:未知的规模不当作规模正常;分母口径与帽优先级单源;env 读口纯函数);型面纯 additive、公面 1044、peer 不动;§67。上一版 0.73.4 = **patch**:终帧 `permission_denials` 第三键 ⇐ 同一条流 `tool_start` 入参按 `toolCallId` join(三道闸;join 不上留 sema 载体;🔴 更正 0.73.2「自动升级收口」一句)+ 审批 feed push 侧取件失败的欠账退避重试;型面纯 additive、公面 1033、peer 不动;§66。上一版 0.73.3 = **patch**:CC-61 sdk 9.7.1 提货 + `capabilities.approvalsStreamLive` 四态读口(缺席 = 判不出;`livePendingNeedsReconcile` 只在引擎明说会推时才让对账节拍降兜底)+ CC-60 五条模型面文案锚包侧半场(cursorSemantics 机读位 / result 行注记 / bash 首行两变体与良性槽 / 通知 seed 并集 / parked 臂);型面纯 additive、公面 1032、peer 不动;§65。上一版 0.73.2 = **patch**:CC-59 悬挂 ask 全卡 —— `livePending[].frame`(server ≥7.87.0)两道闸窄读进视图,在场即走流内帧腿同一条路(入参可见、改写可转发),缺席保持盲卡;CC-34 收口(引擎半场随 7.87.0 到货,判据交黑盒);型面纯 additive、公面 1026、peer 不动;§64。上一版 0.73.1 = **patch**:CC-57 `decidePlanReview` outcome 尾句按「决断有没有生效」四态选(单铸点 `planReviewOutcomeTail`;此前本地拒发仍让模型汇报已拒绝)+ CC-56 cancel 的 409 按机器码分家(`cancelConflictFromError` 三形 / 新安全码 `cancel_run_not_running`)与提交面 429 用量窗读口 + 人话;型面纯 additive、公面 1026、peer 不动;§63。上一版 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
|
+
| peer:wire 契约 | `@sema-agent/sdk` **>=11.0.1**(value-level,非 type-only;**0.78.0 抬版**:11.x 声明 `DeniedBy` 第十词 `read_boundary`、`rules.write` 200 体按 `stillLive` 判别联合、`RemovalLiveness` / `RuleWriteRequest` / `RuleWriteResult` / `RuleWriteBehavior` 包根导出、`TaskRequest.excludeAllTools`,本包按 11.0.1 编译,9.8.1 失去物料见证;**0.75.0 曾抬到 >=9.8.1**:9.8.x 声明 `Capabilities.deviceExecutor.management?`,9.7.1 失去物料见证;**0.74.0 曾抬到 >=9.7.1**:9.7.x 追平的六处型面是本包 0.73.3 起的编译基线,且 9.6.0 失去物料见证;**0.71.0 曾抬到 >=9.6.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
26
|
| 公开导出面 | **1143** 个运行期符号(+ **56 个测试钩,两种拼法**:32 个 `__*ForTests` + 24 个 `_*ForTest` —— 两种都在 `public-export-baseline.json` 的 `testHookNames` 里、各自受棘轮管,**不在** `names` 的 1081 里。运行期 `Object.keys(dist/index.js)` 的全量 = 1143 + 56 = **1199**;只剔双下划线那 27 个会多数出 24 个来,那不是棘轮盲区;= 下一版(未发布)的值:相对 0.75.1 **+16**,两票合计 —— **CC-77 ①** 审批决断结局单源判别联合 6 件:`approvalResolutionOf` / `isApprovalDecided` / `approvalNotSentCause` / `approvalUnsettledCause` + 两张 cause 词表 `APPROVAL_NOT_SENT_CAUSES` / `APPROVAL_UNSETTLED_CAUSES`(域 3);**CC-96** 记忆 spec 读面 10 件:`readAgentMemorySpec` / `unknownMemorySpecKeys` / `unknownMemorySpecKeysNote` / `memoryConfigRefusalNoteOf` / `KNOWN_AGENT_MEMORY_SPEC_KEYS` / `PENDING_MEMORY_SPEC_KEYS` / `MAX_UNKNOWN_MEMORY_SPEC_KEYS` / `CONFIG_MEMORY_PROJECT_KEY_SPELLING` / `CONFIG_MEMORY_WRITE_SCOPE_MISMATCH` + 判别形型(域 6 / 16)。CC-89 / CC-91 / CC-92 / CC-98 四票**零值导出增减**(新臂走 `ChromeEvent` 联合与内部臂表,`tasks_expand` 退役删的是联合成员不是导出名);1065 = 0.74.5 / 0.75.0 / 0.75.1 的值:相对 0.74.4 +4 —— `isNewEngineAgentPanelCycle`(CC-87,域 4)+ `approvalOutcomeNoteOf` 与两句固定文案常量(CC-88,域 3);1065 = 0.74.5 / 0.75.0 的值:相对 0.74.4 +4 —— `isNewEngineAgentPanelCycle`(CC-87,域 4)+ `approvalOutcomeNoteOf` 与两句固定文案常量(CC-88,域 3);1061 = 0.74.3 / 0.74.4 的值:相对 0.74.2 +9 —— CC-70 / CC-71 / CC-72 / CC-73 八件 + CC-80 `lastFlagValue`,见 §2b 域 3 / 4 / 10 / 15;1052 = 0.74.2 的值:相对 0.74.1 +6 —— CC-69 六件,见 §2b 域 9;1046 = 0.74.1 的值:相对 0.74.0 +1 —— `RETRACTED_CARD_DECISION_KIND`,见 §2b 域 3;1045 = 0.74.0 的值:相对 0.73.5 +1 —— `isStaleEngineAgentPanelEnd`,见 §2b 域 4;1044 = 0.73.5 的值:相对 0.73.4 +11 —— CC-58 规模告警十一件,名单见 §2b 域 12;1033 = 0.73.4 的值:相对 0.73.3 +1 —— `TOOL_INPUT_JOIN_MAX_CALLS`,见 §2b 域 1;1032 = 0.73.3 的值:相对 0.73.2 +6 —— CC-61 六件,名单见 §2b 域 9;1026 = 0.73.2 的值(导出名零增减);= 0.73.1 的值:相对 0.73.0 +7 —— CC-56 六件 / CC-57 一件,名单见 §2b 域 3 / 15;1019 = 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` —— **别手抄进别处,以该文件为准** |
|
|
@@ -4521,14 +4521,15 @@ ENGINE_IDENTITY_ANCHORS: readonly ['startedAt', 'instanceId', 'pid']
|
|
|
4521
4521
|
### 27e. ④ 门词汇两张表 +2 与唯一措辞铸点
|
|
4522
4522
|
|
|
4523
4523
|
core 7.9.0 各加一词:`DeniedBy` **+`persisted_rule`**(这个人自己名下的常驻 `deny` 行拒的;它是
|
|
4524
|
-
`org` 的**个人店同胞** —— 同属「可以否掉一次人已给过的批准」的复查层)⇒ **九词**;
|
|
4524
|
+
`org` 的**个人店同胞** —— 同属「可以否掉一次人已给过的批准」的复查层)⇒ **九词**;core 7.25.0 / sdk 11.0.1 再加
|
|
4525
|
+
`read_boundary`(读边界站拒;本包 0.78.0 起十词,专句见 §82)⇒ **十词**;
|
|
4525
4526
|
`AskOrigin` **+`rule_store_unavailable`**(规则店这次读不出来 ⇒ deny/ask 行执行不了 ⇒ fail-closed
|
|
4526
4527
|
转人问;`org_unavailable` 的个人店同胞)⇒ **十一词**。
|
|
4527
4528
|
|
|
4528
4529
|
**签名**
|
|
4529
4530
|
|
|
4530
4531
|
```ts
|
|
4531
|
-
GATE_DENIED_BY_WORDS: readonly DeniedBy[] //
|
|
4532
|
+
GATE_DENIED_BY_WORDS: readonly DeniedBy[] // 10 词,顺序同源(0.78.0 起;sdk 11.0.1)
|
|
4532
4533
|
gateDeniedByDetail(deniedBy: unknown): string
|
|
4533
4534
|
ASK_ORIGIN_WORDS: readonly string[] // 11 词,顺序同源
|
|
4534
4535
|
askOriginDetail(origin: unknown): string
|
|
@@ -4784,7 +4785,7 @@ core 双向对账)。**候上游导出即整只退役改成从 sdk 取**。
|
|
|
4784
4785
|
| ① | `doctor` 的 Permissions 段加**三行**:`postureKnobDetail(view.durableApproval, {reachable, knob:'durableApproval'})` / 同形的 `streamAskWindowMs` / `sessionAutoTitle`;`reachable` 由壳自己那次 operator 探测的结果给 —— 🆕 0.63.1 起**不必**为打不通而先把 view 清空,旧 view + `reachable:false` 直接渲「未观测」(`!reachable` 先判)。🔴 分类读一律走 `postureKnobSourceOf()`,**别直读** `.source` | 诊断面同左;无 operator 权限的部署上这一面整段不渲(端点本身 operator-gated) |
|
|
4785
4786
|
| ② | `/permissions` 治理表加「态」一列 = `persistedRuleBehaviorLabel(row)`;撤销按钮改经 `revokeTargetFromPersistedRule(row)` —— **铸不出体就把那一行的撤销入口藏掉**(别退化成两元组撤销) | 同左 |
|
|
4786
4787
|
| ③ | 三条 uplift 锚 `*-startedat-*`:①引擎 spawn 后的首探记下 `engineIdentityOf(health)`;②重连 / 定期心跳时 `engineIdentityVerdict(prev, now)`,`changed` ⇒ 走既有的 `engineReplacedGate`;③`unknown` **不许**走「没换」那条臂(它要么再探一次、要么按最坏情况重握手) | 同左;web 端没有 spawn 半场,只有 ②③ |
|
|
4787
|
-
| ④ | 门记录那一行:`gateDeniedByDetail(gateDeniedBy(g))`(
|
|
4788
|
+
| ④ | 门记录那一行:`gateDeniedByDetail(gateDeniedBy(g))`(十词,0.78.0 起);审批卡的出身行:`askOriginDetail(frame.origin)`(十一词)。壳侧同族自拼句子一律退役 | 同左 |
|
|
4788
4789
|
| ⑤ | `/permissions` 的规则报错行:`permissionRuleIssueDetail(issue.code, issue.message)`。🆕 0.63.1:表外码**整只**进那一句(不再封 60 字符),端的行渲染要给它留得下换行/截断的余地 —— 🔴 别在端上再截一刀,那等于把这次修的病搬到端里 | 同左 |
|
|
4789
4790
|
| ⑥ | `wiring_manifest` 帧到达时 `projectToolRoster(manifest)`;**在场**则自报面与工具卡 shim 走 `toolRosterNames()` / `toolShimFromRoster()`,**缺席**才回落 `liveInitToolFace` 三表。`tool_roster_delta` 帧走 `applyToolRosterDelta()`,`skew` 时**记一次偏斜并按快照重同步**(别拿 summary 算位置) | 同左 |
|
|
4790
4791
|
| ⑦ | `engine_notice` 呈现闸改按 `engineNoticeInCatalog(code)`;投递面按 `noticeAudienceOf(code)` 分流(`user` 上屏 / `operator` 落运维面)。🆕 **0.64.2 补一条允许形**:**单人本机端**(cli 这类「起引擎的人 = 看屏的人」的部署形)可以**不做这次分流**,把 `operator` 受众的码**渲成通用行**并把 audience 读数落进诊断留痕 —— 前提是这条选择**登记在案**(壳侧顶注 `sema-cli/src/sema/engineNoticeCodes.ts` 与本行互引),而不是没读文档。理由:这一端没有第二块屏,分流的净效果是把一批**正文里就写着用户该敲哪个 env** 的治理事实整段静音,那比不分流更坏。🔴 允许的是**渲通用行**,不是**不登记**:码册内的码一个都不许悄悄消失;确实不渲的码要进端自己的**明拒表**(一条写下来的决定),好让「有意不渲」与「漏登记」在机器上可分辨。要真分流,先有第二块面(operator 面板 /诊断出口)再做,那是另一批。多用户 / 有独立运维面的端(web-admin 一类)**照旧按 audience 分流**。壳自己的 `CORE_ENGINE_NOTICE_CODES` / `PENDING_ENGINE_NOTICE_CODES` 两表**可以退役成一张「明拒表」**(本包这张是上游码册的机械镜像,壳只需保留它**刻意不渲**的那几个码)。🔴 `mcp.injection_dropped` 的转录**直接用 `message`**,别自拼 | 同左 |
|
|
@@ -9598,6 +9599,49 @@ installCoreValuePorts({ resolveAutonomousLoopPrompt, loosenReasons, combinePolic
|
|
|
9598
9599
|
|
|
9599
9600
|
**包侧缺口:** ① 出包面注释存量(别仓名 / 票号 / 帖号 / 过程词)与卫生门判据太窄(CC-100)—— 方案候拍板(dist 去注释 vs 手清),0.77.2 · ② `DeniedBy` 第十词 `read_boundary` / `teamName` / `stillLive` 三词随 sdk 10 型面在 0.78.0 吸收(CC-106)· ③ `capabilities.mcpProbe` 候 core 7.26.0 #951 → server 7.93.0(CC-74)。
|
|
9600
9601
|
|
|
9602
|
+
## §82 🆕 0.78.0 peer sdk 地板 >=11.0.1 + 单步写口读回按活性判别 + 第十词专句 + excludeAllTools 进表;minor(型面 BREAKING 三处)
|
|
9603
|
+
|
|
9604
|
+
> **minor**:peer `@sema-agent/sdk` 地板 `>=9.8.1` → **`>=11.0.1`**(四处同批);公面运行期导出 **1143 不变**;wire 新键一枚(`excludeAllTools`,sdk 具名位);型面 BREAKING 三处 —— `writePersistedRule` 结局联合 +1 臂 `revoked`、`RulesFacade.write` 转必填、`PersistedRuleWriteWireResult` 变成 sdk 的判别联合(`rule` 只住 `stillLive: "yes"` 支)。按表态制点名三端(48h 三选一)。
|
|
9605
|
+
|
|
9606
|
+
### 82a. 处置表
|
|
9607
|
+
|
|
9608
|
+
| # | 面 | 本包做了什么 | 端要做什么 |
|
|
9609
|
+
|---|---|---|---|
|
|
9610
|
+
| S-0 🔴 **peer** | `@sema-agent/sdk` 地板 `>=9.8.1` → `>=11.0.1`(CC-106) | 四处同批抬齐(package.json peer + devDep / lockfile 根包两处 / README / 本表);本包按 11.0.1 编译 | 换钉 `^0.78.0` 的端把自己的 sdk 钉抬到 ≥11.0.1;<11.0.1 装本版只收 peer 警告,但 `rules.write` 回体在老 sdk 型面上看不见 `stillLive`(编译期不报)—— 别混装 |
|
|
9611
|
+
| S-1 🔴 **BREAKING(型面)** | `writePersistedRule` 结局联合(CC-103) | **added 臂** `{ status: 'revoked', wrote: 'persisted' \| 'no_op', rev, message }`:写落了、读回时并发撤销已先到 ⇒ 收紧现在不站着;键集与其余四臂不相交 | 穷举 `switch` 加一臂:渲「写落了但已被并发撤销,现状请列举」;🔴 **不要重试**(重试会把刚被撤的收紧重新立起来);`message` 可直接渲;老 server(≤7.92.1)上这一臂不可达,那一形仍是 `unknown / indeterminate` |
|
|
9612
|
+
| S-2 🔴 **BREAKING(型面)** | `RulesFacade.write` | **changed**:可选 → 必填;运行期守卫与 `refused / client_too_old` 保留 | 用真 client 装配的端零改(sdk ≥11.0.1 自带 `rules.write`);自铸 facade 的测试假件补 `write` 方法 |
|
|
9613
|
+
| S-3 🔴 **BREAKING(型面)** | `PersistedRuleWriteRequest` / `PersistedRuleWriteWireResult` / `PersistedRuleWriteBehavior` | **changed(取型)**:前两只 = sdk `RuleWriteRequest` / `RuleWriteResult` 别名;第三只仍由运行期表派生,编译期钉证明 ≡ sdk `RuleWriteBehavior` | 零改名;请求体结构不变;直接读 `facade.write()` 回体的端(不经 `writePersistedRule`)从此必须先判 `stillLive` 再读 `rule`(不判 = 编译错) |
|
|
9614
|
+
| S-4 | `gateDeniedByDetail` / `GATE_DENIED_BY_WORDS`(CC-106 ④) | **added**:第十词 `read_boundary` + 专句 `denied by the read boundary` | 零改;快照测试钉着 0.77.2 兜底句形的按新句改;壳侧自拼句子一律退役(仍以本包为准) |
|
|
9615
|
+
| S-5 | 请求装配 `excludeAllTools`(sdk 11.x 具名位;server ≥7.90.0 请求面) | **added 车道行**:interactive + print,live 门后;字面 `true` 才 stamp;`false` = 缺席(不发、不进回执);坏值 `TypeError` 只报形状;与 `excludeTools` 不折叠 | 要「整只工具面卸载」的端从此走 `assembleTaskRequest({ …, excludeAllTools: true })`,壳侧手拼的这一键归包;没接线的 server(≤7.89.x)对它 400 `request.body_shape` 并在 `unknownKeys` 点名,那是探测路,按 400 处置 |
|
|
9616
|
+
| S-7 | `PersistedRuleLiveness`(= sdk `RemovalLiveness`) | **added(取型转口)**:撤销口 `stillLive` 与写口共用的活性三词 `yes` / `no` / `unknown` 以本包的名导出 | 派生 sdk `RuleRevokeResult['stillLive']` 或手抄三词的端改读本包的名;`unknown` 绝不渲成「已删」 |
|
|
9617
|
+
| S-6 | 单步写口 200 体读法(CC-103) | **changed(判据)**:先 `stillLive` 后 `rule`;缺席按行在场读不合成词;两个判别位打架 / `unknown` / 表外词 / boolean 时代值 ⇒ `unknown / malformed_result` | 零改;验收判据见 82c |
|
|
9618
|
+
|
|
9619
|
+
### 82b. 缺席语义(逐键)
|
|
9620
|
+
|
|
9621
|
+
- `stillLive` 缺席(server ≤7.92.1):**不是** `no`、也**不合成** `yes` —— 本包按 `rule` 行在场 + 身份三元组对账读成 `persisted` / `no_op`(结果对象上没有 `stillLive` 键);缺席且无行 ⇒ `unknown / malformed_result`。
|
|
9622
|
+
- `stillLive: "no"`:`rule` 键**不存在**(不是在场但空);本包出 `revoked` 臂,不带 `rule`。`"no"` 却带 `rule` = 两个判别位打架 ⇒ `malformed_result`。
|
|
9623
|
+
- `stillLive: "unknown"`:本口契约上不可达(读回读不出来一律 5xx `state.rule_write_failed` ⇒ `unknown / indeterminate`);200 上出现 ⇒ `malformed_result`。
|
|
9624
|
+
- `deniedBy: "read_boundary"`:专句;表外词兜底句(§81)从此只给本包不认识的词。
|
|
9625
|
+
- `excludeAllTools`:`true` 上 wire;`false` / 缺席 / `null` = 不卸载(不发、不进回执);非布尔 ⇒ 构造期 `TypeError`(只报形状不回显值)。
|
|
9626
|
+
- `RulesFacade.write` 运行期缺席(假件 / 老客户端):`refused / client_too_old`,零往返,与 0.77.x 同。
|
|
9627
|
+
|
|
9628
|
+
### 82c. 黑盒判据骨架
|
|
9629
|
+
|
|
9630
|
+
- **G1(`revoked` 臂)**:假件回 `{ status: 'persisted', rev: 7, stillLive: 'no' }` ⇒ `writePersistedRule` 答 `{ status: 'revoked', wrote: 'persisted', rev: 7, message }`,无 `rule` / `why` / `cause` / `stillLive`;`status: 'no-op'` 同形 ⇒ `wrote: 'no_op'`;`rev: 0` 仍 `revoked`(假值陷阱);`message` 含 `do not retry` 与 `list the rules`。0.77.2 上同一输入答 `unknown / malformed_result`。
|
|
9631
|
+
- **G2(缺席 = 老服务)**:`{ status: 'persisted', rev: 5, rule: <行> }`(无 `stillLive`)⇒ `persisted`,结果对象**没有** `stillLive` 键;去掉 `rule` ⇒ `unknown / malformed_result`;`stillLive: 'yes'` + 兄弟态的行 ⇒ `unknown / identity_mismatch`(判别位不替身份对账代言)。
|
|
9632
|
+
- **G3(打架 / 表外 / 继承)**:`stillLive: 'no'` + `rule` / `'unknown'` / `'YES'` / `true` / `false` / `null` / `''` / 键在场但 `undefined` / `'yes'` 却无 `rule` ⇒ 一律 `unknown / malformed_result`,不带 `rev` / `rule` / `wrote`;`status` / `rev` / `stillLive` / `rule` 任一只在原型链上(`Object.create({ stillLive: 'no' })` 配自有其余)或是访问器属性(自有 `status` getter 在读取时删掉 `stillLive`)⇒ 同样 `malformed_result`;getter / Proxy trap 抛错 ⇒ `malformed_result` 而不是 reject(认证字段只凭自有数据属性一次性快照;原型链上只有无关键的对象照常读)。
|
|
9633
|
+
- **G4(第十词)**:`gateDeniedByDetail('read_boundary') === 'denied by the read boundary'`;`GATE_DENIED_BY_WORDS.length === 10` 且顺序 = sdk 11.0.1 `DeniedBy` 联合顺序(`read_boundary` 末位);`gateDeniedByDetail('brand_new_layer')` 仍是兜底句(含 `does not know this layer name`)。
|
|
9634
|
+
- **G5(`excludeAllTools`)**:`buildTaskRequest({ objective, sessionId, live: true, excludeAllTools: true }, lane).excludeAllTools === true`(两条车道);入参上 `objective` 的 getter 事后把它改成 `false` ⇒ 请求体仍带 `true`(声明先于其余键读取,与 `memoryCapture` 同一条读序);`false` ⇒ 键缺席且 `assembleTaskRequest(...).omitted` 无此键;`live: false` ⇒ 键缺席且回执 `not_live`;`'true'` / `1` / `'yes'` / `{}` / `[]` ⇒ `TypeError` 且文本含 `excludeAllTools` 不含值;`excludeTools: ['*']` 单独传 ⇒ 不长出 `excludeAllTools`,两键同传各自在场。0.77.2 上 `excludeAllTools: true` 被表外键判据以 `TypeError` 拒。
|
|
9635
|
+
- **G6(地板)**:`package.json` `peerDependencies['@sema-agent/sdk'] === '>=11.0.1'`,lockfile 根包同值;实装 sdk ≥11.0.1 时 `run-sdk-floor-test.mjs` 绿,`node_modules/@sema-agent/sdk/dist/types.d.ts` 的 `DeniedBy` 解出十词。
|
|
9636
|
+
|
|
9637
|
+
### 82y. 🔴 三端升级必读(固定段式,[C295])+ 成文改口
|
|
9638
|
+
|
|
9639
|
+
1. **换钉 `^0.78.0` 之前**:先把 sdk 钉抬到 `^11.0.1`(server ≥7.92.2 才发 `stillLive`,老 server 照旧可用);穷举 `writePersistedRule` 结局的 `switch` 加 `revoked` 臂;自铸 `RulesFacade` 假件补 `write`。
|
|
9640
|
+
2. **零改的面**:§79–§81 全部内容原样适用;`persisted` / `no_op` / `refused` / `unknown` 四臂的键集与语义一字不变;`GATE_DENIED_BY_WORDS` 前九词顺序不变;公面运行期导出 1143 不变。
|
|
9641
|
+
3. **成文改口(旧判据眼作废 → 新判据眼)**:① 「`writePersistedRule` 四臂」作废 → 五臂(`revoked` 只在 server ≥7.92.2 可达;老 server 上那一形仍走 503 ⇒ `unknown / indeterminate`);② 「`read_boundary` 走兜底句」作废 → 专句;③ 「`excludeAllTools` 是表外键 ⇒ `TypeError`」作废 → 有座(坏值仍 `TypeError`,但文本点名的是值形不是键名);④ 词汇门「上游九词」作废 → 十词;⑤ `RulesFacade.write` 可选 → 必填(运行期缺席语义不变);⑥ `malformed_result` 的话多提一个量(liveness),按前缀匹配的端不受影响。
|
|
9642
|
+
|
|
9643
|
+
**包侧缺口:** ① CC-106 ② `subagent_lifecycle.agentType` / ③ TaskOutput `details.replay`:sdk 11.0.1 仍无这两处型(`replayed` 只在 workflow agent-run 行上)⇒ 继续候上游型面 · ② `capabilities.wiringManifest`(server ≥7.92.0 起手接线回执)读器:无消费方票不铸,有端要再开 · ③ 记忆治理面五动词调用口(CC-97 b)随 sdk 11.0.1 解阻,下一版 · ④ `mandate` 帧位镜像候 core 7.26.0 铸点(CC-110)。
|
|
9644
|
+
|
|
9601
9645
|
## §81 🆕 0.77.2 dist 零注释 + 门词汇表外句改口(patch;型面零变、行为零变)
|
|
9602
9646
|
|
|
9603
9647
|
> **patch**:公面 1143 不变、wire 零新键、peer 地板不动 `>=9.8.1`。两件:① 制品面 —— 构建期去注释,dist `.js` / `.d.ts` 零注释;② 闭集读数改口 —— `gateDeniedByDetail` 表外词兜底句。按 C-R69 全速模式一帖即通知。
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sema-agent/client-core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.78.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",
|
|
@@ -31,12 +31,12 @@
|
|
|
31
31
|
},
|
|
32
32
|
"peerDependencies": {
|
|
33
33
|
"@sema-agent/agent-types": ">=0.3.0",
|
|
34
|
-
"@sema-agent/sdk": ">=
|
|
34
|
+
"@sema-agent/sdk": ">=11.0.1"
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
37
|
"@sema-agent/agent-types": "^0.3.0",
|
|
38
38
|
"@sema-agent/core": "~7.23.0",
|
|
39
|
-
"@sema-agent/sdk": "^
|
|
39
|
+
"@sema-agent/sdk": "^11.0.1",
|
|
40
40
|
"@sema-agent/settings-schema": "^2.0.0",
|
|
41
41
|
"esbuild": "^0.27.4",
|
|
42
42
|
"typescript": "^6.0.2"
|