@instruments/materialgraph 0.17.0 → 0.19.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 (63) hide show
  1. package/association-types.d.ts +90 -4
  2. package/associations-client.d.ts +3 -1
  3. package/associations-client.js +4 -0
  4. package/browse-types.d.ts +14 -3
  5. package/by-colour-types.d.ts +24 -6
  6. package/by-spec-types.d.ts +4 -0
  7. package/catalogue-client.d.ts +14 -2
  8. package/catalogue-client.js +23 -0
  9. package/catalogue-types.d.ts +278 -4
  10. package/citation-types.d.ts +34 -0
  11. package/citation-types.js +1 -0
  12. package/client-browse.d.ts +1 -0
  13. package/client-browse.js +1 -0
  14. package/client-vocabulary.d.ts +10 -0
  15. package/client-vocabulary.js +32 -0
  16. package/client.d.ts +28 -62
  17. package/client.js +51 -75
  18. package/composition-types.d.ts +6 -0
  19. package/corpus-scope-types.d.ts +6 -4
  20. package/errors.d.ts +1 -1
  21. package/errors.js +2 -0
  22. package/index.d.ts +6 -0
  23. package/json-value-types.d.ts +8 -0
  24. package/json-value-types.js +1 -0
  25. package/match-types.d.ts +3 -0
  26. package/material-asset-types.d.ts +71 -0
  27. package/material-resources-client.d.ts +18 -0
  28. package/material-resources-client.js +29 -0
  29. package/material-types.d.ts +59 -0
  30. package/operations.d.ts +1 -1
  31. package/operations.js +62 -0
  32. package/package.json +1 -1
  33. package/palette-search-types.d.ts +16 -2
  34. package/query-understanding-types.d.ts +5 -2
  35. package/render-assets-types.d.ts +65 -0
  36. package/render-assets-types.js +1 -0
  37. package/run-events.d.ts +13 -0
  38. package/samplize-catalogue-types.d.ts +92 -0
  39. package/samplize-catalogue-types.js +1 -0
  40. package/schedule-reference-types.d.ts +46 -0
  41. package/schedule-reference-types.js +1 -0
  42. package/schedule-references-client.d.ts +14 -0
  43. package/schedule-references-client.js +26 -0
  44. package/schedule-types.d.ts +34 -0
  45. package/search-collapse-types.d.ts +1 -1
  46. package/search-mood-types.d.ts +6 -0
  47. package/search-mood-types.js +1 -0
  48. package/search-refinement-types.d.ts +5 -0
  49. package/search-request-types.d.ts +29 -11
  50. package/search-response-receipt-types.d.ts +59 -3
  51. package/search-result-validation.js +14 -1
  52. package/search-window-types.d.ts +13 -5
  53. package/slot-pool-types.d.ts +2 -0
  54. package/spec-types.d.ts +6 -1
  55. package/specifications.d.ts +3 -1
  56. package/specifications.js +4 -0
  57. package/substitute-types.d.ts +75 -0
  58. package/substitute-types.js +1 -0
  59. package/suggest-types.d.ts +6 -0
  60. package/suggest-types.js +1 -1
  61. package/taxonomy-coverage-types.d.ts +34 -0
  62. package/taxonomy-coverage-types.js +1 -0
  63. package/types.d.ts +20 -21
package/client.js CHANGED
@@ -5,22 +5,24 @@ import { HttpTransport } from "./http-transport.js";
5
5
  // Aliased to `operation` — the local name every call site here already used.
6
6
  import { resolveOperation as operation, } from "./operations.js";
7
7
  import { cancelRun, capabilities as capabilitiesRun, createRun, drainRunEvents, getRun, getRunSchedule, getSourceMaterialBatch as getSourceMaterialBatchCall, listRuns, resumeRun, streamRunEvents, uploadSourceMaterial, } from "./runs.js";
8
+ import { ScheduleReferencesClient } from "./schedule-references-client.js";
8
9
  // Re-exported whole so `index.ts` and every existing importer keep their path.
9
10
  export * from "./client-config.js";
10
11
  import { browseQuery, createBrowseNamespace, } from "./client-browse.js";
11
12
  import { createExplorationNamespace, } from "./client-exploration.js";
12
13
  import { createSourceMaterialCommentsNamespace, } from "./client-source-material-comments.js";
13
- import { declaredFinishes, declaredProducts } from "./associations-client.js";
14
+ import * as assoc from "./associations-client.js";
14
15
  import { brandColourDeck, brandProfile, listBrands } from "./brands-client.js";
16
+ import { colourFacets as colourFacetsCall, resolveAttribute as resolveAttributeCall, resolveAttributeValue as resolveAttributeValueCall, resolveColour as resolveColourCall, suggest as suggestCall, suggestColour as suggestColourCall, } from "./client-vocabulary.js";
15
17
  import { CodesClient } from "./codes-client.js";
16
18
  import { ColoursClient } from "./colours-client.js";
17
19
  import { slotPools as slotPoolsCall, varyScheme as varySchemeCall, } from "./composition-client.js";
18
20
  import { coordinate as coordinateCall } from "./coordinate-client.js";
19
21
  import { matchStream as matchStreamCall } from "./match-stream.js";
22
+ import { materialAssets as materialAssetsCall, materialRenderAssets as materialRenderAssetsCall, materialBlocks as materialBlocksCall, materialDocuments as materialDocumentsCall, } from "./material-resources-client.js";
20
23
  import { appendProjectEvent as appendProjectEventCall, createProject as createProjectCall, getProject as getProjectCall, listProjects as listProjectsCall, } from "./projects.js";
21
24
  import { resolvePhrasesRequest as resolvePhrases, searchVocabularyRequest, } from "./resolve-client.js";
22
25
  import { SCHEMA_RESOURCE_OPERATION_IDS } from "./schema-resource-types.js";
23
- import { suggestQuery } from "./suggest-types.js";
24
26
  /**
25
27
  * The MaterialGraph client — every lens on the graph, on one object.
26
28
  *
@@ -57,6 +59,7 @@ import { suggestQuery } from "./suggest-types.js";
57
59
  * `./identifiers.ts`), absent is not false, and a page is not a corpus.
58
60
  */
59
61
  export class MaterialGraphClient extends CatalogueClient {
62
+ scheduleReferences;
60
63
  baseUrl;
61
64
  /**
62
65
  * THE QUESTION: "show me everything in this category / this brand, in a plain
@@ -120,6 +123,7 @@ export class MaterialGraphClient extends CatalogueClient {
120
123
  super(transport);
121
124
  this.#transport = transport;
122
125
  this.baseUrl = transport.baseUrl;
126
+ this.scheduleReferences = new ScheduleReferencesClient(transport);
123
127
  this.browse = createBrowseNamespace((params, signal) => this.#get("search_browse_by_colour", browseQuery(params), signal));
124
128
  this.codes = new CodesClient({
125
129
  get: (operationId, query, signal) => this.#get(operationId, query, signal),
@@ -142,10 +146,11 @@ export class MaterialGraphClient extends CatalogueClient {
142
146
  pathParams,
143
147
  });
144
148
  }
145
- #post(operationId, body, signal) {
149
+ #post(operationId, body, signal, pathParams) {
146
150
  return this.#transport.requestJson(operation(operationId), {
147
151
  body,
148
152
  signal,
153
+ pathParams,
149
154
  });
150
155
  }
151
156
  /**
@@ -244,6 +249,8 @@ export class MaterialGraphClient extends CatalogueClient {
244
249
  category: params.category,
245
250
  brand: params.brand,
246
251
  family: params.family,
252
+ order: params.order,
253
+ maxColourDistance: params.maxColourDistance,
247
254
  corpusScope: params.corpusScope,
248
255
  limit: params.limit,
249
256
  }, signal);
@@ -275,27 +282,17 @@ export class MaterialGraphClient extends CatalogueClient {
275
282
  siblings(variantId, signal) {
276
283
  return this.#get("get_material_siblings", undefined, signal, { variantId });
277
284
  }
278
- /**
279
- * THE QUESTION: "what do we actually KNOW about this material, and what have we
280
- * simply not checked?" The only read that distinguishes a determined absence
281
- * from an unasked question — every field carries a `status`, so this is the one
282
- * surface entitled to back a negative ("no fire rating").
283
- * {@link MaterialGraphClient.material} cannot: there an absence is merely unknown.
284
- */
285
285
  materialBlocks(variantId, signal) {
286
- return this.#get("list_material_blocks", undefined, signal, {
287
- variantId,
288
- });
286
+ return materialBlocksCall(this.#transport, variantId, signal);
289
287
  }
290
- /**
291
- * THE QUESTION: "what images and documents may I SHOW for this material?" — the
292
- * redistribution-safe set (GET `/api/v1/materials/{variantId}/assets`), not
293
- * every file on record.
294
- */
295
288
  materialAssets(variantId, signal) {
296
- return this.#get("list_material_assets", undefined, signal, {
297
- variantId,
298
- });
289
+ return materialAssetsCall(this.#transport, variantId, signal);
290
+ }
291
+ materialRenderAssets(variantId, signal) {
292
+ return materialRenderAssetsCall(this.#transport, variantId, signal);
293
+ }
294
+ materialDocuments(variantId, options, signal) {
295
+ return materialDocumentsCall(this.#transport, variantId, options, signal);
299
296
  }
300
297
  /**
301
298
  * THE QUESTION: "what does the schema DEFINE?" — the governed static registry.
@@ -318,7 +315,7 @@ export class MaterialGraphClient extends CatalogueClient {
318
315
  *
319
316
  * READ `item.source` BEFORE PHRASING: the rail mixes three tiers of evidence —
320
317
  * `cospec` (real orders), `considered` (board activity), `colour` (palette
321
- * look-alike). Only `cospec` supports "specified together". `cospecCount` tells
318
+ * look-alike). Only `cospec` supports "sampled together". `cospecCount` tells
322
319
  * you how much of the rail is real order evidence.
323
320
  */
324
321
  pairings(variantId, options, signal) {
@@ -326,13 +323,20 @@ export class MaterialGraphClient extends CatalogueClient {
326
323
  variantId,
327
324
  });
328
325
  }
326
+ /** Find bounded, exact-spec substitutes for one opaque variant id. */
327
+ findSubstitutes(variantId, options = {}, signal) {
328
+ return this.#post("find_material_substitutes", options, signal, { variantId });
329
+ }
329
330
  /** "What finishes does the manufacturer declare for THIS product?" — {@link declaredFinishes}. */
330
331
  associatedFinishes(variantId, options, signal) {
331
- return declaredFinishes(this.#transport, variantId, options, signal);
332
+ return assoc.declaredFinishes(this.#transport, variantId, options, signal);
332
333
  }
333
334
  /** "What products does the manufacturer declare THIS finish for?" — {@link declaredProducts}. */
334
335
  associatedProducts(variantId, options, signal) {
335
- return declaredProducts(this.#transport, variantId, options, signal);
336
+ return assoc.declaredProducts(this.#transport, variantId, options, signal);
337
+ }
338
+ applicability(options, signal) {
339
+ return assoc.applicability(this.#transport, options, signal);
336
340
  }
337
341
  materials(ids, options, signal) {
338
342
  if (ids.length > MAX_BATCH_IDS) {
@@ -354,70 +358,30 @@ export class MaterialGraphClient extends CatalogueClient {
354
358
  idKind: options?.idKind ?? "variantId",
355
359
  }, signal);
356
360
  }
357
- // ── Colour helpers ───────────────────────────────────────────────────────────
358
- /**
359
- * THE QUESTION: "what colour WORDS may I use?" — family, mood and undertone
360
- * with live counts. Vocabulary, not values: instead use `colours.profiles()`
361
- * for a category's palette, {@link MaterialGraphClient.byColour} to search by a
362
- * colour, {@link MaterialGraphClient.resolveColour} to turn a NAME into a hex.
363
- */
361
+ /** Vocabulary families and counts; use `colours.profiles()` for a material palette. */
364
362
  colourFacets(signal) {
365
- return this.#get("get_colour_facets", undefined, signal);
363
+ return colourFacetsCall(this.#transport, signal);
366
364
  }
367
- /**
368
- * THE QUESTION: "what hex is 'Hague Blue'?" — the step before
369
- * {@link MaterialGraphClient.byColour} when you hold a name rather than a hex.
370
- * A `null` match means unrecognised, not "no such colour".
371
- */
365
+ /** Resolve a colour name to its canonical hex when recognised. */
372
366
  resolveColour(name, signal) {
373
- return this.#get("resolve_colour_name", { name }, signal);
367
+ return resolveColourCall(this.#transport, name, signal);
374
368
  }
375
369
  /** Ranked colour-name typeahead (GET `/api/v1/search/colours/suggest`). */
376
370
  suggestColour(q, options, signal) {
377
- return this.#get("suggest_colour_names", { q, limit: options?.limit }, signal);
371
+ return suggestColourCall(this.#transport, q, options, signal);
378
372
  }
379
- /**
380
- * THE QUESTION: "what is the user starting to type?" It ranks NAMES, not
381
- * materials — instead use {@link MaterialGraphClient.search} once they commit,
382
- * {@link MaterialGraphClient.suggestColour} for colour names, and
383
- * {@link MaterialGraphClient.searchVocabulary} for attribute/value tokens.
384
- *
385
- * Entity typeahead across products, brands and categories
386
- * (GET `/api/v1/search/suggest`). Built for per-keystroke use: one indexed
387
- * lookup, no embedding call and no model. Every suggestion carries the
388
- * `refId` it resolves to — a product id, a brand slug, or a product-type key
389
- * — so selecting one should navigate to that entity rather than re-running
390
- * `label` as a search.
391
- *
392
- * @example
393
- * const { suggestions } = await client.suggest("carr", { kind: "product" });
394
- */
373
+ /** Entity typeahead. Navigate using the selected `refId`; use `search()` for materials. */
395
374
  suggest(q, options, signal) {
396
- return this.#get("search_suggest", suggestQuery(q, options), signal);
375
+ return suggestCall(this.#transport, q, options, signal);
397
376
  }
398
377
  // ── Catalog ──────────────────────────────────────────────────────────────────
399
- /**
400
- * THE QUESTION: "the user said 'fire rating' — which canonical attribute is
401
- * that?" Free text in, canonical `attributeId`s out; pair with
402
- * {@link MaterialGraphClient.resolveAttributeValue} for the VALUE, then spend
403
- * the pair on {@link MaterialGraphClient.bySpec} or `search({ filters })`.
404
- * Instead use {@link MaterialGraphClient.specificationFacets} to browse rather
405
- * than resolve.
406
- */
378
+ /** Resolve free text to a canonical attribute id. */
407
379
  resolveAttribute(q, options, signal) {
408
- return this.#get("catalog_resolve_attribute", { q, limit: options?.limit, facetableOnly: options?.facetableOnly }, signal);
380
+ return resolveAttributeCall(this.#transport, q, options, signal);
409
381
  }
410
- /**
411
- * THE QUESTION: "the user said 'class A' — what canonical term is that, under
412
- * THIS attribute?" The value half of the pair
413
- * {@link MaterialGraphClient.resolveAttribute} starts. Read
414
- * `resolution.recommendedAction`, not just `best`: `ambiguous` means ask.
415
- *
416
- * @param attributeId Canonical vocabulary, not an opaque id — discover it, do
417
- * not invent it.
418
- */
382
+ /** Resolve a value under a canonical attribute id; inspect `recommendedAction` for ambiguity. */
419
383
  resolveAttributeValue(attributeId, query, options, signal) {
420
- return this.#get("catalog_resolve_value", { q: query, limit: options?.limit }, signal, { attributeId });
384
+ return resolveAttributeValueCall(this.#transport, attributeId, query, options, signal);
421
385
  }
422
386
  /** "Is this phrase an attribute or a value?" — see {@link searchVocabularyRequest}. */
423
387
  searchVocabulary(query, options, signal) {
@@ -466,6 +430,14 @@ export class MaterialGraphClient extends CatalogueClient {
466
430
  taxonomy(signal) {
467
431
  return this.#get("get_category_taxonomy", undefined, signal);
468
432
  }
433
+ /**
434
+ * Exact current primary-type status counts by retained source category path.
435
+ * `comparisonThreshold` is a reporting cutoff only: it never promotes a
436
+ * proposal into an accepted category.
437
+ */
438
+ productTypeCoverage(options, signal) {
439
+ return this.#get("get_product_type_status_coverage", options, signal);
440
+ }
469
441
  /**
470
442
  * THE QUESTION: "what is this key allowed to do?" Check `scopes` before
471
443
  * offering a capability: the write surfaces need `mg:ingest` / `mg:compose`,
@@ -685,6 +657,10 @@ export class MaterialGraphClient extends CatalogueClient {
685
657
  runSchedule(runId, options) {
686
658
  return getRunSchedule(this.#transport, runId, options);
687
659
  }
660
+ /** Follow a verdict cell's citation handle to its canonical claim source. */
661
+ citation(citationId, signal) {
662
+ return this.#get("get_verdict_citation", undefined, signal, { citationId });
663
+ }
688
664
  /**
689
665
  * Resume a suspended Run (POST `/api/v1/runs/{runId}/resume`).
690
666
  *
@@ -12,6 +12,7 @@
12
12
  * TOLERANT-PARSING CONTRACT: response enums are widened with {@link OpenEnum}
13
13
  * so a new server value still type-checks; objects are read structurally.
14
14
  */
15
+ import type { VerdictCitation } from "./citation-types.js";
15
16
  import type { RunId, SchemeId, SlotId, VariantId } from "./identifiers.js";
16
17
  import type { OpenEnum } from "./types.js";
17
18
  /**
@@ -158,6 +159,7 @@ export interface CompositionMatch {
158
159
  value?: string | null;
159
160
  /** Why an `unverified` cell missed the trust bar (MG-627), else null. */
160
161
  trustGap?: "below_confidence" | "basis_unmet" | "proposed" | null;
162
+ citation?: VerdictCitation;
161
163
  }
162
164
  /** One slot's chosen material plus the reason it was picked. */
163
165
  export interface CompositionPick {
@@ -303,6 +305,10 @@ export interface ReviewProgrammeSuspendPayload {
303
305
  element?: SlotElement;
304
306
  category?: string;
305
307
  categorySource?: SlotCategorySource;
308
+ /** Criteria grounding exhausted its one bounded retry; absent otherwise. */
309
+ groundingFailure?: {
310
+ reason: "criteria-resolution-failed";
311
+ };
306
312
  provenance: ProgrammeProvenance;
307
313
  }>;
308
314
  /**
@@ -29,19 +29,21 @@ import { type OpenEnum } from "./types.js";
29
29
  * `"all"` (and absence) is the WHOLE GRAPH — every material MaterialGraph
30
30
  * knows, orderable or not. Absence is never a narrower default.
31
31
  *
32
- * Three members gate on CHANNEL membership, which is what "can someone buy
33
- * this" means: `"materialBankNaOrderable"` (Material Bank North America),
32
+ * Four members gate on governed CHANNEL membership:
33
+ * `"materialBankNaOrderable"` (Material Bank North America),
34
34
  * `"materialBankEuOrderable"` (Material Bank Europe) and
35
35
  * `"designShopOrderable"` (DesignShop, with the products DesignShop hides from
36
36
  * browse excluded).
37
+ * `"materialBankNaAndCatalogue"` is a single producer-side union of Material
38
+ * Bank North America and governed Catalogue channel membership.
37
39
  *
38
40
  * `"materialBankOrderable"` is NOT one of them, despite the name. It selects
39
41
  * materials carrying a Material Bank identity — PROVENANCE, not a storefront —
40
42
  * and admits about 98% of the graph. Use it to exclude the crawl-sourced brands
41
43
  * that were never in the Material Bank feed; if you mean orderable, use one of
42
- * the three above.
44
+ * the channel-backed scopes above.
43
45
  */
44
- export type CorpusScope = OpenEnum<"all" | "designShopOrderable" | "materialBankEuOrderable" | "materialBankNaOrderable" | "materialBankOrderable">;
46
+ export type CorpusScope = OpenEnum<"samplizeCatalogue" | "all" | "designShopOrderable" | "materialBankEuOrderable" | "materialBankNaAndCatalogue" | "materialBankNaOrderable" | "materialBankOrderable">;
45
47
  /**
46
48
  * The corpus a response AND its counts were drawn from. Present only when a
47
49
  * narrowing scope applied — absence means the whole graph. Read it alongside
package/errors.d.ts CHANGED
@@ -89,7 +89,7 @@ interface TransportErrorInput extends MaterialGraphRequestMetadata {
89
89
  * member to a problem response means adding it here too, and
90
90
  * `problem-extension-parity.test.ts` fails when the two disagree.
91
91
  */
92
- export declare const MATERIALGRAPH_PROBLEM_EXTENSIONS: readonly ["content_length", "did_you_mean", "empty_brands", "limit_bytes", "missing_env", "orderable_attributes", "populated_alternatives", "unknown_attributes", "unknown_brands", "unknown_fields", "unorderable_attribute", "valid_group_keys", "valid_type_keys"];
92
+ export declare const MATERIALGRAPH_PROBLEM_EXTENSIONS: readonly ["ambiguous_brands", "brand_candidates", "content_length", "did_you_mean", "empty_brands", "limit_bytes", "missing_env", "orderable_attributes", "populated_alternatives", "unknown_attributes", "unknown_brands", "unknown_fields", "unorderable_attribute", "valid_group_keys", "valid_type_keys"];
93
93
  /** The one error class thrown by all SDK transport and HTTP failures. */
94
94
  export declare class MaterialGraphError extends Error {
95
95
  readonly kind: MaterialGraphErrorKind;
package/errors.js CHANGED
@@ -23,6 +23,8 @@ const RETRIABLE_STATUS = new Set([502, 503, 504]);
23
23
  * `problem-extension-parity.test.ts` fails when the two disagree.
24
24
  */
25
25
  export const MATERIALGRAPH_PROBLEM_EXTENSIONS = [
26
+ "ambiguous_brands",
27
+ "brand_candidates",
26
28
  "content_length",
27
29
  "did_you_mean",
28
30
  "empty_brands",
package/index.d.ts CHANGED
@@ -7,6 +7,7 @@ export type * from "./exploration-types.js";
7
7
  export { TERMINAL_RUN_EVENT_TYPES } from "./run-types.js";
8
8
  export type * from "./run-types.js";
9
9
  export type * from "./schedule-types.js";
10
+ export type * from "./citation-types.js";
10
11
  export { VARY_AXES } from "./composition-types.js";
11
12
  export type * from "./composition-types.js";
12
13
  export type * from "./slot-pool-types.js";
@@ -36,10 +37,15 @@ export type * from "./association-types.js";
36
37
  export type * from "./brand-types.js";
37
38
  export type * from "./fan-deck-types.js";
38
39
  export type * from "./material-asset-types.js";
40
+ export type * from "./render-assets-types.js";
39
41
  export type * from "./material-block-types.js";
40
42
  export type * from "./schema-resource-types.js";
43
+ export type * from "./taxonomy-coverage-types.js";
44
+ export type * from "./schedule-reference-types.js";
45
+ export type * from "./substitute-types.js";
41
46
  export type * from "./search-refinement-types.js";
42
47
  export type * from "./search-window-types.js";
43
48
  export { CERTIFICATION_PROGRAMME_ATTRIBUTE_ID } from "./spec-types.js";
44
49
  export type * from "./spec-types.js";
45
50
  export { certificationProgramme, certificationProgrammeCriterion, hasSpec, specCriterion, specRangeCriterion, specTerm, } from "./specifications.js";
51
+ export type { SamplizePublicationSource, SamplizeLrvObservation, SamplizeDemand, SamplizeCollectionMembership, SamplizeCatalogueOptions, SamplizeCataloguePage, SamplizeCatalogueProduct, SamplizeHexObservation, } from "./samplize-catalogue-types.js";
@@ -0,0 +1,8 @@
1
+ /**
2
+ * A JSON value, recursively — exactly what survives a `jsonb` round-trip
3
+ * unchanged. Used where a payload's SHAPE belongs to its producer but its values
4
+ * must still be JSON: `Date`, `bigint`, `undefined`, and functions are not.
5
+ */
6
+ export type JsonValue = string | number | boolean | null | JsonValue[] | {
7
+ [key: string]: JsonValue;
8
+ };
@@ -0,0 +1 @@
1
+ export {};
package/match-types.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import type { CorpusScope } from "./corpus-scope-types.js";
1
2
  /**
2
3
  * @module sdk/match-types
3
4
  * @description The buffered Material Match request and response, hand-mirrored
@@ -92,6 +93,8 @@ export interface MatchInput {
92
93
  */
93
94
  includeBelowFloor?: boolean;
94
95
  requestedType?: OpenEnum<"swatch" | "installation" | "flatplan">;
96
+ /** Corpus to retrieve candidates from, applied inside retrieval. */
97
+ corpusScope?: CorpusScope;
95
98
  /** Hard spec gates forwarded verbatim to the inner search — term match or presence, each with an optional trust bar. */
96
99
  filters?: SearchFilter[];
97
100
  /** Soft criteria (rank-never-exclude). A miss demotes within the page but never removes a hit. */
@@ -39,10 +39,79 @@ export interface MaterialAssetProjectionDownload {
39
39
  fileExtension: string | null;
40
40
  filename: string | null;
41
41
  }
42
+ export type MaterialDocumentStatus = OpenEnum<"downloaded" | "linked_not_downloaded" | "unavailable_source" | "dead_link" | "failed_ingest">;
43
+ export type MaterialDocumentCoverageState = OpenEnum<"available" | "none_declared" | "not_ingested" | "unavailable_source" | "dead_link" | "failed_ingest">;
44
+ export interface MaterialDocumentScope {
45
+ kind: "product" | "variant";
46
+ id: string;
47
+ }
48
+ export interface MaterialDocumentSource {
49
+ /** Opaque, public identifier for one source collection; never a PIM/DAM path. */
50
+ id: string;
51
+ authority: string;
52
+ revision: string;
53
+ }
54
+ export interface MaterialDocumentProjectionItem {
55
+ id: string;
56
+ scope: MaterialDocumentScope & {
57
+ inherited: boolean;
58
+ };
59
+ declaredScopes: MaterialDocumentScope[];
60
+ variantAttribution: string[];
61
+ /** True only for a Product declaration or this exact requested Variant. */
62
+ appliesToRequestedVariant: boolean;
63
+ /** Every exact source-grain declaration collapsed into this URL identity. */
64
+ declarations: Array<{
65
+ scope: MaterialDocumentScope;
66
+ source: MaterialDocumentSource;
67
+ status: MaterialDocumentStatus;
68
+ readable: boolean;
69
+ }>;
70
+ documentType: string | null;
71
+ originalName: string;
72
+ status: MaterialDocumentStatus;
73
+ /** Null for unavailable, dead, or failed source documents. */
74
+ url: string | null;
75
+ contentType: string | null;
76
+ fileExtension: string | null;
77
+ source: MaterialDocumentSource;
78
+ }
79
+ export interface MaterialDocumentCoverageSource {
80
+ scope: MaterialDocumentScope;
81
+ state: MaterialDocumentCoverageState;
82
+ exact: boolean;
83
+ declaredCount: number | null;
84
+ readableCount: number;
85
+ source: MaterialDocumentSource;
86
+ }
87
+ export interface MaterialDocumentCoverage {
88
+ productUnion: MaterialDocumentCoverageSummary;
89
+ requestedVariant: MaterialDocumentCoverageSummary;
90
+ sources: MaterialDocumentCoverageSource[];
91
+ }
92
+ export interface MaterialDocumentCoverageSummary {
93
+ state: MaterialDocumentCoverageState;
94
+ exact: boolean;
95
+ declaredCount: number | null;
96
+ readableCount: number;
97
+ }
98
+ export interface MaterialDocumentPageOptions {
99
+ cursor?: string;
100
+ limit?: number;
101
+ }
102
+ export interface MaterialDocumentPage {
103
+ variantId: VariantId;
104
+ documents: MaterialDocumentProjectionItem[];
105
+ coverage: MaterialDocumentCoverage;
106
+ totalDocuments: number;
107
+ nextCursor: string | null;
108
+ }
42
109
  /** Tallies over what this projection returned — never a claim about the brand's own library. */
43
110
  export interface MaterialAssetProjectionSummary {
44
111
  imageCount: number;
45
112
  downloadCount: number;
113
+ documentCount: number;
114
+ readableDocumentCount: number;
46
115
  downloadedImageCount: number;
47
116
  }
48
117
  export interface MaterialAssetProjection {
@@ -50,5 +119,7 @@ export interface MaterialAssetProjection {
50
119
  variantId: VariantId;
51
120
  images: MaterialAssetProjectionImage[];
52
121
  downloads: MaterialAssetProjectionDownload[];
122
+ documents: MaterialDocumentProjectionItem[];
123
+ documentCoverage: MaterialDocumentCoverage;
53
124
  summary: MaterialAssetProjectionSummary;
54
125
  }
@@ -0,0 +1,18 @@
1
+ /** Material blocks, safe assets, and technical documents over one shared transport. */
2
+ import { HttpTransport } from "./http-transport.js";
3
+ import type { VariantId } from "./identifiers.js";
4
+ import type { MaterialAssetProjection, MaterialDocumentPage, MaterialDocumentPageOptions } from "./material-asset-types.js";
5
+ import type { MaterialBlockProjection } from "./material-block-types.js";
6
+ import type { MaterialRenderAssets } from "./render-assets-types.js";
7
+ /** Read known and explicitly unobserved canonical material fields. */
8
+ export declare function materialBlocks(transport: HttpTransport, variantId: VariantId, signal?: AbortSignal): Promise<MaterialBlockProjection>;
9
+ /** Read only redistribution-safe images and downloads for a material. */
10
+ export declare function materialAssets(transport: HttpTransport, variantId: VariantId, signal?: AbortSignal): Promise<MaterialAssetProjection>;
11
+ /** Read the accepted render-ready appearance projection, or an explicit unavailable reason. */
12
+ export declare function materialRenderAssets(transport: HttpTransport, variantId: VariantId, signal?: AbortSignal): Promise<MaterialRenderAssets>;
13
+ /**
14
+ * Read the owning Product's URL-deduplicated document page. Variant declarations
15
+ * retain exact attribution; consumers inspect `appliesToRequestedVariant`
16
+ * before presenting a sibling Variant declaration as applicable.
17
+ */
18
+ export declare function materialDocuments(transport: HttpTransport, variantId: VariantId, options?: MaterialDocumentPageOptions, signal?: AbortSignal): Promise<MaterialDocumentPage>;
@@ -0,0 +1,29 @@
1
+ /** Material blocks, safe assets, and technical documents over one shared transport. */
2
+ import { HttpTransport } from "./http-transport.js";
3
+ import { resolveOperation } from "./operations.js";
4
+ /** Read known and explicitly unobserved canonical material fields. */
5
+ export function materialBlocks(transport, variantId, signal) {
6
+ return transport.requestJson(resolveOperation("list_material_blocks"), { signal, pathParams: { variantId } });
7
+ }
8
+ /** Read only redistribution-safe images and downloads for a material. */
9
+ export function materialAssets(transport, variantId, signal) {
10
+ return transport.requestJson(resolveOperation("list_material_assets"), { signal, pathParams: { variantId } });
11
+ }
12
+ /** Read the accepted render-ready appearance projection, or an explicit unavailable reason. */
13
+ export function materialRenderAssets(transport, variantId, signal) {
14
+ return transport.requestJson(resolveOperation("get_material_render_assets"), { signal, pathParams: { variantId } });
15
+ }
16
+ /**
17
+ * Read the owning Product's URL-deduplicated document page. Variant declarations
18
+ * retain exact attribution; consumers inspect `appliesToRequestedVariant`
19
+ * before presenting a sibling Variant declaration as applicable.
20
+ */
21
+ export function materialDocuments(transport, variantId, options, signal) {
22
+ return transport.requestJson(resolveOperation("list_material_documents"), {
23
+ query: options
24
+ ? { cursor: options.cursor, limit: options.limit }
25
+ : undefined,
26
+ signal,
27
+ pathParams: { variantId },
28
+ });
29
+ }
@@ -57,6 +57,8 @@ export interface MaterialSuccessor {
57
57
  * successor record — read the detail projection for that.
58
58
  */
59
59
  export interface MaterialTile {
60
+ /** Accepted sampleability fact. Absent means unknown, never false. */
61
+ sampleable?: boolean;
60
62
  /** Opaque — round-trip verbatim into every other material read. */
61
63
  variantId: VariantId;
62
64
  brand: string;
@@ -87,6 +89,27 @@ export interface MaterialTile {
87
89
  export interface MaterialFacet {
88
90
  attributeId: string;
89
91
  term: string;
92
+ /**
93
+ * Whether this value identifies the variant or specifies its performance /
94
+ * composition. Present on current responses; optional for captured older
95
+ * payloads. Only `specification` facets are valid inputs to `bySpec`.
96
+ */
97
+ role?: "identity" | "specification";
98
+ }
99
+ /** A retained product-type proposal. It is review evidence, never a category. */
100
+ export interface ProposedProductType {
101
+ id: string;
102
+ displayName: string;
103
+ confidence: number | null;
104
+ /** Canonical source URL when the proposal retained one; null when it did not. */
105
+ sourceUrl: string | null;
106
+ isPrimary: boolean;
107
+ scope: "variant" | "product";
108
+ }
109
+ /** Accepted display categories remain separate from this review-state receipt. */
110
+ export interface ProductTypeReceipt {
111
+ state: "accepted" | "proposed" | "unknown";
112
+ proposedProductTypes: ProposedProductType[];
90
113
  }
91
114
  /**
92
115
  * One dimensional configuration of a material. Numeric fields are millimetres
@@ -132,7 +155,43 @@ export interface MaterialDetail extends MaterialTile {
132
155
  sourceStatus?: "provisional";
133
156
  installationImageUrl: string | null;
134
157
  displayCategory: string | null;
158
+ productTypeReceipt: ProductTypeReceipt;
135
159
  categoryPath: string[];
160
+ /** Durable state of image-colour extraction and its variant projection. */
161
+ colourEvidence: {
162
+ status: "no_eligible_asset";
163
+ } | {
164
+ status: "extractor_not_run";
165
+ origin: {
166
+ assetId: string;
167
+ method: "colorscope_primary_image";
168
+ };
169
+ } | {
170
+ status: "available";
171
+ basis: "palette" | "palette_and_dominant_oklab" | "dominant_oklab";
172
+ extractedAt: string;
173
+ extractionVersion: string | null;
174
+ origin: {
175
+ assetId: string;
176
+ method: "colorscope_primary_image";
177
+ };
178
+ } | {
179
+ status: "projection_missing";
180
+ extractedAt: string;
181
+ extractionVersion: string | null;
182
+ origin: {
183
+ assetId: string;
184
+ method: "colorscope_primary_image";
185
+ };
186
+ } | {
187
+ status: "genuinely_colourless";
188
+ extractedAt: string;
189
+ extractionVersion: string | null;
190
+ origin: {
191
+ assetId: string;
192
+ method: "colorscope_primary_image";
193
+ };
194
+ };
136
195
  /** Extracted from imagery — visual likeness, never a declared colour spec. */
137
196
  palette: PaletteSwatch[];
138
197
  /** What is ON RECORD. An absent attribute is unrecorded, never known-false. */
package/operations.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export declare const MATERIALGRAPH_API_VERSION = "0.7.0";
2
- declare const OPERATION_DEFINITIONS: readonly [readonly ["catalogs", "GET", "/api/v1/catalogs", "list_catalog_documents"], readonly ["catalogReferences", "GET", "/api/v1/catalogs/{catalogId}/references", "list_catalog_product_references"], readonly ["search", "POST", "/api/v1/search", "search_materials_post"], readonly ["planQuery", "POST", "/api/v1/search/plan", "plan_material_query"], readonly ["searchGet", "GET", "/api/v1/search", "search_materials_get"], readonly ["match", "POST", "/api/v1/search/match", "match_material"], readonly ["byColour", "GET", "/api/v1/search/colours", "search_by_colour"], readonly ["material", "GET", "/api/v1/materials/{variantId}", "get_material"], readonly ["catalogueReferences", "POST", "/api/v1/catalogues/references", "get_catalogue_references_batch"], readonly ["catalogueDocumentAccess", "GET", "/api/v1/catalogues/documents/{documentId}", "get_catalogue_document_access"], readonly ["siblings", "GET", "/api/v1/materials/{variantId}/siblings", "get_material_siblings"], readonly ["materialBlocks", "GET", "/api/v1/materials/{variantId}/blocks", "list_material_blocks"], readonly ["materialAssets", "GET", "/api/v1/materials/{variantId}/assets", "list_material_assets"], readonly ["exploration.operators", "GET", "/api/v1/materials/{variantId}/operators", "list_material_operators"], readonly ["exploration.candidates", "POST", "/api/v1/materials/{variantId}/candidates", "read_material_candidates"], readonly ["schema", "GET", "/api/v1/schema/blocks", "list_schema_blocks"], readonly ["schema", "GET", "/api/v1/schema/attributes", "list_schema_attributes"], readonly ["schema", "GET", "/api/v1/schema/verticals", "list_schema_verticals"], readonly ["schema", "GET", "/api/v1/schema/product-types", "list_schema_product_types"], readonly ["schema", "GET", "/api/v1/schema/units", "list_schema_units"], readonly ["schema", "GET", "/api/v1/schema/value-dictionaries", "list_schema_value_dictionaries"], readonly ["schema", "GET", "/api/v1/schema/source-requirements", "list_schema_source_requirements"], readonly ["schema", "GET", "/api/v1/schema/product-type-templates", "list_schema_product_type_templates"], readonly ["schema", "GET", "/api/v1/schema/mappings", "list_schema_mappings"], readonly ["pairings", "GET", "/api/v1/materials/{variantId}/pairings", "get_material_pairings"], readonly ["associatedFinishes", "GET", "/api/v1/associated/finishes", "list_associated_finishes"], readonly ["associatedProducts", "GET", "/api/v1/associated/products", "list_associated_products"], readonly ["materials", "POST", "/api/v1/materials/batch", "get_materials_batch_post"], readonly ["materialsCached", "GET", "/api/v1/materials/batch", "get_materials_batch_get"], readonly ["browse", "GET", "/api/v1/search/browse", "search_browse_by_colour"], readonly ["colourFacets", "GET", "/api/v1/colours/facets", "get_colour_facets"], readonly ["colours.profiles", "GET", "/api/v1/colours/profiles", "get_category_colour_profiles"], readonly ["colours.stats", "GET", "/api/v1/colours/stats", "get_colour_stats"], readonly ["resolveColour", "GET", "/api/v1/search/colours/resolve", "resolve_colour_name"], readonly ["suggestColour", "GET", "/api/v1/search/colours/suggest", "suggest_colour_names"], readonly ["suggest", "GET", "/api/v1/search/suggest", "search_suggest"], readonly ["resolveAttribute", "GET", "/api/v1/catalog/attributes/resolve", "catalog_resolve_attribute"], readonly ["resolveAttributeValue", "GET", "/api/v1/catalog/attributes/{attributeId}/values/resolve", "catalog_resolve_value"], readonly ["searchVocabulary", "GET", "/api/v1/catalog/vocabulary/search", "catalog_vocabulary_search"], readonly ["resolve", "POST", "/api/v1/resolve", "resolve_phrases"], readonly ["bySpec", "GET", "/api/v1/search/specifications", "catalog_by_spec"], readonly ["taxonomy", "GET", "/api/v1/taxonomy/categories", "get_category_taxonomy"], readonly ["whoami", "GET", "/api/v1/whoami", "whoami"], readonly ["coordinate", "POST", "/api/v1/pairings/coordinate", "coordinate_materials"], readonly ["demand", "GET", "/api/v1/demand", "get_material_demand"], readonly ["colours.palette", "POST", "/api/v1/search/palettes", "search_by_palette"], readonly ["extractPalette", "POST", "/api/v1/search/palettes/extract", "extract_image_palette"], readonly ["colours.gradient", "POST", "/api/v1/search/gradients", "search_by_gradient"], readonly ["specificationFacets", "GET", "/api/v1/catalog/specifications/facets", "list_spec_facets"], readonly ["attributeValues", "GET", "/api/v1/catalog/attributes/{attributeId}/values", "list_attribute_values"], readonly ["applicableSpecs", "GET", "/api/v1/taxonomy/categories/{key}/specs", "get_applicable_specs"], readonly ["glossary", "GET", "/api/v1/glossary/{term}", "explain_material_term"], readonly ["brands", "GET", "/api/v1/brands", "list_brands"], readonly ["brand", "GET", "/api/v1/brands/{brandSlug}", "get_brand_profile"], readonly ["brandColourDeck", "GET", "/api/v1/brands/{brandSlug}/colours", "brand_colour_deck"], readonly ["uploadSourceMaterial", "POST", "/api/v1/source-material", "upload_source_material"], readonly ["sourceMaterialBatch", "GET", "/api/v1/source-material/{batchId}", "get_source_material_batch"], readonly ["sourceMaterialComments", "GET", "/api/v1/source-material/{batchId}/sources/{sourceId}/comments", "list_source_material_comments"], readonly ["sourceMaterialComments", "POST", "/api/v1/source-material/{batchId}/sources/{sourceId}/comments", "post_source_material_comment"], readonly ["capabilities", "GET", "/api/v1/capabilities", "list_public_capabilities"], readonly ["createRun", "POST", "/api/v1/runs", "create_public_run"], readonly ["listRuns", "GET", "/api/v1/runs", "list_public_runs"], readonly ["run", "GET", "/api/v1/runs/{runId}", "get_public_run"], readonly ["runSchedule", "GET", "/api/v1/runs/{runId}/schedule", "get_run_finish_schedule"], readonly ["streamRunEvents", "GET", "/api/v1/runs/{runId}/events", "list_public_run_events"], readonly ["resumeRun", "POST", "/api/v1/runs/{runId}/resume", "resume_public_run"], readonly ["cancelRun", "POST", "/api/v1/runs/{runId}/cancel", "cancel_public_run"], readonly ["varyScheme", "POST", "/api/v1/schemes/vary", "vary_schemes"], readonly ["slotPools", "POST", "/api/v1/schemes/pools", "slot_pools"], readonly ["createProject", "POST", "/api/v1/projects", "create_box_project"], readonly ["listProjects", "GET", "/api/v1/projects", "list_box_projects"], readonly ["getProject", "GET", "/api/v1/projects/{projectId}", "get_box_project"], readonly ["appendProjectEvent", "POST", "/api/v1/projects/{projectId}/events", "append_box_project_event"], readonly ["demandBatch", "POST", "/api/v1/demand/batch", "get_demand_batch"], readonly ["codeAdvisory", "POST", "/api/v1/codes/advisory", "resolveCodeAdvisory"], readonly ["codes.context", "GET", "/api/v1/codes/context", "list_code_context"], readonly ["codes.requirements", "GET", "/api/v1/codes/requirements", "list_code_requirements"]];
2
+ declare const OPERATION_DEFINITIONS: readonly [readonly ["scheduleReferences.list", "GET", "/api/v1/schedules/{scheduleId}/references", "list_schedule_reference_feedback"], readonly ["scheduleReferences.put", "PUT", "/api/v1/schedules/{scheduleId}/references/{referenceId}", "put_schedule_reference_feedback"], readonly ["catalogs", "GET", "/api/v1/catalogs", "list_catalog_documents"], readonly ["catalogPages", "GET", "/api/v1/catalogs/{catalogId}/pages", "list_catalog_pages"], readonly ["catalogPageRepresentation", "GET", "/api/v1/catalog-pages/{pageId}/representation", "get_catalog_page_representation"], readonly ["catalogReferences", "GET", "/api/v1/catalogs/{catalogId}/references", "list_catalog_product_references"], readonly ["search", "POST", "/api/v1/search", "search_materials_post"], readonly ["planQuery", "POST", "/api/v1/search/plan", "plan_material_query"], readonly ["samplizeCatalogue", "GET", "/api/v1/catalogues/samplize/products", "samplize_catalogue_products"], readonly ["searchGet", "GET", "/api/v1/search", "search_materials_get"], readonly ["match", "POST", "/api/v1/search/match", "match_material"], readonly ["byColour", "GET", "/api/v1/search/colours", "search_by_colour"], readonly ["material", "GET", "/api/v1/materials/{variantId}", "get_material"], readonly ["catalogueReferences", "POST", "/api/v1/catalogues/references", "get_catalogue_references_batch"], readonly ["catalogueCollections", "GET", "/api/v1/catalogues/collections", "list_catalogue_channel_collections"], readonly ["catalogueDocumentAccess", "GET", "/api/v1/catalogues/documents/{documentId}", "get_catalogue_document_access"], readonly ["siblings", "GET", "/api/v1/materials/{variantId}/siblings", "get_material_siblings"], readonly ["materialBlocks", "GET", "/api/v1/materials/{variantId}/blocks", "list_material_blocks"], readonly ["materialAssets", "GET", "/api/v1/materials/{variantId}/assets", "list_material_assets"], readonly ["materialRenderAssets", "GET", "/api/v1/materials/{variantId}/render-assets", "get_material_render_assets"], readonly ["materialDocuments", "GET", "/api/v1/materials/{variantId}/documents", "list_material_documents"], readonly ["exploration.operators", "GET", "/api/v1/materials/{variantId}/operators", "list_material_operators"], readonly ["exploration.candidates", "POST", "/api/v1/materials/{variantId}/candidates", "read_material_candidates"], readonly ["schema", "GET", "/api/v1/schema/blocks", "list_schema_blocks"], readonly ["schema", "GET", "/api/v1/schema/attributes", "list_schema_attributes"], readonly ["schema", "GET", "/api/v1/schema/verticals", "list_schema_verticals"], readonly ["schema", "GET", "/api/v1/schema/product-types", "list_schema_product_types"], readonly ["schema", "GET", "/api/v1/schema/units", "list_schema_units"], readonly ["schema", "GET", "/api/v1/schema/value-dictionaries", "list_schema_value_dictionaries"], readonly ["schema", "GET", "/api/v1/schema/source-requirements", "list_schema_source_requirements"], readonly ["schema", "GET", "/api/v1/schema/product-type-templates", "list_schema_product_type_templates"], readonly ["schema", "GET", "/api/v1/schema/mappings", "list_schema_mappings"], readonly ["pairings", "GET", "/api/v1/materials/{variantId}/pairings", "get_material_pairings"], readonly ["findSubstitutes", "POST", "/api/v1/materials/{variantId}/substitutes", "find_material_substitutes"], readonly ["associatedFinishes", "GET", "/api/v1/associated/finishes", "list_associated_finishes"], readonly ["associatedProducts", "GET", "/api/v1/associated/products", "list_associated_products"], readonly ["applicability", "GET", "/api/v1/applicability", "get_applicability"], readonly ["materials", "POST", "/api/v1/materials/batch", "get_materials_batch_post"], readonly ["materialsCached", "GET", "/api/v1/materials/batch", "get_materials_batch_get"], readonly ["browse", "GET", "/api/v1/search/browse", "search_browse_by_colour"], readonly ["colourFacets", "GET", "/api/v1/colours/facets", "get_colour_facets"], readonly ["colours.profiles", "GET", "/api/v1/colours/profiles", "get_category_colour_profiles"], readonly ["colours.stats", "GET", "/api/v1/colours/stats", "get_colour_stats"], readonly ["resolveColour", "GET", "/api/v1/search/colours/resolve", "resolve_colour_name"], readonly ["suggestColour", "GET", "/api/v1/search/colours/suggest", "suggest_colour_names"], readonly ["suggest", "GET", "/api/v1/search/suggest", "search_suggest"], readonly ["resolveAttribute", "GET", "/api/v1/catalog/attributes/resolve", "catalog_resolve_attribute"], readonly ["resolveAttributeValue", "GET", "/api/v1/catalog/attributes/{attributeId}/values/resolve", "catalog_resolve_value"], readonly ["searchVocabulary", "GET", "/api/v1/catalog/vocabulary/search", "catalog_vocabulary_search"], readonly ["resolve", "POST", "/api/v1/resolve", "resolve_phrases"], readonly ["bySpec", "GET", "/api/v1/search/specifications", "catalog_by_spec"], readonly ["taxonomy", "GET", "/api/v1/taxonomy/categories", "get_category_taxonomy"], readonly ["productTypeCoverage", "GET", "/api/v1/taxonomy/coverage", "get_product_type_status_coverage"], readonly ["whoami", "GET", "/api/v1/whoami", "whoami"], readonly ["coordinate", "POST", "/api/v1/pairings/coordinate", "coordinate_materials"], readonly ["demand", "GET", "/api/v1/demand", "get_material_demand"], readonly ["colours.palette", "POST", "/api/v1/search/palettes", "search_by_palette"], readonly ["extractPalette", "POST", "/api/v1/search/palettes/extract", "extract_image_palette"], readonly ["colours.gradient", "POST", "/api/v1/search/gradients", "search_by_gradient"], readonly ["specificationFacets", "GET", "/api/v1/catalog/specifications/facets", "list_spec_facets"], readonly ["attributeValues", "GET", "/api/v1/catalog/attributes/{attributeId}/values", "list_attribute_values"], readonly ["applicableSpecs", "GET", "/api/v1/taxonomy/categories/{key}/specs", "get_applicable_specs"], readonly ["glossary", "GET", "/api/v1/glossary/{term}", "explain_material_term"], readonly ["brands", "GET", "/api/v1/brands", "list_brands"], readonly ["brand", "GET", "/api/v1/brands/{brandSlug}", "get_brand_profile"], readonly ["brandColourDeck", "GET", "/api/v1/brands/{brandSlug}/colours", "brand_colour_deck"], readonly ["uploadSourceMaterial", "POST", "/api/v1/source-material", "upload_source_material"], readonly ["sourceMaterialBatch", "GET", "/api/v1/source-material/{batchId}", "get_source_material_batch"], readonly ["sourceMaterialComments", "GET", "/api/v1/source-material/{batchId}/sources/{sourceId}/comments", "list_source_material_comments"], readonly ["sourceMaterialComments", "POST", "/api/v1/source-material/{batchId}/sources/{sourceId}/comments", "post_source_material_comment"], readonly ["capabilities", "GET", "/api/v1/capabilities", "list_public_capabilities"], readonly ["createRun", "POST", "/api/v1/runs", "create_public_run"], readonly ["listRuns", "GET", "/api/v1/runs", "list_public_runs"], readonly ["run", "GET", "/api/v1/runs/{runId}", "get_public_run"], readonly ["runSchedule", "GET", "/api/v1/runs/{runId}/schedule", "get_run_finish_schedule"], readonly ["citation", "GET", "/api/v1/citations/{citationId}", "get_verdict_citation"], readonly ["streamRunEvents", "GET", "/api/v1/runs/{runId}/events", "list_public_run_events"], readonly ["resumeRun", "POST", "/api/v1/runs/{runId}/resume", "resume_public_run"], readonly ["cancelRun", "POST", "/api/v1/runs/{runId}/cancel", "cancel_public_run"], readonly ["varyScheme", "POST", "/api/v1/schemes/vary", "vary_schemes"], readonly ["slotPools", "POST", "/api/v1/schemes/pools", "slot_pools"], readonly ["createProject", "POST", "/api/v1/projects", "create_box_project"], readonly ["listProjects", "GET", "/api/v1/projects", "list_box_projects"], readonly ["getProject", "GET", "/api/v1/projects/{projectId}", "get_box_project"], readonly ["appendProjectEvent", "POST", "/api/v1/projects/{projectId}/events", "append_box_project_event"], readonly ["demandBatch", "POST", "/api/v1/demand/batch", "get_demand_batch"], readonly ["codeAdvisory", "POST", "/api/v1/codes/advisory", "resolveCodeAdvisory"], readonly ["codes.context", "GET", "/api/v1/codes/context", "list_code_context"], readonly ["codes.requirements", "GET", "/api/v1/codes/requirements", "list_code_requirements"]];
3
3
  export type SdkOperationId = (typeof OPERATION_DEFINITIONS)[number][3];
4
4
  export type SdkOperation = Readonly<{
5
5
  clientMethod: (typeof OPERATION_DEFINITIONS)[number][0];