vaspera 2.15.0 → 2.16.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/CHANGELOG.md +17 -0
- package/dist/index.js +10 -1
- package/dist/index.js.map +1 -1
- package/dist/telemetry/install-id.d.ts +25 -0
- package/dist/telemetry/install-id.d.ts.map +1 -0
- package/dist/telemetry/install-id.js +49 -0
- package/dist/telemetry/install-id.js.map +1 -0
- package/dist/telemetry/usage.d.ts +19 -2
- package/dist/telemetry/usage.d.ts.map +1 -1
- package/dist/telemetry/usage.js +44 -8
- package/dist/telemetry/usage.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Anonymous installation identifier.
|
|
3
|
+
*
|
|
4
|
+
* A random UUID persisted once at ~/.vaspera/install-id, used only to count
|
|
5
|
+
* unique installations and active installs in aggregate. It is NOT tied to any
|
|
6
|
+
* user, machine fingerprint, repo, or source code — it is a random value the
|
|
7
|
+
* install generates for itself. See TELEMETRY.md.
|
|
8
|
+
*
|
|
9
|
+
* @module telemetry/install-id
|
|
10
|
+
*/
|
|
11
|
+
export interface InstallIdentity {
|
|
12
|
+
/** Random anonymous install UUID. */
|
|
13
|
+
installId: string;
|
|
14
|
+
/** True only on the run that first created the id (used for the first-run notice). */
|
|
15
|
+
isFirstRun: boolean;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Get (or lazily create) the anonymous install id. Idempotent within a process.
|
|
19
|
+
* Degrades to an ephemeral id if the filesystem is not writable, in which case
|
|
20
|
+
* isFirstRun is false so we never repeatedly show the notice or imply a new install.
|
|
21
|
+
*/
|
|
22
|
+
export declare function getInstallIdentity(): InstallIdentity;
|
|
23
|
+
/** Convenience accessor for just the id. */
|
|
24
|
+
export declare function getInstallId(): string;
|
|
25
|
+
//# sourceMappingURL=install-id.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-id.d.ts","sourceRoot":"","sources":["../../src/telemetry/install-id.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAUH,MAAM,WAAW,eAAe;IAC9B,qCAAqC;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,sFAAsF;IACtF,UAAU,EAAE,OAAO,CAAC;CACrB;AAID;;;;GAIG;AACH,wBAAgB,kBAAkB,IAAI,eAAe,CAoBpD;AAED,4CAA4C;AAC5C,wBAAgB,YAAY,IAAI,MAAM,CAErC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Anonymous installation identifier.
|
|
3
|
+
*
|
|
4
|
+
* A random UUID persisted once at ~/.vaspera/install-id, used only to count
|
|
5
|
+
* unique installations and active installs in aggregate. It is NOT tied to any
|
|
6
|
+
* user, machine fingerprint, repo, or source code — it is a random value the
|
|
7
|
+
* install generates for itself. See TELEMETRY.md.
|
|
8
|
+
*
|
|
9
|
+
* @module telemetry/install-id
|
|
10
|
+
*/
|
|
11
|
+
import { randomUUID } from "crypto";
|
|
12
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from "fs";
|
|
13
|
+
import { join } from "path";
|
|
14
|
+
import { homedir } from "os";
|
|
15
|
+
const VASPERA_DIR = join(process.env.HOME || homedir() || "/tmp", ".vaspera");
|
|
16
|
+
const INSTALL_ID_PATH = join(VASPERA_DIR, "install-id");
|
|
17
|
+
let cached = null;
|
|
18
|
+
/**
|
|
19
|
+
* Get (or lazily create) the anonymous install id. Idempotent within a process.
|
|
20
|
+
* Degrades to an ephemeral id if the filesystem is not writable, in which case
|
|
21
|
+
* isFirstRun is false so we never repeatedly show the notice or imply a new install.
|
|
22
|
+
*/
|
|
23
|
+
export function getInstallIdentity() {
|
|
24
|
+
if (cached)
|
|
25
|
+
return cached;
|
|
26
|
+
try {
|
|
27
|
+
if (existsSync(INSTALL_ID_PATH)) {
|
|
28
|
+
const id = readFileSync(INSTALL_ID_PATH, "utf-8").trim();
|
|
29
|
+
if (id) {
|
|
30
|
+
cached = { installId: id, isFirstRun: false };
|
|
31
|
+
return cached;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
const id = randomUUID();
|
|
35
|
+
mkdirSync(VASPERA_DIR, { recursive: true });
|
|
36
|
+
writeFileSync(INSTALL_ID_PATH, id, { mode: 0o600 });
|
|
37
|
+
cached = { installId: id, isFirstRun: true };
|
|
38
|
+
return cached;
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
cached = { installId: randomUUID(), isFirstRun: false };
|
|
42
|
+
return cached;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/** Convenience accessor for just the id. */
|
|
46
|
+
export function getInstallId() {
|
|
47
|
+
return getInstallIdentity().installId;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=install-id.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-id.js","sourceRoot":"","sources":["../../src/telemetry/install-id.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAE7B,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,EAAE,IAAI,MAAM,EAAE,UAAU,CAAC,CAAC;AAC9E,MAAM,eAAe,GAAG,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;AASxD,IAAI,MAAM,GAA2B,IAAI,CAAC;AAE1C;;;;GAIG;AACH,MAAM,UAAU,kBAAkB;IAChC,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAE1B,IAAI,CAAC;QACH,IAAI,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;YAChC,MAAM,EAAE,GAAG,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;YACzD,IAAI,EAAE,EAAE,CAAC;gBACP,MAAM,GAAG,EAAE,SAAS,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;gBAC9C,OAAO,MAAM,CAAC;YAChB,CAAC;QACH,CAAC;QACD,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;QACxB,SAAS,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5C,aAAa,CAAC,eAAe,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACpD,MAAM,GAAG,EAAE,SAAS,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;QAC7C,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,GAAG,EAAE,SAAS,EAAE,UAAU,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;QACxD,OAAO,MAAM,CAAC;IAChB,CAAC;AACH,CAAC;AAED,4CAA4C;AAC5C,MAAM,UAAU,YAAY;IAC1B,OAAO,kBAAkB,EAAE,CAAC,SAAS,CAAC;AACxC,CAAC"}
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Usage Telemetry Module
|
|
3
3
|
*
|
|
4
|
-
* Tracks scan events
|
|
5
|
-
*
|
|
4
|
+
* Tracks anonymous scan/usage events to measure adoption and improve the
|
|
5
|
+
* product. Telemetry is OPT-OUT: enabled by default, with a first-run notice,
|
|
6
|
+
* and disabled by DO_NOT_TRACK, VASPERA_TELEMETRY_DISABLED, or
|
|
7
|
+
* VASPERA_TELEMETRY_ENABLED=false. It never sends source code or secrets — only
|
|
8
|
+
* anonymized hashes, versions, and aggregate counts. See TELEMETRY.md.
|
|
6
9
|
*
|
|
7
10
|
* @module telemetry/usage
|
|
8
11
|
*/
|
|
@@ -24,6 +27,11 @@ export interface TelemetryConfig {
|
|
|
24
27
|
/** Include user email (requires explicit opt-in) */
|
|
25
28
|
includeUserEmail?: boolean;
|
|
26
29
|
}
|
|
30
|
+
/**
|
|
31
|
+
* Telemetry is opt-OUT: on by default, disabled by any of the standard or
|
|
32
|
+
* Vaspera-specific opt-out signals, and never sent from automated test runs.
|
|
33
|
+
*/
|
|
34
|
+
export declare function isTelemetryDisabled(): boolean;
|
|
27
35
|
/**
|
|
28
36
|
* Default telemetry configuration (reads from environment)
|
|
29
37
|
*/
|
|
@@ -42,6 +50,8 @@ export interface BaseTelemetryEvent {
|
|
|
42
50
|
timestamp: string;
|
|
43
51
|
/** SHA256 hash of project path (anonymized) */
|
|
44
52
|
projectHash: string;
|
|
53
|
+
/** Anonymous install id (random UUID; counts unique installs) */
|
|
54
|
+
installId: string;
|
|
45
55
|
/** Vaspera version */
|
|
46
56
|
vasperaVersion: string;
|
|
47
57
|
/** Platform (darwin, linux, win32) */
|
|
@@ -139,6 +149,12 @@ export declare function initTelemetry(config: Partial<TelemetryConfig>): void;
|
|
|
139
149
|
* Check if telemetry is enabled
|
|
140
150
|
*/
|
|
141
151
|
export declare function isTelemetryEnabled(): boolean;
|
|
152
|
+
/**
|
|
153
|
+
* Print the one-time, opt-out telemetry notice to stderr on the first run of a
|
|
154
|
+
* new install. stderr only — stdout is the MCP JSON-RPC channel and must not be
|
|
155
|
+
* polluted. No-op when telemetry is disabled or this is not the first run.
|
|
156
|
+
*/
|
|
157
|
+
export declare function maybeShowTelemetryNotice(): void;
|
|
142
158
|
/**
|
|
143
159
|
* Hash a value for anonymization
|
|
144
160
|
*/
|
|
@@ -185,6 +201,7 @@ export declare function trackScannerRun(projectPath: string, scanner: string, du
|
|
|
185
201
|
export declare const telemetry: {
|
|
186
202
|
init: typeof initTelemetry;
|
|
187
203
|
isEnabled: typeof isTelemetryEnabled;
|
|
204
|
+
showNotice: typeof maybeShowTelemetryNotice;
|
|
188
205
|
track: typeof trackEvent;
|
|
189
206
|
flush: typeof flushEvents;
|
|
190
207
|
shutdown: typeof shutdownTelemetry;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../../src/telemetry/usage.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../../src/telemetry/usage.ts"],"names":[],"mappings":"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"}
|
package/dist/telemetry/usage.js
CHANGED
|
@@ -1,26 +1,46 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Usage Telemetry Module
|
|
3
3
|
*
|
|
4
|
-
* Tracks scan events
|
|
5
|
-
*
|
|
4
|
+
* Tracks anonymous scan/usage events to measure adoption and improve the
|
|
5
|
+
* product. Telemetry is OPT-OUT: enabled by default, with a first-run notice,
|
|
6
|
+
* and disabled by DO_NOT_TRACK, VASPERA_TELEMETRY_DISABLED, or
|
|
7
|
+
* VASPERA_TELEMETRY_ENABLED=false. It never sends source code or secrets — only
|
|
8
|
+
* anonymized hashes, versions, and aggregate counts. See TELEMETRY.md.
|
|
6
9
|
*
|
|
7
10
|
* @module telemetry/usage
|
|
8
11
|
*/
|
|
9
12
|
import { createHash } from "crypto";
|
|
10
13
|
import { logger } from "../logger.js";
|
|
14
|
+
import { getInstallId, getInstallIdentity } from "./install-id.js";
|
|
15
|
+
function isTruthy(v) {
|
|
16
|
+
return v === "1" || v === "true";
|
|
17
|
+
}
|
|
11
18
|
/**
|
|
12
|
-
*
|
|
19
|
+
* Telemetry is opt-OUT: on by default, disabled by any of the standard or
|
|
20
|
+
* Vaspera-specific opt-out signals, and never sent from automated test runs.
|
|
13
21
|
*/
|
|
14
|
-
function
|
|
15
|
-
|
|
16
|
-
|
|
22
|
+
export function isTelemetryDisabled() {
|
|
23
|
+
// DO_NOT_TRACK is the cross-tool standard (https://consoledonottrack.com).
|
|
24
|
+
if (isTruthy(process.env.DO_NOT_TRACK))
|
|
25
|
+
return true;
|
|
26
|
+
if (isTruthy(process.env.VASPERA_TELEMETRY_DISABLED))
|
|
27
|
+
return true;
|
|
28
|
+
// An explicit ENABLED=false / 0 also opts out.
|
|
29
|
+
const enabled = process.env.VASPERA_TELEMETRY_ENABLED;
|
|
30
|
+
if (enabled === "false" || enabled === "0")
|
|
31
|
+
return true;
|
|
32
|
+
// Never emit telemetry from test runs.
|
|
33
|
+
if (process.env.NODE_ENV === "test" || process.env.VITEST)
|
|
34
|
+
return true;
|
|
35
|
+
return false;
|
|
17
36
|
}
|
|
18
37
|
/**
|
|
19
38
|
* Default telemetry configuration (reads from environment)
|
|
20
39
|
*/
|
|
21
40
|
export const DEFAULT_TELEMETRY_CONFIG = {
|
|
22
|
-
enabled:
|
|
23
|
-
endpoint: process.env.VASPERA_TELEMETRY_ENDPOINT ||
|
|
41
|
+
enabled: !isTelemetryDisabled(),
|
|
42
|
+
endpoint: process.env.VASPERA_TELEMETRY_ENDPOINT ||
|
|
43
|
+
"https://vaspera-hardening-mcp.vercel.app/api/telemetry",
|
|
24
44
|
apiKey: process.env.VASPERA_TELEMETRY_API_KEY,
|
|
25
45
|
includeRepoUrl: process.env.VASPERA_TELEMETRY_INCLUDE_REPO === "true",
|
|
26
46
|
includeOrgName: process.env.VASPERA_TELEMETRY_INCLUDE_ORG === "true",
|
|
@@ -56,6 +76,20 @@ export function initTelemetry(config) {
|
|
|
56
76
|
export function isTelemetryEnabled() {
|
|
57
77
|
return currentConfig.enabled;
|
|
58
78
|
}
|
|
79
|
+
/**
|
|
80
|
+
* Print the one-time, opt-out telemetry notice to stderr on the first run of a
|
|
81
|
+
* new install. stderr only — stdout is the MCP JSON-RPC channel and must not be
|
|
82
|
+
* polluted. No-op when telemetry is disabled or this is not the first run.
|
|
83
|
+
*/
|
|
84
|
+
export function maybeShowTelemetryNotice() {
|
|
85
|
+
if (isTelemetryDisabled())
|
|
86
|
+
return;
|
|
87
|
+
if (!getInstallIdentity().isFirstRun)
|
|
88
|
+
return;
|
|
89
|
+
process.stderr.write("\nVaspera collects anonymous usage metrics (no source code, no secrets) to improve the product.\n" +
|
|
90
|
+
"Opt out anytime: export VASPERA_TELEMETRY_DISABLED=1\n" +
|
|
91
|
+
"What & why: https://github.com/RCOLKITT/hardening-mcp/blob/main/TELEMETRY.md\n\n");
|
|
92
|
+
}
|
|
59
93
|
/**
|
|
60
94
|
* Hash a value for anonymization
|
|
61
95
|
*/
|
|
@@ -70,6 +104,7 @@ function createBaseEvent(eventType, projectPath) {
|
|
|
70
104
|
eventType,
|
|
71
105
|
timestamp: new Date().toISOString(),
|
|
72
106
|
projectHash: hashValue(projectPath),
|
|
107
|
+
installId: getInstallId(),
|
|
73
108
|
vasperaVersion: process.env.npm_package_version || "unknown",
|
|
74
109
|
platform: process.platform,
|
|
75
110
|
nodeVersion: process.version,
|
|
@@ -240,6 +275,7 @@ export async function trackScannerRun(projectPath, scanner, duration, findingsCo
|
|
|
240
275
|
export const telemetry = {
|
|
241
276
|
init: initTelemetry,
|
|
242
277
|
isEnabled: isTelemetryEnabled,
|
|
278
|
+
showNotice: maybeShowTelemetryNotice,
|
|
243
279
|
track: trackEvent,
|
|
244
280
|
flush: flushEvents,
|
|
245
281
|
shutdown: shutdownTelemetry,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usage.js","sourceRoot":"","sources":["../../src/telemetry/usage.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"usage.js","sourceRoot":"","sources":["../../src/telemetry/usage.ts"],"names":[],"mappings":"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"}
|