@purveyors/sdk 0.31.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
@@ -2221,6 +2221,8 @@ interface paths {
2221
2221
  scoreValueMax?: number | null;
2222
2222
  pricePerLbMin?: number | null;
2223
2223
  pricePerLbMax?: number | null;
2224
+ elevationMinMasl?: number | null;
2225
+ elevationMaxMasl?: number | null;
2224
2226
  processing_base_method?: string;
2225
2227
  fermentation_type?: string;
2226
2228
  process_additive?: string;
@@ -2273,6 +2275,121 @@ interface paths {
2273
2275
  patch?: never;
2274
2276
  trace?: never;
2275
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
+ };
2276
2393
  "/v1/catalog/facets": {
2277
2394
  parameters: {
2278
2395
  query?: never;
@@ -2282,7 +2399,7 @@ interface paths {
2282
2399
  };
2283
2400
  /**
2284
2401
  * Catalog filter metadata and counted facets
2285
- * @description Returns access-aware catalog filter metadata. Values are computed after visibility and entitled content filters are applied; importer, elevation, appearance, and premium process metadata are included only for member sessions and paid API tiers. 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.
2402
+ * @description Returns access-aware catalog filter metadata. Values are computed after visibility and entitled content filters are applied; importer, legacy elevation/grade, appearance, and premium process metadata are included only for member sessions and paid API tiers. Raw fine-grained geography remains display-only until canonical place-ID filtering lands. 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.
2286
2403
  */
2287
2404
  get: {
2288
2405
  parameters: {
@@ -2312,6 +2429,8 @@ interface paths {
2312
2429
  scoreValueMax?: number | null;
2313
2430
  pricePerLbMin?: number | null;
2314
2431
  pricePerLbMax?: number | null;
2432
+ elevationMinMasl?: number | null;
2433
+ elevationMaxMasl?: number | null;
2315
2434
  processing_base_method?: string;
2316
2435
  fermentation_type?: string;
2317
2436
  process_additive?: string;
@@ -4123,6 +4242,168 @@ interface paths {
4123
4242
  patch?: never;
4124
4243
  trace?: never;
4125
4244
  };
4245
+ "/v1/inventory/share-grants": {
4246
+ parameters: {
4247
+ query?: never;
4248
+ header?: never;
4249
+ path?: never;
4250
+ cookie?: never;
4251
+ };
4252
+ get?: never;
4253
+ put?: never;
4254
+ /**
4255
+ * Create or replay an inventory share grant
4256
+ * @description Create a time-bounded bearer capability for all current owner inventory or one owned inventory row. Only entitled session principals may create grants; anonymous callers and API keys are rejected. The raw token appears only in the create response or an operation replay.
4257
+ */
4258
+ post: {
4259
+ parameters: {
4260
+ query?: never;
4261
+ header?: never;
4262
+ path?: never;
4263
+ cookie?: never;
4264
+ };
4265
+ requestBody: {
4266
+ content: {
4267
+ "application/json": components["schemas"]["InventoryShareGrantCreateRequest"];
4268
+ };
4269
+ };
4270
+ responses: {
4271
+ /** @description The created grant, or the original same-operation replay */
4272
+ 201: {
4273
+ headers: {
4274
+ /** @description Prevents caching of the raw bearer capability. */
4275
+ "Cache-Control"?: "no-store";
4276
+ [name: string]: unknown;
4277
+ };
4278
+ content: {
4279
+ "application/json": components["schemas"]["InventoryShareGrantCreateResponse"];
4280
+ };
4281
+ };
4282
+ /** @description Invalid grant request */
4283
+ 400: {
4284
+ headers: {
4285
+ [name: string]: unknown;
4286
+ };
4287
+ content: {
4288
+ "application/json": components["schemas"]["ErrorResponse"];
4289
+ };
4290
+ };
4291
+ /** @description Authentication required */
4292
+ 401: {
4293
+ headers: {
4294
+ [name: string]: unknown;
4295
+ };
4296
+ content: {
4297
+ "application/json": components["schemas"]["ErrorResponse"];
4298
+ };
4299
+ };
4300
+ /** @description Insufficient entitlement (plan or role) */
4301
+ 403: {
4302
+ headers: {
4303
+ [name: string]: unknown;
4304
+ };
4305
+ content: {
4306
+ "application/json": components["schemas"]["ErrorResponse"];
4307
+ };
4308
+ };
4309
+ /** @description The requested inventory row is not owned by the caller */
4310
+ 404: {
4311
+ headers: {
4312
+ [name: string]: unknown;
4313
+ };
4314
+ content: {
4315
+ "application/json": components["schemas"]["ErrorResponse"];
4316
+ };
4317
+ };
4318
+ /** @description Operation is in flight or bound to another payload */
4319
+ 409: {
4320
+ headers: {
4321
+ [name: string]: unknown;
4322
+ };
4323
+ content: {
4324
+ "application/json": components["schemas"]["ErrorResponse"];
4325
+ };
4326
+ };
4327
+ /** @description Inventory mutation rate limit exceeded */
4328
+ 429: {
4329
+ headers: {
4330
+ [name: string]: unknown;
4331
+ };
4332
+ content: {
4333
+ "application/json": components["schemas"]["ErrorResponse"];
4334
+ };
4335
+ };
4336
+ /** @description Replay state could not be completed */
4337
+ 503: {
4338
+ headers: {
4339
+ [name: string]: unknown;
4340
+ };
4341
+ content: {
4342
+ "application/json": components["schemas"]["ErrorResponse"];
4343
+ };
4344
+ };
4345
+ };
4346
+ };
4347
+ delete?: never;
4348
+ options?: never;
4349
+ head?: never;
4350
+ patch?: never;
4351
+ trace?: never;
4352
+ };
4353
+ "/v1/inventory/share-grants/redeem": {
4354
+ parameters: {
4355
+ query?: never;
4356
+ header?: never;
4357
+ path?: never;
4358
+ cookie?: never;
4359
+ };
4360
+ get?: never;
4361
+ put?: never;
4362
+ /**
4363
+ * Redeem an inventory share capability
4364
+ * @description Redeem a bearer capability without a user session. Every invalid, malformed, expired, inactive, unauthorized, deleted-owner, or entitlement-failure case returns the same empty response.
4365
+ */
4366
+ post: {
4367
+ parameters: {
4368
+ query?: never;
4369
+ header?: never;
4370
+ path?: never;
4371
+ cookie?: never;
4372
+ };
4373
+ requestBody: {
4374
+ content: {
4375
+ "application/json": components["schemas"]["InventoryShareGrantRedeemRequest"];
4376
+ };
4377
+ };
4378
+ responses: {
4379
+ /** @description The shared inventory projection, or the indistinguishable empty result for an invalid capability */
4380
+ 200: {
4381
+ headers: {
4382
+ /** @description Capability redemption responses are never cacheable. */
4383
+ "Cache-Control"?: "no-store";
4384
+ [name: string]: unknown;
4385
+ };
4386
+ content: {
4387
+ "application/json": components["schemas"]["InventoryShareGrantRedeemResponse"];
4388
+ };
4389
+ };
4390
+ /** @description Anonymous redemption rate limit exceeded */
4391
+ 429: {
4392
+ headers: {
4393
+ [name: string]: unknown;
4394
+ };
4395
+ content: {
4396
+ "application/json": components["schemas"]["ErrorResponse"];
4397
+ };
4398
+ };
4399
+ };
4400
+ };
4401
+ delete?: never;
4402
+ options?: never;
4403
+ head?: never;
4404
+ patch?: never;
4405
+ trace?: never;
4406
+ };
4126
4407
  "/v1/inventory/manual-batches": {
4127
4408
  parameters: {
4128
4409
  query?: never;
@@ -5168,24 +5449,132 @@ interface paths {
5168
5449
  patch?: never;
5169
5450
  trace?: never;
5170
5451
  };
5171
- "/v1/roasts/{id}": {
5452
+ "/v1/roasts/batches": {
5172
5453
  parameters: {
5173
5454
  query?: never;
5174
5455
  header?: never;
5175
5456
  path?: never;
5176
5457
  cookie?: never;
5177
5458
  };
5459
+ get?: never;
5460
+ put?: never;
5178
5461
  /**
5179
- * Get an owner roast
5180
- * @description Fetch one of the authenticated principal's roast profiles by id, optionally with its temperature curve and event markers. Requires an authenticated session, or an owner-bound API key carrying the roast:read scope.
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.
5181
5464
  */
5182
- get: {
5465
+ post: {
5183
5466
  parameters: {
5184
- query?: {
5185
- includeTemps?: boolean | null;
5186
- includeEvents?: boolean | null;
5467
+ query?: never;
5468
+ header: {
5469
+ "idempotency-key": string;
5187
5470
  };
5188
- header?: never;
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
+ };
5560
+ "/v1/roasts/{id}": {
5561
+ parameters: {
5562
+ query?: never;
5563
+ header?: never;
5564
+ path?: never;
5565
+ cookie?: never;
5566
+ };
5567
+ /**
5568
+ * Get an owner roast
5569
+ * @description Fetch one of the authenticated principal's roast profiles by id, optionally with its temperature curve and event markers. Requires an authenticated session, or an owner-bound API key carrying the roast:read scope.
5570
+ */
5571
+ get: {
5572
+ parameters: {
5573
+ query?: {
5574
+ includeTemps?: boolean | null;
5575
+ includeEvents?: boolean | null;
5576
+ };
5577
+ header?: never;
5189
5578
  path: {
5190
5579
  id: string;
5191
5580
  };
@@ -5421,7 +5810,7 @@ interface paths {
5421
5810
  };
5422
5811
  trace?: never;
5423
5812
  };
5424
- "/v1/roasts/imports": {
5813
+ "/v1/roasts/{id}/live-curve": {
5425
5814
  parameters: {
5426
5815
  query?: never;
5427
5816
  header?: never;
@@ -5429,33 +5818,34 @@ interface paths {
5429
5818
  cookie?: never;
5430
5819
  };
5431
5820
  get?: never;
5432
- put?: never;
5433
5821
  /**
5434
- * Create a roast from an Artisan file
5435
- * @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.
5436
5824
  */
5437
- post: {
5825
+ put: {
5438
5826
  parameters: {
5439
5827
  query?: never;
5440
5828
  header?: {
5441
- "idempotency-key"?: string;
5829
+ "if-match"?: string;
5830
+ };
5831
+ path: {
5832
+ id: number;
5442
5833
  };
5443
- path?: never;
5444
5834
  cookie?: never;
5445
5835
  };
5446
5836
  requestBody: {
5447
5837
  content: {
5448
- "application/json": components["schemas"]["RoastImportCreateRequest"];
5838
+ "application/json": components["schemas"]["RoastLiveCurveRequest"];
5449
5839
  };
5450
5840
  };
5451
5841
  responses: {
5452
- /** @description The created roast profile plus import summary */
5453
- 201: {
5842
+ /** @description The roast with its replaced live curve */
5843
+ 200: {
5454
5844
  headers: {
5455
5845
  [name: string]: unknown;
5456
5846
  };
5457
5847
  content: {
5458
- "application/json": components["schemas"]["RoastImportResponse"];
5848
+ "application/json": components["schemas"]["RoastDetailResponse"];
5459
5849
  };
5460
5850
  };
5461
5851
  /** @description Invalid query parameter */
@@ -5485,7 +5875,7 @@ interface paths {
5485
5875
  "application/json": components["schemas"]["ErrorResponse"];
5486
5876
  };
5487
5877
  };
5488
- /** @description No such coffee lot owned by the caller */
5878
+ /** @description No such roast profile owned by the caller */
5489
5879
  404: {
5490
5880
  headers: {
5491
5881
  [name: string]: unknown;
@@ -5523,13 +5913,14 @@ interface paths {
5523
5913
  };
5524
5914
  };
5525
5915
  };
5916
+ post?: never;
5526
5917
  delete?: never;
5527
5918
  options?: never;
5528
5919
  head?: never;
5529
5920
  patch?: never;
5530
5921
  trace?: never;
5531
5922
  };
5532
- "/v1/roasts/{id}/artisan-import": {
5923
+ "/v1/roasts/batches/{batchName}": {
5533
5924
  parameters: {
5534
5925
  query?: never;
5535
5926
  header?: never;
@@ -5537,34 +5928,30 @@ interface paths {
5537
5928
  cookie?: never;
5538
5929
  };
5539
5930
  get?: never;
5931
+ put?: never;
5932
+ post?: never;
5540
5933
  /**
5541
- * Replace a roast's Artisan import
5542
- * @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.
5543
5936
  */
5544
- put: {
5937
+ delete: {
5545
5938
  parameters: {
5546
5939
  query?: never;
5547
- header?: {
5548
- "if-match"?: string;
5549
- };
5940
+ header?: never;
5550
5941
  path: {
5551
- id: number;
5942
+ batchName: string;
5552
5943
  };
5553
5944
  cookie?: never;
5554
5945
  };
5555
- requestBody: {
5556
- content: {
5557
- "application/json": components["schemas"]["RoastArtisanImportReplaceRequest"];
5558
- };
5559
- };
5946
+ requestBody?: never;
5560
5947
  responses: {
5561
- /** @description The updated roast profile plus import summary */
5948
+ /** @description The roast batch was deleted */
5562
5949
  200: {
5563
5950
  headers: {
5564
5951
  [name: string]: unknown;
5565
5952
  };
5566
5953
  content: {
5567
- "application/json": components["schemas"]["RoastImportResponse"];
5954
+ "application/json": components["schemas"]["RoastBatchDeleteResponse"];
5568
5955
  };
5569
5956
  };
5570
5957
  /** @description Invalid query parameter */
@@ -5603,15 +5990,6 @@ interface paths {
5603
5990
  "application/json": components["schemas"]["ErrorResponse"];
5604
5991
  };
5605
5992
  };
5606
- /** @description Write conflict: an If-Match precondition failed */
5607
- 409: {
5608
- headers: {
5609
- [name: string]: unknown;
5610
- };
5611
- content: {
5612
- "application/json": components["schemas"]["ErrorResponse"];
5613
- };
5614
- };
5615
5993
  /** @description Per-user mutation throttle exceeded; retry after a short wait */
5616
5994
  429: {
5617
5995
  headers: {
@@ -5632,29 +6010,55 @@ interface paths {
5632
6010
  };
5633
6011
  };
5634
6012
  };
5635
- post?: never;
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;
5636
6027
  /**
5637
- * Clear a roast's Artisan import
5638
- * @description Remove import-derived temperature samples, event markers, and artisan_import_log rows from one of the caller's existing roasts without deleting the roast profile. Import-derived profile metrics are reset to manual/null values. Requires an authenticated session, or an owner-bound API key carrying the exact roast:write scope.
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.
5639
6030
  */
5640
- delete: {
6031
+ post: {
5641
6032
  parameters: {
5642
6033
  query?: never;
5643
- header?: never;
5644
- path: {
5645
- id: number;
6034
+ header?: {
6035
+ "idempotency-key"?: string;
5646
6036
  };
6037
+ path?: never;
5647
6038
  cookie?: never;
5648
6039
  };
5649
- requestBody?: never;
6040
+ requestBody: {
6041
+ content: {
6042
+ "application/json": components["schemas"]["RoastImportCreateRequest"];
6043
+ };
6044
+ };
5650
6045
  responses: {
5651
- /** @description The cleared roast id plus deleted row counts */
5652
- 200: {
6046
+ /** @description The created roast profile plus import summary */
6047
+ 201: {
5653
6048
  headers: {
5654
6049
  [name: string]: unknown;
5655
6050
  };
5656
6051
  content: {
5657
- "application/json": components["schemas"]["RoastArtisanImportClearResponse"];
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"];
5658
6062
  };
5659
6063
  };
5660
6064
  /** @description Authentication required */
@@ -5675,7 +6079,7 @@ interface paths {
5675
6079
  "application/json": components["schemas"]["ErrorResponse"];
5676
6080
  };
5677
6081
  };
5678
- /** @description No such roast profile owned by the caller */
6082
+ /** @description No such coffee lot owned by the caller */
5679
6083
  404: {
5680
6084
  headers: {
5681
6085
  [name: string]: unknown;
@@ -5684,6 +6088,15 @@ interface paths {
5684
6088
  "application/json": components["schemas"]["ErrorResponse"];
5685
6089
  };
5686
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
+ };
5687
6100
  /** @description Per-user mutation throttle exceeded; retry after a short wait */
5688
6101
  429: {
5689
6102
  headers: {
@@ -5704,12 +6117,13 @@ interface paths {
5704
6117
  };
5705
6118
  };
5706
6119
  };
6120
+ delete?: never;
5707
6121
  options?: never;
5708
6122
  head?: never;
5709
6123
  patch?: never;
5710
6124
  trace?: never;
5711
6125
  };
5712
- "/v1/roasts/classify": {
6126
+ "/v1/roasts/{id}/artisan-import": {
5713
6127
  parameters: {
5714
6128
  query?: never;
5715
6129
  header?: never;
@@ -5717,34 +6131,37 @@ interface paths {
5717
6131
  cookie?: never;
5718
6132
  };
5719
6133
  get?: never;
5720
- put?: never;
5721
6134
  /**
5722
- * Classify an imported roast
5723
- * @description Match Artisan roast metadata to one of the supplied owner inventory rows. Requires member entitlement and either an authenticated session or an owner-bound API key carrying the exact roast:read scope.
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.
5724
6137
  */
5725
- post: {
6138
+ put: {
5726
6139
  parameters: {
5727
6140
  query?: never;
5728
- header?: never;
5729
- path?: never;
6141
+ header?: {
6142
+ "if-match"?: string;
6143
+ };
6144
+ path: {
6145
+ id: number;
6146
+ };
5730
6147
  cookie?: never;
5731
6148
  };
5732
6149
  requestBody: {
5733
6150
  content: {
5734
- "application/json": components["schemas"]["RoastClassificationRequest"];
6151
+ "application/json": components["schemas"]["RoastArtisanImportReplaceRequest"];
5735
6152
  };
5736
6153
  };
5737
6154
  responses: {
5738
- /** @description Best inventory match, or null when no reasonable match exists */
6155
+ /** @description The updated roast profile plus import summary */
5739
6156
  200: {
5740
6157
  headers: {
5741
6158
  [name: string]: unknown;
5742
6159
  };
5743
6160
  content: {
5744
- "application/json": components["schemas"]["RoastClassificationResponse"];
6161
+ "application/json": components["schemas"]["RoastImportResponse"];
5745
6162
  };
5746
6163
  };
5747
- /** @description Invalid request body or input cap exceeded */
6164
+ /** @description Invalid query parameter */
5748
6165
  400: {
5749
6166
  headers: {
5750
6167
  [name: string]: unknown;
@@ -5771,8 +6188,8 @@ interface paths {
5771
6188
  "application/json": components["schemas"]["ErrorResponse"];
5772
6189
  };
5773
6190
  };
5774
- /** @description API or upstream classification rate limit exceeded */
5775
- 429: {
6191
+ /** @description No such roast profile owned by the caller */
6192
+ 404: {
5776
6193
  headers: {
5777
6194
  [name: string]: unknown;
5778
6195
  };
@@ -5780,8 +6197,8 @@ interface paths {
5780
6197
  "application/json": components["schemas"]["ErrorResponse"];
5781
6198
  };
5782
6199
  };
5783
- /** @description Classification provider is unavailable or not configured */
5784
- 503: {
6200
+ /** @description Write conflict: an If-Match precondition failed */
6201
+ 409: {
5785
6202
  headers: {
5786
6203
  [name: string]: unknown;
5787
6204
  };
@@ -5789,15 +6206,192 @@ interface paths {
5789
6206
  "application/json": components["schemas"]["ErrorResponse"];
5790
6207
  };
5791
6208
  };
5792
- };
5793
- };
5794
- delete?: never;
5795
- options?: never;
5796
- head?: never;
5797
- patch?: never;
5798
- trace?: never;
5799
- };
5800
- "/v1/roasts/{id}/chart-data": {
6209
+ /** @description Per-user mutation throttle exceeded; retry after a short wait */
6210
+ 429: {
6211
+ headers: {
6212
+ [name: string]: unknown;
6213
+ };
6214
+ content: {
6215
+ "application/json": components["schemas"]["ErrorResponse"];
6216
+ };
6217
+ };
6218
+ /** @description Roast writes are not enabled in this environment */
6219
+ 503: {
6220
+ headers: {
6221
+ [name: string]: unknown;
6222
+ };
6223
+ content: {
6224
+ "application/json": components["schemas"]["ErrorResponse"];
6225
+ };
6226
+ };
6227
+ };
6228
+ };
6229
+ post?: never;
6230
+ /**
6231
+ * Clear a roast's Artisan import
6232
+ * @description Remove import-derived temperature samples, event markers, and artisan_import_log rows from one of the caller's existing roasts without deleting the roast profile. Import-derived profile metrics are reset to manual/null values. Requires an authenticated session, or an owner-bound API key carrying the exact roast:write scope.
6233
+ */
6234
+ delete: {
6235
+ parameters: {
6236
+ query?: never;
6237
+ header?: never;
6238
+ path: {
6239
+ id: number;
6240
+ };
6241
+ cookie?: never;
6242
+ };
6243
+ requestBody?: never;
6244
+ responses: {
6245
+ /** @description The cleared roast id plus deleted row counts */
6246
+ 200: {
6247
+ headers: {
6248
+ [name: string]: unknown;
6249
+ };
6250
+ content: {
6251
+ "application/json": components["schemas"]["RoastArtisanImportClearResponse"];
6252
+ };
6253
+ };
6254
+ /** @description Authentication required */
6255
+ 401: {
6256
+ headers: {
6257
+ [name: string]: unknown;
6258
+ };
6259
+ content: {
6260
+ "application/json": components["schemas"]["ErrorResponse"];
6261
+ };
6262
+ };
6263
+ /** @description Insufficient entitlement (plan or role) */
6264
+ 403: {
6265
+ headers: {
6266
+ [name: string]: unknown;
6267
+ };
6268
+ content: {
6269
+ "application/json": components["schemas"]["ErrorResponse"];
6270
+ };
6271
+ };
6272
+ /** @description No such roast profile owned by the caller */
6273
+ 404: {
6274
+ headers: {
6275
+ [name: string]: unknown;
6276
+ };
6277
+ content: {
6278
+ "application/json": components["schemas"]["ErrorResponse"];
6279
+ };
6280
+ };
6281
+ /** @description Per-user mutation throttle exceeded; retry after a short wait */
6282
+ 429: {
6283
+ headers: {
6284
+ [name: string]: unknown;
6285
+ };
6286
+ content: {
6287
+ "application/json": components["schemas"]["ErrorResponse"];
6288
+ };
6289
+ };
6290
+ /** @description Roast writes are not enabled in this environment */
6291
+ 503: {
6292
+ headers: {
6293
+ [name: string]: unknown;
6294
+ };
6295
+ content: {
6296
+ "application/json": components["schemas"]["ErrorResponse"];
6297
+ };
6298
+ };
6299
+ };
6300
+ };
6301
+ options?: never;
6302
+ head?: never;
6303
+ patch?: never;
6304
+ trace?: never;
6305
+ };
6306
+ "/v1/roasts/classify": {
6307
+ parameters: {
6308
+ query?: never;
6309
+ header?: never;
6310
+ path?: never;
6311
+ cookie?: never;
6312
+ };
6313
+ get?: never;
6314
+ put?: never;
6315
+ /**
6316
+ * Classify an imported roast
6317
+ * @description Match Artisan roast metadata to one of the supplied owner inventory rows. Requires member entitlement and either an authenticated session or an owner-bound API key carrying the exact roast:read scope.
6318
+ */
6319
+ post: {
6320
+ parameters: {
6321
+ query?: never;
6322
+ header?: never;
6323
+ path?: never;
6324
+ cookie?: never;
6325
+ };
6326
+ requestBody: {
6327
+ content: {
6328
+ "application/json": components["schemas"]["RoastClassificationRequest"];
6329
+ };
6330
+ };
6331
+ responses: {
6332
+ /** @description Best inventory match, or null when no reasonable match exists */
6333
+ 200: {
6334
+ headers: {
6335
+ [name: string]: unknown;
6336
+ };
6337
+ content: {
6338
+ "application/json": components["schemas"]["RoastClassificationResponse"];
6339
+ };
6340
+ };
6341
+ /** @description Invalid request body or input cap exceeded */
6342
+ 400: {
6343
+ headers: {
6344
+ [name: string]: unknown;
6345
+ };
6346
+ content: {
6347
+ "application/json": components["schemas"]["ErrorResponse"];
6348
+ };
6349
+ };
6350
+ /** @description Authentication required */
6351
+ 401: {
6352
+ headers: {
6353
+ [name: string]: unknown;
6354
+ };
6355
+ content: {
6356
+ "application/json": components["schemas"]["ErrorResponse"];
6357
+ };
6358
+ };
6359
+ /** @description Insufficient entitlement (plan or role) */
6360
+ 403: {
6361
+ headers: {
6362
+ [name: string]: unknown;
6363
+ };
6364
+ content: {
6365
+ "application/json": components["schemas"]["ErrorResponse"];
6366
+ };
6367
+ };
6368
+ /** @description API or upstream classification rate limit exceeded */
6369
+ 429: {
6370
+ headers: {
6371
+ [name: string]: unknown;
6372
+ };
6373
+ content: {
6374
+ "application/json": components["schemas"]["ErrorResponse"];
6375
+ };
6376
+ };
6377
+ /** @description Classification provider is unavailable or not configured */
6378
+ 503: {
6379
+ headers: {
6380
+ [name: string]: unknown;
6381
+ };
6382
+ content: {
6383
+ "application/json": components["schemas"]["ErrorResponse"];
6384
+ };
6385
+ };
6386
+ };
6387
+ };
6388
+ delete?: never;
6389
+ options?: never;
6390
+ head?: never;
6391
+ patch?: never;
6392
+ trace?: never;
6393
+ };
6394
+ "/v1/roasts/{id}/chart-data": {
5801
6395
  parameters: {
5802
6396
  query?: never;
5803
6397
  header?: never;
@@ -6765,6 +7359,16 @@ interface components {
6765
7359
  continent?: string | null;
6766
7360
  country?: string | null;
6767
7361
  region?: string | null;
7362
+ /** @description Raw source geography for display; not a canonical place identity or filter value */
7363
+ subregion?: string | null;
7364
+ /** @description Raw source geography for display; not a canonical place identity or filter value */
7365
+ locality?: string | null;
7366
+ /** @description Raw cultivation-site label for display; not a canonical place identity or filter value */
7367
+ site?: string | null;
7368
+ /** @description Reported minimum elevation in meters above sea level (member sessions and paid API tiers only) */
7369
+ elevation_min_masl?: number | null;
7370
+ /** @description Reported maximum elevation in meters above sea level (member sessions and paid API tiers only) */
7371
+ elevation_max_masl?: number | null;
6768
7372
  processing?: string | null;
6769
7373
  cultivar_detail?: string | null;
6770
7374
  type?: string | null;
@@ -6861,6 +7465,135 @@ interface components {
6861
7465
  }[];
6862
7466
  };
6863
7467
  };
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;
7528
+ count: number;
7529
+ }[];
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
+ };
6864
7597
  CatalogFacetsResponse: {
6865
7598
  /** @description Compatibility-friendly unique values for dropdown filters. Keys with no values are omitted. */
6866
7599
  values: {
@@ -8432,14 +9165,121 @@ interface components {
8432
9165
  };
8433
9166
  };
8434
9167
  };
8435
- ManualInventoryBatchResult: {
8436
- /** Format: uuid */
8437
- batchId: string;
8438
- items: {
8439
- /** Format: uuid */
8440
- rowId: string;
8441
- resource: components["schemas"]["InventoryResource"];
8442
- }[];
9168
+ InventoryShareGrantScope: {
9169
+ /** @enum {string} */
9170
+ type: "all";
9171
+ } | {
9172
+ /** @enum {string} */
9173
+ type: "inventory";
9174
+ inventoryId: number;
9175
+ };
9176
+ InventoryShareGrant: {
9177
+ /** Format: uuid */
9178
+ id: string;
9179
+ /** @description 256-bit bearer capability returned only when the grant is created or replayed with the same operation and payload. */
9180
+ token: string;
9181
+ scope: components["schemas"]["InventoryShareGrantScope"];
9182
+ /** Format: date-time */
9183
+ expiresAt: string;
9184
+ };
9185
+ InventoryShareGrantCreateResponse: {
9186
+ data: components["schemas"]["InventoryShareGrant"];
9187
+ meta: {
9188
+ /** @enum {string} */
9189
+ resource: "inventory-share-grant";
9190
+ /** @enum {string} */
9191
+ namespace: "/v1/inventory/share-grants";
9192
+ /** @enum {string} */
9193
+ version: "v1";
9194
+ };
9195
+ };
9196
+ InventoryShareGrantCreateRequest: {
9197
+ /**
9198
+ * Format: uuid
9199
+ * @description Stable owner-scoped operation identity. Reusing it with the same normalized request replays the original grant and token; changing the request conflicts.
9200
+ */
9201
+ operationId: string;
9202
+ scope: components["schemas"]["InventoryShareGrantScope"];
9203
+ /** @description Grant lifetime in whole days (default 7, maximum 30). */
9204
+ expiresInDays?: number;
9205
+ };
9206
+ InventoryShareCatalog: {
9207
+ name: string | null;
9208
+ score_value: number | null;
9209
+ arrival_date: string | null;
9210
+ continent: string | null;
9211
+ country: string | null;
9212
+ region: string | null;
9213
+ processing: string | null;
9214
+ drying_method: string | null;
9215
+ lot_size: string | null;
9216
+ bag_size: string | null;
9217
+ packaging: string | null;
9218
+ cultivar_detail: string | null;
9219
+ grade: string | null;
9220
+ appearance: string | null;
9221
+ roast_recs: string | null;
9222
+ type: string | null;
9223
+ description_short: string | null;
9224
+ description_long: string | null;
9225
+ farm_notes: string | null;
9226
+ link: string | null;
9227
+ cost_lb: number | null;
9228
+ price_per_lb: number | null;
9229
+ source: string | null;
9230
+ stocked: boolean | null;
9231
+ cupping_notes: string | null;
9232
+ stocked_date: string | null;
9233
+ unstocked_date: string | null;
9234
+ ai_description: string | null;
9235
+ ai_tasting_notes: string | null;
9236
+ public_coffee: boolean | null;
9237
+ wholesale: boolean | null;
9238
+ price_tiers: {
9239
+ min_lbs: number;
9240
+ price: number;
9241
+ }[] | null;
9242
+ } | null;
9243
+ InventoryShareRoastSummary: {
9244
+ oz_in: number | null;
9245
+ oz_out: number | null;
9246
+ weight_loss_percent: number | null;
9247
+ roast_id: number;
9248
+ batch_name: string | null;
9249
+ roast_date: string | null;
9250
+ };
9251
+ InventoryShareInventory: {
9252
+ id: number;
9253
+ rank: number | null;
9254
+ notes: string | null;
9255
+ cupping_notes: string | number | boolean | unknown[] | {
9256
+ [key: string]: unknown;
9257
+ } | null;
9258
+ purchase_date: string | null;
9259
+ purchased_qty_lbs: number | null;
9260
+ bean_cost: number | null;
9261
+ tax_ship_cost: number | null;
9262
+ last_updated: string | null;
9263
+ catalog_id: number | null;
9264
+ stocked: boolean | null;
9265
+ ai_tasting_notes: string | null;
9266
+ coffee_catalog: components["schemas"]["InventoryShareCatalog"];
9267
+ roast_profiles: components["schemas"]["InventoryShareRoastSummary"][];
9268
+ };
9269
+ InventoryShareGrantRedeemResponse: {
9270
+ data: components["schemas"]["InventoryShareInventory"][];
9271
+ };
9272
+ InventoryShareGrantRedeemRequest: {
9273
+ token: string;
9274
+ };
9275
+ ManualInventoryBatchResult: {
9276
+ /** Format: uuid */
9277
+ batchId: string;
9278
+ items: {
9279
+ /** Format: uuid */
9280
+ rowId: string;
9281
+ resource: components["schemas"]["InventoryResource"];
9282
+ }[];
8443
9283
  };
8444
9284
  ManualInventoryBatchResponse: {
8445
9285
  data: components["schemas"]["ManualInventoryBatchResult"];
@@ -8863,6 +9703,41 @@ interface components {
8863
9703
  temperatures?: components["schemas"]["RoastTemperatureInput"][];
8864
9704
  events?: components["schemas"]["RoastEventInput"][];
8865
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
+ };
8866
9741
  RoastUpdateRequest: {
8867
9742
  coffeeName?: string;
8868
9743
  batchName?: string;
@@ -8901,6 +9776,10 @@ interface components {
8901
9776
  temperatures?: components["schemas"]["RoastTemperatureInput"][];
8902
9777
  events?: components["schemas"]["RoastEventInput"][];
8903
9778
  };
9779
+ RoastLiveCurveRequest: {
9780
+ temperatures: components["schemas"]["RoastTemperatureInput"][];
9781
+ events: components["schemas"]["RoastEventInput"][];
9782
+ };
8904
9783
  RoastDeleteResponse: {
8905
9784
  data: {
8906
9785
  id: number;
@@ -8924,6 +9803,30 @@ interface components {
8924
9803
  };
8925
9804
  };
8926
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
+ };
8927
9830
  ArtisanImportSummary: {
8928
9831
  fileName: string;
8929
9832
  fileSize: number;
@@ -9430,6 +10333,12 @@ type CatalogFacetsQuery = NonNullable<paths["/v1/catalog/facets"]["get"]["parame
9430
10333
  * into strip-with-notice degradation instead of a 401/403 hard-deny.
9431
10334
  */
9432
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"];
9433
10342
  /** Optional headers for {@link ParchmentClient.catalog.facets}; see {@link CatalogListHeaders}. */
9434
10343
  type CatalogFacetsHeaders = NonNullable<paths["/v1/catalog/facets"]["get"]["parameters"]["header"]>;
9435
10344
  /** Query parameters for {@link ParchmentClient.catalog.originPriceStats}. */
@@ -9480,6 +10389,18 @@ type TrackedLotMutation = components["schemas"]["TrackedLotMutationResponse"];
9480
10389
  type InventoryListQuery = NonNullable<paths["/v1/inventory"]["get"]["parameters"]["query"]>;
9481
10390
  /** Request body for {@link ParchmentClient.inventory.create}. */
9482
10391
  type InventoryCreateRequest = NonNullable<paths["/v1/inventory"]["post"]["requestBody"]>["content"]["application/json"];
10392
+ /** Stable-operation request for {@link ParchmentClient.inventory.shareGrants.create}. */
10393
+ type InventoryShareGrantCreateRequest = NonNullable<paths["/v1/inventory/share-grants"]["post"]["requestBody"]>["content"]["application/json"];
10394
+ /** The one-time raw-token grant returned by create or same-operation replay. */
10395
+ type InventoryShareGrant = components["schemas"]["InventoryShareGrant"];
10396
+ /** Anonymous capability body for {@link ParchmentClient.inventory.shareGrants.redeem}. */
10397
+ type InventoryShareGrantRedeemRequest = NonNullable<paths["/v1/inventory/share-grants/redeem"]["post"]["requestBody"]>["content"]["application/json"];
10398
+ /** Safe legacy-oriented inventory row returned by capability redemption. */
10399
+ type InventoryShareInventory = components["schemas"]["InventoryShareInventory"];
10400
+ /** Catalog allowlist nested in a shared inventory row. */
10401
+ type InventoryShareCatalog = components["schemas"]["InventoryShareCatalog"];
10402
+ /** Six-field roast summary nested in member/admin shares. */
10403
+ type InventoryShareRoastSummary = components["schemas"]["InventoryShareRoastSummary"];
9483
10404
  type CatalogInventoryCreateRequest = components["schemas"]["CatalogInventoryCreateRequest"];
9484
10405
  type ManualInventoryCreateRequest = components["schemas"]["ManualInventoryCreateRequest"];
9485
10406
  /** Request body for {@link ParchmentClient.inventory.createManualBatch}. */
@@ -9504,8 +10425,12 @@ type RoastChartDataQuery = NonNullable<paths["/v1/roasts/{id}/chart-data"]["get"
9504
10425
  type RoastClassificationRequest = NonNullable<paths["/v1/roasts/classify"]["post"]["requestBody"]>["content"]["application/json"];
9505
10426
  /** Request body for {@link ParchmentClient.roasts.create}. */
9506
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"];
9507
10430
  /** Request body for {@link ParchmentClient.roasts.update}. */
9508
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"];
9509
10434
  /** Request body for {@link ParchmentClient.roasts.import}. */
9510
10435
  type RoastImportRequest = NonNullable<paths["/v1/roasts/imports"]["post"]["requestBody"]>["content"]["application/json"];
9511
10436
  /** Request body for {@link ParchmentClient.roasts.replaceArtisanImport}. */
@@ -10327,7 +11252,9 @@ declare function createParchmentClient(options: ParchmentClientOptions): {
10327
11252
  request: (body: AccountDeletionRequest) => Promise<openapi_fetch.FetchResponse<{
10328
11253
  parameters: {
10329
11254
  query?: never;
10330
- header?: never;
11255
+ header
11256
+ /** Optional headers for ranking endpoints; see {@link CatalogListHeaders}. */
11257
+ ? /** Optional headers for ranking endpoints; see {@link CatalogListHeaders}. */: never;
10331
11258
  path?: never;
10332
11259
  cookie?: never;
10333
11260
  };
@@ -10654,7 +11581,7 @@ declare function createParchmentClient(options: ParchmentClientOptions): {
10654
11581
  [name: string]: unknown;
10655
11582
  };
10656
11583
  content: {
10657
- "application/json": components["schemas"]["ErrorResponse"];
11584
+ "application/json": components["schemas"] /** Actionable market value signals. */["ErrorResponse"];
10658
11585
  };
10659
11586
  };
10660
11587
  503: {
@@ -10710,7 +11637,7 @@ declare function createParchmentClient(options: ParchmentClientOptions): {
10710
11637
  [name: string]: unknown;
10711
11638
  };
10712
11639
  content: {
10713
- "application/json": components["schemas"]["ErrorResponse"];
11640
+ "application/json": components["schemas"] /** Actionable market value signals. */["ErrorResponse"];
10714
11641
  };
10715
11642
  };
10716
11643
  503: {
@@ -11484,6 +12411,8 @@ declare function createParchmentClient(options: ParchmentClientOptions): {
11484
12411
  scoreValueMax?: number | null;
11485
12412
  pricePerLbMin?: number | null;
11486
12413
  pricePerLbMax?: number | null;
12414
+ elevationMinMasl?: number | null;
12415
+ elevationMaxMasl?: number | null;
11487
12416
  processing_base_method?: string;
11488
12417
  fermentation_type?: string;
11489
12418
  process_additive?: string;
@@ -11557,12 +12486,151 @@ declare function createParchmentClient(options: ParchmentClientOptions): {
11557
12486
  scoreValueMax?: number | null;
11558
12487
  pricePerLbMin?: number | null;
11559
12488
  pricePerLbMax?: number | null;
12489
+ elevationMinMasl?: number | null;
12490
+ elevationMaxMasl?: number | null;
12491
+ processing_base_method?: string;
12492
+ fermentation_type?: string;
12493
+ process_additive?: string;
12494
+ has_additives?: "true" | "false";
12495
+ processing_disclosure_level?: string;
12496
+ processing_confidence_min?: number | null;
12497
+ } | undefined;
12498
+ header: {
12499
+ Prefer?: string;
12500
+ } | undefined;
12501
+ };
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;
11560
12624
  processing_base_method?: string;
11561
12625
  fermentation_type?: string;
11562
12626
  process_additive?: string;
11563
12627
  has_additives?: "true" | "false";
11564
12628
  processing_disclosure_level?: string;
11565
12629
  processing_confidence_min?: number | null;
12630
+ place_id?: string;
12631
+ bbox?: string;
12632
+ zoom?: number;
12633
+ lens?: "catalog" | "elevation";
11566
12634
  } | undefined;
11567
12635
  header: {
11568
12636
  Prefer?: string;
@@ -11601,6 +12669,8 @@ declare function createParchmentClient(options: ParchmentClientOptions): {
11601
12669
  scoreValueMax?: number | null;
11602
12670
  pricePerLbMin?: number | null;
11603
12671
  pricePerLbMax?: number | null;
12672
+ elevationMinMasl?: number | null;
12673
+ elevationMaxMasl?: number | null;
11604
12674
  processing_base_method?: string;
11605
12675
  fermentation_type?: string;
11606
12676
  process_additive?: string;
@@ -11669,6 +12739,8 @@ declare function createParchmentClient(options: ParchmentClientOptions): {
11669
12739
  scoreValueMax?: number | null;
11670
12740
  pricePerLbMin?: number | null;
11671
12741
  pricePerLbMax?: number | null;
12742
+ elevationMinMasl?: number | null;
12743
+ elevationMaxMasl?: number | null;
11672
12744
  processing_base_method?: string;
11673
12745
  fermentation_type?: string;
11674
12746
  process_additive?: string;
@@ -13269,9 +14341,142 @@ declare function createParchmentClient(options: ParchmentClientOptions): {
13269
14341
  } | undefined;
13270
14342
  };
13271
14343
  }, `${string}/${string}`>>;
13272
- /**
13273
- * Create an owner inventory lot. Requires a session or an owner-bound API
13274
- * key carrying the exact `inventory:write` scope. Manual coffee creates
14344
+ shareGrants: {
14345
+ /**
14346
+ * Mint or replay a bounded cross-principal inventory capability. The
14347
+ * operation UUID is payload-bound and the raw token is returned only
14348
+ * by this response.
14349
+ */
14350
+ create: (body: InventoryShareGrantCreateRequest) => Promise<openapi_fetch.FetchResponse<{
14351
+ parameters: {
14352
+ query?: never;
14353
+ header?: never;
14354
+ path?: never;
14355
+ cookie?: never;
14356
+ };
14357
+ requestBody: {
14358
+ content: {
14359
+ "application/json": components["schemas"]["InventoryShareGrantCreateRequest"];
14360
+ };
14361
+ };
14362
+ responses: {
14363
+ 201: {
14364
+ headers: {
14365
+ "Cache-Control"?: "no-store";
14366
+ [name: string]: unknown;
14367
+ };
14368
+ content: {
14369
+ "application/json": components["schemas"]["InventoryShareGrantCreateResponse"];
14370
+ };
14371
+ };
14372
+ 400: {
14373
+ headers: {
14374
+ [name: string]: unknown;
14375
+ };
14376
+ content: {
14377
+ "application/json": components["schemas"]["ErrorResponse"];
14378
+ };
14379
+ };
14380
+ 401: {
14381
+ headers: {
14382
+ [name: string]: unknown;
14383
+ };
14384
+ content: {
14385
+ "application/json": components["schemas"]["ErrorResponse"];
14386
+ };
14387
+ };
14388
+ 403: {
14389
+ headers: {
14390
+ [name: string]: unknown;
14391
+ };
14392
+ content: {
14393
+ "application/json": components["schemas"]["ErrorResponse"];
14394
+ };
14395
+ };
14396
+ 404: {
14397
+ headers: {
14398
+ [name: string]: unknown;
14399
+ };
14400
+ content: {
14401
+ "application/json": components["schemas"]["ErrorResponse"];
14402
+ };
14403
+ };
14404
+ 409: {
14405
+ headers: {
14406
+ [name: string]: unknown;
14407
+ };
14408
+ content: {
14409
+ "application/json": components["schemas"]["ErrorResponse"];
14410
+ };
14411
+ };
14412
+ 429: {
14413
+ headers: {
14414
+ [name: string]: unknown;
14415
+ };
14416
+ content: {
14417
+ "application/json": components["schemas"]["ErrorResponse"];
14418
+ };
14419
+ };
14420
+ 503: {
14421
+ headers: {
14422
+ [name: string]: unknown;
14423
+ };
14424
+ content: {
14425
+ "application/json": components["schemas"]["ErrorResponse"];
14426
+ };
14427
+ };
14428
+ };
14429
+ }, {
14430
+ body: {
14431
+ operationId: string;
14432
+ scope: components["schemas"]["InventoryShareGrantScope"];
14433
+ expiresInDays?: number;
14434
+ };
14435
+ }, `${string}/${string}`>>;
14436
+ /**
14437
+ * Redeem a capability supplied in JSON (never in a URL). This helper
14438
+ * does not require the client to be configured with a bearer token.
14439
+ */
14440
+ redeem: (body: InventoryShareGrantRedeemRequest) => Promise<openapi_fetch.FetchResponse<{
14441
+ parameters: {
14442
+ query?: never;
14443
+ header?: never;
14444
+ path?: never;
14445
+ cookie?: never;
14446
+ };
14447
+ requestBody: {
14448
+ content: {
14449
+ "application/json": components["schemas"]["InventoryShareGrantRedeemRequest"];
14450
+ };
14451
+ };
14452
+ responses: {
14453
+ 200: {
14454
+ headers: {
14455
+ "Cache-Control"?: "no-store";
14456
+ [name: string]: unknown;
14457
+ };
14458
+ content: {
14459
+ "application/json": components["schemas"]["InventoryShareGrantRedeemResponse"];
14460
+ };
14461
+ };
14462
+ 429: {
14463
+ headers: {
14464
+ [name: string]: unknown;
14465
+ };
14466
+ content: {
14467
+ "application/json": components["schemas"]["ErrorResponse"];
14468
+ };
14469
+ };
14470
+ };
14471
+ }, {
14472
+ body: {
14473
+ token: string;
14474
+ };
14475
+ }, `${string}/${string}`>>;
14476
+ };
14477
+ /**
14478
+ * Create an owner inventory lot. Requires a session or an owner-bound API
14479
+ * key carrying the exact `inventory:write` scope. Manual coffee creates
13275
14480
  * require `idempotencyKey`; catalog-backed creates accept it optionally.
13276
14481
  * The same key and payload replay the original result.
13277
14482
  */
@@ -14663,6 +15868,104 @@ declare function createParchmentClient(options: ParchmentClientOptions): {
14663
15868
  };
14664
15869
  } | undefined;
14665
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}`>>;
14666
15969
  /**
14667
15970
  * Update one of the caller's own roast profiles. Pass `ifMatch` (the
14668
15971
  * row's `last_updated`) to enable optimistic concurrency (409 on mismatch).
@@ -14874,6 +16177,184 @@ declare function createParchmentClient(options: ParchmentClientOptions): {
14874
16177
  };
14875
16178
  };
14876
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}`>>;
14877
16358
  /**
14878
16359
  * Create a roast profile from an Artisan `.alog` file against one of the
14879
16360
  * caller's green-coffee lots, persisting the imported curve, events, and
@@ -15703,4 +17184,4 @@ declare function createParchmentClient(options: ParchmentClientOptions): {
15703
17184
  };
15704
17185
  type ParchmentClient = ReturnType<typeof createParchmentClient>;
15705
17186
 
15706
- 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 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 };