@sema-agent/settings-schema 17.1.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 +212 -0
- package/README.md +73 -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/atomic-write.d.ts +4 -3
- package/dist/atomic-write.js +25 -11
- package/dist/catalog-manages.d.ts +8 -3
- package/dist/catalog-manages.js +16 -7
- 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-d-file.d.ts +4 -2
- package/dist/config-d-file.js +27 -6
- package/dist/config-fns.d.ts +6 -1
- package/dist/config-fns.js +16 -2
- package/dist/config-root-documents.d.ts +2 -2
- package/dist/config-root-documents.js +1 -1
- package/dist/config-root-node.d.ts +8 -1
- package/dist/config-root-node.js +105 -23
- package/dist/env-model-table.js +3 -3
- 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/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/mcp-request-entry.d.ts +11 -21
- package/dist/mcp-request-entry.js +21 -38
- package/dist/node.d.ts +4 -1
- package/dist/node.js +6 -2
- 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/settings-units.d.ts +3 -0
- package/dist/settings-units.js +18 -0
- 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 +31 -6
- package/docs/CC-DIVERGENCE.md +6 -0
- package/docs/CONSUMER-INTEGRATION.md +127 -7
- package/llms-full.txt +40 -17
- package/llms.txt +9 -9
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -8,6 +8,218 @@
|
|
|
8
8
|
|
|
9
9
|
## Unreleased
|
|
10
10
|
|
|
11
|
+
## 18.0.0 — 2026-11-03 — major:车道词 `none`(不给智能体的工具提供执行环境)· `REQUIRE_EXECUTION_LANE` 进墓碑表 · 车道集单一判官 `laneSetFlaws` / `LANE_SET_RULE` · 便携新域 `a2a`(常驻出站 A2A 对端名册)· 凭据引用集合不可部分抢救 `ATOMIC_SALVAGE` · 复合凭据名 `credentialParamWordOf`
|
|
12
|
+
|
|
13
|
+
> 档位(按发版纪律):**major** —— 三处不加性边:① 词表联合加成员(`ExecutionLane` 加 `none`、`TenantSeparationBasis` 加 `no-execution-target`、`RemoteExecSpec` 加 `none` 臂、`DomainName` 尾插 `a2a`;对它们写穷举 `switch` / `Record<…>` 的消费方编译红,把不认识的词读成某条车道的消费方运行期读错;公开记录读器的保留成员名由一个名改成一张表 —— `PLAIN_STRING_RECORD_RESERVED_MEMBER` 删除、`PlainStringRecordRead` 的 `reservedMember: boolean` 改名 `reservedMembers`,读它们的消费方编译红);
|
|
14
|
+
> ② `EffectiveConfig` 多一个**必填**成员 `a2a`(自己构造 `EffectiveConfig` 对象的消费方编译红;不在 minor 档的「可选键(无默认)」内);③ **同一输入解析结果改变**:本地 `config.d/a2a.json` 由不读(`unread-config-file`)变读,远端 `/effective.a2a` 由原样透传变契约解析(补缺省、剥未知键、逐条抢救),
|
|
15
|
+
> 本地腿的内容哈希版本对同一组文件变一次(哈希里多了 `a2a` 这一格),直接对 `WorkersConfig` 调 `salvageEntries` 时 `secretEnv` 带坏引用的 worker 整条丢(此前只丢那一条引用),请求面传输的 `env` / `headers` 与中心引用解析口对名叫 `constructor` / `prototype` 的成员同 `__proto__` 一样答保留(剔出并各记一条 `lost` / 整台 `refs_unreadable`,此前照收),凭据引用集合里有叫 `__proto__` / `constructor` / `prototype` 的引用 ⇒ 集合坏、条目整条丢(此前 `__proto__` 被剥掉、只告警 `unknown-keys-dropped`,条目带其余引用存活;`constructor` / `prototype` 作头名受理),`REQUIRE_EXECUTION_LANE` 在墓碑表里(读这张表的引擎起服 / 壳 / 渲染器见之拒),车道集、「enabled 的 worker 必须声明车道」与多租户拒句三句的文字随车道表改(多租户拒句「分租户的车道」出路列表多了 `none`),车道表里的重复与兄弟字段的不可续错误并行报(见判官小节),凭据参数名判官对复合名的答案由否变是(`isCredentialParamName` / `findUrlCredential` 对 `db_password` / `dbPassword` / `x-db-secret` / `user_pwd` / `PGPASSWORD` / `SECRET_KEY` 一类名字:带这类参数的 URL,受理口由受理变拒)。
|
|
16
|
+
> 律:车道集的合法性只有一个答者(判官 `laneSetFlaws`,写闸只调它;此前是枚举 + `.min(1)` + 手写去重三处各判一块);「没有执行环境」是一个声明(`lanes: ["none"]` / `REMOTE_EXEC=none`),不是「没写」;「点名了没有」只剩 `REMOTE_EXEC` 一个答者(总开关进墓碑表)。
|
|
17
|
+
> 导出面:根桶 + `./execution-lanes` 加 `laneSetFlaws` / `LANE_SET_RULE` 与类型 `LaneSetFlaw` / `StandaloneLane`;根桶 + `./types` 加 `A2aPeerSpec` / `A2aConfig`(值 + 类型)与 `ATOMIC_SALVAGE`;根桶加 `credentialParamWordOf`(值);根桶 + `./mcp-request-entry` 加 `RESERVED_MEMBER_NAMES` / `isReservedMemberName` 与类型 `ReservedMemberName`,`PLAIN_STRING_RECORD_RESERVED_MEMBER` 删除(零别名;登记表 `docs/API-SURFACE.md` 已重生)。零别名、零双读;不需要一次性迁移(没有要改写的存量:`none` 与 `a2a` 都是新形)。
|
|
18
|
+
|
|
19
|
+
### 车道词 `none` 与 `REQUIRE_EXECUTION_LANE` 墓碑
|
|
20
|
+
|
|
21
|
+
- **`none` 进 `EXECUTION_LANE_WORDS`(第八个词,尾插)**。用户面行为:智能体的工具**没有执行环境**(什么都不挂载)。表行:分租户 `tenantSeparation: "supported"`,依据是新的第三个依据词 `no-execution-target`(`TENANT_SEPARATION_BASES`:没有执行目标,就没有跨租户共享的目标)、
|
|
22
|
+
不挂副本(`singleReplica: false`)、四栏 env 全空(没有坐标、没有密钥)。车道表头注里「`in-process` 不在表里 …… 先定用户面行为再给词」一段换成 `none` 的定义;`in-process` 仍不是可声明的车道词。
|
|
23
|
+
- **只能独成一集**:声明了依据列为 `no-execution-target` 的车道,车道表就只能有它这一项 —— 判官按**依据列**判、不点名车道词(先例 `singleReplica`),这一类车道的型 `StandaloneLane` 也从表行派生(今天 = `none`)。拒因是判官的 `not_alone`(见下节),与非空 / 去重 / 认词同一只判官。
|
|
24
|
+
不给工具提供执行环境的 worker 写 `runtime.execution.lanes: ["none"]`;车道集必填那一句(`LANES_REQUIRED`)由「没有『无手』车道,停用 worker」改指 `lanes: ["none"]`。
|
|
25
|
+
- **`REQUIRE_EXECUTION_LANE` 进墓碑表 `RETIRED_ENVS`**:`replaced` → `REMOTE_EXEC`(每个部署都点名自己的车道之后它恒真;「没有执行环境」也是一个声明,`REMOTE_EXEC=none`)。旧名在场即拒,替代名在不在都一样;空串 = 未设,不拒。
|
|
26
|
+
它随之离开保留名表(`RESERVED_WORKER_ENV`):worker 的 `env` / `secretEnv` 里写它,拒句由「归 `runtime.execution.lanes`」变成墓碑句本身(`retiredEnvRefusal`,唯一铸点)。一次性迁移 SS-M4 识别的车道旧键集(`LANE_WORD_KEYS`)不动。
|
|
27
|
+
- **车道文件 `RemoteExecSpec` 加零字段臂 `{ provider: "none" }`**:`config.d/remote-exec.json` 里 `REMOTE_EXEC=none` 的文件形;没有可配的字段、没有 secret(`listRequiredEnvNames` 对它不列任何名)。
|
|
28
|
+
- **执行域策略 `allowedLanes`(开放词)**:类型面只认 `none`;切换期(还有引擎答旧状态名、也有引擎答 `none` 时)策略**数据**并列 `"in-process"` 与 `"none"`,所有读它的引擎都答 `none` 之后从数据里删掉 `"in-process"` —— 这是开放列表的合法内容,不是代码里的第二种读法。
|
|
29
|
+
|
|
30
|
+
### 车道集单一判官 `laneSetFlaws` / `LANE_SET_RULE`
|
|
31
|
+
|
|
32
|
+
- **`laneSetFlaws(lanes: readonly unknown[]): readonly LaneSetFlaw[]`**(根桶 + `./execution-lanes` 零依赖叶模块,先例 `deviceRelayFlaws` / `DEVICE_RELAY_RULE`)。拒因闭集 `LaneSetFlaw`:`empty_set` · `blank_entry{at}`(空串或只含空白,判官 `isBlankCoordinate`)· `unknown{at, word}`(不是车道词 —— 含根本不是字符串的项,`word` 是原值)· `retired{at, word}`(车道值墓碑里的旧词)·
|
|
33
|
+
`duplicate{at, lane}`(第二次出现的那一格)· `not_alone{lane}`(独占车道与别的项同集)。空表恒答恰一条 `empty_set`;每格先判是不是字符串、再判空白、再判认词(重复 / 墓碑 / 不认识),最后判独占。入参是任意值的表(读 JSON 的写闸原样交进来,引擎切段后交字符串):「每一项都是车道词」只此一处判。
|
|
34
|
+
按下标读(`0 … length-1`):稀疏表的空洞读成 `undefined`,是一项不是字符串的项(`unknown{at, word: undefined}`,与写闸的下标快照同答;`new Array(1)` 不是合法的车道表,`["none", ,]` 也不是独占)。
|
|
35
|
+
- **`LANE_SET_RULE`**:规则句(词表与独占形从表派生,不手抄),写闸的车道集拒句都以它收尾。
|
|
36
|
+
- **写闸只调它**:`WorkerSpec` 的 `runtime.execution.lanes` 只判「是一个列表」,整张交给判官,每条拒因一条 issue(穷举 `switch`:判官加一种拒因而写闸不补 ⇒ 编译红)。issue 的机读码与坐标与此前三处判据各自给的逐一相同 —— 词形坏(不是字符串 / 空白 / 不认识 / 墓碑词)= `invalid_value`(`values` = 车道词表;墓碑词的句子是墓碑句)且不可续,
|
|
37
|
+
空表 = `too_small`,重复 = `custom`;独占 = `custom`,落在整张表上。**一处有意的差**:一张表里坏词与重复同在(`["kata","host","host"]`)⇒ 两条都报(判官交回全部拒因);17.2.0 的写闸在坏词处中断,重复那一格不报。结论(拒)不变。
|
|
38
|
+
**第二处差(同一个原因)**:重复判搬进了 `lanes` 自身,与同一 `runtime.execution` 里兄弟字段 `coords` / `secretRefs` 的不可续错误并行报(`{lanes:["host","host"],coords:42}` ⇒ 重复 @`lanes.1` 与型错 @`coords` 两条);17.2.0 的重复判挂在对象上,兄弟字段坏时不跑、只报兄弟那一条。结论(拒)不变。读车道集的消费方(引擎读声明的车道表)调同一只判官,不抄第二份。
|
|
39
|
+
|
|
40
|
+
### 便携新域 `a2a` 与凭据引用集合不可部分抢救
|
|
41
|
+
|
|
42
|
+
- **`A2aPeerSpec` / `A2aConfig`(`DOMAIN_SCHEMAS` 尾插 `a2a`)**:`{ peers: A2aPeerSpec[] }`(缺省空表 = 不拨任何对端),对端名唯一(重名拒,同 `McpConfig`)。`A2aPeerSpec = { name, url, cardUrl?, headerRefs?, principalHeader?, allowSkills?, scenarios(缺省 []), enabled(缺省 true) }`;
|
|
43
|
+
判官全复用、按身份同一只:`name` = 线上名判官 `isUsableWireName`(对端名是线上工具名 `a2a__<名>__…` 的身份片;判据搬进包内零依赖叶子,`./mcp-request-entry` 照旧转出同一个函数对象)、`url` / `cardUrl` = `NON_SECRET_URL`(与 mcp `transport.url` 同座:不带凭据与 fragment;
|
|
44
|
+
名形判官 `findUrlCredential` 不接进读已落盘字节的 schema)、`headerRefs` = mcp 的头名 → env-NAME 引用集合(中心只存 env-NAME,值在读方自己的环境里)、`principalHeader` = 头名判官。首版不收 `notes` / `rosters` / `toolAxes`(剥掉并告警 `unknown-keys-dropped`)。
|
|
45
|
+
- **按域表**:`PORTABLE_DOMAINS` 加 `a2a`(本地 `config.d/a2a.json`;与非便携理由表成对编译咬死)· `DOMAIN_READ_FALLBACK.a2a = "default"`(整域读不进 ⇒ 空名册:能力消失,没有闸因此丢掉)· `DOMAIN_ENTRY_SALVAGE.a2a = "salvage"`(坏对端逐条丢)·
|
|
46
|
+
`DOMAIN_WRITE_ROLE.a2a = "publisher"`(**显式写**:那张表是 `Partial`,漏写会静默退回缺省 `editor`;一个对端就是一组挂进智能体的远端技能加上它的凭据引用,与 mcp 同档)· `EffectiveConfig.a2a`(两腿恒物化 `{ peers: [] }`)。
|
|
47
|
+
一次性迁移 SS-M7 的 URL 座位由 schema 派生,自动多出 `a2a.peers[].url` / `a2a.peers[].cardUrl`。密钥引用清单 `collectEnvRefs`(与随它的本地「还缺哪些密钥」面板 `listRequiredEnvNames`)列出每个对端的每条头引用(域 `a2a`,坐标 `peer "<名>" headerRefs.<头名>`)。
|
|
48
|
+
- **`ATOMIC_SALVAGE`(按 schema 身份的集合)**:凭据引用集合 —— mcp 的 `envRefs` / `headerRefs`(a2a 对端的 `headerRefs` 复用后者)、车道块的 `secretRefs` 与 worker 的 `secretEnv` —— **不部分抢救**:逐条抢救走到成员不下钻,集合里任一键 / 值坏形 ⇒ 它所属的条目整条 `entry-dropped`、兄弟条目保留。
|
|
49
|
+
丢掉一条坏引用不是「更窄」,而是让条目带着一半凭据活下来去拨远端(读方对任一引用的 env 缺席本来就整条跳过,同一个方向)。别的集合字段(`allowSkills` / `scenarios` / `allowTools` …)照旧逐条丢。新的凭据引用集合复用这几只 schema 或登记进这里(按身份判,换一只同形的新 schema 不算成员)。
|
|
50
|
+
律是按类收的,不按字段挑:worker 的 `secretEnv` 与车道块的 `secretRefs` 同形(服务变量名 → 宿主 env-NAME),同在。
|
|
51
|
+
**成员读键按自有属性名判**(名集 = `Object.getOwnPropertyNames` 的串键;经包的读内核读,不调 getter):`__proto__` / `constructor` / `prototype` 任一作引用名 ⇒ 这只集合坏 ⇒ 条目整条 `entry-dropped`、兄弟保留(写口同拒);
|
|
52
|
+
名字读不出(访问器成员 / 隐藏的自有键 / 陷阱抛 —— 只有内存对象会这样,JSON 铸不出)同样判坏,句子是内核那一句(守卫看不清名字就不担保)。zod 的 record 读键前先跳过 `__proto__`、不判它的值 ——
|
|
53
|
+
17.2.0 对 mcp 条目 `headerRefs: {"__proto__": …, "Authorization": "HOST_TOKEN"}` 读出「只有 `Authorization`」(告警 `unknown-keys-dropped` 点名那个键)、条目带着其余引用存活;`constructor` / `prototype` 作 HTTP 头名(mcp / a2a 的 `headerRefs`)曾受理,自此拒
|
|
54
|
+
(env 名形的三只成员本来就拒小写的 `constructor` / `prototype`,对它们只多了 `__proto__`)。只含这几个词的名字(`X-Constructor`、`PROTOTYPE`)照旧收;非成员的 `z.record` 座位不在本版。
|
|
55
|
+
**保留成员名只有一张表**(`RESERVED_MEMBER_NAMES` + 谓词 `isReservedMemberName`,根桶与 `./mcp-request-entry`):这道守卫、公开记录读器 `readPlainStringRecord` / `isStringRecord`(请求面传输的 `env` / `headers` 同读)、
|
|
56
|
+
中心引用解析口 `resolveCenterRefs` 问同一个谓词,三处同答 —— 此前记录读器与解析口只保留 `__proto__`(`PLAIN_STRING_RECORD_RESERVED_MEMBER`,删除),`resolveCenterRefs({constructor: …})` 答 `resolved` 并铸出自有 `constructor`,
|
|
57
|
+
与 schema 一问两答。读器的读数 `reservedMembers` 按自有键序列出在场的保留名(没进副本);解析口点名第一个。
|
|
58
|
+
**对已记录语料零变化**(workers 域不逐条抢救;mcp 的两只住在传输判别联合里,走查不进联合;车道块住在不是集合的 `runtime` 对象里);**新守卫的例外**:引用名为 `__proto__` / `constructor` / `prototype` 的条目整条丢
|
|
59
|
+
(17.2.0:`__proto__` 被剥并告警 `unknown-keys-dropped`、`constructor` / `prototype` 作头名照收 —— 条目都留着;带合法兄弟时自此只剩兄弟);**不加性的另一处**:直接对 `WorkersConfig` 调 `salvageEntries` 时,
|
|
60
|
+
`secretEnv` 里坏一项(键或值不是 env-NAME)的 worker 由「只丢那一条引用(`entry-key-invalid`)、worker 带其余引用存活」变「整个 worker `entry-dropped`(`entry-schema-invalid`)、兄弟 worker 保留」。
|
|
61
|
+
这两句不只是推理:17.2.0 包对一组覆盖语料全部 case 与各域合成样本的真读数逐行对拍,改了读数的那一行逐行登记、新读数手写。
|
|
62
|
+
密钥引用清单 `collectEnvRefs` 是手列的(它的坐标是给人读的,且还列不是集合的单个引用字段,所以不从成员表派生);两表同集由钉守:从 `DOMAIN_SCHEMAS` 派生出的每一个成员座位,清单都读得到。
|
|
63
|
+
|
|
64
|
+
### 复合凭据名 `credentialParamWordOf`
|
|
65
|
+
|
|
66
|
+
- **病**:凭据参数名判官只认整名(表内 23 词)。`db_password` / `DB_PASSWORD` / `dbPassword` / `x-db-secret` / `user_pwd` / `PGPASSWORD` / `SECRET_KEY` 这类以强档词作末段的名字,受理口判官(`isCredentialParamName` / `findUrlCredential`)受理不拒,读同一张名表的日志脱敏器也不遮它们的值 ——
|
|
67
|
+
判官与脱敏器给不出同一个答案之外,`?db_password=…` 里的真口令原样进日志、转录、同步体与流式帧。
|
|
68
|
+
- **导出(根桶,一只)**:`credentialParamWordOf(decodedName: string): CredentialParamName | undefined`,「这个已解码的参数名是不是凭据名」的唯一答者。① 整名(ASCII 大小写不敏感)在 `CREDENTIAL_PARAM_NAMES` 上 ⇒ 那个词(照旧;整名优先,`client_secret` 答 `client_secret`,不答它的末段 `secret`);
|
|
69
|
+
② 否则名字按 `_` / `-` / `.` 与驼峰边界切段(空段不存在),**末段**的尾部是强档词(`password` / `passwd` / `pwd` / `secret` / `apikey`)⇒ 那个词 —— `db_password` · `DB_PASSWORD` · `dbPassword` · `x-db-secret` · `user_pwd` 与前缀粘连的 `PGPASSWORD` 都算,词不跨分隔符(`app_wd` 不是 `pwd`);
|
|
70
|
+
③ 尾串闭集四条(逐词对齐,分隔符与大小写不论):`secret key` / `secret access key` ⇒ `secret`(`SECRET_KEY` · `AWS_SECRET_ACCESS_KEY`);`api key` ⇒ `api_key`(`x-api-key` · `X_API_KEY` · `xApiKey`);`access token` ⇒ `access_token`(`github_access_token` · `oauth-access-token`)。
|
|
71
|
+
**尾串答词只有一条律,不逐项特判**:尾串用 `_` 连起来若本身就是整名表里的词,答那个整名词(与整名的答案同形);否则答它的强段词(`secret_key` / `secret_access_key` 不在整名表,答 `secret`)。
|
|
72
|
+
闭集,不做通配:别的名表多段词(`refresh_token` · `private_key` …)与裸 `access_key` 作末尾照今天的整名表;末段不是尾串的末词不命中(`api_key_count` · `token_count` · `api_key_id`)。
|
|
73
|
+
- **只看末尾**:前缀 / 中段命中不算,词后还有别的字就不是 —— `password_hash` · `password_policy` · `password_hint` · `secretName` · `secret_name` · `pwd_dir` · `passwordless` 逐条不是凭据名;数字尾巴不剥(`password2` 不是);
|
|
74
|
+
名表里别的 18 个词(`token` / `key` / `refresh_token` / `private_key` …)作末尾时只认整名(上一条的尾词与尾串除外)—— `sort_key` · `token_count` 不因此被带进来。
|
|
75
|
+
回显的词与整名一致:`x-api-key` ⇒ `api_key`,`github_access_token` ⇒ `access_token`,所以消费方拿它查自己的锚强度列时,带前缀的名字与整名落在同一档(`github_access_token=…` 与 `access_token=…` 在自由文本里同强)。
|
|
76
|
+
- **一事一源**:`isCredentialParamName` 与 `findUrlCredential` 的 query / fragment 臂都读它,模块里没有第二张表、第二条规则。名表同表多一列「这个词作为更长名字的末尾时算不算」(`Record<CredentialParamName, …>` 穷尽映射:名表加一个词而这一列不表态 ⇒ 编译红);
|
|
77
|
+
`findUrlCredential` 的 `name` 仍只回显表里的词 —— 复合名回显它收尾的那个词(`db_password` ⇒ `password`),调用方的名字字节不进答案、不进规则句。`CREDENTIAL_PARAM_NAMES` 不变(仍 23 词),`UrlCredential` 的形、拒因词与规则句逐字不变。
|
|
78
|
+
返回的是**表词**:消费方拿它去查自己挂在名表上的那一列(例:日志脱敏器的自由文本锚强度),不再对整名查表。
|
|
79
|
+
- **三问**。谁需要:读「这个名字是不是凭据名」的每一处(含最常见的 API-key 头名 `x-api-key` 与 `github_access_token` 一类带前缀的令牌名)—— 服务端日志脱敏器的三个名字读者(URL 参数 · JSON 秘密字段 · 自由文本强锚)与诊断值位,受理口判官(MCP `transport.url` · A2A 对端 `url` / `cardUrl` · http 钩子 `url` · 搜索后端 `endpoint` · 图片 URL · 包源地址)—— 它们本来就该是一个答案。
|
|
80
|
+
谁受伤:以强档词或尾串收尾、但值不是凭据的名字(`show_password=1` · `is_secret=true` · `has_password=false` · `has_access_token=false`)—— 受理口拒带这样参数的 URL、脱敏器遮它的值;方向是多拒多遮(少洗的一侧是真钥明文)。
|
|
81
|
+
补偿:负控七词逐条写死(见『只看末尾』一条);带引号形与整名行为不变;不想被拒的非凭据参数换一个不以强档词收尾的名字。
|
|
82
|
+
- **不加性的一处**(已计入上面的 ③):同一输入的答案由否变是 —— 带复合名参数的 URL,受理口由受理变拒(`url_credential_param`);已存下来的数据零迁移(判官不接进读已落盘字节的 schema,载体律是座位的事)。
|
|
83
|
+
|
|
84
|
+
### 🔴 硬顺序与消费方提货
|
|
85
|
+
|
|
86
|
+
- 🔴 **硬顺序**:web-admin 渲染器先停渲 `REQUIRE_EXECUTION_LANE`,中心起的 worker 才能上 server 7.147.0 —— 否则读这张墓碑表的引擎见之拒启,中心起的 worker 全部起不来。`none` 只对已经升级的部署产出(旧引擎、旧壳的车道表里没有这个词,读到即拒)。
|
|
87
|
+
- **server 7.147.0**:读 `EXECUTION_LANE_WORDS` / `EXECUTION_LANES`(`none` 行)· `RETIRED_ENVS`(起服见 `REQUIRE_EXECUTION_LANE` 拒启)· `RemoteExecSpec`(`none` 臂:文件声明的车道)· `laneSetFlaws`(读声明的车道表与写闸同一只)· `A2aConfig` / `EffectiveConfig.a2a` / `PORTABLE_DOMAINS`(本地 `config.d/a2a.json` 与中心 `/effective.a2a` 同一个声明座)· `credentialParamWordOf`(日志脱敏器的三个名字读者〔URL 参数 · JSON 秘密字段 · 自由文本强锚〕与诊断值位改读它,拿返回的词去查自己的锚强度列;受理口的 `isCredentialParamName` / `findUrlCredential` 读同一只 —— 判官与脱敏器同一版、同一天翻,不分两版)· `readRequestMcpTransport`(`env` / `headers` 里名叫 `constructor` / `prototype` 的成员自此与 `__proto__` 同剔、各记一条 `lost`〔`member_name_reserved`〕;续跑重放腿照挂、受理门据它拒)。
|
|
88
|
+
- **web-admin**:`RETIRED_ENVS`(先停渲总开关 —— 硬顺序)· 渲染器读 `runtime.execution.lanes`(`["none"]` ⇒ `REMOTE_EXEC=none`)· 执行域策略 `allowedLanes` 的数据在切换期并列 `"in-process"` 与 `"none"` · `a2a` 域的编辑面读 `A2aPeerSpec`,写权限读 `domainWriteRole("a2a")`(= publisher);凭据名判定不读。
|
|
89
|
+
- **cli**:由车道表派生的「车道 → 必需键」(`none` 行没有必需键)· 车道词闭集(`none` 不再是表外词)· 起本机引擎之前读 `RETIRED_ENVS`(`REQUIRE_EXECUTION_LANE` 在场即拒);凭据名判定无读点(壳零直调这组判官),不动。
|
|
90
|
+
- **client-core**:`ExecutionLane` 联合(穷举处补 `none`)· `EffectiveConfig.a2a`(必填成员;本地读腿多读 `config.d/a2a.json`)· 由 `dist/mcp-request-entry.js` 生成的请求面读器副本:`isUsableWireName` 与保留成员名谓词 `isReservedMemberName` 的函数体住在两只叶模块(`wire-name` / `reserved-member-name`),不再在同模块闭包里 —— 生成器跟随这两只叶模块或注入这两个名字;读数 `reservedMember` 改名 `reservedMembers`;`resolveCenterRefs` 对 `constructor` / `prototype` 答 `refs_unreadable`;凭据名判定无读点(只有一格探针扫本包 d.ts 的导出名,`credentialParamWordOf` 不命中它的『同类键名判官』扫描式),不动。
|
|
91
|
+
- **sdk**:类型面 —— `ExecutionLane` 联合加 `none`、`EffectiveConfig` 加必填 `a2a`;对它们写穷举或自造 `EffectiveConfig` 的地方编译红;凭据名判定不读(合同测里 `findUrlCredential` 的固定样例 `?token=` / `?api_key=` 照旧命中)。
|
|
92
|
+
- 文书:README 升级指引(17.2.x → 18.0.0)· `docs/CONSUMER-INTEGRATION.md` §17(§0.2 里旧的渲染句与保留名句加了指向 §17 的订正)· `llms.txt` / `llms-full.txt`。
|
|
93
|
+
|
|
94
|
+
### 钉
|
|
95
|
+
|
|
96
|
+
`test/lane-set-judge-18.0.0.test.ts`(判官:每条拒因一格正负控 · 闭集 · 规则句从表派生 · 写闸同调:每条拒因一条 issue、码与此前三处判据逐一相同 · 空洞按下标读、判官与写闸同答 · 重复与兄弟字段的不可续错误并行报)· `test/none-lane-18.0.0.test.ts`(词与表行 · 独占按依据列判 · 写闸 · 墓碑与保留名离表 · 车道文件零字段臂)·
|
|
97
|
+
`test/a2a-domain-18.0.0.test.ts`(域形 · 复用的判官按身份 · 读法:逐条抢救 + 凭据引用整条丢 · 按域表四张 + 写权限直验 · 密钥引用清单)· `test/atomic-salvage-18.0.0.test.ts`(① 17.2.0 包真读数的逐行对拍,含三行带合法兄弟的凭据引用坏形;② 成员恰四只、按身份;走查遇成员不下钻;worker 正负控:坏 `secretEnv` ⇒ 整条丢、坏 `env` 键 ⇒ 只丢那一键;③ 两表同集:成员座位 ⇔ 密钥引用清单;④ 每个成员座位 × 三个原型名 ⇒ 域 schema 拒、抢救丢该条留兄弟,负控只含这些词的名字照收;⑤ 保留成员名一张表:三名各一行三读口同答〔schema · 记录读器 · 类型守卫 · 解析口零查找 · 请求面 lost〕、负控、单源源码钉)·
|
|
98
|
+
一致性语料 c86(合法两对端,四腿同读)/ c87(凭据引用坏 ⇒ 整个对端丢,非凭据集合照旧逐条丢);既有 99 条 case 重新加冕,去掉 `effective.a2a`(恒 `{"peers":[]}`)与本地腿的内容哈希版本之后逐字等于旧金样,输入与 meta 零改。
|
|
99
|
+
`test/compound-credential-name-18.0.0.test.ts`(六个复合名 + `SECRET_KEY` / `AWS_SECRET_ACCESS_KEY` 各一格:判官拒 + URL 凭据判中〔query 与 fragment〕、只回显表词 · 负控七词各一格 · 整名照旧 23 词 · 切段 / 粘连 / 对齐边界 · 名表每个词作末段的态度逐词写死 · 一事一源〔两条老入口与新导出同答、模块里整名查表只一处〕· 浏览器安全〔无正则后顾断言〕· 线性读)·
|
|
100
|
+
`test/url-credential-14.5.0.test.ts`(原『复合名今天不是凭据名』的 🚧 held 格与整名表里的 `db_password` 负格翻面,其余格零改)。
|
|
101
|
+
|
|
102
|
+
**自 v17.2.0 起运行期代码有改动的公开导出(机器重算;上界 —— 可达 ≠ 一定变,不可达 ⇒ 一定不变;本版新增的导出不入表)**
|
|
103
|
+
|
|
104
|
+
```text
|
|
105
|
+
DOMAINS [., ./types]
|
|
106
|
+
DOMAIN_ENTRY_SALVAGE [., ./config-fns]
|
|
107
|
+
DOMAIN_READ_FALLBACK [., ./config-fns]
|
|
108
|
+
DOMAIN_SCHEMAS [., ./types]
|
|
109
|
+
DOMAIN_WRITE_ROLE [., ./config-fns]
|
|
110
|
+
EXECUTION_LANES [., ./execution-lanes]
|
|
111
|
+
EXECUTION_LANE_WORDS [., ./execution-lanes]
|
|
112
|
+
FileConfigStore [./node]
|
|
113
|
+
McpConfig [., ./types]
|
|
114
|
+
McpServerSpec [., ./types]
|
|
115
|
+
McpTransport [., ./types]
|
|
116
|
+
NON_PORTABLE_DOMAINS [./conformance]
|
|
117
|
+
ONE_TIME_MIGRATIONS [./one-time-migrations]
|
|
118
|
+
PORTABLE_DOMAINS [./node]
|
|
119
|
+
RESERVED_WORKER_ENV [., ./types]
|
|
120
|
+
RETIRED_ENVS [.]
|
|
121
|
+
RemoteExecSpec [., ./remote-exec]
|
|
122
|
+
TENANT_SEPARATION_BASES [., ./execution-lanes]
|
|
123
|
+
TOOL_WIRE_NAME_MAX_CHARS [.]
|
|
124
|
+
WorkerSpec [., ./types]
|
|
125
|
+
WorkersConfig [., ./types]
|
|
126
|
+
buildEffective [., ./config-fns]
|
|
127
|
+
buildRetiredEnvWire [.]
|
|
128
|
+
collectEnvRefs [., ./secret-refs]
|
|
129
|
+
deriveLocalExpectation [./conformance]
|
|
130
|
+
deriveWireExpectation [./conformance]
|
|
131
|
+
describeBadMcpServerName [.]
|
|
132
|
+
describeBadWireName [.]
|
|
133
|
+
domainFilePath [./node]
|
|
134
|
+
domainWriteRole [., ./config-fns]
|
|
135
|
+
emptyEffective [., ./config-fns]
|
|
136
|
+
exportBundle [./node]
|
|
137
|
+
findUrlCredential [.]
|
|
138
|
+
foreignKeysOf [./conformance]
|
|
139
|
+
isCredentialParamName [.]
|
|
140
|
+
isDomainName [., ./types]
|
|
141
|
+
isStringRecord [.]
|
|
142
|
+
isUsableMcpServerName [.]
|
|
143
|
+
isUsableWireName [.]
|
|
144
|
+
listRequiredEnvNames [./node]
|
|
145
|
+
loadLocalConfig [./node]
|
|
146
|
+
loadRemoteExec [./node]
|
|
147
|
+
migrateConfigDirectory [./node]
|
|
148
|
+
migrateConfigDocuments [./node]
|
|
149
|
+
migrateEffectiveSnapshot [./one-time-migrations]
|
|
150
|
+
migrateEnvModelsDecision [./node]
|
|
151
|
+
migrateStoredDocuments [./one-time-migrations]
|
|
152
|
+
parseDomain [., ./config-fns]
|
|
153
|
+
parseDomainLoud [., ./config-fns]
|
|
154
|
+
parseDomainSalvaged [., ./config-fns]
|
|
155
|
+
planEnvModelTableWrite [.]
|
|
156
|
+
readBundle [./node]
|
|
157
|
+
readConfigDFileReadingSync [./node]
|
|
158
|
+
readEffectiveWire [., ./config-fns]
|
|
159
|
+
readPlainStringRecord [.]
|
|
160
|
+
readRequestMcpTransport [.]
|
|
161
|
+
readWorkersRows [.]
|
|
162
|
+
remoteExecPath [./node]
|
|
163
|
+
resolveCenterRefs [.]
|
|
164
|
+
resolveLegExpectation [./conformance]
|
|
165
|
+
retiredEnvRefusal [.]
|
|
166
|
+
runConformance [./conformance]
|
|
167
|
+
salvageEntries [., ./config-fns]
|
|
168
|
+
urlSeatPatterns [./one-time-migrations]
|
|
169
|
+
validateDomain [./node]
|
|
170
|
+
validateRemoteExec [./node]
|
|
171
|
+
writeBundle [./node]
|
|
172
|
+
writeDomainFile [./node]
|
|
173
|
+
writeRemoteExec [./node]
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
## 17.2.0 — 2026-11-02 — minor:`./node` 出三只同步读写口(`config.d` 文档读数 · 决定文档读 / 写)· 根桶出「显式停用」谓词 `isExplicitlyDisabledEntry` · settings 单元读不进的处置律 · 关停位值域的实现差登记
|
|
178
|
+
|
|
179
|
+
> 档位(按发版纪律):**minor** —— 新导出(`./node` 三个函数加四个类型,根桶一个函数)是加性的,既有导出的答案逐格不变;零别名、零双读。三只同步口与各自的异步口读 / 写同一份判据:读数、拒句、落盘字节、文件模式逐项相同(对拍钉)。
|
|
180
|
+
> 谁需要:在**同步具名锁**里读写配置根的壳(CLI):读 `config.d/<名>.json` 要和包同一套的悬空符号链接 / 空白 / 过深判,写模型池要在锁里先写决定、再写目录;包里此前只有异步口,壳只好自读文本(第四只缺席读法)。
|
|
181
|
+
> 谁受伤:无 —— 加性。壳把自读文本换成同步读口时有三处**可见差**(= 它与包的分叉清零):纯空白 / 零字节的文档由「缺席」变 `empty` 拒;悬空符号链接变 `io` 拒;嵌得过深变 `too_deep` 拒。补偿:拒句点名路径与出路(删掉它回到缺省,或写一个合法对象)。
|
|
182
|
+
> 导出面:`./node` +3 函数 +4 类型,根桶 +1 函数(登记表 `docs/API-SURFACE.md` 已重生)。`entryEnabledFlag`(三态读数)收回成模块私有 —— 它从未在任何子路径上可达,所以不是导出面变化。
|
|
183
|
+
|
|
184
|
+
- **`readConfigDFileReadingSync(root, name)`(`./node`)与类型 `ConfigDReading` / `ConfigDRefused` / `ConfigDFileReason` / `ConfigDDocumentName`**。读一个 `config.d/<名>.json` → 读数(`absent` / `present{value}` / `refused{reason, error, thrown, fingerprint}`),与包内异步读口**共用同一只纯判** `judgeConfigDTextReading` 与**同一个缺席尾**:
|
|
185
|
+
缺席尾抽成一只 `absentUnlessDangling`(`ENOENT` ⇒ 对文档与 `config.d` 目录各问一次链接判法 ⇒ 悬空抛那一句 ⇒ 否则缺席),`readTextIfPresent` 与新的同步孪生 `readTextIfPresentSync` 各留一行读文本的 I/O;`config-d-file` 里读口的函数体只剩「摆路径、读一次文本、交给同一只 `readingOfText` / `refusedIo`」。
|
|
186
|
+
**不**在根桶出裸纯判(壳自读文本 = 第四只缺席读法;`config-d-file` 依赖 `node:path` 与原子写器,不是浏览器安全叶),异步读口也仍包内私有 —— 本版只出壳要的同步口。名字不是 `config.d` 里能放的文档名 ⇒ 同步抛(与异步口的拒绝同一个错)。
|
|
187
|
+
钉:`test/config-d-sync-reading-17.2.0.test.ts`(同步 / 异步逐格对拍〔缺席 / 在场各形 / 空与纯空白 / 坏 JSON / 非对象五形 / 过深 / 目录 / 悬空链接 / 成环 / 权限〕+ 每格绝对答案 + 指纹绝对值 · 结构:判官 `JSON.parse` 恰一处、缺席臂恰一处、两口函数体只留一行 I/O · 出口:根桶不出)。
|
|
188
|
+
- **`readEnvModelsDecisionSync(root)` / `writeEnvModelsDecisionSync(root, word, { write })`(`./node`)**。配置根上 env 模型表决定文档的同步读 / 写:同一个字节读法(`readEnvModelsDecisionBytes`)、同一个缺席律(只有 `ENOENT` 算缺席,别的读不出带 errno)、同一份答案表;
|
|
189
|
+
写口与异步口共用**同一份写计划**(决定词与写法的闭集校验 · 文本铸造 · 失败包成本包的文件系统失败句)和**同一对同步原子写原语**(异步座 `nodeConfigRootIo` 的两只写本来就是它们的异步包装,现在与同步写口调同一对,模式类表只经这一对取:新建 0o644 经进程 umask,已有的沿用原模式)。
|
|
190
|
+
读写真文件系统,**不收注入座**(`ConfigRootIo` 不动,异步形不变)。读数从不抛;写失败抛文件系统失败句,词 / 写法不在闭集抛 `TypeError`、一字不写。写序契约不变:先写决定 `replaced`、再写 `config.d/models.json`,两次写在写者对 models.json 的同一把锁里。
|
|
191
|
+
钉:`test/env-models-decision-sync-17.2.0.test.ts`(读口逐格对拍;写口〔文件不在 / 已有的各形 / 目录 / 悬空链接 / 根不存在 / 根是文件 / 根不可写〕× 两个词 × 两种写法的两棵同构树对拍:返回值 / 抛的错的类与整句 / 落盘字节 / 模式 / 残片 / 事后读数;结构:缺席律、字节读法、写计划、原子写原语各一处;`ConfigRootIo` 不动)。
|
|
192
|
+
- **根桶 `isExplicitlyDisabledEntry(entry)`**。一条目录条目**原文**是不是「显式停用」(纯 JSON 对象、自有数据属性 `enabled` 恰为 `false`):「恰为 `false`」这条律此前在包内两处、壳一处(`enabledEntryCount({ models: [entry] }) === 0`)各复述一遍;现在谓词是唯一一处写它,
|
|
193
|
+
`catalogManagesModelPlane` / `enabledEntryCount` 与 `planEnvModelTableWrite` 的启用过滤都读它(`env-model-table` 的 `entryEnabledFlag(m) !== false` 改读 `!isExplicitlyDisabledEntry(m)`)。**三态读数不出口**:出三态就是把这条律交给每个消费者各写一遍 `=== false`。
|
|
194
|
+
在 JSON 数据上与壳今天的写法逐格同答。非纯 JSON 对象的值、`enabled` 缺席 / 只靠继承 / 是访问器(不调)/ 不是布尔 ⇒ `false`;读 `enabled` 的反射本身抛(Proxy 的描述符陷阱)⇒ 照抛,不吞成 `false`(`ownEnabledFlag` 的既有臂);要整份文档的口径(读不出 ⇒ `TypeError`)问 `enabledEntryCount` / `catalogManagesModelPlane`。
|
|
195
|
+
钉:`test/explicitly-disabled-entry-17.2.0.test.ts`(真值表 · 与壳旧写法逐格同答 · 自有数据属性 / 访问器不调 / 原型污染 / 非朴素 · 三态不出口 · 「`=== false`」在 `src/` 恰一处 · 两处消费者读谓词)。
|
|
196
|
+
- **settings 单元读不进的处置律(文字律 + 全员表驱动钉;零代码、零新导出)**。`member` / `members` 单元里 `readSettingsUnit` 答 `unreadable` 的成员**不是缺席**(缺席 = 文档没设,读不进 = 设了但设成契约放不进的形)。类目 `fail` 为 `closed` 的成员:
|
|
197
|
+
方向 `loosen` ⇒ 调用方可丢(丢了授得更少),但要响;方向 `tighten` ⇒ 必须持住、在它自己的面上给最严的答案(规则面拒一切放不进的调用、关停位当开、沙箱开关取严极),不得丢、不得读成缺席 —— 丢掉它 = 把一条读不懂的限制当成没有限制,只有最严的答案不会比作者的本意松。
|
|
198
|
+
律的两个输入**已经是表**:方向 = `memberAdmission(category, member).direction`,失败方向 = `SAFETY_MERGE_SPEC[category].fail`;**读数上不加 `direction` 字段**(`whole` 单元没有方向来源,字段只能可选、每个消费者仍要对缺席分支;且与成员行是同一行的第二个读者)。文字在 `src/settings-units.ts` 头注、`readSettingsUnit` 文档与 `docs/CONSUMER-INTEGRATION.md` §15。
|
|
199
|
+
钉:`test/member-unreadable-law-17.2.0.test.ts`(枚举每个 `member` / `members` 行的每个成员:类目 `fail` 是 `closed`、成员行有合法 `direction` 且 `memberAdmission` 同读、界内值读得进、一组界外探针恒 `unreadable` 不抛;合成的坏表上当场见红 · 读数键恒为 `ok` + `value` | `reason` · 文字在三处)。
|
|
200
|
+
**未闭环(如实)**:`whole` 单元(`permissionMode` / `additionalDirectories` / `hooks` / `env` / `model` / `outputStyle`)没有方向列,「读不进即缺席」对它们是否闭合取决于各自值域的次序 —— 另一个设计题,本版没有答案;真正的 fail-closed 执法钉在读它的壳 / 服务端,本包不执法。
|
|
201
|
+
- **关停位值域的实现差登记(`docs/CC-DIVERGENCE.md`;零代码、零新导出)**。`disableBypassPermissionsMode` / `disableAutoMode` 的读法 `readSettingsUnit` 读**布尔超集** —— `"disable"`(CC 的「开」的拼写)≡ `true`,`false` 是一个值(比较器的最松极、折叠的单位元,不改变有效值),别的 `unreadable`;
|
|
202
|
+
CC 的文件面只认字符串 `"disable"`。这是实现差、不是行为偏离(合并语义无偏差)。把值写回 CC 拼写面是壳 / 服务端的渲染(开 → `"disable"`,关 → 缺席),**本包不出反向拼写函数**(把 CC 的拼写表再搬一份进来就是第二个陈述)。钉:`test/kill-switch-spelling-17.2.0.test.ts`。
|
|
203
|
+
- **订正四处过期注释**(随包源注释,无行为变化):`config-root-documents` 的两处与 `config-root-node` 的一处、`env-model-table` 头注里的「今天引擎还不读它 / 还不强制」—— 服务端的本地配置腿读这份决定并强制这道闸。
|
|
204
|
+
|
|
205
|
+
**自 v17.1.0 起运行期代码有改动的公开导出(机器重算;上界 —— 可达 ≠ 一定变,不可达 ⇒ 一定不变;本版新增的导出不入表)**
|
|
206
|
+
|
|
207
|
+
```text
|
|
208
|
+
FileConfigStore [./node]
|
|
209
|
+
catalogManagesModelPlane [.]
|
|
210
|
+
enabledEntryCount [.]
|
|
211
|
+
loadEnvFile [./node]
|
|
212
|
+
loadLocalConfig [./node]
|
|
213
|
+
loadRemoteExec [./node]
|
|
214
|
+
migrateEnvModelsDecision [./node]
|
|
215
|
+
nodeConfigRootIo [./node]
|
|
216
|
+
planEnvModelTableWrite [.]
|
|
217
|
+
readBundle [./node]
|
|
218
|
+
readEnvModelsDecision [./node]
|
|
219
|
+
readMigrationMarker [./node]
|
|
220
|
+
writeEnvModelsDecision [./node]
|
|
221
|
+
```
|
|
222
|
+
|
|
11
223
|
## 17.1.0 — 2026-11-02 — minor:车道表 device 行的可选栏登记 `DEVICE_TRUSTED_PROXY_CIDRS`(引擎读它作设备 WS 未鉴权握手 per-remote 帽键的可信代理名单)
|
|
12
224
|
|
|
13
225
|
> 档位(按发版纪律):**minor** —— 车道表一行加一个 env 名(加性):写闸自此受理 `runtime.execution.coords.DEVICE_TRUSTED_PROXY_CIDRS`(此前判「不是任何车道的坐标」)。导出面零变化(没有导出增删,签名不变)。
|
package/README.md
CHANGED
|
@@ -47,6 +47,72 @@ therefore shows only `zod`. Node built-ins only (`node:crypto`, `node:fs`).
|
|
|
47
47
|
> zod 3, nested inside every zod-4 host). The move to zod 4 did not change what any schema accepts or produces —
|
|
48
48
|
> the conformance corpus reads byte-identically on both — only the wording of validation errors (see CHANGELOG 11.0.0).
|
|
49
49
|
|
|
50
|
+
## 升级指引:17.2.x → 18.0.0(BREAKING:车道词 `none` · `REQUIRE_EXECUTION_LANE` 进墓碑表 · 新域 `a2a` 成为 `EffectiveConfig` 的必填成员)
|
|
51
|
+
|
|
52
|
+
三处**不加性**的边,逐条给读点与动作(三问与逐条细节见 CHANGELOG 18.0.0):
|
|
53
|
+
|
|
54
|
+
1. **词表联合加成员** —— `ExecutionLane` 加 `none`(不给智能体的工具提供执行环境,只能独成一集)、`TenantSeparationBasis` 加 `no-execution-target`、`RemoteExecSpec` 加零字段臂 `{ provider: "none" }`、`DomainName` 尾插 `a2a`。
|
|
55
|
+
对它们写穷举 `switch` / `Record<…>` 的地方编译红:补 `none` / `a2a` 的分支。公开记录读器的保留成员名改成一张表:旧的单名常量删除,改读 `RESERVED_MEMBER_NAMES` / `isReservedMemberName`;读数 `reservedMember: boolean` 改名 `reservedMembers`(在场的保留名,按自有键序)。车道集合不合法不要自己判 —— 调 `laneSetFlaws`(拒因闭集 `LaneSetFlaw`,规则句 `LANE_SET_RULE`),它与写闸是同一只判官。
|
|
56
|
+
2. **`EffectiveConfig` 多一个必填成员 `a2a`**(`{ peers: A2aPeerSpec[] }`,缺席 ≡ 空表 = 不拨任何对端)—— 自己构造 `EffectiveConfig` 对象的地方编译红:补 `a2a: { peers: [] }`,或改用 `emptyEffective()` / `buildEffective`。
|
|
57
|
+
3. **同一输入解析结果改变**:
|
|
58
|
+
- 本地 `config.d/a2a.json` 由「不是域、不读」(`unread-config-file` 告警)变成读进 `effective.a2a`;远端 `/effective.a2a` 由原样透传变契约解析 —— 补缺省(`scenarios: []`、`enabled: true`)、剥未知键(`notes` / `rosters` / `toolAxes` 首版不收)、坏对端逐条丢(凭据引用 `headerRefs` 里坏一项 ⇒ 整个对端丢,不部分抢救)。
|
|
59
|
+
- 本地腿的内容哈希版本对**同一组文件**变一次(哈希里多了 `a2a` 这一格):按版本号「没变就不重放」的消费方在升级后重放一次。
|
|
60
|
+
- `REQUIRE_EXECUTION_LANE` 在墓碑表 `RETIRED_ENVS` 里(`replaced` → `REMOTE_EXEC`;非空即拒,空串按未设):读这张表的引擎起服、壳、渲染器见之拒。worker `env` / `secretEnv` 里写它,拒句由「归 `runtime.execution.lanes`」变成墓碑句本身。
|
|
61
|
+
- 车道集必填那一句与「enabled 的 worker 必须声明车道」那一句的文字随规则句改(机读码与坐标逐格不变);一张表里坏词与重复同在时,重复那一格也报(此前在坏词处中断)。
|
|
62
|
+
- 本地「还缺哪些密钥」面板(`listRequiredEnvNames`)与密钥引用清单(`collectEnvRefs`)多列 `a2a` 对端的头引用。
|
|
63
|
+
- 凭据引用集合不部分抢救(`ATOMIC_SALVAGE`):直接对 `WorkersConfig` 调 `salvageEntries` 时,`secretEnv` 里坏一项的 worker 整条丢(此前只丢那一条引用、worker 带其余引用存活);兄弟 worker 不受影响,各域读数不变。
|
|
64
|
+
- 凭据引用集合(mcp / a2a 的 `headerRefs`、mcp 的 `envRefs`、车道块的 `secretRefs`、worker 的 `secretEnv`)里有叫 `__proto__` / `constructor` / `prototype` 的引用 ⇒ 集合坏、条目整条丢,写口同拒(此前 `__proto__` 被剥掉、只告警 `unknown-keys-dropped`,条目带其余引用存活;`constructor` / `prototype` 作头名受理):改名。记录读器 `readPlainStringRecord`(请求面传输的 `env` / `headers` 同读)与解析口 `resolveCenterRefs` 对这三个名字同答保留(剔出并点名 / `refs_unreadable`)—— 此前它们只认 `__proto__`。
|
|
65
|
+
- 车道表里的重复与同一 `runtime.execution` 里兄弟字段(`coords` / `secretRefs`)的不可续错误一起报(此前兄弟字段坏时重复不报);多租户拒句的出路列表多了 `none`。
|
|
66
|
+
- 凭据参数名判官认复合名:`isCredentialParamName` / `findUrlCredential` 对 `db_password` / `dbPassword` / `x-db-secret` / `user_pwd` / `PGPASSWORD` / `SECRET_KEY` 一类名字的答案由否变是(带这类参数的 URL,受理口由受理变拒);`password_hash` / `secretName` / `passwordless` 一类末段不是强档词的名字照旧不是。名字判定的唯一答者是新导出 `credentialParamWordOf`(返回表词或 `undefined`),自己读名表判名字的消费方改读它。
|
|
67
|
+
|
|
68
|
+
```ts
|
|
69
|
+
import { LANE_SET_RULE, laneSetFlaws, retiredEnvRefusal } from "@sema-agent/settings-schema";
|
|
70
|
+
|
|
71
|
+
// 读一份 REMOTE_EXEC 车道表:按逗号切段之后整张交给判官(不要自己判非空 / 去重 / 认词 / 独占)
|
|
72
|
+
const flaws = laneSetFlaws(process.env.REMOTE_EXEC?.split(",") ?? []);
|
|
73
|
+
if (flaws.length > 0) throw new Error(`REMOTE_EXEC ${LANE_SET_RULE}`);
|
|
74
|
+
|
|
75
|
+
// 渲染 / 起服之前问墓碑表(整份 env;表里每个旧名,含 REQUIRE_EXECUTION_LANE):在场 ⇒ 拒句(唯一铸点),空串按未设
|
|
76
|
+
const refusal = retiredEnvRefusal(process.env);
|
|
77
|
+
if (refusal !== undefined) throw new Error(refusal);
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
🔴 **硬顺序**:web-admin 渲染器先停渲 `REQUIRE_EXECUTION_LANE`,中心起的 worker 才能上 server 7.147.0(否则墓碑令其全部拒启)。`none` 只对已经升级的部署产出 —— 旧引擎、旧壳的车道表里没有这个词。
|
|
81
|
+
执行域策略 `allowedLanes` 的数据在切换期并列 `"in-process"` 与 `"none"`,所有读它的引擎都答 `none` 之后删掉 `"in-process"`。存下来的数据零迁移(`none` 与 `a2a` 都是新形)。
|
|
82
|
+
各消费方读哪些键、做什么见 `docs/CONSUMER-INTEGRATION.md` §17。
|
|
83
|
+
|
|
84
|
+
## 升级指引:17.1.x → 17.2.0(加性,零动作可升)
|
|
85
|
+
|
|
86
|
+
`./node` 多三只**同步**读写口,根桶多一只谓词;既有导出的答案逐格不变。在同步具名锁里读写配置根的壳(CLI)用得上 —— 以前包里只有异步口,壳只好自读文本(一只多出来的缺席读法:没有悬空符号链接判、空白读成缺席、过深不判)。
|
|
87
|
+
|
|
88
|
+
```ts
|
|
89
|
+
import { readConfigDFileReadingSync, readEnvModelsDecisionSync, writeEnvModelsDecisionSync } from "@sema-agent/settings-schema/node";
|
|
90
|
+
import { catalogManagesModelPlane, isExplicitlyDisabledEntry } from "@sema-agent/settings-schema";
|
|
91
|
+
|
|
92
|
+
// 1. 在你的同步锁里读 config.d/models.json —— 三态读数,拒句点名路径与出路
|
|
93
|
+
const reading = readConfigDFileReadingSync(configRoot, "models");
|
|
94
|
+
switch (reading.status) {
|
|
95
|
+
case "absent": /* 路径上没有任何条目 */ break;
|
|
96
|
+
case "present": /* reading.value:一个 JSON 对象 */ break;
|
|
97
|
+
case "refused": /* reading.reason ∈ empty | invalid_json | not_object | too_deep | io;reading.error 是整句 */ break;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// 2. 整份文档管不管模型面 —— 用文档级判官(读不出抛 TypeError),不要自己数条目
|
|
101
|
+
const manages = reading.status === "present" && catalogManagesModelPlane(reading.value);
|
|
102
|
+
// 逐条问「这一条停用了吗」(例如给界面标灰)—— 不要自己写 `entry.enabled === false`;`models` 不一定是数组,先判
|
|
103
|
+
const models: unknown[] = reading.status === "present" && Array.isArray(reading.value.models) ? reading.value.models : [];
|
|
104
|
+
const disabledEntries = models.filter((m) => isExplicitlyDisabledEntry(m));
|
|
105
|
+
|
|
106
|
+
// 3. 写模型池的序(同一把锁里):先写决定 replaced,再写 models.json
|
|
107
|
+
const decision = readEnvModelsDecisionSync(configRoot); // absent | replaced | kept | unreadable;读数从不抛
|
|
108
|
+
void [manages, disabledEntries];
|
|
109
|
+
if (decision.kind !== "replaced") writeEnvModelsDecisionSync(configRoot, "replaced", { write: "overwrite" }); // 写失败抛文件系统失败句
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
把自读文本换成同步读口时的**可见差**(= 与包的分叉清零):纯空白 / 零字节的文档由「缺席」变 `empty` 拒;悬空符号链接变 `io` 拒;嵌得过深变 `too_deep` 拒。
|
|
113
|
+
同步口与异步口读 / 写同一份判据(同一只纯判、同一个缺席尾、同一份写计划、同一对原子写原语),读数 / 拒句 / 落盘字节 / 文件模式逐项相同;同步口读写真文件系统,不收注入座(`ConfigRootIo` 不动)。
|
|
114
|
+
settings 单元读不进的成员**不是缺席**(`loosen` 可丢且要响,`tighten` 必须持住并给最严答案)的处置律在 `docs/CONSUMER-INTEGRATION.md` §15,同步读写口的契约在 §16;关停位值域的实现差登在 `docs/CC-DIVERGENCE.md`。导出面:`./node` +3 函数 +4 类型,根桶 +1 函数。逐条见 CHANGELOG 17.2.0。
|
|
115
|
+
|
|
50
116
|
## 升级指引:17.0.x → 17.1.0(加性,零动作可升)
|
|
51
117
|
|
|
52
118
|
车道表 `EXECUTION_LANES` 的 device 行在可选栏多一个非密坐标 `DEVICE_TRUSTED_PROXY_CIDRS`(在 `DEVICE_SUPERSEDE` 之前):引擎读它作设备 WS 未鉴权握手 per-remote 帽键的可信代理名单(CIDR 逗号分隔,缺省空 = 不读任何代理头)。
|
|
@@ -220,7 +286,7 @@ therefore shows only `zod`. Node built-ins only (`node:crypto`, `node:fs`).
|
|
|
220
286
|
「迁 → 整域终判」一次调用、无 io;与目录形共用同一个内核(读目录之后的那一段语义只此一处),`documents` 的律逐字同。返回同一个闭集的无 io 形(`unreadable`〔覆盖面内某份文档不是 JSON 对象,不抛〕/ `no-documents` /
|
|
221
287
|
`refused`〔`docs` 仍交回迁移后的那一份〕/ `noop`〔`docs` 是入参的同一引用〕/ `migrated`〔`docs` + `applied` + `changed` + `removed`〕),调用方穷举;入参不被改,重跑 `docs` ⇒ `noop`。
|
|
222
288
|
一层一次调用:层序 / 覆盖 / 托管锁的合并读法不在这里,也别自己再把 `migrateStoredDocuments` 与 `parseDomain` 按这个顺序组装一遍。
|
|
223
|
-
- **URL 内嵌凭据判官**(包根,14.5.0):`findUrlCredential(raw)` 判一个 URL 是否带凭据 —— userinfo,或 query / fragment
|
|
289
|
+
- **URL 内嵌凭据判官**(包根,14.5.0):`findUrlCredential(raw)` 判一个 URL 是否带凭据 —— userinfo,或 query / fragment 里名字是凭据名的参数(`URLSearchParams` 解一次码、ASCII 大小写不敏感;凭据名 = 整名在凭据名表 `CREDENTIAL_PARAM_NAMES` 上,或 18.0.0 起末段 / 尾串收在强档词上 —— `db_password` · `PGPASSWORD` · `SECRET_KEY`,`password_hash` · `secretName` 不是;名字判定的唯一答者是 `credentialParamWordOf`,`isCredentialParamName` 读它);
|
|
224
290
|
首个命中 `{ reason: "url_userinfo" }` / `{ reason: "url_credential_param", at, name }`(`URL_CREDENTIAL_REASONS` 闭集两词),值从不进答案,不透明形 ⇒ `undefined`。判官只判有没有:新提交门拒、续跑重放存量体的腿不拒这类载体律是座位的事,拒体的形也是座位的铸点。
|
|
225
291
|
- **迁什么**(七条,`ONE_TIME_MIGRATIONS` 每行写着改写规则、删法、删后由谁接住):退役 `runtime` 域(治理三闸 → `governance`、五个限额键 → `limits`)·
|
|
226
292
|
hosts 超界 · 调度店 durable 键(读时改写,下一个写者落盘)· workers 6.x 行 · 模型钥匙双设 · `atModelAllowlist` → `atMention` · URL fragment。
|
|
@@ -321,10 +387,11 @@ therefore shows only `zod`. Node built-ins only (`node:crypto`, `node:fs`).
|
|
|
321
387
|
|
|
322
388
|
## What's in it
|
|
323
389
|
|
|
324
|
-
- **The zod contract** (`types.ts`): `DOMAIN_SCHEMAS` (
|
|
390
|
+
- **The zod contract** (`types.ts`): `DOMAIN_SCHEMAS` (17 domains — 0.10.0 adds `projects`, the project
|
|
325
391
|
identity ledger; 0.10.18 adds `prompts` — since 14.0.0 a single axis, the center artifact (`PromptsConfig` / `EffectivePromptsWire` /
|
|
326
392
|
`promptArtifactFor`); 0.19.0 adds `limits`, the cost/rate-limit publication slot; 11.0.0 retires
|
|
327
|
-
`runtime` — its tombstone is `RETIRED_DOMAINS`, see "One-time migrations" below
|
|
393
|
+
`runtime` — its tombstone is `RETIRED_DOMAINS`, see "One-time migrations" below; 18.0.0 adds `a2a`, the standing outbound
|
|
394
|
+
A2A peer roster (`A2aConfig` / `A2aPeerSpec`, portable)),
|
|
328
395
|
`EffectiveConfig`, `EffectiveWire`,
|
|
329
396
|
`ENV_NAME`/`K8S_QUANTITY` boundaries, every domain's entry/config type.
|
|
330
397
|
- **Pure config fns** (`config-fns.ts`): `buildEffective` (deterministic — `updatedAt` is a required param),
|
|
@@ -351,12 +418,13 @@ therefore shows only `zod`. Node built-ins only (`node:crypto`, `node:fs`).
|
|
|
351
418
|
stays `invalid_value` / `invalid_union`).
|
|
352
419
|
- **WorkerSpec execution lane + store (7.0.0, M-R2)** (`execution-lanes.ts`, also subpath `./execution-lanes`, + `types.ts`): the lane / store
|
|
353
420
|
vocabulary has ONE source — the exported data `EXECUTION_LANE_WORDS`, `EXECUTION_LANES` (per lane:
|
|
354
|
-
`tenantSeparation` — and, on a `supported` lane only, `tenantSeparationBasis`: `isolation` | `principal-binding
|
|
421
|
+
`tenantSeparation` — and, on a `supported` lane only, `tenantSeparationBasis`: `isolation` | `principal-binding` | `no-execution-target` (18.0.0, the `none` lane), a
|
|
355
422
|
discriminated union (11.0.0), so a rule reads WHY a lane separates tenants instead of naming lanes — + the env names it reads, in four columns `requiredEnv` / `requiredSecretEnv` / `optionalEnv` /
|
|
356
423
|
`optionalSecretEnv`, copied from the engine with per-row coordinates), `STORE_BACKENDS`, `SESSION_BACKENDS`,
|
|
357
424
|
`MEMORY_ENGINE_BACKENDS`. Web-admin's write gate (this package's `WorkerSpec.safeParse`), web-admin's env
|
|
358
425
|
renderer and the engine's boot checks all read that one table, so they cannot drift. A worker declares
|
|
359
|
-
`runtime.execution = { lanes, coords, secretRefs }` (16.0.0: an ordered, de-duplicated, non-empty lane set — the first one is the default;
|
|
426
|
+
`runtime.execution = { lanes, coords, secretRefs }` (16.0.0: an ordered, de-duplicated, non-empty lane set — the first one is the default; 18.0.0: the set
|
|
427
|
+
is judged by one function, `laneSetFlaws` / `LANE_SET_RULE`, and a worker whose agent gets no execution environment declares `lanes: ["none"]`, alone;
|
|
360
428
|
non-secret coordinates as literals, secrets as host env-NAMEs, each key owned by a declared lane, every declared lane's required ones present
|
|
361
429
|
and not blank — an empty or whitespace-only value counts as absent; a coordinate with a grammar — `DEVICE_RELAY_URL`, a ws(s) URL or the
|
|
362
430
|
literal `none` — must also match it) and `runtime.store = { backend, session, memory,
|
package/conformance/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
18.0.0
|
|
@@ -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": 3322427891363428
|
|
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
|
},
|
|
@@ -105,6 +108,6 @@
|
|
|
105
108
|
},
|
|
106
109
|
"localRoot": {
|
|
107
110
|
"derive": true,
|
|
108
|
-
"localVersion":
|
|
111
|
+
"localVersion": 1531100058823047
|
|
109
112
|
}
|
|
110
113
|
}
|
|
@@ -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
|
},
|
|
@@ -158,6 +161,6 @@
|
|
|
158
161
|
},
|
|
159
162
|
"localRoot": {
|
|
160
163
|
"derive": true,
|
|
161
|
-
"localVersion":
|
|
164
|
+
"localVersion": 3699552373619901
|
|
162
165
|
}
|
|
163
166
|
}
|
|
@@ -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
|
},
|
|
@@ -77,6 +80,6 @@
|
|
|
77
80
|
},
|
|
78
81
|
"localRoot": {
|
|
79
82
|
"derive": true,
|
|
80
|
-
"localVersion":
|
|
83
|
+
"localVersion": 786856902779210
|
|
81
84
|
}
|
|
82
85
|
}
|
|
@@ -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
|
},
|
|
@@ -72,6 +75,6 @@
|
|
|
72
75
|
},
|
|
73
76
|
"localRoot": {
|
|
74
77
|
"derive": true,
|
|
75
|
-
"localVersion":
|
|
78
|
+
"localVersion": 1531100058823047
|
|
76
79
|
}
|
|
77
80
|
}
|
|
@@ -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
|
},
|
|
@@ -607,6 +610,6 @@
|
|
|
607
610
|
},
|
|
608
611
|
"localRoot": {
|
|
609
612
|
"derive": true,
|
|
610
|
-
"localVersion":
|
|
613
|
+
"localVersion": 997343748382977
|
|
611
614
|
}
|
|
612
615
|
}
|
|
@@ -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
|
},
|
|
@@ -611,6 +614,6 @@
|
|
|
611
614
|
},
|
|
612
615
|
"localRoot": {
|
|
613
616
|
"derive": true,
|
|
614
|
-
"localVersion":
|
|
617
|
+
"localVersion": 2261472140231940
|
|
615
618
|
}
|
|
616
619
|
}
|
|
@@ -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
|
},
|
|
@@ -106,6 +109,6 @@
|
|
|
106
109
|
},
|
|
107
110
|
"localRoot": {
|
|
108
111
|
"derive": true,
|
|
109
|
-
"localVersion":
|
|
112
|
+
"localVersion": 996325746342161
|
|
110
113
|
}
|
|
111
114
|
}
|
|
@@ -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
|
},
|
|
@@ -113,6 +116,6 @@
|
|
|
113
116
|
},
|
|
114
117
|
"localRoot": {
|
|
115
118
|
"derive": true,
|
|
116
|
-
"localVersion":
|
|
119
|
+
"localVersion": 3279031953139419
|
|
117
120
|
}
|
|
118
121
|
}
|
|
@@ -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
|
},
|
|
@@ -72,6 +75,6 @@
|
|
|
72
75
|
},
|
|
73
76
|
"localRoot": {
|
|
74
77
|
"derive": true,
|
|
75
|
-
"localVersion":
|
|
78
|
+
"localVersion": 1531100058823047
|
|
76
79
|
}
|
|
77
80
|
}
|
|
@@ -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
|
},
|
|
@@ -77,6 +80,6 @@
|
|
|
77
80
|
},
|
|
78
81
|
"localRoot": {
|
|
79
82
|
"derive": true,
|
|
80
|
-
"localVersion":
|
|
83
|
+
"localVersion": 2724669190611439
|
|
81
84
|
}
|
|
82
85
|
}
|
|
@@ -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
|
},
|
|
@@ -86,6 +89,6 @@
|
|
|
86
89
|
},
|
|
87
90
|
"localRoot": {
|
|
88
91
|
"derive": true,
|
|
89
|
-
"localVersion":
|
|
92
|
+
"localVersion": 3197714719227195
|
|
90
93
|
}
|
|
91
94
|
}
|
|
@@ -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
|
},
|
|
@@ -77,6 +80,6 @@
|
|
|
77
80
|
},
|
|
78
81
|
"localRoot": {
|
|
79
82
|
"derive": true,
|
|
80
|
-
"localVersion":
|
|
83
|
+
"localVersion": 1929276434918027
|
|
81
84
|
}
|
|
82
85
|
}
|