pi-outpost 0.9.1 → 0.10.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 (106) hide show
  1. package/dist/contract/README.md +34 -0
  2. package/dist/contract/conformance/index.json +18 -0
  3. package/dist/contract/conformance/invalid/table-row-object-column-mismatch.json +18 -0
  4. package/dist/contract/conformance/invalid/table-row-unknown-role.json +17 -0
  5. package/dist/contract/conformance/invalid/table-row-without-cells.json +14 -0
  6. package/dist/contract/conformance/valid/table-rows-partly-roled.json +29 -0
  7. package/dist/contract/conformance/valid/table-rows-with-roles.json +45 -0
  8. package/dist/contract/schemas/structured-exchange-1.json +38 -11
  9. package/dist/contract/validate-structured-exchange.mjs +45 -14
  10. package/dist/pi-outpost.mjs +125 -93
  11. package/dist/pi-outpost.sea.mjs +125 -93
  12. package/dist/sea-prep.blob +0 -0
  13. package/dist/skills/structured-exchange/SKILL.md +28 -1
  14. package/dist/skills/structured-exchange/structured-exchange-1.json +38 -11
  15. package/dist/web/assets/{PdfViewer-DLZN8MPh.js → PdfViewer-DL928k-s.js} +2 -2
  16. package/dist/web/assets/{abnfDiagram-N423BO3Z-D8cHpBgq.js → abnfDiagram-N423BO3Z-DbxX-0Kj.js} +1 -1
  17. package/dist/web/assets/architecture-TIHT7OUA-CxgGNTsk.js +1 -0
  18. package/dist/web/assets/{architectureDiagram-T3A2C74G-DtsZcpid.js → architectureDiagram-T3A2C74G-BMX346um.js} +1 -1
  19. package/dist/web/assets/{blockDiagram-VBNYF7ZC-DG-Vee2I.js → blockDiagram-VBNYF7ZC-ChV86tmC.js} +1 -1
  20. package/dist/web/assets/browser-BoWduoKG.js +19 -0
  21. package/dist/web/assets/{c4Diagram-5PPSVZJV-Cge6rtb_.js → c4Diagram-5PPSVZJV-C-zTSE0y.js} +1 -1
  22. package/dist/web/assets/channel-D-LTlrLf.js +1 -0
  23. package/dist/web/assets/{chunk-2GRJ4B5K-ky7RxMVL.js → chunk-2GRJ4B5K-W04su_X7.js} +1 -1
  24. package/dist/web/assets/{chunk-3NCLNEKW-CkyESs3z.js → chunk-3NCLNEKW-DY4xKOXA.js} +1 -1
  25. package/dist/web/assets/{chunk-4I5QYGJK-CYlPMYIs.js → chunk-4I5QYGJK-DXYX0vFa.js} +1 -1
  26. package/dist/web/assets/{chunk-5RXB4S5H-BVOdrmAn.js → chunk-5RXB4S5H-Du7kbrqX.js} +1 -1
  27. package/dist/web/assets/{chunk-6Q2QTUOP-9AakjZbi.js → chunk-6Q2QTUOP-BfJd7VYB.js} +1 -1
  28. package/dist/web/assets/{chunk-7Z6QIM7H-C7bVXCbI.js → chunk-7Z6QIM7H-BY1Y6LJS.js} +1 -1
  29. package/dist/web/assets/{chunk-GF5L2VYU-DZPA6KQK.js → chunk-GF5L2VYU-CsEEcYjl.js} +1 -1
  30. package/dist/web/assets/{chunk-I66GZJ75-VSO4Repf.js → chunk-I66GZJ75-DPBfauyP.js} +3 -3
  31. package/dist/web/assets/{chunk-J7OUQ5F2-D8dEppC4.js → chunk-J7OUQ5F2-CdpH0vwJ.js} +2 -2
  32. package/dist/web/assets/{chunk-JQJVKLGR-_IJrkM-o.js → chunk-JQJVKLGR-CdyovfRR.js} +1 -1
  33. package/dist/web/assets/{chunk-KBJHAD2P-Bo-QJ3Aq.js → chunk-KBJHAD2P-DmmiNkBn.js} +1 -1
  34. package/dist/web/assets/{chunk-NSK5VX7P-CE77LZ3f.js → chunk-NSK5VX7P-BQQH6IYd.js} +1 -1
  35. package/dist/web/assets/{chunk-QR6OTTB3-_WMniCw7.js → chunk-QR6OTTB3-DWTPlePZ.js} +1 -1
  36. package/dist/web/assets/{chunk-UBXNYLIW-Bo4ZY-E5.js → chunk-UBXNYLIW-CXboJ2bm.js} +1 -1
  37. package/dist/web/assets/{chunk-W5SLKNZC-DE2NR4g3.js → chunk-W5SLKNZC-CaOM1dXh.js} +1 -1
  38. package/dist/web/assets/{chunk-WRU74C26-vZRte2zw.js → chunk-WRU74C26-DRizKOyu.js} +1 -1
  39. package/dist/web/assets/classDiagram-JCYQIIEL-DHVDyqvh.js +1 -0
  40. package/dist/web/assets/classDiagram-v2-OCEON4UE-DHVDyqvh.js +1 -0
  41. package/dist/web/assets/{cynefin-VYW2F7L2-CVQrkebh.js → cynefin-VYW2F7L2-CD-nMJrn.js} +1 -1
  42. package/dist/web/assets/{cynefinDiagram-MW4NZA55-BJEVaxY2.js → cynefinDiagram-MW4NZA55-Ig6qnUj1.js} +1 -1
  43. package/dist/web/assets/{dagre-VZM6K2ZE-Cg4yzfsn.js → dagre-VZM6K2ZE-CxSxgcwX.js} +1 -1
  44. package/dist/web/assets/{diagram-7IWD3JNH-Bzhc3XNc.js → diagram-7IWD3JNH-CB2xc-gJ.js} +1 -1
  45. package/dist/web/assets/{diagram-B4RE2ZJO-cOBYJrqu.js → diagram-B4RE2ZJO-5cmS8UzR.js} +1 -1
  46. package/dist/web/assets/{diagram-LBJQPF4R-DezvCa9m.js → diagram-LBJQPF4R-B80eqvld.js} +1 -1
  47. package/dist/web/assets/{diagram-Q27KOJAE-C8JzJOPz.js → diagram-Q27KOJAE-DHwyKZTY.js} +1 -1
  48. package/dist/web/assets/{diagram-UB23O5K3-DcVfocW3.js → diagram-UB23O5K3-dDfTtdVR.js} +1 -1
  49. package/dist/web/assets/{ebnfDiagram-BXEA7PRR-1x68Vwg9.js → ebnfDiagram-BXEA7PRR-BycgjimL.js} +1 -1
  50. package/dist/web/assets/{erDiagram-JOGREHBK-BQcP40bV.js → erDiagram-JOGREHBK-BeCSU7rz.js} +1 -1
  51. package/dist/web/assets/eventmodeling-45OFAUF4-neKvK6DT.js +1 -0
  52. package/dist/web/assets/flowDiagram-UKHOOZJN-CAZkXvN7.js +1 -0
  53. package/dist/web/assets/{ganttDiagram-PKOTCBZU-mtDAHz0-.js → ganttDiagram-PKOTCBZU-Bazy8cgV.js} +1 -1
  54. package/dist/web/assets/{gitGraph-TEB2WS4Q-FM2NyYE9.js → gitGraph-TEB2WS4Q-DcGskfJN.js} +1 -1
  55. package/dist/web/assets/{gitGraphDiagram-DS77QQ5N-BDfffmo3.js → gitGraphDiagram-DS77QQ5N-Z6jvA444.js} +1 -1
  56. package/dist/web/assets/{index-BiD5GZid.js → index-B-cfhDrI.js} +13 -12
  57. package/dist/web/assets/index-Dz7YkDhP.css +2 -0
  58. package/dist/web/assets/{info-DKCQHKI2-B23QY2Bc.js → info-DKCQHKI2-DJ49CwmK.js} +1 -1
  59. package/dist/web/assets/{infoDiagram-6WML65LV-_bzukZq-.js → infoDiagram-6WML65LV-YqZl8Nm2.js} +1 -1
  60. package/dist/web/assets/{ishikawaDiagram-WSZJBQD7-BgAcJxsO.js → ishikawaDiagram-WSZJBQD7-iBNItVc-.js} +1 -1
  61. package/dist/web/assets/{journeyDiagram-NVQOT4AX-DTnE9xwZ.js → journeyDiagram-NVQOT4AX-EwTx3T1Q.js} +1 -1
  62. package/dist/web/assets/{kanban-definition-27J2QSJJ-ClbSvAIG.js → kanban-definition-27J2QSJJ-DtdE2AjM.js} +1 -1
  63. package/dist/web/assets/{line-D_QU9Cmq.js → line-Cbqxb04I.js} +1 -1
  64. package/dist/web/assets/{mermaid-parser.core-BYcme6-K.js → mermaid-parser.core-rv6CQBy8.js} +3 -3
  65. package/dist/web/assets/{mermaid.core-BVGHn3kY.js → mermaid.core-DXHLsEfO.js} +3 -3
  66. package/dist/web/assets/{mindmap-definition-FAOFIHXS-CvEfGwYt.js → mindmap-definition-FAOFIHXS-CaiyLb0a.js} +1 -1
  67. package/dist/web/assets/{packet-7NZHBO7P-C9jELtlO.js → packet-7NZHBO7P-ByIsiWdp.js} +1 -1
  68. package/dist/web/assets/{pdf-DAk1L9of.js → pdf-BmZiCqYN.js} +1 -1
  69. package/dist/web/assets/{pegDiagram-VL7TDLO6-CghIs6yt.js → pegDiagram-VL7TDLO6-B-6_sex6.js} +1 -1
  70. package/dist/web/assets/{pie-RZYD4A2V-BrSou7Yh.js → pie-RZYD4A2V-BD8R7sOm.js} +1 -1
  71. package/dist/web/assets/{pieDiagram-7S7Q4E2Y-B5wcGLdh.js → pieDiagram-7S7Q4E2Y-C-a2vyAv.js} +1 -1
  72. package/dist/web/assets/{quadrantDiagram-CIZ2JOQS-qgPFvNxk.js → quadrantDiagram-CIZ2JOQS-DNnBJnEd.js} +1 -1
  73. package/dist/web/assets/{radar-I7S5WNFK-SP4m6cq2.js → radar-I7S5WNFK-kEFklpqR.js} +1 -1
  74. package/dist/web/assets/{railroad-3IZDKUUU-BsjoOneH.js → railroad-3IZDKUUU-DVRWY3AC.js} +1 -1
  75. package/dist/web/assets/railroad-abnf-AHOZXSZD-BjQiPTbu.js +1 -0
  76. package/dist/web/assets/railroad-ebnf-EBAXGLYW-iJlInGQn.js +1 -0
  77. package/dist/web/assets/railroad-peg-LSFZ7HO6-DbABHd8A.js +1 -0
  78. package/dist/web/assets/{railroadDiagram-AXF67PYL-t6xnVIcM.js → railroadDiagram-AXF67PYL-DBXx-64f.js} +1 -1
  79. package/dist/web/assets/{requirementDiagram-LRYGKXZP-CZkV6LhH.js → requirementDiagram-LRYGKXZP-FKSCWatA.js} +1 -1
  80. package/dist/web/assets/{sankeyDiagram-W5VNT64P-BpQAGTND.js → sankeyDiagram-W5VNT64P-BIsqrSkd.js} +1 -1
  81. package/dist/web/assets/{sequenceDiagram-SI44F4Z6-C12jxyG4.js → sequenceDiagram-SI44F4Z6-O_YBlsgm.js} +1 -1
  82. package/dist/web/assets/{stateDiagram-OKZ733FA-BPjwRBUN.js → stateDiagram-OKZ733FA-CQpPvMSw.js} +1 -1
  83. package/dist/web/assets/stateDiagram-v2-UEYNNEHI-BD_nJJ8M.js +1 -0
  84. package/dist/web/assets/{swimlanes-SLNWSIFB-CDJ8S0lB.js → swimlanes-SLNWSIFB-DVWLKMSf.js} +1 -1
  85. package/dist/web/assets/swimlanesDiagram-ULZ7WXOC-B9QwBXcD.js +8 -0
  86. package/dist/web/assets/{timeline-definition-Z64GVDOM-DxPzKILG.js → timeline-definition-Z64GVDOM-D08L6QQ6.js} +1 -1
  87. package/dist/web/assets/{treeView-QDETBFTQ-DAYvqyNi.js → treeView-QDETBFTQ-DmuKTQhG.js} +1 -1
  88. package/dist/web/assets/{treemap-6X3UGDF4-CnqRm2UE.js → treemap-6X3UGDF4-CFwpXcZR.js} +1 -1
  89. package/dist/web/assets/{vennDiagram-T6HMQDX7-CJlSyyPD.js → vennDiagram-T6HMQDX7-Df5-OwXn.js} +1 -1
  90. package/dist/web/assets/{wardley-OPB4EBWU-BLz9JeoC.js → wardley-OPB4EBWU-e2h7ylSU.js} +1 -1
  91. package/dist/web/assets/{wardleyDiagram-T6FBY63Y-Dq_bL4Vh.js → wardleyDiagram-T6FBY63Y-pZ4HlA6p.js} +1 -1
  92. package/dist/web/assets/{xychartDiagram-ELKLHX3M-Ckxi00vc.js → xychartDiagram-ELKLHX3M-Byk049lP.js} +1 -1
  93. package/dist/web/index.html +2 -2
  94. package/package.json +1 -1
  95. package/dist/web/assets/architecture-TIHT7OUA-Bbye2zvN.js +0 -1
  96. package/dist/web/assets/channel-DlNfTXiL.js +0 -1
  97. package/dist/web/assets/classDiagram-JCYQIIEL-C2FqsfZm.js +0 -1
  98. package/dist/web/assets/classDiagram-v2-OCEON4UE-C2FqsfZm.js +0 -1
  99. package/dist/web/assets/eventmodeling-45OFAUF4-BDJFYTu6.js +0 -1
  100. package/dist/web/assets/flowDiagram-UKHOOZJN-KC9e-3Cq.js +0 -1
  101. package/dist/web/assets/index-CZwzQTfU.css +0 -2
  102. package/dist/web/assets/railroad-abnf-AHOZXSZD-BVDgGfHK.js +0 -1
  103. package/dist/web/assets/railroad-ebnf-EBAXGLYW-Bb8EnDyP.js +0 -1
  104. package/dist/web/assets/railroad-peg-LSFZ7HO6-CwFMC2lj.js +0 -1
  105. package/dist/web/assets/stateDiagram-v2-UEYNNEHI-DcBcxdoV.js +0 -1
  106. package/dist/web/assets/swimlanesDiagram-ULZ7WXOC-DaR8FwWp.js +0 -8
@@ -129,6 +129,40 @@ and an explicit white ground, so what lands in the document is what was on scree
129
129
  earlier version drew them as HTML inside `foreignObject`, which looks identical in the
130
130
  browser and loses everything the moment it is serialized.
131
131
 
132
+ ## A table that reports a change
133
+
134
+ A table cannot be proposed — it has no identity per row for a patch to join against,
135
+ and an envelope declaring a table with a `target` or a `removal` is refused. It can
136
+ still report on a change it projects. Any row may declare what it plays:
137
+
138
+ ```json
139
+ "rows": [
140
+ { "role": "added", "cells": ["REQ-5", "Log every actuation.", "draft"] },
141
+ { "role": "changed", "cells": ["REQ-2", "Signal a fault within 200 ms.", "in review"] },
142
+ { "role": "removed", "cells": ["REQ-3", "Read battery voltage at 10 Hz.", "withdrawn"] },
143
+ { "cells": ["REQ-1", "Stop within 40 m.", "approved"] }
144
+ ]
145
+ ```
146
+
147
+ `role` is `added`, `changed`, `context` or `removed`, and it is rendered with the
148
+ colours a graph uses for the same words. A row that declares none reads as context
149
+ among rows that do. Both row forms are accepted for the life of version 1, so
150
+ `["REQ-1", "…"]` and `{ "cells": ["REQ-1", "…"] }` are the same row and a table that
151
+ declares no role anywhere renders exactly as it did before roles existed.
152
+
153
+ Declare the role rather than encoding it in a column. A `status` column of your own
154
+ vocabulary is data, and is rendered as data — nothing infers a role from a cell.
155
+
156
+ A reader can switch a role off from the key, which narrows the table to the rows that
157
+ remain, and can take the table away with **download CSV** or **download XLSX**. Where
158
+ rows declare roles, both exports carry a `change` column, because the colour that
159
+ states the role in the rendering does not survive the crossing. A narrowed table
160
+ exports only what it shows, and the controls say so.
161
+
162
+ Old consumers: a copy of the widget published before roles existed validates against
163
+ its own committed schema, so a role-carrying table is refused there and the tool
164
+ result falls back to raw output. It degrades; it does not break.
165
+
132
166
  ## If you are not building in this repository
133
167
 
134
168
  You do not need our command-line interface, and you do not need this repository. The
@@ -50,6 +50,12 @@
50
50
  },
51
51
  {
52
52
  "file": "valid/graph-containers-at-the-ceiling.json"
53
+ },
54
+ {
55
+ "file": "valid/table-rows-with-roles.json"
56
+ },
57
+ {
58
+ "file": "valid/table-rows-partly-roled.json"
53
59
  }
54
60
  ],
55
61
  "invalid": [
@@ -160,6 +166,18 @@
160
166
  {
161
167
  "file": "invalid/containers-over-the-ceiling.json",
162
168
  "expectedRule": "schema/maxItems"
169
+ },
170
+ {
171
+ "file": "invalid/table-row-unknown-role.json",
172
+ "expectedRule": "schema/enum"
173
+ },
174
+ {
175
+ "file": "invalid/table-row-without-cells.json",
176
+ "expectedRule": "schema/required"
177
+ },
178
+ {
179
+ "file": "invalid/table-row-object-column-mismatch.json",
180
+ "expectedRule": "row-column-mismatch"
163
181
  }
164
182
  ]
165
183
  }
@@ -0,0 +1,18 @@
1
+ {
2
+ "schema": "urn:structured-exchange:1",
3
+ "kind": "table",
4
+ "data": {
5
+ "columns": [
6
+ "id",
7
+ "requirement"
8
+ ],
9
+ "rows": [
10
+ {
11
+ "role": "added",
12
+ "cells": [
13
+ "only-one"
14
+ ]
15
+ }
16
+ ]
17
+ }
18
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "schema": "urn:structured-exchange:1",
3
+ "kind": "table",
4
+ "data": {
5
+ "columns": [
6
+ "id"
7
+ ],
8
+ "rows": [
9
+ {
10
+ "role": "deleted",
11
+ "cells": [
12
+ "REQ-001"
13
+ ]
14
+ }
15
+ ]
16
+ }
17
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "schema": "urn:structured-exchange:1",
3
+ "kind": "table",
4
+ "data": {
5
+ "columns": [
6
+ "id"
7
+ ],
8
+ "rows": [
9
+ {
10
+ "role": "added"
11
+ }
12
+ ]
13
+ }
14
+ }
@@ -0,0 +1,29 @@
1
+ {
2
+ "schema": "urn:structured-exchange:1",
3
+ "kind": "table",
4
+ "data": {
5
+ "columns": [
6
+ "id",
7
+ "requirement"
8
+ ],
9
+ "rows": [
10
+ {
11
+ "role": "added",
12
+ "cells": [
13
+ "REQ-005",
14
+ "A new one."
15
+ ]
16
+ },
17
+ {
18
+ "cells": [
19
+ "REQ-001",
20
+ "A row that declares no role."
21
+ ]
22
+ },
23
+ [
24
+ "REQ-002",
25
+ "A row still written as a bare array."
26
+ ]
27
+ ]
28
+ }
29
+ }
@@ -0,0 +1,45 @@
1
+ {
2
+ "schema": "urn:structured-exchange:1",
3
+ "kind": "table",
4
+ "data": {
5
+ "columns": [
6
+ "id",
7
+ "requirement",
8
+ "status"
9
+ ],
10
+ "rows": [
11
+ {
12
+ "role": "added",
13
+ "cells": [
14
+ "REQ-005",
15
+ "The system shall log every actuation.",
16
+ "draft"
17
+ ]
18
+ },
19
+ {
20
+ "role": "changed",
21
+ "cells": [
22
+ "REQ-002",
23
+ "The dashboard shall signal a fault within 200 ms.",
24
+ "in review"
25
+ ]
26
+ },
27
+ {
28
+ "role": "context",
29
+ "cells": [
30
+ "REQ-001",
31
+ "The braking system shall stop the vehicle.",
32
+ "approved"
33
+ ]
34
+ },
35
+ {
36
+ "role": "removed",
37
+ "cells": [
38
+ "REQ-003",
39
+ "The ECU shall read battery voltage at 10 Hz.",
40
+ "withdrawn"
41
+ ]
42
+ }
43
+ ]
44
+ }
45
+ }
@@ -236,6 +236,19 @@
236
236
  "$ref": "#/$defs/label"
237
237
  }
238
238
  }
239
+ },
240
+ "cells": {
241
+ "type": "array",
242
+ "items": {
243
+ "type": [
244
+ "string",
245
+ "number",
246
+ "boolean",
247
+ "null"
248
+ ],
249
+ "maxLength": 1000
250
+ },
251
+ "maxItems": 50
239
252
  }
240
253
  },
241
254
  "properties": {
@@ -347,17 +360,31 @@
347
360
  "type": "array",
348
361
  "maxItems": 5000,
349
362
  "items": {
350
- "type": "array",
351
- "items": {
352
- "type": [
353
- "string",
354
- "number",
355
- "boolean",
356
- "null"
357
- ],
358
- "maxLength": 1000
359
- },
360
- "maxItems": 50
363
+ "oneOf": [
364
+ {
365
+ "$ref": "#/$defs/cells"
366
+ },
367
+ {
368
+ "type": "object",
369
+ "additionalProperties": false,
370
+ "required": [
371
+ "cells"
372
+ ],
373
+ "properties": {
374
+ "cells": {
375
+ "$ref": "#/$defs/cells"
376
+ },
377
+ "role": {
378
+ "enum": [
379
+ "added",
380
+ "changed",
381
+ "context",
382
+ "removed"
383
+ ]
384
+ }
385
+ }
386
+ }
387
+ ]
361
388
  }
362
389
  }
363
390
  }
@@ -10,6 +10,9 @@ import { readFileSync } from "node:fs";
10
10
 
11
11
  // shared/src/structuredExchange.ts
12
12
  var PROPOSABLE_KINDS = ["graph", "sequence"];
13
+ function readTableRow(row) {
14
+ return Array.isArray(row) ? { cells: row } : { cells: row.cells, role: row.role };
15
+ }
13
16
  var STRUCTURED_EXCHANGE_CEILINGS = {
14
17
  nodes: 500,
15
18
  edges: 2e3,
@@ -282,12 +285,13 @@ function validateStructuredExchangeSemantics(envelope) {
282
285
  if (envelope.kind === "table") {
283
286
  const { columns, rows } = envelope.data;
284
287
  rows.forEach((row, index3) => {
285
- if (row.length !== columns.length) {
288
+ const { cells } = readTableRow(row);
289
+ if (cells.length !== columns.length) {
286
290
  issues.push({
287
291
  rule: "row-column-mismatch",
288
292
  path: `/data/rows/${index3}`,
289
- message: `row has ${row.length} values but ${columns.length} columns are declared`,
290
- observed: row.length,
293
+ message: `row has ${cells.length} values but ${columns.length} columns are declared`,
294
+ observed: cells.length,
291
295
  limit: columns.length
292
296
  });
293
297
  }
@@ -8442,6 +8446,19 @@ var structured_exchange_1_default = {
8442
8446
  $ref: "#/$defs/label"
8443
8447
  }
8444
8448
  }
8449
+ },
8450
+ cells: {
8451
+ type: "array",
8452
+ items: {
8453
+ type: [
8454
+ "string",
8455
+ "number",
8456
+ "boolean",
8457
+ "null"
8458
+ ],
8459
+ maxLength: 1e3
8460
+ },
8461
+ maxItems: 50
8445
8462
  }
8446
8463
  },
8447
8464
  properties: {
@@ -8553,17 +8570,31 @@ var structured_exchange_1_default = {
8553
8570
  type: "array",
8554
8571
  maxItems: 5e3,
8555
8572
  items: {
8556
- type: "array",
8557
- items: {
8558
- type: [
8559
- "string",
8560
- "number",
8561
- "boolean",
8562
- "null"
8563
- ],
8564
- maxLength: 1e3
8565
- },
8566
- maxItems: 50
8573
+ oneOf: [
8574
+ {
8575
+ $ref: "#/$defs/cells"
8576
+ },
8577
+ {
8578
+ type: "object",
8579
+ additionalProperties: false,
8580
+ required: [
8581
+ "cells"
8582
+ ],
8583
+ properties: {
8584
+ cells: {
8585
+ $ref: "#/$defs/cells"
8586
+ },
8587
+ role: {
8588
+ enum: [
8589
+ "added",
8590
+ "changed",
8591
+ "context",
8592
+ "removed"
8593
+ ]
8594
+ }
8595
+ }
8596
+ }
8597
+ ]
8567
8598
  }
8568
8599
  }
8569
8600
  }