@sema-agent/settings-schema 14.7.0 → 14.8.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.
Files changed (51) hide show
  1. package/CHANGELOG.md +209 -0
  2. package/README.md +58 -2
  3. package/conformance/VERSION +1 -1
  4. package/dist/atomic-write.d.ts +15 -0
  5. package/dist/atomic-write.js +109 -5
  6. package/dist/catalog-manages.d.ts +15 -0
  7. package/dist/catalog-manages.js +60 -0
  8. package/dist/center-refs.d.ts +68 -0
  9. package/dist/center-refs.js +70 -0
  10. package/dist/config-dir-migration.js +1 -0
  11. package/dist/config-fns.js +5 -3
  12. package/dist/config-root-documents.d.ts +106 -0
  13. package/dist/config-root-documents.js +93 -0
  14. package/dist/config-root-node.d.ts +117 -0
  15. package/dist/config-root-node.js +260 -0
  16. package/dist/conformance/run.d.ts +3 -0
  17. package/dist/conformance/run.js +10 -6
  18. package/dist/conformance/temp-roots.d.ts +31 -0
  19. package/dist/conformance/temp-roots.js +184 -0
  20. package/dist/default-model.d.ts +1 -1
  21. package/dist/default-model.js +5 -4
  22. package/dist/env-model-table.d.ts +163 -0
  23. package/dist/env-model-table.js +257 -0
  24. package/dist/fleet.d.ts +25 -7
  25. package/dist/fleet.js +24 -6
  26. package/dist/index.d.ts +5 -0
  27. package/dist/index.js +5 -0
  28. package/dist/mcp-request-entry.d.ts +58 -6
  29. package/dist/mcp-request-entry.js +45 -13
  30. package/dist/mcp-server-name.d.ts +17 -0
  31. package/dist/mcp-server-name.js +19 -0
  32. package/dist/migration-receipt.d.ts +10 -6
  33. package/dist/migration-receipt.js +5 -3
  34. package/dist/node.d.ts +1 -0
  35. package/dist/node.js +2 -0
  36. package/dist/one-time-migrations.d.ts +4 -2
  37. package/dist/one-time-migrations.js +29 -1
  38. package/dist/own-key-read.d.ts +1 -1
  39. package/dist/retired-form.d.ts +19 -0
  40. package/dist/retired-form.js +24 -1
  41. package/dist/safety-merge-spec.d.ts +6 -6
  42. package/dist/tier-words.d.ts +33 -0
  43. package/dist/tier-words.js +43 -0
  44. package/dist/types.d.ts +6 -0
  45. package/dist/types.js +24 -0
  46. package/dist/worker-row-verdict.js +7 -1
  47. package/docs/API-SURFACE.md +68 -4
  48. package/docs/CONSUMER-INTEGRATION.md +72 -2
  49. package/llms-full.txt +4 -1
  50. package/llms.txt +9 -3
  51. package/package.json +2 -2
@@ -0,0 +1,43 @@
1
+ /**
2
+ * 档位词(纯、零 I/O、浏览器安全;**包内叶子模块,不出包**):引擎的档序与 CC 档位别名、从某档起向低档的梯,与「一个目录词在档位展开之后落到哪条条目」。
3
+ * 本包里档位词的唯一一处:default 角色的档梯(`./default-model`)与写者计划助手的落点(`./env-model-table`)都从这里取。
4
+ * 镜像 core(`DEFAULT_TIER_ORDER` / `CC_MODEL_TIER_ALIASES` / `expandTiers`):`test/tier-words-parity-14.8.0` 对 devDependency 里精确钉住的那一版 core 对拍。
5
+ */
6
+ /** 引擎的档序(高 → 低)。 */
7
+ export const TIER_ORDER = ["ultra", "max", "pro", "flash", "lite"];
8
+ /** CC 档位词 → 引擎档位。 */
9
+ export const CC_TIER_ALIASES = { fable: "max", mythos: "max", opus: "pro", sonnet: "flash", haiku: "lite" };
10
+ /** 一档的梯:档序里从它起(含)向低档的那一段(没绑的档沿它往下落)。 */
11
+ export function tierLadderFrom(tier) {
12
+ return TIER_ORDER.slice(TIER_ORDER.indexOf(tier));
13
+ }
14
+ const isTierWord = (word) => TIER_ORDER.includes(word);
15
+ /**
16
+ * 一个目录词(条目名 / 档位词 / CC 档位别名 / `best`)在**档位展开之后**落到哪条目录条目名 —— 与引擎装配档位表的两步同答:
17
+ * 先摘掉活跃组里绑定目标不可服务的档(引擎的生效装配在交给 core 之前做这一步,并 warn 点名),再按 core `expandTiers` 展开
18
+ * (对拍 devDependency 那一版 core 的「摘后表」)。所以这里只有一条绑定规则:**一档的绑定只在它点名一条可服务条目时算数**,否则当作没绑。展开规则:
19
+ * · 目录自己的键先赢(`has(word)`;一条就叫 `flash` 的条目遮住档位词);
20
+ * · 档位词 ⇒ 它的梯({@link tierLadderFrom})上第一个有绑定的档;摘完没有任何绑定 ⇒ 只认目录键;
21
+ * · CC 档位别名 ⇒ 经它对应的档位;`best` ⇒ 档序里第一个有绑定的档;别的词 ⇒ 落不到。
22
+ * `has` = 调用方的「这个名是目录里一条可服务(启用)的条目」;`tiers` = `resolveActiveTiers` 的读数(原表,未摘)—— 它的键只有五个档位词
23
+ * (档位组的绑定表在 schema 里只收这五个键,别的键被剥掉),所以只按档位词读表。
24
+ */
25
+ export function landCatalogWord(word, has, tiers) {
26
+ if (has(word))
27
+ return word;
28
+ if (tiers === undefined)
29
+ return undefined;
30
+ /** 一档的绑定:只在它点名一条可服务条目时算数(否则引擎已摘掉它)。 */
31
+ const bound = (tier) => {
32
+ const target = Object.hasOwn(tiers, tier) ? tiers[tier] : undefined;
33
+ return target !== undefined && has(target) ? target : undefined;
34
+ };
35
+ const firstBound = (ladder) => ladder.map(bound).find((landed) => landed !== undefined);
36
+ if (isTierWord(word))
37
+ return firstBound(tierLadderFrom(word));
38
+ if (Object.hasOwn(CC_TIER_ALIASES, word))
39
+ return firstBound(tierLadderFrom(CC_TIER_ALIASES[word]));
40
+ if (word === "best")
41
+ return firstBound(TIER_ORDER);
42
+ return undefined;
43
+ }
package/dist/types.d.ts CHANGED
@@ -1885,6 +1885,8 @@ export declare const McpServerSpec: z.ZodObject<{
1885
1885
  local: "local";
1886
1886
  execution: "execution";
1887
1887
  }>>;
1888
+ sessionMetaKey: z.ZodOptional<z.ZodUnknown>;
1889
+ startupTimeoutMs: z.ZodOptional<z.ZodUnknown>;
1888
1890
  source: z.ZodOptional<z.ZodUnknown>;
1889
1891
  toolFaces: z.ZodOptional<z.ZodUnknown>;
1890
1892
  toolAxes: z.ZodOptional<z.ZodUnknown>;
@@ -1918,6 +1920,8 @@ export declare const McpConfig: z.ZodObject<{
1918
1920
  local: "local";
1919
1921
  execution: "execution";
1920
1922
  }>>;
1923
+ sessionMetaKey: z.ZodOptional<z.ZodUnknown>;
1924
+ startupTimeoutMs: z.ZodOptional<z.ZodUnknown>;
1921
1925
  source: z.ZodOptional<z.ZodUnknown>;
1922
1926
  toolFaces: z.ZodOptional<z.ZodUnknown>;
1923
1927
  toolAxes: z.ZodOptional<z.ZodUnknown>;
@@ -2520,6 +2524,8 @@ export declare const DOMAIN_SCHEMAS: {
2520
2524
  local: "local";
2521
2525
  execution: "execution";
2522
2526
  }>>;
2527
+ sessionMetaKey: z.ZodOptional<z.ZodUnknown>;
2528
+ startupTimeoutMs: z.ZodOptional<z.ZodUnknown>;
2523
2529
  source: z.ZodOptional<z.ZodUnknown>;
2524
2530
  toolFaces: z.ZodOptional<z.ZodUnknown>;
2525
2531
  toolAxes: z.ZodOptional<z.ZodUnknown>;
package/dist/types.js CHANGED
@@ -456,6 +456,20 @@ export const PARSE_TRANSPARENT_KEYS = [
456
456
  validatedBy: "consumer",
457
457
  why: "它的形由同一条 override 的 `key` 决定(一个 key 一种形),执法点在读那个 key 的消费方;在这里写死形等于把所有可覆盖键的形表搬进本包。",
458
458
  },
459
+ {
460
+ domain: "mcp",
461
+ path: "servers[].sessionMetaKey",
462
+ since: "14.8.0",
463
+ validatedBy: "engine-ingest",
464
+ why: "引擎在发给这台服务器的请求 `_meta` 里放发送腿会话 id 的那把键;它只有一只判官 = 引擎根导出 `judgeSessionMetaKey`(类型、非空、上界、MCP `_meta` 键名文法、MCP 保留前缀、`progressToken`、引擎的 `sema/` 命名空间一并判;坏键在引擎的准备门整条拒、点名这把键),投影它的消费方在交给引擎之前可调同一只;本包只承载 —— 这里哪怕只判类型与长度,也是第二只判官的一部分,与引擎那只各答各的。",
465
+ },
466
+ {
467
+ domain: "mcp",
468
+ path: "servers[].startupTimeoutMs",
469
+ since: "14.8.0",
470
+ validatedBy: "engine-ingest",
471
+ why: "引擎的逐服务器启动界(握手与首次工具列举各带它);它只有一只判官 = 引擎根导出的 `mcpStartupTimeoutMs`(是不是数、整数性、范围一并判;坏值在引擎的拨号门拒这一台服务器、点名 `config.mcp_startup_timeout_invalid`,其余服务器照挂),投影它的消费方在交给引擎之前可调同一只;本包只承载 —— 这里哪怕只判「是不是数」,也是第二只判官的一部分,与引擎那只各答各的。",
472
+ },
459
473
  ];
460
474
  /** A catalog model's price / capability tier — fuels core 1.25 `selectModel({ tier })` role resolution. ONE closed set for both
461
475
  * places that name it (`ModelEntry.tier`, `RoleTarget.select.tier`). Not the tier-group ladder of {@link TierBindings}
@@ -2486,6 +2500,16 @@ export const McpServerSpec = z.object({
2486
2500
  * declared `"local"`, the engine read ABSENT. A value outside the table is REJECTED at parse — a mistyped trust
2487
2501
  * word must never be read as a legal one (the consumer's gate is equally severe: no case-folding). */
2488
2502
  contentOrigin: z.enum(MCP_CONTENT_ORIGINS).optional(),
2503
+ /** 引擎在发给这台服务器的每个 `tools/call` / `resources/read` 的 `params._meta[key]` 里放发送腿自己的会话 id 的那把键 —— 一一对应引擎的
2504
+ * `McpServerSpec.sessionMetaKey`。缺席 = 什么都不送(`.optional()`,不铸默认:会话 id 出进程是部署自己选的关联)。
2505
+ *
2506
+ * **解析透明** —— 形归谁校验、为什么不放这里:{@link PARSE_TRANSPARENT_KEYS}(`mcp.servers[].sessionMetaKey`)。 */
2507
+ sessionMetaKey: z.unknown().optional(),
2508
+ /** 这一台服务器自己的启动界(整数毫秒):握手(连接 + initialize)与首次工具列举各带它 —— 一一对应引擎的 `McpServerSpec.startupTimeoutMs`。
2509
+ * 缺席 = 引擎读进程级的缺省界(`.optional()`,不铸默认:没声明就是没声明);它只界启动阶段,不动单次调用的超时。
2510
+ *
2511
+ * **解析透明** —— 形归谁校验、为什么不放这里:{@link PARSE_TRANSPARENT_KEYS}(`mcp.servers[].startupTimeoutMs`)。 */
2512
+ startupTimeoutMs: z.unknown().optional(),
2489
2513
  /** Declaration-plane GROUPING LABEL for this server — maps 1:1 onto the engine's `McpServerSpec.source`
2490
2514
  * (core ≥7.5.0 echoes it verbatim on `wiring_manifest.mcp[].source`, single-line + 80-char cap, so a
2491
2515
  * consumer can group servers by where they were declared). An OPEN set: CC's `plugin` / `user` /
@@ -10,6 +10,7 @@ import { formatConfigPath, outgoingPath } from "./config-fns.js";
10
10
  import { issuePath } from "./issue-path.js";
11
11
  import { guardedSafeParse } from "./own-key-read.js";
12
12
  import { jsonShapeOf } from "./plain-json-object.js";
13
+ import { retiredKeyHeldSentence, retiredKeyOfSentence } from "./retired-form.js";
13
14
  import { WorkersConfig } from "./types.js";
14
15
  /** 每一形的拒句主语 —— 穷举映射型:加一形不补这里即编译红。 */
15
16
  const SUBJECT = {
@@ -63,6 +64,11 @@ export function safeIssueMessage(issue) {
63
64
  function rowRelative(path) {
64
65
  return path[0] === "workers" && path[1] === 0 ? path.slice(2) : path;
65
66
  }
67
+ /** 一条 issue 在拒句里的样子:`<坐标>: <句子>`;墓碑 issue(旧形字段还在盘上)换成读面的说法 —— 坐标就是退役键名,拒句的文字里不点名它(结构化的 `field` 已经指到它),指现行位与出路。 */
68
+ function issueText(i) {
69
+ const tombstone = retiredKeyOfSentence(i.message);
70
+ return tombstone !== undefined ? retiredKeyHeldSentence(tombstone.form) : `${formatConfigPath(outgoingPath(rowRelative(issuePath(i))))}: ${i.message}`;
71
+ }
66
72
  /** 一行的终判:读得进 ⇒ `undefined`;读不进 ⇒ 第一条 issue 的路径(相对该行)+ 拒句(见文件头)。 */
67
73
  export function workerRowVerdict(row, form) {
68
74
  // 校验过程抛(会抛的 getter / 陷阱:读侧交进来的是调用方的活对象;zod 4.6 首读 `error` 时拼句子抛 —— 被污染的运行时、另一 realm 的怪形值)⇒ 这一行判「读不出」
@@ -74,7 +80,7 @@ export function workerRowVerdict(row, form) {
74
80
  if (verdict.success)
75
81
  return undefined;
76
82
  const issues = verdict.error.issues;
77
- const shown = issues.slice(0, 3).map((i) => `${formatConfigPath(outgoingPath(rowRelative(issuePath(i))))}: ${i.message}`);
83
+ const shown = issues.slice(0, 3).map(issueText);
78
84
  const more = issues.length > shown.length ? ` (+${issues.length - shown.length} more)` : "";
79
85
  const first = issues[0];
80
86
  return { field: first === undefined ? [] : rowRelative(issuePath(first)), reason: `${SUBJECT[form]} is not a valid WorkerSpec — ${shown.join("; ")}${more}` };
@@ -4,9 +4,9 @@
4
4
  > 每次全量重算并逐名比对 —— 加 / 删 / 改形一个导出而不重生成本档 ⇒ 红。导出面的每次变动因此以本档的 diff 出现在评审里。
5
5
  > 形:`value` = 运行期拿得到的值;`type` = 只在类型层;`value+type` = 同名的值与类型(zod schema 与它推出的类型)。
6
6
 
7
- 子路径 24 条(资产出口 `./package.json` / `./fleet-paths.json` 不是模块,不列),导出名合计 1396 个(同名在多条子路径上各计一次)。
7
+ 子路径 24 条(资产出口 `./package.json` / `./fleet-paths.json` 不是模块,不列),导出名合计 1460 个(同名在多条子路径上各计一次)。
8
8
 
9
- ## `.`(708)
9
+ ## `.`(761)
10
10
 
11
11
  - `ABSOLUTE_HOST_PATH_MAX` — value
12
12
  - `ACCESS_TOKEN_TTL_SECONDS` — value
@@ -33,8 +33,12 @@
33
33
  - `BaseHookInput` — value+type
34
34
  - `BudgetGroup` — value+type
35
35
  - `BudgetGroupMember` — value
36
+ - `CATALOG_REPLACES_ENV_MODELS_CODE` — value
37
+ - `CENTER_REFS_VERDICTS` — value
38
+ - `CENTER_REF_FAULTS` — value
36
39
  - `COMMAND_DECISIONS` — value
37
40
  - `CONFIG_CHANGE_SOURCES` — value
41
+ - `CONFIG_ROOT_DOCUMENTS` — value
38
42
  - `CONTROL_AND_BIDI_CHARS` — value
39
43
  - `CREDENTIAL_PARAM_NAMES` — value
40
44
  - `CROSS_SESSION_INBOUND_UNSET` — value
@@ -44,6 +48,12 @@
44
48
  - `CasWriteResult` — type
45
49
  - `CatalogDefaultModel` — type
46
50
  - `CatalogDefaultSource` — type
51
+ - `CenterRefFault` — type
52
+ - `CenterRefLookup` — type
53
+ - `CenterRefMember` — type
54
+ - `CenterRefMemberVerdict` — type
55
+ - `CenterRefsResolution` — type
56
+ - `CenterRefsVerdict` — type
47
57
  - `CollabConfig` — value+type
48
58
  - `CollabEarlyStop` — value+type
49
59
  - `CollabFinalizerType` — value+type
@@ -56,6 +66,7 @@
56
66
  - `ConfigChangeHookInput` — value
57
67
  - `ConfigPath` — type
58
68
  - `ConfigReader` — type
69
+ - `ConfigRootDocument` — type
59
70
  - `CredentialHandleAnswer` — value+type
60
71
  - `CredentialParamName` — type
61
72
  - `CredentialResolveRequest` — value+type
@@ -71,6 +82,7 @@
71
82
  - `DEFAULT_HEARTBEAT_MS` — value
72
83
  - `DEFAULT_HOOK_TIMEOUT_SECONDS` — value
73
84
  - `DEFAULT_JWKS_REFRESH_MIN_INTERVAL_SEC` — value
85
+ - `DEFAULT_MODEL_KEY` — value
74
86
  - `DEFAULT_OFFLINE_GRACE_SEC` — value
75
87
  - `DEFAULT_ROLE_TIER_LADDER` — value
76
88
  - `DELIVER_DENYLIST` — value
@@ -121,6 +133,9 @@
121
133
  - `DroppedEntryReasonCode` — type
122
134
  - `ENGINE_OWNED_HOOK_EVENTS` — value
123
135
  - `ENGINE_SIGNAL_KEY` — value
136
+ - `ENV_MODELS_DECISIONS` — value
137
+ - `ENV_MODELS_DOCUMENT` — value
138
+ - `ENV_MODEL_TABLE_KEYS` — value
124
139
  - `ENV_NAME` — value
125
140
  - `EXECUTION_LANES` — value
126
141
  - `EXECUTION_LANE_WORDS` — value
@@ -143,8 +158,23 @@
143
158
  - `EntitlementTier` — value+type
144
159
  - `EntryKeptIndex` — type
145
160
  - `EntrySalvageResult` — type
161
+ - `EnvCheapSlot` — type
162
+ - `EnvModelBaseline` — type
163
+ - `EnvModelTableEntry` — type
164
+ - `EnvModelTableKey` — type
165
+ - `EnvModelTableLanding` — type
166
+ - `EnvModelTableReceipt` — type
167
+ - `EnvModelTableRoleRow` — type
168
+ - `EnvModelTableTarget` — type
169
+ - `EnvModelTableWriteInput` — type
170
+ - `EnvModelTableWriteIntent` — type
171
+ - `EnvModelTableWritePlan` — type
172
+ - `EnvModelsDecision` — type
173
+ - `EnvModelsDecisionWord` — type
146
174
  - `EnvRef` — type
147
175
  - `EnvRefUse` — type
176
+ - `EnvRoleBinding` — type
177
+ - `EnvSnapshot` — type
148
178
  - `ExecutionLane` — type
149
179
  - `ExecutionLaneRow` — type
150
180
  - `ExecutionPolicy` — value+type
@@ -245,6 +275,7 @@
245
275
  - `MODEL_ENTRY_REFUSAL_CODES` — value
246
276
  - `MODEL_PLANE_REFUSAL_CODES` — value
247
277
  - `MODEL_SWITCH_SOURCES` — value
278
+ - `MarkedMigrationId` — type
248
279
  - `McpConfig` — value+type
249
280
  - `McpContentOrigin` — type
250
281
  - `McpEntryKeyIssue` — type
@@ -264,6 +295,7 @@
264
295
  - `MergeCategorySpec` — value+type
265
296
  - `MergeShape` — value+type
266
297
  - `MessageDisplayHookInput` — value
298
+ - `MigrationMarker` — type
267
299
  - `MinTrust` — value+type
268
300
  - `ModelCost` — value
269
301
  - `ModelEntry` — value+type
@@ -284,6 +316,8 @@
284
316
  - `OAuthErrorResponse` — value+type
285
317
  - `PARSE_TRANSPARENT_KEYS` — value
286
318
  - `PATH_BASE_URL_FORBIDDEN_PARTS` — value
319
+ - `PLAIN_STRING_RECORD_FAULTS` — value
320
+ - `PLAIN_STRING_RECORD_RESERVED_MEMBER` — value
287
321
  - `PLUGIN_ORIGIN` — value
288
322
  - `PRINCIPAL_INC_CLAIM` — value
289
323
  - `PRINCIPAL_MAX_LENGTH` — value
@@ -308,6 +342,8 @@
308
342
  - `PermissionRuleValue` — value+type
309
343
  - `PermissionUpdate` — value+type
310
344
  - `PermissionUpdateDestination` — value+type
345
+ - `PlainStringRecordFault` — type
346
+ - `PlainStringRecordRead` — type
311
347
  - `PluginSource` — value+type
312
348
  - `PluginSpec` — value+type
313
349
  - `PluginsConfig` — value+type
@@ -349,6 +385,7 @@
349
385
  - `REF_ISSUE_TARGET_DOMAIN` — value
350
386
  - `REF_REFERRER_DOMAINS` — value
351
387
  - `REMOTE_EXEC_DOCUMENT` — value
388
+ - `REMOTE_MCP_SERVER_NAME_PREFIX` — value
352
389
  - `RESERVED_SCOPE_IDS` — value
353
390
  - `RESERVED_WORKER_ENV` — value
354
391
  - `RETIRED_DOMAINS` — value
@@ -356,6 +393,7 @@
356
393
  - `RETIRED_ENV_REFUSAL_CODE` — value
357
394
  - `RETIRED_LANE_WORDS` — value
358
395
  - `ROLE_RANK` — value
396
+ - `ROOT_DOCUMENT_UNREADABLE_REASONS` — value
359
397
  - `ROSTER_CHEAP_ROLES` — value
360
398
  - `ROSTER_PRIMARY_ROLES` — value
361
399
  - `RUNTIME_CAP_STRICT` — value
@@ -379,6 +417,7 @@
379
417
  - `RetiredEnvWire` — type
380
418
  - `RetiredLaneWord` — type
381
419
  - `RoleTarget` — value+type
420
+ - `RootDocumentUnreadableReason` — type
382
421
  - `RosterEntry` — value+type
383
422
  - `RostersConfig` — value+type
384
423
  - `RoutingVerdict` — type
@@ -414,6 +453,7 @@
414
453
  - `STALE_SESSION_RECORD_MS` — value
415
454
  - `STORE_BACKENDS` — value
416
455
  - `SUBMIT_IDEMPOTENCY_KEY` — value
456
+ - `SUMMARIZE_MODEL_MISSING_CODE` — value
417
457
  - `SafetyMergeCategory` — type
418
458
  - `SafetyMergeMember` — type
419
459
  - `SandboxGitConfig` — value+type
@@ -561,9 +601,11 @@
561
601
  - `aggregateUsage` — value
562
602
  - `applyProjectPatch` — value
563
603
  - `buildEffective` — value
604
+ - `buildEnvModelBaseline` — value
564
605
  - `buildLayerPartsUnreadNotice` — value
565
606
  - `buildRetiredEnvWire` — value
566
607
  - `canSwitchScope` — value
608
+ - `catalogManagesModelPlane` — value
567
609
  - `clampServingLeaseTtlMs` — value
568
610
  - `classifyHooksConfig` — value
569
611
  - `classifyTimeClaims` — value
@@ -573,6 +615,7 @@
573
615
  - `createSiblingResolver` — value
574
616
  - `danglingRefs` — value
575
617
  - `describeBadContentOrigin` — value
618
+ - `describeBadMcpServerName` — value
576
619
  - `describeBadWireName` — value
577
620
  - `describeNotStringArray` — value
578
621
  - `describeNotStringRecord` — value
@@ -581,6 +624,10 @@
581
624
  - `drainVerdict` — value
582
625
  - `effectiveScopeRole` — value
583
626
  - `emptyEffective` — value
627
+ - `enabledEntryCount` — value
628
+ - `envModelTableDeclared` — value
629
+ - `envModelTableWriteRefusal` — value
630
+ - `envModelsDecisionTag` — value
584
631
  - `extraBodyUnsafe` — value
585
632
  - `findSkillContent` — value
586
633
  - `findUrlCredential` — value
@@ -619,6 +666,7 @@
619
666
  - `isSchedulerRecord` — value
620
667
  - `isStringArray` — value
621
668
  - `isStringRecord` — value
669
+ - `isUsableMcpServerName` — value
622
670
  - `isUsableWireName` — value
623
671
  - `judgeReadiness` — value
624
672
  - `judgeRoutability` — value
@@ -635,6 +683,7 @@
635
683
  - `memberTighten` — value
636
684
  - `membersOf` — value
637
685
  - `mintScopedToken` — value
686
+ - `mintedCheapId` — value
638
687
  - `narrowAtMention` — value
639
688
  - `nextPollInterval` — value
640
689
  - `normalizeContentHash` — value
@@ -648,6 +697,7 @@
648
697
  - `parseWebAdminSessionUrl` — value
649
698
  - `pathBaseUrlFlaws` — value
650
699
  - `pickInstance` — value
700
+ - `planEnvModelTableWrite` — value
651
701
  - `projectWarning` — value
652
702
  - `promptArtifactFor` — value
653
703
  - `readCapabilityReading` — value
@@ -657,9 +707,11 @@
657
707
  - `readDrainRequest` — value
658
708
  - `readEffectiveWire` — value
659
709
  - `readEngineSignal` — value
710
+ - `readEnvModelSlots` — value
660
711
  - `readHttpHookAllowlistLayer` — value
661
712
  - `readMcpIdentityHeaders` — value
662
713
  - `readModelRefusals` — value
714
+ - `readPlainStringRecord` — value
663
715
  - `readRequestMcpTransport` — value
664
716
  - `readScopedTokenBinding` — value
665
717
  - `readServingLeaseRequest` — value
@@ -677,6 +729,7 @@
677
729
  - `renderRefIssue` — value
678
730
  - `resolveActiveTiers` — value
679
731
  - `resolveCatalogDefaultModel` — value
732
+ - `resolveCenterRefs` — value
680
733
  - `resolveEffectiveForWorker` — value
681
734
  - `resolveMemberAdmission` — value
682
735
  - `resolveMemberTighten` — value
@@ -1111,7 +1164,7 @@
1111
1164
  - `tightenVerdict` — value
1112
1165
  - `trustRank` — value
1113
1166
 
1114
- ## `./node`(39)
1167
+ ## `./node`(48)
1115
1168
 
1116
1169
  - `ConfigBundle` — type
1117
1170
  - `ConfigDirectoryDocument` — type
@@ -1119,7 +1172,11 @@
1119
1172
  - `ConfigDirectoryMigration` — type
1120
1173
  - `ConfigDirectoryRefusal` — type
1121
1174
  - `ConfigDocumentsMigration` — type
1175
+ - `ConfigRootIo` — type
1122
1176
  - `DomainReadError` — type
1177
+ - `EnvModelsDecisionWrite` — type
1178
+ - `EnvModelsMigration` — type
1179
+ - `EnvModelsMint` — type
1123
1180
  - `FileConfigStore` — value+type
1124
1181
  - `LocalConfig` — type
1125
1182
  - `MigrateConfigDirectoryOptions` — type
@@ -1142,15 +1199,20 @@
1142
1199
  - `loadSchedulerStore` — value
1143
1200
  - `migrateConfigDirectory` — value
1144
1201
  - `migrateConfigDocuments` — value
1202
+ - `migrateEnvModelsDecision` — value
1145
1203
  - `mutateSchedulerStore` — value
1146
1204
  - `nodeConfigDirectoryIo` — value
1205
+ - `nodeConfigRootIo` — value
1147
1206
  - `readBundle` — value
1207
+ - `readEnvModelsDecision` — value
1208
+ - `readMigrationMarker` — value
1148
1209
  - `remoteExecPath` — value
1149
1210
  - `saveSchedulerStore` — value
1150
1211
  - `validateDomain` — value
1151
1212
  - `validateRemoteExec` — value
1152
1213
  - `writeBundle` — value
1153
1214
  - `writeDomainFile` — value
1215
+ - `writeEnvModelsDecision` — value
1154
1216
  - `writeRemoteExec` — value
1155
1217
 
1156
1218
  ## `./one-time-migrations`(18)
@@ -1284,9 +1346,10 @@
1284
1346
  - `interpolateHookEnvVars` — value
1285
1347
  - `stopAttributionText` — value
1286
1348
 
1287
- ## `./fleet`(84)
1349
+ ## `./fleet`(86)
1288
1350
 
1289
1351
  - `AggregatedPrincipalUsage` — type
1352
+ - `CATALOG_REPLACES_ENV_MODELS_CODE` — value
1290
1353
  - `CapabilityReading` — type
1291
1354
  - `DEFAULT_DRAIN_GRACE_MS` — value
1292
1355
  - `DEFAULT_HEARTBEAT_MS` — value
@@ -1340,6 +1403,7 @@
1340
1403
  - `SERVING_LEASE_VERDICTS` — value
1341
1404
  - `STALE_HEARTBEAT_MULTIPLIER` — value
1342
1405
  - `SUBMIT_IDEMPOTENCY_KEY` — value
1406
+ - `SUMMARIZE_MODEL_MISSING_CODE` — value
1343
1407
  - `ServingLeaseDeniedReason` — value+type
1344
1408
  - `ServingLeaseReading` — type
1345
1409
  - `ServingLeaseRequest` — value+type
@@ -9,6 +9,7 @@
9
9
  > **11.0.0** 的持久面(`runtime` 域退役、读侧兼容臂退役、一次性迁移族 `./one-time-migrations`)在 §0.4。
10
10
  > **14.7.0** 的沙箱 git 凭据平面(取值口 wire 型、有效配置块 `sandboxGit`、`VerifiedIdentity.principalInc`)在 §12。
11
11
  > **14.7.0** 的路径基址判官(`PATH_BASE_URL_FORBIDDEN_PARTS` / `pathBaseUrlFlaws`)与公告地址 env 名(`FLEET_ADVERTISE_ADDRESS_ENV`)在 §13。
12
+ > 中心引用解析口 `resolveCenterRefs` 与记录读器 `readPlainStringRecord`(原因词表 `PLAIN_STRING_RECORD_FAULTS`)在 §14。
12
13
 
13
14
  ---
14
15
 
@@ -118,7 +119,7 @@
118
119
  - **读侧的新形**:`ModelEntry` 钥匙二选一(`sealedApiKey` 与 `apiKeyEnv` 同设 ⇒ 拒);`atMention`(`{mode:"all"}` 缺省 /
119
120
  `{mode:"none"}` / `{mode:"only",models}`,roster 位缺席 = 继承,收窄读法一只 `narrowAtMention` —— 收窄到一个都不剩就是 `none`);
120
121
  workers 6.x 字段与 `atModelAllowlist` 是 schema 里原位的**墓碑字段**(在场即拒,句子点名迁移);`readWorkersRows(raw) → { doc, held }`
121
- (workers 域的逐行终判,取代 `migrateWorkersDomain` 的终判半)。
122
+ (workers 域的逐行终判,取代 `migrateWorkersDomain` 的终判半;被扣下的行若还带着旧字段,`held[].field` 指到那个旧字段,`reason` 的文字**不点名它**,说现行位与出路:跑迁移,迁移已拒过这一行的就手写现行形、删旧字段)。
122
123
  - **调度店**:`parseSchedulerStore(text, { nowMs })` / `loadSchedulerStore(path, { nowMs })` 恒返回 `{ records, warnings }`(没有静默模式);
123
124
  整份文件不是 JSON 数组 ⇒ `unreadable-file`,`mutateSchedulerStore(path, fn, { nowMs })` 遇它不调 `fn`、不写(`reason: "unreadable_file"`);
124
125
  会话链上的记录(显式 `lifetime: "session"`)过期 ≥ 7 天 ⇒ 读时丢 + `stale-session-record`(`lifetime` 缺席读作 durable,不丢);所有写者走 `mutateSchedulerStore` 这一只原语(裸 load→save 是丢更新的竞争)。
@@ -216,7 +217,7 @@ server 直接拒启,不是静默降级。上一代 `SEMA_REGISTRY_*` 八名(`URL
216
217
  |---|---|---|
217
218
  | models / roles | `RunnerDeps.models`/`roles` | role 解析不变 |
218
219
  | skills | 本地=全文内联;远程=manifest + `fetchSkillContent(hash)` | 本地无 wire 跳,无需按 hash 回取 |
219
- | mcp | `TaskSpec.mcp`(allowTools + principalHeader) | env/header NAME→值解析 |
220
+ | mcp | `TaskSpec.mcp`(allowTools + principalHeader + sessionMetaKey) | env/header NAME→值解析;`sessionMetaKey` 本包原样承运,交给引擎之前可调引擎的 `judgeSessionMetaKey` 早判 |
220
221
  | limits(0.19.0,cost/限流族 14 键;11.0.0 起五个限额键的唯一位) | 消费方的限额面(server:`stage-limits`) | `.optional()` 无默认;本包只判结构,业务域值(下限/0 哨兵/跨键不变量)由消费方响亮拒 |
221
222
  | governance.autonomy / commandPolicy | 见 §6(小心区) | 经 tightenTaskSpec / combinePolicies |
222
223
  | rosters | control-plane only | `/effective` wire 经 `resolveEffectiveForWorker` 清空/剥离 |
@@ -461,3 +462,72 @@ fleet 成员对中心公告的可达地址(`FLEET_ADVERTISE_ADDRESS`,中心往
461
462
  - **缺席 / 空串的处置**:见 §13.3 —— 读的一方自己答。
462
463
  - **座位名册**:一个值算不算「后面要拼路径的基址」是读它的一方的事;本包给的是判这种座位的那一只判官,不维护座位清单(§13 开头列的是今天已知的读者)。
463
464
  - **不进保留 env 名表**:`FLEET_ADVERTISE_ADDRESS` 与 generation / scope 两只不同 —— 那两只只有渲染器能写,所以进 `RESERVED_WORKER_ENV`;公告地址是运维可以声明的值(渲染器也可以写),`worker.env` 设它照旧不被拒。
465
+
466
+ ## 14. 中心引用解析口 `resolveCenterRefs` 与记录读器 `readPlainStringRecord` —— 服务端中心腿与客户端核心两方的读法
467
+
468
+ 中心名册里 MCP server 的传输带两张**引用表**:stdio 的 `envRefs`(目标 env 键 → 变量名)、http 的 `headerRefs`(目标头名 → 变量名)。名册只存变量名、从不存值;值要在消费方自己的宿主环境里读。
469
+ 「变量没设」「设了但读到的不是串」「读它的时候抛了」「引用表本身不成样子」四种情形,本包此前只发引用表的形、不发读法,留给每个宿主自己写。本节说**本包发什么、两方各自怎么读**:本包只有**读引用表的那一个读法**(纯、浏览器安全、零 IO、不读环境);
470
+ 读哪一层环境、要不要缓存、解不开时挂不挂(§14.4),都是两方自己的事。
471
+
472
+ ### 14.1 本包发什么
473
+
474
+ | 件 | 是什么 |
475
+ |---|---|
476
+ | `resolveCenterRefs(refs, lookup)` | 解析口。`refs` = 名册里 `envRefs` / `headerRefs` 的值(`undefined` = 没声明);`lookup(name) => string \| undefined` = **调用方给的**查找函数(必给)。返回 `CenterRefsResolution`,按 `verdict` 分三臂;包根 |
477
+ | `CENTER_REF_FAULTS` / `CenterRefFault` | 一个成员没解到的原因词,闭集:`missing_name` · `not_a_string` · `read_threw`;包根 |
478
+ | `CENTER_REFS_VERDICTS` / `CenterRefsVerdict` | 整台结论的词,闭集:`resolved` · `unresolved` · `refs_unreadable`;包根 |
479
+ | `CenterRefMember` / `CenterRefMemberVerdict` / `CenterRefLookup` / `CenterRefsResolution` | 型:成员行 `{ key, ref, verdict }`(`verdict` = `resolved` 或上面三词之一)· 判定词 · 查找函数型 · 读数;包根 |
480
+ | `readPlainStringRecord(v)` | 「名 → 串」记录的读器(传输读器读 `env` / `headers` 用的就是它,同一个函数);包根 |
481
+ | `PLAIN_STRING_RECORD_FAULTS` / `PlainStringRecordFault` / `PlainStringRecordRead` / `PLAIN_STRING_RECORD_RESERVED_MEMBER` | 读器的原因词表(三词)· 词的型 · 读数型 · 保留成员名 `"__proto__"`;包根 |
482
+
483
+ ### 14.2 解析口的读法(一条律:每成员一句判定,整台一个结论)
484
+
485
+ 1. 引用表经 `readPlainStringRecord` 读。读不出(整张不是纯数据、有成员的变量名不是串、读成员就抛、叫 `__proto__` 的成员)⇒ **整台 `refs_unreadable`**,`fault` 是读器的词、坏在某个成员时 `member` 点名它的回显形;**一个变量都没问**。
486
+ 读器会把叫 `__proto__` 的串值成员剔出副本;解析口不许这样悄悄丢一条引用再挂,所以同样答 `refs_unreadable` / `member_name_reserved`。
487
+ 2. 每个成员恰问一次 `lookup(变量名)`(按引用表副本的自有键序:整数形的键在前、其余按记录列出的次序;实参只有变量名),判成**一个词**。一个成员坏了不早停 —— 每个成员都有自己的判定,调用方一次点名所有缺的变量:
488
+
489
+ | `lookup` 的答案 | 成员词 |
490
+ |---|---|
491
+ | 一个串(空串也是串) | `resolved` |
492
+ | `undefined`(变量没设) | `missing_name` |
493
+ | 别的种类(数、`null`、对象、函数……) | `not_a_string` |
494
+ | 抛了(任何抛出值,含撤销的 Proxy) | `read_threw`(不传出) |
495
+
496
+ 3. 整台结论:每个成员都 `resolved`(零成员也是)⇒ `resolved`,带 `values`(目标键 → 串,新铸的朴素对象);有成员不是 ⇒ `unresolved`,带 `members`(**行里没有变量的值**,失败读数可以进日志);引用表读不出 ⇒ `refs_unreadable`。
497
+ 4. `refs` 是 `undefined` ⇒ `resolved`、零成员、零次查找,与空表同答;别的非记录值(`null`、数组、串)是 `refs_unreadable`,不当缺席。
498
+ 5. `lookup` 没给 / 不是函数 ⇒ **`TypeError`**(调用方的编程错;不折成 `read_threw`,更不回落任何环境 —— 本包不读 `process.env`)。
499
+
500
+ `lookup` 的写法是调用方的事,有一条提醒:对普通对象做 `obj[name]` 会读到继承位(`toString` / `constructor`),解析口把它判成 `not_a_string`(响亮,不当作已设);想让这类名字落成「没设」就按自有键读
501
+ (`Object.hasOwn(table, name) ? table[name] : undefined`)。同一个变量被两个目标键引用会被问两次 —— 缓存(每名读一次、跨轮不缓存)是查找函数的事。
502
+
503
+ ### 14.3 读器的原因词(`PLAIN_STRING_RECORD_FAULTS`,三词)
504
+
505
+ | 词 | 说的是 | 记录交不交 |
506
+ |---|---|---|
507
+ | `not_plain_record` | 整张不是纯数据(`null` / 数组 / 原始值 / `Map` / 类实例 / 函数,或读形状就抛的对象) | 不交 |
508
+ | `member_not_string` | 某个成员的值不是串(读成了别的种类),或它读不出(它的访问器抛了,或读它的描述符时代理陷阱抛了)—— 两种情形 `detail` 句子分说 | 不交,`member` 点名它 |
509
+ | `member_name_reserved` | 某个成员叫 `__proto__`(引擎的声明收据拒这个名);名坏优先 —— 值也坏或读不出时句子并列说全,词仍是这一个 | 值是串:交其余、`reservedMember: true`;否则不交 |
510
+
511
+ 按词分派;读器从不抛。传输读器的 `lost[].fault` 就是这张表(读成员就抛的那一形,词是 `member_not_string`,句子 `could not be read (its getter threw)`)。
512
+
513
+ ### 14.4 两方做什么
514
+
515
+ - **客户端核心 / 服务端中心腿**:
516
+ ```ts
517
+ const r = resolveCenterRefs(transport.envRefs, (name) => hostEnv.read(name)); // hostEnv = 你的宿主环境座位;headerRefs 同
518
+ switch (r.verdict) {
519
+ case "resolved": return mount(r.values);
520
+ case "unresolved": for (const m of r.members) if (m.verdict !== "resolved") warn(m.verdict, m.key, m.ref); return skipWholeServer();
521
+ case "refs_unreadable": warn(r.fault, r.member); return skipWholeServer();
522
+ default: { const unhandled: never = r; throw new Error(`unhandled ${String(unhandled)}`); }
523
+ }
524
+ ```
525
+ 解析不了时挂不挂是你这条腿的规则(「整台不挂 + 点名」是一台少了鉴权头或凭据 env 的 server 不拨号的那条);本口只判。
526
+ - **不手抄**:不要在自己这边再写一遍「变量没设 / 读到的不是串 / 读抛」的判法或这三个词的字面量;词表与读数型从本包 import,穷尽 `switch` 加 `never` 兜底(加词时编译红)。
527
+
528
+ ### 14.5 本包不做的(如实)
529
+
530
+ - **读哪一层环境**:`lookup` 读什么(进程环境、合并后的环境、远端环境)是调用方的事;本包不读 `process.env`,也不缓存。
531
+ - **挂不挂**:读数是判决,不是处置。
532
+ - **变量名的形**:名册的 schema 已把变量名限在 env 名的字符集内;本口把变量名当不透明串交给 `lookup`,不再判一遍形。
533
+ - **值的好坏**:解到串就是 `resolved`,空串、很长的串都不另判;值是不是凭据、扣不扣留,是读数之后的另一道判官的事。
package/llms-full.txt CHANGED
@@ -1,6 +1,6 @@
1
1
  <!--
2
2
  llms-full.txt — 自包含全文 · 消费方(使用者)视角 · @sema-agent/settings-schema
3
- 重写日期: 2026-10-25 | 包版本: 14.7.0
3
+ 重写日期: 2026-10-27 | 包版本: 14.8.0
4
4
  生成方式: 无生成脚本——按当前树 src/*.ts 导出面 + package.json + README/CHANGELOG 手写事实版。
5
5
  证据约定: 每条"它怎么工作"的断言附 (文件: 符号) 坐标,刻意不用行号(行号逐版腐烂;符号名由
6
6
  typecheck 与 test/package-surface.test.ts、test/docs-hygiene.test.ts 等常驻门钉住)。无证据推断显式标【推断】。
@@ -109,6 +109,9 @@ registry:公网 npmjs,无需私有 registry 配置。
109
109
  · mcp:`McpServerSpec[]` —— `transport` 判别 stdio(command/args/envRefs)| http(url/headerRefs/
110
110
  principalHeader/assertionHeader;后两者互斥);`allowTools?`、`scenarios`/`rosters` 过滤、`elicitation`(默认 false,inbound elicitation
111
111
  的 per-server opt-in)、`contentOrigin?`(信任出处声明,闭词表 `MCP_CONTENT_ORIGINS =
112
+ --- 14.8.0:`McpServerSpec.sessionMetaKey?`(`z.unknown().optional()` 解析透明,登记在 `PARSE_TRANSPARENT_KEYS`,`validatedBy: "engine-ingest"` —— 唯一判官 = 引擎根导出 `judgeSessionMetaKey`(类型 / 非空 / 上界 / MCP `_meta` 键名文法 / 保留前缀 / `progressToken` / `sema/` 命名空间一并判);引擎往这台服务器的 `tools/call` / `resources/read` 的 `params._meta[key]` 里放发送腿会话 id;缺席不铸键)---
113
+ --- 14.8.0:`McpServerSpec.startupTimeoutMs?`(`z.unknown().optional()` 解析透明,登记在 `PARSE_TRANSPARENT_KEYS`,`validatedBy: "engine-ingest"` —— 格式与界由引擎判:唯一判官 = 引擎根导出 `mcpStartupTimeoutMs`(是不是数 / 整数性 / 范围一并判,在拨号时判:不合 ⇒ 拒这一台服务器的拨号,其余服务器照挂);这一台服务器自己的启动界,握手与首次工具列举各带它,缺席读进程级缺省界;本包不判、任何 JSON 值原样过,缺席不铸键)---
114
+ --- 14.8.0:`remote-` 前缀保留给设备执行端提供的远程 MCP 服务器(`REMOTE_MCP_SERVER_NAME_PREFIX`,挂载名 `remote-<名>`;字面比较、区分大小写):请求面在 `isUsableMcpServerName` / `describeBadMcpServerName`(线上名判官 `isUsableWireName` 不变,A2A 对端名用它);配置面 `McpServerSpec.name` 不拒它(拒是校验收紧,归 major)---
112
115
  --- 12.2.0:`McpServerSpec.toolAxes?` / `authForm?` / `entryKind?`(三键均 `z.unknown().optional()` 解析透明,登记在 `PARSE_TRANSPARENT_KEYS`(`authForm` / `entryKind` `validatedBy: "consumer"`;`toolAxes` 自 13.0.0 起 `"engine-ingest"` —— 形判官只有引擎根导出 `readMcpToolAxes` 一只,消费方两腿都调它);连接器条目的声明键,词表与语义归读它的消费方,本包只承载、原样过任意 JSON 形;缺席不铸键)---
113
116
  --- 12.2.0:`McpTransport`(http 形)`assertionHeader?`(HTTP 头名,过 `principalHeader` / `headerRefs` 键同一只头名判官;承载连接器断言;与 `principalHeader` **互斥** —— 同设 ⇒ 解析期拒,条目层 `superRefine` 判一处,拒句点名条目名与两键;stdio 形上与 `principalHeader` 同判:键被剥并报 `unknown-keys-dropped`;缺席不铸键;断言怎么铸 / 验归消费方)---
114
117
  --- 1.9.0:`McpServerSpec.toolFaces?`(`z.unknown().optional()` 解析透明,登记在 `PARSE_TRANSPARENT_KEYS`;引擎的工具名册 face 覆盖层,按远端工具名 key `{family?, pathTarget?, renderHints?, ruleFace?}`;形校验归引擎摄入侧,不合 schema 的工具不挂并通告一次 `config.tool_face_invalid`;缺席不铸键)
package/llms.txt CHANGED
@@ -1,6 +1,6 @@
1
1
  <!--
2
2
  llms.txt — 消费方(使用者)视角索引 · @sema-agent/settings-schema
3
- 重写日期: 2026-10-25 | 包版本: 14.7.0
3
+ 重写日期: 2026-10-27 | 包版本: 14.8.0
4
4
  生成方式: 无生成脚本——按当前树的 src/*.ts 导出面 + package.json + README/CHANGELOG 手写事实版;
5
5
  每条断言附证据坐标(文件:符号),刻意不用行号(行号随每版腐烂,符号名由 typecheck/test 钉住)。
6
6
  刷新触发: package.json 版号变更(test/docs-hygiene.test.ts D 组钉「包版本:」与 package.json 相等、
@@ -52,7 +52,7 @@ llms.txt — 消费方(使用者)视角索引 · @sema-agent/settings-schema
52
52
  (src/config-fns.ts: `rebaseWarningPaths` / `EntrySalvageResult.keptIndex` / `GrandfatherHostsReadResult.keptIndex`)
53
53
  - **解析透明键登记表** `PARSE_TRANSPARENT_KEYS`(2.0.0):本包收下但**不校验其形**的键一处列全,每行写清
54
54
  谁校验(引擎摄入侧 / 消费方)。「解析透明」按**行为**定义(喂一组代表性值全收),所以 `extraBody` 不在表里
55
- ——它有自己的形门(必须是纯 JSON 对象),开放的只是对象里的键名词表。今日 8 员:
55
+ ——它有自己的形门(必须是纯 JSON 对象),开放的只是对象里的键名词表。今日 10 员:
56
56
  `models.models[].compat`(1.10.0,镜像引擎 `OpenAICompletionsCompat` 五键 `thinkingFormat`/
57
57
  `reasoningEffortLevels`/`maxTokensField`/`requiresReasoningContentOnAssistantMessages`/
58
58
  `supportsReasoningEffort`;真需求 = vLLM/Qwen 类缺省开思考的网关要 `chat_template_kwargs.enable_thinking=false`,
@@ -60,7 +60,7 @@ llms.txt — 消费方(使用者)视角索引 · @sema-agent/settings-schema
60
60
  例 `{"anthropic-beta":"context-1m-2025-08-07"}`;头名闭集白名单 × 读它的线路 × 值形的判据唯一属主是 server,
61
61
  坏声明 ⇒ 该条目整条不可用;本包不复述那张表)、`mcp.servers[].source`(1.7.0,声明方自述的分组标签,开集,只做显示
62
62
  分组不进信任轴)、`mcp.servers[].toolFaces`(1.9.0,按远端工具名 key 的 face 覆盖层,形归引擎摄入侧)、
63
- `mcp.servers[].toolAxes` / `authForm` / `entryKind`(12.2.0,连接器条目的三只声明键,本包只承载;`toolAxes` 的形判官 = 引擎 `readMcpToolAxes` 一只,另两键的语义归读它的消费方)、
63
+ `mcp.servers[].toolAxes` / `authForm` / `entryKind`(12.2.0,连接器条目的三只声明键,本包只承载;`toolAxes` 的形判官 = 引擎 `readMcpToolAxes` 一只,另两键的语义归读它的消费方)、`mcp.servers[].sessionMetaKey`(14.8.0,引擎往这台服务器请求 `_meta` 里放会话 id 的那把键;唯一判官 = 引擎根导出 `judgeSessionMetaKey`,本包只承载)、`mcp.servers[].startupTimeoutMs`(14.8.0,这一台服务器自己的启动界;唯一判官 = 引擎根导出 `mcpStartupTimeoutMs`,本包只承载)、
64
64
  `entitlement.subjects[].overrides[].value`。`compat`/`headers`/`extraBody` 仍走同一只自由形安全判据(secret 形/
65
65
  访问器/循环/非 JSON/过深 ⇒ 拒 —— 那是安全边界,不是形校验)。(src/types.ts: `PARSE_TRANSPARENT_KEYS`)
66
66
  - **`mcp.servers[].transport.assertionHeader`**(12.2.0 新增,http 形可选):承载连接器断言的 HTTP 头名,头名过 `principalHeader` /
@@ -69,6 +69,8 @@ llms.txt — 消费方(使用者)视角索引 · @sema-agent/settings-schema
69
69
  - **`mcp.servers[].contentOrigin`**(1.4.0 新增):MCP 工具产出的信任出处声明,闭词表
70
70
  `MCP_CONTENT_ORIGINS = ["local","execution","external"]`(表外值 parse 拒,不做大小写折叠);缺席 = 引擎
71
71
  预声明行为。与 `source` 分轴:信任走它,显示分组走 `source`。(src/types.ts: `MCP_CONTENT_ORIGINS`)
72
+ - **`mcp.servers[].startupTimeoutMs`**(14.8.0 新增,可选):这一台服务器自己的启动界(整数毫秒,握手与首次工具列举各带它;缺席读进程级缺省界)。解析透明、原样承运:
73
+ 格式与界由引擎判 —— 唯一判官 = 引擎根导出 `mcpStartupTimeoutMs`,在拨号时判,不合 ⇒ 拒这一台服务器的拨号,本包不判。(src/types.ts: `McpServerSpec` / `PARSE_TRANSPARENT_KEYS`)
72
74
  - 把零散域**合并成一个 `EffectiveConfig`**(`buildEffective`,确定性:`updatedAt` 必传;`onWarning` 收
73
75
  降级/剥键/承运/未读文件五类告警),或在**消费端边界容错读 wire 载荷**(`readEffectiveWire`)。
74
76
  (src/config-fns.ts: `buildEffective` / `readEffectiveWire` / `EffectiveReadWarning`)
@@ -116,9 +118,13 @@ llms.txt — 消费方(使用者)视角索引 · @sema-agent/settings-schema
116
118
  - **MCP 名单判决**(13.0.0):`mcpServerPolicyVerdict(server, layers)` → `McpPolicyBlock{name, list, rule, target, written, sources}` 或 `undefined`;
117
119
  判按展开后目标、回显只按展开前写法(stdio 只给可执行名 + 参数个数);托管层 = 源表档 `managed` 的源(层只带源名);只收紧的源只贡献拒绝名单(允许名单是拼接 = 放宽,不读)。(src/mcp-server-policy.ts)
118
120
  - **请求面 MCP 条目判官**(14.0.0,`src/mcp-request-entry.ts`):`isUsableWireName` / `describeBadWireName`(引擎线上名长界 `TOOL_WIRE_NAME_MAX_CHARS` 的镜像;首尾空白 = 坏名,不 trim 不规范化,内部空白合法)·
121
+ `isUsableMcpServerName` / `describeBadMcpServerName`(MCP 服务器名 = 线上名判官再加一臂:`remote-` 前缀 `REMOTE_MCP_SERVER_NAME_PREFIX` 保留给设备执行端提供的远程 MCP 服务器,配置面 `McpServerSpec.name` 不拒(拒是校验收紧,归 major);A2A 对端名仍用 `isUsableWireName`)·
119
122
  `isContentOriginWord` / `describeBadContentOrigin`(回显剥控制与双向字符、截 64 字、引号形)· `readMcpIdentityHeaders` · `readRequestMcpTransport`(硬坏形 `ok:false` 点名键路径;软坏形读器丢键并记进 `lost`;
120
123
  `env` / `headers` 只收纯数据的「名 → 串」记录,`Map` / 类实例 / 自有 `__proto__` 成员不收、交副本,`lost` 条目带 `member` / `fault` 机读位)
121
124
  + 值种类描述件 —— 服务端请求腿与壳的发送前预检同读一份(判据与原因句逐字同)。`toolFaces` 声明在本包解析透明,形归引擎摄入侧判,本包不镜像工具面词表。
125
+ - **中心引用解析口**(`src/center-refs.ts`):`resolveCenterRefs(refs, lookup)` —— `refs` = 名册里 `envRefs` / `headerRefs`(目标键 → 变量名;`undefined` = 没声明),`lookup(name) => string | undefined` 由调用方给(必给;没给 ⇒ `TypeError`,本包不读 `process.env`)。
126
+ 每成员一句判定 `resolved` / `missing_name` / `not_a_string` / `read_threw`(`CENTER_REF_FAULTS`),整台 `resolved` / `unresolved` / `refs_unreadable`(`CENTER_REFS_VERDICTS`);值只在 `resolved` 臂的 `values`,`unresolved` 臂的行只有词;只判不决定挂不挂。
127
+ 引用表经公开记录读器 `readPlainStringRecord`(`PLAIN_STRING_RECORD_FAULTS` 三词:`not_plain_record` / `member_not_string` / `member_name_reserved`)读,读不出整张不交、一个变量都不问。读法见 `docs/CONSUMER-INTEGRATION.md` §14。
122
128
  - **一行回显的剥除集**(`src/control-and-bidi.ts`,主 barrel):`CONTROL_AND_BIDI_CHARS`(C0 + DEL + 12 个 `Bidi_Control` 码点,正则字符类体的源码文本)·
123
129
  `stripControlAndBidi(text)` · `hasControlOrBidi(text)`;外来串落成一行(拒句 / 告警 / 日志 / 屏上)前剥的唯一一份,C1 与 U+2028 / U+2029 不在集里;
124
130
  是本包的回显策略(不是引擎双向码点表的镜像),请求面描述器与消费方都读它,禁自存字符类。
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sema-agent/settings-schema",
3
- "version": "14.7.0",
3
+ "version": "14.8.0",
4
4
  "description": "Sema settings schema — pure config contract (zod domains + effective-config + roster resolution + ref-integrity + remoteExec) shared by sema-web-admin, sema-server, and the TOC desktop/CLI. One source of truth. (Renamed at 1.0.0 from @sema-agent/registry-core — name and docs only, no behavior change; note the range moves 0.19.0 -> 1.0.0, so a dependency must become ^1.0.0. The old names @sema-agent/registry-core <=0.19.0 and @sema-ai/registry-core remain published, frozen, for migration.)",
5
5
  "type": "module",
6
6
  "license": "BUSL-1.1",
@@ -148,7 +148,7 @@
148
148
  "prepublishOnly": "npm run build && npm run test"
149
149
  },
150
150
  "devDependencies": {
151
- "@sema-agent/core": "7.53.0",
151
+ "@sema-agent/core": "7.58.0",
152
152
  "@types/node": "^22.10.0",
153
153
  "esbuild": "^0.21.5",
154
154
  "typescript": "^5.7.0",