@instruments/materialgraph 0.24.0 → 0.26.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 (124) hide show
  1. package/association-types.d.ts +20 -20
  2. package/associations-client.d.ts +4 -4
  3. package/associations-client.js +3 -10
  4. package/attribution-types.d.ts +3 -3
  5. package/brand-most-sampled-types.d.ts +4 -4
  6. package/brand-types.d.ts +6 -6
  7. package/brands-client.d.ts +4 -4
  8. package/brands-client.js +9 -13
  9. package/browse-types.d.ts +8 -8
  10. package/by-colour-types.d.ts +18 -18
  11. package/by-spec-types.d.ts +14 -14
  12. package/catalog-discovery-types.d.ts +14 -14
  13. package/catalogue-client.d.ts +4 -4
  14. package/catalogue-client.js +38 -37
  15. package/catalogue-types.d.ts +4 -4
  16. package/citation-types.d.ts +4 -4
  17. package/client-browse.d.ts +4 -4
  18. package/client-browse.js +24 -25
  19. package/client-config.d.ts +2 -2
  20. package/client-exploration.d.ts +3 -3
  21. package/client-exploration.js +4 -6
  22. package/client-source-material-comments.d.ts +4 -4
  23. package/client-source-material-comments.js +4 -38
  24. package/client-vocabulary.d.ts +8 -8
  25. package/client-vocabulary.js +20 -30
  26. package/client.d.ts +11 -45
  27. package/client.js +143 -188
  28. package/codes-client.d.ts +2 -2
  29. package/codes-client.js +8 -8
  30. package/codes-types.d.ts +34 -34
  31. package/colour-aggregate-types.d.ts +24 -24
  32. package/colours-client.d.ts +2 -2
  33. package/colours-client.js +15 -15
  34. package/compare-types.d.ts +10 -10
  35. package/composition-client.d.ts +3 -3
  36. package/composition-client.js +8 -7
  37. package/composition-types.d.ts +12 -12
  38. package/coordinate-client.d.ts +2 -2
  39. package/coordinate-client.js +1 -13
  40. package/corpus-scope-types.d.ts +3 -3
  41. package/corpus-scope-types.js +1 -25
  42. package/correction-types.d.ts +10 -10
  43. package/demand-batch-types.d.ts +18 -18
  44. package/demand-types.d.ts +24 -24
  45. package/errors.d.ts +12 -12
  46. package/errors.js +53 -52
  47. package/exploration-types.d.ts +29 -22
  48. package/fan-deck-types.d.ts +6 -6
  49. package/http-transport.d.ts +13 -21
  50. package/http-transport.js +31 -28
  51. package/identify-types.d.ts +10 -10
  52. package/index.d.ts +0 -6
  53. package/index.js +0 -2
  54. package/match-rejection-types.d.ts +6 -6
  55. package/match-stream-types.d.ts +32 -32
  56. package/match-stream.d.ts +2 -2
  57. package/match-stream.js +55 -41
  58. package/match-types.d.ts +8 -8
  59. package/material-asset-types.d.ts +26 -26
  60. package/material-block-types.d.ts +6 -6
  61. package/material-query-plan-types.d.ts +26 -26
  62. package/material-resources-client.d.ts +5 -5
  63. package/material-resources-client.js +10 -20
  64. package/material-types.d.ts +12 -12
  65. package/ndjson.js +16 -8
  66. package/operations.d.ts +6 -6
  67. package/operations.js +9 -39
  68. package/package.json +2 -2
  69. package/palette-completion-types.d.ts +22 -22
  70. package/palette-search-types.d.ts +28 -28
  71. package/query-understanding-types.d.ts +43 -36
  72. package/render-assets-types.d.ts +8 -8
  73. package/resolve-client.d.ts +2 -2
  74. package/resolve-client.js +4 -6
  75. package/resolve-colour-types.d.ts +22 -6
  76. package/resolve-types.d.ts +10 -10
  77. package/run-types.d.ts +70 -70
  78. package/runs.d.ts +13 -26
  79. package/runs.js +77 -89
  80. package/samplize-catalogue-types.d.ts +18 -18
  81. package/samplize-colorvec.d.ts +20 -20
  82. package/samplize-colorvec.js +66 -42
  83. package/schema-resource-types.d.ts +38 -38
  84. package/schema-resource-types.js +5 -5
  85. package/search-card-types.d.ts +14 -5
  86. package/search-collapse-types.d.ts +4 -4
  87. package/search-mood-types.d.ts +2 -2
  88. package/search-refinement-types.d.ts +8 -8
  89. package/search-request-types.d.ts +6 -6
  90. package/search-response-receipt-types.d.ts +135 -34
  91. package/search-response-types.d.ts +2 -2
  92. package/search-result-validation.d.ts +3 -3
  93. package/search-result-validation.js +53 -36
  94. package/search-window-types.d.ts +2 -2
  95. package/slot-pool-types.d.ts +20 -20
  96. package/source-material-validation.d.ts +3 -3
  97. package/source-material-validation.js +35 -39
  98. package/spec-facet-types.d.ts +10 -10
  99. package/spec-types.d.ts +6 -6
  100. package/specifications.d.ts +9 -25
  101. package/specifications.js +15 -21
  102. package/sse.d.ts +2 -2
  103. package/sse.js +32 -16
  104. package/substitute-types.d.ts +22 -22
  105. package/suggest-types.d.ts +7 -7
  106. package/suggest-types.js +3 -3
  107. package/taxonomy-coverage-types.d.ts +8 -8
  108. package/types.d.ts +119 -119
  109. package/validation.d.ts +26 -26
  110. package/validation.js +97 -92
  111. package/webmcp.d.ts +2 -2
  112. package/webmcp.generated.js +94 -87
  113. package/project-types.d.ts +0 -79
  114. package/project-types.js +0 -9
  115. package/projects.d.ts +0 -13
  116. package/projects.js +0 -46
  117. package/run-events.d.ts +0 -106
  118. package/run-events.js +0 -32
  119. package/schedule-reference-types.d.ts +0 -46
  120. package/schedule-reference-types.js +0 -1
  121. package/schedule-references-client.d.ts +0 -14
  122. package/schedule-references-client.js +0 -26
  123. package/schedule-types.d.ts +0 -261
  124. package/schedule-types.js +0 -1
package/types.d.ts CHANGED
@@ -1,4 +1,3 @@
1
- export type { SearchResponse } from "./search-response-types.js";
2
1
  import type { ResponseAttribution } from "./attribution-types.js";
3
2
  import type { BySpecVerdict } from "./by-spec-types.js";
4
3
  /**
@@ -36,6 +35,7 @@ import type { MoodInterpretation } from "./search-mood-types.js";
36
35
  import type { SearchDisambiguation, SearchSuggestion } from "./search-refinement-types.js";
37
36
  import type { CompoundColourConstraintReceipt, CompoundFormConstraintReceipt, SearchExecutionPlan, SearchMode, SearchRefinementReceipt, SearchRerankReport, SearchResponseExplainReceipts } from "./search-response-receipt-types.js";
38
37
  import type { SearchWindowReceipt } from "./search-window-types.js";
38
+ export type { SearchResponse } from "./search-response-types.js";
39
39
  export type * from "./search-response-receipt-types.js";
40
40
  export type { MoodInterpretation } from "./search-mood-types.js";
41
41
  export type OpenEnum<T extends string> = T | (string & {});
@@ -44,7 +44,7 @@ export type { JsonValue } from "./json-value-types.js";
44
44
  * One palette swatch of a material's main image — colour DERIVED FROM PRODUCT
45
45
  * IMAGERY, so read it as visual likeness, never as a declared colour spec.
46
46
  */
47
- export interface PaletteSwatch {
47
+ export type PaletteSwatch = {
48
48
  hex: string;
49
49
  proportion: number;
50
50
  /** Stored human colour name for the swatch, when one was extracted. */
@@ -56,21 +56,21 @@ export interface PaletteSwatch {
56
56
  * derived here" — never "achromatic".
57
57
  */
58
58
  oklab?: OklabTriple;
59
- }
59
+ };
60
60
  /** Loose colour metadata for a search result's main image; every field is independently optional. */
61
- export interface ColourMeta {
61
+ export type ColourMeta = {
62
62
  mood?: string;
63
63
  dominantFamily?: string;
64
64
  dominantHex?: string;
65
- }
65
+ };
66
66
  /** OKLab triple. */
67
- export interface OklabTriple {
67
+ export type OklabTriple = {
68
68
  l: number;
69
69
  a: number;
70
70
  b: number;
71
- }
71
+ };
72
72
  /** The material's dominant-colour block (tile/detail projections). */
73
- export interface MaterialColour {
73
+ export type MaterialColour = {
74
74
  dominantHex: string | null;
75
75
  hsl: {
76
76
  h: number;
@@ -80,12 +80,12 @@ export interface MaterialColour {
80
80
  oklab: OklabTriple | null;
81
81
  chroma: number | null;
82
82
  vibrancy: number | null;
83
- }
83
+ };
84
84
  /** Where the served image came from. */
85
85
  export type ImageSource = OpenEnum<"r2" | "origin">;
86
86
  export type { DimensionEntry, MaterialAvailability, MaterialDetail, MaterialFacet, MaterialSuccessor, MaterialTile, SiblingTile, } from "./material-types.js";
87
87
  /** Per-signal scores, present on a result when `explain` was requested. */
88
- export interface SearchResultSignals {
88
+ export type SearchResultSignals = {
89
89
  /** Voyage similarity in the dedicated variant text-portrait space. */
90
90
  portrait?: number | null;
91
91
  image: number | null;
@@ -94,9 +94,9 @@ export interface SearchResultSignals {
94
94
  lexical: number | null;
95
95
  /** Compatibility slot for retired seeded secondary scoring; currently null. */
96
96
  text: number | null;
97
- }
97
+ };
98
98
  /** An accepted/measured visual meaning — descriptive evidence, never a ranking cause. */
99
- export interface VisualMeaning {
99
+ export type VisualMeaning = {
100
100
  id: string;
101
101
  label: string;
102
102
  values: string[];
@@ -105,7 +105,7 @@ export interface VisualMeaning {
105
105
  sourceBasis?: string;
106
106
  version?: string;
107
107
  appliedAt?: string;
108
- }
108
+ };
109
109
  /**
110
110
  * One material in a search / match result list.
111
111
  *
@@ -115,7 +115,7 @@ export interface VisualMeaning {
115
115
  * answer is "no". A missing `retired` is not "still current"; a missing
116
116
  * `visualMeanings` is not "this material has no visual meaning".
117
117
  */
118
- export interface SearchResultItem {
118
+ export type SearchResultItem = {
119
119
  /** This hit's attribution key — see {@link ResponseAttribution}. Opaque. */
120
120
  resultId?: string;
121
121
  /** Accepted sampleability fact. Absent means unknown, never false. */
@@ -266,7 +266,7 @@ export interface SearchResultItem {
266
266
  * attribute rather than a list of candidates.
267
267
  */
268
268
  attributes?: Record<string, string | string[] | null>;
269
- }
269
+ };
270
270
  /**
271
271
  * A feed total with its honesty basis — THE CLAIM ABOUT THE MATCH SET, which is
272
272
  * a different number from `results.length` (this page).
@@ -285,29 +285,29 @@ export interface SearchResultItem {
285
285
  * A response with no `counts` at all states no total: `count: true` is opt-in,
286
286
  * and the absence of a total is not a total of zero.
287
287
  */
288
- export interface CountedTotal {
288
+ export type CountedTotal = {
289
289
  value: number;
290
290
  basis: OpenEnum<"exact" | "lowerBound">;
291
- }
291
+ };
292
292
  /**
293
293
  * Feed counts — present ONLY under `count:true` or `collapse:"product"`. This is
294
294
  * the corpus-level claim; `results.length` is the page. Never report one as the
295
295
  * other.
296
296
  */
297
- export interface SearchCounts {
297
+ export type SearchCounts = {
298
298
  variants: CountedTotal;
299
299
  products?: CountedTotal;
300
- }
300
+ };
301
301
  /**
302
302
  * One value within a facet's counts: the CANONICAL token (send it back verbatim
303
303
  * as a filter term), its display label, and how many variants in the counted
304
304
  * set carry it.
305
305
  */
306
- export interface SearchFacetValue {
306
+ export type SearchFacetValue = {
307
307
  value: string;
308
308
  label: string;
309
309
  variants: number;
310
- }
310
+ };
311
311
  /**
312
312
  * One facet's counts. `basis` is the honesty label, and — per the negotiated
313
313
  * MG-1010 contract — its union is CLOSED: exactly `"exact"` or `"lowerBound"`,
@@ -318,11 +318,11 @@ export interface SearchFacetValue {
318
318
  * pool-counted value is NEVER `exact`. `truncated` is ALWAYS present: true
319
319
  * when more distinct values existed beyond the reported list.
320
320
  */
321
- export interface SearchFacetCount {
321
+ export type SearchFacetCount = {
322
322
  values: SearchFacetValue[];
323
323
  truncated: boolean;
324
324
  basis: "exact" | "lowerBound";
325
- }
325
+ };
326
326
  /**
327
327
  * A requested facet that was not counted, with its reason: `"unsupported"` —
328
328
  * the id is known but facet counting does not cover it; `"timeout"` — the
@@ -330,22 +330,22 @@ export interface SearchFacetCount {
330
330
  * rail could not count; the page is intact). Render it as "couldn't count",
331
331
  * never as zero.
332
332
  */
333
- export interface SearchAbsentFacet {
333
+ export type SearchAbsentFacet = {
334
334
  facetId: string;
335
335
  reason: OpenEnum<"unsupported" | "timeout">;
336
- }
336
+ };
337
337
  /**
338
338
  * Per-query facet counts (MG-1010) — present ONLY when the request sent
339
339
  * `facetCounts`. `counts` is keyed by requested facet id; every requested
340
340
  * facet not in `absent` has an entry, including empty ones. `poolSize` is
341
341
  * present exactly when the counts are pool-derived.
342
342
  */
343
- export interface SearchFacets {
343
+ export type SearchFacets = {
344
344
  poolSize?: number;
345
345
  requested: string[];
346
346
  absent: SearchAbsentFacet[];
347
347
  counts: Record<string, SearchFacetCount>;
348
- }
348
+ };
349
349
  /**
350
350
  * The search response envelope. `view` discriminates the `results` union:
351
351
  * `"full"` (default) carries {@link SearchResultItem}s, `"card"` the lean
@@ -358,7 +358,7 @@ export interface SearchFacets {
358
358
  * you asked for it. Follow `cursor` for the rest. "I found 24 materials" is
359
359
  * wrong whenever `limit` was 24.
360
360
  */
361
- export interface SearchData extends SearchResponseExplainReceipts {
361
+ export type SearchData = {
362
362
  /** Result attribution — see {@link ResponseAttribution}. `basis` is `mode` verbatim here. */
363
363
  attribution?: ResponseAttribution;
364
364
  view: OpenEnum<"full" | "card">;
@@ -410,6 +410,7 @@ export interface SearchData extends SearchResponseExplainReceipts {
410
410
  facets?: SearchFacets;
411
411
  /** Receipt that narrows the exact finalized pool behind lower-bound facets. */
412
412
  refinement?: SearchRefinementReceipt;
413
+ /** One or more sentences written for a person; absent when there is nothing to say. */
413
414
  note?: string;
414
415
  timings?: Record<string, number>;
415
416
  /** A detected mood term overridden by a stronger colour reading. */
@@ -438,51 +439,51 @@ export interface SearchData extends SearchResponseExplainReceipts {
438
439
  query?: Record<string, unknown>;
439
440
  /** A `getVariantBrief` echo of the seed variant, present only in `variantId` seed mode. */
440
441
  seed?: MaterialTile | Record<string, unknown>;
441
- }
442
+ } & SearchResponseExplainReceipts;
442
443
  export type ColourDictionaryId = OpenEnum<"colour_family" | "colour_mood" | "colour_undertone">;
443
- export interface ColourFacetTerm {
444
+ export type ColourFacetTerm = {
444
445
  id: string;
445
446
  label: string;
446
447
  aliases: string[];
447
448
  variants: number;
448
449
  brands: number;
449
- }
450
- export interface ColourFacetDictionary {
450
+ };
451
+ export type ColourFacetDictionary = {
451
452
  attributeId: ColourDictionaryId;
452
453
  name: string;
453
454
  description: string;
454
455
  terms: ColourFacetTerm[];
455
- }
456
- export interface ColourFacetsResponse {
456
+ };
457
+ export type ColourFacetsResponse = {
457
458
  count: number;
458
459
  dictionaries: ColourFacetDictionary[];
459
- }
460
- export interface CategoryNode {
460
+ };
461
+ export type CategoryNode = {
461
462
  key: string;
462
463
  name: string;
463
464
  parentKey: string | null;
464
465
  path: string;
465
466
  level: OpenEnum<"group" | "type">;
466
- }
467
- export interface TaxonomyResponse {
467
+ };
468
+ export type TaxonomyResponse = {
468
469
  count: number;
469
470
  categories: CategoryNode[];
470
- }
471
- export interface DemandMomentum {
471
+ };
472
+ export type DemandMomentum = {
472
473
  state: OpenEnum<"rising" | "fading" | "stable" | "emerging" | "insufficient_volume">;
473
474
  percentChange: number | null;
474
475
  trailingSpecCount: number;
475
476
  priorSpecCount: number;
476
- }
477
- export interface CompanionDemand {
477
+ };
478
+ export type CompanionDemand = {
478
479
  specCount: number;
479
480
  projectCount: number;
480
481
  momentum: DemandMomentum | null;
481
- }
482
- export interface ProjectTypeShare {
482
+ };
483
+ export type ProjectTypeShare = {
483
484
  projectType: string;
484
485
  projectCount: number;
485
- }
486
+ };
486
487
  /**
487
488
  * A pairing item from the behavioural arm — real order evidence, or board
488
489
  * curation when this seed has no order edges.
@@ -499,7 +500,7 @@ export interface ProjectTypeShare {
499
500
  *
500
501
  * See {@link ColourPairing} for the third, non-evidential arm.
501
502
  */
502
- export interface CospecPairing {
503
+ export type CospecPairing = {
503
504
  /** The evidence tier. `cospec` = orders; `considered` = boards. Read it before phrasing. */
504
505
  source: "cospec" | "considered";
505
506
  /** Opaque — round-trip verbatim. */
@@ -536,29 +537,29 @@ export interface CospecPairing {
536
537
  topProjectTypes: ProjectTypeShare[];
537
538
  /** Graph-owned colour ranking facts, present only for an explicitly ordered rail. */
538
539
  ranking?: PairingRanking;
539
- }
540
+ };
540
541
  /**
541
542
  * A pairing item topped up from colour palette-similarity — a LOOK-ALIKE, not
542
543
  * evidence. Nobody ordered these together and nobody boarded them together; the
543
544
  * palettes sit near each other in OKLab. Say "shares a palette with" and never
544
545
  * "specified together" or "often paired with".
545
546
  */
546
- export interface ColourPairing extends MaterialTile {
547
+ export type ColourPairing = {
547
548
  source: "colour";
548
549
  score: number;
549
550
  /** Graph-owned colour ranking facts, present only for an explicitly ordered rail. */
550
551
  ranking?: PairingRanking;
551
- }
552
+ } & MaterialTile;
552
553
  export type PairingOrderMode = "relevance" | "lightness_asc" | "lightness_desc";
553
554
  export type PairingCorpus = "all" | "material_bank";
554
- export interface PairingRanking {
555
+ export type PairingRanking = {
555
556
  anchorColourSimilarity: number | null;
556
557
  lightness: number | null;
557
558
  anchorColourSimilarityMeasurable: boolean;
558
559
  lightnessMeasurable: boolean;
559
560
  basis: OpenEnum<"dominant_colour_oklab">;
560
- }
561
- export interface PairingOrdering {
561
+ };
562
+ export type PairingOrdering = {
562
563
  requested: OpenEnum<PairingOrderMode>;
563
564
  applied: OpenEnum<PairingOrderMode>;
564
565
  direction: OpenEnum<"ascending" | "descending">;
@@ -570,14 +571,14 @@ export interface PairingOrdering {
570
571
  };
571
572
  missingValues: OpenEnum<"last">;
572
573
  tieBreak: OpenEnum<"variantId_asc">;
573
- }
574
+ };
574
575
  /**
575
576
  * One pairing, discriminated by `source` into three tiers of very different
576
577
  * strength: `cospec` (real orders) > `considered` (board activity) > `colour`
577
578
  * (palette look-alike). Branch on `source` before you write a sentence about it.
578
579
  */
579
580
  export type PairingItem = CospecPairing | ColourPairing;
580
- export interface PairingsResponse {
581
+ export type PairingsResponse = {
581
582
  seed: MaterialTile;
582
583
  /** A rail, not a ranked corpus — mixed evidence tiers, capped by `limit`. */
583
584
  items: PairingItem[];
@@ -598,70 +599,70 @@ export interface PairingsResponse {
598
599
  ordering?: PairingOrdering;
599
600
  /** Opaque continuation bound to the seed, filters, corpus, and order. */
600
601
  nextCursor?: Cursor;
601
- }
602
- export interface MaterialResponse {
602
+ };
603
+ export type MaterialResponse = {
603
604
  material: MaterialDetail;
604
605
  /** Present only when `include: "siblings"` was requested. */
605
606
  siblings?: SiblingTile[];
606
- }
607
- export interface SiblingsResponse {
607
+ };
608
+ export type SiblingsResponse = {
608
609
  siblings: SiblingTile[];
609
- }
610
+ };
610
611
  /**
611
612
  * Batch read of tile projections. `materials` is NOT positional — resolve by
612
613
  * `variantId`, and read `missingIds` rather than inferring absence from length.
613
614
  */
614
- export interface MaterialsBatchTileResponse {
615
+ export type MaterialsBatchTileResponse = {
615
616
  materials: MaterialTile[];
616
617
  /** Requested ids that resolved to nothing. Echoed verbatim, opaque. */
617
618
  missingIds: VariantId[];
618
- }
619
+ };
619
620
  /**
620
621
  * Batch read of detail projections. `materials` is NOT positional — resolve by
621
622
  * `variantId`, and read `missingIds` rather than inferring absence from length.
622
623
  */
623
- export interface MaterialsBatchDetailResponse {
624
+ export type MaterialsBatchDetailResponse = {
624
625
  materials: MaterialDetail[];
625
626
  /** Requested ids that resolved to nothing. Echoed verbatim, opaque. */
626
627
  missingIds: VariantId[];
627
- }
628
- export interface SuggestColourResponse {
629
- suggestions: Array<{
628
+ };
629
+ export type SuggestColourResponse = {
630
+ suggestions: {
630
631
  term: string;
631
632
  hex: string;
632
633
  libraryId?: string;
633
634
  kind: string;
634
- }>;
635
- }
636
- export interface AttributeCandidate {
635
+ }[];
636
+ };
637
+ export type AttributeCandidate = {
637
638
  attributeId: string;
638
639
  name: string;
639
640
  description: string;
640
641
  score: number;
641
642
  facetable: boolean;
642
643
  blockIds: string[];
643
- }
644
- export interface ResolveAttributeResponse {
644
+ };
645
+ export type ResolveAttributeResponse = {
645
646
  query: string;
646
647
  candidates: AttributeCandidate[];
647
- }
648
+ };
648
649
  export type * from "./catalog-discovery-types.js";
649
650
  export type * from "./resolve-types.js";
650
651
  export type * from "./resolve-colour-types.js";
651
652
  export type * from "./suggest-types.js";
652
653
  export type * from "./by-spec-types.js";
653
- export interface WhoamiResponse {
654
+ export type WhoamiResponse = {
654
655
  principal: string;
655
656
  scopes: string[];
656
- }
657
+ };
657
658
  /** A single colour entry in a search palette — exactly one of `hex` or `name`. */
658
- export interface ColourInput {
659
+ export type ColourInput = {
659
660
  hex?: string;
660
661
  name?: string;
661
662
  weight?: number;
662
663
  role?: OpenEnum<"any" | "is" | "accent">;
663
664
  sourceName?: string;
664
- }
665
+ };
665
666
  /** A raw incoming image to search by. */
666
667
  export type SearchImageInput = {
667
668
  type: "url";
@@ -672,7 +673,7 @@ export type SearchImageInput = {
672
673
  };
673
674
  export type { SearchGetParams, SearchInput } from "./search-request-types.js";
674
675
  /** Options for a batch material read. */
675
- export interface MaterialsBatchOptions {
676
+ export type MaterialsBatchOptions = {
676
677
  /** Projection depth. `tile` omits fields rather than reporting them absent. */
677
678
  view?: "tile" | "detail";
678
679
  /**
@@ -682,9 +683,9 @@ export interface MaterialsBatchOptions {
682
683
  * `missingIds`, not an error.
683
684
  */
684
685
  idKind?: OpenEnum<"variantId" | "materialBankId">;
685
- }
686
+ };
686
687
  /** Options for a pairings read. */
687
- export interface PairingsOptions {
688
+ export type PairingsOptions = {
688
689
  /** Comma-separated coarse category display names; filters both arms. */
689
690
  categories?: string;
690
691
  /** Page size, 1–24 inclusive (default 12). The server rejects (400), not clamps, values outside this range. */
@@ -697,14 +698,14 @@ export interface PairingsOptions {
697
698
  corpus?: PairingCorpus;
698
699
  /** The previous response's `nextCursor`, passed back verbatim. */
699
700
  cursor?: Cursor;
700
- }
701
+ };
701
702
  /** Options for `catalog/attributes/resolve`. */
702
- export interface ResolveAttributeOptions {
703
+ export type ResolveAttributeOptions = {
703
704
  limit?: number;
704
705
  facetableOnly?: boolean;
705
- }
706
+ };
706
707
  /** Options for `search/specifications`. */
707
- export interface BySpecOptions {
708
+ export type BySpecOptions = {
708
709
  limit?: number;
709
710
  /**
710
711
  * Numeric range criteria as `attribute:min..max` strings, ANDed with the
@@ -713,14 +714,14 @@ export interface BySpecOptions {
713
714
  * token with neither is refused by the server rather than matching everything.
714
715
  */
715
716
  ranges?: string[];
716
- }
717
+ };
717
718
  export type * from "./demand-types.js";
718
719
  /** One quarter's tally. Sparse across a series — an absent quarter is not a zero. */
719
- export interface DemandQuarter {
720
+ export type DemandQuarter = {
720
721
  quarter: string;
721
722
  specCount: number;
722
723
  projectCount: number;
723
- }
724
+ };
724
725
  /**
725
726
  * Which behavioural signal a demand read is scoped to — and therefore what a
726
727
  * number drawn from it may honestly be called.
@@ -736,12 +737,12 @@ export interface DemandQuarter {
736
737
  */
737
738
  export type DemandSignal = OpenEnum<"sampled" | "considered" | "specified">;
738
739
  export type * from "./demand-batch-types.js";
739
- export interface ExtractedPalette {
740
- colors: Array<{
740
+ export type ExtractedPalette = {
741
+ colors: {
741
742
  hex: string;
742
743
  name: string;
743
744
  proportion: number;
744
- }>;
745
+ }[];
745
746
  dominant: {
746
747
  family: string;
747
748
  hex: string;
@@ -749,24 +750,24 @@ export interface ExtractedPalette {
749
750
  oklch: string;
750
751
  } | null;
751
752
  mood: string;
752
- }
753
- export interface ExtractPaletteResponse {
753
+ };
754
+ export type ExtractPaletteResponse = {
754
755
  palette: ExtractedPalette | null;
755
- }
756
+ };
756
757
  export type * from "./spec-facet-types.js";
757
- export interface ApplicableSpecAttribute {
758
+ export type ApplicableSpecAttribute = {
758
759
  id: string;
759
760
  name: string;
760
761
  valueKind: string;
761
762
  required: boolean;
762
- }
763
- export interface ApplicableSpecBlock {
763
+ };
764
+ export type ApplicableSpecBlock = {
764
765
  blockId: string;
765
766
  name: string;
766
767
  applicability: OpenEnum<"required" | "recommended" | "optional" | "unusual">;
767
768
  attributes: ApplicableSpecAttribute[];
768
- }
769
- export interface ApplicableSpecsResponse {
769
+ };
770
+ export type ApplicableSpecsResponse = {
770
771
  found: boolean;
771
772
  productType: {
772
773
  id: string;
@@ -774,8 +775,8 @@ export interface ApplicableSpecsResponse {
774
775
  } | null;
775
776
  blocks: ApplicableSpecBlock[];
776
777
  hint?: string;
777
- }
778
- export interface GlossaryAttributeMatch {
778
+ };
779
+ export type GlossaryAttributeMatch = {
779
780
  kind: "attribute";
780
781
  id: string;
781
782
  name: string;
@@ -786,8 +787,8 @@ export interface GlossaryAttributeMatch {
786
787
  comparable: boolean;
787
788
  dictionaryId?: string;
788
789
  usedInBlocks: string[];
789
- }
790
- export interface GlossaryValueMatch {
790
+ };
791
+ export type GlossaryValueMatch = {
791
792
  kind: "value";
792
793
  id: string;
793
794
  label: string;
@@ -796,18 +797,18 @@ export interface GlossaryValueMatch {
796
797
  dictionaryId: string;
797
798
  dictionaryName: string;
798
799
  attributeIds: string[];
799
- }
800
- export interface GlossaryTermResponse {
800
+ };
801
+ export type GlossaryTermResponse = {
801
802
  found: boolean;
802
803
  term: string;
803
804
  match: GlossaryAttributeMatch | GlossaryValueMatch | null;
804
- alternates?: Array<{
805
+ alternates?: {
805
806
  kind: OpenEnum<"attribute" | "value">;
806
807
  id: string;
807
808
  label: string;
808
- }>;
809
- }
810
- export interface BrandProfile {
809
+ }[];
810
+ };
811
+ export type BrandProfile = {
811
812
  id: string;
812
813
  slug: string;
813
814
  name: string;
@@ -823,34 +824,33 @@ export interface BrandProfile {
823
824
  foundedYear: number | null;
824
825
  description: string | null;
825
826
  website: string | null;
826
- }
827
- export interface BrandProfileResponse {
827
+ };
828
+ export type BrandProfileResponse = {
828
829
  found: boolean;
829
830
  query: string;
830
831
  brand: BrandProfile | null;
831
832
  /** Trade / spec signals ON RECORD, keyed by attribute id. Absent = no value held (never infer false). */
832
833
  trade: Record<string, boolean | string>;
833
- links: Array<{
834
+ links: {
834
835
  label: string;
835
836
  url: string;
836
- }>;
837
- alternates: Array<{
837
+ }[];
838
+ alternates: {
838
839
  id: string;
839
840
  name: string;
840
- }>;
841
- }
841
+ }[];
842
+ };
842
843
  /** Body for `POST /api/v1/search/palettes/extract`. */
843
- export interface ExtractPaletteInput {
844
+ export type ExtractPaletteInput = {
844
845
  /** The query image as a data URI or bare base64 string. */
845
846
  image: string;
846
847
  /** Max palette swatches to return (default 6). */
847
848
  max?: number;
848
- }
849
+ };
849
850
  /** Options for a cacheable GET batch read (`materialsCached`). */
850
- export interface MaterialsBatchGetOptions extends MaterialsBatchOptions {
851
- }
851
+ export type MaterialsBatchGetOptions = MaterialsBatchOptions;
852
852
  /** Options for `brands/{brandSlug}`. */
853
- export interface BrandOptions {
853
+ export type BrandOptions = {
854
854
  /** Alternate fuzzy query; takes precedence over the path slug when present. */
855
855
  q?: string;
856
- }
856
+ };