@purveyors/sdk 0.53.0 → 0.54.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: {
@@ -7134,7 +7355,7 @@ interface paths {
7134
7355
  put?: never;
7135
7356
  /**
7136
7357
  * 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.
7358
+ * @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
7359
  */
7139
7360
  post: {
7140
7361
  parameters: {
@@ -7164,7 +7385,7 @@ interface paths {
7164
7385
  "application/json": components["schemas"]["ConfirmedActionExecuteResponse"];
7165
7386
  };
7166
7387
  };
7167
- /** @description Invalid or unsupported confirmed-action payload */
7388
+ /** @description Invalid or unsupported confirmed-action payload, or a roast-based plan whose roast has no usable Artisan file on record */
7168
7389
  400: {
7169
7390
  headers: {
7170
7391
  "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
@@ -7176,7 +7397,7 @@ interface paths {
7176
7397
  [name: string]: unknown;
7177
7398
  };
7178
7399
  content: {
7179
- "application/json": components["schemas"]["ErrorResponse"];
7400
+ "application/json": components["schemas"]["RoastSourceErrorResponse"];
7180
7401
  };
7181
7402
  };
7182
7403
  /** @description Authentication required */
@@ -10246,7 +10467,7 @@ interface paths {
10246
10467
  patch?: never;
10247
10468
  trace?: never;
10248
10469
  };
10249
- "/v1/roasts/{id}/artisan-import": {
10470
+ "/v1/roasts/imports/from-reference": {
10250
10471
  parameters: {
10251
10472
  query?: never;
10252
10473
  header?: never;
@@ -10254,29 +10475,28 @@ interface paths {
10254
10475
  cookie?: never;
10255
10476
  };
10256
10477
  get?: never;
10478
+ put?: never;
10257
10479
  /**
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.
10480
+ * Create a roast from a saved Artisan reference
10481
+ * @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
10482
  */
10261
- put: {
10483
+ post: {
10262
10484
  parameters: {
10263
10485
  query?: never;
10264
10486
  header?: {
10265
- "if-match"?: string;
10266
- };
10267
- path: {
10268
- id: number;
10487
+ "idempotency-key"?: string;
10269
10488
  };
10489
+ path?: never;
10270
10490
  cookie?: never;
10271
10491
  };
10272
10492
  requestBody: {
10273
10493
  content: {
10274
- "application/json": components["schemas"]["RoastArtisanImportReplaceRequest"];
10494
+ "application/json": components["schemas"]["RoastImportFromReferenceRequest"];
10275
10495
  };
10276
10496
  };
10277
10497
  responses: {
10278
- /** @description The updated roast profile plus import summary */
10279
- 200: {
10498
+ /** @description The created roast profile plus import summary */
10499
+ 201: {
10280
10500
  headers: {
10281
10501
  "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
10282
10502
  "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
@@ -10287,7 +10507,7 @@ interface paths {
10287
10507
  [name: string]: unknown;
10288
10508
  };
10289
10509
  content: {
10290
- "application/json": components["schemas"]["RoastImportResponse"];
10510
+ "application/json": components["schemas"]["RoastImportFromReferenceResponse"];
10291
10511
  };
10292
10512
  };
10293
10513
  /** @description Invalid query parameter */
@@ -10335,7 +10555,7 @@ interface paths {
10335
10555
  "application/json": components["schemas"]["ErrorResponse"];
10336
10556
  };
10337
10557
  };
10338
- /** @description No such roast profile owned by the caller */
10558
+ /** @description No such coffee lot owned by the caller */
10339
10559
  404: {
10340
10560
  headers: {
10341
10561
  "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
@@ -10399,22 +10619,181 @@ interface paths {
10399
10619
  };
10400
10620
  };
10401
10621
  };
10402
- post?: never;
10622
+ delete?: never;
10623
+ options?: never;
10624
+ head?: never;
10625
+ patch?: never;
10626
+ trace?: never;
10627
+ };
10628
+ "/v1/roasts/{id}/artisan-import": {
10629
+ parameters: {
10630
+ query?: never;
10631
+ header?: never;
10632
+ path?: never;
10633
+ cookie?: never;
10634
+ };
10635
+ get?: never;
10403
10636
  /**
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.
10637
+ * Replace a roast's Artisan import
10638
+ * @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
10639
  */
10407
- delete: {
10640
+ put: {
10408
10641
  parameters: {
10409
10642
  query?: never;
10410
- header?: never;
10643
+ header?: {
10644
+ "if-match"?: string;
10645
+ };
10411
10646
  path: {
10412
10647
  id: number;
10413
10648
  };
10414
10649
  cookie?: never;
10415
10650
  };
10416
- requestBody?: never;
10417
- responses: {
10651
+ requestBody: {
10652
+ content: {
10653
+ "application/json": components["schemas"]["RoastArtisanImportReplaceRequest"];
10654
+ };
10655
+ };
10656
+ responses: {
10657
+ /** @description The updated roast profile plus import summary */
10658
+ 200: {
10659
+ headers: {
10660
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
10661
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
10662
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
10663
+ "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
10664
+ "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
10665
+ "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
10666
+ [name: string]: unknown;
10667
+ };
10668
+ content: {
10669
+ "application/json": components["schemas"]["RoastImportResponse"];
10670
+ };
10671
+ };
10672
+ /** @description Invalid query parameter */
10673
+ 400: {
10674
+ headers: {
10675
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
10676
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
10677
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
10678
+ "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
10679
+ "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
10680
+ "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
10681
+ [name: string]: unknown;
10682
+ };
10683
+ content: {
10684
+ "application/json": components["schemas"]["ErrorResponse"];
10685
+ };
10686
+ };
10687
+ /** @description Authentication required */
10688
+ 401: {
10689
+ headers: {
10690
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
10691
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
10692
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
10693
+ "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
10694
+ "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
10695
+ "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
10696
+ [name: string]: unknown;
10697
+ };
10698
+ content: {
10699
+ "application/json": components["schemas"]["ErrorResponse"];
10700
+ };
10701
+ };
10702
+ /** @description Insufficient entitlement (plan or role) */
10703
+ 403: {
10704
+ headers: {
10705
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
10706
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
10707
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
10708
+ "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
10709
+ "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
10710
+ "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
10711
+ [name: string]: unknown;
10712
+ };
10713
+ content: {
10714
+ "application/json": components["schemas"]["ErrorResponse"];
10715
+ };
10716
+ };
10717
+ /** @description No such roast profile owned by the caller */
10718
+ 404: {
10719
+ headers: {
10720
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
10721
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
10722
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
10723
+ "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
10724
+ "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
10725
+ "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
10726
+ [name: string]: unknown;
10727
+ };
10728
+ content: {
10729
+ "application/json": components["schemas"]["ErrorResponse"];
10730
+ };
10731
+ };
10732
+ /** @description Write conflict: an If-Match precondition failed */
10733
+ 409: {
10734
+ headers: {
10735
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
10736
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
10737
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
10738
+ "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
10739
+ "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
10740
+ "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
10741
+ [name: string]: unknown;
10742
+ };
10743
+ content: {
10744
+ "application/json": components["schemas"]["ErrorResponse"];
10745
+ };
10746
+ };
10747
+ /** @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. */
10748
+ 429: {
10749
+ headers: {
10750
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
10751
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
10752
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
10753
+ "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
10754
+ "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
10755
+ "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
10756
+ "Retry-After": components["headers"]["Retry-After"];
10757
+ "X-RateLimit-Blocked-By": components["headers"]["X-RateLimit-Blocked-By"];
10758
+ [name: string]: unknown;
10759
+ };
10760
+ content: {
10761
+ "application/json": components["schemas"]["ErrorResponse"];
10762
+ };
10763
+ };
10764
+ /** @description Roast writes are not enabled in this environment */
10765
+ 503: {
10766
+ headers: {
10767
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
10768
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
10769
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
10770
+ "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
10771
+ "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
10772
+ "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
10773
+ [name: string]: unknown;
10774
+ };
10775
+ content: {
10776
+ "application/json": components["schemas"]["ErrorResponse"];
10777
+ };
10778
+ };
10779
+ };
10780
+ };
10781
+ post?: never;
10782
+ /**
10783
+ * Clear a roast's Artisan import
10784
+ * @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.
10785
+ */
10786
+ delete: {
10787
+ parameters: {
10788
+ query?: never;
10789
+ header?: never;
10790
+ path: {
10791
+ id: number;
10792
+ };
10793
+ cookie?: never;
10794
+ };
10795
+ requestBody?: never;
10796
+ responses: {
10418
10797
  /** @description The cleared roast id plus deleted row counts */
10419
10798
  200: {
10420
10799
  headers: {
@@ -13798,7 +14177,13 @@ interface components {
13798
14177
  updatedAt: string;
13799
14178
  };
13800
14179
  ReferenceProfileListResponse: {
13801
- data: components["schemas"]["ReferenceProfileSummary"][];
14180
+ data: (components["schemas"]["ReferenceProfileSummary"] & {
14181
+ /** @description The executed roast the current revision was saved from, or null for an uploaded or planned profile. */
14182
+ sourceRoast: {
14183
+ id: number;
14184
+ revision: string;
14185
+ } | null;
14186
+ })[];
13802
14187
  meta: {
13803
14188
  /** @enum {string} */
13804
14189
  resource: "reference-profiles";
@@ -14000,110 +14385,248 @@ interface components {
14000
14385
  fileContent: string;
14001
14386
  fileSize?: number;
14002
14387
  };
14388
+ RoastSourceErrorResponse: {
14389
+ error: {
14390
+ code: string;
14391
+ message: string;
14392
+ /**
14393
+ * @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.
14394
+ * @enum {string}
14395
+ */
14396
+ reason?: "no_artisan_import" | "artisan_file_not_retained" | "artisan_file_too_large";
14397
+ };
14398
+ };
14003
14399
  ReferenceProfileFromRoastRequest: {
14004
14400
  roastId: number;
14401
+ /** @description The roast's current revision token (its last_updated value). */
14005
14402
  roastRevision: string;
14403
+ /**
14404
+ * @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.
14405
+ * @default chart_snapshot
14406
+ * @enum {string}
14407
+ */
14408
+ basis: "chart_snapshot" | "artisan_source";
14006
14409
  title?: string;
14007
14410
  notes?: string;
14008
14411
  };
14009
- ProfileComparisonResponse: {
14412
+ ReferenceProfileRoastCandidatesResponse: {
14010
14413
  data: {
14011
- /** @enum {string} */
14012
- alignment: "charge";
14013
- /** @enum {string} */
14014
- targetUnit: "F" | "C";
14015
- left: {
14016
- type: string;
14017
- id: string;
14018
- revision: string;
14019
- };
14020
- right: {
14021
- type: string;
14022
- id: string;
14023
- revision: string;
14024
- };
14025
- series: {
14026
- id: string;
14027
- name: string;
14028
- /** @enum {string} */
14029
- kind: "bean_temperature" | "environmental_temperature" | "auxiliary";
14030
- unit: string;
14031
- points: {
14032
- timeMilliseconds: number;
14033
- left: number;
14034
- right: number;
14035
- delta: number;
14036
- }[];
14037
- }[];
14038
- milestones: {
14039
- name: string;
14040
- leftMilliseconds: number;
14041
- rightMilliseconds: number;
14042
- deltaMilliseconds: number;
14414
+ roasts: {
14415
+ roastId: number;
14416
+ roastRevision: string;
14417
+ label: string;
14418
+ batchName: string | null;
14419
+ coffeeName: string | null;
14420
+ roastDate: string | null;
14421
+ reference: {
14422
+ /** Format: uuid */
14423
+ profileId: string;
14424
+ /** Format: uuid */
14425
+ revisionId: string;
14426
+ saved: boolean;
14427
+ };
14043
14428
  }[];
14429
+ eligibleCount: number;
14430
+ totalRoastCount: number;
14431
+ ineligibleRoastCount: number;
14044
14432
  };
14045
14433
  meta: {
14046
14434
  /** @enum {string} */
14047
- resource: "profile-comparisons";
14435
+ resource: "reference-profile-roast-candidates";
14048
14436
  /** @enum {string} */
14049
- namespace: "/v1/profile-comparisons";
14437
+ namespace: "/v1/reference-profiles";
14050
14438
  /** @enum {string} */
14051
14439
  version: "v1";
14052
14440
  };
14053
14441
  };
14054
- ProfileComparisonRequest: {
14055
- left: {
14056
- /** @enum {string} */
14057
- type: "reference_revision";
14058
- /** Format: uuid */
14059
- revisionId: string;
14060
- } | {
14061
- /** @enum {string} */
14062
- type: "executed_roast";
14063
- roastId: number;
14064
- roastRevision: string;
14065
- };
14066
- right: {
14067
- /** @enum {string} */
14068
- type: "reference_revision";
14442
+ ReferenceProfileRoastGenerationPreviewResponse: {
14443
+ data: {
14069
14444
  /** Format: uuid */
14070
- revisionId: string;
14071
- } | {
14072
- /** @enum {string} */
14073
- type: "executed_roast";
14074
- roastId: number;
14075
- roastRevision: string;
14076
- };
14077
- /**
14078
- * @default charge
14079
- * @enum {string}
14080
- */
14081
- alignment: "charge";
14082
- /** @enum {string} */
14083
- targetUnit: "F" | "C";
14084
- /** @default 400 */
14085
- targetPoints: number;
14086
- };
14087
- AccountDeletionOperation: {
14088
- /** Format: uuid */
14089
- operationId: string;
14090
- /** @enum {string} */
14091
- status: "accepted" | "provider_deleting" | "local_cleaning" | "auth_deleting" | "post_auth_cleanup" | "retryable" | "conflict" | "completed";
14092
- };
14093
- BillingCheckoutSession: {
14094
- /** Format: uuid */
14095
- admissionId: string;
14096
- /** @enum {string} */
14097
- status: "accepted" | "attempting" | "published" | "settled" | "closed" | "conflict";
14098
- clientSecret: string | null;
14099
- };
14100
- MarketBriefDraftState: {
14101
- /** Format: uuid */
14102
- draftId: string;
14103
- edition: number;
14104
- productionCommit: string;
14105
- /** @enum {string} */
14106
- status: "creating" | "uncertain" | "created" | "conflict";
14445
+ parentRevisionId: string;
14446
+ title: string;
14447
+ userGoal: string | null;
14448
+ modelRecommendation: string | null;
14449
+ userEdits: string | null;
14450
+ changes: {
14451
+ temperatureAdjustments: {
14452
+ /** @enum {string} */
14453
+ kind: "bean_temperature" | "environmental_temperature";
14454
+ startMilliseconds: number;
14455
+ endMilliseconds: number;
14456
+ delta: number;
14457
+ }[];
14458
+ };
14459
+ measuredFacts: {
14460
+ /** @enum {string} */
14461
+ temperatureUnit: "F" | "C";
14462
+ adjustments: {
14463
+ /** @enum {string} */
14464
+ kind: "bean_temperature" | "environmental_temperature";
14465
+ startMilliseconds: number;
14466
+ endMilliseconds: number;
14467
+ requestedDelta: number;
14468
+ /** @enum {string} */
14469
+ unit: "F" | "C";
14470
+ changedSampleCount: number;
14471
+ unchangedZeroSampleCount: number;
14472
+ parent: {
14473
+ first: {
14474
+ timeMilliseconds: number;
14475
+ value: number;
14476
+ } | null;
14477
+ last: {
14478
+ timeMilliseconds: number;
14479
+ value: number;
14480
+ } | null;
14481
+ minimum: number | null;
14482
+ maximum: number | null;
14483
+ };
14484
+ planned: {
14485
+ first: {
14486
+ timeMilliseconds: number;
14487
+ value: number;
14488
+ } | null;
14489
+ last: {
14490
+ timeMilliseconds: number;
14491
+ value: number;
14492
+ } | null;
14493
+ minimum: number | null;
14494
+ maximum: number | null;
14495
+ };
14496
+ }[];
14497
+ /** @enum {boolean} */
14498
+ eventsUnchanged: true;
14499
+ };
14500
+ chart: components["schemas"]["ReferenceProfileChart"];
14501
+ /** @enum {boolean} */
14502
+ exportEligible: true;
14503
+ /**
14504
+ * Format: uuid
14505
+ * @description The reference this roast's Artisan file is, or will be, saved under.
14506
+ */
14507
+ parentProfileId: string;
14508
+ /** @description Whether that reference already exists. A preview never creates it. */
14509
+ parentSaved: boolean;
14510
+ sourceRoast: {
14511
+ id: number;
14512
+ revision: string;
14513
+ label: string;
14514
+ batchName: string | null;
14515
+ coffeeName: string | null;
14516
+ roastDate: string | null;
14517
+ };
14518
+ };
14519
+ meta: {
14520
+ /** @enum {string} */
14521
+ resource: "reference-profile-previews";
14522
+ /** @enum {string} */
14523
+ namespace: "/v1/reference-profiles";
14524
+ /** @enum {string} */
14525
+ version: "v1";
14526
+ };
14527
+ };
14528
+ ReferenceProfileRoastGenerationRequest: components["schemas"]["ReferenceProfileGenerationRequest"] & {
14529
+ roastId: number;
14530
+ roastRevision: string;
14531
+ };
14532
+ ProfileComparisonResponse: {
14533
+ data: {
14534
+ /** @enum {string} */
14535
+ alignment: "charge";
14536
+ /** @enum {string} */
14537
+ targetUnit: "F" | "C";
14538
+ left: {
14539
+ type: string;
14540
+ id: string;
14541
+ revision: string;
14542
+ };
14543
+ right: {
14544
+ type: string;
14545
+ id: string;
14546
+ revision: string;
14547
+ };
14548
+ series: {
14549
+ id: string;
14550
+ name: string;
14551
+ /** @enum {string} */
14552
+ kind: "bean_temperature" | "environmental_temperature" | "auxiliary";
14553
+ unit: string;
14554
+ points: {
14555
+ timeMilliseconds: number;
14556
+ left: number;
14557
+ right: number;
14558
+ delta: number;
14559
+ }[];
14560
+ }[];
14561
+ milestones: {
14562
+ name: string;
14563
+ leftMilliseconds: number;
14564
+ rightMilliseconds: number;
14565
+ deltaMilliseconds: number;
14566
+ }[];
14567
+ };
14568
+ meta: {
14569
+ /** @enum {string} */
14570
+ resource: "profile-comparisons";
14571
+ /** @enum {string} */
14572
+ namespace: "/v1/profile-comparisons";
14573
+ /** @enum {string} */
14574
+ version: "v1";
14575
+ };
14576
+ };
14577
+ ProfileComparisonRequest: {
14578
+ left: {
14579
+ /** @enum {string} */
14580
+ type: "reference_revision";
14581
+ /** Format: uuid */
14582
+ revisionId: string;
14583
+ } | {
14584
+ /** @enum {string} */
14585
+ type: "executed_roast";
14586
+ roastId: number;
14587
+ roastRevision: string;
14588
+ };
14589
+ right: {
14590
+ /** @enum {string} */
14591
+ type: "reference_revision";
14592
+ /** Format: uuid */
14593
+ revisionId: string;
14594
+ } | {
14595
+ /** @enum {string} */
14596
+ type: "executed_roast";
14597
+ roastId: number;
14598
+ roastRevision: string;
14599
+ };
14600
+ /**
14601
+ * @default charge
14602
+ * @enum {string}
14603
+ */
14604
+ alignment: "charge";
14605
+ /** @enum {string} */
14606
+ targetUnit: "F" | "C";
14607
+ /** @default 400 */
14608
+ targetPoints: number;
14609
+ };
14610
+ AccountDeletionOperation: {
14611
+ /** Format: uuid */
14612
+ operationId: string;
14613
+ /** @enum {string} */
14614
+ status: "accepted" | "provider_deleting" | "local_cleaning" | "auth_deleting" | "post_auth_cleanup" | "retryable" | "conflict" | "completed";
14615
+ };
14616
+ BillingCheckoutSession: {
14617
+ /** Format: uuid */
14618
+ admissionId: string;
14619
+ /** @enum {string} */
14620
+ status: "accepted" | "attempting" | "published" | "settled" | "closed" | "conflict";
14621
+ clientSecret: string | null;
14622
+ };
14623
+ MarketBriefDraftState: {
14624
+ /** Format: uuid */
14625
+ draftId: string;
14626
+ edition: number;
14627
+ productionCommit: string;
14628
+ /** @enum {string} */
14629
+ status: "creating" | "uncertain" | "created" | "conflict";
14107
14630
  };
14108
14631
  MarketBriefDraftResponse: {
14109
14632
  data: components["schemas"]["MarketBriefDraftState"];
@@ -16555,6 +17078,8 @@ interface components {
16555
17078
  }[];
16556
17079
  };
16557
17080
  change_set_summary: string;
17081
+ source_roast_id?: number | string;
17082
+ source_roast_revision?: string;
16558
17083
  };
16559
17084
  } | {
16560
17085
  /** @description Stable operation id. Repeating it with the same action payload replays the stored result; changing the payload returns 409. */
@@ -17393,6 +17918,61 @@ interface components {
17393
17918
  /** @description Reported source size in bytes for import-log metadata; defaults to the content length. */
17394
17919
  fileSize?: number;
17395
17920
  };
17921
+ RoastImportFromReferenceResponse: {
17922
+ data: {
17923
+ roast: components["schemas"]["RoastDetailResource"];
17924
+ import: components["schemas"]["ArtisanImportSummary"];
17925
+ reference: {
17926
+ /** Format: uuid */
17927
+ profileId: string;
17928
+ /** Format: uuid */
17929
+ revisionId: string;
17930
+ /** @description Whether the reference now lists the new roast as a linked roast. */
17931
+ linked: boolean;
17932
+ };
17933
+ };
17934
+ meta: {
17935
+ /** @enum {string} */
17936
+ resource: "roasts";
17937
+ /** @enum {string} */
17938
+ namespace: "/v1/roasts";
17939
+ /** @enum {string} */
17940
+ version: "v1";
17941
+ auth: {
17942
+ /** @enum {string} */
17943
+ kind: "session" | "api-key";
17944
+ /** @enum {string|null} */
17945
+ role: "admin" | "member" | "viewer" | null;
17946
+ /** @enum {string|null} */
17947
+ apiPlan: "viewer" | "member" | "enterprise" | null;
17948
+ };
17949
+ };
17950
+ };
17951
+ RoastImportFromReferenceRequest: {
17952
+ /**
17953
+ * Format: uuid
17954
+ * @description A saved Artisan reference profile owned by the caller.
17955
+ */
17956
+ referenceProfileId: string;
17957
+ /**
17958
+ * Format: uuid
17959
+ * @description That reference's current revision.
17960
+ */
17961
+ referenceRevisionId: string;
17962
+ /** @description green_coffee_inv.id owned by the caller to roast against. */
17963
+ coffeeId: number;
17964
+ /** @description Batch name; defaults to '<coffee> - <roast date>'. */
17965
+ batchName?: string;
17966
+ /** @description Roast date (YYYY-MM-DD); defaults to the file's date. */
17967
+ roastDate?: string;
17968
+ /** @description Input weight in oz; defaults to the file's weight if present. */
17969
+ ozIn?: number;
17970
+ /** @description Output weight in oz; defaults to the file's weight if present. */
17971
+ ozOut?: number;
17972
+ /** @description Roast notes; overrides the generated import summary note. */
17973
+ roastNotes?: string;
17974
+ roastTargets?: string;
17975
+ };
17396
17976
  RoastArtisanImportReplaceRequest: {
17397
17977
  /** @description Source file name. Must end in .alog, .alog.json, or .json (Artisan export). */
17398
17978
  fileName: string;
@@ -18302,6 +18882,10 @@ type RoastChartSeries = components["schemas"]["RoastChartSeries"];
18302
18882
  type RoastChartEvent = components["schemas"]["RoastChartEvent"];
18303
18883
  type ReferenceProfileImportRequest = NonNullable<paths["/v1/reference-profiles/imports"]["post"]["requestBody"]>["content"]["application/json"];
18304
18884
  type ReferenceProfileFromRoastRequest = NonNullable<paths["/v1/reference-profiles/from-roast"]["post"]["requestBody"]>["content"]["application/json"];
18885
+ /** Request body for {@link ParchmentClient.referenceProfiles.previewFromRoast}. */
18886
+ type ReferenceProfileRoastGenerationRequest = NonNullable<paths["/v1/reference-profiles/from-roast/preview"]["post"]["requestBody"]>["content"]["application/json"];
18887
+ /** Query parameters for {@link ParchmentClient.referenceProfiles.roastCandidates}. */
18888
+ type ReferenceProfileRoastCandidatesQuery = NonNullable<paths["/v1/reference-profiles/from-roast/candidates"]["get"]["parameters"]["query"]>;
18305
18889
  type ReferenceProfileUpdateRequest = NonNullable<paths["/v1/reference-profiles/{id}"]["patch"]["requestBody"]>["content"]["application/json"];
18306
18890
  type ReferenceProfileGenerationRequest = NonNullable<paths["/v1/reference-profiles/{id}/revisions/{revisionId}/preview"]["post"]["requestBody"]>["content"]["application/json"];
18307
18891
  type ProfileComparisonRequest = NonNullable<paths["/v1/profile-comparisons"]["post"]["requestBody"]>["content"]["application/json"];
@@ -18317,6 +18901,8 @@ type RoastUpdateRequest = NonNullable<paths["/v1/roasts/{id}"]["patch"]["request
18317
18901
  type RoastLiveCurveRequest = NonNullable<paths["/v1/roasts/{id}/live-curve"]["put"]["requestBody"]>["content"]["application/json"];
18318
18902
  /** Request body for {@link ParchmentClient.roasts.import}. */
18319
18903
  type RoastImportRequest = NonNullable<paths["/v1/roasts/imports"]["post"]["requestBody"]>["content"]["application/json"];
18904
+ /** Request body for {@link ParchmentClient.roasts.importFromReference}. */
18905
+ type RoastImportFromReferenceRequest = NonNullable<paths["/v1/roasts/imports/from-reference"]["post"]["requestBody"]>["content"]["application/json"];
18320
18906
  /** Request body for {@link ParchmentClient.roasts.replaceArtisanImport}. */
18321
18907
  type RoastArtisanImportReplaceRequest = NonNullable<paths["/v1/roasts/{id}/artisan-import"]["put"]["requestBody"]>["content"]["application/json"];
18322
18908
  /** Query parameters for {@link ParchmentClient.sales.list}. */
@@ -23921,7 +24507,7 @@ declare function createParchmentClient(options: ParchmentClientOptions): {
23921
24507
  [name: string]: unknown;
23922
24508
  };
23923
24509
  content: {
23924
- "application/json": components["schemas"]["ErrorResponse"];
24510
+ "application/json": components["schemas"]["RoastSourceErrorResponse"];
23925
24511
  };
23926
24512
  };
23927
24513
  401: {
@@ -24090,6 +24676,8 @@ declare function createParchmentClient(options: ParchmentClientOptions): {
24090
24676
  }[];
24091
24677
  };
24092
24678
  change_set_summary: string;
24679
+ source_roast_id?: number | string;
24680
+ source_roast_revision?: string;
24093
24681
  };
24094
24682
  } | {
24095
24683
  executionId: string;
@@ -29331,31 +29919,32 @@ declare function createParchmentClient(options: ParchmentClientOptions): {
29331
29919
  } | undefined;
29332
29920
  }, `${string}/${string}`>>;
29333
29921
  /**
29334
- * Replace the Artisan import data on one of the caller's existing roasts,
29335
- * re-deriving its curve, events, and computed metrics while preserving the
29336
- * roast's identity. Pass `ifMatch` (the roast's `last_updated`) to enable
29337
- * optimistic concurrency (409 on mismatch).
29922
+ * Create a roast profile from the Artisan file stored with one of the
29923
+ * caller's uploaded reference profiles. Only uploaded Artisan references
29924
+ * qualify: planned (generated) profiles are never recorded as roasts,
29925
+ * and a reference saved from an existing roast is refused. Requires
29926
+ * Mallard Studio plus a session, or an owner-bound API key carrying the
29927
+ * exact `roast:read` and `roast:write` scopes. The optional
29928
+ * `idempotencyKey` is payload-bound.
29338
29929
  */
29339
- replaceArtisanImport: (id: number, body: RoastArtisanImportReplaceRequest, options?: {
29340
- ifMatch?: string;
29930
+ importFromReference: (body: RoastImportFromReferenceRequest, options?: {
29931
+ idempotencyKey?: string;
29341
29932
  }) => Promise<openapi_fetch.FetchResponse<{
29342
29933
  parameters: {
29343
29934
  query?: never;
29344
29935
  header?: {
29345
- "if-match"?: string;
29346
- };
29347
- path: {
29348
- id: number;
29936
+ "idempotency-key"?: string;
29349
29937
  };
29938
+ path?: never;
29350
29939
  cookie?: never;
29351
29940
  };
29352
29941
  requestBody: {
29353
29942
  content: {
29354
- "application/json": components["schemas"]["RoastArtisanImportReplaceRequest"];
29943
+ "application/json": components["schemas"]["RoastImportFromReferenceRequest"];
29355
29944
  };
29356
29945
  };
29357
29946
  responses: {
29358
- 200: {
29947
+ 201: {
29359
29948
  headers: {
29360
29949
  "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
29361
29950
  "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
@@ -29366,7 +29955,7 @@ declare function createParchmentClient(options: ParchmentClientOptions): {
29366
29955
  [name: string]: unknown;
29367
29956
  };
29368
29957
  content: {
29369
- "application/json": components["schemas"]["RoastImportResponse"];
29958
+ "application/json": components["schemas"]["RoastImportFromReferenceResponse"];
29370
29959
  };
29371
29960
  };
29372
29961
  400: {
@@ -29471,21 +30060,179 @@ declare function createParchmentClient(options: ParchmentClientOptions): {
29471
30060
  };
29472
30061
  };
29473
30062
  }, {
29474
- params: {
29475
- path: {
29476
- id: number;
29477
- };
29478
- header: {
29479
- "if-match": string;
29480
- } | undefined;
29481
- };
29482
30063
  body: {
29483
- fileName: string;
29484
- fileContent: string;
29485
- fileSize?: number;
30064
+ referenceProfileId: string;
30065
+ referenceRevisionId: string;
30066
+ coffeeId: number;
30067
+ batchName?: string;
30068
+ roastDate?: string;
30069
+ ozIn?: number;
30070
+ ozOut?: number;
30071
+ roastNotes?: string;
30072
+ roastTargets?: string;
29486
30073
  };
29487
- }, `${string}/${string}`>>;
29488
- /**
30074
+ params: {
30075
+ header: {
30076
+ "idempotency-key": string;
30077
+ };
30078
+ } | undefined;
30079
+ }, `${string}/${string}`>>;
30080
+ /**
30081
+ * Replace the Artisan import data on one of the caller's existing roasts,
30082
+ * re-deriving its curve, events, and computed metrics while preserving the
30083
+ * roast's identity. Pass `ifMatch` (the roast's `last_updated`) to enable
30084
+ * optimistic concurrency (409 on mismatch).
30085
+ */
30086
+ replaceArtisanImport: (id: number, body: RoastArtisanImportReplaceRequest, options?: {
30087
+ ifMatch?: string;
30088
+ }) => Promise<openapi_fetch.FetchResponse<{
30089
+ parameters: {
30090
+ query?: never;
30091
+ header?: {
30092
+ "if-match"?: string;
30093
+ };
30094
+ path: {
30095
+ id: number;
30096
+ };
30097
+ cookie?: never;
30098
+ };
30099
+ requestBody: {
30100
+ content: {
30101
+ "application/json": components["schemas"]["RoastArtisanImportReplaceRequest"];
30102
+ };
30103
+ };
30104
+ responses: {
30105
+ 200: {
30106
+ headers: {
30107
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
30108
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
30109
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
30110
+ "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
30111
+ "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
30112
+ "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
30113
+ [name: string]: unknown;
30114
+ };
30115
+ content: {
30116
+ "application/json": components["schemas"]["RoastImportResponse"];
30117
+ };
30118
+ };
30119
+ 400: {
30120
+ headers: {
30121
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
30122
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
30123
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
30124
+ "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
30125
+ "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
30126
+ "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
30127
+ [name: string]: unknown;
30128
+ };
30129
+ content: {
30130
+ "application/json": components["schemas"]["ErrorResponse"];
30131
+ };
30132
+ };
30133
+ 401: {
30134
+ headers: {
30135
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
30136
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
30137
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
30138
+ "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
30139
+ "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
30140
+ "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
30141
+ [name: string]: unknown;
30142
+ };
30143
+ content: {
30144
+ "application/json": components["schemas"]["ErrorResponse"];
30145
+ };
30146
+ };
30147
+ 403: {
30148
+ headers: {
30149
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
30150
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
30151
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
30152
+ "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
30153
+ "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
30154
+ "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
30155
+ [name: string]: unknown;
30156
+ };
30157
+ content: {
30158
+ "application/json": components["schemas"]["ErrorResponse"];
30159
+ };
30160
+ };
30161
+ 404: {
30162
+ headers: {
30163
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
30164
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
30165
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
30166
+ "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
30167
+ "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
30168
+ "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
30169
+ [name: string]: unknown;
30170
+ };
30171
+ content: {
30172
+ "application/json": components["schemas"]["ErrorResponse"];
30173
+ };
30174
+ };
30175
+ 409: {
30176
+ headers: {
30177
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
30178
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
30179
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
30180
+ "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
30181
+ "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
30182
+ "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
30183
+ [name: string]: unknown;
30184
+ };
30185
+ content: {
30186
+ "application/json": components["schemas"]["ErrorResponse"];
30187
+ };
30188
+ };
30189
+ 429: {
30190
+ headers: {
30191
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
30192
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
30193
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
30194
+ "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
30195
+ "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
30196
+ "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
30197
+ "Retry-After": components["headers"]["Retry-After"];
30198
+ "X-RateLimit-Blocked-By": components["headers"]["X-RateLimit-Blocked-By"];
30199
+ [name: string]: unknown;
30200
+ };
30201
+ content: {
30202
+ "application/json": components["schemas"]["ErrorResponse"];
30203
+ };
30204
+ };
30205
+ 503: {
30206
+ headers: {
30207
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
30208
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
30209
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
30210
+ "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
30211
+ "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
30212
+ "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
30213
+ [name: string]: unknown;
30214
+ };
30215
+ content: {
30216
+ "application/json": components["schemas"]["ErrorResponse"];
30217
+ };
30218
+ };
30219
+ };
30220
+ }, {
30221
+ params: {
30222
+ path: {
30223
+ id: number;
30224
+ };
30225
+ header: {
30226
+ "if-match": string;
30227
+ } | undefined;
30228
+ };
30229
+ body: {
30230
+ fileName: string;
30231
+ fileContent: string;
30232
+ fileSize?: number;
30233
+ };
30234
+ }, `${string}/${string}`>>;
30235
+ /**
29489
30236
  * Clear import-derived curve, events, metrics, and provenance data from
29490
30237
  * one of the caller's existing roasts without deleting the roast profile.
29491
30238
  */
@@ -29850,7 +30597,9 @@ declare function createParchmentClient(options: ParchmentClientOptions): {
29850
30597
  409: {
29851
30598
  headers: {
29852
30599
  "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
29853
- "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
30600
+ "X-RateLimit-Remaining":
30601
+ /** Available exact 30-day comparisons, with no empty-origin search. */
30602
+ components["headers"]["X-RateLimit-Remaining"];
29854
30603
  "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
29855
30604
  "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
29856
30605
  "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
@@ -29880,7 +30629,7 @@ declare function createParchmentClient(options: ParchmentClientOptions): {
29880
30629
  id: string;
29881
30630
  revisionId: string;
29882
30631
  };
29883
- cookie?: never;
30632
+ cookie? /** Metadata-trend index (process/disclosure/Purveyor Score over time). */: never;
29884
30633
  };
29885
30634
  requestBody: {
29886
30635
  content: {
@@ -30350,6 +31099,13 @@ declare function createParchmentClient(options: ParchmentClientOptions): {
30350
31099
  };
30351
31100
  };
30352
31101
  }, `${string}/${string}`>>;
31102
+ /**
31103
+ * Save an executed roast as a reference. `basis: "artisan_source"`
31104
+ * copies the roast's stored Artisan file so a planned profile can be
31105
+ * built from it, and returns the reference already saved from that
31106
+ * roast's file instead of a duplicate; the default
31107
+ * `"chart_snapshot"` keeps a comparison-only chart.
31108
+ */
30353
31109
  fromRoast: (body: ReferenceProfileFromRoastRequest, idempotencyKey: string) => Promise<openapi_fetch.FetchResponse<{
30354
31110
  parameters: {
30355
31111
  query?: never;
@@ -30365,6 +31121,20 @@ declare function createParchmentClient(options: ParchmentClientOptions): {
30365
31121
  };
30366
31122
  };
30367
31123
  responses: {
31124
+ 200: {
31125
+ headers: {
31126
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
31127
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
31128
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
31129
+ "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
31130
+ "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
31131
+ "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
31132
+ [name: string]: unknown;
31133
+ };
31134
+ content: {
31135
+ "application/json": components["schemas"]["ReferenceProfileResponse"];
31136
+ };
31137
+ };
30368
31138
  201: {
30369
31139
  headers: {
30370
31140
  "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
@@ -30390,7 +31160,7 @@ declare function createParchmentClient(options: ParchmentClientOptions): {
30390
31160
  [name: string]: unknown;
30391
31161
  };
30392
31162
  content: {
30393
- "application/json": components["schemas"]["ErrorResponse"];
31163
+ "application/json": components["schemas"]["RoastSourceErrorResponse"];
30394
31164
  };
30395
31165
  };
30396
31166
  401: {
@@ -30455,6 +31225,7 @@ declare function createParchmentClient(options: ParchmentClientOptions): {
30455
31225
  body: {
30456
31226
  roastId: number;
30457
31227
  roastRevision: string;
31228
+ basis: "chart_snapshot" | "artisan_source";
30458
31229
  title?: string;
30459
31230
  notes?: string;
30460
31231
  };
@@ -30464,6 +31235,195 @@ declare function createParchmentClient(options: ParchmentClientOptions): {
30464
31235
  };
30465
31236
  };
30466
31237
  }, `${string}/${string}`>>;
31238
+ /**
31239
+ * List the caller's executed roasts whose Artisan file is on record and
31240
+ * can therefore be the base for a planned profile, newest first.
31241
+ */
31242
+ roastCandidates: (query?: ReferenceProfileRoastCandidatesQuery) => Promise<openapi_fetch.FetchResponse<{
31243
+ parameters: {
31244
+ query?: {
31245
+ limit?: number;
31246
+ };
31247
+ header?: never;
31248
+ path?: never;
31249
+ cookie?: never;
31250
+ };
31251
+ requestBody?: never;
31252
+ responses: {
31253
+ 200: {
31254
+ headers: {
31255
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
31256
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
31257
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
31258
+ "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
31259
+ "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
31260
+ "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
31261
+ [name: string]: unknown;
31262
+ };
31263
+ content: {
31264
+ "application/json": components["schemas"]["ReferenceProfileRoastCandidatesResponse"];
31265
+ };
31266
+ };
31267
+ 401: {
31268
+ headers: {
31269
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
31270
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
31271
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
31272
+ "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
31273
+ "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
31274
+ "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
31275
+ [name: string]: unknown;
31276
+ };
31277
+ content: {
31278
+ "application/json": components["schemas"]["ErrorResponse"];
31279
+ };
31280
+ };
31281
+ 403: {
31282
+ headers: {
31283
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
31284
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
31285
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
31286
+ "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
31287
+ "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
31288
+ "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
31289
+ [name: string]: unknown;
31290
+ };
31291
+ content: {
31292
+ "application/json": components["schemas"]["ErrorResponse"];
31293
+ };
31294
+ };
31295
+ 429: components["responses"]["ApiRateLimitExceeded"];
31296
+ };
31297
+ }, {
31298
+ params: {
31299
+ query: {
31300
+ limit?: number;
31301
+ } | undefined;
31302
+ };
31303
+ }, `${string}/${string}`>>;
31304
+ /**
31305
+ * Preview a planned profile built directly on an executed roast's stored
31306
+ * Artisan file. Read-only: nothing is saved and the roast is unchanged.
31307
+ */
31308
+ previewFromRoast: (body: ReferenceProfileRoastGenerationRequest) => Promise<openapi_fetch.FetchResponse<{
31309
+ parameters: {
31310
+ query?: never;
31311
+ header?: never;
31312
+ path?: never;
31313
+ cookie?: never;
31314
+ };
31315
+ requestBody: {
31316
+ content: {
31317
+ "application/json": components["schemas"]["ReferenceProfileRoastGenerationRequest"];
31318
+ };
31319
+ };
31320
+ responses: {
31321
+ 200: {
31322
+ headers: {
31323
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
31324
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
31325
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
31326
+ "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
31327
+ "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
31328
+ "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
31329
+ [name: string]: unknown;
31330
+ };
31331
+ content: {
31332
+ "application/json": components["schemas"]["ReferenceProfileRoastGenerationPreviewResponse"];
31333
+ };
31334
+ };
31335
+ 400: {
31336
+ headers: {
31337
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
31338
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
31339
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
31340
+ "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
31341
+ "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
31342
+ "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
31343
+ [name: string]: unknown;
31344
+ };
31345
+ content: {
31346
+ "application/json": components["schemas"]["RoastSourceErrorResponse"];
31347
+ };
31348
+ };
31349
+ 401: {
31350
+ headers: {
31351
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
31352
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
31353
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
31354
+ "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
31355
+ "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
31356
+ "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
31357
+ [name: string]: unknown;
31358
+ };
31359
+ content: {
31360
+ "application/json": components["schemas"]["ErrorResponse"];
31361
+ };
31362
+ };
31363
+ 403: {
31364
+ headers: {
31365
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
31366
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
31367
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
31368
+ "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
31369
+ "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
31370
+ "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
31371
+ [name: string]: unknown;
31372
+ };
31373
+ content: {
31374
+ "application/json": components["schemas"]["ErrorResponse"];
31375
+ };
31376
+ };
31377
+ 404: {
31378
+ headers: {
31379
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
31380
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
31381
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
31382
+ "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
31383
+ "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
31384
+ "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
31385
+ [name: string]: unknown;
31386
+ };
31387
+ content: {
31388
+ "application/json": components["schemas"]["ErrorResponse"];
31389
+ };
31390
+ };
31391
+ 409: {
31392
+ headers: {
31393
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
31394
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
31395
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
31396
+ "X-RateLimit-Burst-Limit": components["headers"]["X-RateLimit-Burst-Limit"];
31397
+ "X-RateLimit-Burst-Remaining": components["headers"]["X-RateLimit-Burst-Remaining"];
31398
+ "X-RateLimit-Burst-Reset": components["headers"]["X-RateLimit-Burst-Reset"];
31399
+ [name: string]: unknown;
31400
+ };
31401
+ content: {
31402
+ "application/json": components["schemas"]["ErrorResponse"];
31403
+ };
31404
+ };
31405
+ 429: components["responses"]["ApiRateLimitExceeded"];
31406
+ };
31407
+ }, {
31408
+ body: {
31409
+ title: string;
31410
+ notes?: string;
31411
+ userGoal?: string;
31412
+ modelRecommendation?: string;
31413
+ userEdits?: string;
31414
+ changes: {
31415
+ temperatureAdjustments: {
31416
+ kind: "bean_temperature" | "environmental_temperature";
31417
+ startMilliseconds: number;
31418
+ endMilliseconds: number;
31419
+ delta: number;
31420
+ }[];
31421
+ };
31422
+ } & {
31423
+ roastId: number;
31424
+ roastRevision: string;
31425
+ };
31426
+ }, `${string}/${string}`>>;
30467
31427
  update: (id: string, body: ReferenceProfileUpdateRequest) => Promise<openapi_fetch.FetchResponse<{
30468
31428
  parameters: {
30469
31429
  query?: never;
@@ -30629,9 +31589,7 @@ declare function createParchmentClient(options: ParchmentClientOptions): {
30629
31589
  [name: string]: unknown;
30630
31590
  };
30631
31591
  content: {
30632
- "application/json":
30633
- /** Request body for {@link ParchmentClient.apiKeys.create}. */
30634
- components["schemas"]["ErrorResponse"];
31592
+ "application/json": components["schemas"]["ErrorResponse"];
30635
31593
  };
30636
31594
  };
30637
31595
  403: {
@@ -31835,7 +32793,7 @@ type ParchmentClientMethod = MethodPaths<Omit<ParchmentClient, "raw">>;
31835
32793
  * SDK (such as the CLI) can import this list to prove they cover everything
31836
32794
  * the web agent can do.
31837
32795
  */
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"];
32796
+ 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
32797
  type ChatAgentCapability = (typeof CHAT_AGENT_CAPABILITIES)[number];
31840
32798
  /**
31841
32799
  * Writes the web agent can propose. The agent never writes directly: it