import type { AppStoreProductType } from './http.js'; export declare function apiGet(path: string, params?: Record): Promise; export interface AppStoreVerifyResult { ok: boolean; stage: 'creds' | 'sign' | 'auth' | 'api' | 'done'; message: string; httpStatus?: number; appCount?: number; firstApp?: { id: string; name?: string; }; } /** * appstore.json 자격증명 유효성 단계별 검증 (creds → sign → auth → api). * playstore_verify_service_account 의 App Store 대응. 읽기 전용 — GET /apps?limit=1. * 파일 존재만 보는 requireAppStoreCreds 와 달리, 잘못된 .p8/keyId/issuerId 를 * "첫 호출 401" 로 늦게 터지기 전에 setup 단계에서 잡아준다. */ export declare function verifyAppStoreCredentials(): Promise; export declare function listApps(): Promise; export declare function getApp(appId: string): Promise; export declare function listVersions(appId: string): Promise; export type ApplePlatform = 'IOS' | 'MAC_OS' | 'TV_OS' | 'VISION_OS'; export type AppleReleaseType = 'MANUAL' | 'AFTER_APPROVAL' | 'SCHEDULED'; export interface CreateVersionInput { appId: string; versionString: string; platform: ApplePlatform; copyright?: string; releaseType?: AppleReleaseType; earliestReleaseDate?: string; buildId?: string; } export declare function createVersion(input: CreateVersionInput): Promise<{ id: any; version: any; platform: any; state: any; releaseType: any; createdDate: any; }>; /** * 기존 버전 레코드의 versionString 을 바꾼다 (예: 2.0.5 → 2.0.6). * * 왜 필요한가: ASC 는 편집 가능한 버전이 이미 있으면 새 버전 생성을 거부한다 * 409 ENTITY_ERROR.RELATIONSHIP.INVALID "You cannot create a new version of the App in the current state" * 그래서 거절/철회된 버전으로 다음 릴리스를 내보내려면 **같은 레코드의 이름을 올려야** 한다. * 빌드는 CFBundleShortVersionString 이 일치하는 버전에만 붙으므로, 2.0.6 빌드를 올렸다면 * 버전 레코드도 2.0.6 이어야 attach 가 된다. * * 편집 가능한 상태(PREPARE_FOR_SUBMISSION / DEVELOPER_REJECTED / REJECTED 등)에서만 통한다. */ export declare function updateVersionString(versionId: string, versionString: string): Promise<{ versionId: string; versionString: any; state: any; platform: any; }>; export declare function attachBuildToVersion(versionId: string, buildId: string): Promise<{ versionId: string; buildId: string; ok: boolean; }>; /** * 가장 최신 VALID 빌드를 자동으로 찾아 versionId 에 attach. * * 흐름: * 1. versionId → appId 역추적 (`getVersionAppAndPlatform`). * 2. `listBuilds(appId)` 로 최근 10개 빌드 조회 (sort: uploadedDate desc). * 3. `processingState === 'VALID'` 필터. * 4. `minBuildNumber` 옵션 있으면 buildNumber 숫자 기준 필터. * 5. buildNumber 숫자 최대값으로 정렬 → 1개 선택. * 6. attach. * * 사용처: 1.4.x 같은 매 배포마다 `appstore_list_builds` → 수동 탐색 → `appstore_attach_build` 의 * 3-step 을 한 번에 줄임. 실수로 PROCESSING 중인 빌드를 attach 해서 심사 제출 시점에 깨지는 * 케이스도 차단. */ export declare function attachLatestValidBuild(versionId: string, opts?: { minBuildNumber?: number; }): Promise<{ versionId: string; attachedBuildId: string; buildNumber: string; uploadedDate?: string; }>; export declare function getVersionLocalizations(versionId: string): Promise; export interface LocalizationUpdateFields { whatsNew?: string; description?: string; keywords?: string; promotionalText?: string; supportUrl?: string; marketingUrl?: string; } export declare function updateVersionLocalization(localizationId: string, fields: LocalizationUpdateFields): Promise; /** * versionId + locale로 로컬라이제이션을 찾아서 PATCH. * localizationId를 직접 모를 때 편의용. */ export declare function updateVersionWhatsNew(versionId: string, locale: string, fields: LocalizationUpdateFields): Promise; export declare function updateReviewNotes(versionId: string, notes: string): Promise<{ reviewDetailId: string; notes: string; created: boolean; }>; export declare function getReviewNotes(versionId: string): Promise<{ reviewDetailId: string | null; notes: string | null; contactEmail: string | null; }>; export declare function listBuilds(appId: string): Promise; export declare function listBetaGroups(appId: string): Promise; export declare function getAppInfo(appId: string): Promise; export interface AppInfoLocalizationFields { name?: string; subtitle?: string; privacyPolicyUrl?: string; privacyPolicyText?: string; } export declare function listAppInfoLocalizations(appId: string, locale?: string): Promise<{ appInfoId: string; appInfoState: string; localizations: { id: any; locale: any; name: any; subtitle: any; privacyPolicyUrl: any; privacyPolicyText: any; }[]; }>; export declare function updateAppInfoLocalization(localizationId: string, fields: AppInfoLocalizationFields): Promise; export declare function createAppInfoLocalization(appId: string, locale: string, fields: AppInfoLocalizationFields): Promise<{ appInfoId: string; appInfoState: string; localization: { id: any; locale: any; name: any; subtitle: any; privacyPolicyUrl: any; privacyPolicyText: any; }; }>; export interface ListCustomerReviewsOptions { limit?: number; territory?: string; rating?: 1 | 2 | 3 | 4 | 5; } export declare function listCustomerReviews(appId: string, opts?: ListCustomerReviewsOptions): Promise; export declare function createReviewResponse(reviewId: string, responseBody: string): Promise; /** * submit_for_review dry-run 프리뷰 — 비가역 제출 직전 사용자 확인용. * * 1.4.x 배포 사고 누적: submit 직후 되돌리지 못해 새 versionString bump 으로 우회해야 * 하는 케이스가 반복됨 (reference_appstore_cancel_review_window). 그 원인이던 * cancel_review 버그(submitted:false → 항상 409)는 2026-07-25 에 canceled:true 로 고쳤고, * 이제 WAITING_FOR_REVIEW 까지는 되돌릴 수 있다. 그래도 IN_REVIEW 이후는 못 되돌리니 * 호출자가 의도한 그 버전·빌드인지 미리 보여줘서 잘못된 versionId 제출을 차단한다. */ export declare function buildSubmitForReviewPreview(versionId: string): Promise<{ versionId: string; versionString?: string; state?: string; appId: string; platform: string; attachedBuild?: { id: string; buildNumber?: string; uploadedDate?: string; processingState?: string; }; whatsNewByLocale: Array<{ locale: string; excerpt: string; length: number; }>; }>; export declare function submitVersionForReview(versionId: string): Promise<{ submissionId: string; appId: string; platform: string; versionId: string; reusedSubmission: boolean; itemAttached: boolean; recoveredFromStaleSubmission: boolean; state: any; }>; export declare function addProductToReviewSubmission(args: { internalId: string; productType: AppStoreProductType; }): Promise<{ internalId: string; productType: AppStoreProductType; endpoint: string; submissionId?: string; }>; export interface ReviewSubmissionSummary { id: string; state?: string; submittedDate: string | null; items: Array<{ id: string; state?: string; targetType?: string; targetId?: string; versionString?: string; appVersionState?: string; /** IAP/구독/구독그룹 항목의 식별자 — productId 또는 referenceName. */ label?: string; /** 대상 리소스 자체의 상태 (상품이면 READY_TO_SUBMIT / WAITING_FOR_REVIEW 등). */ targetState?: string; }>; } export declare function listReviewSubmissions(args: { appId: string; platform?: string; limit?: number; }): Promise<{ appId: string; platform: string; submissions: ReviewSubmissionSummary[]; }>; /** 묶음에서 항목 제거 (removed=true PATCH). ASC 웹 "재제출" 이 내부적으로 하는 그 동작. */ export declare function removeReviewSubmissionItem(itemId: string): Promise<{ itemId: string; state?: string; removed: boolean; }>; /** * 이미 존재하는 묶음에 앱 버전을 항목으로 끼워 넣는다. * * 앱 첫 심사에서 반드시 필요하다. 웹에서 상품을 담으면 **상품만 든 묶음**이 새로 생기는데, * 그대로 제출하면 Apple 이 막는다: * 409 ENTITY_ERROR.RELATIONSHIP.REQUIRED * "must have an approved appStoreVersions ... or an appStoreVersions must be included * in this review submission" * 즉 상품 묶음에는 앱 버전이 함께 있어야 한다. reviewSubmissionItems 는 상품 관계는 * 거부하지만 **appStoreVersion 관계는 받는다** — 그래서 버전만 이쪽으로 옮기면 된다. * * 버전이 다른 묶음에 이미 물려 있으면 그 묶음을 먼저 정리해야 한다: * - 미제출(READY_FOR_REVIEW) 묶음이면 appstore_remove_review_submission_item * - 제출된(WAITING_FOR_REVIEW) 묶음이면 항목 제거가 막히므로 appstore_cancel_review 로 묶음째 취소 */ export declare function addVersionToReviewSubmission(args: { submissionId: string; versionId: string; }): Promise<{ itemId?: string; submissionId: string; versionId: string; itemCount: number; }>; export declare function cancelVersionReview(versionId: string): Promise<{ submissionId: string; previousState: string; newState: string; versionId: string; }>; export type AppleIapType = 'CONSUMABLE' | 'NON_CONSUMABLE' | 'NON_RENEWING_SUBSCRIPTION'; export interface CreateInAppPurchaseInput { appId: string; productId: string; referenceName: string; inAppPurchaseType: AppleIapType; reviewNote?: string; familySharable?: boolean; locale?: string; displayName: string; description: string; priceUsd: number; baseTerritory?: string; autoSubmit?: boolean; } export type FailedStep = 'localization' | 'priceSchedule' | 'submission'; interface CreatedIapSummary { iapId: string; productId: string; state?: string; localizationId?: string; priceScheduleId?: string; submissionId?: string; submissionState?: string; failedStep?: FailedStep; error?: string; priceMatchWarning?: string; consoleUrl: string; } export declare function createInAppPurchase(input: CreateInAppPurchaseInput): Promise; export interface CreateSubscriptionGroupInput { appId: string; referenceName: string; } export interface CreateSubscriptionInput { appId: string; groupReferenceName: string; productId: string; referenceName: string; subscriptionPeriod: 'ONE_WEEK' | 'ONE_MONTH' | 'TWO_MONTHS' | 'THREE_MONTHS' | 'SIX_MONTHS' | 'ONE_YEAR'; reviewNote?: string; familySharable?: boolean; groupLevel?: number; locale?: string; displayName: string; description: string; priceUsd: number; baseTerritory?: string; autoSubmit?: boolean; } interface CreatedSubscriptionSummary { subscriptionId: string; groupId: string; productId: string; state?: string; localizationId?: string; pricesCreated?: boolean; submissionId?: string; submissionState?: string; failedStep?: FailedStep; error?: string; priceMatchWarning?: string; consoleUrl: string; } export declare function createAutoRenewableSubscription(input: CreateSubscriptionInput): Promise; export {};