@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.
- package/dist/main.cjs +173 -4
- 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
|
-
|
|
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
|
|
33739
|
+
version: "1.0.1",
|
|
33571
33740
|
private: false,
|
|
33572
33741
|
description: "Command-line interface for DebugBundle",
|
|
33573
33742
|
license: "AGPL-3.0-only",
|