@supacloud/cli 0.83.0 → 0.85.0

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
@@ -86,6 +86,7 @@ supacloud-cli app preview-plan --env test --id orders --environment_id test --re
86
86
  supacloud-cli app preview --env test --id orders --environment_id test --release_id RELEASE_SHA256 --configuration_id CONFIG_UUID --ttl_seconds 3600 --wait --timeout_seconds 300
87
87
  supacloud-cli app previews --env test --id orders --environment_id test
88
88
  supacloud-cli app preview-status --env test --id orders --environment_id test --preview_id PREVIEW_UUID --wait --timeout_seconds 300
89
+ supacloud-cli app preview-reconcile --env test --id orders --environment_id test --preview_id PREVIEW_UUID
89
90
  supacloud-cli app preview-cleanup --env test --id orders --environment_id test --preview_id PREVIEW_UUID
90
91
  ```
91
92
 
@@ -114,9 +115,10 @@ query or identity drift ends it with nonzero status. A wait timeout returns
114
115
  same-ID continuation in `reconciliation`. It does not mark provisioning failed,
115
116
  retry a failed lifecycle GET, delete resources or promote an environment.
116
117
 
117
- `preview-plan` is read-only. Preview list/status requests may resume persisted
118
- provisioning on the server, so they are classified as writes, including in
119
- read-only and production profiles. The platform may clean eligible expired
118
+ `preview-plan`, `previews` and `preview-status` are read-only. They never resume
119
+ persisted provisioning. Use `preview-reconcile` to explicitly resume a selected
120
+ Preview ID; it is classified as a write, including in read-only and production
121
+ profiles. The platform may clean eligible expired
120
122
  previews, but never interrupts a serving preview or empties nonempty Storage
121
123
  automatically. Explicit cleanup remains available. Failed previews return
122
124
  nonzero with the validated receipt and cleanup state. Unknown create outcomes
package/dist/index.js CHANGED
@@ -9152,8 +9152,8 @@ function resolveSupaCloudContext(env = process.env, cwd = process.cwd(), selecti
9152
9152
  var ACTION_POLICY = {
9153
9153
  deploy: { write: ["deploy"] },
9154
9154
  applications: {
9155
- read: ["list_releases", "get_release", "get_runtime", "get_deployment_evidence", "get_configuration", "get_release_transfer_plan", "get_promotion_plan", "get_rollback_snapshot", "get_history", "get_deploy_plan", "get_promotion_status", "get_preview_plan", "logs"],
9156
- write: ["upload_release", "put_configuration", "transfer_release", "promote_application", "reconcile_promotion", "create_preview", "list_previews", "get_preview", "cleanup_preview", "activate_release", "deploy_release", "rollback_release", "reconcile_activation", "retire_activation"]
9155
+ read: ["list_releases", "get_release", "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", "logs", "get_preview_plan", "list_previews", "get_preview"],
9156
+ write: ["upload_release", "put_configuration", "transfer_release", "promote_application", "reconcile_promotion", "create_preview", "reconcile_preview", "cleanup_preview", "activate_release", "deploy_release", "rollback_release", "reconcile_activation", "retire_activation"]
9157
9157
  },
9158
9158
  project: {
9159
9159
  read: ["get", "endpoints", "health", "logs", "api_keys", "settings", "tasks", "task_detail", "task_stats", "dlq", "background_settings"],
@@ -9248,8 +9248,8 @@ var ACTION_POLICY = {
9248
9248
  ai: { local: ["show_skill", "install_skill"] },
9249
9249
  app: {
9250
9250
  local: ["init", "generate", "dev", "watch", "verify-plan", "compile", "check", "graph", "explain", "export-tools", "context", "doctor", "fix", "plan", "build"],
9251
- read: ["status", "logs", "transfer-plan", "promote-plan", "rollback-plan", "history", "deploy-plan", "diff", "promote-status", "preview-plan"],
9252
- write: ["upload", "configure", "transfer", "promote", "promote-reconcile", "deploy", "rollback", "reconcile", "retire", "preview", "previews", "preview-list", "preview-create", "preview-status", "preview-cleanup"]
9251
+ read: ["status", "logs", "transfer-plan", "promote-plan", "rollback-plan", "history", "deploy-plan", "diff", "promote-status", "preview-plan", "previews", "preview-list", "preview-status"],
9252
+ write: ["release", "upload", "configure", "transfer", "promote", "promote-reconcile", "deploy", "rollback", "reconcile", "retire", "preview", "preview-create", "preview-reconcile", "preview-cleanup"]
9253
9253
  },
9254
9254
  db: {
9255
9255
  local: ["context", "lint", "explain", "diff", "role_sql"],
@@ -9826,7 +9826,10 @@ class HttpTransport {
9826
9826
  return transportFailure(error);
9827
9827
  }
9828
9828
  }
9829
- async delete(path, body) {
9829
+ async delete(path, body, options) {
9830
+ const timeoutMs = validatedPostTimeout(options);
9831
+ const maxJsonBytes = validatedJsonResponseLimit(options?.maxJsonBytes);
9832
+ const responseTimeoutMs = validatedResponseTimeout(options?.responseTimeoutMs);
9830
9833
  try {
9831
9834
  const serializedBody = serializedRequestBody(body);
9832
9835
  const request = {
@@ -9834,7 +9837,11 @@ class HttpTransport {
9834
9837
  headers: this.headers(),
9835
9838
  ...serializedBody === undefined ? {} : { body: serializedBody }
9836
9839
  };
9837
- const res = await fetchWithRetry(`${this.baseUrl}${path}`, request, DEFAULT_TIMEOUT, this.insecureTls);
9840
+ const res = await fetchWithRetry(`${this.baseUrl}${path}`, request, timeoutMs, this.insecureTls);
9841
+ if (maxJsonBytes !== undefined) {
9842
+ const data = await boundedResponseJson(res, maxJsonBytes, responseTimeoutMs);
9843
+ return data === null ? responseReadFailure(res.status) : { ok: res.ok, status: res.status, data };
9844
+ }
9838
9845
  const data = await res.json().catch(() => null);
9839
9846
  return { ok: res.ok, status: res.status, data };
9840
9847
  } catch (error) {
@@ -10547,6 +10554,78 @@ function parseApplicationActivationHistory(value) {
10547
10554
  }
10548
10555
  return structuredClone(value);
10549
10556
  }
10557
+ // node_modules/@supacloud/delivery/src/application-preview.ts
10558
+ var phaseStatus = Union([
10559
+ Literal("pending"),
10560
+ Literal("ready"),
10561
+ Literal("failed"),
10562
+ Literal("cleaned")
10563
+ ]);
10564
+ var closed3 = { additionalProperties: false };
10565
+ var ApplicationPreviewReceiptSchema = _Object_({
10566
+ schema: Literal("supacloud.application-preview.v1"),
10567
+ preview_id: String2({ pattern: "^[a-f0-9-]{8,64}$" }),
10568
+ project_ref: String2({ pattern: "^[a-z0-9-]{1,20}$" }),
10569
+ application_id: ApplicationIdSchema,
10570
+ environment_id: ApplicationIdSchema,
10571
+ release_id: ApplicationReleaseIdSchema,
10572
+ expires_at: Optional(Union([String2({
10573
+ pattern: "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$",
10574
+ maxLength: 24
10575
+ }), Null()])),
10576
+ status: Union([
10577
+ Literal("planned"),
10578
+ Literal("provisioning"),
10579
+ Literal("ready"),
10580
+ Literal("failed"),
10581
+ Literal("cleaned")
10582
+ ]),
10583
+ resources: _Object_({
10584
+ build_artifact: _Object_({ status: phaseStatus, release_id: ApplicationReleaseIdSchema }, closed3),
10585
+ database_branch: _Object_({
10586
+ status: phaseStatus,
10587
+ branch_ref: String2({ pattern: "^[A-Za-z0-9_-]{1,20}$" }),
10588
+ data_mode: Union([Literal("schema_only"), Literal("full_clone")])
10589
+ }, closed3),
10590
+ queue_namespace: _Object_({
10591
+ status: phaseStatus,
10592
+ namespace: String2({ minLength: 1, maxLength: 128 })
10593
+ }, closed3),
10594
+ storage_namespace: _Object_({
10595
+ status: phaseStatus,
10596
+ namespace: String2({ minLength: 1, maxLength: 128 })
10597
+ }, closed3),
10598
+ test_secret: _Object_({
10599
+ status: phaseStatus,
10600
+ name: String2({ minLength: 1, maxLength: 128 }),
10601
+ value_issued: Literal(false)
10602
+ }, closed3),
10603
+ configuration_revision: _Object_({
10604
+ status: phaseStatus,
10605
+ configuration_id: Union([ApplicationConfigurationIdSchema, Null()])
10606
+ }, closed3),
10607
+ application_activation: _Object_({
10608
+ status: phaseStatus,
10609
+ activation_id: Union([ApplicationActivationIdSchema, Null()])
10610
+ }, closed3),
10611
+ smoke_test: _Object_({
10612
+ status: phaseStatus,
10613
+ checks: _Array_(String2({ minLength: 1, maxLength: 64 }), { maxItems: 32 }),
10614
+ passed: _Array_(String2({ minLength: 1, maxLength: 64 }), { maxItems: 32 }),
10615
+ failed: _Array_(String2({ minLength: 1, maxLength: 64 }), { maxItems: 32 })
10616
+ }, closed3)
10617
+ }, closed3),
10618
+ cleanup: _Object_({
10619
+ required: Boolean2(),
10620
+ completed: Boolean2(),
10621
+ error: Union([String2({ minLength: 1, maxLength: 128 }), Null()])
10622
+ }, closed3)
10623
+ }, closed3);
10624
+ function applicationPreviewBranchRef(previewId) {
10625
+ if (!/^[a-f0-9-]{8,64}$/.test(previewId))
10626
+ throw new Error("Invalid preview ID");
10627
+ return `pv${previewId.replace(/-/g, "").slice(0, 18)}`;
10628
+ }
10550
10629
  // node_modules/@supacloud/delivery/src/application-release-transfer.ts
10551
10630
  var projectRef = String2({ pattern: "^[A-Za-z0-9_-]{1,20}$" });
10552
10631
  var source = _Object_({
@@ -10594,7 +10673,7 @@ function parseApplicationReleaseTransferResult(candidate) {
10594
10673
  return candidate;
10595
10674
  }
10596
10675
  // node_modules/@supacloud/delivery/src/deployment-evidence.ts
10597
- var closed3 = { additionalProperties: false };
10676
+ var closed4 = { additionalProperties: false };
10598
10677
  var sha256 = String2({ pattern: "^[a-f0-9]{64}$" });
10599
10678
  var isoDate = String2({ minLength: 20, maxLength: 40 });
10600
10679
  var status = Union([
@@ -10621,19 +10700,19 @@ var DatabaseProviderSchema = _Object_({
10621
10700
  Literal("not-proven"),
10622
10701
  Literal("failed")
10623
10702
  ])
10624
- }, closed3),
10703
+ }, closed4),
10625
10704
  backup: _Object_({
10626
10705
  status,
10627
10706
  latest_success_at: Union([isoDate, Null()]),
10628
10707
  freshness_seconds: Union([Integer({ minimum: 0 }), Null()])
10629
- }, closed3),
10708
+ }, closed4),
10630
10709
  recovery: _Object_({
10631
10710
  status,
10632
10711
  drill_id: Union([String2({ minLength: 1, maxLength: 128 }), Null()]),
10633
10712
  rpo_seconds: Union([Integer({ minimum: 0 }), Null()]),
10634
10713
  rto_seconds: Union([Integer({ minimum: 0 }), Null()])
10635
- }, closed3)
10636
- }, closed3);
10714
+ }, closed4)
10715
+ }, closed4);
10637
10716
  var componentName = Union([
10638
10717
  Literal("management-api"),
10639
10718
  Literal("web-console"),
@@ -10651,7 +10730,7 @@ var DeploymentComponentEvidenceSchema = _Object_({
10651
10730
  status,
10652
10731
  health_check: Union([String2({ minLength: 1, maxLength: 256 }), Null()]),
10653
10732
  checked_at: Union([isoDate, Null()])
10654
- }, closed3);
10733
+ }, closed4);
10655
10734
  var DeploymentEvidenceSchema = _Object_({
10656
10735
  schema: Literal(DEPLOYMENT_EVIDENCE_SCHEMA),
10657
10736
  status: evidenceStatus,
@@ -10660,33 +10739,33 @@ var DeploymentEvidenceSchema = _Object_({
10660
10739
  project_ref: String2({ pattern: "^[a-z0-9-]{1,20}$" }),
10661
10740
  application_id: ApplicationIdSchema,
10662
10741
  environment_id: ApplicationIdSchema
10663
- }, closed3),
10742
+ }, closed4),
10664
10743
  source: _Object_({
10665
10744
  commit_sha: Union([String2({ pattern: "^[0-9a-f]{7,64}$" }), Null()]),
10666
10745
  manifest_sha256: sha256,
10667
10746
  contract_schema: Union([String2({ minLength: 1, maxLength: 128 }), Null()]),
10668
10747
  environment_binding_version: Union([sha256, Null()])
10669
- }, closed3),
10748
+ }, closed4),
10670
10749
  database: DatabaseProviderSchema,
10671
10750
  components: _Array_(DeploymentComponentEvidenceSchema, { minItems: 1, maxItems: 32 }),
10672
10751
  activation: _Object_({
10673
10752
  release_id: ApplicationReleaseIdSchema,
10674
10753
  configuration_id: ApplicationConfigurationIdSchema,
10675
10754
  activation_id: ApplicationConfigurationIdSchema
10676
- }, closed3),
10755
+ }, closed4),
10677
10756
  health: _Object_({
10678
10757
  status,
10679
10758
  checked_at: Union([isoDate, Null()]),
10680
10759
  authenticated_smoke: status
10681
- }, closed3),
10760
+ }, closed4),
10682
10761
  rollback: _Object_({
10683
10762
  release_id: Union([ApplicationReleaseIdSchema, Null()]),
10684
10763
  configuration_id: Union([ApplicationConfigurationIdSchema, Null()]),
10685
10764
  status: Union([Literal("ready"), Literal("not-ready"), Literal("unknown")]),
10686
10765
  result: Union([status, Null()])
10687
- }, closed3),
10766
+ }, closed4),
10688
10767
  notes: _Array_(String2({ minLength: 1, maxLength: 512 }), { maxItems: 32 })
10689
- }, closed3);
10768
+ }, closed4);
10690
10769
  function isIsoDate(value) {
10691
10770
  return Number.isFinite(Date.parse(value)) && new Date(value).toISOString() === value;
10692
10771
  }
@@ -10719,7 +10798,7 @@ function parseDeploymentEvidence(value) {
10719
10798
  return structuredClone(value);
10720
10799
  }
10721
10800
  // node_modules/@supacloud/delivery/src/application-promotion.ts
10722
- var closed4 = { additionalProperties: false };
10801
+ var closed5 = { additionalProperties: false };
10723
10802
  var projectRef2 = String2({ pattern: "^[a-z0-9-]{1,20}$" });
10724
10803
  var sha2562 = ApplicationReleaseIdSchema;
10725
10804
  var nullableActivation = Union([ApplicationActivationIdSchema, Null()]);
@@ -10756,7 +10835,7 @@ var ApplicationPromotionPlanSchema = _Object_({
10756
10835
  environment_id: ApplicationIdSchema,
10757
10836
  release_id: sha2562,
10758
10837
  ...observation
10759
- }, closed4),
10838
+ }, closed5),
10760
10839
  target: _Object_({
10761
10840
  candidate_release_id: sha2562,
10762
10841
  current_release_id: Union([sha2562, Null()]),
@@ -10764,18 +10843,18 @@ var ApplicationPromotionPlanSchema = _Object_({
10764
10843
  configuration_id: Union([ApplicationConfigurationIdSchema, Null()]),
10765
10844
  configuration: Union([ApplicationConfigurationViewSchema, Null()]),
10766
10845
  ...observation
10767
- }, closed4),
10846
+ }, closed5),
10768
10847
  migrations: _Object_({
10769
10848
  ledger_digest: sha2562,
10770
10849
  ledger_compatible: Boolean2(),
10771
10850
  project_migrations_applied: Boolean2(),
10772
10851
  pending_versions: _Array_(String2({ pattern: "^\\d{1,20}$" }), { maxItems: 4096, uniqueItems: true }),
10773
10852
  operator_provisioning_required: Boolean2()
10774
- }, closed4),
10853
+ }, closed5),
10775
10854
  backup: _Object_({
10776
10855
  required: Boolean2(),
10777
10856
  confirmed: Literal(false)
10778
- }, closed4),
10857
+ }, closed5),
10779
10858
  action: Union([Literal("promote"), Literal("no-op"), Literal("blocked")]),
10780
10859
  blockers: _Array_(Enum([...blocker]), {
10781
10860
  maxItems: blocker.length,
@@ -10784,7 +10863,7 @@ var ApplicationPromotionPlanSchema = _Object_({
10784
10863
  steps: _Array_(String2({ minLength: 1, maxLength: 64 }), { maxItems: 8, uniqueItems: true }),
10785
10864
  execution_performed: Literal(false),
10786
10865
  data_recovery: Literal("separate-required")
10787
- }, closed4);
10866
+ }, closed5);
10788
10867
  function applicationPromotionPlanDigest(value) {
10789
10868
  return digest(canonical(value));
10790
10869
  }
@@ -16970,7 +17049,7 @@ async function fetchMutationStatus(http, ref, mutationId) {
16970
17049
  }
16971
17050
 
16972
17051
  // src/shared/tools/application-workflow-schemas.ts
16973
- var closed5 = { additionalProperties: false };
17052
+ var closed6 = { additionalProperties: false };
16974
17053
  var ref5 = String2({ pattern: "^[A-Za-z0-9_-]{1,20}$" });
16975
17054
  var uuid = ApplicationActivationIdSchema2;
16976
17055
  var nullableUuid = Union([uuid, Null()]);
@@ -16984,7 +17063,7 @@ var ApplicationPromotionResultSchema = _Object_({
16984
17063
  plan_sha256: ApplicationReleaseIdSchema2,
16985
17064
  action: Literal("promote"),
16986
17065
  replayed: Boolean2()
16987
- }, closed5);
17066
+ }, closed6);
16988
17067
  var ApplicationPromotionStatusSchema = _Object_({
16989
17068
  ...scope2,
16990
17069
  mutation: Unknown(),
@@ -17003,13 +17082,13 @@ var ApplicationPromotionStatusSchema = _Object_({
17003
17082
  configuration_id: Union([ApplicationConfigurationIdSchema2, Null()]),
17004
17083
  backup_id: Union([String2({ pattern: "^logical-full_[a-z0-9-]{1,20}_[a-f0-9]{32}$" }), Null()]),
17005
17084
  data_recovery: Literal("separate-required")
17006
- }, closed5)
17007
- }, closed5);
17085
+ }, closed6)
17086
+ }, closed6);
17008
17087
  var phase = Union([Literal("pending"), Literal("ready"), Literal("failed"), Literal("cleaned")]);
17009
17088
  var previewId = String2({ pattern: "^[a-f0-9-]{8,64}$" });
17010
17089
  var name = String2({ minLength: 1, maxLength: 256 });
17011
17090
  var checks = _Array_(String2({ minLength: 1, maxLength: 128 }), { maxItems: 64, uniqueItems: true });
17012
- var ApplicationPreviewReceiptSchema = _Object_({
17091
+ var ApplicationPreviewReceiptSchema2 = _Object_({
17013
17092
  schema: Literal("supacloud.application-preview.v1"),
17014
17093
  ...scope2,
17015
17094
  preview_id: previewId,
@@ -17023,35 +17102,35 @@ var ApplicationPreviewReceiptSchema = _Object_({
17023
17102
  Literal("cleaned")
17024
17103
  ]),
17025
17104
  resources: _Object_({
17026
- build_artifact: _Object_({ status: phase, release_id: ApplicationReleaseIdSchema2 }, closed5),
17105
+ build_artifact: _Object_({ status: phase, release_id: ApplicationReleaseIdSchema2 }, closed6),
17027
17106
  database_branch: _Object_({
17028
17107
  status: phase,
17029
17108
  branch_ref: ref5,
17030
17109
  data_mode: Union([Literal("schema_only"), Literal("full_clone")])
17031
- }, closed5),
17032
- queue_namespace: _Object_({ status: phase, namespace: name }, closed5),
17033
- storage_namespace: _Object_({ status: phase, namespace: name }, closed5),
17034
- test_secret: _Object_({ status: phase, name, value_issued: Literal(false) }, closed5),
17035
- configuration_revision: _Object_({ status: phase, configuration_id: Union([ApplicationConfigurationIdSchema2, Null()]) }, closed5),
17036
- application_activation: _Object_({ status: phase, activation_id: nullableUuid }, closed5),
17037
- smoke_test: _Object_({ status: phase, checks, passed: checks, failed: checks }, closed5)
17038
- }, closed5),
17110
+ }, closed6),
17111
+ queue_namespace: _Object_({ status: phase, namespace: name }, closed6),
17112
+ storage_namespace: _Object_({ status: phase, namespace: name }, closed6),
17113
+ test_secret: _Object_({ status: phase, name, value_issued: Literal(false) }, closed6),
17114
+ configuration_revision: _Object_({ status: phase, configuration_id: Union([ApplicationConfigurationIdSchema2, Null()]) }, closed6),
17115
+ application_activation: _Object_({ status: phase, activation_id: nullableUuid }, closed6),
17116
+ smoke_test: _Object_({ status: phase, checks, passed: checks, failed: checks }, closed6)
17117
+ }, closed6),
17039
17118
  cleanup: _Object_({
17040
17119
  required: Boolean2(),
17041
17120
  completed: Boolean2(),
17042
17121
  error: Union([String2({ pattern: "^[A-Z][A-Z0-9_]{0,63}$" }), Null()])
17043
- }, closed5),
17122
+ }, closed6),
17044
17123
  branch_name: Optional(String2({ minLength: 1, maxLength: 80 })),
17045
17124
  queue_name: Optional(name),
17046
17125
  test_secret_name: Optional(name),
17047
17126
  source_configuration_id: Optional(Union([ApplicationConfigurationIdSchema2, Null()])),
17048
17127
  created_at: Optional(timestamp2),
17049
17128
  updated_at: Optional(timestamp2)
17050
- }, closed5);
17129
+ }, closed6);
17051
17130
  var previewListSchema = _Object_({
17052
17131
  ...scope2,
17053
- previews: _Array_(ApplicationPreviewReceiptSchema, { maxItems: 1000 })
17054
- }, closed5);
17132
+ previews: _Array_(ApplicationPreviewReceiptSchema2, { maxItems: 1000 })
17133
+ }, closed6);
17055
17134
  function assertScope(value, identity) {
17056
17135
  if (value.project_ref !== identity.project_ref || value.application_id !== identity.application_id || value.environment_id !== identity.environment_id)
17057
17136
  throw new Error("Application workflow scope mismatch");
@@ -17078,7 +17157,7 @@ function parsePromotionStatus(value, identity) {
17078
17157
  return structuredClone({ ...value, mutation });
17079
17158
  }
17080
17159
  function parsePreviewReceipt(value, identity) {
17081
- if (!Check2(ApplicationPreviewReceiptSchema, value))
17160
+ if (!Check2(ApplicationPreviewReceiptSchema2, value))
17082
17161
  throw new Error("Invalid preview receipt");
17083
17162
  assertScope(value, identity);
17084
17163
  if (identity.preview_id !== undefined && value.preview_id !== identity.preview_id || identity.release_id !== undefined && value.release_id !== identity.release_id || identity.branch_ref !== undefined && value.resources.database_branch.branch_ref !== identity.branch_ref || identity.data_mode !== undefined && value.resources.database_branch.data_mode !== identity.data_mode || identity.configuration_id !== undefined && value.source_configuration_id !== identity.configuration_id || value.resources.build_artifact.release_id !== value.release_id)
@@ -17158,11 +17237,13 @@ async function applicationReleaseTransfer(http, input, project) {
17158
17237
  }
17159
17238
 
17160
17239
  // src/shared/tools/application-preview-tools.ts
17240
+ import { randomUUID } from "node:crypto";
17161
17241
  var APPLICATION_PREVIEW_ACTIONS = [
17162
17242
  "get_preview_plan",
17163
17243
  "create_preview",
17164
17244
  "list_previews",
17165
17245
  "get_preview",
17246
+ "reconcile_preview",
17166
17247
  "cleanup_preview"
17167
17248
  ];
17168
17249
  var previewIdSchema = String2({ pattern: "^[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89ab][a-f0-9]{3}-[a-f0-9]{12}$" });
@@ -17174,7 +17255,7 @@ var timestampSchema = String2({
17174
17255
  maxLength: 24
17175
17256
  });
17176
17257
  var APPLICATION_PREVIEW_FIELDS = {
17177
- preview_id: optional(previewIdSchema, "[get_preview/cleanup_preview] Preview receipt ID"),
17258
+ preview_id: optional(previewIdSchema, "[get_preview/reconcile_preview/cleanup_preview] Preview receipt ID; create/plan may pin a stable ID"),
17178
17259
  branch_ref: optional(branchRefSchema, "[get_preview_plan] Proposed branch ref; create assigns its own"),
17179
17260
  branch_name: optional(String2({ minLength: 1, maxLength: 80 }), "[create_preview] Branch display name"),
17180
17261
  data_mode: optional(stringEnum(["schema_only", "full_clone"]), "[get_preview_plan/create_preview] Default schema_only; full_clone copies rows"),
@@ -17194,7 +17275,7 @@ var receiptSchema = _Object_({
17194
17275
  application_id: ApplicationIdSchema2,
17195
17276
  environment_id: ApplicationIdSchema2,
17196
17277
  release_id: ApplicationReleaseIdSchema2,
17197
- expires_at: Union([timestampSchema, Null()]),
17278
+ expires_at: Optional(Union([timestampSchema, Null()])),
17198
17279
  status: stringEnum(["planned", "provisioning", "ready", "failed", "cleaned"]),
17199
17280
  resources: _Object_({
17200
17281
  build_artifact: _Object_({ status: phase2, release_id: ApplicationReleaseIdSchema2 }, strict),
@@ -17236,10 +17317,11 @@ var mandatoryChecks = [
17236
17317
  "tenant_runtime"
17237
17318
  ];
17238
17319
  var actionFields = {
17239
- get_preview_plan: ["release_id", "branch_ref", "data_mode", "configuration_id", "ttl_seconds"],
17240
- create_preview: ["release_id", "configuration_id", "data_mode", "branch_name", "ttl_seconds", "wait", "timeout_seconds"],
17320
+ get_preview_plan: ["release_id", "preview_id", "branch_ref", "data_mode", "configuration_id", "ttl_seconds"],
17321
+ create_preview: ["release_id", "preview_id", "configuration_id", "data_mode", "branch_name", "ttl_seconds", "wait", "timeout_seconds"],
17241
17322
  list_previews: [],
17242
17323
  get_preview: ["preview_id", "wait", "timeout_seconds"],
17324
+ reconcile_preview: ["preview_id"],
17243
17325
  cleanup_preview: ["preview_id"]
17244
17326
  };
17245
17327
  function timestamp3(value) {
@@ -17249,7 +17331,7 @@ function receipt(value, identity) {
17249
17331
  if (!Check2(receiptSchema, value) || value.project_ref !== identity.ref || value.application_id !== identity.id || value.environment_id !== identity.environment || identity.previewId && value.preview_id !== identity.previewId || value.resources.build_artifact.release_id !== value.release_id || value.resources.storage_namespace.namespace !== value.resources.database_branch.branch_ref) {
17250
17332
  throw new Error("Invalid preview receipt");
17251
17333
  }
17252
- if (value.expires_at !== null && !timestamp3(value.expires_at) || value.created_at !== undefined && !timestamp3(value.created_at) || value.updated_at !== undefined && !timestamp3(value.updated_at) || value.expires_at !== null && value.created_at !== undefined && !Check2(ttlSecondsSchema, (Date.parse(value.expires_at) - Date.parse(value.created_at)) / 1000)) {
17334
+ if (value.expires_at !== undefined && value.expires_at !== null && !timestamp3(value.expires_at) || value.created_at !== undefined && !timestamp3(value.created_at) || value.updated_at !== undefined && !timestamp3(value.updated_at) || value.expires_at !== undefined && value.expires_at !== null && value.created_at !== undefined && !Check2(ttlSecondsSchema, (Date.parse(value.expires_at) - Date.parse(value.created_at)) / 1000)) {
17253
17335
  throw new Error("Invalid preview expiry");
17254
17336
  }
17255
17337
  if (value.status === "ready") {
@@ -17385,8 +17467,8 @@ async function applicationPreviewAction(http, args, project) {
17385
17467
  const identity = { project_ref: ref, application_id: id, environment_id: environment };
17386
17468
  const applicationPath = `/v1/projects/${project}/applications/${encodeURIComponent(id)}`;
17387
17469
  const path = `${applicationPath}/environments/${encodeURIComponent(environment)}`;
17388
- const previewId = action === "get_preview" || action === "cleanup_preview" ? required5(args, "preview_id") : undefined;
17389
- const mutation = action === "create_preview" || action === "cleanup_preview";
17470
+ const previewId = action === "get_preview" || action === "reconcile_preview" || action === "cleanup_preview" ? required5(args, "preview_id") : action === "create_preview" ? typeof args["preview_id"] === "string" ? required5(args, "preview_id") : randomUUID() : action === "get_preview_plan" && typeof args["preview_id"] === "string" ? required5(args, "preview_id") : undefined;
17471
+ const mutation = action === "create_preview" || action === "reconcile_preview" || action === "cleanup_preview";
17390
17472
  const requestBudget = startedAt === undefined ? 120000 : Math.min(120000, timeoutSeconds * 1000);
17391
17473
  const options = {
17392
17474
  timeoutMs: requestBudget,
@@ -17403,7 +17485,10 @@ async function applicationPreviewAction(http, args, project) {
17403
17485
  if (!Check2(ApplicationReleaseIdSchema2, releaseId))
17404
17486
  throw new Error("Invalid release ID");
17405
17487
  if (action === "get_preview_plan") {
17406
- const query = new URLSearchParams({ release_id: releaseId, branch_ref: required5(args, "branch_ref") });
17488
+ const branchRef = typeof args["branch_ref"] === "string" ? required5(args, "branch_ref") : previewId === undefined ? required5(args, "branch_ref") : applicationPreviewBranchRef(previewId);
17489
+ const query = new URLSearchParams({ release_id: releaseId, branch_ref: branchRef });
17490
+ if (previewId !== undefined)
17491
+ query.set("preview_id", previewId);
17407
17492
  if (typeof args["data_mode"] === "string")
17408
17493
  query.set("data_mode", args["data_mode"]);
17409
17494
  if (typeof args["configuration_id"] === "string")
@@ -17412,17 +17497,19 @@ async function applicationPreviewAction(http, args, project) {
17412
17497
  query.set("ttl_seconds", String(args["ttl_seconds"]));
17413
17498
  result = await http.get(`${path}/preview-plan?${query}`, options);
17414
17499
  } else {
17415
- const configurationId = required5(args, "configuration_id");
17416
- if (!Check2(ApplicationConfigurationIdSchema2, configurationId))
17500
+ const configurationId = args["configuration_id"];
17501
+ if (configurationId !== undefined && !Check2(ApplicationConfigurationIdSchema2, configurationId)) {
17417
17502
  throw new Error("Invalid configuration ID");
17503
+ }
17418
17504
  const source = await sourceManifest(http, applicationPath, ref, id, releaseId);
17419
17505
  if (!source.manifest)
17420
17506
  return releaseControlFailure(operation, source.result.ok ? "INVALID_RESPONSE" : "HTTP_ERROR", source.result.status, { ...identity, release_id: releaseId, configuration_id: configurationId });
17421
17507
  sourceHash = source.manifest;
17422
17508
  result = await http.post(`${path}/previews`, {
17509
+ preview_id: previewId,
17423
17510
  release_id: releaseId,
17424
- configuration_id: configurationId,
17425
17511
  data_mode: args["data_mode"] ?? "schema_only",
17512
+ ...configurationId === undefined ? {} : { configuration_id: configurationId },
17426
17513
  ...args["branch_name"] === undefined ? {} : { branch_name: args["branch_name"] },
17427
17514
  ...args["ttl_seconds"] === undefined ? {} : { ttl_seconds: args["ttl_seconds"] }
17428
17515
  }, options);
@@ -17432,7 +17519,7 @@ async function applicationPreviewAction(http, args, project) {
17432
17519
  } else if (previewId) {
17433
17520
  if (!Check2(previewIdSchema, previewId))
17434
17521
  throw new Error("Invalid preview ID");
17435
- result = action === "cleanup_preview" ? await http.deleteReleaseMutation(`${path}/previews/${previewId}`) : await http.get(`${path}/previews/${previewId}`, options);
17522
+ result = action === "cleanup_preview" ? await http.deleteReleaseMutation(`${path}/previews/${previewId}`) : action === "reconcile_preview" ? await http.post(`${path}/previews/${previewId}/reconcile`, {}, options) : await http.get(`${path}/previews/${previewId}`, options);
17436
17523
  } else {
17437
17524
  throw new Error("Unknown preview action");
17438
17525
  }
@@ -17440,7 +17527,13 @@ async function applicationPreviewAction(http, args, project) {
17440
17527
  ...identity,
17441
17528
  ...previewId ? { preview_id: previewId } : {},
17442
17529
  ...releaseId ? { source_release_id: releaseId } : {},
17443
- reconciliation: previewId ? { action: "get_preview", ref, id, environment_id: environment, preview_id: previewId } : { action: "list_previews", ref, id, environment_id: environment }
17530
+ reconciliation: previewId ? {
17531
+ action: action === "reconcile_preview" ? "reconcile_preview" : "get_preview",
17532
+ ref,
17533
+ id,
17534
+ environment_id: environment,
17535
+ preview_id: previewId
17536
+ } : { action: "list_previews", ref, id, environment_id: environment }
17444
17537
  };
17445
17538
  if (!result.ok)
17446
17539
  return mutation ? releaseControlMutationFailure(operation, result, state) : releaseControlFailure(operation, "HTTP_ERROR", result.status, state);
@@ -17464,24 +17557,29 @@ async function applicationPreviewAction(http, args, project) {
17464
17557
  ...previewId === undefined ? {} : { previewId }
17465
17558
  });
17466
17559
  if (action === "get_preview_plan") {
17467
- if (preview.status !== "planned" || preview.release_id !== releaseId || preview.resources.database_branch.branch_ref !== args["branch_ref"] || preview.resources.database_branch.data_mode !== (args["data_mode"] ?? "schema_only") || (args["ttl_seconds"] === undefined ? preview.expires_at !== null : preview.expires_at === null))
17560
+ const expectedBranchRef = typeof args["branch_ref"] === "string" ? args["branch_ref"] : previewId === undefined ? undefined : applicationPreviewBranchRef(previewId);
17561
+ if (preview.status !== "planned" || previewId === undefined && preview.release_id !== releaseId || expectedBranchRef === undefined || preview.resources.database_branch.branch_ref !== expectedBranchRef || preview.resources.database_branch.data_mode !== (args["data_mode"] ?? "schema_only") || (args["ttl_seconds"] === undefined ? preview.expires_at !== null && preview.expires_at !== undefined : preview.expires_at === null || preview.expires_at === undefined))
17468
17562
  throw new Error;
17469
17563
  } else {
17470
- if (preview.status === "planned" || preview.resources.database_branch.branch_ref !== `pv${preview.preview_id.replaceAll("-", "").slice(0, 18)}`)
17564
+ if (preview.status === "planned" || preview.resources.database_branch.branch_ref !== applicationPreviewBranchRef(preview.preview_id))
17471
17565
  throw new Error;
17472
- if (action === "create_preview" && (preview.release_id !== applicationReleaseId(preview.resources.database_branch.branch_ref, id, sourceHash) || preview.resources.database_branch.data_mode !== (args["data_mode"] ?? "schema_only") || !Check2(receiptSchema, result.data) || result.data.source_configuration_id !== args["configuration_id"] || preview.expires_at === null || result.data.created_at === undefined || args["ttl_seconds"] !== undefined && Date.parse(preview.expires_at) - Date.parse(result.data.created_at) !== args["ttl_seconds"] * 1000))
17473
- throw new Error;
17474
- }
17475
- if (preview.status === "failed" || action === "cleanup_preview" && preview.status !== "cleaned") {
17476
- return releaseControlFailure(operation, "MUTATION_NOT_SUCCEEDED", result.status, {
17477
- ...identity,
17478
- preview_id: preview.preview_id,
17479
- preview
17480
- });
17566
+ if (action === "create_preview") {
17567
+ const expiresAt = preview.expires_at;
17568
+ const createdAt = typeof result.data === "object" && result.data !== null && "created_at" in result.data && typeof result.data.created_at === "string" ? result.data.created_at : undefined;
17569
+ if (preview.release_id !== applicationReleaseId(preview.resources.database_branch.branch_ref, id, sourceHash) || preview.resources.database_branch.data_mode !== (args["data_mode"] ?? "schema_only") || !Check2(receiptSchema, result.data) || args["configuration_id"] !== undefined && result.data.source_configuration_id !== args["configuration_id"] || expiresAt === null || expiresAt === undefined || args["ttl_seconds"] !== undefined && (createdAt === undefined || Date.parse(expiresAt) - Date.parse(createdAt) !== args["ttl_seconds"] * 1000))
17570
+ throw new Error;
17571
+ }
17572
+ if (preview.status === "failed" || action === "cleanup_preview" && preview.status !== "cleaned") {
17573
+ return releaseControlFailure(operation, "MUTATION_NOT_SUCCEEDED", result.status, {
17574
+ ...identity,
17575
+ preview_id: preview.preview_id,
17576
+ preview
17577
+ });
17578
+ }
17481
17579
  }
17482
17580
  if (timeoutSeconds !== undefined)
17483
17581
  return await waitForPreview(http, path, operation, identity, preview, timeoutSeconds, startedAt);
17484
- return releaseControlSuccess(operation, { ...identity, preview });
17582
+ return releaseControlSuccess(operation, { ...identity, preview_id: preview.preview_id, preview });
17485
17583
  } catch {
17486
17584
  return releaseControlFailure(operation, mutation ? "OUTCOME_UNKNOWN" : "INVALID_RESPONSE", result.status, state);
17487
17585
  }
@@ -24108,7 +24206,7 @@ async function createVerificationPlan(root, graph, target, sourceRoot = root) {
24108
24206
  }
24109
24207
 
24110
24208
  // src/shared/tools/app-scaffold-writes.ts
24111
- import { randomUUID } from "node:crypto";
24209
+ import { randomUUID as randomUUID2 } from "node:crypto";
24112
24210
  import { link, lstat as lstat3, mkdir as mkdir4, open as open3, readFile as readFile3, realpath as realpath4, rename as rename2, rmdir, unlink } from "node:fs/promises";
24113
24211
  import { dirname as dirname7, isAbsolute as isAbsolute5, join as join12, relative as relative6, resolve as resolve16, sep as sep4, win32 } from "node:path";
24114
24212
 
@@ -24229,7 +24327,7 @@ async function applyScaffoldWrites(plan) {
24229
24327
  if (!sameFile(write.before, await snapshot(plan.root, write.path))) {
24230
24328
  throw new ScaffoldError("SCAFFOLD_CHANGED", `Scaffold target changed during generation: ${write.path}`);
24231
24329
  }
24232
- const pending = `${target}.supacloud-${randomUUID()}`;
24330
+ const pending = `${target}.supacloud-${randomUUID2()}`;
24233
24331
  const file = await open3(pending, "wx", write.before?.mode);
24234
24332
  temporary.push(pending);
24235
24333
  let after;
@@ -24264,7 +24362,7 @@ async function applyScaffoldWrites(plan) {
24264
24362
  if (!write.before)
24265
24363
  await unlink(target);
24266
24364
  else {
24267
- const pending = `${target}.supacloud-${randomUUID()}`;
24365
+ const pending = `${target}.supacloud-${randomUUID2()}`;
24268
24366
  const file = await open3(pending, "wx", write.before.mode);
24269
24367
  temporary.push(pending);
24270
24368
  try {
@@ -24317,17 +24415,18 @@ var REMOTE_APP_ACTIONS = {
24317
24415
  retire: "retire_activation",
24318
24416
  logs: "logs",
24319
24417
  preview: "create_preview",
24320
- previews: "list_previews"
24418
+ previews: "list_previews",
24419
+ "preview-reconcile": "reconcile_preview"
24321
24420
  };
24322
24421
  var REMOTE_APP_DESCRIPTIONS = {
24323
- ref: "[upload/configure/transfer-plan/transfer/promote-plan/diff/promote/promote-status/promote-reconcile/preview-plan/preview/previews/preview-list/preview-create/preview-status/preview-cleanup/deploy/deploy-plan/status/rollback/rollback-plan/history/reconcile/retire] Project ref (defaults to context)",
24324
- id: "[upload/configure/transfer-plan/transfer/promote-plan/diff/promote/promote-status/promote-reconcile/preview-plan/preview/previews/preview-list/preview-create/preview-status/preview-cleanup/deploy/deploy-plan/status/rollback/rollback-plan/history/reconcile/retire] Application ID",
24325
- environment_id: "[configure/promote-plan/diff/promote/promote-status/promote-reconcile/preview-plan/preview/previews/preview-list/preview-create/preview-status/preview-cleanup/deploy/deploy-plan/status/rollback/rollback-plan/history/reconcile/retire] Target environment ID",
24326
- configuration_id: "[promote-plan/diff/promote/preview-plan/preview/preview-create/deploy/deploy-plan/rollback] Immutable target configuration revision",
24422
+ ref: "[release/upload/configure/transfer-plan/transfer/promote-plan/diff/promote/promote-status/promote-reconcile/preview-plan/preview/previews/preview-list/preview-create/preview-status/preview-reconcile/preview-cleanup/deploy/deploy-plan/status/rollback/rollback-plan/history/reconcile/retire] Project ref (defaults to context)",
24423
+ id: "[release/upload/configure/transfer-plan/transfer/promote-plan/diff/promote/promote-status/promote-reconcile/preview-plan/preview/previews/preview-list/preview-create/preview-status/preview-reconcile/preview-cleanup/deploy/deploy-plan/status/rollback/rollback-plan/history/reconcile/retire] Application ID",
24424
+ environment_id: "[release/configure/promote-plan/diff/promote/promote-status/promote-reconcile/preview-plan/preview/previews/preview-list/preview-create/preview-status/preview-reconcile/preview-cleanup/deploy/deploy-plan/status/rollback/rollback-plan/history/reconcile/retire] Target environment ID",
24425
+ configuration_id: "[release/promote-plan/diff/promote/preview-plan/preview/preview-create/deploy/deploy-plan/rollback] Immutable target configuration revision",
24327
24426
  activation_id: "[deploy/rollback/reconcile/retire] Required explicit activation ID",
24328
24427
  expected_activation_id: "[deploy/rollback] Required current activation ID, or absent for first activation",
24329
- configuration_path: "[configure] Configuration write JSON including revision and expected revision",
24330
- manifest_path: "[upload] Local delivery.manifest.json",
24428
+ configuration_path: "[release/configure] Configuration write JSON including revision and expected revision",
24429
+ manifest_path: "[release/upload] Local delivery.manifest.json",
24331
24430
  release_id: "[preview-plan/preview/preview-create/deploy/deploy-plan/diff/rollback/reconcile] Required immutable application release ID",
24332
24431
  source_ref: "[transfer-plan/transfer/promote-plan/diff/promote] Source project ref",
24333
24432
  source_release_id: "[transfer-plan/transfer/promote-plan/diff/promote] Source immutable release ID",
@@ -24340,7 +24439,7 @@ var REMOTE_APP_DESCRIPTIONS = {
24340
24439
  ttl_seconds: "[preview-plan/preview/preview-create] Lifetime from 300 to 604800 seconds; creation defaults to the platform TTL",
24341
24440
  wait: "[preview/preview-create/preview-status] Wait for verified readiness of the selected preview",
24342
24441
  timeout_seconds: "[preview/preview-create/preview-status] Observation budget with --wait, from 1 to 3600 seconds (default 300)",
24343
- preview_id: "[preview-status/preview-cleanup] Preview ID",
24442
+ preview_id: "[preview-status/preview-reconcile/preview-cleanup] Preview ID",
24344
24443
  cursor: "[history] Returned page cursor",
24345
24444
  limit: "[history] Page size, default 20 (1-100)"
24346
24445
  };
@@ -25241,6 +25340,177 @@ async function runDelivery(args) {
25241
25340
  const result = await buildDeliveryProject(options, loaded.delivery);
25242
25341
  return textResult(JSON.stringify(result, null, 2), !result.ok);
25243
25342
  }
25343
+ function resultObject(result) {
25344
+ try {
25345
+ const value = JSON.parse(result.content[0]?.text ?? "");
25346
+ return value !== null && typeof value === "object" && !Array.isArray(value) ? value : undefined;
25347
+ } catch {
25348
+ return;
25349
+ }
25350
+ }
25351
+ function resultErrorCode(result, fallback) {
25352
+ const payload = resultObject(result);
25353
+ const error = payload?.error;
25354
+ const errorRecord = error !== null && typeof error === "object" && !Array.isArray(error) ? error : undefined;
25355
+ return typeof errorRecord?.code === "string" ? errorRecord.code : fallback;
25356
+ }
25357
+ function releasePhaseFailure(phase, result, completed) {
25358
+ const phaseResult = resultObject(result);
25359
+ const upload = completed.upload !== null && typeof completed.upload === "object" && !Array.isArray(completed.upload) ? completed.upload : undefined;
25360
+ const configure = completed.configure !== null && typeof completed.configure === "object" && !Array.isArray(completed.configure) ? completed.configure : undefined;
25361
+ const releaseId = typeof upload?.release_id === "string" ? upload.release_id : undefined;
25362
+ const configurationId = typeof configure?.configuration_id === "string" ? configure.configuration_id : undefined;
25363
+ const payload = {
25364
+ schema: RELEASE_CONTROL_RESPONSE_SCHEMA,
25365
+ ok: false,
25366
+ operation: "applications.release",
25367
+ phase,
25368
+ phases: completed,
25369
+ error: { code: resultErrorCode(result, phase === "build" ? "BUILD_FAILED" : "PHASE_FAILED") },
25370
+ ...releaseId === undefined ? {} : { release_id: releaseId },
25371
+ ...configurationId === undefined ? {} : { configuration_id: configurationId },
25372
+ ...phaseResult === undefined ? {} : { phase_result: phaseResult }
25373
+ };
25374
+ if (phaseResult?.activation_id !== undefined)
25375
+ payload.activation_id = phaseResult.activation_id;
25376
+ if (phaseResult?.expected_activation_id !== undefined) {
25377
+ payload.expected_activation_id = phaseResult.expected_activation_id;
25378
+ }
25379
+ return textResult(JSON.stringify(payload, null, 2), true);
25380
+ }
25381
+ function releaseField(payload, container, field) {
25382
+ const value = payload?.[container];
25383
+ if (value === null || typeof value !== "object" || Array.isArray(value))
25384
+ return;
25385
+ const record = value;
25386
+ return typeof record[field] === "string" ? record[field] : undefined;
25387
+ }
25388
+ async function runAppRelease(request, options, delegate) {
25389
+ const ref = request.ref ?? options.projectRef;
25390
+ const id = request.id?.trim();
25391
+ const environmentId = request.environment_id?.trim();
25392
+ if (!ref || !id || !environmentId) {
25393
+ throw new Error("app release requires --ref, --id and --environment_id (ref may come from context)");
25394
+ }
25395
+ if (!Check2(ApplicationIdSchema2, id) || !Check2(ApplicationIdSchema2, environmentId)) {
25396
+ throw new Error("app release requires valid --id and --environment_id");
25397
+ }
25398
+ if (request.configuration_id !== undefined && !Check2(ApplicationConfigurationIdSchema2, request.configuration_id)) {
25399
+ throw new Error("app release requires a valid --configuration_id");
25400
+ }
25401
+ if (request.configuration_path !== undefined && request.configuration_id !== undefined) {
25402
+ throw new Error("app release accepts either --configuration_path or --configuration_id, not both");
25403
+ }
25404
+ if (request.configuration_path === undefined && request.configuration_id === undefined) {
25405
+ throw new Error("app release requires --configuration_path or --configuration_id");
25406
+ }
25407
+ if (request.activation_id !== undefined || request.expected_activation_id !== undefined) {
25408
+ throw new Error("app release generates one activation identity; use app deploy for an exact retry");
25409
+ }
25410
+ const root = resolve17(request.root || process.cwd());
25411
+ const completed = {};
25412
+ let manifestPath;
25413
+ let buildReceipt;
25414
+ if (request.skip_build === true) {
25415
+ if (request.manifest_path === undefined) {
25416
+ throw new Error("app release --skip_build requires --manifest_path");
25417
+ }
25418
+ manifestPath = resolve17(root, request.manifest_path);
25419
+ completed.build = { skipped: true, manifest_path: manifestPath };
25420
+ } else {
25421
+ const built = await runDelivery({ ...request, action: "build", root, format: "json" });
25422
+ buildReceipt = resultObject(built);
25423
+ if (built.isError || !buildReceipt?.ok || buildReceipt.manifest === null || buildReceipt.manifest === undefined) {
25424
+ return releasePhaseFailure("build", built, completed);
25425
+ }
25426
+ const loaded = await loadSupacloudConfig(root);
25427
+ const resolved = resolveSupacloudConfig(loaded, root);
25428
+ manifestPath = join13(resolved.outDir, "delivery", "delivery.manifest.json");
25429
+ completed.build = {
25430
+ ok: true,
25431
+ manifest_path: manifestPath,
25432
+ written: Array.isArray(buildReceipt.written) ? buildReceipt.written.length : 0
25433
+ };
25434
+ }
25435
+ const uploadArgs = {
25436
+ action: "upload_release",
25437
+ ref,
25438
+ id,
25439
+ manifest_path: manifestPath
25440
+ };
25441
+ validateToolArguments(APPLICATION_TOOL_SCHEMA, uploadArgs);
25442
+ const uploaded = await delegate(uploadArgs);
25443
+ const uploadReceipt = resultObject(uploaded);
25444
+ if (uploaded.isError || !uploadReceipt?.ok) {
25445
+ return releasePhaseFailure("upload", uploaded, completed);
25446
+ }
25447
+ const releaseId = releaseField(uploadReceipt, "release", "release_id");
25448
+ if (!releaseId)
25449
+ return releasePhaseFailure("upload", releaseControlFailure("applications.upload_release", "INVALID_RESPONSE", null, { project_ref: ref, application_id: id }), completed);
25450
+ completed.upload = { ok: true, release_id: releaseId };
25451
+ let configurationId = request.configuration_id;
25452
+ if (request.configuration_path !== undefined) {
25453
+ const configurationPath = resolve17(root, request.configuration_path);
25454
+ const configureArgs = {
25455
+ action: "put_configuration",
25456
+ ref,
25457
+ id,
25458
+ environment_id: environmentId,
25459
+ configuration_path: configurationPath
25460
+ };
25461
+ validateToolArguments(APPLICATION_TOOL_SCHEMA, configureArgs);
25462
+ const configured = await delegate(configureArgs);
25463
+ const configurationReceipt = resultObject(configured);
25464
+ if (configured.isError || !configurationReceipt?.ok) {
25465
+ return releasePhaseFailure("configure", configured, completed);
25466
+ }
25467
+ configurationId = releaseField(configurationReceipt, "configuration", "configuration_id");
25468
+ if (!configurationId)
25469
+ return releasePhaseFailure("configure", releaseControlFailure("applications.put_configuration", "INVALID_RESPONSE", null, { project_ref: ref, application_id: id, environment_id: environmentId }), completed);
25470
+ completed.configure = { ok: true, configuration_id: configurationId };
25471
+ } else {
25472
+ completed.configure = { skipped: true, configuration_id: configurationId };
25473
+ }
25474
+ const deployArgs = {
25475
+ action: "deploy_release",
25476
+ ref,
25477
+ id,
25478
+ environment_id: environmentId,
25479
+ release_id: releaseId,
25480
+ configuration_id: configurationId
25481
+ };
25482
+ validateToolArguments(APPLICATION_TOOL_SCHEMA, deployArgs);
25483
+ const deployed = await delegate(deployArgs);
25484
+ const deployReceipt = resultObject(deployed);
25485
+ if (deployed.isError || !deployReceipt?.ok) {
25486
+ return releasePhaseFailure("deploy", deployed, completed);
25487
+ }
25488
+ completed.deploy = deployReceipt;
25489
+ const result = {
25490
+ schema: RELEASE_CONTROL_RESPONSE_SCHEMA,
25491
+ ok: true,
25492
+ operation: "applications.release",
25493
+ project_ref: ref,
25494
+ application_id: id,
25495
+ environment_id: environmentId,
25496
+ release_id: releaseId,
25497
+ configuration_id: configurationId,
25498
+ manifest_path: manifestPath,
25499
+ build: buildReceipt ? completed.build : { skipped: true, manifest_path: manifestPath },
25500
+ phases: completed,
25501
+ no_op: deployReceipt.no_op === true,
25502
+ execution_performed: deployReceipt.execution_performed === true,
25503
+ ...typeof deployReceipt.activation_id === "string" ? { activation_id: deployReceipt.activation_id } : {}
25504
+ };
25505
+ return request.format === "json" || request.json === true ? textResult(JSON.stringify(result, null, 2)) : textResult([
25506
+ `${ref}/${id}/${environmentId}: ${result.no_op ? "no-op" : "released"}`,
25507
+ `Release: ${releaseId}`,
25508
+ `Configuration: ${configurationId}`,
25509
+ `Activation: ${result.activation_id ?? "not performed"}`,
25510
+ `Build: ${request.skip_build ? "skipped" : "completed"}`
25511
+ ].join(`
25512
+ `));
25513
+ }
25244
25514
  function formatReleaseTransfer(result) {
25245
25515
  if (result.isError)
25246
25516
  return result;
@@ -25408,7 +25678,7 @@ function formatWorkflowObservation(result, action) {
25408
25678
  ].join(`
25409
25679
  `));
25410
25680
  }
25411
- if (action === "preview-list") {
25681
+ if (action === "preview-list" || action === "previews") {
25412
25682
  const list = parsePreviewList({ ...identity, previews: data.previews }, identity);
25413
25683
  return textResult([
25414
25684
  `${label}: ${list.previews.length} preview(s)`,
@@ -25416,8 +25686,8 @@ function formatWorkflowObservation(result, action) {
25416
25686
  ].join(`
25417
25687
  `));
25418
25688
  }
25419
- if (["preview-create", "preview-status", "preview-cleanup"].includes(action)) {
25420
- const preview = parsePreviewReceipt(data.preview, identity);
25689
+ if (["preview-plan", "preview-create", "preview-status", "preview-reconcile", "preview-cleanup"].includes(action)) {
25690
+ const preview = parsePreviewReceipt(data.preview ?? data, identity);
25421
25691
  return textResult([
25422
25692
  `${label}: ${preview.status}`,
25423
25693
  `Preview: ${preview.preview_id}`,
@@ -25511,7 +25781,7 @@ async function runAppTool(request, options = {}) {
25511
25781
  if (request.database_url !== undefined && request.action !== "dev" && request.action !== "watch") {
25512
25782
  throw new ScaffoldError("SCAFFOLD_OPTION_INVALID", "--database-url applies only to app dev --profile integration");
25513
25783
  }
25514
- if (request.json !== undefined && !Object.hasOwn(REMOTE_APP_ACTIONS, request.action) && request.action !== "promote")
25784
+ if (request.json !== undefined && !Object.hasOwn(REMOTE_APP_ACTIONS, request.action) && request.action !== "promote" && request.action !== "release")
25515
25785
  throw new Error("--json applies only to remote app actions");
25516
25786
  if (request.json && request.format === "text")
25517
25787
  throw new Error("--json and --format text cannot be combined");
@@ -25521,6 +25791,12 @@ async function runAppTool(request, options = {}) {
25521
25791
  return textResult("App remote actions require a Management API context.", true);
25522
25792
  return runPromotion(request, options, delegate);
25523
25793
  }
25794
+ if (request.action === "release") {
25795
+ const delegate = options.getApplications?.();
25796
+ if (!delegate)
25797
+ return textResult("App remote actions require a Management API context.", true);
25798
+ return runAppRelease(request, options, delegate);
25799
+ }
25524
25800
  if (Object.hasOwn(REMOTE_APP_ACTIONS, request.action)) {
25525
25801
  const delegate = options.getApplications?.();
25526
25802
  if (!delegate)
@@ -25617,6 +25893,7 @@ function registerAppTools(server, options = {}) {
25617
25893
  "fix",
25618
25894
  "plan",
25619
25895
  "build",
25896
+ "release",
25620
25897
  "upload",
25621
25898
  "configure",
25622
25899
  "transfer-plan",
@@ -25639,6 +25916,7 @@ function registerAppTools(server, options = {}) {
25639
25916
  "preview-create",
25640
25917
  "preview-status",
25641
25918
  "preview-cleanup",
25919
+ "preview-reconcile",
25642
25920
  "promote",
25643
25921
  "promote-status",
25644
25922
  "promote-reconcile"
@@ -25653,11 +25931,11 @@ function registerAppTools(server, options = {}) {
25653
25931
  "dry-run": optional(Boolean2(), "[generate] CLI alias of dry_run"),
25654
25932
  register_in: optional(String2(), "[generate] Existing parent module file for module/resource; uses the compiler AST editor"),
25655
25933
  "register-in": optional(String2(), "[generate] CLI alias of register_in"),
25656
- root: optional(String2(), "[dev/plan/build/compile/check] Project directory containing supacloud.config.ts (default: current directory)"),
25934
+ root: optional(String2(), "[dev/plan/build/release/compile/check] Project directory containing supacloud.config.ts (default: current directory)"),
25657
25935
  include: optional(String2(), "[dev/compile/check] Comma-separated glob patterns for source files"),
25658
25936
  out_dir: optional(String2(), "[dev/compile/plan/build/export-tools] Output directory (default: configured outDir)"),
25659
25937
  strict: optional(Boolean2(), "[dev/compile/check] Promote warnings to errors"),
25660
- format: optional(stringEnum(["text", "json"]), "[dev/generate/compile/check/plan/deploy-plan/diff/history/promote-plan/graph/export-tools] Output format (default: text)"),
25938
+ format: optional(stringEnum(["text", "json"]), "[dev/generate/compile/check/plan/release/deploy-plan/diff/history/promote-plan/graph/export-tools] Output format (default: text)"),
25661
25939
  json: optional(Boolean2(), "[history/transfer-plan/transfer/promote-plan] Preserve or return the full machine-readable receipt"),
25662
25940
  profile: optional(stringEnum(["fast", "integration"]), "[dev] Run dev or dev:integration; integration verifies an explicit loopback database"),
25663
25941
  once: optional(Boolean2(), "[dev] Validate and report once without watching"),
@@ -25666,7 +25944,8 @@ function registerAppTools(server, options = {}) {
25666
25944
  "database-url": optional(String2(), "[dev] CLI alias of database_url"),
25667
25945
  target: optional(String2(), "[explain/context/verify-plan] Provider class name / token name / command name / job name / module name"),
25668
25946
  fix: optional(String2(), "[fix] Path to a DiagnosticFix JSON file produced by `doctor --format json`"),
25669
- write: optional(Boolean2(), "[fix] Write the fix to disk (default: preview only)")
25947
+ write: optional(Boolean2(), "[fix] Write the fix to disk (default: preview only)"),
25948
+ skip_build: optional(Boolean2(), "[release] Reuse --manifest_path instead of running the local delivery build")
25670
25949
  }, (request) => runAppTool(request, options));
25671
25950
  }
25672
25951
  var APP_ALIAS_ACTIONS = ["generate", "compile", "check", "graph", "explain", "context", "doctor", "fix"];
@@ -26354,7 +26633,7 @@ function registerDbGovernanceTools(server, options = {}) {
26354
26633
  }
26355
26634
 
26356
26635
  // src/shared/tools/scheduled-function-tools.ts
26357
- import { randomUUID as randomUUID2 } from "node:crypto";
26636
+ import { randomUUID as randomUUID3 } from "node:crypto";
26358
26637
  import { readFileSync as readFileSync9, statSync as statSync8 } from "node:fs";
26359
26638
  import { resolve as resolve20 } from "node:path";
26360
26639
  import { isDeepStrictEqual } from "node:util";
@@ -26664,7 +26943,7 @@ function readOnlyResult2() {
26664
26943
  }
26665
26944
  function createRequest(args, environment) {
26666
26945
  return {
26667
- request_id: randomUUID2(),
26946
+ request_id: randomUUID3(),
26668
26947
  name: requiredName(args, "create"),
26669
26948
  slug: requiredSlug(args, "create"),
26670
26949
  cron: requiredCron(args, "create"),
@@ -26726,7 +27005,7 @@ function updateRequest(args, environment) {
26726
27005
  throw new Error("Scheduled Function update requires at least one field");
26727
27006
  }
26728
27007
  return {
26729
- request_id: randomUUID2(),
27008
+ request_id: randomUUID3(),
26730
27009
  expected_updated_at: expectedUpdatedAt,
26731
27010
  ...mutationFields
26732
27011
  };
@@ -28423,7 +28702,7 @@ function registerRemoteDevTools(server, options = {}) {
28423
28702
  // package.json
28424
28703
  var package_default = {
28425
28704
  name: "@supacloud/cli",
28426
- version: "0.83.0",
28705
+ version: "0.85.0",
28427
28706
  description: "Project-scoped CLI for SupaCloud users",
28428
28707
  type: "module",
28429
28708
  main: "./dist/index.js",
@@ -28476,13 +28755,13 @@ var package_default = {
28476
28755
  },
28477
28756
  dependencies: {
28478
28757
  "@supacloud/compiler": "^0.43.0",
28479
- "@supacloud/delivery": "0.12.0",
28758
+ "@supacloud/delivery": "0.13.0",
28480
28759
  "@supacloud/db": "0.16.0",
28481
28760
  typebox: "1.3.34"
28482
28761
  },
28483
28762
  overrides: {
28484
28763
  "@supacloud/contracts": "0.8.0",
28485
- "@supacloud/delivery": "0.12.0",
28764
+ "@supacloud/delivery": "0.13.0",
28486
28765
  "@graphql-tools/utils": "^12.0.3"
28487
28766
  },
28488
28767
  devDependencies: {
@@ -28742,6 +29021,7 @@ EXAMPLES
28742
29021
  ${preferredCommand} app compile --root .
28743
29022
  ${preferredCommand} app plan --root . --format json
28744
29023
  ${preferredCommand} app build --root .
29024
+ ${preferredCommand} --env test app release --id orders --environment_id test --configuration_path configuration.json
28745
29025
  ${preferredCommand} app upload --ref abc123 --id orders --manifest_path generated/delivery/delivery.manifest.json
28746
29026
  ${preferredCommand} app configure --ref abc123 --id orders --environment_id test --configuration_path configuration.json
28747
29027
  ${preferredCommand} app deploy-plan --ref abc123 --id orders --environment_id test --release_id <sha256> --configuration_id <uuid>
@@ -28753,7 +29033,9 @@ EXAMPLES
28753
29033
  ${preferredCommand} app preview-plan --ref abc123 --id orders --environment_id test --release_id <sha256> --branch_ref preview-orders
28754
29034
  ${preferredCommand} app preview --ref abc123 --id orders --environment_id test --release_id <sha256> --configuration_id <uuid> --ttl_seconds 3600 --wait
28755
29035
  ${preferredCommand} app previews --ref abc123 --id orders --environment_id test
29036
+ ${preferredCommand} app preview-list --ref abc123 --id orders --environment_id test
28756
29037
  ${preferredCommand} app preview-status --ref abc123 --id orders --environment_id test --preview_id <uuid> --wait --timeout_seconds 300
29038
+ ${preferredCommand} app preview-reconcile --ref abc123 --id orders --environment_id test --preview_id <uuid>
28757
29039
  ${preferredCommand} app preview-cleanup --ref abc123 --id orders --environment_id test --preview_id <uuid>
28758
29040
  ${preferredCommand} --env production app promote --id orders --environment_id production --source_ref staging --source_environment_id staging --source_release_id <sha256> --confirm-production abc123
28759
29041
  ${preferredCommand} app promote-status --ref abc123 --id orders --environment_id production --mutation_id <uuid>
@@ -25,6 +25,7 @@ declare const REMOTE_APP_ACTIONS: {
25
25
  readonly logs: "logs";
26
26
  readonly preview: "create_preview";
27
27
  readonly previews: "list_previews";
28
+ readonly "preview-reconcile": "reconcile_preview";
28
29
  };
29
30
  export interface AppToolOptions {
30
31
  getApplications?: () => ((args: Record<string, unknown>) => Promise<ToolResult>) | undefined;
@@ -35,7 +36,7 @@ export interface AppToolOptions {
35
36
  onDevProgress?: (result: ToolResult) => void;
36
37
  }
37
38
  export interface AppToolArguments {
38
- action: "init" | "generate" | "dev" | "watch" | "verify-plan" | "compile" | "check" | "graph" | "explain" | "export-tools" | "context" | "doctor" | "fix" | "plan" | "build" | "promote" | keyof typeof REMOTE_APP_ACTIONS;
39
+ action: "init" | "generate" | "dev" | "watch" | "verify-plan" | "compile" | "check" | "graph" | "explain" | "export-tools" | "context" | "doctor" | "fix" | "plan" | "build" | "release" | "promote" | keyof typeof REMOTE_APP_ACTIONS;
39
40
  ref?: string;
40
41
  id?: string;
41
42
  environment_id?: string;
@@ -44,6 +45,8 @@ export interface AppToolArguments {
44
45
  expected_activation_id?: string | null;
45
46
  configuration_path?: string;
46
47
  manifest_path?: string;
48
+ /** `app release`: reuse an existing configuration revision instead of writing configuration_path. */
49
+ skip_build?: boolean;
47
50
  release_id?: string;
48
51
  source_ref?: string;
49
52
  source_release_id?: string;
@@ -1,6 +1,6 @@
1
1
  import { Type, type Static } from "typebox";
2
2
  import type { HttpTransport } from "../transports/http";
3
- export declare const APPLICATION_PREVIEW_ACTIONS: readonly ["get_preview_plan", "create_preview", "list_previews", "get_preview", "cleanup_preview"];
3
+ export declare const APPLICATION_PREVIEW_ACTIONS: readonly ["get_preview_plan", "create_preview", "list_previews", "get_preview", "reconcile_preview", "cleanup_preview"];
4
4
  export declare const APPLICATION_PREVIEW_FIELDS: {
5
5
  preview_id: Type.TOptional<Type.TString>;
6
6
  branch_ref: Type.TOptional<Type.TString>;
@@ -17,41 +17,41 @@ declare const receiptSchema: Type.TObject<{
17
17
  application_id: Type.TString;
18
18
  environment_id: Type.TString;
19
19
  release_id: Type.TString;
20
- expires_at: Type.TUnion<[Type.TString, Type.TNull]>;
21
- status: Type.TEnum<("failed" | "ready" | "planned" | "cleaned" | "provisioning")[]>;
20
+ expires_at: Type.TOptional<Type.TUnion<[Type.TString, Type.TNull]>>;
21
+ status: Type.TEnum<("ready" | "failed" | "cleaned" | "planned" | "provisioning")[]>;
22
22
  resources: Type.TObject<{
23
23
  build_artifact: Type.TObject<{
24
- status: Type.TEnum<("pending" | "failed" | "ready" | "cleaned")[]>;
24
+ status: Type.TEnum<("pending" | "ready" | "failed" | "cleaned")[]>;
25
25
  release_id: Type.TString;
26
26
  }>;
27
27
  database_branch: Type.TObject<{
28
- status: Type.TEnum<("pending" | "failed" | "ready" | "cleaned")[]>;
28
+ status: Type.TEnum<("pending" | "ready" | "failed" | "cleaned")[]>;
29
29
  branch_ref: Type.TString;
30
30
  data_mode: Type.TEnum<("schema_only" | "full_clone")[]>;
31
31
  }>;
32
32
  queue_namespace: Type.TObject<{
33
- status: Type.TEnum<("pending" | "failed" | "ready" | "cleaned")[]>;
33
+ status: Type.TEnum<("pending" | "ready" | "failed" | "cleaned")[]>;
34
34
  namespace: Type.TString;
35
35
  }>;
36
36
  storage_namespace: Type.TObject<{
37
- status: Type.TEnum<("pending" | "failed" | "ready" | "cleaned")[]>;
37
+ status: Type.TEnum<("pending" | "ready" | "failed" | "cleaned")[]>;
38
38
  namespace: Type.TString;
39
39
  }>;
40
40
  test_secret: Type.TObject<{
41
- status: Type.TEnum<("pending" | "failed" | "ready" | "cleaned")[]>;
41
+ status: Type.TEnum<("pending" | "ready" | "failed" | "cleaned")[]>;
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" | "failed" | "ready" | "cleaned")[]>;
46
+ status: Type.TEnum<("pending" | "ready" | "failed" | "cleaned")[]>;
47
47
  configuration_id: Type.TUnion<[Type.TString, Type.TNull]>;
48
48
  }>;
49
49
  application_activation: Type.TObject<{
50
- status: Type.TEnum<("pending" | "failed" | "ready" | "cleaned")[]>;
50
+ status: Type.TEnum<("pending" | "ready" | "failed" | "cleaned")[]>;
51
51
  activation_id: Type.TUnion<[Type.TString, Type.TNull]>;
52
52
  }>;
53
53
  smoke_test: Type.TObject<{
54
- status: Type.TEnum<("pending" | "failed" | "ready" | "cleaned")[]>;
54
+ status: Type.TEnum<("pending" | "ready" | "failed" | "cleaned")[]>;
55
55
  checks: Type.TArray<Type.TString>;
56
56
  passed: Type.TArray<Type.TString>;
57
57
  failed: Type.TArray<Type.TString>;
@@ -0,0 +1 @@
1
+ export {};
@@ -9,7 +9,7 @@ export declare const APPLICATION_TOOL_SCHEMA: {
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<("list_releases" | "get_release" | "upload_release" | "activate_release" | "logs" | "get_runtime" | "get_deployment_evidence" | "get_configuration" | "get_release_transfer_plan" | "get_promotion_plan" | "get_rollback_snapshot" | "get_history" | "get_deploy_plan" | "get_promotion_status" | "get_preview_plan" | "put_configuration" | "transfer_release" | "promote_application" | "reconcile_promotion" | "create_preview" | "list_previews" | "get_preview" | "cleanup_preview" | "deploy_release" | "rollback_release" | "reconcile_activation" | "retire_activation")[]>;
12
+ action: Type.TEnum<("list_releases" | "get_release" | "upload_release" | "activate_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" | "transfer_release" | "promote_application" | "reconcile_promotion" | "create_preview" | "reconcile_preview" | "cleanup_preview" | "deploy_release" | "rollback_release" | "reconcile_activation" | "retire_activation")[]>;
13
13
  ref: Type.TString;
14
14
  id: Type.TString;
15
15
  environment_id: Type.TOptional<Type.TString>;
@@ -121,49 +121,49 @@ export declare function parsePreviewReceipt(value: unknown, identity: Applicatio
121
121
  project_ref: string;
122
122
  application_id: string;
123
123
  environment_id: string;
124
- status: "failed" | "ready" | "planned" | "cleaned" | "provisioning";
124
+ status: "ready" | "failed" | "cleaned" | "planned" | "provisioning";
125
125
  schema: "supacloud.application-preview.v1";
126
126
  resources: {
127
127
  build_artifact: {
128
- status: "pending" | "failed" | "ready" | "cleaned";
128
+ status: "pending" | "ready" | "failed" | "cleaned";
129
129
  release_id: string;
130
130
  };
131
131
  database_branch: {
132
- status: "pending" | "failed" | "ready" | "cleaned";
132
+ status: "pending" | "ready" | "failed" | "cleaned";
133
133
  branch_ref: string;
134
134
  data_mode: "schema_only" | "full_clone";
135
135
  };
136
136
  queue_namespace: {
137
- status: "pending" | "failed" | "ready" | "cleaned";
137
+ status: "pending" | "ready" | "failed" | "cleaned";
138
138
  namespace: string;
139
139
  };
140
140
  storage_namespace: {
141
- status: "pending" | "failed" | "ready" | "cleaned";
141
+ status: "pending" | "ready" | "failed" | "cleaned";
142
142
  namespace: string;
143
143
  };
144
144
  test_secret: {
145
145
  name: string;
146
- status: "pending" | "failed" | "ready" | "cleaned";
146
+ status: "pending" | "ready" | "failed" | "cleaned";
147
147
  value_issued: false;
148
148
  };
149
149
  configuration_revision: {
150
- status: "pending" | "failed" | "ready" | "cleaned";
150
+ status: "pending" | "ready" | "failed" | "cleaned";
151
151
  configuration_id: string | null;
152
152
  };
153
153
  application_activation: {
154
- status: "pending" | "failed" | "ready" | "cleaned";
154
+ status: "pending" | "ready" | "failed" | "cleaned";
155
155
  activation_id: string | null;
156
156
  };
157
157
  smoke_test: {
158
- status: "pending" | "failed" | "ready" | "cleaned";
158
+ status: "pending" | "ready" | "failed" | "cleaned";
159
159
  checks: string[];
160
160
  failed: string[];
161
161
  passed: string[];
162
162
  };
163
163
  };
164
164
  release_id: string;
165
- expires_at: string | null;
166
165
  preview_id: string;
166
+ expires_at: string | null;
167
167
  cleanup: {
168
168
  required: boolean;
169
169
  error: string | null;
@@ -184,49 +184,49 @@ export declare function parsePreviewList(value: unknown, identity: ApplicationWo
184
184
  project_ref: string;
185
185
  application_id: string;
186
186
  environment_id: string;
187
- status: "failed" | "ready" | "planned" | "cleaned" | "provisioning";
187
+ status: "ready" | "failed" | "cleaned" | "planned" | "provisioning";
188
188
  schema: "supacloud.application-preview.v1";
189
189
  resources: {
190
190
  build_artifact: {
191
- status: "pending" | "failed" | "ready" | "cleaned";
191
+ status: "pending" | "ready" | "failed" | "cleaned";
192
192
  release_id: string;
193
193
  };
194
194
  database_branch: {
195
- status: "pending" | "failed" | "ready" | "cleaned";
195
+ status: "pending" | "ready" | "failed" | "cleaned";
196
196
  branch_ref: string;
197
197
  data_mode: "schema_only" | "full_clone";
198
198
  };
199
199
  queue_namespace: {
200
- status: "pending" | "failed" | "ready" | "cleaned";
200
+ status: "pending" | "ready" | "failed" | "cleaned";
201
201
  namespace: string;
202
202
  };
203
203
  storage_namespace: {
204
- status: "pending" | "failed" | "ready" | "cleaned";
204
+ status: "pending" | "ready" | "failed" | "cleaned";
205
205
  namespace: string;
206
206
  };
207
207
  test_secret: {
208
208
  name: string;
209
- status: "pending" | "failed" | "ready" | "cleaned";
209
+ status: "pending" | "ready" | "failed" | "cleaned";
210
210
  value_issued: false;
211
211
  };
212
212
  configuration_revision: {
213
- status: "pending" | "failed" | "ready" | "cleaned";
213
+ status: "pending" | "ready" | "failed" | "cleaned";
214
214
  configuration_id: string | null;
215
215
  };
216
216
  application_activation: {
217
- status: "pending" | "failed" | "ready" | "cleaned";
217
+ status: "pending" | "ready" | "failed" | "cleaned";
218
218
  activation_id: string | null;
219
219
  };
220
220
  smoke_test: {
221
- status: "pending" | "failed" | "ready" | "cleaned";
221
+ status: "pending" | "ready" | "failed" | "cleaned";
222
222
  checks: string[];
223
223
  failed: string[];
224
224
  passed: string[];
225
225
  };
226
226
  };
227
227
  release_id: string;
228
- expires_at: string | null;
229
228
  preview_id: string;
229
+ expires_at: string | null;
230
230
  cleanup: {
231
231
  required: boolean;
232
232
  error: string | null;
@@ -63,6 +63,6 @@ export declare class HttpTransport {
63
63
  postMultipart<T = unknown>(path: string, formData: FormData, options?: HttpPostOptions): Promise<HttpResult<T>>;
64
64
  patch<T = unknown>(path: string, body?: unknown): Promise<HttpResult<T>>;
65
65
  put<T = unknown>(path: string, body?: unknown, options?: HttpPostOptions): Promise<HttpResult<T>>;
66
- delete<T = unknown>(path: string, body?: unknown): Promise<HttpResult<T>>;
66
+ delete<T = unknown>(path: string, body?: unknown, options?: HttpPostOptions): Promise<HttpResult<T>>;
67
67
  ping(): Promise<boolean>;
68
68
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@supacloud/cli",
3
- "version": "0.83.0",
3
+ "version": "0.85.0",
4
4
  "description": "Project-scoped CLI for SupaCloud users",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -53,13 +53,13 @@
53
53
  },
54
54
  "dependencies": {
55
55
  "@supacloud/compiler": "^0.43.0",
56
- "@supacloud/delivery": "0.12.0",
56
+ "@supacloud/delivery": "0.13.0",
57
57
  "@supacloud/db": "0.16.0",
58
58
  "typebox": "1.3.34"
59
59
  },
60
60
  "overrides": {
61
61
  "@supacloud/contracts": "0.8.0",
62
- "@supacloud/delivery": "0.12.0",
62
+ "@supacloud/delivery": "0.13.0",
63
63
  "@graphql-tools/utils": "^12.0.3"
64
64
  },
65
65
  "devDependencies": {