@debugbundle/cli 1.5.1 → 1.5.2

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.
Files changed (2) hide show
  1. package/dist/main.cjs +348 -112
  2. package/package.json +1 -1
package/dist/main.cjs CHANGED
@@ -15350,6 +15350,29 @@ var ImprovementSettingsUpdateSchema = external_exports.object({
15350
15350
  message: "At least one improvement settings field must be provided."
15351
15351
  });
15352
15352
 
15353
+ // ../../packages/shared-types/src/project-color-tags.ts
15354
+ var PROJECT_COLOR_TAG_VALUES = [
15355
+ "red",
15356
+ "orange",
15357
+ "amber",
15358
+ "yellow",
15359
+ "lime",
15360
+ "green",
15361
+ "emerald",
15362
+ "teal",
15363
+ "cyan",
15364
+ "sky",
15365
+ "blue",
15366
+ "indigo",
15367
+ "violet",
15368
+ "purple",
15369
+ "fuchsia",
15370
+ "pink",
15371
+ "rose",
15372
+ "slate"
15373
+ ];
15374
+ var ProjectColorTagSchema = external_exports.enum(PROJECT_COLOR_TAG_VALUES);
15375
+
15353
15376
  // ../../packages/shared-types/src/index.ts
15354
15377
  function createUuidV4() {
15355
15378
  const cryptoSource = globalThis.crypto;
@@ -16838,6 +16861,20 @@ var import_promises3 = require("node:fs/promises");
16838
16861
  var import_node_path4 = require("node:path");
16839
16862
 
16840
16863
  // ../../packages/retrieval-client/src/index.ts
16864
+ var ProjectColorTagResponseSchema = external_exports.unknown().transform((value, context) => {
16865
+ if (value === void 0 || value === null) {
16866
+ return null;
16867
+ }
16868
+ const parsed = ProjectColorTagSchema.safeParse(value);
16869
+ if (!parsed.success) {
16870
+ context.addIssue({
16871
+ code: external_exports.ZodIssueCode.custom,
16872
+ message: "Invalid project color tag"
16873
+ });
16874
+ return external_exports.NEVER;
16875
+ }
16876
+ return parsed.data;
16877
+ });
16841
16878
  var IncidentReasonSchema = external_exports.object({
16842
16879
  kind: external_exports.enum(["backend_exception", "frontend_exception", "request_failure", "error_log"]),
16843
16880
  description: external_exports.string(),
@@ -16849,6 +16886,7 @@ var IncidentSchema = external_exports.object({
16849
16886
  incident_id: external_exports.string(),
16850
16887
  project_id: external_exports.string(),
16851
16888
  project_name: external_exports.string(),
16889
+ project_color_tag: ProjectColorTagResponseSchema,
16852
16890
  service_id: external_exports.string().nullable(),
16853
16891
  service_name: external_exports.string().nullable(),
16854
16892
  latest_deployment_id: external_exports.string().nullable(),
@@ -16871,6 +16909,7 @@ var ImprovementSchema = external_exports.object({
16871
16909
  improvement_id: external_exports.string(),
16872
16910
  project_id: external_exports.string(),
16873
16911
  project_name: external_exports.string(),
16912
+ project_color_tag: ProjectColorTagResponseSchema,
16874
16913
  project_slug: external_exports.string(),
16875
16914
  service_id: external_exports.string().nullable(),
16876
16915
  service_name: external_exports.string(),
@@ -17056,6 +17095,24 @@ async function expectServices(responsePromise) {
17056
17095
  const parsed = await expectParsed(responsePromise, ServicesResponseSchema);
17057
17096
  return parsed.services;
17058
17097
  }
17098
+ function normalizeIncidentRecord(incident) {
17099
+ return {
17100
+ ...incident,
17101
+ project_color_tag: incident.project_color_tag
17102
+ };
17103
+ }
17104
+ function normalizeIncidentContext(context) {
17105
+ return {
17106
+ ...context,
17107
+ incident: normalizeIncidentRecord(context.incident)
17108
+ };
17109
+ }
17110
+ function normalizeImprovementRecord(improvement) {
17111
+ return {
17112
+ ...improvement,
17113
+ project_color_tag: improvement.project_color_tag
17114
+ };
17115
+ }
17059
17116
  function createRetrievalApi(client) {
17060
17117
  return {
17061
17118
  async listIncidents(input2) {
@@ -17094,7 +17151,7 @@ function createRetrievalApi(client) {
17094
17151
  IncidentsResponseSchema
17095
17152
  );
17096
17153
  return {
17097
- incidents: parsed.incidents,
17154
+ incidents: parsed.incidents.map(normalizeIncidentRecord),
17098
17155
  next_cursor: parsed.next_cursor ?? null
17099
17156
  };
17100
17157
  },
@@ -17107,10 +17164,10 @@ function createRetrievalApi(client) {
17107
17164
  }),
17108
17165
  IncidentResponseSchema
17109
17166
  );
17110
- return parsed.incident;
17167
+ return normalizeIncidentRecord(parsed.incident);
17111
17168
  },
17112
17169
  async getIncidentContext(input2) {
17113
- return await expectParsed(
17170
+ const parsed = await expectParsed(
17114
17171
  client.request({
17115
17172
  method: "GET",
17116
17173
  path: `/v1/incidents/${input2.incidentId}/context`,
@@ -17118,6 +17175,7 @@ function createRetrievalApi(client) {
17118
17175
  }),
17119
17176
  IncidentContextSchema
17120
17177
  );
17178
+ return normalizeIncidentContext(parsed);
17121
17179
  },
17122
17180
  async resolveIncident(input2) {
17123
17181
  const parsed = await expectParsed(
@@ -17128,7 +17186,7 @@ function createRetrievalApi(client) {
17128
17186
  }),
17129
17187
  IncidentResponseSchema
17130
17188
  );
17131
- return parsed.incident;
17189
+ return normalizeIncidentRecord(parsed.incident);
17132
17190
  },
17133
17191
  async resolveIncidents(input2) {
17134
17192
  const parsed = await expectParsed(
@@ -17142,7 +17200,7 @@ function createRetrievalApi(client) {
17142
17200
  }),
17143
17201
  BulkIncidentResponseSchema
17144
17202
  );
17145
- return parsed.incidents;
17203
+ return parsed.incidents.map(normalizeIncidentRecord);
17146
17204
  },
17147
17205
  async reopenIncident(input2) {
17148
17206
  const parsed = await expectParsed(
@@ -17153,7 +17211,7 @@ function createRetrievalApi(client) {
17153
17211
  }),
17154
17212
  IncidentResponseSchema
17155
17213
  );
17156
- return parsed.incident;
17214
+ return normalizeIncidentRecord(parsed.incident);
17157
17215
  },
17158
17216
  async reopenIncidents(input2) {
17159
17217
  const parsed = await expectParsed(
@@ -17167,7 +17225,7 @@ function createRetrievalApi(client) {
17167
17225
  }),
17168
17226
  BulkIncidentResponseSchema
17169
17227
  );
17170
- return parsed.incidents;
17228
+ return parsed.incidents.map(normalizeIncidentRecord);
17171
17229
  },
17172
17230
  async getBundle(input2) {
17173
17231
  const bundle = await expectParsed(
@@ -17264,7 +17322,7 @@ function createRetrievalApi(client) {
17264
17322
  ImprovementsResponseSchema
17265
17323
  );
17266
17324
  return {
17267
- improvements: parsed.improvements,
17325
+ improvements: parsed.improvements.map(normalizeImprovementRecord),
17268
17326
  next_cursor: parsed.next_cursor ?? null
17269
17327
  };
17270
17328
  },
@@ -17277,7 +17335,7 @@ function createRetrievalApi(client) {
17277
17335
  }),
17278
17336
  ImprovementResponseSchema
17279
17337
  );
17280
- return parsed.improvement;
17338
+ return normalizeImprovementRecord(parsed.improvement);
17281
17339
  },
17282
17340
  async resolveImprovement(input2) {
17283
17341
  const parsed = await expectParsed(
@@ -17288,7 +17346,7 @@ function createRetrievalApi(client) {
17288
17346
  }),
17289
17347
  ImprovementResponseSchema
17290
17348
  );
17291
- return parsed.improvement;
17349
+ return normalizeImprovementRecord(parsed.improvement);
17292
17350
  },
17293
17351
  async reopenImprovement(input2) {
17294
17352
  const parsed = await expectParsed(
@@ -17299,7 +17357,7 @@ function createRetrievalApi(client) {
17299
17357
  }),
17300
17358
  ImprovementResponseSchema
17301
17359
  );
17302
- return parsed.improvement;
17360
+ return normalizeImprovementRecord(parsed.improvement);
17303
17361
  },
17304
17362
  async snoozeImprovement(input2) {
17305
17363
  const parsed = await expectParsed(
@@ -17311,7 +17369,7 @@ function createRetrievalApi(client) {
17311
17369
  }),
17312
17370
  ImprovementResponseSchema
17313
17371
  );
17314
- return parsed.improvement;
17372
+ return normalizeImprovementRecord(parsed.improvement);
17315
17373
  },
17316
17374
  async getImprovementBundle(input2) {
17317
17375
  return await expectParsed(
@@ -18349,6 +18407,136 @@ var AVAILABILITY_CHECK_BOOTSTRAP_STATEMENTS = [
18349
18407
  `
18350
18408
  ];
18351
18409
 
18410
+ // ../../packages/storage/src/storage-bootstrap-account-analytics-statements.ts
18411
+ var STORAGE_BOOTSTRAP_ACCOUNT_ANALYTICS_STATEMENTS = [
18412
+ `
18413
+ CREATE TABLE account_analytics_accounts (
18414
+ analytics_account_id uuid PRIMARY KEY,
18415
+ organization_id uuid UNIQUE,
18416
+ organization_id_hash text NOT NULL UNIQUE,
18417
+ created_at timestamptz NOT NULL,
18418
+ first_seen_at timestamptz NOT NULL,
18419
+ metrics_collection_started_at timestamptz NOT NULL,
18420
+ backfilled_from_retained_rows_at timestamptz,
18421
+ deleted_at timestamptz,
18422
+ initial_plan text,
18423
+ latest_known_plan text,
18424
+ latest_capacity_units integer,
18425
+ account_deleted boolean NOT NULL DEFAULT false,
18426
+ metrics_schema_version integer NOT NULL DEFAULT 1,
18427
+ updated_at timestamptz NOT NULL DEFAULT now()
18428
+ )
18429
+ `,
18430
+ `
18431
+ CREATE TABLE account_metric_periods (
18432
+ analytics_account_id uuid NOT NULL REFERENCES account_analytics_accounts(analytics_account_id),
18433
+ period_grain text NOT NULL CHECK (period_grain IN ('day', 'month', 'year', 'lifetime')),
18434
+ period_starts_at timestamptz NOT NULL,
18435
+ metric_key text NOT NULL,
18436
+ metric_value bigint NOT NULL DEFAULT 0,
18437
+ updated_at timestamptz NOT NULL DEFAULT now(),
18438
+ PRIMARY KEY (analytics_account_id, period_grain, period_starts_at, metric_key)
18439
+ )
18440
+ `,
18441
+ `
18442
+ CREATE INDEX account_metric_periods_grain_period_metric_idx
18443
+ ON account_metric_periods (period_grain, period_starts_at, metric_key)
18444
+ `,
18445
+ `
18446
+ CREATE INDEX account_metric_periods_account_grain_period_idx
18447
+ ON account_metric_periods (analytics_account_id, period_grain, period_starts_at)
18448
+ `,
18449
+ `
18450
+ CREATE TABLE account_metric_events (
18451
+ dedupe_key_hash text PRIMARY KEY,
18452
+ analytics_account_id uuid NOT NULL REFERENCES account_analytics_accounts(analytics_account_id),
18453
+ metric_source text NOT NULL,
18454
+ occurred_at timestamptz NOT NULL,
18455
+ recorded_at timestamptz NOT NULL DEFAULT now(),
18456
+ metric_deltas jsonb NOT NULL
18457
+ )
18458
+ `,
18459
+ `
18460
+ CREATE TABLE ingestion_rejection_diagnostic_periods (
18461
+ analytics_account_id uuid NOT NULL REFERENCES account_analytics_accounts(analytics_account_id),
18462
+ period_starts_at timestamptz NOT NULL,
18463
+ rejection_reason text NOT NULL,
18464
+ project_id_text text NOT NULL DEFAULT '',
18465
+ service_name text NOT NULL DEFAULT '',
18466
+ service_environment text NOT NULL DEFAULT '',
18467
+ service_runtime text NOT NULL DEFAULT '',
18468
+ sdk_name text NOT NULL DEFAULT '',
18469
+ sdk_version text NOT NULL DEFAULT '',
18470
+ event_type text NOT NULL DEFAULT '',
18471
+ validation_code text NOT NULL DEFAULT '',
18472
+ validation_path text NOT NULL DEFAULT '',
18473
+ occurrences bigint NOT NULL DEFAULT 0,
18474
+ first_seen_at timestamptz NOT NULL,
18475
+ last_seen_at timestamptz NOT NULL,
18476
+ updated_at timestamptz NOT NULL DEFAULT now(),
18477
+ PRIMARY KEY (
18478
+ analytics_account_id,
18479
+ period_starts_at,
18480
+ rejection_reason,
18481
+ project_id_text,
18482
+ service_name,
18483
+ service_environment,
18484
+ service_runtime,
18485
+ sdk_name,
18486
+ sdk_version,
18487
+ event_type,
18488
+ validation_code,
18489
+ validation_path
18490
+ )
18491
+ )
18492
+ `,
18493
+ `
18494
+ CREATE INDEX ingestion_rejection_diagnostic_periods_reason_period_idx
18495
+ ON ingestion_rejection_diagnostic_periods (rejection_reason, period_starts_at, last_seen_at DESC)
18496
+ `,
18497
+ `
18498
+ CREATE TABLE account_payment_retention_records (
18499
+ id uuid PRIMARY KEY,
18500
+ analytics_account_id uuid NOT NULL REFERENCES account_analytics_accounts(analytics_account_id),
18501
+ organization_id_hash text NOT NULL,
18502
+ provider text NOT NULL,
18503
+ plan text,
18504
+ billing_state text,
18505
+ stripe_customer_id text,
18506
+ stripe_subscription_id text,
18507
+ billing_period_starts_at timestamptz,
18508
+ billing_period_ends_at timestamptz,
18509
+ additional_capacity_units integer,
18510
+ last_billing_event_id text,
18511
+ account_deleted_at timestamptz NOT NULL,
18512
+ recorded_at timestamptz NOT NULL DEFAULT now(),
18513
+ updated_at timestamptz NOT NULL DEFAULT now(),
18514
+ UNIQUE (analytics_account_id, provider)
18515
+ )
18516
+ `,
18517
+ `
18518
+ CREATE INDEX account_payment_retention_records_provider_idx
18519
+ ON account_payment_retention_records (provider, account_deleted_at DESC)
18520
+ `,
18521
+ `
18522
+ CREATE TABLE account_payment_provider_events (
18523
+ provider_event_key text PRIMARY KEY,
18524
+ analytics_account_id uuid NOT NULL REFERENCES account_analytics_accounts(analytics_account_id),
18525
+ organization_id_hash text NOT NULL,
18526
+ provider text NOT NULL,
18527
+ provider_event_id text NOT NULL,
18528
+ provider_event_type text NOT NULL,
18529
+ processed_at timestamptz NOT NULL,
18530
+ account_deleted_at timestamptz NOT NULL,
18531
+ recorded_at timestamptz NOT NULL DEFAULT now()
18532
+ )
18533
+ `,
18534
+ `
18535
+ CREATE UNIQUE INDEX account_payment_provider_events_provider_event_key
18536
+ ON account_payment_provider_events (provider, provider_event_id)
18537
+ `
18538
+ ];
18539
+
18352
18540
  // ../../packages/storage/src/storage-bootstrap-statements.ts
18353
18541
  var STORAGE_BOOTSTRAP_STATEMENTS = [
18354
18542
  `
@@ -18412,6 +18600,8 @@ var STORAGE_BOOTSTRAP_STATEMENTS = [
18412
18600
  name text NOT NULL,
18413
18601
  slug text NOT NULL,
18414
18602
  environment_default text NOT NULL DEFAULT 'production',
18603
+ color_tag text
18604
+ CHECK (color_tag IN ('red', 'orange', 'amber', 'yellow', 'lime', 'green', 'emerald', 'teal', 'cyan', 'sky', 'blue', 'indigo', 'violet', 'purple', 'fuchsia', 'pink', 'rose', 'slate') OR color_tag IS NULL),
18415
18605
  automated_improvement_bundles_enabled boolean NOT NULL DEFAULT true,
18416
18606
  improvement_bundle_sensitivity text NOT NULL DEFAULT 'high_confidence'
18417
18607
  CHECK (improvement_bundle_sensitivity IN ('high_confidence', 'balanced', 'verbose')),
@@ -19288,94 +19478,7 @@ var STORAGE_BOOTSTRAP_STATEMENTS = [
19288
19478
  PRIMARY KEY (project_id, period_starts_at)
19289
19479
  )
19290
19480
  `,
19291
- `
19292
- CREATE TABLE account_analytics_accounts (
19293
- analytics_account_id uuid PRIMARY KEY,
19294
- organization_id uuid UNIQUE,
19295
- organization_id_hash text NOT NULL UNIQUE,
19296
- created_at timestamptz NOT NULL,
19297
- first_seen_at timestamptz NOT NULL,
19298
- metrics_collection_started_at timestamptz NOT NULL,
19299
- backfilled_from_retained_rows_at timestamptz,
19300
- deleted_at timestamptz,
19301
- initial_plan text,
19302
- latest_known_plan text,
19303
- latest_capacity_units integer,
19304
- account_deleted boolean NOT NULL DEFAULT false,
19305
- metrics_schema_version integer NOT NULL DEFAULT 1,
19306
- updated_at timestamptz NOT NULL DEFAULT now()
19307
- )
19308
- `,
19309
- `
19310
- CREATE TABLE account_metric_periods (
19311
- analytics_account_id uuid NOT NULL REFERENCES account_analytics_accounts(analytics_account_id),
19312
- period_grain text NOT NULL CHECK (period_grain IN ('day', 'month', 'year', 'lifetime')),
19313
- period_starts_at timestamptz NOT NULL,
19314
- metric_key text NOT NULL,
19315
- metric_value bigint NOT NULL DEFAULT 0,
19316
- updated_at timestamptz NOT NULL DEFAULT now(),
19317
- PRIMARY KEY (analytics_account_id, period_grain, period_starts_at, metric_key)
19318
- )
19319
- `,
19320
- `
19321
- CREATE INDEX account_metric_periods_grain_period_metric_idx
19322
- ON account_metric_periods (period_grain, period_starts_at, metric_key)
19323
- `,
19324
- `
19325
- CREATE INDEX account_metric_periods_account_grain_period_idx
19326
- ON account_metric_periods (analytics_account_id, period_grain, period_starts_at)
19327
- `,
19328
- `
19329
- CREATE TABLE account_metric_events (
19330
- dedupe_key_hash text PRIMARY KEY,
19331
- analytics_account_id uuid NOT NULL REFERENCES account_analytics_accounts(analytics_account_id),
19332
- metric_source text NOT NULL,
19333
- occurred_at timestamptz NOT NULL,
19334
- recorded_at timestamptz NOT NULL DEFAULT now(),
19335
- metric_deltas jsonb NOT NULL
19336
- )
19337
- `,
19338
- `
19339
- CREATE TABLE account_payment_retention_records (
19340
- id uuid PRIMARY KEY,
19341
- analytics_account_id uuid NOT NULL REFERENCES account_analytics_accounts(analytics_account_id),
19342
- organization_id_hash text NOT NULL,
19343
- provider text NOT NULL,
19344
- plan text,
19345
- billing_state text,
19346
- stripe_customer_id text,
19347
- stripe_subscription_id text,
19348
- billing_period_starts_at timestamptz,
19349
- billing_period_ends_at timestamptz,
19350
- additional_capacity_units integer,
19351
- last_billing_event_id text,
19352
- account_deleted_at timestamptz NOT NULL,
19353
- recorded_at timestamptz NOT NULL DEFAULT now(),
19354
- updated_at timestamptz NOT NULL DEFAULT now(),
19355
- UNIQUE (analytics_account_id, provider)
19356
- )
19357
- `,
19358
- `
19359
- CREATE INDEX account_payment_retention_records_provider_idx
19360
- ON account_payment_retention_records (provider, account_deleted_at DESC)
19361
- `,
19362
- `
19363
- CREATE TABLE account_payment_provider_events (
19364
- provider_event_key text PRIMARY KEY,
19365
- analytics_account_id uuid NOT NULL REFERENCES account_analytics_accounts(analytics_account_id),
19366
- organization_id_hash text NOT NULL,
19367
- provider text NOT NULL,
19368
- provider_event_id text NOT NULL,
19369
- provider_event_type text NOT NULL,
19370
- processed_at timestamptz NOT NULL,
19371
- account_deleted_at timestamptz NOT NULL,
19372
- recorded_at timestamptz NOT NULL DEFAULT now()
19373
- )
19374
- `,
19375
- `
19376
- CREATE UNIQUE INDEX account_payment_provider_events_provider_event_key
19377
- ON account_payment_provider_events (provider, provider_event_id)
19378
- `,
19481
+ ...STORAGE_BOOTSTRAP_ACCOUNT_ANALYTICS_STATEMENTS,
19379
19482
  `
19380
19483
  CREATE TABLE operational_email_deliveries (
19381
19484
  id uuid PRIMARY KEY,
@@ -20550,6 +20653,70 @@ var STORAGE_SCHEMA_MIGRATIONS = [
20550
20653
  AND expires_at <= now()
20551
20654
  `
20552
20655
  ]
20656
+ }),
20657
+ defineStorageSchemaMigration({
20658
+ id: "202606140001_add_ingestion_rejection_diagnostics",
20659
+ description: "Track sanitized ingestion rejection diagnostics for operator breakdowns.",
20660
+ statements: [
20661
+ `
20662
+ CREATE TABLE IF NOT EXISTS ingestion_rejection_diagnostic_periods (
20663
+ analytics_account_id uuid NOT NULL REFERENCES account_analytics_accounts(analytics_account_id),
20664
+ period_starts_at timestamptz NOT NULL,
20665
+ rejection_reason text NOT NULL,
20666
+ project_id_text text NOT NULL DEFAULT '',
20667
+ service_name text NOT NULL DEFAULT '',
20668
+ service_environment text NOT NULL DEFAULT '',
20669
+ service_runtime text NOT NULL DEFAULT '',
20670
+ sdk_name text NOT NULL DEFAULT '',
20671
+ sdk_version text NOT NULL DEFAULT '',
20672
+ event_type text NOT NULL DEFAULT '',
20673
+ validation_code text NOT NULL DEFAULT '',
20674
+ validation_path text NOT NULL DEFAULT '',
20675
+ occurrences bigint NOT NULL DEFAULT 0,
20676
+ first_seen_at timestamptz NOT NULL,
20677
+ last_seen_at timestamptz NOT NULL,
20678
+ updated_at timestamptz NOT NULL DEFAULT now(),
20679
+ PRIMARY KEY (
20680
+ analytics_account_id,
20681
+ period_starts_at,
20682
+ rejection_reason,
20683
+ project_id_text,
20684
+ service_name,
20685
+ service_environment,
20686
+ service_runtime,
20687
+ sdk_name,
20688
+ sdk_version,
20689
+ event_type,
20690
+ validation_code,
20691
+ validation_path
20692
+ )
20693
+ )
20694
+ `,
20695
+ `
20696
+ CREATE INDEX IF NOT EXISTS ingestion_rejection_diagnostic_periods_reason_period_idx
20697
+ ON ingestion_rejection_diagnostic_periods (
20698
+ rejection_reason,
20699
+ period_starts_at,
20700
+ last_seen_at DESC
20701
+ )
20702
+ `
20703
+ ]
20704
+ }),
20705
+ defineStorageSchemaMigration({
20706
+ id: "202606170001_add_project_color_tags",
20707
+ description: "Add optional project color tags for project metadata and retrieval surfaces.",
20708
+ statements: [
20709
+ "ALTER TABLE projects ADD COLUMN IF NOT EXISTS color_tag text",
20710
+ "ALTER TABLE projects DROP CONSTRAINT IF EXISTS projects_color_tag_check",
20711
+ `
20712
+ ALTER TABLE projects
20713
+ ADD CONSTRAINT projects_color_tag_check
20714
+ CHECK (
20715
+ color_tag IN ('red', 'orange', 'amber', 'yellow', 'lime', 'green', 'emerald', 'teal', 'cyan', 'sky', 'blue', 'indigo', 'violet', 'purple', 'fuchsia', 'pink', 'rose', 'slate')
20716
+ OR color_tag IS NULL
20717
+ )
20718
+ `
20719
+ ]
20553
20720
  })
20554
20721
  ];
20555
20722
 
@@ -20557,7 +20724,7 @@ var STORAGE_SCHEMA_MIGRATIONS = [
20557
20724
  var STORAGE_SCHEMA_MIGRATIONS2 = [
20558
20725
  ...STORAGE_SCHEMA_MIGRATIONS,
20559
20726
  ...AVAILABILITY_CHECK_STORAGE_SCHEMA_MIGRATIONS
20560
- ];
20727
+ ].sort((left, right) => left.id.localeCompare(right.id));
20561
20728
 
20562
20729
  // src/local-retrieval-store.ts
20563
20730
  var CONNECTION_FILE_PATH2 = ".debugbundle/local/connection.json";
@@ -21302,6 +21469,20 @@ var import_promises8 = require("node:fs/promises");
21302
21469
  var import_node_path9 = require("node:path");
21303
21470
 
21304
21471
  // ../../packages/project-management-client/src/index.ts
21472
+ var ProjectColorTagResponseSchema2 = external_exports.unknown().transform((value, context) => {
21473
+ if (value === void 0 || value === null) {
21474
+ return null;
21475
+ }
21476
+ const parsed = ProjectColorTagSchema.safeParse(value);
21477
+ if (!parsed.success) {
21478
+ context.addIssue({
21479
+ code: external_exports.ZodIssueCode.custom,
21480
+ message: "Invalid project color tag"
21481
+ });
21482
+ return external_exports.NEVER;
21483
+ }
21484
+ return parsed.data;
21485
+ });
21305
21486
  var ProjectMetricsSchema = external_exports.object({
21306
21487
  open_incidents: external_exports.number().int().nonnegative().default(0),
21307
21488
  regressed_incidents: external_exports.number().int().nonnegative().default(0),
@@ -21324,6 +21505,7 @@ var ProjectRecordSchema = external_exports.object({
21324
21505
  name: external_exports.string(),
21325
21506
  slug: external_exports.string(),
21326
21507
  environment_default: external_exports.string(),
21508
+ color_tag: ProjectColorTagResponseSchema2,
21327
21509
  organization_plan: external_exports.enum(["free", "solo", "team"]),
21328
21510
  metrics: ProjectMetricsSchema,
21329
21511
  created_at: external_exports.string(),
@@ -21347,6 +21529,7 @@ var DeletedProjectRecordSchema = external_exports.object({
21347
21529
  name: external_exports.string(),
21348
21530
  slug: external_exports.string(),
21349
21531
  environment_default: external_exports.string(),
21532
+ color_tag: ProjectColorTagResponseSchema2,
21350
21533
  organization_plan: external_exports.enum(["free", "solo", "team"]),
21351
21534
  created_at: external_exports.string(),
21352
21535
  updated_at: external_exports.string()
@@ -21373,6 +21556,18 @@ function parseApiError2(status, body) {
21373
21556
  }
21374
21557
  throw new ProjectManagementApiError(status, parsed.data.error);
21375
21558
  }
21559
+ function normalizeProjectRecord(project) {
21560
+ return {
21561
+ ...project,
21562
+ color_tag: project.color_tag
21563
+ };
21564
+ }
21565
+ function normalizeDeletedProjectRecord(project) {
21566
+ return {
21567
+ ...project,
21568
+ color_tag: project.color_tag
21569
+ };
21570
+ }
21376
21571
  async function expectProjects(responsePromise) {
21377
21572
  const response = await responsePromise;
21378
21573
  if (response.status < 200 || response.status >= 300) {
@@ -21382,7 +21577,7 @@ async function expectProjects(responsePromise) {
21382
21577
  if (!parsed.success) {
21383
21578
  throw new ProjectManagementApiError(response.status, "invalid_response_shape");
21384
21579
  }
21385
- return parsed.data.projects;
21580
+ return parsed.data.projects.map(normalizeProjectRecord);
21386
21581
  }
21387
21582
  async function expectProject(responsePromise) {
21388
21583
  const response = await responsePromise;
@@ -21393,7 +21588,7 @@ async function expectProject(responsePromise) {
21393
21588
  if (!parsed.success) {
21394
21589
  throw new ProjectManagementApiError(response.status, "invalid_response_shape");
21395
21590
  }
21396
- return parsed.data.project;
21591
+ return normalizeProjectRecord(parsed.data.project);
21397
21592
  }
21398
21593
  async function expectDeletedProject(responsePromise) {
21399
21594
  const response = await responsePromise;
@@ -21404,7 +21599,7 @@ async function expectDeletedProject(responsePromise) {
21404
21599
  if (!parsed.success) {
21405
21600
  throw new ProjectManagementApiError(response.status, "invalid_response_shape");
21406
21601
  }
21407
- return parsed.data.project;
21602
+ return normalizeDeletedProjectRecord(parsed.data.project);
21408
21603
  }
21409
21604
  function createProjectManagementApi(client) {
21410
21605
  return {
@@ -21427,7 +21622,8 @@ function createProjectManagementApi(client) {
21427
21622
  body: {
21428
21623
  name: input2.name,
21429
21624
  slug: input2.slug,
21430
- ...input2.environmentDefault === void 0 ? {} : { environment_default: input2.environmentDefault }
21625
+ ...input2.environmentDefault === void 0 ? {} : { environment_default: input2.environmentDefault },
21626
+ ...input2.colorTag === void 0 ? {} : { color_tag: input2.colorTag }
21431
21627
  }
21432
21628
  })
21433
21629
  );
@@ -21443,6 +21639,9 @@ function createProjectManagementApi(client) {
21443
21639
  if (input2.environmentDefault !== void 0) {
21444
21640
  body["environment_default"] = input2.environmentDefault;
21445
21641
  }
21642
+ if (input2.colorTag !== void 0) {
21643
+ body["color_tag"] = input2.colorTag;
21644
+ }
21446
21645
  return expectProject(
21447
21646
  client.request({
21448
21647
  method: "PATCH",
@@ -30241,8 +30440,8 @@ var CLI_USAGE_LINES = [
30241
30440
  " debugbundle github deliveries --project-id <id> [--status <status>] [--limit <n>] [--auth-file <path>] [--json]",
30242
30441
  " debugbundle github deliveries retry <delivery-id> --project-id <id> [--auth-file <path>] [--json]",
30243
30442
  " debugbundle project list [--limit <n>] [--auth-file <path>] [--json]",
30244
- " debugbundle project create --name <name> --slug <slug> [--environment-default <env>] [--auth-file <path>] [--json]",
30245
- " debugbundle project update <project-id> [--name <name>] [--slug <slug>] [--environment-default <env>] [--auth-file <path>] [--json]",
30443
+ " debugbundle project create --name <name> --slug <slug> [--environment-default <env>] [--color-tag <tag>] [--auth-file <path>] [--json]",
30444
+ " debugbundle project update <project-id> [--name <name>] [--slug <slug>] [--environment-default <env>] [--color-tag <tag> | --clear-color-tag] [--auth-file <path>] [--json]",
30246
30445
  " debugbundle project delete <project-id> [--auth-file <path>] [--json]",
30247
30446
  " debugbundle token project list <project-id> [--limit <n>] [--auth-file <path>] [--json]",
30248
30447
  " debugbundle token project create <project-id> --label <label> [--allowed-origin <origin> ...] [--auth-file <path>] [--json]",
@@ -30606,7 +30805,7 @@ function parseArgv(argv) {
30606
30805
  positionals.push(token);
30607
30806
  continue;
30608
30807
  }
30609
- if (token === "--fix" || token === "--json" || token === "--check-relay" || token === "--privacy" || token === "--help" || token === "--version" || token === "--non-interactive" || token === "--local" || token === "--cloud" || token === "--events" || token === "--bundles" || token === "--all" || token === "--trigger-5xx" || token === "--expect-app-event" || token === "--github" || token === "--github-cli" || token === "--github-device") {
30808
+ if (token === "--fix" || token === "--json" || token === "--check-relay" || token === "--privacy" || token === "--help" || token === "--version" || token === "--non-interactive" || token === "--local" || token === "--cloud" || token === "--events" || token === "--bundles" || token === "--all" || token === "--trigger-5xx" || token === "--expect-app-event" || token === "--github" || token === "--github-cli" || token === "--github-device" || token === "--clear-color-tag") {
30610
30809
  options.set(token.slice(2), true);
30611
30810
  continue;
30612
30811
  }
@@ -32494,6 +32693,9 @@ async function createProjectCommand(input2, api) {
32494
32693
  if (input2.environmentDefault !== void 0) {
32495
32694
  requestInput.environmentDefault = input2.environmentDefault;
32496
32695
  }
32696
+ if (input2.colorTag !== void 0) {
32697
+ requestInput.colorTag = input2.colorTag;
32698
+ }
32497
32699
  const project = await api.createProject(requestInput);
32498
32700
  return {
32499
32701
  exitCode: 0,
@@ -32518,6 +32720,9 @@ async function updateProjectCommand(input2, api) {
32518
32720
  if (input2.environmentDefault !== void 0) {
32519
32721
  requestInput.environmentDefault = input2.environmentDefault;
32520
32722
  }
32723
+ if (input2.colorTag !== void 0) {
32724
+ requestInput.colorTag = input2.colorTag;
32725
+ }
32521
32726
  const project = await api.updateProject(requestInput);
32522
32727
  return {
32523
32728
  exitCode: 0,
@@ -32574,6 +32779,9 @@ async function createProjectWithAuthCommand(input2, dependencies) {
32574
32779
  if (input2.environmentDefault !== void 0) {
32575
32780
  commandInput.environmentDefault = input2.environmentDefault;
32576
32781
  }
32782
+ if (input2.colorTag !== void 0) {
32783
+ commandInput.colorTag = input2.colorTag;
32784
+ }
32577
32785
  if (input2.json !== void 0) {
32578
32786
  commandInput.json = input2.json;
32579
32787
  }
@@ -32601,6 +32809,9 @@ async function updateProjectWithAuthCommand(input2, dependencies) {
32601
32809
  if (input2.environmentDefault !== void 0) {
32602
32810
  commandInput.environmentDefault = input2.environmentDefault;
32603
32811
  }
32812
+ if (input2.colorTag !== void 0) {
32813
+ commandInput.colorTag = input2.colorTag;
32814
+ }
32604
32815
  if (input2.json !== void 0) {
32605
32816
  commandInput.json = input2.json;
32606
32817
  }
@@ -32903,6 +33114,16 @@ async function revokeMemberTokenWithAuthCommand(input2, dependencies) {
32903
33114
  }
32904
33115
 
32905
33116
  // src/management-billing-project-token-command-handlers.ts
33117
+ function readProjectColorTagOption(parsedArgv) {
33118
+ const colorTag = readStringOption(parsedArgv, "color-tag");
33119
+ if (colorTag === void 0) {
33120
+ return void 0;
33121
+ }
33122
+ if (PROJECT_COLOR_TAG_VALUES.includes(colorTag)) {
33123
+ return colorTag;
33124
+ }
33125
+ throw new CliInputError("Invalid value for --color-tag.");
33126
+ }
32906
33127
  async function handleBillingCommand(parsedArgv, dependencies) {
32907
33128
  const action = requirePositional(parsedArgv, 1, "action");
32908
33129
  if (action === "get") {
@@ -33056,7 +33277,7 @@ async function handleProjectCommand(parsedArgv, dependencies) {
33056
33277
  return await (dependencies.listProjectsCommand ?? listProjectsWithAuthCommand)(input2);
33057
33278
  }
33058
33279
  if (action === "create") {
33059
- expectNoUnknownOptions(parsedArgv, ["auth-file", "json", "name", "slug", "environment-default"]);
33280
+ expectNoUnknownOptions(parsedArgv, ["auth-file", "json", "name", "slug", "environment-default", "color-tag"]);
33060
33281
  ensureNoExtraPositionals(parsedArgv, 2);
33061
33282
  const name = readStringOption(parsedArgv, "name");
33062
33283
  if (name === void 0) {
@@ -33071,10 +33292,14 @@ async function handleProjectCommand(parsedArgv, dependencies) {
33071
33292
  if (environmentDefault !== void 0) {
33072
33293
  input2.environmentDefault = environmentDefault;
33073
33294
  }
33295
+ const colorTag = readProjectColorTagOption(parsedArgv);
33296
+ if (colorTag !== void 0) {
33297
+ input2.colorTag = colorTag;
33298
+ }
33074
33299
  return await (dependencies.createProjectCommand ?? createProjectWithAuthCommand)(input2);
33075
33300
  }
33076
33301
  if (action === "update") {
33077
- expectNoUnknownOptions(parsedArgv, ["auth-file", "json", "name", "slug", "environment-default"]);
33302
+ expectNoUnknownOptions(parsedArgv, ["auth-file", "json", "name", "slug", "environment-default", "color-tag", "clear-color-tag"]);
33078
33303
  ensureNoExtraPositionals(parsedArgv, 3);
33079
33304
  const input2 = appendCommonAuthOptions(parsedArgv, {
33080
33305
  projectId: requirePositional(parsedArgv, 2, "project-id")
@@ -33091,7 +33316,18 @@ async function handleProjectCommand(parsedArgv, dependencies) {
33091
33316
  if (environmentDefault !== void 0) {
33092
33317
  input2.environmentDefault = environmentDefault;
33093
33318
  }
33094
- if (input2.name === void 0 && input2.slug === void 0 && input2.environmentDefault === void 0) {
33319
+ if (readBooleanOption(parsedArgv, "clear-color-tag") === true) {
33320
+ if (readStringOption(parsedArgv, "color-tag") !== void 0) {
33321
+ throw new CliInputError("Use either --color-tag or --clear-color-tag.");
33322
+ }
33323
+ input2.colorTag = null;
33324
+ } else {
33325
+ const colorTag = readProjectColorTagOption(parsedArgv);
33326
+ if (colorTag !== void 0) {
33327
+ input2.colorTag = colorTag;
33328
+ }
33329
+ }
33330
+ if (input2.name === void 0 && input2.slug === void 0 && input2.environmentDefault === void 0 && input2.colorTag === void 0) {
33095
33331
  throw new CliInputError("At least one project field must be provided.");
33096
33332
  }
33097
33333
  return await (dependencies.updateProjectCommand ?? updateProjectWithAuthCommand)(input2);
@@ -36674,7 +36910,7 @@ async function handleCaptureRuleCommand2(parsedArgv, dependencies) {
36674
36910
  // package.json
36675
36911
  var package_default = {
36676
36912
  name: "@debugbundle/cli",
36677
- version: "1.5.1",
36913
+ version: "1.5.2",
36678
36914
  private: false,
36679
36915
  description: "Command-line interface for DebugBundle",
36680
36916
  license: "AGPL-3.0-only",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@debugbundle/cli",
3
- "version": "1.5.1",
3
+ "version": "1.5.2",
4
4
  "private": false,
5
5
  "description": "Command-line interface for DebugBundle",
6
6
  "license": "AGPL-3.0-only",