@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/docs/API-SURFACE.md
CHANGED
|
@@ -4,13 +4,16 @@
|
|
|
4
4
|
> 每次全量重算并逐名比对 —— 加 / 删 / 改形一个导出而不重生成本档 ⇒ 红。导出面的每次变动因此以本档的 diff 出现在评审里。
|
|
5
5
|
> 形:`value` = 运行期拿得到的值;`type` = 只在类型层;`value+type` = 同名的值与类型(zod schema 与它推出的类型)。
|
|
6
6
|
|
|
7
|
-
子路径 24 条(资产出口 `./package.json` / `./fleet-paths.json` 不是模块,不列),导出名合计
|
|
7
|
+
子路径 24 条(资产出口 `./package.json` / `./fleet-paths.json` 不是模块,不列),导出名合计 1497 个(同名在多条子路径上各计一次)。
|
|
8
8
|
|
|
9
|
-
## `.`(
|
|
9
|
+
## `.`(783)
|
|
10
10
|
|
|
11
|
+
- `A2aConfig` — value+type
|
|
12
|
+
- `A2aPeerSpec` — value+type
|
|
11
13
|
- `ABSOLUTE_HOST_PATH_MAX` — value
|
|
12
14
|
- `ACCESS_TOKEN_TTL_SECONDS` — value
|
|
13
15
|
- `ANY_INDEX` — value
|
|
16
|
+
- `ATOMIC_SALVAGE` — value
|
|
14
17
|
- `AT_MENTION_MODES` — value
|
|
15
18
|
- `AUTH_BRIDGE_ALGS` — value
|
|
16
19
|
- `AUTH_BRIDGE_ERROR_CODES` — value
|
|
@@ -261,9 +264,11 @@
|
|
|
261
264
|
- `InstructionsLoadedHookInput` — value
|
|
262
265
|
- `JwksCacheSnapshot` — type
|
|
263
266
|
- `K8S_QUANTITY` — value
|
|
267
|
+
- `LANE_SET_RULE` — value
|
|
264
268
|
- `LAYER_ADMISSION_VERDICTS` — value
|
|
265
269
|
- `LAYER_PARTS_UNREAD_CODE` — value
|
|
266
270
|
- `LEASE_STATES` — value
|
|
271
|
+
- `LaneSetFlaw` — type
|
|
267
272
|
- `LaneTenancy` — type
|
|
268
273
|
- `LayerAdmissionVerdict` — type
|
|
269
274
|
- `LayerPartsUnreadNotice` — type
|
|
@@ -324,7 +329,6 @@
|
|
|
324
329
|
- `PARSE_TRANSPARENT_KEYS` — value
|
|
325
330
|
- `PATH_BASE_URL_FORBIDDEN_PARTS` — value
|
|
326
331
|
- `PLAIN_STRING_RECORD_FAULTS` — value
|
|
327
|
-
- `PLAIN_STRING_RECORD_RESERVED_MEMBER` — value
|
|
328
332
|
- `PLUGIN_ORIGIN` — value
|
|
329
333
|
- `PRINCIPAL_INC_CLAIM` — value
|
|
330
334
|
- `PRINCIPAL_MAX_LENGTH` — value
|
|
@@ -393,6 +397,7 @@
|
|
|
393
397
|
- `REF_REFERRER_DOMAINS` — value
|
|
394
398
|
- `REMOTE_EXEC_DOCUMENT` — value
|
|
395
399
|
- `REMOTE_MCP_SERVER_NAME_PREFIX` — value
|
|
400
|
+
- `RESERVED_MEMBER_NAMES` — value
|
|
396
401
|
- `RESERVED_SCOPE_IDS` — value
|
|
397
402
|
- `RESERVED_WORKER_ENV` — value
|
|
398
403
|
- `RETIRED_DOMAINS` — value
|
|
@@ -413,6 +418,7 @@
|
|
|
413
418
|
- `RemoteExecSpec` — value+type
|
|
414
419
|
- `RequestMcpTransport` — type
|
|
415
420
|
- `RequestMcpTransportRead` — type
|
|
421
|
+
- `ReservedMemberName` — type
|
|
416
422
|
- `ResolvedEffective` — type
|
|
417
423
|
- `ResolvedMemberAdmission` — type
|
|
418
424
|
- `ResolvedTokenScope` — type
|
|
@@ -525,6 +531,7 @@
|
|
|
525
531
|
- `SkillsManifest` — type
|
|
526
532
|
- `SkillsManifestSchema` — value
|
|
527
533
|
- `SpecEnforcement` — value+type
|
|
534
|
+
- `StandaloneLane` — type
|
|
528
535
|
- `StopFailureHookInput` — value
|
|
529
536
|
- `StopHookInput` — value
|
|
530
537
|
- `StoppedBy` — value+type
|
|
@@ -621,6 +628,7 @@
|
|
|
621
628
|
- `compareGeneration` — value
|
|
622
629
|
- `containsSecretToken` — value
|
|
623
630
|
- `createSiblingResolver` — value
|
|
631
|
+
- `credentialParamWordOf` — value
|
|
624
632
|
- `danglingRefs` — value
|
|
625
633
|
- `describeBadContentOrigin` — value
|
|
626
634
|
- `describeBadMcpServerName` — value
|
|
@@ -660,6 +668,7 @@
|
|
|
660
668
|
- `isCredentialParamName` — value
|
|
661
669
|
- `isDisclosableIdentity` — value
|
|
662
670
|
- `isDomainName` — value
|
|
671
|
+
- `isExplicitlyDisabledEntry` — value
|
|
663
672
|
- `isHierarchicalUrl` — value
|
|
664
673
|
- `isInstanceStale` — value
|
|
665
674
|
- `isLoopbackAuthHost` — value
|
|
@@ -668,6 +677,7 @@
|
|
|
668
677
|
- `isRefCheckedDomain` — value
|
|
669
678
|
- `isReportableRefusalName` — value
|
|
670
679
|
- `isReservedExtensionKey` — value
|
|
680
|
+
- `isReservedMemberName` — value
|
|
671
681
|
- `isReservedScopeId` — value
|
|
672
682
|
- `isRetiredDomainName` — value
|
|
673
683
|
- `isRole` — value
|
|
@@ -682,6 +692,7 @@
|
|
|
682
692
|
- `judgeRoutability` — value
|
|
683
693
|
- `judgeWebAdminCredentialDeclaration` — value
|
|
684
694
|
- `jwksWithinOfflineGrace` — value
|
|
695
|
+
- `laneSetFlaws` — value
|
|
685
696
|
- `layerAdmission` — value
|
|
686
697
|
- `layerReadsTightenOnly` — value
|
|
687
698
|
- `leaseExhausted` — value
|
|
@@ -781,9 +792,12 @@
|
|
|
781
792
|
- `workersReferencingSecret` — value
|
|
782
793
|
- `wsUrlFlaws` — value
|
|
783
794
|
|
|
784
|
-
## `./types`(
|
|
795
|
+
## `./types`(150)
|
|
785
796
|
|
|
797
|
+
- `A2aConfig` — value+type
|
|
798
|
+
- `A2aPeerSpec` — value+type
|
|
786
799
|
- `ABSOLUTE_HOST_PATH_MAX` — value
|
|
800
|
+
- `ATOMIC_SALVAGE` — value
|
|
787
801
|
- `AT_MENTION_MODES` — value
|
|
788
802
|
- `AUTONOMY_MODES` — value
|
|
789
803
|
- `AbsoluteHostPath` — value
|
|
@@ -960,12 +974,14 @@
|
|
|
960
974
|
- `collectEnvRefs` — value
|
|
961
975
|
- `workersReferencingSecret` — value
|
|
962
976
|
|
|
963
|
-
## `./execution-lanes`(
|
|
977
|
+
## `./execution-lanes`(23)
|
|
964
978
|
|
|
965
979
|
- `EXECUTION_LANES` — value
|
|
966
980
|
- `EXECUTION_LANE_WORDS` — value
|
|
967
981
|
- `ExecutionLane` — type
|
|
968
982
|
- `ExecutionLaneRow` — type
|
|
983
|
+
- `LANE_SET_RULE` — value
|
|
984
|
+
- `LaneSetFlaw` — type
|
|
969
985
|
- `LaneTenancy` — type
|
|
970
986
|
- `MEMORY_ENGINE_BACKENDS` — value
|
|
971
987
|
- `MemoryEngineBackend` — type
|
|
@@ -974,12 +990,14 @@
|
|
|
974
990
|
- `SESSION_BACKENDS` — value
|
|
975
991
|
- `STORE_BACKENDS` — value
|
|
976
992
|
- `SessionBackend` — type
|
|
993
|
+
- `StandaloneLane` — type
|
|
977
994
|
- `StoreBackend` — type
|
|
978
995
|
- `TENANT_SEPARATION_BASES` — value
|
|
979
996
|
- `TENANT_SEPARATION_WORDS` — value
|
|
980
997
|
- `TenantSeparation` — type
|
|
981
998
|
- `TenantSeparationBasis` — type
|
|
982
999
|
- `isBlankCoordinate` — value
|
|
1000
|
+
- `laneSetFlaws` — value
|
|
983
1001
|
- `retiredLaneWordRefusal` — value
|
|
984
1002
|
|
|
985
1003
|
## `./resolve-roster`(6)
|
|
@@ -1176,9 +1194,13 @@
|
|
|
1176
1194
|
- `tightenVerdict` — value
|
|
1177
1195
|
- `trustRank` — value
|
|
1178
1196
|
|
|
1179
|
-
## `./node`(
|
|
1197
|
+
## `./node`(56)
|
|
1180
1198
|
|
|
1181
1199
|
- `ConfigBundle` — type
|
|
1200
|
+
- `ConfigDDocumentName` — type
|
|
1201
|
+
- `ConfigDFileReason` — type
|
|
1202
|
+
- `ConfigDReading` — type
|
|
1203
|
+
- `ConfigDRefused` — type
|
|
1182
1204
|
- `ConfigDirectoryDocument` — type
|
|
1183
1205
|
- `ConfigDirectoryIo` — type
|
|
1184
1206
|
- `ConfigDirectoryMigration` — type
|
|
@@ -1217,7 +1239,9 @@
|
|
|
1217
1239
|
- `nodeConfigDirectoryIo` — value
|
|
1218
1240
|
- `nodeConfigRootIo` — value
|
|
1219
1241
|
- `readBundle` — value
|
|
1242
|
+
- `readConfigDFileReadingSync` — value
|
|
1220
1243
|
- `readEnvModelsDecision` — value
|
|
1244
|
+
- `readEnvModelsDecisionSync` — value
|
|
1221
1245
|
- `readMigrationMarker` — value
|
|
1222
1246
|
- `remoteExecPath` — value
|
|
1223
1247
|
- `saveSchedulerStore` — value
|
|
@@ -1226,6 +1250,7 @@
|
|
|
1226
1250
|
- `writeBundle` — value
|
|
1227
1251
|
- `writeDomainFile` — value
|
|
1228
1252
|
- `writeEnvModelsDecision` — value
|
|
1253
|
+
- `writeEnvModelsDecisionSync` — value
|
|
1229
1254
|
- `writeRemoteExec` — value
|
|
1230
1255
|
|
|
1231
1256
|
## `./one-time-migrations`(18)
|
package/docs/CC-DIVERGENCE.md
CHANGED
|
@@ -46,3 +46,9 @@
|
|
|
46
46
|
| SS-CCD-08 | 仓库里写给 CC 的 `.claude/settings.json` / `.claude/settings.local.json` | 那就是 CC 自己的项目层 / 本地层:工作区受信时整份读(hooks / env / allow 规则 / MCP 服务器……) | 源 `foreignProjectSettings`(`tightenOnly`):不论工作区读数只读收紧方向(deny / ask 规则、关停位的开、沙箱收紧极),其余答 `tighten_only` 或 `below_trust_floor`,一行披露没读的部分 | 更严 | 对本工具它是另一个工具的配置:用户接受本工具的工作区,不等于同意把另一个工具的 hooks、环境变量与 allow 规则搬进来;收紧方向不需要信任 | 壳与服务端读仓库设置文件的那一腿 |
|
|
47
47
|
|
|
48
48
|
关停位(`SAFETY_MERGE_SPEC.killSwitches`)无偏差:任一层可写「开」、合并严者胜,与限制性键表 `{path:["permissions","disableBypassPermissionsMode"],restrictive:"disable"}`(`:237449`)同形。
|
|
49
|
+
|
|
50
|
+
关停位的值域(**实现差**,不是行为偏离,登在这里免得被当成偏离;与上面 SS-CCD-07 后那段同体例):读法 `readSettingsUnit`(单元 `disableBypassPermissionsMode` / `disableAutoMode`)读**布尔超集** ——
|
|
51
|
+
`"disable"`(CC 的「开」的拼写)≡ `true`;`true`;`false` 是一个值 —— 合并比较器 `boolStricter` 的最松极、折叠的单位元,不改变任何有效值,不是缺席;别的一律 `unreadable`。
|
|
52
|
+
CC 的文件面只认字符串 `"disable"`(2.1.309 语料 `cli309.js:258025`:`permissions?.disableBypassPermissionsMode==="disable"`),桌面端管理策略项的文案把同一个键写作 `true`(同一份语料 `:214806`)—— CC 自己也有两种拼写。
|
|
53
|
+
所以把值写回 CC 的拼写面是壳 / 服务端的**渲染**(开 → `"disable"`,关 → 缺席;CC 里缺席 = 未禁用,对 CC 无损),不是第二个读法;本包不出反向拼写函数(把 CC 的拼写表再搬一份进来就是第二个陈述,而读法已经是单源 `readSettingsUnit`)。
|
|
54
|
+
渲染时显式 `false` 变成缺席丢的是文档层的「显式关」,不是有效值;壳若在入闸前就删掉仓库层的 `false`,层准入对它本会答的 `below_trust_floor` 披露不被问到 —— 无效果差。
|
|
@@ -10,6 +10,8 @@
|
|
|
10
10
|
> **14.7.0** 的沙箱 git 凭据平面(取值口 wire 型、有效配置块 `sandboxGit`、`VerifiedIdentity.principalInc`)在 §12。
|
|
11
11
|
> **14.7.0** 的路径基址判官(`PATH_BASE_URL_FORBIDDEN_PARTS` / `pathBaseUrlFlaws`)与公告地址 env 名(`FLEET_ADVERTISE_ADDRESS_ENV`)在 §13。
|
|
12
12
|
> 中心引用解析口 `resolveCenterRefs` 与记录读器 `readPlainStringRecord`(原因词表 `PLAIN_STRING_RECORD_FAULTS`)在 §14。
|
|
13
|
+
> **17.2.0** 的 settings 单元读不进处置律在 §15,`./node` 的同步读写口(`config.d` 文档读数、决定文档读 / 写)与根桶的「显式停用」谓词在 §16。
|
|
14
|
+
> **18.0.0** 的车道词 `none`、`REQUIRE_EXECUTION_LANE` 墓碑、车道集单一判官 `laneSetFlaws` 与便携新域 `a2a` 在 §17。
|
|
13
15
|
|
|
14
16
|
---
|
|
15
17
|
|
|
@@ -53,16 +55,16 @@
|
|
|
53
55
|
7.0.1 起未写盘时它**不再出现**(读到 undefined,而不是一份没落盘的「已迁」名单);要判「写没写」读 `written` 或结论行,不要靠退出码之外的猜测。
|
|
54
56
|
- **拒因里的迁移指路(7.0.1)**:一句话一个常量(`MIGRATION_SIGNPOST`,命令恒为 `npx @sema-agent/settings-schema migrate-workers <file>`)。
|
|
55
57
|
凡「旧形 ⇒ 迁移能搬」的拒因带它 —— 七个被删旧键,以及 `env` / `secretEnv` 里迁移会搬 / 丢的键(车道键含 `REMOTE_EXEC` /
|
|
56
|
-
`REQUIRE_EXECUTION_LANE
|
|
58
|
+
`REQUIRE_EXECUTION_LANE`〔18.0.0 起它进墓碑表,拒句是墓碑句、不带迁移指路,见 §17〕、店键 `DB_BACKEND` / `MEMORY_ENGINE` / `MEMORY_ENGINE_BACKEND`);迁移搬不了的保留名(`PORT` / `MODEL_*` /
|
|
57
59
|
`MYSQL_*` …)不带。拒因句尾的「set it via <归属字段>」不变,读它抽归属字段的下游不受影响。
|
|
58
60
|
- **三方各自要做的**:
|
|
59
|
-
- **web-admin / 编排器(sema-web-admin)**:渲染器按两块改真 —— `REMOTE_EXEC=<lane>` + `REQUIRE_EXECUTION_LANE=true
|
|
61
|
+
- **web-admin / 编排器(sema-web-admin)**:渲染器按两块改真 —— `REMOTE_EXEC=<lane>` + `REQUIRE_EXECUTION_LANE=true`〔18.0.0 起不再渲:它进了墓碑表,见 §17〕+ `coords` 逐键
|
|
60
62
|
+ `secretRefs` 逐键(服务变量名 → 宿主 env-NAME);`DB_BACKEND` / `SESSION_BACKEND` / `MEMORY_ENGINE` / `MEMORY_ENGINE_BACKEND` 恒渲;
|
|
61
63
|
按 `store.backend` 选 `MYSQL_*` 或 `PG_*` 名族(`HOST/PORT/USER/DATABASE` ← `store.db`,`*_PASSWORD` ← `secretRefs.dbPasswordEnv`);
|
|
62
64
|
`MEMORY_BACKEND` 不再产出。workers 读口接迁移;批量轮换已在本包 `workersReferencingSecret` 里看得见 `runtime.execution.secretRefs`。
|
|
63
65
|
`WorkerSpec` 不再是 `ZodObject`:读 `WorkerSpec.shape.name` 的地方改 `WORKER_NAME`(同一只名字判据);编排器读 `runtime.db` 的
|
|
64
66
|
改 `runtime.store.db.database`;新建向导要建出两块(`runtime: {}` 过不了写闸)。执行域 `allowedLanes`(开放词)的标签表:可声明车道取
|
|
65
|
-
`EXECUTION_LANE_WORDS`;`in-process` 是引擎「没有 remoteExec
|
|
67
|
+
`EXECUTION_LANE_WORDS`;`in-process` 是引擎「没有 remoteExec」的状态名,不在可声明表里,要留就单独写明来源〔18.0.0 起可声明的词是 `none`,`in-process` 只在切换期的策略数据里并列,见 §17〕。
|
|
66
68
|
- **server(引擎)**:车道词 / 必需键 / `tenantSeparation` 从 `EXECUTION_LANES` 派生(运行期事实留在按导入联合穷举的 switch);
|
|
67
69
|
`DB_BACKEND` / `SESSION_BACKEND` / `MEMORY_ENGINE_BACKEND` 的闭集读 `STORE_BACKENDS` / `SESSION_BACKENDS` / `MEMORY_ENGINE_BACKENDS`。
|
|
68
70
|
引擎不 import `WorkerSpec`,tsc 不会替它红 —— 派生是提货车的显式动作。
|
|
@@ -478,12 +480,13 @@ fleet 成员对中心公告的可达地址(`FLEET_ADVERTISE_ADDRESS`,中心往
|
|
|
478
480
|
| `CENTER_REFS_VERDICTS` / `CenterRefsVerdict` | 整台结论的词,闭集:`resolved` · `unresolved` · `refs_unreadable`;包根 |
|
|
479
481
|
| `CenterRefMember` / `CenterRefMemberVerdict` / `CenterRefLookup` / `CenterRefsResolution` | 型:成员行 `{ key, ref, verdict }`(`verdict` = `resolved` 或上面三词之一)· 判定词 · 查找函数型 · 读数;包根 |
|
|
480
482
|
| `readPlainStringRecord(v)` | 「名 → 串」记录的读器(传输读器读 `env` / `headers` 用的就是它,同一个函数);包根 |
|
|
481
|
-
| `PLAIN_STRING_RECORD_FAULTS` / `PlainStringRecordFault` / `PlainStringRecordRead`
|
|
483
|
+
| `PLAIN_STRING_RECORD_FAULTS` / `PlainStringRecordFault` / `PlainStringRecordRead` | 读器的原因词表(三词)· 词的型 · 读数型;包根 |
|
|
484
|
+
| `RESERVED_MEMBER_NAMES` / `isReservedMemberName` / `ReservedMemberName` | 保留成员名(18.0.0 起一张表:`__proto__` / `constructor` / `prototype`)· 谓词 · 型 —— 读器、解析口与域 schema 的凭据引用集合问同一个谓词;包根与 `./mcp-request-entry` |
|
|
482
485
|
|
|
483
486
|
### 14.2 解析口的读法(一条律:每成员一句判定,整台一个结论)
|
|
484
487
|
|
|
485
|
-
1. 引用表经 `readPlainStringRecord` 读。读不出(
|
|
486
|
-
|
|
488
|
+
1. 引用表经 `readPlainStringRecord` 读。读不出(整张不是纯数据、有成员的变量名不是串、读成员就抛、叫保留名 `__proto__` / `constructor` / `prototype` 的成员)⇒ **整台 `refs_unreadable`**,`fault` 是读器的词、坏在某个成员时 `member` 点名它的回显形;**一个变量都没问**。
|
|
489
|
+
读器会把叫保留名的串值成员剔出副本;解析口不许这样悄悄丢一条引用再挂,所以同样答 `refs_unreadable` / `member_name_reserved`(点名第一个)。
|
|
487
490
|
2. 每个成员恰问一次 `lookup(变量名)`(按引用表副本的自有键序:整数形的键在前、其余按记录列出的次序;实参只有变量名),判成**一个词**。一个成员坏了不早停 —— 每个成员都有自己的判定,调用方一次点名所有缺的变量:
|
|
488
491
|
|
|
489
492
|
| `lookup` 的答案 | 成员词 |
|
|
@@ -506,7 +509,7 @@ fleet 成员对中心公告的可达地址(`FLEET_ADVERTISE_ADDRESS`,中心往
|
|
|
506
509
|
|---|---|---|
|
|
507
510
|
| `not_plain_record` | 整张不是纯数据(`null` / 数组 / 原始值 / `Map` / 类实例 / 函数,或读形状就抛的对象) | 不交 |
|
|
508
511
|
| `member_not_string` | 某个成员的值不是串(读成了别的种类),或它读不出(它的访问器抛了,或读它的描述符时代理陷阱抛了)—— 两种情形 `detail` 句子分说 | 不交,`member` 点名它 |
|
|
509
|
-
| `member_name_reserved` |
|
|
512
|
+
| `member_name_reserved` | 某个成员叫保留名(`RESERVED_MEMBER_NAMES`:`__proto__` / `constructor` / `prototype`);名坏优先 —— 值也坏或读不出时句子并列说全,词仍是这一个 | 值是串:交其余、`reservedMembers` 按自有键序点名;否则不交 |
|
|
510
513
|
|
|
511
514
|
按词分派;读器从不抛。传输读器的 `lost[].fault` 就是这张表(读成员就抛的那一形,词是 `member_not_string`,句子 `could not be read (its getter threw)`)。
|
|
512
515
|
|
|
@@ -531,3 +534,120 @@ fleet 成员对中心公告的可达地址(`FLEET_ADVERTISE_ADDRESS`,中心往
|
|
|
531
534
|
- **挂不挂**:读数是判决,不是处置。
|
|
532
535
|
- **变量名的形**:名册的 schema 已把变量名限在 env 名的字符集内;本口把变量名当不透明串交给 `lookup`,不再判一遍形。
|
|
533
536
|
- **值的好坏**:解到串就是 `resolved`,空串、很长的串都不另判;值是不是凭据、扣不扣留,是读数之后的另一道判官的事。
|
|
537
|
+
|
|
538
|
+
## 15. settings 单元读不进时的处置律(17.2.0 起)—— 读设置文件的壳与服务端两方
|
|
539
|
+
|
|
540
|
+
**一句话:** `member` / `members` 单元里 `readSettingsUnit` 答 `unreadable` 的成员**不是缺席**。缺席 = 文档没设这个成员;读不进 = 文档设了,但设成了契约放不进的形。
|
|
541
|
+
把它当缺席丢掉 = 当作「没设」,而对收紧方向的成员,「没设」比「设了」更松。
|
|
542
|
+
|
|
543
|
+
### 15.1 本包给什么(律的两个输入都已经是表;读数上不带方向)
|
|
544
|
+
|
|
545
|
+
| 要问的 | 从哪读 |
|
|
546
|
+
|---|---|
|
|
547
|
+
| 这个值读不读得进 | `readSettingsUnit(unit, raw, member?)` → `{ ok: true, value }` 或 `{ ok: false, reason: "unreadable" \| "launch_only" }` |
|
|
548
|
+
| 这个成员往哪个方向动(`loosen` 放宽 / `tighten` 收紧) | `memberAdmission(category, member).direction`(成员行的 `direction`;层准入已经在读它) |
|
|
549
|
+
| 读不进时这个类目往哪边失败 | `SAFETY_MERGE_SPEC[category].fail`(`closed` / `open`;今天有成员的三个类目 —— `permissions`、`sandboxNetwork`、`killSwitches` —— 全是 `closed`) |
|
|
550
|
+
|
|
551
|
+
### 15.2 律(类目 `fail` 为 `closed` 的成员)
|
|
552
|
+
|
|
553
|
+
| 成员方向 | 读不进时调用方做什么 |
|
|
554
|
+
|---|---|
|
|
555
|
+
| `loosen`(今天:`permissions.allow`) | **可以丢**(丢了授得更少),但要响:点名哪一层、哪个成员、为什么丢 |
|
|
556
|
+
| `tighten`(今天:`permissions.deny` / `ask`、`sandbox` 的各成员、两个关停位) | **必须持住,不得丢,不得读成缺席**;在它自己的面上给最严的答案 —— 规则面对放不进的条目拒一切它放不进的调用、关停位当「开」、沙箱开关取严极 |
|
|
557
|
+
|
|
558
|
+
为什么不能丢收紧成员:丢掉它 = 把作者写下的、但契约放不进的一条限制当成「没有限制」。契约读不出它本想禁什么,唯一不会比作者本意松的答案是最严的那个。
|
|
559
|
+
|
|
560
|
+
### 15.3 为什么读数上不带 `direction` 字段(显式拒)
|
|
561
|
+
|
|
562
|
+
- `whole` 单元(`permissionMode`、`additionalDirectories`、`hooks`、`env`、`model`、`outputStyle`)没有成员行,没有方向来源 —— 字段只能是可选的,每个消费者仍要对它缺席的分支写一遍处置;
|
|
563
|
+
- 方向是成员行的属性,`memberAdmission(...).direction` 已经是它的读口;读数再带一份 = 同一行有第二个读者。
|
|
564
|
+
- 要方向就读 `memberAdmission`,要失败方向就读 `SAFETY_MERGE_SPEC[category].fail`;读数只回答「读得进读不进」。
|
|
565
|
+
|
|
566
|
+
### 15.4 本包做什么、不做什么(如实)
|
|
567
|
+
|
|
568
|
+
- **不执法**:读不进的成员落在哪个面、怎么拒,是读它的壳 / 服务端的事。本包的钉保证两件:① 每个 `member` / `members` 单元的每个成员都有合法的 `direction`,类目是 `closed`(表里加成员而漏方向、或类目被改成 `open` ⇒ 红);
|
|
569
|
+
② 对一组界外值(`undefined` / `null` / 错类型 / 空串 / 稀疏数组 / 读就抛的对象 …)`readSettingsUnit` 恒 `unreadable`、不抛,界内值读得进。收紧成员读不进时不放宽的执法钉,落在消费方自己的测试里。
|
|
570
|
+
- **`whole` 单元不在律内**:`permissionMode` 读不进当缺席会落到系统缺省档,`hooks` / `env` / `model` 同理 —— 「读不进即缺席」对它们是否闭合,取决于各自值域的次序而不是成员方向,是另一个设计题,本版没有答案,也不假装有。
|
|
571
|
+
|
|
572
|
+
## 16. 同步读写口与「显式停用」谓词(17.2.0 起)—— 在同步具名锁里读写配置根的壳
|
|
573
|
+
|
|
574
|
+
**一句话:** 以前包里只有异步读写口,壳只好自读文本;现在 `./node` 有同步孪生,读 / 写**同一份判据**。读写示例见 README 的 17.1.x → 17.2.0 升级指引。
|
|
575
|
+
|
|
576
|
+
### 16.1 本包发什么
|
|
577
|
+
|
|
578
|
+
| 名字 | 子路径 | 作用 |
|
|
579
|
+
|---|---|---|
|
|
580
|
+
| `readConfigDFileReadingSync(root, name)` + 类型 `ConfigDReading` / `ConfigDRefused` / `ConfigDFileReason` / `ConfigDDocumentName` | `./node` | 读 `config.d/<名>.json` → `absent` / `present{value}` / `refused{reason, error, thrown, fingerprint}` |
|
|
581
|
+
| `readEnvModelsDecisionSync(root)` | `./node` | 配置根上 env 模型表决定的读数(`absent` / `replaced` / `kept` / `unreadable{bad_json \| bad_shape \| io}`),从不抛 |
|
|
582
|
+
| `writeEnvModelsDecisionSync(root, word, { write })` | `./node` | 写决定:`overwrite` 恒 `written`;`createIfAbsent` 已在则 `present`;词 / 写法不在闭集抛 `TypeError`;写失败抛文件系统失败句 |
|
|
583
|
+
| `isExplicitlyDisabledEntry(entry)` | 根桶 | 一条目录条目原文是不是「显式停用」(自有数据属性 `enabled` 恰为 `false`) |
|
|
584
|
+
|
|
585
|
+
### 16.2 与异步口是同一份判据(不是「差不多」)
|
|
586
|
+
|
|
587
|
+
- 读:同一只纯判(`judgeConfigDTextReading`)、同一个缺席尾(只有 `ENOENT` 算缺席,且文档与 `config.d` 目录都不是悬空符号链接;悬空 ⇒ `io` 拒)。决定文档同一个字节读法、同一个缺席律、同一份答案表。
|
|
588
|
+
- 写:同一份写计划(闭集校验 · 文本铸造 · 失败句)、同一对同步原子写原语;模式规则不变(新建 0o644 经进程 umask,已有的文件沿用原模式)。同步写口与异步口写出的字节、模式、抛的错逐项相同。
|
|
589
|
+
- 同步口读写**真文件系统**,不收注入座;`ConfigRootIo`(异步注入座)类型不变。
|
|
590
|
+
|
|
591
|
+
### 16.3 把自读文本换成同步读口:三处可见差
|
|
592
|
+
|
|
593
|
+
纯空白 / 零字节的文档由「缺席」变 `empty` 拒;悬空符号链接变 `io` 拒;嵌得过深变 `too_deep` 拒。拒句点名路径与出路。壳需要原数组形的旧文件迁移(裸数组旧形)时,`ConfigDReading` 的 `not_object` 拒不带原值 —— 那条迁移在壳自己的退役线上。
|
|
594
|
+
|
|
595
|
+
### 16.4 写模型池的序(不变)
|
|
596
|
+
|
|
597
|
+
先写决定 `replaced`、再写 `config.d/models.json`,两次写在写者对 models.json 的同一把锁里(`planEnvModelTableWrite` 给出的 `write_with_decision` 一步)。**不要自己写决定文件**:写函数给的模式与 `config.d` 域文档同一条规则,自写在 umask 002 下落 0664,引擎的目录信任判官会拒。
|
|
598
|
+
|
|
599
|
+
### 16.5 谓词:不要自己写 `=== false`
|
|
600
|
+
|
|
601
|
+
「显式停用 ⇔ `enabled` 恰为 `false`」这条律只在 `isExplicitlyDisabledEntry` 写一次;`catalogManagesModelPlane` / `enabledEntryCount` 与计划助手都读它。三态读数(`enabled` 缺席 / `true` / `false`)**不出口** —— 出三态就是把这条律交给每个消费者各写一遍。
|
|
602
|
+
条目不是纯 JSON 对象 / `enabled` 不是自有数据属性或不是布尔 ⇒ `false`(不是显式停用,在管文档里计入);要整份文档口径(读不出 ⇒ `TypeError`)问 `enabledEntryCount`。
|
|
603
|
+
|
|
604
|
+
### 16.6 本包不做的(如实)
|
|
605
|
+
|
|
606
|
+
- 不出裸纯判 `judgeConfigDTextReading` 与异步的 `readConfigDFileReading`(壳自读文本 = 第四只缺席读法;前者依赖 `node:path` 与原子写器,不是浏览器安全叶)。
|
|
607
|
+
- 不替壳决定「读不进」之后挂不挂:读数是判决,不是处置(settings 单元的处置律见 §15)。
|
|
608
|
+
|
|
609
|
+
---
|
|
610
|
+
|
|
611
|
+
## 17. 车道词 `none` · `REQUIRE_EXECUTION_LANE` 墓碑 · 车道集单一判官 · 便携新域 `a2a`(18.0.0 起)—— server、web-admin、cli、client-core、sdk 各自的读法
|
|
612
|
+
|
|
613
|
+
### 17.1 `none`:不给智能体的工具提供执行环境
|
|
614
|
+
|
|
615
|
+
- 词:`EXECUTION_LANE_WORDS` 的第八个词(尾插)。表行:分租户(依据 `no-execution-target`:没有执行目标,就没有跨租户共享的目标)、不挂副本、四栏 env 全空。
|
|
616
|
+
- 只能独成一集:worker 写 `runtime.execution.lanes: ["none"]`,部署写 `REMOTE_EXEC=none`(`CONFIG_PROVIDER=local` 时 `config.d/remote-exec.json` 也可写 `{ "provider": "none" }`,零字段)。
|
|
617
|
+
这条规则按表行的依据列判,不点名车道词:依据列为 `no-execution-target` 的车道(型 `StandaloneLane`)不与别的项同集。
|
|
618
|
+
- `in-process` 仍**不是**可声明的车道词(它是引擎旧的内部状态名)。执行域策略 `allowedLanes` 是开放词表:切换期数据并列 `"in-process"` 与 `"none"`,所有读它的引擎都答 `none` 之后从数据里删掉 `"in-process"` —— 这是数据,不要在代码里写第二种读法。
|
|
619
|
+
|
|
620
|
+
### 17.2 车道集的合法性只问一只判官
|
|
621
|
+
|
|
622
|
+
`laneSetFlaws(lanes: readonly string[])`(根桶与 `./execution-lanes`,零依赖叶)→ 拒因闭集 `LaneSetFlaw`:`empty_set` · `blank_entry{at}` · `unknown{at, word}` · `retired{at, word}` · `duplicate{at, lane}` · `not_alone{lane}`;规则句 `LANE_SET_RULE`。
|
|
623
|
+
写闸(`WorkerSpec` 的 `runtime.execution.lanes`)只调它;读车道表的一侧(引擎把 `REMOTE_EXEC` 按逗号切段、表单校验)调同一只,**不抄**非空 / 去重 / 认词 / 独占任何一条。
|
|
624
|
+
入参是任意值的表:不是字符串的项也是 `unknown`(`word` 是原值,判官不读它的属性;给人看时自己描述它的形,不回显);判官交回**全部**拒因(坏词与重复同在 ⇒ 两条)。一条车道缺不缺必需坐标、本引擎版本服务不服务这条车道,是调用方各自的门,不在判官里。
|
|
625
|
+
|
|
626
|
+
### 17.3 `REQUIRE_EXECUTION_LANE` 进墓碑表
|
|
627
|
+
|
|
628
|
+
`RETIRED_ENVS` 一行 `replaced` → `REMOTE_EXEC`:旧名在场即拒(替代名在不在都一样),空串按未设。它不再是保留名(`RESERVED_WORKER_ENV`):worker 逃生口里写它 ⇒ 墓碑句(`retiredEnvRefusal`)。
|
|
629
|
+
🔴 **硬顺序**:web-admin 渲染器先停渲这个键,中心起的 worker 才能上 server 7.147.0 —— 否则读墓碑表的引擎见之拒启。`none` 只对已经升级的部署产出。
|
|
630
|
+
|
|
631
|
+
### 17.4 便携新域 `a2a`:常驻出站 A2A 对端名册
|
|
632
|
+
|
|
633
|
+
- 形:`A2aConfig = { peers: A2aPeerSpec[] }`(缺席 ≡ 空表 = 不拨任何对端;对端名唯一);`A2aPeerSpec = { name, url, cardUrl?, headerRefs?, principalHeader?, allowSkills?, scenarios(缺省 []), enabled(缺省 true) }`。
|
|
634
|
+
判官全复用:`name` = `isUsableWireName`(对端名是线上工具名 `a2a__<名>__…` 的身份片,不 trim、不截断)· `url` / `cardUrl` = `NON_SECRET_URL`(不带凭据与 fragment)· `headerRefs` = 头名 → env-NAME(值在读方自己的环境里,中心不存值)· `principalHeader` = 头名判官。
|
|
635
|
+
- 读法:本地 `config.d/a2a.json` 与中心 `/effective.a2a` 是同一个声明座(两腿恒物化 `{ peers: [] }`);整域读不进 ⇒ 空名册;坏对端逐条丢;写权限 `domainWriteRole("a2a")` = `publisher`。
|
|
636
|
+
- **凭据引用集合不部分抢救**(`ATOMIC_SALVAGE`,按 schema 身份:mcp 的 `envRefs` / `headerRefs`、a2a 的 `headerRefs`、车道块的 `secretRefs`、worker 的 `secretEnv`):集合里坏一项 ⇒ 整个条目 `entry-dropped`,兄弟保留;别的集合字段照旧逐条丢。
|
|
637
|
+
对已记录语料零变化;两处例外:引用名为 `__proto__` / `constructor` / `prototype` 的条目整条丢(旧版:`__proto__` 被剥并告警、`constructor` / `prototype` 照收,条目都留着);
|
|
638
|
+
直接对 `WorkersConfig` 调 `salvageEntries` 时,`secretEnv` 带坏引用的 worker 整条丢(此前只丢那一条引用)。保留名只有一张表(`RESERVED_MEMBER_NAMES`),记录读器与解析口(§14)同答。
|
|
639
|
+
成员读键按自有属性名判(名集 = `Object.getOwnPropertyNames` 的串键;访问器 / 隐藏键 ⇒ 读不出 ⇒ 同样判坏):`__proto__` / `constructor` / `prototype` 作引用名 ⇒ 集合坏 ⇒ 整条丢(zod 的 record 读键前跳过 `__proto__`、不判它的值,只靠它判会让条目带着其余引用活下来);读方自己按名查引用表时同样不认这三个名字。
|
|
640
|
+
- 密钥引用清单 `collectEnvRefs` / 本地面板 `listRequiredEnvNames` 列出对端的头引用(域 `a2a`)—— 读方「对端要的 env 在不在」用同一份清单。
|
|
641
|
+
|
|
642
|
+
### 17.5 各消费方的读点
|
|
643
|
+
|
|
644
|
+
| 消费方 | 读点 | 动作 |
|
|
645
|
+
|---|---|---|
|
|
646
|
+
| server 7.147.0 | `EXECUTION_LANE_WORDS` / `EXECUTION_LANES` · `RETIRED_ENVS`(起服)· `RemoteExecSpec` · `laneSetFlaws` · `A2aConfig` / `EffectiveConfig.a2a` / `PORTABLE_DOMAINS` | 提货同版:`none` 车道、总开关见之拒启、文件声明的 `none`、读声明车道表调判官、`a2a` 改读契约域(本地与中心同座) |
|
|
647
|
+
| web-admin | `RETIRED_ENVS` · `runtime.execution.lanes` · 策略 `allowedLanes` 数据 · `A2aPeerSpec` · `domainWriteRole("a2a")` | 先停渲 `REQUIRE_EXECUTION_LANE`(硬顺序);`["none"]` ⇒ `REMOTE_EXEC=none`;策略数据切换期并列两词;`a2a` 编辑面与 publisher 写权限 |
|
|
648
|
+
| cli | `EXECUTION_LANES`(车道 → 必需键)· 车道词闭集 · `RETIRED_ENVS` | 随表:`none` 行无必需键、不再是表外词;起本机引擎前墓碑表拒 `REQUIRE_EXECUTION_LANE` |
|
|
649
|
+
| client-core | `ExecutionLane` · `EffectiveConfig` | 穷举处补 `none`;`EffectiveConfig.a2a` 必填;本地读腿多读 `config.d/a2a.json` |
|
|
650
|
+
| sdk | `ExecutionLane` · `EffectiveConfig`(类型面) | 穷举或自造 `EffectiveConfig` 的地方编译红,按上两行补 |
|
|
651
|
+
|
|
652
|
+
凭据参数名(同版):「这个已解码的参数名是不是凭据名」只问包根 `credentialParamWordOf`(返回表词或 `undefined`:整名在 `CREDENTIAL_PARAM_NAMES` 上,或末段 / 尾串收在 `password` `passwd` `pwd` `secret` `apikey` 与 `secret key` / `secret access key` / `api key` / `access token` 上(后两条答各自的整名词 `api_key` / `access_token`);`password_hash` / `secretName` / `passwordless` 一类不是),`isCredentialParamName` / `findUrlCredential` 读同一只 —— 带 `?db_password=` 这类参数的 URL,受理口由受理变拒。
|
|
653
|
+
读点:server 7.147.0 的日志脱敏器(URL 参数 · JSON 秘密字段 · 自由文本强锚三个名字读者与诊断值位)改读它、拿返回的词去查自己的锚强度列,受理口判官与脱敏器同一版同一天翻;cli 无读点(壳零直调这组判官);client-core 无读点(只有一格探针扫本包 d.ts 的导出名,新名字不命中它的『同类键名判官』扫描式);web-admin、sdk 不读名字判定(sdk 合同测里的固定样例 `?token=` / `?api_key=` 照旧命中)。
|
package/llms-full.txt
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<!--
|
|
2
2
|
llms-full.txt — 自包含全文 · 消费方(使用者)视角 · @sema-agent/settings-schema
|
|
3
|
-
重写日期: 2026-11-
|
|
3
|
+
重写日期: 2026-11-03 | 包版本: 18.0.0
|
|
4
4
|
生成方式: 无生成脚本——按当前树 src/*.ts 导出面 + package.json + README/CHANGELOG 手写事实版。
|
|
5
5
|
证据约定: 每条"它怎么工作"的断言附 (文件: 符号) 坐标,刻意不用行号(行号逐版腐烂;符号名由
|
|
6
6
|
typecheck 与 test/package-surface.test.ts、test/docs-hygiene.test.ts 等常驻门钉住)。无证据推断显式标【推断】。
|
|
@@ -89,8 +89,8 @@ registry:公网 npmjs,无需私有 registry 配置。
|
|
|
89
89
|
以下均为真实导出(主 barrel `.`、`./node` 或细分 subpath;见 §6)。签名/字段名核实自源码导出面。
|
|
90
90
|
|
|
91
91
|
--- 4.1 域 schema 与类型(src/types.ts,主 barrel / `./types`) ---
|
|
92
|
-
- `DOMAIN_SCHEMAS`:
|
|
93
|
-
collab, workers, hosts, governance, entitlement, execution, projects, prompts, limits }`。`runtime` 域 11.0.0 起 retired:
|
|
92
|
+
- `DOMAIN_SCHEMAS`:17 个配置域 → zod 对象:`{ models, rosters, skills, mcp, plugins, scenarios, systems,
|
|
93
|
+
collab, workers, hosts, governance, entitlement, execution, projects, prompts, limits, a2a }`。`runtime` 域 11.0.0 起 retired:
|
|
94
94
|
墓碑 `RETIRED_DOMAINS` —— `parseDomain` / `buildEffective` / `readEffectiveWire` / `FileConfigStore` 遇带事实的 runtime 文档一律抛
|
|
95
95
|
`RetiredDomainError`(拒句点名一次性迁移 SS-M1),缺席或 `{}` 不理会。
|
|
96
96
|
`DOMAINS`(声明顺序)、`isDomainName(x)`;`"remote-exec"` **不是**域(独立契约,§4.6)。
|
|
@@ -147,6 +147,9 @@ registry:公网 npmjs,无需私有 registry 配置。
|
|
|
147
147
|
引擎词表不镜像(语义只有引擎 verify);逐条抢救 none(digest 约束)。
|
|
148
148
|
· limits:cost/限流族 14 键的热更新发布位;**open-world `.passthrough()`**(未知键原样承运 +
|
|
149
149
|
`"unknown-keys-carried"` 点名;1.x 论证见源头注,行为钉在 test/limits-domain-0.19.test.ts)。
|
|
150
|
+
· a2a(18.0.0):常驻出站 A2A 对端名册 `A2aConfig = { peers: A2aPeerSpec[] }`(对端名唯一);`A2aPeerSpec = { name, url, cardUrl?, headerRefs?,
|
|
151
|
+
principalHeader?, allowSkills?, scenarios(缺省 []), enabled(缺省 true) }`。判官全复用:`name` = `isUsableWireName`,`url` / `cardUrl` = `NON_SECRET_URL`,
|
|
152
|
+
`headerRefs` = mcp 的头名 → env-NAME 引用集合,`principalHeader` = 头名判官。便携(本地 `config.d/a2a.json`);读不进 ⇒ 空名册;逐条抢救;写权限 publisher。
|
|
150
153
|
- 边界 schema(可直接复用):`ENV_NAME`(/^[A-Z_][A-Z0-9_]*$/ 且拒 AKIA 形)、`NON_SECRET_URL`(存量文档里的 URL 座位 —— 域文档与 `config.d/remote-exec.json`
|
|
151
154
|
的两个端点;fragment 拒句带迁移指路)、`NON_SECRET_URL_NO_MIGRATION`(不是存量的座位 —— 凭据信封 `issuer`:同一判官、同样的规则句,fragment 拒句不带指路)、
|
|
152
155
|
`K8S_QUANTITY`、`TCP_PORT`、`HOST_NAME_MAX`/`HOSTS_ARRAY_MAX`。
|
|
@@ -165,7 +168,7 @@ registry:公网 npmjs,无需私有 registry 配置。
|
|
|
165
168
|
- `buildEffective(version, getRaw, updatedAt, onWarning?)`;`parseDomain(domain, raw)`(**`undefined` 才填默认,
|
|
166
169
|
`null` = 损坏 → 抛 sanitized ZodError**);`parseDomainLoud`(**文档面**:同 + 剥键/承运告警,永不抢救 —— 写入席、导出、`getDomain` 读它);
|
|
167
170
|
`parseDomainSalvaged`(12.3.0,**视图面**:与 `parseDomainLoud` 同一只内部体,整域读不进时按 `DOMAIN_ENTRY_SALVAGE` 逐条抢救、递归到嵌套集合,
|
|
168
|
-
救不活抛整域 parse 的原错;`buildEffective`
|
|
171
|
+
救不活抛整域 parse 的原错;`buildEffective` 十七域一处调它;好文档上两函数逐字同值同告警);`emptyEffective()`;
|
|
169
172
|
`readEffectiveWire(raw, onWarning?)`。
|
|
170
173
|
- 告警类型 `EffectiveReadWarning`(union,消费方 switch 需穷举):`hosts-grandfathered`(`droppedNames` 6.3.0 起有界 64,超界带
|
|
171
174
|
`droppedTotal`)| `domain-defaulted` |
|
|
@@ -207,6 +210,11 @@ registry:公网 npmjs,无需私有 registry 配置。
|
|
|
207
210
|
各回写一次。位移表的键 = 被压缩数组的原文档全路径(`formatConfigPath` 出门形,`"projects.<id>.contextItems"`;顶层数组就是字段名,旧表形与义不变)。
|
|
208
211
|
- 读降级表 `DOMAIN_READ_FALLBACK`(整域读不进时 default 或 throw,逐域档位)与逐条抢救表 `DOMAIN_ENTRY_SALVAGE`(12.3.0:读时能否逐条丢,
|
|
209
212
|
`salvage` / `none`,逐域档位)—— 两张表各答一个问题,谁也不读谁;`grandfatherHostsRead`。
|
|
213
|
+
- `ATOMIC_SALVAGE`(18.0.0,`ReadonlySet<ZodType>`,按 schema 身份):凭据引用集合(mcp 的 `envRefs` / `headerRefs`、a2a 的 `headerRefs`、车道块的 `secretRefs`、worker 的 `secretEnv`)
|
|
214
|
+
不部分抢救 —— 抢救走到成员不下钻,集合里任一键 / 值坏形 ⇒ 它所属的条目整条 `entry-dropped`、兄弟保留;别的集合字段照旧逐条丢(只会更窄)。
|
|
215
|
+
对已记录语料零变化;例外:引用名为 `__proto__` / `constructor` / `prototype` 的条目整条丢(旧版剥键告警或照收、条目留着),直接对 `WorkersConfig` 调 `salvageEntries` 时 `secretEnv` 带坏引用的 worker 整条丢。
|
|
216
|
+
保留成员名一张表 `RESERVED_MEMBER_NAMES` / `isReservedMemberName`:域 schema、`readPlainStringRecord` / `isStringRecord`、`resolveCenterRefs` 同答(`PLAIN_STRING_RECORD_RESERVED_MEMBER` 删除,读数 `reservedMember` 改名 `reservedMembers`)。
|
|
217
|
+
成员读键按自有属性名判:`__proto__` / `constructor` / `prototype` 作引用名 ⇒ 集合坏 ⇒ 整条丢(zod 的 record 读键前跳过 `__proto__`、不判它的值)。
|
|
210
218
|
--- 2.0.0 行为面 BREAKING:**逐条容错**。此前一条坏条目让**整域**退回 schema 默认(13 个模型坏一条 ⇒ 一条
|
|
211
219
|
都不剩);现在 `buildEffective` 在整域降级之前先经 `salvageEntries(schema, raw)` 只丢掉真正坏掉的那几条条目
|
|
212
220
|
(条目集合从域 schema 自身派生:数组字段与 Record 字段),同域其余条目照常生效,并逐条发 `entry-dropped`。
|
|
@@ -221,7 +229,7 @@ entitlement/execution/limits = `none`;`projects` = `salvage`,整域档位仍 `"t
|
|
|
221
229
|
整域读不进一臂);文档面(`parseDomain` / `parseDomainLoud`:写入席、导出、`getDomain`)永不抢救,视图面(`parseDomainSalvaged` / `buildEffective`)
|
|
222
230
|
按表抢救;抢救按 schema 递归到幸存条目体内的集合,子级坐标以父路径为前缀,零幸存者律每层成立 ---
|
|
223
231
|
- 角色助手:`UserRole`(viewer<editor<publisher<admin)、`ROLE_RANK`/`USER_ROLES`、`roleAtLeast`、`isRole`、
|
|
224
|
-
`domainWriteRole(domain)`(默认 editor;skills/mcp/plugins/scenarios/systems/entitlement = publisher,
|
|
232
|
+
`domainWriteRole(domain)`(默认 editor;skills/mcp/plugins/scenarios/systems/entitlement/prompts/a2a = publisher,
|
|
225
233
|
表在 `DOMAIN_WRITE_ROLE`)。
|
|
226
234
|
- 纯数据类型:`User`、`UserAuth`、`PublishedSnapshot`、`PendingPublish`、`ApprovePublishResult`、
|
|
227
235
|
`CasWriteResult`、`WorkerLifecycleRecord`;错误脱敏 `redactSecrets` / `sanitizeZodError`;
|
|
@@ -246,7 +254,7 @@ entitlement/execution/limits = `none`;`projects` = `salvage`,整域档位仍 `"t
|
|
|
246
254
|
- `ConfigReader` 接口(3 方法:getDomain/getEffective/getVersion)——本地源/测试桩实现它即可。(src/reader.ts)
|
|
247
255
|
|
|
248
256
|
--- 4.5 remoteExec 契约(src/remote-exec.ts,主 barrel / `./remote-exec`) ---
|
|
249
|
-
- `RemoteExecSpec`(discriminatedUnion on `provider`),
|
|
257
|
+
- `RemoteExecSpec`(discriminatedUnion on `provider`),7 个 provider(每个 ⊆ `EXECUTION_LANE_WORDS`;7.0.0 删
|
|
250
258
|
`remote-docker` —— 引擎零读点,远端 docker 守护进程 = `local-docker` + `DOCKER_HOST`):
|
|
251
259
|
- `host`:{ workdir?, allowedPaths?, shell?, commandTimeoutMs? } —— 无 secret。
|
|
252
260
|
- `local-docker`:{ image!, memory?, cpus?, network?("none"|"bridge"|"host"), workdir?, mountPath? }。
|
|
@@ -255,17 +263,21 @@ entitlement/execution/limits = `none`;`projects` = `salvage`,整域档位仍 `"t
|
|
|
255
263
|
timeoutMs?, memory?, cpu?, s3Snapshot?{ endpoint, bucket?, accessKeyEnv, secretKeyEnv, … } }。
|
|
256
264
|
- `ssh`:{ host!, port?, username!, privateKeyEnv!, mountPath? }。
|
|
257
265
|
- `adb`:{ serial!, adbPath?, mountPath? }。
|
|
266
|
+
- `none`(18.0.0):{}(零字段)—— 不给智能体的工具提供执行环境,`REMOTE_EXEC=none` 的文件形;无可配、无 secret。
|
|
258
267
|
(secret 全 env-NAME ref;exec-bound 串拒 NUL 与纯空白〔16.0.0:空串同拒,判官 = 车道坐标的 `isBlankCoordinate`,接受的值不 trim〕。通过校验 ≠ 目标服务版本已从文件驱动该 provider。)
|
|
259
268
|
|
|
260
269
|
--- 4.5b 执行车道 + 存储词表正本(src/execution-lanes.ts,主 barrel + `./execution-lanes`,7.0.0,纯数据) ---
|
|
261
|
-
- `EXECUTION_LANE_WORDS` / `ExecutionLane`:host · e2b · k8s · ssh · adb · local-docker · device(= 引擎 `REMOTE_EXEC` 收的词,
|
|
262
|
-
逐字同序;无 `in-process`、无 `remote-docker`)
|
|
270
|
+
- `EXECUTION_LANE_WORDS` / `ExecutionLane`:host · e2b · k8s · ssh · adb · local-docker · device · none(= 引擎 `REMOTE_EXEC` 收的词,
|
|
271
|
+
逐字同序;无 `in-process`、无 `remote-docker`)。`none`(18.0.0)= 不给智能体的工具提供执行环境:分租户(依据 `no-execution-target`)、不挂副本、四栏 env 全空,
|
|
272
|
+
只能独成一集(依据列为 `no-execution-target` 的车道 = 型 `StandaloneLane`;判官按列判,不点名车道词)。
|
|
273
|
+
- `laneSetFlaws(lanes: readonly unknown[]): readonly LaneSetFlaw[]` + `LANE_SET_RULE`(18.0.0):车道集合法性的唯一判官(空表 `empty_set` / 空白项 `blank_entry` /
|
|
274
|
+
不认识 `unknown`〔含不是字符串的项,`word` = 原值〕/ 墓碑词 `retired` / 重复 `duplicate` / 独占车道不独 `not_alone`;闭集,交回全部拒因,写闸穷举 switch 每条一 issue)。读车道集的消费方调同一只。
|
|
263
275
|
- `RETIRED_LANE_WORDS`(11.0.0):退役车道**值**的墓碑(`[旧词, 去向车道, 怎么配]`;永久、一跳;今一行 remote-docker → local-docker + DOCKER_HOST);
|
|
264
276
|
worker 规格 `runtime.execution.lanes` 的一格与车道文件 `provider` 读到退役词即拒,拒句 = `retiredLaneWordRefusal(word)`
|
|
265
277
|
(带出路;issue 码不变)。
|
|
266
278
|
- `EXECUTION_LANES: readonly ExecutionLaneRow[]`:每行 `{ lane, tenantSeparation: "supported"|"single-user-only", singleReplica, requiredEnv,
|
|
267
279
|
requiredSecretEnv, optionalEnv, optionalSecretEnv }`(深冻结;四栏 env 名两两不交、跨车道不交;行内容逐格抄自引擎,
|
|
268
|
-
坐标在每行 JSDoc)。`TENANT_SEPARATION_WORDS
|
|
280
|
+
坐标在每行 JSDoc)。`TENANT_SEPARATION_WORDS`;依据词 `TENANT_SEPARATION_BASES`(isolation / principal-binding / no-execution-target〔18.0.0〕)。`singleReplica`(16.0.0):执行目标挂在一个副本上(host:副本自己的文件系统;device:设备连上的那一个副本)——
|
|
269
281
|
声明了这种车道的 worker 只能一个副本。device 行的非密必需栏 = `DEVICE_RELAY_URL`(16.0.0;设备拨哪里:ws(s) 绝对 URL 或字面 `none`,值判官 `deviceRelayFlaws`,包根);非密可选栏含 `DEVICE_TRUSTED_PROXY_CIDRS`(17.1.0;设备 WS 未鉴权握手 per-remote 帽键的可信代理名单,CIDR 逗号分隔,缺省空 = 引擎不读任何代理头;值文法由引擎起服判,写闸只判归属)。
|
|
270
282
|
k8s 行的非密必需栏 = `K8S_SANDBOX_IMAGE` + `K8S_NAMESPACE`(沙箱 pod 所在的命名空间,部署自己声明;服务端的必需 env 门按本行 `requiredEnv ∪ requiredSecretEnv` 拒启)——
|
|
271
283
|
写 worker 的 k8s 行时 `runtime.execution.coords` 两键都要给,缺一键 ⇒ 写闸 issue、存下来的 workers 文档整域读不出。
|
|
@@ -273,7 +285,7 @@ entitlement/execution/limits = `none`;`projects` = `salvage`,整域档位仍 `"t
|
|
|
273
285
|
不 trim 值、不管值的格式(`" sandboxes "` 不是空白)。写闸对所有车道、所有必需坐标读的就是这一只,消费方在自己一侧问同一个问题调它、不抄第二份。
|
|
274
286
|
它只看已经有的字符串值:「这一键根本没设」由调用方先判(写闸对没设的键另有一句 `requires coords.<键>`),据它拒不拒由调用方按键是必需还是可选决定:写闸只对必需坐标据它拒,可选坐标的空串照收(`K8S_RUNTIME_CLASS` 的空串 = 不用 Kata)。(src/execution-lanes.ts)
|
|
275
287
|
- `STORE_BACKENDS`(mysql/pg/local/memory)、`SESSION_BACKENDS`(memory/mysql/auto)、`MEMORY_ENGINE_BACKENDS`(file/pg/mysql;16.0.0 起 `tidb` → `mysql`,旧词拒并指路 SS-M12)。
|
|
276
|
-
- 判据(都在 `WorkerSpec` schema 里,zod issue 的 `path` 指字段、message 带出路):enabled ⇒ 两块必填;`runtime.execution.lanes`(16.0.0)
|
|
288
|
+
- 判据(都在 `WorkerSpec` schema 里,zod issue 的 `path` 指字段、message 带出路):enabled ⇒ 两块必填;`runtime.execution.lanes`(16.0.0)有序、去重、非空,首项缺省,合法性只问 `laneSetFlaws`(18.0.0:`["none"]` 独成一集);
|
|
277
289
|
coords / secretRefs 的每个键归表里某条声明的车道、每条声明车道的必需键在场且非空白(空串或只含空白按缺),有文法的键(`DEVICE_RELAY_URL`)值合文法;归表外车道的键点名车道;
|
|
278
290
|
`requirePrincipal` ∧ 每条 single-user-only 车道各拒一条(出路按表现算);表里有 `singleReplica` 车道 ∧ 副本 > 1 拒(一条,点名这些车道);旧单值 `runtime.execution.lane` 是墓碑(指路 SS-M12);
|
|
279
291
|
device ∈ lanes ⇒ SQL 店且 session ≠ memory;memory 店 ∧ session mysql 拒;记忆引擎 pg/mysql ∧ session memory 拒;SQL 坐标 ⇔ SQL 店;
|
|
@@ -364,6 +376,7 @@ entitlement/execution/limits = `none`;`projects` = `salvage`,整域档位仍 `"t
|
|
|
364
376
|
- settings 单元表(14.6.0,`src/settings-units.ts`,主 barrel):`SETTINGS_UNITS` 十单元(path / category / reads / reading)、
|
|
365
377
|
`unitTighten(unit, member?)`、`readSettingsUnit(unit, raw, member?)`(manual ⇒ default、"disable" ⇒ true、false 仍 false、
|
|
366
378
|
bypassPermissions ⇒ launch_only;表外与 undefined / null ⇒ unreadable;收下原样返回)。
|
|
379
|
+
`member` / `members` 单元里 `unreadable` 的成员**不是缺席**:类目 `fail:closed` 时 `loosen` 成员可丢(要响)、`tighten` 成员必须持住并给最严答案;方向读 `memberAdmission(category, member).direction`,读数不带方向(docs/CONSUMER-INTEGRATION.md §15)。
|
|
367
380
|
- 信任阶梯(1.2.0):`trustRank`(managed 6 > global 5 > project 4 > local 3 > session 2 > task 1)、
|
|
368
381
|
`isAtLeast`;`MinTrust` 含 `task`(声明序非阶梯,阶梯唯一真源是 `trustRank`)。
|
|
369
382
|
词表是一只纯常量 `MIN_TRUST_WORDS`(`local, session, project, global, managed, task`;`MinTrust` zod 枚举由它派生):`trustRank` 的闭包自由名 = `MIN_TRUST_WORDS` + JS 内建
|
|
@@ -523,12 +536,15 @@ entitlement/execution/limits = `none`;`projects` = `salvage`,整域档位仍 `"t
|
|
|
523
536
|
- `loadRemoteExec(root)`(三态,§8 T3)、`writeRemoteExec`(校验+原子写)、`remoteExecPath`、`loadEnvFile`
|
|
524
537
|
(`.env` merge over process.env,file 赢,支持 `KEY=file:<path>`)。
|
|
525
538
|
- `FileConfigStore`(实现 `ConfigReader`;`getEffective({tolerant:true})` → `TolerantEffective
|
|
526
|
-
{ effective, domainErrors }`:catalog 域坏文件单列降级,gate 域 fail-loud);`PORTABLE_DOMAINS`(
|
|
527
|
-
models/rosters/skills/mcp/plugins/scenarios/collab/governance/execution/prompts/limits;`config.d/runtime.json` 只为墓碑读,带事实即拒)、
|
|
539
|
+
{ effective, domainErrors }`:catalog 域坏文件单列降级,gate 域 fail-loud);`PORTABLE_DOMAINS`(12 域:
|
|
540
|
+
models/rosters/skills/mcp/plugins/scenarios/collab/governance/execution/prompts/limits/a2a;`config.d/runtime.json` 只为墓碑读,带事实即拒)、
|
|
528
541
|
`NON_PORTABLE_DOMAIN_REASONS`(workers/hosts/systems/projects/entitlement 的排除理由,编译期双向咬死)。
|
|
529
542
|
- `validateDomain`/`validateRemoteExec` → `ValidateResult`(不 throw 用户数据)、`writeDomainFile`/
|
|
530
543
|
`domainFilePath`、`listRequiredEnvNames` → `RequiredEnvName[]`。
|
|
531
544
|
- `exportBundle`/`writeBundle`/`readBundle`(`ConfigBundle` 的键 = `PortableDomain`;11.0.0 起三只函数类型层只收可搬域,非便携域在运行期也拒)。
|
|
545
|
+
- 同步孪生(17.2.0,`./node`):`readConfigDFileReadingSync(root, name)` → `ConfigDReading`(`absent` / `present{value}` / `refused{reason,error,thrown,fingerprint}`;与包内异步读口同一只纯判、同一个缺席尾)、
|
|
546
|
+
`readEnvModelsDecisionSync(root)` / `writeEnvModelsDecisionSync(root, word, { write })`(决定文档;与异步口同字节读法 / 缺席律 / 写计划 / 原子写原语;不收注入座)。
|
|
547
|
+
根桶 `isExplicitlyDisabledEntry(entry)` = 「显式停用」(自有数据属性 `enabled` 恰为 `false`)的唯一写处,三态读数不出口。(src/config-d-file.ts: readConfigDFileReadingSync;src/config-root-node.ts: readEnvModelsDecisionSync / writeEnvModelsDecisionSync;src/catalog-manages.ts: isExplicitlyDisabledEntry)
|
|
532
548
|
- `FileConfigStore.read()` → `FileConfigRead`(16.0.0,`./node`;单读口,取代 15.2.0 的 `inspectBundle`):一次读完 `config.d` 里契约读的每一份文档(全部便携域 + retired 域的墓碑文档,每份只读一次),
|
|
533
549
|
交一个结局 —— 文件层都读得进 ⇒ `{ kind: "effective", effective, warnings }`(effective 与严读 `getEffective()` 逐位同;读侧告警交成数据,不经 `onWarning`);
|
|
534
550
|
有文档被拒 ⇒ `{ kind: "refused", refusals, version, warnings }`。每条拒 `ConfigDocumentRefusal`(包根的类型,按 `reason` 判别):`{ document, reason, error }`,`reason` ∈ 闭集词 `CONFIG_DOCUMENT_REFUSAL_REASONS`
|
|
@@ -546,10 +562,16 @@ entitlement/execution/limits = `none`;`projects` = `salvage`,整域档位仍 `"t
|
|
|
546
562
|
与目录形同一个内核(读目录之后的「迁 → 整域终判」只此一处),`documents` 的律(覆盖面外不读不判不进结果、拼错的名字抛 `TypeError`、`runtime` 要把 `governance` / `limits` 放进覆盖面)逐字同;入参不被改,重跑 `docs` ⇒ `noop`;一层一次调用(层序 / 覆盖 / 托管锁的合并读法不在这里)。
|
|
547
563
|
|
|
548
564
|
--- 4.11b URL 内嵌凭据判官(主 barrel,14.5.0;src/url-credential.ts) ---
|
|
549
|
-
- `findUrlCredential(raw)`:URL 里的凭据 = 日志脱敏器已经在用的定义 —— userinfo(只有用户名也算;判由 `httpUrlFlaws(raw, ["userinfo"])`),或 query / fragment
|
|
550
|
-
(名字按收方的读法读:`URLSearchParams` 解一次码,ASCII 大小写不敏感,不做 Unicode
|
|
565
|
+
- `findUrlCredential(raw)`:URL 里的凭据 = 日志脱敏器已经在用的定义 —— userinfo(只有用户名也算;判由 `httpUrlFlaws(raw, ["userinfo"])`),或 query / fragment 里名字是凭据名的参数
|
|
566
|
+
(名字按收方的读法读:`URLSearchParams` 解一次码,ASCII 大小写不敏感,不做 Unicode 折叠;是不是凭据名只问 `credentialParamWordOf`,见下)。答首个命中(userinfo → query → fragment):`{ reason: "url_userinfo" }` 或
|
|
551
567
|
`{ reason: "url_credential_param", at: "query" | "fragment", name }`(`name` = 表里的词,小写);值从不进答案;不透明形 / 解析不了 / 非层级式 ⇒ `undefined`(这一形收不收是座位自己的律)。`findUrlUserinfo` = 判官的第一问;
|
|
552
|
-
`isCredentialParamName(decodedName)` =
|
|
568
|
+
`isCredentialParamName(decodedName)` = `credentialParamWordOf` 有词;`urlCredentialRule(hit)` = 规则句(userinfo 与 `httpUrlRule("userinfo")` 同一句;参数句点名段与表词);`URL_CREDENTIAL_REASONS` = 拒因词闭集 `url_userinfo` / `url_credential_param`。
|
|
569
|
+
- `credentialParamWordOf(decodedName): CredentialParamName | undefined`(18.0.0,包根):「这个已解码的参数名是不是凭据名」的**唯一答者**(`isCredentialParamName` 与 `findUrlCredential` 的 query / fragment 臂读的都是它)。
|
|
570
|
+
① 整名(ASCII 大小写不敏感)在 `CREDENTIAL_PARAM_NAMES` 上 ⇒ 那个词(照旧,整名优先:`client_secret` 答 `client_secret`);② 否则按 `_` / `-` / `.` 与驼峰边界切段(空段不存在),**末段**的尾部是强档词
|
|
571
|
+
(`password` / `passwd` / `pwd` / `secret` / `apikey`)⇒ 那个词 —— `db_password` · `DB_PASSWORD` · `dbPassword` · `x-db-secret` · `user_pwd` 与前缀粘连的 `PGPASSWORD` 都算,词不跨分隔符(`app_wd` 不是 `pwd`);
|
|
572
|
+
③ 尾串闭集(逐词对齐,分隔符与大小写不论):`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`);答词的律只有一条:尾串用 `_` 连起来本身在整名表里 ⇒ 答整名词,否则答强段词。只看末尾:`password_hash` · `password_policy` · `password_hint` · `secretName` · `secret_name` ·
|
|
573
|
+
`pwd_dir` · `passwordless` 不是凭据名,数字尾巴不剥(`password2` 不是),裸 `access_key` 与名表里别的词(`token` / `key` / `refresh_token` …)作末尾时只认整名(`api_key_count` · `token_count` 不命中)。返回的是**表词**(复合名回显它收尾的那个词,调用方的名字字节不进答案):
|
|
574
|
+
消费方拿它去查自己挂在名表上的那一列(例:日志脱敏器的自由文本锚强度),不再对整名查表。误报面:以强档词收尾但值不是凭据的名字(`show_password=1` · `is_secret=true`)也被判成凭据名 —— 多拒多遮。
|
|
553
575
|
- 与 `NON_SECRET_URL` 是两个问题、互补(不是一个包含另一个):本判官按参数**名**判,`NON_SECRET_URL` 按**值形**判密钥(`?key=abc` 它放行、本判官命中;`?x=sk-live-…` 反之);存量域文档位读后者。
|
|
554
576
|
- 判官只判有没有,载体律留在座位:同一个键在新提交门拒、在续跑重放存量体的腿不拒、部署 env 只因 userinfo 拒 —— 所以它没有接进任何读已落盘 / 重放字节的 schema 或读器;拒体的形(HTTP 码、字段坐标、出路句)是座位自己的铸点。
|
|
555
577
|
凭据名表另有一份在服务端日志脱敏器里(带自由文本锚强度一列):消费方把它的表键钉在 `CREDENTIAL_PARAM_NAMES` 上(`Record<CredentialParamName, …>` 穷尽映射),加 / 删词不同步即编译红。
|
|
@@ -649,8 +671,9 @@ T7. **`.optional()` 无默认是有意的**:governance/limits 多数键 ABSENT =
|
|
|
649
671
|
T8. **roster 解析容错**(dangling → global fallback),PUT 时才用 `refIntegrityIssues` 严判。
|
|
650
672
|
T9. **`atMention` 的义由 `mode` 说**(11.0.0 取代 `atModelAllowlist`):`only` 收窄到一个都不剩 ⇒ `{mode:"none"}`(`narrowAtMention`,一只读法)。
|
|
651
673
|
T10. **worker.env 保留键**:`RESERVED_WORKER_ENV` 在 env/secretEnv 里被拒(用结构化字段)。7.0.0 起执行车道键
|
|
652
|
-
(REMOTE_EXEC /
|
|
653
|
-
`runtime.execution` / `runtime.store`;别的域也读的名(MINIO_* / LOG_LEVEL)
|
|
674
|
+
(REMOTE_EXEC / 车道表全部名)与店键(DB_BACKEND / MEMORY_ENGINE*)也在保留集 —— 写到
|
|
675
|
+
`runtime.execution` / `runtime.store`;别的域也读的名(MINIO_* / LOG_LEVEL)仍可透传。`REQUIRE_EXECUTION_LANE`(18.0.0)不再是保留名:
|
|
676
|
+
它进了墓碑表 `RETIRED_ENVS`(`replaced` → `REMOTE_EXEC`),逃生口里写它 ⇒ 墓碑句;渲染器不再产出它。
|
|
654
677
|
T11. **`remote-exec` 不是域**:用 `writeRemoteExec`/`loadRemoteExec`,喂给 `writeDomainFile` 会 fail-loud。
|
|
655
678
|
T12. **provider↔api 配对强制**(ModelEntry)。
|
|
656
679
|
T13. **三态 cap(entitlement.runtimeCaps 全族)**:ABSENT ≠ false;缺席**不下发键**(引擎是唯一默认源,
|
package/llms.txt
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<!--
|
|
2
2
|
llms.txt — 消费方(使用者)视角索引 · @sema-agent/settings-schema
|
|
3
|
-
重写日期: 2026-11-
|
|
3
|
+
重写日期: 2026-11-03 | 包版本: 18.0.0
|
|
4
4
|
生成方式: 无生成脚本——按当前树的 src/*.ts 导出面 + package.json + README/CHANGELOG 手写事实版;
|
|
5
5
|
每条断言附证据坐标(文件:符号),刻意不用行号(行号随每版腐烂,符号名由 typecheck/test 钉住)。
|
|
6
6
|
刷新触发: package.json 版号变更(test/docs-hygiene.test.ts D 组钉「包版本:」与 package.json 相等、
|
|
@@ -10,7 +10,7 @@ llms.txt — 消费方(使用者)视角索引 · @sema-agent/settings-schema
|
|
|
10
10
|
# @sema-agent/settings-schema
|
|
11
11
|
|
|
12
12
|
> 一个**纯配置契约 + resolver + 本地 loader** 的 npm 包(公网 npmjs,ESM only,Node >=20.3.0,唯一运行时
|
|
13
|
-
> 依赖 zod ^4.4.0)。它是 sema 栈配置域的**单一真值**:
|
|
13
|
+
> 依赖 zod ^4.4.0)。它是 sema 栈配置域的**单一真值**:17 个配置域的 zod schema、`EffectiveConfig` 确定性合并、
|
|
14
14
|
> per-worker roster 解析、跨域引用完整性、`remoteExec` 执行层契约、本地 `config.d/*.json` 读写,外加 hooks /
|
|
15
15
|
> fleet / scheduler-store / safety-merge-spec / auth·scopes wire 五族纯契约。被 web-admin 产品(舰队管理台)、
|
|
16
16
|
> worker 服务、TOC 桌面/CLI 共同消费。**纯被消费**——无服务、永不携带 secret 值;唯一的 bin 是一次性迁移族的目录形
|
|
@@ -22,9 +22,9 @@ llms.txt — 消费方(使用者)视角索引 · @sema-agent/settings-schema
|
|
|
22
22
|
|
|
23
23
|
## 核心能力(它能为我做什么)
|
|
24
24
|
|
|
25
|
-
- **
|
|
25
|
+
- **17 个配置域**的 zod schema 与类型(`DOMAIN_SCHEMAS` / `DOMAINS` / `isDomainName`):models · rosters · skills ·
|
|
26
26
|
mcp · plugins · scenarios · systems · collab · workers · hosts · governance · entitlement · execution ·
|
|
27
|
-
projects · prompts · limits。`runtime` 域 11.0.0 起 retired(墓碑 `RETIRED_DOMAINS`:读写遇带事实的 runtime 文档响亮拒,
|
|
27
|
+
projects · prompts · limits · a2a(18.0.0:常驻出站 A2A 对端名册,便携;`A2aConfig` / `A2aPeerSpec`)。`runtime` 域 11.0.0 起 retired(墓碑 `RETIRED_DOMAINS`:读写遇带事实的 runtime 文档响亮拒,
|
|
28
28
|
存量由一次性迁移 SS-M1 搬进 governance / limits —— `./one-time-migrations`)。(src/types.ts: `DOMAIN_SCHEMAS`)
|
|
29
29
|
- **域内坏条目逐条丢**(2.0.0):一条写坏的目录条目只丢它自己,同域其余条目照常生效,并逐条发
|
|
30
30
|
`entry-dropped` 点名(坐标形见下条;S-712 起可带 `identity?: { name?, id?, enabled? }` = 被丢条目原文里
|
|
@@ -84,11 +84,11 @@ llms.txt — 消费方(使用者)视角索引 · @sema-agent/settings-schema
|
|
|
84
84
|
worker env / 车道坐标 / 覆盖值)经同一只 `containsSecretToken` 拒 secret 形状;10.0.0 起私钥 PEM 头在串中**任意位置**都拒(此前只认串首;读原文 + 前三层百分号解码),
|
|
85
85
|
头的位置与展示侧 `redactSecrets` 同判,读法宽度仍窄于展示侧(四层及更深的编码、`+` 代空格的头写侧仍放行)。(src/types.ts: `ENV_NAME` / `containsSecretToken` / `PRIVATE_KEY_PEM_HEADER` /
|
|
86
86
|
`SealedApiKey`;src/secret-refs.ts)
|
|
87
|
-
- `remoteExec` 执行层契约:
|
|
87
|
+
- `remoteExec` 执行层契约:7 个 provider(host / local-docker / e2b / k8s / ssh / adb / none〔18.0.0,零字段:不给智能体的工具提供执行环境〕),判别字段 `provider`;
|
|
88
88
|
每个 provider 词 ⊆ 车道词表(7.0.0 删 `remote-docker`:引擎零读点)。(src/remote-exec.ts: `RemoteExecSpec`)
|
|
89
|
-
- **执行车道 + 存储的词表正本**(7.0.0,纯数据):`EXECUTION_LANE_WORDS`(host / e2b / k8s / ssh / adb / local-docker / device)、
|
|
90
|
-
`EXECUTION_LANES`(每车道 `tenantSeparation`〔supported 行另带依据 `tenantSeparationBasis`:isolation / principal-binding
|
|
91
|
-
worker 声明有序车道集 `runtime.execution.lanes`(16.0.0,首项缺省;旧单值 `lane` 是墓碑)。
|
|
89
|
+
- **执行车道 + 存储的词表正本**(7.0.0,纯数据):`EXECUTION_LANE_WORDS`(host / e2b / k8s / ssh / adb / local-docker / device / none〔18.0.0:不给智能体的工具提供执行环境,只能独成一集〕)、
|
|
90
|
+
`EXECUTION_LANES`(每车道 `tenantSeparation`〔supported 行另带依据 `tenantSeparationBasis`:isolation / principal-binding / no-execution-target〔18.0.0〕,11.0.0 判别联合〕+ `singleReplica`〔16.0.0〕+ 它读的 env 名四栏;device 行必需 `DEVICE_RELAY_URL`〔16.0.0,值判官 `deviceRelayFlaws`〕、可选栏含 `DEVICE_TRUSTED_PROXY_CIDRS`〔17.1.0,设备握手帽键的可信代理名单,值文法由引擎判〕)、退役车道值墓碑 `RETIRED_LANE_WORDS` + 拒句 `retiredLaneWordRefusal(word)`(11.0.0)、`STORE_BACKENDS` / `SESSION_BACKENDS` / `MEMORY_ENGINE_BACKENDS`(file / pg / mysql)。
|
|
91
|
+
worker 声明有序车道集 `runtime.execution.lanes`(16.0.0,首项缺省;旧单值 `lane` 是墓碑);车道集合不合法只问一只判官 `laneSetFlaws(lanes)` + 规则句 `LANE_SET_RULE`(18.0.0,包根与 `./execution-lanes`:非空 / 认词〔不是字符串的项也是不认识〕/ 墓碑词 / 去重 / 独占车道独成一集,拒因闭集 `LaneSetFlaw`)。
|
|
92
92
|
必需坐标的值算不算「缺」的唯一判官 `isBlankCoordinate(value)`(包根与 `./execution-lanes` 子路径同一个函数对象〔包根 15.1.0、子路径 15.2.0〕:空串或只含空白 ⇒ true;写闸读的同一只,消费方在自己一侧问同一个问题调它;「键没设」由调用方先判,据它拒不拒由调用方按键的必需 / 可选决定〔写闸只对必需坐标据它拒〕;src/execution-lanes.ts)。
|
|
93
93
|
WorkerSpec 的 `runtime.execution` / `runtime.store` 两块按这张表判(写闸 = `WorkerSpec.safeParse`,拒因在 zod issue 里);
|
|
94
94
|
存量 workers 行由一次性迁移改写(6.x 行 SS-M4、15.x 行 SS-M12;`migrateStoredDocuments` / bin `npx @sema-agent/settings-schema migrate <config.d directory>`),逐行终判是读侧的 `readWorkersRows`。
|
|
@@ -163,7 +163,7 @@ llms.txt — 消费方(使用者)视角索引 · @sema-agent/settings-schema
|
|
|
163
163
|
- **目录形一次性迁移**(`./node`):`migrateConfigDirectory(dir, { documents, io, check? })` —— 命令行 `migrate` 背后的唯一实现(读目录 → 迁 → 整域终判 → 原子写 → 删退役域文件);`documents` = 调用方读的域名集(覆盖面外的文件不读不判不写不删),
|
|
164
164
|
`io` 注入四个口,真绑定 `nodeConfigDirectoryIo`(node:fs + 唯一的原子写器);返回闭集 `unreadable` / `no-documents` / `refused` / `noop` / `pending` / `applied`。(src/config-dir-migration.ts · src/config-dir-io.ts)
|
|
165
165
|
- **同步单口**(`./node`,14.5.0):`migrateConfigDocuments(docs, { documents })` —— 手里已有存量文档原文(文档名 → 文档)时,「迁 → 整域终判」一次调用、无 io,与目录形同一个内核同一个闭集的无 io 形:`unreadable`(覆盖面内某份不是 JSON 对象 ⇒ 不抛,点名 `document`)/ `no-documents` / `refused`(`docs` 仍交回迁移后的那一份)/ `noop`(同一引用)/ `migrated`(`docs` + `applied` + `changed` + `removed`)。一层一次调用,层的合并不在这里。(src/config-dir-migration.ts)
|
|
166
|
-
- **URL 内嵌凭据判官**(包根,14.5.0):`findUrlCredential(raw)` —— userinfo,或 query / fragment
|
|
166
|
+
- **URL 内嵌凭据判官**(包根,14.5.0):`findUrlCredential(raw)` —— userinfo,或 query / fragment 里名字是凭据名的参数(整名在凭据名表 `CREDENTIAL_PARAM_NAMES`〔23 词〕上,或 18.0.0 起末段 / 尾串收在强档词上:`db_password` · `PGPASSWORD` · `SECRET_KEY`;答者只有 `credentialParamWordOf`)⇒ `{ reason: "url_userinfo" }` / `{ reason: "url_credential_param", at, name }`,首个命中、值不进答案,不透明 / 解析不了 ⇒ `undefined`;`findUrlUserinfo`(第一问)· `credentialParamWordOf(decodedName)`(18.0.0:凭据名判定的唯一答者,返回表词或 `undefined`)· `isCredentialParamName`(= 它有词)· `urlCredentialRule`(规则句)· `URL_CREDENTIAL_REASONS`(`url_userinfo` / `url_credential_param`)。判官只判有没有,载体律(新提交门拒 / 重放腿不拒 / 部署 env 只因 userinfo 拒)留在座位。(src/url-credential.ts)
|
|
167
167
|
- **会话网页链接**:`webAdminSessionUrl(webBaseUrl, { worker, sessionId })` 铸 `<webBaseUrl>/chat?agent=<worker>&session=<sessionId>`(两位必填、逐位 `encodeURIComponent`、基址须是干净的绝对 http(s) URL 且尾斜杠折掉,
|
|
168
168
|
坏输入抛、不铸半截链接)+ 配对解析 `parseWebAdminSessionUrl(link)`(绝对 / 相对串、`URL`、`URLSearchParams`;缺的那一位缺席)—— 路由与参数名只此一处,谁都别手拼。(src/web-admin-session-url.ts)
|
|
169
169
|
- **按 scope 绑定的令牌**(`./api/pull-token`):形与铸法一条规则、令牌族是数据(`WORKER_PULL_TOKEN` = `wpt_` / `wpt2_` / `worker-pull`);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sema-agent/settings-schema",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "18.0.0",
|
|
4
4
|
"description": "Sema settings schema — pure config contract (zod domains + effective-config + roster resolution + ref-integrity + remoteExec) shared by sema-web-admin, sema-server, and the TOC desktop/CLI. One source of truth. (Renamed at 1.0.0 from @sema-agent/registry-core — name and docs only, no behavior change; note the range moves 0.19.0 -> 1.0.0, so a dependency must become ^1.0.0. The old names @sema-agent/registry-core <=0.19.0 and @sema-ai/registry-core remain published, frozen, for migration.)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "BUSL-1.1",
|