@sema-agent/settings-schema 13.0.1 → 14.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (136) hide show
  1. package/CHANGELOG.md +134 -0
  2. package/README.md +19 -1
  3. package/conformance/VERSION +1 -1
  4. package/conformance/baseline.json +1 -3
  5. package/conformance/cases/c01-entry-salvage-then-typo/expected.json +1 -3
  6. package/conformance/cases/c02-hosts-clamp-stacked/expected.json +1 -3
  7. package/conformance/cases/c03-literal-dotted-top-key/expected.json +1 -3
  8. package/conformance/cases/c04-all-bad-collection-not-salvaged/expected.json +1 -3
  9. package/conformance/cases/c07-hooks-is-not-a-config-domain/expected.json +1 -3
  10. package/conformance/cases/c08-limits-unknown-carried-64/expected.json +1 -3
  11. package/conformance/cases/c09-limits-unknown-carried-65/expected.json +1 -3
  12. package/conformance/cases/c10-record-key-secret-redacted-twice/expected.json +1 -3
  13. package/conformance/cases/c11-unicode-unknown-keys/expected.json +1 -3
  14. package/conformance/cases/c12-prototype-name-top-keys/expected.json +1 -3
  15. package/conformance/cases/c13-models-field-null/expected.json +1 -3
  16. package/conformance/cases/c14-models-field-empty-array/expected.json +1 -3
  17. package/conformance/cases/c15-models-field-number/expected.json +1 -3
  18. package/conformance/cases/c16-deep-nesting-205/expected.json +1 -3
  19. package/conformance/cases/c17-empty-domain-file/expected.json +1 -3
  20. package/conformance/cases/c18-wire-envelope-not-an-object/expected.json +1 -3
  21. package/conformance/cases/c19-wire-envelope-no-version/expected.json +1 -3
  22. package/conformance/cases/c21-governance-empty-object-wins/expected.json +1 -3
  23. package/conformance/cases/c23-mixed-validity-models/expected.json +1 -3
  24. package/conformance/cases/c24-valid-entries-with-unknown-keys/expected.json +1 -3
  25. package/conformance/cases/c25-published-roundtrip-zero-warnings/expected.json +1 -3
  26. package/conformance/cases/c26-hosts-array-1024/expected.json +1 -3
  27. package/conformance/cases/c27-hosts-array-1025/expected.json +1 -3
  28. package/conformance/cases/c28-large-document-over-1mb/expected.json +1 -3
  29. package/conformance/cases/c29-salvage-then-domain-refine-fails/expected.json +1 -3
  30. package/conformance/cases/c30-version-triple-a-first/expected.json +1 -3
  31. package/conformance/cases/c31-version-triple-b-changed/expected.json +1 -3
  32. package/conformance/cases/c32-version-triple-a-restored/expected.json +1 -3
  33. package/conformance/cases/c33-limits-nested-carried-key/expected.json +1 -3
  34. package/conformance/cases/c34-skills-content-vs-manifest/expected.json +1 -3
  35. package/conformance/cases/c35-portable-domain-file-is-null/expected.json +1 -3
  36. package/conformance/cases/c36-skills-entry-without-content/expected.json +1 -3
  37. package/conformance/cases/c37-skills-field-null/expected.json +1 -3
  38. package/conformance/cases/c38-remote-exec-is-a-non-domain-file/expected.json +1 -3
  39. package/conformance/cases/c39-hidden-file-in-config-d/expected.json +1 -3
  40. package/conformance/cases/c40-s712-identity-only-what-reads-out/expected.json +1 -3
  41. package/conformance/cases/c41-s792-encoded-pem-identity/expected.json +1 -3
  42. package/conformance/cases/c42-s792-unknown-key-secret-redacted/expected.json +1 -3
  43. package/conformance/cases/c43-s792-form-and-deep-encoded-pem/expected.json +1 -3
  44. package/conformance/cases/c44-s792-utf8-escape-glued-token/expected.json +1 -3
  45. package/conformance/cases/c45-s792-identity-bounds-and-decode-depth/expected.json +1 -3
  46. package/conformance/cases/c46-s811-host-name-url-userinfo-withheld/expected.json +1 -3
  47. package/conformance/cases/c47-s811-roles-key-url-userinfo-withheld/expected.json +1 -3
  48. package/conformance/cases/c48-s935-model-headers-transported/expected.json +1 -3
  49. package/conformance/cases/c49-s935-model-headers-secret-entry-dropped/expected.json +1 -3
  50. package/conformance/cases/c50-s784-lane-host-legal/expected.json +1 -3
  51. package/conformance/cases/c51-s784-lane-e2b-legal/expected.json +1 -3
  52. package/conformance/cases/c52-s784-lane-k8s-legal/expected.json +1 -3
  53. package/conformance/cases/c53-s784-lane-ssh-legal/expected.json +1 -3
  54. package/conformance/cases/c54-s784-lane-adb-legal/expected.json +1 -3
  55. package/conformance/cases/c55-s784-lane-local-docker-legal/expected.json +1 -3
  56. package/conformance/cases/c56-s784-lane-device-legal/expected.json +1 -3
  57. package/conformance/cases/c57-s784-g1-enabled-no-lane/expected.json +1 -3
  58. package/conformance/cases/c58-s784-g2-multitenant-host/expected.json +1 -3
  59. package/conformance/cases/c59-s784-g3-k8s-missing-image/expected.json +1 -3
  60. package/conformance/cases/c60-s784-g3-e2b-missing-key/expected.json +1 -3
  61. package/conformance/cases/c61-s784-g3-other-lane-key/expected.json +1 -3
  62. package/conformance/cases/c62-s784-g7a-session-tidb/expected.json +1 -3
  63. package/conformance/cases/c63-s784-host-two-replicas/expected.json +1 -3
  64. package/conformance/cases/c64-s784-multitenant-local-store/expected.json +1 -3
  65. package/conformance/cases/c65-s784-pg-without-db/expected.json +1 -3
  66. package/conformance/cases/c66-s784-memory-backend-mismatch/expected.json +1 -3
  67. package/conformance/cases/c67-s784-retired-field-loud/expected.json +1 -3
  68. package/conformance/cases/c68-s784-device-local-store/expected.json +1 -3
  69. package/conformance/cases/c69-deep-encoded-token-past-every-reading/expected.json +1 -3
  70. package/conformance/cases/c70-rewritten-token-in-front-of-encoded-pem-header/expected.json +1 -3
  71. package/conformance/cases/c71-one-scanner-write-reads-display-forms/expected.json +1 -3
  72. package/conformance/cases/c72-dangling-reference-write-seat-refuses/expected.json +1 -3
  73. package/conformance/cases/c73-projects-extended-registration-reads/expected.json +1 -3
  74. package/conformance/cases/c74-projects-over-bound-refused/expected.json +1 -3
  75. package/conformance/cases/c75-projects-patch-remote-uniqueness/expected.json +1 -3
  76. package/conformance/cases/c76-projects-entry-salvage-nested/expected.json +1 -3
  77. package/conformance/cases/c77-prompts-center-artifact-carried/expected.json +252 -0
  78. package/conformance/cases/c77-prompts-center-artifact-carried/input.json +93 -0
  79. package/conformance/cases/c77-prompts-center-artifact-carried/meta.json +5 -0
  80. package/conformance/cases/c78-prompts-empty-bindings-refused/expected.json +82 -0
  81. package/conformance/cases/c78-prompts-empty-bindings-refused/input.json +11 -0
  82. package/conformance/cases/c78-prompts-empty-bindings-refused/meta.json +5 -0
  83. package/conformance/cases/c79-prompts-bad-worker-artifact-not-salvaged/expected.json +82 -0
  84. package/conformance/cases/c79-prompts-bad-worker-artifact-not-salvaged/input.json +129 -0
  85. package/conformance/cases/c79-prompts-bad-worker-artifact-not-salvaged/meta.json +5 -0
  86. package/conformance/cases/c80-prompts-wire-v2-verbatim/expected.json +195 -0
  87. package/conformance/cases/c80-prompts-wire-v2-verbatim/input.json +65 -0
  88. package/conformance/cases/c80-prompts-wire-v2-verbatim/meta.json +5 -0
  89. package/conformance/cases/c81-prompts-declaration-bindings-refused/expected.json +82 -0
  90. package/conformance/cases/c81-prompts-declaration-bindings-refused/input.json +23 -0
  91. package/conformance/cases/c81-prompts-declaration-bindings-refused/meta.json +5 -0
  92. package/conformance/cases/c82-prompts-v1-catalog-refused/expected.json +82 -0
  93. package/conformance/cases/c82-prompts-v1-catalog-refused/input.json +35 -0
  94. package/conformance/cases/c82-prompts-v1-catalog-refused/meta.json +5 -0
  95. package/conformance/cases/c83-prompts-bad-overlay-not-salvaged/expected.json +82 -0
  96. package/conformance/cases/c83-prompts-bad-overlay-not-salvaged/input.json +56 -0
  97. package/conformance/cases/c83-prompts-bad-overlay-not-salvaged/meta.json +5 -0
  98. package/conformance/cases/cc01-mcp-toolfaces-non-object/expected.json +1 -3
  99. package/conformance/cases/cc02-mcp-source-key-is-transported/expected.json +1 -3
  100. package/conformance/cases/cc03-model-compat-unknown-subkey/expected.json +1 -3
  101. package/conformance/cases/cli01-model-name-nfc-vs-nfd/expected.json +1 -3
  102. package/conformance/cases/cli02-control-and-zero-width-chars/expected.json +1 -3
  103. package/conformance/cases/cli03-credential-pasted-into-unknown-key/expected.json +1 -3
  104. package/conformance/cases/cli04-env-value-with-newline/expected.json +1 -3
  105. package/conformance/cases/cli05-long-and-prefix-colliding-names/expected.json +1 -3
  106. package/conformance/cases/t01-absent-domain-key-not-null/expected.json +1 -3
  107. package/conformance/cases/t03-prototype-name-key-not-swallowed/expected.json +1 -3
  108. package/conformance/cases/t04-secret-literal-never-in-warning-value/expected.json +1 -3
  109. package/conformance/cases/z01-every-domain-empty-object/expected.json +2 -6
  110. package/conformance/cases/z02-every-domain-unknown-key/expected.json +2 -6
  111. package/dist/config-fns.d.ts +7 -3
  112. package/dist/config-fns.js +19 -16
  113. package/dist/conformance/derive.js +2 -2
  114. package/dist/index.d.ts +1 -0
  115. package/dist/index.js +1 -0
  116. package/dist/mcp-request-entry.d.ts +118 -0
  117. package/dist/mcp-request-entry.js +266 -0
  118. package/dist/migration-receipt.d.ts +1 -1
  119. package/dist/migration-receipt.js +1 -1
  120. package/dist/node.d.ts +0 -1
  121. package/dist/node.js +0 -1
  122. package/dist/one-time-migrations.d.ts +1 -1
  123. package/dist/one-time-migrations.js +39 -0
  124. package/dist/safety-merge-spec.d.ts +6 -6
  125. package/dist/types.d.ts +438 -355
  126. package/dist/types.js +161 -136
  127. package/dist/url-shape.d.ts +8 -0
  128. package/dist/url-shape.js +10 -0
  129. package/docs/API-SURFACE.md +41 -27
  130. package/docs/CONFORMANCE.md +1 -1
  131. package/docs/CONSUMER-INTEGRATION.md +3 -2
  132. package/llms-full.txt +14 -11
  133. package/llms.txt +8 -2
  134. package/package.json +2 -2
  135. package/dist/prompts-digest.d.ts +0 -16
  136. package/dist/prompts-digest.js +0 -49
package/CHANGELOG.md CHANGED
@@ -6,6 +6,140 @@
6
6
  > `@sema-agent/registry-core`(更早还曾是 `@sema-ai/registry-core`)。本档 `0.19.0` 以下各节里的
7
7
  > 包名是**历史记录**,如实保留不追改。
8
8
 
9
+ ## Unreleased
10
+
11
+ ## 14.1.0 — 2026-10-18 — minor:请求面 MCP 判官与服务端请求腿同严(申报名首尾空白 · `env` / `headers` 只收纯数据记录 · 两只回显描述器的回显口径)
12
+
13
+ > 档位:**minor**(型面加性:`McpEntryKeyIssue` 新增两个可选格 `member?` / `fault?`;三处两层两答的判官变严是 bug 修复);导出名单不变(请求面判官与描述器自 14.0.0 起都在主 barrel:`isUsableWireName` · `describeBadWireName` · `isContentOriginWord` ·
14
+ > `describeBadContentOrigin` · `readRequestMcpTransport` · `readMcpIdentityHeaders` · 值种类描述件与 `TOOL_WIRE_NAME_MAX_CHARS`,本版无增删,`docs/API-SURFACE.md` 不动)。
15
+ > 型面一处加性:`McpEntryKeyIssue` 多两个**可选**格 `member?` / `fault?`(不改既有的 `path` / `reason`;只有 `env` / `headers` 记录上的坏形带)。
16
+
17
+ - **行为修复(申报名首尾空白 = 坏名)**。`isUsableWireName` 对首尾带空白的名返回 `false`;此前它只判非串 / 空串 / 超 `TOOL_WIRE_NAME_MAX_CHARS`,所以 `" fs"` / `"fs\n"` 被收。
18
+ 「空白」就是 `String.prototype.trim` 剥的那一组(ECMAScript 的 WhiteSpace + LineTerminator 共 25 个码点:空格 / 制表 / 换行 / NBSP / BOM / 全角空格 / 行段分隔符等);不在这一组里的不可见字符(零宽空格 U+200B 等)不算空白,本判官不管。申报名是线上工具名 `mcp__<server>__<tool>` 的身份片:带着空白的那个名字不是
19
+ 另一个名字、是坏名 —— 所以**不 trim、不规范化**(与「不截断」同向:改写一个名字就是换一个身份,挂在原名上的 allowTools / toolFaces 收窄声明会一起对不上号)。内部空白(`"a b"`)照旧合法,本判官不扩判。
20
+ `describeBadWireName` 对这类名给一个种类词:`" a" (leading or trailing whitespace)`;又超界的一句说全:`… (129 chars > 128, leading or trailing whitespace)`;摘要的回显口径见下面「两只回显描述器」一条,
21
+ 既有的超界 / `empty` / 非串三形的句式不变。判与说共读同一个「首尾空白」定义,不会各按各的口径。
22
+ 三问 —— **谁需要**:两层同答。装配口(client-core)对首尾空白的申报名拒、而本判官收,同一个名字两层两答;判官在契约包,各层读同一份才不会再分岔。
23
+ **谁受伤**:申报名带首尾空白的配置 / 请求 —— 读本判官的服务端请求腿与声明腿(壳的发送前预检若读它亦然)此前放行(服务端受理后以带空白的名挂上),现在按坏名处理;重放存量提交体的消费方按各自对坏名的处置走
24
+ (服务端的重放腿:摘掉这条 server 并点名),所以存量里带空白名的 parked 任务续跑时会少这台 server。**补偿**:去掉空白 —— 拒句点名 `leading or trailing whitespace`(制表 / 换行这类控制空白在回显里被剥掉,看得出是空白靠这个种类词);
25
+ `"a b"` 这类内部空白无须改。
26
+ 钉:`test/mcp-request-entry-14.0.0.test.ts` ⑥(首尾空白各形,含 `trim` 那一组 25 个码点的前后位 · 组外不可见字符照旧合法 · 内部空白照旧 · 摘要既有三形不动 + 空白种类词 + 超界并存一句说全 · 判官与摘要按逐名事实表同一定义)·
27
+ ⑦(消费方切 import 要用的判官 / 描述器 / 常量与三个结果型逐名在主 barrel)。
28
+ - **行为修复(`env` / `headers` 只收纯数据的「名 → 串」记录)**。`readRequestMcpTransport` 读 `transport.env`(stdio)/ `transport.headers`(http)此前判「每个值都是串」(`Object.values` 全是串):
29
+ `new Map()`、`Set`、带自有串属性的类实例照收并原样交出(交出的就是那个 `Map` / 实例),JSON 文本铸出的自有 `__proto__` 键原样带出,交出的还是调用方的**同一个对象**,一个抛错的访问器会让读器抛出去。
30
+ 现在与服务端请求腿同严:记录交不交 = 原型是 `Object.prototype` 或 `null`(纯数据)且每个自有成员(不可枚举的也算,访问器调一次)的值都是串。
31
+ `Map` / `Set` / 类实例 / 建在原型上的记录 ⇒ 这个键整张不交,`lost` 记一处,原因句 `must be a plain object of string values — got an object that is not plain data (…)`;不是对象 / 数组 / `null` ⇒ 同一条(`got an array` 等);
32
+ 有成员值不是串(或访问器抛了)⇒ 整张不交,句子点名第一个坏成员(`its member "PORT" must be a string — got a number`);读原型与成员名时代理的 trap 抛了 ⇒ 同样整张不交(读器对递来的任何对象都不抛,这一条服务端读法是抛出去,本包更稳);
33
+ 名叫 `__proto__` 的成员(引擎的声明收据不收这个名)⇒ 记录照交、副本里没有它,`lost` 单记一处、路径 `transport.env.__proto__`,它的值也不是串时整张不交、一句说全两件事。
34
+ **交出的是副本**(原型 `Object.prototype`),改调用方的对象不影响读后的形。`isStringRecord` 与读器是同一个定义(包内没有第二把更宽的尺)。
35
+ 机读位:`McpEntryKeyIssue` 多两个可选格 —— `member`(成员名的回显形,可直接进日志与句子)与 `fault`(闭集词 `not_plain_record` / `member_not_string` / `member_name_reserved`),
36
+ 只有 `env` / `headers` 记录上的坏形带,调用方分流不必解析句子;句子 `reason` 仍是消费方拒句的来源(逐字同服务端请求腿,期望句取自服务端 7.132.0 读器的实测输出)。
37
+ - **行为修复(两只回显描述器用服务端的回显口径)**。`describeBadWireName` / `describeBadContentOrigin` 此前用 `JSON.stringify`(控制字符转义成 `\n` 字样、**双向控制字符原样输出**),名只截 32 字、内容出处值连引号截 64 字;
38
+ 现在:剥掉 C0 控制符、DEL 与双向控制字符(Unicode `Bidi_Control=Yes` 全集 12 个码点:U+061C · U+200E/200F · U+202A–202E · U+2066–2069;一个 RLO 能把一行字读反,一个换行能伪造一行日志)—— 是**删**,不转义;
39
+ 剥完再数,超 64 字截到 64 加 `…`(省略号在引号内);引号形 `"…"`,内部的引号与反斜杠逐字。清洗面不含 C1 与 U+2028 / U+2029(加宽是行为变更,要各自的判据)。`N chars > 128` 的 N 仍是送来的原长度。
40
+ 双向这一半的属主是引擎(`BIDI_CONTROL_CHARS`),本包运行期不依赖引擎,以镜像承载并由上游漂移门 ⑨ 逐码点全扫(U+0000–U+10FFFF)对拍。
41
+ 三问(这两条一起答)—— **谁需要**:服务端请求腿(与壳的发送前预检)。它们此前各留一份自家的传输读器与两只描述器,因为本包的读法比请求腿松;读法同严之后切到 import,请求面没有第二份判官。
42
+ **谁受伤**:① 直接调读器、把 `Map` / `Set` / 类实例当 `env` 或 `headers` 递进来的调用方 —— 此前本包放行(服务端请求腿已拒),现在整张不交并记 `lost`,受理新提交的门据它 400,两层同拒;
43
+ ② 带自有 `__proto__` 成员的 JSON 体 —— 现在 `lost` 点名它、副本里没有它;③ 读坏名 / 坏内容出处回显的运维 —— 换行不再显示成 `\n`、双向字符不再原样出现、名的回显从 32 字变 64 字、引号内不再转义。
44
+ **补偿**:把 `Map` / 类实例展开成纯对象再递(`Object.fromEntries(map)` / `{ ...instance }`);删掉 JSON 体里的 `__proto__` 键;分流用 `lost` 的 `path` / `member` / `fault`,不解析句子。
45
+ 钉:`test/mcp-request-entry-14.0.0.test.ts` ⑧(`Map` / `Set` / 类实例 / 原型上的记录 / `Date` · 非对象值 · 非串成员 · 自有 `__proto__` 成员与值也坏的并列 · 副本 · 隐藏成员与访问器 · 成员名回显清洗 · `lost` 读序 · 正控 · `isStringRecord` 与读器同答)·
46
+ ⑨(C0 / DEL / 12 个双向码点逐个剥,两只描述器各验 · C1 与 U+2028 / U+2029 不剥 · 先剥后数 · 64 字界 · 引号形 · 空白种类词与清洗同在)· `test/upstream-drift.test.ts` ⑨(回显清洗类对引擎 `BIDI_CONTROL_CHARS` 逐码点全扫,两只描述器各扫一遍 + 门有牙)。
47
+ - **下游(表态制:认领 + 排期 / 显式拒绝 + 理由 / 申请裁定)**:
48
+ **server**:申报名判官已读本包,抬到本版随之收严,零代码改动;请求腿的传输读器(`env` / `headers` 半场)与两只回显描述器的读法与服务端 7.132.0 同严,可整个换成 import、删自家三份
49
+ (描述器切过来时空白名多一个种类词);A2A 对端 `headers` 的记录读法(自家的 `plain-string-record.ts`)仍在服务端,本包不导出记录读器。
50
+ **cli**:可直接 import(14.0.0 起);读它即与服务端受理同答,本版无导出变化。**client-core**:对 14.0.0 档里「经包转出判官要加运行期依赖,请选」的答 = 选**构建期抄本**、不加运行期依赖;抄本的对拍钉请对本版
51
+ `isUsableWireName` 的真值表(首尾空白 = `trim` 那一组 ⇒ 坏名,内部空白合法,界 128);读器与描述器若也抄,请跟本版的读法(纯数据记录、回显口径)。**sdk**:零引用。
52
+
53
+ ## 14.0.0 — 2026-10-17 — major:prompts 域单轴(中心 artifact v3 的结构镜像;声明轴与 v1 catalog 轴退役,一次性迁移 SS-M10)· 请求面 MCP 条目判官入包
54
+
55
+ > 档位:**major**。两件事,一条律各一句:
56
+ > **prompts 域只装一种东西 —— 引擎当期 schema 的中心 artifact**:存储存它的身份,每条下发腿只发 `{ schemaVersion: 2, artifact }`,「哪个场景用哪段」只在
57
+ > artifact 里 `when.binding` 一处表达,哪一份给哪台 worker 只有 `promptArtifactFor` 一只读法;本包只镜像 artifact 的**结构与上界**,语义只有引擎 verify 一个判官。
58
+ > **请求面 MCP 条目的每一格只有一只判官**:此前消费方私有、壳够不着;现在住本包,服务端与壳读同一份(判据与原因句逐字搬,零语义变)。
59
+ > 导出面(`docs/API-SURFACE.md`):主 barrel 638 → 654(删 11 · 加 27),`./types` 147 不变(删 11 · 加 11),`./node` 38 → 36(删 2)。一致性语料 87 例 + baseline 机械重录,差只在物化的
60
+ > `prompts`(`{bindings:[]}` → `{}`);新增 7 例(c77 新形承运 · c78 / c81 / c82 三只单形墓碑:空 `bindings` / 13.x 合法的非空声明轴 / 完整 v1 catalog,放宽任一墓碑都有一例红 ·
61
+ > c79 / c83 坏 artifact 整域缺省、不逐条抢救:删掉整台 worker 的那份 / 只丢 artifact 里的一条坏 overlay,两种错法各一例 · c80 wire v2 原样承运),语料 90 → 97。devDependency 的引擎钉 core 7.53.0(带中心 artifact v3 与 binding 两常量):镜像的结构门与 binding 两常量的
62
+ > 逐值门是全量对拍,没有待到货的格(见下「门」)。
63
+
64
+ ### BREAKING 清单(逐条三问 + 下游动作)
65
+
66
+ **B1 · prompts 声明轴与 v1 catalog 轴的型面删除**(零别名、零过渡):`PROMPT_SLOTS` / `PromptSlot` / `PromptTextDeclaration` / `PromptBinding` / `EffectivePrompts` /
67
+ `PromptPackId` / `PROMPT_PACK_ID_PREFIX` / `PromptArtifactSection` / `PromptCatalogSnapshot` / `PromptEpochArtifactPayload` / `PublishedPromptArtifactEnvelope`;
68
+ `./node` 的 `promptsContentDigest` / `sectionContentHash`(整个模块)。`PROMPT_ARTIFACT_LIMITS` 换成引擎当期的七键(`maxOverlays 64 · maxOverlayTextBytes 32000 ·
69
+ maxTotalTextBytes 131072 · maxIntentChars 2000 · maxRefs 32 · maxRefChars 500 · maxSourceRevisionChars 500`),旧五键删。
70
+ **谁需要**:两轴是同一件事的两种表达,消费方各留一只判官(服务端手写的 prompts 判官与本包的 wire 形答同一问)—— 一个事实两个读者;引擎当期只读 v3 artifact。
71
+ **谁受伤**:import 上述任一名字的消费方 tsc 红(web-admin 的卡编译器 / 解析器 / 编辑器、服务端的 slot 表);读 `PROMPT_ARTIFACT_LIMITS` 旧键的(web-admin `checkPromptLimits`)。
72
+ **补偿**:新形见 B2 / B3;卡 → overlay 的编译归中心编辑器(角色卡 = `append core/role.base`,守则 = `add behavior`,场景说明 = `add scenario` 带 `when.binding.anyOf`)。
73
+ **下游**:web-admin 发布腿只出 v3(用引擎 `buildPromptArtifact` 在服务端铸);服务端判官收成「本包 wire 形 → 引擎 verify」一线。
74
+
75
+ **B2 · `PromptsConfig` 存储形 v2 = `{ artifact?, workers? }`**(`artifact` / `workers.<名>` 各是一份 artifact 的身份 `{ payload, artifactDigest }`,键闭合、不带
76
+ `sourceRevision` —— 发布出处由服务席在下发时盖);`bindings` / `catalog` 两键成**墓碑**:在场(哪怕空数组)即拒,拒句
77
+ `prompts.bindings was retired in 14.0.0 — now the center artifact (prompts.artifact for every worker, prompts.workers.<name> for one worker); data stored before 14.0.0: run the one-time migration SS-M10 (…)`。
78
+ 读侧:带墓碑键的文档让 prompts 域整体读不出 ⇒ 缺省 `{}` + `domain-defaulted` 点名 SS-M10 ⇒ 不下发中心层(引擎内置提示词)。物化默认值 `{bindings:[]}` → `{}`。
79
+ `DOMAIN_ENTRY_SALVAGE.prompts`:`salvage` → `none` —— artifact 受 digest 约束,抢救掉一条 overlay 得到的是 digest 不再成立的 artifact(引擎拒的是它所在的整份候选),
80
+ 抢救掉一台 worker 的那份则是悄悄换成 scope 那份的文本(替换,不是收窄);读档仍 `default`。
81
+ **谁需要**:存储 = 本地 `config.d` = 下发,一种形;「发布即物化」在 v3 的意思是保存时由引擎 builder 铸好身份,引擎升级不让同一份存储换 digest。
82
+ **谁受伤**:web-admin 店里 / 本地 `config.d` 里带 `bindings` / `catalog` 的文档(SS-M10 处理,见下);按 13.x 形读 `PromptsConfig` 的消费方(tsc 红)。
83
+ **补偿**:SS-M10 删掉占绝大多数的空 `bindings: []`;非空的经中心编辑器重新发布(意图行在 web-admin)。**下游**:web-admin 跑 SS-M10 + 用卡意图重编;本地运维删掉从未生效的 `bindings`。
84
+
85
+ **B3 · `EffectivePromptsWire` 下发形 v2 = `{ schemaVersion: 2, artifact }`**(键闭合;`artifact` = `PublishedPromptArtifact`)。13.x 的 `{schemaVersion: 1, declarations?, catalog?}`
86
+ 被拒,拒句 `prompts wire schemaVersion: this contract carries {schemaVersion: 2, artifact} only — the declarations / catalog axes were retired in settings-schema 14.0.0; the center serves its center artifact (upgrade the center)`。
87
+ 每条腿(按 worker 的 / 不带 worker 的 / 个人面)只发这一形;闸关 / 没发布 / 选不出 artifact ⇒ 整个 `prompts` 键不出现。读腿 `readEffectiveWire` 照旧按在场性原样承运、不解析。
88
+ **谁需要**:服务端与 web-admin 对 wire 只有一只判官(本形,再交引擎 verify)。**谁受伤**:`EffectivePromptsWire.safeParse` 的入参是 `unknown` —— 仍发 v1 的发布方**不会 tsc 红**,
89
+ 运行期恒败(web-admin 个人面 `safeParse` 那一处:静默不带 prompts 键;服务端:整份候选被拒);不带 worker 的全局拉取若照旧发**存储原文**、不看发布闸,闸关时草稿会被采纳。
90
+ **补偿 / 要求**:发布方三条腿一律「闸开发 v2 形、闸关不带键」;W(web-admin)→ S(服务端)同一维护窗部署,窗内新旧两端互拒整份候选、停在上一份好配置。
91
+
92
+ **B4 · artifact v3 结构镜像(新导出,形与引擎当期 schema 逐键对齐)**:`PromptArtifact`(存储:身份)/ `PublishedPromptArtifact`(下发:身份 + `sourceRevision`)/
93
+ `PromptArtifactPayload`(`schemaVersion` 只收 3;非 3 拒句点名改写:`… rebuild the artifact with the engine's buildPromptArtifact (an overlay's "scope": {"binding": b} becomes "when": {"binding": {"anyOf": [b]}})`)/
94
+ `PromptOverlay`(键闭集 `id / op / target / text / message / when`,没有 `scope`)/ `PromptOverlayWhen`(`traits / host / facts / binding`)/ `PromptBindingCondition`
95
+ (**恰一张表**:`{anyOf}` 或 `{noneOf}`,1–64 个互不重名、非空白、≤ 128 字的 binding)/ `PromptArtifactRequires` / `PromptArtifactEvidence` / `PROMPT_BINDING_MAX_CHARS`(128)/
96
+ `PROMPT_BINDING_LIST_MAX`(64)。引擎词表(op / band / target / trait / fact / host 词 / target kind)**不镜像** —— 传输门宽、语义门准:引擎收的,本包必收。
97
+ 字符界(binding 名 128 / `evidence.intent` 2000 / 每条 ref 500 / `sourceRevision` 500)按 Unicode 码点量,与引擎同一把尺;镜像自带这把尺、不依赖 zod 的 `.max()`
98
+ (zod 4.4.x 的 `.max()` 量 UTF-16 码元、4.5.0 起量码点,而本包声明的区间含 4.4.x —— 用 `.max()` 则非 BMP 字符在 4.4.x 宿主上被镜像拒、引擎却收)。
99
+ 引擎的两句拒句(语义判官的原句,本包不复述):v2 artifact ⇒ `unsupported schemaVersion 2 (this engine reads schemaVersion 3 only; republish under schemaVersion 3 — an overlay's "scope": { "binding": b } becomes "when": { "binding": { "anyOf": [b] } })`;
100
+ 同一目标两条可同真的 `replace` ⇒ `overlays "<p>" and "<q>" both replace "<target>" under one condition that can hold in the same run (write exclusive binding conditions: "noneOf": [x] beside "anyOf": [x])`。
101
+ **下游**:服务端判官 `EffectivePromptsWire.safeParse` → 引擎 `verifyPromptArtifact`;web-admin 出门前的 seam 校验同一份 zod。
102
+
103
+ ### 新导出
104
+
105
+ - `promptArtifactFor(prompts, worker | null)` —— **唯一的选择读法**:worker 有自己的那份 ⇒ 它(整份取代,不叠加);否则 scope 那份;都没有 ⇒ `undefined`。`null` = 没有 worker
106
+ 身份的读者(本地腿、不带 worker 的全局拉取、个人面),恒读 scope 那份;只读自有键。
107
+ - 请求面 MCP 条目判官(`src/mcp-request-entry.ts`,主 barrel):`isUsableWireName` / `describeBadWireName` / `TOOL_WIRE_NAME_MAX_CHARS`(引擎镜像,128)·
108
+ `isContentOriginWord` / `describeBadContentOrigin` · `readMcpIdentityHeaders`(两个身份头:字符串才收,`principalHeader` 胜)· `readRequestMcpTransport`
109
+ (硬坏形 `ok:false` 点名键路径;软坏形读器丢键并记进 `lost`)与它的型 `RequestMcpTransport` / `RequestMcpTransportRead` / `McpEntryKeyIssue` ·
110
+ 值种类描述 `describeValueShape` / `describeNotStringArray` / `describeNotStringRecord` / `isStringArray` / `isStringRecord`。判据与原因句逐字等于消费方请求腿的
111
+ 上一版(同一批夹具同一批期望;导出的五只另以两万余次随机调用对拍原件、零差,传输读器与种类描述件逐行对照原件函数体)。url 的前缀守卫进 `src/url-shape.ts`(`startsWithHttpScheme`):本包判 URL 的正则只在那一个模块;
112
+ 它与形判官 `httpUrlFlaws` 对同一个值可以答得不同(空 host / 带 userinfo 的 url 前缀判收、形判官拒)—— 语义入包时冻结,两份判据收一是已知待收项。
113
+ **谁需要**:壳的发送前预检(今天只能披露「判不准、交服务端」);**谁受伤**:无(服务端行为零变化,删的是副本);**补偿**:无需。
114
+ `mcp.servers[].toolFaces` 的形读器归引擎包根,本包不镜像工具面五张词表;引擎 7.53.0 的包根还没有这只读器(包内零命中),导出名随引擎定、本包不写 ——
115
+ 服务端 / 壳在引擎导出它的那一版 import、删各自私有的那份。
116
+
117
+ ### 一次性迁移 SS-M10(登记表 `ONE_TIME_MIGRATIONS`;步序在 SS-M9 之后)
118
+
119
+ 只认形:空的 `bindings: []` 删掉(`dropped-inert`,它从不下发任何内容);非空 / 非数组的 `bindings` 与 `catalog` 一律 `refused`、原样留着(原因句:声明只有中心的卡编译器编得成
120
+ overlay —— 从 web-admin 编辑器重新发布,本地 `config.d` 的副本引擎从未读过、删键即可;catalog 的 digest 是引擎铸的 —— 重新发布或用引擎 builder 重铸)。重跑恒等;冻结 effective
121
+ (发布快照、回滚整份快照、引擎 last-known-good)走同一组步。窗 = 发布日 + 30 天(发布日 2026-10-17 → 窗关 2026-11-16),删码在窗关之后的下一个 major;墓碑永久。迁移不铸 digest(本包零引擎运行期依赖,
122
+ 在迁移里铸 = 第二个铸点)。
123
+
124
+ ### 门
125
+
126
+ - 上游漂移门:devDependency core 7.47.0 → 7.53.0。② `ModelRole` 三行登记成陈旧豁免、删(零差;7.53.0 复核同)。⑤ 七键逐键同;binding 两常量逐值同(128 / 64,引擎 7.53.0 起包根导出)。
127
+ ⑦(新)artifact 结构镜像:发布形 / payload / requires / targets / evidence / overlay / `when` / binding 条件的键集与引擎双向相等、`schemaVersion` 字面量同为 3、
128
+ 引擎发布形整份可赋给本包的型(编译期);引擎 builder 铸的 artifact(不带 / 带 `when.binding` 两组)本包原样收且不改写任何键;overlay id 长界与 binding 名 /
129
+ `evidence.intent` / ref / `sourceRevision` 字符界(引擎按码点量)界上收、界 + 1 拒的行为探针;引擎两句拒句(v2 artifact · 同目标两条可同真 replace)逐字等于上文 B4 所引;
130
+ 外加一格**发布前提门**:`package.json` 到 14.x 而 devDependency 的引擎 builder 仍铸 v2 ⇒ 红(挡住「配 v2 引擎发 v3 镜像」)。⑧(新)`TOOL_WIRE_NAME_MAX_CHARS` 逐值;
131
+ 请求面传输形与引擎传输形值型双向可赋值 + 两种传输的键集相等。
132
+ - 钉:`test/prompts-domain-14.0.0.test.ts`(存储 v2 / 墓碑 / wire v2 / v3 结构与上界 / `promptArtifactFor` 三态 / salvage none / 本地腿)·
133
+ `test/one-time-migration-ss-m10-14.0.0.test.ts`(四形 + 幂等 + 冻结 effective)· `test/mcp-request-entry-14.0.0.test.ts`(判官逐例)。
134
+
135
+ ### 下游(表态制:认领 + 排期 / 显式拒绝 + 理由 / 申请裁定)
136
+
137
+ - **server**:prompts 判官收成「`EffectivePromptsWire` → 引擎 verify」;本地腿以 `promptArtifactFor(·, null)` 读 `config.d`(今天以 cast 读 `.catalog`,不会 tsc 红,不改即静默丢本地
138
+ prompts);边界归一的存储形臂退役;场景写进 `TaskSpec.promptBinding`;三只判官改 import 本包、删副本。
139
+ - **web-admin**:发布腿只出 v3;不带 worker 的全局拉取改「闸开发 wire 形、闸关不带」;个人面同;跑 SS-M10 + 卡意图重编;`checkPromptLimits` 改读七键。
140
+ - **cli**:请求面判官可直接 import(壳预检 = 服务端受理同答)。**client-core**:本包对它是 devDependency,经包转出判官要加运行期依赖,请选。**sdk**:零引用。
141
+ - **test**:黑盒判据(旧 wire 拒 / v2 artifact 拒 / 新形采纳 / 场景三格 / 同目标冲突拒 / 旧存储三形 / 判官两侧同答 / 闸关不漏草稿 / 本地无 worker 身份)随发布帖给。
142
+
9
143
  ## 13.0.1 — 2026-10-16 — patch:`classifyHooksConfig` 对「未知字段里藏守卫迹象」的拒绝项补 `field`(点名藏迹象的那个键)· 随包文字引用的 `docs/` 与 `llms.txt` / `llms-full.txt` 进 tarball
10
144
 
11
145
  - **行为修复(拒绝项 `field`)**。13.0.0 写了「条目 / 匹配器的坏块另带坏字段名 `field`」,而实码只对「契约字段值写错」一形给了 `field`;「本会被剥掉的未知字段里藏着守卫迹象 ⇒ 拒」这一形
package/README.md CHANGED
@@ -47,6 +47,19 @@ 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
+ ## 升级指引:13.x → 14.0.0(BREAKING:prompts 域单轴 = 中心 artifact;请求面 MCP 条目判官入包)
51
+
52
+ - **prompts**:域里只装引擎当期 schema 的中心 artifact。存储 `PromptsConfig = { artifact?, workers? }`(每份是 artifact 的身份 `{ payload, artifactDigest }`);
53
+ 下发 `EffectivePromptsWire = { schemaVersion: 2, artifact }`(`artifact` 带发布出处 `sourceRevision`,由服务席盖);哪一份给哪台 worker 只问
54
+ `promptArtifactFor(prompts, worker | null)`;场景差异只写在 overlay 的 `when.binding`(`{anyOf}` 或 `{noneOf}`,恰一张表)。本包只判结构与上界,语义交引擎 verify。
55
+ 声明轴(`PromptBinding` / `PromptTextDeclaration` / `EffectivePrompts` …)与 v1 catalog 信封删除,零别名;`bindings` / `catalog` 键是墓碑。
56
+ - **存量**:一次性迁移 SS-M10 删掉空的 `bindings: []`;非空 `bindings` 与 `catalog` 被拒、原样留着 —— 从中心编辑器重新发布(本地 `config.d` 的 `bindings`
57
+ 引擎从未读过,删键即可)。
58
+ - **请求面 MCP 条目**:`isUsableWireName` / `readRequestMcpTransport` / `readMcpIdentityHeaders` / `isContentOriginWord` 住本包(判据与原因句与服务端请求腿逐字同),
59
+ 壳的发送前预检与服务端受理同答。申报名判官 `isUsableWireName` 另判首尾空白(坏名;不 trim、不规范化,内部空白照旧合法);`readRequestMcpTransport` 的 `env` / `headers`
60
+ 只收纯数据的「名 → 串」记录(`Map` / `Set` / 类实例 / 自有 `__proto__` 成员不收,交出的是副本,`lost` 条目带 `member` / `fault` 机读位);两只回显描述器剥控制与双向字符、截 64 字,与服务端回显同口径。
61
+ - **部署序**:中心(发布方)与服务端同一维护窗升级,中心先;窗内新旧两端互拒整份候选、停在上一份好配置。细节与逐条三问见 CHANGELOG 14.0.0。
62
+
50
63
  ## 升级指引:10.x → 11.0.0 · 持久面:一次性迁移(`./one-time-migrations`)
51
64
 
52
65
  11.0.0 把读路径上为旧数据留的兼容臂全部收掉:旧形只有一种去处 —— **一次性迁移**把它改写成新形(你写回),读写两面遇旧形**响亮拒**,
@@ -179,7 +192,8 @@ therefore shows only `zod`. Node built-ins only (`node:crypto`, `node:fs`).
179
192
  ## What's in it
180
193
 
181
194
  - **The zod contract** (`types.ts`): `DOMAIN_SCHEMAS` (16 domains — 0.10.0 adds `projects`, the project
182
- identity ledger; 0.10.18 adds `prompts`; 0.19.0 adds `limits`, the cost/rate-limit publication slot; 11.0.0 retires
195
+ identity ledger; 0.10.18 adds `prompts` — since 14.0.0 a single axis, the center artifact (`PromptsConfig` / `EffectivePromptsWire` /
196
+ `promptArtifactFor`); 0.19.0 adds `limits`, the cost/rate-limit publication slot; 11.0.0 retires
183
197
  `runtime` — its tombstone is `RETIRED_DOMAINS`, see "One-time migrations" below),
184
198
  `EffectiveConfig`, `EffectiveWire`,
185
199
  `ENV_NAME`/`K8S_QUANTITY` boundaries, every domain's entry/config type.
@@ -448,6 +462,10 @@ therefore shows only `zod`. Node built-ins only (`node:crypto`, `node:fs`).
448
462
  - **MCP server list verdict** (`mcp-server-policy.ts`, 13.0.0): `mcpServerPolicyVerdict` → `McpPolicyBlock{name, list, rule, target,
449
463
  written, sources}` — judged on the expanded target, echoed only as written; the managed layer (whose `allowManagedMcpServersOnly` counts)
450
464
  is the source whose tier in `SETTINGS_SOURCE_CONTRACT` is `managed`.
465
+ - **Request-plane MCP entry judges** (`mcp-request-entry.ts`, 14.0.0): `isUsableWireName` / `describeBadWireName` (the engine's wire-name bound
466
+ `TOOL_WIRE_NAME_MAX_CHARS`, mirrored; a name with leading or trailing whitespace is a bad name too — never trimmed, never normalised; inner whitespace stays legal), `isContentOriginWord` / `describeBadContentOrigin`, `readMcpIdentityHeaders`, `readRequestMcpTransport`
467
+ (hard faults `ok:false` naming the key path; soft faults dropped by the reader and listed in `lost`; `env` / `headers` are read as plain-data string records — a `Map`, a class instance or an own `__proto__` member is not one, the delivered record is a copy, and a `lost` entry for a record carries machine-readable `member` / `fault`; the two describers strip control and bidi characters and cut at 64 characters, the service's echo form) and the value-shape describers — one reading for
468
+ the service's request legs and the shell's pre-send check. A `toolFaces` declaration stays parse-transparent here: its shape is the engine ingest side's to judge, and none of the tool-face vocabularies is mirrored in this package.
451
469
  - **UI language** (`ui-language.ts`, 13.0.0): `semaUiLanguage` (`en` / `zh`, category `ui`, user settings) + `readUiLanguage`.
452
470
  - **Cross-session settings** (`cross-session.ts`): the two `settings.json` keys `crossSessionInbound`
453
471
  (wake/next-turn/hold/refuse — the core 7.30.0 vocabulary, `accept` retired in 6.0.0; `default` = unset) and `dialogExpiry` (60s/5m/10m/never), each with a reader that
@@ -1 +1 @@
1
- 13.0.1
1
+ 14.1.0
@@ -36,9 +36,7 @@
36
36
  "projects": {
37
37
  "projects": {}
38
38
  },
39
- "prompts": {
40
- "bindings": []
41
- },
39
+ "prompts": {},
42
40
  "rosters": {
43
41
  "rosters": []
44
42
  },
@@ -50,9 +50,7 @@
50
50
  "projects": {
51
51
  "projects": {}
52
52
  },
53
- "prompts": {
54
- "bindings": []
55
- },
53
+ "prompts": {},
56
54
  "rosters": {
57
55
  "rosters": []
58
56
  },
@@ -47,9 +47,7 @@
47
47
  "projects": {
48
48
  "projects": {}
49
49
  },
50
- "prompts": {
51
- "bindings": []
52
- },
50
+ "prompts": {},
53
51
  "rosters": {
54
52
  "rosters": []
55
53
  },
@@ -60,9 +60,7 @@
60
60
  "projects": {
61
61
  "projects": {}
62
62
  },
63
- "prompts": {
64
- "bindings": []
65
- },
63
+ "prompts": {},
66
64
  "rosters": {
67
65
  "rosters": []
68
66
  },
@@ -39,9 +39,7 @@
39
39
  "projects": {
40
40
  "projects": {}
41
41
  },
42
- "prompts": {
43
- "bindings": []
44
- },
42
+ "prompts": {},
45
43
  "rosters": {
46
44
  "rosters": []
47
45
  },
@@ -39,9 +39,7 @@
39
39
  "projects": {
40
40
  "projects": {}
41
41
  },
42
- "prompts": {
43
- "bindings": []
44
- },
42
+ "prompts": {},
45
43
  "rosters": {
46
44
  "rosters": []
47
45
  },
@@ -104,9 +104,7 @@
104
104
  "projects": {
105
105
  "projects": {}
106
106
  },
107
- "prompts": {
108
- "bindings": []
109
- },
107
+ "prompts": {},
110
108
  "rosters": {
111
109
  "rosters": []
112
110
  },
@@ -105,9 +105,7 @@
105
105
  "projects": {
106
106
  "projects": {}
107
107
  },
108
- "prompts": {
109
- "bindings": []
110
- },
108
+ "prompts": {},
111
109
  "rosters": {
112
110
  "rosters": []
113
111
  },
@@ -54,9 +54,7 @@
54
54
  "projects": {
55
55
  "projects": {}
56
56
  },
57
- "prompts": {
58
- "bindings": []
59
- },
57
+ "prompts": {},
60
58
  "rosters": {
61
59
  "rosters": []
62
60
  },
@@ -39,9 +39,7 @@
39
39
  "projects": {
40
40
  "projects": {}
41
41
  },
42
- "prompts": {
43
- "bindings": []
44
- },
42
+ "prompts": {},
45
43
  "rosters": {
46
44
  "rosters": []
47
45
  },
@@ -39,9 +39,7 @@
39
39
  "projects": {
40
40
  "projects": {}
41
41
  },
42
- "prompts": {
43
- "bindings": []
44
- },
42
+ "prompts": {},
45
43
  "rosters": {
46
44
  "rosters": []
47
45
  },
@@ -39,9 +39,7 @@
39
39
  "projects": {
40
40
  "projects": {}
41
41
  },
42
- "prompts": {
43
- "bindings": []
44
- },
42
+ "prompts": {},
45
43
  "rosters": {
46
44
  "rosters": []
47
45
  },
@@ -39,9 +39,7 @@
39
39
  "projects": {
40
40
  "projects": {}
41
41
  },
42
- "prompts": {
43
- "bindings": []
44
- },
42
+ "prompts": {},
45
43
  "rosters": {
46
44
  "rosters": []
47
45
  },
@@ -39,9 +39,7 @@
39
39
  "projects": {
40
40
  "projects": {}
41
41
  },
42
- "prompts": {
43
- "bindings": []
44
- },
42
+ "prompts": {},
45
43
  "rosters": {
46
44
  "rosters": []
47
45
  },
@@ -39,9 +39,7 @@
39
39
  "projects": {
40
40
  "projects": {}
41
41
  },
42
- "prompts": {
43
- "bindings": []
44
- },
42
+ "prompts": {},
45
43
  "rosters": {
46
44
  "rosters": []
47
45
  },
@@ -39,9 +39,7 @@
39
39
  "projects": {
40
40
  "projects": {}
41
41
  },
42
- "prompts": {
43
- "bindings": []
44
- },
42
+ "prompts": {},
45
43
  "rosters": {
46
44
  "rosters": []
47
45
  },
@@ -39,9 +39,7 @@
39
39
  "projects": {
40
40
  "projects": {}
41
41
  },
42
- "prompts": {
43
- "bindings": []
44
- },
42
+ "prompts": {},
45
43
  "rosters": {
46
44
  "rosters": []
47
45
  },
@@ -39,9 +39,7 @@
39
39
  "projects": {
40
40
  "projects": {}
41
41
  },
42
- "prompts": {
43
- "bindings": []
44
- },
42
+ "prompts": {},
45
43
  "rosters": {
46
44
  "rosters": []
47
45
  },
@@ -39,9 +39,7 @@
39
39
  "projects": {
40
40
  "projects": {}
41
41
  },
42
- "prompts": {
43
- "bindings": []
44
- },
42
+ "prompts": {},
45
43
  "rosters": {
46
44
  "rosters": []
47
45
  },
@@ -60,9 +60,7 @@
60
60
  "projects": {
61
61
  "projects": {}
62
62
  },
63
- "prompts": {
64
- "bindings": []
65
- },
63
+ "prompts": {},
66
64
  "rosters": {
67
65
  "rosters": []
68
66
  },
@@ -50,9 +50,7 @@
50
50
  "projects": {
51
51
  "projects": {}
52
52
  },
53
- "prompts": {
54
- "bindings": []
55
- },
53
+ "prompts": {},
56
54
  "rosters": {
57
55
  "rosters": []
58
56
  },
@@ -54,9 +54,7 @@
54
54
  "projects": {
55
55
  "projects": {}
56
56
  },
57
- "prompts": {
58
- "bindings": []
59
- },
57
+ "prompts": {},
60
58
  "rosters": {
61
59
  "rosters": []
62
60
  },
@@ -7208,9 +7208,7 @@
7208
7208
  "projects": {
7209
7209
  "projects": {}
7210
7210
  },
7211
- "prompts": {
7212
- "bindings": []
7213
- },
7211
+ "prompts": {},
7214
7212
  "rosters": {
7215
7213
  "rosters": []
7216
7214
  },
@@ -39,9 +39,7 @@
39
39
  "projects": {
40
40
  "projects": {}
41
41
  },
42
- "prompts": {
43
- "bindings": []
44
- },
42
+ "prompts": {},
45
43
  "rosters": {
46
44
  "rosters": []
47
45
  },
@@ -39,9 +39,7 @@
39
39
  "projects": {
40
40
  "projects": {}
41
41
  },
42
- "prompts": {
43
- "bindings": []
44
- },
42
+ "prompts": {},
45
43
  "rosters": {
46
44
  "rosters": []
47
45
  },
@@ -39,9 +39,7 @@
39
39
  "projects": {
40
40
  "projects": {}
41
41
  },
42
- "prompts": {
43
- "bindings": []
44
- },
42
+ "prompts": {},
45
43
  "rosters": {
46
44
  "rosters": []
47
45
  },
@@ -50,9 +50,7 @@
50
50
  "projects": {
51
51
  "projects": {}
52
52
  },
53
- "prompts": {
54
- "bindings": []
55
- },
53
+ "prompts": {},
56
54
  "rosters": {
57
55
  "rosters": []
58
56
  },
@@ -50,9 +50,7 @@
50
50
  "projects": {
51
51
  "projects": {}
52
52
  },
53
- "prompts": {
54
- "bindings": []
55
- },
53
+ "prompts": {},
56
54
  "rosters": {
57
55
  "rosters": []
58
56
  },
@@ -50,9 +50,7 @@
50
50
  "projects": {
51
51
  "projects": {}
52
52
  },
53
- "prompts": {
54
- "bindings": []
55
- },
53
+ "prompts": {},
56
54
  "rosters": {
57
55
  "rosters": []
58
56
  },
@@ -44,9 +44,7 @@
44
44
  "projects": {
45
45
  "projects": {}
46
46
  },
47
- "prompts": {
48
- "bindings": []
49
- },
47
+ "prompts": {},
50
48
  "rosters": {
51
49
  "rosters": []
52
50
  },
@@ -39,9 +39,7 @@
39
39
  "projects": {
40
40
  "projects": {}
41
41
  },
42
- "prompts": {
43
- "bindings": []
44
- },
42
+ "prompts": {},
45
43
  "rosters": {
46
44
  "rosters": []
47
45
  },
@@ -39,9 +39,7 @@
39
39
  "projects": {
40
40
  "projects": {}
41
41
  },
42
- "prompts": {
43
- "bindings": []
44
- },
42
+ "prompts": {},
45
43
  "rosters": {
46
44
  "rosters": []
47
45
  },
@@ -39,9 +39,7 @@
39
39
  "projects": {
40
40
  "projects": {}
41
41
  },
42
- "prompts": {
43
- "bindings": []
44
- },
42
+ "prompts": {},
45
43
  "rosters": {
46
44
  "rosters": []
47
45
  },
@@ -39,9 +39,7 @@
39
39
  "projects": {
40
40
  "projects": {}
41
41
  },
42
- "prompts": {
43
- "bindings": []
44
- },
42
+ "prompts": {},
45
43
  "rosters": {
46
44
  "rosters": []
47
45
  },
@@ -39,9 +39,7 @@
39
39
  "projects": {
40
40
  "projects": {}
41
41
  },
42
- "prompts": {
43
- "bindings": []
44
- },
42
+ "prompts": {},
45
43
  "rosters": {
46
44
  "rosters": []
47
45
  },