/** * Remediation vocabulary (frontend-core-architecture §2.5). Declared by the * backend on the error registry and consumed verbatim from its `errors.json` * artifact. A host maps it to UX — retryable → "try again"; `wait_and_retry` → * timer from `params.retry_after_minutes`; `verify` → the step-up seam; * `fix_input` → highlight the offending field. */ export type Remediation = "retry" | "wait_and_retry" | "reauthenticate" | "verify" | "fix_input" | "contact_support" | "bug"; export interface CategoriesErrorSpec { /** HTTP status the backend raises this key with. */ readonly status: number; /** `{param}` interpolation slots present in the message. */ readonly params: readonly string[]; /** Remediation hint declared by the backend (see {@link Remediation}). */ readonly remediation: Remediation; /** English fallback (source: stapel-auth errors.json). */ readonly en: string; } /** * The CATEGORIES_ERRORS map — every `error.*` key stapel-auth can raise, keyed by its * canonical code. The single source of truth behind the en fallback bundle, the * remediation lookup, and the manifest `errors` block. */ export declare const CATEGORIES_ERRORS: { readonly "error.400.bad_request": { readonly status: 400; readonly params: readonly []; readonly remediation: "fix_input"; readonly en: "Bad request"; }; readonly "error.400.captcha_invalid": { readonly status: 400; readonly params: readonly []; readonly remediation: "retry"; readonly en: "Captcha verification failed. Please try again."; }; readonly "error.400.captcha_required": { readonly status: 400; readonly params: readonly []; readonly remediation: "retry"; readonly en: "Captcha token is required."; }; readonly "error.400.categories_config_required": { readonly status: 400; readonly params: readonly []; readonly remediation: "fix_input"; readonly en: "A config object is required"; }; readonly "error.400.categories_database_error": { readonly status: 400; readonly params: readonly []; readonly remediation: "fix_input"; readonly en: "Database error while applying changes"; }; readonly "error.400.categories_duplicate_slug": { readonly status: 400; readonly params: readonly ["slug"]; readonly remediation: "fix_input"; readonly en: "A feature with slug '{slug}' already exists"; }; readonly "error.400.categories_expected_list": { readonly status: 400; readonly params: readonly []; readonly remediation: "fix_input"; readonly en: "Expected a list of objects"; }; readonly "error.400.categories_feature_editor_invalid": { readonly status: 400; readonly params: readonly ["reason"]; readonly remediation: "fix_input"; readonly en: "Invalid feature editor request: {reason}"; }; readonly "error.400.categories_invalid_conversion": { readonly status: 400; readonly params: readonly []; readonly remediation: "fix_input"; readonly en: "Invalid type conversion (only select<->string is supported)"; }; readonly "error.400.categories_not_deleted": { readonly status: 400; readonly params: readonly []; readonly remediation: "fix_input"; readonly en: "Category is not deleted"; }; readonly "error.400.description_too_long": { readonly status: 400; readonly params: readonly ["max_length"]; readonly remediation: "fix_input"; readonly en: "Description must be at most {max_length} characters"; }; readonly "error.400.description_too_short": { readonly status: 400; readonly params: readonly ["min_length"]; readonly remediation: "fix_input"; readonly en: "Description must be at least {min_length} characters"; }; readonly "error.400.expected_list": { readonly status: 400; readonly params: readonly []; readonly remediation: "fix_input"; readonly en: "Expected a list of items"; }; readonly "error.400.feature_above_maximum": { readonly status: 400; readonly params: readonly ["feature"]; readonly remediation: "fix_input"; readonly en: "Value is above maximum for {feature}"; }; readonly "error.400.feature_below_minimum": { readonly status: 400; readonly params: readonly ["feature"]; readonly remediation: "fix_input"; readonly en: "Value is below minimum for {feature}"; }; readonly "error.400.feature_invalid_config": { readonly status: 400; readonly params: readonly ["feature"]; readonly remediation: "fix_input"; readonly en: "Invalid config for {feature}"; }; readonly "error.400.feature_invalid_format": { readonly status: 400; readonly params: readonly ["feature"]; readonly remediation: "fix_input"; readonly en: "Invalid format for {feature}"; }; readonly "error.400.feature_invalid_rules": { readonly status: 400; readonly params: readonly ["feature"]; readonly remediation: "fix_input"; readonly en: "Invalid rules for {feature}"; }; readonly "error.400.feature_invalid_type": { readonly status: 400; readonly params: readonly ["feature"]; readonly remediation: "fix_input"; readonly en: "Invalid type for {feature}"; }; readonly "error.400.feature_mandatory_missing": { readonly status: 400; readonly params: readonly ["feature"]; readonly remediation: "fix_input"; readonly en: "Mandatory feature {feature} is required"; }; readonly "error.400.feature_not_allowed": { readonly status: 400; readonly params: readonly ["feature"]; readonly remediation: "fix_input"; readonly en: "Feature {feature} is not allowed here"; }; readonly "error.400.feature_not_in_options": { readonly status: 400; readonly params: readonly ["feature"]; readonly remediation: "fix_input"; readonly en: "Value is not in allowed options for {feature}"; }; readonly "error.400.feature_unknown": { readonly status: 400; readonly params: readonly ["feature"]; readonly remediation: "fix_input"; readonly en: "Unknown feature {feature}"; }; readonly "error.400.feature_unknown_type": { readonly status: 400; readonly params: readonly ["feature"]; readonly remediation: "fix_input"; readonly en: "Unknown feature type for {feature}"; }; readonly "error.400.field.blank": { readonly status: 400; readonly params: readonly ["field"]; readonly remediation: "fix_input"; readonly en: "{field} may not be blank"; }; readonly "error.400.field.does_not_exist": { readonly status: 400; readonly params: readonly ["field"]; readonly remediation: "fix_input"; readonly en: "{field} does not exist"; }; readonly "error.400.field.invalid": { readonly status: 400; readonly params: readonly ["field"]; readonly remediation: "fix_input"; readonly en: "{field} is invalid"; }; readonly "error.400.field.invalid_choice": { readonly status: 400; readonly params: readonly ["field"]; readonly remediation: "fix_input"; readonly en: "{field} is not a valid choice"; }; readonly "error.400.field.max_length": { readonly status: 400; readonly params: readonly ["field", "max_length"]; readonly remediation: "fix_input"; readonly en: "{field} must be at most {max_length} characters"; }; readonly "error.400.field.max_value": { readonly status: 400; readonly params: readonly ["field", "max_value"]; readonly remediation: "fix_input"; readonly en: "{field} must be at most {max_value}"; }; readonly "error.400.field.min_length": { readonly status: 400; readonly params: readonly ["field", "min_length"]; readonly remediation: "fix_input"; readonly en: "{field} must be at least {min_length} characters"; }; readonly "error.400.field.min_value": { readonly status: 400; readonly params: readonly ["field", "min_value"]; readonly remediation: "fix_input"; readonly en: "{field} must be at least {min_value}"; }; readonly "error.400.field.null": { readonly status: 400; readonly params: readonly ["field"]; readonly remediation: "fix_input"; readonly en: "{field} may not be null"; }; readonly "error.400.field.required": { readonly status: 400; readonly params: readonly ["field"]; readonly remediation: "fix_input"; readonly en: "{field} is required"; }; readonly "error.400.field.unique": { readonly status: 400; readonly params: readonly ["field"]; readonly remediation: "fix_input"; readonly en: "{field} must be unique"; }; readonly "error.400.invalid_ad_id": { readonly status: 400; readonly params: readonly []; readonly remediation: "fix_input"; readonly en: "Invalid advertisement ID"; }; readonly "error.400.validation_error": { readonly status: 400; readonly params: readonly []; readonly remediation: "fix_input"; readonly en: "Validation error"; }; readonly "error.400.verification_failed": { readonly status: 400; readonly params: readonly []; readonly remediation: "verify"; readonly en: "Verification failed"; }; readonly "error.400.verification_invalid_factor": { readonly status: 400; readonly params: readonly []; readonly remediation: "verify"; readonly en: "This verification factor is not available"; }; readonly "error.401.unauthorized": { readonly status: 401; readonly params: readonly []; readonly remediation: "reauthenticate"; readonly en: "Authentication required"; }; readonly "error.402.payment_required": { readonly status: 402; readonly params: readonly []; readonly remediation: "retry"; readonly en: "Payment required"; }; readonly "error.403.forbidden": { readonly status: 403; readonly params: readonly []; readonly remediation: "retry"; readonly en: "You do not have permission to perform this action"; }; readonly "error.403.network_blocked": { readonly status: 403; readonly params: readonly []; readonly remediation: "contact_support"; readonly en: "Requests from this network are not allowed"; }; readonly "error.403.verification_enrollment_required": { readonly status: 403; readonly params: readonly []; readonly remediation: "verify"; readonly en: "Verification factor enrollment required"; }; readonly "error.403.verification_required": { readonly status: 403; readonly params: readonly []; readonly remediation: "verify"; readonly en: "Additional verification required"; }; readonly "error.404.ad_not_found": { readonly status: 404; readonly params: readonly []; readonly remediation: "retry"; readonly en: "Listing not found"; }; readonly "error.404.categories_slug_not_found": { readonly status: 404; readonly params: readonly ["slug"]; readonly remediation: "retry"; readonly en: "No category with slug '{slug}'"; }; readonly "error.404.not_found": { readonly status: 404; readonly params: readonly []; readonly remediation: "retry"; readonly en: "Requested resource not found"; }; readonly "error.404.verification_challenge_not_found": { readonly status: 404; readonly params: readonly []; readonly remediation: "verify"; readonly en: "Verification challenge not found or expired"; }; readonly "error.405.method_not_allowed": { readonly status: 405; readonly params: readonly []; readonly remediation: "retry"; readonly en: "Method not allowed"; }; readonly "error.406.not_acceptable": { readonly status: 406; readonly params: readonly []; readonly remediation: "retry"; readonly en: "Not acceptable"; }; readonly "error.408.request_timeout": { readonly status: 408; readonly params: readonly []; readonly remediation: "retry"; readonly en: "Request timeout"; }; readonly "error.409.categories_feature_editor_conflict": { readonly status: 409; readonly params: readonly ["expected", "actual"]; readonly remediation: "fix_input"; readonly en: "Category was modified by another editor (expected revision {expected}, now {actual}); reload and retry"; }; readonly "error.409.conflict": { readonly status: 409; readonly params: readonly []; readonly remediation: "fix_input"; readonly en: "Resource already exists"; }; readonly "error.410.gone": { readonly status: 410; readonly params: readonly []; readonly remediation: "retry"; readonly en: "Resource has been permanently removed"; }; readonly "error.413.payload_too_large": { readonly status: 413; readonly params: readonly []; readonly remediation: "retry"; readonly en: "Request body is too large"; }; readonly "error.415.unsupported_media_type": { readonly status: 415; readonly params: readonly []; readonly remediation: "retry"; readonly en: "Unsupported media type"; }; readonly "error.422.unprocessable_entity": { readonly status: 422; readonly params: readonly []; readonly remediation: "wait_and_retry"; readonly en: "Unprocessable entity"; }; readonly "error.423.locked": { readonly status: 423; readonly params: readonly []; readonly remediation: "wait_and_retry"; readonly en: "Resource is locked"; }; readonly "error.423.verification_locked": { readonly status: 423; readonly params: readonly []; readonly remediation: "wait_and_retry"; readonly en: "Too many failed attempts — verification locked"; }; readonly "error.429.rate_limit": { readonly status: 429; readonly params: readonly ["retry_after_minutes"]; readonly remediation: "wait_and_retry"; readonly en: "Too many attempts. Try again in {retry_after_minutes} minutes."; }; readonly "error.429.too_many_requests": { readonly status: 429; readonly params: readonly []; readonly remediation: "wait_and_retry"; readonly en: "Too many requests. Please try again later."; }; readonly "error.500.internal": { readonly status: 500; readonly params: readonly []; readonly remediation: "contact_support"; readonly en: "Something went wrong"; }; readonly "error.503.mandate_unavailable": { readonly status: 503; readonly params: readonly []; readonly remediation: "retry"; readonly en: "Cannot verify workspace mandate right now"; }; }; export type CategoriesErrorCode = keyof typeof CATEGORIES_ERRORS; /** Every backend error code this module can surface, sorted. */ export declare const CATEGORIES_ERROR_CODES: readonly CategoriesErrorCode[]; /** * English fallback bundle — one string per backend key, so a `StapelApiError.code` * never renders as a raw key. Merged UNDER the hand-polished UI copy in * {@link authI18nBundleEn} (polish wins; this guarantees coverage). */ export declare const categoriesErrorBundleEn: Record; //# sourceMappingURL=errors.gen.d.ts.map