@supacloud/cli 0.111.0 → 0.112.1

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/README.md CHANGED
@@ -492,7 +492,7 @@ Example configuration write file:
492
492
  "configuration_id": "01234567-89ab-4def-8123-456789abcdef",
493
493
  "expected_configuration_id": null,
494
494
  "configuration": {
495
- "bun_version": "1.4.3",
495
+ "bun_version": "1.4.4",
496
496
  "targets": [
497
497
  {
498
498
  "name": "api",
package/dist/index.js CHANGED
@@ -6770,9 +6770,14 @@ function IsTime(value, strictTimeZone = true) {
6770
6770
  }
6771
6771
 
6772
6772
  // node_modules/typebox/build/format/date_time.mjs
6773
+ var DATE_TIME_SUFFIX = /^(?:\[!?(?:(?!\.{1,2}[/\]])[A-Za-z._][A-Za-z._0-9+-]{0,13}(?:\/(?!\.{1,2}[/\]])[A-Za-z._][A-Za-z._0-9+-]{0,13})*|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])\](?:\[!?[a-z_][a-z_0-9-]*=[A-Za-z0-9]+(?:-[A-Za-z0-9]+)*\])*|(?:\[!?[a-z_][a-z_0-9-]*=[A-Za-z0-9]+(?:-[A-Za-z0-9]+)*\])*)$/;
6773
6774
  function IsDateTime(value) {
6774
- const dateTime = value.split(/T/i);
6775
- return dateTime.length === 2 && IsDate2(dateTime[0]) && IsTime(dateTime[1]);
6775
+ const index = value.indexOf("[");
6776
+ const datetime = index === -1 ? value : value.slice(0, index);
6777
+ if (index !== -1 && !DATE_TIME_SUFFIX.test(value.slice(index)))
6778
+ return false;
6779
+ const split = datetime.split(/T/i);
6780
+ return split.length === 2 && IsDate2(split[0]) && IsTime(split[1]);
6776
6781
  }
6777
6782
 
6778
6783
  // node_modules/typebox/build/format/duration.mjs
@@ -9346,7 +9351,7 @@ var ACTION_POLICY = {
9346
9351
  },
9347
9352
  secrets: { read: ["list"], write: ["upsert", "delete"] },
9348
9353
  frontend: {
9349
- read: ["list", "get", "build_logs", "list_frameworks", "list_records", "list_releases", "get_active_release", "get_release"],
9354
+ read: ["list", "get", "build_logs", "list_frameworks", "list_records", "list_releases", "get_active_release", "get_release", "verify_release"],
9350
9355
  write: ["create", "update", "delete", "deploy_git", "deploy_upload", "redeploy", "add_domain", "remove_domain", "set_env", "upload_release", "activate_release", "rollback"]
9351
9356
  },
9352
9357
  task_events: { read: ["inspect_webhook"], write: ["register_webhook", "unregister_webhook"] },
@@ -16919,6 +16924,8 @@ var TIMESTAMP_PATTERN2 = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/u;
16919
16924
  var ARCHIVE_MAX_BYTES = 100 * 1024 * 1024;
16920
16925
  var ARCHIVE_CHUNK_BYTES = 64 * 1024;
16921
16926
  var RESPONSE_MAX_BYTES = 1024 * 1024;
16927
+ var LIVE_RESPONSE_MAX_BYTES = 1024 * 1024;
16928
+ var LIVE_CHECK_TIMEOUT_MS = 1e4;
16922
16929
  var UPLOAD_REQUEST_TIMEOUT_MS = 10 * 60000;
16923
16930
  var MUTATION_RESPONSE_TIMEOUT_MS = 5000;
16924
16931
  var RELEASE_LIST_LIMIT_MAX = 100;
@@ -17276,6 +17283,129 @@ async function getActiveFrontendRelease(http, projectRef, deploymentId) {
17276
17283
  const snapshot = await readActiveFrontendRelease(http, projectRef, deploymentId);
17277
17284
  return "failure" in snapshot ? snapshot.failure : toolResponse(snapshot.inventory);
17278
17285
  }
17286
+ function deploymentLiveUrl(candidate) {
17287
+ if (!candidate || typeof candidate !== "object" || Array.isArray(candidate))
17288
+ return null;
17289
+ const value = candidate.deployment_url;
17290
+ if (typeof value !== "string" || !value.trim())
17291
+ return null;
17292
+ try {
17293
+ const url = new URL(value.trim());
17294
+ return url.protocol === "https:" || url.protocol === "http:" ? url.toString() : null;
17295
+ } catch {
17296
+ return null;
17297
+ }
17298
+ }
17299
+ async function verifyLiveDeployment(url) {
17300
+ try {
17301
+ const response = await fetch(url, {
17302
+ method: "GET",
17303
+ redirect: "follow",
17304
+ cache: "no-store",
17305
+ signal: AbortSignal.timeout(LIVE_CHECK_TIMEOUT_MS)
17306
+ });
17307
+ const contentLength = Number(response.headers.get("content-length") ?? "");
17308
+ if (Number.isFinite(contentLength) && contentLength > LIVE_RESPONSE_MAX_BYTES) {
17309
+ response.body?.cancel().catch(() => {
17310
+ return;
17311
+ });
17312
+ return {
17313
+ ok: false,
17314
+ status: response.status,
17315
+ content_type: response.headers.get("content-type"),
17316
+ bytes: contentLength,
17317
+ error_code: "LIVE_RESPONSE_TOO_LARGE"
17318
+ };
17319
+ }
17320
+ let bytes = 0;
17321
+ const reader = response.body?.getReader();
17322
+ if (reader) {
17323
+ try {
17324
+ while (true) {
17325
+ const { done, value } = await reader.read();
17326
+ if (done)
17327
+ break;
17328
+ bytes += value.byteLength;
17329
+ if (bytes > LIVE_RESPONSE_MAX_BYTES) {
17330
+ reader.cancel().catch(() => {
17331
+ return;
17332
+ });
17333
+ break;
17334
+ }
17335
+ }
17336
+ } finally {
17337
+ reader.releaseLock();
17338
+ }
17339
+ }
17340
+ const ok = response.status === 200 && bytes > 0 && bytes <= LIVE_RESPONSE_MAX_BYTES;
17341
+ return {
17342
+ ok,
17343
+ status: response.status,
17344
+ content_type: response.headers.get("content-type"),
17345
+ bytes,
17346
+ error_code: bytes > LIVE_RESPONSE_MAX_BYTES ? "LIVE_RESPONSE_TOO_LARGE" : ok ? null : bytes === 0 ? "LIVE_RESPONSE_EMPTY" : "LIVE_RESPONSE_INVALID"
17347
+ };
17348
+ } catch (error) {
17349
+ const timedOut = error instanceof Error && (error.name === "TimeoutError" || error.name === "AbortError");
17350
+ return {
17351
+ ok: false,
17352
+ status: 0,
17353
+ content_type: null,
17354
+ bytes: 0,
17355
+ error_code: timedOut ? "LIVE_CHECK_TIMEOUT" : "LIVE_CHECK_FAILED"
17356
+ };
17357
+ }
17358
+ }
17359
+ async function verifyFrontendRelease(http, projectRef, deploymentId) {
17360
+ const snapshot = await readActiveFrontendRelease(http, projectRef, deploymentId);
17361
+ if ("failure" in snapshot)
17362
+ return snapshot.failure;
17363
+ const inventory = snapshot.inventory;
17364
+ const release = inventory.releases[0];
17365
+ if (!release)
17366
+ return releaseFailure("frontend.verify_release", "NO_ACTIVE_RELEASE", 200);
17367
+ const deployment = await http.get(deploymentEndpoint(projectRef, deploymentId), {
17368
+ maxJsonBytes: RESPONSE_MAX_BYTES
17369
+ });
17370
+ const liveUrl = deployment.ok && deployment.status === 200 ? deploymentLiveUrl(deployment.data) : null;
17371
+ const live = liveUrl ? await verifyLiveDeployment(liveUrl) : { ok: false, status: 0, content_type: null, bytes: 0, error_code: "LIVE_URL_UNAVAILABLE" };
17372
+ let errorCode = live.error_code;
17373
+ if (live.ok) {
17374
+ try {
17375
+ const readback = await readActiveFrontendRelease(http, projectRef, deploymentId);
17376
+ if ("failure" in readback)
17377
+ errorCode = "ACTIVE_RELEASE_READBACK_FAILED";
17378
+ else if (readback.inventory.active_release_id !== inventory.active_release_id || readback.inventory.active_activation_id !== inventory.active_activation_id) {
17379
+ errorCode = "STALE_AUTHORITY";
17380
+ }
17381
+ } catch {
17382
+ errorCode = "ACTIVE_RELEASE_READBACK_FAILED";
17383
+ }
17384
+ }
17385
+ const ok = errorCode === null;
17386
+ const receipt = {
17387
+ schema: "supacloud.frontend-release-verification.v1",
17388
+ ok,
17389
+ error_code: errorCode,
17390
+ project_ref: projectRef,
17391
+ deployment_id: deploymentId,
17392
+ active_release_id: inventory.active_release_id,
17393
+ active_activation_id: inventory.active_activation_id,
17394
+ release,
17395
+ live: {
17396
+ url: liveUrl,
17397
+ status: live.status,
17398
+ content_type: live.content_type,
17399
+ bytes: live.bytes,
17400
+ error_code: live.error_code
17401
+ },
17402
+ checked_at: new Date().toISOString()
17403
+ };
17404
+ return {
17405
+ content: [{ type: "text", text: JSON.stringify(receipt, null, 2) }],
17406
+ ...ok ? {} : { isError: true }
17407
+ };
17408
+ }
17279
17409
  async function publishFrontendRelease(http, projectRef, deploymentId, archiveSource, expectedTreeSha256) {
17280
17410
  const authority = await readActiveFrontendRelease(http, projectRef, deploymentId);
17281
17411
  if ("failure" in authority)
@@ -17565,7 +17695,7 @@ async function activationReadback(http, input, mutationId, activationStatus) {
17565
17695
  // src/shared/tools/frontend-tools.ts
17566
17696
  function registerFrontendTools(server, http) {
17567
17697
  registerTool(server, "frontend", `Frontend hosting and immutable prebuilt releases. Supports: static, react, vue, svelte, sveltekit, sveltekit-static, nextjs, nuxt, astro.
17568
- Actions: list, get, create, update, delete, build_logs, add_domain, remove_domain, set_env, list_frameworks, list_records, list_releases, get_active_release, get_release, rollback. Publish with supacloud deploy.`, {
17698
+ Actions: list, get, create, update, delete, build_logs, add_domain, remove_domain, set_env, list_frameworks, list_records, list_releases, get_active_release, get_release, verify_release, rollback. Publish with supacloud deploy.`, {
17569
17699
  action: withDescription(stringEnum2([
17570
17700
  "list",
17571
17701
  "get",
@@ -17581,6 +17711,7 @@ Actions: list, get, create, update, delete, build_logs, add_domain, remove_domai
17581
17711
  "list_releases",
17582
17712
  "get_active_release",
17583
17713
  "get_release",
17714
+ "verify_release",
17584
17715
  "rollback"
17585
17716
  ]), "Action"),
17586
17717
  ref: optional(String2(), "Project ref"),
@@ -17711,6 +17842,10 @@ Actions: list, get, create, update, delete, build_logs, add_domain, remove_domai
17711
17842
  need("ref", ref);
17712
17843
  need("id", id);
17713
17844
  return getActiveFrontendRelease(http, ref, id);
17845
+ case "verify_release":
17846
+ need("ref", ref);
17847
+ need("id", id);
17848
+ return verifyFrontendRelease(http, ref, id);
17714
17849
  case "rollback":
17715
17850
  need("ref", ref);
17716
17851
  need("id", id);
@@ -20671,8 +20806,23 @@ var VALID_VERSION = /^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/;
20671
20806
  var VALID_MIGRATION_NAME = /^[A-Za-z0-9][A-Za-z0-9_-]{0,100}$/;
20672
20807
  var VALID_SCHEMA = /^[A-Za-z_][A-Za-z0-9_$]*$/;
20673
20808
  var VALID_PROJECT_REF = /^[A-Za-z0-9_-]{1,64}$/;
20809
+ var OFFICIAL_CLI_PG_TLS_ENV = new Set([
20810
+ "PGSSLMODE",
20811
+ "PGSSLROOTCERT",
20812
+ "PGSSLCERT",
20813
+ "PGSSLKEY",
20814
+ "PGSSLCRL",
20815
+ "PGSSLCRLDIR",
20816
+ "PGSSLSNI",
20817
+ "PGSSLNEGOTIATION",
20818
+ "PGSSLCOMPRESSION",
20819
+ "PGREQUIRESSL"
20820
+ ]);
20674
20821
  function isSensitiveEnvironmentKey(key) {
20675
- return key.toUpperCase().startsWith("PG") || SENSITIVE_ENV_KEY.test(key);
20822
+ const upper = key.toUpperCase();
20823
+ if (OFFICIAL_CLI_PG_TLS_ENV.has(upper))
20824
+ return false;
20825
+ return upper.startsWith("PG") || SENSITIVE_ENV_KEY.test(upper);
20676
20826
  }
20677
20827
  function requireMigrationName(name) {
20678
20828
  if (!name || !VALID_MIGRATION_NAME.test(name)) {
@@ -20959,7 +21109,7 @@ function resolveOfficialSupabaseCommand(workdir, environment = process.env) {
20959
21109
  const version = environment.SUPABASE_CLI_VERSION?.trim();
20960
21110
  if (version) {
20961
21111
  if (!VALID_VERSION.test(version))
20962
- throw new Error("Invalid SUPABASE_CLI_VERSION; use an exact version such as 2.120.0");
21112
+ throw new Error("Invalid SUPABASE_CLI_VERSION; use an exact version such as 2.122.0");
20963
21113
  if (process.versions.bun)
20964
21114
  return [process.execPath, "x", `supabase@${version}`];
20965
21115
  if (process.platform === "win32") {
@@ -21800,25 +21950,25 @@ var starter_metadata_default = {
21800
21950
  generatedBy: "supacloud/starter-metadata-v1",
21801
21951
  packages: {
21802
21952
  compiler: {
21803
- version: "0.52.0"
21953
+ version: "0.52.1"
21804
21954
  },
21805
21955
  app: {
21806
- version: "0.34.0",
21956
+ version: "0.34.1",
21807
21957
  dependencies: {
21808
21958
  rxjs: "7.8.2"
21809
21959
  }
21810
21960
  },
21811
21961
  elysia: {
21812
- version: "0.36.2"
21962
+ version: "0.36.3"
21813
21963
  },
21814
21964
  commands: {
21815
- version: "0.11.1"
21965
+ version: "0.11.2"
21816
21966
  },
21817
21967
  contracts: {
21818
- version: "0.15.1"
21968
+ version: "0.15.2"
21819
21969
  },
21820
21970
  db: {
21821
- version: "0.20.1",
21971
+ version: "0.20.2",
21822
21972
  peerDependencies: {
21823
21973
  "drizzle-orm": "1.0.0-rc.5-5935859"
21824
21974
  },
@@ -21827,9 +21977,9 @@ var starter_metadata_default = {
21827
21977
  }
21828
21978
  },
21829
21979
  sdk: {
21830
- version: "0.45.2",
21980
+ version: "0.45.4",
21831
21981
  peerDependencies: {
21832
- "@supabase/supabase-js": "^2.117.3"
21982
+ "@supabase/supabase-js": "^2.118.0"
21833
21983
  }
21834
21984
  }
21835
21985
  }
@@ -22152,7 +22302,7 @@ function baseFiles(name, sdkDependencies) {
22152
22302
  version: "0.0.0",
22153
22303
  private: true,
22154
22304
  type: "module",
22155
- engines: { bun: ">=1.4.3" },
22305
+ engines: { bun: ">=1.4.4" },
22156
22306
  scripts: {
22157
22307
  compile: "bun --no-env-file node_modules/@supacloud/compiler/dist/cli.js compile",
22158
22308
  "check:generated": "bun --no-env-file node_modules/@supacloud/compiler/dist/cli.js check",
@@ -22176,7 +22326,7 @@ function baseFiles(name, sdkDependencies) {
22176
22326
  },
22177
22327
  devDependencies: {
22178
22328
  "@supacloud/compiler": `^${compilerMetadata.version}`,
22179
- "@types/bun": "^1.4.3",
22329
+ "@types/bun": "^1.4.4",
22180
22330
  typescript: "^7.0.2"
22181
22331
  }
22182
22332
  }),
@@ -25307,7 +25457,7 @@ function appStarterFiles(name) {
25307
25457
  version: "0.0.0",
25308
25458
  private: true,
25309
25459
  type: "module",
25310
- engines: { bun: ">=1.4.3" },
25460
+ engines: { bun: ">=1.4.4" },
25311
25461
  scripts: {
25312
25462
  compile: "bun --no-env-file node_modules/@supacloud/compiler/dist/cli.js compile",
25313
25463
  "check:generated": "bun --no-env-file node_modules/@supacloud/compiler/dist/cli.js check",
@@ -25343,7 +25493,7 @@ function appStarterFiles(name) {
25343
25493
  devDependencies: {
25344
25494
  "@supacloud/compiler": `^${compilerMetadata2.version}`,
25345
25495
  "drizzle-kit": dbMetadata.devDependencies["drizzle-kit"],
25346
- "@types/bun": "^1.4.3",
25496
+ "@types/bun": "^1.4.4",
25347
25497
  typescript: "^7.0.2"
25348
25498
  }
25349
25499
  }),
@@ -29688,8 +29838,23 @@ var VALID_VERSION2 = /^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/;
29688
29838
  var VALID_MIGRATION_NAME2 = /^[A-Za-z0-9][A-Za-z0-9_-]{0,100}$/;
29689
29839
  var VALID_SCHEMA2 = /^[A-Za-z_][A-Za-z0-9_$]*$/;
29690
29840
  var VALID_PROJECT_REF2 = /^[A-Za-z0-9_-]{1,64}$/;
29841
+ var OFFICIAL_CLI_PG_TLS_ENV2 = new Set([
29842
+ "PGSSLMODE",
29843
+ "PGSSLROOTCERT",
29844
+ "PGSSLCERT",
29845
+ "PGSSLKEY",
29846
+ "PGSSLCRL",
29847
+ "PGSSLCRLDIR",
29848
+ "PGSSLSNI",
29849
+ "PGSSLNEGOTIATION",
29850
+ "PGSSLCOMPRESSION",
29851
+ "PGREQUIRESSL"
29852
+ ]);
29691
29853
  function isSensitiveEnvironmentKey2(key) {
29692
- return key.toUpperCase().startsWith("PG") || SENSITIVE_ENV_KEY2.test(key);
29854
+ const upper = key.toUpperCase();
29855
+ if (OFFICIAL_CLI_PG_TLS_ENV2.has(upper))
29856
+ return false;
29857
+ return upper.startsWith("PG") || SENSITIVE_ENV_KEY2.test(upper);
29693
29858
  }
29694
29859
  function requireMigrationName2(name) {
29695
29860
  if (!name || !VALID_MIGRATION_NAME2.test(name)) {
@@ -29941,7 +30106,7 @@ function resolveOfficialSupabaseCommand2(workdir, environment = process.env) {
29941
30106
  const version = environment.SUPABASE_CLI_VERSION?.trim();
29942
30107
  if (version) {
29943
30108
  if (!VALID_VERSION2.test(version))
29944
- throw new Error("Invalid SUPABASE_CLI_VERSION; use an exact version such as 2.120.0");
30109
+ throw new Error("Invalid SUPABASE_CLI_VERSION; use an exact version such as 2.122.0");
29945
30110
  if (process.versions.bun)
29946
30111
  return [process.execPath, "x", `supabase@${version}`];
29947
30112
  if (process.platform === "win32") {
@@ -33421,7 +33586,7 @@ async function runProjectDeployment(http, args) {
33421
33586
  // package.json
33422
33587
  var package_default = {
33423
33588
  name: "@supacloud/cli",
33424
- version: "0.111.0",
33589
+ version: "0.112.1",
33425
33590
  description: "Project-scoped CLI for SupaCloud users",
33426
33591
  type: "module",
33427
33592
  main: "./dist/index.js",
@@ -33473,20 +33638,20 @@ var package_default = {
33473
33638
  directory: "packages/cli"
33474
33639
  },
33475
33640
  dependencies: {
33476
- "@supacloud/compiler": "^0.52.0",
33477
- "@supacloud/delivery": "0.23.0",
33478
- "@supacloud/db": "0.20.1",
33479
- typebox: "1.4.2"
33641
+ "@supacloud/compiler": "^0.52.1",
33642
+ "@supacloud/delivery": "0.23.1",
33643
+ "@supacloud/db": "0.20.2",
33644
+ typebox: "1.4.3"
33480
33645
  },
33481
33646
  overrides: {
33482
- "@supacloud/contracts": "0.15.1",
33483
- "@supacloud/delivery": "0.23.0",
33647
+ "@supacloud/contracts": "0.15.2",
33648
+ "@supacloud/delivery": "0.23.1",
33484
33649
  "@graphql-tools/utils": "^12.0.4"
33485
33650
  },
33486
33651
  devDependencies: {
33487
33652
  "@supabase/supabase-js": "2.118.0",
33488
- "@supacloud/elysia": "0.36.2",
33489
- "@types/bun": "^1.4.3",
33653
+ "@supacloud/elysia": "0.36.3",
33654
+ "@types/bun": "^1.4.4",
33490
33655
  effect: "4.0.5",
33491
33656
  elysia: "2.0.0-rc.0",
33492
33657
  typescript: "^7.0.2"
@@ -5,7 +5,7 @@ export declare const APPLICATION_PREVIEW_FIELDS: {
5
5
  preview_id: Type.TOptional<Type.TString>;
6
6
  branch_ref: Type.TOptional<Type.TString>;
7
7
  branch_name: Type.TOptional<Type.TString>;
8
- data_mode: Type.TOptional<Type.TEnum<("schema_only" | "full_clone")[]>>;
8
+ data_mode: Type.TOptional<Type.TEnum<("full_clone" | "schema_only")[]>>;
9
9
  ttl_seconds: Type.TOptional<Type.TInteger>;
10
10
  wait: Type.TOptional<Type.TBoolean>;
11
11
  timeout_seconds: Type.TOptional<Type.TInteger>;
@@ -18,40 +18,40 @@ declare const receiptSchema: Type.TObject<{
18
18
  environment_id: Type.TString;
19
19
  release_id: Type.TString;
20
20
  expires_at: Type.TOptional<Type.TUnion<[Type.TString, Type.TNull]>>;
21
- status: Type.TEnum<("ready" | "failed" | "cleaned" | "planned" | "provisioning")[]>;
21
+ status: Type.TEnum<("cleaned" | "failed" | "planned" | "provisioning" | "ready")[]>;
22
22
  resources: Type.TObject<{
23
23
  build_artifact: Type.TObject<{
24
- status: Type.TEnum<("pending" | "ready" | "failed" | "cleaned")[]>;
24
+ status: Type.TEnum<("cleaned" | "failed" | "pending" | "ready")[]>;
25
25
  release_id: Type.TString;
26
26
  }>;
27
27
  database_branch: Type.TObject<{
28
- status: Type.TEnum<("pending" | "ready" | "failed" | "cleaned")[]>;
28
+ status: Type.TEnum<("cleaned" | "failed" | "pending" | "ready")[]>;
29
29
  branch_ref: Type.TString;
30
- data_mode: Type.TEnum<("schema_only" | "full_clone")[]>;
30
+ data_mode: Type.TEnum<("full_clone" | "schema_only")[]>;
31
31
  }>;
32
32
  queue_namespace: Type.TObject<{
33
- status: Type.TEnum<("pending" | "ready" | "failed" | "cleaned")[]>;
33
+ status: Type.TEnum<("cleaned" | "failed" | "pending" | "ready")[]>;
34
34
  namespace: Type.TString;
35
35
  }>;
36
36
  storage_namespace: Type.TObject<{
37
- status: Type.TEnum<("pending" | "ready" | "failed" | "cleaned")[]>;
37
+ status: Type.TEnum<("cleaned" | "failed" | "pending" | "ready")[]>;
38
38
  namespace: Type.TString;
39
39
  }>;
40
40
  test_secret: Type.TObject<{
41
- status: Type.TEnum<("pending" | "ready" | "failed" | "cleaned")[]>;
41
+ status: Type.TEnum<("cleaned" | "failed" | "pending" | "ready")[]>;
42
42
  name: Type.TString;
43
43
  value_issued: Type.TLiteral<false>;
44
44
  }>;
45
45
  configuration_revision: Type.TObject<{
46
- status: Type.TEnum<("pending" | "ready" | "failed" | "cleaned")[]>;
46
+ status: Type.TEnum<("cleaned" | "failed" | "pending" | "ready")[]>;
47
47
  configuration_id: Type.TUnion<[Type.TString, Type.TNull]>;
48
48
  }>;
49
49
  application_activation: Type.TObject<{
50
- status: Type.TEnum<("pending" | "ready" | "failed" | "cleaned")[]>;
50
+ status: Type.TEnum<("cleaned" | "failed" | "pending" | "ready")[]>;
51
51
  activation_id: Type.TUnion<[Type.TString, Type.TNull]>;
52
52
  }>;
53
53
  smoke_test: Type.TObject<{
54
- status: Type.TEnum<("pending" | "ready" | "failed" | "cleaned")[]>;
54
+ status: Type.TEnum<("cleaned" | "failed" | "pending" | "ready")[]>;
55
55
  checks: Type.TArray<Type.TString>;
56
56
  passed: Type.TArray<Type.TString>;
57
57
  failed: Type.TArray<Type.TString>;
@@ -147,7 +147,7 @@ export declare const ApplicationPromotionPlanSchema: import("typebox").TObject<{
147
147
  confirmed: import("typebox").TLiteral<false>;
148
148
  }>;
149
149
  action: import("typebox").TUnion<[import("typebox").TLiteral<"promote">, import("typebox").TLiteral<"no-op">, import("typebox").TLiteral<"blocked">]>;
150
- blockers: import("typebox").TArray<import("typebox").TEnum<("SOURCE_NOT_ACTIVE" | "SOURCE_RECEIPT_UNCONFIRMED" | "SOURCE_NOT_READY" | "SOURCE_SMOKE_UNVERIFIED" | "TARGET_CONFIGURATION_MISSING" | "TARGET_CONFIGURATION_MISMATCH" | "MIGRATION_PENDING" | "MIGRATION_CONFLICT" | "OPERATOR_PROVISIONING_REQUIRED" | "BACKUP_REQUIRED")[]>>;
150
+ blockers: import("typebox").TArray<import("typebox").TEnum<("BACKUP_REQUIRED" | "MIGRATION_CONFLICT" | "MIGRATION_PENDING" | "OPERATOR_PROVISIONING_REQUIRED" | "SOURCE_NOT_ACTIVE" | "SOURCE_NOT_READY" | "SOURCE_RECEIPT_UNCONFIRMED" | "SOURCE_SMOKE_UNVERIFIED" | "TARGET_CONFIGURATION_MISMATCH" | "TARGET_CONFIGURATION_MISSING")[]>>;
151
151
  steps: import("typebox").TArray<import("typebox").TString>;
152
152
  execution_performed: import("typebox").TLiteral<false>;
153
153
  data_recovery: import("typebox").TLiteral<"separate-required">;
@@ -5,11 +5,11 @@ export declare const APPLICATION_TOOL_SCHEMA: {
5
5
  preview_id: Type.TOptional<Type.TString>;
6
6
  branch_ref: Type.TOptional<Type.TString>;
7
7
  branch_name: Type.TOptional<Type.TString>;
8
- data_mode: Type.TOptional<Type.TEnum<("schema_only" | "full_clone")[]>>;
8
+ data_mode: Type.TOptional<Type.TEnum<("full_clone" | "schema_only")[]>>;
9
9
  ttl_seconds: Type.TOptional<Type.TInteger>;
10
10
  wait: Type.TOptional<Type.TBoolean>;
11
11
  timeout_seconds: Type.TOptional<Type.TInteger>;
12
- action: Type.TEnum<("upload_release" | "activate_release" | "list_releases" | "get_release" | "logs" | "get_runtime" | "get_deployment_evidence" | "get_configuration" | "get_release_transfer_plan" | "get_promotion_plan" | "get_promotion_status" | "get_rollback_snapshot" | "get_history" | "get_deploy_plan" | "get_preview_plan" | "list_previews" | "get_preview" | "put_configuration" | "deploy_application" | "transfer_release" | "promote_application" | "reconcile_promotion" | "create_preview" | "reconcile_preview" | "cleanup_preview" | "deploy_release" | "rollback_release" | "reconcile_activation" | "retire_activation")[]>;
12
+ action: Type.TEnum<("activate_release" | "cleanup_preview" | "create_preview" | "deploy_application" | "deploy_release" | "get_configuration" | "get_deploy_plan" | "get_deployment_evidence" | "get_history" | "get_preview" | "get_preview_plan" | "get_promotion_plan" | "get_promotion_status" | "get_release" | "get_release_transfer_plan" | "get_rollback_snapshot" | "get_runtime" | "list_previews" | "list_releases" | "logs" | "promote_application" | "put_configuration" | "reconcile_activation" | "reconcile_preview" | "reconcile_promotion" | "retire_activation" | "rollback_release" | "transfer_release" | "upload_release")[]>;
13
13
  ref: Type.TString;
14
14
  id: Type.TString;
15
15
  environment_id: Type.TOptional<Type.TString>;
@@ -86,7 +86,7 @@ export declare const APPLICATION_TOOL_SCHEMA: {
86
86
  confirmed: Type.TLiteral<false>;
87
87
  }>;
88
88
  action: Type.TUnion<[Type.TLiteral<"promote">, Type.TLiteral<"no-op">, Type.TLiteral<"blocked">]>;
89
- blockers: Type.TArray<Type.TEnum<("SOURCE_NOT_ACTIVE" | "SOURCE_RECEIPT_UNCONFIRMED" | "SOURCE_NOT_READY" | "SOURCE_SMOKE_UNVERIFIED" | "TARGET_CONFIGURATION_MISSING" | "TARGET_CONFIGURATION_MISMATCH" | "MIGRATION_PENDING" | "MIGRATION_CONFLICT" | "OPERATOR_PROVISIONING_REQUIRED" | "BACKUP_REQUIRED")[]>>;
89
+ blockers: Type.TArray<Type.TEnum<("BACKUP_REQUIRED" | "MIGRATION_CONFLICT" | "MIGRATION_PENDING" | "OPERATOR_PROVISIONING_REQUIRED" | "SOURCE_NOT_ACTIVE" | "SOURCE_NOT_READY" | "SOURCE_RECEIPT_UNCONFIRMED" | "SOURCE_SMOKE_UNVERIFIED" | "TARGET_CONFIGURATION_MISMATCH" | "TARGET_CONFIGURATION_MISSING")[]>>;
90
90
  steps: Type.TArray<Type.TString>;
91
91
  execution_performed: Type.TLiteral<false>;
92
92
  data_recovery: Type.TLiteral<"separate-required">;
@@ -1,15 +1,18 @@
1
1
  import { Type } from "typebox";
2
2
  export declare const ApplicationPromotionResultSchema: Type.TObject<{
3
+ project_ref: Type.TString;
4
+ application_id: Type.TString;
5
+ environment_id: Type.TString;
3
6
  mutation_id: Type.TString;
4
7
  activation_id: Type.TString;
5
8
  plan_sha256: Type.TString;
6
9
  action: Type.TLiteral<"promote">;
7
10
  replayed: Type.TBoolean;
11
+ }>;
12
+ export declare const ApplicationPromotionStatusSchema: Type.TObject<{
8
13
  project_ref: Type.TString;
9
14
  application_id: Type.TString;
10
15
  environment_id: Type.TString;
11
- }>;
12
- export declare const ApplicationPromotionStatusSchema: Type.TObject<{
13
16
  mutation: Type.TUnknown;
14
17
  promotion: Type.TObject<{
15
18
  phase: Type.TUnion<[Type.TLiteral<"prepared">, Type.TLiteral<"transferring">, Type.TLiteral<"migrating">, Type.TLiteral<"activating">, Type.TLiteral<"verifying">, Type.TNull]>;
@@ -20,11 +23,12 @@ export declare const ApplicationPromotionStatusSchema: Type.TObject<{
20
23
  backup_id: Type.TUnion<[Type.TString, Type.TNull]>;
21
24
  data_recovery: Type.TLiteral<"separate-required">;
22
25
  }>;
26
+ }>;
27
+ export declare const ApplicationPreviewReceiptSchema: Type.TObject<{
23
28
  project_ref: Type.TString;
24
29
  application_id: Type.TString;
25
30
  environment_id: Type.TString;
26
- }>;
27
- export declare const ApplicationPreviewReceiptSchema: Type.TObject<{
31
+ schema: Type.TLiteral<"supacloud.application-preview.v1">;
28
32
  preview_id: Type.TString;
29
33
  release_id: Type.TString;
30
34
  expires_at: Type.TUnion<[Type.TString, Type.TNull]>;
@@ -78,10 +82,6 @@ export declare const ApplicationPreviewReceiptSchema: Type.TObject<{
78
82
  source_configuration_id: Type.TOptional<Type.TUnion<[Type.TString, Type.TNull]>>;
79
83
  created_at: Type.TOptional<Type.TString>;
80
84
  updated_at: Type.TOptional<Type.TString>;
81
- project_ref: Type.TString;
82
- application_id: Type.TString;
83
- environment_id: Type.TString;
84
- schema: Type.TLiteral<"supacloud.application-preview.v1">;
85
85
  }>;
86
86
  export interface ApplicationWorkflowScope {
87
87
  project_ref: string;
@@ -91,19 +91,19 @@ export interface ApplicationWorkflowScope {
91
91
  export declare function parsePromotionStatus(value: unknown, identity: ApplicationWorkflowScope & {
92
92
  mutation_id: string;
93
93
  }): {
94
- mutation: import("../mutation-protocol").SafeMutationStatus;
95
94
  project_ref: string;
96
95
  application_id: string;
97
96
  environment_id: string;
98
97
  promotion: {
99
- backup_id: string | null;
98
+ phase: "activating" | "migrating" | "prepared" | "transferring" | "verifying" | null;
99
+ plan_sha256: string | null;
100
100
  activation_id: string | null;
101
101
  release_id: string | null;
102
102
  configuration_id: string | null;
103
- plan_sha256: string | null;
103
+ backup_id: string | null;
104
104
  data_recovery: "separate-required";
105
- phase: "prepared" | "transferring" | "migrating" | "activating" | "verifying" | null;
106
105
  };
106
+ mutation: import("../mutation-protocol").SafeMutationStatus;
107
107
  };
108
108
  export declare function parsePreviewReceipt(value: unknown, identity: ApplicationWorkflowScope & {
109
109
  preview_id?: string;
@@ -112,125 +112,125 @@ export declare function parsePreviewReceipt(value: unknown, identity: Applicatio
112
112
  data_mode?: string;
113
113
  configuration_id?: string;
114
114
  }): {
115
- created_at?: string | undefined;
116
- updated_at?: string | undefined;
117
- branch_name?: string | undefined;
118
- queue_name?: string | undefined;
119
- test_secret_name?: string | undefined;
120
- source_configuration_id?: string | null | undefined;
121
115
  project_ref: string;
122
116
  application_id: string;
123
117
  environment_id: string;
124
- status: "ready" | "failed" | "cleaned" | "planned" | "provisioning";
125
118
  schema: "supacloud.application-preview.v1";
119
+ preview_id: string;
120
+ release_id: string;
121
+ expires_at: string | null;
122
+ status: "cleaned" | "failed" | "planned" | "provisioning" | "ready";
126
123
  resources: {
127
124
  build_artifact: {
128
- status: "pending" | "ready" | "failed" | "cleaned";
125
+ status: "cleaned" | "failed" | "pending" | "ready";
129
126
  release_id: string;
130
127
  };
131
128
  database_branch: {
132
- status: "pending" | "ready" | "failed" | "cleaned";
129
+ status: "cleaned" | "failed" | "pending" | "ready";
133
130
  branch_ref: string;
134
- data_mode: "schema_only" | "full_clone";
131
+ data_mode: "full_clone" | "schema_only";
135
132
  };
136
133
  queue_namespace: {
137
- status: "pending" | "ready" | "failed" | "cleaned";
134
+ status: "cleaned" | "failed" | "pending" | "ready";
138
135
  namespace: string;
139
136
  };
140
137
  storage_namespace: {
141
- status: "pending" | "ready" | "failed" | "cleaned";
138
+ status: "cleaned" | "failed" | "pending" | "ready";
142
139
  namespace: string;
143
140
  };
144
141
  test_secret: {
142
+ status: "cleaned" | "failed" | "pending" | "ready";
145
143
  name: string;
146
- status: "pending" | "ready" | "failed" | "cleaned";
147
144
  value_issued: false;
148
145
  };
149
146
  configuration_revision: {
150
- status: "pending" | "ready" | "failed" | "cleaned";
147
+ status: "cleaned" | "failed" | "pending" | "ready";
151
148
  configuration_id: string | null;
152
149
  };
153
150
  application_activation: {
154
- status: "pending" | "ready" | "failed" | "cleaned";
151
+ status: "cleaned" | "failed" | "pending" | "ready";
155
152
  activation_id: string | null;
156
153
  };
157
154
  smoke_test: {
158
- status: "pending" | "ready" | "failed" | "cleaned";
155
+ status: "cleaned" | "failed" | "pending" | "ready";
159
156
  checks: string[];
160
- failed: string[];
161
157
  passed: string[];
158
+ failed: string[];
162
159
  };
163
160
  };
164
- release_id: string;
165
- preview_id: string;
166
- expires_at: string | null;
167
161
  cleanup: {
168
162
  required: boolean;
169
- error: string | null;
170
163
  completed: boolean;
164
+ error: string | null;
171
165
  };
166
+ branch_name?: string | undefined;
167
+ queue_name?: string | undefined;
168
+ test_secret_name?: string | undefined;
169
+ source_configuration_id?: string | null | undefined;
170
+ created_at?: string | undefined;
171
+ updated_at?: string | undefined;
172
172
  };
173
173
  export declare function parsePreviewList(value: unknown, identity: ApplicationWorkflowScope): {
174
174
  project_ref: string;
175
175
  application_id: string;
176
176
  environment_id: string;
177
177
  previews: {
178
- created_at?: string | undefined;
179
- updated_at?: string | undefined;
180
- branch_name?: string | undefined;
181
- queue_name?: string | undefined;
182
- test_secret_name?: string | undefined;
183
- source_configuration_id?: string | null | undefined;
184
178
  project_ref: string;
185
179
  application_id: string;
186
180
  environment_id: string;
187
- status: "ready" | "failed" | "cleaned" | "planned" | "provisioning";
188
181
  schema: "supacloud.application-preview.v1";
182
+ preview_id: string;
183
+ release_id: string;
184
+ expires_at: string | null;
185
+ status: "cleaned" | "failed" | "planned" | "provisioning" | "ready";
189
186
  resources: {
190
187
  build_artifact: {
191
- status: "pending" | "ready" | "failed" | "cleaned";
188
+ status: "cleaned" | "failed" | "pending" | "ready";
192
189
  release_id: string;
193
190
  };
194
191
  database_branch: {
195
- status: "pending" | "ready" | "failed" | "cleaned";
192
+ status: "cleaned" | "failed" | "pending" | "ready";
196
193
  branch_ref: string;
197
- data_mode: "schema_only" | "full_clone";
194
+ data_mode: "full_clone" | "schema_only";
198
195
  };
199
196
  queue_namespace: {
200
- status: "pending" | "ready" | "failed" | "cleaned";
197
+ status: "cleaned" | "failed" | "pending" | "ready";
201
198
  namespace: string;
202
199
  };
203
200
  storage_namespace: {
204
- status: "pending" | "ready" | "failed" | "cleaned";
201
+ status: "cleaned" | "failed" | "pending" | "ready";
205
202
  namespace: string;
206
203
  };
207
204
  test_secret: {
205
+ status: "cleaned" | "failed" | "pending" | "ready";
208
206
  name: string;
209
- status: "pending" | "ready" | "failed" | "cleaned";
210
207
  value_issued: false;
211
208
  };
212
209
  configuration_revision: {
213
- status: "pending" | "ready" | "failed" | "cleaned";
210
+ status: "cleaned" | "failed" | "pending" | "ready";
214
211
  configuration_id: string | null;
215
212
  };
216
213
  application_activation: {
217
- status: "pending" | "ready" | "failed" | "cleaned";
214
+ status: "cleaned" | "failed" | "pending" | "ready";
218
215
  activation_id: string | null;
219
216
  };
220
217
  smoke_test: {
221
- status: "pending" | "ready" | "failed" | "cleaned";
218
+ status: "cleaned" | "failed" | "pending" | "ready";
222
219
  checks: string[];
223
- failed: string[];
224
220
  passed: string[];
221
+ failed: string[];
225
222
  };
226
223
  };
227
- release_id: string;
228
- preview_id: string;
229
- expires_at: string | null;
230
224
  cleanup: {
231
225
  required: boolean;
232
- error: string | null;
233
226
  completed: boolean;
227
+ error: string | null;
234
228
  };
229
+ branch_name?: string | undefined;
230
+ queue_name?: string | undefined;
231
+ test_secret_name?: string | undefined;
232
+ source_configuration_id?: string | null | undefined;
233
+ created_at?: string | undefined;
234
+ updated_at?: string | undefined;
235
235
  }[];
236
236
  };
@@ -45,6 +45,7 @@ export declare function uploadFrontendRelease(http: FrontendReleaseHttp, project
45
45
  export declare function uploadProjectWebRelease(http: FrontendReleaseHttp, projectRef: string, environmentId: string, deploymentId: string, archivePath: string): Promise<ToolResponse>;
46
46
  export declare function uploadFrontendSource(http: FrontendReleaseHttp, projectRef: string, deploymentId: string, archivePath: string): Promise<ToolResponse>;
47
47
  export declare function getActiveFrontendRelease(http: FrontendReleaseHttp, projectRef: string, deploymentId: string): Promise<ToolResponse>;
48
+ export declare function verifyFrontendRelease(http: FrontendReleaseHttp, projectRef: string, deploymentId: string): Promise<ToolResponse>;
48
49
  export declare function readFrontendReleaseAuthority(http: FrontendReleaseHttp, projectRef: string, deploymentId: string): Promise<ToolResponse>;
49
50
  export declare function publishFrontendRelease(http: FrontendReleaseHttp, projectRef: string, deploymentId: string, archiveSource: string | (() => Promise<{
50
51
  archivePath: string;
@@ -19,8 +19,8 @@ export interface RemoteDevToolOptions {
19
19
  runDatabase?: DatabaseCallback;
20
20
  }
21
21
  export declare const remoteDevToolSchema: {
22
- action: Type.TEnum<("status" | "migrate" | "watch" | "sync")[]>;
23
- target: Type.TOptional<Type.TEnum<("frontend" | "project" | "db" | "functions")[]>>;
22
+ action: Type.TEnum<("migrate" | "status" | "sync" | "watch")[]>;
23
+ target: Type.TOptional<Type.TEnum<("db" | "frontend" | "functions" | "project")[]>>;
24
24
  project_dir: Type.TOptional<Type.TString>;
25
25
  remote_root: Type.TOptional<Type.TString>;
26
26
  remote_host: Type.TOptional<Type.TString>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@supacloud/cli",
3
- "version": "0.111.0",
3
+ "version": "0.112.1",
4
4
  "description": "Project-scoped CLI for SupaCloud users",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -52,20 +52,20 @@
52
52
  "directory": "packages/cli"
53
53
  },
54
54
  "dependencies": {
55
- "@supacloud/compiler": "^0.52.0",
56
- "@supacloud/delivery": "0.23.0",
57
- "@supacloud/db": "0.20.1",
58
- "typebox": "1.4.2"
55
+ "@supacloud/compiler": "^0.52.1",
56
+ "@supacloud/delivery": "0.23.1",
57
+ "@supacloud/db": "0.20.2",
58
+ "typebox": "1.4.3"
59
59
  },
60
60
  "overrides": {
61
- "@supacloud/contracts": "0.15.1",
62
- "@supacloud/delivery": "0.23.0",
61
+ "@supacloud/contracts": "0.15.2",
62
+ "@supacloud/delivery": "0.23.1",
63
63
  "@graphql-tools/utils": "^12.0.4"
64
64
  },
65
65
  "devDependencies": {
66
66
  "@supabase/supabase-js": "2.118.0",
67
- "@supacloud/elysia": "0.36.2",
68
- "@types/bun": "^1.4.3",
67
+ "@supacloud/elysia": "0.36.3",
68
+ "@types/bun": "^1.4.4",
69
69
  "effect": "4.0.5",
70
70
  "elysia": "2.0.0-rc.0",
71
71
  "typescript": "^7.0.2"