@memberjunction/cli 6.2.0-edge.6 → 6.2.0-edge.8
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 +73 -0
- package/dist/commands/dev/workspace/clean.d.ts +2 -1
- package/dist/commands/dev/workspace/clean.d.ts.map +1 -1
- package/dist/commands/dev/workspace/clean.js +4 -3
- package/dist/commands/dev/workspace/clean.js.map +1 -1
- package/dist/commands/dev/workspace/doctor.d.ts.map +1 -1
- package/dist/commands/dev/workspace/doctor.js +3 -2
- package/dist/commands/dev/workspace/doctor.js.map +1 -1
- package/dist/commands/dev/workspace/index.d.ts +2 -2
- package/dist/commands/dev/workspace/index.d.ts.map +1 -1
- package/dist/commands/dev/workspace/index.js +12 -9
- package/dist/commands/dev/workspace/index.js.map +1 -1
- package/dist/commands/dev/workspace/status.d.ts +1 -1
- package/dist/commands/dev/workspace/status.js +1 -1
- package/dist/commands/diag/export.d.ts +16 -0
- package/dist/commands/diag/export.d.ts.map +1 -0
- package/dist/commands/diag/export.js +37 -0
- package/dist/commands/diag/export.js.map +1 -0
- package/dist/commands/diag/inspect.d.ts +14 -0
- package/dist/commands/diag/inspect.d.ts.map +1 -0
- package/dist/commands/diag/inspect.js +45 -0
- package/dist/commands/diag/inspect.js.map +1 -0
- package/dist/commands/diag/keygen.d.ts +11 -0
- package/dist/commands/diag/keygen.d.ts.map +1 -0
- package/dist/commands/diag/keygen.js +36 -0
- package/dist/commands/diag/keygen.js.map +1 -0
- package/dist/commands/diag/scrub.d.ts +15 -0
- package/dist/commands/diag/scrub.d.ts.map +1 -0
- package/dist/commands/diag/scrub.js +34 -0
- package/dist/commands/diag/scrub.js.map +1 -0
- package/dist/commands/diag/slow.d.ts +14 -0
- package/dist/commands/diag/slow.d.ts.map +1 -0
- package/dist/commands/diag/slow.js +32 -0
- package/dist/commands/diag/slow.js.map +1 -0
- package/dist/commands/diag/timeline.d.ts +14 -0
- package/dist/commands/diag/timeline.d.ts.map +1 -0
- package/dist/commands/diag/timeline.js +29 -0
- package/dist/commands/diag/timeline.js.map +1 -0
- package/dist/commands/install/index.d.ts +12 -0
- package/dist/commands/install/index.d.ts.map +1 -1
- package/dist/commands/install/index.js +32 -5
- package/dist/commands/install/index.js.map +1 -1
- package/dist/commands/migrate/index.d.ts +26 -6
- package/dist/commands/migrate/index.d.ts.map +1 -1
- package/dist/commands/migrate/index.js +93 -21
- package/dist/commands/migrate/index.js.map +1 -1
- package/dist/commands/query/refresh.d.ts +25 -0
- package/dist/commands/query/refresh.d.ts.map +1 -0
- package/dist/commands/query/refresh.js +67 -0
- package/dist/commands/query/refresh.js.map +1 -0
- package/dist/commands/query/usage.d.ts +7 -0
- package/dist/commands/query/usage.d.ts.map +1 -0
- package/dist/commands/query/usage.js +10 -0
- package/dist/commands/query/usage.js.map +1 -0
- package/dist/commands/test/suite.d.ts +2 -0
- package/dist/commands/test/suite.d.ts.map +1 -1
- package/dist/commands/test/suite.js +10 -0
- package/dist/commands/test/suite.js.map +1 -1
- package/dist/commands/user/clone.d.ts.map +1 -1
- package/dist/commands/user/clone.js +1 -0
- package/dist/commands/user/clone.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +2 -1
- package/dist/config.js.map +1 -1
- package/dist/lib/db-version.d.ts +34 -7
- package/dist/lib/db-version.d.ts.map +1 -1
- package/dist/lib/db-version.js +45 -17
- package/dist/lib/db-version.js.map +1 -1
- package/dist/lib/dev-workspace/build-output.d.ts +22 -0
- package/dist/lib/dev-workspace/build-output.d.ts.map +1 -0
- package/dist/lib/dev-workspace/build-output.js +146 -0
- package/dist/lib/dev-workspace/build-output.js.map +1 -0
- package/dist/lib/dev-workspace/build.d.ts +6 -6
- package/dist/lib/dev-workspace/build.d.ts.map +1 -1
- package/dist/lib/dev-workspace/build.js +16 -23
- package/dist/lib/dev-workspace/build.js.map +1 -1
- package/dist/lib/dev-workspace/clean.d.ts +19 -5
- package/dist/lib/dev-workspace/clean.d.ts.map +1 -1
- package/dist/lib/dev-workspace/clean.js +44 -12
- package/dist/lib/dev-workspace/clean.js.map +1 -1
- package/dist/lib/dev-workspace/detect.d.ts.map +1 -1
- package/dist/lib/dev-workspace/detect.js +0 -2
- package/dist/lib/dev-workspace/detect.js.map +1 -1
- package/dist/lib/dev-workspace/doctor.d.ts.map +1 -1
- package/dist/lib/dev-workspace/doctor.js +63 -5
- package/dist/lib/dev-workspace/doctor.js.map +1 -1
- package/dist/lib/dev-workspace/lockfile.d.ts +9 -1
- package/dist/lib/dev-workspace/lockfile.d.ts.map +1 -1
- package/dist/lib/dev-workspace/lockfile.js +19 -8
- package/dist/lib/dev-workspace/lockfile.js.map +1 -1
- package/dist/lib/dev-workspace/types.d.ts +31 -11
- package/dist/lib/dev-workspace/types.d.ts.map +1 -1
- package/dist/lib/dev-workspace/types.js +2 -2
- package/dist/lib/dev-workspace/write.d.ts +7 -2
- package/dist/lib/dev-workspace/write.d.ts.map +1 -1
- package/dist/lib/dev-workspace/write.js +7 -3
- package/dist/lib/dev-workspace/write.js.map +1 -1
- package/dist/lib/domain-profiles.d.ts.map +1 -1
- package/dist/lib/domain-profiles.js +4 -0
- package/dist/lib/domain-profiles.js.map +1 -1
- package/dist/lib/migration-fetch.d.ts +17 -14
- package/dist/lib/migration-fetch.d.ts.map +1 -1
- package/dist/lib/migration-fetch.js +35 -25
- package/dist/lib/migration-fetch.js.map +1 -1
- package/dist/lib/migration-timeout.d.ts +15 -0
- package/dist/lib/migration-timeout.d.ts.map +1 -0
- package/dist/lib/migration-timeout.js +23 -0
- package/dist/lib/migration-timeout.js.map +1 -0
- package/dist/lib/out-of-order.d.ts +56 -0
- package/dist/lib/out-of-order.d.ts.map +1 -0
- package/dist/lib/out-of-order.js +37 -0
- package/dist/lib/out-of-order.js.map +1 -0
- package/dist/lib/query-refresh.d.ts +23 -0
- package/dist/lib/query-refresh.d.ts.map +1 -0
- package/dist/lib/query-refresh.js +33 -0
- package/dist/lib/query-refresh.js.map +1 -0
- package/dist/light-commands.d.ts.map +1 -1
- package/dist/light-commands.js +13 -0
- package/dist/light-commands.js.map +1 -1
- package/dist/utils/diag-utils.d.ts +34 -0
- package/dist/utils/diag-utils.d.ts.map +1 -0
- package/dist/utils/diag-utils.js +147 -0
- package/dist/utils/diag-utils.js.map +1 -0
- package/oclif.manifest.json +2439 -1974
- package/package.json +28 -26
package/dist/light-commands.js
CHANGED
|
@@ -147,5 +147,18 @@ export const LIGHT_COMMANDS = new Set([
|
|
|
147
147
|
'dbdoc:reset',
|
|
148
148
|
'dbdoc status',
|
|
149
149
|
'dbdoc:status',
|
|
150
|
+
// Diagnostic Bundles offline inspection & keygen - uses @memberjunction/diagnostics (L0, zero bootstrap)
|
|
151
|
+
'diag inspect',
|
|
152
|
+
'diag:inspect',
|
|
153
|
+
'diag scrub',
|
|
154
|
+
'diag:scrub',
|
|
155
|
+
'diag keygen',
|
|
156
|
+
'diag:keygen',
|
|
157
|
+
'diag timeline',
|
|
158
|
+
'diag:timeline',
|
|
159
|
+
'diag slow',
|
|
160
|
+
'diag:slow',
|
|
161
|
+
'diag export',
|
|
162
|
+
'diag:export',
|
|
150
163
|
]);
|
|
151
164
|
//# sourceMappingURL=light-commands.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"light-commands.js","sourceRoot":"","sources":["../src/light-commands.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,cAAc,GAAwB,IAAI,GAAG,CAAC;IACzD,yBAAyB;IACzB,SAAS;IACT,MAAM;IAEN,0EAA0E;IAC1E,qEAAqE;IACrE,OAAO;IACP,YAAY;IACZ,YAAY;IACZ,eAAe;IACf,eAAe;IACf,WAAW;IACX,WAAW;IACX,oFAAoF;IACpF,kFAAkF;IAClF,kFAAkF;IAClF,oFAAoF;IACpF,2CAA2C;IAC3C,UAAU;IACV,UAAU;IACV,aAAa;IACb,aAAa;IACb,WAAW;IACX,WAAW;IACX,iBAAiB;IACjB,iBAAiB;IACjB,gBAAgB;IAChB,gBAAgB;IAChB,YAAY;IACZ,YAAY;IACZ,cAAc;IACd,cAAc;IACd,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,cAAc;IACd,cAAc;IACd,eAAe;IACf,eAAe;IACf,eAAe;IACf,eAAe;IACf,cAAc;IACd,cAAc;IACd,gBAAgB;IAChB,gBAAgB;IAChB,iBAAiB;IACjB,iBAAiB;IACjB,mBAAmB;IACnB,mBAAmB;IACnB,iBAAiB;IACjB,iBAAiB;IACjB,YAAY;IACZ,YAAY;IACZ,qBAAqB;IACrB,qBAAqB;IACrB,cAAc;IACd,cAAc;IAEd,4DAA4D;IAC5D,YAAY;IACZ,YAAY;IAEZ,sCAAsC;IACtC,MAAM;IAEN,2EAA2E;IAC3E,OAAO;IACP,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IAEb,oEAAoE;IACpE,OAAO;IACP,SAAS;IACT,iBAAiB;IACjB,iBAAiB;IACjB,gBAAgB;IAChB,gBAAgB;IAEhB,qFAAqF;IACrF,SAAS;IAET,6EAA6E;IAC7E,QAAQ;IAER,4FAA4F;IAC5F,QAAQ;IAER,kEAAkE;IAClE,IAAI;IACJ,OAAO;IACP,UAAU;IACV,UAAU;IACV,MAAM;IACN,OAAO;IACP,KAAK;IAEL,mEAAmE;IACnE,eAAe;IACf,eAAe;IACf,sBAAsB;IACtB,sBAAsB;IACtB,sBAAsB;IACtB,sBAAsB;IACtB,qBAAqB;IACrB,qBAAqB;IAErB,gFAAgF;IAChF,aAAa;IACb,WAAW;IAEX,8EAA8E;IAC9E,oCAAoC;IACpC,gBAAgB;IAChB,eAAe;IAEf,kGAAkG;IAClG,yFAAyF;IACzF,+FAA+F;IAC/F,kBAAkB;IAClB,kBAAkB;IAElB,0DAA0D;IAC1D,YAAY;IACZ,YAAY;IACZ,eAAe;IACf,eAAe;IACf,cAAc;IACd,cAAc;IACd,6BAA6B;IAC7B,6BAA6B;IAC7B,wBAAwB;IACxB,wBAAwB;IACxB,aAAa;IACb,aAAa;IACb,cAAc;IACd,cAAc;
|
|
1
|
+
{"version":3,"file":"light-commands.js","sourceRoot":"","sources":["../src/light-commands.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,cAAc,GAAwB,IAAI,GAAG,CAAC;IACzD,yBAAyB;IACzB,SAAS;IACT,MAAM;IAEN,0EAA0E;IAC1E,qEAAqE;IACrE,OAAO;IACP,YAAY;IACZ,YAAY;IACZ,eAAe;IACf,eAAe;IACf,WAAW;IACX,WAAW;IACX,oFAAoF;IACpF,kFAAkF;IAClF,kFAAkF;IAClF,oFAAoF;IACpF,2CAA2C;IAC3C,UAAU;IACV,UAAU;IACV,aAAa;IACb,aAAa;IACb,WAAW;IACX,WAAW;IACX,iBAAiB;IACjB,iBAAiB;IACjB,gBAAgB;IAChB,gBAAgB;IAChB,YAAY;IACZ,YAAY;IACZ,cAAc;IACd,cAAc;IACd,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,cAAc;IACd,cAAc;IACd,eAAe;IACf,eAAe;IACf,eAAe;IACf,eAAe;IACf,cAAc;IACd,cAAc;IACd,gBAAgB;IAChB,gBAAgB;IAChB,iBAAiB;IACjB,iBAAiB;IACjB,mBAAmB;IACnB,mBAAmB;IACnB,iBAAiB;IACjB,iBAAiB;IACjB,YAAY;IACZ,YAAY;IACZ,qBAAqB;IACrB,qBAAqB;IACrB,cAAc;IACd,cAAc;IAEd,4DAA4D;IAC5D,YAAY;IACZ,YAAY;IAEZ,sCAAsC;IACtC,MAAM;IAEN,2EAA2E;IAC3E,OAAO;IACP,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IAEb,oEAAoE;IACpE,OAAO;IACP,SAAS;IACT,iBAAiB;IACjB,iBAAiB;IACjB,gBAAgB;IAChB,gBAAgB;IAEhB,qFAAqF;IACrF,SAAS;IAET,6EAA6E;IAC7E,QAAQ;IAER,4FAA4F;IAC5F,QAAQ;IAER,kEAAkE;IAClE,IAAI;IACJ,OAAO;IACP,UAAU;IACV,UAAU;IACV,MAAM;IACN,OAAO;IACP,KAAK;IAEL,mEAAmE;IACnE,eAAe;IACf,eAAe;IACf,sBAAsB;IACtB,sBAAsB;IACtB,sBAAsB;IACtB,sBAAsB;IACtB,qBAAqB;IACrB,qBAAqB;IAErB,gFAAgF;IAChF,aAAa;IACb,WAAW;IAEX,8EAA8E;IAC9E,oCAAoC;IACpC,gBAAgB;IAChB,eAAe;IAEf,kGAAkG;IAClG,yFAAyF;IACzF,+FAA+F;IAC/F,kBAAkB;IAClB,kBAAkB;IAElB,0DAA0D;IAC1D,YAAY;IACZ,YAAY;IACZ,eAAe;IACf,eAAe;IACf,cAAc;IACd,cAAc;IACd,6BAA6B;IAC7B,6BAA6B;IAC7B,wBAAwB;IACxB,wBAAwB;IACxB,aAAa;IACb,aAAa;IACb,cAAc;IACd,cAAc;IAEd,yGAAyG;IACzG,cAAc;IACd,cAAc;IACd,YAAY;IACZ,YAAY;IACZ,aAAa;IACb,aAAa;IACb,eAAe;IACf,eAAe;IACf,WAAW;IACX,WAAW;IACX,aAAa;IACb,aAAa;CACd,CAAC,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { type DiagnosticBundleData, type DiagnosticBundleManifest, type DiagnosticScrubberProfile } from '@memberjunction/diagnostics';
|
|
2
|
+
/** Environment variable that holds the base64 PKCS#8 X25519 private key for encrypted bundles. */
|
|
3
|
+
export declare const DIAG_PRIVATE_KEY_ENV_VAR = "MJ_DIAG_PRIVATE_KEY";
|
|
4
|
+
/** Private key flags shared by the `mj diag` commands that read bundles. */
|
|
5
|
+
export declare const DiagPrivateKeyFlags: {
|
|
6
|
+
'private-key': import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
7
|
+
'private-key-file': import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
8
|
+
};
|
|
9
|
+
export interface DiagPrivateKeyFlagValues {
|
|
10
|
+
'private-key'?: string;
|
|
11
|
+
'private-key-file'?: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Returns the private key from `--private-key`, then `--private-key-file`, then `MJ_DIAG_PRIVATE_KEY`.
|
|
15
|
+
* Returns undefined when none is given. Throws when the key file cannot be read or is empty.
|
|
16
|
+
*/
|
|
17
|
+
export declare function ResolveDiagnosticPrivateKey(flags: DiagPrivateKeyFlagValues, env?: NodeJS.ProcessEnv): string | undefined;
|
|
18
|
+
export interface LoadedDiagnosticBundle {
|
|
19
|
+
WasEncrypted: boolean;
|
|
20
|
+
Manifest: DiagnosticBundleManifest;
|
|
21
|
+
Data: DiagnosticBundleData;
|
|
22
|
+
}
|
|
23
|
+
export declare function LoadAndVerifyDiagnosticBundle(filePath: string, recipientPrivateKeyBase64?: string): Promise<LoadedDiagnosticBundle>;
|
|
24
|
+
export declare function RescrubDiagnosticBundle(manifest: DiagnosticBundleManifest, data: DiagnosticBundleData, profile: DiagnosticScrubberProfile): Promise<Uint8Array>;
|
|
25
|
+
export interface TimelineRow {
|
|
26
|
+
TimestampUnixMs: number;
|
|
27
|
+
Source: 'client-span' | 'server-span' | 'sql' | 'breadcrumb';
|
|
28
|
+
DurationMs: number;
|
|
29
|
+
Label: string;
|
|
30
|
+
}
|
|
31
|
+
export declare function BuildBundleTimeline(data: DiagnosticBundleData, limit?: number): TimelineRow[];
|
|
32
|
+
export declare function FindSlowBundleOperations(data: DiagnosticBundleData, thresholdMs?: number): TimelineRow[];
|
|
33
|
+
export declare function ExportBundleTraces(data: DiagnosticBundleData, format: 'perfetto' | 'otlp'): string;
|
|
34
|
+
//# sourceMappingURL=diag-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diag-utils.d.ts","sourceRoot":"","sources":["../../src/utils/diag-utils.ts"],"names":[],"mappings":"AAEA,OAAO,EAUH,KAAK,oBAAoB,EACzB,KAAK,wBAAwB,EAC7B,KAAK,yBAAyB,EACjC,MAAM,6BAA6B,CAAC;AAErC,kGAAkG;AAClG,eAAO,MAAM,wBAAwB,wBAAwB,CAAC;AAE9D,4EAA4E;AAC5E,eAAO,MAAM,mBAAmB;;;CAQ/B,CAAC;AAEF,MAAM,WAAW,wBAAwB;IACrC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CACvC,KAAK,EAAE,wBAAwB,EAC/B,GAAG,GAAE,MAAM,CAAC,UAAwB,GACrC,MAAM,GAAG,SAAS,CAqBpB;AAED,MAAM,WAAW,sBAAsB;IACnC,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,wBAAwB,CAAC;IACnC,IAAI,EAAE,oBAAoB,CAAC;CAC9B;AAED,wBAAsB,6BAA6B,CAC/C,QAAQ,EAAE,MAAM,EAChB,yBAAyB,CAAC,EAAE,MAAM,GACnC,OAAO,CAAC,sBAAsB,CAAC,CAoCjC;AAED,wBAAsB,uBAAuB,CACzC,QAAQ,EAAE,wBAAwB,EAClC,IAAI,EAAE,oBAAoB,EAC1B,OAAO,EAAE,yBAAyB,GACnC,OAAO,CAAC,UAAU,CAAC,CAarB;AAED,MAAM,WAAW,WAAW;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,aAAa,GAAG,aAAa,GAAG,KAAK,GAAG,YAAY,CAAC;IAC7D,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACjB;AAeD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,oBAAoB,EAAE,KAAK,SAAK,GAAG,WAAW,EAAE,CAsCzF;AAED,wBAAgB,wBAAwB,CACpC,IAAI,EAAE,oBAAoB,EAC1B,WAAW,SAAM,GAClB,WAAW,EAAE,CAKf;AAED,wBAAgB,kBAAkB,CAC9B,IAAI,EAAE,oBAAoB,EAC1B,MAAM,EAAE,UAAU,GAAG,MAAM,GAC5B,MAAM,CAKR"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import * as fs from 'node:fs';
|
|
2
|
+
import { Flags } from '@oclif/core';
|
|
3
|
+
import { BuildMjdiagArchive, VerifyBundleArchive, ParseBundleDataFromArchive, DecryptDiagnosticBundle, InspectEncryptedEnvelopeHeader, ScrubBundleDataWithCount, ExportToPerfettoTrace, ExportToOtlpJson, } from '@memberjunction/diagnostics';
|
|
4
|
+
/** Environment variable that holds the base64 PKCS#8 X25519 private key for encrypted bundles. */
|
|
5
|
+
export const DIAG_PRIVATE_KEY_ENV_VAR = 'MJ_DIAG_PRIVATE_KEY';
|
|
6
|
+
/** Private key flags shared by the `mj diag` commands that read bundles. */
|
|
7
|
+
export const DiagPrivateKeyFlags = {
|
|
8
|
+
'private-key': Flags.string({
|
|
9
|
+
description: 'Base64 PKCS#8 X25519 private key for an encrypted MJDB envelope. The value is visible to other processes and stays in shell history; prefer --private-key-file or MJ_DIAG_PRIVATE_KEY',
|
|
10
|
+
}),
|
|
11
|
+
'private-key-file': Flags.string({
|
|
12
|
+
description: 'Path to a file that holds the base64 PKCS#8 X25519 private key for an encrypted MJDB envelope',
|
|
13
|
+
}),
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Returns the private key from `--private-key`, then `--private-key-file`, then `MJ_DIAG_PRIVATE_KEY`.
|
|
17
|
+
* Returns undefined when none is given. Throws when the key file cannot be read or is empty.
|
|
18
|
+
*/
|
|
19
|
+
export function ResolveDiagnosticPrivateKey(flags, env = process.env) {
|
|
20
|
+
if (flags['private-key']) {
|
|
21
|
+
return flags['private-key'];
|
|
22
|
+
}
|
|
23
|
+
const keyFile = flags['private-key-file'];
|
|
24
|
+
if (keyFile) {
|
|
25
|
+
let fileText;
|
|
26
|
+
try {
|
|
27
|
+
fileText = fs.readFileSync(keyFile, 'utf8');
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
31
|
+
throw new Error(`Cannot read the private key file "${keyFile}": ${reason}`);
|
|
32
|
+
}
|
|
33
|
+
const key = fileText.trim();
|
|
34
|
+
if (!key) {
|
|
35
|
+
throw new Error(`The private key file "${keyFile}" is empty.`);
|
|
36
|
+
}
|
|
37
|
+
return key;
|
|
38
|
+
}
|
|
39
|
+
const envKey = env[DIAG_PRIVATE_KEY_ENV_VAR]?.trim();
|
|
40
|
+
return envKey ? envKey : undefined;
|
|
41
|
+
}
|
|
42
|
+
export async function LoadAndVerifyDiagnosticBundle(filePath, recipientPrivateKeyBase64) {
|
|
43
|
+
const rawBytes = new Uint8Array(fs.readFileSync(filePath));
|
|
44
|
+
const envelopeCheck = InspectEncryptedEnvelopeHeader(rawBytes);
|
|
45
|
+
let zipBytes = rawBytes;
|
|
46
|
+
let wasEncrypted = false;
|
|
47
|
+
if (envelopeCheck.valid && envelopeCheck.header) {
|
|
48
|
+
if (!recipientPrivateKeyBase64) {
|
|
49
|
+
throw new Error(`File "${filePath}" is an encrypted MJDB envelope (recipientKeyId=${envelopeCheck.header.recipientKeyId}). Pass --private-key-file, set ${DIAG_PRIVATE_KEY_ENV_VAR}, or pass --private-key to decrypt.`);
|
|
50
|
+
}
|
|
51
|
+
const decrypted = await DecryptDiagnosticBundle(rawBytes, {
|
|
52
|
+
PrivateKeysByKeyId: {
|
|
53
|
+
[envelopeCheck.header.recipientKeyId]: recipientPrivateKeyBase64,
|
|
54
|
+
},
|
|
55
|
+
});
|
|
56
|
+
if (!decrypted.valid || !decrypted.decryptedZipBytes) {
|
|
57
|
+
throw new Error(`Failed to decrypt "${filePath}": ${decrypted.reason}`);
|
|
58
|
+
}
|
|
59
|
+
zipBytes = decrypted.decryptedZipBytes;
|
|
60
|
+
wasEncrypted = true;
|
|
61
|
+
}
|
|
62
|
+
const verification = await VerifyBundleArchive(zipBytes);
|
|
63
|
+
if (!verification.valid || !verification.manifest) {
|
|
64
|
+
throw new Error(`Invalid .mjdiag bundle "${filePath}": ${verification.reason}`);
|
|
65
|
+
}
|
|
66
|
+
const data = ParseBundleDataFromArchive(verification);
|
|
67
|
+
return {
|
|
68
|
+
WasEncrypted: wasEncrypted,
|
|
69
|
+
Manifest: verification.manifest,
|
|
70
|
+
Data: data,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
export async function RescrubDiagnosticBundle(manifest, data, profile) {
|
|
74
|
+
const scrubbed = ScrubBundleDataWithCount(data, profile);
|
|
75
|
+
return BuildMjdiagArchive(scrubbed.Data, {
|
|
76
|
+
bundleId: manifest.bundleId,
|
|
77
|
+
sessionId: manifest.sessionId,
|
|
78
|
+
captureReason: manifest.captureReason,
|
|
79
|
+
scrubberProfile: profile,
|
|
80
|
+
redactionSummary: {
|
|
81
|
+
credentialsScrubbedCount: scrubbed.CredentialsScrubbedCount,
|
|
82
|
+
sqlLiteralsNormalizedCount: profile === 'Standard' ? scrubbed.Data.serverSql.length : 0,
|
|
83
|
+
customPatternsAppliedCount: 0,
|
|
84
|
+
},
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
/** Milliseconds since the epoch for an ISO timestamp, or 0 when it does not parse. */
|
|
88
|
+
function isoToUnixMs(timestamp) {
|
|
89
|
+
const parsedMs = Date.parse(timestamp);
|
|
90
|
+
return Number.isNaN(parsedMs) ? 0 : parsedMs;
|
|
91
|
+
}
|
|
92
|
+
/** `[type] target (detail) on route` for a breadcrumb. The route is left out when it is the target. */
|
|
93
|
+
function breadcrumbLabel(crumb) {
|
|
94
|
+
const detail = crumb.detail ? ` (${crumb.detail})` : '';
|
|
95
|
+
const route = crumb.route && crumb.route !== crumb.target ? ` on ${crumb.route}` : '';
|
|
96
|
+
return `[${crumb.type ?? crumb.kind ?? 'step'}] ${crumb.target}${detail}${route}`;
|
|
97
|
+
}
|
|
98
|
+
export function BuildBundleTimeline(data, limit = 50) {
|
|
99
|
+
const rows = [];
|
|
100
|
+
for (const wf of data.clientWaterfall) {
|
|
101
|
+
rows.push({
|
|
102
|
+
TimestampUnixMs: wf.startTimeUnixMs,
|
|
103
|
+
Source: 'client-span',
|
|
104
|
+
DurationMs: wf.durationMs,
|
|
105
|
+
Label: `[${wf.operationKind}] ${wf.operationName}`,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
for (const s of data.serverTraces) {
|
|
109
|
+
rows.push({
|
|
110
|
+
TimestampUnixMs: s.startTimeUnixMs,
|
|
111
|
+
Source: 'server-span',
|
|
112
|
+
DurationMs: s.durationMs,
|
|
113
|
+
Label: `[${s.layer}] ${s.name}`,
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
for (const q of data.serverSql) {
|
|
117
|
+
rows.push({
|
|
118
|
+
TimestampUnixMs: isoToUnixMs(q.timestamp),
|
|
119
|
+
Source: 'sql',
|
|
120
|
+
DurationMs: q.durationMs,
|
|
121
|
+
Label: q.sql,
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
for (const crumb of data.repro.breadcrumbs) {
|
|
125
|
+
rows.push({
|
|
126
|
+
TimestampUnixMs: isoToUnixMs(crumb.timestamp),
|
|
127
|
+
Source: 'breadcrumb',
|
|
128
|
+
DurationMs: 0,
|
|
129
|
+
Label: breadcrumbLabel(crumb),
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
rows.sort((a, b) => a.TimestampUnixMs - b.TimestampUnixMs);
|
|
133
|
+
return rows.slice(0, limit);
|
|
134
|
+
}
|
|
135
|
+
export function FindSlowBundleOperations(data, thresholdMs = 500) {
|
|
136
|
+
const all = BuildBundleTimeline(data, Number.MAX_SAFE_INTEGER);
|
|
137
|
+
return all
|
|
138
|
+
.filter((r) => r.DurationMs >= thresholdMs)
|
|
139
|
+
.sort((a, b) => b.DurationMs - a.DurationMs);
|
|
140
|
+
}
|
|
141
|
+
export function ExportBundleTraces(data, format) {
|
|
142
|
+
if (format === 'perfetto') {
|
|
143
|
+
return JSON.stringify(ExportToPerfettoTrace(data), null, 2);
|
|
144
|
+
}
|
|
145
|
+
return JSON.stringify(ExportToOtlpJson(data), null, 2);
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=diag-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diag-utils.js","sourceRoot":"","sources":["../../src/utils/diag-utils.ts"],"names":[],"mappings":"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"}
|