@purveyors/sdk 0.10.0 → 0.11.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 +678 -2
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -434,6 +434,377 @@ interface paths {
|
|
|
434
434
|
patch?: never;
|
|
435
435
|
trace?: never;
|
|
436
436
|
};
|
|
437
|
+
"/v1/cli-auth/requests": {
|
|
438
|
+
parameters: {
|
|
439
|
+
query?: never;
|
|
440
|
+
header?: never;
|
|
441
|
+
path?: never;
|
|
442
|
+
cookie?: never;
|
|
443
|
+
};
|
|
444
|
+
get?: never;
|
|
445
|
+
put?: never;
|
|
446
|
+
/** Create a short-lived PKCE-bound CLI login request */
|
|
447
|
+
post: {
|
|
448
|
+
parameters: {
|
|
449
|
+
query?: never;
|
|
450
|
+
header?: never;
|
|
451
|
+
path?: never;
|
|
452
|
+
cookie?: never;
|
|
453
|
+
};
|
|
454
|
+
requestBody: {
|
|
455
|
+
content: {
|
|
456
|
+
"application/json": {
|
|
457
|
+
machineName: string;
|
|
458
|
+
codeChallenge: string;
|
|
459
|
+
};
|
|
460
|
+
};
|
|
461
|
+
};
|
|
462
|
+
responses: {
|
|
463
|
+
/** @description CLI login request created */
|
|
464
|
+
201: {
|
|
465
|
+
headers: {
|
|
466
|
+
[name: string]: unknown;
|
|
467
|
+
};
|
|
468
|
+
content: {
|
|
469
|
+
"application/json": {
|
|
470
|
+
requestToken: string;
|
|
471
|
+
/** Format: uuid */
|
|
472
|
+
requestId: string;
|
|
473
|
+
/** Format: uri */
|
|
474
|
+
verificationUri: string;
|
|
475
|
+
/** Format: date-time */
|
|
476
|
+
expiresAt: string;
|
|
477
|
+
intervalSeconds: number;
|
|
478
|
+
};
|
|
479
|
+
};
|
|
480
|
+
};
|
|
481
|
+
/** @description Invalid CLI authentication request */
|
|
482
|
+
400: {
|
|
483
|
+
headers: {
|
|
484
|
+
[name: string]: unknown;
|
|
485
|
+
};
|
|
486
|
+
content: {
|
|
487
|
+
"application/json": components["schemas"]["ErrorResponse"];
|
|
488
|
+
};
|
|
489
|
+
};
|
|
490
|
+
/** @description Authorization pending or request conflict */
|
|
491
|
+
409: {
|
|
492
|
+
headers: {
|
|
493
|
+
[name: string]: unknown;
|
|
494
|
+
};
|
|
495
|
+
content: {
|
|
496
|
+
"application/json": components["schemas"]["ErrorResponse"];
|
|
497
|
+
};
|
|
498
|
+
};
|
|
499
|
+
/** @description Request expired or already consumed */
|
|
500
|
+
410: {
|
|
501
|
+
headers: {
|
|
502
|
+
[name: string]: unknown;
|
|
503
|
+
};
|
|
504
|
+
content: {
|
|
505
|
+
"application/json": components["schemas"]["ErrorResponse"];
|
|
506
|
+
};
|
|
507
|
+
};
|
|
508
|
+
/** @description CLI authentication unavailable */
|
|
509
|
+
503: {
|
|
510
|
+
headers: {
|
|
511
|
+
[name: string]: unknown;
|
|
512
|
+
};
|
|
513
|
+
content: {
|
|
514
|
+
"application/json": components["schemas"]["ErrorResponse"];
|
|
515
|
+
};
|
|
516
|
+
};
|
|
517
|
+
};
|
|
518
|
+
};
|
|
519
|
+
delete?: never;
|
|
520
|
+
options?: never;
|
|
521
|
+
head?: never;
|
|
522
|
+
patch?: never;
|
|
523
|
+
trace?: never;
|
|
524
|
+
};
|
|
525
|
+
"/v1/cli-auth/inspect": {
|
|
526
|
+
parameters: {
|
|
527
|
+
query?: never;
|
|
528
|
+
header?: never;
|
|
529
|
+
path?: never;
|
|
530
|
+
cookie?: never;
|
|
531
|
+
};
|
|
532
|
+
get?: never;
|
|
533
|
+
put?: never;
|
|
534
|
+
/** Inspect a signed CLI login request before showing consent */
|
|
535
|
+
post: {
|
|
536
|
+
parameters: {
|
|
537
|
+
query?: never;
|
|
538
|
+
header?: never;
|
|
539
|
+
path?: never;
|
|
540
|
+
cookie?: never;
|
|
541
|
+
};
|
|
542
|
+
requestBody: {
|
|
543
|
+
content: {
|
|
544
|
+
"application/json": {
|
|
545
|
+
requestToken: string;
|
|
546
|
+
};
|
|
547
|
+
};
|
|
548
|
+
};
|
|
549
|
+
responses: {
|
|
550
|
+
/** @description CLI login request details */
|
|
551
|
+
200: {
|
|
552
|
+
headers: {
|
|
553
|
+
[name: string]: unknown;
|
|
554
|
+
};
|
|
555
|
+
content: {
|
|
556
|
+
"application/json": {
|
|
557
|
+
/** Format: uuid */
|
|
558
|
+
requestId: string;
|
|
559
|
+
machineName: string;
|
|
560
|
+
/** Format: date-time */
|
|
561
|
+
expiresAt: string;
|
|
562
|
+
scopes: ("catalog:read" | "inventory:read" | "inventory:write" | "roast:read" | "roast:write" | "sales:read" | "sales:write" | "tasting:read" | "tasting:write")[];
|
|
563
|
+
};
|
|
564
|
+
};
|
|
565
|
+
};
|
|
566
|
+
/** @description Invalid CLI authentication request */
|
|
567
|
+
400: {
|
|
568
|
+
headers: {
|
|
569
|
+
[name: string]: unknown;
|
|
570
|
+
};
|
|
571
|
+
content: {
|
|
572
|
+
"application/json": components["schemas"]["ErrorResponse"];
|
|
573
|
+
};
|
|
574
|
+
};
|
|
575
|
+
/** @description Authorization pending or request conflict */
|
|
576
|
+
409: {
|
|
577
|
+
headers: {
|
|
578
|
+
[name: string]: unknown;
|
|
579
|
+
};
|
|
580
|
+
content: {
|
|
581
|
+
"application/json": components["schemas"]["ErrorResponse"];
|
|
582
|
+
};
|
|
583
|
+
};
|
|
584
|
+
/** @description Request expired or already consumed */
|
|
585
|
+
410: {
|
|
586
|
+
headers: {
|
|
587
|
+
[name: string]: unknown;
|
|
588
|
+
};
|
|
589
|
+
content: {
|
|
590
|
+
"application/json": components["schemas"]["ErrorResponse"];
|
|
591
|
+
};
|
|
592
|
+
};
|
|
593
|
+
/** @description CLI authentication unavailable */
|
|
594
|
+
503: {
|
|
595
|
+
headers: {
|
|
596
|
+
[name: string]: unknown;
|
|
597
|
+
};
|
|
598
|
+
content: {
|
|
599
|
+
"application/json": components["schemas"]["ErrorResponse"];
|
|
600
|
+
};
|
|
601
|
+
};
|
|
602
|
+
};
|
|
603
|
+
};
|
|
604
|
+
delete?: never;
|
|
605
|
+
options?: never;
|
|
606
|
+
head?: never;
|
|
607
|
+
patch?: never;
|
|
608
|
+
trace?: never;
|
|
609
|
+
};
|
|
610
|
+
"/v1/cli-auth/approve": {
|
|
611
|
+
parameters: {
|
|
612
|
+
query?: never;
|
|
613
|
+
header?: never;
|
|
614
|
+
path?: never;
|
|
615
|
+
cookie?: never;
|
|
616
|
+
};
|
|
617
|
+
get?: never;
|
|
618
|
+
put?: never;
|
|
619
|
+
/** Approve a CLI login request for the signed-in user */
|
|
620
|
+
post: {
|
|
621
|
+
parameters: {
|
|
622
|
+
query?: never;
|
|
623
|
+
header?: never;
|
|
624
|
+
path?: never;
|
|
625
|
+
cookie?: never;
|
|
626
|
+
};
|
|
627
|
+
requestBody: {
|
|
628
|
+
content: {
|
|
629
|
+
"application/json": {
|
|
630
|
+
requestToken: string;
|
|
631
|
+
};
|
|
632
|
+
};
|
|
633
|
+
};
|
|
634
|
+
responses: {
|
|
635
|
+
/** @description CLI login request approved */
|
|
636
|
+
200: {
|
|
637
|
+
headers: {
|
|
638
|
+
[name: string]: unknown;
|
|
639
|
+
};
|
|
640
|
+
content: {
|
|
641
|
+
"application/json": {
|
|
642
|
+
/** Format: uuid */
|
|
643
|
+
requestId: string;
|
|
644
|
+
/** @enum {boolean} */
|
|
645
|
+
approved: true;
|
|
646
|
+
};
|
|
647
|
+
};
|
|
648
|
+
};
|
|
649
|
+
/** @description Invalid CLI authentication request */
|
|
650
|
+
400: {
|
|
651
|
+
headers: {
|
|
652
|
+
[name: string]: unknown;
|
|
653
|
+
};
|
|
654
|
+
content: {
|
|
655
|
+
"application/json": components["schemas"]["ErrorResponse"];
|
|
656
|
+
};
|
|
657
|
+
};
|
|
658
|
+
/** @description Authentication required */
|
|
659
|
+
401: {
|
|
660
|
+
headers: {
|
|
661
|
+
[name: string]: unknown;
|
|
662
|
+
};
|
|
663
|
+
content: {
|
|
664
|
+
"application/json": components["schemas"]["ErrorResponse"];
|
|
665
|
+
};
|
|
666
|
+
};
|
|
667
|
+
/** @description Insufficient entitlement (plan or role) */
|
|
668
|
+
403: {
|
|
669
|
+
headers: {
|
|
670
|
+
[name: string]: unknown;
|
|
671
|
+
};
|
|
672
|
+
content: {
|
|
673
|
+
"application/json": components["schemas"]["ErrorResponse"];
|
|
674
|
+
};
|
|
675
|
+
};
|
|
676
|
+
/** @description Authorization pending or request conflict */
|
|
677
|
+
409: {
|
|
678
|
+
headers: {
|
|
679
|
+
[name: string]: unknown;
|
|
680
|
+
};
|
|
681
|
+
content: {
|
|
682
|
+
"application/json": components["schemas"]["ErrorResponse"];
|
|
683
|
+
};
|
|
684
|
+
};
|
|
685
|
+
/** @description Request expired or already consumed */
|
|
686
|
+
410: {
|
|
687
|
+
headers: {
|
|
688
|
+
[name: string]: unknown;
|
|
689
|
+
};
|
|
690
|
+
content: {
|
|
691
|
+
"application/json": components["schemas"]["ErrorResponse"];
|
|
692
|
+
};
|
|
693
|
+
};
|
|
694
|
+
/** @description CLI authentication unavailable */
|
|
695
|
+
503: {
|
|
696
|
+
headers: {
|
|
697
|
+
[name: string]: unknown;
|
|
698
|
+
};
|
|
699
|
+
content: {
|
|
700
|
+
"application/json": components["schemas"]["ErrorResponse"];
|
|
701
|
+
};
|
|
702
|
+
};
|
|
703
|
+
};
|
|
704
|
+
};
|
|
705
|
+
delete?: never;
|
|
706
|
+
options?: never;
|
|
707
|
+
head?: never;
|
|
708
|
+
patch?: never;
|
|
709
|
+
trace?: never;
|
|
710
|
+
};
|
|
711
|
+
"/v1/cli-auth/token": {
|
|
712
|
+
parameters: {
|
|
713
|
+
query?: never;
|
|
714
|
+
header?: never;
|
|
715
|
+
path?: never;
|
|
716
|
+
cookie?: never;
|
|
717
|
+
};
|
|
718
|
+
get?: never;
|
|
719
|
+
put?: never;
|
|
720
|
+
/** Exchange an approved request and PKCE verifier for a CLI API key */
|
|
721
|
+
post: {
|
|
722
|
+
parameters: {
|
|
723
|
+
query?: never;
|
|
724
|
+
header?: never;
|
|
725
|
+
path?: never;
|
|
726
|
+
cookie?: never;
|
|
727
|
+
};
|
|
728
|
+
requestBody: {
|
|
729
|
+
content: {
|
|
730
|
+
"application/json": {
|
|
731
|
+
requestToken: string;
|
|
732
|
+
codeVerifier: string;
|
|
733
|
+
};
|
|
734
|
+
};
|
|
735
|
+
};
|
|
736
|
+
responses: {
|
|
737
|
+
/** @description Machine key atomically replaced; raw key returned once */
|
|
738
|
+
201: {
|
|
739
|
+
headers: {
|
|
740
|
+
[name: string]: unknown;
|
|
741
|
+
};
|
|
742
|
+
content: {
|
|
743
|
+
"application/json": {
|
|
744
|
+
apiKey: string;
|
|
745
|
+
key: {
|
|
746
|
+
/** Format: uuid */
|
|
747
|
+
id: string;
|
|
748
|
+
name: string;
|
|
749
|
+
/** Format: date-time */
|
|
750
|
+
createdAt: string | null;
|
|
751
|
+
/** Format: date-time */
|
|
752
|
+
lastUsedAt: string | null;
|
|
753
|
+
isActive: boolean;
|
|
754
|
+
scopes: string[];
|
|
755
|
+
};
|
|
756
|
+
user: {
|
|
757
|
+
id: string;
|
|
758
|
+
email: string;
|
|
759
|
+
role: string;
|
|
760
|
+
};
|
|
761
|
+
};
|
|
762
|
+
};
|
|
763
|
+
};
|
|
764
|
+
/** @description Invalid CLI authentication request */
|
|
765
|
+
400: {
|
|
766
|
+
headers: {
|
|
767
|
+
[name: string]: unknown;
|
|
768
|
+
};
|
|
769
|
+
content: {
|
|
770
|
+
"application/json": components["schemas"]["ErrorResponse"];
|
|
771
|
+
};
|
|
772
|
+
};
|
|
773
|
+
/** @description Authorization pending or request conflict */
|
|
774
|
+
409: {
|
|
775
|
+
headers: {
|
|
776
|
+
[name: string]: unknown;
|
|
777
|
+
};
|
|
778
|
+
content: {
|
|
779
|
+
"application/json": components["schemas"]["ErrorResponse"];
|
|
780
|
+
};
|
|
781
|
+
};
|
|
782
|
+
/** @description Request expired or already consumed */
|
|
783
|
+
410: {
|
|
784
|
+
headers: {
|
|
785
|
+
[name: string]: unknown;
|
|
786
|
+
};
|
|
787
|
+
content: {
|
|
788
|
+
"application/json": components["schemas"]["ErrorResponse"];
|
|
789
|
+
};
|
|
790
|
+
};
|
|
791
|
+
/** @description CLI authentication unavailable */
|
|
792
|
+
503: {
|
|
793
|
+
headers: {
|
|
794
|
+
[name: string]: unknown;
|
|
795
|
+
};
|
|
796
|
+
content: {
|
|
797
|
+
"application/json": components["schemas"]["ErrorResponse"];
|
|
798
|
+
};
|
|
799
|
+
};
|
|
800
|
+
};
|
|
801
|
+
};
|
|
802
|
+
delete?: never;
|
|
803
|
+
options?: never;
|
|
804
|
+
head?: never;
|
|
805
|
+
patch?: never;
|
|
806
|
+
trace?: never;
|
|
807
|
+
};
|
|
437
808
|
"/v1/catalog/access": {
|
|
438
809
|
parameters: {
|
|
439
810
|
query?: never;
|
|
@@ -5612,6 +5983,10 @@ type TastingGetQuery = NonNullable<paths["/v1/tasting/{catalogId}"]["get"]["para
|
|
|
5612
5983
|
type TastingRateRequest = NonNullable<paths["/v1/tasting/inventory/{inventoryId}"]["put"]["requestBody"]>["content"]["application/json"];
|
|
5613
5984
|
/** Request body for {@link ParchmentClient.apiKeys.create}. */
|
|
5614
5985
|
type ApiKeyCreateRequest = NonNullable<paths["/v1/api-keys"]["post"]["requestBody"]>["content"]["application/json"];
|
|
5986
|
+
type CliAuthRequestCreate = NonNullable<paths["/v1/cli-auth/requests"]["post"]["requestBody"]>["content"]["application/json"];
|
|
5987
|
+
type CliAuthInspectRequest = NonNullable<paths["/v1/cli-auth/inspect"]["post"]["requestBody"]>["content"]["application/json"];
|
|
5988
|
+
type CliAuthApproveRequest = NonNullable<paths["/v1/cli-auth/approve"]["post"]["requestBody"]>["content"]["application/json"];
|
|
5989
|
+
type CliAuthExchangeRequest = NonNullable<paths["/v1/cli-auth/token"]["post"]["requestBody"]>["content"]["application/json"];
|
|
5615
5990
|
/**
|
|
5616
5991
|
* Create a typed Parchment API client.
|
|
5617
5992
|
*
|
|
@@ -5880,7 +6255,7 @@ declare function createParchmentClient(options: ParchmentClientOptions): {
|
|
|
5880
6255
|
[name: string]: unknown;
|
|
5881
6256
|
};
|
|
5882
6257
|
content: {
|
|
5883
|
-
"application/json": components["schemas"]
|
|
6258
|
+
"application/json": components["schemas"]["ErrorResponse"];
|
|
5884
6259
|
};
|
|
5885
6260
|
};
|
|
5886
6261
|
};
|
|
@@ -5999,7 +6374,7 @@ declare function createParchmentClient(options: ParchmentClientOptions): {
|
|
|
5999
6374
|
[name: string]: unknown;
|
|
6000
6375
|
};
|
|
6001
6376
|
content: {
|
|
6002
|
-
"application/json": components["schemas"]
|
|
6377
|
+
"application/json": components["schemas"]["ErrorResponse"];
|
|
6003
6378
|
};
|
|
6004
6379
|
};
|
|
6005
6380
|
404: {
|
|
@@ -6027,6 +6402,307 @@ declare function createParchmentClient(options: ParchmentClientOptions): {
|
|
|
6027
6402
|
};
|
|
6028
6403
|
}, `${string}/${string}`>>;
|
|
6029
6404
|
};
|
|
6405
|
+
cliAuth: {
|
|
6406
|
+
/** Create a signed, short-lived login request bound to a PKCE challenge. */
|
|
6407
|
+
create: (body: CliAuthRequestCreate) => Promise<openapi_fetch.FetchResponse<{
|
|
6408
|
+
parameters: {
|
|
6409
|
+
query?: never;
|
|
6410
|
+
header
|
|
6411
|
+
/** Fetch one of the caller's sourcing briefs by id. */
|
|
6412
|
+
? /** Fetch one of the caller's sourcing briefs by id. */: never;
|
|
6413
|
+
path?: never;
|
|
6414
|
+
cookie?: never;
|
|
6415
|
+
};
|
|
6416
|
+
requestBody: {
|
|
6417
|
+
content: {
|
|
6418
|
+
"application/json": {
|
|
6419
|
+
machineName: string;
|
|
6420
|
+
codeChallenge: string;
|
|
6421
|
+
};
|
|
6422
|
+
};
|
|
6423
|
+
};
|
|
6424
|
+
responses: {
|
|
6425
|
+
201: {
|
|
6426
|
+
headers: {
|
|
6427
|
+
[name: string]: unknown;
|
|
6428
|
+
};
|
|
6429
|
+
content: {
|
|
6430
|
+
"application/json": {
|
|
6431
|
+
requestToken: string;
|
|
6432
|
+
requestId: string;
|
|
6433
|
+
verificationUri: string;
|
|
6434
|
+
expiresAt: string;
|
|
6435
|
+
intervalSeconds: number;
|
|
6436
|
+
};
|
|
6437
|
+
};
|
|
6438
|
+
};
|
|
6439
|
+
400: {
|
|
6440
|
+
headers: {
|
|
6441
|
+
[name: string]: unknown;
|
|
6442
|
+
};
|
|
6443
|
+
content: {
|
|
6444
|
+
"application/json": components["schemas"]["ErrorResponse"];
|
|
6445
|
+
};
|
|
6446
|
+
};
|
|
6447
|
+
409: {
|
|
6448
|
+
headers: {
|
|
6449
|
+
[name: string]: unknown;
|
|
6450
|
+
};
|
|
6451
|
+
content: {
|
|
6452
|
+
"application/json": components["schemas"]["ErrorResponse"];
|
|
6453
|
+
};
|
|
6454
|
+
};
|
|
6455
|
+
410: {
|
|
6456
|
+
headers: {
|
|
6457
|
+
[name: string]: unknown;
|
|
6458
|
+
};
|
|
6459
|
+
content: {
|
|
6460
|
+
"application/json": components["schemas"]["ErrorResponse"];
|
|
6461
|
+
};
|
|
6462
|
+
};
|
|
6463
|
+
503: {
|
|
6464
|
+
headers: {
|
|
6465
|
+
[name: string]: unknown;
|
|
6466
|
+
};
|
|
6467
|
+
content: {
|
|
6468
|
+
"application/json": components["schemas"]["ErrorResponse"];
|
|
6469
|
+
};
|
|
6470
|
+
};
|
|
6471
|
+
};
|
|
6472
|
+
}, {
|
|
6473
|
+
body: {
|
|
6474
|
+
machineName: string;
|
|
6475
|
+
codeChallenge: string;
|
|
6476
|
+
};
|
|
6477
|
+
}, `${string}/${string}`>>;
|
|
6478
|
+
/** Inspect a signed request before displaying the web consent screen. */
|
|
6479
|
+
inspect: (body: CliAuthInspectRequest) => Promise<openapi_fetch.FetchResponse<{
|
|
6480
|
+
parameters: {
|
|
6481
|
+
query?: never;
|
|
6482
|
+
header?: never;
|
|
6483
|
+
path?: never;
|
|
6484
|
+
cookie?: never;
|
|
6485
|
+
};
|
|
6486
|
+
requestBody: {
|
|
6487
|
+
content: {
|
|
6488
|
+
"application/json": {
|
|
6489
|
+
requestToken: string;
|
|
6490
|
+
};
|
|
6491
|
+
};
|
|
6492
|
+
};
|
|
6493
|
+
responses: {
|
|
6494
|
+
200: {
|
|
6495
|
+
headers: {
|
|
6496
|
+
[name: string]: unknown;
|
|
6497
|
+
};
|
|
6498
|
+
content: {
|
|
6499
|
+
"application/json": {
|
|
6500
|
+
requestId: string;
|
|
6501
|
+
machineName: string;
|
|
6502
|
+
expiresAt: string;
|
|
6503
|
+
scopes: ("catalog:read" | "inventory:read" | "inventory:write" | "roast:read" | "roast:write" | "sales:read" | "sales:write" | "tasting:read" | "tasting:write")[];
|
|
6504
|
+
};
|
|
6505
|
+
};
|
|
6506
|
+
};
|
|
6507
|
+
400: {
|
|
6508
|
+
headers: {
|
|
6509
|
+
[name: string]: unknown;
|
|
6510
|
+
};
|
|
6511
|
+
content: {
|
|
6512
|
+
"application/json": components["schemas"]["ErrorResponse"];
|
|
6513
|
+
};
|
|
6514
|
+
};
|
|
6515
|
+
409: {
|
|
6516
|
+
headers: {
|
|
6517
|
+
[name: string]: unknown;
|
|
6518
|
+
};
|
|
6519
|
+
content: {
|
|
6520
|
+
"application/json": components["schemas"]["ErrorResponse"];
|
|
6521
|
+
};
|
|
6522
|
+
};
|
|
6523
|
+
410: {
|
|
6524
|
+
headers: {
|
|
6525
|
+
[name: string]: unknown;
|
|
6526
|
+
};
|
|
6527
|
+
content: {
|
|
6528
|
+
"application/json": components["schemas"]["ErrorResponse"];
|
|
6529
|
+
};
|
|
6530
|
+
};
|
|
6531
|
+
503: {
|
|
6532
|
+
headers: {
|
|
6533
|
+
[name: string]: unknown;
|
|
6534
|
+
};
|
|
6535
|
+
content: {
|
|
6536
|
+
"application/json": components["schemas"]["ErrorResponse"];
|
|
6537
|
+
};
|
|
6538
|
+
};
|
|
6539
|
+
};
|
|
6540
|
+
}, {
|
|
6541
|
+
body: {
|
|
6542
|
+
requestToken: string;
|
|
6543
|
+
};
|
|
6544
|
+
}, `${string}/${string}`>>;
|
|
6545
|
+
/** Approve a request using the client's authenticated user session. */
|
|
6546
|
+
approve: (body: CliAuthApproveRequest) => Promise<openapi_fetch.FetchResponse<{
|
|
6547
|
+
parameters: {
|
|
6548
|
+
query?: never;
|
|
6549
|
+
header?: never;
|
|
6550
|
+
path?: never;
|
|
6551
|
+
cookie?: never;
|
|
6552
|
+
};
|
|
6553
|
+
requestBody: {
|
|
6554
|
+
content: {
|
|
6555
|
+
"application/json": {
|
|
6556
|
+
requestToken: string;
|
|
6557
|
+
};
|
|
6558
|
+
};
|
|
6559
|
+
};
|
|
6560
|
+
responses: {
|
|
6561
|
+
200: {
|
|
6562
|
+
headers: {
|
|
6563
|
+
[name: string]: unknown;
|
|
6564
|
+
};
|
|
6565
|
+
content: {
|
|
6566
|
+
"application/json": {
|
|
6567
|
+
requestId: string;
|
|
6568
|
+
approved: true;
|
|
6569
|
+
};
|
|
6570
|
+
};
|
|
6571
|
+
};
|
|
6572
|
+
400: {
|
|
6573
|
+
headers: {
|
|
6574
|
+
[name: string]: unknown;
|
|
6575
|
+
};
|
|
6576
|
+
content: {
|
|
6577
|
+
"application/json": components["schemas"] /** Fetch supplier notes plus the caller's own latest tasting notes. */["ErrorResponse"];
|
|
6578
|
+
};
|
|
6579
|
+
};
|
|
6580
|
+
401: {
|
|
6581
|
+
headers: {
|
|
6582
|
+
[name: string]: unknown;
|
|
6583
|
+
};
|
|
6584
|
+
content: {
|
|
6585
|
+
"application/json": components["schemas"]["ErrorResponse"];
|
|
6586
|
+
};
|
|
6587
|
+
};
|
|
6588
|
+
403: {
|
|
6589
|
+
headers: {
|
|
6590
|
+
[name: string]: unknown;
|
|
6591
|
+
};
|
|
6592
|
+
content: {
|
|
6593
|
+
"application/json": components["schemas"]["ErrorResponse"];
|
|
6594
|
+
};
|
|
6595
|
+
};
|
|
6596
|
+
409: {
|
|
6597
|
+
headers: {
|
|
6598
|
+
[name: string]: unknown;
|
|
6599
|
+
};
|
|
6600
|
+
content: {
|
|
6601
|
+
"application/json": components["schemas"]["ErrorResponse"];
|
|
6602
|
+
};
|
|
6603
|
+
};
|
|
6604
|
+
410: {
|
|
6605
|
+
headers: {
|
|
6606
|
+
[name: string]: unknown;
|
|
6607
|
+
};
|
|
6608
|
+
content: {
|
|
6609
|
+
"application/json": components["schemas"]["ErrorResponse"];
|
|
6610
|
+
};
|
|
6611
|
+
};
|
|
6612
|
+
503: {
|
|
6613
|
+
headers: {
|
|
6614
|
+
[name: string]: unknown;
|
|
6615
|
+
};
|
|
6616
|
+
content: {
|
|
6617
|
+
"application/json": components["schemas"]["ErrorResponse"];
|
|
6618
|
+
};
|
|
6619
|
+
};
|
|
6620
|
+
};
|
|
6621
|
+
}, {
|
|
6622
|
+
body: {
|
|
6623
|
+
requestToken: string;
|
|
6624
|
+
};
|
|
6625
|
+
}, `${string}/${string}`>>;
|
|
6626
|
+
/** Exchange an approved request and verifier for the one-time raw key. */
|
|
6627
|
+
exchange: (body: CliAuthExchangeRequest) => Promise<openapi_fetch.FetchResponse<{
|
|
6628
|
+
parameters: {
|
|
6629
|
+
query?: never;
|
|
6630
|
+
header?: never;
|
|
6631
|
+
path?: never;
|
|
6632
|
+
cookie?: never;
|
|
6633
|
+
};
|
|
6634
|
+
requestBody: {
|
|
6635
|
+
content: {
|
|
6636
|
+
"application/json": {
|
|
6637
|
+
requestToken: string;
|
|
6638
|
+
codeVerifier: string;
|
|
6639
|
+
};
|
|
6640
|
+
};
|
|
6641
|
+
};
|
|
6642
|
+
responses: {
|
|
6643
|
+
201: {
|
|
6644
|
+
headers: {
|
|
6645
|
+
[name: string]: unknown;
|
|
6646
|
+
};
|
|
6647
|
+
content: {
|
|
6648
|
+
"application/json": {
|
|
6649
|
+
apiKey: string;
|
|
6650
|
+
key: {
|
|
6651
|
+
id: string;
|
|
6652
|
+
name: string;
|
|
6653
|
+
createdAt: string | null;
|
|
6654
|
+
lastUsedAt: string | null;
|
|
6655
|
+
isActive: boolean;
|
|
6656
|
+
scopes: string[];
|
|
6657
|
+
};
|
|
6658
|
+
user: {
|
|
6659
|
+
id: string;
|
|
6660
|
+
email: string;
|
|
6661
|
+
role: string;
|
|
6662
|
+
};
|
|
6663
|
+
};
|
|
6664
|
+
};
|
|
6665
|
+
};
|
|
6666
|
+
400: {
|
|
6667
|
+
headers: {
|
|
6668
|
+
[name: string]: unknown;
|
|
6669
|
+
};
|
|
6670
|
+
content: {
|
|
6671
|
+
"application/json": components["schemas"]["ErrorResponse"];
|
|
6672
|
+
};
|
|
6673
|
+
};
|
|
6674
|
+
409: {
|
|
6675
|
+
headers: {
|
|
6676
|
+
[name: string]: unknown;
|
|
6677
|
+
};
|
|
6678
|
+
content: {
|
|
6679
|
+
"application/json": components["schemas"]["ErrorResponse"];
|
|
6680
|
+
};
|
|
6681
|
+
};
|
|
6682
|
+
410: {
|
|
6683
|
+
headers: {
|
|
6684
|
+
[name: string]: unknown;
|
|
6685
|
+
};
|
|
6686
|
+
content: {
|
|
6687
|
+
"application/json": components["schemas"]["ErrorResponse"];
|
|
6688
|
+
};
|
|
6689
|
+
};
|
|
6690
|
+
503: {
|
|
6691
|
+
headers: {
|
|
6692
|
+
[name: string]: unknown;
|
|
6693
|
+
};
|
|
6694
|
+
content: {
|
|
6695
|
+
"application/json": components["schemas"]["ErrorResponse"];
|
|
6696
|
+
};
|
|
6697
|
+
};
|
|
6698
|
+
};
|
|
6699
|
+
}, {
|
|
6700
|
+
body: {
|
|
6701
|
+
requestToken: string;
|
|
6702
|
+
codeVerifier: string;
|
|
6703
|
+
};
|
|
6704
|
+
}, `${string}/${string}`>>;
|
|
6705
|
+
};
|
|
6030
6706
|
catalog: {
|
|
6031
6707
|
/** Catalog capabilities and visibility for the caller. */
|
|
6032
6708
|
access: () => Promise<openapi_fetch.FetchResponse<{
|
package/dist/index.js
CHANGED
|
@@ -28,6 +28,16 @@ function createParchmentClient(options) {
|
|
|
28
28
|
params: { path: { id } }
|
|
29
29
|
})
|
|
30
30
|
},
|
|
31
|
+
cliAuth: {
|
|
32
|
+
/** Create a signed, short-lived login request bound to a PKCE challenge. */
|
|
33
|
+
create: (body) => client.POST("/v1/cli-auth/requests", { body }),
|
|
34
|
+
/** Inspect a signed request before displaying the web consent screen. */
|
|
35
|
+
inspect: (body) => client.POST("/v1/cli-auth/inspect", { body }),
|
|
36
|
+
/** Approve a request using the client's authenticated user session. */
|
|
37
|
+
approve: (body) => client.POST("/v1/cli-auth/approve", { body }),
|
|
38
|
+
/** Exchange an approved request and verifier for the one-time raw key. */
|
|
39
|
+
exchange: (body) => client.POST("/v1/cli-auth/token", { body })
|
|
40
|
+
},
|
|
31
41
|
catalog: {
|
|
32
42
|
/** Catalog capabilities and visibility for the caller. */
|
|
33
43
|
access: () => client.GET("/v1/catalog/access"),
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/client.ts"],"sourcesContent":["import createClient, { type ClientOptions } from \"openapi-fetch\";\nimport type { components, paths } from \"./schema\";\n\nexport interface ParchmentClientOptions {\n /** Base URL of the Parchment API, e.g. https://api.purveyors.io */\n baseUrl: string;\n /**\n * Optional bearer token (a Supabase JWT or, later, an API key). Sent as\n * `Authorization: Bearer <token>`. Auth is resolved server-side against the\n * unified principal model; the SDK only forwards the credential.\n */\n token?: string;\n /** Override the fetch implementation (useful for tests or custom runtimes). */\n fetch?: ClientOptions[\"fetch\"];\n}\n\n/** Query parameters for {@link ParchmentClient.catalog.list}. */\nexport type CatalogListQuery = NonNullable<\n paths[\"/v1/catalog\"][\"get\"][\"parameters\"][\"query\"]\n>;\n/** Query parameters for {@link ParchmentClient.catalog.facets}. */\nexport type CatalogFacetsQuery = NonNullable<\n paths[\"/v1/catalog/facets\"][\"get\"][\"parameters\"][\"query\"]\n>;\n/**\n * Optional headers for {@link ParchmentClient.catalog.list}, notably the\n * RFC 7240 `Prefer: handling=lenient|strict` override (PADR-0013 §7). Sending\n * `handling=lenient` opts a strict caller (API key or bearer-session JWT) back\n * into strip-with-notice degradation instead of a 401/403 hard-deny.\n */\nexport type CatalogListHeaders = NonNullable<\n paths[\"/v1/catalog\"][\"get\"][\"parameters\"][\"header\"]\n>;\n/** Optional headers for {@link ParchmentClient.catalog.facets}; see {@link CatalogListHeaders}. */\nexport type CatalogFacetsHeaders = NonNullable<\n paths[\"/v1/catalog/facets\"][\"get\"][\"parameters\"][\"header\"]\n>;\n/** Query parameters for {@link ParchmentClient.catalog.originPriceStats}. */\nexport type CatalogOriginPriceStatsQuery = NonNullable<\n paths[\"/v1/catalog/origin-price-stats\"][\"get\"][\"parameters\"][\"query\"]\n>;\n/** Query parameters for {@link ParchmentClient.catalog.stats}. */\nexport type CatalogStatsQuery = NonNullable<\n paths[\"/v1/catalog/stats\"][\"get\"][\"parameters\"][\"query\"]\n>;\n/** Query parameters for {@link ParchmentClient.catalog.rank}. */\nexport type CatalogRankQuery = NonNullable<\n paths[\"/v1/catalog/rank\"][\"get\"][\"parameters\"][\"query\"]\n>;\n/** Query parameters for {@link ParchmentClient.catalog.rankPremium}. */\nexport type CatalogRankPremiumQuery = NonNullable<\n paths[\"/v1/catalog/rank-premium\"][\"get\"][\"parameters\"][\"query\"]\n>;\n/** Query parameters for {@link ParchmentClient.catalog.suppliers}. */\nexport type CatalogSuppliersQuery = NonNullable<\n paths[\"/v1/catalog/suppliers\"][\"get\"][\"parameters\"][\"query\"]\n>;\n/** Query parameters for {@link ParchmentClient.catalog.supplierDetail}. */\nexport type CatalogSupplierDetailQuery = NonNullable<\n paths[\"/v1/catalog/suppliers/detail\"][\"get\"][\"parameters\"][\"query\"]\n>;\n/** Query parameters for {@link ParchmentClient.catalog.supplierRank}. */\nexport type CatalogSupplierRankQuery = NonNullable<\n paths[\"/v1/catalog/suppliers/rank\"][\"get\"][\"parameters\"][\"query\"]\n>;\n/** Optional headers for ranking endpoints; see {@link CatalogListHeaders}. */\nexport type CatalogRankHeaders = NonNullable<\n paths[\"/v1/catalog/rank\"][\"get\"][\"parameters\"][\"header\"]\n>;\n/** Optional headers for premium ranking endpoints; see {@link CatalogListHeaders}. */\nexport type CatalogRankPremiumHeaders = NonNullable<\n paths[\"/v1/catalog/rank-premium\"][\"get\"][\"parameters\"][\"header\"]\n>;\n/** Optional headers for supplier aggregate endpoints; see {@link CatalogListHeaders}. */\nexport type CatalogSupplierHeaders = NonNullable<\n paths[\"/v1/catalog/suppliers\"][\"get\"][\"parameters\"][\"header\"]\n>;\n/** Query parameters for {@link ParchmentClient.catalog.similar}. */\nexport type CatalogSimilarQuery = NonNullable<\n paths[\"/v1/catalog/{id}/similar\"][\"get\"][\"parameters\"][\"query\"]\n>;\n/** Query parameters for {@link ParchmentClient.priceIndex.list}. */\nexport type PriceIndexQuery = NonNullable<\n paths[\"/v1/price-index\"][\"get\"][\"parameters\"][\"query\"]\n>;\n/** Query parameters for {@link ParchmentClient.market.signals}. */\nexport type MarketSignalsQuery = NonNullable<\n paths[\"/v1/market/signals\"][\"get\"][\"parameters\"][\"query\"]\n>;\n/** Query parameters for {@link ParchmentClient.priceIndex.stats}. */\nexport type PriceIndexStatsQuery = NonNullable<\n paths[\"/v1/price-index/stats\"][\"get\"][\"parameters\"][\"query\"]\n>;\n/** Query parameters for {@link ParchmentClient.market.metadataIndex}. */\nexport type MetadataIndexQuery = NonNullable<\n paths[\"/v1/market/metadata-index\"][\"get\"][\"parameters\"][\"query\"]\n>;\n/** Query parameters for {@link ParchmentClient.procurement.briefs.matches}. */\nexport type BriefMatchesQuery = NonNullable<\n paths[\"/v1/procurement/briefs/{id}/matches\"][\"get\"][\"parameters\"][\"query\"]\n>;\n/** Request body for {@link ParchmentClient.procurement.briefs.create}. */\nexport type SourcingBriefCreateRequest =\n components[\"schemas\"][\"SourcingBriefCreateRequest\"];\n/** Query parameters for {@link ParchmentClient.inventory.list}. */\nexport type InventoryListQuery = NonNullable<\n paths[\"/v1/inventory\"][\"get\"][\"parameters\"][\"query\"]\n>;\n/** Request body for {@link ParchmentClient.inventory.create}. */\nexport type InventoryCreateRequest = NonNullable<\n paths[\"/v1/inventory\"][\"post\"][\"requestBody\"]\n>[\"content\"][\"application/json\"];\n/** Request body for {@link ParchmentClient.inventory.update}. */\nexport type InventoryUpdateRequest = NonNullable<\n paths[\"/v1/inventory/{id}\"][\"patch\"][\"requestBody\"]\n>[\"content\"][\"application/json\"];\n/** Query parameters for {@link ParchmentClient.roasts.list}. */\nexport type RoastListQuery = NonNullable<\n paths[\"/v1/roasts\"][\"get\"][\"parameters\"][\"query\"]\n>;\n/** Query parameters for {@link ParchmentClient.roasts.get}. */\nexport type RoastGetQuery = NonNullable<\n paths[\"/v1/roasts/{id}\"][\"get\"][\"parameters\"][\"query\"]\n>;\n/** Request body for {@link ParchmentClient.roasts.classify}. */\nexport type RoastClassificationRequest = NonNullable<\n paths[\"/v1/roasts/classify\"][\"post\"][\"requestBody\"]\n>[\"content\"][\"application/json\"];\n/** Request body for {@link ParchmentClient.roasts.create}. */\nexport type RoastCreateRequest = NonNullable<\n paths[\"/v1/roasts\"][\"post\"][\"requestBody\"]\n>[\"content\"][\"application/json\"];\n/** Request body for {@link ParchmentClient.roasts.update}. */\nexport type RoastUpdateRequest = NonNullable<\n paths[\"/v1/roasts/{id}\"][\"patch\"][\"requestBody\"]\n>[\"content\"][\"application/json\"];\n/** Request body for {@link ParchmentClient.roasts.import}. */\nexport type RoastImportRequest = NonNullable<\n paths[\"/v1/roasts/imports\"][\"post\"][\"requestBody\"]\n>[\"content\"][\"application/json\"];\n/** Request body for {@link ParchmentClient.roasts.replaceArtisanImport}. */\nexport type RoastArtisanImportReplaceRequest = NonNullable<\n paths[\"/v1/roasts/{id}/artisan-import\"][\"put\"][\"requestBody\"]\n>[\"content\"][\"application/json\"];\n/** Query parameters for {@link ParchmentClient.sales.list}. */\nexport type SalesListQuery = NonNullable<\n paths[\"/v1/sales\"][\"get\"][\"parameters\"][\"query\"]\n>;\n/** Request body for {@link ParchmentClient.sales.create}. */\nexport type SalesCreateRequest = NonNullable<\n paths[\"/v1/sales\"][\"post\"][\"requestBody\"]\n>[\"content\"][\"application/json\"];\n/** Request body for {@link ParchmentClient.sales.update}. */\nexport type SalesUpdateRequest = NonNullable<\n paths[\"/v1/sales/{id}\"][\"patch\"][\"requestBody\"]\n>[\"content\"][\"application/json\"];\n/** Query parameters for {@link ParchmentClient.tasting.get}. */\nexport type TastingGetQuery = NonNullable<\n paths[\"/v1/tasting/{catalogId}\"][\"get\"][\"parameters\"][\"query\"]\n>;\n/** Request body for {@link ParchmentClient.tasting.rate}. */\nexport type TastingRateRequest = NonNullable<\n paths[\"/v1/tasting/inventory/{inventoryId}\"][\"put\"][\"requestBody\"]\n>[\"content\"][\"application/json\"];\n/** Request body for {@link ParchmentClient.apiKeys.create}. */\nexport type ApiKeyCreateRequest = NonNullable<\n paths[\"/v1/api-keys\"][\"post\"][\"requestBody\"]\n>[\"content\"][\"application/json\"];\n\n/**\n * Create a typed Parchment API client.\n *\n * The generated core (openapi-fetch over the generated `paths` types) is the\n * contract truth; the named helpers below are the hand-maintained ergonomic\n * layer and grow as endpoints land. `raw` always exposes the underlying typed\n * client for direct path access to anything not yet wrapped.\n */\nexport function createParchmentClient(options: ParchmentClientOptions) {\n const { baseUrl, token, fetch: fetchImpl } = options;\n\n const client = createClient<paths>({\n baseUrl,\n fetch: fetchImpl,\n headers: token ? { Authorization: `Bearer ${token}` } : undefined,\n });\n\n return {\n /** The underlying typed openapi-fetch client for direct path access. */\n raw: client,\n /** Liveness and service identity. */\n health: () => client.GET(\"/health\"),\n /** Resolved principal and entitlements for the caller. */\n me: () => client.GET(\"/v1/me\"),\n apiKeys: {\n /** List API keys owned by the authenticated session user. */\n list: () => client.GET(\"/v1/api-keys\"),\n /** Create an API key. The raw secret is returned only once. */\n create: (body: ApiKeyCreateRequest) =>\n client.POST(\"/v1/api-keys\", { body }),\n /** Revoke an API key owned by the authenticated session user. */\n revoke: (id: string) =>\n client.DELETE(\"/v1/api-keys/{id}\", {\n params: { path: { id } },\n }),\n /** Rotate an API key and return the replacement secret once. */\n rotate: (id: string) =>\n client.POST(\"/v1/api-keys/{id}/rotate\", {\n params: { path: { id } },\n }),\n },\n catalog: {\n /** Catalog capabilities and visibility for the caller. */\n access: () => client.GET(\"/v1/catalog/access\"),\n /**\n * List public catalog coffees (paginated). Pass `headers` to send the\n * `Prefer: handling=lenient|strict` override (see {@link CatalogListHeaders}).\n */\n list: (query?: CatalogListQuery, headers?: CatalogListHeaders) =>\n client.GET(\"/v1/catalog\", { params: { query, header: headers } }),\n /**\n * Catalog filter metadata and counted facets. Pass `headers` to send the\n * `Prefer: handling=lenient|strict` override (see {@link CatalogFacetsHeaders}).\n */\n facets: (query?: CatalogFacetsQuery, headers?: CatalogFacetsHeaders) =>\n client.GET(\"/v1/catalog/facets\", {\n params: { query, header: headers },\n }),\n /** Live catalog price context by origin. */\n originPriceStats: (query?: CatalogOriginPriceStatsQuery) =>\n client.GET(\"/v1/catalog/origin-price-stats\", { params: { query } }),\n /** Aggregate stats over the caller-visible catalog. */\n stats: (query?: CatalogStatsQuery) =>\n client.GET(\"/v1/catalog/stats\", { params: { query } }),\n /** Rank caller-visible catalog coffees by deterministic objectives. */\n rank: (query?: CatalogRankQuery, headers?: CatalogRankHeaders) =>\n client.GET(\"/v1/catalog/rank\", {\n params: { query, header: headers },\n }),\n /** Rank premium catalog candidates by Purveyor Score. */\n rankPremium: (\n query?: CatalogRankPremiumQuery,\n headers?: CatalogRankPremiumHeaders,\n ) =>\n client.GET(\"/v1/catalog/rank-premium\", {\n params: { query, header: headers },\n }),\n /** List supplier aggregates over caller-visible catalog coffees. */\n suppliers: (\n query?: CatalogSuppliersQuery,\n headers?: CatalogSupplierHeaders,\n ) =>\n client.GET(\"/v1/catalog/suppliers\", {\n params: { query, header: headers },\n }),\n /** Return aggregate detail for a supplier query. */\n supplierDetail: (\n query: CatalogSupplierDetailQuery,\n headers?: CatalogSupplierHeaders,\n ) =>\n client.GET(\"/v1/catalog/suppliers/detail\", {\n params: { query, header: headers },\n }),\n /** Rank suppliers by catalog score and availability. */\n supplierRank: (\n query?: CatalogSupplierRankQuery,\n headers?: CatalogSupplierHeaders,\n ) =>\n client.GET(\"/v1/catalog/suppliers/rank\", {\n params: { query, header: headers },\n }),\n /** Aggregate proof-coverage over the public catalog. */\n proofCoverage: () => client.GET(\"/v1/catalog/proof-coverage\"),\n /** Find catalog coffees similar to a target coffee. */\n similar: (id: string, query?: CatalogSimilarQuery) =>\n client.GET(\"/v1/catalog/{id}/similar\", {\n params: { path: { id }, query },\n }),\n },\n priceIndex: {\n /** Parchment Price Index (aggregate snapshots). */\n list: (query?: PriceIndexQuery) =>\n client.GET(\"/v1/price-index\", { params: { query } }),\n /** Price movement significance stats (precomputed). */\n stats: (query?: PriceIndexStatsQuery) =>\n client.GET(\"/v1/price-index/stats\", { params: { query } }),\n },\n market: {\n /** Actionable market value signals. */\n signals: (query?: MarketSignalsQuery) =>\n client.GET(\"/v1/market/signals\", { params: { query } }),\n /** Metadata-trend index (process/disclosure/Purveyor Score over time). */\n metadataIndex: (query?: MetadataIndexQuery) =>\n client.GET(\"/v1/market/metadata-index\", { params: { query } }),\n },\n procurement: {\n briefs: {\n /** List the caller's saved sourcing briefs. */\n list: () => client.GET(\"/v1/procurement/briefs\"),\n /** Create a saved sourcing brief. */\n create: (body: SourcingBriefCreateRequest) =>\n client.POST(\"/v1/procurement/briefs\", { body }),\n /** Fetch one of the caller's sourcing briefs by id. */\n get: (id: string) =>\n client.GET(\"/v1/procurement/briefs/{id}\", {\n params: { path: { id } },\n }),\n /** Run a saved brief against the catalog (paginated matches). */\n matches: (id: string, query?: BriefMatchesQuery) =>\n client.GET(\"/v1/procurement/briefs/{id}/matches\", {\n params: { path: { id }, query },\n }),\n },\n },\n inventory: {\n /** List the caller's own green-coffee inventory (owner-scoped). */\n list: (query?: InventoryListQuery) =>\n client.GET(\"/v1/inventory\", { params: { query } }),\n /**\n * Create an owner inventory lot. Requires a session or an owner-bound API\n * key carrying the exact `inventory:write` scope. Pass `idempotencyKey`\n * to make retries safe: the same key replays the original result, and a\n * concurrent duplicate gets 409 while the first is in flight.\n */\n create: (\n body: InventoryCreateRequest,\n options?: { idempotencyKey?: string },\n ) =>\n client.POST(\"/v1/inventory\", {\n body,\n params: options?.idempotencyKey\n ? { header: { \"idempotency-key\": options.idempotencyKey } }\n : undefined,\n }),\n /**\n * Update one of the caller's own inventory rows. Pass `ifMatch` (the\n * row's `last_updated`) to enable optimistic concurrency (409 on mismatch).\n */\n update: (\n id: number,\n body: InventoryUpdateRequest,\n options?: { ifMatch?: string },\n ) =>\n client.PATCH(\"/v1/inventory/{id}\", {\n params: {\n path: { id },\n header: options?.ifMatch\n ? { \"if-match\": options.ifMatch }\n : undefined,\n },\n body,\n }),\n /**\n * Delete one of the caller's own inventory rows. Returns 409 if dependent\n * roast profiles or sales exist (no force-cascade).\n */\n delete: (id: number) =>\n client.DELETE(\"/v1/inventory/{id}\", { params: { path: { id } } }),\n },\n roasts: {\n /** Match Artisan roast metadata to one of the supplied inventory rows. */\n classify: (body: RoastClassificationRequest) =>\n client.POST(\"/v1/roasts/classify\", { body }),\n /** List the caller's own roast profiles (owner-scoped). */\n list: (query?: RoastListQuery) =>\n client.GET(\"/v1/roasts\", { params: { query } }),\n /**\n * Fetch one of the caller's roast profiles by id, optionally with its\n * temperature curve (`includeTemps`) and event markers (`includeEvents`).\n */\n get: (id: string, query?: RoastGetQuery) =>\n client.GET(\"/v1/roasts/{id}\", { params: { path: { id }, query } }),\n /**\n * Create an owner roast profile, optionally with nested temperature/event\n * rows. Requires a session or an owner-bound API key carrying the exact\n * `roast:write` scope. Pass `idempotencyKey` to make retries safe.\n */\n create: (\n body: RoastCreateRequest,\n options?: { idempotencyKey?: string },\n ) =>\n client.POST(\"/v1/roasts\", {\n body,\n params: options?.idempotencyKey\n ? { header: { \"idempotency-key\": options.idempotencyKey } }\n : undefined,\n }),\n /**\n * Update one of the caller's own roast profiles. Pass `ifMatch` (the\n * row's `last_updated`) to enable optimistic concurrency (409 on mismatch).\n */\n update: (\n id: number,\n body: RoastUpdateRequest,\n options?: { ifMatch?: string },\n ) =>\n client.PATCH(\"/v1/roasts/{id}\", {\n params: {\n path: { id },\n header: options?.ifMatch\n ? { \"if-match\": options.ifMatch }\n : undefined,\n },\n body,\n }),\n /** Delete one of the caller's own roast profiles. */\n delete: (id: number) =>\n client.DELETE(\"/v1/roasts/{id}\", { params: { path: { id } } }),\n /**\n * Create a roast profile from an Artisan `.alog` file against one of the\n * caller's green-coffee lots, persisting the imported curve, events, and\n * an artisan_import_log entry atomically. Requires a session or an\n * owner-bound API key carrying the exact `roast:write` scope. Pass\n * `idempotencyKey` to make retries safe.\n */\n import: (\n body: RoastImportRequest,\n options?: { idempotencyKey?: string },\n ) =>\n client.POST(\"/v1/roasts/imports\", {\n body,\n params: options?.idempotencyKey\n ? { header: { \"idempotency-key\": options.idempotencyKey } }\n : undefined,\n }),\n /**\n * Replace the Artisan import data on one of the caller's existing roasts,\n * re-deriving its curve, events, and computed metrics while preserving the\n * roast's identity. Pass `ifMatch` (the roast's `last_updated`) to enable\n * optimistic concurrency (409 on mismatch).\n */\n replaceArtisanImport: (\n id: number,\n body: RoastArtisanImportReplaceRequest,\n options?: { ifMatch?: string },\n ) =>\n client.PUT(\"/v1/roasts/{id}/artisan-import\", {\n params: {\n path: { id },\n header: options?.ifMatch\n ? { \"if-match\": options.ifMatch }\n : undefined,\n },\n body,\n }),\n /**\n * Clear import-derived curve, events, metrics, and provenance data from\n * one of the caller's existing roasts without deleting the roast profile.\n */\n clearArtisanImport: (id: number) =>\n client.DELETE(\"/v1/roasts/{id}/artisan-import\", {\n params: { path: { id } },\n }),\n },\n sales: {\n /** List the caller's own sales (owner-scoped). */\n list: (query?: SalesListQuery) =>\n client.GET(\"/v1/sales\", { params: { query } }),\n /**\n * Record a sale against one of the caller's own green-coffee inventory\n * lots. Requires a session or an owner-bound API key carrying the exact\n * `sales:write` scope. Pass `idempotencyKey` to make retries safe: the\n * same key replays the original result, and a concurrent duplicate gets\n * 409 while the first is in flight.\n */\n create: (\n body: SalesCreateRequest,\n options?: { idempotencyKey?: string },\n ) =>\n client.POST(\"/v1/sales\", {\n body,\n params: options?.idempotencyKey\n ? { header: { \"idempotency-key\": options.idempotencyKey } }\n : undefined,\n }),\n /**\n * Update one of the caller's own sales. The sales table carries no\n * `last_updated` column, so no If-Match optimistic concurrency is\n * offered.\n */\n update: (id: number, body: SalesUpdateRequest) =>\n client.PATCH(\"/v1/sales/{id}\", {\n params: { path: { id } },\n body,\n }),\n /** Delete one of the caller's own sales. */\n delete: (id: number) =>\n client.DELETE(\"/v1/sales/{id}\", { params: { path: { id } } }),\n },\n tasting: {\n /** Fetch supplier notes plus the caller's own latest tasting notes. */\n get: (catalogId: string, query?: TastingGetQuery) =>\n client.GET(\"/v1/tasting/{catalogId}\", {\n params: { path: { catalogId }, query },\n }),\n /** Replace the caller's rating for one owned inventory lot. */\n rate: (inventoryId: number, body: TastingRateRequest) =>\n client.PUT(\"/v1/tasting/inventory/{inventoryId}\", {\n params: { path: { inventoryId } },\n body,\n }),\n },\n };\n}\n\nexport type ParchmentClient = ReturnType<typeof createParchmentClient>;\n"],"mappings":"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","names":["options"]}
|
|
1
|
+
{"version":3,"sources":["../src/client.ts"],"sourcesContent":["import createClient, { type ClientOptions } from \"openapi-fetch\";\nimport type { components, paths } from \"./schema\";\n\nexport interface ParchmentClientOptions {\n /** Base URL of the Parchment API, e.g. https://api.purveyors.io */\n baseUrl: string;\n /**\n * Optional bearer token (a Supabase JWT or, later, an API key). Sent as\n * `Authorization: Bearer <token>`. Auth is resolved server-side against the\n * unified principal model; the SDK only forwards the credential.\n */\n token?: string;\n /** Override the fetch implementation (useful for tests or custom runtimes). */\n fetch?: ClientOptions[\"fetch\"];\n}\n\n/** Query parameters for {@link ParchmentClient.catalog.list}. */\nexport type CatalogListQuery = NonNullable<\n paths[\"/v1/catalog\"][\"get\"][\"parameters\"][\"query\"]\n>;\n/** Query parameters for {@link ParchmentClient.catalog.facets}. */\nexport type CatalogFacetsQuery = NonNullable<\n paths[\"/v1/catalog/facets\"][\"get\"][\"parameters\"][\"query\"]\n>;\n/**\n * Optional headers for {@link ParchmentClient.catalog.list}, notably the\n * RFC 7240 `Prefer: handling=lenient|strict` override (PADR-0013 §7). Sending\n * `handling=lenient` opts a strict caller (API key or bearer-session JWT) back\n * into strip-with-notice degradation instead of a 401/403 hard-deny.\n */\nexport type CatalogListHeaders = NonNullable<\n paths[\"/v1/catalog\"][\"get\"][\"parameters\"][\"header\"]\n>;\n/** Optional headers for {@link ParchmentClient.catalog.facets}; see {@link CatalogListHeaders}. */\nexport type CatalogFacetsHeaders = NonNullable<\n paths[\"/v1/catalog/facets\"][\"get\"][\"parameters\"][\"header\"]\n>;\n/** Query parameters for {@link ParchmentClient.catalog.originPriceStats}. */\nexport type CatalogOriginPriceStatsQuery = NonNullable<\n paths[\"/v1/catalog/origin-price-stats\"][\"get\"][\"parameters\"][\"query\"]\n>;\n/** Query parameters for {@link ParchmentClient.catalog.stats}. */\nexport type CatalogStatsQuery = NonNullable<\n paths[\"/v1/catalog/stats\"][\"get\"][\"parameters\"][\"query\"]\n>;\n/** Query parameters for {@link ParchmentClient.catalog.rank}. */\nexport type CatalogRankQuery = NonNullable<\n paths[\"/v1/catalog/rank\"][\"get\"][\"parameters\"][\"query\"]\n>;\n/** Query parameters for {@link ParchmentClient.catalog.rankPremium}. */\nexport type CatalogRankPremiumQuery = NonNullable<\n paths[\"/v1/catalog/rank-premium\"][\"get\"][\"parameters\"][\"query\"]\n>;\n/** Query parameters for {@link ParchmentClient.catalog.suppliers}. */\nexport type CatalogSuppliersQuery = NonNullable<\n paths[\"/v1/catalog/suppliers\"][\"get\"][\"parameters\"][\"query\"]\n>;\n/** Query parameters for {@link ParchmentClient.catalog.supplierDetail}. */\nexport type CatalogSupplierDetailQuery = NonNullable<\n paths[\"/v1/catalog/suppliers/detail\"][\"get\"][\"parameters\"][\"query\"]\n>;\n/** Query parameters for {@link ParchmentClient.catalog.supplierRank}. */\nexport type CatalogSupplierRankQuery = NonNullable<\n paths[\"/v1/catalog/suppliers/rank\"][\"get\"][\"parameters\"][\"query\"]\n>;\n/** Optional headers for ranking endpoints; see {@link CatalogListHeaders}. */\nexport type CatalogRankHeaders = NonNullable<\n paths[\"/v1/catalog/rank\"][\"get\"][\"parameters\"][\"header\"]\n>;\n/** Optional headers for premium ranking endpoints; see {@link CatalogListHeaders}. */\nexport type CatalogRankPremiumHeaders = NonNullable<\n paths[\"/v1/catalog/rank-premium\"][\"get\"][\"parameters\"][\"header\"]\n>;\n/** Optional headers for supplier aggregate endpoints; see {@link CatalogListHeaders}. */\nexport type CatalogSupplierHeaders = NonNullable<\n paths[\"/v1/catalog/suppliers\"][\"get\"][\"parameters\"][\"header\"]\n>;\n/** Query parameters for {@link ParchmentClient.catalog.similar}. */\nexport type CatalogSimilarQuery = NonNullable<\n paths[\"/v1/catalog/{id}/similar\"][\"get\"][\"parameters\"][\"query\"]\n>;\n/** Query parameters for {@link ParchmentClient.priceIndex.list}. */\nexport type PriceIndexQuery = NonNullable<\n paths[\"/v1/price-index\"][\"get\"][\"parameters\"][\"query\"]\n>;\n/** Query parameters for {@link ParchmentClient.market.signals}. */\nexport type MarketSignalsQuery = NonNullable<\n paths[\"/v1/market/signals\"][\"get\"][\"parameters\"][\"query\"]\n>;\n/** Query parameters for {@link ParchmentClient.priceIndex.stats}. */\nexport type PriceIndexStatsQuery = NonNullable<\n paths[\"/v1/price-index/stats\"][\"get\"][\"parameters\"][\"query\"]\n>;\n/** Query parameters for {@link ParchmentClient.market.metadataIndex}. */\nexport type MetadataIndexQuery = NonNullable<\n paths[\"/v1/market/metadata-index\"][\"get\"][\"parameters\"][\"query\"]\n>;\n/** Query parameters for {@link ParchmentClient.procurement.briefs.matches}. */\nexport type BriefMatchesQuery = NonNullable<\n paths[\"/v1/procurement/briefs/{id}/matches\"][\"get\"][\"parameters\"][\"query\"]\n>;\n/** Request body for {@link ParchmentClient.procurement.briefs.create}. */\nexport type SourcingBriefCreateRequest =\n components[\"schemas\"][\"SourcingBriefCreateRequest\"];\n/** Query parameters for {@link ParchmentClient.inventory.list}. */\nexport type InventoryListQuery = NonNullable<\n paths[\"/v1/inventory\"][\"get\"][\"parameters\"][\"query\"]\n>;\n/** Request body for {@link ParchmentClient.inventory.create}. */\nexport type InventoryCreateRequest = NonNullable<\n paths[\"/v1/inventory\"][\"post\"][\"requestBody\"]\n>[\"content\"][\"application/json\"];\n/** Request body for {@link ParchmentClient.inventory.update}. */\nexport type InventoryUpdateRequest = NonNullable<\n paths[\"/v1/inventory/{id}\"][\"patch\"][\"requestBody\"]\n>[\"content\"][\"application/json\"];\n/** Query parameters for {@link ParchmentClient.roasts.list}. */\nexport type RoastListQuery = NonNullable<\n paths[\"/v1/roasts\"][\"get\"][\"parameters\"][\"query\"]\n>;\n/** Query parameters for {@link ParchmentClient.roasts.get}. */\nexport type RoastGetQuery = NonNullable<\n paths[\"/v1/roasts/{id}\"][\"get\"][\"parameters\"][\"query\"]\n>;\n/** Request body for {@link ParchmentClient.roasts.classify}. */\nexport type RoastClassificationRequest = NonNullable<\n paths[\"/v1/roasts/classify\"][\"post\"][\"requestBody\"]\n>[\"content\"][\"application/json\"];\n/** Request body for {@link ParchmentClient.roasts.create}. */\nexport type RoastCreateRequest = NonNullable<\n paths[\"/v1/roasts\"][\"post\"][\"requestBody\"]\n>[\"content\"][\"application/json\"];\n/** Request body for {@link ParchmentClient.roasts.update}. */\nexport type RoastUpdateRequest = NonNullable<\n paths[\"/v1/roasts/{id}\"][\"patch\"][\"requestBody\"]\n>[\"content\"][\"application/json\"];\n/** Request body for {@link ParchmentClient.roasts.import}. */\nexport type RoastImportRequest = NonNullable<\n paths[\"/v1/roasts/imports\"][\"post\"][\"requestBody\"]\n>[\"content\"][\"application/json\"];\n/** Request body for {@link ParchmentClient.roasts.replaceArtisanImport}. */\nexport type RoastArtisanImportReplaceRequest = NonNullable<\n paths[\"/v1/roasts/{id}/artisan-import\"][\"put\"][\"requestBody\"]\n>[\"content\"][\"application/json\"];\n/** Query parameters for {@link ParchmentClient.sales.list}. */\nexport type SalesListQuery = NonNullable<\n paths[\"/v1/sales\"][\"get\"][\"parameters\"][\"query\"]\n>;\n/** Request body for {@link ParchmentClient.sales.create}. */\nexport type SalesCreateRequest = NonNullable<\n paths[\"/v1/sales\"][\"post\"][\"requestBody\"]\n>[\"content\"][\"application/json\"];\n/** Request body for {@link ParchmentClient.sales.update}. */\nexport type SalesUpdateRequest = NonNullable<\n paths[\"/v1/sales/{id}\"][\"patch\"][\"requestBody\"]\n>[\"content\"][\"application/json\"];\n/** Query parameters for {@link ParchmentClient.tasting.get}. */\nexport type TastingGetQuery = NonNullable<\n paths[\"/v1/tasting/{catalogId}\"][\"get\"][\"parameters\"][\"query\"]\n>;\n/** Request body for {@link ParchmentClient.tasting.rate}. */\nexport type TastingRateRequest = NonNullable<\n paths[\"/v1/tasting/inventory/{inventoryId}\"][\"put\"][\"requestBody\"]\n>[\"content\"][\"application/json\"];\n/** Request body for {@link ParchmentClient.apiKeys.create}. */\nexport type ApiKeyCreateRequest = NonNullable<\n paths[\"/v1/api-keys\"][\"post\"][\"requestBody\"]\n>[\"content\"][\"application/json\"];\nexport type CliAuthRequestCreate = NonNullable<\n paths[\"/v1/cli-auth/requests\"][\"post\"][\"requestBody\"]\n>[\"content\"][\"application/json\"];\nexport type CliAuthInspectRequest = NonNullable<\n paths[\"/v1/cli-auth/inspect\"][\"post\"][\"requestBody\"]\n>[\"content\"][\"application/json\"];\nexport type CliAuthApproveRequest = NonNullable<\n paths[\"/v1/cli-auth/approve\"][\"post\"][\"requestBody\"]\n>[\"content\"][\"application/json\"];\nexport type CliAuthExchangeRequest = NonNullable<\n paths[\"/v1/cli-auth/token\"][\"post\"][\"requestBody\"]\n>[\"content\"][\"application/json\"];\n\n/**\n * Create a typed Parchment API client.\n *\n * The generated core (openapi-fetch over the generated `paths` types) is the\n * contract truth; the named helpers below are the hand-maintained ergonomic\n * layer and grow as endpoints land. `raw` always exposes the underlying typed\n * client for direct path access to anything not yet wrapped.\n */\nexport function createParchmentClient(options: ParchmentClientOptions) {\n const { baseUrl, token, fetch: fetchImpl } = options;\n\n const client = createClient<paths>({\n baseUrl,\n fetch: fetchImpl,\n headers: token ? { Authorization: `Bearer ${token}` } : undefined,\n });\n\n return {\n /** The underlying typed openapi-fetch client for direct path access. */\n raw: client,\n /** Liveness and service identity. */\n health: () => client.GET(\"/health\"),\n /** Resolved principal and entitlements for the caller. */\n me: () => client.GET(\"/v1/me\"),\n apiKeys: {\n /** List API keys owned by the authenticated session user. */\n list: () => client.GET(\"/v1/api-keys\"),\n /** Create an API key. The raw secret is returned only once. */\n create: (body: ApiKeyCreateRequest) =>\n client.POST(\"/v1/api-keys\", { body }),\n /** Revoke an API key owned by the authenticated session user. */\n revoke: (id: string) =>\n client.DELETE(\"/v1/api-keys/{id}\", {\n params: { path: { id } },\n }),\n /** Rotate an API key and return the replacement secret once. */\n rotate: (id: string) =>\n client.POST(\"/v1/api-keys/{id}/rotate\", {\n params: { path: { id } },\n }),\n },\n cliAuth: {\n /** Create a signed, short-lived login request bound to a PKCE challenge. */\n create: (body: CliAuthRequestCreate) =>\n client.POST(\"/v1/cli-auth/requests\", { body }),\n /** Inspect a signed request before displaying the web consent screen. */\n inspect: (body: CliAuthInspectRequest) =>\n client.POST(\"/v1/cli-auth/inspect\", { body }),\n /** Approve a request using the client's authenticated user session. */\n approve: (body: CliAuthApproveRequest) =>\n client.POST(\"/v1/cli-auth/approve\", { body }),\n /** Exchange an approved request and verifier for the one-time raw key. */\n exchange: (body: CliAuthExchangeRequest) =>\n client.POST(\"/v1/cli-auth/token\", { body }),\n },\n catalog: {\n /** Catalog capabilities and visibility for the caller. */\n access: () => client.GET(\"/v1/catalog/access\"),\n /**\n * List public catalog coffees (paginated). Pass `headers` to send the\n * `Prefer: handling=lenient|strict` override (see {@link CatalogListHeaders}).\n */\n list: (query?: CatalogListQuery, headers?: CatalogListHeaders) =>\n client.GET(\"/v1/catalog\", { params: { query, header: headers } }),\n /**\n * Catalog filter metadata and counted facets. Pass `headers` to send the\n * `Prefer: handling=lenient|strict` override (see {@link CatalogFacetsHeaders}).\n */\n facets: (query?: CatalogFacetsQuery, headers?: CatalogFacetsHeaders) =>\n client.GET(\"/v1/catalog/facets\", {\n params: { query, header: headers },\n }),\n /** Live catalog price context by origin. */\n originPriceStats: (query?: CatalogOriginPriceStatsQuery) =>\n client.GET(\"/v1/catalog/origin-price-stats\", { params: { query } }),\n /** Aggregate stats over the caller-visible catalog. */\n stats: (query?: CatalogStatsQuery) =>\n client.GET(\"/v1/catalog/stats\", { params: { query } }),\n /** Rank caller-visible catalog coffees by deterministic objectives. */\n rank: (query?: CatalogRankQuery, headers?: CatalogRankHeaders) =>\n client.GET(\"/v1/catalog/rank\", {\n params: { query, header: headers },\n }),\n /** Rank premium catalog candidates by Purveyor Score. */\n rankPremium: (\n query?: CatalogRankPremiumQuery,\n headers?: CatalogRankPremiumHeaders,\n ) =>\n client.GET(\"/v1/catalog/rank-premium\", {\n params: { query, header: headers },\n }),\n /** List supplier aggregates over caller-visible catalog coffees. */\n suppliers: (\n query?: CatalogSuppliersQuery,\n headers?: CatalogSupplierHeaders,\n ) =>\n client.GET(\"/v1/catalog/suppliers\", {\n params: { query, header: headers },\n }),\n /** Return aggregate detail for a supplier query. */\n supplierDetail: (\n query: CatalogSupplierDetailQuery,\n headers?: CatalogSupplierHeaders,\n ) =>\n client.GET(\"/v1/catalog/suppliers/detail\", {\n params: { query, header: headers },\n }),\n /** Rank suppliers by catalog score and availability. */\n supplierRank: (\n query?: CatalogSupplierRankQuery,\n headers?: CatalogSupplierHeaders,\n ) =>\n client.GET(\"/v1/catalog/suppliers/rank\", {\n params: { query, header: headers },\n }),\n /** Aggregate proof-coverage over the public catalog. */\n proofCoverage: () => client.GET(\"/v1/catalog/proof-coverage\"),\n /** Find catalog coffees similar to a target coffee. */\n similar: (id: string, query?: CatalogSimilarQuery) =>\n client.GET(\"/v1/catalog/{id}/similar\", {\n params: { path: { id }, query },\n }),\n },\n priceIndex: {\n /** Parchment Price Index (aggregate snapshots). */\n list: (query?: PriceIndexQuery) =>\n client.GET(\"/v1/price-index\", { params: { query } }),\n /** Price movement significance stats (precomputed). */\n stats: (query?: PriceIndexStatsQuery) =>\n client.GET(\"/v1/price-index/stats\", { params: { query } }),\n },\n market: {\n /** Actionable market value signals. */\n signals: (query?: MarketSignalsQuery) =>\n client.GET(\"/v1/market/signals\", { params: { query } }),\n /** Metadata-trend index (process/disclosure/Purveyor Score over time). */\n metadataIndex: (query?: MetadataIndexQuery) =>\n client.GET(\"/v1/market/metadata-index\", { params: { query } }),\n },\n procurement: {\n briefs: {\n /** List the caller's saved sourcing briefs. */\n list: () => client.GET(\"/v1/procurement/briefs\"),\n /** Create a saved sourcing brief. */\n create: (body: SourcingBriefCreateRequest) =>\n client.POST(\"/v1/procurement/briefs\", { body }),\n /** Fetch one of the caller's sourcing briefs by id. */\n get: (id: string) =>\n client.GET(\"/v1/procurement/briefs/{id}\", {\n params: { path: { id } },\n }),\n /** Run a saved brief against the catalog (paginated matches). */\n matches: (id: string, query?: BriefMatchesQuery) =>\n client.GET(\"/v1/procurement/briefs/{id}/matches\", {\n params: { path: { id }, query },\n }),\n },\n },\n inventory: {\n /** List the caller's own green-coffee inventory (owner-scoped). */\n list: (query?: InventoryListQuery) =>\n client.GET(\"/v1/inventory\", { params: { query } }),\n /**\n * Create an owner inventory lot. Requires a session or an owner-bound API\n * key carrying the exact `inventory:write` scope. Pass `idempotencyKey`\n * to make retries safe: the same key replays the original result, and a\n * concurrent duplicate gets 409 while the first is in flight.\n */\n create: (\n body: InventoryCreateRequest,\n options?: { idempotencyKey?: string },\n ) =>\n client.POST(\"/v1/inventory\", {\n body,\n params: options?.idempotencyKey\n ? { header: { \"idempotency-key\": options.idempotencyKey } }\n : undefined,\n }),\n /**\n * Update one of the caller's own inventory rows. Pass `ifMatch` (the\n * row's `last_updated`) to enable optimistic concurrency (409 on mismatch).\n */\n update: (\n id: number,\n body: InventoryUpdateRequest,\n options?: { ifMatch?: string },\n ) =>\n client.PATCH(\"/v1/inventory/{id}\", {\n params: {\n path: { id },\n header: options?.ifMatch\n ? { \"if-match\": options.ifMatch }\n : undefined,\n },\n body,\n }),\n /**\n * Delete one of the caller's own inventory rows. Returns 409 if dependent\n * roast profiles or sales exist (no force-cascade).\n */\n delete: (id: number) =>\n client.DELETE(\"/v1/inventory/{id}\", { params: { path: { id } } }),\n },\n roasts: {\n /** Match Artisan roast metadata to one of the supplied inventory rows. */\n classify: (body: RoastClassificationRequest) =>\n client.POST(\"/v1/roasts/classify\", { body }),\n /** List the caller's own roast profiles (owner-scoped). */\n list: (query?: RoastListQuery) =>\n client.GET(\"/v1/roasts\", { params: { query } }),\n /**\n * Fetch one of the caller's roast profiles by id, optionally with its\n * temperature curve (`includeTemps`) and event markers (`includeEvents`).\n */\n get: (id: string, query?: RoastGetQuery) =>\n client.GET(\"/v1/roasts/{id}\", { params: { path: { id }, query } }),\n /**\n * Create an owner roast profile, optionally with nested temperature/event\n * rows. Requires a session or an owner-bound API key carrying the exact\n * `roast:write` scope. Pass `idempotencyKey` to make retries safe.\n */\n create: (\n body: RoastCreateRequest,\n options?: { idempotencyKey?: string },\n ) =>\n client.POST(\"/v1/roasts\", {\n body,\n params: options?.idempotencyKey\n ? { header: { \"idempotency-key\": options.idempotencyKey } }\n : undefined,\n }),\n /**\n * Update one of the caller's own roast profiles. Pass `ifMatch` (the\n * row's `last_updated`) to enable optimistic concurrency (409 on mismatch).\n */\n update: (\n id: number,\n body: RoastUpdateRequest,\n options?: { ifMatch?: string },\n ) =>\n client.PATCH(\"/v1/roasts/{id}\", {\n params: {\n path: { id },\n header: options?.ifMatch\n ? { \"if-match\": options.ifMatch }\n : undefined,\n },\n body,\n }),\n /** Delete one of the caller's own roast profiles. */\n delete: (id: number) =>\n client.DELETE(\"/v1/roasts/{id}\", { params: { path: { id } } }),\n /**\n * Create a roast profile from an Artisan `.alog` file against one of the\n * caller's green-coffee lots, persisting the imported curve, events, and\n * an artisan_import_log entry atomically. Requires a session or an\n * owner-bound API key carrying the exact `roast:write` scope. Pass\n * `idempotencyKey` to make retries safe.\n */\n import: (\n body: RoastImportRequest,\n options?: { idempotencyKey?: string },\n ) =>\n client.POST(\"/v1/roasts/imports\", {\n body,\n params: options?.idempotencyKey\n ? { header: { \"idempotency-key\": options.idempotencyKey } }\n : undefined,\n }),\n /**\n * Replace the Artisan import data on one of the caller's existing roasts,\n * re-deriving its curve, events, and computed metrics while preserving the\n * roast's identity. Pass `ifMatch` (the roast's `last_updated`) to enable\n * optimistic concurrency (409 on mismatch).\n */\n replaceArtisanImport: (\n id: number,\n body: RoastArtisanImportReplaceRequest,\n options?: { ifMatch?: string },\n ) =>\n client.PUT(\"/v1/roasts/{id}/artisan-import\", {\n params: {\n path: { id },\n header: options?.ifMatch\n ? { \"if-match\": options.ifMatch }\n : undefined,\n },\n body,\n }),\n /**\n * Clear import-derived curve, events, metrics, and provenance data from\n * one of the caller's existing roasts without deleting the roast profile.\n */\n clearArtisanImport: (id: number) =>\n client.DELETE(\"/v1/roasts/{id}/artisan-import\", {\n params: { path: { id } },\n }),\n },\n sales: {\n /** List the caller's own sales (owner-scoped). */\n list: (query?: SalesListQuery) =>\n client.GET(\"/v1/sales\", { params: { query } }),\n /**\n * Record a sale against one of the caller's own green-coffee inventory\n * lots. Requires a session or an owner-bound API key carrying the exact\n * `sales:write` scope. Pass `idempotencyKey` to make retries safe: the\n * same key replays the original result, and a concurrent duplicate gets\n * 409 while the first is in flight.\n */\n create: (\n body: SalesCreateRequest,\n options?: { idempotencyKey?: string },\n ) =>\n client.POST(\"/v1/sales\", {\n body,\n params: options?.idempotencyKey\n ? { header: { \"idempotency-key\": options.idempotencyKey } }\n : undefined,\n }),\n /**\n * Update one of the caller's own sales. The sales table carries no\n * `last_updated` column, so no If-Match optimistic concurrency is\n * offered.\n */\n update: (id: number, body: SalesUpdateRequest) =>\n client.PATCH(\"/v1/sales/{id}\", {\n params: { path: { id } },\n body,\n }),\n /** Delete one of the caller's own sales. */\n delete: (id: number) =>\n client.DELETE(\"/v1/sales/{id}\", { params: { path: { id } } }),\n },\n tasting: {\n /** Fetch supplier notes plus the caller's own latest tasting notes. */\n get: (catalogId: string, query?: TastingGetQuery) =>\n client.GET(\"/v1/tasting/{catalogId}\", {\n params: { path: { catalogId }, query },\n }),\n /** Replace the caller's rating for one owned inventory lot. */\n rate: (inventoryId: number, body: TastingRateRequest) =>\n client.PUT(\"/v1/tasting/inventory/{inventoryId}\", {\n params: { path: { inventoryId } },\n body,\n }),\n },\n };\n}\n\nexport type ParchmentClient = ReturnType<typeof createParchmentClient>;\n"],"mappings":"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","names":["options"]}
|