@sdd-method/sdd-cli 1.0.1 → 1.2.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/dist/lib/catalogue/aggregate.d.ts.map +1 -1
- package/dist/lib/catalogue/aggregate.js +116 -8
- package/dist/lib/catalogue/aggregate.js.map +1 -1
- package/dist/lib/catalogue/build.d.ts.map +1 -1
- package/dist/lib/catalogue/build.js +2 -6
- package/dist/lib/catalogue/build.js.map +1 -1
- package/dist/lib/catalogue/builders/capability-spec.d.ts +9 -3
- package/dist/lib/catalogue/builders/capability-spec.d.ts.map +1 -1
- package/dist/lib/catalogue/builders/capability-spec.js +9 -3
- package/dist/lib/catalogue/builders/capability-spec.js.map +1 -1
- package/dist/lib/catalogue/builders/external-system-exemption.d.ts.map +1 -1
- package/dist/lib/catalogue/builders/external-system-exemption.js +32 -3
- package/dist/lib/catalogue/builders/external-system-exemption.js.map +1 -1
- package/dist/lib/catalogue/builders/product-edges.d.ts.map +1 -1
- package/dist/lib/catalogue/builders/product-edges.js +9 -0
- package/dist/lib/catalogue/builders/product-edges.js.map +1 -1
- package/dist/lib/catalogue/builders/product-platform-dependencies.d.ts +12 -0
- package/dist/lib/catalogue/builders/product-platform-dependencies.d.ts.map +1 -1
- package/dist/lib/catalogue/builders/product-platform-dependencies.js +99 -0
- package/dist/lib/catalogue/builders/product-platform-dependencies.js.map +1 -1
- package/dist/lib/catalogue/canonical-schema.yaml +64 -11
- package/dist/lib/catalogue/contract-path-resolution.d.ts +55 -0
- package/dist/lib/catalogue/contract-path-resolution.d.ts.map +1 -0
- package/dist/lib/catalogue/contract-path-resolution.js +149 -0
- package/dist/lib/catalogue/contract-path-resolution.js.map +1 -0
- package/dist/lib/catalogue/coverage-predicates.d.ts +176 -0
- package/dist/lib/catalogue/coverage-predicates.d.ts.map +1 -0
- package/dist/lib/catalogue/coverage-predicates.js +603 -0
- package/dist/lib/catalogue/coverage-predicates.js.map +1 -0
- package/dist/lib/catalogue/coverage-render.d.ts +39 -0
- package/dist/lib/catalogue/coverage-render.d.ts.map +1 -0
- package/dist/lib/catalogue/coverage-render.js +347 -0
- package/dist/lib/catalogue/coverage-render.js.map +1 -0
- package/dist/lib/catalogue/coverage-run.d.ts +33 -0
- package/dist/lib/catalogue/coverage-run.d.ts.map +1 -0
- package/dist/lib/catalogue/coverage-run.js +91 -0
- package/dist/lib/catalogue/coverage-run.js.map +1 -0
- package/dist/lib/catalogue/ddl-generator.d.ts +80 -0
- package/dist/lib/catalogue/ddl-generator.d.ts.map +1 -0
- package/dist/lib/catalogue/ddl-generator.js +215 -0
- package/dist/lib/catalogue/ddl-generator.js.map +1 -0
- package/dist/lib/catalogue/engine-validator.d.ts +103 -0
- package/dist/lib/catalogue/engine-validator.d.ts.map +1 -0
- package/dist/lib/catalogue/engine-validator.js +221 -0
- package/dist/lib/catalogue/engine-validator.js.map +1 -0
- package/dist/lib/catalogue/enum-validator.d.ts.map +1 -1
- package/dist/lib/catalogue/enum-validator.js +15 -0
- package/dist/lib/catalogue/enum-validator.js.map +1 -1
- package/dist/lib/catalogue/fk-validator.d.ts +6 -0
- package/dist/lib/catalogue/fk-validator.d.ts.map +1 -1
- package/dist/lib/catalogue/fk-validator.js +6 -0
- package/dist/lib/catalogue/fk-validator.js.map +1 -1
- package/dist/lib/catalogue/gate-checks.d.ts +117 -0
- package/dist/lib/catalogue/gate-checks.d.ts.map +1 -0
- package/dist/lib/catalogue/gate-checks.js +261 -0
- package/dist/lib/catalogue/gate-checks.js.map +1 -0
- package/dist/lib/catalogue/parity-harness.d.ts +48 -0
- package/dist/lib/catalogue/parity-harness.d.ts.map +1 -0
- package/dist/lib/catalogue/parity-harness.js +76 -0
- package/dist/lib/catalogue/parity-harness.js.map +1 -0
- package/dist/lib/catalogue/schema-compat.d.ts +3 -3
- package/dist/lib/catalogue/schema-compat.js +3 -3
- package/dist/lib/catalogue/validate.d.ts.map +1 -1
- package/dist/lib/catalogue/validate.js +6 -11
- package/dist/lib/catalogue/validate.js.map +1 -1
- package/dist/lib/sync/apply.d.ts +29 -1
- package/dist/lib/sync/apply.d.ts.map +1 -1
- package/dist/lib/sync/apply.js +77 -2
- package/dist/lib/sync/apply.js.map +1 -1
- package/dist/lib/sync/index.d.ts.map +1 -1
- package/dist/lib/sync/index.js +23 -1
- package/dist/lib/sync/index.js.map +1 -1
- package/dist/lib/sync/settings-merge.d.ts +29 -0
- package/dist/lib/sync/settings-merge.d.ts.map +1 -1
- package/dist/lib/sync/settings-merge.js +31 -0
- package/dist/lib/sync/settings-merge.js.map +1 -1
- package/dist/lib/validate/dispatch.d.ts.map +1 -1
- package/dist/lib/validate/dispatch.js +19 -17
- package/dist/lib/validate/dispatch.js.map +1 -1
- package/dist/lib/validate/index.d.ts.map +1 -1
- package/dist/lib/validate/index.js +23 -4
- package/dist/lib/validate/index.js.map +1 -1
- package/dist/verbs/catalogue.d.ts.map +1 -1
- package/dist/verbs/catalogue.js +24 -0
- package/dist/verbs/catalogue.js.map +1 -1
- package/dist/verbs/conformance.d.ts.map +1 -1
- package/dist/verbs/conformance.js +3 -2
- package/dist/verbs/conformance.js.map +1 -1
- package/dist/verbs/contracts.d.ts.map +1 -1
- package/dist/verbs/contracts.js +3 -2
- package/dist/verbs/contracts.js.map +1 -1
- package/dist/verbs/generate-briefing.d.ts.map +1 -1
- package/dist/verbs/generate-briefing.js +2 -1
- package/dist/verbs/generate-briefing.js.map +1 -1
- package/dist/verbs/init.d.ts.map +1 -1
- package/dist/verbs/init.js +3 -2
- package/dist/verbs/init.js.map +1 -1
- package/dist/verbs/pack.d.ts.map +1 -1
- package/dist/verbs/pack.js +2 -1
- package/dist/verbs/pack.js.map +1 -1
- package/dist/verbs/path-option.d.ts +22 -0
- package/dist/verbs/path-option.d.ts.map +1 -0
- package/dist/verbs/path-option.js +25 -0
- package/dist/verbs/path-option.js.map +1 -0
- package/dist/verbs/plan.d.ts.map +1 -1
- package/dist/verbs/plan.js +2 -1
- package/dist/verbs/plan.js.map +1 -1
- package/dist/verbs/scaffold.d.ts.map +1 -1
- package/dist/verbs/scaffold.js +2 -1
- package/dist/verbs/scaffold.js.map +1 -1
- package/dist/verbs/sync.d.ts.map +1 -1
- package/dist/verbs/sync.js +2 -1
- package/dist/verbs/sync.js.map +1 -1
- package/dist/verbs/validate.d.ts.map +1 -1
- package/dist/verbs/validate.js +3 -2
- package/dist/verbs/validate.js.map +1 -1
- package/package.json +3 -2
- package/scripts/validate-app-dependencies.sh +378 -58
|
@@ -0,0 +1,603 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Coverage predicates as SQL — M-ADR 0205 §4.4 (engine-evolution Phase A3).
|
|
3
|
+
*
|
|
4
|
+
* Declarative re-expressions of the participation-constraint predicates —
|
|
5
|
+
* the four catalogue-classics:
|
|
6
|
+
*
|
|
7
|
+
* - repo_capability (M-ADR 0188): every catalogued repository resolves
|
|
8
|
+
* to a capability or declares an exemption; orphans classified by
|
|
9
|
+
* whether the capability_service ⋈ services.primary_repo_id derivation
|
|
10
|
+
* COULD have fired (shape a / claimed-but-unresolved / shape b).
|
|
11
|
+
* - service_capability (M-ADR 0133 §4.2b): every catalogued service is
|
|
12
|
+
* claimed or exempt; tier is explicit and asymmetric per M-ADR 0196
|
|
13
|
+
* §4.3 (`orphaned` is aggregate-only; member tier reports
|
|
14
|
+
* `unresolved-locally`, cause-agnostic); the Path-X leverage axis is
|
|
15
|
+
* reported separately and only when repo_capability.csv exists.
|
|
16
|
+
* - event_coverage (WS3): every catalogued event is attributed to a
|
|
17
|
+
* runtime — service_event edge or resolving publisher column — with
|
|
18
|
+
* the contract-twin alternative route, the column-vs-edge disagreement
|
|
19
|
+
* controls, and the chain-readout/consumer-enumerability metric lines
|
|
20
|
+
* that are never verdicts.
|
|
21
|
+
* - contract_coverage (WS2): every catalogued contract is reachable —
|
|
22
|
+
* capability_contract or service_contract — with the three computed
|
|
23
|
+
* exclusions (deprecated / provider-surface / not-an-interface, the
|
|
24
|
+
* last a positive READ of the spec file), the covered-as-event
|
|
25
|
+
* alternative route, and the M-ADR 0202 availability-manifest info
|
|
26
|
+
* surface. File and YAML ingestion stay host-side; set logic is SQL.
|
|
27
|
+
*
|
|
28
|
+
* The shell scripts in sdd-method's orchestration/scripts/ remain the
|
|
29
|
+
* REFERENCE implementations until A4 cutover: any semantic change lands
|
|
30
|
+
* there first and here second, and the dual-run driver compares the two
|
|
31
|
+
* as structured findings — (kind, subject, classification, leverage) plus
|
|
32
|
+
* every metric integer — never as prose.
|
|
33
|
+
*
|
|
34
|
+
* The relations live in SQL; the classification branching mirrors the
|
|
35
|
+
* reference implementations statement-for-statement, including their
|
|
36
|
+
* duplicate-row semantics (a duplicated id is counted and reported per
|
|
37
|
+
* ROW, never deduplicated away).
|
|
38
|
+
*/
|
|
39
|
+
import { readFileSync, existsSync } from "node:fs";
|
|
40
|
+
import { join } from "node:path";
|
|
41
|
+
import { parse as parseYaml } from "yaml";
|
|
42
|
+
const REPO_FLAGS_SQL = `
|
|
43
|
+
SELECT
|
|
44
|
+
r."id" AS repo_id,
|
|
45
|
+
EXISTS (SELECT 1 FROM "repo_capability" c
|
|
46
|
+
WHERE c."repo_id" = r."id") AS has_cap,
|
|
47
|
+
EXISTS (SELECT 1 FROM "repo_capability_exemption" e
|
|
48
|
+
WHERE e."repo_id" = r."id") AS has_exempt,
|
|
49
|
+
EXISTS (SELECT 1 FROM "services" s
|
|
50
|
+
WHERE s."primary_repo_id" = r."id"
|
|
51
|
+
AND s."id" IS NOT NULL AND s."id" <> '') AS has_svc,
|
|
52
|
+
EXISTS (SELECT 1 FROM "services" s
|
|
53
|
+
WHERE s."primary_repo_id" = r."id"
|
|
54
|
+
AND s."id" IS NOT NULL AND s."id" <> ''
|
|
55
|
+
AND NOT EXISTS (SELECT 1 FROM "capability_service" cs
|
|
56
|
+
WHERE cs."service_id" = s."id")) AS has_unclaimed_svc,
|
|
57
|
+
(SELECT e2."reason" FROM "repo_capability_exemption" e2
|
|
58
|
+
WHERE e2."repo_id" = r."id"
|
|
59
|
+
AND e2.rowid = (SELECT MAX(e3.rowid) FROM "repo_capability_exemption" e3
|
|
60
|
+
WHERE e3."repo_id" = r."id")) AS exempt_reason,
|
|
61
|
+
(SELECT string_agg(s."id", chr(31) ORDER BY s."id") FROM "services" s
|
|
62
|
+
WHERE s."primary_repo_id" = r."id"
|
|
63
|
+
AND s."id" IS NOT NULL AND s."id" <> ''
|
|
64
|
+
AND NOT EXISTS (SELECT 1 FROM "capability_service" cs
|
|
65
|
+
WHERE cs."service_id" = s."id")) AS unclaimed_ids
|
|
66
|
+
FROM "repositories" r
|
|
67
|
+
WHERE r."id" IS NOT NULL AND r."id" <> ''
|
|
68
|
+
ORDER BY repo_id;`;
|
|
69
|
+
export async function runRepoCapabilityCoverage(session) {
|
|
70
|
+
const reader = await session.conn.runAndReadAll(REPO_FLAGS_SQL);
|
|
71
|
+
const rows = reader.getRows().map((r) => ({
|
|
72
|
+
repoId: String(r[0]),
|
|
73
|
+
hasCap: r[1] === true,
|
|
74
|
+
hasExempt: r[2] === true,
|
|
75
|
+
hasSvc: r[3] === true,
|
|
76
|
+
hasUnclaimedSvc: r[4] === true,
|
|
77
|
+
exemptReason: r[5] === null || r[5] === undefined ? "" : String(r[5]),
|
|
78
|
+
unclaimedIds: r[6] === null || r[6] === undefined
|
|
79
|
+
? []
|
|
80
|
+
: String(r[6]).split("\x1f"),
|
|
81
|
+
}));
|
|
82
|
+
const findings = [];
|
|
83
|
+
let byCapability = 0;
|
|
84
|
+
let byExemption = 0;
|
|
85
|
+
let conflicting = 0;
|
|
86
|
+
let unresolved = 0;
|
|
87
|
+
let shapeA = 0;
|
|
88
|
+
let shapeB = 0;
|
|
89
|
+
for (const row of rows) {
|
|
90
|
+
if (row.hasCap && row.hasExempt) {
|
|
91
|
+
conflicting++;
|
|
92
|
+
findings.push({
|
|
93
|
+
predicate: "repo_capability",
|
|
94
|
+
kind: "divergence",
|
|
95
|
+
subjectId: row.repoId,
|
|
96
|
+
classification: "conflict",
|
|
97
|
+
exemptionReason: row.exemptReason,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
else if (row.hasCap) {
|
|
101
|
+
byCapability++;
|
|
102
|
+
}
|
|
103
|
+
else if (row.hasExempt) {
|
|
104
|
+
byExemption++;
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
unresolved++;
|
|
108
|
+
if (row.hasUnclaimedSvc) {
|
|
109
|
+
shapeA++;
|
|
110
|
+
findings.push({
|
|
111
|
+
predicate: "repo_capability",
|
|
112
|
+
kind: "orphan",
|
|
113
|
+
subjectId: row.repoId,
|
|
114
|
+
classification: "shape_a",
|
|
115
|
+
unclaimedServices: row.unclaimedIds.slice(0, 3),
|
|
116
|
+
unclaimedCount: row.unclaimedIds.length,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
else if (row.hasSvc) {
|
|
120
|
+
findings.push({
|
|
121
|
+
predicate: "repo_capability",
|
|
122
|
+
kind: "orphan",
|
|
123
|
+
subjectId: row.repoId,
|
|
124
|
+
classification: "claimed_unresolved",
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
shapeB++;
|
|
129
|
+
findings.push({
|
|
130
|
+
predicate: "repo_capability",
|
|
131
|
+
kind: "orphan",
|
|
132
|
+
subjectId: row.repoId,
|
|
133
|
+
classification: "shape_b",
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return {
|
|
139
|
+
findings,
|
|
140
|
+
metrics: {
|
|
141
|
+
total: rows.length,
|
|
142
|
+
byCapability,
|
|
143
|
+
byExemption,
|
|
144
|
+
conflicting,
|
|
145
|
+
unresolved,
|
|
146
|
+
shapeA,
|
|
147
|
+
shapeB,
|
|
148
|
+
other: unresolved - shapeA - shapeB,
|
|
149
|
+
},
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
/** Statement-for-statement mirror of the reference classify(). */
|
|
153
|
+
function classify(hasCap, hasExempt) {
|
|
154
|
+
if (hasCap && hasExempt)
|
|
155
|
+
return "conflict";
|
|
156
|
+
if (hasCap)
|
|
157
|
+
return "claimed";
|
|
158
|
+
if (hasExempt)
|
|
159
|
+
return "exempt";
|
|
160
|
+
return "unresolved";
|
|
161
|
+
}
|
|
162
|
+
const SERVICE_FLAGS_SQL = `
|
|
163
|
+
SELECT
|
|
164
|
+
s."id" AS service_id,
|
|
165
|
+
COALESCE(s."primary_repo_id", '') AS primary_repo,
|
|
166
|
+
EXISTS (SELECT 1 FROM "capability_service" cs
|
|
167
|
+
WHERE cs."service_id" = s."id") AS has_cap,
|
|
168
|
+
EXISTS (SELECT 1 FROM "service_capability_exemption" e
|
|
169
|
+
WHERE e."service_id" = s."id") AS has_exempt,
|
|
170
|
+
EXISTS (SELECT 1 FROM "repo_capability" rc
|
|
171
|
+
WHERE rc."repo_id" = s."primary_repo_id"
|
|
172
|
+
AND rc."repo_id" IS NOT NULL AND rc."repo_id" <> '') AS repo_resolves,
|
|
173
|
+
(SELECT e2."reason" FROM "service_capability_exemption" e2
|
|
174
|
+
WHERE e2."service_id" = s."id"
|
|
175
|
+
AND e2.rowid = (SELECT MAX(e3.rowid) FROM "service_capability_exemption" e3
|
|
176
|
+
WHERE e3."service_id" = s."id")) AS exempt_reason
|
|
177
|
+
FROM "services" s
|
|
178
|
+
WHERE s."id" IS NOT NULL AND s."id" <> ''
|
|
179
|
+
ORDER BY service_id, primary_repo;`;
|
|
180
|
+
export async function runServiceCapabilityCoverage(session, options) {
|
|
181
|
+
// Known-bad probe, carried over from the reference implementation
|
|
182
|
+
// (WS11's third requirement): a synthetic claimed service must classify
|
|
183
|
+
// as claimed BEFORE any real data is reported — a run whose
|
|
184
|
+
// classification never executed must not be able to report a healthy
|
|
185
|
+
// estate.
|
|
186
|
+
if (classify(true, false) !== "claimed") {
|
|
187
|
+
throw new Error("coverage-predicates: known-bad probe failed — a synthetic claimed service did not classify as claimed; refusing to report");
|
|
188
|
+
}
|
|
189
|
+
const reader = await session.conn.runAndReadAll(SERVICE_FLAGS_SQL);
|
|
190
|
+
const findings = [];
|
|
191
|
+
let claimed = 0;
|
|
192
|
+
let exempt = 0;
|
|
193
|
+
let conflicting = 0;
|
|
194
|
+
let unresolved = 0;
|
|
195
|
+
let leverageYes = 0;
|
|
196
|
+
let leverageNo = 0;
|
|
197
|
+
let leverageNa = 0;
|
|
198
|
+
let total = 0;
|
|
199
|
+
for (const r of reader.getRows()) {
|
|
200
|
+
total++;
|
|
201
|
+
const serviceId = String(r[0]);
|
|
202
|
+
const primaryRepo = String(r[1] ?? "");
|
|
203
|
+
const verdict = classify(r[2] === true, r[3] === true);
|
|
204
|
+
if (verdict === "conflict") {
|
|
205
|
+
conflicting++;
|
|
206
|
+
findings.push({
|
|
207
|
+
predicate: "service_capability",
|
|
208
|
+
kind: "divergence",
|
|
209
|
+
subjectId: serviceId,
|
|
210
|
+
classification: "conflict",
|
|
211
|
+
exemptionReason: r[5] === null || r[5] === undefined ? "" : String(r[5]),
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
else if (verdict === "claimed") {
|
|
215
|
+
claimed++;
|
|
216
|
+
}
|
|
217
|
+
else if (verdict === "exempt") {
|
|
218
|
+
exempt++;
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
unresolved++;
|
|
222
|
+
let leverage;
|
|
223
|
+
if (options.repoCapabilityAvailable) {
|
|
224
|
+
if (primaryRepo === "") {
|
|
225
|
+
leverageNa++;
|
|
226
|
+
leverage = "na";
|
|
227
|
+
}
|
|
228
|
+
else if (r[4] !== true) {
|
|
229
|
+
leverageYes++;
|
|
230
|
+
leverage = "yes";
|
|
231
|
+
}
|
|
232
|
+
else {
|
|
233
|
+
leverageNo++;
|
|
234
|
+
leverage = "no";
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
findings.push({
|
|
238
|
+
predicate: "service_capability",
|
|
239
|
+
kind: options.tier === "aggregate" ? "orphan" : "coverage",
|
|
240
|
+
subjectId: serviceId,
|
|
241
|
+
classification: options.tier === "aggregate" ? "orphaned" : "unresolved-locally",
|
|
242
|
+
...(leverage !== undefined ? { leverage } : {}),
|
|
243
|
+
primaryRepo,
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
return {
|
|
248
|
+
findings,
|
|
249
|
+
metrics: {
|
|
250
|
+
total,
|
|
251
|
+
claimed,
|
|
252
|
+
exempt,
|
|
253
|
+
conflicting,
|
|
254
|
+
unresolved,
|
|
255
|
+
...(options.repoCapabilityAvailable && unresolved > 0
|
|
256
|
+
? { leverage: { yes: leverageYes, no: leverageNo, na: leverageNa } }
|
|
257
|
+
: {}),
|
|
258
|
+
},
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
/** Statement-for-statement mirror of the reference classify(). */
|
|
262
|
+
function classifyEvent(hasEdge, pub, pubResolves, twinCovered) {
|
|
263
|
+
if (hasEdge)
|
|
264
|
+
return "covered";
|
|
265
|
+
if (pub !== "" && pubResolves)
|
|
266
|
+
return "covered";
|
|
267
|
+
if (twinCovered)
|
|
268
|
+
return "covered-as-contract";
|
|
269
|
+
return "unresolved";
|
|
270
|
+
}
|
|
271
|
+
const EVENT_FLAGS_SQL = `
|
|
272
|
+
WITH ev AS (
|
|
273
|
+
SELECT e."id" AS id,
|
|
274
|
+
TRIM(COALESCE(e."publisher_service_id", '')) AS pub,
|
|
275
|
+
REPLACE(COALESCE(e."schema_path", ''), chr(92), '/') AS sp
|
|
276
|
+
FROM "events" e
|
|
277
|
+
WHERE e."id" IS NOT NULL AND e."id" <> ''
|
|
278
|
+
AND e.rowid = (SELECT MAX(e2.rowid) FROM "events" e2 WHERE e2."id" = e."id")
|
|
279
|
+
),
|
|
280
|
+
covered_twin_bases AS (
|
|
281
|
+
SELECT DISTINCT regexp_extract(REPLACE(c."spec_path", chr(92), '/'), '[^/]*$') AS base
|
|
282
|
+
FROM "contracts" c
|
|
283
|
+
WHERE COALESCE(c."kind", '') = 'event'
|
|
284
|
+
AND COALESCE(c."spec_path", '') <> ''
|
|
285
|
+
AND (EXISTS (SELECT 1 FROM "capability_contract" cc WHERE cc."contract_id" = c."id")
|
|
286
|
+
OR EXISTS (SELECT 1 FROM "service_contract" sc WHERE sc."contract_id" = c."id"))
|
|
287
|
+
)
|
|
288
|
+
SELECT ev.id, ev.pub,
|
|
289
|
+
EXISTS (SELECT 1 FROM "service_event" se WHERE se."event_id" = ev.id) AS has_edge,
|
|
290
|
+
EXISTS (SELECT 1 FROM "service_event" se WHERE se."event_id" = ev.id
|
|
291
|
+
AND COALESCE(se."role", '') IN ('publishes', 'produces')) AS has_pub_edge,
|
|
292
|
+
EXISTS (SELECT 1 FROM "services" s WHERE s."id" = ev.pub) AS pub_resolves,
|
|
293
|
+
(ev.sp <> '' AND EXISTS (SELECT 1 FROM covered_twin_bases b
|
|
294
|
+
WHERE b.base = regexp_extract(ev.sp, '[^/]*$'))) AS twin_covered,
|
|
295
|
+
(ev.pub <> '' AND EXISTS (SELECT 1 FROM "capability_service" cs
|
|
296
|
+
WHERE cs."service_id" = ev.pub)) AS pub_cap_claimed,
|
|
297
|
+
EXISTS (SELECT 1 FROM "service_event" se
|
|
298
|
+
JOIN "capability_service" cs ON cs."service_id" = se."service_id"
|
|
299
|
+
WHERE se."event_id" = ev.id
|
|
300
|
+
AND COALESCE(se."service_id", '') <> '') AS edge_cap_claimed,
|
|
301
|
+
EXISTS (SELECT 1 FROM "service_event" se WHERE se."event_id" = ev.id
|
|
302
|
+
AND COALESCE(se."role", '') = 'consumes') AS has_consume_edge
|
|
303
|
+
FROM ev
|
|
304
|
+
ORDER BY ev.id;`;
|
|
305
|
+
export async function runEventCoverage(session, options) {
|
|
306
|
+
// Classifier probe (M-ADR 0199 §4.6): known-good and known-bad synthetic
|
|
307
|
+
// rows through the real classifier, both directions, before any real data.
|
|
308
|
+
if (classifyEvent(false, "svc", true, false) !== "covered" ||
|
|
309
|
+
classifyEvent(false, "", false, false) !== "unresolved") {
|
|
310
|
+
throw new Error("coverage-predicates: event classifier probe misclassified a synthetic row — no verdict is trustworthy");
|
|
311
|
+
}
|
|
312
|
+
const reader = await session.conn.runAndReadAll(EVENT_FLAGS_SQL);
|
|
313
|
+
const rows = reader.getRows();
|
|
314
|
+
if (rows.length === 0) {
|
|
315
|
+
return { na: true, findings: [] };
|
|
316
|
+
}
|
|
317
|
+
const findings = [];
|
|
318
|
+
const colUnresolving = [];
|
|
319
|
+
const colNoEdge = [];
|
|
320
|
+
const edgeNoCol = [];
|
|
321
|
+
let covered = 0;
|
|
322
|
+
let viaContract = 0;
|
|
323
|
+
let unresolved = 0;
|
|
324
|
+
let capReach = 0;
|
|
325
|
+
let consumerEnum = 0;
|
|
326
|
+
for (const r of rows) {
|
|
327
|
+
const id = String(r[0]);
|
|
328
|
+
const pub = String(r[1] ?? "");
|
|
329
|
+
const hasEdge = r[2] === true;
|
|
330
|
+
const hasPubEdge = r[3] === true;
|
|
331
|
+
const pubResolves = r[4] === true;
|
|
332
|
+
const twinCovered = r[5] === true;
|
|
333
|
+
const pubCapClaimed = r[6] === true;
|
|
334
|
+
const edgeCapClaimed = r[7] === true;
|
|
335
|
+
const hasConsumeEdge = r[8] === true;
|
|
336
|
+
// Column-vs-edge disagreement controls — the two attribution
|
|
337
|
+
// representations checked against each other every run.
|
|
338
|
+
if (pub !== "" && !pubResolves)
|
|
339
|
+
colUnresolving.push({ eventId: id, publisher: pub });
|
|
340
|
+
if (pub !== "" && pubResolves && !hasPubEdge)
|
|
341
|
+
colNoEdge.push(id);
|
|
342
|
+
if (hasPubEdge && pub === "")
|
|
343
|
+
edgeNoCol.push(id);
|
|
344
|
+
if (pubCapClaimed || edgeCapClaimed)
|
|
345
|
+
capReach++;
|
|
346
|
+
if (hasConsumeEdge)
|
|
347
|
+
consumerEnum++;
|
|
348
|
+
const verdict = classifyEvent(hasEdge, pub, pubResolves, twinCovered);
|
|
349
|
+
if (verdict === "covered")
|
|
350
|
+
covered++;
|
|
351
|
+
else if (verdict === "covered-as-contract")
|
|
352
|
+
viaContract++;
|
|
353
|
+
else {
|
|
354
|
+
unresolved++;
|
|
355
|
+
findings.push({
|
|
356
|
+
predicate: "event_coverage",
|
|
357
|
+
kind: options.tier === "aggregate" ? "orphan" : "report",
|
|
358
|
+
subjectId: id,
|
|
359
|
+
classification: options.tier === "aggregate" ? "orphaned" : "unresolved-locally",
|
|
360
|
+
});
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
return {
|
|
364
|
+
na: false,
|
|
365
|
+
findings,
|
|
366
|
+
metrics: {
|
|
367
|
+
total: rows.length,
|
|
368
|
+
covered,
|
|
369
|
+
viaContract,
|
|
370
|
+
unresolved,
|
|
371
|
+
capReach,
|
|
372
|
+
consumerEnum,
|
|
373
|
+
},
|
|
374
|
+
controls: { colUnresolving, colNoEdge, edgeNoCol },
|
|
375
|
+
};
|
|
376
|
+
}
|
|
377
|
+
/** Statement-for-statement mirror of the reference classify(). */
|
|
378
|
+
function classifyContract(reachable, excluded, coveredAsEvent) {
|
|
379
|
+
if (excluded && reachable)
|
|
380
|
+
return "conflict";
|
|
381
|
+
if (reachable)
|
|
382
|
+
return "covered";
|
|
383
|
+
if (coveredAsEvent)
|
|
384
|
+
return "covered-as-event";
|
|
385
|
+
if (excluded)
|
|
386
|
+
return "excluded";
|
|
387
|
+
return "unresolved";
|
|
388
|
+
}
|
|
389
|
+
/**
|
|
390
|
+
* A positive property of the artefact: an OpenAPI document with no
|
|
391
|
+
* `paths`. Mirrors the reference's has_no_operations, including every
|
|
392
|
+
* refusal path (non-yaml extension, unreachable file, unparseable
|
|
393
|
+
* content, non-mapping document → False, never a guess).
|
|
394
|
+
*/
|
|
395
|
+
function hasNoOperations(sddRoot, specPath) {
|
|
396
|
+
if (!specPath || !(specPath.endsWith(".yaml") || specPath.endsWith(".yml"))) {
|
|
397
|
+
return false;
|
|
398
|
+
}
|
|
399
|
+
const full = join(sddRoot, specPath);
|
|
400
|
+
if (!existsSync(full))
|
|
401
|
+
return false;
|
|
402
|
+
let doc;
|
|
403
|
+
try {
|
|
404
|
+
doc = parseYaml(readFileSync(full, "utf-8"));
|
|
405
|
+
}
|
|
406
|
+
catch {
|
|
407
|
+
return false;
|
|
408
|
+
}
|
|
409
|
+
if (typeof doc !== "object" || doc === null || Array.isArray(doc)) {
|
|
410
|
+
return false;
|
|
411
|
+
}
|
|
412
|
+
const d = doc;
|
|
413
|
+
if (!("openapi" in d) && !("swagger" in d) && !("paths" in d))
|
|
414
|
+
return true;
|
|
415
|
+
const paths = d["paths"];
|
|
416
|
+
if (!paths || typeof paths !== "object")
|
|
417
|
+
return true;
|
|
418
|
+
return Object.keys(paths).length === 0;
|
|
419
|
+
}
|
|
420
|
+
const CONTRACT_FLAGS_SQL = `
|
|
421
|
+
WITH ct AS (
|
|
422
|
+
SELECT c."id" AS id,
|
|
423
|
+
COALESCE(c."status", '') AS status,
|
|
424
|
+
COALESCE(c."evidence_class", '') AS evidence_class,
|
|
425
|
+
COALESCE(c."kind", '') AS kind,
|
|
426
|
+
REPLACE(COALESCE(c."spec_path", ''), chr(92), '/') AS sp
|
|
427
|
+
FROM "contracts" c
|
|
428
|
+
WHERE c."id" IS NOT NULL AND c."id" <> ''
|
|
429
|
+
AND c.rowid = (SELECT MAX(c2.rowid) FROM "contracts" c2 WHERE c2."id" = c."id")
|
|
430
|
+
),
|
|
431
|
+
events_with_edges AS (
|
|
432
|
+
SELECT DISTINCT event_id FROM (
|
|
433
|
+
SELECT "event_id" FROM "service_event"
|
|
434
|
+
UNION ALL SELECT "event_id" FROM "capability_event"
|
|
435
|
+
UNION ALL SELECT "event_id" FROM "feature_event"
|
|
436
|
+
) u
|
|
437
|
+
WHERE COALESCE(event_id, '') <> ''
|
|
438
|
+
),
|
|
439
|
+
twin_bases AS (
|
|
440
|
+
SELECT DISTINCT regexp_extract(REPLACE(e."schema_path", chr(92), '/'), '[^/]*$') AS base
|
|
441
|
+
FROM "events" e
|
|
442
|
+
WHERE COALESCE(e."schema_path", '') <> ''
|
|
443
|
+
AND COALESCE(e."id", '') <> ''
|
|
444
|
+
AND e."id" IN (SELECT event_id FROM events_with_edges)
|
|
445
|
+
)
|
|
446
|
+
SELECT ct.id, ct.status, ct.evidence_class, ct.kind, ct.sp,
|
|
447
|
+
EXISTS (SELECT 1 FROM "capability_contract" cc
|
|
448
|
+
WHERE cc."contract_id" = ct.id) AS owned,
|
|
449
|
+
EXISTS (SELECT 1 FROM "service_contract" sc
|
|
450
|
+
WHERE sc."contract_id" = ct.id) AS attributed,
|
|
451
|
+
(ct.sp <> '' AND EXISTS (SELECT 1 FROM twin_bases b
|
|
452
|
+
WHERE b.base = regexp_extract(ct.sp, '[^/]*$'))) AS twin_edge
|
|
453
|
+
FROM ct
|
|
454
|
+
ORDER BY ct.id;`;
|
|
455
|
+
const CONSUMERS_NAMED_SQL = `
|
|
456
|
+
SELECT COUNT(DISTINCT sc."contract_id")
|
|
457
|
+
FROM "service_contract" sc
|
|
458
|
+
WHERE COALESCE(sc."contract_id", '') <> ''
|
|
459
|
+
AND COALESCE(sc."role", '') = 'consumes';`;
|
|
460
|
+
const RAW_SPEC_PATHS_SQL = `
|
|
461
|
+
SELECT DISTINCT COALESCE(c."spec_path", '') FROM "contracts" c;`;
|
|
462
|
+
export async function runContractCoverage(session, options) {
|
|
463
|
+
// Known-good / known-bad probe (M-ADR 0199 §4.6), both directions,
|
|
464
|
+
// before any real data — mirror of the reference's five-way probe.
|
|
465
|
+
const probe = {
|
|
466
|
+
covered: classifyContract(true, false, false),
|
|
467
|
+
orphan: classifyContract(false, false, false),
|
|
468
|
+
excluded: classifyContract(false, true, false),
|
|
469
|
+
event: classifyContract(false, false, true),
|
|
470
|
+
conflict: classifyContract(true, true, false),
|
|
471
|
+
};
|
|
472
|
+
if (probe["covered"] !== "covered" ||
|
|
473
|
+
probe["orphan"] !== "unresolved" ||
|
|
474
|
+
probe["excluded"] !== "excluded" ||
|
|
475
|
+
probe["event"] !== "covered-as-event" ||
|
|
476
|
+
probe["conflict"] !== "conflict") {
|
|
477
|
+
throw new Error("coverage-predicates: contract classifier probe misclassified a synthetic row — no verdict is trustworthy");
|
|
478
|
+
}
|
|
479
|
+
const reader = await session.conn.runAndReadAll(CONTRACT_FLAGS_SQL);
|
|
480
|
+
const rows = reader.getRows();
|
|
481
|
+
if (rows.length === 0) {
|
|
482
|
+
return { na: true, findings: [] };
|
|
483
|
+
}
|
|
484
|
+
// Availability manifest (M-ADR 0202): informational, never
|
|
485
|
+
// verdict-changing; unreadable → a warning, mirror of the reference's
|
|
486
|
+
// try/except. Row paths are the RAW spec_path values, un-normalised.
|
|
487
|
+
let availability;
|
|
488
|
+
let availabilityWarning;
|
|
489
|
+
try {
|
|
490
|
+
const manifestPath = join(options.sddRoot, ".sdd", "contract-availability.yaml");
|
|
491
|
+
if (existsSync(manifestPath)) {
|
|
492
|
+
const text = readFileSync(manifestPath, "utf-8");
|
|
493
|
+
const attestedPaths = [...text.matchAll(/^\s*- path: "([^"]+)"/gm)].map((m) => m[1]);
|
|
494
|
+
const rawReader = await session.conn.runAndReadAll(RAW_SPEC_PATHS_SQL);
|
|
495
|
+
const rowPaths = new Set(rawReader.getRows().map((r) => String(r[0] ?? "")));
|
|
496
|
+
availability = {
|
|
497
|
+
attested: attestedPaths.length,
|
|
498
|
+
unmodelled: attestedPaths.filter((p) => !rowPaths.has(p)),
|
|
499
|
+
};
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
catch (e) {
|
|
503
|
+
availabilityWarning = String(e instanceof Error ? e.message : e);
|
|
504
|
+
}
|
|
505
|
+
const findings = [];
|
|
506
|
+
const byExclusion = {};
|
|
507
|
+
let covered = 0;
|
|
508
|
+
let viaEvent = 0;
|
|
509
|
+
let excludedCount = 0;
|
|
510
|
+
let conflicting = 0;
|
|
511
|
+
let unresolved = 0;
|
|
512
|
+
let ownedOnly = 0;
|
|
513
|
+
let attrOnly = 0;
|
|
514
|
+
let both = 0;
|
|
515
|
+
for (const r of rows) {
|
|
516
|
+
const id = String(r[0]);
|
|
517
|
+
const status = String(r[1] ?? "");
|
|
518
|
+
const evidenceClass = String(r[2] ?? "");
|
|
519
|
+
const kind = String(r[3] ?? "");
|
|
520
|
+
const sp = String(r[4] ?? "");
|
|
521
|
+
const owned = r[5] === true;
|
|
522
|
+
const attributed = r[6] === true;
|
|
523
|
+
const twinEdge = r[7] === true;
|
|
524
|
+
if (owned && !attributed)
|
|
525
|
+
ownedOnly++;
|
|
526
|
+
else if (attributed && !owned)
|
|
527
|
+
attrOnly++;
|
|
528
|
+
else if (owned && attributed)
|
|
529
|
+
both++;
|
|
530
|
+
// The three exclusions + the one alternative route, in the
|
|
531
|
+
// reference's order (first match wins; a deprecated event-kind
|
|
532
|
+
// contract is excluded, never covered-as-event).
|
|
533
|
+
let excluded = false;
|
|
534
|
+
let exclusionKey = "";
|
|
535
|
+
let coveredAsEvent = false;
|
|
536
|
+
if (status === "deprecated") {
|
|
537
|
+
excluded = true;
|
|
538
|
+
exclusionKey = "deprecated";
|
|
539
|
+
}
|
|
540
|
+
else if (evidenceClass === "vendor-doc") {
|
|
541
|
+
excluded = true;
|
|
542
|
+
exclusionKey = "provider-surface";
|
|
543
|
+
}
|
|
544
|
+
else if (hasNoOperations(options.sddRoot, sp)) {
|
|
545
|
+
excluded = true;
|
|
546
|
+
exclusionKey = "not-an-interface";
|
|
547
|
+
}
|
|
548
|
+
else if (kind === "event" && twinEdge) {
|
|
549
|
+
coveredAsEvent = true;
|
|
550
|
+
}
|
|
551
|
+
const verdict = classifyContract(owned || attributed, excluded, coveredAsEvent);
|
|
552
|
+
if (verdict === "conflict") {
|
|
553
|
+
conflicting++;
|
|
554
|
+
findings.push({
|
|
555
|
+
predicate: "contract_coverage",
|
|
556
|
+
kind: "divergence",
|
|
557
|
+
subjectId: id,
|
|
558
|
+
classification: exclusionKey,
|
|
559
|
+
});
|
|
560
|
+
}
|
|
561
|
+
else if (verdict === "covered") {
|
|
562
|
+
covered++;
|
|
563
|
+
}
|
|
564
|
+
else if (verdict === "covered-as-event") {
|
|
565
|
+
viaEvent++;
|
|
566
|
+
}
|
|
567
|
+
else if (verdict === "excluded") {
|
|
568
|
+
excludedCount++;
|
|
569
|
+
byExclusion[exclusionKey] = (byExclusion[exclusionKey] ?? 0) + 1;
|
|
570
|
+
}
|
|
571
|
+
else {
|
|
572
|
+
unresolved++;
|
|
573
|
+
findings.push({
|
|
574
|
+
predicate: "contract_coverage",
|
|
575
|
+
kind: options.tier === "aggregate" ? "orphan" : "coverage",
|
|
576
|
+
subjectId: id,
|
|
577
|
+
classification: options.tier === "aggregate" ? "orphaned" : "unresolved-locally",
|
|
578
|
+
});
|
|
579
|
+
}
|
|
580
|
+
}
|
|
581
|
+
const consumersReader = await session.conn.runAndReadAll(CONSUMERS_NAMED_SQL);
|
|
582
|
+
const consumersNamed = Number(consumersReader.getRows()[0][0]);
|
|
583
|
+
return {
|
|
584
|
+
na: false,
|
|
585
|
+
findings,
|
|
586
|
+
metrics: {
|
|
587
|
+
total: rows.length,
|
|
588
|
+
covered,
|
|
589
|
+
viaEvent,
|
|
590
|
+
excluded: excludedCount,
|
|
591
|
+
conflicting,
|
|
592
|
+
unresolved,
|
|
593
|
+
byExclusion,
|
|
594
|
+
consumersNamed,
|
|
595
|
+
ownedOnly,
|
|
596
|
+
attrOnly,
|
|
597
|
+
both,
|
|
598
|
+
},
|
|
599
|
+
...(availability !== undefined ? { availability } : {}),
|
|
600
|
+
...(availabilityWarning !== undefined ? { availabilityWarning } : {}),
|
|
601
|
+
};
|
|
602
|
+
}
|
|
603
|
+
//# sourceMappingURL=coverage-predicates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coverage-predicates.js","sourceRoot":"","sources":["../../../src/lib/catalogue/coverage-predicates.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Coverage renderers — M-ADR 0205 §4.4 (A4 CS-2).
|
|
3
|
+
*
|
|
4
|
+
* Each function renders a predicate's structured result into the EXACT
|
|
5
|
+
* stdout lines its reference shell script prints. The text is a
|
|
6
|
+
* compatibility contract: adopters' findings baselines hold these literal
|
|
7
|
+
* lines, so every string here is copied from the reference, never
|
|
8
|
+
* paraphrased. Line ORDER within a predicate follows the reference's
|
|
9
|
+
* print order (metrics/controls/findings blocks); WITHIN a block the
|
|
10
|
+
* engine's total ORDER BY governs, which may differ from the reference's
|
|
11
|
+
* file-row order — baselines compare by membership, and the line-parity
|
|
12
|
+
* driver compares sorted multisets.
|
|
13
|
+
*
|
|
14
|
+
* Percentages use Python's %.1f semantics (round-half-even on the scaled
|
|
15
|
+
* value), because the references print through Python f-strings.
|
|
16
|
+
*/
|
|
17
|
+
import type { ContractCoverageResult, CoverageFinding, CoverageTier, EventCoverageResult, RepoCapabilityMetrics, ServiceCapabilityMetrics } from "./coverage-predicates.js";
|
|
18
|
+
import type { CapabilityEventResult, DataModelEntitiesResult, DomainCatalogueGap, FeatureSpecPromotionResult, FeatureSurfaceDuplicationResult, RepoEdgesResult } from "./gate-checks.js";
|
|
19
|
+
/** Python `%.1f` — half to even at an exact scaled .5, else nearest. */
|
|
20
|
+
export declare function fmt1f(x: number): string;
|
|
21
|
+
export declare function renderRepoCapability(findings: readonly CoverageFinding[], metrics: RepoCapabilityMetrics): string[];
|
|
22
|
+
export declare function renderServiceCapability(findings: readonly CoverageFinding[], metrics: ServiceCapabilityMetrics, tier: CoverageTier): string[];
|
|
23
|
+
export declare function renderEventCoverage(res: EventCoverageResult, tier: CoverageTier): string[];
|
|
24
|
+
export declare function renderContractCoverage(res: ContractCoverageResult, tier: CoverageTier): string[];
|
|
25
|
+
export declare function renderEventCatalogueCheck(gaps: readonly DomainCatalogueGap[]): string[];
|
|
26
|
+
export declare function renderRepoEdgesCheck(res: RepoEdgesResult): string[];
|
|
27
|
+
export declare function renderGlossaryXrefCheck(finding: boolean): string[];
|
|
28
|
+
export declare function renderDataModelEntitiesCheck(res: DataModelEntitiesResult): string[];
|
|
29
|
+
export declare function renderCapabilityEventCheck(res: CapabilityEventResult): string[];
|
|
30
|
+
export declare function renderFeatureEventCheck(res: {
|
|
31
|
+
readonly gap?: {
|
|
32
|
+
readonly serviceEvent: number;
|
|
33
|
+
readonly featureService: number;
|
|
34
|
+
};
|
|
35
|
+
}): string[];
|
|
36
|
+
export declare function renderPlatformDependenciesCheck(finding: boolean): string[];
|
|
37
|
+
export declare function renderFeatureSpecPromotionCheck(res: FeatureSpecPromotionResult): string[];
|
|
38
|
+
export declare function renderFeatureSurfaceDuplicationCheck(res: FeatureSurfaceDuplicationResult): string[];
|
|
39
|
+
//# sourceMappingURL=coverage-render.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coverage-render.d.ts","sourceRoot":"","sources":["../../../src/lib/catalogue/coverage-render.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EACV,sBAAsB,EACtB,eAAe,EACf,YAAY,EACZ,mBAAmB,EACnB,qBAAqB,EACrB,wBAAwB,EACzB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EACV,qBAAqB,EACrB,uBAAuB,EACvB,kBAAkB,EAClB,0BAA0B,EAC1B,+BAA+B,EAC/B,eAAe,EAChB,MAAM,kBAAkB,CAAC;AAE1B,wEAAwE;AACxE,wBAAgB,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CASvC;AAED,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,SAAS,eAAe,EAAE,EACpC,OAAO,EAAE,qBAAqB,GAC7B,MAAM,EAAE,CAmDV;AAcD,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,SAAS,eAAe,EAAE,EACpC,OAAO,EAAE,wBAAwB,EACjC,IAAI,EAAE,YAAY,GACjB,MAAM,EAAE,CA2CV;AAED,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,mBAAmB,EACxB,IAAI,EAAE,YAAY,GACjB,MAAM,EAAE,CAmEV;AAED,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,sBAAsB,EAC3B,IAAI,EAAE,YAAY,GACjB,MAAM,EAAE,CAoFV;AAID,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,SAAS,kBAAkB,EAAE,GAClC,MAAM,EAAE,CAKV;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,EAAE,CA2BnE;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,EAAE,CAMlE;AAED,wBAAgB,4BAA4B,CAC1C,GAAG,EAAE,uBAAuB,GAC3B,MAAM,EAAE,CAoBV;AAED,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,qBAAqB,GAAG,MAAM,EAAE,CAc/E;AAED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE;IAC3C,QAAQ,CAAC,GAAG,CAAC,EAAE;QAAE,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;KAAE,CAAC;CACnF,GAAG,MAAM,EAAE,CAMX;AAED,wBAAgB,+BAA+B,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,EAAE,CAM1E;AAED,wBAAgB,+BAA+B,CAC7C,GAAG,EAAE,0BAA0B,GAC9B,MAAM,EAAE,CASV;AAED,wBAAgB,oCAAoC,CAClD,GAAG,EAAE,+BAA+B,GACnC,MAAM,EAAE,CAUV"}
|