@sema-agent/settings-schema 17.2.0 → 19.0.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 (141) hide show
  1. package/CHANGELOG.md +216 -0
  2. package/README.md +53 -6
  3. package/conformance/VERSION +1 -1
  4. package/conformance/baseline.json +3 -0
  5. package/conformance/cases/c01-entry-salvage-then-typo/expected.json +4 -1
  6. package/conformance/cases/c02-hosts-clamp-stacked/expected.json +4 -1
  7. package/conformance/cases/c03-literal-dotted-top-key/expected.json +4 -1
  8. package/conformance/cases/c04-all-bad-collection-not-salvaged/expected.json +4 -1
  9. package/conformance/cases/c07-hooks-is-not-a-config-domain/expected.json +4 -1
  10. package/conformance/cases/c08-limits-unknown-carried-64/expected.json +4 -1
  11. package/conformance/cases/c09-limits-unknown-carried-65/expected.json +4 -1
  12. package/conformance/cases/c10-record-key-secret-redacted-twice/expected.json +4 -1
  13. package/conformance/cases/c11-unicode-unknown-keys/expected.json +4 -1
  14. package/conformance/cases/c12-prototype-name-top-keys/expected.json +4 -1
  15. package/conformance/cases/c13-models-field-null/expected.json +4 -1
  16. package/conformance/cases/c14-models-field-empty-array/expected.json +4 -1
  17. package/conformance/cases/c15-models-field-number/expected.json +4 -1
  18. package/conformance/cases/c16-deep-nesting-205/expected.json +3 -0
  19. package/conformance/cases/c17-empty-domain-file/expected.json +3 -0
  20. package/conformance/cases/c18-wire-envelope-not-an-object/expected.json +4 -1
  21. package/conformance/cases/c19-wire-envelope-no-version/expected.json +4 -1
  22. package/conformance/cases/c21-governance-empty-object-wins/expected.json +4 -1
  23. package/conformance/cases/c23-mixed-validity-models/expected.json +4 -1
  24. package/conformance/cases/c24-valid-entries-with-unknown-keys/expected.json +4 -1
  25. package/conformance/cases/c25-published-roundtrip-zero-warnings/expected.json +4 -1
  26. package/conformance/cases/c26-hosts-array-1024/expected.json +4 -1
  27. package/conformance/cases/c27-hosts-array-1025/expected.json +4 -1
  28. package/conformance/cases/c28-large-document-over-1mb/expected.json +4 -1
  29. package/conformance/cases/c29-salvage-then-domain-refine-fails/expected.json +4 -1
  30. package/conformance/cases/c30-version-triple-a-first/expected.json +4 -1
  31. package/conformance/cases/c31-version-triple-b-changed/expected.json +4 -1
  32. package/conformance/cases/c32-version-triple-a-restored/expected.json +4 -1
  33. package/conformance/cases/c33-limits-nested-carried-key/expected.json +4 -1
  34. package/conformance/cases/c34-skills-content-vs-manifest/expected.json +7 -1
  35. package/conformance/cases/c35-portable-domain-file-is-null/expected.json +3 -0
  36. package/conformance/cases/c36-skills-entry-without-content/expected.json +7 -1
  37. package/conformance/cases/c37-skills-field-null/expected.json +6 -0
  38. package/conformance/cases/c38-remote-exec-is-a-non-domain-file/expected.json +4 -1
  39. package/conformance/cases/c39-hidden-file-in-config-d/expected.json +4 -1
  40. package/conformance/cases/c40-s712-identity-only-what-reads-out/expected.json +4 -1
  41. package/conformance/cases/c41-s792-encoded-pem-identity/expected.json +4 -1
  42. package/conformance/cases/c42-s792-unknown-key-secret-redacted/expected.json +4 -1
  43. package/conformance/cases/c43-s792-form-and-deep-encoded-pem/expected.json +4 -1
  44. package/conformance/cases/c44-s792-utf8-escape-glued-token/expected.json +4 -1
  45. package/conformance/cases/c45-s792-identity-bounds-and-decode-depth/expected.json +4 -1
  46. package/conformance/cases/c46-s811-host-name-url-userinfo-withheld/expected.json +4 -1
  47. package/conformance/cases/c47-s811-roles-key-url-userinfo-withheld/expected.json +4 -1
  48. package/conformance/cases/c48-s935-model-headers-transported/expected.json +4 -1
  49. package/conformance/cases/c49-s935-model-headers-secret-entry-dropped/expected.json +4 -1
  50. package/conformance/cases/c50-s784-lane-host-legal/expected.json +4 -1
  51. package/conformance/cases/c51-s784-lane-e2b-legal/expected.json +4 -1
  52. package/conformance/cases/c52-s784-lane-k8s-legal/expected.json +4 -1
  53. package/conformance/cases/c53-s784-lane-ssh-legal/expected.json +4 -1
  54. package/conformance/cases/c54-s784-lane-adb-legal/expected.json +4 -1
  55. package/conformance/cases/c55-s784-lane-local-docker-legal/expected.json +4 -1
  56. package/conformance/cases/c56-s784-lane-device-legal/expected.json +4 -1
  57. package/conformance/cases/c57-s784-g1-enabled-no-lane/expected.json +4 -1
  58. package/conformance/cases/c58-s784-g2-multitenant-host/expected.json +4 -1
  59. package/conformance/cases/c59-s784-g3-k8s-missing-image/expected.json +4 -1
  60. package/conformance/cases/c60-s784-g3-e2b-missing-key/expected.json +4 -1
  61. package/conformance/cases/c61-s784-g3-other-lane-key/expected.json +4 -1
  62. package/conformance/cases/c62-s784-g7a-session-tidb/expected.json +4 -1
  63. package/conformance/cases/c63-s784-host-two-replicas/expected.json +4 -1
  64. package/conformance/cases/c64-s784-multitenant-local-store/expected.json +4 -1
  65. package/conformance/cases/c65-s784-pg-without-db/expected.json +4 -1
  66. package/conformance/cases/c66-s784-memory-backend-mismatch/expected.json +4 -1
  67. package/conformance/cases/c67-s784-retired-field-loud/expected.json +4 -1
  68. package/conformance/cases/c68-s784-device-local-store/expected.json +4 -1
  69. package/conformance/cases/c69-deep-encoded-token-past-every-reading/expected.json +4 -1
  70. package/conformance/cases/c70-rewritten-token-in-front-of-encoded-pem-header/expected.json +4 -1
  71. package/conformance/cases/c71-one-scanner-write-reads-display-forms/expected.json +4 -1
  72. package/conformance/cases/c72-dangling-reference-write-seat-refuses/expected.json +4 -1
  73. package/conformance/cases/c73-projects-extended-registration-reads/expected.json +4 -1
  74. package/conformance/cases/c74-projects-over-bound-refused/expected.json +4 -1
  75. package/conformance/cases/c75-projects-patch-remote-uniqueness/expected.json +4 -1
  76. package/conformance/cases/c76-projects-entry-salvage-nested/expected.json +4 -1
  77. package/conformance/cases/c77-prompts-center-artifact-carried/expected.json +4 -1
  78. package/conformance/cases/c78-prompts-empty-bindings-refused/expected.json +4 -1
  79. package/conformance/cases/c79-prompts-bad-worker-artifact-not-salvaged/expected.json +4 -1
  80. package/conformance/cases/c80-prompts-wire-v2-verbatim/expected.json +7 -1
  81. package/conformance/cases/c81-prompts-declaration-bindings-refused/expected.json +4 -1
  82. package/conformance/cases/c82-prompts-v1-catalog-refused/expected.json +4 -1
  83. package/conformance/cases/c83-prompts-bad-overlay-not-salvaged/expected.json +4 -1
  84. package/conformance/cases/c84-sandbox-git-block-carried-verbatim/expected.json +7 -1
  85. package/conformance/cases/c85-sandbox-git-refused-block-still-carried/expected.json +7 -1
  86. package/conformance/cases/c86-a2a-peers-legal/expected.json +135 -0
  87. package/conformance/cases/c86-a2a-peers-legal/input.json +32 -0
  88. package/conformance/cases/c86-a2a-peers-legal/meta.json +5 -0
  89. package/conformance/cases/c87-a2a-credential-refs-not-partially-salvaged/expected.json +123 -0
  90. package/conformance/cases/c87-a2a-credential-refs-not-partially-salvaged/input.json +39 -0
  91. package/conformance/cases/c87-a2a-credential-refs-not-partially-salvaged/meta.json +5 -0
  92. package/conformance/cases/cc01-mcp-toolfaces-non-object/expected.json +4 -1
  93. package/conformance/cases/cc02-mcp-source-key-is-transported/expected.json +4 -1
  94. package/conformance/cases/cc03-model-compat-unknown-subkey/expected.json +4 -1
  95. package/conformance/cases/cli01-model-name-nfc-vs-nfd/expected.json +4 -1
  96. package/conformance/cases/cli02-control-and-zero-width-chars/expected.json +4 -1
  97. package/conformance/cases/cli03-credential-pasted-into-unknown-key/expected.json +4 -1
  98. package/conformance/cases/cli04-env-value-with-newline/expected.json +4 -1
  99. package/conformance/cases/cli05-long-and-prefix-colliding-names/expected.json +4 -1
  100. package/conformance/cases/t01-absent-domain-key-not-null/expected.json +4 -1
  101. package/conformance/cases/t03-prototype-name-key-not-swallowed/expected.json +4 -1
  102. package/conformance/cases/t04-secret-literal-never-in-warning-value/expected.json +4 -1
  103. package/conformance/cases/z01-every-domain-empty-object/expected.json +4 -1
  104. package/conformance/cases/z02-every-domain-unknown-key/expected.json +4 -1
  105. package/dist/center-refs.d.ts +4 -3
  106. package/dist/center-refs.js +8 -6
  107. package/dist/cli.d.ts +1 -1
  108. package/dist/config-fns.d.ts +6 -1
  109. package/dist/config-fns.js +16 -2
  110. package/dist/execution-lanes.d.ts +158 -11
  111. package/dist/execution-lanes.js +76 -11
  112. package/dist/file-edit.d.ts +1 -1
  113. package/dist/file-edit.js +2 -1
  114. package/dist/hooks-config.d.ts +23 -5
  115. package/dist/hooks-config.js +33 -5
  116. package/dist/hooks.d.ts +6 -4
  117. package/dist/hooks.js +3 -1
  118. package/dist/mcp-request-entry.d.ts +11 -21
  119. package/dist/mcp-request-entry.js +21 -38
  120. package/dist/one-time-migrations.js +1 -1
  121. package/dist/portable-domains.d.ts +1 -1
  122. package/dist/portable-domains.js +1 -1
  123. package/dist/remote-exec.d.ts +5 -0
  124. package/dist/remote-exec.js +5 -0
  125. package/dist/reserved-member-name.d.ts +13 -0
  126. package/dist/reserved-member-name.js +14 -0
  127. package/dist/retired-envs.js +2 -0
  128. package/dist/secret-refs.d.ts +1 -1
  129. package/dist/secret-refs.js +5 -1
  130. package/dist/types.d.ts +70 -41
  131. package/dist/types.js +179 -32
  132. package/dist/url-credential.d.ts +12 -2
  133. package/dist/url-credential.js +164 -9
  134. package/dist/wire-name.d.ts +19 -0
  135. package/dist/wire-name.js +21 -0
  136. package/docs/API-SURFACE.md +27 -6
  137. package/docs/CC-DIVERGENCE.md +2 -2
  138. package/docs/CONSUMER-INTEGRATION.md +72 -7
  139. package/llms-full.txt +38 -18
  140. package/llms.txt +10 -10
  141. package/package.json +1 -1
@@ -0,0 +1,135 @@
1
+ {
2
+ "domains": {
3
+ "outcome": "effective",
4
+ "effective": {
5
+ "a2a": {
6
+ "peers": [
7
+ {
8
+ "allowSkills": [
9
+ "search"
10
+ ],
11
+ "enabled": true,
12
+ "headerRefs": {
13
+ "Authorization": "KB_TOKEN"
14
+ },
15
+ "name": "kb",
16
+ "principalHeader": "X-Principal",
17
+ "scenarios": [],
18
+ "url": "https://kb.example/a2a"
19
+ },
20
+ {
21
+ "cardUrl": "https://ops.example/agent-card.json",
22
+ "enabled": false,
23
+ "name": "ops",
24
+ "scenarios": [
25
+ "oncall"
26
+ ],
27
+ "url": "https://ops.example/"
28
+ }
29
+ ]
30
+ },
31
+ "collab": {
32
+ "templates": []
33
+ },
34
+ "entitlement": {
35
+ "budgetGroups": [],
36
+ "groupBindings": [],
37
+ "subjects": [],
38
+ "tiers": []
39
+ },
40
+ "execution": {
41
+ "allowedLanes": [
42
+ "host"
43
+ ],
44
+ "required": false
45
+ },
46
+ "governance": {},
47
+ "hosts": {
48
+ "hosts": []
49
+ },
50
+ "limits": {},
51
+ "mcp": {
52
+ "servers": []
53
+ },
54
+ "models": {
55
+ "atMention": {
56
+ "mode": "all"
57
+ },
58
+ "models": [],
59
+ "roles": {},
60
+ "tierGroups": []
61
+ },
62
+ "plugins": {
63
+ "plugins": []
64
+ },
65
+ "projects": {
66
+ "projects": {}
67
+ },
68
+ "prompts": {},
69
+ "rosters": {
70
+ "rosters": []
71
+ },
72
+ "scenarios": {
73
+ "scenarios": []
74
+ },
75
+ "skills": {
76
+ "skills": []
77
+ },
78
+ "systems": {
79
+ "systems": []
80
+ },
81
+ "workers": {
82
+ "workers": []
83
+ }
84
+ },
85
+ "warnings": [],
86
+ "metadata": {
87
+ "version": 7,
88
+ "updatedAt": "2026-11-03T00:00:00.000Z"
89
+ }
90
+ },
91
+ "strictWrite": {
92
+ "outcome": "effective",
93
+ "effective": {
94
+ "a2a": {
95
+ "peers": [
96
+ {
97
+ "allowSkills": [
98
+ "search"
99
+ ],
100
+ "enabled": true,
101
+ "headerRefs": {
102
+ "Authorization": "KB_TOKEN"
103
+ },
104
+ "name": "kb",
105
+ "principalHeader": "X-Principal",
106
+ "scenarios": [],
107
+ "url": "https://kb.example/a2a"
108
+ },
109
+ {
110
+ "cardUrl": "https://ops.example/agent-card.json",
111
+ "enabled": false,
112
+ "name": "ops",
113
+ "scenarios": [
114
+ "oncall"
115
+ ],
116
+ "url": "https://ops.example/"
117
+ }
118
+ ]
119
+ }
120
+ },
121
+ "warnings": [],
122
+ "metadata": {
123
+ "version": 7,
124
+ "updatedAt": "2026-11-03T00:00:00.000Z"
125
+ },
126
+ "why": "受理:两个对端都合 `A2aPeerSpec`(URL 不带凭据与 fragment、头名合 token 文法、引用是 env-NAME、对端名可当线上名且不重名);严写收下的就是读腿 a2a 那一格。"
127
+ },
128
+ "wire": {
129
+ "derive": true
130
+ },
131
+ "localRoot": {
132
+ "derive": true,
133
+ "localVersion": 206605001400842
134
+ }
135
+ }
@@ -0,0 +1,32 @@
1
+ {
2
+ "meta": {
3
+ "version": 7,
4
+ "updatedAt": "2026-11-03T00:00:00.000Z"
5
+ },
6
+ "domains": {
7
+ "a2a": {
8
+ "peers": [
9
+ {
10
+ "name": "kb",
11
+ "url": "https://kb.example/a2a",
12
+ "headerRefs": {
13
+ "Authorization": "KB_TOKEN"
14
+ },
15
+ "principalHeader": "X-Principal",
16
+ "allowSkills": [
17
+ "search"
18
+ ]
19
+ },
20
+ {
21
+ "name": "ops",
22
+ "url": "https://ops.example/",
23
+ "cardUrl": "https://ops.example/agent-card.json",
24
+ "scenarios": [
25
+ "oncall"
26
+ ],
27
+ "enabled": false
28
+ }
29
+ ]
30
+ }
31
+ }
32
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "contributor": "contract",
3
+ "claim": "`a2a`(常驻出站 A2A 对端名册)是便携域:两个合法对端在四条腿上同读 —— 缺省物化(缺 `scenarios` ⇒ `[]`、缺 `enabled` ⇒ `true`),停用的对端照样在表里(`enabled: false` 由读方过滤,不是读腿丢),header 值只以 env-NAME 引用出现(`headerRefs`),零告警。本地腿读 `config.d/a2a.json`:在没有这个域的包上,同一份文件报 `unread-config-file`、远端 `/effective.a2a` 原样透传 —— 一个仍按旧读法的读腿会把这条读成「对端名册缺席」或「未校验的原文」。",
4
+ "firstRedOn": []
5
+ }
@@ -0,0 +1,123 @@
1
+ {
2
+ "domains": {
3
+ "outcome": "effective",
4
+ "effective": {
5
+ "a2a": {
6
+ "peers": [
7
+ {
8
+ "enabled": true,
9
+ "headerRefs": {
10
+ "Authorization": "KB_TOKEN"
11
+ },
12
+ "name": "kb",
13
+ "scenarios": [],
14
+ "url": "https://kb.example/a2a"
15
+ },
16
+ {
17
+ "allowSkills": [
18
+ "search"
19
+ ],
20
+ "enabled": true,
21
+ "name": "narrow",
22
+ "scenarios": [],
23
+ "url": "https://narrow.example/a2a"
24
+ }
25
+ ]
26
+ },
27
+ "collab": {
28
+ "templates": []
29
+ },
30
+ "entitlement": {
31
+ "budgetGroups": [],
32
+ "groupBindings": [],
33
+ "subjects": [],
34
+ "tiers": []
35
+ },
36
+ "execution": {
37
+ "allowedLanes": [
38
+ "host"
39
+ ],
40
+ "required": false
41
+ },
42
+ "governance": {},
43
+ "hosts": {
44
+ "hosts": []
45
+ },
46
+ "limits": {},
47
+ "mcp": {
48
+ "servers": []
49
+ },
50
+ "models": {
51
+ "atMention": {
52
+ "mode": "all"
53
+ },
54
+ "models": [],
55
+ "roles": {},
56
+ "tierGroups": []
57
+ },
58
+ "plugins": {
59
+ "plugins": []
60
+ },
61
+ "projects": {
62
+ "projects": {}
63
+ },
64
+ "prompts": {},
65
+ "rosters": {
66
+ "rosters": []
67
+ },
68
+ "scenarios": {
69
+ "scenarios": []
70
+ },
71
+ "skills": {
72
+ "skills": []
73
+ },
74
+ "systems": {
75
+ "systems": []
76
+ },
77
+ "workers": {
78
+ "workers": []
79
+ }
80
+ },
81
+ "warnings": [
82
+ {
83
+ "domain": "a2a",
84
+ "identity": {
85
+ "name": "half"
86
+ },
87
+ "kind": "entry-dropped",
88
+ "path": [
89
+ "peers",
90
+ 1
91
+ ],
92
+ "reasonCode": "entry-schema-invalid"
93
+ },
94
+ {
95
+ "domain": "a2a",
96
+ "kind": "entry-dropped",
97
+ "path": [
98
+ "peers",
99
+ 2,
100
+ "allowSkills",
101
+ 1
102
+ ],
103
+ "reasonCode": "entry-schema-invalid"
104
+ }
105
+ ],
106
+ "metadata": {
107
+ "version": 7,
108
+ "updatedAt": "2026-11-03T00:00:00.000Z"
109
+ }
110
+ },
111
+ "strictWrite": {
112
+ "outcome": "rejected",
113
+ "stage": "validate",
114
+ "why": "拒:`half` 的一条 header 引用不是 env-NAME、`half` 与 `narrow` 的 `allowSkills` 各有一个空串 —— 写是一个动作,一处坏整份不受理。"
115
+ },
116
+ "wire": {
117
+ "derive": true
118
+ },
119
+ "localRoot": {
120
+ "derive": true,
121
+ "localVersion": 3675868689326288
122
+ }
123
+ }
@@ -0,0 +1,39 @@
1
+ {
2
+ "meta": {
3
+ "version": 7,
4
+ "updatedAt": "2026-11-03T00:00:00.000Z"
5
+ },
6
+ "domains": {
7
+ "a2a": {
8
+ "peers": [
9
+ {
10
+ "name": "kb",
11
+ "url": "https://kb.example/a2a",
12
+ "headerRefs": {
13
+ "Authorization": "KB_TOKEN"
14
+ }
15
+ },
16
+ {
17
+ "name": "half",
18
+ "url": "https://half.example/a2a",
19
+ "headerRefs": {
20
+ "Authorization": "HALF_TOKEN",
21
+ "X-Tenant": "not an env name"
22
+ },
23
+ "allowSkills": [
24
+ "search",
25
+ ""
26
+ ]
27
+ },
28
+ {
29
+ "name": "narrow",
30
+ "url": "https://narrow.example/a2a",
31
+ "allowSkills": [
32
+ "search",
33
+ ""
34
+ ]
35
+ }
36
+ ]
37
+ }
38
+ }
39
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "contributor": "contract",
3
+ "claim": "凭据引用集合不可部分抢救:对端 `half` 的 `headerRefs` 里一条引用坏形(值不是 env-NAME)⇒ **整个对端** `entry-dropped`(域 `a2a`、坐标 `[\"peers\",1]`、身份 `half`),不是只丢那一条引用、留下一个带着一半凭据去拨远端的对端;兄弟 `kb` 原样保留。对照组 `narrow`:非凭据集合(`allowSkills`)里的坏元素照旧逐条丢(坐标 `[\"peers\",2,\"allowSkills\",1]`;丢了只会更窄),对端本身活下来。严写腿整份拒。一个对每个 Record 都逐条抢救的读腿会把 `half` 读成「只带 Authorization 的对端」。",
4
+ "firstRedOn": []
5
+ }
@@ -2,6 +2,9 @@
2
2
  "domains": {
3
3
  "outcome": "effective",
4
4
  "effective": {
5
+ "a2a": {
6
+ "peers": []
7
+ },
5
8
  "collab": {
6
9
  "templates": []
7
10
  },
@@ -161,6 +164,6 @@
161
164
  },
162
165
  "localRoot": {
163
166
  "derive": true,
164
- "localVersion": 197807763204275
167
+ "localVersion": 3253988119103129
165
168
  }
166
169
  }
@@ -2,6 +2,9 @@
2
2
  "domains": {
3
3
  "outcome": "effective",
4
4
  "effective": {
5
+ "a2a": {
6
+ "peers": []
7
+ },
5
8
  "collab": {
6
9
  "templates": []
7
10
  },
@@ -107,6 +110,6 @@
107
110
  },
108
111
  "localRoot": {
109
112
  "derive": true,
110
- "localVersion": 2482576595667034
113
+ "localVersion": 3591318400132154
111
114
  }
112
115
  }
@@ -2,6 +2,9 @@
2
2
  "domains": {
3
3
  "outcome": "effective",
4
4
  "effective": {
5
+ "a2a": {
6
+ "peers": []
7
+ },
5
8
  "collab": {
6
9
  "templates": []
7
10
  },
@@ -116,6 +119,6 @@
116
119
  },
117
120
  "localRoot": {
118
121
  "derive": true,
119
- "localVersion": 4345724001787046
122
+ "localVersion": 1663867526020649
120
123
  }
121
124
  }
@@ -2,6 +2,9 @@
2
2
  "domains": {
3
3
  "outcome": "effective",
4
4
  "effective": {
5
+ "a2a": {
6
+ "peers": []
7
+ },
5
8
  "collab": {
6
9
  "templates": []
7
10
  },
@@ -112,6 +115,6 @@
112
115
  },
113
116
  "localRoot": {
114
117
  "derive": true,
115
- "localVersion": 694685728514477
118
+ "localVersion": 2654544430240950
116
119
  }
117
120
  }
@@ -2,6 +2,9 @@
2
2
  "domains": {
3
3
  "outcome": "effective",
4
4
  "effective": {
5
+ "a2a": {
6
+ "peers": []
7
+ },
5
8
  "collab": {
6
9
  "templates": []
7
10
  },
@@ -125,6 +128,6 @@
125
128
  },
126
129
  "localRoot": {
127
130
  "derive": true,
128
- "localVersion": 4213710307592750
131
+ "localVersion": 3769852229872529
129
132
  }
130
133
  }
@@ -2,6 +2,9 @@
2
2
  "domains": {
3
3
  "outcome": "effective",
4
4
  "effective": {
5
+ "a2a": {
6
+ "peers": []
7
+ },
5
8
  "collab": {
6
9
  "templates": []
7
10
  },
@@ -121,6 +124,6 @@
121
124
  },
122
125
  "localRoot": {
123
126
  "derive": true,
124
- "localVersion": 2617555914511015
127
+ "localVersion": 1531100058823047
125
128
  }
126
129
  }
@@ -2,6 +2,9 @@
2
2
  "domains": {
3
3
  "outcome": "effective",
4
4
  "effective": {
5
+ "a2a": {
6
+ "peers": []
7
+ },
5
8
  "collab": {
6
9
  "templates": []
7
10
  },
@@ -149,6 +152,6 @@
149
152
  },
150
153
  "localRoot": {
151
154
  "derive": true,
152
- "localVersion": 2617555914511015
155
+ "localVersion": 1531100058823047
153
156
  }
154
157
  }
@@ -2,6 +2,9 @@
2
2
  "domains": {
3
3
  "outcome": "effective",
4
4
  "effective": {
5
+ "a2a": {
6
+ "peers": []
7
+ },
5
8
  "collab": {
6
9
  "templates": []
7
10
  },
@@ -148,6 +151,6 @@
148
151
  },
149
152
  "localRoot": {
150
153
  "derive": true,
151
- "localVersion": 1318036626730287
154
+ "localVersion": 3555569200054848
152
155
  }
153
156
  }
@@ -2,6 +2,9 @@
2
2
  "domains": {
3
3
  "outcome": "effective",
4
4
  "effective": {
5
+ "a2a": {
6
+ "peers": []
7
+ },
5
8
  "collab": {
6
9
  "templates": []
7
10
  },
@@ -91,6 +94,6 @@
91
94
  },
92
95
  "localRoot": {
93
96
  "derive": true,
94
- "localVersion": 2247688933988744
97
+ "localVersion": 1409565868890479
95
98
  }
96
99
  }
@@ -2,6 +2,9 @@
2
2
  "domains": {
3
3
  "outcome": "effective",
4
4
  "effective": {
5
+ "a2a": {
6
+ "peers": []
7
+ },
5
8
  "collab": {
6
9
  "templates": []
7
10
  },
@@ -152,6 +155,6 @@
152
155
  },
153
156
  "localRoot": {
154
157
  "derive": true,
155
- "localVersion": 3232605402901914
158
+ "localVersion": 3557208461559525
156
159
  }
157
160
  }
@@ -2,6 +2,9 @@
2
2
  "domains": {
3
3
  "outcome": "effective",
4
4
  "effective": {
5
+ "a2a": {
6
+ "peers": []
7
+ },
5
8
  "collab": {
6
9
  "templates": []
7
10
  },
@@ -108,6 +111,6 @@
108
111
  },
109
112
  "localRoot": {
110
113
  "derive": true,
111
- "localVersion": 2614200563056761
114
+ "localVersion": 3944259292559843
112
115
  }
113
116
  }
@@ -2,6 +2,9 @@
2
2
  "domains": {
3
3
  "outcome": "effective",
4
4
  "effective": {
5
+ "a2a": {
6
+ "peers": []
7
+ },
5
8
  "collab": {
6
9
  "templates": []
7
10
  },
@@ -131,6 +134,6 @@
131
134
  },
132
135
  "localRoot": {
133
136
  "derive": true,
134
- "localVersion": 499959296543014
137
+ "localVersion": 3006809479574243
135
138
  }
136
139
  }
@@ -2,6 +2,9 @@
2
2
  "domains": {
3
3
  "outcome": "effective",
4
4
  "effective": {
5
+ "a2a": {
6
+ "peers": []
7
+ },
5
8
  "collab": {
6
9
  "templates": []
7
10
  },
@@ -425,6 +428,6 @@
425
428
  },
426
429
  "localRoot": {
427
430
  "derive": true,
428
- "localVersion": 567413778934550
431
+ "localVersion": 1287865876181806
429
432
  }
430
433
  }
@@ -8,8 +8,9 @@
8
8
  * ## 律(一条)
9
9
  * 引用表怎么读、每个变量怎么问、读不出怎么说,只有这一处:
10
10
  * · **引用表经公开的记录读器读**({@link readPlainStringRecord}:同一个函数、同一张原因词表 {@link PLAIN_STRING_RECORD_FAULTS}),不另写形状 / 描述符判据。读不出(整张不是纯数据、有成员的变量名不是串、
11
- * 读成员就抛、叫 `__proto__` 的成员)⇒ 整台结论 `refs_unreadable`,带读器的词,**一个变量都不问** —— 引用表本身不可信时,问了的值也没有可以挂的地方。
12
- * 读器会把叫 `__proto__` 的串值成员**剔出副本**交其余;本口不许这样悄悄丢一条引用再挂一台少了鉴权的 server,所以同样答 `refs_unreadable`、词 `member_name_reserved`。
11
+ * 读成员就抛、叫保留名 `__proto__` / `constructor` / `prototype` 的成员)⇒ 整台结论 `refs_unreadable`,带读器的词,**一个变量都不问** —— 引用表本身不可信时,问了的值也没有可以挂的地方。
12
+ * 读器会把叫保留名的串值成员**剔出副本**交其余;本口不许这样悄悄丢一条引用再挂一台少了鉴权的 server,所以同样答 `refs_unreadable`、词 `member_name_reserved`,点名第一个(自有键序)。
13
+ * 保留名只有一张表(`./reserved-member-name`):域 schema 的凭据引用集合拒同一组名字,两个读口同答。
13
14
  * · **查找函数 `lookup(name)` 由调用方给**,本口**不读 `process.env`**(源里没有 `process` / `globalThis`;宿主怎么读环境、读哪一层环境、要不要缓存,都是调用方的事)。没给 / 不是函数 ⇒ `TypeError`
14
15
  * (这是调用方的编程错,不是数据错:不折成成员的 `read_threw`,更不回落任何环境)。
15
16
  * · 每个成员恰问一次 `lookup`(按引用表副本的自有键序 —— 整数形的键在前、其余按记录列出的次序;实参只有变量名一个),判成**一个词**({@link CenterRefMemberVerdict}):
@@ -23,7 +24,7 @@
23
24
  *
24
25
  * ## 读数的构造
25
26
  * 成员表用 `map`,`values` 用 `Object.defineProperty` + 零原型描述符({@link dataDescriptor})逐键写进一个新对象(定义语义,不走 [[Set]]):`Object.prototype` 上挂了数字键 setter 时目标键 `"0"` 的值也不会被吞;
26
- * `constructor` / `toString` 这类原型链上的名字作目标键照落成自有数据属性。交出的 `values` 原型是 `Object.prototype`,与读器交出的副本同形。
27
+ * `toString` / `hasOwnProperty` 这类不在保留名表里的原型链名字作目标键照落成自有数据属性。交出的 `values` 原型是 `Object.prototype`,与读器交出的副本同形。
27
28
  */
28
29
  import { type PlainStringRecordFault } from "./mcp-request-entry.js";
29
30
  /** 一个成员没解到的**原因词**,闭集,三个:`missing_name`(查找函数答 `undefined` —— 变量没设)· `not_a_string`(答了别的种类)· `read_threw`(查找函数抛了)。消费方按词分派,穷尽 `switch`,不读句子(本口没有句子)。 */
@@ -8,8 +8,9 @@
8
8
  * ## 律(一条)
9
9
  * 引用表怎么读、每个变量怎么问、读不出怎么说,只有这一处:
10
10
  * · **引用表经公开的记录读器读**({@link readPlainStringRecord}:同一个函数、同一张原因词表 {@link PLAIN_STRING_RECORD_FAULTS}),不另写形状 / 描述符判据。读不出(整张不是纯数据、有成员的变量名不是串、
11
- * 读成员就抛、叫 `__proto__` 的成员)⇒ 整台结论 `refs_unreadable`,带读器的词,**一个变量都不问** —— 引用表本身不可信时,问了的值也没有可以挂的地方。
12
- * 读器会把叫 `__proto__` 的串值成员**剔出副本**交其余;本口不许这样悄悄丢一条引用再挂一台少了鉴权的 server,所以同样答 `refs_unreadable`、词 `member_name_reserved`。
11
+ * 读成员就抛、叫保留名 `__proto__` / `constructor` / `prototype` 的成员)⇒ 整台结论 `refs_unreadable`,带读器的词,**一个变量都不问** —— 引用表本身不可信时,问了的值也没有可以挂的地方。
12
+ * 读器会把叫保留名的串值成员**剔出副本**交其余;本口不许这样悄悄丢一条引用再挂一台少了鉴权的 server,所以同样答 `refs_unreadable`、词 `member_name_reserved`,点名第一个(自有键序)。
13
+ * 保留名只有一张表(`./reserved-member-name`):域 schema 的凭据引用集合拒同一组名字,两个读口同答。
13
14
  * · **查找函数 `lookup(name)` 由调用方给**,本口**不读 `process.env`**(源里没有 `process` / `globalThis`;宿主怎么读环境、读哪一层环境、要不要缓存,都是调用方的事)。没给 / 不是函数 ⇒ `TypeError`
14
15
  * (这是调用方的编程错,不是数据错:不折成成员的 `read_threw`,更不回落任何环境)。
15
16
  * · 每个成员恰问一次 `lookup`(按引用表副本的自有键序 —— 整数形的键在前、其余按记录列出的次序;实参只有变量名一个),判成**一个词**({@link CenterRefMemberVerdict}):
@@ -23,9 +24,9 @@
23
24
  *
24
25
  * ## 读数的构造
25
26
  * 成员表用 `map`,`values` 用 `Object.defineProperty` + 零原型描述符({@link dataDescriptor})逐键写进一个新对象(定义语义,不走 [[Set]]):`Object.prototype` 上挂了数字键 setter 时目标键 `"0"` 的值也不会被吞;
26
- * `constructor` / `toString` 这类原型链上的名字作目标键照落成自有数据属性。交出的 `values` 原型是 `Object.prototype`,与读器交出的副本同形。
27
+ * `toString` / `hasOwnProperty` 这类不在保留名表里的原型链名字作目标键照落成自有数据属性。交出的 `values` 原型是 `Object.prototype`,与读器交出的副本同形。
27
28
  */
28
- import { PLAIN_STRING_RECORD_RESERVED_MEMBER, readPlainStringRecord } from "./mcp-request-entry.js";
29
+ import { readPlainStringRecord } from "./mcp-request-entry.js";
29
30
  import { dataDescriptor, inspect } from "./own-key-read.js";
30
31
  /** 一个成员没解到的**原因词**,闭集,三个:`missing_name`(查找函数答 `undefined` —— 变量没设)· `not_a_string`(答了别的种类)· `read_threw`(查找函数抛了)。消费方按词分派,穷尽 `switch`,不读句子(本口没有句子)。 */
31
32
  export const CENTER_REF_FAULTS = ["missing_name", "not_a_string", "read_threw"];
@@ -55,8 +56,9 @@ export function resolveCenterRefs(refs, lookup) {
55
56
  const read = readPlainStringRecord(refs);
56
57
  if (!read.ok)
57
58
  return { verdict: "refs_unreadable", fault: read.fault, ...(read.member !== undefined ? { member: read.member } : {}) };
58
- if (read.reservedMember)
59
- return { verdict: "refs_unreadable", fault: "member_name_reserved", member: PLAIN_STRING_RECORD_RESERVED_MEMBER };
59
+ const [reserved] = read.reservedMembers;
60
+ if (reserved !== undefined)
61
+ return { verdict: "refs_unreadable", fault: "member_name_reserved", member: reserved };
60
62
  const judged = Object.entries(read.record).map((pair) => ({ key: pair[0], ref: pair[1], answer: answerOf(pair[1], lookup) }));
61
63
  const members = judged.map((j) => ({ key: j.key, ref: j.ref, verdict: j.answer.verdict }));
62
64
  if (judged.some((j) => j.answer.verdict !== "resolved"))
package/dist/cli.d.ts CHANGED
@@ -35,5 +35,5 @@ export interface SettingsSchemaCliIo extends ConfigDirectoryIo {
35
35
  stderr(text: string): void;
36
36
  }
37
37
  /** 命令行的覆盖面:全部配置域、retired 域(便携与否不论 —— 离线的 `workers.json` 一样迁)与 `remote-exec.json`。 */
38
- export declare const COVERED_DOCUMENTS: ("remote-exec" | "models" | "rosters" | "scenarios" | "skills" | "execution" | "plugins" | "systems" | "limits" | "runtime" | "workers" | "hosts" | "projects" | "mcp" | "collab" | "governance" | "entitlement" | "prompts")[];
38
+ export declare const COVERED_DOCUMENTS: ("remote-exec" | "models" | "rosters" | "scenarios" | "skills" | "execution" | "plugins" | "systems" | "limits" | "runtime" | "workers" | "hosts" | "projects" | "mcp" | "collab" | "governance" | "entitlement" | "prompts" | "a2a")[];
39
39
  export declare function runSettingsSchemaCli(argv: readonly string[], io: SettingsSchemaCliIo): Promise<number>;