@newrelic/preflight 1.0.3 → 1.0.5
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 +7 -1
- package/dist/alerts/types.d.ts.map +1 -1
- package/dist/alerts/types.js.map +1 -1
- package/dist/config.d.ts +7 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +5 -3
- package/dist/config.js.map +1 -1
- package/dist/dashboard/dashboard-server.d.ts +4 -0
- package/dist/dashboard/dashboard-server.d.ts.map +1 -1
- package/dist/dashboard/dashboard-server.js +42 -1
- package/dist/dashboard/dashboard-server.js.map +1 -1
- package/dist/dashboard/live-event-bus.js +2 -2
- package/dist/dashboard/live-event-bus.js.map +1 -1
- package/dist/dashboard/routes/sse-handler.js +3 -3
- package/dist/dashboard/routes/sse-handler.js.map +1 -1
- package/dist/hooks/collector-script.d.ts.map +1 -1
- package/dist/hooks/collector-script.js +1 -5
- package/dist/hooks/collector-script.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -2
- package/dist/index.js.map +1 -1
- package/dist/install/cli.d.ts +1 -0
- package/dist/install/cli.d.ts.map +1 -1
- package/dist/install/cli.js +306 -106
- package/dist/install/cli.js.map +1 -1
- package/dist/install/install-helper.d.ts +5 -4
- package/dist/install/install-helper.d.ts.map +1 -1
- package/dist/install/install-helper.js +2 -2
- package/dist/install/install-helper.js.map +1 -1
- package/dist/install/json-utils.d.ts +4 -0
- package/dist/install/json-utils.d.ts.map +1 -0
- package/dist/install/json-utils.js +88 -0
- package/dist/install/json-utils.js.map +1 -0
- package/dist/install/migrate.d.ts.map +1 -1
- package/dist/install/migrate.js +57 -1
- package/dist/install/migrate.js.map +1 -1
- package/dist/install/schedule.d.ts +1 -0
- package/dist/install/schedule.d.ts.map +1 -1
- package/dist/install/schedule.js +23 -5
- package/dist/install/schedule.js.map +1 -1
- package/dist/install/setup-wizard.d.ts.map +1 -1
- package/dist/install/setup-wizard.js +105 -44
- package/dist/install/setup-wizard.js.map +1 -1
- package/dist/metrics/anti-patterns.d.ts.map +1 -1
- package/dist/metrics/anti-patterns.js.map +1 -1
- package/dist/metrics/context-composition-tracker.d.ts.map +1 -1
- package/dist/metrics/context-composition-tracker.js.map +1 -1
- package/dist/platforms/copilot-adapter.d.ts.map +1 -1
- package/dist/platforms/copilot-adapter.js.map +1 -1
- package/dist/proxy/otlp-receiver.d.ts.map +1 -1
- package/dist/proxy/otlp-receiver.js.map +1 -1
- package/dist/proxy/proxy-manager.js +1 -1
- package/dist/proxy/proxy-manager.js.map +1 -1
- package/dist/proxy/upstream-stdio.d.ts.map +1 -1
- package/dist/proxy/upstream-stdio.js.map +1 -1
- package/dist/security/ssrf.js +1 -1
- package/dist/security/ssrf.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +2 -1
- package/dist/server.js.map +1 -1
- package/dist/shared/__test-utils__/log-output.d.ts +1 -2
- package/dist/shared/__test-utils__/log-output.d.ts.map +1 -1
- package/dist/shared/__test-utils__/log-output.js +1 -2
- package/dist/shared/__test-utils__/log-output.js.map +1 -1
- package/dist/shared/config.d.ts +8 -2
- package/dist/shared/config.d.ts.map +1 -1
- package/dist/shared/config.js +20 -20
- package/dist/shared/config.js.map +1 -1
- package/dist/shared/errors.d.ts +1 -1
- package/dist/shared/errors.js +10 -10
- package/dist/shared/errors.js.map +1 -1
- package/dist/shared/events/factory.js +12 -12
- package/dist/shared/events/factory.js.map +1 -1
- package/dist/shared/events/serialize.d.ts +2 -2
- package/dist/shared/events/serialize.js +19 -19
- package/dist/shared/events/serialize.js.map +1 -1
- package/dist/shared/harvest/event-buffer.d.ts +2 -2
- package/dist/shared/harvest/event-buffer.js +3 -3
- package/dist/shared/harvest/event-buffer.js.map +1 -1
- package/dist/shared/harvest/harvest-scheduler.d.ts +4 -5
- package/dist/shared/harvest/harvest-scheduler.d.ts.map +1 -1
- package/dist/shared/harvest/harvest-scheduler.js +35 -35
- package/dist/shared/harvest/harvest-scheduler.js.map +1 -1
- package/dist/shared/harvest/metric-aggregator.d.ts +9 -9
- package/dist/shared/harvest/metric-aggregator.d.ts.map +1 -1
- package/dist/shared/harvest/metric-aggregator.js +16 -18
- package/dist/shared/harvest/metric-aggregator.js.map +1 -1
- package/dist/shared/index.d.ts +0 -1
- package/dist/shared/index.d.ts.map +1 -1
- package/dist/shared/index.js +0 -1
- package/dist/shared/index.js.map +1 -1
- package/dist/shared/logger.d.ts +4 -5
- package/dist/shared/logger.d.ts.map +1 -1
- package/dist/shared/logger.js +12 -12
- package/dist/shared/logger.js.map +1 -1
- package/dist/shared/pricing-data.js +10 -10
- package/dist/shared/pricing-data.js.map +1 -1
- package/dist/shared/pricing.d.ts +3 -3
- package/dist/shared/pricing.js +12 -12
- package/dist/shared/pricing.js.map +1 -1
- package/dist/shared/redact.d.ts +1 -3
- package/dist/shared/redact.d.ts.map +1 -1
- package/dist/shared/redact.js +8 -10
- package/dist/shared/redact.js.map +1 -1
- package/dist/shared/timing.d.ts +4 -4
- package/dist/shared/timing.d.ts.map +1 -1
- package/dist/shared/timing.js +9 -9
- package/dist/shared/timing.js.map +1 -1
- package/dist/shared/tokens.d.ts +4 -4
- package/dist/shared/tokens.js +16 -16
- package/dist/shared/tokens.js.map +1 -1
- package/dist/shared/transport/events-api.d.ts +1 -1
- package/dist/shared/transport/events-api.d.ts.map +1 -1
- package/dist/shared/transport/events-api.js +2 -1
- package/dist/shared/transport/events-api.js.map +1 -1
- package/dist/shared/transport/http-client.d.ts +1 -1
- package/dist/shared/transport/http-client.d.ts.map +1 -1
- package/dist/shared/transport/http-client.js +19 -28
- package/dist/shared/transport/http-client.js.map +1 -1
- package/dist/shared/transport/logs-api.d.ts +2 -3
- package/dist/shared/transport/logs-api.d.ts.map +1 -1
- package/dist/shared/transport/logs-api.js +3 -3
- package/dist/shared/transport/logs-api.js.map +1 -1
- package/dist/shared/transport/metric-api.d.ts.map +1 -1
- package/dist/shared/transport/metric-api.js +1 -0
- package/dist/shared/transport/metric-api.js.map +1 -1
- package/dist/shared/transport/otlp-event-bridge.d.ts +10 -5
- package/dist/shared/transport/otlp-event-bridge.d.ts.map +1 -1
- package/dist/shared/transport/otlp-event-bridge.js +20 -11
- package/dist/shared/transport/otlp-event-bridge.js.map +1 -1
- package/dist/shared/transport/otlp-shared.d.ts +12 -1
- package/dist/shared/transport/otlp-shared.d.ts.map +1 -1
- package/dist/shared/transport/otlp-shared.js +20 -4
- package/dist/shared/transport/otlp-shared.js.map +1 -1
- package/dist/shared/transport/otlp-transport.d.ts +22 -19
- package/dist/shared/transport/otlp-transport.d.ts.map +1 -1
- package/dist/shared/transport/otlp-transport.js +136 -120
- package/dist/shared/transport/otlp-transport.js.map +1 -1
- package/dist/shared/transport/types.d.ts +7 -3
- package/dist/shared/transport/types.d.ts.map +1 -1
- package/dist/storage/session-store.js +1 -1
- package/dist/storage/weekly-summary.js +3 -3
- package/dist/storage/weekly-summary.js.map +1 -1
- package/dist/tools/cross-session-tools.js +1 -1
- package/dist/tools/cross-session-tools.js.map +1 -1
- package/dist/tools/session-stats.d.ts.map +1 -1
- package/dist/tools/session-stats.js +2 -1
- package/dist/tools/session-stats.js.map +1 -1
- package/dist/tracing/mcp-tracer.js +1 -1
- package/dist/tracing/mcp-tracer.js.map +1 -1
- package/dist/transport/nr-ingest.d.ts.map +1 -1
- package/dist/transport/nr-ingest.js +4 -0
- package/dist/transport/nr-ingest.js.map +1 -1
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +21 -0
- package/dist/version.js.map +1 -0
- package/dist/web/assets/index-CW0UCwb9.css +2 -0
- package/dist/web/assets/index-HRyb4aZK.js +64 -0
- package/dist/web/index.html +2 -2
- package/package.json +23 -23
- package/dist/shared/version.d.ts +0 -2
- package/dist/shared/version.d.ts.map +0 -1
- package/dist/shared/version.js +0 -2
- package/dist/shared/version.js.map +0 -1
- package/dist/web/assets/index-BrL281N-.css +0 -2
- package/dist/web/assets/index-CcaYZzXm.js +0 -42
|
@@ -25,7 +25,7 @@ const NR_HOOK_RE = /preflight-collector"?\s+(?:pre|post)-tool/;
|
|
|
25
25
|
export function generateHookEntries(binPath, options) {
|
|
26
26
|
let pre;
|
|
27
27
|
let post;
|
|
28
|
-
if (options?.wsl) {
|
|
28
|
+
if (options?.platform === 'wsl-windows-cc') {
|
|
29
29
|
// Windows Claude Code runs hooks via wsl.exe — call the WSL binary through interop.
|
|
30
30
|
// Quote the path so cmd.exe doesn't split on spaces (e.g. /home/john doe/...).
|
|
31
31
|
const collectorPath = binPath ? join(dirname(binPath), COLLECTOR_COMMAND) : COLLECTOR_COMMAND;
|
|
@@ -48,7 +48,7 @@ export function generateHookEntries(binPath, options) {
|
|
|
48
48
|
};
|
|
49
49
|
}
|
|
50
50
|
export function generateMcpServerEntry(binPath, options) {
|
|
51
|
-
if (options?.wsl) {
|
|
51
|
+
if (options?.platform === 'wsl-windows-cc') {
|
|
52
52
|
// Windows Claude Code launches MCP servers as Windows processes — use wsl.exe interop.
|
|
53
53
|
const serverPath = binPath ? join(dirname(binPath), MCP_SERVER_COMMAND) : MCP_SERVER_COMMAND;
|
|
54
54
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install-helper.js","sourceRoot":"","sources":["../../src/install/install-helper.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"install-helper.js","sourceRoot":"","sources":["../../src/install/install-helper.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare function readJsonFile(path: string): Record<string, unknown>;
|
|
2
|
+
export declare function readJsonFileStrict(path: string): Record<string, unknown>;
|
|
3
|
+
export declare function writeJsonFile(path: string, data: Record<string, unknown>, additionalAllowedBase?: string): void;
|
|
4
|
+
//# sourceMappingURL=json-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-utils.d.ts","sourceRoot":"","sources":["../../src/install/json-utils.ts"],"names":[],"mappings":"AAYA,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAMlE;AAMD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAcxE;AAED,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,qBAAqB,CAAC,EAAE,MAAM,GAC7B,IAAI,CAsDN"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { readFileSync, writeFileSync, mkdirSync, existsSync, renameSync, unlinkSync, realpathSync, } from 'node:fs';
|
|
2
|
+
import { basename, dirname, resolve, sep } from 'node:path';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
export function readJsonFile(path) {
|
|
5
|
+
try {
|
|
6
|
+
return JSON.parse(readFileSync(path, 'utf-8'));
|
|
7
|
+
}
|
|
8
|
+
catch {
|
|
9
|
+
return {};
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
// Like readJsonFile but throws on IO errors (EBUSY, EPERM, etc.) and on
|
|
13
|
+
// malformed or non-object JSON rather than returning {}. Returns {} only for
|
|
14
|
+
// ENOENT (file absent). Use when the file is known to exist and its contents
|
|
15
|
+
// must be preserved.
|
|
16
|
+
export function readJsonFileStrict(path) {
|
|
17
|
+
try {
|
|
18
|
+
const val = JSON.parse(readFileSync(path, 'utf-8'));
|
|
19
|
+
if (val !== null && typeof val === 'object' && !Array.isArray(val)) {
|
|
20
|
+
return val;
|
|
21
|
+
}
|
|
22
|
+
throw new SyntaxError(`Expected a JSON object but got ${Array.isArray(val) ? 'array' : typeof val}`);
|
|
23
|
+
}
|
|
24
|
+
catch (err) {
|
|
25
|
+
if (err instanceof SyntaxError)
|
|
26
|
+
throw err;
|
|
27
|
+
if (err.code === 'ENOENT')
|
|
28
|
+
return {};
|
|
29
|
+
throw err;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export function writeJsonFile(path, data, additionalAllowedBase) {
|
|
33
|
+
const dir = dirname(path);
|
|
34
|
+
if (!existsSync(dir)) {
|
|
35
|
+
mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
36
|
+
}
|
|
37
|
+
// Symlink guard: verify both the resolved parent directory AND the resolved
|
|
38
|
+
// target file path are under HOME, cwd, or an explicitly allowed base (e.g.
|
|
39
|
+
// the Windows home path under /mnt/c/... when writing from WSL).
|
|
40
|
+
const resolvedDir = realpathSync(dir);
|
|
41
|
+
const resolvedPath = existsSync(path) ? realpathSync(path) : resolve(resolvedDir, basename(path));
|
|
42
|
+
const home = homedir();
|
|
43
|
+
const cwd = process.cwd();
|
|
44
|
+
// Resolve additionalAllowedBase so symlinked storage directories (e.g. ~/.newrelic-preflight
|
|
45
|
+
// → /data/shared/preflight) are correctly matched against the resolved target path.
|
|
46
|
+
const resolvedAllowedBase = additionalAllowedBase !== undefined
|
|
47
|
+
? (() => {
|
|
48
|
+
try {
|
|
49
|
+
return realpathSync(additionalAllowedBase);
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
// ENOENT: path doesn't exist yet (created by mkdirSync above on first write).
|
|
53
|
+
// All other errors (EACCES, EPERM) propagate — a permission failure here
|
|
54
|
+
// means the resolved base is unknown, which would defeat the symlink guard.
|
|
55
|
+
if (err.code === 'ENOENT')
|
|
56
|
+
return additionalAllowedBase;
|
|
57
|
+
throw err;
|
|
58
|
+
}
|
|
59
|
+
})()
|
|
60
|
+
: undefined;
|
|
61
|
+
const check = (p) => p === home ||
|
|
62
|
+
p.startsWith(home + sep) ||
|
|
63
|
+
p === cwd ||
|
|
64
|
+
p.startsWith(cwd + sep) ||
|
|
65
|
+
(resolvedAllowedBase !== undefined &&
|
|
66
|
+
(p === resolvedAllowedBase || p.startsWith(resolvedAllowedBase + sep)));
|
|
67
|
+
if (!check(resolvedDir) || !check(resolvedPath)) {
|
|
68
|
+
throw new Error(`Refusing to write outside HOME or project root: ${resolvedPath}`);
|
|
69
|
+
}
|
|
70
|
+
const tmp = path + '.tmp';
|
|
71
|
+
try {
|
|
72
|
+
writeFileSync(tmp, JSON.stringify(data, null, 2) + '\n', { mode: 0o600 });
|
|
73
|
+
renameSync(tmp, path);
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
// Best-effort cleanup of the temp file — suppress secondary errors so the
|
|
77
|
+
// original write/rename error is what propagates to the caller.
|
|
78
|
+
try {
|
|
79
|
+
if (existsSync(tmp))
|
|
80
|
+
unlinkSync(tmp);
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
/* best-effort */
|
|
84
|
+
}
|
|
85
|
+
throw err;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=json-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-utils.js","sourceRoot":"","sources":["../../src/install/json-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,aAAa,EACb,SAAS,EACT,UAAU,EACV,UAAU,EACV,UAAU,EACV,YAAY,GACb,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAA4B,CAAC;IAC5E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,wEAAwE;AACxE,6EAA6E;AAC7E,6EAA6E;AAC7E,qBAAqB;AACrB,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,IAAI,CAAC;QACH,MAAM,GAAG,GAAY,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;QAC7D,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YACnE,OAAO,GAA8B,CAAC;QACxC,CAAC;QACD,MAAM,IAAI,WAAW,CACnB,kCAAkC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,GAAG,EAAE,CAC9E,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,WAAW;YAAE,MAAM,GAAG,CAAC;QAC1C,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,EAAE,CAAC;QAChE,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,IAAY,EACZ,IAA6B,EAC7B,qBAA8B;IAE9B,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,4EAA4E;IAC5E,4EAA4E;IAC5E,iEAAiE;IACjE,MAAM,WAAW,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,YAAY,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IAClG,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,6FAA6F;IAC7F,oFAAoF;IACpF,MAAM,mBAAmB,GACvB,qBAAqB,KAAK,SAAS;QACjC,CAAC,CAAC,CAAC,GAAG,EAAE;YACJ,IAAI,CAAC;gBACH,OAAO,YAAY,CAAC,qBAAqB,CAAC,CAAC;YAC7C,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,8EAA8E;gBAC9E,yEAAyE;gBACzE,4EAA4E;gBAC5E,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;oBAAE,OAAO,qBAAqB,CAAC;gBACnF,MAAM,GAAG,CAAC;YACZ,CAAC;QACH,CAAC,CAAC,EAAE;QACN,CAAC,CAAC,SAAS,CAAC;IAChB,MAAM,KAAK,GAAG,CAAC,CAAS,EAAE,EAAE,CAC1B,CAAC,KAAK,IAAI;QACV,CAAC,CAAC,UAAU,CAAC,IAAI,GAAG,GAAG,CAAC;QACxB,CAAC,KAAK,GAAG;QACT,CAAC,CAAC,UAAU,CAAC,GAAG,GAAG,GAAG,CAAC;QACvB,CAAC,mBAAmB,KAAK,SAAS;YAChC,CAAC,CAAC,KAAK,mBAAmB,IAAI,CAAC,CAAC,UAAU,CAAC,mBAAmB,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IAC5E,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CAAC,mDAAmD,YAAY,EAAE,CAAC,CAAC;IACrF,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,GAAG,MAAM,CAAC;IAC1B,IAAI,CAAC;QACH,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1E,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACxB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,0EAA0E;QAC1E,gEAAgE;QAChE,IAAI,CAAC;YACH,IAAI,UAAU,CAAC,GAAG,CAAC;gBAAE,UAAU,CAAC,GAAG,CAAC,CAAC;QACvC,CAAC;QAAC,MAAM,CAAC;YACP,iBAAiB;QACnB,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/install/migrate.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/install/migrate.ts"],"names":[],"mappings":"AAkFA;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,UAAQ,GAAG,IAAI,CAkG5D"}
|
package/dist/install/migrate.js
CHANGED
|
@@ -1,7 +1,62 @@
|
|
|
1
|
-
import { existsSync, renameSync, cpSync, rmSync, readSync, openSync, closeSync } from 'node:fs';
|
|
1
|
+
import { existsSync, renameSync, cpSync, rmSync, readSync, openSync, closeSync, readFileSync, unlinkSync, } from 'node:fs';
|
|
2
2
|
import { homedir } from 'node:os';
|
|
3
3
|
import { resolve } from 'node:path';
|
|
4
4
|
import { DEFAULT_STORAGE_PATH } from '../config.js';
|
|
5
|
+
import { readJsonFileStrict, writeJsonFile } from './json-utils.js';
|
|
6
|
+
function migrateWslMarker() {
|
|
7
|
+
const markerPath = resolve(DEFAULT_STORAGE_PATH, '.wsl-mode');
|
|
8
|
+
if (!existsSync(markerPath))
|
|
9
|
+
return;
|
|
10
|
+
try {
|
|
11
|
+
const raw = readFileSync(markerPath, 'utf8').trim();
|
|
12
|
+
const platform = raw === 'windows' ? 'wsl-windows-cc' : raw === 'linux' ? 'wsl-linux-cc' : null;
|
|
13
|
+
if (platform !== null) {
|
|
14
|
+
const configPath = resolve(DEFAULT_STORAGE_PATH, 'config.json');
|
|
15
|
+
// Use strict read: if config.json is malformed or unreadable (EBUSY, EPERM),
|
|
16
|
+
// throw so the outer catch skips the write and leaves credentials intact.
|
|
17
|
+
// ENOENT (file absent) still returns {} — safe to write a fresh config.
|
|
18
|
+
const existing = readJsonFileStrict(configPath);
|
|
19
|
+
// Skip the write if config.json already has a WSL platformTarget set by a
|
|
20
|
+
// ≥1.0.4 install on this machine — that value reflects a deliberate WSL
|
|
21
|
+
// mode choice and must not be overwritten by a stale marker.
|
|
22
|
+
// 'native' is intentionally excluded: it can arrive via cross-machine
|
|
23
|
+
// config copy (e.g. macOS → WSL) and must not suppress a real WSL marker.
|
|
24
|
+
// Typed constants: TypeScript will error here if these drift from PlatformTarget.
|
|
25
|
+
const wslWindowsCc = 'wsl-windows-cc';
|
|
26
|
+
const wslLinuxCc = 'wsl-linux-cc';
|
|
27
|
+
const alreadyMigrated = existing.platformTarget === wslWindowsCc || existing.platformTarget === wslLinuxCc;
|
|
28
|
+
if (!alreadyMigrated) {
|
|
29
|
+
// Pass DEFAULT_STORAGE_PATH as the allowed base so the symlink guard accepts
|
|
30
|
+
// writes when the storage directory is symlinked outside HOME.
|
|
31
|
+
writeJsonFile(configPath, { ...existing, platformTarget: platform }, DEFAULT_STORAGE_PATH);
|
|
32
|
+
}
|
|
33
|
+
// Delete marker after the rename is committed (or skipped). Wrapped in its own
|
|
34
|
+
// catch so a failure here (e.g. WSL1 DrvFs read-only file attribute on .wsl-mode)
|
|
35
|
+
// is handled inline rather than propagating to the outer catch — which would
|
|
36
|
+
// exit the function without deleting the marker on the current call, but would
|
|
37
|
+
// not cause re-migration loops because config.json is already correct.
|
|
38
|
+
try {
|
|
39
|
+
unlinkSync(markerPath);
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
/* re-migration on next startup is idempotent */
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
// Unrecognized marker content — cannot migrate, but deleting it prevents this
|
|
47
|
+
// function from re-running on every startup (existsSync would fire each time).
|
|
48
|
+
try {
|
|
49
|
+
unlinkSync(markerPath);
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
/* WSL1 DrvFs read-only attribute — re-run on next startup is harmless */
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
// Non-fatal: next install falls back to filesystem detection.
|
|
58
|
+
}
|
|
59
|
+
}
|
|
5
60
|
function promptYesNo(question) {
|
|
6
61
|
process.stderr.write(question);
|
|
7
62
|
// Open /dev/tty directly — Node.js sets fd 0 to O_NONBLOCK on TTY startup,
|
|
@@ -27,6 +82,7 @@ function promptYesNo(question) {
|
|
|
27
82
|
* (server startup, update) print a notice instead.
|
|
28
83
|
*/
|
|
29
84
|
export function migrateStoragePath(interactive = false) {
|
|
85
|
+
migrateWslMarker();
|
|
30
86
|
const oldPath = resolve(homedir(), '.nr-ai-observe');
|
|
31
87
|
const newPath = DEFAULT_STORAGE_PATH;
|
|
32
88
|
if (!existsSync(oldPath))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/install/migrate.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/install/migrate.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schedule.d.ts","sourceRoot":"","sources":["../../src/install/schedule.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"schedule.d.ts","sourceRoot":"","sources":["../../src/install/schedule.ts"],"names":[],"mappings":"AA4CA,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAoCD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAetF;AAED,wBAAgB,cAAc,IAAI,IAAI,CASrC;AAED,wBAAgB,iBAAiB,IAAI,cAAc,CAmBlD;AA+BD,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAe/D;AAED,wBAAgB,qBAAqB,IAAI,IAAI,CAS5C;AAED,wBAAgB,wBAAwB,IAAI,qBAAqB,CAehE;AAED,wBAAgB,iBAAiB,IAAI,MAAM,GAAG,IAAI,CAgBjD"}
|
package/dist/install/schedule.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { execFileSync } from 'node:child_process';
|
|
2
2
|
import { writeFileSync, readFileSync, existsSync, statSync, accessSync, constants, unlinkSync, mkdirSync, } from 'node:fs';
|
|
3
|
-
import { resolve, join } from 'node:path';
|
|
3
|
+
import { resolve, join, dirname } from 'node:path';
|
|
4
4
|
import { homedir } from 'node:os';
|
|
5
5
|
function escapeXml(s) {
|
|
6
6
|
return s
|
|
@@ -23,7 +23,13 @@ function updateLogPath() {
|
|
|
23
23
|
function dashboardLogPath() {
|
|
24
24
|
return resolve(homedir(), '.newrelic-preflight', 'dashboard.log');
|
|
25
25
|
}
|
|
26
|
-
|
|
26
|
+
// Returns the directory containing the node binary running this process.
|
|
27
|
+
// Injected into launchd plists so the daemon can find node regardless of
|
|
28
|
+
// which version manager (Homebrew, nvm, volta, asdf) the user has.
|
|
29
|
+
export function resolveNodeDir() {
|
|
30
|
+
return dirname(process.execPath);
|
|
31
|
+
}
|
|
32
|
+
function buildPlist(binaryPath, hour, minute, nodeDir) {
|
|
27
33
|
return `<?xml version="1.0" encoding="UTF-8"?>
|
|
28
34
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
29
35
|
<plist version="1.0">
|
|
@@ -35,6 +41,11 @@ function buildPlist(binaryPath, hour, minute) {
|
|
|
35
41
|
<string>${escapeXml(binaryPath)}</string>
|
|
36
42
|
<string>update</string>
|
|
37
43
|
</array>
|
|
44
|
+
<key>EnvironmentVariables</key>
|
|
45
|
+
<dict>
|
|
46
|
+
<key>PATH</key>
|
|
47
|
+
<string>${escapeXml(nodeDir)}:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin</string>
|
|
48
|
+
</dict>
|
|
38
49
|
<key>StartCalendarInterval</key>
|
|
39
50
|
<dict>
|
|
40
51
|
<key>Hour</key>
|
|
@@ -52,9 +63,10 @@ function buildPlist(binaryPath, hour, minute) {
|
|
|
52
63
|
</plist>`;
|
|
53
64
|
}
|
|
54
65
|
export function installSchedule(binaryPath, hour, minute) {
|
|
66
|
+
const nodeDir = resolveNodeDir();
|
|
55
67
|
const path = plistPath();
|
|
56
68
|
mkdirSync(resolve(homedir(), 'Library', 'LaunchAgents'), { recursive: true, mode: 0o755 });
|
|
57
|
-
writeFileSync(path, buildPlist(binaryPath, hour, minute), { mode: 0o600 });
|
|
69
|
+
writeFileSync(path, buildPlist(binaryPath, hour, minute, nodeDir), { mode: 0o600 });
|
|
58
70
|
try {
|
|
59
71
|
execFileSync('launchctl', ['unload', path], { stdio: 'pipe' });
|
|
60
72
|
}
|
|
@@ -100,7 +112,7 @@ export function getScheduleStatus() {
|
|
|
100
112
|
return { installed: false };
|
|
101
113
|
}
|
|
102
114
|
}
|
|
103
|
-
function buildDashboardPlist(binaryPath) {
|
|
115
|
+
function buildDashboardPlist(binaryPath, nodeDir) {
|
|
104
116
|
return `<?xml version="1.0" encoding="UTF-8"?>
|
|
105
117
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
106
118
|
<plist version="1.0">
|
|
@@ -112,6 +124,11 @@ function buildDashboardPlist(binaryPath) {
|
|
|
112
124
|
<string>${escapeXml(binaryPath)}</string>
|
|
113
125
|
<string>--local</string>
|
|
114
126
|
</array>
|
|
127
|
+
<key>EnvironmentVariables</key>
|
|
128
|
+
<dict>
|
|
129
|
+
<key>PATH</key>
|
|
130
|
+
<string>${escapeXml(nodeDir)}:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin</string>
|
|
131
|
+
</dict>
|
|
115
132
|
<key>KeepAlive</key>
|
|
116
133
|
<true/>
|
|
117
134
|
<key>RunAtLoad</key>
|
|
@@ -124,9 +141,10 @@ function buildDashboardPlist(binaryPath) {
|
|
|
124
141
|
</plist>`;
|
|
125
142
|
}
|
|
126
143
|
export function installDashboardDaemon(binaryPath) {
|
|
144
|
+
const nodeDir = resolveNodeDir();
|
|
127
145
|
const path = dashboardPlistPath();
|
|
128
146
|
mkdirSync(resolve(homedir(), 'Library', 'LaunchAgents'), { recursive: true, mode: 0o755 });
|
|
129
|
-
writeFileSync(path, buildDashboardPlist(binaryPath), { mode: 0o600 });
|
|
147
|
+
writeFileSync(path, buildDashboardPlist(binaryPath, nodeDir), { mode: 0o600 });
|
|
130
148
|
try {
|
|
131
149
|
execFileSync('launchctl', ['unload', path], { stdio: 'pipe' });
|
|
132
150
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schedule.js","sourceRoot":"","sources":["../../src/install/schedule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EACL,aAAa,EACb,YAAY,EACZ,UAAU,EACV,QAAQ,EACR,UAAU,EACV,SAAS,EACT,UAAU,EACV,SAAS,GACV,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"schedule.js","sourceRoot":"","sources":["../../src/install/schedule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EACL,aAAa,EACb,YAAY,EACZ,UAAU,EACV,QAAQ,EACR,UAAU,EACV,SAAS,EACT,UAAU,EACV,SAAS,GACV,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,SAAS,SAAS,CAAC,CAAS;IAC1B,OAAO,CAAC;SACL,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,WAAW,GAAG,sBAAsB,CAAC;AAC3C,MAAM,qBAAqB,GAAG,yBAAyB,CAAC;AAExD,SAAS,SAAS;IAChB,OAAO,OAAO,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,WAAW,QAAQ,CAAC,CAAC;AAC/E,CAAC;AAED,SAAS,kBAAkB;IACzB,OAAO,OAAO,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,qBAAqB,QAAQ,CAAC,CAAC;AACzF,CAAC;AAED,SAAS,aAAa;IACpB,OAAO,OAAO,CAAC,OAAO,EAAE,EAAE,qBAAqB,EAAE,YAAY,CAAC,CAAC;AACjE,CAAC;AAED,SAAS,gBAAgB;IACvB,OAAO,OAAO,CAAC,OAAO,EAAE,EAAE,qBAAqB,EAAE,eAAe,CAAC,CAAC;AACpE,CAAC;AAED,yEAAyE;AACzE,yEAAyE;AACzE,mEAAmE;AACnE,MAAM,UAAU,cAAc;IAC5B,OAAO,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,UAAU,CAAC,UAAkB,EAAE,IAAY,EAAE,MAAc,EAAE,OAAe;IACnF,OAAO;;;;;YAKG,WAAW;;;cAGT,SAAS,CAAC,UAAU,CAAC;;;;;;cAMrB,SAAS,CAAC,OAAO,CAAC;;;;;eAKjB,IAAI;;eAEJ,MAAM;;;YAGT,SAAS,CAAC,aAAa,EAAE,CAAC;;YAE1B,SAAS,CAAC,aAAa,EAAE,CAAC;;;;SAI7B,CAAC;AACV,CAAC;AASD,MAAM,UAAU,eAAe,CAAC,UAAkB,EAAE,IAAY,EAAE,MAAc;IAC9E,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;IACjC,MAAM,IAAI,GAAG,SAAS,EAAE,CAAC;IACzB,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,cAAc,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3F,aAAa,CAAC,IAAI,EAAE,UAAU,CAAC,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACpF,IAAI,CAAC;QACH,YAAY,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IACjE,CAAC;IAAC,MAAM,CAAC;QACP,gCAAgC;IAClC,CAAC;IACD,IAAI,CAAC;QACH,YAAY,CAAC,WAAW,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IAC/D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,0BAA0B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChG,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,MAAM,IAAI,GAAG,SAAS,EAAE,CAAC;IACzB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO;IAC9B,IAAI,CAAC;QACH,YAAY,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IACjE,CAAC;IAAC,MAAM,CAAC;QACP,oBAAoB;IACtB,CAAC;IACD,UAAU,CAAC,IAAI,CAAC,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,MAAM,IAAI,GAAG,SAAS,EAAE,CAAC;IACzB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IACnD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC5C,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAChF,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACpF,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAC/B,oEAAoE,CACrE,CAAC;QACF,OAAO;YACL,SAAS,EAAE,IAAI;YACf,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;YACxD,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;YAC9D,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;SACrD,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAC9B,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,UAAkB,EAAE,OAAe;IAC9D,OAAO;;;;;YAKG,qBAAqB;;;cAGnB,SAAS,CAAC,UAAU,CAAC;;;;;;cAMrB,SAAS,CAAC,OAAO,CAAC;;;;;;;YAOpB,SAAS,CAAC,gBAAgB,EAAE,CAAC;;YAE7B,SAAS,CAAC,gBAAgB,EAAE,CAAC;;SAEhC,CAAC;AACV,CAAC;AAOD,MAAM,UAAU,sBAAsB,CAAC,UAAkB;IACvD,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;IACjC,MAAM,IAAI,GAAG,kBAAkB,EAAE,CAAC;IAClC,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,cAAc,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3F,aAAa,CAAC,IAAI,EAAE,mBAAmB,CAAC,UAAU,EAAE,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/E,IAAI,CAAC;QACH,YAAY,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IACjE,CAAC;IAAC,MAAM,CAAC;QACP,gCAAgC;IAClC,CAAC;IACD,IAAI,CAAC;QACH,YAAY,CAAC,WAAW,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IAC/D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,0BAA0B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChG,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,MAAM,IAAI,GAAG,kBAAkB,EAAE,CAAC;IAClC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO;IAC9B,IAAI,CAAC;QACH,YAAY,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IACjE,CAAC;IAAC,MAAM,CAAC;QACP,oBAAoB;IACtB,CAAC;IACD,UAAU,CAAC,IAAI,CAAC,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,wBAAwB;IACtC,MAAM,IAAI,GAAG,kBAAkB,EAAE,CAAC;IAClC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IACnD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC5C,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAC/B,oEAAoE,CACrE,CAAC;QACF,OAAO;YACL,SAAS,EAAE,IAAI;YACf,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;SACrD,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAC9B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,0EAA0E;IAC1E,kEAAkE;IAClE,MAAM,QAAQ,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACrE,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QACzC,IAAI,CAAC;YACH,IAAI,QAAQ,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;gBACjC,UAAU,CAAC,SAAS,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;gBACtC,OAAO,SAAS,CAAC;YACnB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup-wizard.d.ts","sourceRoot":"","sources":["../../src/install/setup-wizard.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"setup-wizard.d.ts","sourceRoot":"","sources":["../../src/install/setup-wizard.ts"],"names":[],"mappings":"AAqBA,UAAU,YAAY;IACpB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACxC;AAkBD,MAAM,WAAW,4BAA4B;IAC3C,0DAA0D;IAC1D,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,2EAA2E;IAC3E,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,wCAAwC;IACxC,QAAQ,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC;CAChC;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,4BAA4B,GACjC,2BAA2B,CA6B7B;AA2CD,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,CAAC;AAEpD,wBAAgB,WAAW,CACzB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,MAAM,EAAE;IACN,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B,GACA,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAiBzB;AAWD,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAmhBpD"}
|
|
@@ -1,37 +1,31 @@
|
|
|
1
1
|
import { createInterface } from 'node:readline/promises';
|
|
2
|
-
import {
|
|
2
|
+
import { mkdirSync, readFileSync, existsSync, copyFileSync, chmodSync, realpathSync, } from 'node:fs';
|
|
3
3
|
import { resolve, dirname } from 'node:path';
|
|
4
|
-
import {
|
|
5
|
-
import { normalizeDeveloperName, ConfigFileSchema } from '../config.js';
|
|
4
|
+
import { normalizeDeveloperName, ConfigFileSchema, DEFAULT_STORAGE_PATH } from '../config.js';
|
|
6
5
|
import { migrateStoragePath } from './migrate.js';
|
|
7
|
-
import { runInstallCli, verifyBinaryOnPath } from './cli.js';
|
|
6
|
+
import { runInstallCli, verifyBinaryOnPath, findRepoRoot } from './cli.js';
|
|
7
|
+
import { writeJsonFile } from './json-utils.js';
|
|
8
8
|
import { installSchedule, installDashboardDaemon, resolveBinaryPath } from './schedule.js';
|
|
9
|
-
import { isWsl } from './platform.js';
|
|
9
|
+
import { isWsl, resolveWindowsHome } from './platform.js';
|
|
10
10
|
import { validateLicenseKey, validateApiKey } from './key-validator.js';
|
|
11
|
-
const DEFAULT_STORAGE_PATH = resolve(homedir(), '.newrelic-preflight');
|
|
12
11
|
const CONFIG_PATH = resolve(DEFAULT_STORAGE_PATH, 'config.json');
|
|
13
12
|
const ALERT_RULES_DEST = resolve(DEFAULT_STORAGE_PATH, 'alerts', 'rules.json');
|
|
14
|
-
/**
|
|
15
|
-
* Resolve the path to the bundled `examples/local-alert-rules.json`. The
|
|
16
|
-
* wizard ships from either `dist/install/` (when installed via npm) or
|
|
17
|
-
* `src/install/` (when executed via `npx tsx`); both resolve to the repo
|
|
18
|
-
* root by walking up two directories from the running script.
|
|
19
|
-
*
|
|
20
|
-
* Uses `process.argv[1]` rather than `__dirname` (which doesn't exist in
|
|
21
|
-
* ESM) or `import.meta.url` (which trips Jest's TS module check). Same
|
|
22
|
-
* pattern as `src/index.ts` for resolving the static dashboard dir.
|
|
23
|
-
*/
|
|
24
13
|
function defaultStarterRulesSource() {
|
|
25
|
-
const
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
14
|
+
const root = findRepoRoot();
|
|
15
|
+
if (root !== null)
|
|
16
|
+
return resolve(root, 'examples', 'local-alert-rules.json');
|
|
17
|
+
// findRepoRoot() failed — fall back to walking two directories up from the
|
|
18
|
+
// real entry-point path. Resolve symlinks first so a globally-installed binary
|
|
19
|
+
// (e.g. /usr/local/bin/preflight → .../node_modules/preflight/dist/index.js)
|
|
20
|
+
// correctly walks up to the package root rather than /usr/local/bin.
|
|
21
|
+
let entryPoint;
|
|
22
|
+
try {
|
|
23
|
+
entryPoint = realpathSync(process.argv[1] ?? process.cwd());
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
entryPoint = process.argv[1] ?? process.cwd();
|
|
27
|
+
}
|
|
28
|
+
return resolve(dirname(entryPoint), '..', '..', 'examples', 'local-alert-rules.json');
|
|
35
29
|
}
|
|
36
30
|
/**
|
|
37
31
|
* Copy the bundled starter alert rules into the destination path. Idempotent:
|
|
@@ -143,6 +137,14 @@ function parseModeAnswer(raw, fallback) {
|
|
|
143
137
|
export async function runSetupWizard() {
|
|
144
138
|
migrateStoragePath(true);
|
|
145
139
|
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
140
|
+
// Safety net: process.exit() bypasses finally blocks but still runs 'exit' handlers.
|
|
141
|
+
// If runInstallCli's resolvePlatform calls process.exit(1) (e.g. saved wsl-windows-cc
|
|
142
|
+
// with WSL interop now disabled), rl.close() would otherwise be skipped, leaving stdin
|
|
143
|
+
// with dangling readline event listeners. rl.close() is idempotent so the finally
|
|
144
|
+
// block calling it again is harmless. The listener is explicitly removed in the finally
|
|
145
|
+
// block (normal completion path) to prevent accumulation across repeated invocations.
|
|
146
|
+
const rlCleanupOnExit = () => rl.close();
|
|
147
|
+
process.once('exit', rlCleanupOnExit);
|
|
146
148
|
try {
|
|
147
149
|
print('\n=== Preflight Setup ===\n');
|
|
148
150
|
print('This wizard will configure observability for your AI coding assistant.');
|
|
@@ -346,8 +348,11 @@ export async function runSetupWizard() {
|
|
|
346
348
|
dashboardPort = defaultPort;
|
|
347
349
|
}
|
|
348
350
|
}
|
|
349
|
-
// Write config
|
|
350
|
-
|
|
351
|
+
// Write config. Strip platformTarget before spreading — only the install subcommand
|
|
352
|
+
// (runInstallCli) should own this field. Preserving a stale value here would silently
|
|
353
|
+
// drive the next bare install toward the wrong platform if the user declines hooks.
|
|
354
|
+
const { platformTarget: _platformTarget, ...existingForWizard } = existing;
|
|
355
|
+
const config = buildConfig(existingForWizard, {
|
|
351
356
|
accountId,
|
|
352
357
|
licenseKey,
|
|
353
358
|
developer,
|
|
@@ -359,10 +364,7 @@ export async function runSetupWizard() {
|
|
|
359
364
|
nrApiKey,
|
|
360
365
|
collectorHost,
|
|
361
366
|
});
|
|
362
|
-
|
|
363
|
-
const configTmp = CONFIG_PATH + '.tmp';
|
|
364
|
-
writeFileSync(configTmp, JSON.stringify(config, null, 2), { mode: 0o600 });
|
|
365
|
-
renameSync(configTmp, CONFIG_PATH);
|
|
367
|
+
writeJsonFile(CONFIG_PATH, config, DEFAULT_STORAGE_PATH);
|
|
366
368
|
print(`\nConfig written to ${CONFIG_PATH}`);
|
|
367
369
|
// Step 5c: Starter alert rules (local + both modes only).
|
|
368
370
|
// Default-yes prompt; copy is idempotent — re-running the wizard never
|
|
@@ -394,25 +396,83 @@ export async function runSetupWizard() {
|
|
|
394
396
|
// Step 6: Hook install
|
|
395
397
|
// Config is already written above; pass no credentials to install so it only
|
|
396
398
|
// wires hooks and MCP without overwriting the config we just wrote.
|
|
399
|
+
const wslEnv = isWsl();
|
|
397
400
|
const installHooks = (await rl.question('\nInstall Claude Code hooks now? [Y/n]: '))
|
|
398
401
|
.trim()
|
|
399
402
|
.toLowerCase();
|
|
400
|
-
if (installHooks !== 'n') {
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
403
|
+
if (installHooks !== 'n' && installHooks !== 'no') {
|
|
404
|
+
// In WSL there are two distinct Claude Code setups that need different hook formats:
|
|
405
|
+
// Windows CC (desktop app on Windows): hooks must use wsl.exe -e, go in Windows paths
|
|
406
|
+
// Linux CC in WSL (npm install inside WSL): hooks are direct Linux commands, WSL paths
|
|
407
|
+
const installArgs = ['install'];
|
|
408
|
+
let skipInstall = false;
|
|
409
|
+
if (wslEnv) {
|
|
410
|
+
print('\n ℹ WSL detected. How is Claude Code installed on this machine?');
|
|
411
|
+
print(' [1] Claude Code for Windows (the desktop app running on Windows)');
|
|
412
|
+
print(' [2] Claude Code installed inside WSL via npm (default)');
|
|
413
|
+
let wslChoice = '';
|
|
414
|
+
for (let attempt = 0; attempt < 3; attempt++) {
|
|
415
|
+
wslChoice = (await rl.question(' Choice [2]: ')).trim();
|
|
416
|
+
if (wslChoice === '1' || wslChoice === '2' || wslChoice === '')
|
|
417
|
+
break;
|
|
418
|
+
print(' ⚠ Enter 1 or 2 (or press Enter for the default).');
|
|
419
|
+
}
|
|
420
|
+
if (wslChoice !== '1' && wslChoice !== '2' && wslChoice !== '') {
|
|
421
|
+
print(' ⚠ No valid choice entered after 3 attempts — defaulting to Linux Claude Code mode.');
|
|
422
|
+
}
|
|
423
|
+
if (wslChoice === '1') {
|
|
424
|
+
// Pre-validate before committing to --windows-cc: handleInstall calls
|
|
425
|
+
// process.exit(1) when windowsHome is null, which skips the wizard's
|
|
426
|
+
// finally block and leaves stdin with readline listeners attached.
|
|
427
|
+
const windowsHome = resolveWindowsHome();
|
|
428
|
+
if (windowsHome === null) {
|
|
429
|
+
print(' ⚠ Windows home directory could not be resolved (WSL interop may be disabled).');
|
|
430
|
+
print(' Skipping hook installation. Fix WSL interop first, then re-run:');
|
|
431
|
+
print(' preflight install --windows-cc');
|
|
432
|
+
// Skip the install entirely — falling back to --linux-cc would write
|
|
433
|
+
// wsl-linux-cc as the saved platform, silently corrupting the user's
|
|
434
|
+
// Windows CC intent on all future bare installs.
|
|
435
|
+
skipInstall = true;
|
|
436
|
+
}
|
|
437
|
+
else {
|
|
438
|
+
installArgs.push('--windows-cc');
|
|
439
|
+
print(' → Using Windows Claude Code mode (wsl.exe hooks, Windows paths).');
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
else {
|
|
443
|
+
// Pass --linux-cc explicitly so the installer honours this choice even
|
|
444
|
+
// when a prior Windows CC install would otherwise trigger auto-detection.
|
|
445
|
+
installArgs.push('--linux-cc');
|
|
446
|
+
print(' → Using Linux Claude Code mode (direct hooks, WSL home paths).');
|
|
447
|
+
}
|
|
406
448
|
}
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
print('
|
|
410
|
-
|
|
411
|
-
|
|
449
|
+
let hooksInstalled = false;
|
|
450
|
+
if (!skipInstall) {
|
|
451
|
+
print('\nRunning hook installer...');
|
|
452
|
+
try {
|
|
453
|
+
await runInstallCli(installArgs);
|
|
454
|
+
hooksInstalled = true;
|
|
455
|
+
}
|
|
456
|
+
catch {
|
|
457
|
+
// handleInstall already printed the specific error. Set exit code and continue
|
|
458
|
+
// so daemon, schedule, and dashboard steps still run — they do not depend on
|
|
459
|
+
// hook installation.
|
|
460
|
+
process.exitCode = 1;
|
|
461
|
+
}
|
|
462
|
+
if (hooksInstalled)
|
|
463
|
+
print('Hooks installed.');
|
|
464
|
+
if (verifyBinaryOnPath()) {
|
|
465
|
+
print('✓ preflight is on your PATH');
|
|
466
|
+
}
|
|
467
|
+
else {
|
|
468
|
+
print('\n⚠ preflight is not on your PATH.');
|
|
469
|
+
print(' Claude Code hooks will fail with "command not found" until this is resolved.');
|
|
470
|
+
print(' Fix: run `npm link` in the project directory, or install globally:');
|
|
471
|
+
print(' npm install -g @newrelic/preflight');
|
|
472
|
+
}
|
|
412
473
|
}
|
|
413
474
|
}
|
|
414
475
|
// Step 6b: Always-on background dashboard daemon
|
|
415
|
-
const wslEnv = isWsl();
|
|
416
476
|
if ((mode === 'local' || mode === 'both') && process.platform === 'darwin') {
|
|
417
477
|
const binaryPath = resolveBinaryPath();
|
|
418
478
|
const daemonAnswer = (await rl.question('\nInstall always-on background dashboard? Keeps the local dashboard running even when Claude Code is closed [Y/n]: '))
|
|
@@ -525,6 +585,7 @@ export async function runSetupWizard() {
|
|
|
525
585
|
print('');
|
|
526
586
|
}
|
|
527
587
|
finally {
|
|
588
|
+
process.removeListener('exit', rlCleanupOnExit);
|
|
528
589
|
rl.close();
|
|
529
590
|
}
|
|
530
591
|
}
|