@sema-agent/settings-schema 1.7.0 → 1.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -6,6 +6,15 @@
6
6
  > `@sema-agent/registry-core`(更早还曾是 `@sema-ai/registry-core`)。本档 `0.19.0` 以下各节里的
7
7
  > 包名是**历史记录**,如实保留不追改。
8
8
 
9
+ ## 1.7.1 — 2026-09-06 — `source` 改**只管类型**(撤回 1.7.0 的 min/max 解析拒;patch)
10
+
11
+ - 1.7.0 把标签规则(非空 ≤80)写进 zod ⇒ 本域整域 all-or-nothing 解析下,**一个**空/超长标签让整套 `mcp.servers`
12
+ 在解析处整域默认(每台 server 消失),消费方 boot 期还容忍空目录——一个显示标签不该有这种爆炸半径
13
+ (消费方 codex 对抗复审 [high],真库复现:一坏一好两条 server 双双消失)。1.7.1 起 `source: z.string().optional()`,
14
+ 规则单点留在消费方投影层(坏形丢键留 server、留痕)。非字符串仍在解析处拒(那是 JSON 类型错,与任何字段同类)。
15
+ - 顺带如实记:本域 all-or-nothing 解析 + 消费方 boot 容忍空目录,对 `contentOrigin` 闭表等一切解析拒的键**早已**是
16
+ 同一爆炸半径(类病,先于本键存在)——归消费方与本包另立单据处置(逐条目拒而不是整域拒),不在本 patch 射程。
17
+
9
18
  ## 1.7.0 — 2026-09-06 — `mcp.servers[].source` 分组标签(sema-server B-036 / S-143 源头修的声明面半场;新键=minor)
10
19
 
11
20
  - **`McpServerSpec.source?: string`**(非空、≤80 字;`.optional()` 无默认):声明方自述的层级标签,1:1 对应引擎
package/dist/types.d.ts CHANGED
@@ -7322,11 +7322,15 @@ export declare const McpServerSpec: z.ZodObject<{
7322
7322
  * consumer can group servers by where they were declared). An OPEN set: CC's `plugin` / `user` /
7323
7323
  * `project` / `local` are conventions, not a vocabulary — a deployment's own word is equally legal, so
7324
7324
  * no closed table here (a closed table would reject the operator's grouping word at parse). ABSENT =
7325
- * no label (`.optional()`, no default — a label has no default tier). Empty / over-cap / non-string is
7326
- * REJECTED at parse: a malformed label must not enter the ledger silently. Display-only: no gate /
7327
- * policy / trust effect (the trust axis is `contentOrigin` above, which stays a closed table).
7328
- * Before this key existed both legs stripped it (default-strip object); this is the declaration half of
7329
- * the consumer-side fix (ticket B-036 / S-143), the projection half lives in the consumer. */
7325
+ * no label (`.optional()`, no default — a label has no default tier). 🔴 TYPE-ONLY here (any string):
7326
+ * the label RULE (non-empty, ≤80 chars) lives in ONE place — the consumer's projection helper, which
7327
+ * drops a malformed label's KEY, keeps the server and records the drop. It deliberately does NOT live
7328
+ * here: this domain parses all-or-nothing, so a `min(1)`/`max(80)` at parse would let one empty label
7329
+ * default the ENTIRE mcp domain (every server gone) — a blast radius a display label must never have
7330
+ * (1.7.0 shipped that shape for a few hours; 1.7.1 retracts it). Display-only: no gate / policy / trust
7331
+ * effect (the trust axis is `contentOrigin` above, which stays a closed table). Before this key existed
7332
+ * both legs stripped it (default-strip object); this is the declaration half of the consumer-side fix
7333
+ * (ticket B-036 / S-143), the projection half lives in the consumer. */
7330
7334
  source: z.ZodOptional<z.ZodString>;
7331
7335
  notes: z.ZodOptional<z.ZodString>;
7332
7336
  }, "strip", z.ZodTypeAny, {
@@ -7447,11 +7451,15 @@ export declare const McpConfig: z.ZodEffects<z.ZodObject<{
7447
7451
  * consumer can group servers by where they were declared). An OPEN set: CC's `plugin` / `user` /
7448
7452
  * `project` / `local` are conventions, not a vocabulary — a deployment's own word is equally legal, so
7449
7453
  * no closed table here (a closed table would reject the operator's grouping word at parse). ABSENT =
7450
- * no label (`.optional()`, no default — a label has no default tier). Empty / over-cap / non-string is
7451
- * REJECTED at parse: a malformed label must not enter the ledger silently. Display-only: no gate /
7452
- * policy / trust effect (the trust axis is `contentOrigin` above, which stays a closed table).
7453
- * Before this key existed both legs stripped it (default-strip object); this is the declaration half of
7454
- * the consumer-side fix (ticket B-036 / S-143), the projection half lives in the consumer. */
7454
+ * no label (`.optional()`, no default — a label has no default tier). 🔴 TYPE-ONLY here (any string):
7455
+ * the label RULE (non-empty, ≤80 chars) lives in ONE place — the consumer's projection helper, which
7456
+ * drops a malformed label's KEY, keeps the server and records the drop. It deliberately does NOT live
7457
+ * here: this domain parses all-or-nothing, so a `min(1)`/`max(80)` at parse would let one empty label
7458
+ * default the ENTIRE mcp domain (every server gone) — a blast radius a display label must never have
7459
+ * (1.7.0 shipped that shape for a few hours; 1.7.1 retracts it). Display-only: no gate / policy / trust
7460
+ * effect (the trust axis is `contentOrigin` above, which stays a closed table). Before this key existed
7461
+ * both legs stripped it (default-strip object); this is the declaration half of the consumer-side fix
7462
+ * (ticket B-036 / S-143), the projection half lives in the consumer. */
7455
7463
  source: z.ZodOptional<z.ZodString>;
7456
7464
  notes: z.ZodOptional<z.ZodString>;
7457
7465
  }, "strip", z.ZodTypeAny, {
@@ -10114,11 +10122,15 @@ export declare const DOMAIN_SCHEMAS: {
10114
10122
  * consumer can group servers by where they were declared). An OPEN set: CC's `plugin` / `user` /
10115
10123
  * `project` / `local` are conventions, not a vocabulary — a deployment's own word is equally legal, so
10116
10124
  * no closed table here (a closed table would reject the operator's grouping word at parse). ABSENT =
10117
- * no label (`.optional()`, no default — a label has no default tier). Empty / over-cap / non-string is
10118
- * REJECTED at parse: a malformed label must not enter the ledger silently. Display-only: no gate /
10119
- * policy / trust effect (the trust axis is `contentOrigin` above, which stays a closed table).
10120
- * Before this key existed both legs stripped it (default-strip object); this is the declaration half of
10121
- * the consumer-side fix (ticket B-036 / S-143), the projection half lives in the consumer. */
10125
+ * no label (`.optional()`, no default — a label has no default tier). 🔴 TYPE-ONLY here (any string):
10126
+ * the label RULE (non-empty, ≤80 chars) lives in ONE place — the consumer's projection helper, which
10127
+ * drops a malformed label's KEY, keeps the server and records the drop. It deliberately does NOT live
10128
+ * here: this domain parses all-or-nothing, so a `min(1)`/`max(80)` at parse would let one empty label
10129
+ * default the ENTIRE mcp domain (every server gone) — a blast radius a display label must never have
10130
+ * (1.7.0 shipped that shape for a few hours; 1.7.1 retracts it). Display-only: no gate / policy / trust
10131
+ * effect (the trust axis is `contentOrigin` above, which stays a closed table). Before this key existed
10132
+ * both legs stripped it (default-strip object); this is the declaration half of the consumer-side fix
10133
+ * (ticket B-036 / S-143), the projection half lives in the consumer. */
10122
10134
  source: z.ZodOptional<z.ZodString>;
10123
10135
  notes: z.ZodOptional<z.ZodString>;
10124
10136
  }, "strip", z.ZodTypeAny, {
package/dist/types.js CHANGED
@@ -1893,12 +1893,16 @@ export const McpServerSpec = z.object({
1893
1893
  * consumer can group servers by where they were declared). An OPEN set: CC's `plugin` / `user` /
1894
1894
  * `project` / `local` are conventions, not a vocabulary — a deployment's own word is equally legal, so
1895
1895
  * no closed table here (a closed table would reject the operator's grouping word at parse). ABSENT =
1896
- * no label (`.optional()`, no default — a label has no default tier). Empty / over-cap / non-string is
1897
- * REJECTED at parse: a malformed label must not enter the ledger silently. Display-only: no gate /
1898
- * policy / trust effect (the trust axis is `contentOrigin` above, which stays a closed table).
1899
- * Before this key existed both legs stripped it (default-strip object); this is the declaration half of
1900
- * the consumer-side fix (ticket B-036 / S-143), the projection half lives in the consumer. */
1901
- source: z.string().min(1).max(80).optional(),
1896
+ * no label (`.optional()`, no default — a label has no default tier). 🔴 TYPE-ONLY here (any string):
1897
+ * the label RULE (non-empty, ≤80 chars) lives in ONE place — the consumer's projection helper, which
1898
+ * drops a malformed label's KEY, keeps the server and records the drop. It deliberately does NOT live
1899
+ * here: this domain parses all-or-nothing, so a `min(1)`/`max(80)` at parse would let one empty label
1900
+ * default the ENTIRE mcp domain (every server gone) — a blast radius a display label must never have
1901
+ * (1.7.0 shipped that shape for a few hours; 1.7.1 retracts it). Display-only: no gate / policy / trust
1902
+ * effect (the trust axis is `contentOrigin` above, which stays a closed table). Before this key existed
1903
+ * both legs stripped it (default-strip object); this is the declaration half of the consumer-side fix
1904
+ * (ticket B-036 / S-143), the projection half lives in the consumer. */
1905
+ source: z.string().optional(),
1902
1906
  notes: z.string().optional(),
1903
1907
  });
1904
1908
  export const McpConfig = z
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sema-agent/settings-schema",
3
- "version": "1.7.0",
3
+ "version": "1.7.1",
4
4
  "description": "Sema settings schema — pure config contract (zod domains + effective-config + roster resolution + ref-integrity + remoteExec) shared by sema-registry, 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",