@debugbundle/cli 0.1.10 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/main.cjs +173 -4
  2. package/package.json +1 -1
package/dist/main.cjs CHANGED
@@ -16768,7 +16768,8 @@ function createRetrievalApi(client) {
16768
16768
  BundleSchema,
16769
16769
  external_exports.object({
16770
16770
  status: external_exports.literal("failed"),
16771
- reason: external_exports.string()
16771
+ reason: external_exports.string(),
16772
+ related_incident_ids: external_exports.array(external_exports.string()).optional()
16772
16773
  }).strict()
16773
16774
  ])
16774
16775
  );
@@ -17176,11 +17177,129 @@ var ISO_TIMESTAMP_PATTERN = /\b\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?Z\b/
17176
17177
  var IPV4_PATTERN = /\b(?:\d{1,3}\.){3}\d{1,3}\b/g;
17177
17178
  var HEX_PATTERN = /\b0x[0-9a-f]+\b/gi;
17178
17179
  var BARE_HEX_PATTERN = /\b(?=[0-9a-f]{8,}\b)(?=[0-9a-f]*[a-f])[0-9a-f]+\b/gi;
17180
+ var LONG_ALPHANUMERIC_TOKEN_PATTERN = /\b(?=[A-Za-z0-9_-]{16,}\b)(?=[A-Za-z0-9_-]*[A-Za-z])(?=[A-Za-z0-9_-]*\d)[A-Za-z0-9_-]+\b/g;
17179
17181
  var LARGE_NUMBER_PATTERN = /\b\d{2,}\b/g;
17180
17182
  var DYNAMIC_SEGMENT_PATTERN = /^(?:\d+|[0-9a-f]{8}-[0-9a-f-]{27}|[A-Za-z0-9_-]{24,})$/;
17181
17183
  var FRAME_NOISE_PATTERNS = ["node_modules/", "vendor/", "site-packages/", ".venv/"];
17184
+ var KNOWN_DATABASE_MESSAGE_FAMILIES = [
17185
+ {
17186
+ summary: "PostgreSQL access rejected by pg_hba.conf",
17187
+ when: (message) => looksLikePostgresMessage(message) && message.includes("pg_hba.conf")
17188
+ },
17189
+ {
17190
+ summary: "PostgreSQL authentication failed",
17191
+ when: (message) => looksLikePostgresMessage(message) && (message.includes("password authentication failed") || message.includes("authentication failed for user"))
17192
+ },
17193
+ {
17194
+ summary: "PostgreSQL host resolution failed",
17195
+ when: (message) => looksLikePostgresMessage(message) && (message.includes("could not translate host name") || message.includes("getaddrinfo enotfound"))
17196
+ },
17197
+ {
17198
+ summary: "PostgreSQL connection timed out",
17199
+ when: (message) => looksLikePostgresMessage(message) && (message.includes("connection timed out") || message.includes("timeout expired") || message.includes("etimedout"))
17200
+ },
17201
+ {
17202
+ summary: "PostgreSQL connection limit reached",
17203
+ when: (message) => looksLikePostgresMessage(message) && (message.includes("too many connections") || message.includes("remaining connection slots are reserved"))
17204
+ },
17205
+ {
17206
+ summary: "PostgreSQL database does not exist",
17207
+ when: (message) => looksLikePostgresMessage(message) && message.includes("does not exist")
17208
+ },
17209
+ {
17210
+ summary: "PostgreSQL connection refused",
17211
+ when: (message) => looksLikePostgresMessage(message) && message.includes("connection refused")
17212
+ },
17213
+ {
17214
+ summary: "MySQL authentication failed",
17215
+ when: (message) => looksLikeMySqlMessage(message) && (message.includes("access denied for user") || message.includes("authentication failed"))
17216
+ },
17217
+ {
17218
+ summary: "MySQL connection refused",
17219
+ when: (message) => looksLikeMySqlMessage(message) && (message.includes("connection refused") || message.includes("can't connect to mysql server"))
17220
+ },
17221
+ {
17222
+ summary: "MySQL connection dropped",
17223
+ when: (message) => looksLikeMySqlMessage(message) && message.includes("server has gone away")
17224
+ },
17225
+ {
17226
+ summary: "MySQL connection limit reached",
17227
+ when: (message) => looksLikeMySqlMessage(message) && message.includes("too many connections")
17228
+ },
17229
+ {
17230
+ summary: "MySQL database does not exist",
17231
+ when: (message) => looksLikeMySqlMessage(message) && message.includes("unknown database")
17232
+ },
17233
+ {
17234
+ summary: "MongoDB authentication failed",
17235
+ when: (message) => looksLikeMongoMessage(message) && message.includes("authentication failed")
17236
+ },
17237
+ {
17238
+ summary: "MongoDB host resolution failed",
17239
+ when: (message) => looksLikeMongoMessage(message) && (message.includes("getaddrinfo enotfound") || message.includes("ename not found"))
17240
+ },
17241
+ {
17242
+ summary: "MongoDB connection timed out",
17243
+ when: (message) => looksLikeMongoMessage(message) && (message.includes("connection timed out") || message.includes("etimedout") || message.includes("server selection timed out"))
17244
+ },
17245
+ {
17246
+ summary: "MongoDB connection refused",
17247
+ when: (message) => looksLikeMongoMessage(message) && message.includes("connection refused")
17248
+ },
17249
+ {
17250
+ summary: "Redis authentication failed",
17251
+ when: (message) => looksLikeRedisMessage(message) && message.includes("wrongpass")
17252
+ },
17253
+ {
17254
+ summary: "Redis replica is read-only",
17255
+ when: (message) => looksLikeRedisMessage(message) && message.includes("readonly")
17256
+ },
17257
+ {
17258
+ summary: "Redis host resolution failed",
17259
+ when: (message) => looksLikeRedisMessage(message) && (message.includes("getaddrinfo enotfound") || message.includes("ename not found"))
17260
+ },
17261
+ {
17262
+ summary: "Redis connection timed out",
17263
+ when: (message) => looksLikeRedisMessage(message) && (message.includes("connection timed out") || message.includes("etimedout") || message.includes("timeout"))
17264
+ },
17265
+ {
17266
+ summary: "Redis connection refused",
17267
+ when: (message) => looksLikeRedisMessage(message) && message.includes("connection refused")
17268
+ }
17269
+ ];
17270
+ function looksLikePostgresMessage(message) {
17271
+ return message.includes("postgres") || message.includes("pgsql") || message.includes("pg_hba.conf") || message.includes("connection to server at");
17272
+ }
17273
+ function looksLikeMySqlMessage(message) {
17274
+ return message.includes("mysql") || message.includes("mariadb");
17275
+ }
17276
+ function looksLikeMongoMessage(message) {
17277
+ return message.includes("mongodb") || message.includes("mongoserver") || message.includes("mongo");
17278
+ }
17279
+ function looksLikeRedisMessage(message) {
17280
+ return message.includes("redis");
17281
+ }
17282
+ function normalizeScalarTokens(message) {
17283
+ return message.replace(UUID_PATTERN, "{dynamic}").replace(EMAIL_PATTERN, "{dynamic}").replace(ISO_TIMESTAMP_PATTERN, "{dynamic}").replace(IPV4_PATTERN, "{dynamic}").replace(HEX_PATTERN, "{dynamic}").replace(BARE_HEX_PATTERN, "{dynamic}").replace(LONG_ALPHANUMERIC_TOKEN_PATTERN, "{dynamic}").replace(LARGE_NUMBER_PATTERN, "{dynamic}");
17284
+ }
17285
+ function collapseWhitespace(message) {
17286
+ return message.replace(/\s+/g, " ").trim();
17287
+ }
17288
+ function normalizeKnownDatabaseMessage(message) {
17289
+ const lowerMessage = message.toLowerCase();
17290
+ for (const family of KNOWN_DATABASE_MESSAGE_FAMILIES) {
17291
+ if (family.when(lowerMessage)) {
17292
+ return family.summary;
17293
+ }
17294
+ }
17295
+ return null;
17296
+ }
17182
17297
  function normalizeMessage(message) {
17183
- return message.replace(UUID_PATTERN, "{dynamic}").replace(EMAIL_PATTERN, "{dynamic}").replace(ISO_TIMESTAMP_PATTERN, "{dynamic}").replace(IPV4_PATTERN, "{dynamic}").replace(HEX_PATTERN, "{dynamic}").replace(BARE_HEX_PATTERN, "{dynamic}").replace(LARGE_NUMBER_PATTERN, "{dynamic}");
17298
+ const knownDatabaseMessage = normalizeKnownDatabaseMessage(message);
17299
+ if (knownDatabaseMessage !== null) {
17300
+ return knownDatabaseMessage;
17301
+ }
17302
+ return collapseWhitespace(normalizeScalarTokens(message));
17184
17303
  }
17185
17304
  function normalizeRoute(path) {
17186
17305
  if (path === null || path.length === 0) {
@@ -17405,6 +17524,7 @@ function classifyEvent(eventType, logLevel, probeActivationId, payload, captureP
17405
17524
 
17406
17525
  // ../../packages/storage/src/redis-queue.ts
17407
17526
  var import_ioredis4 = __toESM(require_built3(), 1);
17527
+ var DEFAULT_PROCESSING_TIMEOUT_MS = 5 * 60 * 1e3;
17408
17528
 
17409
17529
  // ../../packages/storage/src/schema-migrations.ts
17410
17530
  var import_node_crypto2 = require("node:crypto");
@@ -28204,7 +28324,8 @@ var CLI_USAGE_LINES = [
28204
28324
  " debugbundle project members invite --project-id <id> --email <email> --role <admin|member> [--auth-file <path>] [--json]",
28205
28325
  " debugbundle project members cancel-invite <invite-id> --project-id <id> [--auth-file <path>] [--json]",
28206
28326
  " debugbundle project members update-role <user-id> --project-id <id> --role <admin|member> [--auth-file <path>] [--json]",
28207
- " debugbundle project members remove <user-id> --project-id <id> [--auth-file <path>] [--json]"
28327
+ " debugbundle project members remove <user-id> --project-id <id> [--auth-file <path>] [--json]",
28328
+ " debugbundle project members leave --project-id <id> [--auth-file <path>] [--json]"
28208
28329
  ];
28209
28330
  function formatUsage() {
28210
28331
  return CLI_USAGE_LINES.join("\n");
@@ -31264,6 +31385,17 @@ function createMemberApi(httpClient) {
31264
31385
  throw toApiError4(response.status, response.body);
31265
31386
  }
31266
31387
  return response.body;
31388
+ },
31389
+ async leaveProject(input2) {
31390
+ const response = await httpClient.request({
31391
+ method: "DELETE",
31392
+ path: `/v1/projects/${input2.projectId}/membership`,
31393
+ bearerToken: input2.bearerToken
31394
+ });
31395
+ if (response.status !== 200) {
31396
+ throw toApiError4(response.status, response.body);
31397
+ }
31398
+ return response.body;
31267
31399
  }
31268
31400
  };
31269
31401
  }
@@ -31391,6 +31523,20 @@ async function removeMemberCommand(input2, api) {
31391
31523
  };
31392
31524
  }
31393
31525
  }
31526
+ async function leaveProjectCommand(input2, api) {
31527
+ try {
31528
+ const result = await api.leaveProject({ bearerToken: input2.bearerToken, projectId: input2.projectId });
31529
+ return {
31530
+ exitCode: 0,
31531
+ output: input2.json ? JSON.stringify(result) : `Left project: ${input2.projectId}`
31532
+ };
31533
+ } catch (error) {
31534
+ return {
31535
+ exitCode: mapErrorToExitCode15(error),
31536
+ output: error instanceof MemberApiError ? error.code : String(error)
31537
+ };
31538
+ }
31539
+ }
31394
31540
  async function createAuthenticatedMemberApi(input2, dependencies) {
31395
31541
  const readAuth = dependencies?.readAuthState ?? readCliAuthState;
31396
31542
  const authStateInput = {};
@@ -31485,6 +31631,20 @@ async function removeMemberWithAuthCommand(input2, dependencies) {
31485
31631
  )
31486
31632
  });
31487
31633
  }
31634
+ async function leaveProjectWithAuthCommand(input2, dependencies) {
31635
+ return runAuthenticatedCliCommand(input2, {
31636
+ createApi: createAuthenticatedMemberApi,
31637
+ dependencies,
31638
+ runCommand: (authState, api) => leaveProjectCommand(
31639
+ {
31640
+ bearerToken: authState.bearer_token,
31641
+ projectId: input2.projectId,
31642
+ ...input2.json === void 0 ? {} : { json: input2.json }
31643
+ },
31644
+ api
31645
+ )
31646
+ });
31647
+ }
31488
31648
 
31489
31649
  // src/probe-commands.ts
31490
31650
  var ProbeApiError = class extends Error {
@@ -32510,6 +32670,15 @@ async function handleProjectCommand(parsedArgv, dependencies) {
32510
32670
  })
32511
32671
  );
32512
32672
  }
32673
+ if (membersAction === "leave") {
32674
+ expectNoUnknownOptions(parsedArgv, ["auth-file", "json", "project-id"]);
32675
+ ensureNoExtraPositionals(parsedArgv, 3);
32676
+ return await (dependencies.leaveProjectCommand ?? leaveProjectWithAuthCommand)(
32677
+ appendCommonAuthOptions(parsedArgv, {
32678
+ projectId
32679
+ })
32680
+ );
32681
+ }
32513
32682
  throw new CliInputError("Unknown project members command.");
32514
32683
  }
32515
32684
  if (action === "list") {
@@ -33567,7 +33736,7 @@ async function handleCaptureRuleCommand2(parsedArgv, dependencies) {
33567
33736
  // package.json
33568
33737
  var package_default = {
33569
33738
  name: "@debugbundle/cli",
33570
- version: "0.1.10",
33739
+ version: "1.0.1",
33571
33740
  private: false,
33572
33741
  description: "Command-line interface for DebugBundle",
33573
33742
  license: "AGPL-3.0-only",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@debugbundle/cli",
3
- "version": "0.1.10",
3
+ "version": "1.0.1",
4
4
  "private": false,
5
5
  "description": "Command-line interface for DebugBundle",
6
6
  "license": "AGPL-3.0-only",