@sema-agent/settings-schema 17.2.0 → 18.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.
- package/CHANGELOG.md +166 -0
- package/README.md +41 -5
- package/conformance/VERSION +1 -1
- package/conformance/baseline.json +3 -0
- package/conformance/cases/c01-entry-salvage-then-typo/expected.json +4 -1
- package/conformance/cases/c02-hosts-clamp-stacked/expected.json +4 -1
- package/conformance/cases/c03-literal-dotted-top-key/expected.json +4 -1
- package/conformance/cases/c04-all-bad-collection-not-salvaged/expected.json +4 -1
- package/conformance/cases/c07-hooks-is-not-a-config-domain/expected.json +4 -1
- package/conformance/cases/c08-limits-unknown-carried-64/expected.json +4 -1
- package/conformance/cases/c09-limits-unknown-carried-65/expected.json +4 -1
- package/conformance/cases/c10-record-key-secret-redacted-twice/expected.json +4 -1
- package/conformance/cases/c11-unicode-unknown-keys/expected.json +4 -1
- package/conformance/cases/c12-prototype-name-top-keys/expected.json +4 -1
- package/conformance/cases/c13-models-field-null/expected.json +4 -1
- package/conformance/cases/c14-models-field-empty-array/expected.json +4 -1
- package/conformance/cases/c15-models-field-number/expected.json +4 -1
- package/conformance/cases/c16-deep-nesting-205/expected.json +3 -0
- package/conformance/cases/c17-empty-domain-file/expected.json +3 -0
- package/conformance/cases/c18-wire-envelope-not-an-object/expected.json +4 -1
- package/conformance/cases/c19-wire-envelope-no-version/expected.json +4 -1
- package/conformance/cases/c21-governance-empty-object-wins/expected.json +4 -1
- package/conformance/cases/c23-mixed-validity-models/expected.json +4 -1
- package/conformance/cases/c24-valid-entries-with-unknown-keys/expected.json +4 -1
- package/conformance/cases/c25-published-roundtrip-zero-warnings/expected.json +4 -1
- package/conformance/cases/c26-hosts-array-1024/expected.json +4 -1
- package/conformance/cases/c27-hosts-array-1025/expected.json +4 -1
- package/conformance/cases/c28-large-document-over-1mb/expected.json +4 -1
- package/conformance/cases/c29-salvage-then-domain-refine-fails/expected.json +4 -1
- package/conformance/cases/c30-version-triple-a-first/expected.json +4 -1
- package/conformance/cases/c31-version-triple-b-changed/expected.json +4 -1
- package/conformance/cases/c32-version-triple-a-restored/expected.json +4 -1
- package/conformance/cases/c33-limits-nested-carried-key/expected.json +4 -1
- package/conformance/cases/c34-skills-content-vs-manifest/expected.json +7 -1
- package/conformance/cases/c35-portable-domain-file-is-null/expected.json +3 -0
- package/conformance/cases/c36-skills-entry-without-content/expected.json +7 -1
- package/conformance/cases/c37-skills-field-null/expected.json +6 -0
- package/conformance/cases/c38-remote-exec-is-a-non-domain-file/expected.json +4 -1
- package/conformance/cases/c39-hidden-file-in-config-d/expected.json +4 -1
- package/conformance/cases/c40-s712-identity-only-what-reads-out/expected.json +4 -1
- package/conformance/cases/c41-s792-encoded-pem-identity/expected.json +4 -1
- package/conformance/cases/c42-s792-unknown-key-secret-redacted/expected.json +4 -1
- package/conformance/cases/c43-s792-form-and-deep-encoded-pem/expected.json +4 -1
- package/conformance/cases/c44-s792-utf8-escape-glued-token/expected.json +4 -1
- package/conformance/cases/c45-s792-identity-bounds-and-decode-depth/expected.json +4 -1
- package/conformance/cases/c46-s811-host-name-url-userinfo-withheld/expected.json +4 -1
- package/conformance/cases/c47-s811-roles-key-url-userinfo-withheld/expected.json +4 -1
- package/conformance/cases/c48-s935-model-headers-transported/expected.json +4 -1
- package/conformance/cases/c49-s935-model-headers-secret-entry-dropped/expected.json +4 -1
- package/conformance/cases/c50-s784-lane-host-legal/expected.json +4 -1
- package/conformance/cases/c51-s784-lane-e2b-legal/expected.json +4 -1
- package/conformance/cases/c52-s784-lane-k8s-legal/expected.json +4 -1
- package/conformance/cases/c53-s784-lane-ssh-legal/expected.json +4 -1
- package/conformance/cases/c54-s784-lane-adb-legal/expected.json +4 -1
- package/conformance/cases/c55-s784-lane-local-docker-legal/expected.json +4 -1
- package/conformance/cases/c56-s784-lane-device-legal/expected.json +4 -1
- package/conformance/cases/c57-s784-g1-enabled-no-lane/expected.json +4 -1
- package/conformance/cases/c58-s784-g2-multitenant-host/expected.json +4 -1
- package/conformance/cases/c59-s784-g3-k8s-missing-image/expected.json +4 -1
- package/conformance/cases/c60-s784-g3-e2b-missing-key/expected.json +4 -1
- package/conformance/cases/c61-s784-g3-other-lane-key/expected.json +4 -1
- package/conformance/cases/c62-s784-g7a-session-tidb/expected.json +4 -1
- package/conformance/cases/c63-s784-host-two-replicas/expected.json +4 -1
- package/conformance/cases/c64-s784-multitenant-local-store/expected.json +4 -1
- package/conformance/cases/c65-s784-pg-without-db/expected.json +4 -1
- package/conformance/cases/c66-s784-memory-backend-mismatch/expected.json +4 -1
- package/conformance/cases/c67-s784-retired-field-loud/expected.json +4 -1
- package/conformance/cases/c68-s784-device-local-store/expected.json +4 -1
- package/conformance/cases/c69-deep-encoded-token-past-every-reading/expected.json +4 -1
- package/conformance/cases/c70-rewritten-token-in-front-of-encoded-pem-header/expected.json +4 -1
- package/conformance/cases/c71-one-scanner-write-reads-display-forms/expected.json +4 -1
- package/conformance/cases/c72-dangling-reference-write-seat-refuses/expected.json +4 -1
- package/conformance/cases/c73-projects-extended-registration-reads/expected.json +4 -1
- package/conformance/cases/c74-projects-over-bound-refused/expected.json +4 -1
- package/conformance/cases/c75-projects-patch-remote-uniqueness/expected.json +4 -1
- package/conformance/cases/c76-projects-entry-salvage-nested/expected.json +4 -1
- package/conformance/cases/c77-prompts-center-artifact-carried/expected.json +4 -1
- package/conformance/cases/c78-prompts-empty-bindings-refused/expected.json +4 -1
- package/conformance/cases/c79-prompts-bad-worker-artifact-not-salvaged/expected.json +4 -1
- package/conformance/cases/c80-prompts-wire-v2-verbatim/expected.json +7 -1
- package/conformance/cases/c81-prompts-declaration-bindings-refused/expected.json +4 -1
- package/conformance/cases/c82-prompts-v1-catalog-refused/expected.json +4 -1
- package/conformance/cases/c83-prompts-bad-overlay-not-salvaged/expected.json +4 -1
- package/conformance/cases/c84-sandbox-git-block-carried-verbatim/expected.json +7 -1
- package/conformance/cases/c85-sandbox-git-refused-block-still-carried/expected.json +7 -1
- package/conformance/cases/c86-a2a-peers-legal/expected.json +135 -0
- package/conformance/cases/c86-a2a-peers-legal/input.json +32 -0
- package/conformance/cases/c86-a2a-peers-legal/meta.json +5 -0
- package/conformance/cases/c87-a2a-credential-refs-not-partially-salvaged/expected.json +123 -0
- package/conformance/cases/c87-a2a-credential-refs-not-partially-salvaged/input.json +39 -0
- package/conformance/cases/c87-a2a-credential-refs-not-partially-salvaged/meta.json +5 -0
- package/conformance/cases/cc01-mcp-toolfaces-non-object/expected.json +4 -1
- package/conformance/cases/cc02-mcp-source-key-is-transported/expected.json +4 -1
- package/conformance/cases/cc03-model-compat-unknown-subkey/expected.json +4 -1
- package/conformance/cases/cli01-model-name-nfc-vs-nfd/expected.json +4 -1
- package/conformance/cases/cli02-control-and-zero-width-chars/expected.json +4 -1
- package/conformance/cases/cli03-credential-pasted-into-unknown-key/expected.json +4 -1
- package/conformance/cases/cli04-env-value-with-newline/expected.json +4 -1
- package/conformance/cases/cli05-long-and-prefix-colliding-names/expected.json +4 -1
- package/conformance/cases/t01-absent-domain-key-not-null/expected.json +4 -1
- package/conformance/cases/t03-prototype-name-key-not-swallowed/expected.json +4 -1
- package/conformance/cases/t04-secret-literal-never-in-warning-value/expected.json +4 -1
- package/conformance/cases/z01-every-domain-empty-object/expected.json +4 -1
- package/conformance/cases/z02-every-domain-unknown-key/expected.json +4 -1
- package/dist/center-refs.d.ts +4 -3
- package/dist/center-refs.js +8 -6
- package/dist/cli.d.ts +1 -1
- package/dist/config-fns.d.ts +6 -1
- package/dist/config-fns.js +16 -2
- package/dist/execution-lanes.d.ts +158 -11
- package/dist/execution-lanes.js +76 -11
- package/dist/file-edit.d.ts +1 -1
- package/dist/file-edit.js +2 -1
- package/dist/mcp-request-entry.d.ts +11 -21
- package/dist/mcp-request-entry.js +21 -38
- package/dist/one-time-migrations.js +1 -1
- package/dist/portable-domains.d.ts +1 -1
- package/dist/portable-domains.js +1 -1
- package/dist/remote-exec.d.ts +5 -0
- package/dist/remote-exec.js +5 -0
- package/dist/reserved-member-name.d.ts +13 -0
- package/dist/reserved-member-name.js +14 -0
- package/dist/retired-envs.js +2 -0
- package/dist/secret-refs.d.ts +1 -1
- package/dist/secret-refs.js +5 -1
- package/dist/types.d.ts +70 -41
- package/dist/types.js +179 -32
- package/dist/url-credential.d.ts +12 -2
- package/dist/url-credential.js +164 -9
- package/dist/wire-name.d.ts +19 -0
- package/dist/wire-name.js +21 -0
- package/docs/API-SURFACE.md +22 -5
- package/docs/CONSUMER-INTEGRATION.md +55 -7
- package/llms-full.txt +36 -17
- package/llms.txt +9 -9
- package/package.json +1 -1
|
@@ -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":
|
|
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":
|
|
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":
|
|
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":
|
|
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":
|
|
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":
|
|
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":
|
|
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":
|
|
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":
|
|
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":
|
|
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":
|
|
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":
|
|
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":
|
|
431
|
+
"localVersion": 1287865876181806
|
|
429
432
|
}
|
|
430
433
|
}
|
package/dist/center-refs.d.ts
CHANGED
|
@@ -8,8 +8,9 @@
|
|
|
8
8
|
* ## 律(一条)
|
|
9
9
|
* 引用表怎么读、每个变量怎么问、读不出怎么说,只有这一处:
|
|
10
10
|
* · **引用表经公开的记录读器读**({@link readPlainStringRecord}:同一个函数、同一张原因词表 {@link PLAIN_STRING_RECORD_FAULTS}),不另写形状 / 描述符判据。读不出(整张不是纯数据、有成员的变量名不是串、
|
|
11
|
-
*
|
|
12
|
-
*
|
|
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
|
-
* `
|
|
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`,不读句子(本口没有句子)。 */
|
package/dist/center-refs.js
CHANGED
|
@@ -8,8 +8,9 @@
|
|
|
8
8
|
* ## 律(一条)
|
|
9
9
|
* 引用表怎么读、每个变量怎么问、读不出怎么说,只有这一处:
|
|
10
10
|
* · **引用表经公开的记录读器读**({@link readPlainStringRecord}:同一个函数、同一张原因词表 {@link PLAIN_STRING_RECORD_FAULTS}),不另写形状 / 描述符判据。读不出(整张不是纯数据、有成员的变量名不是串、
|
|
11
|
-
*
|
|
12
|
-
*
|
|
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
|
-
* `
|
|
27
|
+
* `toString` / `hasOwnProperty` 这类不在保留名表里的原型链名字作目标键照落成自有数据属性。交出的 `values` 原型是 `Object.prototype`,与读器交出的副本同形。
|
|
27
28
|
*/
|
|
28
|
-
import {
|
|
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
|
-
|
|
59
|
-
|
|
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>;
|
package/dist/config-fns.d.ts
CHANGED
|
@@ -570,6 +570,7 @@ export declare const DOMAIN_READ_FALLBACK: {
|
|
|
570
570
|
readonly projects: "throw";
|
|
571
571
|
readonly prompts: "default";
|
|
572
572
|
readonly limits: "throw";
|
|
573
|
+
readonly a2a: "default";
|
|
573
574
|
};
|
|
574
575
|
/** Per-domain ENTRY-SALVAGE policy (12.3.0, S-1494) — may the view-face domain reader ({@link parseDomainSalvaged}) drop single bad
|
|
575
576
|
* entries (an array element, a Record value, and — recursively — a bad entry inside a surviving entry) and read the rest?
|
|
@@ -605,7 +606,10 @@ export declare const DOMAIN_READ_FALLBACK: {
|
|
|
605
606
|
* - governance: NONE — a dropped commandPolicy / approvalRequire row is a guardrail silently gone (放权,不许).
|
|
606
607
|
* - entitlement: NONE — a dropped tier / subject / binding / budget group changes who may do what (放权,不许).
|
|
607
608
|
* - execution: NONE — a dropped lane / public key changes the execution mandate (放权,不许).
|
|
608
|
-
* - limits: NONE — a dropped allowlist row changes a published ceiling (the domain is the one publishing seat of those ceilings).
|
|
609
|
+
* - limits: NONE — a dropped allowlist row changes a published ceiling (the domain is the one publishing seat of those ceilings).
|
|
610
|
+
* - a2a: SALVAGE (18.0.0) — the peer roster is a capability catalog like mcp: a dropped peer is one remote agent fewer. A peer's
|
|
611
|
+
* credential references (`headerRefs`) are in {@link ATOMIC_SALVAGE}: a bad reference drops the whole peer, never the reference
|
|
612
|
+
* alone (a peer kept with half of its credentials is the wrong failure direction). */
|
|
609
613
|
export declare const DOMAIN_ENTRY_SALVAGE: {
|
|
610
614
|
readonly models: "salvage";
|
|
611
615
|
readonly rosters: "none";
|
|
@@ -623,6 +627,7 @@ export declare const DOMAIN_ENTRY_SALVAGE: {
|
|
|
623
627
|
readonly projects: "salvage";
|
|
624
628
|
readonly prompts: "none";
|
|
625
629
|
readonly limits: "none";
|
|
630
|
+
readonly a2a: "salvage";
|
|
626
631
|
};
|
|
627
632
|
/** 一个读者向店要文档的口:配置域,以及墓碑表里的retired 域({@link RETIRED_DOMAINS})—— 后者只为让墓碑看见没迁的旧文档。 */
|
|
628
633
|
export type StoredDocumentReader = (d: DomainName | RetiredDomainName) => unknown;
|
package/dist/config-fns.js
CHANGED
|
@@ -23,7 +23,7 @@ import { isJsonArray, isPlainJsonObject, jsonShapeOf } from "./plain-json-object
|
|
|
23
23
|
import { carriesUserinfo, secretScanForms } from "./secret-scan.js"; // package-private normalization (both scanners read it) + the userinfo judgement (not in the barrel)
|
|
24
24
|
import { sha256Hex } from "./sha256.js";
|
|
25
25
|
import { unwrapSchema } from "./zod-unwrap.js"; // package-private: the ONE reading of zod's wrapper layers (salvage + the one-time migrations share it)
|
|
26
|
-
import { DOMAIN_SCHEMAS, InfraCostRates, LimitsConfig, PRIVATE_KEY_PEM_HEADER, RETIRED_DOMAINS, SkillsManifestSchema, containsSecretToken, isDomainName, isRetiredDomainName, renderQuotedSentence, retiredDomainSentence } from "./types.js";
|
|
26
|
+
import { ATOMIC_SALVAGE, DOMAIN_SCHEMAS, InfraCostRates, LimitsConfig, PRIVATE_KEY_PEM_HEADER, RETIRED_DOMAINS, SkillsManifestSchema, containsSecretToken, isDomainName, isRetiredDomainName, renderQuotedSentence, retiredDomainSentence } from "./types.js";
|
|
27
27
|
/** Redact secret-shaped tokens from a validation MESSAGE — a zod error echoes the offending value (e.g.
|
|
28
28
|
* `received 'sk-live-…'`), so a secret pasted into the WRONG field would leak via the error string. Redacts
|
|
29
29
|
* space-spanning auth credentials (`Bearer <token>`) FIRST (the token pass can't see across the space), then
|
|
@@ -197,6 +197,10 @@ export const DOMAIN_WRITE_ROLE = {
|
|
|
197
197
|
// limits (0.19.0): editor —— 与它的前身 runtime 域(11.0.0 retired)同档,刻意不抬 publisher:本域是纯数值
|
|
198
198
|
// 旋钮,无 prompt 注入面、无凭据、无可执行内容;真正的执法点在消费方的限额闸,发布闸(PUBLISH_MODE /
|
|
199
199
|
// 审批流)才是"要不要多一道人"的属主。default 即 editor,故不列条目;此注释即该裁定的落点。
|
|
200
|
+
// a2a (18.0.0): a peer is a remote agent whose skills are mounted into the agent's tool surface, plus the env-NAMEs that
|
|
201
|
+
// carry its credentials — the same executable-surface + credential-reference profile as mcp, so the same raised gate.
|
|
202
|
+
// Written out (not left to the default) because the default would be the WRONG answer here.
|
|
203
|
+
a2a: "publisher",
|
|
200
204
|
};
|
|
201
205
|
/** The minimum role required to write `domain` (the raised gate for skills/mcp, else editor). */
|
|
202
206
|
export function domainWriteRole(domain) {
|
|
@@ -495,6 +499,9 @@ function salvageLayerUnsafe(schema, raw) {
|
|
|
495
499
|
const patch = {};
|
|
496
500
|
for (const [field, fieldSchema] of Object.entries(shape)) {
|
|
497
501
|
const collection = unwrapSchema(fieldSchema);
|
|
502
|
+
// 凭据引用集合(按 schema 身份,见 ATOMIC_SALVAGE)不下钻:它是一个值,坏一项 ⇒ 它所属的条目在上一层整条判不过、整条丢。
|
|
503
|
+
if (ATOMIC_SALVAGE.has(collection))
|
|
504
|
+
continue;
|
|
498
505
|
const isArray = collection instanceof z.ZodArray;
|
|
499
506
|
if (!isArray && !(collection instanceof z.ZodRecord))
|
|
500
507
|
continue; // 不是条目集合:连读都不读(少触发一次访问器)
|
|
@@ -1006,6 +1013,8 @@ export const DOMAIN_READ_FALLBACK = {
|
|
|
1006
1013
|
// 降级成空域 = 中央发布的成本/限流天花板整片蒸发,消费方回自己的 env 底(可能宽得多)= 预算轴放权。
|
|
1007
1014
|
// 消费方 fail-static 在上一份好配置严格更好。
|
|
1008
1015
|
limits: "throw",
|
|
1016
|
+
// a2a(18.0.0):能力目录(同 mcp)—— 整域读不进 ⇒ 空名册 = 不拨任何对端(能力消失,fail-closed;没有闸因此丢掉)。
|
|
1017
|
+
a2a: "default",
|
|
1009
1018
|
};
|
|
1010
1019
|
/** Per-domain ENTRY-SALVAGE policy (12.3.0, S-1494) — may the view-face domain reader ({@link parseDomainSalvaged}) drop single bad
|
|
1011
1020
|
* entries (an array element, a Record value, and — recursively — a bad entry inside a surviving entry) and read the rest?
|
|
@@ -1041,7 +1050,10 @@ export const DOMAIN_READ_FALLBACK = {
|
|
|
1041
1050
|
* - governance: NONE — a dropped commandPolicy / approvalRequire row is a guardrail silently gone (放权,不许).
|
|
1042
1051
|
* - entitlement: NONE — a dropped tier / subject / binding / budget group changes who may do what (放权,不许).
|
|
1043
1052
|
* - execution: NONE — a dropped lane / public key changes the execution mandate (放权,不许).
|
|
1044
|
-
* - limits: NONE — a dropped allowlist row changes a published ceiling (the domain is the one publishing seat of those ceilings).
|
|
1053
|
+
* - limits: NONE — a dropped allowlist row changes a published ceiling (the domain is the one publishing seat of those ceilings).
|
|
1054
|
+
* - a2a: SALVAGE (18.0.0) — the peer roster is a capability catalog like mcp: a dropped peer is one remote agent fewer. A peer's
|
|
1055
|
+
* credential references (`headerRefs`) are in {@link ATOMIC_SALVAGE}: a bad reference drops the whole peer, never the reference
|
|
1056
|
+
* alone (a peer kept with half of its credentials is the wrong failure direction). */
|
|
1045
1057
|
export const DOMAIN_ENTRY_SALVAGE = {
|
|
1046
1058
|
models: "salvage",
|
|
1047
1059
|
rosters: "none",
|
|
@@ -1059,6 +1071,7 @@ export const DOMAIN_ENTRY_SALVAGE = {
|
|
|
1059
1071
|
projects: "salvage",
|
|
1060
1072
|
prompts: "none",
|
|
1061
1073
|
limits: "none",
|
|
1074
|
+
a2a: "salvage",
|
|
1062
1075
|
};
|
|
1063
1076
|
/**
|
|
1064
1077
|
* Merge every domain into the effective config a consumer pulls. Shared by all store impls.
|
|
@@ -1111,6 +1124,7 @@ export function buildEffective(version, getRaw, updatedAt, onWarning) {
|
|
|
1111
1124
|
// `{}` 不下发中心层,default 不扩权)。
|
|
1112
1125
|
prompts: parseOr("prompts", getRaw("prompts")),
|
|
1113
1126
|
limits: parseOr("limits", getRaw("limits")),
|
|
1127
|
+
a2a: parseOr("a2a", getRaw("a2a")),
|
|
1114
1128
|
};
|
|
1115
1129
|
}
|
|
1116
1130
|
/** READ-side tolerant judgment for a GET /effective **wire payload**(the {@link EffectiveWire} contract)at
|