@sdd-method/sdd-cli 0.17.0 → 0.21.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 (46) hide show
  1. package/dist/lib/catalogue/build.d.ts.map +1 -1
  2. package/dist/lib/catalogue/build.js +92 -5
  3. package/dist/lib/catalogue/build.js.map +1 -1
  4. package/dist/lib/catalogue/builders/c4-containers.d.ts.map +1 -1
  5. package/dist/lib/catalogue/builders/c4-containers.js +15 -0
  6. package/dist/lib/catalogue/builders/c4-containers.js.map +1 -1
  7. package/dist/lib/catalogue/builders/capability-spec-walker.d.ts +55 -0
  8. package/dist/lib/catalogue/builders/capability-spec-walker.d.ts.map +1 -0
  9. package/dist/lib/catalogue/builders/capability-spec-walker.js +99 -0
  10. package/dist/lib/catalogue/builders/capability-spec-walker.js.map +1 -0
  11. package/dist/lib/catalogue/builders/capability-spec.d.ts +51 -0
  12. package/dist/lib/catalogue/builders/capability-spec.d.ts.map +1 -0
  13. package/dist/lib/catalogue/builders/capability-spec.js +276 -0
  14. package/dist/lib/catalogue/builders/capability-spec.js.map +1 -0
  15. package/dist/lib/catalogue/builders/contracts.d.ts.map +1 -1
  16. package/dist/lib/catalogue/builders/contracts.js +88 -41
  17. package/dist/lib/catalogue/builders/contracts.js.map +1 -1
  18. package/dist/lib/catalogue/builders/feature-grounding-walker.d.ts +68 -0
  19. package/dist/lib/catalogue/builders/feature-grounding-walker.d.ts.map +1 -0
  20. package/dist/lib/catalogue/builders/feature-grounding-walker.js +254 -0
  21. package/dist/lib/catalogue/builders/feature-grounding-walker.js.map +1 -0
  22. package/dist/lib/catalogue/builders/feature-grounding.d.ts +53 -0
  23. package/dist/lib/catalogue/builders/feature-grounding.d.ts.map +1 -0
  24. package/dist/lib/catalogue/builders/feature-grounding.js +312 -0
  25. package/dist/lib/catalogue/builders/feature-grounding.js.map +1 -0
  26. package/dist/lib/catalogue/builders/index.d.ts +6 -0
  27. package/dist/lib/catalogue/builders/index.d.ts.map +1 -1
  28. package/dist/lib/catalogue/builders/index.js +3 -0
  29. package/dist/lib/catalogue/builders/index.js.map +1 -1
  30. package/dist/lib/catalogue/builders/integrations.d.ts.map +1 -1
  31. package/dist/lib/catalogue/builders/integrations.js +69 -14
  32. package/dist/lib/catalogue/builders/integrations.js.map +1 -1
  33. package/dist/lib/catalogue/builders/service-contract-consumes.d.ts +24 -0
  34. package/dist/lib/catalogue/builders/service-contract-consumes.d.ts.map +1 -0
  35. package/dist/lib/catalogue/builders/service-contract-consumes.js +173 -0
  36. package/dist/lib/catalogue/builders/service-contract-consumes.js.map +1 -0
  37. package/dist/lib/catalogue/canonical-schema.yaml +7 -7
  38. package/dist/lib/catalogue/feature-grounding-aliases-loader.d.ts +36 -0
  39. package/dist/lib/catalogue/feature-grounding-aliases-loader.d.ts.map +1 -0
  40. package/dist/lib/catalogue/feature-grounding-aliases-loader.js +65 -0
  41. package/dist/lib/catalogue/feature-grounding-aliases-loader.js.map +1 -0
  42. package/dist/lib/catalogue/service-contract-aliases-loader.d.ts +60 -0
  43. package/dist/lib/catalogue/service-contract-aliases-loader.d.ts.map +1 -0
  44. package/dist/lib/catalogue/service-contract-aliases-loader.js +109 -0
  45. package/dist/lib/catalogue/service-contract-aliases-loader.js.map +1 -0
  46. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/index.ts"],"names":[],"mappings":"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"}
@@ -14,11 +14,14 @@ export { buildAdrs } from "./adrs.js";
14
14
  export { buildAdrSupersedes } from "./adr-supersedes.js";
15
15
  export { buildFeatures } from "./features.js";
16
16
  export { buildFeatureGroups } from "./feature-groups.js";
17
+ export { buildFeatureGrounding } from "./feature-grounding.js";
18
+ export { buildCapabilitySpec } from "./capability-spec.js";
17
19
  export { buildContracts } from "./contracts.js";
18
20
  export { buildRepoEdges } from "./repo-edges.js";
19
21
  export { buildEvents } from "./events.js";
20
22
  export { buildServiceEvent, buildCapabilityEvent } from "./event-edges.js";
21
23
  export { buildServiceContract } from "./service-contract.js";
24
+ export { buildServiceContractConsumes } from "./service-contract-consumes.js";
22
25
  export { buildGlossaryItems } from "./glossary.js";
23
26
  export { buildGlossaryXref } from "./glossary-xref.js";
24
27
  export { buildCapabilities } from "./capabilities.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAMtD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAKzD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAK9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAKhD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAKjD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAM1C,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAK3E,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAE7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAKnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAK9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAKvD,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,4BAA4B,CAAC;AAMpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAKvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAClB,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,uBAAuB,CAAC;AAO/B,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAE7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAE1E,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAMtD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAKzD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAK9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAK/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAK3D,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAKhD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAKjD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAM1C,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAK3E,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAE7D,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAE9E,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAKnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAK9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAKvD,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,4BAA4B,CAAC;AAMpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAKvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAClB,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,uBAAuB,CAAC;AAO/B,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAE7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAE1E,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"integrations.d.ts","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/integrations.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAErD,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAWD,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,uBAAuB,GAC9B,OAAO,CAAC,YAAY,EAAE,CAAC,CA4DzB"}
1
+ {"version":3,"file":"integrations.d.ts","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/integrations.ts"],"names":[],"mappings":"AAqCA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAErD,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAkBD,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,uBAAuB,GAC9B,OAAO,CAAC,YAAY,EAAE,CAAC,CAyGzB"}
@@ -1,33 +1,51 @@
1
- // Integrations discoverer — emits a single `integrations.csv` row per
2
- // integration-product SDD, sourced from `integration-manifest.yaml` at
3
- // the SDD root.
1
+ // Integrations discoverer — emits `integrations.csv` rows from an
2
+ // integration-product SDD's `integration-manifest.yaml`.
4
3
  //
5
4
  // Per ADR 0134 federation: each integration-provider SDD owns one row
6
5
  // in the granular integrations.csv. The aggregator merges siblings.
7
6
  //
7
+ // Per ADR 0144 (schema 2.6.0): if the manifest declares an optional
8
+ // `sub_integrations:` array (multi-provider monolith pattern), emit
9
+ // one additional row per entry with parent_product_id set to the
10
+ // SDD's integrationId. The umbrella SDD row stays unchanged.
11
+ //
8
12
  // Profile gating: only integration-product profile SDDs emit. Other
9
13
  // profiles are no-ops.
10
14
  //
11
- // id = integrationId from the manifest (or sdd_id as fallback).
12
- // name = providerName (or title-cased id).
13
- // category = profileType (open enum per schema description; ecosystems
14
- // extend with values like saas-platform, oem, device, ...).
15
- // parent_product_id = empty (umbrella integration-products are not yet
16
- // modelled in the federation; this is a hook for future use).
17
- // domain_id = empty (integration providers are federation nodes, not
18
- // capability-domain members per ADR 0136).
19
- // doc_path = "." (SDD root).
20
- // repo_count = supplied by the orchestrator from discovered repos.
15
+ // Umbrella row:
16
+ // id = integrationId from the manifest (or sdd_id as fallback).
17
+ // name = providerName (or title-cased id).
18
+ // category = profileType (open enum per schema description; ecosystems
19
+ // extend with values like saas-platform, oem, device, ...).
20
+ // parent_product_id = parentIntegrationProductId (typically empty).
21
+ // doc_path = "." (SDD root).
22
+ // repo_count = supplied by the orchestrator from discovered repos.
23
+ //
24
+ // Sub-integration rows (one per entry in sub_integrations:):
25
+ // id = entry.id (required; unique within SDD)
26
+ // name = entry.providerName (required)
27
+ // category = entry.category (required)
28
+ // parent_product_id = the SDD's integrationId (internal FK)
29
+ // doc_path = SDD's doc_path
30
+ // repo_count = 0 (repo ownership stays with the umbrella)
31
+ //
32
+ // domain_id is always empty per ADR 0136.
21
33
  import { readFile } from "node:fs/promises";
22
34
  import { join } from "node:path";
23
35
  import { parse as parseYaml } from "yaml";
24
36
  import { z } from "zod";
25
37
  const REL_PATH = "integration-manifest.yaml";
38
+ const SubIntegrationSchema = z.object({
39
+ id: z.string().optional(),
40
+ providerName: z.string().optional(),
41
+ category: z.string().optional(),
42
+ });
26
43
  const ManifestSchema = z.object({
27
44
  integrationId: z.string().optional(),
28
45
  providerName: z.string().optional(),
29
46
  profileType: z.string().optional(),
30
47
  parentIntegrationProductId: z.string().optional(),
48
+ sub_integrations: z.array(SubIntegrationSchema).optional(),
31
49
  });
32
50
  export async function buildIntegrations(inputs) {
33
51
  if (inputs.profile !== "integration-product")
@@ -63,7 +81,7 @@ export async function buildIntegrations(inputs) {
63
81
  if (category === "") {
64
82
  inputs.findings.add("convention", `${REL_PATH}: missing required \`profileType\` (used as integrations.category)`);
65
83
  }
66
- return [
84
+ const rows = [
67
85
  {
68
86
  id,
69
87
  name,
@@ -75,6 +93,43 @@ export async function buildIntegrations(inputs) {
75
93
  source_sdd_id: "",
76
94
  },
77
95
  ];
96
+ // Per ADR 0144 (schema 2.6.0): emit one row per sub_integration with
97
+ // parent_product_id = the umbrella SDD's id.
98
+ const subs = parsed.data.sub_integrations ?? [];
99
+ const seenSubIds = new Set([id]); // umbrella id is reserved
100
+ for (let i = 0; i < subs.length; i++) {
101
+ const sub = subs[i];
102
+ const subId = (sub.id ?? "").trim();
103
+ const subName = (sub.providerName ?? "").trim();
104
+ const subCategory = (sub.category ?? "").trim();
105
+ const missing = [];
106
+ if (subId === "")
107
+ missing.push("id");
108
+ if (subName === "")
109
+ missing.push("providerName");
110
+ if (subCategory === "")
111
+ missing.push("category");
112
+ if (missing.length > 0) {
113
+ inputs.findings.add("convention", `${REL_PATH}: sub_integrations[${i}] missing required field(s): ${missing.join(", ")} — entry skipped`);
114
+ continue;
115
+ }
116
+ if (seenSubIds.has(subId)) {
117
+ inputs.findings.add("convention", `${REL_PATH}: sub_integrations[${i}] id "${subId}" duplicates an existing id within the SDD — entry skipped (first occurrence wins)`);
118
+ continue;
119
+ }
120
+ seenSubIds.add(subId);
121
+ rows.push({
122
+ id: subId,
123
+ name: subName,
124
+ domain_id: "",
125
+ parent_product_id: id,
126
+ category: subCategory,
127
+ doc_path: ".",
128
+ repo_count: 0,
129
+ source_sdd_id: "",
130
+ });
131
+ }
132
+ return rows;
78
133
  }
79
134
  function titleCase(slug) {
80
135
  return slug
@@ -1 +1 @@
1
- {"version":3,"file":"integrations.js","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/integrations.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"integrations.js","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/integrations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { CatalogueRow } from "../csv-writer.js";
2
+ import type { FindingsLog } from "../findings.js";
3
+ import type { LoadedServiceContractAliases } from "../service-contract-aliases-loader.js";
4
+ export interface ServiceContractConsumesInputs {
5
+ readonly sddPath: string;
6
+ readonly findings: FindingsLog;
7
+ /**
8
+ * Optional set of locally-known service ids. When non-empty (e.g.
9
+ * connect-mono with a populated services.csv), only those repos are
10
+ * walked. When empty (federated SDDs that don't emit services), the
11
+ * builder walks every repos/<dir> with a service-architecture.md and
12
+ * relies on the aggregator's external-FK resolution against the
13
+ * platform-root services.csv.
14
+ */
15
+ readonly knownServiceIds: ReadonlySet<string>;
16
+ readonly aliases: LoadedServiceContractAliases | null;
17
+ }
18
+ export declare function buildServiceContractConsumes(inputs: ServiceContractConsumesInputs): Promise<CatalogueRow[]>;
19
+ interface OutboundInterface {
20
+ readonly interfaceText: string;
21
+ }
22
+ export declare function parseOutboundInterfaces(markdown: string): OutboundInterface[];
23
+ export {};
24
+ //# sourceMappingURL=service-contract-consumes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-contract-consumes.d.ts","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/service-contract-consumes.ts"],"names":[],"mappings":"AA4BA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,uCAAuC,CAAC;AAM1F,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B;;;;;;;OAOG;IACH,QAAQ,CAAC,eAAe,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC9C,QAAQ,CAAC,OAAO,EAAE,4BAA4B,GAAG,IAAI,CAAC;CACvD;AAED,wBAAsB,4BAA4B,CAChD,MAAM,EAAE,6BAA6B,GACpC,OAAO,CAAC,YAAY,EAAE,CAAC,CA0CzB;AAqCD,UAAU,iBAAiB;IACzB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,iBAAiB,EAAE,CA+C7E"}
@@ -0,0 +1,173 @@
1
+ // service_contract consumes edges — emits one row per (service,
2
+ // contract, consumes) triple derived from each service's
3
+ // `repos/<service>/docs/service-architecture.md` External Interfaces
4
+ // table (Outbound rows).
5
+ //
6
+ // Resolution path:
7
+ // 1. Read the External Interfaces section of the service-architecture
8
+ // markdown. Pipe-delimited table; Direction column = "Outbound"
9
+ // (case-insensitive).
10
+ // 2. For each Outbound row, lookup the Interface column text against
11
+ // the adopter's `.sdd/service-contract-aliases.yaml` (interface_aliases
12
+ // exact match, then interface_contains substring) to get a target
13
+ // contract id.
14
+ // 3. Fall back to same_product_inference: if the interface matches a
15
+ // generic placeholder (e.g. "Private API Gateway"), substitute
16
+ // `{prefix}` with the caller's prefix (service_id minus known
17
+ // suffix). The resolved value is also a contract id.
18
+ // 4. Targets are contract IDs (not names). The schema marks both
19
+ // service_contract.{service_id,contract_id} as `external: true`
20
+ // (schema 2.8.0) — federated SDDs that lack a local services.csv +
21
+ // contracts.csv emit consumes rows whose FKs resolve at aggregation;
22
+ // connect-mono validates internally first per the fk-validator
23
+ // optimistic-resolve rule.
24
+ //
25
+ // Pattern documented in sdd-method ADR 0147.
26
+ import { readFile, readdir } from "node:fs/promises";
27
+ import { join } from "node:path";
28
+ const REPOS_DIR_REL = "repos";
29
+ const SERVICE_ARCHITECTURE_REL = join("docs", "service-architecture.md");
30
+ const KNOWN_SUFFIXES = ["-api", "-bff", "-ui", "-consumer", "-web", "-service"];
31
+ export async function buildServiceContractConsumes(inputs) {
32
+ const rows = [];
33
+ const seen = new Set();
34
+ if (inputs.aliases === null)
35
+ return rows;
36
+ const useKnownGate = inputs.knownServiceIds.size > 0;
37
+ const repoNames = await listRepoDirs(join(inputs.sddPath, REPOS_DIR_REL));
38
+ for (const serviceId of repoNames) {
39
+ if (useKnownGate && !inputs.knownServiceIds.has(serviceId))
40
+ continue;
41
+ if (inputs.aliases.skipCallers.has(serviceId))
42
+ continue;
43
+ const archPath = join(inputs.sddPath, REPOS_DIR_REL, serviceId, SERVICE_ARCHITECTURE_REL);
44
+ let text;
45
+ try {
46
+ text = await readFile(archPath, "utf-8");
47
+ }
48
+ catch (err) {
49
+ const code = err.code;
50
+ if (code === "ENOENT")
51
+ continue;
52
+ throw err;
53
+ }
54
+ const outbound = parseOutboundInterfaces(text);
55
+ for (const iface of outbound) {
56
+ const contractId = resolveContractId(serviceId, iface.interfaceText, inputs.aliases);
57
+ if (contractId === null)
58
+ continue;
59
+ const id = `${serviceId}__${contractId}__consumes`;
60
+ if (seen.has(id))
61
+ continue;
62
+ seen.add(id);
63
+ rows.push({
64
+ id,
65
+ service_id: serviceId,
66
+ contract_id: contractId,
67
+ role: "consumes",
68
+ });
69
+ }
70
+ }
71
+ return rows;
72
+ }
73
+ function resolveContractId(callerServiceId, interfaceText, aliases) {
74
+ const key = interfaceText.toLowerCase().trim();
75
+ // 1. Direct (exact) alias → contract id.
76
+ const direct = aliases.interfaceAliases.get(key);
77
+ if (direct !== undefined)
78
+ return direct;
79
+ // 2. Substring (contains) alias — longest-first.
80
+ for (const [substr, target] of aliases.interfaceContains) {
81
+ if (key.includes(substr))
82
+ return target;
83
+ }
84
+ // 3. Same-product template inference.
85
+ const template = aliases.sameProductTemplates.get(key);
86
+ if (template !== undefined) {
87
+ const prefix = derivePrefix(callerServiceId);
88
+ return template.replace(/\{prefix\}/g, prefix);
89
+ }
90
+ return null;
91
+ }
92
+ function derivePrefix(serviceId) {
93
+ for (const suffix of KNOWN_SUFFIXES) {
94
+ if (serviceId.endsWith(suffix)) {
95
+ return serviceId.slice(0, -suffix.length);
96
+ }
97
+ }
98
+ return serviceId;
99
+ }
100
+ export function parseOutboundInterfaces(markdown) {
101
+ const out = [];
102
+ const sectionRegex = /^##\s+External Interfaces\s*$/im;
103
+ const match = sectionRegex.exec(markdown);
104
+ if (match === null)
105
+ return out;
106
+ // Slice from end of heading to start of next ## heading (or EOF).
107
+ const rest = markdown.slice(match.index + match[0].length);
108
+ const nextHeading = /^##\s+/m.exec(rest);
109
+ const section = nextHeading !== null ? rest.slice(0, nextHeading.index) : rest;
110
+ const lines = section.split(/\r?\n/);
111
+ let headerSeen = false;
112
+ let dividerSeen = false;
113
+ let cols = null;
114
+ for (const raw of lines) {
115
+ const line = raw.trim();
116
+ if (line === "" || !line.startsWith("|")) {
117
+ if (headerSeen)
118
+ break;
119
+ continue;
120
+ }
121
+ const cells = splitRow(line);
122
+ if (!headerSeen) {
123
+ const interfaceIdx = cells.findIndex((c) => c.toLowerCase() === "interface");
124
+ const directionIdx = cells.findIndex((c) => c.toLowerCase() === "direction");
125
+ if (interfaceIdx === -1 || directionIdx === -1)
126
+ continue;
127
+ cols = { iface: interfaceIdx, direction: directionIdx };
128
+ headerSeen = true;
129
+ continue;
130
+ }
131
+ if (!dividerSeen) {
132
+ // Divider row: cells of dashes (e.g. "---")
133
+ if (cells.every((c) => /^:?-+:?$/.test(c.trim()))) {
134
+ dividerSeen = true;
135
+ continue;
136
+ }
137
+ // Some authors omit dividers — accept and fall through.
138
+ dividerSeen = true;
139
+ }
140
+ if (cols === null)
141
+ continue;
142
+ const direction = (cells[cols.direction] ?? "").trim().toLowerCase();
143
+ if (direction !== "outbound")
144
+ continue;
145
+ const ifaceText = (cells[cols.iface] ?? "").trim();
146
+ if (ifaceText === "")
147
+ continue;
148
+ out.push({ interfaceText: ifaceText });
149
+ }
150
+ return out;
151
+ }
152
+ function splitRow(line) {
153
+ // Drop leading + trailing | then split on internal |.
154
+ let s = line;
155
+ if (s.startsWith("|"))
156
+ s = s.slice(1);
157
+ if (s.endsWith("|"))
158
+ s = s.slice(0, -1);
159
+ return s.split("|").map((c) => c.trim());
160
+ }
161
+ async function listRepoDirs(reposRoot) {
162
+ try {
163
+ const entries = await readdir(reposRoot, { withFileTypes: true });
164
+ return entries.filter((e) => e.isDirectory()).map((e) => e.name).sort();
165
+ }
166
+ catch (err) {
167
+ const code = err.code;
168
+ if (code === "ENOENT")
169
+ return [];
170
+ throw err;
171
+ }
172
+ }
173
+ //# sourceMappingURL=service-contract-consumes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-contract-consumes.js","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/service-contract-consumes.ts"],"names":[],"mappings":"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"}
@@ -45,7 +45,7 @@
45
45
  # Builder contract: see docs/method/methods/catalogue-builder-specification.md.
46
46
  # Category taxonomy: see docs/method/methods/product-category-taxonomy.md.
47
47
 
48
- schema_version: "2.4.0"
48
+ schema_version: "2.8.0"
49
49
  schema_owner: "sdd-method"
50
50
  schema_status: "canonical"
51
51
 
@@ -134,7 +134,7 @@ catalogues:
134
134
 
135
135
  integrations:
136
136
  primary_key: id
137
- description: "Granular provider adapters. Each row is one provider folder under an umbrella integration-product."
137
+ description: "Granular provider adapters. Each row is either (a) an integration-product SDD's own row (one per SDD; parent_product_id empty), or (b) a manifest-declared sub-integration of a multi-provider monolith (parent_product_id = umbrella SDD's id). Per ADR 0144 (schema 2.6.0), sub-integrations are declared via the optional `sub_integrations:` array in `integration-manifest.yaml`."
138
138
  foreign_keys:
139
139
  - { column: domain_id, references: domains.id, nullable: true }
140
140
  - { column: parent_product_id, references: products.id, nullable: true }
@@ -142,7 +142,7 @@ catalogues:
142
142
  - { name: id, type: string, nullable: false, description: "Provider slug." }
143
143
  - { name: name, type: string, nullable: false }
144
144
  - { name: domain_id, type: string, nullable: true, description: "Provider adapters are federation nodes, not capability-domain members. Left empty per ADR 0136." }
145
- - { name: parent_product_id, type: string, nullable: true, description: "Umbrella integration-product." }
145
+ - { name: parent_product_id, type: string, nullable: true, description: "Umbrella integration-product. Empty for an SDD's own row; set to the SDD's integrationId for sub-integration rows declared via integration-manifest.yaml `sub_integrations:` (per ADR 0144, schema 2.6.0)." }
146
146
  - { name: category, type: string, nullable: false, description: "oem | device | fleet | camera | legacy | data-sharing | gateway-framework (extensible per ecosystem)." }
147
147
  - { name: doc_path, type: string, nullable: false }
148
148
  - { name: repo_count, type: int, nullable: false }
@@ -275,7 +275,7 @@ catalogues:
275
275
  - { name: description, type: string, nullable: true }
276
276
  - { name: maturity, type: string, nullable: true, description: "Standard: working | provisional | unknown | absent. Ecosystem-specific values may be added with parser awareness." }
277
277
  - { name: status, type: string, nullable: false, description: "Default 'active'." }
278
- - { name: source, type: string, nullable: false, description: "feature-tree | feature-set | capability-spec | feature-spec. NOTE: feature-tree-group source removed in 1.3.0 — groups are now first-class in feature_groups.csv. As of schema 2.2.0, source: feature-tree is emitted by the canonical builder for rows derived from feature-tree.md bullets." }
278
+ - { name: source, type: string, nullable: false, description: "feature-tree | feature-set | capability-spec | feature-spec | feature-grounding. NOTE: feature-tree-group source removed in 1.3.0 — groups are now first-class in feature_groups.csv. As of schema 2.2.0, source: feature-tree is emitted by the canonical builder for rows derived from feature-tree.md bullets. As of schema 2.5.0, source: feature-grounding is emitted for rows derived from `docs/domains/<dom>/design/<capability>/feature-grounding.md` markdown tables (per ADR 0143). As of schema 2.7.0, source: capability-spec is emitted by the canonical builder for rows derived from `## Feature Grounding (code-path trace)` tables in `docs/domains/<dom>/product/<capability>.md` capability spec markdown (per ADR 0145). Feature-grounding and capability-spec rows are both capability-owned: product_id is empty; capability_id resolves from the file path." }
279
279
  - { name: runway, type: string, nullable: true, description: "Optional adopter-owned lifecycle / migration marker. Free string at method level — the schema declares no enum and ships no controlled vocabulary. Adopters MAY declare a per-SDD `feature-runway-vocabulary.yaml` at their SDD root; when present, the canonical builder validates captured values against it and emits a `convention` finding for unknown values. Empty when the adopter does not track migration state. Comparability across SDDs requires ecosystem-level vocabulary alignment as an explicit pre-step. Added in schema 2.2.0." }
280
280
  - { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per ADR 0134." }
281
281
 
@@ -489,10 +489,10 @@ catalogues:
489
489
 
490
490
  service_contract:
491
491
  primary_key: id
492
- description: "Edge: service exposes or consumes contract."
492
+ description: "Edge: service exposes or consumes contract. Both FKs are external (per ADR 0147): federated SDDs that walk per-repo service-architecture tables emit consumes rows where service_id resolves to the platform-root catalogue's services.csv (post-aggregation) and contract_id resolves to the platform-root contracts.csv. Internal builds (e.g. connect-mono) still optimistically validate locally. Schema 2.8.0."
493
493
  foreign_keys:
494
- - { column: service_id, references: services.id, nullable: false }
495
- - { column: contract_id, references: contracts.id, nullable: false }
494
+ - { column: service_id, references: services.id, nullable: false, external: true }
495
+ - { column: contract_id, references: contracts.id, nullable: false, external: true }
496
496
  columns:
497
497
  - { name: id, type: string, nullable: false, description: "{service_id}__{contract_id}__{role}." }
498
498
  - { name: service_id, type: string, nullable: false }
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Loader for the optional `.sdd/feature-grounding-aliases.yaml` config
3
+ * per ADR 0143 (schema 2.5.0).
4
+ *
5
+ * Adopters use this map to translate display names in
6
+ * `feature-grounding.md` tables (class names, file basenames, route
7
+ * fragments) into canonical service / repo ids that resolve against
8
+ * `services.csv` and `repositories.csv`. Follows the same shape
9
+ * convention as the existing capability_service alias map.
10
+ *
11
+ * File shape:
12
+ *
13
+ * service_aliases:
14
+ * AuthHandler: connect-app-shell-api
15
+ * app-shell-ui: connect-app-shell-ui
16
+ * repo_aliases:
17
+ * camera-bff: global-camera-bff
18
+ *
19
+ * Either block is optional. Empty / missing file = no aliases (every
20
+ * reference must resolve directly against the canonical id).
21
+ */
22
+ export interface LoadedAliases {
23
+ /** Display name → canonical service id. */
24
+ readonly serviceAliases: ReadonlyMap<string, string>;
25
+ /** Display name → canonical repo (canonical_repo_key) id. */
26
+ readonly repoAliases: ReadonlyMap<string, string>;
27
+ /** Path the aliases were loaded from (relative to SDD root). */
28
+ readonly relPath: string;
29
+ }
30
+ /**
31
+ * Load the optional alias map. Returns `null` when the file is absent
32
+ * — callers treat that as "no aliases, all references must resolve
33
+ * directly against the canonical id." Throws on malformed YAML.
34
+ */
35
+ export declare function loadFeatureGroundingAliases(sddPath: string): Promise<LoadedAliases | null>;
36
+ //# sourceMappingURL=feature-grounding-aliases-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feature-grounding-aliases-loader.d.ts","sourceRoot":"","sources":["../../../src/lib/catalogue/feature-grounding-aliases-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAQH,MAAM,WAAW,aAAa;IAC5B,2CAA2C;IAC3C,QAAQ,CAAC,cAAc,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrD,6DAA6D;IAC7D,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClD,gEAAgE;IAChE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAOD;;;;GAIG;AACH,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAuB/B"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Loader for the optional `.sdd/feature-grounding-aliases.yaml` config
3
+ * per ADR 0143 (schema 2.5.0).
4
+ *
5
+ * Adopters use this map to translate display names in
6
+ * `feature-grounding.md` tables (class names, file basenames, route
7
+ * fragments) into canonical service / repo ids that resolve against
8
+ * `services.csv` and `repositories.csv`. Follows the same shape
9
+ * convention as the existing capability_service alias map.
10
+ *
11
+ * File shape:
12
+ *
13
+ * service_aliases:
14
+ * AuthHandler: connect-app-shell-api
15
+ * app-shell-ui: connect-app-shell-ui
16
+ * repo_aliases:
17
+ * camera-bff: global-camera-bff
18
+ *
19
+ * Either block is optional. Empty / missing file = no aliases (every
20
+ * reference must resolve directly against the canonical id).
21
+ */
22
+ import { readFile } from "node:fs/promises";
23
+ import { join } from "node:path";
24
+ import { parse as parseYaml } from "yaml";
25
+ const ALIASES_FILENAME = join(".sdd", "feature-grounding-aliases.yaml");
26
+ /**
27
+ * Load the optional alias map. Returns `null` when the file is absent
28
+ * — callers treat that as "no aliases, all references must resolve
29
+ * directly against the canonical id." Throws on malformed YAML.
30
+ */
31
+ export async function loadFeatureGroundingAliases(sddPath) {
32
+ const full = join(sddPath, ALIASES_FILENAME);
33
+ let text;
34
+ try {
35
+ text = await readFile(full, "utf-8");
36
+ }
37
+ catch (err) {
38
+ const code = err.code;
39
+ if (code === "ENOENT")
40
+ return null;
41
+ throw err;
42
+ }
43
+ const raw = parseYaml(text);
44
+ if (raw === null || typeof raw !== "object") {
45
+ throw new Error(`${ALIASES_FILENAME}: expected a mapping at the document root`);
46
+ }
47
+ return {
48
+ serviceAliases: toStringMap(raw.service_aliases),
49
+ repoAliases: toStringMap(raw.repo_aliases),
50
+ relPath: ALIASES_FILENAME,
51
+ };
52
+ }
53
+ function toStringMap(raw) {
54
+ const out = new Map();
55
+ if (raw === null || raw === undefined)
56
+ return out;
57
+ if (typeof raw !== "object" || Array.isArray(raw))
58
+ return out;
59
+ for (const [k, v] of Object.entries(raw)) {
60
+ if (typeof v === "string" && v !== "")
61
+ out.set(k, v);
62
+ }
63
+ return out;
64
+ }
65
+ //# sourceMappingURL=feature-grounding-aliases-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feature-grounding-aliases-loader.js","sourceRoot":"","sources":["../../../src/lib/catalogue/feature-grounding-aliases-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAE1C,MAAM,gBAAgB,GAAG,IAAI,CAAC,MAAM,EAAE,gCAAgC,CAAC,CAAC;AAgBxE;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,OAAe;IAEf,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;IAC7C,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACvC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,GAAI,GAA6B,CAAC,IAAI,CAAC;QACjD,IAAI,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QACnC,MAAM,GAAG,CAAC;IACZ,CAAC;IAED,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAsB,CAAC;IACjD,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CACb,GAAG,gBAAgB,2CAA2C,CAC/D,CAAC;IACJ,CAAC;IAED,OAAO;QACL,cAAc,EAAE,WAAW,CAAC,GAAG,CAAC,eAAe,CAAC;QAChD,WAAW,EAAE,WAAW,CAAC,GAAG,CAAC,YAAY,CAAC;QAC1C,OAAO,EAAE,gBAAgB;KAC1B,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAClB,GAAwC;IAExC,MAAM,GAAG,GAAG,IAAI,GAAG,EAAkB,CAAC;IACtC,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,GAAG,CAAC;IAClD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC;IAC9D,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACzC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,EAAE;YAAE,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Loader for the optional `.sdd/service-contract-aliases.yaml` config.
3
+ *
4
+ * Adopters use this map to translate outbound interface display text
5
+ * (as it appears in service-architecture.md External Interfaces tables)
6
+ * into canonical contract names that resolve against contracts.csv.
7
+ *
8
+ * File shape:
9
+ *
10
+ * interface_aliases:
11
+ * # Case-insensitive exact match on the Interface column text.
12
+ * Masternauth service: masternauth-oauth-api
13
+ * CWS: cws-paddington-api
14
+ * Paddington: cws-paddington-api
15
+ *
16
+ * interface_contains:
17
+ * # Case-insensitive substring match. The longest key wins on
18
+ * # ties; ordering in the file otherwise matters only when keys
19
+ * # overlap. Use when adopter interface text has many qualified
20
+ * # variants ("Masternauth API", "Masternauth `/token`", etc.).
21
+ * Masternauth: masternauth-oauth-api
22
+ * Paddington: cws-paddington-api
23
+ *
24
+ * skip_callers:
25
+ * # Repo names to skip entirely (postman collections, smoke tests,
26
+ * # legacy folders inside a federated SDD that aren't runtime
27
+ * # services). Use when the federated SDD lacks a services.csv to
28
+ * # gate emission and consumes rows would otherwise dangle at the
29
+ * # aggregator with unresolved service_id.
30
+ * - postman-tacho
31
+ * - smoke-tests
32
+ *
33
+ * same_product_inference:
34
+ * # Maps generic interface text (case-insensitive exact) to a
35
+ * # contract-name template. `{prefix}` is substituted with the
36
+ * # caller's service_id minus a known suffix (-api, -bff, -ui,
37
+ * # -consumer, -web). The builder then looks up the resolved name
38
+ * # in contracts.csv.
39
+ * Private API: "{prefix}-private-api"
40
+ * Private API Gateway: "{prefix}-private-api"
41
+ *
42
+ * Either block is optional. Empty / missing file = no aliases.
43
+ */
44
+ export interface LoadedServiceContractAliases {
45
+ /** Lowercased interface display text → canonical contract name. */
46
+ readonly interfaceAliases: ReadonlyMap<string, string>;
47
+ /**
48
+ * Lowercased substring → canonical contract name. Sorted longest-first
49
+ * by the loader so resolution picks the most specific match.
50
+ */
51
+ readonly interfaceContains: ReadonlyArray<readonly [string, string]>;
52
+ /** Lowercased interface display text → contract-name template (uses {prefix}). */
53
+ readonly sameProductTemplates: ReadonlyMap<string, string>;
54
+ /** Set of caller (repo) directory names to skip entirely. */
55
+ readonly skipCallers: ReadonlySet<string>;
56
+ /** Path the aliases were loaded from (relative to SDD root). */
57
+ readonly relPath: string;
58
+ }
59
+ export declare function loadServiceContractAliases(sddPath: string): Promise<LoadedServiceContractAliases | null>;
60
+ //# sourceMappingURL=service-contract-aliases-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-contract-aliases-loader.d.ts","sourceRoot":"","sources":["../../../src/lib/catalogue/service-contract-aliases-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AAQH,MAAM,WAAW,4BAA4B;IAC3C,mEAAmE;IACnE,QAAQ,CAAC,gBAAgB,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvD;;;OAGG;IACH,QAAQ,CAAC,iBAAiB,EAAE,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACrE,kFAAkF;IAClF,QAAQ,CAAC,oBAAoB,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3D,6DAA6D;IAC7D,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC1C,gEAAgE;IAChE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AASD,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,4BAA4B,GAAG,IAAI,CAAC,CAyB9C"}