@vertracloud/api-types 0.3.4 → 0.3.5

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vertracloud/api-types",
3
- "version": "0.3.4",
3
+ "version": "0.3.5",
4
4
  "private": false,
5
5
  "description": "TypeScript types for the public API of Vertra Cloud, a Brazilian application hosting platform (PaaS) for applications, managed databases and bots.",
6
6
  "homepage": "https://vertracloud.app",
@@ -159,13 +159,25 @@ declare const API_ERROR_CODES: {
159
159
  readonly PATH_IS_FILE: "PATH_IS_FILE";
160
160
  readonly PENDING_ORDER_LIMIT_REACHED: "PENDING_ORDER_LIMIT_REACHED";
161
161
  readonly PAYMENT_METHOD_UNAVAILABLE: "PAYMENT_METHOD_UNAVAILABLE";
162
+ /** 403 — the plan does not include automatic rollback (`deploy.auto_rollback: true` below Intermediary). */
163
+ readonly PLAN_DOES_NOT_SUPPORT_AUTO_ROLLBACK: "PLAN_DOES_NOT_SUPPORT_AUTO_ROLLBACK";
162
164
  readonly PLAN_DOES_NOT_SUPPORT_CUSTOM_DOMAIN: "PLAN_DOES_NOT_SUPPORT_CUSTOM_DOMAIN";
163
165
  readonly PLAN_DOES_NOT_SUPPORT_CUSTOM_SUBDOMAIN: "PLAN_DOES_NOT_SUPPORT_CUSTOM_SUBDOMAIN";
166
+ /** 403 — the plan does not include rollback to earlier releases. */
167
+ readonly PLAN_DOES_NOT_SUPPORT_ROLLBACK: "PLAN_DOES_NOT_SUPPORT_ROLLBACK";
164
168
  readonly PLAN_DOES_NOT_SUPPORT_WEB_PUBLISH: "PLAN_DOES_NOT_SUPPORT_WEB_PUBLISH";
169
+ /** 403 — the plan does not include zero-downtime deploys (`deploy.zero_downtime: "on"` below Enterprise). */
170
+ readonly PLAN_DOES_NOT_SUPPORT_ZERO_DOWNTIME: "PLAN_DOES_NOT_SUPPORT_ZERO_DOWNTIME";
165
171
  readonly PLAN_MISMATCH_FOR_RENEWAL: "PLAN_MISMATCH_FOR_RENEWAL";
166
172
  readonly PLAN_NOT_ALLOWED: "PLAN_NOT_ALLOWED";
167
173
  readonly RATE_LIMIT_EXCEEDED: "RATE_LIMIT_EXCEEDED";
168
174
  readonly REFUND_AMOUNT_EXCEEDS_PRICE: "REFUND_AMOUNT_EXCEEDS_PRICE";
175
+ /** 409 — the release is already the active one. */
176
+ readonly RELEASE_ALREADY_ACTIVE: "RELEASE_ALREADY_ACTIVE";
177
+ /** 410 — the release's kept code has expired or is outside the limit of the plan. */
178
+ readonly RELEASE_EXPIRED: "RELEASE_EXPIRED";
179
+ /** 404 — the release does not exist or belongs to another application. */
180
+ readonly RELEASE_NOT_FOUND: "RELEASE_NOT_FOUND";
169
181
  readonly REPO_ALREADY_LINKED: "REPO_ALREADY_LINKED";
170
182
  readonly RESTORE_COOLDOWN: "RESTORE_COOLDOWN";
171
183
  readonly SNAPSHOT_ENGINE_MISMATCH: "SNAPSHOT_ENGINE_MISMATCH";
@@ -354,13 +366,25 @@ declare const APIErrorCode: {
354
366
  readonly PATH_IS_FILE: "PATH_IS_FILE";
355
367
  readonly PENDING_ORDER_LIMIT_REACHED: "PENDING_ORDER_LIMIT_REACHED";
356
368
  readonly PAYMENT_METHOD_UNAVAILABLE: "PAYMENT_METHOD_UNAVAILABLE";
369
+ /** 403 — the plan does not include automatic rollback (`deploy.auto_rollback: true` below Intermediary). */
370
+ readonly PLAN_DOES_NOT_SUPPORT_AUTO_ROLLBACK: "PLAN_DOES_NOT_SUPPORT_AUTO_ROLLBACK";
357
371
  readonly PLAN_DOES_NOT_SUPPORT_CUSTOM_DOMAIN: "PLAN_DOES_NOT_SUPPORT_CUSTOM_DOMAIN";
358
372
  readonly PLAN_DOES_NOT_SUPPORT_CUSTOM_SUBDOMAIN: "PLAN_DOES_NOT_SUPPORT_CUSTOM_SUBDOMAIN";
373
+ /** 403 — the plan does not include rollback to earlier releases. */
374
+ readonly PLAN_DOES_NOT_SUPPORT_ROLLBACK: "PLAN_DOES_NOT_SUPPORT_ROLLBACK";
359
375
  readonly PLAN_DOES_NOT_SUPPORT_WEB_PUBLISH: "PLAN_DOES_NOT_SUPPORT_WEB_PUBLISH";
376
+ /** 403 — the plan does not include zero-downtime deploys (`deploy.zero_downtime: "on"` below Enterprise). */
377
+ readonly PLAN_DOES_NOT_SUPPORT_ZERO_DOWNTIME: "PLAN_DOES_NOT_SUPPORT_ZERO_DOWNTIME";
360
378
  readonly PLAN_MISMATCH_FOR_RENEWAL: "PLAN_MISMATCH_FOR_RENEWAL";
361
379
  readonly PLAN_NOT_ALLOWED: "PLAN_NOT_ALLOWED";
362
380
  readonly RATE_LIMIT_EXCEEDED: "RATE_LIMIT_EXCEEDED";
363
381
  readonly REFUND_AMOUNT_EXCEEDS_PRICE: "REFUND_AMOUNT_EXCEEDS_PRICE";
382
+ /** 409 — the release is already the active one. */
383
+ readonly RELEASE_ALREADY_ACTIVE: "RELEASE_ALREADY_ACTIVE";
384
+ /** 410 — the release's kept code has expired or is outside the limit of the plan. */
385
+ readonly RELEASE_EXPIRED: "RELEASE_EXPIRED";
386
+ /** 404 — the release does not exist or belongs to another application. */
387
+ readonly RELEASE_NOT_FOUND: "RELEASE_NOT_FOUND";
364
388
  readonly REPO_ALREADY_LINKED: "REPO_ALREADY_LINKED";
365
389
  readonly RESTORE_COOLDOWN: "RESTORE_COOLDOWN";
366
390
  readonly SNAPSHOT_ENGINE_MISMATCH: "SNAPSHOT_ENGINE_MISMATCH";
@@ -221,13 +221,25 @@ var API_ERROR_CODES = {
221
221
  PATH_IS_FILE: "PATH_IS_FILE",
222
222
  PENDING_ORDER_LIMIT_REACHED: "PENDING_ORDER_LIMIT_REACHED",
223
223
  PAYMENT_METHOD_UNAVAILABLE: "PAYMENT_METHOD_UNAVAILABLE",
224
+ /** 403 — the plan does not include automatic rollback (`deploy.auto_rollback: true` below Intermediary). */
225
+ PLAN_DOES_NOT_SUPPORT_AUTO_ROLLBACK: "PLAN_DOES_NOT_SUPPORT_AUTO_ROLLBACK",
224
226
  PLAN_DOES_NOT_SUPPORT_CUSTOM_DOMAIN: "PLAN_DOES_NOT_SUPPORT_CUSTOM_DOMAIN",
225
227
  PLAN_DOES_NOT_SUPPORT_CUSTOM_SUBDOMAIN: "PLAN_DOES_NOT_SUPPORT_CUSTOM_SUBDOMAIN",
228
+ /** 403 — the plan does not include rollback to earlier releases. */
229
+ PLAN_DOES_NOT_SUPPORT_ROLLBACK: "PLAN_DOES_NOT_SUPPORT_ROLLBACK",
226
230
  PLAN_DOES_NOT_SUPPORT_WEB_PUBLISH: "PLAN_DOES_NOT_SUPPORT_WEB_PUBLISH",
231
+ /** 403 — the plan does not include zero-downtime deploys (`deploy.zero_downtime: "on"` below Enterprise). */
232
+ PLAN_DOES_NOT_SUPPORT_ZERO_DOWNTIME: "PLAN_DOES_NOT_SUPPORT_ZERO_DOWNTIME",
227
233
  PLAN_MISMATCH_FOR_RENEWAL: "PLAN_MISMATCH_FOR_RENEWAL",
228
234
  PLAN_NOT_ALLOWED: "PLAN_NOT_ALLOWED",
229
235
  RATE_LIMIT_EXCEEDED: "RATE_LIMIT_EXCEEDED",
230
236
  REFUND_AMOUNT_EXCEEDS_PRICE: "REFUND_AMOUNT_EXCEEDS_PRICE",
237
+ /** 409 — the release is already the active one. */
238
+ RELEASE_ALREADY_ACTIVE: "RELEASE_ALREADY_ACTIVE",
239
+ /** 410 — the release's kept code has expired or is outside the limit of the plan. */
240
+ RELEASE_EXPIRED: "RELEASE_EXPIRED",
241
+ /** 404 — the release does not exist or belongs to another application. */
242
+ RELEASE_NOT_FOUND: "RELEASE_NOT_FOUND",
231
243
  REPO_ALREADY_LINKED: "REPO_ALREADY_LINKED",
232
244
  RESTORE_COOLDOWN: "RESTORE_COOLDOWN",
233
245
  SNAPSHOT_ENGINE_MISMATCH: "SNAPSHOT_ENGINE_MISMATCH",
@@ -1 +1 @@
1
- {"version":3,"sources":["api-error.ts","workspace.ts"],"sourcesContent":["import { WORKSPACE_ERROR_CODES } from \"./workspace\";\n\n/** Stable error sentinels returned by routes available to API keys. */\nexport const API_ERROR_CODES = {\n\tACCESS_DENIED: \"ACCESS_DENIED\",\n\tAPI_KEY_INVALID: \"API_KEY_INVALID\",\n\t// Key management (`/v1/users/me/api-keys`) — dashboard-session routes.\n\tAPI_KEY_NOT_FOUND: \"API_KEY_NOT_FOUND\",\n\tAPI_KEY_LIMIT_REACHED: \"API_KEY_LIMIT_REACHED\",\n\tAPI_KEY_INVALID_NAME: \"API_KEY_INVALID_NAME\",\n\tAPI_KEY_INVALID_SCOPES: \"API_KEY_INVALID_SCOPES\",\n\tAPI_KEY_INVALID_IPS: \"API_KEY_INVALID_IPS\",\n\tAPI_KEY_IP_DENIED: \"API_KEY_IP_DENIED\",\n\tAPI_KEY_SCOPE_DENIED: \"API_KEY_SCOPE_DENIED\",\n\t/** 403 — the route only accepts a dashboard session; API keys are refused. */\n\tWEBSITE_ONLY: \"WEBSITE_ONLY\",\n\tAUTH_TOKEN_MISSING: \"AUTH_TOKEN_MISSING\",\n\tACCOUNT_BANNED: \"ACCOUNT_BANNED\",\n\tAPP_SHIELD_COOLDOWN: \"APP_SHIELD_COOLDOWN\",\n\tAPP_BANNED: \"APP_BANNED\",\n\tAPP_ALREADY_PUBLISHED: \"APP_ALREADY_PUBLISHED\",\n\tAPP_HAS_NO_SUBDOMAIN: \"APP_HAS_NO_SUBDOMAIN\",\n\tAPP_NOT_FOUND: \"APP_NOT_FOUND\",\n\tAPP_NOT_PUBLISHED: \"APP_NOT_PUBLISHED\",\n\tAPP_ALREADY_IN_WORKSPACE: \"APP_ALREADY_IN_WORKSPACE\",\n\tAPP_NOT_FOUND_IN_WORKSPACE: \"APP_NOT_FOUND_IN_WORKSPACE\",\n\tBUILD_FAILED: \"BUILD_FAILED\",\n\tBUILD_TIMEOUT: \"BUILD_TIMEOUT\",\n\t/** 400 — the order needs complete billing details for the service invoice (name, address and, in Brazil, CPF/CNPJ). Fill them with `PUT /v1/users/me/billing`. */\n\tBILLING_DETAILS_INCOMPLETE: \"BILLING_DETAILS_INCOMPLETE\",\n\t/** 400 — billing details failed validation; the field is in `details.path`. */\n\tBILLING_DETAILS_INVALID: \"BILLING_DETAILS_INVALID\",\n\t/** 402 — the bank refused the card charge. */\n\tCARD_DECLINED: \"CARD_DECLINED\",\n\t/** 400 — the plan can only be paid by PIX. */\n\tCARD_NOT_ALLOWED_FOR_PLAN: \"CARD_NOT_ALLOWED_FOR_PLAN\",\n\tCARD_NOT_FOUND: \"CARD_NOT_FOUND\",\n\tCERTIFICATE_NOT_FOUND: \"CERTIFICATE_NOT_FOUND\",\n\tCLEANUP_LANGUAGE_SAME_AS_CURRENT: \"CLEANUP_LANGUAGE_SAME_AS_CURRENT\",\n\tCONTAINER_ALREADY_RUNNING: \"CONTAINER_ALREADY_RUNNING\",\n\t/** 400 — no active coupon with this code. */\n\tCOUPON_INVALID: \"COUPON_INVALID\",\n\tCOUPON_INACTIVE: \"COUPON_INACTIVE\",\n\tCOUPON_NOT_STARTED: \"COUPON_NOT_STARTED\",\n\tCOUPON_EXPIRED: \"COUPON_EXPIRED\",\n\t/** 400 — the coupon reached its total number of uses. */\n\tCOUPON_EXHAUSTED: \"COUPON_EXHAUSTED\",\n\t/** 400 — the account already used this coupon as many times as allowed. */\n\tCOUPON_USER_LIMIT: \"COUPON_USER_LIMIT\",\n\t/** 400 — the coupon is not available to this account. */\n\tCOUPON_AUDIENCE: \"COUPON_AUDIENCE\",\n\t/** 400 — the coupon does not apply to this plan. */\n\tCOUPON_PLAN: \"COUPON_PLAN\",\n\t/** 400 — the coupon does not apply to this billing period. */\n\tCOUPON_DURATION: \"COUPON_DURATION\",\n\tCOUPON_PAYMENT_METHOD: \"COUPON_PAYMENT_METHOD\",\n\tCUSTOM_DOMAIN_RECORD_NOT_FOUND: \"CUSTOM_DOMAIN_RECORD_NOT_FOUND\",\n\tCUSTOM_DOMAIN_REGISTRATION_FAILED: \"CUSTOM_DOMAIN_REGISTRATION_FAILED\",\n\tDAILY_QUOTA_EXCEEDED: \"DAILY_QUOTA_EXCEEDED\",\n\tDATABASE_NOT_FOUND: \"DATABASE_NOT_FOUND\",\n\tDATABASE_NOT_RUNNING: \"DATABASE_NOT_RUNNING\",\n\tDATABASE_ALREADY_IN_WORKSPACE: \"DATABASE_ALREADY_IN_WORKSPACE\",\n\tDATABASE_NOT_FOUND_IN_WORKSPACE: \"DATABASE_NOT_FOUND_IN_WORKSPACE\",\n\tDATABASE_PERSISTENCE_FAILED: \"DATABASE_PERSISTENCE_FAILED\",\n\tDEPLOY_FAILED: \"DEPLOY_FAILED\",\n\tDEPLOYMENT_NOT_FOUND: \"DEPLOYMENT_NOT_FOUND\",\n\tDEPLOY_RATE_LIMITED: \"DEPLOY_RATE_LIMITED\",\n\tDOMAIN_ALREADY_IN_USE: \"DOMAIN_ALREADY_IN_USE\",\n\tENV_LIMIT_EXCEEDED: \"ENV_LIMIT_EXCEEDED\",\n\tENV_DUPLICATE_KEY: \"ENV_DUPLICATE_KEY\",\n\tENV_NOT_FOUND: \"ENV_NOT_FOUND\",\n\tFILE_TOO_LARGE: \"FILE_TOO_LARGE\",\n\tFILE_MODIFIED: \"FILE_MODIFIED\",\n\tFILE_NOT_FOUND: \"FILE_NOT_FOUND\",\n\tFILE_OR_FOLDER_NOT_FOUND: \"FILE_OR_FOLDER_NOT_FOUND\",\n\tFORBIDDEN: \"FORBIDDEN\",\n\tFORBIDDEN_DOMAIN: \"FORBIDDEN_DOMAIN\",\n\tFORBIDDEN_PATH: \"FORBIDDEN_PATH\",\n\tFORBIDDEN_KEY: \"FORBIDDEN_KEY\",\n\tFORCED_SNAPSHOT_RATE_LIMIT: \"FORCED_SNAPSHOT_RATE_LIMIT\",\n\tFREE_PLAN_NO_WEB_PUBLISH: \"FREE_PLAN_NO_WEB_PUBLISH\",\n\t/** 403 — the Free plan can no longer create applications or databases; a paid plan is required. */\n\tFREE_PLAN_SUSPENDED: \"FREE_PLAN_SUSPENDED\",\n\tINSTALLATION_NOT_FOUND: \"INSTALLATION_NOT_FOUND\",\n\tINSTALL_SHIELD_BLOCKED: \"INSTALL_SHIELD_BLOCKED\",\n\tINSTALL_TIMEOUT: \"INSTALL_TIMEOUT\",\n\tINSTALL_FAILED: \"INSTALL_FAILED\",\n\tINSTALL_CANCELLED: \"INSTALL_CANCELLED\",\n\tINSTALL_OUT_OF_MEMORY: \"INSTALL_OUT_OF_MEMORY\",\n\tINSTALL_QUEUE_FULL: \"INSTALL_QUEUE_FULL\",\n\tINSUFFICIENT_MEMORY: \"INSUFFICIENT_MEMORY\",\n\tINTERNAL_SERVER_ERROR: \"INTERNAL_SERVER_ERROR\",\n\tINVALID_CONFIG: \"INVALID_CONFIG\",\n\tINVALID_CUSTOM_DOMAIN_FORMAT: \"INVALID_CUSTOM_DOMAIN_FORMAT\",\n\tINVALID_HOSTNAME_FOR_APP: \"INVALID_HOSTNAME_FOR_APP\",\n\tINVALID_LANGUAGE: \"INVALID_LANGUAGE\",\n\tINVALID_MEMORY_FORMAT: \"INVALID_MEMORY_FORMAT\",\n\tINVALID_MONTHS: \"INVALID_MONTHS\",\n\tINVALID_OR_EXPIRED_CODE: \"INVALID_OR_EXPIRED_CODE\",\n\tINVALID_PARAMS: \"INVALID_PARAMS\",\n\tINVALID_PAYLOAD: \"INVALID_PAYLOAD\",\n\tINVALID_PATH: \"INVALID_PATH\",\n\tINVALID_PLAN: \"INVALID_PLAN\",\n\tINVALID_PLAN_NAME: \"INVALID_PLAN_NAME\",\n\tINVALID_RAM_LIMIT: \"INVALID_RAM_LIMIT\",\n\tINVALID_RANGE: \"INVALID_RANGE\",\n\tINVALID_SUBDOMAIN_FORMAT: \"INVALID_SUBDOMAIN_FORMAT\",\n\tINVALID_VERSION: \"INVALID_VERSION\",\n\tINVALID_ZIP: \"INVALID_ZIP\",\n\tINVALID_ZIP_STRUCTURE: \"INVALID_ZIP_STRUCTURE\",\n\tMAIN_FILE_NOT_FOUND: \"MAIN_FILE_NOT_FOUND\",\n\tMAX_APPS_REACHED: \"MAX_APPS_REACHED\",\n\tMAX_DATABASES_REACHED: \"MAX_DATABASES_REACHED\",\n\tMEMORY_BELOW_MINIMUM: \"MEMORY_BELOW_MINIMUM\",\n\tMEMORY_LIMIT_EXCEEDED: \"MEMORY_LIMIT_EXCEEDED\",\n\tMEMORY_MUST_BE_INTEGER: \"MEMORY_MUST_BE_INTEGER\",\n\tMEMORY_REQUIRED: \"MEMORY_REQUIRED\",\n\tMISSING_HEADERS: \"MISSING_HEADERS\",\n\tMISSING_PLAN_OR_MONTHS: \"MISSING_PLAN_OR_MONTHS\",\n\tMISSING_CONTENT: \"MISSING_CONTENT\",\n\tNOT_AN_UPGRADE: \"NOT_AN_UPGRADE\",\n\tNO_AUTHORIZED_PATHS: \"NO_AUTHORIZED_PATHS\",\n\tNO_CHANGES_PROVIDED: \"NO_CHANGES_PROVIDED\",\n\tNO_CUSTOM_DOMAIN: \"NO_CUSTOM_DOMAIN\",\n\tNO_FIELDS_TO_UPDATE: \"NO_FIELDS_TO_UPDATE\",\n\tNO_FILE_UPLOADED: \"NO_FILE_UPLOADED\",\n\tOPERATION_IN_PROGRESS: \"OPERATION_IN_PROGRESS\",\n\tORDER_NOT_FOUND: \"ORDER_NOT_FOUND\",\n\tORDER_NOT_PAID: \"ORDER_NOT_PAID\",\n\tORDER_NOT_PAYABLE: \"ORDER_NOT_PAYABLE\",\n\tORDER_NOT_REFUNDED: \"ORDER_NOT_REFUNDED\",\n\t/** 404 — the order has no payment receipt (unpaid, redeemed code or paid before receipts existed). */\n\tORDER_RECEIPT_UNAVAILABLE: \"ORDER_RECEIPT_UNAVAILABLE\",\n\tOWNER_APP_WITHOUT_LIMITS: \"OWNER_APP_WITHOUT_LIMITS\",\n\tPAYLOAD_TOO_LARGE: \"PAYLOAD_TOO_LARGE\",\n\t/** 409 — a folder in the path is an existing file (writing `app/x.js` when `app` is a file). */\n\tPATH_IS_FILE: \"PATH_IS_FILE\",\n\tPENDING_ORDER_LIMIT_REACHED: \"PENDING_ORDER_LIMIT_REACHED\",\n\tPAYMENT_METHOD_UNAVAILABLE: \"PAYMENT_METHOD_UNAVAILABLE\",\n\tPLAN_DOES_NOT_SUPPORT_CUSTOM_DOMAIN: \"PLAN_DOES_NOT_SUPPORT_CUSTOM_DOMAIN\",\n\tPLAN_DOES_NOT_SUPPORT_CUSTOM_SUBDOMAIN: \"PLAN_DOES_NOT_SUPPORT_CUSTOM_SUBDOMAIN\",\n\tPLAN_DOES_NOT_SUPPORT_WEB_PUBLISH: \"PLAN_DOES_NOT_SUPPORT_WEB_PUBLISH\",\n\tPLAN_MISMATCH_FOR_RENEWAL: \"PLAN_MISMATCH_FOR_RENEWAL\",\n\tPLAN_NOT_ALLOWED: \"PLAN_NOT_ALLOWED\",\n\tRATE_LIMIT_EXCEEDED: \"RATE_LIMIT_EXCEEDED\",\n\tREFUND_AMOUNT_EXCEEDS_PRICE: \"REFUND_AMOUNT_EXCEEDS_PRICE\",\n\tREPO_ALREADY_LINKED: \"REPO_ALREADY_LINKED\",\n\tRESTORE_COOLDOWN: \"RESTORE_COOLDOWN\",\n\tSNAPSHOT_ENGINE_MISMATCH: \"SNAPSHOT_ENGINE_MISMATCH\",\n\tSNAPSHOT_FAILED: \"SNAPSHOT_FAILED\",\n\tSNAPSHOT_IMPORT_FAILED: \"SNAPSHOT_IMPORT_FAILED\",\n\tSNAPSHOT_NOT_FOUND: \"SNAPSHOT_NOT_FOUND\",\n\tSNAPSHOT_RATE_LIMITED: \"SNAPSHOT_RATE_LIMITED\",\n\tSNAPSHOT_TYPE_MISMATCH: \"SNAPSHOT_TYPE_MISMATCH\",\n\tSNAPSHOT_TOO_LARGE: \"SNAPSHOT_TOO_LARGE\",\n\tSOURCE_CONFLICT: \"SOURCE_CONFLICT\",\n\tSOURCE_REQUIRED: \"SOURCE_REQUIRED\",\n\tSTORAGE_ABOVE_NEW_LIMIT: \"STORAGE_ABOVE_NEW_LIMIT\",\n\tSUBDOMAIN_CHANGE_RATE_LIMITED: \"SUBDOMAIN_CHANGE_RATE_LIMITED\",\n\tSUBDOMAIN_FORBIDDEN: \"SUBDOMAIN_FORBIDDEN\",\n\tSUBDOMAIN_TAKEN: \"SUBDOMAIN_TAKEN\",\n\t/** 400 — the CPF or CNPJ is not valid. */\n\tTAX_ID_INVALID: \"TAX_ID_INVALID\",\n\tTYPE_MISMATCH: \"TYPE_MISMATCH\",\n\tUSER_LIMITS_NOT_FOUND: \"USER_LIMITS_NOT_FOUND\",\n\tUSER_NOT_FOUND: \"USER_NOT_FOUND\",\n\tUSER_NOT_IN_WORKSPACE: \"USER_NOT_IN_WORKSPACE\",\n\tDATABASE_BANNED: \"DATABASE_BANNED\",\n\tVALIDATION_ERROR: \"VALIDATION_ERROR\",\n\tZIP_TOO_LARGE: \"ZIP_TOO_LARGE\",\n\tZIP_TOO_SMALL: \"ZIP_TOO_SMALL\",\n\tSTORAGE_FULL: \"STORAGE_FULL\",\n\tTARGET_IS_DIRECTORY: \"TARGET_IS_DIRECTORY\",\n\t...WORKSPACE_ERROR_CODES,\n} as const;\n\nexport const APIErrorCode = API_ERROR_CODES;\n\nexport type APIErrorCode = (typeof API_ERROR_CODES)[keyof typeof API_ERROR_CODES];\n","import type { ISODateString, SnowFlake, UserPlan } from \"../../v1\";\nimport type { APIApplication, APIDatabase } from \"./index\";\n\n/**\n * Granular workspace permission. Display group in `WORKSPACE_PERMISSIONS`.\n * The owner (`owner_id`) has no entry here: owner-only actions (rename/delete the workspace,\n * link/unlink projects, deploy webhook, web publishing) are allowed for the\n * owner only, never through a permission.\n * @see https://docs.vertracloud.app/api-reference/endpoint/workspaces/get\n */\nexport type WorkspacePermission =\n\t| \"apps:read\"\n\t| \"apps:manage\"\n\t| \"apps:lifecycle\"\n\t| \"apps:envs\"\n\t| \"apps:files\"\n\t| \"apps:delete\"\n\t| \"databases:read\"\n\t| \"databases:manage\"\n\t| \"databases:lifecycle\"\n\t| \"databases:credentials\"\n\t| \"databases:data\"\n\t| \"databases:delete\"\n\t| \"snapshots:read\"\n\t| \"snapshots:manage\"\n\t| \"members:read\"\n\t| \"members:manage\"\n\t| \"roles:manage\"\n\t| \"activities:read\";\n\nexport const WorkspacePermission = {\n\tAPPS_READ: \"apps:read\",\n\tAPPS_MANAGE: \"apps:manage\",\n\tAPPS_LIFECYCLE: \"apps:lifecycle\",\n\tAPPS_ENVS: \"apps:envs\",\n\tAPPS_FILES: \"apps:files\",\n\tAPPS_DELETE: \"apps:delete\",\n\tDATABASES_READ: \"databases:read\",\n\tDATABASES_MANAGE: \"databases:manage\",\n\tDATABASES_LIFECYCLE: \"databases:lifecycle\",\n\tDATABASES_CREDENTIALS: \"databases:credentials\",\n\tDATABASES_DATA: \"databases:data\",\n\tDATABASES_DELETE: \"databases:delete\",\n\tSNAPSHOTS_READ: \"snapshots:read\",\n\tSNAPSHOTS_MANAGE: \"snapshots:manage\",\n\tMEMBERS_READ: \"members:read\",\n\tMEMBERS_MANAGE: \"members:manage\",\n\tROLES_MANAGE: \"roles:manage\",\n\tACTIVITIES_READ: \"activities:read\",\n} as const satisfies Record<string, WorkspacePermission>;\n\nexport interface WorkspacePermissionEntry {\n\tgroup: \"apps\" | \"databases\" | \"snapshots\" | \"members\" | \"roles\" | \"activities\";\n}\n\n/**\n * Closed catalog of workspace permissions. A member whose role lacks the permission a route\n * requires gets 403 `WORKSPACE_PERMISSION_DENIED`.\n */\nexport const WORKSPACE_PERMISSIONS: Record<WorkspacePermission, WorkspacePermissionEntry> = {\n\t\"apps:read\": { group: \"apps\" },\n\t\"apps:manage\": { group: \"apps\" },\n\t\"apps:lifecycle\": { group: \"apps\" },\n\t\"apps:envs\": { group: \"apps\" },\n\t\"apps:files\": { group: \"apps\" },\n\t\"apps:delete\": { group: \"apps\" },\n\t\"databases:read\": { group: \"databases\" },\n\t\"databases:manage\": { group: \"databases\" },\n\t\"databases:lifecycle\": { group: \"databases\" },\n\t\"databases:credentials\": { group: \"databases\" },\n\t\"databases:data\": { group: \"databases\" },\n\t\"databases:delete\": { group: \"databases\" },\n\t\"snapshots:read\": { group: \"snapshots\" },\n\t\"snapshots:manage\": { group: \"snapshots\" },\n\t\"members:read\": { group: \"members\" },\n\t\"members:manage\": { group: \"members\" },\n\t\"roles:manage\": { group: \"roles\" },\n\t\"activities:read\": { group: \"activities\" },\n};\n\nexport const WORKSPACE_PERMISSION_LIST = Object.keys(WORKSPACE_PERMISSIONS) as WorkspacePermission[];\n\n/**\n * Seed role, created together with the workspace. It can be renamed and deleted like any other\n * role (it becomes a regular role; `preset` is not restored) and counts toward the plan's role limit.\n * @see https://docs.vertracloud.app/api-reference/endpoint/workspaces/get\n */\nexport type WorkspaceRolePreset = \"admin\" | \"developer\" | \"operator\" | \"viewer\";\nexport const WorkspaceRolePreset = {\n\tAdmin: \"admin\",\n\tDeveloper: \"developer\",\n\tOperator: \"operator\",\n\tViewer: \"viewer\",\n} as const satisfies Record<string, WorkspaceRolePreset>;\n\n/**\n * Permissions a seed role gets when the workspace is created. `admin` does NOT include\n * `snapshots:manage` (restoring/deleting snapshots is destructive); the owner can grant it per role.\n */\nexport function workspacePresetPermissions(preset: WorkspaceRolePreset): WorkspacePermission[] {\n\tswitch (preset) {\n\t\tcase \"admin\":\n\t\t\treturn WORKSPACE_PERMISSION_LIST.filter((p) => p !== \"snapshots:manage\");\n\t\tcase \"developer\":\n\t\t\treturn [\"apps:read\", \"apps:manage\", \"apps:lifecycle\", \"apps:envs\", \"apps:files\", \"databases:read\", \"databases:manage\", \"databases:lifecycle\", \"databases:credentials\", \"databases:data\", \"snapshots:read\", \"members:read\", \"activities:read\"];\n\t\tcase \"operator\":\n\t\t\treturn [\"apps:read\", \"apps:lifecycle\", \"databases:read\", \"databases:lifecycle\", \"snapshots:read\", \"members:read\", \"activities:read\"];\n\t\tcase \"viewer\":\n\t\t\treturn [\"apps:read\", \"databases:read\", \"snapshots:read\", \"members:read\", \"activities:read\"];\n\t}\n}\n\n/**\n * @see https://docs.vertracloud.app/api-reference/endpoint/workspaces/roles/list\n */\nexport interface APIWorkspaceRole {\n\tid: SnowFlake;\n\tworkspace_id: SnowFlake;\n\tname: string;\n\tpermissions: WorkspacePermission[];\n\t/** Seed role it came from; `null` for a manually created role. Informational only. */\n\tpreset: WorkspaceRolePreset | null;\n\t/** Display order. */\n\tposition: number;\n\tmembers_count: number;\n\tcreated_at: ISODateString;\n\tupdated_at: ISODateString;\n}\n\n/**\n * @see https://docs.vertracloud.app/api-reference/endpoint/workspaces/members/list\n */\nexport interface APIWorkspaceMember {\n\tuser_id: SnowFlake;\n\trole_id: SnowFlake;\n\trole_name: string;\n\tjoined_at: ISODateString;\n\t/** When the member's access expires; `null` = never. */\n\texpires_at: ISODateString | null;\n\tuser: {\n\t\tdisplay_name: string;\n\t\temail: string;\n\t};\n}\n\n/**\n * @see https://docs.vertracloud.app/api-reference/endpoint/workspaces/get\n */\nexport interface APIWorkspace {\n\tid: SnowFlake;\n\tname: string;\n\tdescription: string | null;\n\towner_id: SnowFlake;\n\towner: { display_name: string };\n\tmembers_count: number;\n\t/** Soft delete timestamp. `null` = active. */\n\tdeleted_at: ISODateString | null;\n\t/**\n\t * `true` when the OWNER's plan does not include workspaces (it expired or was downgraded):\n\t * reads keep working, every write returns `PLAN_RESTRICTED_FEATURE`. Nobody is removed — the\n\t * owner must upgrade to unfreeze it.\n\t */\n\tfrozen: boolean;\n\tcreated_at: ISODateString;\n\tupdated_at: ISODateString;\n}\n\n/**\n * @see https://docs.vertracloud.app/api-reference/endpoint/workspaces/get\n */\nexport interface APIWorkspaceInfoResponse extends APIWorkspace {\n\tmembers: APIWorkspaceMember[];\n\troles: APIWorkspaceRole[];\n\tapplications: APIApplication[];\n\tdatabases: APIDatabase[];\n\t/** Resolved permissions of the caller. The owner always gets the full list, regardless of role. */\n\tpermissions: WorkspacePermission[];\n\tis_owner: boolean;\n\t/** Owner's plan — it determines which features the workspace has. */\n\towner_plan_id: UserPlan;\n\t/** The caller's saved resource organization (folders, favorites) in this workspace. */\n\tresource_organization: APIWorkspaceResourceOrganization;\n}\n\nexport type WorkspaceResourceType = \"application\" | \"database\";\nexport const WorkspaceResourceType = { Application: \"application\", Database: \"database\" } as const satisfies Record<string, WorkspaceResourceType>;\n\nexport type WorkspaceResourceOrganizationScope = \"personal\" | \"workspace\";\nexport const WorkspaceResourceOrganizationScope = { Personal: \"personal\", Workspace: \"workspace\" } as const satisfies Record<string, WorkspaceResourceOrganizationScope>;\n\nexport type WorkspaceFolderColor = \"neutral\" | \"red\" | \"orange\" | \"yellow\" | \"green\" | \"blue\" | \"purple\";\nexport const WorkspaceFolderColor = { Neutral: \"neutral\", Red: \"red\", Orange: \"orange\", Yellow: \"yellow\", Green: \"green\", Blue: \"blue\", Purple: \"purple\" } as const satisfies Record<string, WorkspaceFolderColor>;\nexport const WORKSPACE_FOLDER_COLORS = Object.values(WorkspaceFolderColor) as WorkspaceFolderColor[];\n\nexport interface APIWorkspaceResourceRef {\n\tresource_type: WorkspaceResourceType;\n\tresource_id: SnowFlake;\n}\n\nexport interface APIWorkspaceFolderItem extends APIWorkspaceResourceRef {\n\tposition: number;\n}\n\nexport interface APIWorkspaceResourceFolder {\n\tid: SnowFlake;\n\tname: string;\n\tcolor: WorkspaceFolderColor;\n\tposition: number;\n\tresources: APIWorkspaceFolderItem[];\n\tcreated_at: ISODateString;\n\tupdated_at: ISODateString;\n}\n\nexport interface APIWorkspaceFavorite extends APIWorkspaceResourceRef {\n\tposition: number;\n\tcreated_at: ISODateString;\n}\n\nexport interface APIWorkspaceResourceOrganization {\n\tscope: WorkspaceResourceOrganizationScope;\n\tuser_id: SnowFlake;\n\tworkspace_id: SnowFlake | null;\n\tfolders: APIWorkspaceResourceFolder[];\n\tfavorites: APIWorkspaceFavorite[];\n}\n\n/**\n * @see https://docs.vertracloud.app/api-reference/endpoint/workspaces/invites/list\n */\nexport type WorkspaceInviteKind = \"email\" | \"link\";\nexport const WorkspaceInviteKind = { Email: \"email\", Link: \"link\" } as const satisfies Record<string, WorkspaceInviteKind>;\n\n/**\n * @see https://docs.vertracloud.app/api-reference/endpoint/workspaces/invites/list\n */\nexport interface APIWorkspaceInvite {\n\tid: SnowFlake;\n\tworkspace_id: SnowFlake;\n\tkind: WorkspaceInviteKind;\n\t/** Bound e-mail; only for `kind: \"email\"`. */\n\temail: string | null;\n\trole_id: SnowFlake;\n\trole_name: string;\n\tinvited_by: { id: SnowFlake; display_name: string };\n\texpires_at: ISODateString;\n\taccepted_at: ISODateString | null;\n\trevoked_at: ISODateString | null;\n\tuses: number;\n\t/** Only for `kind: \"link\"`; `null` = unlimited uses. */\n\tmax_uses: number | null;\n\t/** Access expiration applied to members who join through this invite; `null` = never. */\n\texpires_in_days: number | null;\n\tcreated_at: ISODateString;\n}\n\n/**\n * @see https://docs.vertracloud.app/api-reference/endpoint/workspaces/invites/create\n */\nexport interface APIWorkspaceInviteCreated extends APIWorkspaceInvite {\n\t/** Invite URL; only for `kind: \"link\"`, shown once. */\n\turl: string | null;\n}\n\n/**\n * What the invitee sees before accepting (`GET /v1/workspaces/invites/:token`).\n * @see https://docs.vertracloud.app/api-reference/endpoint/workspaces/invites/preview\n */\nexport interface APIWorkspaceInvitePreview {\n\tworkspace: { id: SnowFlake; name: string };\n\tinviter: { display_name: string };\n\trole_name: string;\n\tkind: WorkspaceInviteKind;\n\texpires_at: ISODateString;\n}\n\n/**\n * @see https://docs.vertracloud.app/api-reference/endpoint/workspaces/action-requests/list\n */\nexport type WorkspaceActionRequestAction = \"app_delete\" | \"database_delete\" | \"snapshot_create\" | \"snapshot_restore\";\nexport const WorkspaceActionRequestAction = {\n\tAppDelete: \"app_delete\",\n\tDatabaseDelete: \"database_delete\",\n\tSnapshotCreate: \"snapshot_create\",\n\tSnapshotRestore: \"snapshot_restore\",\n} as const satisfies Record<string, WorkspaceActionRequestAction>;\n\nexport type WorkspaceActionRequestStatus = \"pending\" | \"approved\" | \"rejected\" | \"expired\";\nexport const WorkspaceActionRequestStatus = {\n\tPending: \"pending\",\n\tApproved: \"approved\",\n\tRejected: \"rejected\",\n\tExpired: \"expired\",\n} as const satisfies Record<string, WorkspaceActionRequestStatus>;\n\n/**\n * `params` of an action request, per `action`. Actions without parameters take an empty object;\n * unknown keys are rejected with `WORKSPACE_ACTION_INVALID_PARAMS`.\n * @see https://docs.vertracloud.app/api-reference/endpoint/workspaces/action-requests/create\n */\nexport interface WorkspaceActionRequestParams {\n\tapp_delete: Record<string, never>;\n\tdatabase_delete: Record<string, never>;\n\tsnapshot_create: Record<string, never>;\n\t/** The snapshot must belong to the request's resource. */\n\tsnapshot_restore: { snapshot_id: SnowFlake };\n}\n\ninterface APIWorkspaceActionRequestBase {\n\tid: SnowFlake;\n\tworkspace_id: SnowFlake;\n\tresource_type: WorkspaceResourceType;\n\tresource_id: SnowFlake;\n\tresource_name: string | null;\n\tstatus: WorkspaceActionRequestStatus;\n\trequested_by: { id: SnowFlake; display_name: string };\n\tdecided_by: { id: SnowFlake; display_name: string } | null;\n\tdecided_at: ISODateString | null;\n\texpires_at: ISODateString;\n\tcreated_at: ISODateString;\n}\n\n/**\n * A request for a destructive/sensitive action made by a member who lacks its permission, to be\n * approved by someone who has it. Expires after 24 h without a decision. Discriminated by `action`,\n * which decides the shape of `params`.\n * @see https://docs.vertracloud.app/api-reference/endpoint/workspaces/action-requests/list\n */\nexport type APIWorkspaceActionRequest = {\n\t[A in WorkspaceActionRequestAction]: APIWorkspaceActionRequestBase & { action: A; params: WorkspaceActionRequestParams[A] };\n}[WorkspaceActionRequestAction];\n\n/**\n * Workspace error codes. Stable English sentinels returned in `code`; clients are expected to\n * translate them.\n * @see https://docs.vertracloud.app/api-reference/endpoint/workspaces/get\n */\nexport const WORKSPACE_ERROR_CODES = {\n\tWORKSPACE_NOT_FOUND: \"WORKSPACE_NOT_FOUND\",\n\tWORKSPACE_NAME_ALREADY_EXISTS: \"WORKSPACE_NAME_ALREADY_EXISTS\",\n\tWORKSPACE_MEMBER_LIMIT_REACHED: \"WORKSPACE_MEMBER_LIMIT_REACHED\",\n\tWORKSPACE_ROLE_LIMIT_REACHED: \"WORKSPACE_ROLE_LIMIT_REACHED\",\n\tWORKSPACE_ROLE_IN_USE: \"WORKSPACE_ROLE_IN_USE\",\n\tWORKSPACE_ROLE_NOT_FOUND: \"WORKSPACE_ROLE_NOT_FOUND\",\n\tWORKSPACE_ROLE_NAME_ALREADY_EXISTS: \"WORKSPACE_ROLE_NAME_ALREADY_EXISTS\",\n\tWORKSPACE_PERMISSION_DENIED: \"WORKSPACE_PERMISSION_DENIED\",\n\tWORKSPACE_PERMISSION_ESCALATION: \"WORKSPACE_PERMISSION_ESCALATION\",\n\tWORKSPACE_INVITE_NOT_FOUND: \"WORKSPACE_INVITE_NOT_FOUND\",\n\tWORKSPACE_INVITE_EXPIRED: \"WORKSPACE_INVITE_EXPIRED\",\n\tWORKSPACE_INVITE_EMAIL_MISMATCH: \"WORKSPACE_INVITE_EMAIL_MISMATCH\",\n\t/** 400 — the invited account turned off workspace invites by email. */\n\tWORKSPACE_INVITES_DISABLED: \"WORKSPACE_INVITES_DISABLED\",\n\t/** 409 — the account is already the owner or a member of the workspace. */\n\tWORKSPACE_ALREADY_MEMBER: \"WORKSPACE_ALREADY_MEMBER\",\n\tWORKSPACE_OWNER_ONLY: \"WORKSPACE_OWNER_ONLY\",\n\tWORKSPACE_ACTION_REQUEST_NOT_FOUND: \"WORKSPACE_ACTION_REQUEST_NOT_FOUND\",\n\t/** 410 — the request expired before anyone decided on it. */\n\tWORKSPACE_ACTION_REQUEST_EXPIRED: \"WORKSPACE_ACTION_REQUEST_EXPIRED\",\n\t/** 409 — the request was already approved or rejected. */\n\tWORKSPACE_ACTION_REQUEST_ALREADY_DECIDED: \"WORKSPACE_ACTION_REQUEST_ALREADY_DECIDED\",\n\t/** 400 — the requester already has the permission; perform the action directly. */\n\tWORKSPACE_ACTION_NOT_NEEDED: \"WORKSPACE_ACTION_NOT_NEEDED\",\n\t/** 400 — the request `params` failed the action's validation (e.g. a snapshot of another resource). */\n\tWORKSPACE_ACTION_INVALID_PARAMS: \"WORKSPACE_ACTION_INVALID_PARAMS\",\n\t/** 409 — a pending request already exists for the same action on the same resource. */\n\tWORKSPACE_ACTION_REQUEST_PENDING: \"WORKSPACE_ACTION_REQUEST_PENDING\",\n\tWORKSPACE_RESOURCE_FOLDER_NOT_FOUND: \"WORKSPACE_RESOURCE_FOLDER_NOT_FOUND\",\n\tWORKSPACE_RESOURCE_FOLDER_NAME_CONFLICT: \"WORKSPACE_RESOURCE_FOLDER_NAME_CONFLICT\",\n\tWORKSPACE_RESOURCE_NOT_FOUND: \"WORKSPACE_RESOURCE_NOT_FOUND\",\n\tPLAN_RESTRICTED_FEATURE: \"PLAN_RESTRICTED_FEATURE\",\n} as const;\nexport type WorkspaceErrorCode = (typeof WORKSPACE_ERROR_CODES)[keyof typeof WORKSPACE_ERROR_CODES];\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["api-error.ts","workspace.ts"],"sourcesContent":["import { WORKSPACE_ERROR_CODES } from \"./workspace\";\n\n/** Stable error sentinels returned by routes available to API keys. */\nexport const API_ERROR_CODES = {\n\tACCESS_DENIED: \"ACCESS_DENIED\",\n\tAPI_KEY_INVALID: \"API_KEY_INVALID\",\n\t// Key management (`/v1/users/me/api-keys`) — dashboard-session routes.\n\tAPI_KEY_NOT_FOUND: \"API_KEY_NOT_FOUND\",\n\tAPI_KEY_LIMIT_REACHED: \"API_KEY_LIMIT_REACHED\",\n\tAPI_KEY_INVALID_NAME: \"API_KEY_INVALID_NAME\",\n\tAPI_KEY_INVALID_SCOPES: \"API_KEY_INVALID_SCOPES\",\n\tAPI_KEY_INVALID_IPS: \"API_KEY_INVALID_IPS\",\n\tAPI_KEY_IP_DENIED: \"API_KEY_IP_DENIED\",\n\tAPI_KEY_SCOPE_DENIED: \"API_KEY_SCOPE_DENIED\",\n\t/** 403 — the route only accepts a dashboard session; API keys are refused. */\n\tWEBSITE_ONLY: \"WEBSITE_ONLY\",\n\tAUTH_TOKEN_MISSING: \"AUTH_TOKEN_MISSING\",\n\tACCOUNT_BANNED: \"ACCOUNT_BANNED\",\n\tAPP_SHIELD_COOLDOWN: \"APP_SHIELD_COOLDOWN\",\n\tAPP_BANNED: \"APP_BANNED\",\n\tAPP_ALREADY_PUBLISHED: \"APP_ALREADY_PUBLISHED\",\n\tAPP_HAS_NO_SUBDOMAIN: \"APP_HAS_NO_SUBDOMAIN\",\n\tAPP_NOT_FOUND: \"APP_NOT_FOUND\",\n\tAPP_NOT_PUBLISHED: \"APP_NOT_PUBLISHED\",\n\tAPP_ALREADY_IN_WORKSPACE: \"APP_ALREADY_IN_WORKSPACE\",\n\tAPP_NOT_FOUND_IN_WORKSPACE: \"APP_NOT_FOUND_IN_WORKSPACE\",\n\tBUILD_FAILED: \"BUILD_FAILED\",\n\tBUILD_TIMEOUT: \"BUILD_TIMEOUT\",\n\t/** 400 — the order needs complete billing details for the service invoice (name, address and, in Brazil, CPF/CNPJ). Fill them with `PUT /v1/users/me/billing`. */\n\tBILLING_DETAILS_INCOMPLETE: \"BILLING_DETAILS_INCOMPLETE\",\n\t/** 400 — billing details failed validation; the field is in `details.path`. */\n\tBILLING_DETAILS_INVALID: \"BILLING_DETAILS_INVALID\",\n\t/** 402 — the bank refused the card charge. */\n\tCARD_DECLINED: \"CARD_DECLINED\",\n\t/** 400 — the plan can only be paid by PIX. */\n\tCARD_NOT_ALLOWED_FOR_PLAN: \"CARD_NOT_ALLOWED_FOR_PLAN\",\n\tCARD_NOT_FOUND: \"CARD_NOT_FOUND\",\n\tCERTIFICATE_NOT_FOUND: \"CERTIFICATE_NOT_FOUND\",\n\tCLEANUP_LANGUAGE_SAME_AS_CURRENT: \"CLEANUP_LANGUAGE_SAME_AS_CURRENT\",\n\tCONTAINER_ALREADY_RUNNING: \"CONTAINER_ALREADY_RUNNING\",\n\t/** 400 — no active coupon with this code. */\n\tCOUPON_INVALID: \"COUPON_INVALID\",\n\tCOUPON_INACTIVE: \"COUPON_INACTIVE\",\n\tCOUPON_NOT_STARTED: \"COUPON_NOT_STARTED\",\n\tCOUPON_EXPIRED: \"COUPON_EXPIRED\",\n\t/** 400 — the coupon reached its total number of uses. */\n\tCOUPON_EXHAUSTED: \"COUPON_EXHAUSTED\",\n\t/** 400 — the account already used this coupon as many times as allowed. */\n\tCOUPON_USER_LIMIT: \"COUPON_USER_LIMIT\",\n\t/** 400 — the coupon is not available to this account. */\n\tCOUPON_AUDIENCE: \"COUPON_AUDIENCE\",\n\t/** 400 — the coupon does not apply to this plan. */\n\tCOUPON_PLAN: \"COUPON_PLAN\",\n\t/** 400 — the coupon does not apply to this billing period. */\n\tCOUPON_DURATION: \"COUPON_DURATION\",\n\tCOUPON_PAYMENT_METHOD: \"COUPON_PAYMENT_METHOD\",\n\tCUSTOM_DOMAIN_RECORD_NOT_FOUND: \"CUSTOM_DOMAIN_RECORD_NOT_FOUND\",\n\tCUSTOM_DOMAIN_REGISTRATION_FAILED: \"CUSTOM_DOMAIN_REGISTRATION_FAILED\",\n\tDAILY_QUOTA_EXCEEDED: \"DAILY_QUOTA_EXCEEDED\",\n\tDATABASE_NOT_FOUND: \"DATABASE_NOT_FOUND\",\n\tDATABASE_NOT_RUNNING: \"DATABASE_NOT_RUNNING\",\n\tDATABASE_ALREADY_IN_WORKSPACE: \"DATABASE_ALREADY_IN_WORKSPACE\",\n\tDATABASE_NOT_FOUND_IN_WORKSPACE: \"DATABASE_NOT_FOUND_IN_WORKSPACE\",\n\tDATABASE_PERSISTENCE_FAILED: \"DATABASE_PERSISTENCE_FAILED\",\n\tDEPLOY_FAILED: \"DEPLOY_FAILED\",\n\tDEPLOYMENT_NOT_FOUND: \"DEPLOYMENT_NOT_FOUND\",\n\tDEPLOY_RATE_LIMITED: \"DEPLOY_RATE_LIMITED\",\n\tDOMAIN_ALREADY_IN_USE: \"DOMAIN_ALREADY_IN_USE\",\n\tENV_LIMIT_EXCEEDED: \"ENV_LIMIT_EXCEEDED\",\n\tENV_DUPLICATE_KEY: \"ENV_DUPLICATE_KEY\",\n\tENV_NOT_FOUND: \"ENV_NOT_FOUND\",\n\tFILE_TOO_LARGE: \"FILE_TOO_LARGE\",\n\tFILE_MODIFIED: \"FILE_MODIFIED\",\n\tFILE_NOT_FOUND: \"FILE_NOT_FOUND\",\n\tFILE_OR_FOLDER_NOT_FOUND: \"FILE_OR_FOLDER_NOT_FOUND\",\n\tFORBIDDEN: \"FORBIDDEN\",\n\tFORBIDDEN_DOMAIN: \"FORBIDDEN_DOMAIN\",\n\tFORBIDDEN_PATH: \"FORBIDDEN_PATH\",\n\tFORBIDDEN_KEY: \"FORBIDDEN_KEY\",\n\tFORCED_SNAPSHOT_RATE_LIMIT: \"FORCED_SNAPSHOT_RATE_LIMIT\",\n\tFREE_PLAN_NO_WEB_PUBLISH: \"FREE_PLAN_NO_WEB_PUBLISH\",\n\t/** 403 — the Free plan can no longer create applications or databases; a paid plan is required. */\n\tFREE_PLAN_SUSPENDED: \"FREE_PLAN_SUSPENDED\",\n\tINSTALLATION_NOT_FOUND: \"INSTALLATION_NOT_FOUND\",\n\tINSTALL_SHIELD_BLOCKED: \"INSTALL_SHIELD_BLOCKED\",\n\tINSTALL_TIMEOUT: \"INSTALL_TIMEOUT\",\n\tINSTALL_FAILED: \"INSTALL_FAILED\",\n\tINSTALL_CANCELLED: \"INSTALL_CANCELLED\",\n\tINSTALL_OUT_OF_MEMORY: \"INSTALL_OUT_OF_MEMORY\",\n\tINSTALL_QUEUE_FULL: \"INSTALL_QUEUE_FULL\",\n\tINSUFFICIENT_MEMORY: \"INSUFFICIENT_MEMORY\",\n\tINTERNAL_SERVER_ERROR: \"INTERNAL_SERVER_ERROR\",\n\tINVALID_CONFIG: \"INVALID_CONFIG\",\n\tINVALID_CUSTOM_DOMAIN_FORMAT: \"INVALID_CUSTOM_DOMAIN_FORMAT\",\n\tINVALID_HOSTNAME_FOR_APP: \"INVALID_HOSTNAME_FOR_APP\",\n\tINVALID_LANGUAGE: \"INVALID_LANGUAGE\",\n\tINVALID_MEMORY_FORMAT: \"INVALID_MEMORY_FORMAT\",\n\tINVALID_MONTHS: \"INVALID_MONTHS\",\n\tINVALID_OR_EXPIRED_CODE: \"INVALID_OR_EXPIRED_CODE\",\n\tINVALID_PARAMS: \"INVALID_PARAMS\",\n\tINVALID_PAYLOAD: \"INVALID_PAYLOAD\",\n\tINVALID_PATH: \"INVALID_PATH\",\n\tINVALID_PLAN: \"INVALID_PLAN\",\n\tINVALID_PLAN_NAME: \"INVALID_PLAN_NAME\",\n\tINVALID_RAM_LIMIT: \"INVALID_RAM_LIMIT\",\n\tINVALID_RANGE: \"INVALID_RANGE\",\n\tINVALID_SUBDOMAIN_FORMAT: \"INVALID_SUBDOMAIN_FORMAT\",\n\tINVALID_VERSION: \"INVALID_VERSION\",\n\tINVALID_ZIP: \"INVALID_ZIP\",\n\tINVALID_ZIP_STRUCTURE: \"INVALID_ZIP_STRUCTURE\",\n\tMAIN_FILE_NOT_FOUND: \"MAIN_FILE_NOT_FOUND\",\n\tMAX_APPS_REACHED: \"MAX_APPS_REACHED\",\n\tMAX_DATABASES_REACHED: \"MAX_DATABASES_REACHED\",\n\tMEMORY_BELOW_MINIMUM: \"MEMORY_BELOW_MINIMUM\",\n\tMEMORY_LIMIT_EXCEEDED: \"MEMORY_LIMIT_EXCEEDED\",\n\tMEMORY_MUST_BE_INTEGER: \"MEMORY_MUST_BE_INTEGER\",\n\tMEMORY_REQUIRED: \"MEMORY_REQUIRED\",\n\tMISSING_HEADERS: \"MISSING_HEADERS\",\n\tMISSING_PLAN_OR_MONTHS: \"MISSING_PLAN_OR_MONTHS\",\n\tMISSING_CONTENT: \"MISSING_CONTENT\",\n\tNOT_AN_UPGRADE: \"NOT_AN_UPGRADE\",\n\tNO_AUTHORIZED_PATHS: \"NO_AUTHORIZED_PATHS\",\n\tNO_CHANGES_PROVIDED: \"NO_CHANGES_PROVIDED\",\n\tNO_CUSTOM_DOMAIN: \"NO_CUSTOM_DOMAIN\",\n\tNO_FIELDS_TO_UPDATE: \"NO_FIELDS_TO_UPDATE\",\n\tNO_FILE_UPLOADED: \"NO_FILE_UPLOADED\",\n\tOPERATION_IN_PROGRESS: \"OPERATION_IN_PROGRESS\",\n\tORDER_NOT_FOUND: \"ORDER_NOT_FOUND\",\n\tORDER_NOT_PAID: \"ORDER_NOT_PAID\",\n\tORDER_NOT_PAYABLE: \"ORDER_NOT_PAYABLE\",\n\tORDER_NOT_REFUNDED: \"ORDER_NOT_REFUNDED\",\n\t/** 404 — the order has no payment receipt (unpaid, redeemed code or paid before receipts existed). */\n\tORDER_RECEIPT_UNAVAILABLE: \"ORDER_RECEIPT_UNAVAILABLE\",\n\tOWNER_APP_WITHOUT_LIMITS: \"OWNER_APP_WITHOUT_LIMITS\",\n\tPAYLOAD_TOO_LARGE: \"PAYLOAD_TOO_LARGE\",\n\t/** 409 — a folder in the path is an existing file (writing `app/x.js` when `app` is a file). */\n\tPATH_IS_FILE: \"PATH_IS_FILE\",\n\tPENDING_ORDER_LIMIT_REACHED: \"PENDING_ORDER_LIMIT_REACHED\",\n\tPAYMENT_METHOD_UNAVAILABLE: \"PAYMENT_METHOD_UNAVAILABLE\",\n\t/** 403 — the plan does not include automatic rollback (`deploy.auto_rollback: true` below Intermediary). */\n\tPLAN_DOES_NOT_SUPPORT_AUTO_ROLLBACK: \"PLAN_DOES_NOT_SUPPORT_AUTO_ROLLBACK\",\n\tPLAN_DOES_NOT_SUPPORT_CUSTOM_DOMAIN: \"PLAN_DOES_NOT_SUPPORT_CUSTOM_DOMAIN\",\n\tPLAN_DOES_NOT_SUPPORT_CUSTOM_SUBDOMAIN: \"PLAN_DOES_NOT_SUPPORT_CUSTOM_SUBDOMAIN\",\n\t/** 403 — the plan does not include rollback to earlier releases. */\n\tPLAN_DOES_NOT_SUPPORT_ROLLBACK: \"PLAN_DOES_NOT_SUPPORT_ROLLBACK\",\n\tPLAN_DOES_NOT_SUPPORT_WEB_PUBLISH: \"PLAN_DOES_NOT_SUPPORT_WEB_PUBLISH\",\n\t/** 403 — the plan does not include zero-downtime deploys (`deploy.zero_downtime: \"on\"` below Enterprise). */\n\tPLAN_DOES_NOT_SUPPORT_ZERO_DOWNTIME: \"PLAN_DOES_NOT_SUPPORT_ZERO_DOWNTIME\",\n\tPLAN_MISMATCH_FOR_RENEWAL: \"PLAN_MISMATCH_FOR_RENEWAL\",\n\tPLAN_NOT_ALLOWED: \"PLAN_NOT_ALLOWED\",\n\tRATE_LIMIT_EXCEEDED: \"RATE_LIMIT_EXCEEDED\",\n\tREFUND_AMOUNT_EXCEEDS_PRICE: \"REFUND_AMOUNT_EXCEEDS_PRICE\",\n\t/** 409 — the release is already the active one. */\n\tRELEASE_ALREADY_ACTIVE: \"RELEASE_ALREADY_ACTIVE\",\n\t/** 410 — the release's kept code has expired or is outside the limit of the plan. */\n\tRELEASE_EXPIRED: \"RELEASE_EXPIRED\",\n\t/** 404 — the release does not exist or belongs to another application. */\n\tRELEASE_NOT_FOUND: \"RELEASE_NOT_FOUND\",\n\tREPO_ALREADY_LINKED: \"REPO_ALREADY_LINKED\",\n\tRESTORE_COOLDOWN: \"RESTORE_COOLDOWN\",\n\tSNAPSHOT_ENGINE_MISMATCH: \"SNAPSHOT_ENGINE_MISMATCH\",\n\tSNAPSHOT_FAILED: \"SNAPSHOT_FAILED\",\n\tSNAPSHOT_IMPORT_FAILED: \"SNAPSHOT_IMPORT_FAILED\",\n\tSNAPSHOT_NOT_FOUND: \"SNAPSHOT_NOT_FOUND\",\n\tSNAPSHOT_RATE_LIMITED: \"SNAPSHOT_RATE_LIMITED\",\n\tSNAPSHOT_TYPE_MISMATCH: \"SNAPSHOT_TYPE_MISMATCH\",\n\tSNAPSHOT_TOO_LARGE: \"SNAPSHOT_TOO_LARGE\",\n\tSOURCE_CONFLICT: \"SOURCE_CONFLICT\",\n\tSOURCE_REQUIRED: \"SOURCE_REQUIRED\",\n\tSTORAGE_ABOVE_NEW_LIMIT: \"STORAGE_ABOVE_NEW_LIMIT\",\n\tSUBDOMAIN_CHANGE_RATE_LIMITED: \"SUBDOMAIN_CHANGE_RATE_LIMITED\",\n\tSUBDOMAIN_FORBIDDEN: \"SUBDOMAIN_FORBIDDEN\",\n\tSUBDOMAIN_TAKEN: \"SUBDOMAIN_TAKEN\",\n\t/** 400 — the CPF or CNPJ is not valid. */\n\tTAX_ID_INVALID: \"TAX_ID_INVALID\",\n\tTYPE_MISMATCH: \"TYPE_MISMATCH\",\n\tUSER_LIMITS_NOT_FOUND: \"USER_LIMITS_NOT_FOUND\",\n\tUSER_NOT_FOUND: \"USER_NOT_FOUND\",\n\tUSER_NOT_IN_WORKSPACE: \"USER_NOT_IN_WORKSPACE\",\n\tDATABASE_BANNED: \"DATABASE_BANNED\",\n\tVALIDATION_ERROR: \"VALIDATION_ERROR\",\n\tZIP_TOO_LARGE: \"ZIP_TOO_LARGE\",\n\tZIP_TOO_SMALL: \"ZIP_TOO_SMALL\",\n\tSTORAGE_FULL: \"STORAGE_FULL\",\n\tTARGET_IS_DIRECTORY: \"TARGET_IS_DIRECTORY\",\n\t...WORKSPACE_ERROR_CODES,\n} as const;\n\nexport const APIErrorCode = API_ERROR_CODES;\n\nexport type APIErrorCode = (typeof API_ERROR_CODES)[keyof typeof API_ERROR_CODES];\n","import type { ISODateString, SnowFlake, UserPlan } from \"../../v1\";\nimport type { APIApplication, APIDatabase } from \"./index\";\n\n/**\n * Granular workspace permission. Display group in `WORKSPACE_PERMISSIONS`.\n * The owner (`owner_id`) has no entry here: owner-only actions (rename/delete the workspace,\n * link/unlink projects, deploy webhook, web publishing) are allowed for the\n * owner only, never through a permission.\n * @see https://docs.vertracloud.app/api-reference/endpoint/workspaces/get\n */\nexport type WorkspacePermission =\n\t| \"apps:read\"\n\t| \"apps:manage\"\n\t| \"apps:lifecycle\"\n\t| \"apps:envs\"\n\t| \"apps:files\"\n\t| \"apps:delete\"\n\t| \"databases:read\"\n\t| \"databases:manage\"\n\t| \"databases:lifecycle\"\n\t| \"databases:credentials\"\n\t| \"databases:data\"\n\t| \"databases:delete\"\n\t| \"snapshots:read\"\n\t| \"snapshots:manage\"\n\t| \"members:read\"\n\t| \"members:manage\"\n\t| \"roles:manage\"\n\t| \"activities:read\";\n\nexport const WorkspacePermission = {\n\tAPPS_READ: \"apps:read\",\n\tAPPS_MANAGE: \"apps:manage\",\n\tAPPS_LIFECYCLE: \"apps:lifecycle\",\n\tAPPS_ENVS: \"apps:envs\",\n\tAPPS_FILES: \"apps:files\",\n\tAPPS_DELETE: \"apps:delete\",\n\tDATABASES_READ: \"databases:read\",\n\tDATABASES_MANAGE: \"databases:manage\",\n\tDATABASES_LIFECYCLE: \"databases:lifecycle\",\n\tDATABASES_CREDENTIALS: \"databases:credentials\",\n\tDATABASES_DATA: \"databases:data\",\n\tDATABASES_DELETE: \"databases:delete\",\n\tSNAPSHOTS_READ: \"snapshots:read\",\n\tSNAPSHOTS_MANAGE: \"snapshots:manage\",\n\tMEMBERS_READ: \"members:read\",\n\tMEMBERS_MANAGE: \"members:manage\",\n\tROLES_MANAGE: \"roles:manage\",\n\tACTIVITIES_READ: \"activities:read\",\n} as const satisfies Record<string, WorkspacePermission>;\n\nexport interface WorkspacePermissionEntry {\n\tgroup: \"apps\" | \"databases\" | \"snapshots\" | \"members\" | \"roles\" | \"activities\";\n}\n\n/**\n * Closed catalog of workspace permissions. A member whose role lacks the permission a route\n * requires gets 403 `WORKSPACE_PERMISSION_DENIED`.\n */\nexport const WORKSPACE_PERMISSIONS: Record<WorkspacePermission, WorkspacePermissionEntry> = {\n\t\"apps:read\": { group: \"apps\" },\n\t\"apps:manage\": { group: \"apps\" },\n\t\"apps:lifecycle\": { group: \"apps\" },\n\t\"apps:envs\": { group: \"apps\" },\n\t\"apps:files\": { group: \"apps\" },\n\t\"apps:delete\": { group: \"apps\" },\n\t\"databases:read\": { group: \"databases\" },\n\t\"databases:manage\": { group: \"databases\" },\n\t\"databases:lifecycle\": { group: \"databases\" },\n\t\"databases:credentials\": { group: \"databases\" },\n\t\"databases:data\": { group: \"databases\" },\n\t\"databases:delete\": { group: \"databases\" },\n\t\"snapshots:read\": { group: \"snapshots\" },\n\t\"snapshots:manage\": { group: \"snapshots\" },\n\t\"members:read\": { group: \"members\" },\n\t\"members:manage\": { group: \"members\" },\n\t\"roles:manage\": { group: \"roles\" },\n\t\"activities:read\": { group: \"activities\" },\n};\n\nexport const WORKSPACE_PERMISSION_LIST = Object.keys(WORKSPACE_PERMISSIONS) as WorkspacePermission[];\n\n/**\n * Seed role, created together with the workspace. It can be renamed and deleted like any other\n * role (it becomes a regular role; `preset` is not restored) and counts toward the plan's role limit.\n * @see https://docs.vertracloud.app/api-reference/endpoint/workspaces/get\n */\nexport type WorkspaceRolePreset = \"admin\" | \"developer\" | \"operator\" | \"viewer\";\nexport const WorkspaceRolePreset = {\n\tAdmin: \"admin\",\n\tDeveloper: \"developer\",\n\tOperator: \"operator\",\n\tViewer: \"viewer\",\n} as const satisfies Record<string, WorkspaceRolePreset>;\n\n/**\n * Permissions a seed role gets when the workspace is created. `admin` does NOT include\n * `snapshots:manage` (restoring/deleting snapshots is destructive); the owner can grant it per role.\n */\nexport function workspacePresetPermissions(preset: WorkspaceRolePreset): WorkspacePermission[] {\n\tswitch (preset) {\n\t\tcase \"admin\":\n\t\t\treturn WORKSPACE_PERMISSION_LIST.filter((p) => p !== \"snapshots:manage\");\n\t\tcase \"developer\":\n\t\t\treturn [\"apps:read\", \"apps:manage\", \"apps:lifecycle\", \"apps:envs\", \"apps:files\", \"databases:read\", \"databases:manage\", \"databases:lifecycle\", \"databases:credentials\", \"databases:data\", \"snapshots:read\", \"members:read\", \"activities:read\"];\n\t\tcase \"operator\":\n\t\t\treturn [\"apps:read\", \"apps:lifecycle\", \"databases:read\", \"databases:lifecycle\", \"snapshots:read\", \"members:read\", \"activities:read\"];\n\t\tcase \"viewer\":\n\t\t\treturn [\"apps:read\", \"databases:read\", \"snapshots:read\", \"members:read\", \"activities:read\"];\n\t}\n}\n\n/**\n * @see https://docs.vertracloud.app/api-reference/endpoint/workspaces/roles/list\n */\nexport interface APIWorkspaceRole {\n\tid: SnowFlake;\n\tworkspace_id: SnowFlake;\n\tname: string;\n\tpermissions: WorkspacePermission[];\n\t/** Seed role it came from; `null` for a manually created role. Informational only. */\n\tpreset: WorkspaceRolePreset | null;\n\t/** Display order. */\n\tposition: number;\n\tmembers_count: number;\n\tcreated_at: ISODateString;\n\tupdated_at: ISODateString;\n}\n\n/**\n * @see https://docs.vertracloud.app/api-reference/endpoint/workspaces/members/list\n */\nexport interface APIWorkspaceMember {\n\tuser_id: SnowFlake;\n\trole_id: SnowFlake;\n\trole_name: string;\n\tjoined_at: ISODateString;\n\t/** When the member's access expires; `null` = never. */\n\texpires_at: ISODateString | null;\n\tuser: {\n\t\tdisplay_name: string;\n\t\temail: string;\n\t};\n}\n\n/**\n * @see https://docs.vertracloud.app/api-reference/endpoint/workspaces/get\n */\nexport interface APIWorkspace {\n\tid: SnowFlake;\n\tname: string;\n\tdescription: string | null;\n\towner_id: SnowFlake;\n\towner: { display_name: string };\n\tmembers_count: number;\n\t/** Soft delete timestamp. `null` = active. */\n\tdeleted_at: ISODateString | null;\n\t/**\n\t * `true` when the OWNER's plan does not include workspaces (it expired or was downgraded):\n\t * reads keep working, every write returns `PLAN_RESTRICTED_FEATURE`. Nobody is removed — the\n\t * owner must upgrade to unfreeze it.\n\t */\n\tfrozen: boolean;\n\tcreated_at: ISODateString;\n\tupdated_at: ISODateString;\n}\n\n/**\n * @see https://docs.vertracloud.app/api-reference/endpoint/workspaces/get\n */\nexport interface APIWorkspaceInfoResponse extends APIWorkspace {\n\tmembers: APIWorkspaceMember[];\n\troles: APIWorkspaceRole[];\n\tapplications: APIApplication[];\n\tdatabases: APIDatabase[];\n\t/** Resolved permissions of the caller. The owner always gets the full list, regardless of role. */\n\tpermissions: WorkspacePermission[];\n\tis_owner: boolean;\n\t/** Owner's plan — it determines which features the workspace has. */\n\towner_plan_id: UserPlan;\n\t/** The caller's saved resource organization (folders, favorites) in this workspace. */\n\tresource_organization: APIWorkspaceResourceOrganization;\n}\n\nexport type WorkspaceResourceType = \"application\" | \"database\";\nexport const WorkspaceResourceType = { Application: \"application\", Database: \"database\" } as const satisfies Record<string, WorkspaceResourceType>;\n\nexport type WorkspaceResourceOrganizationScope = \"personal\" | \"workspace\";\nexport const WorkspaceResourceOrganizationScope = { Personal: \"personal\", Workspace: \"workspace\" } as const satisfies Record<string, WorkspaceResourceOrganizationScope>;\n\nexport type WorkspaceFolderColor = \"neutral\" | \"red\" | \"orange\" | \"yellow\" | \"green\" | \"blue\" | \"purple\";\nexport const WorkspaceFolderColor = { Neutral: \"neutral\", Red: \"red\", Orange: \"orange\", Yellow: \"yellow\", Green: \"green\", Blue: \"blue\", Purple: \"purple\" } as const satisfies Record<string, WorkspaceFolderColor>;\nexport const WORKSPACE_FOLDER_COLORS = Object.values(WorkspaceFolderColor) as WorkspaceFolderColor[];\n\nexport interface APIWorkspaceResourceRef {\n\tresource_type: WorkspaceResourceType;\n\tresource_id: SnowFlake;\n}\n\nexport interface APIWorkspaceFolderItem extends APIWorkspaceResourceRef {\n\tposition: number;\n}\n\nexport interface APIWorkspaceResourceFolder {\n\tid: SnowFlake;\n\tname: string;\n\tcolor: WorkspaceFolderColor;\n\tposition: number;\n\tresources: APIWorkspaceFolderItem[];\n\tcreated_at: ISODateString;\n\tupdated_at: ISODateString;\n}\n\nexport interface APIWorkspaceFavorite extends APIWorkspaceResourceRef {\n\tposition: number;\n\tcreated_at: ISODateString;\n}\n\nexport interface APIWorkspaceResourceOrganization {\n\tscope: WorkspaceResourceOrganizationScope;\n\tuser_id: SnowFlake;\n\tworkspace_id: SnowFlake | null;\n\tfolders: APIWorkspaceResourceFolder[];\n\tfavorites: APIWorkspaceFavorite[];\n}\n\n/**\n * @see https://docs.vertracloud.app/api-reference/endpoint/workspaces/invites/list\n */\nexport type WorkspaceInviteKind = \"email\" | \"link\";\nexport const WorkspaceInviteKind = { Email: \"email\", Link: \"link\" } as const satisfies Record<string, WorkspaceInviteKind>;\n\n/**\n * @see https://docs.vertracloud.app/api-reference/endpoint/workspaces/invites/list\n */\nexport interface APIWorkspaceInvite {\n\tid: SnowFlake;\n\tworkspace_id: SnowFlake;\n\tkind: WorkspaceInviteKind;\n\t/** Bound e-mail; only for `kind: \"email\"`. */\n\temail: string | null;\n\trole_id: SnowFlake;\n\trole_name: string;\n\tinvited_by: { id: SnowFlake; display_name: string };\n\texpires_at: ISODateString;\n\taccepted_at: ISODateString | null;\n\trevoked_at: ISODateString | null;\n\tuses: number;\n\t/** Only for `kind: \"link\"`; `null` = unlimited uses. */\n\tmax_uses: number | null;\n\t/** Access expiration applied to members who join through this invite; `null` = never. */\n\texpires_in_days: number | null;\n\tcreated_at: ISODateString;\n}\n\n/**\n * @see https://docs.vertracloud.app/api-reference/endpoint/workspaces/invites/create\n */\nexport interface APIWorkspaceInviteCreated extends APIWorkspaceInvite {\n\t/** Invite URL; only for `kind: \"link\"`, shown once. */\n\turl: string | null;\n}\n\n/**\n * What the invitee sees before accepting (`GET /v1/workspaces/invites/:token`).\n * @see https://docs.vertracloud.app/api-reference/endpoint/workspaces/invites/preview\n */\nexport interface APIWorkspaceInvitePreview {\n\tworkspace: { id: SnowFlake; name: string };\n\tinviter: { display_name: string };\n\trole_name: string;\n\tkind: WorkspaceInviteKind;\n\texpires_at: ISODateString;\n}\n\n/**\n * @see https://docs.vertracloud.app/api-reference/endpoint/workspaces/action-requests/list\n */\nexport type WorkspaceActionRequestAction = \"app_delete\" | \"database_delete\" | \"snapshot_create\" | \"snapshot_restore\";\nexport const WorkspaceActionRequestAction = {\n\tAppDelete: \"app_delete\",\n\tDatabaseDelete: \"database_delete\",\n\tSnapshotCreate: \"snapshot_create\",\n\tSnapshotRestore: \"snapshot_restore\",\n} as const satisfies Record<string, WorkspaceActionRequestAction>;\n\nexport type WorkspaceActionRequestStatus = \"pending\" | \"approved\" | \"rejected\" | \"expired\";\nexport const WorkspaceActionRequestStatus = {\n\tPending: \"pending\",\n\tApproved: \"approved\",\n\tRejected: \"rejected\",\n\tExpired: \"expired\",\n} as const satisfies Record<string, WorkspaceActionRequestStatus>;\n\n/**\n * `params` of an action request, per `action`. Actions without parameters take an empty object;\n * unknown keys are rejected with `WORKSPACE_ACTION_INVALID_PARAMS`.\n * @see https://docs.vertracloud.app/api-reference/endpoint/workspaces/action-requests/create\n */\nexport interface WorkspaceActionRequestParams {\n\tapp_delete: Record<string, never>;\n\tdatabase_delete: Record<string, never>;\n\tsnapshot_create: Record<string, never>;\n\t/** The snapshot must belong to the request's resource. */\n\tsnapshot_restore: { snapshot_id: SnowFlake };\n}\n\ninterface APIWorkspaceActionRequestBase {\n\tid: SnowFlake;\n\tworkspace_id: SnowFlake;\n\tresource_type: WorkspaceResourceType;\n\tresource_id: SnowFlake;\n\tresource_name: string | null;\n\tstatus: WorkspaceActionRequestStatus;\n\trequested_by: { id: SnowFlake; display_name: string };\n\tdecided_by: { id: SnowFlake; display_name: string } | null;\n\tdecided_at: ISODateString | null;\n\texpires_at: ISODateString;\n\tcreated_at: ISODateString;\n}\n\n/**\n * A request for a destructive/sensitive action made by a member who lacks its permission, to be\n * approved by someone who has it. Expires after 24 h without a decision. Discriminated by `action`,\n * which decides the shape of `params`.\n * @see https://docs.vertracloud.app/api-reference/endpoint/workspaces/action-requests/list\n */\nexport type APIWorkspaceActionRequest = {\n\t[A in WorkspaceActionRequestAction]: APIWorkspaceActionRequestBase & { action: A; params: WorkspaceActionRequestParams[A] };\n}[WorkspaceActionRequestAction];\n\n/**\n * Workspace error codes. Stable English sentinels returned in `code`; clients are expected to\n * translate them.\n * @see https://docs.vertracloud.app/api-reference/endpoint/workspaces/get\n */\nexport const WORKSPACE_ERROR_CODES = {\n\tWORKSPACE_NOT_FOUND: \"WORKSPACE_NOT_FOUND\",\n\tWORKSPACE_NAME_ALREADY_EXISTS: \"WORKSPACE_NAME_ALREADY_EXISTS\",\n\tWORKSPACE_MEMBER_LIMIT_REACHED: \"WORKSPACE_MEMBER_LIMIT_REACHED\",\n\tWORKSPACE_ROLE_LIMIT_REACHED: \"WORKSPACE_ROLE_LIMIT_REACHED\",\n\tWORKSPACE_ROLE_IN_USE: \"WORKSPACE_ROLE_IN_USE\",\n\tWORKSPACE_ROLE_NOT_FOUND: \"WORKSPACE_ROLE_NOT_FOUND\",\n\tWORKSPACE_ROLE_NAME_ALREADY_EXISTS: \"WORKSPACE_ROLE_NAME_ALREADY_EXISTS\",\n\tWORKSPACE_PERMISSION_DENIED: \"WORKSPACE_PERMISSION_DENIED\",\n\tWORKSPACE_PERMISSION_ESCALATION: \"WORKSPACE_PERMISSION_ESCALATION\",\n\tWORKSPACE_INVITE_NOT_FOUND: \"WORKSPACE_INVITE_NOT_FOUND\",\n\tWORKSPACE_INVITE_EXPIRED: \"WORKSPACE_INVITE_EXPIRED\",\n\tWORKSPACE_INVITE_EMAIL_MISMATCH: \"WORKSPACE_INVITE_EMAIL_MISMATCH\",\n\t/** 400 — the invited account turned off workspace invites by email. */\n\tWORKSPACE_INVITES_DISABLED: \"WORKSPACE_INVITES_DISABLED\",\n\t/** 409 — the account is already the owner or a member of the workspace. */\n\tWORKSPACE_ALREADY_MEMBER: \"WORKSPACE_ALREADY_MEMBER\",\n\tWORKSPACE_OWNER_ONLY: \"WORKSPACE_OWNER_ONLY\",\n\tWORKSPACE_ACTION_REQUEST_NOT_FOUND: \"WORKSPACE_ACTION_REQUEST_NOT_FOUND\",\n\t/** 410 — the request expired before anyone decided on it. */\n\tWORKSPACE_ACTION_REQUEST_EXPIRED: \"WORKSPACE_ACTION_REQUEST_EXPIRED\",\n\t/** 409 — the request was already approved or rejected. */\n\tWORKSPACE_ACTION_REQUEST_ALREADY_DECIDED: \"WORKSPACE_ACTION_REQUEST_ALREADY_DECIDED\",\n\t/** 400 — the requester already has the permission; perform the action directly. */\n\tWORKSPACE_ACTION_NOT_NEEDED: \"WORKSPACE_ACTION_NOT_NEEDED\",\n\t/** 400 — the request `params` failed the action's validation (e.g. a snapshot of another resource). */\n\tWORKSPACE_ACTION_INVALID_PARAMS: \"WORKSPACE_ACTION_INVALID_PARAMS\",\n\t/** 409 — a pending request already exists for the same action on the same resource. */\n\tWORKSPACE_ACTION_REQUEST_PENDING: \"WORKSPACE_ACTION_REQUEST_PENDING\",\n\tWORKSPACE_RESOURCE_FOLDER_NOT_FOUND: \"WORKSPACE_RESOURCE_FOLDER_NOT_FOUND\",\n\tWORKSPACE_RESOURCE_FOLDER_NAME_CONFLICT: \"WORKSPACE_RESOURCE_FOLDER_NAME_CONFLICT\",\n\tWORKSPACE_RESOURCE_NOT_FOUND: \"WORKSPACE_RESOURCE_NOT_FOUND\",\n\tPLAN_RESTRICTED_FEATURE: \"PLAN_RESTRICTED_FEATURE\",\n} as const;\nexport type WorkspaceErrorCode = (typeof WORKSPACE_ERROR_CODES)[keyof typeof WORKSPACE_ERROR_CODES];\n"],"mappings":"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","names":[]}
@@ -194,13 +194,25 @@ var API_ERROR_CODES = {
194
194
  PATH_IS_FILE: "PATH_IS_FILE",
195
195
  PENDING_ORDER_LIMIT_REACHED: "PENDING_ORDER_LIMIT_REACHED",
196
196
  PAYMENT_METHOD_UNAVAILABLE: "PAYMENT_METHOD_UNAVAILABLE",
197
+ /** 403 — the plan does not include automatic rollback (`deploy.auto_rollback: true` below Intermediary). */
198
+ PLAN_DOES_NOT_SUPPORT_AUTO_ROLLBACK: "PLAN_DOES_NOT_SUPPORT_AUTO_ROLLBACK",
197
199
  PLAN_DOES_NOT_SUPPORT_CUSTOM_DOMAIN: "PLAN_DOES_NOT_SUPPORT_CUSTOM_DOMAIN",
198
200
  PLAN_DOES_NOT_SUPPORT_CUSTOM_SUBDOMAIN: "PLAN_DOES_NOT_SUPPORT_CUSTOM_SUBDOMAIN",
201
+ /** 403 — the plan does not include rollback to earlier releases. */
202
+ PLAN_DOES_NOT_SUPPORT_ROLLBACK: "PLAN_DOES_NOT_SUPPORT_ROLLBACK",
199
203
  PLAN_DOES_NOT_SUPPORT_WEB_PUBLISH: "PLAN_DOES_NOT_SUPPORT_WEB_PUBLISH",
204
+ /** 403 — the plan does not include zero-downtime deploys (`deploy.zero_downtime: "on"` below Enterprise). */
205
+ PLAN_DOES_NOT_SUPPORT_ZERO_DOWNTIME: "PLAN_DOES_NOT_SUPPORT_ZERO_DOWNTIME",
200
206
  PLAN_MISMATCH_FOR_RENEWAL: "PLAN_MISMATCH_FOR_RENEWAL",
201
207
  PLAN_NOT_ALLOWED: "PLAN_NOT_ALLOWED",
202
208
  RATE_LIMIT_EXCEEDED: "RATE_LIMIT_EXCEEDED",
203
209
  REFUND_AMOUNT_EXCEEDS_PRICE: "REFUND_AMOUNT_EXCEEDS_PRICE",
210
+ /** 409 — the release is already the active one. */
211
+ RELEASE_ALREADY_ACTIVE: "RELEASE_ALREADY_ACTIVE",
212
+ /** 410 — the release's kept code has expired or is outside the limit of the plan. */
213
+ RELEASE_EXPIRED: "RELEASE_EXPIRED",
214
+ /** 404 — the release does not exist or belongs to another application. */
215
+ RELEASE_NOT_FOUND: "RELEASE_NOT_FOUND",
204
216
  REPO_ALREADY_LINKED: "REPO_ALREADY_LINKED",
205
217
  RESTORE_COOLDOWN: "RESTORE_COOLDOWN",
206
218
  SNAPSHOT_ENGINE_MISMATCH: "SNAPSHOT_ENGINE_MISMATCH",
@@ -54,6 +54,9 @@ interface APIApiKeyScopeEntry {
54
54
  * Intentionally left out (dashboard session only): key management, creating workspace invites
55
55
  * (an invite would outlive the key's revocation), revoking sessions, plan downgrade, and the
56
56
  * database **Data** tab (`/v1/databases/:id/data/*`).
57
+ *
58
+ * The rollback `POST` with `restore_environment: true` also requires `apps:envs` for an API key;
59
+ * without it the request returns 403 `API_KEY_SCOPE_DENIED`.
57
60
  */
58
61
  declare const API_KEY_SCOPES: Record<APIApiKeyScope, APIApiKeyScopeEntry>;
59
62
  declare const API_KEY_SCOPE_LIST: APIApiKeyScope[];
@@ -67,6 +67,8 @@ var API_KEY_SCOPES = {
67
67
  { method: "GET", path: "/v1/apps/:id/download" },
68
68
  { method: "GET", path: "/v1/apps/:id/deploys" },
69
69
  { method: "GET", path: "/v1/apps/:id/deploys/webhook" },
70
+ { method: "GET", path: "/v1/apps/:id/releases" },
71
+ { method: "GET", path: "/v1/apps/:id/releases/:release_id/log" },
70
72
  { method: "GET", path: "/v1/apps/:id/network/custom" },
71
73
  { method: "GET", path: "/v1/apps/:id/network/dns" }
72
74
  ]
@@ -86,7 +88,8 @@ var API_KEY_SCOPES = {
86
88
  { method: "POST", path: "/v1/apps/:id/network/purge-cache" },
87
89
  { method: "PATCH", path: "/v1/apps/:id/network/subdomain" },
88
90
  { method: "POST", path: "/v1/apps/:id/network/publish" },
89
- { method: "DELETE", path: "/v1/apps/:id/network/publish" }
91
+ { method: "DELETE", path: "/v1/apps/:id/network/publish" },
92
+ { method: "POST", path: "/v1/apps/:id/releases/:release_id/rollback" }
90
93
  ]
91
94
  },
92
95
  "apps:delete": { group: "apps", routes: [{ method: "DELETE", path: "/v1/apps/:id" }] },
@@ -95,7 +98,8 @@ var API_KEY_SCOPES = {
95
98
  routes: [
96
99
  { method: "GET", path: "/v1/apps/:id/envs" },
97
100
  { method: "POST", path: "/v1/apps/:id/envs" },
98
- { method: "DELETE", path: "/v1/apps/:id/envs/:envId" }
101
+ { method: "DELETE", path: "/v1/apps/:id/envs/:envId" },
102
+ { method: "GET", path: "/v1/apps/:id/releases/:release_id/rollback" }
99
103
  ]
100
104
  },
101
105
  "apps:files": {
@@ -1 +1 @@
1
- {"version":3,"sources":["api-key.ts"],"sourcesContent":["import type { ISODateString } from \"../../common/v1\";\n\n/**\n * API key scope, in the form `<resource>:<action>`. Presets: `read` = every `*:read`;\n * `write` = `read` + every `*:write`; `full` = all of them, including the ones without a\n * `read`/`write` suffix (delete, envs, files, credentials).\n * @see https://docs.vertracloud.app/api-reference/introduction#scopes\n */\nexport type APIApiKeyScope =\n\t| \"apps:read\"\n\t| \"apps:write\"\n\t| \"apps:delete\"\n\t| \"apps:envs\"\n\t| \"apps:files\"\n\t| \"databases:read\"\n\t| \"databases:write\"\n\t| \"databases:delete\"\n\t| \"databases:credentials\"\n\t| \"snapshots:read\"\n\t| \"snapshots:write\"\n\t| \"account:read\"\n\t| \"account:write\"\n\t| \"workspaces:read\"\n\t| \"workspaces:write\"\n\t| \"workspaces:delete\"\n\t| \"workspaces:invites\"\n\t| \"billing:read\"\n\t| \"billing:write\"\n\t| \"redeem:write\";\n\nexport const APIApiKeyScope = {\n\tAPPS_READ: \"apps:read\",\n\tAPPS_WRITE: \"apps:write\",\n\tAPPS_DELETE: \"apps:delete\",\n\tAPPS_ENVS: \"apps:envs\",\n\tAPPS_FILES: \"apps:files\",\n\tDATABASES_READ: \"databases:read\",\n\tDATABASES_WRITE: \"databases:write\",\n\tDATABASES_DELETE: \"databases:delete\",\n\tDATABASES_CREDENTIALS: \"databases:credentials\",\n\tSNAPSHOTS_READ: \"snapshots:read\",\n\tSNAPSHOTS_WRITE: \"snapshots:write\",\n\tACCOUNT_READ: \"account:read\",\n\tACCOUNT_WRITE: \"account:write\",\n\tWORKSPACES_READ: \"workspaces:read\",\n\tWORKSPACES_WRITE: \"workspaces:write\",\n\tWORKSPACES_DELETE: \"workspaces:delete\",\n\tWORKSPACES_INVITES: \"workspaces:invites\",\n\tBILLING_READ: \"billing:read\",\n\tBILLING_WRITE: \"billing:write\",\n\tREDEEM_WRITE: \"redeem:write\",\n} as const satisfies Record<string, APIApiKeyScope>;\n\nexport type APIApiKeyPreset = \"read\" | \"write\" | \"full\";\nexport const APIApiKeyPreset = { Read: \"read\", Write: \"write\", Full: \"full\" } as const;\n\nexport type APIApiKeyRouteMethod = \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\";\n\nexport interface APIApiKeyRoute {\n\tmethod: APIApiKeyRouteMethod;\n\t/** Full route pattern with `:param` placeholders (`/v1/apps/:id/files`). Matched exactly, no regex. */\n\tpath: string;\n}\n\nexport interface APIApiKeyScopeEntry {\n\t/** Display group the scope belongs to. */\n\tgroup: \"apps\" | \"databases\" | \"snapshots\" | \"account\" | \"workspaces\" | \"billing\";\n\troutes: APIApiKeyRoute[];\n}\n\n/**\n * Closed catalog of the routes an API key can reach, per scope. A key without the route's scope\n * gets 403 `API_KEY_SCOPE_DENIED`; a route that is not listed here always returns 403 to an API key.\n *\n * Intentionally left out (dashboard session only): key management, creating workspace invites\n * (an invite would outlive the key's revocation), revoking sessions, plan downgrade, and the\n * database **Data** tab (`/v1/databases/:id/data/*`).\n */\nexport const API_KEY_SCOPES: Record<APIApiKeyScope, APIApiKeyScopeEntry> = {\n\t\"apps:read\": {\n\t\tgroup: \"apps\",\n\t\troutes: [\n\t\t\t{ method: \"GET\", path: \"/v1/apps/runtimes\" },\n\t\t\t{ method: \"GET\", path: \"/v1/apps/status\" },\n\t\t\t{ method: \"GET\", path: \"/v1/apps/:id\" },\n\t\t\t{ method: \"GET\", path: \"/v1/apps/:id/status\" },\n\t\t\t{ method: \"GET\", path: \"/v1/apps/:id/realtime\" },\n\t\t\t{ method: \"GET\", path: \"/v1/apps/:id/metrics\" },\n\t\t\t{ method: \"GET\", path: \"/v1/apps/:id/logs\" },\n\t\t\t{ method: \"GET\", path: \"/v1/apps/:id/download\" },\n\t\t\t{ method: \"GET\", path: \"/v1/apps/:id/deploys\" },\n\t\t\t{ method: \"GET\", path: \"/v1/apps/:id/deploys/webhook\" },\n\t\t\t{ method: \"GET\", path: \"/v1/apps/:id/network/custom\" },\n\t\t\t{ method: \"GET\", path: \"/v1/apps/:id/network/dns\" },\n\t\t],\n\t},\n\t\"apps:write\": {\n\t\tgroup: \"apps\",\n\t\troutes: [\n\t\t\t{ method: \"POST\", path: \"/v1/apps\" },\n\t\t\t{ method: \"POST\", path: \"/v1/apps/:id/start\" },\n\t\t\t{ method: \"POST\", path: \"/v1/apps/:id/stop\" },\n\t\t\t{ method: \"POST\", path: \"/v1/apps/:id/restart\" },\n\t\t\t{ method: \"PATCH\", path: \"/v1/apps/:id/config\" },\n\t\t\t{ method: \"POST\", path: \"/v1/apps/:id/deploys/webhook\" },\n\t\t\t{ method: \"DELETE\", path: \"/v1/apps/:id/deploys/webhook\" },\n\t\t\t{ method: \"POST\", path: \"/v1/apps/:id/network/custom\" },\n\t\t\t{ method: \"DELETE\", path: \"/v1/apps/:id/network/custom\" },\n\t\t\t{ method: \"POST\", path: \"/v1/apps/:id/network/purge-cache\" },\n\t\t\t{ method: \"PATCH\", path: \"/v1/apps/:id/network/subdomain\" },\n\t\t\t{ method: \"POST\", path: \"/v1/apps/:id/network/publish\" },\n\t\t\t{ method: \"DELETE\", path: \"/v1/apps/:id/network/publish\" },\n\t\t],\n\t},\n\t\"apps:delete\": { group: \"apps\", routes: [{ method: \"DELETE\", path: \"/v1/apps/:id\" }] },\n\t\"apps:envs\": {\n\t\tgroup: \"apps\",\n\t\troutes: [\n\t\t\t{ method: \"GET\", path: \"/v1/apps/:id/envs\" },\n\t\t\t{ method: \"POST\", path: \"/v1/apps/:id/envs\" },\n\t\t\t{ method: \"DELETE\", path: \"/v1/apps/:id/envs/:envId\" },\n\t\t],\n\t},\n\t\"apps:files\": {\n\t\tgroup: \"apps\",\n\t\troutes: [\n\t\t\t{ method: \"GET\", path: \"/v1/apps/:id/files\" },\n\t\t\t{ method: \"GET\", path: \"/v1/apps/:id/files/tree\" },\n\t\t\t{ method: \"GET\", path: \"/v1/apps/:id/files/content\" },\n\t\t\t{ method: \"PUT\", path: \"/v1/apps/:id/files\" },\n\t\t\t{ method: \"PATCH\", path: \"/v1/apps/:id/files\" },\n\t\t\t{ method: \"DELETE\", path: \"/v1/apps/:id/files\" },\n\t\t\t{ method: \"POST\", path: \"/v1/apps/:id/files/upload\" },\n\t\t],\n\t},\n\t\"databases:read\": {\n\t\tgroup: \"databases\",\n\t\troutes: [\n\t\t\t{ method: \"GET\", path: \"/v1/databases/status\" },\n\t\t\t{ method: \"GET\", path: \"/v1/databases/:id\" },\n\t\t\t{ method: \"GET\", path: \"/v1/databases/:id/status\" },\n\t\t\t{ method: \"GET\", path: \"/v1/databases/:id/metrics\" },\n\t\t],\n\t},\n\t\"databases:write\": {\n\t\tgroup: \"databases\",\n\t\troutes: [\n\t\t\t{ method: \"POST\", path: \"/v1/databases\" },\n\t\t\t{ method: \"PUT\", path: \"/v1/databases/:id\" },\n\t\t\t{ method: \"POST\", path: \"/v1/databases/:id/start\" },\n\t\t\t{ method: \"POST\", path: \"/v1/databases/:id/stop\" },\n\t\t\t{ method: \"POST\", path: \"/v1/databases/:id/reset\" },\n\t\t],\n\t},\n\t\"databases:delete\": { group: \"databases\", routes: [{ method: \"DELETE\", path: \"/v1/databases/:id\" }] },\n\t\"databases:credentials\": {\n\t\tgroup: \"databases\",\n\t\troutes: [\n\t\t\t{ method: \"GET\", path: \"/v1/databases/:id/credentials/certificate\" },\n\t\t\t{ method: \"POST\", path: \"/v1/databases/:id/credentials/certificate/reset\" },\n\t\t\t{ method: \"POST\", path: \"/v1/databases/:id/credentials/reset\" },\n\t\t],\n\t},\n\t\"snapshots:read\": {\n\t\tgroup: \"snapshots\",\n\t\troutes: [\n\t\t\t{ method: \"GET\", path: \"/v1/users/snapshots\" },\n\t\t\t{ method: \"GET\", path: \"/v1/users/:id/snapshots\" },\n\t\t\t{ method: \"GET\", path: \"/v1/users/:id/snapshots/:snapshot_id/download\" },\n\t\t],\n\t},\n\t\"snapshots:write\": {\n\t\tgroup: \"snapshots\",\n\t\troutes: [\n\t\t\t{ method: \"POST\", path: \"/v1/users/:id/snapshots\" },\n\t\t\t{ method: \"POST\", path: \"/v1/users/:id/snapshots/:snapshot_id/restore\" },\n\t\t],\n\t},\n\t\"account:read\": {\n\t\tgroup: \"account\",\n\t\troutes: [\n\t\t\t{ method: \"GET\", path: \"/v1/users/me\" },\n\t\t\t{ method: \"GET\", path: \"/v1/users/me/sessions\" },\n\t\t],\n\t},\n\t\"account:write\": {\n\t\tgroup: \"account\",\n\t\troutes: [\n\t\t\t{ method: \"PATCH\", path: \"/v1/users/me\" },\n\t\t\t{ method: \"POST\", path: \"/v1/users/me/folders\" },\n\t\t\t{ method: \"PATCH\", path: \"/v1/users/me/folders/:folder_id\" },\n\t\t\t{ method: \"DELETE\", path: \"/v1/users/me/folders/:folder_id\" },\n\t\t\t{ method: \"PUT\", path: \"/v1/users/me/folders/:folder_id/resources/:resource_type/:resource_id\" },\n\t\t\t{ method: \"DELETE\", path: \"/v1/users/me/folders/:folder_id/resources/:resource_type/:resource_id\" },\n\t\t\t{ method: \"PUT\", path: \"/v1/users/me/favorites/:resource_type/:resource_id\" },\n\t\t\t{ method: \"DELETE\", path: \"/v1/users/me/favorites/:resource_type/:resource_id\" },\n\t\t],\n\t},\n\t\"workspaces:read\": {\n\t\tgroup: \"workspaces\",\n\t\troutes: [\n\t\t\t{ method: \"GET\", path: \"/v1/workspaces\" },\n\t\t\t{ method: \"GET\", path: \"/v1/workspaces/:id\" },\n\t\t\t{ method: \"GET\", path: \"/v1/workspaces/:id/members\" },\n\t\t\t{ method: \"GET\", path: \"/v1/workspaces/:id/roles\" },\n\t\t\t{ method: \"GET\", path: \"/v1/workspaces/:id/action-requests\" },\n\t\t],\n\t},\n\t\"workspaces:write\": {\n\t\tgroup: \"workspaces\",\n\t\troutes: [\n\t\t\t{ method: \"POST\", path: \"/v1/workspaces\" },\n\t\t\t{ method: \"PUT\", path: \"/v1/workspaces/:id\" },\n\t\t\t{ method: \"PUT\", path: \"/v1/workspaces/:id/members/:user_id\" },\n\t\t\t{ method: \"DELETE\", path: \"/v1/workspaces/:id/members/:user_id\" },\n\t\t\t{ method: \"POST\", path: \"/v1/workspaces/:id/roles\" },\n\t\t\t{ method: \"PUT\", path: \"/v1/workspaces/:id/roles/:role_id\" },\n\t\t\t{ method: \"DELETE\", path: \"/v1/workspaces/:id/roles/:role_id\" },\n\t\t\t{ method: \"POST\", path: \"/v1/workspaces/:id/apps/:app_id\" },\n\t\t\t{ method: \"DELETE\", path: \"/v1/workspaces/:id/apps/:app_id\" },\n\t\t\t{ method: \"POST\", path: \"/v1/workspaces/:id/databases/:db_id\" },\n\t\t\t{ method: \"DELETE\", path: \"/v1/workspaces/:id/databases/:db_id\" },\n\t\t\t{ method: \"POST\", path: \"/v1/workspaces/:id/folders\" },\n\t\t\t{ method: \"PATCH\", path: \"/v1/workspaces/:id/folders/:folder_id\" },\n\t\t\t{ method: \"DELETE\", path: \"/v1/workspaces/:id/folders/:folder_id\" },\n\t\t\t{ method: \"PUT\", path: \"/v1/workspaces/:id/folders/:folder_id/resources/:resource_type/:resource_id\" },\n\t\t\t{ method: \"DELETE\", path: \"/v1/workspaces/:id/folders/:folder_id/resources/:resource_type/:resource_id\" },\n\t\t\t{ method: \"PUT\", path: \"/v1/workspaces/:id/favorites/:resource_type/:resource_id\" },\n\t\t\t{ method: \"DELETE\", path: \"/v1/workspaces/:id/favorites/:resource_type/:resource_id\" },\n\t\t\t{ method: \"POST\", path: \"/v1/workspaces/:id/action-requests\" },\n\t\t],\n\t},\n\t/**\n\t * Intentionally left out (dashboard session only): creating invites (a leaked key could grant\n\t * access that outlives its revocation), transferring ownership, approving/rejecting action\n\t * requests (approval is a human decision) and exporting activities.\n\t */\n\t/** Delete a workspace (soft delete). Only in the `full` preset, like `apps:delete`. */\n\t\"workspaces:delete\": {\n\t\tgroup: \"workspaces\",\n\t\troutes: [{ method: \"DELETE\", path: \"/v1/workspaces/:id\" }],\n\t},\n\t/** List and revoke workspace invites; view, accept and decline your own invite by token. Only in the `full` preset. */\n\t\"workspaces:invites\": {\n\t\tgroup: \"workspaces\",\n\t\troutes: [\n\t\t\t{ method: \"GET\", path: \"/v1/workspaces/:id/invites\" },\n\t\t\t{ method: \"DELETE\", path: \"/v1/workspaces/:id/invites/:invite_id\" },\n\t\t\t{ method: \"GET\", path: \"/v1/workspaces/invites/:token\" },\n\t\t\t{ method: \"POST\", path: \"/v1/workspaces/invites/:token/accept\" },\n\t\t\t{ method: \"POST\", path: \"/v1/workspaces/invites/:token/decline\" },\n\t\t],\n\t},\n\t\"billing:read\": {\n\t\tgroup: \"billing\",\n\t\troutes: [\n\t\t\t{ method: \"GET\", path: \"/v1/orders\" },\n\t\t\t{ method: \"GET\", path: \"/v1/orders/:orderId/status\" },\n\t\t\t{ method: \"GET\", path: \"/v1/users/me/billing\" },\n\t\t],\n\t},\n\t/**\n\t * Creates a plan order and generates the PIX charge; the payment itself is made by a person in their banking app.\n\t * Also saves the billing details (name, address, CPF/CNPJ) an order needs.\n\t */\n\t\"billing:write\": {\n\t\tgroup: \"billing\",\n\t\troutes: [\n\t\t\t{ method: \"POST\", path: \"/v1/orders\" },\n\t\t\t{ method: \"POST\", path: \"/v1/orders/:orderId/initiate/pix\" },\n\t\t\t{ method: \"PUT\", path: \"/v1/users/me/billing\" },\n\t\t],\n\t},\n\t\"redeem:write\": { group: \"billing\", routes: [{ method: \"POST\", path: \"/v1/redeem/:code\" }] },\n};\n\nexport const API_KEY_SCOPE_LIST = Object.keys(API_KEY_SCOPES) as APIApiKeyScope[];\n\n/** Scopes selected by a preset. `full` is the whole catalog. */\nexport function apiKeyPresetScopes(preset: APIApiKeyPreset): APIApiKeyScope[] {\n\tif (preset === \"full\") return API_KEY_SCOPE_LIST;\n\treturn API_KEY_SCOPE_LIST.filter((s) => s.endsWith(\":read\") || (preset === \"write\" && s.endsWith(\":write\")));\n}\n\n/** Maximum keys per account, entries in `allowed_ips`, and key name length. */\nexport const API_KEY_MAX_PER_USER = 10;\nexport const API_KEY_MAX_ALLOWED_IPS = 20;\nexport const API_KEY_NAME_MAX_LENGTH = 40;\n\n/**\n * An API key as listed. The secret is returned only ONCE, in `APIApiKeyCreated`.\n * @see https://docs.vertracloud.app/api-reference/endpoint/users/api-keys/list\n */\nexport interface APIApiKey {\n\tid: string;\n\tname: string;\n\t/** Public start of the key (`vc_live_a1b2c3d4`; older keys: 8 hex characters). */\n\tprefix: string;\n\t/** Last 4 characters; `null` for keys generated before the `vc_live_` format. */\n\tlast4: string | null;\n\tscopes: APIApiKeyScope[];\n\t/** Allowed IPs/CIDRs. Empty list = any IP. */\n\tallowed_ips: string[];\n\tcreated_at: ISODateString;\n\tlast_used_at: ISODateString | null;\n}\n\nexport interface APIApiKeyCreated extends APIApiKey {\n\t/** The full secret. Shown once; it cannot be recovered. */\n\tapi_key: string;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA8BO,IAAM,iBAAiB;AAAA,EAC7B,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,kBAAkB;AAAA,EAClB,uBAAuB;AAAA,EACvB,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,oBAAoB;AAAA,EACpB,cAAc;AAAA,EACd,eAAe;AAAA,EACf,cAAc;AACf;AAGO,IAAM,kBAAkB,EAAE,MAAM,QAAQ,OAAO,SAAS,MAAM,OAAO;AAwBrE,IAAM,iBAA8D;AAAA,EAC1E,aAAa;AAAA,IACZ,OAAO;AAAA,IACP,QAAQ;AAAA,MACP,EAAE,QAAQ,OAAO,MAAM,oBAAoB;AAAA,MAC3C,EAAE,QAAQ,OAAO,MAAM,kBAAkB;AAAA,MACzC,EAAE,QAAQ,OAAO,MAAM,eAAe;AAAA,MACtC,EAAE,QAAQ,OAAO,MAAM,sBAAsB;AAAA,MAC7C,EAAE,QAAQ,OAAO,MAAM,wBAAwB;AAAA,MAC/C,EAAE,QAAQ,OAAO,MAAM,uBAAuB;AAAA,MAC9C,EAAE,QAAQ,OAAO,MAAM,oBAAoB;AAAA,MAC3C,EAAE,QAAQ,OAAO,MAAM,wBAAwB;AAAA,MAC/C,EAAE,QAAQ,OAAO,MAAM,uBAAuB;AAAA,MAC9C,EAAE,QAAQ,OAAO,MAAM,+BAA+B;AAAA,MACtD,EAAE,QAAQ,OAAO,MAAM,8BAA8B;AAAA,MACrD,EAAE,QAAQ,OAAO,MAAM,2BAA2B;AAAA,IACnD;AAAA,EACD;AAAA,EACA,cAAc;AAAA,IACb,OAAO;AAAA,IACP,QAAQ;AAAA,MACP,EAAE,QAAQ,QAAQ,MAAM,WAAW;AAAA,MACnC,EAAE,QAAQ,QAAQ,MAAM,qBAAqB;AAAA,MAC7C,EAAE,QAAQ,QAAQ,MAAM,oBAAoB;AAAA,MAC5C,EAAE,QAAQ,QAAQ,MAAM,uBAAuB;AAAA,MAC/C,EAAE,QAAQ,SAAS,MAAM,sBAAsB;AAAA,MAC/C,EAAE,QAAQ,QAAQ,MAAM,+BAA+B;AAAA,MACvD,EAAE,QAAQ,UAAU,MAAM,+BAA+B;AAAA,MACzD,EAAE,QAAQ,QAAQ,MAAM,8BAA8B;AAAA,MACtD,EAAE,QAAQ,UAAU,MAAM,8BAA8B;AAAA,MACxD,EAAE,QAAQ,QAAQ,MAAM,mCAAmC;AAAA,MAC3D,EAAE,QAAQ,SAAS,MAAM,iCAAiC;AAAA,MAC1D,EAAE,QAAQ,QAAQ,MAAM,+BAA+B;AAAA,MACvD,EAAE,QAAQ,UAAU,MAAM,+BAA+B;AAAA,IAC1D;AAAA,EACD;AAAA,EACA,eAAe,EAAE,OAAO,QAAQ,QAAQ,CAAC,EAAE,QAAQ,UAAU,MAAM,eAAe,CAAC,EAAE;AAAA,EACrF,aAAa;AAAA,IACZ,OAAO;AAAA,IACP,QAAQ;AAAA,MACP,EAAE,QAAQ,OAAO,MAAM,oBAAoB;AAAA,MAC3C,EAAE,QAAQ,QAAQ,MAAM,oBAAoB;AAAA,MAC5C,EAAE,QAAQ,UAAU,MAAM,2BAA2B;AAAA,IACtD;AAAA,EACD;AAAA,EACA,cAAc;AAAA,IACb,OAAO;AAAA,IACP,QAAQ;AAAA,MACP,EAAE,QAAQ,OAAO,MAAM,qBAAqB;AAAA,MAC5C,EAAE,QAAQ,OAAO,MAAM,0BAA0B;AAAA,MACjD,EAAE,QAAQ,OAAO,MAAM,6BAA6B;AAAA,MACpD,EAAE,QAAQ,OAAO,MAAM,qBAAqB;AAAA,MAC5C,EAAE,QAAQ,SAAS,MAAM,qBAAqB;AAAA,MAC9C,EAAE,QAAQ,UAAU,MAAM,qBAAqB;AAAA,MAC/C,EAAE,QAAQ,QAAQ,MAAM,4BAA4B;AAAA,IACrD;AAAA,EACD;AAAA,EACA,kBAAkB;AAAA,IACjB,OAAO;AAAA,IACP,QAAQ;AAAA,MACP,EAAE,QAAQ,OAAO,MAAM,uBAAuB;AAAA,MAC9C,EAAE,QAAQ,OAAO,MAAM,oBAAoB;AAAA,MAC3C,EAAE,QAAQ,OAAO,MAAM,2BAA2B;AAAA,MAClD,EAAE,QAAQ,OAAO,MAAM,4BAA4B;AAAA,IACpD;AAAA,EACD;AAAA,EACA,mBAAmB;AAAA,IAClB,OAAO;AAAA,IACP,QAAQ;AAAA,MACP,EAAE,QAAQ,QAAQ,MAAM,gBAAgB;AAAA,MACxC,EAAE,QAAQ,OAAO,MAAM,oBAAoB;AAAA,MAC3C,EAAE,QAAQ,QAAQ,MAAM,0BAA0B;AAAA,MAClD,EAAE,QAAQ,QAAQ,MAAM,yBAAyB;AAAA,MACjD,EAAE,QAAQ,QAAQ,MAAM,0BAA0B;AAAA,IACnD;AAAA,EACD;AAAA,EACA,oBAAoB,EAAE,OAAO,aAAa,QAAQ,CAAC,EAAE,QAAQ,UAAU,MAAM,oBAAoB,CAAC,EAAE;AAAA,EACpG,yBAAyB;AAAA,IACxB,OAAO;AAAA,IACP,QAAQ;AAAA,MACP,EAAE,QAAQ,OAAO,MAAM,4CAA4C;AAAA,MACnE,EAAE,QAAQ,QAAQ,MAAM,kDAAkD;AAAA,MAC1E,EAAE,QAAQ,QAAQ,MAAM,sCAAsC;AAAA,IAC/D;AAAA,EACD;AAAA,EACA,kBAAkB;AAAA,IACjB,OAAO;AAAA,IACP,QAAQ;AAAA,MACP,EAAE,QAAQ,OAAO,MAAM,sBAAsB;AAAA,MAC7C,EAAE,QAAQ,OAAO,MAAM,0BAA0B;AAAA,MACjD,EAAE,QAAQ,OAAO,MAAM,gDAAgD;AAAA,IACxE;AAAA,EACD;AAAA,EACA,mBAAmB;AAAA,IAClB,OAAO;AAAA,IACP,QAAQ;AAAA,MACP,EAAE,QAAQ,QAAQ,MAAM,0BAA0B;AAAA,MAClD,EAAE,QAAQ,QAAQ,MAAM,+CAA+C;AAAA,IACxE;AAAA,EACD;AAAA,EACA,gBAAgB;AAAA,IACf,OAAO;AAAA,IACP,QAAQ;AAAA,MACP,EAAE,QAAQ,OAAO,MAAM,eAAe;AAAA,MACtC,EAAE,QAAQ,OAAO,MAAM,wBAAwB;AAAA,IAChD;AAAA,EACD;AAAA,EACA,iBAAiB;AAAA,IAChB,OAAO;AAAA,IACP,QAAQ;AAAA,MACP,EAAE,QAAQ,SAAS,MAAM,eAAe;AAAA,MACxC,EAAE,QAAQ,QAAQ,MAAM,uBAAuB;AAAA,MAC/C,EAAE,QAAQ,SAAS,MAAM,kCAAkC;AAAA,MAC3D,EAAE,QAAQ,UAAU,MAAM,kCAAkC;AAAA,MAC5D,EAAE,QAAQ,OAAO,MAAM,wEAAwE;AAAA,MAC/F,EAAE,QAAQ,UAAU,MAAM,wEAAwE;AAAA,MAClG,EAAE,QAAQ,OAAO,MAAM,qDAAqD;AAAA,MAC5E,EAAE,QAAQ,UAAU,MAAM,qDAAqD;AAAA,IAChF;AAAA,EACD;AAAA,EACA,mBAAmB;AAAA,IAClB,OAAO;AAAA,IACP,QAAQ;AAAA,MACP,EAAE,QAAQ,OAAO,MAAM,iBAAiB;AAAA,MACxC,EAAE,QAAQ,OAAO,MAAM,qBAAqB;AAAA,MAC5C,EAAE,QAAQ,OAAO,MAAM,6BAA6B;AAAA,MACpD,EAAE,QAAQ,OAAO,MAAM,2BAA2B;AAAA,MAClD,EAAE,QAAQ,OAAO,MAAM,qCAAqC;AAAA,IAC7D;AAAA,EACD;AAAA,EACA,oBAAoB;AAAA,IACnB,OAAO;AAAA,IACP,QAAQ;AAAA,MACP,EAAE,QAAQ,QAAQ,MAAM,iBAAiB;AAAA,MACzC,EAAE,QAAQ,OAAO,MAAM,qBAAqB;AAAA,MAC5C,EAAE,QAAQ,OAAO,MAAM,sCAAsC;AAAA,MAC7D,EAAE,QAAQ,UAAU,MAAM,sCAAsC;AAAA,MAChE,EAAE,QAAQ,QAAQ,MAAM,2BAA2B;AAAA,MACnD,EAAE,QAAQ,OAAO,MAAM,oCAAoC;AAAA,MAC3D,EAAE,QAAQ,UAAU,MAAM,oCAAoC;AAAA,MAC9D,EAAE,QAAQ,QAAQ,MAAM,kCAAkC;AAAA,MAC1D,EAAE,QAAQ,UAAU,MAAM,kCAAkC;AAAA,MAC5D,EAAE,QAAQ,QAAQ,MAAM,sCAAsC;AAAA,MAC9D,EAAE,QAAQ,UAAU,MAAM,sCAAsC;AAAA,MAChE,EAAE,QAAQ,QAAQ,MAAM,6BAA6B;AAAA,MACrD,EAAE,QAAQ,SAAS,MAAM,wCAAwC;AAAA,MACjE,EAAE,QAAQ,UAAU,MAAM,wCAAwC;AAAA,MAClE,EAAE,QAAQ,OAAO,MAAM,8EAA8E;AAAA,MACrG,EAAE,QAAQ,UAAU,MAAM,8EAA8E;AAAA,MACxG,EAAE,QAAQ,OAAO,MAAM,2DAA2D;AAAA,MAClF,EAAE,QAAQ,UAAU,MAAM,2DAA2D;AAAA,MACrF,EAAE,QAAQ,QAAQ,MAAM,qCAAqC;AAAA,IAC9D;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,qBAAqB;AAAA,IACpB,OAAO;AAAA,IACP,QAAQ,CAAC,EAAE,QAAQ,UAAU,MAAM,qBAAqB,CAAC;AAAA,EAC1D;AAAA;AAAA,EAEA,sBAAsB;AAAA,IACrB,OAAO;AAAA,IACP,QAAQ;AAAA,MACP,EAAE,QAAQ,OAAO,MAAM,6BAA6B;AAAA,MACpD,EAAE,QAAQ,UAAU,MAAM,wCAAwC;AAAA,MAClE,EAAE,QAAQ,OAAO,MAAM,gCAAgC;AAAA,MACvD,EAAE,QAAQ,QAAQ,MAAM,uCAAuC;AAAA,MAC/D,EAAE,QAAQ,QAAQ,MAAM,wCAAwC;AAAA,IACjE;AAAA,EACD;AAAA,EACA,gBAAgB;AAAA,IACf,OAAO;AAAA,IACP,QAAQ;AAAA,MACP,EAAE,QAAQ,OAAO,MAAM,aAAa;AAAA,MACpC,EAAE,QAAQ,OAAO,MAAM,6BAA6B;AAAA,MACpD,EAAE,QAAQ,OAAO,MAAM,uBAAuB;AAAA,IAC/C;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB;AAAA,IAChB,OAAO;AAAA,IACP,QAAQ;AAAA,MACP,EAAE,QAAQ,QAAQ,MAAM,aAAa;AAAA,MACrC,EAAE,QAAQ,QAAQ,MAAM,mCAAmC;AAAA,MAC3D,EAAE,QAAQ,OAAO,MAAM,uBAAuB;AAAA,IAC/C;AAAA,EACD;AAAA,EACA,gBAAgB,EAAE,OAAO,WAAW,QAAQ,CAAC,EAAE,QAAQ,QAAQ,MAAM,mBAAmB,CAAC,EAAE;AAC5F;AAEO,IAAM,qBAAqB,OAAO,KAAK,cAAc;AAGrD,SAAS,mBAAmB,QAA2C;AAC7E,MAAI,WAAW,OAAQ,QAAO;AAC9B,SAAO,mBAAmB,OAAO,CAAC,MAAM,EAAE,SAAS,OAAO,KAAM,WAAW,WAAW,EAAE,SAAS,QAAQ,CAAE;AAC5G;AAGO,IAAM,uBAAuB;AAC7B,IAAM,0BAA0B;AAChC,IAAM,0BAA0B;","names":[]}
1
+ {"version":3,"sources":["api-key.ts"],"sourcesContent":["import type { ISODateString } from \"../../common/v1\";\n\n/**\n * API key scope, in the form `<resource>:<action>`. Presets: `read` = every `*:read`;\n * `write` = `read` + every `*:write`; `full` = all of them, including the ones without a\n * `read`/`write` suffix (delete, envs, files, credentials).\n * @see https://docs.vertracloud.app/api-reference/introduction#scopes\n */\nexport type APIApiKeyScope =\n\t| \"apps:read\"\n\t| \"apps:write\"\n\t| \"apps:delete\"\n\t| \"apps:envs\"\n\t| \"apps:files\"\n\t| \"databases:read\"\n\t| \"databases:write\"\n\t| \"databases:delete\"\n\t| \"databases:credentials\"\n\t| \"snapshots:read\"\n\t| \"snapshots:write\"\n\t| \"account:read\"\n\t| \"account:write\"\n\t| \"workspaces:read\"\n\t| \"workspaces:write\"\n\t| \"workspaces:delete\"\n\t| \"workspaces:invites\"\n\t| \"billing:read\"\n\t| \"billing:write\"\n\t| \"redeem:write\";\n\nexport const APIApiKeyScope = {\n\tAPPS_READ: \"apps:read\",\n\tAPPS_WRITE: \"apps:write\",\n\tAPPS_DELETE: \"apps:delete\",\n\tAPPS_ENVS: \"apps:envs\",\n\tAPPS_FILES: \"apps:files\",\n\tDATABASES_READ: \"databases:read\",\n\tDATABASES_WRITE: \"databases:write\",\n\tDATABASES_DELETE: \"databases:delete\",\n\tDATABASES_CREDENTIALS: \"databases:credentials\",\n\tSNAPSHOTS_READ: \"snapshots:read\",\n\tSNAPSHOTS_WRITE: \"snapshots:write\",\n\tACCOUNT_READ: \"account:read\",\n\tACCOUNT_WRITE: \"account:write\",\n\tWORKSPACES_READ: \"workspaces:read\",\n\tWORKSPACES_WRITE: \"workspaces:write\",\n\tWORKSPACES_DELETE: \"workspaces:delete\",\n\tWORKSPACES_INVITES: \"workspaces:invites\",\n\tBILLING_READ: \"billing:read\",\n\tBILLING_WRITE: \"billing:write\",\n\tREDEEM_WRITE: \"redeem:write\",\n} as const satisfies Record<string, APIApiKeyScope>;\n\nexport type APIApiKeyPreset = \"read\" | \"write\" | \"full\";\nexport const APIApiKeyPreset = { Read: \"read\", Write: \"write\", Full: \"full\" } as const;\n\nexport type APIApiKeyRouteMethod = \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\";\n\nexport interface APIApiKeyRoute {\n\tmethod: APIApiKeyRouteMethod;\n\t/** Full route pattern with `:param` placeholders (`/v1/apps/:id/files`). Matched exactly, no regex. */\n\tpath: string;\n}\n\nexport interface APIApiKeyScopeEntry {\n\t/** Display group the scope belongs to. */\n\tgroup: \"apps\" | \"databases\" | \"snapshots\" | \"account\" | \"workspaces\" | \"billing\";\n\troutes: APIApiKeyRoute[];\n}\n\n/**\n * Closed catalog of the routes an API key can reach, per scope. A key without the route's scope\n * gets 403 `API_KEY_SCOPE_DENIED`; a route that is not listed here always returns 403 to an API key.\n *\n * Intentionally left out (dashboard session only): key management, creating workspace invites\n * (an invite would outlive the key's revocation), revoking sessions, plan downgrade, and the\n * database **Data** tab (`/v1/databases/:id/data/*`).\n *\n * The rollback `POST` with `restore_environment: true` also requires `apps:envs` for an API key;\n * without it the request returns 403 `API_KEY_SCOPE_DENIED`.\n */\nexport const API_KEY_SCOPES: Record<APIApiKeyScope, APIApiKeyScopeEntry> = {\n\t\"apps:read\": {\n\t\tgroup: \"apps\",\n\t\troutes: [\n\t\t\t{ method: \"GET\", path: \"/v1/apps/runtimes\" },\n\t\t\t{ method: \"GET\", path: \"/v1/apps/status\" },\n\t\t\t{ method: \"GET\", path: \"/v1/apps/:id\" },\n\t\t\t{ method: \"GET\", path: \"/v1/apps/:id/status\" },\n\t\t\t{ method: \"GET\", path: \"/v1/apps/:id/realtime\" },\n\t\t\t{ method: \"GET\", path: \"/v1/apps/:id/metrics\" },\n\t\t\t{ method: \"GET\", path: \"/v1/apps/:id/logs\" },\n\t\t\t{ method: \"GET\", path: \"/v1/apps/:id/download\" },\n\t\t\t{ method: \"GET\", path: \"/v1/apps/:id/deploys\" },\n\t\t\t{ method: \"GET\", path: \"/v1/apps/:id/deploys/webhook\" },\n\t\t\t{ method: \"GET\", path: \"/v1/apps/:id/releases\" },\n\t\t\t{ method: \"GET\", path: \"/v1/apps/:id/releases/:release_id/log\" },\n\t\t\t{ method: \"GET\", path: \"/v1/apps/:id/network/custom\" },\n\t\t\t{ method: \"GET\", path: \"/v1/apps/:id/network/dns\" },\n\t\t],\n\t},\n\t\"apps:write\": {\n\t\tgroup: \"apps\",\n\t\troutes: [\n\t\t\t{ method: \"POST\", path: \"/v1/apps\" },\n\t\t\t{ method: \"POST\", path: \"/v1/apps/:id/start\" },\n\t\t\t{ method: \"POST\", path: \"/v1/apps/:id/stop\" },\n\t\t\t{ method: \"POST\", path: \"/v1/apps/:id/restart\" },\n\t\t\t{ method: \"PATCH\", path: \"/v1/apps/:id/config\" },\n\t\t\t{ method: \"POST\", path: \"/v1/apps/:id/deploys/webhook\" },\n\t\t\t{ method: \"DELETE\", path: \"/v1/apps/:id/deploys/webhook\" },\n\t\t\t{ method: \"POST\", path: \"/v1/apps/:id/network/custom\" },\n\t\t\t{ method: \"DELETE\", path: \"/v1/apps/:id/network/custom\" },\n\t\t\t{ method: \"POST\", path: \"/v1/apps/:id/network/purge-cache\" },\n\t\t\t{ method: \"PATCH\", path: \"/v1/apps/:id/network/subdomain\" },\n\t\t\t{ method: \"POST\", path: \"/v1/apps/:id/network/publish\" },\n\t\t\t{ method: \"DELETE\", path: \"/v1/apps/:id/network/publish\" },\n\t\t\t{ method: \"POST\", path: \"/v1/apps/:id/releases/:release_id/rollback\" },\n\t\t],\n\t},\n\t\"apps:delete\": { group: \"apps\", routes: [{ method: \"DELETE\", path: \"/v1/apps/:id\" }] },\n\t\"apps:envs\": {\n\t\tgroup: \"apps\",\n\t\troutes: [\n\t\t\t{ method: \"GET\", path: \"/v1/apps/:id/envs\" },\n\t\t\t{ method: \"POST\", path: \"/v1/apps/:id/envs\" },\n\t\t\t{ method: \"DELETE\", path: \"/v1/apps/:id/envs/:envId\" },\n\t\t\t{ method: \"GET\", path: \"/v1/apps/:id/releases/:release_id/rollback\" },\n\t\t],\n\t},\n\t\"apps:files\": {\n\t\tgroup: \"apps\",\n\t\troutes: [\n\t\t\t{ method: \"GET\", path: \"/v1/apps/:id/files\" },\n\t\t\t{ method: \"GET\", path: \"/v1/apps/:id/files/tree\" },\n\t\t\t{ method: \"GET\", path: \"/v1/apps/:id/files/content\" },\n\t\t\t{ method: \"PUT\", path: \"/v1/apps/:id/files\" },\n\t\t\t{ method: \"PATCH\", path: \"/v1/apps/:id/files\" },\n\t\t\t{ method: \"DELETE\", path: \"/v1/apps/:id/files\" },\n\t\t\t{ method: \"POST\", path: \"/v1/apps/:id/files/upload\" },\n\t\t],\n\t},\n\t\"databases:read\": {\n\t\tgroup: \"databases\",\n\t\troutes: [\n\t\t\t{ method: \"GET\", path: \"/v1/databases/status\" },\n\t\t\t{ method: \"GET\", path: \"/v1/databases/:id\" },\n\t\t\t{ method: \"GET\", path: \"/v1/databases/:id/status\" },\n\t\t\t{ method: \"GET\", path: \"/v1/databases/:id/metrics\" },\n\t\t],\n\t},\n\t\"databases:write\": {\n\t\tgroup: \"databases\",\n\t\troutes: [\n\t\t\t{ method: \"POST\", path: \"/v1/databases\" },\n\t\t\t{ method: \"PUT\", path: \"/v1/databases/:id\" },\n\t\t\t{ method: \"POST\", path: \"/v1/databases/:id/start\" },\n\t\t\t{ method: \"POST\", path: \"/v1/databases/:id/stop\" },\n\t\t\t{ method: \"POST\", path: \"/v1/databases/:id/reset\" },\n\t\t],\n\t},\n\t\"databases:delete\": { group: \"databases\", routes: [{ method: \"DELETE\", path: \"/v1/databases/:id\" }] },\n\t\"databases:credentials\": {\n\t\tgroup: \"databases\",\n\t\troutes: [\n\t\t\t{ method: \"GET\", path: \"/v1/databases/:id/credentials/certificate\" },\n\t\t\t{ method: \"POST\", path: \"/v1/databases/:id/credentials/certificate/reset\" },\n\t\t\t{ method: \"POST\", path: \"/v1/databases/:id/credentials/reset\" },\n\t\t],\n\t},\n\t\"snapshots:read\": {\n\t\tgroup: \"snapshots\",\n\t\troutes: [\n\t\t\t{ method: \"GET\", path: \"/v1/users/snapshots\" },\n\t\t\t{ method: \"GET\", path: \"/v1/users/:id/snapshots\" },\n\t\t\t{ method: \"GET\", path: \"/v1/users/:id/snapshots/:snapshot_id/download\" },\n\t\t],\n\t},\n\t\"snapshots:write\": {\n\t\tgroup: \"snapshots\",\n\t\troutes: [\n\t\t\t{ method: \"POST\", path: \"/v1/users/:id/snapshots\" },\n\t\t\t{ method: \"POST\", path: \"/v1/users/:id/snapshots/:snapshot_id/restore\" },\n\t\t],\n\t},\n\t\"account:read\": {\n\t\tgroup: \"account\",\n\t\troutes: [\n\t\t\t{ method: \"GET\", path: \"/v1/users/me\" },\n\t\t\t{ method: \"GET\", path: \"/v1/users/me/sessions\" },\n\t\t],\n\t},\n\t\"account:write\": {\n\t\tgroup: \"account\",\n\t\troutes: [\n\t\t\t{ method: \"PATCH\", path: \"/v1/users/me\" },\n\t\t\t{ method: \"POST\", path: \"/v1/users/me/folders\" },\n\t\t\t{ method: \"PATCH\", path: \"/v1/users/me/folders/:folder_id\" },\n\t\t\t{ method: \"DELETE\", path: \"/v1/users/me/folders/:folder_id\" },\n\t\t\t{ method: \"PUT\", path: \"/v1/users/me/folders/:folder_id/resources/:resource_type/:resource_id\" },\n\t\t\t{ method: \"DELETE\", path: \"/v1/users/me/folders/:folder_id/resources/:resource_type/:resource_id\" },\n\t\t\t{ method: \"PUT\", path: \"/v1/users/me/favorites/:resource_type/:resource_id\" },\n\t\t\t{ method: \"DELETE\", path: \"/v1/users/me/favorites/:resource_type/:resource_id\" },\n\t\t],\n\t},\n\t\"workspaces:read\": {\n\t\tgroup: \"workspaces\",\n\t\troutes: [\n\t\t\t{ method: \"GET\", path: \"/v1/workspaces\" },\n\t\t\t{ method: \"GET\", path: \"/v1/workspaces/:id\" },\n\t\t\t{ method: \"GET\", path: \"/v1/workspaces/:id/members\" },\n\t\t\t{ method: \"GET\", path: \"/v1/workspaces/:id/roles\" },\n\t\t\t{ method: \"GET\", path: \"/v1/workspaces/:id/action-requests\" },\n\t\t],\n\t},\n\t\"workspaces:write\": {\n\t\tgroup: \"workspaces\",\n\t\troutes: [\n\t\t\t{ method: \"POST\", path: \"/v1/workspaces\" },\n\t\t\t{ method: \"PUT\", path: \"/v1/workspaces/:id\" },\n\t\t\t{ method: \"PUT\", path: \"/v1/workspaces/:id/members/:user_id\" },\n\t\t\t{ method: \"DELETE\", path: \"/v1/workspaces/:id/members/:user_id\" },\n\t\t\t{ method: \"POST\", path: \"/v1/workspaces/:id/roles\" },\n\t\t\t{ method: \"PUT\", path: \"/v1/workspaces/:id/roles/:role_id\" },\n\t\t\t{ method: \"DELETE\", path: \"/v1/workspaces/:id/roles/:role_id\" },\n\t\t\t{ method: \"POST\", path: \"/v1/workspaces/:id/apps/:app_id\" },\n\t\t\t{ method: \"DELETE\", path: \"/v1/workspaces/:id/apps/:app_id\" },\n\t\t\t{ method: \"POST\", path: \"/v1/workspaces/:id/databases/:db_id\" },\n\t\t\t{ method: \"DELETE\", path: \"/v1/workspaces/:id/databases/:db_id\" },\n\t\t\t{ method: \"POST\", path: \"/v1/workspaces/:id/folders\" },\n\t\t\t{ method: \"PATCH\", path: \"/v1/workspaces/:id/folders/:folder_id\" },\n\t\t\t{ method: \"DELETE\", path: \"/v1/workspaces/:id/folders/:folder_id\" },\n\t\t\t{ method: \"PUT\", path: \"/v1/workspaces/:id/folders/:folder_id/resources/:resource_type/:resource_id\" },\n\t\t\t{ method: \"DELETE\", path: \"/v1/workspaces/:id/folders/:folder_id/resources/:resource_type/:resource_id\" },\n\t\t\t{ method: \"PUT\", path: \"/v1/workspaces/:id/favorites/:resource_type/:resource_id\" },\n\t\t\t{ method: \"DELETE\", path: \"/v1/workspaces/:id/favorites/:resource_type/:resource_id\" },\n\t\t\t{ method: \"POST\", path: \"/v1/workspaces/:id/action-requests\" },\n\t\t],\n\t},\n\t/**\n\t * Intentionally left out (dashboard session only): creating invites (a leaked key could grant\n\t * access that outlives its revocation), transferring ownership, approving/rejecting action\n\t * requests (approval is a human decision) and exporting activities.\n\t */\n\t/** Delete a workspace (soft delete). Only in the `full` preset, like `apps:delete`. */\n\t\"workspaces:delete\": {\n\t\tgroup: \"workspaces\",\n\t\troutes: [{ method: \"DELETE\", path: \"/v1/workspaces/:id\" }],\n\t},\n\t/** List and revoke workspace invites; view, accept and decline your own invite by token. Only in the `full` preset. */\n\t\"workspaces:invites\": {\n\t\tgroup: \"workspaces\",\n\t\troutes: [\n\t\t\t{ method: \"GET\", path: \"/v1/workspaces/:id/invites\" },\n\t\t\t{ method: \"DELETE\", path: \"/v1/workspaces/:id/invites/:invite_id\" },\n\t\t\t{ method: \"GET\", path: \"/v1/workspaces/invites/:token\" },\n\t\t\t{ method: \"POST\", path: \"/v1/workspaces/invites/:token/accept\" },\n\t\t\t{ method: \"POST\", path: \"/v1/workspaces/invites/:token/decline\" },\n\t\t],\n\t},\n\t\"billing:read\": {\n\t\tgroup: \"billing\",\n\t\troutes: [\n\t\t\t{ method: \"GET\", path: \"/v1/orders\" },\n\t\t\t{ method: \"GET\", path: \"/v1/orders/:orderId/status\" },\n\t\t\t{ method: \"GET\", path: \"/v1/users/me/billing\" },\n\t\t],\n\t},\n\t/**\n\t * Creates a plan order and generates the PIX charge; the payment itself is made by a person in their banking app.\n\t * Also saves the billing details (name, address, CPF/CNPJ) an order needs.\n\t */\n\t\"billing:write\": {\n\t\tgroup: \"billing\",\n\t\troutes: [\n\t\t\t{ method: \"POST\", path: \"/v1/orders\" },\n\t\t\t{ method: \"POST\", path: \"/v1/orders/:orderId/initiate/pix\" },\n\t\t\t{ method: \"PUT\", path: \"/v1/users/me/billing\" },\n\t\t],\n\t},\n\t\"redeem:write\": { group: \"billing\", routes: [{ method: \"POST\", path: \"/v1/redeem/:code\" }] },\n};\n\nexport const API_KEY_SCOPE_LIST = Object.keys(API_KEY_SCOPES) as APIApiKeyScope[];\n\n/** Scopes selected by a preset. `full` is the whole catalog. */\nexport function apiKeyPresetScopes(preset: APIApiKeyPreset): APIApiKeyScope[] {\n\tif (preset === \"full\") return API_KEY_SCOPE_LIST;\n\treturn API_KEY_SCOPE_LIST.filter((s) => s.endsWith(\":read\") || (preset === \"write\" && s.endsWith(\":write\")));\n}\n\n/** Maximum keys per account, entries in `allowed_ips`, and key name length. */\nexport const API_KEY_MAX_PER_USER = 10;\nexport const API_KEY_MAX_ALLOWED_IPS = 20;\nexport const API_KEY_NAME_MAX_LENGTH = 40;\n\n/**\n * An API key as listed. The secret is returned only ONCE, in `APIApiKeyCreated`.\n * @see https://docs.vertracloud.app/api-reference/endpoint/users/api-keys/list\n */\nexport interface APIApiKey {\n\tid: string;\n\tname: string;\n\t/** Public start of the key (`vc_live_a1b2c3d4`; older keys: 8 hex characters). */\n\tprefix: string;\n\t/** Last 4 characters; `null` for keys generated before the `vc_live_` format. */\n\tlast4: string | null;\n\tscopes: APIApiKeyScope[];\n\t/** Allowed IPs/CIDRs. Empty list = any IP. */\n\tallowed_ips: string[];\n\tcreated_at: ISODateString;\n\tlast_used_at: ISODateString | null;\n}\n\nexport interface APIApiKeyCreated extends APIApiKey {\n\t/** The full secret. Shown once; it cannot be recovered. */\n\tapi_key: string;\n}\n"],"mappings":"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","names":[]}
@@ -36,6 +36,8 @@ var API_KEY_SCOPES = {
36
36
  { method: "GET", path: "/v1/apps/:id/download" },
37
37
  { method: "GET", path: "/v1/apps/:id/deploys" },
38
38
  { method: "GET", path: "/v1/apps/:id/deploys/webhook" },
39
+ { method: "GET", path: "/v1/apps/:id/releases" },
40
+ { method: "GET", path: "/v1/apps/:id/releases/:release_id/log" },
39
41
  { method: "GET", path: "/v1/apps/:id/network/custom" },
40
42
  { method: "GET", path: "/v1/apps/:id/network/dns" }
41
43
  ]
@@ -55,7 +57,8 @@ var API_KEY_SCOPES = {
55
57
  { method: "POST", path: "/v1/apps/:id/network/purge-cache" },
56
58
  { method: "PATCH", path: "/v1/apps/:id/network/subdomain" },
57
59
  { method: "POST", path: "/v1/apps/:id/network/publish" },
58
- { method: "DELETE", path: "/v1/apps/:id/network/publish" }
60
+ { method: "DELETE", path: "/v1/apps/:id/network/publish" },
61
+ { method: "POST", path: "/v1/apps/:id/releases/:release_id/rollback" }
59
62
  ]
60
63
  },
61
64
  "apps:delete": { group: "apps", routes: [{ method: "DELETE", path: "/v1/apps/:id" }] },
@@ -64,7 +67,8 @@ var API_KEY_SCOPES = {
64
67
  routes: [
65
68
  { method: "GET", path: "/v1/apps/:id/envs" },
66
69
  { method: "POST", path: "/v1/apps/:id/envs" },
67
- { method: "DELETE", path: "/v1/apps/:id/envs/:envId" }
70
+ { method: "DELETE", path: "/v1/apps/:id/envs/:envId" },
71
+ { method: "GET", path: "/v1/apps/:id/releases/:release_id/rollback" }
68
72
  ]
69
73
  },
70
74
  "apps:files": {