@purveyors/sdk 0.53.0 → 0.56.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
@@ -1159,7 +1159,10 @@ interface paths {
1159
1159
  };
1160
1160
  get?: never;
1161
1161
  put?: never;
1162
- /** Snapshot an executed roast as a reference profile */
1162
+ /**
1163
+ * Save an executed roast as a reference profile
1164
+ * @description Save one of the caller's executed roasts as a reference profile. The default `chart_snapshot` basis stores the roast's chart for comparison only. The `artisan_source` basis copies the Artisan file the roast was imported from, so the reference can be the base for a planned profile and its export; it requires a roast with an Artisan file on record, returns 400 `roast_artisan_source_unavailable` with a `reason` otherwise, and returns the reference already saved from that roast's file instead of creating a duplicate. The roast is never modified. Requires Mallard Studio, and for API keys the exact roast:read and roast:write scopes.
1165
+ */
1163
1166
  post: {
1164
1167
  parameters: {
1165
1168
  query?: never;
@@ -1175,7 +1178,22 @@ interface paths {
1175
1178
  };
1176
1179
  };
1177
1180
  responses: {
1178
- /** @description Created immutable roast snapshot */
1181
+ /** @description The reference already saved from this roast's Artisan file */
1182
+ 200: {
1183
+ headers: {
1184
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
1185
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
1186
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
1187
+ "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
1188
+ "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
1189
+ "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
1190
+ [name: string]: unknown;
1191
+ };
1192
+ content: {
1193
+ "application/json": components["schemas"]["ReferenceProfileResponse"];
1194
+ };
1195
+ };
1196
+ /** @description Created reference profile */
1179
1197
  201: {
1180
1198
  headers: {
1181
1199
  "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
@@ -1190,8 +1208,144 @@ interface paths {
1190
1208
  "application/json": components["schemas"]["ReferenceProfileResponse"];
1191
1209
  };
1192
1210
  };
1193
- /** @description Invalid request */
1211
+ /** @description Invalid request, or the roast has no usable Artisan file on record */
1194
1212
  400: {
1213
+ headers: {
1214
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
1215
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
1216
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
1217
+ "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
1218
+ "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
1219
+ "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
1220
+ [name: string]: unknown;
1221
+ };
1222
+ content: {
1223
+ "application/json": components["schemas"]["RoastSourceErrorResponse"];
1224
+ };
1225
+ };
1226
+ /** @description Authentication required */
1227
+ 401: {
1228
+ headers: {
1229
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
1230
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
1231
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
1232
+ "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
1233
+ "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
1234
+ "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
1235
+ [name: string]: unknown;
1236
+ };
1237
+ content: {
1238
+ "application/json": components["schemas"]["ErrorResponse"];
1239
+ };
1240
+ };
1241
+ /** @description Insufficient entitlement (plan or role) */
1242
+ 403: {
1243
+ headers: {
1244
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
1245
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
1246
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
1247
+ "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
1248
+ "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
1249
+ "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
1250
+ [name: string]: unknown;
1251
+ };
1252
+ content: {
1253
+ "application/json": components["schemas"]["ErrorResponse"];
1254
+ };
1255
+ };
1256
+ /** @description Reference profile or source roast not found */
1257
+ 404: {
1258
+ headers: {
1259
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
1260
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
1261
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
1262
+ "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
1263
+ "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
1264
+ "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
1265
+ [name: string]: unknown;
1266
+ };
1267
+ content: {
1268
+ "application/json": components["schemas"]["ErrorResponse"];
1269
+ };
1270
+ };
1271
+ /** @description Revision, idempotency, or concurrency conflict */
1272
+ 409: {
1273
+ headers: {
1274
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
1275
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
1276
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
1277
+ "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
1278
+ "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
1279
+ "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
1280
+ [name: string]: unknown;
1281
+ };
1282
+ content: {
1283
+ "application/json": components["schemas"]["ErrorResponse"];
1284
+ };
1285
+ };
1286
+ 429: components["responses"]["ApiRateLimitExceeded"];
1287
+ };
1288
+ };
1289
+ delete?: never;
1290
+ options?: never;
1291
+ head?: never;
1292
+ patch?: never;
1293
+ trace?: never;
1294
+ };
1295
+ "/v1/reference-profiles/from-roast/candidates": {
1296
+ parameters: {
1297
+ query?: never;
1298
+ header?: never;
1299
+ path?: never;
1300
+ cookie?: never;
1301
+ };
1302
+ /**
1303
+ * List executed roasts that can be the base for a planned profile
1304
+ * @description List the caller's executed roasts whose Artisan file is on record, newest first, each with its current revision token and the reference it is or would be saved under. `ineligibleRoastCount` counts the caller's other roasts, which have no usable Artisan file on record (entered manually, logged live, imported before files were kept, or holding a file larger than a reference profile allows). Requires Mallard Studio, and for API keys the exact roast:read scope.
1305
+ */
1306
+ get: {
1307
+ parameters: {
1308
+ query?: {
1309
+ limit?: number;
1310
+ };
1311
+ header?: never;
1312
+ path?: never;
1313
+ cookie?: never;
1314
+ };
1315
+ requestBody?: never;
1316
+ responses: {
1317
+ /** @description Roasts with an Artisan file on record */
1318
+ 200: {
1319
+ headers: {
1320
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
1321
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
1322
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
1323
+ "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
1324
+ "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
1325
+ "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
1326
+ [name: string]: unknown;
1327
+ };
1328
+ content: {
1329
+ "application/json": components["schemas"]["ReferenceProfileRoastCandidatesResponse"];
1330
+ };
1331
+ };
1332
+ /** @description Authentication required */
1333
+ 401: {
1334
+ headers: {
1335
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
1336
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
1337
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
1338
+ "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
1339
+ "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
1340
+ "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
1341
+ [name: string]: unknown;
1342
+ };
1343
+ content: {
1344
+ "application/json": components["schemas"]["ErrorResponse"];
1345
+ };
1346
+ };
1347
+ /** @description Insufficient entitlement (plan or role) */
1348
+ 403: {
1195
1349
  headers: {
1196
1350
  "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
1197
1351
  "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
@@ -1205,6 +1359,73 @@ interface paths {
1205
1359
  "application/json": components["schemas"]["ErrorResponse"];
1206
1360
  };
1207
1361
  };
1362
+ 429: components["responses"]["ApiRateLimitExceeded"];
1363
+ };
1364
+ };
1365
+ put?: never;
1366
+ post?: never;
1367
+ delete?: never;
1368
+ options?: never;
1369
+ head?: never;
1370
+ patch?: never;
1371
+ trace?: never;
1372
+ };
1373
+ "/v1/reference-profiles/from-roast/preview": {
1374
+ parameters: {
1375
+ query?: never;
1376
+ header?: never;
1377
+ path?: never;
1378
+ cookie?: never;
1379
+ };
1380
+ get?: never;
1381
+ put?: never;
1382
+ /**
1383
+ * Preview a planned profile based on an executed roast
1384
+ * @description Preview a constrained planned profile built on the Artisan file one of the caller's executed roasts was imported from. Read-only: nothing is saved and the roast is not modified. Returns the same measured preview as a saved reference, plus the reference identity a later save would use. Roasts without a usable Artisan file on record return 400 `roast_artisan_source_unavailable` with a `reason`. Requires Mallard Studio, and for API keys the exact roast:read scope.
1385
+ */
1386
+ post: {
1387
+ parameters: {
1388
+ query?: never;
1389
+ header?: never;
1390
+ path?: never;
1391
+ cookie?: never;
1392
+ };
1393
+ requestBody: {
1394
+ content: {
1395
+ "application/json": components["schemas"]["ReferenceProfileRoastGenerationRequest"];
1396
+ };
1397
+ };
1398
+ responses: {
1399
+ /** @description Deterministic preview without persistence */
1400
+ 200: {
1401
+ headers: {
1402
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
1403
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
1404
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
1405
+ "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
1406
+ "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
1407
+ "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
1408
+ [name: string]: unknown;
1409
+ };
1410
+ content: {
1411
+ "application/json": components["schemas"]["ReferenceProfileRoastGenerationPreviewResponse"];
1412
+ };
1413
+ };
1414
+ /** @description Invalid request, or the roast has no usable Artisan file on record */
1415
+ 400: {
1416
+ headers: {
1417
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
1418
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
1419
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
1420
+ "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
1421
+ "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
1422
+ "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
1423
+ [name: string]: unknown;
1424
+ };
1425
+ content: {
1426
+ "application/json": components["schemas"]["RoastSourceErrorResponse"];
1427
+ };
1428
+ };
1208
1429
  /** @description Authentication required */
1209
1430
  401: {
1210
1431
  headers: {
@@ -6007,7 +6228,7 @@ interface paths {
6007
6228
  };
6008
6229
  /**
6009
6230
  * Find catalog coffees similar to a target coffee
6010
- * @description Vector-similarity matches between public supplier catalog coffees, with deterministic identity gating, supplier-diversity re-ranking, and a canonical/similar split. User-owned coffees are excluded. Available to member sessions and customer API keys; API keys also require catalog:read. Green responses return at most 25 matches.
6231
+ * @description Vector-similarity matches between public supplier catalog coffees, with deterministic identity gating, supplier-diversity re-ranking, and a canonical/similar split. User-owned coffees are excluded. Available to member sessions, or any customer API key with catalog:read (all API plans, within plan quota). Responses return at most 25 matches.
6011
6232
  */
6012
6233
  get: {
6013
6234
  parameters: {
@@ -6298,7 +6519,7 @@ interface paths {
6298
6519
  patch?: never;
6299
6520
  trace?: never;
6300
6521
  };
6301
- "/v1/catalog/{id}/price-history": {
6522
+ "/v1/catalog/taxonomies": {
6302
6523
  parameters: {
6303
6524
  query?: never;
6304
6525
  header?: never;
@@ -6306,23 +6527,21 @@ interface paths {
6306
6527
  cookie?: never;
6307
6528
  };
6308
6529
  /**
6309
- * Daily price history for one catalog coffee
6310
- * @description Daily price, full tier ladder, and stock state for one public supplier catalog coffee over 7 to 365 days (default 90), with minimum-tier change events so packaging changes are not read as price cuts. Available to member sessions, Parchment Intelligence sessions, and customer API keys with catalog:read.
6530
+ * Variety, species, and drying-method vocabularies
6531
+ * @description Lists canonical variety, species, and drying-method codes with labels, family links (`parent_code`), descriptions, and the supplier spellings (`aliases`) that map to each code. Reference data: identical for every authorized caller and not subject to row projection or collection limits. Retired codes are omitted unless includeRetired=true, except a retired family or species that an active code still names in `parent_code` or `species_code`: it is returned with `active: false` so every link resolves within the response. New values are added as rows; clients should not hard-code the lists.
6311
6532
  */
6312
6533
  get: {
6313
6534
  parameters: {
6314
6535
  query?: {
6315
- days?: string;
6536
+ includeRetired?: "true" | "false";
6316
6537
  };
6317
6538
  header?: never;
6318
- path: {
6319
- id: string;
6320
- };
6539
+ path?: never;
6321
6540
  cookie?: never;
6322
6541
  };
6323
6542
  requestBody?: never;
6324
6543
  responses: {
6325
- /** @description Daily price history with minimum-tier change events */
6544
+ /** @description Taxonomy vocabularies */
6326
6545
  200: {
6327
6546
  headers: {
6328
6547
  "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
@@ -6334,22 +6553,7 @@ interface paths {
6334
6553
  [name: string]: unknown;
6335
6554
  };
6336
6555
  content: {
6337
- "application/json": components["schemas"]["LotPriceHistoryResponse"];
6338
- };
6339
- };
6340
- /** @description Invalid path id or days */
6341
- 400: {
6342
- headers: {
6343
- "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
6344
- "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
6345
- "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
6346
- "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
6347
- "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
6348
- "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
6349
- [name: string]: unknown;
6350
- };
6351
- content: {
6352
- "application/json": components["schemas"]["ErrorResponse"];
6556
+ "application/json": components["schemas"]["CatalogTaxonomiesResponse"];
6353
6557
  };
6354
6558
  };
6355
6559
  /** @description Authentication required */
@@ -6382,21 +6586,6 @@ interface paths {
6382
6586
  "application/json": components["schemas"]["ErrorResponse"];
6383
6587
  };
6384
6588
  };
6385
- /** @description Catalog coffee not found */
6386
- 404: {
6387
- headers: {
6388
- "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
6389
- "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
6390
- "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
6391
- "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
6392
- "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
6393
- "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
6394
- [name: string]: unknown;
6395
- };
6396
- content: {
6397
- "application/json": components["schemas"]["ErrorResponse"];
6398
- };
6399
- };
6400
6589
  429: components["responses"]["ApiRateLimitExceeded"];
6401
6590
  };
6402
6591
  };
@@ -6408,7 +6597,7 @@ interface paths {
6408
6597
  patch?: never;
6409
6598
  trace?: never;
6410
6599
  };
6411
- "/v1/procurement/briefs": {
6600
+ "/v1/catalog/{id}/price-history": {
6412
6601
  parameters: {
6413
6602
  query?: never;
6414
6603
  header?: never;
@@ -6416,12 +6605,122 @@ interface paths {
6416
6605
  cookie?: never;
6417
6606
  };
6418
6607
  /**
6419
- * List saved sourcing briefs
6420
- * @description List the authenticated principal's active sourcing briefs. Requires a Parchment Intelligence or member session, or a paid (member+) API plan; API keys also need the catalog:read scope.
6608
+ * Daily price history for one catalog coffee
6609
+ * @description Daily price, full tier ladder, and stock state for one public supplier catalog coffee over 7 to 365 days (default 90), with minimum-tier change events so packaging changes are not read as price cuts. Available to member sessions, Parchment Intelligence sessions, and customer API keys with catalog:read.
6421
6610
  */
6422
6611
  get: {
6423
6612
  parameters: {
6424
- query?: never;
6613
+ query?: {
6614
+ days?: string;
6615
+ };
6616
+ header?: never;
6617
+ path: {
6618
+ id: string;
6619
+ };
6620
+ cookie?: never;
6621
+ };
6622
+ requestBody?: never;
6623
+ responses: {
6624
+ /** @description Daily price history with minimum-tier change events */
6625
+ 200: {
6626
+ headers: {
6627
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
6628
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
6629
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
6630
+ "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
6631
+ "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
6632
+ "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
6633
+ [name: string]: unknown;
6634
+ };
6635
+ content: {
6636
+ "application/json": components["schemas"]["LotPriceHistoryResponse"];
6637
+ };
6638
+ };
6639
+ /** @description Invalid path id or days */
6640
+ 400: {
6641
+ headers: {
6642
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
6643
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
6644
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
6645
+ "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
6646
+ "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
6647
+ "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
6648
+ [name: string]: unknown;
6649
+ };
6650
+ content: {
6651
+ "application/json": components["schemas"]["ErrorResponse"];
6652
+ };
6653
+ };
6654
+ /** @description Authentication required */
6655
+ 401: {
6656
+ headers: {
6657
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
6658
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
6659
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
6660
+ "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
6661
+ "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
6662
+ "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
6663
+ [name: string]: unknown;
6664
+ };
6665
+ content: {
6666
+ "application/json": components["schemas"]["ErrorResponse"];
6667
+ };
6668
+ };
6669
+ /** @description Insufficient entitlement (plan or role) */
6670
+ 403: {
6671
+ headers: {
6672
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
6673
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
6674
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
6675
+ "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
6676
+ "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
6677
+ "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
6678
+ [name: string]: unknown;
6679
+ };
6680
+ content: {
6681
+ "application/json": components["schemas"]["ErrorResponse"];
6682
+ };
6683
+ };
6684
+ /** @description Catalog coffee not found */
6685
+ 404: {
6686
+ headers: {
6687
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
6688
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
6689
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
6690
+ "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
6691
+ "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
6692
+ "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
6693
+ [name: string]: unknown;
6694
+ };
6695
+ content: {
6696
+ "application/json": components["schemas"]["ErrorResponse"];
6697
+ };
6698
+ };
6699
+ 429: components["responses"]["ApiRateLimitExceeded"];
6700
+ };
6701
+ };
6702
+ put?: never;
6703
+ post?: never;
6704
+ delete?: never;
6705
+ options?: never;
6706
+ head?: never;
6707
+ patch?: never;
6708
+ trace?: never;
6709
+ };
6710
+ "/v1/procurement/briefs": {
6711
+ parameters: {
6712
+ query?: never;
6713
+ header?: never;
6714
+ path?: never;
6715
+ cookie?: never;
6716
+ };
6717
+ /**
6718
+ * List saved sourcing briefs
6719
+ * @description List the authenticated principal's active sourcing briefs. Requires a Parchment Intelligence or member session, or a paid (member+) API plan; API keys also need the catalog:read scope.
6720
+ */
6721
+ get: {
6722
+ parameters: {
6723
+ query?: never;
6425
6724
  header?: never;
6426
6725
  path?: never;
6427
6726
  cookie?: never;
@@ -7134,7 +7433,7 @@ interface paths {
7134
7433
  put?: never;
7135
7434
  /**
7136
7435
  * Execute a user-confirmed product action
7137
- * @description Execute one of the closed product actions for the authenticated session owner. The stable executionId provides payload-bound replay, and owner plus entitlement checks run again inside the same database transaction as the mutation. Generated reference saves require explicit user confirmation and remain planned profiles. API keys are not accepted.
7436
+ * @description Execute one of the closed product actions for the authenticated session owner. The stable executionId provides payload-bound replay, and owner plus entitlement checks run again inside the same database transaction as the mutation. Generated reference saves require explicit user confirmation and remain planned profiles; one based on an executed roast also saves that roast's stored Artisan file as its parent reference and never modifies the roast. API keys are not accepted.
7138
7437
  */
7139
7438
  post: {
7140
7439
  parameters: {
@@ -7164,7 +7463,7 @@ interface paths {
7164
7463
  "application/json": components["schemas"]["ConfirmedActionExecuteResponse"];
7165
7464
  };
7166
7465
  };
7167
- /** @description Invalid or unsupported confirmed-action payload */
7466
+ /** @description Invalid or unsupported confirmed-action payload, or a roast-based plan whose roast has no usable Artisan file on record */
7168
7467
  400: {
7169
7468
  headers: {
7170
7469
  "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
@@ -7176,7 +7475,7 @@ interface paths {
7176
7475
  [name: string]: unknown;
7177
7476
  };
7178
7477
  content: {
7179
- "application/json": components["schemas"]["ErrorResponse"];
7478
+ "application/json": components["schemas"]["RoastSourceErrorResponse"];
7180
7479
  };
7181
7480
  };
7182
7481
  /** @description Authentication required */
@@ -9799,7 +10098,7 @@ interface paths {
9799
10098
  get?: never;
9800
10099
  /**
9801
10100
  * Replace an owner roast live curve
9802
- * @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.
10101
+ * @description Atomically replace live temperature samples and all event markers, derive milestone and phase fields upstream, and preserve non-live temperature samples. The fields are derived from milestone events named `charge`, `dry_end`, `fc_start`, `fc_end`, `sc_start`, `drop`, and `cool`; the older names `start`, `maillard`, and `end` are read as `charge`, `dry_end`, and `cool` when the current name is absent. Derived times count from CHARGE, or from the start of the recording when neither `charge` nor `start` is sent, in which case `charge_time` is null. A turning point is not derived. Optional If-Match protects against lost updates.
9803
10102
  */
9804
10103
  put: {
9805
10104
  parameters: {
@@ -10246,7 +10545,7 @@ interface paths {
10246
10545
  patch?: never;
10247
10546
  trace?: never;
10248
10547
  };
10249
- "/v1/roasts/{id}/artisan-import": {
10548
+ "/v1/roasts/imports/from-reference": {
10250
10549
  parameters: {
10251
10550
  query?: never;
10252
10551
  header?: never;
@@ -10254,29 +10553,28 @@ interface paths {
10254
10553
  cookie?: never;
10255
10554
  };
10256
10555
  get?: never;
10556
+ put?: never;
10257
10557
  /**
10258
- * Replace a roast's Artisan import
10259
- * @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.
10558
+ * Create a roast from a saved Artisan reference
10559
+ * @description Create a roast profile owned by the caller from the Artisan file stored with one of their uploaded reference profiles, against one of their green-coffee lots. The curve, events, and import log are written atomically, exactly as a direct Artisan import. Only uploaded Artisan references qualify: a planned (generated) profile is never recorded as a roast, and a reference saved from an existing roast is refused because that roast is already in history. Requires Mallard Studio, and for API keys the exact roast:read and roast:write scopes.
10260
10560
  */
10261
- put: {
10561
+ post: {
10262
10562
  parameters: {
10263
10563
  query?: never;
10264
10564
  header?: {
10265
- "if-match"?: string;
10266
- };
10267
- path: {
10268
- id: number;
10565
+ "idempotency-key"?: string;
10269
10566
  };
10567
+ path?: never;
10270
10568
  cookie?: never;
10271
10569
  };
10272
10570
  requestBody: {
10273
10571
  content: {
10274
- "application/json": components["schemas"]["RoastArtisanImportReplaceRequest"];
10572
+ "application/json": components["schemas"]["RoastImportFromReferenceRequest"];
10275
10573
  };
10276
10574
  };
10277
10575
  responses: {
10278
- /** @description The updated roast profile plus import summary */
10279
- 200: {
10576
+ /** @description The created roast profile plus import summary */
10577
+ 201: {
10280
10578
  headers: {
10281
10579
  "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
10282
10580
  "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
@@ -10287,7 +10585,7 @@ interface paths {
10287
10585
  [name: string]: unknown;
10288
10586
  };
10289
10587
  content: {
10290
- "application/json": components["schemas"]["RoastImportResponse"];
10588
+ "application/json": components["schemas"]["RoastImportFromReferenceResponse"];
10291
10589
  };
10292
10590
  };
10293
10591
  /** @description Invalid query parameter */
@@ -10335,7 +10633,7 @@ interface paths {
10335
10633
  "application/json": components["schemas"]["ErrorResponse"];
10336
10634
  };
10337
10635
  };
10338
- /** @description No such roast profile owned by the caller */
10636
+ /** @description No such coffee lot owned by the caller */
10339
10637
  404: {
10340
10638
  headers: {
10341
10639
  "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
@@ -10399,23 +10697,42 @@ interface paths {
10399
10697
  };
10400
10698
  };
10401
10699
  };
10402
- post?: never;
10700
+ delete?: never;
10701
+ options?: never;
10702
+ head?: never;
10703
+ patch?: never;
10704
+ trace?: never;
10705
+ };
10706
+ "/v1/roasts/{id}/artisan-import": {
10707
+ parameters: {
10708
+ query?: never;
10709
+ header?: never;
10710
+ path?: never;
10711
+ cookie?: never;
10712
+ };
10713
+ get?: never;
10403
10714
  /**
10404
- * Clear a roast's Artisan import
10405
- * @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.
10715
+ * Replace a roast's Artisan import
10716
+ * @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.
10406
10717
  */
10407
- delete: {
10718
+ put: {
10408
10719
  parameters: {
10409
10720
  query?: never;
10410
- header?: never;
10721
+ header?: {
10722
+ "if-match"?: string;
10723
+ };
10411
10724
  path: {
10412
10725
  id: number;
10413
10726
  };
10414
10727
  cookie?: never;
10415
10728
  };
10416
- requestBody?: never;
10729
+ requestBody: {
10730
+ content: {
10731
+ "application/json": components["schemas"]["RoastArtisanImportReplaceRequest"];
10732
+ };
10733
+ };
10417
10734
  responses: {
10418
- /** @description The cleared roast id plus deleted row counts */
10735
+ /** @description The updated roast profile plus import summary */
10419
10736
  200: {
10420
10737
  headers: {
10421
10738
  "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
@@ -10427,7 +10744,22 @@ interface paths {
10427
10744
  [name: string]: unknown;
10428
10745
  };
10429
10746
  content: {
10430
- "application/json": components["schemas"]["RoastArtisanImportClearResponse"];
10747
+ "application/json": components["schemas"]["RoastImportResponse"];
10748
+ };
10749
+ };
10750
+ /** @description Invalid query parameter */
10751
+ 400: {
10752
+ headers: {
10753
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
10754
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
10755
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
10756
+ "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
10757
+ "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
10758
+ "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
10759
+ [name: string]: unknown;
10760
+ };
10761
+ content: {
10762
+ "application/json": components["schemas"]["ErrorResponse"];
10431
10763
  };
10432
10764
  };
10433
10765
  /** @description Authentication required */
@@ -10475,6 +10807,21 @@ interface paths {
10475
10807
  "application/json": components["schemas"]["ErrorResponse"];
10476
10808
  };
10477
10809
  };
10810
+ /** @description Write conflict: an If-Match precondition failed */
10811
+ 409: {
10812
+ headers: {
10813
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
10814
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
10815
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
10816
+ "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
10817
+ "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
10818
+ "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
10819
+ [name: string]: unknown;
10820
+ };
10821
+ content: {
10822
+ "application/json": components["schemas"]["ErrorResponse"];
10823
+ };
10824
+ };
10478
10825
  /** @description Per-user mutation throttle exceeded; retry after a short wait Customer API keys may also receive an account monthly or machine burst quota rejection. */
10479
10826
  429: {
10480
10827
  headers: {
@@ -10509,38 +10856,23 @@ interface paths {
10509
10856
  };
10510
10857
  };
10511
10858
  };
10512
- options?: never;
10513
- head?: never;
10514
- patch?: never;
10515
- trace?: never;
10516
- };
10517
- "/v1/roasts/classify": {
10518
- parameters: {
10519
- query?: never;
10520
- header?: never;
10521
- path?: never;
10522
- cookie?: never;
10523
- };
10524
- get?: never;
10525
- put?: never;
10859
+ post?: never;
10526
10860
  /**
10527
- * Classify an imported roast
10528
- * @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.
10861
+ * Clear a roast's Artisan import
10862
+ * @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.
10529
10863
  */
10530
- post: {
10864
+ delete: {
10531
10865
  parameters: {
10532
10866
  query?: never;
10533
10867
  header?: never;
10534
- path?: never;
10535
- cookie?: never;
10536
- };
10537
- requestBody: {
10538
- content: {
10539
- "application/json": components["schemas"]["RoastClassificationRequest"];
10868
+ path: {
10869
+ id: number;
10540
10870
  };
10871
+ cookie?: never;
10541
10872
  };
10873
+ requestBody?: never;
10542
10874
  responses: {
10543
- /** @description Best inventory match, or null when no reasonable match exists */
10875
+ /** @description The cleared roast id plus deleted row counts */
10544
10876
  200: {
10545
10877
  headers: {
10546
10878
  "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
@@ -10552,11 +10884,11 @@ interface paths {
10552
10884
  [name: string]: unknown;
10553
10885
  };
10554
10886
  content: {
10555
- "application/json": components["schemas"]["RoastClassificationResponse"];
10887
+ "application/json": components["schemas"]["RoastArtisanImportClearResponse"];
10556
10888
  };
10557
10889
  };
10558
- /** @description Invalid request body or input cap exceeded */
10559
- 400: {
10890
+ /** @description Authentication required */
10891
+ 401: {
10560
10892
  headers: {
10561
10893
  "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
10562
10894
  "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
@@ -10570,8 +10902,8 @@ interface paths {
10570
10902
  "application/json": components["schemas"]["ErrorResponse"];
10571
10903
  };
10572
10904
  };
10573
- /** @description Authentication required */
10574
- 401: {
10905
+ /** @description Insufficient entitlement (plan or role) */
10906
+ 403: {
10575
10907
  headers: {
10576
10908
  "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
10577
10909
  "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
@@ -10585,8 +10917,8 @@ interface paths {
10585
10917
  "application/json": components["schemas"]["ErrorResponse"];
10586
10918
  };
10587
10919
  };
10588
- /** @description Insufficient entitlement (plan or role) */
10589
- 403: {
10920
+ /** @description No such roast profile owned by the caller */
10921
+ 404: {
10590
10922
  headers: {
10591
10923
  "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
10592
10924
  "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
@@ -10600,7 +10932,7 @@ interface paths {
10600
10932
  "application/json": components["schemas"]["ErrorResponse"];
10601
10933
  };
10602
10934
  };
10603
- /** @description API or upstream classification rate limit exceeded Customer API keys may also receive an account monthly or machine burst quota rejection. */
10935
+ /** @description Per-user mutation throttle exceeded; retry after a short wait Customer API keys may also receive an account monthly or machine burst quota rejection. */
10604
10936
  429: {
10605
10937
  headers: {
10606
10938
  "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
@@ -10617,7 +10949,7 @@ interface paths {
10617
10949
  "application/json": components["schemas"]["ErrorResponse"];
10618
10950
  };
10619
10951
  };
10620
- /** @description Classification provider is unavailable or not configured */
10952
+ /** @description Roast writes are not enabled in this environment */
10621
10953
  503: {
10622
10954
  headers: {
10623
10955
  "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
@@ -10634,23 +10966,148 @@ interface paths {
10634
10966
  };
10635
10967
  };
10636
10968
  };
10637
- delete?: never;
10638
10969
  options?: never;
10639
10970
  head?: never;
10640
10971
  patch?: never;
10641
10972
  trace?: never;
10642
10973
  };
10643
- "/v1/roasts/{id}/chart-data": {
10974
+ "/v1/roasts/classify": {
10644
10975
  parameters: {
10645
10976
  query?: never;
10646
10977
  header?: never;
10647
10978
  path?: never;
10648
10979
  cookie?: never;
10649
10980
  };
10981
+ get?: never;
10982
+ put?: never;
10650
10983
  /**
10651
- * Get sampled roast chart data
10652
- * @description Fetch a chart-ready model with adaptively sampled primary and auxiliary series, discrete events, and metadata for one of the authenticated principal's roast profiles. The legacy flat points projection remains available for compatibility. Requires an authenticated session, or an owner-bound API key carrying the roast:read scope on an uncapped API plan.
10653
- */
10984
+ * Classify an imported roast
10985
+ * @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.
10986
+ */
10987
+ post: {
10988
+ parameters: {
10989
+ query?: never;
10990
+ header?: never;
10991
+ path?: never;
10992
+ cookie?: never;
10993
+ };
10994
+ requestBody: {
10995
+ content: {
10996
+ "application/json": components["schemas"]["RoastClassificationRequest"];
10997
+ };
10998
+ };
10999
+ responses: {
11000
+ /** @description Best inventory match, or null when no reasonable match exists */
11001
+ 200: {
11002
+ headers: {
11003
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
11004
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
11005
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
11006
+ "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
11007
+ "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
11008
+ "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
11009
+ [name: string]: unknown;
11010
+ };
11011
+ content: {
11012
+ "application/json": components["schemas"]["RoastClassificationResponse"];
11013
+ };
11014
+ };
11015
+ /** @description Invalid request body or input cap exceeded */
11016
+ 400: {
11017
+ headers: {
11018
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
11019
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
11020
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
11021
+ "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
11022
+ "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
11023
+ "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
11024
+ [name: string]: unknown;
11025
+ };
11026
+ content: {
11027
+ "application/json": components["schemas"]["ErrorResponse"];
11028
+ };
11029
+ };
11030
+ /** @description Authentication required */
11031
+ 401: {
11032
+ headers: {
11033
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
11034
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
11035
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
11036
+ "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
11037
+ "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
11038
+ "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
11039
+ [name: string]: unknown;
11040
+ };
11041
+ content: {
11042
+ "application/json": components["schemas"]["ErrorResponse"];
11043
+ };
11044
+ };
11045
+ /** @description Insufficient entitlement (plan or role) */
11046
+ 403: {
11047
+ headers: {
11048
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
11049
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
11050
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
11051
+ "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
11052
+ "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
11053
+ "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
11054
+ [name: string]: unknown;
11055
+ };
11056
+ content: {
11057
+ "application/json": components["schemas"]["ErrorResponse"];
11058
+ };
11059
+ };
11060
+ /** @description API or upstream classification rate limit exceeded Customer API keys may also receive an account monthly or machine burst quota rejection. */
11061
+ 429: {
11062
+ headers: {
11063
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
11064
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
11065
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
11066
+ "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
11067
+ "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
11068
+ "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
11069
+ "Retry-After": components["headers"]["Retry-After"];
11070
+ "X-RateLimit-Blocked-By": components["headers"]["X-RateLimit-Blocked-By"];
11071
+ [name: string]: unknown;
11072
+ };
11073
+ content: {
11074
+ "application/json": components["schemas"]["ErrorResponse"];
11075
+ };
11076
+ };
11077
+ /** @description Classification provider is unavailable or not configured */
11078
+ 503: {
11079
+ headers: {
11080
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
11081
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
11082
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
11083
+ "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
11084
+ "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
11085
+ "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
11086
+ [name: string]: unknown;
11087
+ };
11088
+ content: {
11089
+ "application/json": components["schemas"]["ErrorResponse"];
11090
+ };
11091
+ };
11092
+ };
11093
+ };
11094
+ delete?: never;
11095
+ options?: never;
11096
+ head?: never;
11097
+ patch?: never;
11098
+ trace?: never;
11099
+ };
11100
+ "/v1/roasts/{id}/chart-data": {
11101
+ parameters: {
11102
+ query?: never;
11103
+ header?: never;
11104
+ path?: never;
11105
+ cookie?: never;
11106
+ };
11107
+ /**
11108
+ * Get sampled roast chart data
11109
+ * @description Fetch a chart-ready model with adaptively sampled primary and auxiliary series, discrete events, and metadata for one of the authenticated principal's roast profiles. The legacy flat points projection remains available for compatibility. Requires an authenticated session, or an owner-bound API key carrying the roast:read scope on an uncapped API plan.
11110
+ */
10654
11111
  get: {
10655
11112
  parameters: {
10656
11113
  query?: {
@@ -13798,7 +14255,13 @@ interface components {
13798
14255
  updatedAt: string;
13799
14256
  };
13800
14257
  ReferenceProfileListResponse: {
13801
- data: components["schemas"]["ReferenceProfileSummary"][];
14258
+ data: (components["schemas"]["ReferenceProfileSummary"] & {
14259
+ /** @description The executed roast the current revision was saved from, or null for an uploaded or planned profile. */
14260
+ sourceRoast: {
14261
+ id: number;
14262
+ revision: string;
14263
+ } | null;
14264
+ })[];
13802
14265
  meta: {
13803
14266
  /** @enum {string} */
13804
14267
  resource: "reference-profiles";
@@ -13853,6 +14316,7 @@ interface components {
13853
14316
  ReferenceProfileChart: {
13854
14317
  /** @enum {string} */
13855
14318
  temperatureUnit: "F" | "C";
14319
+ /** @description Where CHARGE sits on the chart's clock, in milliseconds since the recording started. Null when no CHARGE is marked. Subtract it from any chart time for time since CHARGE. */
13856
14320
  chargeTimeMilliseconds: number | null;
13857
14321
  series: {
13858
14322
  id: string;
@@ -13863,11 +14327,13 @@ interface components {
13863
14327
  deviceIndex: number | null;
13864
14328
  channel: 1 | 2 | null;
13865
14329
  points: {
14330
+ /** @description Milliseconds since the recording started. Subtract the chart's `chargeTimeMilliseconds` for time since CHARGE. */
13866
14331
  timeMilliseconds: number;
13867
14332
  value: number;
13868
14333
  }[];
13869
14334
  }[];
13870
14335
  events: {
14336
+ /** @description Milliseconds since the recording started. Subtract the chart's `chargeTimeMilliseconds` for time since CHARGE. */
13871
14337
  timeMilliseconds: number;
13872
14338
  name: string;
13873
14339
  value: string | null;
@@ -13902,7 +14368,9 @@ interface components {
13902
14368
  temperatureAdjustments: {
13903
14369
  /** @enum {string} */
13904
14370
  kind: "bean_temperature" | "environmental_temperature";
14371
+ /** @description Start of the change on the parent chart's clock. Milliseconds since the recording started, as chart points are timed. For a time counted from CHARGE, add the chart's `chargeTimeMilliseconds`. */
13905
14372
  startMilliseconds: number;
14373
+ /** @description End of the change on the parent chart's clock. Milliseconds since the recording started, as chart points are timed. For a time counted from CHARGE, add the chart's `chargeTimeMilliseconds`. */
13906
14374
  endMilliseconds: number;
13907
14375
  delta: number;
13908
14376
  }[];
@@ -13922,10 +14390,12 @@ interface components {
13922
14390
  unchangedZeroSampleCount: number;
13923
14391
  parent: {
13924
14392
  first: {
14393
+ /** @description Milliseconds since the recording started. Subtract the chart's `chargeTimeMilliseconds` for time since CHARGE. */
13925
14394
  timeMilliseconds: number;
13926
14395
  value: number;
13927
14396
  } | null;
13928
14397
  last: {
14398
+ /** @description Milliseconds since the recording started. Subtract the chart's `chargeTimeMilliseconds` for time since CHARGE. */
13929
14399
  timeMilliseconds: number;
13930
14400
  value: number;
13931
14401
  } | null;
@@ -13934,10 +14404,12 @@ interface components {
13934
14404
  };
13935
14405
  planned: {
13936
14406
  first: {
14407
+ /** @description Milliseconds since the recording started. Subtract the chart's `chargeTimeMilliseconds` for time since CHARGE. */
13937
14408
  timeMilliseconds: number;
13938
14409
  value: number;
13939
14410
  } | null;
13940
14411
  last: {
14412
+ /** @description Milliseconds since the recording started. Subtract the chart's `chargeTimeMilliseconds` for time since CHARGE. */
13941
14413
  timeMilliseconds: number;
13942
14414
  value: number;
13943
14415
  } | null;
@@ -13971,7 +14443,9 @@ interface components {
13971
14443
  temperatureAdjustments: {
13972
14444
  /** @enum {string} */
13973
14445
  kind: "bean_temperature" | "environmental_temperature";
14446
+ /** @description Start of the change on the parent chart's clock. Milliseconds since the recording started, as chart points are timed. For a time counted from CHARGE, add the chart's `chargeTimeMilliseconds`. */
13974
14447
  startMilliseconds: number;
14448
+ /** @description End of the change on the parent chart's clock. Milliseconds since the recording started, as chart points are timed. For a time counted from CHARGE, add the chart's `chargeTimeMilliseconds`. */
13975
14449
  endMilliseconds: number;
13976
14450
  delta: number;
13977
14451
  }[];
@@ -14000,12 +14474,156 @@ interface components {
14000
14474
  fileContent: string;
14001
14475
  fileSize?: number;
14002
14476
  };
14477
+ RoastSourceErrorResponse: {
14478
+ error: {
14479
+ code: string;
14480
+ message: string;
14481
+ /**
14482
+ * @description Present when code is `roast_artisan_source_unavailable`. `no_artisan_import`: the roast was entered manually or logged live. `artisan_file_not_retained`: it was imported before Artisan files were kept. `artisan_file_too_large`: its file is larger than a reference profile can hold.
14483
+ * @enum {string}
14484
+ */
14485
+ reason?: "no_artisan_import" | "artisan_file_not_retained" | "artisan_file_too_large";
14486
+ };
14487
+ };
14003
14488
  ReferenceProfileFromRoastRequest: {
14004
14489
  roastId: number;
14490
+ /** @description The roast's current revision token (its last_updated value). */
14005
14491
  roastRevision: string;
14492
+ /**
14493
+ * @description chart_snapshot keeps a comparison-only chart. artisan_source copies the roast's stored Artisan file so a planned profile can be built from it.
14494
+ * @default chart_snapshot
14495
+ * @enum {string}
14496
+ */
14497
+ basis: "chart_snapshot" | "artisan_source";
14006
14498
  title?: string;
14007
14499
  notes?: string;
14008
14500
  };
14501
+ ReferenceProfileRoastCandidatesResponse: {
14502
+ data: {
14503
+ roasts: {
14504
+ roastId: number;
14505
+ roastRevision: string;
14506
+ label: string;
14507
+ batchName: string | null;
14508
+ coffeeName: string | null;
14509
+ roastDate: string | null;
14510
+ reference: {
14511
+ /** Format: uuid */
14512
+ profileId: string;
14513
+ /** Format: uuid */
14514
+ revisionId: string;
14515
+ saved: boolean;
14516
+ };
14517
+ }[];
14518
+ eligibleCount: number;
14519
+ totalRoastCount: number;
14520
+ ineligibleRoastCount: number;
14521
+ };
14522
+ meta: {
14523
+ /** @enum {string} */
14524
+ resource: "reference-profile-roast-candidates";
14525
+ /** @enum {string} */
14526
+ namespace: "/v1/reference-profiles";
14527
+ /** @enum {string} */
14528
+ version: "v1";
14529
+ };
14530
+ };
14531
+ ReferenceProfileRoastGenerationPreviewResponse: {
14532
+ data: {
14533
+ /** Format: uuid */
14534
+ parentRevisionId: string;
14535
+ title: string;
14536
+ userGoal: string | null;
14537
+ modelRecommendation: string | null;
14538
+ userEdits: string | null;
14539
+ changes: {
14540
+ temperatureAdjustments: {
14541
+ /** @enum {string} */
14542
+ kind: "bean_temperature" | "environmental_temperature";
14543
+ /** @description Start of the change on the parent chart's clock. Milliseconds since the recording started, as chart points are timed. For a time counted from CHARGE, add the chart's `chargeTimeMilliseconds`. */
14544
+ startMilliseconds: number;
14545
+ /** @description End of the change on the parent chart's clock. Milliseconds since the recording started, as chart points are timed. For a time counted from CHARGE, add the chart's `chargeTimeMilliseconds`. */
14546
+ endMilliseconds: number;
14547
+ delta: number;
14548
+ }[];
14549
+ };
14550
+ measuredFacts: {
14551
+ /** @enum {string} */
14552
+ temperatureUnit: "F" | "C";
14553
+ adjustments: {
14554
+ /** @enum {string} */
14555
+ kind: "bean_temperature" | "environmental_temperature";
14556
+ startMilliseconds: number;
14557
+ endMilliseconds: number;
14558
+ requestedDelta: number;
14559
+ /** @enum {string} */
14560
+ unit: "F" | "C";
14561
+ changedSampleCount: number;
14562
+ unchangedZeroSampleCount: number;
14563
+ parent: {
14564
+ first: {
14565
+ /** @description Milliseconds since the recording started. Subtract the chart's `chargeTimeMilliseconds` for time since CHARGE. */
14566
+ timeMilliseconds: number;
14567
+ value: number;
14568
+ } | null;
14569
+ last: {
14570
+ /** @description Milliseconds since the recording started. Subtract the chart's `chargeTimeMilliseconds` for time since CHARGE. */
14571
+ timeMilliseconds: number;
14572
+ value: number;
14573
+ } | null;
14574
+ minimum: number | null;
14575
+ maximum: number | null;
14576
+ };
14577
+ planned: {
14578
+ first: {
14579
+ /** @description Milliseconds since the recording started. Subtract the chart's `chargeTimeMilliseconds` for time since CHARGE. */
14580
+ timeMilliseconds: number;
14581
+ value: number;
14582
+ } | null;
14583
+ last: {
14584
+ /** @description Milliseconds since the recording started. Subtract the chart's `chargeTimeMilliseconds` for time since CHARGE. */
14585
+ timeMilliseconds: number;
14586
+ value: number;
14587
+ } | null;
14588
+ minimum: number | null;
14589
+ maximum: number | null;
14590
+ };
14591
+ }[];
14592
+ /** @enum {boolean} */
14593
+ eventsUnchanged: true;
14594
+ };
14595
+ chart: components["schemas"]["ReferenceProfileChart"];
14596
+ /** @enum {boolean} */
14597
+ exportEligible: true;
14598
+ /**
14599
+ * Format: uuid
14600
+ * @description The reference this roast's Artisan file is, or will be, saved under.
14601
+ */
14602
+ parentProfileId: string;
14603
+ /** @description Whether that reference already exists. A preview never creates it. */
14604
+ parentSaved: boolean;
14605
+ sourceRoast: {
14606
+ id: number;
14607
+ revision: string;
14608
+ label: string;
14609
+ batchName: string | null;
14610
+ coffeeName: string | null;
14611
+ roastDate: string | null;
14612
+ };
14613
+ };
14614
+ meta: {
14615
+ /** @enum {string} */
14616
+ resource: "reference-profile-previews";
14617
+ /** @enum {string} */
14618
+ namespace: "/v1/reference-profiles";
14619
+ /** @enum {string} */
14620
+ version: "v1";
14621
+ };
14622
+ };
14623
+ ReferenceProfileRoastGenerationRequest: components["schemas"]["ReferenceProfileGenerationRequest"] & {
14624
+ roastId: number;
14625
+ roastRevision: string;
14626
+ };
14009
14627
  ProfileComparisonResponse: {
14010
14628
  data: {
14011
14629
  /** @enum {string} */
@@ -14029,6 +14647,7 @@ interface components {
14029
14647
  kind: "bean_temperature" | "environmental_temperature" | "auxiliary";
14030
14648
  unit: string;
14031
14649
  points: {
14650
+ /** @description Milliseconds since CHARGE. */
14032
14651
  timeMilliseconds: number;
14033
14652
  left: number;
14034
14653
  right: number;
@@ -14037,7 +14656,9 @@ interface components {
14037
14656
  }[];
14038
14657
  milestones: {
14039
14658
  name: string;
14659
+ /** @description The left profile's milestone, in milliseconds since its CHARGE. */
14040
14660
  leftMilliseconds: number;
14661
+ /** @description The right profile's milestone, in milliseconds since its CHARGE. */
14041
14662
  rightMilliseconds: number;
14042
14663
  deltaMilliseconds: number;
14043
14664
  }[];
@@ -16180,14 +16801,57 @@ interface components {
16180
16801
  dimensions: ("size" | "altitude" | "defects" | "cup" | "preparation")[];
16181
16802
  };
16182
16803
  };
16183
- LotPriceHistoryResponse: {
16804
+ VarietyEntry: {
16805
+ /** @example yellow_bourbon */
16806
+ code: string;
16807
+ /** @example Yellow Bourbon */
16808
+ label: string;
16809
+ /** @description Family this value belongs to. A family code matches itself and every descendant. */
16810
+ parent_code: string | null;
16811
+ description: string | null;
16812
+ active: boolean;
16813
+ sort_order: number;
16814
+ /** @description Normalized supplier spellings that map to this code. */
16815
+ aliases: string[];
16816
+ species_code: string | null;
16817
+ };
16818
+ TaxonomyEntry: {
16819
+ /** @example yellow_bourbon */
16820
+ code: string;
16821
+ /** @example Yellow Bourbon */
16822
+ label: string;
16823
+ /** @description Family this value belongs to. A family code matches itself and every descendant. */
16824
+ parent_code: string | null;
16825
+ description: string | null;
16826
+ active: boolean;
16827
+ sort_order: number;
16828
+ /** @description Normalized supplier spellings that map to this code. */
16829
+ aliases: string[];
16830
+ };
16831
+ CatalogTaxonomiesResponse: {
16184
16832
  data: {
16185
- catalogId: number;
16833
+ varieties: components["schemas"]["VarietyEntry"][];
16834
+ species: components["schemas"]["TaxonomyEntry"][];
16835
+ drying_methods: components["schemas"]["TaxonomyEntry"][];
16836
+ };
16837
+ meta: {
16186
16838
  /** @enum {string} */
16187
- currency: "USD";
16188
- /** Format: date */
16189
- from: string;
16190
- /** Format: date */
16839
+ resource: "catalog-taxonomies";
16840
+ /** @enum {string} */
16841
+ namespace: "/v1/catalog/taxonomies";
16842
+ /** @enum {string} */
16843
+ version: "v1";
16844
+ taxonomies: ("variety" | "species" | "drying_method")[];
16845
+ };
16846
+ };
16847
+ LotPriceHistoryResponse: {
16848
+ data: {
16849
+ catalogId: number;
16850
+ /** @enum {string} */
16851
+ currency: "USD";
16852
+ /** Format: date */
16853
+ from: string;
16854
+ /** Format: date */
16191
16855
  to: string;
16192
16856
  points: {
16193
16857
  /** Format: date */
@@ -16549,12 +17213,16 @@ interface components {
16549
17213
  temperatureAdjustments: {
16550
17214
  /** @enum {string} */
16551
17215
  kind: "bean_temperature" | "environmental_temperature";
17216
+ /** @description Start of the change on the parent chart's clock. Milliseconds since the recording started, as chart points are timed. For a time counted from CHARGE, add the chart's `chargeTimeMilliseconds`. */
16552
17217
  startMilliseconds: number;
17218
+ /** @description End of the change on the parent chart's clock. Milliseconds since the recording started, as chart points are timed. For a time counted from CHARGE, add the chart's `chargeTimeMilliseconds`. */
16553
17219
  endMilliseconds: number;
16554
17220
  delta: number;
16555
17221
  }[];
16556
17222
  };
16557
17223
  change_set_summary: string;
17224
+ source_roast_id?: number | string;
17225
+ source_roast_revision?: string;
16558
17226
  };
16559
17227
  } | {
16560
17228
  /** @description Stable operation id. Repeating it with the same action payload replays the stored result; changing the payload returns 409. */
@@ -17078,6 +17746,7 @@ interface components {
17078
17746
  };
17079
17747
  RoastTemperature: {
17080
17748
  roast_id: number;
17749
+ /** @description Seconds since the recording started, the clock the curve is sampled on. Subtract the roast's `charge_time` for time since CHARGE. */
17081
17750
  time_seconds: number;
17082
17751
  bean_temp: number | null;
17083
17752
  environmental_temp: number | null;
@@ -17087,6 +17756,7 @@ interface components {
17087
17756
  };
17088
17757
  RoastEvent: {
17089
17758
  roast_id: number;
17759
+ /** @description Seconds since the recording started, the clock the curve is sampled on. Subtract the roast's `charge_time` for time since CHARGE. */
17090
17760
  time_seconds: number;
17091
17761
  event_type: number | null;
17092
17762
  event_value: string | null;
@@ -17111,25 +17781,34 @@ interface components {
17111
17781
  roaster_type: string | null;
17112
17782
  roaster_size: string | null;
17113
17783
  temperature_unit: string | null;
17784
+ /** @description Roast length in seconds, from CHARGE to DROP. From the start of the recording when `charge_time` is null. */
17114
17785
  total_roast_time: number | null;
17786
+ /** @description Development: first crack start to DROP, as a share of the time from CHARGE to DROP (`total_roast_time`), in percent. */
17115
17787
  development_percent: number | null;
17116
17788
  data_source: string | null;
17117
17789
  last_updated: string;
17118
17790
  roast_uuid: string | null;
17791
+ /** @description First crack start. Seconds since CHARGE. When `charge_time` is null the roast has no CHARGE marked and this counts from the start of the recording instead. */
17119
17792
  fc_start_time: number | null;
17120
17793
  fc_start_temp: number | null;
17794
+ /** @description First crack end. Seconds since CHARGE. When `charge_time` is null the roast has no CHARGE marked and this counts from the start of the recording instead. */
17121
17795
  fc_end_time: number | null;
17122
17796
  fc_end_temp: number | null;
17797
+ /** @description DROP. Seconds since CHARGE. When `charge_time` is null the roast has no CHARGE marked and this counts from the start of the recording instead. */
17123
17798
  drop_time: number | null;
17124
17799
  drop_temp: number | null;
17125
17800
  charge_temp: number | null;
17801
+ /** @description Where CHARGE sits on the recording clock: seconds from the start of the recording to CHARGE. Null when no CHARGE is marked. Every other roast time counts from this moment; add it to one of them to place it on the curve. */
17126
17802
  charge_time: number | null;
17127
- /** @description Drying-phase end time in seconds from the roast profile. */
17803
+ /** @description Drying-phase end. Seconds since CHARGE. When `charge_time` is null the roast has no CHARGE marked and this counts from the start of the recording instead. */
17128
17804
  dry_end_time: number | null;
17805
+ /** @description Turning point. Seconds since CHARGE. When `charge_time` is null the roast has no CHARGE marked and this counts from the start of the recording instead. */
17129
17806
  tp_time: number | null;
17130
17807
  tp_temp: number | null;
17131
17808
  total_ror: number | null;
17809
+ /** @description Drying: CHARGE to drying-phase end, as a share of the time from CHARGE to DROP (`total_roast_time`), in percent. */
17132
17810
  dry_percent: number | null;
17811
+ /** @description Maillard: drying-phase end to first crack start, as a share of the time from CHARGE to DROP (`total_roast_time`), in percent. */
17133
17812
  maillard_percent: number | null;
17134
17813
  auc: number | null;
17135
17814
  dry_phase_ror: number | null;
@@ -17162,6 +17841,7 @@ interface components {
17162
17841
  };
17163
17842
  };
17164
17843
  RoastTemperatureInput: {
17844
+ /** @description Seconds since the recording started. */
17165
17845
  timeSeconds: number;
17166
17846
  beanTemp?: number | null;
17167
17847
  environmentalTemp?: number | null;
@@ -17171,6 +17851,7 @@ interface components {
17171
17851
  dataSource?: "live" | "artisan_import" | "manual";
17172
17852
  };
17173
17853
  RoastEventInput: {
17854
+ /** @description Seconds since the recording started, the same clock as the temperature samples. */
17174
17855
  timeSeconds: number;
17175
17856
  eventType?: number | null;
17176
17857
  eventValue?: string | null;
@@ -17196,18 +17877,24 @@ interface components {
17196
17877
  roasterSize?: string;
17197
17878
  /** @enum {string} */
17198
17879
  temperatureUnit?: "F" | "C";
17880
+ /** @description Roast length in seconds, from CHARGE to DROP. */
17199
17881
  totalRoastTime?: number;
17200
17882
  developmentPercent?: number;
17201
17883
  dataSource?: string;
17202
17884
  roastUuid?: string;
17885
+ /** @description First crack start, in seconds since CHARGE. */
17203
17886
  fcStartTime?: number;
17204
17887
  fcStartTemp?: number;
17888
+ /** @description First crack end, in seconds since CHARGE. */
17205
17889
  fcEndTime?: number;
17206
17890
  fcEndTemp?: number;
17891
+ /** @description DROP, in seconds since CHARGE. */
17207
17892
  dropTime?: number;
17208
17893
  dropTemp?: number;
17209
17894
  chargeTemp?: number;
17895
+ /** @description Where CHARGE sits on the recording clock: seconds from the start of the recording to CHARGE. Every other roast time counts from it. */
17210
17896
  chargeTime?: number;
17897
+ /** @description Turning point, in seconds since CHARGE. */
17211
17898
  tpTime?: number;
17212
17899
  tpTemp?: number;
17213
17900
  totalRor?: number;
@@ -17269,18 +17956,24 @@ interface components {
17269
17956
  roasterSize?: string;
17270
17957
  /** @enum {string} */
17271
17958
  temperatureUnit?: "F" | "C";
17959
+ /** @description Roast length in seconds, from CHARGE to DROP. */
17272
17960
  totalRoastTime?: number;
17273
17961
  developmentPercent?: number;
17274
17962
  dataSource?: string;
17275
17963
  roastUuid?: string;
17964
+ /** @description First crack start, in seconds since CHARGE. */
17276
17965
  fcStartTime?: number;
17277
17966
  fcStartTemp?: number;
17967
+ /** @description First crack end, in seconds since CHARGE. */
17278
17968
  fcEndTime?: number;
17279
17969
  fcEndTemp?: number;
17970
+ /** @description DROP, in seconds since CHARGE. */
17280
17971
  dropTime?: number;
17281
17972
  dropTemp?: number;
17282
17973
  chargeTemp?: number;
17974
+ /** @description Where CHARGE sits on the recording clock: seconds from the start of the recording to CHARGE. Every other roast time counts from it. */
17283
17975
  chargeTime?: number;
17976
+ /** @description Turning point, in seconds since CHARGE. */
17284
17977
  tpTime?: number;
17285
17978
  tpTemp?: number;
17286
17979
  totalRor?: number;
@@ -17393,6 +18086,61 @@ interface components {
17393
18086
  /** @description Reported source size in bytes for import-log metadata; defaults to the content length. */
17394
18087
  fileSize?: number;
17395
18088
  };
18089
+ RoastImportFromReferenceResponse: {
18090
+ data: {
18091
+ roast: components["schemas"]["RoastDetailResource"];
18092
+ import: components["schemas"]["ArtisanImportSummary"];
18093
+ reference: {
18094
+ /** Format: uuid */
18095
+ profileId: string;
18096
+ /** Format: uuid */
18097
+ revisionId: string;
18098
+ /** @description Whether the reference now lists the new roast as a linked roast. */
18099
+ linked: boolean;
18100
+ };
18101
+ };
18102
+ meta: {
18103
+ /** @enum {string} */
18104
+ resource: "roasts";
18105
+ /** @enum {string} */
18106
+ namespace: "/v1/roasts";
18107
+ /** @enum {string} */
18108
+ version: "v1";
18109
+ auth: {
18110
+ /** @enum {string} */
18111
+ kind: "session" | "api-key";
18112
+ /** @enum {string|null} */
18113
+ role: "admin" | "member" | "viewer" | null;
18114
+ /** @enum {string|null} */
18115
+ apiPlan: "viewer" | "member" | "enterprise" | null;
18116
+ };
18117
+ };
18118
+ };
18119
+ RoastImportFromReferenceRequest: {
18120
+ /**
18121
+ * Format: uuid
18122
+ * @description A saved Artisan reference profile owned by the caller.
18123
+ */
18124
+ referenceProfileId: string;
18125
+ /**
18126
+ * Format: uuid
18127
+ * @description That reference's current revision.
18128
+ */
18129
+ referenceRevisionId: string;
18130
+ /** @description green_coffee_inv.id owned by the caller to roast against. */
18131
+ coffeeId: number;
18132
+ /** @description Batch name; defaults to '<coffee> - <roast date>'. */
18133
+ batchName?: string;
18134
+ /** @description Roast date (YYYY-MM-DD); defaults to the file's date. */
18135
+ roastDate?: string;
18136
+ /** @description Input weight in oz; defaults to the file's weight if present. */
18137
+ ozIn?: number;
18138
+ /** @description Output weight in oz; defaults to the file's weight if present. */
18139
+ ozOut?: number;
18140
+ /** @description Roast notes; overrides the generated import summary note. */
18141
+ roastNotes?: string;
18142
+ roastTargets?: string;
18143
+ };
17396
18144
  RoastArtisanImportReplaceRequest: {
17397
18145
  /** @description Source file name. Must end in .alog, .alog.json, or .json (Artisan export). */
17398
18146
  fileName: string;
@@ -17443,25 +18191,34 @@ interface components {
17443
18191
  roaster_type: string | null;
17444
18192
  roaster_size: string | null;
17445
18193
  temperature_unit: string | null;
18194
+ /** @description Roast length in seconds, from CHARGE to DROP. From the start of the recording when `charge_time` is null. */
17446
18195
  total_roast_time: number | null;
18196
+ /** @description Development: first crack start to DROP, as a share of the time from CHARGE to DROP (`total_roast_time`), in percent. */
17447
18197
  development_percent: number | null;
17448
18198
  data_source: string | null;
17449
18199
  last_updated: string;
17450
18200
  roast_uuid: string | null;
18201
+ /** @description First crack start. Seconds since CHARGE. When `charge_time` is null the roast has no CHARGE marked and this counts from the start of the recording instead. */
17451
18202
  fc_start_time: number | null;
17452
18203
  fc_start_temp: number | null;
18204
+ /** @description First crack end. Seconds since CHARGE. When `charge_time` is null the roast has no CHARGE marked and this counts from the start of the recording instead. */
17453
18205
  fc_end_time: number | null;
17454
18206
  fc_end_temp: number | null;
18207
+ /** @description DROP. Seconds since CHARGE. When `charge_time` is null the roast has no CHARGE marked and this counts from the start of the recording instead. */
17455
18208
  drop_time: number | null;
17456
18209
  drop_temp: number | null;
17457
18210
  charge_temp: number | null;
18211
+ /** @description Where CHARGE sits on the recording clock: seconds from the start of the recording to CHARGE. Null when no CHARGE is marked. Every other roast time counts from this moment; add it to one of them to place it on the curve. */
17458
18212
  charge_time: number | null;
17459
- /** @description Drying-phase end time in seconds from the roast profile. */
18213
+ /** @description Drying-phase end. Seconds since CHARGE. When `charge_time` is null the roast has no CHARGE marked and this counts from the start of the recording instead. */
17460
18214
  dry_end_time: number | null;
18215
+ /** @description Turning point. Seconds since CHARGE. When `charge_time` is null the roast has no CHARGE marked and this counts from the start of the recording instead. */
17461
18216
  tp_time: number | null;
17462
18217
  tp_temp: number | null;
17463
18218
  total_ror: number | null;
18219
+ /** @description Drying: CHARGE to drying-phase end, as a share of the time from CHARGE to DROP (`total_roast_time`), in percent. */
17464
18220
  dry_percent: number | null;
18221
+ /** @description Maillard: drying-phase end to first crack start, as a share of the time from CHARGE to DROP (`total_roast_time`), in percent. */
17465
18222
  maillard_percent: number | null;
17466
18223
  auc: number | null;
17467
18224
  dry_phase_ror: number | null;
@@ -17559,6 +18316,7 @@ interface components {
17559
18316
  };
17560
18317
  RoastChartPoint: {
17561
18318
  data_type: string;
18319
+ /** @description Milliseconds since the recording started, the clock the curve is sampled on. Subtract `metadata.charge_time_ms` for time since CHARGE. */
17562
18320
  time_milliseconds: number;
17563
18321
  field_name: string;
17564
18322
  value_numeric: number;
@@ -17567,6 +18325,7 @@ interface components {
17567
18325
  subcategory: string;
17568
18326
  };
17569
18327
  RoastChartSeriesPoint: {
18328
+ /** @description Milliseconds since the recording started, the clock the curve is sampled on. Subtract `metadata.charge_time_ms` for time since CHARGE. */
17570
18329
  time_milliseconds: number;
17571
18330
  value_numeric: number;
17572
18331
  };
@@ -17583,6 +18342,7 @@ interface components {
17583
18342
  points: components["schemas"]["RoastChartSeriesPoint"][];
17584
18343
  };
17585
18344
  RoastChartEvent: {
18345
+ /** @description Milliseconds since the recording started, the clock the curve is sampled on. Subtract `metadata.charge_time_ms` for time since CHARGE. */
17586
18346
  time_milliseconds: number;
17587
18347
  name: string;
17588
18348
  value: string | null;
@@ -17602,6 +18362,7 @@ interface components {
17602
18362
  temp_max: number | null;
17603
18363
  ror_min: number | null;
17604
18364
  ror_max: number | null;
18365
+ /** @description Where CHARGE sits on the recording clock, in milliseconds. Null when no CHARGE is marked. Subtract it from any chart time for time since CHARGE. */
17605
18366
  charge_time_ms: number | null;
17606
18367
  temperature_unit: string | null;
17607
18368
  profile_schema_version: number | null;
@@ -18223,6 +18984,8 @@ type CatalogSimilarQuery = NonNullable<paths["/v1/catalog/{id}/similar"]["get"][
18223
18984
  type CatalogCompareQuery = NonNullable<paths["/v1/catalog/compare"]["get"]["parameters"]["query"]>;
18224
18985
  /** Query parameters for {@link ParchmentClient.catalog.grades}. */
18225
18986
  type CatalogGradesQuery = NonNullable<paths["/v1/catalog/grades"]["get"]["parameters"]["query"]>;
18987
+ /** Query parameters for {@link ParchmentClient.catalog.taxonomies}. */
18988
+ type CatalogTaxonomiesQuery = NonNullable<paths["/v1/catalog/taxonomies"]["get"]["parameters"]["query"]>;
18226
18989
  /** Query parameters for {@link ParchmentClient.catalog.priceHistory}. */
18227
18990
  type CatalogPriceHistoryQuery = NonNullable<paths["/v1/catalog/{id}/price-history"]["get"]["parameters"]["query"]>;
18228
18991
  /** Query parameters for {@link ParchmentClient.priceIndex.list}. */
@@ -18302,6 +19065,10 @@ type RoastChartSeries = components["schemas"]["RoastChartSeries"];
18302
19065
  type RoastChartEvent = components["schemas"]["RoastChartEvent"];
18303
19066
  type ReferenceProfileImportRequest = NonNullable<paths["/v1/reference-profiles/imports"]["post"]["requestBody"]>["content"]["application/json"];
18304
19067
  type ReferenceProfileFromRoastRequest = NonNullable<paths["/v1/reference-profiles/from-roast"]["post"]["requestBody"]>["content"]["application/json"];
19068
+ /** Request body for {@link ParchmentClient.referenceProfiles.previewFromRoast}. */
19069
+ type ReferenceProfileRoastGenerationRequest = NonNullable<paths["/v1/reference-profiles/from-roast/preview"]["post"]["requestBody"]>["content"]["application/json"];
19070
+ /** Query parameters for {@link ParchmentClient.referenceProfiles.roastCandidates}. */
19071
+ type ReferenceProfileRoastCandidatesQuery = NonNullable<paths["/v1/reference-profiles/from-roast/candidates"]["get"]["parameters"]["query"]>;
18305
19072
  type ReferenceProfileUpdateRequest = NonNullable<paths["/v1/reference-profiles/{id}"]["patch"]["requestBody"]>["content"]["application/json"];
18306
19073
  type ReferenceProfileGenerationRequest = NonNullable<paths["/v1/reference-profiles/{id}/revisions/{revisionId}/preview"]["post"]["requestBody"]>["content"]["application/json"];
18307
19074
  type ProfileComparisonRequest = NonNullable<paths["/v1/profile-comparisons"]["post"]["requestBody"]>["content"]["application/json"];
@@ -18317,6 +19084,8 @@ type RoastUpdateRequest = NonNullable<paths["/v1/roasts/{id}"]["patch"]["request
18317
19084
  type RoastLiveCurveRequest = NonNullable<paths["/v1/roasts/{id}/live-curve"]["put"]["requestBody"]>["content"]["application/json"];
18318
19085
  /** Request body for {@link ParchmentClient.roasts.import}. */
18319
19086
  type RoastImportRequest = NonNullable<paths["/v1/roasts/imports"]["post"]["requestBody"]>["content"]["application/json"];
19087
+ /** Request body for {@link ParchmentClient.roasts.importFromReference}. */
19088
+ type RoastImportFromReferenceRequest = NonNullable<paths["/v1/roasts/imports/from-reference"]["post"]["requestBody"]>["content"]["application/json"];
18320
19089
  /** Request body for {@link ParchmentClient.roasts.replaceArtisanImport}. */
18321
19090
  type RoastArtisanImportReplaceRequest = NonNullable<paths["/v1/roasts/{id}/artisan-import"]["put"]["requestBody"]>["content"]["application/json"];
18322
19091
  /** Query parameters for {@link ParchmentClient.sales.list}. */
@@ -22330,6 +23099,69 @@ declare function createParchmentClient(options: ParchmentClientOptions): {
22330
23099
  } | undefined;
22331
23100
  };
22332
23101
  }, `${string}/${string}`>>;
23102
+ /** Variety, species, and drying-method vocabularies with aliases and family links. */
23103
+ taxonomies: (query?: CatalogTaxonomiesQuery) => Promise<openapi_fetch.FetchResponse<{
23104
+ parameters: {
23105
+ query?: {
23106
+ includeRetired?: "true" | "false";
23107
+ };
23108
+ header?: never;
23109
+ path?: never;
23110
+ cookie?: never;
23111
+ };
23112
+ requestBody?: never;
23113
+ responses: {
23114
+ 200: {
23115
+ headers: {
23116
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
23117
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
23118
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
23119
+ "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
23120
+ "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
23121
+ "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
23122
+ [name: string]: unknown;
23123
+ };
23124
+ content: {
23125
+ "application/json": components["schemas"]["CatalogTaxonomiesResponse"];
23126
+ };
23127
+ };
23128
+ 401: {
23129
+ headers: {
23130
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
23131
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
23132
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
23133
+ "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
23134
+ "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
23135
+ "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
23136
+ [name: string]: unknown;
23137
+ };
23138
+ content: {
23139
+ "application/json": components["schemas"]["ErrorResponse"];
23140
+ };
23141
+ };
23142
+ 403: {
23143
+ headers: {
23144
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
23145
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
23146
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
23147
+ "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
23148
+ "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
23149
+ "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
23150
+ [name: string]: unknown;
23151
+ };
23152
+ content: {
23153
+ "application/json": components["schemas"]["ErrorResponse"];
23154
+ };
23155
+ };
23156
+ 429: components["responses"]["ApiRateLimitExceeded"];
23157
+ };
23158
+ }, {
23159
+ params: {
23160
+ query: {
23161
+ includeRetired?: "true" | "false";
23162
+ } | undefined;
23163
+ };
23164
+ }, `${string}/${string}`>>;
22333
23165
  };
22334
23166
  priceIndex: {
22335
23167
  /** Available exact 30-day comparisons, with no empty-origin search. */
@@ -23921,7 +24753,7 @@ declare function createParchmentClient(options: ParchmentClientOptions): {
23921
24753
  [name: string]: unknown;
23922
24754
  };
23923
24755
  content: {
23924
- "application/json": components["schemas"]["ErrorResponse"];
24756
+ "application/json": components["schemas"]["RoastSourceErrorResponse"];
23925
24757
  };
23926
24758
  };
23927
24759
  401: {
@@ -24090,6 +24922,8 @@ declare function createParchmentClient(options: ParchmentClientOptions): {
24090
24922
  }[];
24091
24923
  };
24092
24924
  change_set_summary: string;
24925
+ source_roast_id?: number | string;
24926
+ source_roast_revision?: string;
24093
24927
  };
24094
24928
  } | {
24095
24929
  executionId: string;
@@ -29330,6 +30164,165 @@ declare function createParchmentClient(options: ParchmentClientOptions): {
29330
30164
  };
29331
30165
  } | undefined;
29332
30166
  }, `${string}/${string}`>>;
30167
+ /**
30168
+ * Create a roast profile from the Artisan file stored with one of the
30169
+ * caller's uploaded reference profiles. Only uploaded Artisan references
30170
+ * qualify: planned (generated) profiles are never recorded as roasts,
30171
+ * and a reference saved from an existing roast is refused. Requires
30172
+ * Mallard Studio plus a session, or an owner-bound API key carrying the
30173
+ * exact `roast:read` and `roast:write` scopes. The optional
30174
+ * `idempotencyKey` is payload-bound.
30175
+ */
30176
+ importFromReference: (body: RoastImportFromReferenceRequest, options?: {
30177
+ idempotencyKey?: string;
30178
+ }) => Promise<openapi_fetch.FetchResponse<{
30179
+ parameters: {
30180
+ query?: never;
30181
+ header?: {
30182
+ "idempotency-key"?: string;
30183
+ };
30184
+ path?: never;
30185
+ cookie?: never;
30186
+ };
30187
+ requestBody: {
30188
+ content: {
30189
+ "application/json": components["schemas"]["RoastImportFromReferenceRequest"];
30190
+ };
30191
+ };
30192
+ responses: {
30193
+ 201: {
30194
+ headers: {
30195
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
30196
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
30197
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
30198
+ "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
30199
+ "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
30200
+ "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
30201
+ [name: string]: unknown;
30202
+ };
30203
+ content: {
30204
+ "application/json": components["schemas"]["RoastImportFromReferenceResponse"];
30205
+ };
30206
+ };
30207
+ 400: {
30208
+ headers: {
30209
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
30210
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
30211
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
30212
+ "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
30213
+ "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
30214
+ "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
30215
+ [name: string]: unknown;
30216
+ };
30217
+ content: {
30218
+ "application/json": components["schemas"]["ErrorResponse"];
30219
+ };
30220
+ };
30221
+ 401: {
30222
+ headers: {
30223
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
30224
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
30225
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
30226
+ "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
30227
+ "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
30228
+ "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
30229
+ [name: string]: unknown;
30230
+ };
30231
+ content: {
30232
+ "application/json": components["schemas"]["ErrorResponse"];
30233
+ };
30234
+ };
30235
+ 403: {
30236
+ headers: {
30237
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
30238
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
30239
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
30240
+ "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
30241
+ "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
30242
+ "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
30243
+ [name: string]: unknown;
30244
+ };
30245
+ content: {
30246
+ "application/json": components["schemas"]["ErrorResponse"];
30247
+ };
30248
+ };
30249
+ 404: {
30250
+ headers: {
30251
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
30252
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
30253
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
30254
+ "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
30255
+ "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
30256
+ "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
30257
+ [name: string]: unknown;
30258
+ };
30259
+ content: {
30260
+ "application/json": components["schemas"]["ErrorResponse"];
30261
+ };
30262
+ };
30263
+ 409: {
30264
+ headers: {
30265
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
30266
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
30267
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
30268
+ "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
30269
+ "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
30270
+ "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
30271
+ [name: string]: unknown;
30272
+ };
30273
+ content: {
30274
+ "application/json": components["schemas"]["ErrorResponse"];
30275
+ };
30276
+ };
30277
+ 429: {
30278
+ headers: {
30279
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
30280
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
30281
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
30282
+ "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
30283
+ "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
30284
+ "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
30285
+ "Retry-After": components["headers"]["Retry-After"];
30286
+ "X-RateLimit-Blocked-By": components["headers"]["X-RateLimit-Blocked-By"];
30287
+ [name: string]: unknown;
30288
+ };
30289
+ content: {
30290
+ "application/json": components["schemas"]["ErrorResponse"];
30291
+ };
30292
+ };
30293
+ 503: {
30294
+ headers: {
30295
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
30296
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
30297
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
30298
+ "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
30299
+ "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
30300
+ "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
30301
+ [name: string]: unknown;
30302
+ };
30303
+ content: {
30304
+ "application/json": components["schemas"]["ErrorResponse"];
30305
+ };
30306
+ };
30307
+ };
30308
+ }, {
30309
+ body: {
30310
+ referenceProfileId: string;
30311
+ referenceRevisionId: string;
30312
+ coffeeId: number;
30313
+ batchName?: string;
30314
+ roastDate?: string;
30315
+ ozIn?: number;
30316
+ ozOut?: number;
30317
+ roastNotes?: string;
30318
+ roastTargets?: string;
30319
+ };
30320
+ params: {
30321
+ header: {
30322
+ "idempotency-key": string;
30323
+ };
30324
+ } | undefined;
30325
+ }, `${string}/${string}`>>;
29333
30326
  /**
29334
30327
  * Replace the Artisan import data on one of the caller's existing roasts,
29335
30328
  * re-deriving its curve, events, and computed metrics while preserving the
@@ -29650,9 +30643,7 @@ declare function createParchmentClient(options: ParchmentClientOptions): {
29650
30643
  "application/json": components["schemas"]["ErrorResponse"];
29651
30644
  };
29652
30645
  };
29653
- 429:
29654
- /** Closed session-only command for {@link ParchmentClient.confirmedActions.execute}. */
29655
- components["responses"]["ApiRateLimitExceeded"];
30646
+ 429: components["responses"]["ApiRateLimitExceeded"];
29656
30647
  };
29657
30648
  }, {
29658
30649
  params: {
@@ -29783,7 +30774,9 @@ declare function createParchmentClient(options: ParchmentClientOptions): {
29783
30774
  "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
29784
30775
  "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
29785
30776
  "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
29786
- "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
30777
+ "X-RateLimit-Burst-Remaining":
30778
+ /** Create a signed, short-lived login request bound to a PKCE challenge. */
30779
+ components["headers"]["X-RateLimit-Burst-Remaining"];
29787
30780
  "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
29788
30781
  [name: string]: unknown;
29789
30782
  };
@@ -30350,6 +31343,13 @@ declare function createParchmentClient(options: ParchmentClientOptions): {
30350
31343
  };
30351
31344
  };
30352
31345
  }, `${string}/${string}`>>;
31346
+ /**
31347
+ * Save an executed roast as a reference. `basis: "artisan_source"`
31348
+ * copies the roast's stored Artisan file so a planned profile can be
31349
+ * built from it, and returns the reference already saved from that
31350
+ * roast's file instead of a duplicate; the default
31351
+ * `"chart_snapshot"` keeps a comparison-only chart.
31352
+ */
30353
31353
  fromRoast: (body: ReferenceProfileFromRoastRequest, idempotencyKey: string) => Promise<openapi_fetch.FetchResponse<{
30354
31354
  parameters: {
30355
31355
  query?: never;
@@ -30365,6 +31365,20 @@ declare function createParchmentClient(options: ParchmentClientOptions): {
30365
31365
  };
30366
31366
  };
30367
31367
  responses: {
31368
+ 200: {
31369
+ headers: {
31370
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
31371
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
31372
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
31373
+ "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
31374
+ "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
31375
+ "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
31376
+ [name: string]: unknown;
31377
+ };
31378
+ content: {
31379
+ "application/json": components["schemas"]["ReferenceProfileResponse"];
31380
+ };
31381
+ };
30368
31382
  201: {
30369
31383
  headers: {
30370
31384
  "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
@@ -30390,7 +31404,7 @@ declare function createParchmentClient(options: ParchmentClientOptions): {
30390
31404
  [name: string]: unknown;
30391
31405
  };
30392
31406
  content: {
30393
- "application/json": components["schemas"]["ErrorResponse"];
31407
+ "application/json": components["schemas"]["RoastSourceErrorResponse"];
30394
31408
  };
30395
31409
  };
30396
31410
  401: {
@@ -30455,6 +31469,7 @@ declare function createParchmentClient(options: ParchmentClientOptions): {
30455
31469
  body: {
30456
31470
  roastId: number;
30457
31471
  roastRevision: string;
31472
+ basis: "chart_snapshot" | "artisan_source";
30458
31473
  title?: string;
30459
31474
  notes?: string;
30460
31475
  };
@@ -30464,6 +31479,195 @@ declare function createParchmentClient(options: ParchmentClientOptions): {
30464
31479
  };
30465
31480
  };
30466
31481
  }, `${string}/${string}`>>;
31482
+ /**
31483
+ * List the caller's executed roasts whose Artisan file is on record and
31484
+ * can therefore be the base for a planned profile, newest first.
31485
+ */
31486
+ roastCandidates: (query?: ReferenceProfileRoastCandidatesQuery) => Promise<openapi_fetch.FetchResponse<{
31487
+ parameters: {
31488
+ query?: {
31489
+ limit?: number;
31490
+ };
31491
+ header?: never;
31492
+ path?: never;
31493
+ cookie?: never;
31494
+ };
31495
+ requestBody?: never;
31496
+ responses: {
31497
+ 200: {
31498
+ headers: {
31499
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
31500
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
31501
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
31502
+ "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
31503
+ "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
31504
+ "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
31505
+ [name: string]: unknown;
31506
+ };
31507
+ content: {
31508
+ "application/json": components["schemas"]["ReferenceProfileRoastCandidatesResponse"];
31509
+ };
31510
+ };
31511
+ 401: {
31512
+ headers: {
31513
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
31514
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
31515
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
31516
+ "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
31517
+ "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
31518
+ "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
31519
+ [name: string]: unknown;
31520
+ };
31521
+ content: {
31522
+ "application/json": components["schemas"]["ErrorResponse"];
31523
+ };
31524
+ };
31525
+ 403: {
31526
+ headers: {
31527
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
31528
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
31529
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
31530
+ "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
31531
+ "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
31532
+ "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
31533
+ [name: string]: unknown;
31534
+ };
31535
+ content: {
31536
+ "application/json": components["schemas"]["ErrorResponse"];
31537
+ };
31538
+ };
31539
+ 429: components["responses"]["ApiRateLimitExceeded"];
31540
+ };
31541
+ }, {
31542
+ params: {
31543
+ query: {
31544
+ limit?: number;
31545
+ } | undefined;
31546
+ };
31547
+ }, `${string}/${string}`>>;
31548
+ /**
31549
+ * Preview a planned profile built directly on an executed roast's stored
31550
+ * Artisan file. Read-only: nothing is saved and the roast is unchanged.
31551
+ */
31552
+ previewFromRoast: (body: ReferenceProfileRoastGenerationRequest) => Promise<openapi_fetch.FetchResponse<{
31553
+ parameters: {
31554
+ query?: never;
31555
+ header?: never;
31556
+ path?: never;
31557
+ cookie?: never;
31558
+ };
31559
+ requestBody: {
31560
+ content: {
31561
+ "application/json": components["schemas"]["ReferenceProfileRoastGenerationRequest"];
31562
+ };
31563
+ };
31564
+ responses: {
31565
+ 200: {
31566
+ headers: {
31567
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
31568
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
31569
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
31570
+ "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
31571
+ "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
31572
+ "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
31573
+ [name: string]: unknown;
31574
+ };
31575
+ content: {
31576
+ "application/json": components["schemas"]["ReferenceProfileRoastGenerationPreviewResponse"];
31577
+ };
31578
+ };
31579
+ 400: {
31580
+ headers: {
31581
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
31582
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
31583
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
31584
+ "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
31585
+ "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
31586
+ "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
31587
+ [name: string]: unknown;
31588
+ };
31589
+ content: {
31590
+ "application/json": components["schemas"]["RoastSourceErrorResponse"];
31591
+ };
31592
+ };
31593
+ 401: {
31594
+ headers: {
31595
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
31596
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
31597
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
31598
+ "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
31599
+ "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
31600
+ "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
31601
+ [name: string]: unknown;
31602
+ };
31603
+ content: {
31604
+ "application/json": components["schemas"]["ErrorResponse"];
31605
+ };
31606
+ };
31607
+ 403: {
31608
+ headers: {
31609
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
31610
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
31611
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
31612
+ "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
31613
+ "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
31614
+ "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
31615
+ [name: string]: unknown;
31616
+ };
31617
+ content: {
31618
+ "application/json": components["schemas"]["ErrorResponse"];
31619
+ };
31620
+ };
31621
+ 404: {
31622
+ headers: {
31623
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
31624
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
31625
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
31626
+ "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
31627
+ "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
31628
+ "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
31629
+ [name: string]: unknown;
31630
+ };
31631
+ content: {
31632
+ "application/json": components["schemas"]["ErrorResponse"];
31633
+ };
31634
+ };
31635
+ 409: {
31636
+ headers: {
31637
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
31638
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
31639
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
31640
+ "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
31641
+ "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
31642
+ "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
31643
+ [name: string]: unknown;
31644
+ };
31645
+ content: {
31646
+ "application/json": components["schemas"]["ErrorResponse"];
31647
+ };
31648
+ };
31649
+ 429: components["responses"]["ApiRateLimitExceeded"];
31650
+ };
31651
+ }, {
31652
+ body: {
31653
+ title: string;
31654
+ notes?: string;
31655
+ userGoal?: string;
31656
+ modelRecommendation?: string;
31657
+ userEdits?: string;
31658
+ changes: {
31659
+ temperatureAdjustments: {
31660
+ kind: "bean_temperature" | "environmental_temperature";
31661
+ startMilliseconds: number;
31662
+ endMilliseconds: number;
31663
+ delta: number;
31664
+ }[];
31665
+ };
31666
+ } & {
31667
+ roastId: number;
31668
+ roastRevision: string;
31669
+ };
31670
+ }, `${string}/${string}`>>;
30467
31671
  update: (id: string, body: ReferenceProfileUpdateRequest) => Promise<openapi_fetch.FetchResponse<{
30468
31672
  parameters: {
30469
31673
  query?: never;
@@ -30528,7 +31732,9 @@ declare function createParchmentClient(options: ParchmentClientOptions): {
30528
31732
  403: {
30529
31733
  headers: {
30530
31734
  "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
30531
- "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
31735
+ "X-RateLimit-Remaining":
31736
+ /** Revoke an API key owned by the authenticated session user. */
31737
+ components["headers"]["X-RateLimit-Remaining"];
30532
31738
  "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
30533
31739
  "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
30534
31740
  "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
@@ -30629,9 +31835,7 @@ declare function createParchmentClient(options: ParchmentClientOptions): {
30629
31835
  [name: string]: unknown;
30630
31836
  };
30631
31837
  content: {
30632
- "application/json":
30633
- /** Request body for {@link ParchmentClient.apiKeys.create}. */
30634
- components["schemas"]["ErrorResponse"];
31838
+ "application/json": components["schemas"]["ErrorResponse"];
30635
31839
  };
30636
31840
  };
30637
31841
  403: {
@@ -30641,7 +31845,9 @@ declare function createParchmentClient(options: ParchmentClientOptions): {
30641
31845
  "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
30642
31846
  "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
30643
31847
  "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
30644
- "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
31848
+ "X-RateLimit-Burst-Reset":
31849
+ /** Query parameters for {@link ParchmentClient.tasting.get}. */
31850
+ components["headers"]["X-RateLimit-Burst-Reset"];
30645
31851
  [name: string]: unknown;
30646
31852
  };
30647
31853
  content: {
@@ -31835,7 +33041,7 @@ type ParchmentClientMethod = MethodPaths<Omit<ParchmentClient, "raw">>;
31835
33041
  * SDK (such as the CLI) can import this list to prove they cover everything
31836
33042
  * the web agent can do.
31837
33043
  */
31838
- declare const CHAT_AGENT_CAPABILITIES: readonly ["me", "catalog.list", "catalog.facets", "catalog.rank", "catalog.suppliers", "catalog.similar", "catalog.compare", "catalog.grades", "catalog.priceHistory", "inventory.list", "roasts.list", "roasts.get", "roasts.chartData", "referenceProfiles.list", "referenceProfiles.get", "referenceProfiles.chart", "referenceProfiles.compare", "referenceProfiles.preview", "tasting.get", "priceIndex.list", "priceIndex.stats", "priceIndex.comparisons", "priceIndex.comparison", "priceIndex.history", "market.signals", "market.metadataIndex", "market.overview", "market.evidence"];
33044
+ declare const CHAT_AGENT_CAPABILITIES: readonly ["me", "catalog.list", "catalog.facets", "catalog.rank", "catalog.suppliers", "catalog.similar", "catalog.compare", "catalog.grades", "catalog.priceHistory", "inventory.list", "roasts.list", "roasts.get", "roasts.chartData", "referenceProfiles.list", "referenceProfiles.get", "referenceProfiles.chart", "referenceProfiles.compare", "referenceProfiles.preview", "referenceProfiles.roastCandidates", "referenceProfiles.previewFromRoast", "tasting.get", "priceIndex.list", "priceIndex.stats", "priceIndex.comparisons", "priceIndex.comparison", "priceIndex.history", "market.signals", "market.metadataIndex", "market.overview", "market.evidence"];
31839
33045
  type ChatAgentCapability = (typeof CHAT_AGENT_CAPABILITIES)[number];
31840
33046
  /**
31841
33047
  * Writes the web agent can propose. The agent never writes directly: it
@@ -31880,4 +33086,4 @@ type PickPaths<T, P extends string> = {
31880
33086
  };
31881
33087
  type ChatAgentClient = PickPaths<ParchmentClient, ChatAgentCapability>;
31882
33088
 
31883
- export { type AccountDeletionOperation, type AccountDeletionRequest, type BillingCheckoutCreateRequest, type BillingCheckoutSession, type BillingManualEntitlementsRequest, type BillingSubscriptionMutationRequest, type BillingSubscriptionOperation, type BriefMatchesQuery, CHAT_AGENT_CAPABILITIES, CHAT_AGENT_CAPABILITY_EXCLUSIONS, CHAT_AGENT_CONFIRMED_ACTION_TYPES, type CatalogCompareQuery, type CatalogGradesQuery, type CatalogInventoryBatchLifecycle, type CatalogInventoryBatchReserveRequest, type CatalogInventoryBatchResult, type CatalogItem, type CatalogListQuery, type CatalogMapHeaders, type CatalogMapQuery, type CatalogMapResponse, type CatalogPriceHistoryQuery, type CatalogProofSummary, type CatalogSimilarQuery, type ChatAgentCapability, type ChatAgentCapabilityExclusion, type ChatAgentCapabilityExclusionReason, type ChatAgentClient, type ChatAgentConfirmedActionType, type ConfirmedActionExecuteRequest, type ConversationCanvasUpdateRequest, type ConversationChatStreamRequest, type ConversationMemoryDreamRequest, type ConversationMemoryUpdateRequest, type ConversationMessageAppendRequest, type ConversationSummaryUpdateRequest, type ConversationWorkspaceClearRequest, type ConversationWorkspaceCreateRequest, type ConversationWorkspaceMetadataRequest, 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 ParchmentClientMethod, type ParchmentClientOptions, type PriceIndexQuery, type PriceIndexStatsQuery, type ProfitItem, type ProfitListQuery, type RoastBatchCreateRequest, type RoastChartData, type RoastChartDataQuery, type RoastChartEvent, type RoastChartSeries, type RoastLiveCurveRequest, type SalesCreateRequest, type SalesListQuery, type SalesUpdateRequest, type SourcingBriefCreateRequest, type TrackedLotMutation, type TrackedLotSummary, type TrackedLotsListQuery, type components, createParchmentClient, type paths };
33089
+ export { type AccountDeletionOperation, type AccountDeletionRequest, type BillingCheckoutCreateRequest, type BillingCheckoutSession, type BillingManualEntitlementsRequest, type BillingSubscriptionMutationRequest, type BillingSubscriptionOperation, type BriefMatchesQuery, CHAT_AGENT_CAPABILITIES, CHAT_AGENT_CAPABILITY_EXCLUSIONS, CHAT_AGENT_CONFIRMED_ACTION_TYPES, type CatalogCompareQuery, type CatalogGradesQuery, type CatalogInventoryBatchLifecycle, type CatalogInventoryBatchReserveRequest, type CatalogInventoryBatchResult, type CatalogItem, type CatalogListQuery, type CatalogMapHeaders, type CatalogMapQuery, type CatalogMapResponse, type CatalogPriceHistoryQuery, type CatalogProofSummary, type CatalogSimilarQuery, type CatalogTaxonomiesQuery, type ChatAgentCapability, type ChatAgentCapabilityExclusion, type ChatAgentCapabilityExclusionReason, type ChatAgentClient, type ChatAgentConfirmedActionType, type ConfirmedActionExecuteRequest, type ConversationCanvasUpdateRequest, type ConversationChatStreamRequest, type ConversationMemoryDreamRequest, type ConversationMemoryUpdateRequest, type ConversationMessageAppendRequest, type ConversationSummaryUpdateRequest, type ConversationWorkspaceClearRequest, type ConversationWorkspaceCreateRequest, type ConversationWorkspaceMetadataRequest, 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 ParchmentClientMethod, type ParchmentClientOptions, type PriceIndexQuery, type PriceIndexStatsQuery, type ProfitItem, type ProfitListQuery, type RoastBatchCreateRequest, type RoastChartData, type RoastChartDataQuery, type RoastChartEvent, type RoastChartSeries, type RoastLiveCurveRequest, type SalesCreateRequest, type SalesListQuery, type SalesUpdateRequest, type SourcingBriefCreateRequest, type TrackedLotMutation, type TrackedLotSummary, type TrackedLotsListQuery, type components, createParchmentClient, type paths };