@purveyors/sdk 0.32.0 → 0.33.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -2275,6 +2275,121 @@ interface paths {
2275
2275
  patch?: never;
2276
2276
  trace?: never;
2277
2277
  };
2278
+ "/v1/catalog/map": {
2279
+ parameters: {
2280
+ query?: never;
2281
+ header?: never;
2282
+ path?: never;
2283
+ cookie?: never;
2284
+ };
2285
+ /**
2286
+ * Map projection over the caller-visible catalog
2287
+ * @description Returns deterministic lightweight clusters and place features after applying the canonical catalog visibility, filters, and entitlement policy. Global unique/unplaced totals remain separate from viewport placement totals; multi-origin placement counts are intentionally non-additive. Public/demo callers receive country/region-safe features, while canonical place navigation, bounding boxes, and elevation profiles require member or paid API access. These catalog routes require a Supabase session JWT or Parchment API key. For entitlement-gated params, strict callers (non-demo API keys, bearer-session JWTs) receive a 401/403; lenient callers (first-party cookie-session and the configured public-demo API key) get the params stripped with a `meta.notices` entry. Send `Prefer: handling=strict` to opt into strict enforcement; `Prefer: handling=lenient` is honored only for callers already lenient-eligible and cannot downgrade a strict caller's enforcement.
2288
+ */
2289
+ get: {
2290
+ parameters: {
2291
+ query?: {
2292
+ stocked?: "true" | "false" | "all";
2293
+ showWholesale?: "true" | "false";
2294
+ wholesaleOnly?: "true" | "false";
2295
+ origin?: string;
2296
+ continent?: string;
2297
+ country?: string | string[];
2298
+ region?: string;
2299
+ source?: string | string[];
2300
+ name?: string;
2301
+ processing?: string;
2302
+ variety?: string;
2303
+ type?: string;
2304
+ grade?: string;
2305
+ appearance?: string;
2306
+ supplier?: string;
2307
+ dryingMethod?: string;
2308
+ flavorKeywords?: string | string[];
2309
+ arrivalDate?: string;
2310
+ stockedDate?: string;
2311
+ stockedDays?: number;
2312
+ coffeeIds?: string;
2313
+ scoreValueMin?: number | null;
2314
+ scoreValueMax?: number | null;
2315
+ pricePerLbMin?: number | null;
2316
+ pricePerLbMax?: number | null;
2317
+ elevationMinMasl?: number | null;
2318
+ elevationMaxMasl?: number | null;
2319
+ processing_base_method?: string;
2320
+ fermentation_type?: string;
2321
+ process_additive?: string;
2322
+ has_additives?: "true" | "false";
2323
+ processing_disclosure_level?: string;
2324
+ processing_confidence_min?: number | null;
2325
+ place_id?: string;
2326
+ bbox?: string;
2327
+ zoom?: number;
2328
+ lens?: "catalog" | "elevation";
2329
+ };
2330
+ header?: {
2331
+ Prefer?: string;
2332
+ };
2333
+ path?: never;
2334
+ cookie?: never;
2335
+ };
2336
+ requestBody?: never;
2337
+ responses: {
2338
+ /** @description Authorized catalog map projection and elevation profile */
2339
+ 200: {
2340
+ headers: {
2341
+ [name: string]: unknown;
2342
+ };
2343
+ content: {
2344
+ "application/json": components["schemas"]["CatalogMapResponse"];
2345
+ };
2346
+ };
2347
+ /** @description Malformed map geometry, zoom, place id, or elevation range */
2348
+ 400: {
2349
+ headers: {
2350
+ [name: string]: unknown;
2351
+ };
2352
+ content: {
2353
+ "application/json": components["schemas"]["ErrorResponse"];
2354
+ };
2355
+ };
2356
+ /** @description Authentication required */
2357
+ 401: {
2358
+ headers: {
2359
+ [name: string]: unknown;
2360
+ };
2361
+ content: {
2362
+ "application/json": components["schemas"]["ErrorResponse"];
2363
+ };
2364
+ };
2365
+ /** @description Insufficient entitlement (plan or role) */
2366
+ 403: {
2367
+ headers: {
2368
+ [name: string]: unknown;
2369
+ };
2370
+ content: {
2371
+ "application/json": components["schemas"]["ErrorResponse"];
2372
+ };
2373
+ };
2374
+ /** @description Canonical catalog map schema is not deployed or the bounded map capacity is exceeded */
2375
+ 503: {
2376
+ headers: {
2377
+ [name: string]: unknown;
2378
+ };
2379
+ content: {
2380
+ "application/json": components["schemas"]["ErrorResponse"];
2381
+ };
2382
+ };
2383
+ };
2384
+ };
2385
+ put?: never;
2386
+ post?: never;
2387
+ delete?: never;
2388
+ options?: never;
2389
+ head?: never;
2390
+ patch?: never;
2391
+ trace?: never;
2392
+ };
2278
2393
  "/v1/catalog/facets": {
2279
2394
  parameters: {
2280
2395
  query?: never;
@@ -5334,6 +5449,114 @@ interface paths {
5334
5449
  patch?: never;
5335
5450
  trace?: never;
5336
5451
  };
5452
+ "/v1/roasts/batches": {
5453
+ parameters: {
5454
+ query?: never;
5455
+ header?: never;
5456
+ path?: never;
5457
+ cookie?: never;
5458
+ };
5459
+ get?: never;
5460
+ put?: never;
5461
+ /**
5462
+ * Create an owner roast batch
5463
+ * @description Create every roast profile in one named batch atomically. The Idempotency-Key is required and payload-bound: same-key/same-payload retries replay, while changed payloads conflict. Requires an authenticated session, or an owner-bound API key carrying the exact roast:write scope.
5464
+ */
5465
+ post: {
5466
+ parameters: {
5467
+ query?: never;
5468
+ header: {
5469
+ "idempotency-key": string;
5470
+ };
5471
+ path?: never;
5472
+ cookie?: never;
5473
+ };
5474
+ requestBody: {
5475
+ content: {
5476
+ "application/json": components["schemas"]["RoastBatchCreateRequest"];
5477
+ };
5478
+ };
5479
+ responses: {
5480
+ /** @description The complete created roast batch */
5481
+ 201: {
5482
+ headers: {
5483
+ [name: string]: unknown;
5484
+ };
5485
+ content: {
5486
+ "application/json": components["schemas"]["RoastBatchMutationResponse"];
5487
+ };
5488
+ };
5489
+ /** @description Invalid query parameter */
5490
+ 400: {
5491
+ headers: {
5492
+ [name: string]: unknown;
5493
+ };
5494
+ content: {
5495
+ "application/json": components["schemas"]["ErrorResponse"];
5496
+ };
5497
+ };
5498
+ /** @description Authentication required */
5499
+ 401: {
5500
+ headers: {
5501
+ [name: string]: unknown;
5502
+ };
5503
+ content: {
5504
+ "application/json": components["schemas"]["ErrorResponse"];
5505
+ };
5506
+ };
5507
+ /** @description Insufficient entitlement (plan or role) */
5508
+ 403: {
5509
+ headers: {
5510
+ [name: string]: unknown;
5511
+ };
5512
+ content: {
5513
+ "application/json": components["schemas"]["ErrorResponse"];
5514
+ };
5515
+ };
5516
+ /** @description No such coffee lot owned by the caller */
5517
+ 404: {
5518
+ headers: {
5519
+ [name: string]: unknown;
5520
+ };
5521
+ content: {
5522
+ "application/json": components["schemas"]["ErrorResponse"];
5523
+ };
5524
+ };
5525
+ /** @description Write conflict: an If-Match precondition failed */
5526
+ 409: {
5527
+ headers: {
5528
+ [name: string]: unknown;
5529
+ };
5530
+ content: {
5531
+ "application/json": components["schemas"]["ErrorResponse"];
5532
+ };
5533
+ };
5534
+ /** @description Per-user mutation throttle exceeded; retry after a short wait */
5535
+ 429: {
5536
+ headers: {
5537
+ [name: string]: unknown;
5538
+ };
5539
+ content: {
5540
+ "application/json": components["schemas"]["ErrorResponse"];
5541
+ };
5542
+ };
5543
+ /** @description Roast writes are not enabled in this environment */
5544
+ 503: {
5545
+ headers: {
5546
+ [name: string]: unknown;
5547
+ };
5548
+ content: {
5549
+ "application/json": components["schemas"]["ErrorResponse"];
5550
+ };
5551
+ };
5552
+ };
5553
+ };
5554
+ delete?: never;
5555
+ options?: never;
5556
+ head?: never;
5557
+ patch?: never;
5558
+ trace?: never;
5559
+ };
5337
5560
  "/v1/roasts/{id}": {
5338
5561
  parameters: {
5339
5562
  query?: never;
@@ -5587,7 +5810,7 @@ interface paths {
5587
5810
  };
5588
5811
  trace?: never;
5589
5812
  };
5590
- "/v1/roasts/imports": {
5813
+ "/v1/roasts/{id}/live-curve": {
5591
5814
  parameters: {
5592
5815
  query?: never;
5593
5816
  header?: never;
@@ -5595,33 +5818,34 @@ interface paths {
5595
5818
  cookie?: never;
5596
5819
  };
5597
5820
  get?: never;
5598
- put?: never;
5599
5821
  /**
5600
- * Create a roast from an Artisan file
5601
- * @description Parse an Artisan `.alog` file, create a roast profile owned by the caller against one of their green-coffee lots, and persist the imported temperature curve, event markers, and an artisan_import_log entry atomically. Requires an authenticated session, or an owner-bound API key carrying the exact roast:write scope.
5822
+ * Replace an owner roast live curve
5823
+ * @description Atomically replace live temperature samples and all event markers, derive milestone and phase fields upstream, and preserve non-live temperature samples. Optional If-Match protects against lost updates.
5602
5824
  */
5603
- post: {
5825
+ put: {
5604
5826
  parameters: {
5605
5827
  query?: never;
5606
5828
  header?: {
5607
- "idempotency-key"?: string;
5829
+ "if-match"?: string;
5830
+ };
5831
+ path: {
5832
+ id: number;
5608
5833
  };
5609
- path?: never;
5610
5834
  cookie?: never;
5611
5835
  };
5612
5836
  requestBody: {
5613
5837
  content: {
5614
- "application/json": components["schemas"]["RoastImportCreateRequest"];
5838
+ "application/json": components["schemas"]["RoastLiveCurveRequest"];
5615
5839
  };
5616
5840
  };
5617
5841
  responses: {
5618
- /** @description The created roast profile plus import summary */
5619
- 201: {
5842
+ /** @description The roast with its replaced live curve */
5843
+ 200: {
5620
5844
  headers: {
5621
5845
  [name: string]: unknown;
5622
5846
  };
5623
5847
  content: {
5624
- "application/json": components["schemas"]["RoastImportResponse"];
5848
+ "application/json": components["schemas"]["RoastDetailResponse"];
5625
5849
  };
5626
5850
  };
5627
5851
  /** @description Invalid query parameter */
@@ -5651,7 +5875,7 @@ interface paths {
5651
5875
  "application/json": components["schemas"]["ErrorResponse"];
5652
5876
  };
5653
5877
  };
5654
- /** @description No such coffee lot owned by the caller */
5878
+ /** @description No such roast profile owned by the caller */
5655
5879
  404: {
5656
5880
  headers: {
5657
5881
  [name: string]: unknown;
@@ -5689,13 +5913,14 @@ interface paths {
5689
5913
  };
5690
5914
  };
5691
5915
  };
5916
+ post?: never;
5692
5917
  delete?: never;
5693
5918
  options?: never;
5694
5919
  head?: never;
5695
5920
  patch?: never;
5696
5921
  trace?: never;
5697
5922
  };
5698
- "/v1/roasts/{id}/artisan-import": {
5923
+ "/v1/roasts/batches/{batchName}": {
5699
5924
  parameters: {
5700
5925
  query?: never;
5701
5926
  header?: never;
@@ -5703,34 +5928,30 @@ interface paths {
5703
5928
  cookie?: never;
5704
5929
  };
5705
5930
  get?: never;
5931
+ put?: never;
5932
+ post?: never;
5706
5933
  /**
5707
- * Replace a roast's Artisan import
5708
- * @description Re-derive one of the caller's existing roasts from an Artisan `.alog` file: replace its temperature curve, event markers, milestones, chart bounds, and computed metrics, and write an artisan_import_log entry atomically. The roast's identity (coffee, batch name, roast date, weights, and user notes) is preserved. Optional `If-Match: <last_updated>` enables optimistic concurrency (409 on mismatch). Requires an authenticated session, or an owner-bound API key carrying the exact roast:write scope.
5934
+ * Delete an owner roast batch
5935
+ * @description Delete every roast profile carrying the exact batch name, plus nested temperature and event rows, in one transaction. This existing UI-level bulk action is restricted to authenticated sessions; API keys cannot call it.
5709
5936
  */
5710
- put: {
5937
+ delete: {
5711
5938
  parameters: {
5712
5939
  query?: never;
5713
- header?: {
5714
- "if-match"?: string;
5715
- };
5940
+ header?: never;
5716
5941
  path: {
5717
- id: number;
5942
+ batchName: string;
5718
5943
  };
5719
5944
  cookie?: never;
5720
5945
  };
5721
- requestBody: {
5722
- content: {
5723
- "application/json": components["schemas"]["RoastArtisanImportReplaceRequest"];
5724
- };
5725
- };
5946
+ requestBody?: never;
5726
5947
  responses: {
5727
- /** @description The updated roast profile plus import summary */
5948
+ /** @description The roast batch was deleted */
5728
5949
  200: {
5729
5950
  headers: {
5730
5951
  [name: string]: unknown;
5731
5952
  };
5732
5953
  content: {
5733
- "application/json": components["schemas"]["RoastImportResponse"];
5954
+ "application/json": components["schemas"]["RoastBatchDeleteResponse"];
5734
5955
  };
5735
5956
  };
5736
5957
  /** @description Invalid query parameter */
@@ -5769,15 +5990,222 @@ interface paths {
5769
5990
  "application/json": components["schemas"]["ErrorResponse"];
5770
5991
  };
5771
5992
  };
5772
- /** @description Write conflict: an If-Match precondition failed */
5773
- 409: {
5774
- headers: {
5775
- [name: string]: unknown;
5776
- };
5777
- content: {
5778
- "application/json": components["schemas"]["ErrorResponse"];
5779
- };
5780
- };
5993
+ /** @description Per-user mutation throttle exceeded; retry after a short wait */
5994
+ 429: {
5995
+ headers: {
5996
+ [name: string]: unknown;
5997
+ };
5998
+ content: {
5999
+ "application/json": components["schemas"]["ErrorResponse"];
6000
+ };
6001
+ };
6002
+ /** @description Roast writes are not enabled in this environment */
6003
+ 503: {
6004
+ headers: {
6005
+ [name: string]: unknown;
6006
+ };
6007
+ content: {
6008
+ "application/json": components["schemas"]["ErrorResponse"];
6009
+ };
6010
+ };
6011
+ };
6012
+ };
6013
+ options?: never;
6014
+ head?: never;
6015
+ patch?: never;
6016
+ trace?: never;
6017
+ };
6018
+ "/v1/roasts/imports": {
6019
+ parameters: {
6020
+ query?: never;
6021
+ header?: never;
6022
+ path?: never;
6023
+ cookie?: never;
6024
+ };
6025
+ get?: never;
6026
+ put?: never;
6027
+ /**
6028
+ * Create a roast from an Artisan file
6029
+ * @description Parse an Artisan `.alog` file, create a roast profile owned by the caller against one of their green-coffee lots, and persist the imported temperature curve, event markers, and an artisan_import_log entry atomically. Requires an authenticated session, or an owner-bound API key carrying the exact roast:write scope.
6030
+ */
6031
+ post: {
6032
+ parameters: {
6033
+ query?: never;
6034
+ header?: {
6035
+ "idempotency-key"?: string;
6036
+ };
6037
+ path?: never;
6038
+ cookie?: never;
6039
+ };
6040
+ requestBody: {
6041
+ content: {
6042
+ "application/json": components["schemas"]["RoastImportCreateRequest"];
6043
+ };
6044
+ };
6045
+ responses: {
6046
+ /** @description The created roast profile plus import summary */
6047
+ 201: {
6048
+ headers: {
6049
+ [name: string]: unknown;
6050
+ };
6051
+ content: {
6052
+ "application/json": components["schemas"]["RoastImportResponse"];
6053
+ };
6054
+ };
6055
+ /** @description Invalid query parameter */
6056
+ 400: {
6057
+ headers: {
6058
+ [name: string]: unknown;
6059
+ };
6060
+ content: {
6061
+ "application/json": components["schemas"]["ErrorResponse"];
6062
+ };
6063
+ };
6064
+ /** @description Authentication required */
6065
+ 401: {
6066
+ headers: {
6067
+ [name: string]: unknown;
6068
+ };
6069
+ content: {
6070
+ "application/json": components["schemas"]["ErrorResponse"];
6071
+ };
6072
+ };
6073
+ /** @description Insufficient entitlement (plan or role) */
6074
+ 403: {
6075
+ headers: {
6076
+ [name: string]: unknown;
6077
+ };
6078
+ content: {
6079
+ "application/json": components["schemas"]["ErrorResponse"];
6080
+ };
6081
+ };
6082
+ /** @description No such coffee lot owned by the caller */
6083
+ 404: {
6084
+ headers: {
6085
+ [name: string]: unknown;
6086
+ };
6087
+ content: {
6088
+ "application/json": components["schemas"]["ErrorResponse"];
6089
+ };
6090
+ };
6091
+ /** @description Write conflict: an If-Match precondition failed */
6092
+ 409: {
6093
+ headers: {
6094
+ [name: string]: unknown;
6095
+ };
6096
+ content: {
6097
+ "application/json": components["schemas"]["ErrorResponse"];
6098
+ };
6099
+ };
6100
+ /** @description Per-user mutation throttle exceeded; retry after a short wait */
6101
+ 429: {
6102
+ headers: {
6103
+ [name: string]: unknown;
6104
+ };
6105
+ content: {
6106
+ "application/json": components["schemas"]["ErrorResponse"];
6107
+ };
6108
+ };
6109
+ /** @description Roast writes are not enabled in this environment */
6110
+ 503: {
6111
+ headers: {
6112
+ [name: string]: unknown;
6113
+ };
6114
+ content: {
6115
+ "application/json": components["schemas"]["ErrorResponse"];
6116
+ };
6117
+ };
6118
+ };
6119
+ };
6120
+ delete?: never;
6121
+ options?: never;
6122
+ head?: never;
6123
+ patch?: never;
6124
+ trace?: never;
6125
+ };
6126
+ "/v1/roasts/{id}/artisan-import": {
6127
+ parameters: {
6128
+ query?: never;
6129
+ header?: never;
6130
+ path?: never;
6131
+ cookie?: never;
6132
+ };
6133
+ get?: never;
6134
+ /**
6135
+ * Replace a roast's Artisan import
6136
+ * @description Re-derive one of the caller's existing roasts from an Artisan `.alog` file: replace its temperature curve, event markers, milestones, chart bounds, and computed metrics, and write an artisan_import_log entry atomically. The roast's identity (coffee, batch name, roast date, weights, and user notes) is preserved. Optional `If-Match: <last_updated>` enables optimistic concurrency (409 on mismatch). Requires an authenticated session, or an owner-bound API key carrying the exact roast:write scope.
6137
+ */
6138
+ put: {
6139
+ parameters: {
6140
+ query?: never;
6141
+ header?: {
6142
+ "if-match"?: string;
6143
+ };
6144
+ path: {
6145
+ id: number;
6146
+ };
6147
+ cookie?: never;
6148
+ };
6149
+ requestBody: {
6150
+ content: {
6151
+ "application/json": components["schemas"]["RoastArtisanImportReplaceRequest"];
6152
+ };
6153
+ };
6154
+ responses: {
6155
+ /** @description The updated roast profile plus import summary */
6156
+ 200: {
6157
+ headers: {
6158
+ [name: string]: unknown;
6159
+ };
6160
+ content: {
6161
+ "application/json": components["schemas"]["RoastImportResponse"];
6162
+ };
6163
+ };
6164
+ /** @description Invalid query parameter */
6165
+ 400: {
6166
+ headers: {
6167
+ [name: string]: unknown;
6168
+ };
6169
+ content: {
6170
+ "application/json": components["schemas"]["ErrorResponse"];
6171
+ };
6172
+ };
6173
+ /** @description Authentication required */
6174
+ 401: {
6175
+ headers: {
6176
+ [name: string]: unknown;
6177
+ };
6178
+ content: {
6179
+ "application/json": components["schemas"]["ErrorResponse"];
6180
+ };
6181
+ };
6182
+ /** @description Insufficient entitlement (plan or role) */
6183
+ 403: {
6184
+ headers: {
6185
+ [name: string]: unknown;
6186
+ };
6187
+ content: {
6188
+ "application/json": components["schemas"]["ErrorResponse"];
6189
+ };
6190
+ };
6191
+ /** @description No such roast profile owned by the caller */
6192
+ 404: {
6193
+ headers: {
6194
+ [name: string]: unknown;
6195
+ };
6196
+ content: {
6197
+ "application/json": components["schemas"]["ErrorResponse"];
6198
+ };
6199
+ };
6200
+ /** @description Write conflict: an If-Match precondition failed */
6201
+ 409: {
6202
+ headers: {
6203
+ [name: string]: unknown;
6204
+ };
6205
+ content: {
6206
+ "application/json": components["schemas"]["ErrorResponse"];
6207
+ };
6208
+ };
5781
6209
  /** @description Per-user mutation throttle exceeded; retry after a short wait */
5782
6210
  429: {
5783
6211
  headers: {
@@ -7037,35 +7465,164 @@ interface components {
7037
7465
  }[];
7038
7466
  };
7039
7467
  };
7040
- CatalogFacetsResponse: {
7041
- /** @description Compatibility-friendly unique values for dropdown filters. Keys with no values are omitted. */
7042
- values: {
7043
- sources?: string[];
7044
- continents?: string[];
7045
- countries?: string[];
7046
- regions?: string[];
7047
- processing?: string[];
7048
- cultivar_detail?: string[];
7049
- type?: string[];
7050
- grade?: string[];
7051
- appearance?: string[];
7052
- arrivalDates?: string[];
7053
- drying_method?: string[];
7054
- wholesale?: string[];
7055
- processing_base_method?: string[];
7056
- fermentation_type?: string[];
7057
- process_additives?: string[];
7058
- processing_disclosure_level?: string[];
7059
- };
7060
- /** @description Counted facet values for CLI/agent use. Counts are computed after visibility and entitled query filters are applied. */
7061
- facets: {
7062
- sources?: {
7063
- value: string;
7468
+ CatalogMapResponse: {
7469
+ data: ({
7470
+ /** @enum {string} */
7471
+ type: "cluster";
7472
+ id: string;
7473
+ longitude: number;
7474
+ latitude: number;
7475
+ bounds: {
7476
+ west: number;
7477
+ south: number;
7478
+ east: number;
7479
+ north: number;
7480
+ crossesAntimeridian: boolean;
7481
+ };
7482
+ placement_count: number;
7483
+ unique_coffee_count: number;
7484
+ catalog_ids: number[];
7485
+ } | {
7486
+ /** @enum {string} */
7487
+ type: "place";
7488
+ id: string;
7489
+ catalog_id: number;
7490
+ /** Format: uuid */
7491
+ place_id: string | null;
7492
+ canonical_name: string;
7493
+ /** @enum {string} */
7494
+ place_type: "continent" | "country" | "region" | "subregion" | "locality" | "site";
7495
+ longitude: number;
7496
+ latitude: number;
7497
+ /** @enum {string} */
7498
+ geographic_precision: "none" | "continent" | "country" | "region" | "subregion" | "locality" | "site" | "exact_site";
7499
+ /** @enum {string} */
7500
+ coordinate_kind: "none" | "centroid" | "exact_point";
7501
+ /** @enum {string} */
7502
+ place_provenance: "reference_dataset" | "source_evidence" | "deterministic_resolution" | "manual_review";
7503
+ /** @enum {string} */
7504
+ assignment_role: "primary" | "additional";
7505
+ /** @enum {string} */
7506
+ assignment_provenance: "reference_dataset" | "source_evidence" | "deterministic_resolution" | "manual_review";
7507
+ assignment_confidence: number;
7508
+ elevation_min_masl: number | null;
7509
+ elevation_max_masl: number | null;
7510
+ })[];
7511
+ elevation_profile: {
7512
+ /** @enum {string} */
7513
+ scope: "query" | "viewport";
7514
+ row_count: number;
7515
+ evidence_count: number;
7516
+ complete_bound_count: number;
7517
+ partial_bound_count: number;
7518
+ unknown_count: number;
7519
+ statistic_sample_count: number;
7520
+ median_masl: number | null;
7521
+ min_known_masl: number | null;
7522
+ max_known_masl: number | null;
7523
+ bands: {
7524
+ /** @enum {string} */
7525
+ key: "below_1000" | "1000_to_1399" | "1400_to_1799" | "1800_to_2199" | "2200_and_above";
7526
+ min_masl: number | null;
7527
+ max_masl_exclusive: number | null;
7064
7528
  count: number;
7065
7529
  }[];
7066
- continents?: {
7067
- value: string;
7068
- count: number;
7530
+ } | null;
7531
+ meta: {
7532
+ /** @enum {string} */
7533
+ resource: "catalog-map";
7534
+ /** @enum {string} */
7535
+ namespace: "/v1/catalog/map";
7536
+ /** @enum {string} */
7537
+ version: "v1";
7538
+ auth: {
7539
+ /** @enum {string} */
7540
+ kind: "session" | "api-key";
7541
+ /** @enum {string|null} */
7542
+ role: "viewer" | "member" | "admin" | null;
7543
+ /** @enum {string|null} */
7544
+ apiPlan: "viewer" | "member" | "enterprise" | null;
7545
+ };
7546
+ access: {
7547
+ publicOnly: boolean;
7548
+ showWholesale: boolean;
7549
+ wholesaleOnly: boolean;
7550
+ rowLimit: number | null;
7551
+ limited: boolean;
7552
+ totalAvailable: number;
7553
+ fineGrainedPlaces: boolean;
7554
+ viewportSearch: boolean;
7555
+ elevationProfile: boolean;
7556
+ };
7557
+ effective: {
7558
+ zoom: number;
7559
+ /** @enum {string} */
7560
+ lens: "catalog" | "elevation";
7561
+ /** Format: uuid */
7562
+ place_id: string | null;
7563
+ bbox: {
7564
+ west: number;
7565
+ south: number;
7566
+ east: number;
7567
+ north: number;
7568
+ crossesAntimeridian: boolean;
7569
+ } | null;
7570
+ };
7571
+ totals: {
7572
+ unique_coffee_count: number;
7573
+ placed_unique_coffee_count: number;
7574
+ unplaced_unique_coffee_count: number;
7575
+ placement_count: number;
7576
+ mappable_placement_count: number;
7577
+ viewport_placed_unique_coffee_count: number;
7578
+ viewport_placement_count: number;
7579
+ };
7580
+ notices?: {
7581
+ status: 401 | 403;
7582
+ /** @enum {string} */
7583
+ code: "auth_required" | "entitlement_required";
7584
+ message: string;
7585
+ deniedParams: string[];
7586
+ }[];
7587
+ /** @description Freshness contract. `generatedAt` (ISO 8601) is the authoritative time this body was generated. `cacheStatus`/`ttlSeconds` are the resolved cache policy (ttl 0 for private/no-store); ttl is policy, not a promise — stale-while-revalidate may serve an older body, so trust `generatedAt` for actual age. */
7588
+ freshness: {
7589
+ /** Format: date-time */
7590
+ generatedAt: string;
7591
+ /** @enum {string} */
7592
+ cacheStatus: "public" | "private";
7593
+ ttlSeconds: number;
7594
+ };
7595
+ };
7596
+ };
7597
+ CatalogFacetsResponse: {
7598
+ /** @description Compatibility-friendly unique values for dropdown filters. Keys with no values are omitted. */
7599
+ values: {
7600
+ sources?: string[];
7601
+ continents?: string[];
7602
+ countries?: string[];
7603
+ regions?: string[];
7604
+ processing?: string[];
7605
+ cultivar_detail?: string[];
7606
+ type?: string[];
7607
+ grade?: string[];
7608
+ appearance?: string[];
7609
+ arrivalDates?: string[];
7610
+ drying_method?: string[];
7611
+ wholesale?: string[];
7612
+ processing_base_method?: string[];
7613
+ fermentation_type?: string[];
7614
+ process_additives?: string[];
7615
+ processing_disclosure_level?: string[];
7616
+ };
7617
+ /** @description Counted facet values for CLI/agent use. Counts are computed after visibility and entitled query filters are applied. */
7618
+ facets: {
7619
+ sources?: {
7620
+ value: string;
7621
+ count: number;
7622
+ }[];
7623
+ continents?: {
7624
+ value: string;
7625
+ count: number;
7069
7626
  }[];
7070
7627
  countries?: {
7071
7628
  value: string;
@@ -9146,6 +9703,41 @@ interface components {
9146
9703
  temperatures?: components["schemas"]["RoastTemperatureInput"][];
9147
9704
  events?: components["schemas"]["RoastEventInput"][];
9148
9705
  };
9706
+ RoastBatchMutationResponse: {
9707
+ data: {
9708
+ batchName: string;
9709
+ profiles: components["schemas"]["RoastDetailResource"][];
9710
+ };
9711
+ meta: {
9712
+ /** @enum {string} */
9713
+ resource: "roast-batches";
9714
+ /** @enum {string} */
9715
+ namespace: "/v1/roasts/batches";
9716
+ /** @enum {string} */
9717
+ version: "v1";
9718
+ auth: {
9719
+ /** @enum {string} */
9720
+ kind: "session" | "api-key";
9721
+ /** @enum {string|null} */
9722
+ role: "admin" | "member" | "viewer" | null;
9723
+ /** @enum {string|null} */
9724
+ apiPlan: "viewer" | "member" | "enterprise" | null;
9725
+ };
9726
+ };
9727
+ };
9728
+ RoastBatchItem: {
9729
+ coffeeId: number;
9730
+ coffeeName?: string;
9731
+ ozIn?: number;
9732
+ ozOut?: number;
9733
+ };
9734
+ RoastBatchCreateRequest: {
9735
+ batchName: string;
9736
+ roastDate?: string;
9737
+ notes?: string;
9738
+ targets?: string;
9739
+ items: components["schemas"]["RoastBatchItem"][];
9740
+ };
9149
9741
  RoastUpdateRequest: {
9150
9742
  coffeeName?: string;
9151
9743
  batchName?: string;
@@ -9184,6 +9776,10 @@ interface components {
9184
9776
  temperatures?: components["schemas"]["RoastTemperatureInput"][];
9185
9777
  events?: components["schemas"]["RoastEventInput"][];
9186
9778
  };
9779
+ RoastLiveCurveRequest: {
9780
+ temperatures: components["schemas"]["RoastTemperatureInput"][];
9781
+ events: components["schemas"]["RoastEventInput"][];
9782
+ };
9187
9783
  RoastDeleteResponse: {
9188
9784
  data: {
9189
9785
  id: number;
@@ -9207,6 +9803,30 @@ interface components {
9207
9803
  };
9208
9804
  };
9209
9805
  };
9806
+ RoastBatchDeleteResponse: {
9807
+ data: {
9808
+ batchName: string;
9809
+ ids: number[];
9810
+ /** @enum {boolean} */
9811
+ deleted: true;
9812
+ };
9813
+ meta: {
9814
+ /** @enum {string} */
9815
+ resource: "roast-batches";
9816
+ /** @enum {string} */
9817
+ namespace: "/v1/roasts/batches";
9818
+ /** @enum {string} */
9819
+ version: "v1";
9820
+ auth: {
9821
+ /** @enum {string} */
9822
+ kind: "session" | "api-key";
9823
+ /** @enum {string|null} */
9824
+ role: "admin" | "member" | "viewer" | null;
9825
+ /** @enum {string|null} */
9826
+ apiPlan: "viewer" | "member" | "enterprise" | null;
9827
+ };
9828
+ };
9829
+ };
9210
9830
  ArtisanImportSummary: {
9211
9831
  fileName: string;
9212
9832
  fileSize: number;
@@ -9713,6 +10333,12 @@ type CatalogFacetsQuery = NonNullable<paths["/v1/catalog/facets"]["get"]["parame
9713
10333
  * into strip-with-notice degradation instead of a 401/403 hard-deny.
9714
10334
  */
9715
10335
  type CatalogListHeaders = NonNullable<paths["/v1/catalog"]["get"]["parameters"]["header"]>;
10336
+ /** Query parameters for {@link ParchmentClient.catalog.map}. */
10337
+ type CatalogMapQuery = NonNullable<paths["/v1/catalog/map"]["get"]["parameters"]["query"]>;
10338
+ /** Optional handling headers for {@link ParchmentClient.catalog.map}. */
10339
+ type CatalogMapHeaders = NonNullable<paths["/v1/catalog/map"]["get"]["parameters"]["header"]>;
10340
+ /** Lightweight map projection over the caller-visible catalog. */
10341
+ type CatalogMapResponse = components["schemas"]["CatalogMapResponse"];
9716
10342
  /** Optional headers for {@link ParchmentClient.catalog.facets}; see {@link CatalogListHeaders}. */
9717
10343
  type CatalogFacetsHeaders = NonNullable<paths["/v1/catalog/facets"]["get"]["parameters"]["header"]>;
9718
10344
  /** Query parameters for {@link ParchmentClient.catalog.originPriceStats}. */
@@ -9799,8 +10425,12 @@ type RoastChartDataQuery = NonNullable<paths["/v1/roasts/{id}/chart-data"]["get"
9799
10425
  type RoastClassificationRequest = NonNullable<paths["/v1/roasts/classify"]["post"]["requestBody"]>["content"]["application/json"];
9800
10426
  /** Request body for {@link ParchmentClient.roasts.create}. */
9801
10427
  type RoastCreateRequest = NonNullable<paths["/v1/roasts"]["post"]["requestBody"]>["content"]["application/json"];
10428
+ /** Atomic named-batch body for {@link ParchmentClient.roasts.createBatch}. */
10429
+ type RoastBatchCreateRequest = NonNullable<paths["/v1/roasts/batches"]["post"]["requestBody"]>["content"]["application/json"];
9802
10430
  /** Request body for {@link ParchmentClient.roasts.update}. */
9803
10431
  type RoastUpdateRequest = NonNullable<paths["/v1/roasts/{id}"]["patch"]["requestBody"]>["content"]["application/json"];
10432
+ /** Source-aware live curve body for {@link ParchmentClient.roasts.replaceLiveCurve}. */
10433
+ type RoastLiveCurveRequest = NonNullable<paths["/v1/roasts/{id}/live-curve"]["put"]["requestBody"]>["content"]["application/json"];
9804
10434
  /** Request body for {@link ParchmentClient.roasts.import}. */
9805
10435
  type RoastImportRequest = NonNullable<paths["/v1/roasts/imports"]["post"]["requestBody"]>["content"]["application/json"];
9806
10436
  /** Request body for {@link ParchmentClient.roasts.replaceArtisanImport}. */
@@ -10622,7 +11252,9 @@ declare function createParchmentClient(options: ParchmentClientOptions): {
10622
11252
  request: (body: AccountDeletionRequest) => Promise<openapi_fetch.FetchResponse<{
10623
11253
  parameters: {
10624
11254
  query?: never;
10625
- header?: never;
11255
+ header
11256
+ /** Optional headers for ranking endpoints; see {@link CatalogListHeaders}. */
11257
+ ? /** Optional headers for ranking endpoints; see {@link CatalogListHeaders}. */: never;
10626
11258
  path?: never;
10627
11259
  cookie?: never;
10628
11260
  };
@@ -10949,7 +11581,7 @@ declare function createParchmentClient(options: ParchmentClientOptions): {
10949
11581
  [name: string]: unknown;
10950
11582
  };
10951
11583
  content: {
10952
- "application/json": components["schemas"]["ErrorResponse"];
11584
+ "application/json": components["schemas"] /** Actionable market value signals. */["ErrorResponse"];
10953
11585
  };
10954
11586
  };
10955
11587
  503: {
@@ -11005,7 +11637,7 @@ declare function createParchmentClient(options: ParchmentClientOptions): {
11005
11637
  [name: string]: unknown;
11006
11638
  };
11007
11639
  content: {
11008
- "application/json": components["schemas"]["ErrorResponse"];
11640
+ "application/json": components["schemas"] /** Actionable market value signals. */["ErrorResponse"];
11009
11641
  };
11010
11642
  };
11011
11643
  503: {
@@ -11276,11 +11908,7 @@ declare function createParchmentClient(options: ParchmentClientOptions): {
11276
11908
  [name: string]: unknown;
11277
11909
  };
11278
11910
  content: {
11279
- "application/json": components["schemas"] /**
11280
- * Update one of the caller's own sales. The sales table carries no
11281
- * `last_updated` column, so no If-Match optimistic concurrency is
11282
- * offered.
11283
- */["ErrorResponse"];
11911
+ "application/json": components["schemas"]["ErrorResponse"];
11284
11912
  };
11285
11913
  };
11286
11914
  };
@@ -11872,6 +12500,143 @@ declare function createParchmentClient(options: ParchmentClientOptions): {
11872
12500
  } | undefined;
11873
12501
  };
11874
12502
  }, `${string}/${string}`>>;
12503
+ /** Deterministic clusters, canonical place features, and elevation profile. */
12504
+ map: (query?: CatalogMapQuery, headers?: CatalogMapHeaders) => Promise<openapi_fetch.FetchResponse<{
12505
+ parameters: {
12506
+ query?: {
12507
+ stocked?: "true" | "false" | "all";
12508
+ showWholesale?: "true" | "false";
12509
+ wholesaleOnly?: "true" | "false";
12510
+ origin?: string;
12511
+ continent?: string;
12512
+ country?: string | string[];
12513
+ region?: string;
12514
+ source?: string | string[];
12515
+ name?: string;
12516
+ processing?: string;
12517
+ variety?: string;
12518
+ type?: string;
12519
+ grade?: string;
12520
+ appearance?: string;
12521
+ supplier?: string;
12522
+ dryingMethod?: string;
12523
+ flavorKeywords?: string | string[];
12524
+ arrivalDate?: string;
12525
+ stockedDate?: string;
12526
+ stockedDays?: number;
12527
+ coffeeIds?: string;
12528
+ scoreValueMin?: number | null;
12529
+ scoreValueMax?: number | null;
12530
+ pricePerLbMin?: number | null;
12531
+ pricePerLbMax?: number | null;
12532
+ elevationMinMasl?: number | null;
12533
+ elevationMaxMasl?: number | null;
12534
+ processing_base_method?: string;
12535
+ fermentation_type?: string;
12536
+ process_additive?: string;
12537
+ has_additives?: "true" | "false";
12538
+ processing_disclosure_level?: string;
12539
+ processing_confidence_min?: number | null;
12540
+ place_id?: string;
12541
+ bbox?: string;
12542
+ zoom?: number;
12543
+ lens?: "catalog" | "elevation";
12544
+ };
12545
+ header?: {
12546
+ Prefer?: string;
12547
+ };
12548
+ path?: never;
12549
+ cookie?: never;
12550
+ };
12551
+ requestBody?: never;
12552
+ responses: {
12553
+ 200: {
12554
+ headers: {
12555
+ [name: string]: unknown;
12556
+ };
12557
+ content: {
12558
+ "application/json": components["schemas"]["CatalogMapResponse"];
12559
+ };
12560
+ };
12561
+ 400: {
12562
+ headers: {
12563
+ [name: string]: unknown;
12564
+ };
12565
+ content: {
12566
+ "application/json": components["schemas"]["ErrorResponse"];
12567
+ };
12568
+ };
12569
+ 401: {
12570
+ headers: {
12571
+ [name: string]: unknown;
12572
+ };
12573
+ content: {
12574
+ "application/json": components["schemas"]["ErrorResponse"];
12575
+ };
12576
+ };
12577
+ 403: {
12578
+ headers: {
12579
+ [name: string]: unknown;
12580
+ };
12581
+ content: {
12582
+ "application/json": components["schemas"]["ErrorResponse"];
12583
+ };
12584
+ };
12585
+ 503: {
12586
+ headers: {
12587
+ [name: string]: unknown;
12588
+ };
12589
+ content: {
12590
+ "application/json": components["schemas"]["ErrorResponse"];
12591
+ };
12592
+ };
12593
+ };
12594
+ }, {
12595
+ params: {
12596
+ query: {
12597
+ stocked?: "true" | "false" | "all";
12598
+ showWholesale?: "true" | "false";
12599
+ wholesaleOnly?: "true" | "false";
12600
+ origin?: string;
12601
+ continent?: string;
12602
+ country?: string | string[];
12603
+ region?: string;
12604
+ source?: string | string[];
12605
+ name?: string;
12606
+ processing?: string;
12607
+ variety?: string;
12608
+ type?: string;
12609
+ grade?: string;
12610
+ appearance?: string;
12611
+ supplier?: string;
12612
+ dryingMethod?: string;
12613
+ flavorKeywords?: string | string[];
12614
+ arrivalDate?: string;
12615
+ stockedDate?: string;
12616
+ stockedDays?: number;
12617
+ coffeeIds?: string;
12618
+ scoreValueMin?: number | null;
12619
+ scoreValueMax?: number | null;
12620
+ pricePerLbMin?: number | null;
12621
+ pricePerLbMax?: number | null;
12622
+ elevationMinMasl?: number | null;
12623
+ elevationMaxMasl?: number | null;
12624
+ processing_base_method?: string;
12625
+ fermentation_type?: string;
12626
+ process_additive?: string;
12627
+ has_additives?: "true" | "false";
12628
+ processing_disclosure_level?: string;
12629
+ processing_confidence_min?: number | null;
12630
+ place_id?: string;
12631
+ bbox?: string;
12632
+ zoom?: number;
12633
+ lens?: "catalog" | "elevation";
12634
+ } | undefined;
12635
+ header: {
12636
+ Prefer?: string;
12637
+ } | undefined;
12638
+ };
12639
+ }, `${string}/${string}`>>;
11875
12640
  /**
11876
12641
  * Catalog filter metadata and counted facets. Pass `headers` to send the
11877
12642
  * `Prefer: handling=lenient|strict` override (see {@link CatalogFacetsHeaders}).
@@ -15103,6 +15868,104 @@ declare function createParchmentClient(options: ParchmentClientOptions): {
15103
15868
  };
15104
15869
  } | undefined;
15105
15870
  }, `${string}/${string}`>>;
15871
+ /**
15872
+ * Create every profile in one named batch atomically. The required
15873
+ * payload-bound idempotency key makes transport retries safe.
15874
+ */
15875
+ createBatch: (body: RoastBatchCreateRequest, idempotencyKey: string) => Promise<openapi_fetch.FetchResponse<{
15876
+ parameters: {
15877
+ query?: never;
15878
+ header: {
15879
+ "idempotency-key": string;
15880
+ };
15881
+ path?: never;
15882
+ cookie?: never;
15883
+ };
15884
+ requestBody: {
15885
+ content: {
15886
+ "application/json": components["schemas"]["RoastBatchCreateRequest"];
15887
+ };
15888
+ };
15889
+ responses: {
15890
+ 201: {
15891
+ headers: {
15892
+ [name: string]: unknown;
15893
+ };
15894
+ content: {
15895
+ "application/json": components["schemas"]["RoastBatchMutationResponse"];
15896
+ };
15897
+ };
15898
+ 400: {
15899
+ headers: {
15900
+ [name: string]: unknown;
15901
+ };
15902
+ content: {
15903
+ "application/json": components["schemas"]["ErrorResponse"];
15904
+ };
15905
+ };
15906
+ 401: {
15907
+ headers: {
15908
+ [name: string]: unknown;
15909
+ };
15910
+ content: {
15911
+ "application/json": components["schemas"]["ErrorResponse"];
15912
+ };
15913
+ };
15914
+ 403: {
15915
+ headers: {
15916
+ [name: string]: unknown;
15917
+ };
15918
+ content: {
15919
+ "application/json": components["schemas"]["ErrorResponse"];
15920
+ };
15921
+ };
15922
+ 404: {
15923
+ headers: {
15924
+ [name: string]: unknown;
15925
+ };
15926
+ content: {
15927
+ "application/json": components["schemas"]["ErrorResponse"];
15928
+ };
15929
+ };
15930
+ 409: {
15931
+ headers: {
15932
+ [name: string]: unknown;
15933
+ };
15934
+ content: {
15935
+ "application/json": components["schemas"]["ErrorResponse"];
15936
+ };
15937
+ };
15938
+ 429: {
15939
+ headers: {
15940
+ [name: string]: unknown;
15941
+ };
15942
+ content: {
15943
+ "application/json": components["schemas"]["ErrorResponse"];
15944
+ };
15945
+ };
15946
+ 503: {
15947
+ headers: {
15948
+ [name: string]: unknown;
15949
+ };
15950
+ content: {
15951
+ "application/json": components["schemas"]["ErrorResponse"];
15952
+ };
15953
+ };
15954
+ };
15955
+ }, {
15956
+ body: {
15957
+ batchName: string;
15958
+ roastDate?: string;
15959
+ notes?: string;
15960
+ targets?: string;
15961
+ items: components["schemas"]["RoastBatchItem"][];
15962
+ };
15963
+ params: {
15964
+ header: {
15965
+ "idempotency-key": string;
15966
+ };
15967
+ };
15968
+ }, `${string}/${string}`>>;
15106
15969
  /**
15107
15970
  * Update one of the caller's own roast profiles. Pass `ifMatch` (the
15108
15971
  * row's `last_updated`) to enable optimistic concurrency (409 on mismatch).
@@ -15314,6 +16177,184 @@ declare function createParchmentClient(options: ParchmentClientOptions): {
15314
16177
  };
15315
16178
  };
15316
16179
  }, `${string}/${string}`>>;
16180
+ /** Delete every owner roast carrying one exact batch name. Session-only. */
16181
+ deleteBatch: (batchName: string) => Promise<openapi_fetch.FetchResponse<{
16182
+ parameters: {
16183
+ query?: never;
16184
+ header?: never;
16185
+ path: {
16186
+ batchName: string;
16187
+ };
16188
+ cookie?: never;
16189
+ };
16190
+ requestBody?: never;
16191
+ responses: {
16192
+ 200: {
16193
+ headers: {
16194
+ [name: string]: unknown;
16195
+ };
16196
+ content: {
16197
+ "application/json": components["schemas"]["RoastBatchDeleteResponse"];
16198
+ };
16199
+ };
16200
+ 400: {
16201
+ headers: {
16202
+ [name: string]: unknown;
16203
+ };
16204
+ content: {
16205
+ "application/json": components["schemas"]["ErrorResponse"];
16206
+ };
16207
+ };
16208
+ 401: {
16209
+ headers: {
16210
+ [name: string]: unknown;
16211
+ };
16212
+ content: {
16213
+ "application/json": components["schemas"]["ErrorResponse"];
16214
+ };
16215
+ };
16216
+ 403: {
16217
+ headers: {
16218
+ [name: string]: unknown;
16219
+ };
16220
+ content: {
16221
+ "application/json": components["schemas"]["ErrorResponse"];
16222
+ };
16223
+ };
16224
+ 404: {
16225
+ headers: {
16226
+ [name: string]: unknown;
16227
+ };
16228
+ content: {
16229
+ "application/json": components["schemas"]["ErrorResponse"];
16230
+ };
16231
+ };
16232
+ 429: {
16233
+ headers: {
16234
+ [name: string]: unknown;
16235
+ };
16236
+ content: {
16237
+ "application/json": components["schemas"]["ErrorResponse"];
16238
+ };
16239
+ };
16240
+ 503: {
16241
+ headers: {
16242
+ [name: string]: unknown;
16243
+ };
16244
+ content: {
16245
+ "application/json": components["schemas"]["ErrorResponse"];
16246
+ };
16247
+ };
16248
+ };
16249
+ }, {
16250
+ params: {
16251
+ path: {
16252
+ batchName: string;
16253
+ };
16254
+ };
16255
+ }, `${string}/${string}`>>;
16256
+ /**
16257
+ * Replace live temperature samples and all event markers atomically,
16258
+ * while preserving non-live temperatures and deriving milestone fields.
16259
+ */
16260
+ replaceLiveCurve: (id: number, body: RoastLiveCurveRequest, options?: {
16261
+ ifMatch?: string;
16262
+ }) => Promise<openapi_fetch.FetchResponse<{
16263
+ parameters: {
16264
+ query?: never;
16265
+ header?: {
16266
+ "if-match"?: string;
16267
+ };
16268
+ path: {
16269
+ id: number;
16270
+ };
16271
+ cookie?: never;
16272
+ };
16273
+ requestBody: {
16274
+ content: {
16275
+ "application/json": components["schemas"]["RoastLiveCurveRequest"];
16276
+ };
16277
+ };
16278
+ responses: {
16279
+ 200: {
16280
+ headers: {
16281
+ [name: string]: unknown;
16282
+ };
16283
+ content: {
16284
+ "application/json": components["schemas"]["RoastDetailResponse"];
16285
+ };
16286
+ };
16287
+ 400: {
16288
+ headers: {
16289
+ [name: string]: unknown;
16290
+ };
16291
+ content: {
16292
+ "application/json": components["schemas"]["ErrorResponse"];
16293
+ };
16294
+ };
16295
+ 401: {
16296
+ headers: {
16297
+ [name: string]: unknown;
16298
+ };
16299
+ content: {
16300
+ "application/json": components["schemas"]["ErrorResponse"];
16301
+ };
16302
+ };
16303
+ 403: {
16304
+ headers: {
16305
+ [name: string]: unknown;
16306
+ };
16307
+ content: {
16308
+ "application/json": components["schemas"]["ErrorResponse"];
16309
+ };
16310
+ };
16311
+ 404: {
16312
+ headers: {
16313
+ [name: string]: unknown;
16314
+ };
16315
+ content: {
16316
+ "application/json": components["schemas"]["ErrorResponse"];
16317
+ };
16318
+ };
16319
+ 409: {
16320
+ headers: {
16321
+ [name: string]: unknown;
16322
+ };
16323
+ content: {
16324
+ "application/json": components["schemas"]["ErrorResponse"];
16325
+ };
16326
+ };
16327
+ 429: {
16328
+ headers: {
16329
+ [name: string]: unknown;
16330
+ };
16331
+ content: {
16332
+ "application/json": components["schemas"]["ErrorResponse"];
16333
+ };
16334
+ };
16335
+ 503: {
16336
+ headers: {
16337
+ [name: string]: unknown;
16338
+ };
16339
+ content: {
16340
+ "application/json": components["schemas"]["ErrorResponse"];
16341
+ };
16342
+ };
16343
+ };
16344
+ }, {
16345
+ params: {
16346
+ path: {
16347
+ id: number;
16348
+ };
16349
+ header: {
16350
+ "if-match": string;
16351
+ } | undefined;
16352
+ };
16353
+ body: {
16354
+ temperatures: components["schemas"]["RoastTemperatureInput"][];
16355
+ events: components["schemas"]["RoastEventInput"][];
16356
+ };
16357
+ }, `${string}/${string}`>>;
15317
16358
  /**
15318
16359
  * Create a roast profile from an Artisan `.alog` file against one of the
15319
16360
  * caller's green-coffee lots, persisting the imported curve, events, and
@@ -16143,4 +17184,4 @@ declare function createParchmentClient(options: ParchmentClientOptions): {
16143
17184
  };
16144
17185
  type ParchmentClient = ReturnType<typeof createParchmentClient>;
16145
17186
 
16146
- export { type AccountDeletionOperation, type AccountDeletionRequest, type BillingCheckoutCreateRequest, type BillingCheckoutSession, type BillingManualEntitlementsRequest, type BillingSubscriptionMutationRequest, type BillingSubscriptionOperation, type BriefMatchesQuery, type CatalogInventoryBatchLifecycle, type CatalogInventoryBatchReserveRequest, type CatalogInventoryBatchResult, type CatalogItem, type CatalogListQuery, type CatalogProofSummary, type CatalogSimilarQuery, type InventoryCreateRequest, type InventoryShareCatalog, type InventoryShareGrant, type InventoryShareGrantCreateRequest, type InventoryShareGrantRedeemRequest, type InventoryShareInventory, type InventoryShareRoastSummary, type InventoryUpdateRequest, type MarketOverview, type MarketSignalsQuery, type MetadataIndexQuery, type OwnerApiUsage, type OwnerApiUsageQuery, type ParchmentClient, type ParchmentClientOptions, type PriceIndexQuery, type PriceIndexStatsQuery, type ProfitItem, type ProfitListQuery, type RoastChartDataQuery, type SalesCreateRequest, type SalesListQuery, type SalesUpdateRequest, type SourcingBriefCreateRequest, type TrackedLotMutation, type TrackedLotSummary, type TrackedLotsListQuery, type components, createParchmentClient, type paths };
17187
+ export { type AccountDeletionOperation, type AccountDeletionRequest, type BillingCheckoutCreateRequest, type BillingCheckoutSession, type BillingManualEntitlementsRequest, type BillingSubscriptionMutationRequest, type BillingSubscriptionOperation, type BriefMatchesQuery, type CatalogInventoryBatchLifecycle, type CatalogInventoryBatchReserveRequest, type CatalogInventoryBatchResult, type CatalogItem, type CatalogListQuery, type CatalogMapHeaders, type CatalogMapQuery, type CatalogMapResponse, type CatalogProofSummary, type CatalogSimilarQuery, type InventoryCreateRequest, type InventoryShareCatalog, type InventoryShareGrant, type InventoryShareGrantCreateRequest, type InventoryShareGrantRedeemRequest, type InventoryShareInventory, type InventoryShareRoastSummary, type InventoryUpdateRequest, type MarketOverview, type MarketSignalsQuery, type MetadataIndexQuery, type OwnerApiUsage, type OwnerApiUsageQuery, type ParchmentClient, type ParchmentClientOptions, type PriceIndexQuery, type PriceIndexStatsQuery, type ProfitItem, type ProfitListQuery, type RoastBatchCreateRequest, type RoastChartDataQuery, type RoastLiveCurveRequest, type SalesCreateRequest, type SalesListQuery, type SalesUpdateRequest, type SourcingBriefCreateRequest, type TrackedLotMutation, type TrackedLotSummary, type TrackedLotsListQuery, type components, createParchmentClient, type paths };