@sayren/store-sdk 0.28.0 → 0.28.2

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.mjs CHANGED
@@ -13,7 +13,7 @@ const auditActorTypeSchema = z.enum([
13
13
  "APP",
14
14
  "TOKEN",
15
15
  "SYSTEM"
16
- ]).describe("행위자 유형. `USER`=콘솔 사용자, `AGENT`=AI 에이전트(MCP·에이전트용 API 토큰), `APP`=앱(OAuth 클라이언트·M2M), `TOKEN`=API 토큰, `SYSTEM`=자동화(주기 잡)");
16
+ ]).describe("행위자 유형. `USER`=상점 플랫폼 사용자, `AGENT`=AI 에이전트(MCP·에이전트용 API 토큰), `APP`=앱(OAuth 클라이언트·M2M), `TOKEN`=API 토큰, `SYSTEM`=자동화(주기 잡)");
17
17
  const auditActorSchema = z.object({
18
18
  type: auditActorTypeSchema,
19
19
  id: z.string().describe("행위자 ID. `USER`=userId, `TOKEN`·`AGENT`(API 토큰)=`pat:{tokenId}`, `APP`=`client:{clientId}`, `SYSTEM`=`system`. 사람이 앱에 위임한 호출은 `APP`이고 위임한 사람은 `metadata.onBehalfOf`에 있다"),
@@ -33,7 +33,7 @@ const auditLogSchema = z.object({
33
33
  source: auditLogSourceSchema,
34
34
  action: z.string().describe("동작. `REQUEST`는 오퍼레이션 ID(OpenAPI `operationId`, 예: `ProductsController_patch`), `DOMAIN`은 도메인 코드(예: `ORDER_ITEM_CANCELED_BY_SELLER`)"),
35
35
  actor: auditActorSchema,
36
- actorRole: z.string().nullable().describe("요청 시점의 스토어 역할. 역할이 없는 토큰·자동화는 null"),
36
+ actorRole: z.string().nullable().describe("요청 시점의 상점 역할. 역할이 없는 토큰·자동화는 null"),
37
37
  target: z.object({
38
38
  type: z.string().describe("대상 리소스 유형 (예: `products`, `order-items`, `claim`)"),
39
39
  id: z.string().nullable().describe("대상 리소스 ID. 목록 대상 요청처럼 하나로 정할 수 없으면 null")
@@ -77,7 +77,7 @@ const agentPolicyDecisionSchema = z.enum([
77
77
  "ALLOW",
78
78
  "APPROVAL_REQUIRED",
79
79
  "DENIED"
80
- ]).describe("에이전트 쓰기 판정. `ALLOW`=바로 실행, `APPROVAL_REQUIRED`=콘솔 승인 뒤 실행, `DENIED`=에이전트는 실행할 수 없음");
80
+ ]).describe("에이전트 쓰기 판정. `ALLOW`=바로 실행, `APPROVAL_REQUIRED`=상점 플랫폼 승인 뒤 실행, `DENIED`=에이전트는 실행할 수 없음");
81
81
  const previewValueSchema = z.union([
82
82
  z.string(),
83
83
  z.number(),
@@ -132,7 +132,7 @@ const approvalRequestSchema = z.object({
132
132
  decidedBy: z.object({
133
133
  id: z.string(),
134
134
  name: z.string().nullable()
135
- }).nullable().describe("승인·거절한 콘솔 사용자"),
135
+ }).nullable().describe("승인·거절한 상점 플랫폼 사용자"),
136
136
  decisionNote: z.string().nullable().describe("승인·거절 메모"),
137
137
  executedAt: z.string().nullable().describe("원 요청 실행을 마친 일시"),
138
138
  result: z.object({
@@ -143,7 +143,7 @@ const approvalRequestSchema = z.object({
143
143
  message: z.string()
144
144
  }).nullable().describe("실패 응답의 `error` 요약")
145
145
  }).nullable().describe("실행 결과. `SUCCEEDED`·`FAILED`·`UNKNOWN`에서 값이 있다. 감사 로그로 확정한 결과는 `data`가 null이다"),
146
- approvalUrl: z.string().nullable().describe("셀러 콘솔의 승인 화면 주소. 이 배포의 콘솔 주소를 알 수 없으면 null")
146
+ approvalUrl: z.string().nullable().describe("상점 플랫폼의 승인 화면 주소. 이 배포의 상점 플랫폼 주소를 알 수 없으면 null")
147
147
  });
148
148
  const approvalListQuerySchema = z.object({
149
149
  status: commaList(approvalStatusSchema).optional().describe("상태 필터. 여러 개는 쉼표로 구분한다 (예: `PENDING,EXECUTING`)"),
@@ -224,7 +224,7 @@ const APPROVAL_ALREADY_DECIDED_CODE = "APPROVAL_ALREADY_DECIDED";
224
224
  * 성공 값으로 돌려주지 않는다 — 돌려주면 호출부가 승인 요청을 상품·주문으로 읽는다.
225
225
  *
226
226
  * - `code = APPROVAL_REQUIRED`(202): 에이전트의 고위험 쓰기가 보류됐다. 아직 아무것도 바뀌지 않았다.
227
- * 셀러가 콘솔(`approval.approvalUrl`)에서 승인하면 서버가 원 요청을 실행한다. 같은 요청을 다시 보내지 말고
227
+ * 셀러가 상점 플랫폼(`approval.approvalUrl`)에서 승인하면 서버가 원 요청을 실행한다. 같은 요청을 다시 보내지 말고
228
228
  * `approvalRequests.get(approvalId)`로 결과를 확인한다.
229
229
  * - `code = APPROVAL_ALREADY_DECIDED`(200): 같은 멱등키로 보낸 요청의 승인이 이미 끝났다. `status`가
230
230
  * `SUCCEEDED`·`FAILED`·`UNKNOWN`이면 실행 결과(`approval.result`)를 보고, `REJECTED`·`EXPIRED`면 새 멱등키로 다시 요청한다.
@@ -552,15 +552,15 @@ const analyticsCheckoutSchema = z.object({
552
552
  //#endregion
553
553
  //#region src/schemas/api-log.ts
554
554
  /**
555
- * API 로그 — `/v1/api-logs`. 스토어가 해석된 관리 API(`/v1/**`) 요청을 7일간 보관한다.
556
- * 인증에 실패해 스토어를 알 수 없는 요청(401 등)은 기록되지 않는다.
555
+ * API 로그 — `/v1/api-logs`. 상점이 해석된 관리 API(`/v1/**`) 요청을 7일간 보관한다.
556
+ * 인증에 실패해 상점을 알 수 없는 요청(401 등)은 기록되지 않는다.
557
557
  * Authorization·쿠키 헤더, 요청 본문, 개인정보는 저장하지 않는다.
558
558
  */
559
559
  const apiLogPrincipalTypeSchema = z.enum([
560
560
  "USER",
561
561
  "PAT",
562
562
  "CLIENT"
563
- ]).describe("호출 주체 유형. `USER`=콘솔 사용자, `PAT`=API 토큰, `CLIENT`=앱(OAuth 클라이언트)");
563
+ ]).describe("호출 주체 유형. `USER`=상점 플랫폼 사용자, `PAT`=API 토큰, `CLIENT`=앱(OAuth 클라이언트)");
564
564
  const apiLogPrincipalSchema = z.object({
565
565
  type: apiLogPrincipalTypeSchema,
566
566
  id: z.string().describe("호출 주체 ID. `USER`=userId, `PAT`=API 토큰 ID, `CLIENT`=clientId"),
@@ -607,11 +607,11 @@ const apiLogPageSchema = z.object({
607
607
  });
608
608
  /**
609
609
  * API 로그 요약 — `GET /api-logs/summary`. 연동 트래픽(호출 주체 `PAT`·`CLIENT`)만 집계하며
610
- * 콘솔 사용자(`USER`) 요청은 제외한다
610
+ * 상점 플랫폼 사용자(`USER`) 요청은 제외한다
611
611
  */
612
612
  const apiLogSummarySchema = z.object({
613
613
  windowHours: z.number().int().describe("집계 구간(시간). 최근 24시간"),
614
- total: z.number().int().min(0).describe("구간 내 연동 요청 수 (호출 주체 `PAT`·`CLIENT`, 콘솔 사용자 제외)"),
614
+ total: z.number().int().min(0).describe("구간 내 연동 요청 수 (호출 주체 `PAT`·`CLIENT`, 상점 플랫폼 사용자 제외)"),
615
615
  errors: z.number().int().min(0).describe("구간 내 연동 요청 중 4xx·5xx 응답 수"),
616
616
  serverErrors: z.number().int().min(0).describe("구간 내 연동 요청 중 5xx 응답 수")
617
617
  });
@@ -810,10 +810,10 @@ const claimReasonSchema = z.enum([
810
810
  "DELAY"
811
811
  ]);
812
812
  /**
813
- * 반품지 (이슈 #30) — 반품·교환 수거가 안내하는 주소다. 스토어 주소록의 기본 반품지이거나,
813
+ * 반품지 (이슈 #30) — 반품·교환 수거가 안내하는 주소다. 상점 주소록의 기본 반품지이거나,
814
814
  * 상품이 반품지를 따로 지정했으면 그 주소다.
815
815
  *
816
- * 취소 클레임은 보낼 물건이 없어 null이고, 반품지를 등록하지 않은 스토어도 null이다.
816
+ * 취소 클레임은 보낼 물건이 없어 null이고, 반품지를 등록하지 않은 상점도 null이다.
817
817
  * 구매자가 직접 보내는 수거(`BUYER_SEND`)에 이 주소가 필요하다.
818
818
  */
819
819
  const claimReturnAddressSchema = z.object({
@@ -854,7 +854,7 @@ const claimSchema = z.object({
854
854
  holdExpiresAt: z.string().nullable(),
855
855
  /** 보류를 이미 썼는지 — 보류는 클레임당 1회라 해제·만료 뒤에도 true */
856
856
  holdUsed: z.boolean(),
857
- returnAddress: claimReturnAddressSchema.nullable().describe("수거 안내에 쓸 반품지(이슈 #30). 상품이 지정한 반품지, 없으면 스토어 기본 반품지다. 취소 클레임과 반품지를 등록하지 않은 스토어는 null")
857
+ returnAddress: claimReturnAddressSchema.nullable().describe("수거 안내에 쓸 반품지(이슈 #30). 상품이 지정한 반품지, 없으면 상점 기본 반품지다. 취소 클레임과 반품지를 등록하지 않은 상점은 null")
858
858
  });
859
859
  /** `GET /v1/claims` 쿼리 — OpenAPI 문서용 형태(값은 쿼리 문자열) */
860
860
  const claimListQuerySchema = z.object({
@@ -907,9 +907,9 @@ const approveClaimResultSchema = z.object({
907
907
  /**
908
908
  * 환불 정책 (이슈 #25) — 취소·반품·교환에서 **배송비를 누가 부담하는지**를 정한다.
909
909
  *
910
- * 두 층이다. 스토어 설정(`PATCH /v1/store`의 `refundPolicy`)이 기본값이고, 상품별 정책
910
+ * 두 층이다. 상점 설정(`PATCH /v1/store`의 `refundPolicy`)이 기본값이고, 상품별 정책
911
911
  * (`POST/PUT /v1/products`의 `refundPolicy`)이 그 상품에만 덮어쓴다. 상품이 정하지 않은 항목은
912
- * 스토어 기본을 따르고, 스토어도 정하지 않았으면 `REFUND_POLICY_DEFAULTS`다.
912
+ * 상점 기본을 따르고, 상점도 정하지 않았으면 `REFUND_POLICY_DEFAULTS`다.
913
913
  *
914
914
  * 한 주문에 정책이 섞이면 **상품별로 계산한다**. 배송비 묶음도 상품 단위다(주문서·장바구니의
915
915
  * 배송비 합산과 같은 규칙: 같은 상품의 주문상품이 한 묶음이고 묶음마다 배송비가 붙는다).
@@ -922,7 +922,7 @@ const descriptions$3 = {
922
922
  conditionalFreeShortfallCharge: "조건부 무료배송(`CONDITIONAL_FREE`) 상품에서 일부 취소로 남은 금액이 무료 기준액에 미달하면 그 배송비를 환불액에서 뺀다. false면 추가 청구 없이 셀러가 부담한다. 기본 false",
923
923
  couponShortfallCharge: "쿠폰 조건 미달 차감. 일부 취소·반품으로 남은 주문상품이 쿠폰 조건(최소 주문 금액 등)을 잃으면 남은 주문상품이 받던 쿠폰 할인을 환불액에서 뺀다. 판매자 귀책(셀러 직권취소, 불량·오배송 반품)은 빼지 않는다. false면 차감 없이 실결제 금액만 나눠 환불한다. 기본 true"
924
924
  };
925
- /** 유효 환불 정책 — 스토어 기본 + 상품별 덮어쓰기를 합친 결과 */
925
+ /** 유효 환불 정책 — 상점 기본 + 상품별 덮어쓰기를 합친 결과 */
926
926
  const refundPolicySchema = z.object({
927
927
  preShipmentDeliveryFeeRefund: z.boolean().describe(descriptions$3.preShipmentDeliveryFeeRefund),
928
928
  returnDeliveryFee: z.number().int().min(0).describe(descriptions$3.returnDeliveryFee),
@@ -932,7 +932,7 @@ const refundPolicySchema = z.object({
932
932
  couponShortfallCharge: z.boolean().optional().default(true).describe(`${descriptions$3.couponShortfallCharge}. 이 필드가 없는 이전 서버 응답은 true로 읽는다`)
933
933
  });
934
934
  /**
935
- * 스토어가 정하지 않았을 때 서버가 쓰는 값.
935
+ * 상점이 정하지 않았을 때 서버가 쓰는 값.
936
936
  *
937
937
  * `as const`가 아니라 `RefundPolicy`로 타입을 좁힌다 — 리터럴 타입이면 `Partial<typeof …>`로 일부만 바꿀 때
938
938
  * `true` 자리에 `false`를 넣을 수 없다.
@@ -946,7 +946,7 @@ const REFUND_POLICY_DEFAULTS = {
946
946
  couponShortfallCharge: true
947
947
  };
948
948
  /**
949
- * 부분 정책 — 스토어 설정 요청과 상품별 덮어쓰기가 쓴다. 준 항목만 바뀐다.
949
+ * 부분 정책 — 상점 설정 요청과 상품별 덮어쓰기가 쓴다. 준 항목만 바뀐다.
950
950
  *
951
951
  * `strictObject`라 모르는 키는 400이다. 오타(`returnFee` 등)를 조용히 무시하면 셀러는 저장됐다고
952
952
  * 믿는데 정책은 기본값으로 남는다.
@@ -961,11 +961,11 @@ const refundPolicyPatchSchema = z.strictObject({
961
961
  });
962
962
  /**
963
963
  * 상품별 덮어쓰기 — 쿠폰 조건 미달 차감(`couponShortfallCharge`)은 주문 단위 규칙이라 상품이 정하지 않는다.
964
- * 스토어 정책만 읽는다(이슈 #47).
964
+ * 상점 정책만 읽는다(이슈 #47).
965
965
  */
966
966
  const productRefundPolicyPatchSchema = refundPolicyPatchSchema.omit({ couponShortfallCharge: true });
967
967
  /**
968
- * 유효 정책 해석 — 상품별 덮어쓰기 → 스토어 기본 → `REFUND_POLICY_DEFAULTS` 순이다.
968
+ * 유효 정책 해석 — 상품별 덮어쓰기 → 상점 기본 → `REFUND_POLICY_DEFAULTS` 순이다.
969
969
  *
970
970
  * 반품·교환 배송비의 원천은 정책 하나다(이슈 #57 결정 3). 상품의 레거시 반품비·교환비 필드와의 연결은 없앴고,
971
971
  * 레거시 값은 마이그레이션이 상품별 정책으로 옮겼다.
@@ -980,9 +980,9 @@ function resolveRefundPolicy(storePolicy, product) {
980
980
  /**
981
981
  * 상품의 **덮어쓰기 자체** — 덮어쓰기가 없으면 null.
982
982
  *
983
- * `resolveRefundPolicy`가 합친 결과로는 "상품이 정한 값"과 "스토어 기본을 물려받은 값"을 가를 수 없다.
984
- * 관리 API 응답의 `refundPolicy`와 콘솔 폼의 덮어쓰기 스위치가 이 함수를 원천으로 쓴다 — 가르지 못하면
985
- * 스토어 기본을 쓰는 상품을 저장할 때 그 순간의 기본값이 상품에 박힌다.
983
+ * `resolveRefundPolicy`가 합친 결과로는 "상품이 정한 값"과 "상점 기본을 물려받은 값"을 가를 수 없다.
984
+ * 관리 API 응답의 `refundPolicy`와 상점 플랫폼 폼의 덮어쓰기 스위치가 이 함수를 원천으로 쓴다 — 가르지 못하면
985
+ * 상점 기본을 쓰는 상품을 저장할 때 그 순간의 기본값이 상품에 박힌다.
986
986
  */
987
987
  function productRefundPolicyOverride(product) {
988
988
  if (product?.refundPolicy == null) return null;
@@ -1032,7 +1032,7 @@ function proratedRefundBase(totalPrice, quantity, settledQuantity, cancelQuantit
1032
1032
  * 4. 배송비 쿠폰(`DELIVERY`) — 주문에 한 장. 기본 배송비(지역 추가 배송비 제외)를 기준으로 할인하고
1033
1033
  * 배송 묶음에 기본 배송비 비율로 나눈다.
1034
1034
  *
1035
- * 무료배송 기준(상품별 조건부 무료·스토어 전체 기준)은 **쿠폰 차감 전 금액**으로 판정한다. 그래서 배송비
1035
+ * 무료배송 기준(상품별 조건부 무료·상점 전체 기준)은 **쿠폰 차감 전 금액**으로 판정한다. 그래서 배송비
1036
1036
  * 견적(`quoteDelivery`)은 쿠폰과 무관하게 먼저 계산되고, 이 함수는 그 결과만 입력으로 받는다.
1037
1037
  *
1038
1038
  * 최소 주문 금액은 대상 상품의 **즉시할인 반영 합계**(쿠폰 차감 전, 배송비 제외)로 판정한다.
@@ -1045,7 +1045,7 @@ const descriptions$2 = {
1045
1045
  benefitValue: "할인 값. `RATE`면 1~100(%), `AMOUNT`면 원 단위 금액",
1046
1046
  maxDiscountAmount: "정률 할인의 최대 할인액(원). null이면 상한이 없다. 정액 할인에는 쓰지 않는다(null)",
1047
1047
  minOrderAmount: "최소 주문 금액(원). 대상 상품의 즉시할인 반영 합계(배송비 제외)가 이 값 이상이어야 쓸 수 있다. 0이면 조건이 없다",
1048
- firstOrderOnly: "이 스토어에서 결제 완료 주문이 없는 회원만 쓸 수 있다",
1048
+ firstOrderOnly: "이 상점에서 결제 완료 주문이 없는 회원만 쓸 수 있다",
1049
1049
  memberOnly: "회원만 쓸 수 있다. false면 비회원도 쓸 수 있다 — 코드 입력형이면서 1인 한도가 없는 쿠폰만 false로 둘 수 있다",
1050
1050
  stackWithInstantDiscount: "상품 즉시할인과 함께 쓸 수 있다. false면 즉시할인이 걸린 주문상품은 쿠폰 대상에서 빠진다",
1051
1051
  includeProductIds: "대상 상품 id. 포함 목록(상품·카테고리)이 모두 비면 전 상품이 대상이다",
@@ -1552,7 +1552,7 @@ const limitField = (description) => z.number().int().min(1).max(1e7).nullable().
1552
1552
  const descriptions$1 = {
1553
1553
  name: "구매자에게 보이는 쿠폰 이름. 1~60자",
1554
1554
  description: "구매자에게 보이는 설명. 300자까지",
1555
- code: "쿠폰 코드 — 발급 방식이 `CODE`일 때 필수. 영문·숫자·`-`·`_` 6~30자, 대소문자 구분 없음(대문자로 저장). 스토어 안에서 유일하다",
1555
+ code: "쿠폰 코드 — 발급 방식이 `CODE`일 때 필수. 영문·숫자·`-`·`_` 6~30자, 대소문자 구분 없음(대문자로 저장). 상점 안에서 유일하다",
1556
1556
  startsAt: "사용 시작 시각(ISO 8601, 시간대 포함). 생략하면 바로 쓸 수 있다",
1557
1557
  endsAt: "사용 종료 시각(ISO 8601, 시간대 포함). 이 시각부터 못 쓴다. 생략하면 제한이 없다. 이미 지급한 쿠폰의 유효 기간은 지급 때 정해지므로 뒤에 종료일을 늦춰도 늘어나지 않는다",
1558
1558
  validDaysAfterIssue: "발급 후 유효 일수 — 셀러 지급(`MANUAL`) 쿠폰만. 쿠폰 종료일과 둘 중 먼저 끝나는 쪽이 적용된다",
@@ -1693,7 +1693,7 @@ const issueCouponResultSchema = z.object({
1693
1693
  })),
1694
1694
  failed: z.array(z.object({
1695
1695
  customerId: z.string(),
1696
- code: z.string().describe("실패 사유. `CUSTOMER_NOT_FOUND`(이 스토어 구매자가 아님)·`COUPON_LIMIT_REACHED`(1인 발급 한도)·`COUPON_EXHAUSTED`(총 발급 한도)"),
1696
+ code: z.string().describe("실패 사유. `CUSTOMER_NOT_FOUND`(이 상점 구매자가 아님)·`COUPON_LIMIT_REACHED`(1인 발급 한도)·`COUPON_EXHAUSTED`(총 발급 한도)"),
1697
1697
  message: z.string()
1698
1698
  }))
1699
1699
  });
@@ -1809,7 +1809,7 @@ const customerConsentSchema = z.object({
1809
1809
  kind: consentKindSchema,
1810
1810
  /** 동의한 약관 버전. 마케팅은 버전이 없어 null */
1811
1811
  version: z.string().nullable(),
1812
- /** 동의 시점의 약관 문서 주소. 스토어가 주소를 정하지 않았거나 마케팅이면 null */
1812
+ /** 동의 시점의 약관 문서 주소. 상점이 주소를 정하지 않았거나 마케팅이면 null */
1813
1813
  documentUrl: z.string().nullable(),
1814
1814
  action: consentActionSchema,
1815
1815
  source: consentSourceSchema,
@@ -1821,9 +1821,9 @@ const customerConsentStateSchema = z.object({
1821
1821
  agreed: z.boolean(),
1822
1822
  /** 동의한 약관 버전. 마케팅이거나 이력이 없으면 null */
1823
1823
  agreedVersion: z.string().nullable(),
1824
- /** 스토어의 현재 약관 버전. 마케팅은 null */
1824
+ /** 상점의 현재 약관 버전. 마케팅은 null */
1825
1825
  currentVersion: z.string().nullable(),
1826
- /** 스토어가 정한 현재 약관 문서 주소. 정하지 않았거나 마케팅이면 null */
1826
+ /** 상점이 정한 현재 약관 문서 주소. 정하지 않았거나 마케팅이면 null */
1827
1827
  currentDocumentUrl: z.string().nullable(),
1828
1828
  updatedAt: z.string().nullable(),
1829
1829
  /** 약관이 개정돼 다시 받아야 하는가. 마케팅은 항상 false */
@@ -2316,8 +2316,8 @@ const deliveryTypeSchema = z.enum([
2316
2316
  ]);
2317
2317
  const KNOWN_FULFILLMENT_TYPES = fulfillmentTypeSchema.options;
2318
2318
  const ADDRESS_ID_DESCRIPTIONS = {
2319
- shipping: "출고지 주소 id(`GET /v1/seller-addresses?type=SHIPPING`). 등록에서 생략하면 그 시점 스토어 기본 출고지를 저장한다. `null`이면 비워 둔다(스토어 기본 출고지를 따른다). 이 스토어의 `SHIPPING` 주소가 아니면 거부한다",
2320
- return: "반품지 주소 id(`GET /v1/seller-addresses?type=RETURN`). 등록에서 생략하면 그 시점 스토어 기본 반품지를 저장한다. `null`이면 비워 둔다(스토어 기본 반품지를 따른다). 이 스토어의 `RETURN` 주소가 아니면 거부한다"
2319
+ shipping: "출고지 주소 id(`GET /v1/seller-addresses?type=SHIPPING`). 등록에서 생략하면 그 시점 상점 기본 출고지를 저장한다. `null`이면 비워 둔다(상점 기본 출고지를 따른다). 이 상점의 `SHIPPING` 주소가 아니면 거부한다",
2320
+ return: "반품지 주소 id(`GET /v1/seller-addresses?type=RETURN`). 등록에서 생략하면 그 시점 상점 기본 반품지를 저장한다. `null`이면 비워 둔다(상점 기본 반품지를 따른다). 이 상점의 `RETURN` 주소가 아니면 거부한다"
2321
2321
  };
2322
2322
  /**
2323
2323
  * 배송비 필드 사이의 일관성 — FREE의 배송비, 조건부 무료가 아닌 상품의 무료 기준을 조용히 0·null로 바꿔 저장하지 않고 400으로 돌려준다
@@ -2345,13 +2345,13 @@ function refineShippingConsistency(value, ctx) {
2345
2345
  const deliveryTypeDescription = "배송비 유형. `FREE` 무료, `PAID` 유료, `CONDITIONAL_FREE` 조건부 무료";
2346
2346
  const shippingCreateSchema = z.strictObject({
2347
2347
  deliveryType: deliveryTypeSchema.default("PAID").describe(deliveryTypeDescription),
2348
- deliveryFee: z.number().int().min(0).optional().describe("배송비. 원 단위. 생략하면 스토어 기본 배송비(`GET /v1/store`의 `shippingPolicy.baseDeliveryFee`)를 저장한다. FREE면 0이거나 생략한다"),
2348
+ deliveryFee: z.number().int().min(0).optional().describe("배송비. 원 단위. 생략하면 상점 기본 배송비(`GET /v1/store`의 `shippingPolicy.baseDeliveryFee`)를 저장한다. FREE면 0이거나 생략한다"),
2349
2349
  conditionalFreeAmount: z.number().int().min(0).nullable().optional().describe("무료 배송이 되는 묶음 소계. 원 단위. CONDITIONAL_FREE에서만 받고 필수다"),
2350
2350
  shippingAddressId: z.string().nullable().optional().describe(ADDRESS_ID_DESCRIPTIONS.shipping),
2351
2351
  returnAddressId: z.string().nullable().optional().describe(ADDRESS_ID_DESCRIPTIONS.return)
2352
2352
  }).superRefine(refineShippingConsistency);
2353
2353
  /**
2354
- * 상품 이행 — 등록(POST). 배송 상품의 `shipping`을 생략하면 기본값(유료 배송·스토어 기본 배송비·기본 출고지·반품지)이다.
2354
+ * 상품 이행 — 등록(POST). 배송 상품의 `shipping`을 생략하면 기본값(유료 배송·상점 기본 배송비·기본 출고지·반품지)이다.
2355
2355
  */
2356
2356
  const productFulfillmentCreateSchema = z.discriminatedUnion("type", [z.strictObject({
2357
2357
  type: z.literal("SHIPPING"),
@@ -2382,8 +2382,8 @@ const productFulfillmentSchema = z.discriminatedUnion("type", [z.object({
2382
2382
  deliveryType: deliveryTypeSchema,
2383
2383
  deliveryFee: z.number().int().describe("배송비. 원 단위. FREE면 0"),
2384
2384
  conditionalFreeAmount: z.number().int().nullable().describe("조건부 무료 기준 묶음 소계. CONDITIONAL_FREE가 아니면 null"),
2385
- shippingAddressId: z.string().nullable().describe("출고지 주소 id. null이면 스토어 기본 출고지를 따른다"),
2386
- returnAddressId: z.string().nullable().describe("반품지 주소 id. null이면 스토어 기본 반품지를 따른다")
2385
+ shippingAddressId: z.string().nullable().describe("출고지 주소 id. null이면 상점 기본 출고지를 따른다"),
2386
+ returnAddressId: z.string().nullable().describe("반품지 주소 id. null이면 상점 기본 반품지를 따른다")
2387
2387
  })
2388
2388
  }), z.object({ type: z.literal("MANUAL") })]);
2389
2389
  /**
@@ -2407,16 +2407,16 @@ const orderItemFulfillmentSnapshotSchema = z.discriminatedUnion("type", [z.objec
2407
2407
  type: z.literal("SHIPPING"),
2408
2408
  shipping: z.object({
2409
2409
  bundleKey: z.string().nullable().describe("배송 묶음 키. 같은 키의 주문상품이 배송비를 한 번 낸 한 묶음이다. #29 이전 주문은 null"),
2410
- returnAddressId: z.string().nullable().describe("주문 시점 반품지 주소 id. null이거나 지워진 주소면 스토어 기본 반품지로 안내한다")
2410
+ returnAddressId: z.string().nullable().describe("주문 시점 반품지 주소 id. null이거나 지워진 주소면 상점 기본 반품지로 안내한다")
2411
2411
  })
2412
2412
  }), z.object({ type: z.literal("MANUAL") })]);
2413
2413
  const orderItemFulfillmentSnapshotResponseSchema = openFulfillmentUnion(orderItemFulfillmentSnapshotSchema).describe("주문 시점 이행 스냅샷. 상품을 나중에 고쳐도 바뀌지 않는다. 제공 기록은 `fulfillment`에 있다. 값이 추가될 수 있어 SDK는 모르는 유형을 `OTHER`로 읽는다");
2414
2414
  //#endregion
2415
2415
  //#region src/schemas/payment.ts
2416
2416
  /**
2417
- * 스토어 결제(PG) 설정과 매출 리포트 계약.
2417
+ * 상점 결제(PG) 설정과 매출 리포트 계약.
2418
2418
  *
2419
- * PG는 셀러가 직접 계약한다. 자격 증명은 스토어별로 저장되고, 비밀 값(시크릿 키·API Secret·
2419
+ * PG는 셀러가 직접 계약한다. 자격 증명은 상점별로 저장되고, 비밀 값(시크릿 키·API Secret·
2420
2420
  * 웹훅 시크릿)은 저장 후 다시 조회할 수 없다. 응답에는 앞 4자리 마스킹만 나온다. 공개 값
2421
2421
  * (클라이언트 키·Store ID·채널 키)은 원래 브라우저 결제창에 노출되는 값이라 그대로 돌려준다.
2422
2422
  */
@@ -2451,7 +2451,7 @@ const secretInput = () => z.string().trim().min(8).max(512);
2451
2451
  /**
2452
2452
  * 토스페이먼츠 결제위젯 키 접두사. 결제창은 API 개별 연동(`*_ck_`·`*_sk_`)만 쓴다. 위젯 키는 결제창 SDK가
2453
2453
  * `NOT_SUPPORTED_WIDGET_KEY`로, 서버 API가 404 `NOT_FOUND_MERCHANT`로 거부하므로 저장 전에 막는다.
2454
- * 요청 스키마·api 어댑터·콘솔 폼이 같은 상수를 쓴다(원천). `g` 플래그가 없어 `.test()`가 상태를 갖지 않는다.
2454
+ * 요청 스키마·api 어댑터·상점 플랫폼 폼이 같은 상수를 쓴다(원천). `g` 플래그가 없어 `.test()`가 상태를 갖지 않는다.
2455
2455
  */
2456
2456
  const TOSS_WIDGET_CLIENT_KEY_PATTERN = /^(test|live)_gck_/;
2457
2457
  /** 토스페이먼츠 결제위젯 시크릿 키 접두사. {@link TOSS_WIDGET_CLIENT_KEY_PATTERN} 참고 */
@@ -2572,7 +2572,7 @@ const paymentProviderSchema = z.object({
2572
2572
  liveGate: liveGateSchema.describe("라이브 개방 조건. 조건을 모두 충족해야 샌드박스를 끌 수 있다"),
2573
2573
  easyPayProviders: z.array(easyPayProviderResponseSchema).describe("이 PG로 받는 간편결제사. 연결되지 않았으면 빈 목록. 현재 값은 `NAVERPAY`·`KAKAOPAY`·`TOSSPAY`·`PAYCO`이고 값이 추가될 수 있어 문자열로 받는다"),
2574
2574
  retiredCredentialCount: z.number().int().describe("보관된(가맹점 교체·연결 해제로 새 결제에 더 쓰이지 않는) 자격 증명 수. 그 가맹점으로 받은 결제의 환불·대사에 계속 쓰인다"),
2575
- routingExclusion: z.string().nullable().optional().default(null).describe("지금 새 결제의 후보가 아닌 사유. 후보면 null. 판정 원천은 서버 라우팅이다(콘솔이 다시 계산하지 않는다). 후보가 아닌 PG에는 항상 사유 코드를 붙인다(연결 안 된 PG 포함) — 모든 PG는 `candidates`에 있거나 이 값이 null이 아니다. 현재 값: `NOT_CONNECTED`(연결 안 됨) · `DISABLED`(사용 중지) · `CREDENTIAL_MISSING`(활성 환경 자격 증명 없음) · `SANDBOX_IN_LIVE_STORE`(다른 PG가 라이브라 이 샌드박스 PG는 실구매자 결제에 쓰지 않음) · `PLATFORM_BLOCKED`(플랫폼이 실결제를 막음) · `MODE_MISMATCH`(라이브를 연 서버 모드와 현재 모드가 다름). 값이 추가될 수 있어 문자열로 받는다 — 모르는 값은 후보 아님으로 다룬다. 서버는 항상 싣는다. 이 필드가 없는 이전 서버 응답은 기본값(null)으로 읽는다")
2575
+ routingExclusion: z.string().nullable().optional().default(null).describe("지금 새 결제의 후보가 아닌 사유. 후보면 null. 판정 원천은 서버 라우팅이다(상점 플랫폼이 다시 계산하지 않는다). 후보가 아닌 PG에는 항상 사유 코드를 붙인다(연결 안 된 PG 포함) — 모든 PG는 `candidates`에 있거나 이 값이 null이 아니다. 현재 값: `NOT_CONNECTED`(연결 안 됨) · `DISABLED`(사용 중지) · `CREDENTIAL_MISSING`(활성 환경 자격 증명 없음) · `SANDBOX_IN_LIVE_STORE`(다른 PG가 라이브라 이 샌드박스 PG는 실구매자 결제에 쓰지 않음) · `PLATFORM_BLOCKED`(플랫폼이 실결제를 막음) · `MODE_MISMATCH`(라이브를 연 서버 모드와 현재 모드가 다름). 값이 추가될 수 있어 문자열로 받는다 — 모르는 값은 후보 아님으로 다룬다. 서버는 항상 싣는다. 이 필드가 없는 이전 서버 응답은 기본값(null)으로 읽는다")
2576
2576
  });
2577
2577
  /**
2578
2578
  * `PaymentProvider.routingExclusion`의 현재 값 — 응답 스키마는 서버가 사유를 추가해도 파싱이 깨지지 않게 문자열로 받는다.
@@ -2686,7 +2686,7 @@ const cashReceiptSchema = z.object({
2686
2686
  canceledAt: z.string().nullable().describe("최근 취소 시각 (ISO 8601)"),
2687
2687
  failCode: z.string().nullable().describe("마지막 실패 코드. 성공하면 비운다"),
2688
2688
  failMessage: z.string().nullable().describe("마지막 실패 사유"),
2689
- reissuable: z.boolean().describe("콘솔 재발급으로 다시 시도할 수 있는가 (`FAILED`·`PENDING`)"),
2689
+ reissuable: z.boolean().describe("상점 플랫폼 재발급으로 다시 시도할 수 있는가 (`FAILED`·`PENDING`)"),
2690
2690
  requestedAt: z.string().describe("신청 시각 (ISO 8601)"),
2691
2691
  updatedAt: z.string().describe("마지막 변경 시각 (ISO 8601)")
2692
2692
  });
@@ -2811,7 +2811,7 @@ function uploadExtensionOf(filename) {
2811
2811
  }
2812
2812
  /**
2813
2813
  * 용도 제한 위반 여부. 통과하면 `null`.
2814
- * 서버가 던지는 오류와 콘솔이 먼저 띄우는 안내가 갈리지 않도록 한 함수로 판정한다.
2814
+ * 서버가 던지는 오류와 상점 플랫폼이 먼저 띄우는 안내가 갈리지 않도록 한 함수로 판정한다.
2815
2815
  */
2816
2816
  function uploadRejection(purpose, filename, size) {
2817
2817
  const limit = UPLOAD_PURPOSE_LIMITS[purpose];
@@ -2867,7 +2867,7 @@ const productSummarySchema = z.object({
2867
2867
  hasOptions: z.boolean(),
2868
2868
  fulfillment: z.object({ type: fulfillmentTypeResponseSchema }).describe("상품 이행의 유형. 유형별 속성은 단건 조회(`GET /v1/products/{productId}`)의 `fulfillment`에 있다"),
2869
2869
  updatedAt: z.string(),
2870
- sample: z.boolean().optional().default(false).describe("스토어를 만들 때 넣은 샘플 상품인가(이슈 #70). 콘솔이 「샘플」 배지를 단다. 스토어프론트에는 싣지 않는다. 서버는 항상 싣는다")
2870
+ sample: z.boolean().optional().default(false).describe("상점을 만들 때 넣은 샘플 상품인가(이슈 #70). 상점 플랫폼이 「샘플」 배지를 단다. 스토어프론트에는 싣지 않는다. 서버는 항상 싣는다")
2871
2871
  });
2872
2872
  /** 옵션 축(그룹)이 가지는 값 하나 — 예: 축 "색상"의 값 "블랙" */
2873
2873
  const optionValueSchema = z.object({
@@ -2914,7 +2914,7 @@ const MAX_ADDON_GROUPS = 5;
2914
2914
  const MAX_CUSTOM_INPUTS = 5;
2915
2915
  /** 직접 입력 항목 최대 글자 수의 상한 */
2916
2916
  const MAX_CUSTOM_INPUT_LENGTH = 200;
2917
- /** 조합 수가 이 값 이상이면 콘솔이 경고한다(상한은 `MAX_VARIANTS`) */
2917
+ /** 조합 수가 이 값 이상이면 상점 플랫폼이 경고한다(상한은 `MAX_VARIANTS`) */
2918
2918
  const VARIANT_COUNT_WARNING = 100;
2919
2919
  /**
2920
2920
  * 옵션 값 정렬 순서 — 등록순·가나다순·낮은 추가금순·높은 추가금순. 서버가 저장할 때 이 순서로 값의 `sortOrder`를 매긴다.
@@ -2953,7 +2953,7 @@ const customInputSchema = z.object({
2953
2953
  sortOrder: z.number().int()
2954
2954
  });
2955
2955
  /**
2956
- * 직접 입력 항목명에 쓸 수 없는 개인정보성 단어 — 콘솔 검사와 서버 400(`CUSTOM_INPUT_LABEL_FORBIDDEN`)이 이 목록 하나를 쓴다.
2956
+ * 직접 입력 항목명에 쓸 수 없는 개인정보성 단어 — 상점 플랫폼 검사와 서버 400(`CUSTOM_INPUT_LABEL_FORBIDDEN`)이 이 목록 하나를 쓴다.
2957
2957
  * 구매자 개인정보는 주문 정보로 받는다. 직접 입력 항목으로 받으면 보관·파기 규칙 밖에 남는다.
2958
2958
  */
2959
2959
  const CUSTOM_INPUT_FORBIDDEN_WORDS = [
@@ -3045,7 +3045,7 @@ const productSchema = productSummarySchema.extend({
3045
3045
  * 표시는 `description`(HTML)이 맡는다 — 소비자는 이 필드를 몰라도 된다.
3046
3046
  */
3047
3047
  descriptionJson: z.string().nullable().optional(),
3048
- originalPrice: z.number().int().nullable().optional(),
3048
+ originalPrice: z.number().int().nullable().optional().describe("정가(할인 전 표시 가격). 원 단위. 비교용 표시 값이고 결제 금액 계산에 쓰지 않는다 — 구매자가 내는 가격은 즉시할인이 있으면 `discountedPrice`, 없으면 `salePrice`다. 스토어프론트 상품 응답에도 같은 값이 실린다. 정하지 않았으면 null"),
3049
3049
  images: z.array(z.url()).optional(),
3050
3050
  attributes: z.array(z.object({
3051
3051
  attributeId: z.string(),
@@ -3059,7 +3059,7 @@ const productSchema = productSummarySchema.extend({
3059
3059
  optionSort: optionSortSchema.optional().default("REGISTERED").describe("옵션 값 정렬 순서(이슈 #59). 서버는 항상 싣는다"),
3060
3060
  fulfillment: productFulfillmentResponseSchema,
3061
3061
  fulfillmentTypeLocked: z.boolean().describe("판매 이력(주문상품)이 있어 상품 유형(`fulfillment.type`)을 바꿀 수 없는가. true면 다른 유형으로 수정하는 요청이 409 `FULFILLMENT_TYPE_LOCKED`다. 같은 유형 안의 속성은 바꿀 수 있다"),
3062
- refundPolicy: productRefundPolicyPatchSchema.nullable().describe("상품별 환불 정책 덮어쓰기(상품이 정한 항목만). null이면 스토어 기본 환불 정책을 쓴다. 반품·교환 배송비(`returnDeliveryFee`·`exchangeDeliveryFee`)는 배송 상품에만 있다"),
3062
+ refundPolicy: productRefundPolicyPatchSchema.nullable().describe("상품별 환불 정책 덮어쓰기(상품이 정한 항목만). null이면 상점 기본 환불 정책을 쓴다. 반품·교환 배송비(`returnDeliveryFee`·`exchangeDeliveryFee`)는 배송 상품에만 있다"),
3063
3063
  /**
3064
3064
  * 설정된 즉시할인. `GET /products/{productId}/discount`의 응답과 같은 형태다(이슈 #51).
3065
3065
  * 할인이 없으면 null이다. 이 필드를 싣기 전 서버의 응답에는 없으므로 optional이다.
@@ -3185,6 +3185,8 @@ const variantStockSchema = z.object({
3185
3185
  variantId: z.string(),
3186
3186
  stockQuantity: z.number().int()
3187
3187
  });
3188
+ /** 상품 쓰기 요청의 이미지 목록 — 등록·전체 수정·부분 수정이 같은 항목 형식을 쓴다. 첫 장이 대표(썸네일)다 */
3189
+ const productImagesRequestSchema = z.array(productImageUrlSchema).min(1).max(10);
3188
3190
  /**
3189
3191
  * 상품 쓰기 요청의 공통 필드 — 등록(POST)과 전체 수정(PUT)이 같다. 이행(`fulfillment`)만 두 요청의 스키마가 다르다.
3190
3192
  *
@@ -3195,19 +3197,19 @@ const productWriteShape = {
3195
3197
  name: z.string().min(1).max(100),
3196
3198
  categoryId: z.string().min(1, "카테고리를 선택해주십시오"),
3197
3199
  salePrice: z.number().int().min(10).multipleOf(10, "판매가는 10원 단위여야 합니다 (INVALID_PRICE_UNIT)").describe("판매가. 원(KRW) 단위 정수, 최소 10원, 10원 단위"),
3198
- originalPrice: z.number().int().optional().describe("정가(할인 전 표시 가격). 원 단위"),
3200
+ originalPrice: z.number().int().optional().describe("정가(할인 전 표시 가격). 원 단위. 비교용 표시 값이고 결제 금액은 판매가(즉시할인이 있으면 할인 적용가)다. 스토어프론트가 판매가보다 클 때 취소선·할인율로 보인다. 즉시할인은 `PUT /v1/products/{productId}/discount`로 따로 정한다"),
3199
3201
  description: z.string().optional(),
3200
3202
  /**
3201
3203
  * 상세설명 에디터(@avarlabs/editor)의 직렬화 상태. 재편집 때 이 값으로 문서를 복원한다.
3202
3204
  * 표시는 `description`(HTML)이 맡는다 — 소비자는 이 필드를 몰라도 된다.
3203
3205
  */
3204
3206
  descriptionJson: z.string().nullable().optional(),
3205
- images: z.array(productImageUrlSchema).min(1).max(10).optional().describe("상품 이미지 주소 목록. 첫 장이 대표 이미지(썸네일)다"),
3207
+ images: productImagesRequestSchema.optional().describe("상품 이미지 주소 목록. 첫 장이 대표 이미지(썸네일)다"),
3206
3208
  attributes: z.array(z.object({
3207
3209
  attributeId: z.string(),
3208
3210
  value: z.string()
3209
3211
  })).optional(),
3210
- refundPolicy: productRefundPolicyPatchSchema.nullish().describe("상품별 환불 정책 — 준 항목만 스토어 기본을 덮어쓴다. `null`이나 생략은 스토어 기본을 그대로 쓴다는 뜻이다. 반품·교환 배송비(`returnDeliveryFee`·`exchangeDeliveryFee`)는 배송 상품에만 줄 수 있다(다른 유형은 400)"),
3212
+ refundPolicy: productRefundPolicyPatchSchema.nullish().describe("상품별 환불 정책 — 준 항목만 상점 기본을 덮어쓴다. `null`이나 생략은 상점 기본을 그대로 쓴다는 뜻이다. 반품·교환 배송비(`returnDeliveryFee`·`exchangeDeliveryFee`)는 배송 상품에만 줄 수 있다(다른 유형은 400)"),
3211
3213
  ...optionModelRequestSchema.shape,
3212
3214
  sourceOptionSetIds: z.array(z.string()).max(10).optional().describe("쓰기 전용(이슈 #59) — 이 저장으로 옵션을 불러온 저장 옵션 id. 상품 저장과 같은 트랜잭션에서 불러오기 기록을 남겨 저장 옵션의 `importedProductCount`를 센다. 없는 id는 무시한다")
3213
3215
  };
@@ -3225,8 +3227,9 @@ const productPatchRequestSchema = z.strictObject({
3225
3227
  name: z.string().max(100).optional(),
3226
3228
  salePrice: z.number().int().multipleOf(10).optional(),
3227
3229
  status: productStatusSchema.optional(),
3230
+ images: productImagesRequestSchema.optional().describe("상품 이미지 주소 목록. 주면 통째로 바꾼다(현재 목록과 병합하지 않는다). 첫 장이 대표 이미지(썸네일)다. 생략하면 바꾸지 않는다"),
3228
3231
  fulfillment: productFulfillmentUpdateSchema.optional().describe(fulfillmentUpdateDescription),
3229
- refundPolicy: productRefundPolicyPatchSchema.nullable().optional().describe("상품별 환불 정책. 주면 통째로 바꾼다(준 항목만 스토어 기본을 덮어쓴다). `null`은 덮어쓰기를 지워 스토어 기본을 따른다. 생략하면 바꾸지 않는다")
3232
+ refundPolicy: productRefundPolicyPatchSchema.nullable().optional().describe("상품별 환불 정책. 주면 통째로 바꾼다(준 항목만 상점 기본을 덮어쓴다). `null`은 덮어쓰기를 지워 상점 기본을 따른다. 생략하면 바꾸지 않는다")
3230
3233
  }).refine((value) => Object.values(value).some((v) => v !== void 0), { message: "최소 1개 필드가 필요합니다" });
3231
3234
  const productSortSchema = z.enum([
3232
3235
  "createdAt.desc",
@@ -3402,7 +3405,7 @@ const dispatchRequestSchema = z.object({
3402
3405
  * 발송 시각. ISO 8601이고 시간대(`Z` 또는 `+09:00`)를 포함해야 한다. 생략하면 현재 시각이다.
3403
3406
  *
3404
3407
  * 전에는 `z.string()`이라 아무 문자열이나 그대로 저장됐다. 이 값은 배송 정보 jsonb에 들어가
3405
- * 자동 배송완료·추적 동기화 잡의 대상 선별 조건이 된다 — 잘못된 한 행이 스토어 구분 없이 도는
3408
+ * 자동 배송완료·추적 동기화 잡의 대상 선별 조건이 된다 — 잘못된 한 행이 상점 구분 없이 도는
3406
3409
  * 잡 전체를 멈출 수 있어 입력에서 좁혔다. 검증을 통과한 값도 저장 전에 UTC ISO로 정규화한다.
3407
3410
  */
3408
3411
  dispatchedAt: z.iso.datetime({ offset: true }).optional()
@@ -3524,7 +3527,7 @@ const addressChangeRequestListSchema = z.array(z.record(z.string(), z.unknown())
3524
3527
  * **불러오기는 복사다.** 저장 옵션을 고치거나 지워도 이미 불러온 상품의 옵션은 그대로다. 재고·SKU·사용 여부는 상품마다
3525
3528
  * 달라 저장하지 않는다. 추가금은 조합별이 아니라 **값별**로 둔다 — 조합 옵션으로 불러오면 조합 추가금은 고른 값 추가금의 합이다.
3526
3529
  */
3527
- /** 스토어당 저장 옵션 최대 개수 */
3530
+ /** 상점당 저장 옵션 최대 개수 */
3528
3531
  const MAX_SAVED_OPTION_SETS = 200;
3529
3532
  /** 저장 옵션 이름 최대 글자 수 */
3530
3533
  const MAX_SAVED_OPTION_SET_NAME = 50;
@@ -3631,7 +3634,7 @@ const savedOptionSetListQuerySchema = z.object({
3631
3634
  * (`deliveryBundleKeyOf`). 이슈 #25의 「묶음 = 같은 상품」 규칙을 일반화한 것이다 — 키를 상품 id에서
3632
3635
  * 정책 지문으로 바꿨고, 주문상품이 주문 시점 키를 스냅샷해(`order_items.delivery_bundle_key`)
3633
3636
  * 환불 정산(`refund-settlement.ts`)과 주문 스냅샷(`orders.delivery_fee_settlements`)이 같은 키를 쓴다.
3634
- * 2. **무료 기준**: 상품별 조건부 무료(`CONDITIONAL_FREE`, 묶음 소계 기준)와 스토어 전체 무료 기준
3637
+ * 2. **무료 기준**: 상품별 조건부 무료(`CONDITIONAL_FREE`, 묶음 소계 기준)와 상점 전체 무료 기준
3635
3638
  * (`freeThreshold`, 주문 상품 금액 합 기준)이 있다. 둘 중 하나라도 충족하면 그 배송비는 0이다.
3636
3639
  * 3. **지역 추가 배송비**: 우편번호가 제주·도서산간이면 **묶음마다** 추가된다. 묶음이 곧 한 번의 발송이라
3637
3640
  * 두 출고지에서 각각 보내면 추가 운임도 두 번 든다.
@@ -3642,16 +3645,16 @@ const savedOptionSetListQuerySchema = z.object({
3642
3645
  * 계산은 `quoteDelivery` 하나다. 장바구니·주문서·결제 시작·환불 정산이 모두 이 함수를 쓴다 —
3643
3646
  * 네 곳이 각자 계산하면 화면 금액과 결제 금액이 갈라진다.
3644
3647
  *
3645
- * **비실물 줄은 배송 계산에서 빠진다**(이슈 #48, `requiresShipping`). 묶음을 만들지 않고, 스토어 전체 무료 기준의
3648
+ * **비실물 줄은 배송 계산에서 빠진다**(이슈 #48, `requiresShipping`). 묶음을 만들지 않고, 상점 전체 무료 기준의
3646
3649
  * 판정 금액(`shippableAmount`)에도 넣지 않는다 — 디지털 상품 금액이 실물 배송비를 면제시키지 않게 한다.
3647
3650
  */
3648
3651
  const descriptions = {
3649
- baseDeliveryFee: "스토어 기본 배송비. 원 단위. 상품 등록·수정에서 `deliveryFee`를 생략하면 이 값을 쓴다. 기본 3000",
3650
- freeThreshold: "스토어 전체 무료배송 기준액. 주문 상품 금액 합이 이 값 이상이면 모든 묶음의 배송비가 0이다. null이면 전체 무료배송을 쓰지 않는다(상품별 조건부 무료는 그대로 동작한다). 기본 null",
3652
+ baseDeliveryFee: "상점 기본 배송비. 원 단위. 상품 등록·수정에서 `deliveryFee`를 생략하면 이 값을 쓴다. 기본 3000",
3653
+ freeThreshold: "상점 전체 무료배송 기준액. 주문 상품 금액 합이 이 값 이상이면 모든 묶음의 배송비가 0이다. null이면 전체 무료배송을 쓰지 않는다(상품별 조건부 무료는 그대로 동작한다). 기본 null",
3651
3654
  jejuSurcharge: "제주 지역 추가 배송비. 원 단위. **배송 묶음마다** 더한다. 기본 0",
3652
3655
  isolatedSurcharge: "도서산간 지역 추가 배송비. 원 단위. **배송 묶음마다** 더한다. 기본 0"
3653
3656
  };
3654
- /** 유효 배송비 정책 — 스토어가 정하지 않은 항목은 `SHIPPING_POLICY_DEFAULTS`로 채운 값이다 */
3657
+ /** 유효 배송비 정책 — 상점이 정하지 않은 항목은 `SHIPPING_POLICY_DEFAULTS`로 채운 값이다 */
3655
3658
  const shippingPolicySchema = z.object({
3656
3659
  baseDeliveryFee: z.number().int().min(0).describe(descriptions.baseDeliveryFee),
3657
3660
  freeThreshold: z.number().int().min(1).nullable().describe(descriptions.freeThreshold),
@@ -3659,7 +3662,7 @@ const shippingPolicySchema = z.object({
3659
3662
  isolatedSurcharge: z.number().int().min(0).describe(descriptions.isolatedSurcharge)
3660
3663
  });
3661
3664
  /**
3662
- * 스토어가 정하지 않았을 때 서버가 쓰는 값.
3665
+ * 상점이 정하지 않았을 때 서버가 쓰는 값.
3663
3666
  *
3664
3667
  * `as const`가 아니라 `ShippingPolicy`로 좁힌다 — 리터럴 타입이면 `Partial<typeof …>`로 일부만 바꿀 때
3665
3668
  * `null` 자리에 숫자를 넣을 수 없다(`REFUND_POLICY_DEFAULTS`와 같은 이유).
@@ -3682,7 +3685,7 @@ const shippingPolicyPatchSchema = z.strictObject({
3682
3685
  jejuSurcharge: z.number().int().min(0).optional().describe(descriptions.jejuSurcharge),
3683
3686
  isolatedSurcharge: z.number().int().min(0).optional().describe(descriptions.isolatedSurcharge)
3684
3687
  });
3685
- /** 유효 정책 해석 — 스토어가 정한 항목 + `SHIPPING_POLICY_DEFAULTS` */
3688
+ /** 유효 정책 해석 — 상점이 정한 항목 + `SHIPPING_POLICY_DEFAULTS` */
3686
3689
  function resolveShippingPolicy(patch) {
3687
3690
  if (!patch) return { ...SHIPPING_POLICY_DEFAULTS };
3688
3691
  const given = Object.fromEntries(Object.entries(patch).filter(([, value]) => value !== void 0));
@@ -3698,10 +3701,10 @@ const remoteAreaSchema = z.enum([
3698
3701
  "ISOLATED"
3699
3702
  ]);
3700
3703
  /**
3701
- * 제주·도서산간 우편번호 범위 — **코드 상수다.** 금액은 스토어가 정하고 범위는 플랫폼이 고정한다.
3704
+ * 제주·도서산간 우편번호 범위 — **코드 상수다.** 금액은 상점이 정하고 범위는 플랫폼이 고정한다.
3702
3705
  *
3703
3706
  * 국내 택배사가 공표하는 제주·도서산간 할증 구간을 5자리 우편번호 범위로 옮긴 표다. 셀러마다
3704
- * 범위가 다르면 같은 주소에 다른 금액이 나가고 CS가 셀러 수만큼 갈라진다. 스토어별 범위 편집은
3707
+ * 범위가 다르면 같은 주소에 다른 금액이 나가고 CS가 셀러 수만큼 갈라진다. 상점별 범위 편집은
3705
3708
  * 후속 과제이고, 지금은 이 표가 유일한 원천이다.
3706
3709
  *
3707
3710
  * ## 근거
@@ -3740,7 +3743,7 @@ const remoteAreaSchema = z.enum([
3740
3743
  * 도로명주소·건물관리번호 단위 판정은 후속 과제다.
3741
3744
  *
3742
3745
  * 범위는 **닫힌 구간**(`from` ≤ zip ≤ `to`)이고 겹치지 않는다. 앞에서부터 처음 맞는 항목을 쓴다.
3743
- * 순서는 콘솔 「추가 배송비 지역」 표의 행 순서이기도 하다(`remoteAreaGroups`). 제주를 먼저 두고
3746
+ * 순서는 상점 플랫폼 「추가 배송비 지역」 표의 행 순서이기도 하다(`remoteAreaGroups`). 제주를 먼저 두고
3744
3747
  * 도서산간은 우편번호 오름차순으로 둔다.
3745
3748
  */
3746
3749
  const REMOTE_AREA_ZIP_RANGES = [
@@ -3993,7 +3996,7 @@ function deliveryBundleKeyOf(product) {
3993
3996
  * 기본 배송비를 면제한 근거 — 면제하지 않았으면 null이다.
3994
3997
  *
3995
3998
  * 환불 정산이 근거를 구분해야 한다. 조건부 무료 기준 미달 차감은 **상품별 조건부 무료(`CONDITIONAL`)로
3996
- * 면제된 묶음만** 대상이다. 스토어 전체 무료 기준(`STORE_THRESHOLD`)이나 무료배송 상품(`FREE`)은 셀러가
3999
+ * 면제된 묶음만** 대상이다. 상점 전체 무료 기준(`STORE_THRESHOLD`)이나 무료배송 상품(`FREE`)은 셀러가
3997
4000
  * 배송비를 받지 않기로 한 것이므로, 일부 취소로 기준이 깨져도 구매자에게 배송비를 물리지 않는다.
3998
4001
  *
3999
4002
  * 세 값이 겹치면 `FREE` → `STORE_THRESHOLD` → `CONDITIONAL` 순으로 센 근거를 남긴다.
@@ -4007,7 +4010,7 @@ const deliveryFeeWaiverSchema = z.enum([
4007
4010
  * 배송비 계산 — **순수 함수다.** 장바구니 요약, 주문서 금액, 결제 시작의 최종 확정,
4008
4011
  * 주문 배송비 스냅샷이 모두 이 한 곳을 쓴다.
4009
4012
  *
4010
- * 순서가 규칙이다. 묶음별 조건부 무료를 먼저 보고, 그다음 스토어 전체 무료 기준으로 기본 배송비를
4013
+ * 순서가 규칙이다. 묶음별 조건부 무료를 먼저 보고, 그다음 상점 전체 무료 기준으로 기본 배송비를
4011
4014
  * 한꺼번에 0으로 만들고, 마지막에 지역 추가 배송비를 묶음마다 더한다. 추가 배송비는 무료 기준에
4012
4015
  * 걸리지 않는다.
4013
4016
  */
@@ -4065,14 +4068,14 @@ function quoteDelivery(input) {
4065
4068
  //#endregion
4066
4069
  //#region src/schemas/store.ts
4067
4070
  /**
4068
- * 스토어 코드 규칙 — 스토어프론트 API가 테넌트를 가르는 값이다(`X-Store-Code` 헤더).
4071
+ * 상점 코드 규칙 — 스토어프론트 API가 테넌트를 가르는 값이다(`X-Store-Code` 헤더).
4069
4072
  * **개설할 때 서버가 랜덤으로 발급하고** 이후 바꿀 수 없다. 이미 나간 링크와 승인된 결제가
4070
4073
  * 이 값에 묶여 있어서 바꾸면 함께 깨진다.
4071
4074
  *
4072
4075
  * 호스트 라벨로도 쓸 수 있게 DNS 라벨 규칙까지 좁힌다. 하이픈으로 시작하거나 끝나는 라벨은 호스트가 될 수 없다.
4073
4076
  */
4074
4077
  const STORE_CODE_PATTERN = /^[a-z0-9](?:[a-z0-9-]{1,28}[a-z0-9])$/;
4075
- /** 플랫폼이 쓰거나 쓸 호스트 이름 — 스토어 코드로 내주지 않는다 */
4078
+ /** 플랫폼이 쓰거나 쓸 호스트 이름 — 상점 코드로 내주지 않는다 */
4076
4079
  const RESERVED_STORE_CODES = [
4077
4080
  "www",
4078
4081
  "api",
@@ -4122,7 +4125,7 @@ const RESERVED_STORE_CODES = [
4122
4125
  function isReservedStoreCode(code) {
4123
4126
  return RESERVED_STORE_CODES.includes(code.toLowerCase());
4124
4127
  }
4125
- const storeCodeSchema = z.string().regex(STORE_CODE_PATTERN, "소문자·숫자·하이픈 3~30자여야 하고 하이픈으로 시작하거나 끝날 수 없습니다").refine((code) => !isReservedStoreCode(code), "플랫폼이 쓰는 이름이라 스토어 코드로 쓸 수 없습니다");
4128
+ const storeCodeSchema = z.string().regex(STORE_CODE_PATTERN, "소문자·숫자·하이픈 3~30자여야 하고 하이픈으로 시작하거나 끝날 수 없습니다").refine((code) => !isReservedStoreCode(code), "플랫폼이 쓰는 이름이라 상점 코드로 쓸 수 없습니다");
4126
4129
  /** `https://shop.example.com`처럼 경로·쿼리 없는 http(s) 오리진인가 */
4127
4130
  function isWebOrigin(value) {
4128
4131
  try {
@@ -4139,7 +4142,7 @@ const MAX_ANALYTICS_ALLOWED_ORIGINS = 20;
4139
4142
  /** 자동 배송완료·자동 구매확정 대기일 상한 */
4140
4143
  const MAX_AUTO_TRANSITION_DAYS = 30;
4141
4144
  /**
4142
- * 약관 버전 — 스토어가 정하는 문자열이다(`1`·`2`·`2026-09-26`·`v1.2` 등). 형식은 강제하지 않고 값이 다르면 다른 버전이다.
4145
+ * 약관 버전 — 상점이 정하는 문자열이다(`1`·`2`·`2026-09-26`·`v1.2` 등). 형식은 강제하지 않고 값이 다르면 다른 버전이다.
4143
4146
  * 올리면 그 약관에 동의한 구매자의 `reconsentRequired`가 켜지고, 재동의가 이력에 남는다. 되돌리면 재동의 요구도 풀린다.
4144
4147
  */
4145
4148
  const policyVersionSchema = z.string().trim().min(1).max(20).describe("약관 버전 문자열(1~20자). 예: `1`, `2026-09-26`");
@@ -4148,21 +4151,67 @@ const policyVersionSchema = z.string().trim().min(1).max(20).describe("약관
4148
4151
  * 나중에 주소를 바꿔도 "무엇에 동의했는지"가 남는다. `null`로 지울 수 있다.
4149
4152
  */
4150
4153
  const policyDocumentUrlSchema = z.url().max(500).refine((value) => value.startsWith("https://"), "https 주소만 쓸 수 있습니다").nullable();
4154
+ /**
4155
+ * 사업자등록번호 — 숫자 10자리. 하이픈(`123-45-67890`)과 공백은 받고 서버가 숫자만 남겨 저장한다.
4156
+ * 국세청 검증번호(체크섬)는 보지 않는다.
4157
+ */
4158
+ const BUSINESS_NUMBER_PATTERN = /^\d{3}[-\s]?\d{2}[-\s]?\d{5}$/;
4159
+ /** 사업자등록번호에서 숫자만 남긴다 — 저장·비교는 이 값으로 한다 */
4160
+ function normalizeBusinessNumber(value) {
4161
+ return value.replace(/\D/g, "");
4162
+ }
4163
+ const businessNumberSchema = z.string().trim().regex(BUSINESS_NUMBER_PATTERN, "사업자등록번호는 숫자 10자리여야 합니다").nullable();
4164
+ /** 사업자 정보 글자 필드 — 앞뒤 공백을 지우고 빈 값은 받지 않는다(지우려면 `null`) */
4165
+ const businessText = (max) => z.string().trim().min(1).max(max).nullable();
4166
+ /** 사업자 정보 필드의 길이 상한 — 상점 플랫폼 입력 칸과 같다 */
4167
+ const BUSINESS_INFO_MAX_LENGTH = {
4168
+ businessName: 100,
4169
+ representativeName: 50,
4170
+ mailOrderSalesNumber: 50,
4171
+ businessAddress: 200,
4172
+ privacyOfficerName: 50
4173
+ };
4174
+ /**
4175
+ * `PATCH /v1/store`의 사업자 정보 필드(이슈 #81) — 전자상거래법 표기(스토어프론트 푸터)용이다.
4176
+ * 바꿀 필드만 보내고 `null`을 주면 지운다. 스토어프론트 `GET /store`가 같은 값을 싣는다.
4177
+ */
4178
+ const businessInfoPatchShape = {
4179
+ businessName: businessText(BUSINESS_INFO_MAX_LENGTH.businessName).optional().describe("상호(사업자등록증의 상호). 상점명(`name`)과 다를 수 있다. `null`을 주면 지운다"),
4180
+ representativeName: businessText(BUSINESS_INFO_MAX_LENGTH.representativeName).optional().describe("대표자명. `null`을 주면 지운다"),
4181
+ businessNumber: businessNumberSchema.optional().describe("사업자등록번호. 숫자 10자리이고 하이픈(`123-45-67890`)을 넣어도 된다. 숫자만 저장한다. `null`을 주면 지운다"),
4182
+ mailOrderSalesNumber: businessText(BUSINESS_INFO_MAX_LENGTH.mailOrderSalesNumber).optional().describe("통신판매업 신고번호(예: `2026-서울강남-01234`). 적은 그대로 저장한다. `null`을 주면 지운다"),
4183
+ businessAddress: businessText(BUSINESS_INFO_MAX_LENGTH.businessAddress).optional().describe("사업장 주소. `null`을 주면 지운다"),
4184
+ customerCenterEmail: z.email().max(254).nullable().optional().describe("고객센터 이메일. `null`을 주면 지운다"),
4185
+ privacyOfficerName: businessText(BUSINESS_INFO_MAX_LENGTH.privacyOfficerName).optional().describe("개인정보 보호책임자 성명. `null`을 주면 지운다"),
4186
+ privacyOfficerEmail: z.email().max(254).nullable().optional().describe("개인정보 보호책임자 이메일. `null`을 주면 지운다")
4187
+ };
4188
+ /** 응답의 사업자 정보 필드 — 옛 api 응답에 없으면 null로 읽는다(상점 플랫폼이 api보다 먼저 배포된다) */
4189
+ const nullableText = (description) => z.string().nullable().optional().default(null).describe(`${description}. 없으면 null. 서버는 항상 싣는다`);
4190
+ const businessInfoResponseShape = {
4191
+ businessName: nullableText("상호. 상점명과 다를 수 있다"),
4192
+ representativeName: nullableText("대표자명"),
4193
+ mailOrderSalesNumber: nullableText("통신판매업 신고번호"),
4194
+ businessAddress: nullableText("사업장 주소"),
4195
+ customerCenterEmail: nullableText("고객센터 이메일"),
4196
+ privacyOfficerName: nullableText("개인정보 보호책임자 성명"),
4197
+ privacyOfficerEmail: nullableText("개인정보 보호책임자 이메일")
4198
+ };
4151
4199
  const autoDeliverDaysDescription = "발송 후 자동 배송완료까지의 일수(0~30, 기본 7). 발송(`DISPATCHED`)·배송중(`DELIVERING`) 주문상품을 이 기간이 지나면 배송완료(`DELIVERED`)로 바꾼다. `0`이면 자동 배송완료를 하지 않는다";
4152
4200
  const autoConfirmDaysDescription = "배송완료 후 자동 구매확정까지의 일수(0~30, 기본 7). 배송완료 시점에 구매확정 예정일(`autoDecisionDate`)을 이 값으로 잡고, 그 날짜가 지나면 구매확정(`PURCHASE_DECIDED`)으로 바꾼다. 진행 중인 클레임이 있으면 건너뛴다. `0`이면 자동 구매확정을 하지 않는다";
4153
4201
  /** `PATCH /v1/store` 본문 — 바꿀 필드만 보낸다 */
4154
4202
  const updateStoreRequestSchema = z.object({
4155
4203
  name: z.string().min(2).max(50).optional(),
4156
4204
  logoUrl: z.url().optional(),
4157
- customerCenterPhone: z.string().optional(),
4205
+ customerCenterPhone: z.string().nullable().optional().describe("고객센터 전화번호. `null`을 주면 지운다"),
4158
4206
  businessHours: z.string().max(100).optional(),
4207
+ ...businessInfoPatchShape,
4159
4208
  analyticsAllowedOrigins: z.array(analyticsOriginSchema).max(20).optional().describe("@deprecated `storefrontOrigins`를 쓴다(같은 목록). 방문 분석 수집을 받을 스토어프론트 오리진(최대 20개). 비우면 모든 오리진에서 받는다. 넣으면 목록에 없는 오리진의 수집 요청은 403 `ORIGIN_NOT_ALLOWED`이고, 페이지 URL이 목록 밖인 이벤트는 버린다"),
4160
4209
  storefrontOrigins: z.array(analyticsOriginSchema).max(20).optional().describe("스토어프론트 도메인(최대 20개) — 소셜 로그인 뒤 돌아갈 주소와 방문 분석 수집을 함께 제한한다. `analyticsAllowedOrigins`와 같은 목록이다(둘 다 주면 이 값이 이긴다)"),
4161
4210
  guestCheckoutEnabled: z.boolean().optional().describe("비회원 주문 허용. false(회원만)면 로그인하지 않은 구매자의 주문서 생성·결제 요청이 403 `GUEST_CHECKOUT_DISABLED`다. 장바구니 담기와 이미 받은 비회원 주문의 조회·취소는 막지 않는다"),
4162
4211
  autoDeliverDays: z.number().int().min(0).max(30).optional().describe(autoDeliverDaysDescription),
4163
4212
  autoConfirmDays: z.number().int().min(0).max(30).optional().describe(autoConfirmDaysDescription),
4164
- refundPolicy: refundPolicyPatchSchema.optional().describe("스토어 기본 환불 정책 — 준 항목만 바꾼다. 상품별 정책(`products.refundPolicy`)이 없는 상품에 적용된다"),
4165
- shippingPolicy: shippingPolicyPatchSchema.optional().describe("스토어 배송비 규칙 — 준 항목만 바꾼다. 기본 배송비, 전체 무료배송 기준액, 제주·도서산간 추가 배송비다. 바꾼 값은 **새 주문서부터** 적용된다(이미 만든 주문서·주문의 배송비는 스냅샷이 원천이다)"),
4213
+ refundPolicy: refundPolicyPatchSchema.optional().describe("상점 기본 환불 정책 — 준 항목만 바꾼다. 상품별 정책(`products.refundPolicy`)이 없는 상품에 적용된다"),
4214
+ shippingPolicy: shippingPolicyPatchSchema.optional().describe("상점 배송비 규칙 — 준 항목만 바꾼다. 기본 배송비, 전체 무료배송 기준액, 제주·도서산간 추가 배송비다. 바꾼 값은 **새 주문서부터** 적용된다(이미 만든 주문서·주문의 배송비는 스냅샷이 원천이다)"),
4166
4215
  termsVersion: policyVersionSchema.optional().describe("이용약관 버전. 올리면 이 약관에 동의한 구매자에게 재동의를 요구한다(`GET /storefront/v1/me`의 `reconsentRequired`)"),
4167
4216
  privacyVersion: policyVersionSchema.optional().describe("개인정보 수집이용 동의 버전. 올리면 구매자에게 재동의를 요구한다"),
4168
4217
  termsUrl: policyDocumentUrlSchema.optional().describe("이용약관 문서 주소(https). 동의 시점의 값이 동의 이력에 복사된다. `null`을 주면 지운다"),
@@ -4179,15 +4228,16 @@ const storeSchema = z.object({
4179
4228
  "CLOSED"
4180
4229
  ]),
4181
4230
  logoUrl: z.url().nullable(),
4182
- businessNumber: z.string().nullable(),
4231
+ businessNumber: z.string().nullable().describe("사업자등록번호(숫자 10자리). 없으면 null"),
4183
4232
  customerCenterPhone: z.string().nullable(),
4233
+ ...businessInfoResponseShape,
4184
4234
  analyticsAllowedOrigins: z.array(z.string()).describe("방문 분석 수집을 받는 스토어프론트 오리진. 비어 있으면 모든 오리진에서 받는다"),
4185
4235
  storefrontOrigins: z.array(z.string()).describe("스토어프론트 도메인 — 소셜 로그인 리디렉트와 방문 분석 수집이 함께 쓴다(`analyticsAllowedOrigins`와 같은 값)"),
4186
4236
  guestCheckoutEnabled: z.boolean().describe("비회원 주문 허용. false면 회원만 주문할 수 있다"),
4187
4237
  autoDeliverDays: z.number().int().describe(autoDeliverDaysDescription),
4188
4238
  autoConfirmDays: z.number().int().describe(autoConfirmDaysDescription),
4189
- refundPolicy: refundPolicySchema.describe("스토어 기본 환불 정책. 스토어가 정하지 않은 항목은 플랫폼 기본값으로 채워 항상 전부 싣는다"),
4190
- shippingPolicy: shippingPolicySchema.describe("스토어 배송비 규칙. 스토어가 정하지 않은 항목은 플랫폼 기본값으로 채워 항상 전부 싣는다"),
4239
+ refundPolicy: refundPolicySchema.describe("상점 기본 환불 정책. 상점이 정하지 않은 항목은 플랫폼 기본값으로 채워 항상 전부 싣는다"),
4240
+ shippingPolicy: shippingPolicySchema.describe("상점 배송비 규칙. 상점이 정하지 않은 항목은 플랫폼 기본값으로 채워 항상 전부 싣는다"),
4191
4241
  termsVersion: z.string().describe("현재 이용약관 버전. 가입·재동의가 이 값으로 이력에 남는다"),
4192
4242
  privacyVersion: z.string().describe("현재 개인정보 수집이용 동의 버전"),
4193
4243
  termsVersionUpdatedAt: z.string().nullable().describe("이용약관 버전을 마지막으로 바꾼 시각. 바꾼 적이 없으면 null"),
@@ -4207,7 +4257,7 @@ const storeMemberSchema = z.object({
4207
4257
  });
4208
4258
  /**
4209
4259
  * 초대 메일 발송 결과 — `SENDING`은 발송 요청 중(결과를 아직 적지 못함), `NOT_CONFIGURED`는 메일 발송이 설정되지 않아
4210
- * 보내지 않은 것이다. 스토어의 월 메일 한도(요금제)를 다 써서 보내지 않았으면 `FAILED` + `deliveryErrorCode: MAIL_QUOTA_EXCEEDED`다. 발송 실패는 초대를 무효로 만들지 않는다 — 재발송으로 다시 보낸다
4260
+ * 보내지 않은 것이다. 상점의 월 메일 한도(요금제)를 다 써서 보내지 않았으면 `FAILED` + `deliveryErrorCode: MAIL_QUOTA_EXCEEDED`다. 발송 실패는 초대를 무효로 만들지 않는다 — 재발송으로 다시 보낸다
4211
4261
  */
4212
4262
  const invitationDeliveryStatusSchema = z.enum([
4213
4263
  "SENDING",
@@ -4286,7 +4336,7 @@ const sellerAddressRequestSchema = z.object({
4286
4336
  /**
4287
4337
  * 스토어프론트 호스팅 (이슈 #53, M1: 템플릿 발행) — 관리 API `/v1/storefront/**`의 계약이다.
4288
4338
  *
4289
- * 셀러는 템플릿을 골라 사이트를 만들고 `{slug}.{호스팅 도메인}` 주소를 받는다. 스토어를 만들어도 사이트는 생기지 않고
4339
+ * 셀러는 템플릿을 골라 사이트를 만들고 `{slug}.{호스팅 도메인}` 주소를 받는다. 상점을 만들어도 사이트는 생기지 않고
4290
4340
  * `POST /v1/storefront/site`가 유일한 생성 경로다. 템플릿은 만들 때만 고르고 바꾸지 않는다. 발행은 버전 단위이고,
4291
4341
  * 되돌리기는 이전 버전을 다시 발행하는 것이다(재빌드 없음). 상태의 원천은 api DB이고 Cloudflare 쪽 반영
4292
4342
  * (라우팅 표·사이트 Worker)은 커밋 뒤 비동기다 — 반영 상태는 `provisioning`으로 본다.
@@ -4297,13 +4347,13 @@ const sellerAddressRequestSchema = z.object({
4297
4347
  * 오류 코드:
4298
4348
  * - 403 `STOREFRONT_HOSTING_DISABLED` — 플랫폼 스위치가 꺼져 새 사이트를 만들 수 없다
4299
4349
  * - 404 `STOREFRONT_SITE_NOT_FOUND` · `STOREFRONT_TEMPLATE_NOT_FOUND` · `STOREFRONT_VERSION_NOT_FOUND`
4300
- * - 409 `STOREFRONT_SITE_EXISTS` — 이미 사이트가 있다(스토어당 1개)
4350
+ * - 409 `STOREFRONT_SITE_EXISTS` — 이미 사이트가 있다(상점당 1개)
4301
4351
  * - 409 `STOREFRONT_SLUG_TAKEN` — 다른 사이트가 쓰거나 보류 중인 슬러그다
4302
- * - 409 `STOREFRONT_SLUG_CHANGE_LIMIT` — 슬러그는 스토어당 30일에 3번까지 바꾼다
4303
- * - 409 `STOREFRONT_SITE_CREATE_LIMIT` — 사이트는 스토어당 30일에 3번까지 만든다
4352
+ * - 409 `STOREFRONT_SLUG_CHANGE_LIMIT` — 슬러그는 상점당 30일에 3번까지 바꾼다
4353
+ * - 409 `STOREFRONT_SITE_CREATE_LIMIT` — 사이트는 상점당 30일에 3번까지 만든다
4304
4354
  * - 409 `STOREFRONT_SITE_CHANGED` — 읽은 상태(`expected*`)와 현재 상태가 다르다. 다시 읽고 시도한다
4305
4355
  * - 409 `STOREFRONT_SITE_NOT_ACTIVE` — 정지(`SUSPENDED`)된 사이트는 바꾸거나 끌 수 없다
4306
- * - 409 `STORE_SUSPENDED` — 정지된 스토어에는 사이트를 만들 수 없다
4356
+ * - 409 `STORE_SUSPENDED` — 정지된 상점에는 사이트를 만들 수 없다
4307
4357
  * - 409 `STOREFRONT_VERSION_NOT_READY` — 빌드가 끝나지 않았거나 실패한 버전은 발행할 수 없다
4308
4358
  * - 409 `STOREFRONT_NO_ROLLBACK_TARGET` — 되돌릴 이전 발행 버전이 없다
4309
4359
  * - 409 `STOREFRONT_NOT_READY` — 공개 전환: 판매 중인 상품(샘플 제외)이 없다(이슈 #70). 상품을 등록한 뒤 공개한다
@@ -4329,7 +4379,7 @@ const sellerAddressRequestSchema = z.object({
4329
4379
  * - 502 `STOREFRONT_SANDBOX_UNAVAILABLE` — 편집 Sandbox 호출이 실패했다. 잠시 뒤 다시 한다
4330
4380
  *
4331
4381
  * 소스 내려받기·올리기(#60, `/v1/storefront/site/source/**`, `sayren` CLI):
4332
- * - 409 `SOURCE_CHANGED` — 작업 트리가 내려받은 뒤(`expectedBaseRef`) 바뀌었다(콘솔·AI 편집). `error.details.currentRef`
4382
+ * - 409 `SOURCE_CHANGED` — 작업 트리가 내려받은 뒤(`expectedBaseRef`) 바뀌었다(상점 플랫폼·AI 편집). `error.details.currentRef`
4333
4383
  * - 409 `EDIT_SESSION_OPEN` — 편집 환경이 열려 있다. `endEditSession: true`로 끄고 진행할 수 있다
4334
4384
  * - 409 `SOURCE_BLOBS_MISSING` — 올리지 않은 파일 내용이 있다(`error.details.hashes`). `POST source/blobs`로 올리고 다시 한다
4335
4385
  * - 409 `DEPENDENCY_REJECTED` — 쓸 수 없는 npm 의존성이다(`error.details.rejected: [{ name, version, reason, detail }]`)
@@ -4339,11 +4389,11 @@ const sellerAddressRequestSchema = z.object({
4339
4389
  * - 404 `STOREFRONT_SOURCE_NOT_FOUND` — 그 스냅샷이 없다
4340
4390
  */
4341
4391
  /**
4342
- * 슬러그 형식 — 스토어 코드와 같은 DNS 라벨 규칙(소문자·숫자·하이픈 3~30자, 하이픈으로 시작·끝 불가)에
4392
+ * 슬러그 형식 — 상점 코드와 같은 DNS 라벨 규칙(소문자·숫자·하이픈 3~30자, 하이픈으로 시작·끝 불가)에
4343
4393
  * 연속 하이픈 금지를 더한다. `--`는 버전 미리보기 주소(`v3--{slug}`)와 punycode(`xn--`)가 쓰는 구분자다.
4344
4394
  */
4345
4395
  const STOREFRONT_SLUG_PATTERN = /^[a-z0-9](?:[a-z0-9-]{1,28}[a-z0-9])$/;
4346
- /** 호스팅 도메인에서 플랫폼이 쓰거나 쓸 이름 — 스토어 코드 예약어에 호스팅 전용 이름을 더한다 */
4396
+ /** 호스팅 도메인에서 플랫폼이 쓰거나 쓸 이름 — 상점 코드 예약어에 호스팅 전용 이름을 더한다 */
4347
4397
  const RESERVED_STOREFRONT_SLUGS = [
4348
4398
  ...RESERVED_STORE_CODES,
4349
4399
  "mcp",
@@ -4369,7 +4419,7 @@ const RESERVED_STOREFRONT_SLUGS = [
4369
4419
  const STOREFRONT_EDIT_PREVIEW_SUFFIX = "-preview";
4370
4420
  /**
4371
4421
  * 공식 쇼케이스 슬러그 접두사(이슈 #72) — `demo-{템플릿 id}`는 템플릿 미리보기용 쇼케이스 사이트 주소다. 쇼케이스로 지정된
4372
- * 스토어만 쓸 수 있다(서버가 스토어 용도로 판정한다). 공식 미리보기를 흉내 내는 주소를 막는다
4422
+ * 상점만 쓸 수 있다(서버가 상점 용도로 판정한다). 공식 미리보기를 흉내 내는 주소를 막는다
4373
4423
  */
4374
4424
  const STOREFRONT_SHOWCASE_SLUG_PREFIX = "demo-";
4375
4425
  function isShowcaseStorefrontSlug(slug) {
@@ -4392,9 +4442,9 @@ const storefrontSlugSchema = z.string().regex(STOREFRONT_SLUG_PATTERN, "소문
4392
4442
  const STOREFRONT_SLUG_HOLD_DAYS = 90;
4393
4443
  /** 슬러그 변경 한도 — 이 기간(일) 안에 */
4394
4444
  const STOREFRONT_SLUG_CHANGE_WINDOW_DAYS = 30;
4395
- /** 슬러그 변경 한도 — 횟수(스토어 단위. 끄고 다시 만들어도 이어서 센다) */
4445
+ /** 슬러그 변경 한도 — 횟수(상점 단위. 끄고 다시 만들어도 이어서 센다) */
4396
4446
  const STOREFRONT_SLUG_CHANGE_LIMIT = 3;
4397
- /** 사이트 만들기 한도 — 같은 창(30일) 안의 횟수(스토어 단위). 끄고 만들기를 되풀이해 이름을 묶어 두지 못하게 한다 */
4447
+ /** 사이트 만들기 한도 — 같은 창(30일) 안의 횟수(상점 단위). 끄고 만들기를 되풀이해 이름을 묶어 두지 못하게 한다 */
4398
4448
  const STOREFRONT_SITE_CREATE_LIMIT = 3;
4399
4449
  const storefrontTemplateSchema = z.object({
4400
4450
  templateId: z.string().describe("템플릿 id (예: `basic`)"),
@@ -4403,7 +4453,7 @@ const storefrontTemplateSchema = z.object({
4403
4453
  description: z.string().describe("템플릿 설명"),
4404
4454
  thumbnailUrl: z.string().nullable().describe("썸네일 이미지 주소. 없으면 null"),
4405
4455
  version: z.string().describe("현재 템플릿 버전. 새 사이트는 이 버전으로 만든다"),
4406
- isDefault: z.boolean().describe("기본 템플릿인가 (스토어 생성 시 자동 생성에 쓴다)"),
4456
+ isDefault: z.boolean().describe("기본 템플릿인가 (상점 생성 시 자동 생성에 쓴다)"),
4407
4457
  tags: z.array(z.string()).default([]).describe("템플릿 특징 태그 (예: `후기 강조`). 목록 카드에 보인다. 옛 서버 응답은 빈 배열로 읽는다"),
4408
4458
  supportsCheckout: z.boolean().default(true).describe("주문을 받는 템플릿인가. false는 가격·문의 중심의 카탈로그형이다. 옛 서버 응답은 true로 읽는다"),
4409
4459
  previewUrl: z.string().nullable().default(null).describe("공식 쇼케이스 사이트 주소. 연결된 쇼케이스가 공개 중일 때만 싣고 그 밖에는 null")
@@ -4431,14 +4481,14 @@ const storefrontVersionSchema = z.object({
4431
4481
  source: z.enum(["TEMPLATE", "EDIT"]).describe("`TEMPLATE` 템플릿 산출물 그대로 · `EDIT` 편집 작업 트리를 빌드함"),
4432
4482
  buildId: z.string().nullable().describe("편집 버전의 빌드 (`GET /v1/storefront/site/builds/{buildId}`). 템플릿 버전은 null"),
4433
4483
  createdByType: z.string().describe("만든 행위자 유형 (`USER`·`AGENT`·`APP`·`TOKEN`·`SYSTEM`). 늘어날 수 있다"),
4434
- createdVia: z.string().nullable().optional().describe("만든 경로 (`CONSOLE` 콘솔 · `AI` AI 에이전트(MCP) · `CLI` `sayren` CLI · `API` 관리 API · `SYSTEM` 자동). 늘어날 수 있다"),
4484
+ createdVia: z.string().nullable().optional().describe("만든 경로 (`CONSOLE` 상점 플랫폼 · `AI` AI 에이전트(MCP) · `CLI` `sayren` CLI · `API` 관리 API · `SYSTEM` 자동). 늘어날 수 있다"),
4435
4485
  createdAt: z.string().describe("만든 시각 (ISO 8601)")
4436
4486
  });
4437
4487
  const storefrontSiteStatusSchema = z.enum([
4438
4488
  "ACTIVE",
4439
4489
  "SUSPENDED",
4440
4490
  "CLOSED"
4441
- ]).describe("`ACTIVE` 운영 중 · `SUSPENDED` 운영자 정지 · `CLOSED` 호스팅 끔·스토어 폐쇄");
4491
+ ]).describe("`ACTIVE` 운영 중 · `SUSPENDED` 운영자 정지 · `CLOSED` 호스팅 끔·상점 폐쇄");
4442
4492
  const storefrontVisibilitySchema = z.enum(["COMING_SOON", "PUBLIC"]).describe("`COMING_SOON` 오픈 준비 중(방문자에게 준비 중 페이지) · `PUBLIC` 공개");
4443
4493
  const storefrontSourceModeSchema = z.enum(["MANAGED", "CUSTOM"]).describe("`MANAGED` 템플릿 그대로 · `CUSTOM` 한 번이라도 편집함");
4444
4494
  const storefrontDomainSchema = z.object({
@@ -4463,7 +4513,7 @@ const storefrontProvisioningSchema = z.object({
4463
4513
  });
4464
4514
  /**
4465
4515
  * 편집 미리보기 주소(M2b) — 사이트마다 `{사이트 id 정규화}-preview.{호스팅 도메인}` 호스트 하나다. 호스팅 도메인의 와일드카드
4466
- * 인증서가 덮으므로 따로 준비할 것이 없다. 이 주소는 편집 미리보기 링크(콘솔 전용)로 받은 쿠키가 있어야 열린다.
4516
+ * 인증서가 덮으므로 따로 준비할 것이 없다. 이 주소는 편집 미리보기 링크(상점 플랫폼 전용)로 받은 쿠키가 있어야 열린다.
4467
4517
  */
4468
4518
  const storefrontEditPreviewSchema = z.object({ hostname: z.string().nullable().describe("편집 미리보기 호스트 (예: `sfs-ab12cd34-preview.sayren.co`). 편집을 쓸 수 없으면 null") });
4469
4519
  /**
@@ -4510,7 +4560,7 @@ const storefrontSlugAvailabilitySchema = z.object({
4510
4560
  ]).nullable().describe("쓸 수 없는 이유. `INVALID` 형식 · `RESERVED` 예약어 · `TAKEN` 사용·보류 중 · `CURRENT` 지금 내 슬러그")
4511
4561
  });
4512
4562
  /**
4513
- * 배포 진행 — 사이트의 지금 발행 상태가 공개 주소에 반영되기까지의 단계와 기록이다(콘솔의 스토어프론트 만들기 3단계가 폴링한다).
4563
+ * 배포 진행 — 사이트의 지금 발행 상태가 공개 주소에 반영되기까지의 단계와 기록이다(상점 플랫폼의 스토어프론트 만들기 3단계가 폴링한다).
4514
4564
  * 만들기(`POST /v1/storefront/site`)는 곧바로 201로 답하고 반영은 그 뒤에 비동기로 하므로, 끝났는지는 이 조회로 본다.
4515
4565
  * 템플릿 사이트는 미리 빌드한 템플릿 산출물을 올리므로 빌드 단계가 없다. 기록은 사이트 상태에서 만든 요약이다.
4516
4566
  */
@@ -4556,7 +4606,7 @@ const storefrontDeploymentSchema = z.object({
4556
4606
  });
4557
4607
  const createStorefrontSiteRequestSchema = z.object({
4558
4608
  templateId: z.string().min(1).max(64).describe("템플릿 id"),
4559
- slug: storefrontSlugSchema.optional().describe("주소 슬러그. 생략하면 스토어 코드")
4609
+ slug: storefrontSlugSchema.optional().describe("주소 슬러그. 생략하면 상점 코드")
4560
4610
  });
4561
4611
  /** @deprecated 템플릿 변경은 지원하지 않는다(항상 409 `TEMPLATE_CHANGE_NOT_SUPPORTED`). 호환을 위해 스키마만 남겼다 */
4562
4612
  const changeStorefrontTemplateRequestSchema = z.object({
@@ -4583,7 +4633,7 @@ const setStorefrontVisibilityRequestSchema = z.object({
4583
4633
  const disableStorefrontHostingRequestSchema = z.object({ confirmSlug: z.string().min(1).describe("확인 입력 — 현재 슬러그") });
4584
4634
  const storefrontSlugAvailabilityQuerySchema = z.object({ slug: z.string().describe("확인할 슬러그") });
4585
4635
  /**
4586
- * 오픈 준비 중 미리보기 링크 — 콘솔에서 로그인한 OWNER·ADMIN만 받는다(PAT·에이전트 불가). 링크는 5분 안에 한 번 열면
4636
+ * 오픈 준비 중 미리보기 링크 — 상점 플랫폼에서 로그인한 OWNER·ADMIN만 받는다(PAT·에이전트 불가). 링크는 5분 안에 한 번 열면
4587
4637
  * 그 브라우저에 12시간짜리 미리보기 쿠키가 생기고 오픈 준비 중인 사이트의 실제 화면을 본다. 링크를 남에게 넘기면 그 사람도
4588
4638
  * 볼 수 있으므로 공유하지 않는다.
4589
4639
  */
@@ -4683,7 +4733,7 @@ const STOREFRONT_PUBLIC_SUFFIXES = [
4683
4733
  "cafe24.com",
4684
4734
  "imweb.me"
4685
4735
  ];
4686
- /** 스토어당 연결할 수 있는 도메인 수 기본값 — 요금제(#44) 전의 상한이다. 실제 값은 `GET …/domains`의 `limit` */
4736
+ /** 상점당 연결할 수 있는 도메인 수 기본값 — 요금제(#44) 전의 상한이다. 실제 값은 `GET …/domains`의 `limit` */
4687
4737
  const STOREFRONT_CUSTOM_DOMAIN_LIMIT_DEFAULT = 2;
4688
4738
  /** DNS를 넣을 때까지 기다리는 기간(일) — 지나면 `FAILED`(`DNS_NOT_CONFIGURED`) */
4689
4739
  const STOREFRONT_DOMAIN_DNS_WAIT_DAYS = 7;
@@ -4758,7 +4808,7 @@ const storefrontSiteDomainSchema = z.object({
4758
4808
  "ACTIVE",
4759
4809
  "FAILED"
4760
4810
  ]).nullable().describe("인증서 상태. 소유 확인 전·기본 주소는 null"),
4761
- failureCode: z.string().nullable().describe("실패·경고 코드. `DNS_NOT_CONFIGURED` 기한 안에 TXT를 찾지 못함 · `VALIDATION_TIMEOUT` 인증서 발급 기한 지남 · `CERTIFICATE_FAILED` 인증서 발급 실패 · `DNS_NOT_POINTING` 연결된 뒤 DNS가 이 서비스를 가리키지 않음(기한이 지나면 해제) · `DOMAIN_TAKEN` 다른 스토어가 먼저 소유를 확인함 · `HOSTNAME_BLOCKED` 연결이 막힘 · `HOSTNAME_CONFLICT` 연결 준비 중 충돌(운영 확인). 늘어날 수 있다"),
4811
+ failureCode: z.string().nullable().describe("실패·경고 코드. `DNS_NOT_CONFIGURED` 기한 안에 TXT를 찾지 못함 · `VALIDATION_TIMEOUT` 인증서 발급 기한 지남 · `CERTIFICATE_FAILED` 인증서 발급 실패 · `DNS_NOT_POINTING` 연결된 뒤 DNS가 이 서비스를 가리키지 않음(기한이 지나면 해제) · `DOMAIN_TAKEN` 다른 상점이 먼저 소유를 확인함 · `HOSTNAME_BLOCKED` 연결이 막힘 · `HOSTNAME_CONFLICT` 연결 준비 중 충돌(운영 확인). 늘어날 수 있다"),
4762
4812
  verifiedAt: z.string().nullable().describe("소유를 확인한 시각 (ISO 8601)"),
4763
4813
  activatedAt: z.string().nullable().describe("연결된 시각 (ISO 8601)"),
4764
4814
  checkedAt: z.string().nullable().describe("마지막으로 확인한 시각 (ISO 8601)"),
@@ -4767,7 +4817,7 @@ const storefrontSiteDomainSchema = z.object({
4767
4817
  /** `GET /v1/storefront/site/domains` — 사이트의 주소 목록(기본 주소 + 내 도메인)과 연결 설정 */
4768
4818
  const storefrontSiteDomainsSchema = z.object({
4769
4819
  enabled: z.boolean().describe("내 도메인을 추가할 수 있는가 (플랫폼 스위치)"),
4770
- limit: z.number().int().min(0).describe("스토어당 내 도메인 수 상한 (해제한 도메인은 세지 않는다)"),
4820
+ limit: z.number().int().min(0).describe("상점당 내 도메인 수 상한 (해제한 도메인은 세지 않는다)"),
4771
4821
  target: z.string().describe("CNAME 대상 (예: `sites.sayren.co`)"),
4772
4822
  domains: z.array(storefrontSiteDomainSchema).describe("대표 주소 먼저, 그다음 추가한 순서")
4773
4823
  });
@@ -4841,7 +4891,7 @@ const storefrontFileEncodingSchema = z.enum(["utf8", "base64"]).describe("`utf8`
4841
4891
  * 90초). `RUNNING`이면 미리보기와 파일 쓰기가 바로 반영된다(HMR).
4842
4892
  */
4843
4893
  const storefrontEditSessionStatusSchema = z.enum(["STARTING", "RUNNING"]).describe("`STARTING` 띄우는 중 · `RUNNING` 사용 중");
4844
- /** 편집 환경을 띄우는 단계 — 콘솔 진행 표시용이다. 값은 늘어날 수 있다 */
4894
+ /** 편집 환경을 띄우는 단계 — 상점 플랫폼 진행 표시용이다. 값은 늘어날 수 있다 */
4845
4895
  const STOREFRONT_EDIT_START_STAGES = [
4846
4896
  "CONTAINER",
4847
4897
  "RESTORE",
@@ -5121,7 +5171,7 @@ const storefrontVersionCreatedSchema = z.object({
5121
5171
  build: storefrontBuildSchema
5122
5172
  });
5123
5173
  /**
5124
- * `POST /v1/storefront/site/editing/preview-link` — 편집 미리보기(dev 서버) 링크. 콘솔에서 로그인한 OWNER·ADMIN만
5174
+ * `POST /v1/storefront/site/editing/preview-link` — 편집 미리보기(dev 서버) 링크. 상점 플랫폼에서 로그인한 OWNER·ADMIN만
5125
5175
  * 받는다(PAT·에이전트 불가). 5분 안에 열면 그 브라우저에 미리보기 호스트 전용 쿠키(12시간)가 생긴다. 편집 환경이
5126
5176
  * 없으면 409 `EDIT_SESSION_REQUIRED`다(편집 환경이 `STARTING`이면 링크는 주고, 미리보기 화면이 기동 대기를 보여 준다).
5127
5177
  */
@@ -5138,7 +5188,7 @@ const storefrontSourceRefSchema = z.string().regex(/^sources\/sfs_[a-z0-9]{8,40}
5138
5188
  const storefrontSourceSchema = z.object({
5139
5189
  siteId: z.string(),
5140
5190
  storeId: z.string(),
5141
- storeCode: z.string().describe("스토어 코드 — 로컬 개발 서버의 `SAYREN_STORE_CODE`"),
5191
+ storeCode: z.string().describe("상점 코드 — 로컬 개발 서버의 `SAYREN_STORE_CODE`"),
5142
5192
  sourceRef: storefrontSourceRefSchema,
5143
5193
  treeSha256: z.string().describe("트리 지문 (경로 오름차순 `{path}\\t{sha256}\\n`의 SHA-256)"),
5144
5194
  files: z.number().int().min(0).describe("파일 수"),
@@ -5203,8 +5253,8 @@ const storefrontSourceReplacedSchema = z.object({
5203
5253
  //#endregion
5204
5254
  //#region src/schemas/subscription.ts
5205
5255
  /**
5206
- * 요금제·구독 — `GET /v1/store/subscription`(스코프 `store:r`). 구독 단위는 스토어다.
5207
- * 결제 수단·청구 금액은 싣지 않는다. 요금제 변경은 셀러 콘솔에서만 한다.
5256
+ * 요금제·구독 — `GET /v1/store/subscription`(스코프 `store:r`). 구독 단위는 상점이다.
5257
+ * 결제 수단·청구 금액은 싣지 않는다. 요금제 변경은 상점 플랫폼에서만 한다.
5208
5258
  */
5209
5259
  /** 요금제 코드 — 이름(`plan.name`)이 바뀌어도 코드는 바뀌지 않는다. 값은 추가만 한다 */
5210
5260
  const planCodeSchema = z.enum([
@@ -5249,7 +5299,7 @@ const subscriptionUsageSchema = z.object({
5249
5299
  aiActions: z.number().int().describe("이번 기간 MCP(에이전트) 쓰기(AI 작업) 수"),
5250
5300
  aiReads: z.number().int().describe("이번 기간 MCP(에이전트) 읽기 수"),
5251
5301
  storefrontRequests: z.number().int().describe("이번 기간 스토어프론트 요청 수"),
5252
- adminApiRequests: z.number().int().describe("이번 기간 관리 API 요청 수(API 토큰·앱·에이전트 호출, 셀러 콘솔 제외)"),
5302
+ adminApiRequests: z.number().int().describe("이번 기간 관리 API 요청 수(API 토큰·앱·에이전트 호출, 상점 플랫폼 제외)"),
5253
5303
  emails: z.number().int().describe("이번 기간 초대·양도 알림 메일 수(한도 없음, 표시만)"),
5254
5304
  storefrontPreviewMinutes: z.number().int().describe("이번 기간 편집 미리보기 분(끝난 세션)"),
5255
5305
  storefrontBuildMinutes: z.number().int().describe("이번 기간 빌드 분(끝난 빌드)"),
@@ -5273,7 +5323,7 @@ const storeSubscriptionSchema = z.object({
5273
5323
  features: z.object({
5274
5324
  adminApi: z.boolean().describe("관리 API(개인 액세스 토큰·외부 앱 토큰 호출)를 쓸 수 있다"),
5275
5325
  analytics: z.boolean().describe("애널리틱스 조회를 쓸 수 있다"),
5276
- storeClone: z.boolean().describe("더 쓰지 않는다 — 스토어 복제 기능을 없애 항상 false"),
5326
+ storeClone: z.boolean().describe("더 쓰지 않는다 — 상점 복제 기능을 없애 항상 false"),
5277
5327
  removeBadge: z.boolean().describe("더 쓰지 않는다 — 배지 키를 없애 항상 false")
5278
5328
  }),
5279
5329
  usage: subscriptionUsageSchema,
@@ -5300,16 +5350,16 @@ const planErrorDetailsSchema = z.object({
5300
5350
  used: z.number().optional(),
5301
5351
  plan: responsePlanCodeSchema.optional(),
5302
5352
  resetsAt: z.string().optional().describe("월 한도가 초기화되는 시각(ISO 8601)"),
5303
- upgradeUrl: z.string().optional().describe("요금제 화면 주소(셀러 콘솔)"),
5304
- reason: z.string().optional().describe("스토어 수 한도의 이유 — `OWNED_STORES`(소유 스토어 수). `FREE_STORES`는 더 쓰지 않는다")
5353
+ upgradeUrl: z.string().optional().describe("요금제 화면 주소(상점 플랫폼)"),
5354
+ reason: z.string().optional().describe("상점 수 한도의 이유 — `OWNED_STORES`(소유 상점 수). `FREE_STORES`는 더 쓰지 않는다")
5305
5355
  }).loose();
5306
5356
  const limitOrContract = (description) => z.number().int().nullable().describe(`${description}. null이면 계약(엔터프라이즈)·한도 없음`);
5307
5357
  /**
5308
- * 요금제 기능 키 값 — 요금제 비교표·콘솔 요금제 화면이 쓴다. 키는 서버 판정의 기능 키와 같다(추가만 한다). 상위 요금제는 하위 요금제
5358
+ * 요금제 기능 키 값 — 요금제 비교표·상점 플랫폼 요금제 화면이 쓴다. 키는 서버 판정의 기능 키와 같다(추가만 한다). 상위 요금제는 하위 요금제
5309
5359
  * 기능을 모두 포함한다
5310
5360
  */
5311
5361
  const planEntitlementsSchema = z.object({
5312
- "features.admin_api": z.boolean().describe("관리 API(개인 액세스 토큰·외부 앱 토큰 호출). 셀러 콘솔·CLI·MCP는 모든 요금제에서 쓴다"),
5362
+ "features.admin_api": z.boolean().describe("관리 API(개인 액세스 토큰·외부 앱 토큰 호출). 상점 플랫폼·CLI·MCP는 모든 요금제에서 쓴다"),
5313
5363
  "features.analytics": z.boolean().describe("애널리틱스 화면·조회 API"),
5314
5364
  "limits.ai_reads_monthly": limitOrContract("MCP 읽기 월 한도"),
5315
5365
  "limits.ai_actions_monthly": limitOrContract("MCP 쓰기(AI 작업) 월 한도 — 주문 처리는 막지 않는다"),
@@ -5367,7 +5417,7 @@ function createStoreClient(options) {
5367
5417
  const token = resolveToken(tokenSource);
5368
5418
  return token ? { authorization: `Bearer ${token}` } : {};
5369
5419
  }
5370
- /** 계정 API(`/me/*`) — 스토어를 고르지 않는다 */
5420
+ /** 계정 API(`/me/*`) — 상점을 고르지 않는다 */
5371
5421
  const userHttp = createHttp({
5372
5422
  baseUrl: options.baseUrl,
5373
5423
  fetch: fetchFn,
@@ -5375,7 +5425,7 @@ function createStoreClient(options) {
5375
5425
  refresh,
5376
5426
  onUnauthorized
5377
5427
  });
5378
- /** 스토어 API — 같은 계정 토큰 + `X-Store-Id` */
5428
+ /** 상점 API — 같은 계정 토큰 + `X-Store-Id` */
5379
5429
  const storeHttp = createHttp({
5380
5430
  baseUrl: options.baseUrl,
5381
5431
  fetch: fetchFn,
@@ -5414,7 +5464,7 @@ function createStoreClient(options) {
5414
5464
  /** session.userinfo 패스스루 — session 미배선 시 명확한 에러를 던진다 */
5415
5465
  userinfo: () => requireSession().userinfo(),
5416
5466
  auth: {
5417
- /** 소속 스토어 목록 */
5467
+ /** 소속 상점 목록 */
5418
5468
  listMyStores: () => userHttp.request("GET", "/me/stores", z.array(myStoreSchema)),
5419
5469
  me: () => userHttp.request("GET", "/me", myAccountSchema)
5420
5470
  },
@@ -5488,7 +5538,7 @@ function createStoreClient(options) {
5488
5538
  savedOptionSets: {
5489
5539
  list: (params) => storeHttp.request("GET", "/saved-option-sets", pageSchema(savedOptionSetSchema), { query: params }),
5490
5540
  get: (optionSetId) => storeHttp.request("GET", path`/saved-option-sets/${optionSetId}`, savedOptionSetSchema),
5491
- /** 이름이 겹치면 409 `OPTION_SET_NAME_TAKEN`, 스토어당 200개를 넘으면 409 `OPTION_SET_LIMIT_EXCEEDED` */
5541
+ /** 이름이 겹치면 409 `OPTION_SET_NAME_TAKEN`, 상점당 200개를 넘으면 409 `OPTION_SET_LIMIT_EXCEEDED` */
5492
5542
  create: (body) => storeHttp.request("POST", "/saved-option-sets", savedOptionSetSchema, { body: savedOptionSetRequestSchema.parse(body) }),
5493
5543
  /** 통째로 바꾼다. 불러온 상품은 바뀌지 않는다 */
5494
5544
  update: (optionSetId, body) => storeHttp.request("PUT", path`/saved-option-sets/${optionSetId}`, savedOptionSetSchema, { body: savedOptionSetRequestSchema.parse(body) }),
@@ -5518,7 +5568,7 @@ function createStoreClient(options) {
5518
5568
  get: (orderId) => storeHttp.request("GET", path`/orders/${orderId}`, orderSchema),
5519
5569
  /**
5520
5570
  * `POST /v1/orders/{orderId}/cash-receipt/reissue` — 실패했거나 재시도 대기 중인 현금영수증을 지금 다시 발급·취소한다.
5521
- * 콘솔 OWNER·ADMIN 전용(PAT·M2M 403 `INSUFFICIENT_ROLE`). 404 `CASH_RECEIPT_NOT_FOUND`, 409 `CASH_RECEIPT_NOT_REISSUABLE`
5571
+ * 상점 플랫폼 OWNER·ADMIN 전용(PAT·M2M 403 `INSUFFICIENT_ROLE`). 404 `CASH_RECEIPT_NOT_FOUND`, 409 `CASH_RECEIPT_NOT_REISSUABLE`
5522
5572
  */
5523
5573
  reissueCashReceipt: (orderId) => storeHttp.request("POST", path`/orders/${orderId}/cash-receipt/reissue`, cashReceiptSchema)
5524
5574
  },
@@ -5553,7 +5603,7 @@ function createStoreClient(options) {
5553
5603
  } }),
5554
5604
  /**
5555
5605
  * 배송완료 처리 — `DISPATCHED`·`DELIVERING`만 넘어간다. 응답의 `autoDecisionDate`가 자동 구매확정 예정일이다
5556
- * (스토어 설정 `autoConfirmDays`가 0이면 null).
5606
+ * (상점 설정 `autoConfirmDays`가 0이면 null).
5557
5607
  */
5558
5608
  markDelivered: (orderItemId, idempotencyKey) => storeHttp.request("POST", path`/order-items/${orderItemId}/delivered`, orderItemSchema, { headers: idempotency(idempotencyKey) }),
5559
5609
  /** 배송완료 일괄 처리 — 항목별 부분 성공이다 */
@@ -5609,7 +5659,7 @@ function createStoreClient(options) {
5609
5659
  updateAnswer: (inquiryId, content) => storeHttp.requestVoid("PUT", path`/inquiries/${inquiryId}/answer`, { body: { content } })
5610
5660
  },
5611
5661
  /**
5612
- * 구매자 로그인 설정 — 이메일·비밀번호 허용, 소셜 공급자 연결. 비밀 값을 다루므로 콘솔에 로그인한 OWNER만 호출할 수 있다
5662
+ * 구매자 로그인 설정 — 이메일·비밀번호 허용, 소셜 공급자 연결. 비밀 값을 다루므로 상점 플랫폼에 로그인한 OWNER만 호출할 수 있다
5613
5663
  */
5614
5664
  loginSettings: {
5615
5665
  get: () => storeHttp.request("GET", "/store/login-settings", loginSettingsSchema),
@@ -5621,7 +5671,7 @@ function createStoreClient(options) {
5621
5671
  /** 연결 해제 — 키를 지운다. 연결된 구매자 계정은 남는다 */
5622
5672
  removeProvider: (provider) => storeHttp.request("DELETE", path`/store/auth-providers/${provider}`, loginSettingsSchema)
5623
5673
  },
5624
- /** 구매자 관리 — 조회 `customer:r`, 탈퇴 처리 `customer:rw`(콘솔 OWNER·ADMIN) */
5674
+ /** 구매자 관리 — 조회 `customer:r`, 탈퇴 처리 `customer:rw`(상점 플랫폼 OWNER·ADMIN) */
5625
5675
  customers: {
5626
5676
  list: (params) => storeHttp.request("GET", "/customers", pageSchema(customerSummarySchema), { query: params }),
5627
5677
  get: (customerId) => storeHttp.request("GET", path`/customers/${customerId}`, customerDetailSchema),
@@ -5719,8 +5769,8 @@ get: (params) => storeHttp.request("GET", "/sales-report", salesReportSchema, {
5719
5769
  get: (paymentId) => storeHttp.request("GET", path`/payments/${paymentId}`, paymentRecordDetailSchema)
5720
5770
  },
5721
5771
  /**
5722
- * 결제(PG) 설정 — **콘솔 OWNER 전용**. ADMIN·STAFF·PAT·M2M·3rd-party 앱 토큰은 스코프가 있어도
5723
- * 403 `INSUFFICIENT_ROLE`이다(조회 포함). OWNER 여부는 요청 시점의 스토어 멤버십으로 다시 확인하므로
5772
+ * 결제(PG) 설정 — **상점 플랫폼 OWNER 전용**. ADMIN·STAFF·PAT·M2M·3rd-party 앱 토큰은 스코프가 있어도
5773
+ * 403 `INSUFFICIENT_ROLE`이다(조회 포함). OWNER 여부는 요청 시점의 상점 멤버십으로 다시 확인하므로
5724
5774
  * 양도·강등 직후에도 바로 403이다. 비밀 값(시크릿 키·API Secret·웹훅 시크릿)은 요청으로만 보내고
5725
5775
  * 응답에는 `secrets[].masked`(앞 4자리 마스킹)만 나온다.
5726
5776
  */
@@ -5827,7 +5877,7 @@ get: (params) => storeHttp.request("GET", "/sales-report", salesReportSchema, {
5827
5877
  */
5828
5878
  sendTest: (webhookId, body) => storeHttp.request("POST", path`/webhooks/${webhookId}/test`, webhookTestResultSchema, { body: webhookTestRequestSchema.parse(body) })
5829
5879
  },
5830
- /** API 로그 (보관 7일, 콘솔 OWNER/ADMIN) */
5880
+ /** API 로그 (보관 7일, 상점 플랫폼 OWNER/ADMIN) */
5831
5881
  apiLogs: {
5832
5882
  /** 최신순 커서 페이지네이션. 다음 페이지는 응답의 `nextCursor`를 `cursor`로 넘긴다 */
5833
5883
  list: (params) => storeHttp.request("GET", "/api-logs", apiLogPageSchema, { query: params && {
@@ -5837,7 +5887,7 @@ get: (params) => storeHttp.request("GET", "/sales-report", salesReportSchema, {
5837
5887
  /** 최근 24시간 요청 수·에러 수 */
5838
5888
  summary: () => storeHttp.request("GET", "/api-logs/summary", apiLogSummarySchema)
5839
5889
  },
5840
- /** 감사 로그 (관리 API 쓰기의 행위자·대상·결과, 콘솔 OWNER/ADMIN, `audit:r`) */
5890
+ /** 감사 로그 (관리 API 쓰기의 행위자·대상·결과, 상점 플랫폼 OWNER/ADMIN, `audit:r`) */
5841
5891
  auditLogs: {
5842
5892
  /** 최신순 커서 페이지네이션. 다음 페이지는 응답의 `nextCursor`를 `cursor`로 넘긴다 */
5843
5893
  list: (params) => storeHttp.request("GET", "/audit-logs", auditLogPageSchema, { query: params && {
@@ -5845,7 +5895,7 @@ list: (params) => storeHttp.request("GET", "/audit-logs", auditLogPageSchema, {
5845
5895
  actorType: Array.isArray(params.actorType) ? params.actorType.join(",") || void 0 : params.actorType
5846
5896
  } }) },
5847
5897
  /**
5848
- * 승인 요청 — 에이전트의 고위험 쓰기가 202로 보류된 건. 목록·승인·거절은 콘솔 OWNER/ADMIN,
5898
+ * 승인 요청 — 에이전트의 고위험 쓰기가 202로 보류된 건. 목록·승인·거절은 상점 플랫폼 OWNER/ADMIN,
5849
5899
  * 단건 조회는 요청한 토큰도 할 수 있다(상태 확인용).
5850
5900
  */
5851
5901
  approvalRequests: {
@@ -5889,7 +5939,7 @@ list: (params) => storeHttp.request("GET", "/audit-logs", auditLogPageSchema, {
5889
5939
  checkSlug: (slug) => storeHttp.request("GET", "/storefront/slug-availability", storefrontSlugAvailabilitySchema, { query: { slug } }),
5890
5940
  /**
5891
5941
  * `POST /v1/storefront/site` (201) — 템플릿으로 사이트를 만들고 v1을 발행한다. 공개 상태는 오픈 준비 중이다.
5892
- * 사이트를 만드는 유일한 경로다(스토어를 만들어도 사이트는 생기지 않는다). 템플릿은 여기서만 고른다
5942
+ * 사이트를 만드는 유일한 경로다(상점을 만들어도 사이트는 생기지 않는다). 템플릿은 여기서만 고른다
5893
5943
  */
5894
5944
  create: (body) => storeHttp.request("POST", "/storefront/site", storefrontSiteSchema, { body: createStorefrontSiteRequestSchema.parse(body) }),
5895
5945
  /** `GET /v1/storefront/site/deployment` — 배포 진행(단계·기록). 만든 뒤 반영이 끝날 때까지 폴링한다 */
@@ -5914,7 +5964,7 @@ list: (params) => storeHttp.request("GET", "/audit-logs", auditLogPageSchema, {
5914
5964
  setVisibility: (body) => storeHttp.request("PUT", "/storefront/site/visibility", storefrontSiteSchema, { body: setStorefrontVisibilityRequestSchema.parse(body) }),
5915
5965
  /**
5916
5966
  * `POST /v1/storefront/site/preview-link` — 오픈 준비 중인 사이트를 구성원이 볼 수 있는 5분짜리 링크.
5917
- * 콘솔에서 로그인한 OWNER·ADMIN만 받는다
5967
+ * 상점 플랫폼에서 로그인한 OWNER·ADMIN만 받는다
5918
5968
  */
5919
5969
  createPreviewLink: (body = {}) => storeHttp.request("POST", "/storefront/site/preview-link", storefrontPreviewLinkSchema, { body: createStorefrontPreviewLinkRequestSchema.parse(body) }),
5920
5970
  /** `GET /v1/storefront/site/domains` — 주소 목록(기본 주소 + 내 도메인)과 DNS 안내 */
@@ -5943,7 +5993,7 @@ list: (params) => storeHttp.request("GET", "/audit-logs", auditLogPageSchema, {
5943
5993
  stopEditing: () => storeHttp.request("DELETE", "/storefront/site/editing", storefrontEditingSchema),
5944
5994
  /**
5945
5995
  * `POST /v1/storefront/site/editing/preview-link` — 편집 미리보기(dev 서버) 5분짜리 링크.
5946
- * 콘솔에서 로그인한 OWNER·ADMIN만 받는다(에이전트 불가)
5996
+ * 상점 플랫폼에서 로그인한 OWNER·ADMIN만 받는다(에이전트 불가)
5947
5997
  */
5948
5998
  createEditPreviewLink: (body = {}) => storeHttp.request("POST", "/storefront/site/editing/preview-link", storefrontPreviewLinkSchema, { body: createStorefrontEditPreviewLinkRequestSchema.parse(body) }),
5949
5999
  /** `GET /v1/storefront/site/files?prefix=` — 작업 트리 파일 목록 */
@@ -5994,7 +6044,7 @@ list: (params) => storeHttp.request("GET", "/audit-logs", auditLogPageSchema, {
5994
6044
  subscription: {
5995
6045
  /**
5996
6046
  * `GET /v1/store/subscription` — 스코프 `store:r`. 현재 요금제·상태·사용량 기간·한도·이번 기간 사용량.
5997
- * 결제 수단·청구 금액은 싣지 않는다. 요금제 변경은 셀러 콘솔에서만 한다
6047
+ * 결제 수단·청구 금액은 싣지 않는다. 요금제 변경은 상점 플랫폼에서만 한다
5998
6048
  */
5999
6049
  get: () => storeHttp.request("GET", "/store/subscription", storeSubscriptionSchema) },
6000
6050
  plans: {
@@ -6018,7 +6068,7 @@ listPublic: () => storeHttp.request("GET", "/public/plans", publicPlansSchema) }
6018
6068
  listInvitations: (params) => storeHttp.request("GET", "/store/invitations", z.array(invitationSchema), { query: params }),
6019
6069
  /**
6020
6070
  * `POST /v1/store/invitations` (201) — 스코프 `member:rw`. 초대 메일을 보낸다. 발송 결과는 응답의
6021
- * `deliveryStatus`다(발송이 실패해도 초대는 만들어진다). 스토어·초대한 사람·받는 주소별 발송 한도가 있다(429, `details.limit`).
6071
+ * `deliveryStatus`다(발송이 실패해도 초대는 만들어진다). 상점·초대한 사람·받는 주소별 발송 한도가 있다(429, `details.limit`).
6022
6072
  */
6023
6073
  invite: (body) => storeHttp.request("POST", "/store/invitations", invitationSchema, { body: inviteMemberRequestSchema.parse(body) }),
6024
6074
  /** `POST /v1/store/invitations/{invitationId}/resend` — 새 수락 링크로 다시 보낸다. 이전 링크는 무효가 되고 만료가 다시 7일이 된다 */
@@ -6139,10 +6189,10 @@ const customerDelegationSchema = z.object({
6139
6189
  //#endregion
6140
6190
  //#region src/schemas/scope.ts
6141
6191
  /**
6142
- * 스토어 스코프 카탈로그 (auth-spec §7) — 형식 `{리소스}:{r|rw}`, rw는 r을 함의한다.
6192
+ * 상점 스코프 카탈로그 (auth-spec §7) — 형식 `{리소스}:{r|rw}`, rw는 r을 함의한다.
6143
6193
  *
6144
6194
  * 관리 API가 요구하는 스코프와 역할별 자동 부여 스코프의 **단일 원천**이다.
6145
- * 서버(apps/api)가 이 상수를 그대로 가져다 역할→스코프를 산출하므로, 콘솔 권한 매트릭스와
6195
+ * 서버(apps/api)가 이 상수를 그대로 가져다 역할→스코프를 산출하므로, 상점 플랫폼 권한 매트릭스와
6146
6196
  * 서버 인가가 갈라지지 않는다.
6147
6197
  */
6148
6198
  const scopeAccessSchema = z.enum(["r", "rw"]).describe("접근 수준. `r`=읽기, `rw`=읽기+쓰기(r을 함의)");
@@ -6173,7 +6223,7 @@ function isStoreScope(scope) {
6173
6223
  }
6174
6224
  /**
6175
6225
  * 역할별 자동 부여 스코프 (auth-spec §7).
6176
- * 계정 토큰으로 스토어를 호출할 때의 스코프는 그 스토어에서의 역할로 이 표에서 결정된다.
6226
+ * 계정 토큰으로 상점을 호출할 때의 스코프는 그 상점에서의 역할로 이 표에서 결정된다.
6177
6227
  */
6178
6228
  const STORE_ROLE_SCOPES = {
6179
6229
  OWNER: [
@@ -6230,7 +6280,7 @@ const STORE_ROLE_SCOPES = {
6230
6280
  * 세는 것이다. 그 숫자가 규칙과 안내를 고치는 근거가 된다.
6231
6281
  *
6232
6282
  * **보내지 않는 것**: 파일 경로·소스 코드·위반 상세(`detail`)·토큰·사람 식별자. 규칙 id와 개수뿐이다.
6233
- * 테넌트는 요청 토큰이 정한다(본문에 스토어 id가 없다). 옵트아웃은 클라이언트의 `SAYREN_TELEMETRY=0`이다.
6283
+ * 테넌트는 요청 토큰이 정한다(본문에 상점 id가 없다). 옵트아웃은 클라이언트의 `SAYREN_TELEMETRY=0`이다.
6234
6284
  *
6235
6285
  * 알 수 없는 키는 저장하지 않고 버린다(`.strict()`를 쓰지 않는다) — 새 버전 클라이언트가 필드를
6236
6286
  * 하나 더 실었다고 계측 전체가 400으로 날아가면 그 버전의 숫자가 통째로 빈다.
@@ -6263,7 +6313,7 @@ const mcpToolEventSchema = z.object({
6263
6313
  const envelopeFields = {
6264
6314
  id: z.string().describe("이벤트 ID (`evt_…`, 테스트 전송은 `evt_test_…`). 중복 제거 키"),
6265
6315
  createdAt: z.string().describe("이벤트 발생 일시 (ISO 8601)"),
6266
- storeId: z.string().describe("이벤트가 발생한 스토어 ID"),
6316
+ storeId: z.string().describe("이벤트가 발생한 상점 ID"),
6267
6317
  sequence: z.number().int().positive().optional().describe("리소스별 순번. 같은 주문·클레임·문의·리뷰·상품의 이벤트마다 1씩 커진다. 도착 순서는 보장하지 않으므로 같은 리소스의 이벤트는 이 값으로 정렬한다. 이 필드가 생기기 전의 이벤트와 테스트 전송에는 없다")
6268
6318
  };
6269
6319
  const orderWebhookEventDataSchema = z.object({
@@ -6577,4 +6627,4 @@ function createStoreSession(options) {
6577
6627
  };
6578
6628
  }
6579
6629
  //#endregion
6580
- export { APPROVAL_ALREADY_DECIDED_CODE, APPROVAL_REQUIRED_CODE, ApiError, ApprovalPendingError, CASH_RECEIPT_STATUS_VALUES, COUPON_CODE_PATTERN, COUPON_CONDITIONS_DEFAULTS, COUPON_TARGET_ALL, COUPON_TARGET_LIST_MAX, CUSTOM_INPUT_FORBIDDEN_WORDS, FULFILLMENT_RULES, MAX_ADDON_GROUPS, MAX_ANALYTICS_ALLOWED_ORIGINS, MAX_AUTO_TRANSITION_DAYS, MAX_CUSTOM_INPUTS, MAX_CUSTOM_INPUT_LENGTH, MAX_OPTION_GROUPS, MAX_PRODUCT_IMAGES, MAX_SAVED_OPTION_SETS, MAX_SAVED_OPTION_SET_NAME, MAX_VALUES_PER_GROUP, MAX_VARIANTS, MCP_TELEMETRY_MAX_RESULTS, MIN_PAYMENT_AMOUNT, NO_COUPON_SETTLEMENT, NO_SHIPPING_BUNDLE_KEY, PAYMENT_ROUTING_EXCLUSION_CODES, PORTONE_CHANNEL_NAME_MAX_LENGTH, PORTONE_MAX_CHANNELS, PORTONE_MIN_CHANNELS, REFUND_POLICY_DEFAULTS, REFUND_POLICY_DELIVERY_FEE_KEYS, REMOTE_AREA_ZIP_RANGES, RESERVED_STOREFRONT_SLUGS, RESERVED_STORE_CODES, SHIPPING_POLICY_DEFAULTS, STOREFRONT_BLOCKED_PATH_SEGMENTS, STOREFRONT_BUILD_STAGES, STOREFRONT_BUILD_TERMINAL_STATUSES, STOREFRONT_CHECK_TERMINAL_STATUSES, STOREFRONT_CUSTOM_DOMAIN_LIMIT_DEFAULT, STOREFRONT_DOMAIN_DNS_GRACE_DAYS, STOREFRONT_DOMAIN_DNS_WAIT_DAYS, STOREFRONT_DOMAIN_TXT_LABEL, STOREFRONT_EDIT_ACTIVITY_TIMEOUT_MINUTES, STOREFRONT_EDIT_CAPACITY, STOREFRONT_EDIT_IDLE_MINUTES, STOREFRONT_EDIT_PREVIEW_SUFFIX, STOREFRONT_EDIT_START_STAGES, STOREFRONT_FILE_BATCH_MAX, STOREFRONT_FILE_MAX_BYTES, STOREFRONT_PATH_SEGMENT_PATTERN, STOREFRONT_PLATFORM_DOMAINS, STOREFRONT_PUBLIC_SUFFIXES, STOREFRONT_SEARCH_REGEX_MAX_LENGTH, STOREFRONT_SHOWCASE_SLUG_PREFIX, STOREFRONT_SITE_CREATE_LIMIT, STOREFRONT_SLUG_CHANGE_LIMIT, STOREFRONT_SLUG_CHANGE_WINDOW_DAYS, STOREFRONT_SLUG_HOLD_DAYS, STOREFRONT_SLUG_PATTERN, STOREFRONT_SOURCE_BLOB_BATCH_MAX, STOREFRONT_SOURCE_PART_BYTES, STOREFRONT_WORKSPACE_MAX_BYTES, STOREFRONT_WORKSPACE_MAX_FILES, STORE_CODE_PATTERN, STORE_ROLE_SCOPES, STORE_SCOPE_RESOURCES, STORE_SESSION_KEYS, TOSS_WIDGET_CLIENT_KEY_PATTERN, TOSS_WIDGET_KEY_MESSAGE, TOSS_WIDGET_SECRET_KEY_PATTERN, UPLOAD_PURPOSE_LIMITS, VARIANT_COUNT_WARNING, VARIANT_STOCK_EXCLUSIVE_MESSAGE, WEBHOOK_DEFAULT_TOLERANCE_SEC, WEBHOOK_DELIVERY_ID_HEADER, WEBHOOK_EVENT_ID_HEADER, WEBHOOK_EVENT_TYPE_HEADER, WEBHOOK_FAILURE_REASONS, WEBHOOK_HEADERS, WEBHOOK_PAYLOAD_EXCERPT_MAX_BYTES, WEBHOOK_RESOURCE_TYPES, WEBHOOK_SIGNATURE_HEADER, WEBHOOK_USER_AGENT, addStorefrontDomainRequestSchema, addonGroupRequestSchema, addonGroupSchema, addonValueRequestSchema, addonValueSchema, addressChangeRequestListSchema, addressTypeSchema, agentPolicyDecisionSchema, allocateByWeight, analyticsChannelSchema, analyticsCheckoutOutcomeSchema, analyticsCheckoutSchema, analyticsDeviceRowSchema, analyticsDevicesSchema, analyticsFunnelStepSchema, analyticsOriginSchema, analyticsOverviewSchema, analyticsPagesQuerySchema, analyticsPagesSchema, analyticsProductRowSchema, analyticsProductSortSchema, analyticsProductsQuerySchema, analyticsProductsSchema, analyticsRangeQuerySchema, analyticsRealtimeSchema, analyticsSearchQuerySchema, analyticsSearchSchema, analyticsSourceGroupBySchema, analyticsSourceRowSchema, analyticsSourcesQuerySchema, analyticsSourcesSchema, analyticsTotalsSchema, apiLogErrorSchema, apiLogListQuerySchema, apiLogPageSchema, apiLogPrincipalSchema, apiLogPrincipalTypeSchema, apiLogSchema, apiLogStatusFilterSchema, apiLogSummarySchema, approvalDecisionRequestSchema, approvalListQuerySchema, approvalPageSchema, approvalRequestSchema, approvalStatusSchema, approveClaimResultSchema, auditActorSchema, auditActorTypeSchema, auditLogListQuerySchema, auditLogOutcomeSchema, auditLogPageSchema, auditLogSchema, auditLogSourceSchema, buildAuthorizeUrl, buildQuery, bulkResultSchema, cancelBySellerRequestSchema, cancelBySellerResultSchema, carrierSchema, cashReceiptSchema, categoryAttributeSchema, categoryCreateRequestSchema, categoryDeleteQuerySchema, categoryDeleteStrategySchema, categoryListQuerySchema, categoryPatchRequestSchema, categoryProductSortSchema, categorySchema, categorySearchResultSchema, categoryTreeNodeSchema, categoryWithPathSchema, changeStorefrontSlugRequestSchema, changeStorefrontTemplateRequestSchema, changeTypeSchema, claimDetailSchema, claimHoldResultSchema, claimListQuerySchema, claimReasonSchema, claimReturnAddressSchema, claimSchema, claimStatusSchema, claimTypeSchema, claimWebhookEventDataSchema, claimWebhookEventSchema, consentActionSchema, consentKindSchema, consentSourceSchema, couponBenefitSchema, couponConditionsInputSchema, couponConditionsSchema, couponDiscountOf, couponIssueListQuerySchema, couponIssueMethodSchema, couponIssueSchema, couponIssueStatusSchema, couponKindSchema, couponListQuerySchema, couponRedemptionListQuerySchema, couponRedemptionSchema, couponRejectReasonSchema, couponRuleSchema, couponSchema, couponStatsSchema, couponStatusSchema, couponTargetInputSchema, couponTargetSchema, createCouponRequestSchema, createPkcePair, createStoreClient, createStoreSession, createStorefrontEditPreviewLinkRequestSchema, createStorefrontPreviewLinkRequestSchema, createStorefrontSiteRequestSchema, createStorefrontVersionRequestSchema, customInputLabelForbiddenWord, customInputRequestSchema, customInputSchema, customInputValueSchema, customerAddressSchema, customerConsentListQuerySchema, customerConsentSchema, customerConsentStateSchema, customerConsentsSchema, customerCouponSchema, customerDelegationRequestSchema, customerDelegationSchema, customerDetailSchema, customerInquiryCategorySchema, customerInquiryListQuerySchema, customerListQuerySchema, customerOrderSchema, customerSortSchema, customerStatsSchema, customerSummarySchema, customerWithdrawalBlockedDetailsSchema, deleteStorefrontFileRequestSchema, deliveryBundleKeyOf, deliveryFeeWaiverSchema, deliveryInfoSchema, deliveryMethodSchema, deliveryStatusSchema, deliveryTypeSchema, disableStorefrontHostingRequestSchema, discountRequestSchema, discountSchema, dispatchRequestSchema, easyPayProviderResponseSchema, easyPayProviderSchema, eventTypeSchema, exchangeAuthorizationCode, fulfillBulkRequestSchema, fulfillRequestSchema, fulfillmentRuleOf, fulfillmentTypeOf, fulfillmentTypeResponseSchema, fulfillmentTypeSchema, holdOrderItemRequestSchema, inquiryListQuerySchema, inquirySchema, inquiryWebhookEventDataSchema, inquiryWebhookEventSchema, invitationDeliveryStatusSchema, invitationListQuerySchema, invitationSchema, inviteMemberRequestSchema, isCouponTargetLine, isEditableStorefrontPath, isReservedStoreCode, isReservedStorefrontSlug, isShowcaseStorefrontSlug, isStoreScope, isWebOrigin, issueCouponRequestSchema, issueCouponResultSchema, liveGateConditionCodeSchema, liveGateConditionSchema, liveGateErrorDetailsSchema, liveGateSchema, loginProviderSchema, loginProviderStatusSchema, loginProviderTestSchema, loginSettingsSchema, maskedSecretSchema, mcpRuleResultSchema, mcpToolEventSchema, moveStorefrontFileRequestSchema, myAccountSchema, myStoreSchema, normalizeCouponCode, normalizeStorefrontHostname, normalizeStorefrontPath, oauthTokenResponseSchema, openFulfillmentUnion, optionGroupKindSchema, optionGroupRequestSchema, optionGroupSchema, optionModelRequestSchema, optionModelSchema, optionSelectionSchema, optionSortSchema, optionValueRequestSchema, optionValueSchema, orderCanceledWebhookEventDataSchema, orderCanceledWebhookEventSchema, orderDiscountSchema, orderFulfilledWebhookEventDataSchema, orderFulfilledWebhookEventSchema, orderItemFulfillmentSchema, orderItemFulfillmentSnapshotResponseSchema, orderItemFulfillmentSnapshotSchema, orderItemListQuerySchema, orderItemMemoResultSchema, orderItemPageSchema, orderItemSchema, orderItemStatusSchema, orderListQuerySchema, orderSchema, orderSummaryPageSchema, orderSummarySchema, orderWebhookEventDataSchema, orderWebhookEventSchema, pageInfoSchema, pageQueryShape, pageSchema, paymentAttemptRecordSchema, paymentAttemptStatusSchema, paymentCredentialSetSchema, paymentListQuerySchema, paymentProviderSchema, paymentProviderVerificationSchema, paymentRecordDetailSchema, paymentRecordPageSchema, paymentRecordSchema, paymentRecordStatusSchema, paymentRefundRecordSchema, paymentSettingsSchema, pgEnvironmentSchema, pgPaymentMethodSchema, pgProviderSchema, pgVerificationResultSchema, planCodeSchema, planEntitlementsSchema, planErrorDetailsSchema, policyDocumentUrlSchema, policyVersionSchema, portOneChannelSchema, portOneCredentialsInputSchema, productCreateRequestSchema, productFulfillmentCreateSchema, productFulfillmentResponseSchema, productFulfillmentSchema, productFulfillmentUpdateSchema, productImageRejection, productImageUrlSchema, productListQuerySchema, productOutOfStockWebhookEventDataSchema, productOutOfStockWebhookEventSchema, productPatchRequestSchema, productRefundPolicyOverride, productRefundPolicyPatchSchema, productReplaceRequestSchema, productSchema, productSortSchema, productStatusSchema, productSummarySchema, productVariantRequestSchema, productVariantSchema, proratedPaidRefundBase, proratedRefundBase, publicPlanSchema, publicPlansSchema, publishStorefrontVersionRequestSchema, purchaseDecisionExtendResultSchema, purchaseDecisionRequestResultSchema, quoteDelivery, quotePricing, refreshUserToken, refundPolicyPatchSchema, refundPolicySchema, rejectClaimRequestSchema, remoteAreaLabelOf, remoteAreaOf, remoteAreaSchema, remoteSurchargeOf, replaceStorefrontSourceRequestSchema, requiresCollection, requiresShipping, resolveRefundPolicy, resolveShippingPolicy, responsePlanCodeSchema, reviewListQuerySchema, reviewReportResultSchema, reviewSchema, reviewSortSchema, reviewWebhookEventDataSchema, reviewWebhookEventSchema, rollbackStorefrontRequestSchema, runStorefrontCheckRequestSchema, salesReportGroupBySchema, salesReportQuerySchema, salesReportRowSchema, salesReportSchema, salesTotalsSchema, saveLoginProviderRequestSchema, savedCustomInputRequestSchema, savedCustomInputSchema, savedOptionGroupRequestSchema, savedOptionGroupSchema, savedOptionSetCompositionSchema, savedOptionSetFromProductRequestSchema, savedOptionSetFromProductResultSchema, savedOptionSetListQuerySchema, savedOptionSetRequestSchema, savedOptionSetSchema, savedOptionSetSortSchema, savedOptionValueRequestSchema, savedOptionValueSchema, scopeAccessSchema, searchStorefrontFilesRequestSchema, sellerAddressListQuerySchema, sellerAddressRequestSchema, sellerAddressSchema, sellerCustomerInquirySchema, setStorefrontVisibilityRequestSchema, settleCouponShortfall, settlementDetailQuerySchema, settlementDetailSchema, settlementListQuerySchema, settlementStatusSchema, settlementSummarySchema, settlementWithDetailsSchema, shippingAddressSchema, shippingPolicyPatchSchema, shippingPolicySchema, storeCodeSchema, storeMemberRoleUpdatedSchema, storeMemberSchema, storeRoleSchema, storeSchema, storeScopeResourceSchema, storeSubscriptionSchema, storefrontBuildDependenciesSchema, storefrontBuildListQuerySchema, storefrontBuildSchema, storefrontBuildStatusSchema, storefrontCheckSchema, storefrontCheckStatusSchema, storefrontCustomDomainStatusSchema, storefrontCustomHostnameProblem, storefrontDependencyFindingSchema, storefrontDeploymentLogSchema, storefrontDeploymentSchema, storefrontDeploymentStepSchema, storefrontDnsRecordSchema, storefrontDomainSchema, storefrontDomainTxtNameOf, storefrontEditPreviewLabelOf, storefrontEditPreviewSchema, storefrontEditSessionSchema, storefrontEditSessionStatusSchema, storefrontEditingSchema, storefrontFileConflictDetailsSchema, storefrontFileContentQuerySchema, storefrontFileContentSchema, storefrontFileDeleteResultSchema, storefrontFileEncodingSchema, storefrontFileEntrySchema, storefrontFileHashSchema, storefrontFileListQuerySchema, storefrontFileListSchema, storefrontFileMoveResultSchema, storefrontFilePathSchema, storefrontFileSearchResultSchema, storefrontFileWriteResultSchema, storefrontHostingSchema, storefrontPreviewLinkSchema, storefrontProvisioningSchema, storefrontRuleResultSchema, storefrontRuleSeveritySchema, storefrontSiteDomainSchema, storefrontSiteDomainsSchema, storefrontSiteSchema, storefrontSiteStatusSchema, storefrontSlugAvailabilityQuerySchema, storefrontSlugAvailabilitySchema, storefrontSlugSchema, storefrontSourceArchivePartSchema, storefrontSourceArchiveQuerySchema, storefrontSourceBlobsResultSchema, storefrontSourceModeSchema, storefrontSourceRefSchema, storefrontSourceReplacedSchema, storefrontSourceSchema, storefrontSuspensionSchema, storefrontTemplateSchema, storefrontVerifyReportSchema, storefrontVersionCreatedSchema, storefrontVersionSchema, storefrontVersionStatusSchema, storefrontVisibilitySchema, subscriptionLimitsSchema, subscriptionStatusSchema, subscriptionUsageSchema, tossPaymentsCredentialsInputSchema, trackingStageResponseSchema, trackingUpdateResultSchema, updateCouponRequestSchema, updateLoginProviderRequestSchema, updateLoginSettingsRequestSchema, updateMemberRoleRequestSchema, updatePaymentProviderRequestSchema, updatePaymentSettingsRequestSchema, updateStoreRequestSchema, uploadExtensionOf, uploadPurposeSchema, uploadRejection, uploadRequestSchema, uploadStorefrontSourceBlobsRequestSchema, uploadTicketSchema, upsertPortOneProviderRequestSchema, upsertTossPaymentsProviderRequestSchema, variantStockRequestSchema, variantStockSchema, verifyPaymentProviderRequestSchema, webhookCreatedSchema, webhookDeliveryDetailSchema, webhookDeliveryErrorCodeSchema, webhookDeliveryListQuerySchema, webhookDeliveryResourceSchema, webhookDeliverySchema, webhookDeliveryStatusSchema, webhookEventSchema, webhookFailureReasonSchema, webhookRedeliverFailedResultSchema, webhookRequestHeaderSchema, webhookRequestSchema, webhookResourceTypeSchema, webhookSchema, webhookSecretRotatedSchema, webhookStatusSchema, webhookTestRequestSchema, webhookTestResultSchema, withdrawCustomerRequestSchema, writeDryRunResultSchema, writePreviewSchema, writeStorefrontFilesRequestSchema };
6630
+ export { APPROVAL_ALREADY_DECIDED_CODE, APPROVAL_REQUIRED_CODE, ApiError, ApprovalPendingError, BUSINESS_INFO_MAX_LENGTH, BUSINESS_NUMBER_PATTERN, CASH_RECEIPT_STATUS_VALUES, COUPON_CODE_PATTERN, COUPON_CONDITIONS_DEFAULTS, COUPON_TARGET_ALL, COUPON_TARGET_LIST_MAX, CUSTOM_INPUT_FORBIDDEN_WORDS, FULFILLMENT_RULES, MAX_ADDON_GROUPS, MAX_ANALYTICS_ALLOWED_ORIGINS, MAX_AUTO_TRANSITION_DAYS, MAX_CUSTOM_INPUTS, MAX_CUSTOM_INPUT_LENGTH, MAX_OPTION_GROUPS, MAX_PRODUCT_IMAGES, MAX_SAVED_OPTION_SETS, MAX_SAVED_OPTION_SET_NAME, MAX_VALUES_PER_GROUP, MAX_VARIANTS, MCP_TELEMETRY_MAX_RESULTS, MIN_PAYMENT_AMOUNT, NO_COUPON_SETTLEMENT, NO_SHIPPING_BUNDLE_KEY, PAYMENT_ROUTING_EXCLUSION_CODES, PORTONE_CHANNEL_NAME_MAX_LENGTH, PORTONE_MAX_CHANNELS, PORTONE_MIN_CHANNELS, REFUND_POLICY_DEFAULTS, REFUND_POLICY_DELIVERY_FEE_KEYS, REMOTE_AREA_ZIP_RANGES, RESERVED_STOREFRONT_SLUGS, RESERVED_STORE_CODES, SHIPPING_POLICY_DEFAULTS, STOREFRONT_BLOCKED_PATH_SEGMENTS, STOREFRONT_BUILD_STAGES, STOREFRONT_BUILD_TERMINAL_STATUSES, STOREFRONT_CHECK_TERMINAL_STATUSES, STOREFRONT_CUSTOM_DOMAIN_LIMIT_DEFAULT, STOREFRONT_DOMAIN_DNS_GRACE_DAYS, STOREFRONT_DOMAIN_DNS_WAIT_DAYS, STOREFRONT_DOMAIN_TXT_LABEL, STOREFRONT_EDIT_ACTIVITY_TIMEOUT_MINUTES, STOREFRONT_EDIT_CAPACITY, STOREFRONT_EDIT_IDLE_MINUTES, STOREFRONT_EDIT_PREVIEW_SUFFIX, STOREFRONT_EDIT_START_STAGES, STOREFRONT_FILE_BATCH_MAX, STOREFRONT_FILE_MAX_BYTES, STOREFRONT_PATH_SEGMENT_PATTERN, STOREFRONT_PLATFORM_DOMAINS, STOREFRONT_PUBLIC_SUFFIXES, STOREFRONT_SEARCH_REGEX_MAX_LENGTH, STOREFRONT_SHOWCASE_SLUG_PREFIX, STOREFRONT_SITE_CREATE_LIMIT, STOREFRONT_SLUG_CHANGE_LIMIT, STOREFRONT_SLUG_CHANGE_WINDOW_DAYS, STOREFRONT_SLUG_HOLD_DAYS, STOREFRONT_SLUG_PATTERN, STOREFRONT_SOURCE_BLOB_BATCH_MAX, STOREFRONT_SOURCE_PART_BYTES, STOREFRONT_WORKSPACE_MAX_BYTES, STOREFRONT_WORKSPACE_MAX_FILES, STORE_CODE_PATTERN, STORE_ROLE_SCOPES, STORE_SCOPE_RESOURCES, STORE_SESSION_KEYS, TOSS_WIDGET_CLIENT_KEY_PATTERN, TOSS_WIDGET_KEY_MESSAGE, TOSS_WIDGET_SECRET_KEY_PATTERN, UPLOAD_PURPOSE_LIMITS, VARIANT_COUNT_WARNING, VARIANT_STOCK_EXCLUSIVE_MESSAGE, WEBHOOK_DEFAULT_TOLERANCE_SEC, WEBHOOK_DELIVERY_ID_HEADER, WEBHOOK_EVENT_ID_HEADER, WEBHOOK_EVENT_TYPE_HEADER, WEBHOOK_FAILURE_REASONS, WEBHOOK_HEADERS, WEBHOOK_PAYLOAD_EXCERPT_MAX_BYTES, WEBHOOK_RESOURCE_TYPES, WEBHOOK_SIGNATURE_HEADER, WEBHOOK_USER_AGENT, addStorefrontDomainRequestSchema, addonGroupRequestSchema, addonGroupSchema, addonValueRequestSchema, addonValueSchema, addressChangeRequestListSchema, addressTypeSchema, agentPolicyDecisionSchema, allocateByWeight, analyticsChannelSchema, analyticsCheckoutOutcomeSchema, analyticsCheckoutSchema, analyticsDeviceRowSchema, analyticsDevicesSchema, analyticsFunnelStepSchema, analyticsOriginSchema, analyticsOverviewSchema, analyticsPagesQuerySchema, analyticsPagesSchema, analyticsProductRowSchema, analyticsProductSortSchema, analyticsProductsQuerySchema, analyticsProductsSchema, analyticsRangeQuerySchema, analyticsRealtimeSchema, analyticsSearchQuerySchema, analyticsSearchSchema, analyticsSourceGroupBySchema, analyticsSourceRowSchema, analyticsSourcesQuerySchema, analyticsSourcesSchema, analyticsTotalsSchema, apiLogErrorSchema, apiLogListQuerySchema, apiLogPageSchema, apiLogPrincipalSchema, apiLogPrincipalTypeSchema, apiLogSchema, apiLogStatusFilterSchema, apiLogSummarySchema, approvalDecisionRequestSchema, approvalListQuerySchema, approvalPageSchema, approvalRequestSchema, approvalStatusSchema, approveClaimResultSchema, auditActorSchema, auditActorTypeSchema, auditLogListQuerySchema, auditLogOutcomeSchema, auditLogPageSchema, auditLogSchema, auditLogSourceSchema, buildAuthorizeUrl, buildQuery, bulkResultSchema, businessInfoPatchShape, businessInfoResponseShape, businessNumberSchema, cancelBySellerRequestSchema, cancelBySellerResultSchema, carrierSchema, cashReceiptSchema, categoryAttributeSchema, categoryCreateRequestSchema, categoryDeleteQuerySchema, categoryDeleteStrategySchema, categoryListQuerySchema, categoryPatchRequestSchema, categoryProductSortSchema, categorySchema, categorySearchResultSchema, categoryTreeNodeSchema, categoryWithPathSchema, changeStorefrontSlugRequestSchema, changeStorefrontTemplateRequestSchema, changeTypeSchema, claimDetailSchema, claimHoldResultSchema, claimListQuerySchema, claimReasonSchema, claimReturnAddressSchema, claimSchema, claimStatusSchema, claimTypeSchema, claimWebhookEventDataSchema, claimWebhookEventSchema, consentActionSchema, consentKindSchema, consentSourceSchema, couponBenefitSchema, couponConditionsInputSchema, couponConditionsSchema, couponDiscountOf, couponIssueListQuerySchema, couponIssueMethodSchema, couponIssueSchema, couponIssueStatusSchema, couponKindSchema, couponListQuerySchema, couponRedemptionListQuerySchema, couponRedemptionSchema, couponRejectReasonSchema, couponRuleSchema, couponSchema, couponStatsSchema, couponStatusSchema, couponTargetInputSchema, couponTargetSchema, createCouponRequestSchema, createPkcePair, createStoreClient, createStoreSession, createStorefrontEditPreviewLinkRequestSchema, createStorefrontPreviewLinkRequestSchema, createStorefrontSiteRequestSchema, createStorefrontVersionRequestSchema, customInputLabelForbiddenWord, customInputRequestSchema, customInputSchema, customInputValueSchema, customerAddressSchema, customerConsentListQuerySchema, customerConsentSchema, customerConsentStateSchema, customerConsentsSchema, customerCouponSchema, customerDelegationRequestSchema, customerDelegationSchema, customerDetailSchema, customerInquiryCategorySchema, customerInquiryListQuerySchema, customerListQuerySchema, customerOrderSchema, customerSortSchema, customerStatsSchema, customerSummarySchema, customerWithdrawalBlockedDetailsSchema, deleteStorefrontFileRequestSchema, deliveryBundleKeyOf, deliveryFeeWaiverSchema, deliveryInfoSchema, deliveryMethodSchema, deliveryStatusSchema, deliveryTypeSchema, disableStorefrontHostingRequestSchema, discountRequestSchema, discountSchema, dispatchRequestSchema, easyPayProviderResponseSchema, easyPayProviderSchema, eventTypeSchema, exchangeAuthorizationCode, fulfillBulkRequestSchema, fulfillRequestSchema, fulfillmentRuleOf, fulfillmentTypeOf, fulfillmentTypeResponseSchema, fulfillmentTypeSchema, holdOrderItemRequestSchema, inquiryListQuerySchema, inquirySchema, inquiryWebhookEventDataSchema, inquiryWebhookEventSchema, invitationDeliveryStatusSchema, invitationListQuerySchema, invitationSchema, inviteMemberRequestSchema, isCouponTargetLine, isEditableStorefrontPath, isReservedStoreCode, isReservedStorefrontSlug, isShowcaseStorefrontSlug, isStoreScope, isWebOrigin, issueCouponRequestSchema, issueCouponResultSchema, liveGateConditionCodeSchema, liveGateConditionSchema, liveGateErrorDetailsSchema, liveGateSchema, loginProviderSchema, loginProviderStatusSchema, loginProviderTestSchema, loginSettingsSchema, maskedSecretSchema, mcpRuleResultSchema, mcpToolEventSchema, moveStorefrontFileRequestSchema, myAccountSchema, myStoreSchema, normalizeBusinessNumber, normalizeCouponCode, normalizeStorefrontHostname, normalizeStorefrontPath, oauthTokenResponseSchema, openFulfillmentUnion, optionGroupKindSchema, optionGroupRequestSchema, optionGroupSchema, optionModelRequestSchema, optionModelSchema, optionSelectionSchema, optionSortSchema, optionValueRequestSchema, optionValueSchema, orderCanceledWebhookEventDataSchema, orderCanceledWebhookEventSchema, orderDiscountSchema, orderFulfilledWebhookEventDataSchema, orderFulfilledWebhookEventSchema, orderItemFulfillmentSchema, orderItemFulfillmentSnapshotResponseSchema, orderItemFulfillmentSnapshotSchema, orderItemListQuerySchema, orderItemMemoResultSchema, orderItemPageSchema, orderItemSchema, orderItemStatusSchema, orderListQuerySchema, orderSchema, orderSummaryPageSchema, orderSummarySchema, orderWebhookEventDataSchema, orderWebhookEventSchema, pageInfoSchema, pageQueryShape, pageSchema, paymentAttemptRecordSchema, paymentAttemptStatusSchema, paymentCredentialSetSchema, paymentListQuerySchema, paymentProviderSchema, paymentProviderVerificationSchema, paymentRecordDetailSchema, paymentRecordPageSchema, paymentRecordSchema, paymentRecordStatusSchema, paymentRefundRecordSchema, paymentSettingsSchema, pgEnvironmentSchema, pgPaymentMethodSchema, pgProviderSchema, pgVerificationResultSchema, planCodeSchema, planEntitlementsSchema, planErrorDetailsSchema, policyDocumentUrlSchema, policyVersionSchema, portOneChannelSchema, portOneCredentialsInputSchema, productCreateRequestSchema, productFulfillmentCreateSchema, productFulfillmentResponseSchema, productFulfillmentSchema, productFulfillmentUpdateSchema, productImageRejection, productImageUrlSchema, productListQuerySchema, productOutOfStockWebhookEventDataSchema, productOutOfStockWebhookEventSchema, productPatchRequestSchema, productRefundPolicyOverride, productRefundPolicyPatchSchema, productReplaceRequestSchema, productSchema, productSortSchema, productStatusSchema, productSummarySchema, productVariantRequestSchema, productVariantSchema, proratedPaidRefundBase, proratedRefundBase, publicPlanSchema, publicPlansSchema, publishStorefrontVersionRequestSchema, purchaseDecisionExtendResultSchema, purchaseDecisionRequestResultSchema, quoteDelivery, quotePricing, refreshUserToken, refundPolicyPatchSchema, refundPolicySchema, rejectClaimRequestSchema, remoteAreaLabelOf, remoteAreaOf, remoteAreaSchema, remoteSurchargeOf, replaceStorefrontSourceRequestSchema, requiresCollection, requiresShipping, resolveRefundPolicy, resolveShippingPolicy, responsePlanCodeSchema, reviewListQuerySchema, reviewReportResultSchema, reviewSchema, reviewSortSchema, reviewWebhookEventDataSchema, reviewWebhookEventSchema, rollbackStorefrontRequestSchema, runStorefrontCheckRequestSchema, salesReportGroupBySchema, salesReportQuerySchema, salesReportRowSchema, salesReportSchema, salesTotalsSchema, saveLoginProviderRequestSchema, savedCustomInputRequestSchema, savedCustomInputSchema, savedOptionGroupRequestSchema, savedOptionGroupSchema, savedOptionSetCompositionSchema, savedOptionSetFromProductRequestSchema, savedOptionSetFromProductResultSchema, savedOptionSetListQuerySchema, savedOptionSetRequestSchema, savedOptionSetSchema, savedOptionSetSortSchema, savedOptionValueRequestSchema, savedOptionValueSchema, scopeAccessSchema, searchStorefrontFilesRequestSchema, sellerAddressListQuerySchema, sellerAddressRequestSchema, sellerAddressSchema, sellerCustomerInquirySchema, setStorefrontVisibilityRequestSchema, settleCouponShortfall, settlementDetailQuerySchema, settlementDetailSchema, settlementListQuerySchema, settlementStatusSchema, settlementSummarySchema, settlementWithDetailsSchema, shippingAddressSchema, shippingPolicyPatchSchema, shippingPolicySchema, storeCodeSchema, storeMemberRoleUpdatedSchema, storeMemberSchema, storeRoleSchema, storeSchema, storeScopeResourceSchema, storeSubscriptionSchema, storefrontBuildDependenciesSchema, storefrontBuildListQuerySchema, storefrontBuildSchema, storefrontBuildStatusSchema, storefrontCheckSchema, storefrontCheckStatusSchema, storefrontCustomDomainStatusSchema, storefrontCustomHostnameProblem, storefrontDependencyFindingSchema, storefrontDeploymentLogSchema, storefrontDeploymentSchema, storefrontDeploymentStepSchema, storefrontDnsRecordSchema, storefrontDomainSchema, storefrontDomainTxtNameOf, storefrontEditPreviewLabelOf, storefrontEditPreviewSchema, storefrontEditSessionSchema, storefrontEditSessionStatusSchema, storefrontEditingSchema, storefrontFileConflictDetailsSchema, storefrontFileContentQuerySchema, storefrontFileContentSchema, storefrontFileDeleteResultSchema, storefrontFileEncodingSchema, storefrontFileEntrySchema, storefrontFileHashSchema, storefrontFileListQuerySchema, storefrontFileListSchema, storefrontFileMoveResultSchema, storefrontFilePathSchema, storefrontFileSearchResultSchema, storefrontFileWriteResultSchema, storefrontHostingSchema, storefrontPreviewLinkSchema, storefrontProvisioningSchema, storefrontRuleResultSchema, storefrontRuleSeveritySchema, storefrontSiteDomainSchema, storefrontSiteDomainsSchema, storefrontSiteSchema, storefrontSiteStatusSchema, storefrontSlugAvailabilityQuerySchema, storefrontSlugAvailabilitySchema, storefrontSlugSchema, storefrontSourceArchivePartSchema, storefrontSourceArchiveQuerySchema, storefrontSourceBlobsResultSchema, storefrontSourceModeSchema, storefrontSourceRefSchema, storefrontSourceReplacedSchema, storefrontSourceSchema, storefrontSuspensionSchema, storefrontTemplateSchema, storefrontVerifyReportSchema, storefrontVersionCreatedSchema, storefrontVersionSchema, storefrontVersionStatusSchema, storefrontVisibilitySchema, subscriptionLimitsSchema, subscriptionStatusSchema, subscriptionUsageSchema, tossPaymentsCredentialsInputSchema, trackingStageResponseSchema, trackingUpdateResultSchema, updateCouponRequestSchema, updateLoginProviderRequestSchema, updateLoginSettingsRequestSchema, updateMemberRoleRequestSchema, updatePaymentProviderRequestSchema, updatePaymentSettingsRequestSchema, updateStoreRequestSchema, uploadExtensionOf, uploadPurposeSchema, uploadRejection, uploadRequestSchema, uploadStorefrontSourceBlobsRequestSchema, uploadTicketSchema, upsertPortOneProviderRequestSchema, upsertTossPaymentsProviderRequestSchema, variantStockRequestSchema, variantStockSchema, verifyPaymentProviderRequestSchema, webhookCreatedSchema, webhookDeliveryDetailSchema, webhookDeliveryErrorCodeSchema, webhookDeliveryListQuerySchema, webhookDeliveryResourceSchema, webhookDeliverySchema, webhookDeliveryStatusSchema, webhookEventSchema, webhookFailureReasonSchema, webhookRedeliverFailedResultSchema, webhookRequestHeaderSchema, webhookRequestSchema, webhookResourceTypeSchema, webhookSchema, webhookSecretRotatedSchema, webhookStatusSchema, webhookTestRequestSchema, webhookTestResultSchema, withdrawCustomerRequestSchema, writeDryRunResultSchema, writePreviewSchema, writeStorefrontFilesRequestSchema };