workos 0.15.2 → 0.17.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/README.md +44 -14
- package/dist/bin.js +1449 -1261
- package/dist/bin.js.map +1 -1
- package/dist/cli.config.d.ts +1 -0
- package/dist/cli.config.js +1 -0
- package/dist/cli.config.js.map +1 -1
- package/dist/commands/api/index.js +7 -2
- package/dist/commands/api/index.js.map +1 -1
- package/dist/commands/api/interactive.js +9 -3
- package/dist/commands/api/interactive.js.map +1 -1
- package/dist/commands/debug.d.ts +2 -1
- package/dist/commands/debug.js +43 -3
- package/dist/commands/debug.js.map +1 -1
- package/dist/commands/dev.js +5 -4
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/doctor.js +13 -4
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/emulate.js +2 -2
- package/dist/commands/emulate.js.map +1 -1
- package/dist/commands/env.js +5 -4
- package/dist/commands/env.js.map +1 -1
- package/dist/commands/install-skill.js +4 -3
- package/dist/commands/install-skill.js.map +1 -1
- package/dist/commands/install.js +2 -2
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/login.js +3 -3
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/migrations.d.ts +1 -1
- package/dist/commands/migrations.js +4 -1
- package/dist/commands/migrations.js.map +1 -1
- package/dist/commands/telemetry.d.ts +3 -0
- package/dist/commands/telemetry.js +88 -0
- package/dist/commands/telemetry.js.map +1 -0
- package/dist/commands/uninstall-skill.js +3 -2
- package/dist/commands/uninstall-skill.js.map +1 -1
- package/dist/commands/vault-run.d.ts +13 -0
- package/dist/commands/vault-run.js +194 -0
- package/dist/commands/vault-run.js.map +1 -0
- package/dist/commands/vault.d.ts +3 -2
- package/dist/commands/vault.js +41 -8
- package/dist/commands/vault.js.map +1 -1
- package/dist/lib/adapters/cli-adapter.d.ts +7 -0
- package/dist/lib/adapters/cli-adapter.js +49 -0
- package/dist/lib/adapters/cli-adapter.js.map +1 -1
- package/dist/lib/adapters/dashboard-adapter.d.ts +4 -0
- package/dist/lib/adapters/dashboard-adapter.js +24 -0
- package/dist/lib/adapters/dashboard-adapter.js.map +1 -1
- package/dist/lib/adapters/headless-adapter.d.ts +6 -0
- package/dist/lib/adapters/headless-adapter.js +26 -1
- package/dist/lib/adapters/headless-adapter.js.map +1 -1
- package/dist/lib/api-error-handler.d.ts +15 -3
- package/dist/lib/api-error-handler.js +52 -34
- package/dist/lib/api-error-handler.js.map +1 -1
- package/dist/lib/command-aliases.d.ts +8 -0
- package/dist/lib/command-aliases.js +12 -0
- package/dist/lib/command-aliases.js.map +1 -0
- package/dist/lib/constants.d.ts +0 -1
- package/dist/lib/constants.js +0 -1
- package/dist/lib/constants.js.map +1 -1
- package/dist/lib/device-id.d.ts +25 -0
- package/dist/lib/device-id.js +102 -0
- package/dist/lib/device-id.js.map +1 -0
- package/dist/lib/events.d.ts +15 -0
- package/dist/lib/events.js.map +1 -1
- package/dist/lib/installer-core.d.ts +61 -1
- package/dist/lib/installer-core.js +132 -6
- package/dist/lib/installer-core.js.map +1 -1
- package/dist/lib/installer-core.types.d.ts +24 -0
- package/dist/lib/installer-core.types.js.map +1 -1
- package/dist/lib/preferences.d.ts +101 -0
- package/dist/lib/preferences.js +198 -0
- package/dist/lib/preferences.js.map +1 -0
- package/dist/lib/run-with-core.js +40 -15
- package/dist/lib/run-with-core.js.map +1 -1
- package/dist/lib/scaffold/index.d.ts +1 -0
- package/dist/lib/scaffold/index.js +2 -0
- package/dist/lib/scaffold/index.js.map +1 -0
- package/dist/lib/scaffold/scaffold.d.ts +66 -0
- package/dist/lib/scaffold/scaffold.js +156 -0
- package/dist/lib/scaffold/scaffold.js.map +1 -0
- package/dist/lib/settings.d.ts +6 -0
- package/dist/lib/settings.js +7 -0
- package/dist/lib/settings.js.map +1 -1
- package/dist/lib/telemetry-notice.d.ts +25 -0
- package/dist/lib/telemetry-notice.js +56 -0
- package/dist/lib/telemetry-notice.js.map +1 -0
- package/dist/run.d.ts +2 -2
- package/dist/run.js +2 -1
- package/dist/run.js.map +1 -1
- package/dist/test/force-insecure-storage.d.ts +1 -0
- package/dist/test/force-insecure-storage.js +9 -0
- package/dist/test/force-insecure-storage.js.map +1 -0
- package/dist/test/setup.d.ts +1 -0
- package/dist/test/setup.js +38 -0
- package/dist/test/setup.js.map +1 -0
- package/dist/utils/analytics.d.ts +41 -0
- package/dist/utils/analytics.js +199 -12
- package/dist/utils/analytics.js.map +1 -1
- package/dist/utils/box.d.ts +29 -1
- package/dist/utils/box.js +92 -4
- package/dist/utils/box.js.map +1 -1
- package/dist/utils/cli-exit.d.ts +15 -0
- package/dist/utils/cli-exit.js +11 -0
- package/dist/utils/cli-exit.js.map +1 -0
- package/dist/utils/cli-symbols.d.ts +1 -1
- package/dist/utils/command-telemetry.d.ts +17 -0
- package/dist/utils/command-telemetry.js +67 -0
- package/dist/utils/command-telemetry.js.map +1 -0
- package/dist/utils/crash-reporter.d.ts +13 -0
- package/dist/utils/crash-reporter.js +91 -0
- package/dist/utils/crash-reporter.js.map +1 -0
- package/dist/utils/debug.d.ts +1 -0
- package/dist/utils/debug.js +4 -1
- package/dist/utils/debug.js.map +1 -1
- package/dist/utils/exit-codes.d.ts +5 -0
- package/dist/utils/exit-codes.js +30 -1
- package/dist/utils/exit-codes.js.map +1 -1
- package/dist/utils/help-json.d.ts +6 -0
- package/dist/utils/help-json.js +87 -10
- package/dist/utils/help-json.js.map +1 -1
- package/dist/utils/output.d.ts +7 -2
- package/dist/utils/output.js +9 -2
- package/dist/utils/output.js.map +1 -1
- package/dist/utils/telemetry-client.d.ts +30 -2
- package/dist/utils/telemetry-client.js +122 -12
- package/dist/utils/telemetry-client.js.map +1 -1
- package/dist/utils/telemetry-store-forward.d.ts +11 -0
- package/dist/utils/telemetry-store-forward.js +94 -0
- package/dist/utils/telemetry-store-forward.js.map +1 -0
- package/dist/utils/telemetry-types.d.ts +58 -9
- package/dist/utils/telemetry-types.js.map +1 -1
- package/dist/utils/types.d.ts +10 -4
- package/dist/utils/types.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plain CLI preferences store.
|
|
3
|
+
*
|
|
4
|
+
* Stored at ~/.workos/preferences.json as plain JSON. These are NOT secrets —
|
|
5
|
+
* knowing that someone opted out of telemetry leaks nothing — so this
|
|
6
|
+
* deliberately avoids the keyring abstraction (config-store.ts) to prevent a
|
|
7
|
+
* non-secret write from ever triggering the insecure-fallback security warning.
|
|
8
|
+
*
|
|
9
|
+
* Mirrors the structural pattern of device-id.ts: a synchronous accessor backed
|
|
10
|
+
* by a cache, an async prewarm that populates that cache off the blocking-fs
|
|
11
|
+
* path, and a never-throws contract on every read/parse so a corrupt file can
|
|
12
|
+
* never break a command.
|
|
13
|
+
*/
|
|
14
|
+
export interface CliPreferences {
|
|
15
|
+
telemetry?: {
|
|
16
|
+
/** true => the user explicitly opted out of telemetry. */
|
|
17
|
+
optedOut?: boolean;
|
|
18
|
+
/** ISO timestamp the first-run notice was shown — written in Phase 2 only. */
|
|
19
|
+
noticeShownAt?: string;
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
/** Effective source of the resolved telemetry-enabled decision. */
|
|
23
|
+
export type TelemetrySource = 'env' | 'preference' | 'default';
|
|
24
|
+
export declare function getPreferencesPath(): string;
|
|
25
|
+
/**
|
|
26
|
+
* Asynchronously load preferences and warm the cache the synchronous
|
|
27
|
+
* getPreferences() reads. Memoized: the first call performs the IO, concurrent
|
|
28
|
+
* and later callers await the same promise. Prewarming this at startup keeps
|
|
29
|
+
* the synchronous telemetry path off blocking fs IO. Never rejects.
|
|
30
|
+
*/
|
|
31
|
+
export declare function loadPreferences(): Promise<CliPreferences>;
|
|
32
|
+
/**
|
|
33
|
+
* Synchronous accessor. Returns the prewarmed value when loadPreferences() has
|
|
34
|
+
* run; otherwise performs a one-time synchronous read of the same file. On any
|
|
35
|
+
* IO/parse failure returns {} (telemetry stays at its default-on state). Never
|
|
36
|
+
* throws.
|
|
37
|
+
*/
|
|
38
|
+
export declare function getPreferences(): CliPreferences;
|
|
39
|
+
/**
|
|
40
|
+
* Read-modify-write the on-disk preferences, merging `next` over the current
|
|
41
|
+
* persisted value so future fields are never clobbered, then update the cache.
|
|
42
|
+
* Throws on write failure so callers on the command path (opt-out/opt-in) can
|
|
43
|
+
* surface a clear error — the read path swallows, the write path does not.
|
|
44
|
+
*/
|
|
45
|
+
export declare function savePreferences(next: CliPreferences): void;
|
|
46
|
+
/** Whether the user has explicitly opted out via the saved preference. */
|
|
47
|
+
export declare function isTelemetryOptedOut(): boolean;
|
|
48
|
+
/** Persist the opt-out flag. Throws on write failure (see savePreferences). */
|
|
49
|
+
export declare function setTelemetryOptedOut(value: boolean): void;
|
|
50
|
+
/** Whether the first-run telemetry notice has already been shown (ever). */
|
|
51
|
+
export declare function isNoticeShown(): boolean;
|
|
52
|
+
/**
|
|
53
|
+
* Persist the first-run notice as shown, stamping the current time. Uses the
|
|
54
|
+
* read-modify-write savePreferences so it never clobbers the optedOut flag.
|
|
55
|
+
* Throws on write failure (see savePreferences) — the caller in
|
|
56
|
+
* telemetry-notice.ts swallows it so a read-only FS never blocks a command.
|
|
57
|
+
*/
|
|
58
|
+
export declare function markNoticeShown(): void;
|
|
59
|
+
/**
|
|
60
|
+
* Tri-state env override for telemetry.
|
|
61
|
+
*
|
|
62
|
+
* Only the explicit strings 'true' / 'false' count as an override. Any other
|
|
63
|
+
* value — including unset or garbage like '1' — returns undefined and falls
|
|
64
|
+
* through to the saved preference.
|
|
65
|
+
*
|
|
66
|
+
* This is a deliberate, documented change from the old `WORKOS_TELEMETRY !==
|
|
67
|
+
* 'false'` behaviour: previously `WORKOS_TELEMETRY=1` forced telemetry on even
|
|
68
|
+
* for opted-out users; now an opt-out is respected unless the env var
|
|
69
|
+
* explicitly says 'true'.
|
|
70
|
+
*/
|
|
71
|
+
export declare function envTelemetryOverride(): boolean | undefined;
|
|
72
|
+
/**
|
|
73
|
+
* Effective telemetry-enabled decision.
|
|
74
|
+
*
|
|
75
|
+
* Resolution order:
|
|
76
|
+
* 1. envTelemetryOverride() if defined — env wins in BOTH directions.
|
|
77
|
+
* 2. otherwise !isTelemetryOptedOut() — default-on unless explicitly opted out.
|
|
78
|
+
*/
|
|
79
|
+
export declare function isTelemetryEnabled(): boolean;
|
|
80
|
+
/**
|
|
81
|
+
* Which signal produced the effective telemetry decision. Mirrors the
|
|
82
|
+
* precedence in isTelemetryEnabled() so the `telemetry status` command and the
|
|
83
|
+
* resolver can never drift.
|
|
84
|
+
*
|
|
85
|
+
* Note: an explicit opt-in (optedOut === false) reads as 'default', not
|
|
86
|
+
* 'preference' — its outcome is identical to a fresh install, and the resolver
|
|
87
|
+
* only treats optedOut === true as a non-default signal, so reporting
|
|
88
|
+
* 'preference' here would imply a behavioral difference that does not exist.
|
|
89
|
+
*/
|
|
90
|
+
export declare function getTelemetrySource(): TelemetrySource;
|
|
91
|
+
/**
|
|
92
|
+
* Delete the preferences file, returning telemetry to its fresh-install state
|
|
93
|
+
* (opted-in, first-run notice unseen). Used by `debug reset` to wipe stored CLI
|
|
94
|
+
* state alongside credentials and config. No-op if the file does not exist;
|
|
95
|
+
* throws on a real delete failure (e.g. permission denied) so the caller can
|
|
96
|
+
* surface it, mirroring clearConfig/clearCredentials. Resets the in-memory
|
|
97
|
+
* cache so subsequent reads in this process reflect the cleared state.
|
|
98
|
+
*/
|
|
99
|
+
export declare function clearPreferences(): void;
|
|
100
|
+
/** Test seam — resets the in-memory cache between test cases. */
|
|
101
|
+
export declare function __resetPreferencesCache(): void;
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plain CLI preferences store.
|
|
3
|
+
*
|
|
4
|
+
* Stored at ~/.workos/preferences.json as plain JSON. These are NOT secrets —
|
|
5
|
+
* knowing that someone opted out of telemetry leaks nothing — so this
|
|
6
|
+
* deliberately avoids the keyring abstraction (config-store.ts) to prevent a
|
|
7
|
+
* non-secret write from ever triggering the insecure-fallback security warning.
|
|
8
|
+
*
|
|
9
|
+
* Mirrors the structural pattern of device-id.ts: a synchronous accessor backed
|
|
10
|
+
* by a cache, an async prewarm that populates that cache off the blocking-fs
|
|
11
|
+
* path, and a never-throws contract on every read/parse so a corrupt file can
|
|
12
|
+
* never break a command.
|
|
13
|
+
*/
|
|
14
|
+
import fs from 'node:fs';
|
|
15
|
+
import { readFile } from 'node:fs/promises';
|
|
16
|
+
import path from 'node:path';
|
|
17
|
+
import os from 'node:os';
|
|
18
|
+
let cached;
|
|
19
|
+
let pending;
|
|
20
|
+
export function getPreferencesPath() {
|
|
21
|
+
return path.join(os.homedir(), '.workos', 'preferences.json');
|
|
22
|
+
}
|
|
23
|
+
function parsePreferences(raw) {
|
|
24
|
+
try {
|
|
25
|
+
const value = JSON.parse(raw);
|
|
26
|
+
// Defend against a file that parses to a non-object (e.g. `"true"`, `42`).
|
|
27
|
+
if (value && typeof value === 'object' && !Array.isArray(value)) {
|
|
28
|
+
return value;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
// Corrupt JSON — fall through to empty preferences. A later savePreferences
|
|
33
|
+
// overwrites it cleanly; we never auto-delete.
|
|
34
|
+
}
|
|
35
|
+
return {};
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Asynchronously load preferences and warm the cache the synchronous
|
|
39
|
+
* getPreferences() reads. Memoized: the first call performs the IO, concurrent
|
|
40
|
+
* and later callers await the same promise. Prewarming this at startup keeps
|
|
41
|
+
* the synchronous telemetry path off blocking fs IO. Never rejects.
|
|
42
|
+
*/
|
|
43
|
+
export function loadPreferences() {
|
|
44
|
+
if (cached)
|
|
45
|
+
return Promise.resolve(cached);
|
|
46
|
+
if (pending)
|
|
47
|
+
return pending;
|
|
48
|
+
pending = (async () => {
|
|
49
|
+
try {
|
|
50
|
+
const raw = await readFile(getPreferencesPath(), 'utf8');
|
|
51
|
+
cached = parsePreferences(raw);
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
// Missing/unreadable file — treat as no preferences set.
|
|
55
|
+
cached = {};
|
|
56
|
+
}
|
|
57
|
+
finally {
|
|
58
|
+
pending = undefined;
|
|
59
|
+
}
|
|
60
|
+
return cached;
|
|
61
|
+
})();
|
|
62
|
+
return pending;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Synchronous accessor. Returns the prewarmed value when loadPreferences() has
|
|
66
|
+
* run; otherwise performs a one-time synchronous read of the same file. On any
|
|
67
|
+
* IO/parse failure returns {} (telemetry stays at its default-on state). Never
|
|
68
|
+
* throws.
|
|
69
|
+
*/
|
|
70
|
+
export function getPreferences() {
|
|
71
|
+
if (cached)
|
|
72
|
+
return cached;
|
|
73
|
+
try {
|
|
74
|
+
const raw = fs.readFileSync(getPreferencesPath(), 'utf8');
|
|
75
|
+
cached = parsePreferences(raw);
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
// Missing/unreadable/corrupt — telemetry stays at its default-on state.
|
|
79
|
+
cached = {};
|
|
80
|
+
}
|
|
81
|
+
return cached;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Read-modify-write the on-disk preferences, merging `next` over the current
|
|
85
|
+
* persisted value so future fields are never clobbered, then update the cache.
|
|
86
|
+
* Throws on write failure so callers on the command path (opt-out/opt-in) can
|
|
87
|
+
* surface a clear error — the read path swallows, the write path does not.
|
|
88
|
+
*/
|
|
89
|
+
export function savePreferences(next) {
|
|
90
|
+
const filePath = getPreferencesPath();
|
|
91
|
+
// Read-modify-write over the CURRENT on-disk value (not the cache) so a field
|
|
92
|
+
// written by another process / a future phase is preserved.
|
|
93
|
+
let current = {};
|
|
94
|
+
try {
|
|
95
|
+
current = parsePreferences(fs.readFileSync(filePath, 'utf8'));
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
// No existing file (or unreadable) — start from empty.
|
|
99
|
+
}
|
|
100
|
+
const merged = {
|
|
101
|
+
...current,
|
|
102
|
+
...next,
|
|
103
|
+
...(current.telemetry || next.telemetry ? { telemetry: { ...current.telemetry, ...next.telemetry } } : {}),
|
|
104
|
+
};
|
|
105
|
+
fs.mkdirSync(path.dirname(filePath), { recursive: true, mode: 0o700 });
|
|
106
|
+
fs.writeFileSync(filePath, JSON.stringify(merged), { encoding: 'utf8', mode: 0o600 });
|
|
107
|
+
cached = merged;
|
|
108
|
+
}
|
|
109
|
+
/** Whether the user has explicitly opted out via the saved preference. */
|
|
110
|
+
export function isTelemetryOptedOut() {
|
|
111
|
+
return getPreferences().telemetry?.optedOut === true;
|
|
112
|
+
}
|
|
113
|
+
/** Persist the opt-out flag. Throws on write failure (see savePreferences). */
|
|
114
|
+
export function setTelemetryOptedOut(value) {
|
|
115
|
+
savePreferences({ telemetry: { optedOut: value } });
|
|
116
|
+
}
|
|
117
|
+
/** Whether the first-run telemetry notice has already been shown (ever). */
|
|
118
|
+
export function isNoticeShown() {
|
|
119
|
+
return !!getPreferences().telemetry?.noticeShownAt;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Persist the first-run notice as shown, stamping the current time. Uses the
|
|
123
|
+
* read-modify-write savePreferences so it never clobbers the optedOut flag.
|
|
124
|
+
* Throws on write failure (see savePreferences) — the caller in
|
|
125
|
+
* telemetry-notice.ts swallows it so a read-only FS never blocks a command.
|
|
126
|
+
*/
|
|
127
|
+
export function markNoticeShown() {
|
|
128
|
+
savePreferences({ telemetry: { noticeShownAt: new Date().toISOString() } });
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Tri-state env override for telemetry.
|
|
132
|
+
*
|
|
133
|
+
* Only the explicit strings 'true' / 'false' count as an override. Any other
|
|
134
|
+
* value — including unset or garbage like '1' — returns undefined and falls
|
|
135
|
+
* through to the saved preference.
|
|
136
|
+
*
|
|
137
|
+
* This is a deliberate, documented change from the old `WORKOS_TELEMETRY !==
|
|
138
|
+
* 'false'` behaviour: previously `WORKOS_TELEMETRY=1` forced telemetry on even
|
|
139
|
+
* for opted-out users; now an opt-out is respected unless the env var
|
|
140
|
+
* explicitly says 'true'.
|
|
141
|
+
*/
|
|
142
|
+
export function envTelemetryOverride() {
|
|
143
|
+
const value = process.env.WORKOS_TELEMETRY;
|
|
144
|
+
if (value === 'true')
|
|
145
|
+
return true;
|
|
146
|
+
if (value === 'false')
|
|
147
|
+
return false;
|
|
148
|
+
return undefined;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Effective telemetry-enabled decision.
|
|
152
|
+
*
|
|
153
|
+
* Resolution order:
|
|
154
|
+
* 1. envTelemetryOverride() if defined — env wins in BOTH directions.
|
|
155
|
+
* 2. otherwise !isTelemetryOptedOut() — default-on unless explicitly opted out.
|
|
156
|
+
*/
|
|
157
|
+
export function isTelemetryEnabled() {
|
|
158
|
+
const override = envTelemetryOverride();
|
|
159
|
+
if (override !== undefined)
|
|
160
|
+
return override;
|
|
161
|
+
return !isTelemetryOptedOut();
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Which signal produced the effective telemetry decision. Mirrors the
|
|
165
|
+
* precedence in isTelemetryEnabled() so the `telemetry status` command and the
|
|
166
|
+
* resolver can never drift.
|
|
167
|
+
*
|
|
168
|
+
* Note: an explicit opt-in (optedOut === false) reads as 'default', not
|
|
169
|
+
* 'preference' — its outcome is identical to a fresh install, and the resolver
|
|
170
|
+
* only treats optedOut === true as a non-default signal, so reporting
|
|
171
|
+
* 'preference' here would imply a behavioral difference that does not exist.
|
|
172
|
+
*/
|
|
173
|
+
export function getTelemetrySource() {
|
|
174
|
+
if (envTelemetryOverride() !== undefined)
|
|
175
|
+
return 'env';
|
|
176
|
+
if (isTelemetryOptedOut())
|
|
177
|
+
return 'preference';
|
|
178
|
+
return 'default';
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Delete the preferences file, returning telemetry to its fresh-install state
|
|
182
|
+
* (opted-in, first-run notice unseen). Used by `debug reset` to wipe stored CLI
|
|
183
|
+
* state alongside credentials and config. No-op if the file does not exist;
|
|
184
|
+
* throws on a real delete failure (e.g. permission denied) so the caller can
|
|
185
|
+
* surface it, mirroring clearConfig/clearCredentials. Resets the in-memory
|
|
186
|
+
* cache so subsequent reads in this process reflect the cleared state.
|
|
187
|
+
*/
|
|
188
|
+
export function clearPreferences() {
|
|
189
|
+
fs.rmSync(getPreferencesPath(), { force: true });
|
|
190
|
+
cached = {};
|
|
191
|
+
pending = undefined;
|
|
192
|
+
}
|
|
193
|
+
/** Test seam — resets the in-memory cache between test cases. */
|
|
194
|
+
export function __resetPreferencesCache() {
|
|
195
|
+
cached = undefined;
|
|
196
|
+
pending = undefined;
|
|
197
|
+
}
|
|
198
|
+
//# sourceMappingURL=preferences.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preferences.js","sourceRoot":"","sources":["../../src/lib/preferences.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Plain CLI preferences store.\n *\n * Stored at ~/.workos/preferences.json as plain JSON. These are NOT secrets —\n * knowing that someone opted out of telemetry leaks nothing — so this\n * deliberately avoids the keyring abstraction (config-store.ts) to prevent a\n * non-secret write from ever triggering the insecure-fallback security warning.\n *\n * Mirrors the structural pattern of device-id.ts: a synchronous accessor backed\n * by a cache, an async prewarm that populates that cache off the blocking-fs\n * path, and a never-throws contract on every read/parse so a corrupt file can\n * never break a command.\n */\n\nimport fs from 'node:fs';\nimport { readFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport os from 'node:os';\n\nexport interface CliPreferences {\n telemetry?: {\n /** true => the user explicitly opted out of telemetry. */\n optedOut?: boolean;\n /** ISO timestamp the first-run notice was shown — written in Phase 2 only. */\n noticeShownAt?: string;\n };\n}\n\n/** Effective source of the resolved telemetry-enabled decision. */\nexport type TelemetrySource = 'env' | 'preference' | 'default';\n\nlet cached: CliPreferences | undefined;\nlet pending: Promise<CliPreferences> | undefined;\n\nexport function getPreferencesPath(): string {\n return path.join(os.homedir(), '.workos', 'preferences.json');\n}\n\nfunction parsePreferences(raw: string): CliPreferences {\n try {\n const value = JSON.parse(raw);\n // Defend against a file that parses to a non-object (e.g. `\"true\"`, `42`).\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n return value as CliPreferences;\n }\n } catch {\n // Corrupt JSON — fall through to empty preferences. A later savePreferences\n // overwrites it cleanly; we never auto-delete.\n }\n return {};\n}\n\n/**\n * Asynchronously load preferences and warm the cache the synchronous\n * getPreferences() reads. Memoized: the first call performs the IO, concurrent\n * and later callers await the same promise. Prewarming this at startup keeps\n * the synchronous telemetry path off blocking fs IO. Never rejects.\n */\nexport function loadPreferences(): Promise<CliPreferences> {\n if (cached) return Promise.resolve(cached);\n if (pending) return pending;\n\n pending = (async () => {\n try {\n const raw = await readFile(getPreferencesPath(), 'utf8');\n cached = parsePreferences(raw);\n } catch {\n // Missing/unreadable file — treat as no preferences set.\n cached = {};\n } finally {\n pending = undefined;\n }\n return cached;\n })();\n\n return pending;\n}\n\n/**\n * Synchronous accessor. Returns the prewarmed value when loadPreferences() has\n * run; otherwise performs a one-time synchronous read of the same file. On any\n * IO/parse failure returns {} (telemetry stays at its default-on state). Never\n * throws.\n */\nexport function getPreferences(): CliPreferences {\n if (cached) return cached;\n\n try {\n const raw = fs.readFileSync(getPreferencesPath(), 'utf8');\n cached = parsePreferences(raw);\n } catch {\n // Missing/unreadable/corrupt — telemetry stays at its default-on state.\n cached = {};\n }\n return cached;\n}\n\n/**\n * Read-modify-write the on-disk preferences, merging `next` over the current\n * persisted value so future fields are never clobbered, then update the cache.\n * Throws on write failure so callers on the command path (opt-out/opt-in) can\n * surface a clear error — the read path swallows, the write path does not.\n */\nexport function savePreferences(next: CliPreferences): void {\n const filePath = getPreferencesPath();\n\n // Read-modify-write over the CURRENT on-disk value (not the cache) so a field\n // written by another process / a future phase is preserved.\n let current: CliPreferences = {};\n try {\n current = parsePreferences(fs.readFileSync(filePath, 'utf8'));\n } catch {\n // No existing file (or unreadable) — start from empty.\n }\n\n const merged: CliPreferences = {\n ...current,\n ...next,\n ...(current.telemetry || next.telemetry ? { telemetry: { ...current.telemetry, ...next.telemetry } } : {}),\n };\n\n fs.mkdirSync(path.dirname(filePath), { recursive: true, mode: 0o700 });\n fs.writeFileSync(filePath, JSON.stringify(merged), { encoding: 'utf8', mode: 0o600 });\n cached = merged;\n}\n\n/** Whether the user has explicitly opted out via the saved preference. */\nexport function isTelemetryOptedOut(): boolean {\n return getPreferences().telemetry?.optedOut === true;\n}\n\n/** Persist the opt-out flag. Throws on write failure (see savePreferences). */\nexport function setTelemetryOptedOut(value: boolean): void {\n savePreferences({ telemetry: { optedOut: value } });\n}\n\n/** Whether the first-run telemetry notice has already been shown (ever). */\nexport function isNoticeShown(): boolean {\n return !!getPreferences().telemetry?.noticeShownAt;\n}\n\n/**\n * Persist the first-run notice as shown, stamping the current time. Uses the\n * read-modify-write savePreferences so it never clobbers the optedOut flag.\n * Throws on write failure (see savePreferences) — the caller in\n * telemetry-notice.ts swallows it so a read-only FS never blocks a command.\n */\nexport function markNoticeShown(): void {\n savePreferences({ telemetry: { noticeShownAt: new Date().toISOString() } });\n}\n\n/**\n * Tri-state env override for telemetry.\n *\n * Only the explicit strings 'true' / 'false' count as an override. Any other\n * value — including unset or garbage like '1' — returns undefined and falls\n * through to the saved preference.\n *\n * This is a deliberate, documented change from the old `WORKOS_TELEMETRY !==\n * 'false'` behaviour: previously `WORKOS_TELEMETRY=1` forced telemetry on even\n * for opted-out users; now an opt-out is respected unless the env var\n * explicitly says 'true'.\n */\nexport function envTelemetryOverride(): boolean | undefined {\n const value = process.env.WORKOS_TELEMETRY;\n if (value === 'true') return true;\n if (value === 'false') return false;\n return undefined;\n}\n\n/**\n * Effective telemetry-enabled decision.\n *\n * Resolution order:\n * 1. envTelemetryOverride() if defined — env wins in BOTH directions.\n * 2. otherwise !isTelemetryOptedOut() — default-on unless explicitly opted out.\n */\nexport function isTelemetryEnabled(): boolean {\n const override = envTelemetryOverride();\n if (override !== undefined) return override;\n return !isTelemetryOptedOut();\n}\n\n/**\n * Which signal produced the effective telemetry decision. Mirrors the\n * precedence in isTelemetryEnabled() so the `telemetry status` command and the\n * resolver can never drift.\n *\n * Note: an explicit opt-in (optedOut === false) reads as 'default', not\n * 'preference' — its outcome is identical to a fresh install, and the resolver\n * only treats optedOut === true as a non-default signal, so reporting\n * 'preference' here would imply a behavioral difference that does not exist.\n */\nexport function getTelemetrySource(): TelemetrySource {\n if (envTelemetryOverride() !== undefined) return 'env';\n if (isTelemetryOptedOut()) return 'preference';\n return 'default';\n}\n\n/**\n * Delete the preferences file, returning telemetry to its fresh-install state\n * (opted-in, first-run notice unseen). Used by `debug reset` to wipe stored CLI\n * state alongside credentials and config. No-op if the file does not exist;\n * throws on a real delete failure (e.g. permission denied) so the caller can\n * surface it, mirroring clearConfig/clearCredentials. Resets the in-memory\n * cache so subsequent reads in this process reflect the cleared state.\n */\nexport function clearPreferences(): void {\n fs.rmSync(getPreferencesPath(), { force: true });\n cached = {};\n pending = undefined;\n}\n\n/** Test seam — resets the in-memory cache between test cases. */\nexport function __resetPreferencesCache(): void {\n cached = undefined;\n pending = undefined;\n}\n"]}
|
|
@@ -8,17 +8,17 @@ import { CLIAdapter } from './adapters/cli-adapter.js';
|
|
|
8
8
|
import { DashboardAdapter } from './adapters/dashboard-adapter.js';
|
|
9
9
|
import { getInteractionMode, isAgentMode, isCiMode } from '../utils/interaction-mode.js';
|
|
10
10
|
import { getOutputMode, isJsonMode, resolveEffectiveOutputMode, setOutputMode } from '../utils/output.js';
|
|
11
|
+
import { isScaffoldableEmptyDir, resolvePackageManager, runCreateNextApp } from './scaffold/index.js';
|
|
11
12
|
import { parseEnvFile } from '../utils/env-parser.js';
|
|
12
13
|
import { enableDebugLogs, initLogFile, logInfo, logError } from '../utils/debug.js';
|
|
13
|
-
import { getAccessToken,
|
|
14
|
+
import { getAccessToken, saveCredentials, getStagingCredentials, saveStagingCredentials } from './credentials.js';
|
|
14
15
|
import { getConfig, saveConfig, getActiveEnvironment, isUnclaimedEnvironment } from './config-store.js';
|
|
15
16
|
import { checkForEnvFiles, discoverCredentials } from './credential-discovery.js';
|
|
16
17
|
import { requestDeviceCode, pollForToken } from './device-auth.js';
|
|
17
18
|
import { fetchStagingCredentials as fetchStagingCredentialsApi } from './staging-api.js';
|
|
18
|
-
import { getCliAuthClientId, getAuthkitDomain } from './settings.js';
|
|
19
|
+
import { getCliAuthClientId, getAuthkitDomain, getTelemetryUrl } from './settings.js';
|
|
19
20
|
import { analytics } from '../utils/analytics.js';
|
|
20
21
|
import { getVersion } from './settings.js';
|
|
21
|
-
import { getLlmGatewayUrlFromHost } from '../utils/urls.js';
|
|
22
22
|
import { isInGitRepo, getUncommittedOrUntrackedFiles } from '../utils/clack-utils.js';
|
|
23
23
|
import { getCurrentBranch, isProtectedBranch, createBranch as createGitBranch, branchExists, } from '../utils/git-utils.js';
|
|
24
24
|
import { detectChanges, stageAndCommit, pushBranch as pushGitBranch, createPullRequest } from './post-install.js';
|
|
@@ -147,8 +147,8 @@ export async function runWithCore(options) {
|
|
|
147
147
|
skipAuth: options.skipAuth,
|
|
148
148
|
installDir: options.installDir,
|
|
149
149
|
});
|
|
150
|
-
// Configure telemetry endpoint
|
|
151
|
-
const gatewayUrl =
|
|
150
|
+
// Configure telemetry endpoint separately from the LLM gateway proxy.
|
|
151
|
+
const gatewayUrl = getTelemetryUrl();
|
|
152
152
|
analytics.setGatewayUrl(gatewayUrl);
|
|
153
153
|
const existingCreds = readExistingCredentials(options.installDir);
|
|
154
154
|
const augmentedOptions = {
|
|
@@ -194,9 +194,9 @@ export async function runWithCore(options) {
|
|
|
194
194
|
const machineWithActors = installerMachine.provide({
|
|
195
195
|
actors: {
|
|
196
196
|
checkAuthentication: fromPromise(async () => {
|
|
197
|
-
// Check for active environment with credentials (covers unclaimed environments)
|
|
197
|
+
// Check for active environment with credentials (covers unclaimed environments).
|
|
198
198
|
const activeEnv = getActiveEnvironment();
|
|
199
|
-
if (activeEnv?.
|
|
199
|
+
if (activeEnv?.apiKey) {
|
|
200
200
|
return true;
|
|
201
201
|
}
|
|
202
202
|
const token = getAccessToken();
|
|
@@ -205,14 +205,26 @@ export async function runWithCore(options) {
|
|
|
205
205
|
// But keep as safety net for programmatic usage
|
|
206
206
|
throw new Error(`Not authenticated. Run \`${formatWorkOSCommand('auth login')}\` first.`);
|
|
207
207
|
}
|
|
208
|
-
// Set telemetry from existing credentials
|
|
209
|
-
const creds = getCredentials();
|
|
210
|
-
if (creds) {
|
|
211
|
-
analytics.setAccessToken(creds.accessToken);
|
|
212
|
-
analytics.setDistinctId(creds.userId);
|
|
213
|
-
}
|
|
214
208
|
return true;
|
|
215
209
|
}),
|
|
210
|
+
checkWorkspace: fromPromise(async ({ input }) => {
|
|
211
|
+
const scaffoldable = await isScaffoldableEmptyDir(input.options.installDir);
|
|
212
|
+
const packageManager = resolvePackageManager({
|
|
213
|
+
pm: input.options.pm,
|
|
214
|
+
userAgent: process.env.npm_config_user_agent,
|
|
215
|
+
});
|
|
216
|
+
// headlessMode is computed above; --scaffold opts in during interactive runs.
|
|
217
|
+
const autoScaffold = scaffoldable && (headlessMode || !!input.options.scaffold);
|
|
218
|
+
return { scaffoldable, packageManager, autoScaffold };
|
|
219
|
+
}),
|
|
220
|
+
runScaffold: fromPromise(async ({ input }) => {
|
|
221
|
+
const { options: installerOptions, packageManager, emitter: ctxEmitter } = input.context;
|
|
222
|
+
await runCreateNextApp({
|
|
223
|
+
installDir: installerOptions.installDir,
|
|
224
|
+
packageManager: packageManager ?? 'npm',
|
|
225
|
+
emitter: ctxEmitter,
|
|
226
|
+
});
|
|
227
|
+
}),
|
|
216
228
|
detectIntegration: fromPromise(async ({ input }) => {
|
|
217
229
|
const integration = await detectIntegrationFn({ installDir: input.options.installDir });
|
|
218
230
|
return { integration };
|
|
@@ -444,8 +456,7 @@ export async function runWithCore(options) {
|
|
|
444
456
|
inspect: inspector?.inspect,
|
|
445
457
|
});
|
|
446
458
|
await adapter.start();
|
|
447
|
-
|
|
448
|
-
// so agent and CI mode both report through the existing headless bucket.
|
|
459
|
+
analytics.configureAuthFromAvailableSources();
|
|
449
460
|
const mode = headlessMode ? 'headless' : augmentedOptions.dashboard ? 'tui' : 'cli';
|
|
450
461
|
analytics.sessionStart(mode, getVersion());
|
|
451
462
|
let installerStatus = 'success';
|
|
@@ -489,6 +500,20 @@ export async function runWithCore(options) {
|
|
|
489
500
|
}
|
|
490
501
|
finally {
|
|
491
502
|
process.off('SIGINT', handleSigint);
|
|
503
|
+
// Record the detected framework so session.end carries it (and the API can
|
|
504
|
+
// tag install metrics by integration). Known only after detection runs, so
|
|
505
|
+
// it's read from the final machine snapshot here; absent if the session
|
|
506
|
+
// aborted before detection.
|
|
507
|
+
const finalContext = actor?.getSnapshot().context;
|
|
508
|
+
const detectedIntegration = finalContext?.integration;
|
|
509
|
+
if (detectedIntegration) {
|
|
510
|
+
analytics.setTag('installer.integration', detectedIntegration);
|
|
511
|
+
}
|
|
512
|
+
// Record whether the empty-dir flow scaffolded a new app, so session.end
|
|
513
|
+
// carries it for adoption + scaffold-failure tracking.
|
|
514
|
+
if (finalContext?.scaffolded) {
|
|
515
|
+
analytics.setTag('scaffolded', true);
|
|
516
|
+
}
|
|
492
517
|
await analytics.shutdown(installerStatus);
|
|
493
518
|
await adapter.stop();
|
|
494
519
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-with-core.js","sourceRoot":"","sources":["../../src/lib/run-with-core.ts"],"names":[],"mappings":"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","sourcesContent":["import { createActor, fromPromise } from 'xstate';\nimport open from 'open';\nimport { existsSync, readFileSync } from 'fs';\nimport { join } from 'path';\nimport { installerMachine } from './installer-core.js';\nimport { createInstallerEventEmitter } from './events.js';\nimport { CLIAdapter } from './adapters/cli-adapter.js';\nimport { DashboardAdapter } from './adapters/dashboard-adapter.js';\nimport type { InstallerAdapter } from './adapters/types.js';\nimport type { InstallerOptions } from '../utils/types.js';\nimport { getInteractionMode, isAgentMode, isCiMode } from '../utils/interaction-mode.js';\nimport { getOutputMode, isJsonMode, resolveEffectiveOutputMode, setOutputMode } from '../utils/output.js';\nimport type {\n InstallerMachineContext,\n DetectionOutput,\n GitCheckOutput,\n AgentOutput,\n BranchCheckOutput,\n} from './installer-core.types.js';\nimport type { Integration } from './constants.js';\nimport { parseEnvFile } from '../utils/env-parser.js';\nimport { enableDebugLogs, initLogFile, logInfo, logError } from '../utils/debug.js';\n\nimport {\n getAccessToken,\n getCredentials,\n saveCredentials,\n getStagingCredentials,\n saveStagingCredentials,\n} from './credentials.js';\nimport { getConfig, saveConfig, getActiveEnvironment, isUnclaimedEnvironment } from './config-store.js';\nimport { checkForEnvFiles, discoverCredentials } from './credential-discovery.js';\nimport { requestDeviceCode, pollForToken } from './device-auth.js';\nimport { fetchStagingCredentials as fetchStagingCredentialsApi } from './staging-api.js';\nimport { getCliAuthClientId, getAuthkitDomain } from './settings.js';\nimport { analytics } from '../utils/analytics.js';\nimport { getVersion } from './settings.js';\nimport { getLlmGatewayUrlFromHost } from '../utils/urls.js';\nimport { isInGitRepo, getUncommittedOrUntrackedFiles } from '../utils/clack-utils.js';\nimport {\n getCurrentBranch,\n isProtectedBranch,\n createBranch as createGitBranch,\n branchExists,\n} from '../utils/git-utils.js';\nimport { detectChanges, stageAndCommit, pushBranch as pushGitBranch, createPullRequest } from './post-install.js';\nimport {\n generateCommitMessage as generateCommitMessageAi,\n generatePrDescription as generatePrDescriptionAi,\n} from './ai-content.js';\nimport { autoConfigureWorkOSEnvironment } from './workos-management.js';\nimport { detectPort, getCallbackPath } from './port-detection.js';\nimport { writeEnvLocal } from './env-writer.js';\nimport { getRegistry } from './registry.js';\nimport { observeHostFailure } from './host-probe.js';\nimport { formatWorkOSCommand } from '../utils/command-invocation.js';\n\nasync function runIntegrationInstallerFn(integration: Integration, options: InstallerOptions): Promise<string> {\n const registry = await getRegistry();\n const mod = registry.get(integration);\n if (!mod) {\n throw new Error(`Unknown integration: ${integration}`);\n }\n return mod.run(options);\n}\n\nfunction readExistingCredentials(installDir: string): { apiKey?: string; clientId?: string } {\n const envPath = join(installDir, '.env.local');\n if (!existsSync(envPath)) {\n return {};\n }\n\n try {\n const content = readFileSync(envPath, 'utf-8');\n const envVars = parseEnvFile(content);\n return {\n apiKey: envVars.WORKOS_API_KEY || undefined,\n clientId: envVars.WORKOS_CLIENT_ID || undefined,\n };\n } catch {\n return {};\n }\n}\n\nasync function detectIntegrationFn(options: Pick<InstallerOptions, 'installDir'>): Promise<Integration | undefined> {\n const registry = await getRegistry();\n const configs = registry.detectionOrder();\n\n for (const config of configs) {\n // Use the detect function from INTEGRATION_CONFIG in config.ts for JS integrations,\n // or fall back to checking if the framework package is installed\n const detected = await detectSingleIntegration(config.metadata.integration, options);\n if (detected) {\n return config.metadata.integration;\n }\n }\n return undefined;\n}\n\n/**\n * Detect if a single integration matches the project.\n * Uses package.json detection for JS integrations, manifest files for others.\n */\nexport async function detectSingleIntegration(\n integration: string,\n options: Pick<InstallerOptions, 'installDir'>,\n): Promise<boolean> {\n const { getPackageDotJson } = await import('../utils/clack-utils.js');\n const { hasPackageInstalled } = await import('../utils/package-json.js');\n const { existsSync } = await import('node:fs');\n const { join } = await import('node:path');\n\n const registry = await getRegistry();\n const mod = registry.get(integration);\n if (!mod) return false;\n\n const config = mod.config;\n\n // For JS integrations, check package.json\n if (config.metadata.language === 'javascript') {\n // Without a package.json, no JS integration can match. Skip silently so\n // non-JS integrations (Python/Django, Ruby, Go, ...) still get a chance —\n // getPackageDotJson would otherwise call process.exit(1).\n if (!existsSync(join(options.installDir, 'package.json'))) {\n return false;\n }\n const packageJson = await getPackageDotJson(options);\n\n switch (integration) {\n case 'nextjs':\n return hasPackageInstalled('next', packageJson);\n case 'tanstack-start':\n return hasPackageInstalled('@tanstack/react-start', packageJson);\n case 'react-router':\n return hasPackageInstalled('react-router', packageJson);\n case 'react': {\n const hasReact = hasPackageInstalled('react', packageJson);\n const hasNext = hasPackageInstalled('next', packageJson);\n const hasReactRouter = hasPackageInstalled('react-router', packageJson);\n const hasTanstack = hasPackageInstalled('@tanstack/react-start', packageJson);\n const hasSvelteKit = hasPackageInstalled('@sveltejs/kit', packageJson);\n return hasReact && !hasNext && !hasReactRouter && !hasTanstack && !hasSvelteKit;\n }\n case 'sveltekit':\n return hasPackageInstalled('@sveltejs/kit', packageJson);\n case 'node': {\n const hasExpress = hasPackageInstalled('express', packageJson);\n const hasFrontend =\n hasPackageInstalled('next', packageJson) ||\n hasPackageInstalled('@sveltejs/kit', packageJson) ||\n hasPackageInstalled('react', packageJson) ||\n hasPackageInstalled('@tanstack/react-start', packageJson);\n return hasExpress && !hasFrontend;\n }\n case 'vanilla-js':\n return true; // Fallback\n default:\n // Unknown JS integration — try package name detection\n return hasPackageInstalled(config.detection.packageName, packageJson);\n }\n }\n\n // For non-JS integrations, prefer a custom detect() if provided\n // (e.g., Django matches manage.py | pyproject.toml | requirements.txt),\n // otherwise fall back to manifest file existence.\n if (config.metadata.detect) {\n return await config.metadata.detect(options);\n }\n if (config.metadata.manifestFile) {\n return existsSync(join(options.installDir, config.metadata.manifestFile));\n }\n\n return false;\n}\n\nexport async function runWithCore(options: InstallerOptions): Promise<void> {\n // Initialize debug/logging early so we capture all failures\n initLogFile();\n if (options.debug) {\n enableDebugLogs();\n }\n logInfo('Wizard starting with options:', {\n debug: options.debug,\n dashboard: options.dashboard,\n local: options.local,\n ci: options.ci,\n skipAuth: options.skipAuth,\n installDir: options.installDir,\n });\n\n // Configure telemetry endpoint (same URL as LLM gateway)\n const gatewayUrl = getLlmGatewayUrlFromHost();\n analytics.setGatewayUrl(gatewayUrl);\n\n const existingCreds = readExistingCredentials(options.installDir);\n const augmentedOptions: InstallerOptions = {\n ...options,\n apiKey: options.apiKey || existingCreds.apiKey,\n clientId: options.clientId || existingCreds.clientId,\n };\n\n const emitter = createInstallerEventEmitter();\n let actor: ReturnType<typeof createActor<typeof installerMachine>> | null = null;\n\n const sendEvent = (event: { type: string; [key: string]: unknown }) => {\n if (actor) {\n actor.send(event as Parameters<typeof actor.send>[0]);\n }\n };\n\n const nonHumanMode = isAgentMode() || isCiMode();\n if (nonHumanMode && !isJsonMode()) {\n setOutputMode(resolveEffectiveOutputMode(getOutputMode(), getInteractionMode()));\n }\n const headlessMode = nonHumanMode && isJsonMode();\n\n let adapter: InstallerAdapter;\n if (headlessMode) {\n const { HeadlessAdapter } = await import('./adapters/headless-adapter.js');\n adapter = new HeadlessAdapter({\n emitter,\n sendEvent,\n debug: augmentedOptions.debug,\n options: {\n apiKey: augmentedOptions.apiKey,\n clientId: augmentedOptions.clientId,\n noBranch: augmentedOptions.noBranch,\n noCommit: augmentedOptions.noCommit,\n createPr: augmentedOptions.createPr,\n noGitCheck: augmentedOptions.noGitCheck,\n },\n });\n } else if (options.dashboard) {\n adapter = new DashboardAdapter({ emitter, sendEvent, debug: augmentedOptions.debug });\n } else {\n adapter = new CLIAdapter({ emitter, sendEvent, debug: augmentedOptions.debug });\n }\n\n const machineWithActors = installerMachine.provide({\n actors: {\n checkAuthentication: fromPromise(async () => {\n // Check for active environment with credentials (covers unclaimed environments)\n const activeEnv = getActiveEnvironment();\n if (activeEnv?.clientId && activeEnv?.apiKey) {\n return true;\n }\n\n const token = getAccessToken();\n if (!token) {\n // This should rarely happen since bin.ts handles auth first\n // But keep as safety net for programmatic usage\n throw new Error(`Not authenticated. Run \\`${formatWorkOSCommand('auth login')}\\` first.`);\n }\n\n // Set telemetry from existing credentials\n const creds = getCredentials();\n if (creds) {\n analytics.setAccessToken(creds.accessToken);\n analytics.setDistinctId(creds.userId);\n }\n return true;\n }),\n\n detectIntegration: fromPromise<DetectionOutput, { options: InstallerOptions }>(async ({ input }) => {\n const integration = await detectIntegrationFn({ installDir: input.options.installDir });\n return { integration };\n }),\n\n checkGitStatus: fromPromise<GitCheckOutput, { installDir: string }>(async () => {\n if (!isInGitRepo()) {\n return { isClean: true, files: [] };\n }\n const files = getUncommittedOrUntrackedFiles();\n return { isClean: files.length === 0, files };\n }),\n\n configureEnvironment: fromPromise<void, { context: InstallerMachineContext }>(async ({ input }) => {\n const { context } = input;\n const { options: installerOptions, integration, credentials } = context;\n\n if (!integration || !credentials) {\n throw new Error('Missing integration or credentials');\n }\n\n // Non-JS integrations own their env file writing (e.g. Python writes\n // .env inside its own run()). Skip here so we don't leak a .env.local\n // with JS-flavored vars (WORKOS_COOKIE_PASSWORD, wrong redirect port).\n const registry = await getRegistry();\n const mod = registry.get(integration);\n if (mod?.config.metadata.language !== 'javascript') {\n return;\n }\n\n const port = detectPort(integration, installerOptions.installDir);\n const callbackPath = getCallbackPath(integration);\n const redirectUri = installerOptions.redirectUri || `http://localhost:${port}${callbackPath}`;\n\n const requiresApiKey = ['nextjs', 'tanstack-start', 'react-router'].includes(integration);\n if (credentials.apiKey && requiresApiKey) {\n await autoConfigureWorkOSEnvironment(credentials.apiKey, integration, port, {\n homepageUrl: installerOptions.homepageUrl,\n redirectUri: installerOptions.redirectUri,\n });\n }\n\n const redirectUriKey = integration === 'nextjs' ? 'NEXT_PUBLIC_WORKOS_REDIRECT_URI' : 'WORKOS_REDIRECT_URI';\n\n writeEnvLocal(installerOptions.installDir, {\n ...(credentials.apiKey ? { WORKOS_API_KEY: credentials.apiKey } : {}),\n WORKOS_CLIENT_ID: credentials.clientId,\n [redirectUriKey]: redirectUri,\n });\n }),\n\n runAgent: fromPromise<AgentOutput, { context: InstallerMachineContext }>(async ({ input }) => {\n const { context } = input;\n const { options: installerOptions, integration, credentials } = context;\n\n if (!integration) {\n return { success: false, error: new Error('No integration specified') };\n }\n\n try {\n const agentOptions: InstallerOptions = {\n ...installerOptions,\n apiKey: credentials?.apiKey,\n clientId: credentials?.clientId,\n emitter: context.emitter,\n };\n const summary = await runIntegrationInstallerFn(integration, agentOptions);\n return {\n success: true,\n summary: summary || `Successfully installed WorkOS AuthKit for ${integration}!`,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error : new Error(String(error)),\n };\n }\n }),\n\n // Credential discovery actors\n detectEnvFiles: fromPromise(async ({ input }) => {\n return checkForEnvFiles(input.installDir);\n }),\n\n scanEnvFiles: fromPromise(async ({ input }) => {\n return discoverCredentials(input.installDir);\n }),\n\n checkStoredAuth: fromPromise(async () => {\n const activeEnv = getActiveEnvironment();\n if (activeEnv?.apiKey && isUnclaimedEnvironment(activeEnv)) {\n return true;\n }\n\n const token = getAccessToken();\n return token !== null;\n }),\n\n runDeviceAuth: fromPromise(async ({ input }) => {\n const clientId = getCliAuthClientId();\n const authkitDomain = getAuthkitDomain();\n\n const deviceAuth = await requestDeviceCode({\n clientId,\n authkitDomain,\n });\n\n // Emit device started event with verification info\n input.emitter.emit('device:started', {\n verificationUri: deviceAuth.verification_uri,\n verificationUriComplete: deviceAuth.verification_uri_complete,\n userCode: deviceAuth.user_code,\n });\n\n // Open browser\n try {\n const { default: openFn } = await import('open');\n await openFn(deviceAuth.verification_uri_complete, { wait: false });\n } catch (error) {\n observeHostFailure('browser-launch', error, {\n operation: 'open',\n target: deviceAuth.verification_uri_complete,\n label: 'installer device auth browser',\n });\n // User can open manually\n }\n\n const result = await pollForToken(deviceAuth.device_code, {\n clientId,\n authkitDomain,\n interval: deviceAuth.interval,\n onPoll: () => input.emitter.emit('device:polling', {}),\n });\n\n // Save the auth token\n saveCredentials({\n accessToken: result.accessToken,\n expiresAt: result.expiresAt,\n userId: result.userId,\n email: result.email,\n refreshToken: result.refreshToken,\n });\n\n return { result, deviceAuth };\n }),\n\n fetchStagingCredentials: fromPromise(async () => {\n const activeEnv = getActiveEnvironment();\n if (activeEnv?.clientId && activeEnv?.apiKey) {\n return { clientId: activeEnv.clientId, apiKey: activeEnv.apiKey };\n }\n\n const cached = getStagingCredentials();\n if (cached) return cached;\n\n const token = getAccessToken();\n if (!token) throw new Error('No access token available');\n\n const staging = await fetchStagingCredentialsApi(token);\n saveStagingCredentials(staging);\n\n try {\n const config = getConfig() ?? { environments: {} };\n if (!config.environments['default']) {\n config.environments['default'] = {\n name: 'default',\n type: staging.apiKey.startsWith('sk_test_') ? 'sandbox' : 'production',\n apiKey: staging.apiKey,\n clientId: staging.clientId,\n };\n if (!config.activeEnvironment) {\n config.activeEnvironment = 'default';\n }\n saveConfig(config);\n }\n } catch {\n // Don't block install if config-store write fails\n }\n\n return staging;\n }),\n\n // Branch check actors\n checkBranch: fromPromise<BranchCheckOutput, void>(async () => {\n const branch = getCurrentBranch();\n if (!branch) {\n return { branch: null, isProtected: false };\n }\n return {\n branch,\n isProtected: isProtectedBranch(branch),\n };\n }),\n\n createBranch: fromPromise<{ branch: string }, { name: string; fallbackName: string }>(async ({ input }) => {\n const { name, fallbackName } = input;\n const targetBranch = branchExists(name) ? fallbackName : name;\n createGitBranch(targetBranch);\n return { branch: targetBranch };\n }),\n\n // Post-install actors\n detectChanges: fromPromise<{ hasChanges: boolean; files: string[] }, void>(async () => {\n return detectChanges();\n }),\n\n generateCommitMessage: fromPromise<string, { integration: string; files: string[]; direct?: boolean }>(\n async ({ input }) => {\n return generateCommitMessageAi(input.integration, input.files, { direct: input.direct });\n },\n ),\n\n commitChanges: fromPromise<void, { message: string; cwd: string }>(async ({ input }) => {\n stageAndCommit(input.message, input.cwd);\n }),\n\n generatePrDescription: fromPromise<\n string,\n { integration: string; files: string[]; commitMessage: string; direct?: boolean }\n >(async ({ input }) => {\n return generatePrDescriptionAi(input.integration, input.files, input.commitMessage, { direct: input.direct });\n }),\n\n pushBranch: fromPromise<void, { cwd: string }>(async ({ input }) => {\n pushGitBranch(input.cwd);\n }),\n\n createPr: fromPromise<string, { title: string; body: string; cwd: string }>(async ({ input }) => {\n return createPullRequest(input.title, input.body, input.cwd);\n }),\n },\n });\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let inspector: { inspect: any } | undefined;\n if (augmentedOptions.inspect) {\n const originalLog = console.log;\n let inspectUrl: string | undefined;\n\n console.log = (...args: unknown[]) => {\n const msg = args.join(' ');\n if (typeof msg === 'string' && msg.startsWith('https://stately.ai/inspect/')) {\n inspectUrl = msg;\n console.log = originalLog;\n console.log(`Opening XState inspector: ${inspectUrl}`);\n void open(inspectUrl).catch((error: unknown) => {\n observeHostFailure('browser-launch', error, {\n operation: 'open',\n target: inspectUrl,\n label: 'XState inspector browser',\n });\n });\n } else {\n originalLog.apply(console, args);\n }\n };\n\n // Dynamic import - @statelyai/inspect is a devDependency\n const { createSkyInspector } = await import('@statelyai/inspect');\n inspector = createSkyInspector();\n setTimeout(() => {\n console.log = originalLog;\n }, 5000).unref();\n }\n\n actor = createActor(machineWithActors, {\n input: { emitter, options: augmentedOptions },\n inspect: inspector?.inspect,\n });\n\n await adapter.start();\n\n // Start telemetry session. Analytics currently accepts cli/tui/headless only,\n // so agent and CI mode both report through the existing headless bucket.\n const mode = headlessMode ? 'headless' : augmentedOptions.dashboard ? 'tui' : 'cli';\n analytics.sessionStart(mode, getVersion());\n\n let installerStatus: 'success' | 'error' | 'cancelled' = 'success';\n\n // Handle ctrl+c by sending CANCEL to state machine for graceful shutdown\n const handleSigint = () => {\n installerStatus = 'cancelled';\n actor?.send({ type: 'CANCEL' });\n };\n process.on('SIGINT', handleSigint);\n\n try {\n await new Promise<void>((resolve, reject) => {\n actor!.subscribe({\n complete: () => {\n const snapshot = actor!.getSnapshot();\n if (snapshot.value === 'error') {\n const err = snapshot.context.error;\n installerStatus = 'error';\n reject(err ?? new Error('Wizard failed'));\n } else if (snapshot.value === 'cancelled') {\n installerStatus = 'cancelled';\n resolve();\n } else {\n resolve();\n }\n },\n error: (err) => {\n installerStatus = 'error';\n reject(err);\n },\n });\n\n actor!.start();\n actor!.send({ type: 'START' });\n });\n } catch (error) {\n installerStatus = 'error';\n logError('Wizard failed with error:', error instanceof Error ? error.stack || error.message : String(error));\n throw error;\n } finally {\n process.off('SIGINT', handleSigint);\n await analytics.shutdown(installerStatus);\n await adapter.stop();\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"run-with-core.js","sourceRoot":"","sources":["../../src/lib/run-with-core.ts"],"names":[],"mappings":"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","sourcesContent":["import { createActor, fromPromise } from 'xstate';\nimport open from 'open';\nimport { existsSync, readFileSync } from 'fs';\nimport { join } from 'path';\nimport { installerMachine } from './installer-core.js';\nimport { createInstallerEventEmitter } from './events.js';\nimport { CLIAdapter } from './adapters/cli-adapter.js';\nimport { DashboardAdapter } from './adapters/dashboard-adapter.js';\nimport type { InstallerAdapter } from './adapters/types.js';\nimport type { InstallerOptions } from '../utils/types.js';\nimport { getInteractionMode, isAgentMode, isCiMode } from '../utils/interaction-mode.js';\nimport { getOutputMode, isJsonMode, resolveEffectiveOutputMode, setOutputMode } from '../utils/output.js';\nimport type {\n InstallerMachineContext,\n DetectionOutput,\n GitCheckOutput,\n AgentOutput,\n BranchCheckOutput,\n WorkspaceCheckOutput,\n} from './installer-core.types.js';\nimport { isScaffoldableEmptyDir, resolvePackageManager, runCreateNextApp } from './scaffold/index.js';\nimport type { Integration } from './constants.js';\nimport { parseEnvFile } from '../utils/env-parser.js';\nimport { enableDebugLogs, initLogFile, logInfo, logError } from '../utils/debug.js';\n\nimport { getAccessToken, saveCredentials, getStagingCredentials, saveStagingCredentials } from './credentials.js';\nimport { getConfig, saveConfig, getActiveEnvironment, isUnclaimedEnvironment } from './config-store.js';\nimport { checkForEnvFiles, discoverCredentials } from './credential-discovery.js';\nimport { requestDeviceCode, pollForToken } from './device-auth.js';\nimport { fetchStagingCredentials as fetchStagingCredentialsApi } from './staging-api.js';\nimport { getCliAuthClientId, getAuthkitDomain, getTelemetryUrl } from './settings.js';\nimport { analytics } from '../utils/analytics.js';\nimport { getVersion } from './settings.js';\nimport { isInGitRepo, getUncommittedOrUntrackedFiles } from '../utils/clack-utils.js';\nimport {\n getCurrentBranch,\n isProtectedBranch,\n createBranch as createGitBranch,\n branchExists,\n} from '../utils/git-utils.js';\nimport { detectChanges, stageAndCommit, pushBranch as pushGitBranch, createPullRequest } from './post-install.js';\nimport {\n generateCommitMessage as generateCommitMessageAi,\n generatePrDescription as generatePrDescriptionAi,\n} from './ai-content.js';\nimport { autoConfigureWorkOSEnvironment } from './workos-management.js';\nimport { detectPort, getCallbackPath } from './port-detection.js';\nimport { writeEnvLocal } from './env-writer.js';\nimport { getRegistry } from './registry.js';\nimport { observeHostFailure } from './host-probe.js';\nimport { formatWorkOSCommand } from '../utils/command-invocation.js';\n\nasync function runIntegrationInstallerFn(integration: Integration, options: InstallerOptions): Promise<string> {\n const registry = await getRegistry();\n const mod = registry.get(integration);\n if (!mod) {\n throw new Error(`Unknown integration: ${integration}`);\n }\n return mod.run(options);\n}\n\nfunction readExistingCredentials(installDir: string): { apiKey?: string; clientId?: string } {\n const envPath = join(installDir, '.env.local');\n if (!existsSync(envPath)) {\n return {};\n }\n\n try {\n const content = readFileSync(envPath, 'utf-8');\n const envVars = parseEnvFile(content);\n return {\n apiKey: envVars.WORKOS_API_KEY || undefined,\n clientId: envVars.WORKOS_CLIENT_ID || undefined,\n };\n } catch {\n return {};\n }\n}\n\nasync function detectIntegrationFn(options: Pick<InstallerOptions, 'installDir'>): Promise<Integration | undefined> {\n const registry = await getRegistry();\n const configs = registry.detectionOrder();\n\n for (const config of configs) {\n // Use the detect function from INTEGRATION_CONFIG in config.ts for JS integrations,\n // or fall back to checking if the framework package is installed\n const detected = await detectSingleIntegration(config.metadata.integration, options);\n if (detected) {\n return config.metadata.integration;\n }\n }\n return undefined;\n}\n\n/**\n * Detect if a single integration matches the project.\n * Uses package.json detection for JS integrations, manifest files for others.\n */\nexport async function detectSingleIntegration(\n integration: string,\n options: Pick<InstallerOptions, 'installDir'>,\n): Promise<boolean> {\n const { getPackageDotJson } = await import('../utils/clack-utils.js');\n const { hasPackageInstalled } = await import('../utils/package-json.js');\n const { existsSync } = await import('node:fs');\n const { join } = await import('node:path');\n\n const registry = await getRegistry();\n const mod = registry.get(integration);\n if (!mod) return false;\n\n const config = mod.config;\n\n // For JS integrations, check package.json\n if (config.metadata.language === 'javascript') {\n // Without a package.json, no JS integration can match. Skip silently so\n // non-JS integrations (Python/Django, Ruby, Go, ...) still get a chance —\n // getPackageDotJson would otherwise call process.exit(1).\n if (!existsSync(join(options.installDir, 'package.json'))) {\n return false;\n }\n const packageJson = await getPackageDotJson(options);\n\n switch (integration) {\n case 'nextjs':\n return hasPackageInstalled('next', packageJson);\n case 'tanstack-start':\n return hasPackageInstalled('@tanstack/react-start', packageJson);\n case 'react-router':\n return hasPackageInstalled('react-router', packageJson);\n case 'react': {\n const hasReact = hasPackageInstalled('react', packageJson);\n const hasNext = hasPackageInstalled('next', packageJson);\n const hasReactRouter = hasPackageInstalled('react-router', packageJson);\n const hasTanstack = hasPackageInstalled('@tanstack/react-start', packageJson);\n const hasSvelteKit = hasPackageInstalled('@sveltejs/kit', packageJson);\n return hasReact && !hasNext && !hasReactRouter && !hasTanstack && !hasSvelteKit;\n }\n case 'sveltekit':\n return hasPackageInstalled('@sveltejs/kit', packageJson);\n case 'node': {\n const hasExpress = hasPackageInstalled('express', packageJson);\n const hasFrontend =\n hasPackageInstalled('next', packageJson) ||\n hasPackageInstalled('@sveltejs/kit', packageJson) ||\n hasPackageInstalled('react', packageJson) ||\n hasPackageInstalled('@tanstack/react-start', packageJson);\n return hasExpress && !hasFrontend;\n }\n case 'vanilla-js':\n return true; // Fallback\n default:\n // Unknown JS integration — try package name detection\n return hasPackageInstalled(config.detection.packageName, packageJson);\n }\n }\n\n // For non-JS integrations, prefer a custom detect() if provided\n // (e.g., Django matches manage.py | pyproject.toml | requirements.txt),\n // otherwise fall back to manifest file existence.\n if (config.metadata.detect) {\n return await config.metadata.detect(options);\n }\n if (config.metadata.manifestFile) {\n return existsSync(join(options.installDir, config.metadata.manifestFile));\n }\n\n return false;\n}\n\nexport async function runWithCore(options: InstallerOptions): Promise<void> {\n // Initialize debug/logging early so we capture all failures\n initLogFile();\n if (options.debug) {\n enableDebugLogs();\n }\n logInfo('Wizard starting with options:', {\n debug: options.debug,\n dashboard: options.dashboard,\n local: options.local,\n ci: options.ci,\n skipAuth: options.skipAuth,\n installDir: options.installDir,\n });\n\n // Configure telemetry endpoint separately from the LLM gateway proxy.\n const gatewayUrl = getTelemetryUrl();\n analytics.setGatewayUrl(gatewayUrl);\n\n const existingCreds = readExistingCredentials(options.installDir);\n const augmentedOptions: InstallerOptions = {\n ...options,\n apiKey: options.apiKey || existingCreds.apiKey,\n clientId: options.clientId || existingCreds.clientId,\n };\n\n const emitter = createInstallerEventEmitter();\n let actor: ReturnType<typeof createActor<typeof installerMachine>> | null = null;\n\n const sendEvent = (event: { type: string; [key: string]: unknown }) => {\n if (actor) {\n actor.send(event as Parameters<typeof actor.send>[0]);\n }\n };\n\n const nonHumanMode = isAgentMode() || isCiMode();\n if (nonHumanMode && !isJsonMode()) {\n setOutputMode(resolveEffectiveOutputMode(getOutputMode(), getInteractionMode()));\n }\n const headlessMode = nonHumanMode && isJsonMode();\n\n let adapter: InstallerAdapter;\n if (headlessMode) {\n const { HeadlessAdapter } = await import('./adapters/headless-adapter.js');\n adapter = new HeadlessAdapter({\n emitter,\n sendEvent,\n debug: augmentedOptions.debug,\n options: {\n apiKey: augmentedOptions.apiKey,\n clientId: augmentedOptions.clientId,\n noBranch: augmentedOptions.noBranch,\n noCommit: augmentedOptions.noCommit,\n createPr: augmentedOptions.createPr,\n noGitCheck: augmentedOptions.noGitCheck,\n },\n });\n } else if (options.dashboard) {\n adapter = new DashboardAdapter({ emitter, sendEvent, debug: augmentedOptions.debug });\n } else {\n adapter = new CLIAdapter({ emitter, sendEvent, debug: augmentedOptions.debug });\n }\n\n const machineWithActors = installerMachine.provide({\n actors: {\n checkAuthentication: fromPromise(async () => {\n // Check for active environment with credentials (covers unclaimed environments).\n const activeEnv = getActiveEnvironment();\n if (activeEnv?.apiKey) {\n return true;\n }\n\n const token = getAccessToken();\n if (!token) {\n // This should rarely happen since bin.ts handles auth first\n // But keep as safety net for programmatic usage\n throw new Error(`Not authenticated. Run \\`${formatWorkOSCommand('auth login')}\\` first.`);\n }\n\n return true;\n }),\n\n checkWorkspace: fromPromise<WorkspaceCheckOutput, { options: InstallerOptions }>(async ({ input }) => {\n const scaffoldable = await isScaffoldableEmptyDir(input.options.installDir);\n const packageManager = resolvePackageManager({\n pm: input.options.pm,\n userAgent: process.env.npm_config_user_agent,\n });\n // headlessMode is computed above; --scaffold opts in during interactive runs.\n const autoScaffold = scaffoldable && (headlessMode || !!input.options.scaffold);\n return { scaffoldable, packageManager, autoScaffold };\n }),\n\n runScaffold: fromPromise<void, { context: InstallerMachineContext }>(async ({ input }) => {\n const { options: installerOptions, packageManager, emitter: ctxEmitter } = input.context;\n await runCreateNextApp({\n installDir: installerOptions.installDir,\n packageManager: packageManager ?? 'npm',\n emitter: ctxEmitter,\n });\n }),\n\n detectIntegration: fromPromise<DetectionOutput, { options: InstallerOptions }>(async ({ input }) => {\n const integration = await detectIntegrationFn({ installDir: input.options.installDir });\n return { integration };\n }),\n\n checkGitStatus: fromPromise<GitCheckOutput, { installDir: string }>(async () => {\n if (!isInGitRepo()) {\n return { isClean: true, files: [] };\n }\n const files = getUncommittedOrUntrackedFiles();\n return { isClean: files.length === 0, files };\n }),\n\n configureEnvironment: fromPromise<void, { context: InstallerMachineContext }>(async ({ input }) => {\n const { context } = input;\n const { options: installerOptions, integration, credentials } = context;\n\n if (!integration || !credentials) {\n throw new Error('Missing integration or credentials');\n }\n\n // Non-JS integrations own their env file writing (e.g. Python writes\n // .env inside its own run()). Skip here so we don't leak a .env.local\n // with JS-flavored vars (WORKOS_COOKIE_PASSWORD, wrong redirect port).\n const registry = await getRegistry();\n const mod = registry.get(integration);\n if (mod?.config.metadata.language !== 'javascript') {\n return;\n }\n\n const port = detectPort(integration, installerOptions.installDir);\n const callbackPath = getCallbackPath(integration);\n const redirectUri = installerOptions.redirectUri || `http://localhost:${port}${callbackPath}`;\n\n const requiresApiKey = ['nextjs', 'tanstack-start', 'react-router'].includes(integration);\n if (credentials.apiKey && requiresApiKey) {\n await autoConfigureWorkOSEnvironment(credentials.apiKey, integration, port, {\n homepageUrl: installerOptions.homepageUrl,\n redirectUri: installerOptions.redirectUri,\n });\n }\n\n const redirectUriKey = integration === 'nextjs' ? 'NEXT_PUBLIC_WORKOS_REDIRECT_URI' : 'WORKOS_REDIRECT_URI';\n\n writeEnvLocal(installerOptions.installDir, {\n ...(credentials.apiKey ? { WORKOS_API_KEY: credentials.apiKey } : {}),\n WORKOS_CLIENT_ID: credentials.clientId,\n [redirectUriKey]: redirectUri,\n });\n }),\n\n runAgent: fromPromise<AgentOutput, { context: InstallerMachineContext }>(async ({ input }) => {\n const { context } = input;\n const { options: installerOptions, integration, credentials } = context;\n\n if (!integration) {\n return { success: false, error: new Error('No integration specified') };\n }\n\n try {\n const agentOptions: InstallerOptions = {\n ...installerOptions,\n apiKey: credentials?.apiKey,\n clientId: credentials?.clientId,\n emitter: context.emitter,\n };\n const summary = await runIntegrationInstallerFn(integration, agentOptions);\n return {\n success: true,\n summary: summary || `Successfully installed WorkOS AuthKit for ${integration}!`,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error : new Error(String(error)),\n };\n }\n }),\n\n // Credential discovery actors\n detectEnvFiles: fromPromise(async ({ input }) => {\n return checkForEnvFiles(input.installDir);\n }),\n\n scanEnvFiles: fromPromise(async ({ input }) => {\n return discoverCredentials(input.installDir);\n }),\n\n checkStoredAuth: fromPromise(async () => {\n const activeEnv = getActiveEnvironment();\n if (activeEnv?.apiKey && isUnclaimedEnvironment(activeEnv)) {\n return true;\n }\n\n const token = getAccessToken();\n return token !== null;\n }),\n\n runDeviceAuth: fromPromise(async ({ input }) => {\n const clientId = getCliAuthClientId();\n const authkitDomain = getAuthkitDomain();\n\n const deviceAuth = await requestDeviceCode({\n clientId,\n authkitDomain,\n });\n\n // Emit device started event with verification info\n input.emitter.emit('device:started', {\n verificationUri: deviceAuth.verification_uri,\n verificationUriComplete: deviceAuth.verification_uri_complete,\n userCode: deviceAuth.user_code,\n });\n\n // Open browser\n try {\n const { default: openFn } = await import('open');\n await openFn(deviceAuth.verification_uri_complete, { wait: false });\n } catch (error) {\n observeHostFailure('browser-launch', error, {\n operation: 'open',\n target: deviceAuth.verification_uri_complete,\n label: 'installer device auth browser',\n });\n // User can open manually\n }\n\n const result = await pollForToken(deviceAuth.device_code, {\n clientId,\n authkitDomain,\n interval: deviceAuth.interval,\n onPoll: () => input.emitter.emit('device:polling', {}),\n });\n\n // Save the auth token\n saveCredentials({\n accessToken: result.accessToken,\n expiresAt: result.expiresAt,\n userId: result.userId,\n email: result.email,\n refreshToken: result.refreshToken,\n });\n\n return { result, deviceAuth };\n }),\n\n fetchStagingCredentials: fromPromise(async () => {\n const activeEnv = getActiveEnvironment();\n if (activeEnv?.clientId && activeEnv?.apiKey) {\n return { clientId: activeEnv.clientId, apiKey: activeEnv.apiKey };\n }\n\n const cached = getStagingCredentials();\n if (cached) return cached;\n\n const token = getAccessToken();\n if (!token) throw new Error('No access token available');\n\n const staging = await fetchStagingCredentialsApi(token);\n saveStagingCredentials(staging);\n\n try {\n const config = getConfig() ?? { environments: {} };\n if (!config.environments['default']) {\n config.environments['default'] = {\n name: 'default',\n type: staging.apiKey.startsWith('sk_test_') ? 'sandbox' : 'production',\n apiKey: staging.apiKey,\n clientId: staging.clientId,\n };\n if (!config.activeEnvironment) {\n config.activeEnvironment = 'default';\n }\n saveConfig(config);\n }\n } catch {\n // Don't block install if config-store write fails\n }\n\n return staging;\n }),\n\n // Branch check actors\n checkBranch: fromPromise<BranchCheckOutput, void>(async () => {\n const branch = getCurrentBranch();\n if (!branch) {\n return { branch: null, isProtected: false };\n }\n return {\n branch,\n isProtected: isProtectedBranch(branch),\n };\n }),\n\n createBranch: fromPromise<{ branch: string }, { name: string; fallbackName: string }>(async ({ input }) => {\n const { name, fallbackName } = input;\n const targetBranch = branchExists(name) ? fallbackName : name;\n createGitBranch(targetBranch);\n return { branch: targetBranch };\n }),\n\n // Post-install actors\n detectChanges: fromPromise<{ hasChanges: boolean; files: string[] }, void>(async () => {\n return detectChanges();\n }),\n\n generateCommitMessage: fromPromise<string, { integration: string; files: string[]; direct?: boolean }>(\n async ({ input }) => {\n return generateCommitMessageAi(input.integration, input.files, { direct: input.direct });\n },\n ),\n\n commitChanges: fromPromise<void, { message: string; cwd: string }>(async ({ input }) => {\n stageAndCommit(input.message, input.cwd);\n }),\n\n generatePrDescription: fromPromise<\n string,\n { integration: string; files: string[]; commitMessage: string; direct?: boolean }\n >(async ({ input }) => {\n return generatePrDescriptionAi(input.integration, input.files, input.commitMessage, { direct: input.direct });\n }),\n\n pushBranch: fromPromise<void, { cwd: string }>(async ({ input }) => {\n pushGitBranch(input.cwd);\n }),\n\n createPr: fromPromise<string, { title: string; body: string; cwd: string }>(async ({ input }) => {\n return createPullRequest(input.title, input.body, input.cwd);\n }),\n },\n });\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let inspector: { inspect: any } | undefined;\n if (augmentedOptions.inspect) {\n const originalLog = console.log;\n let inspectUrl: string | undefined;\n\n console.log = (...args: unknown[]) => {\n const msg = args.join(' ');\n if (typeof msg === 'string' && msg.startsWith('https://stately.ai/inspect/')) {\n inspectUrl = msg;\n console.log = originalLog;\n console.log(`Opening XState inspector: ${inspectUrl}`);\n void open(inspectUrl).catch((error: unknown) => {\n observeHostFailure('browser-launch', error, {\n operation: 'open',\n target: inspectUrl,\n label: 'XState inspector browser',\n });\n });\n } else {\n originalLog.apply(console, args);\n }\n };\n\n // Dynamic import - @statelyai/inspect is a devDependency\n const { createSkyInspector } = await import('@statelyai/inspect');\n inspector = createSkyInspector();\n setTimeout(() => {\n console.log = originalLog;\n }, 5000).unref();\n }\n\n actor = createActor(machineWithActors, {\n input: { emitter, options: augmentedOptions },\n inspect: inspector?.inspect,\n });\n\n await adapter.start();\n\n analytics.configureAuthFromAvailableSources();\n const mode = headlessMode ? 'headless' : augmentedOptions.dashboard ? 'tui' : 'cli';\n analytics.sessionStart(mode, getVersion());\n\n let installerStatus: 'success' | 'error' | 'cancelled' = 'success';\n\n // Handle ctrl+c by sending CANCEL to state machine for graceful shutdown\n const handleSigint = () => {\n installerStatus = 'cancelled';\n actor?.send({ type: 'CANCEL' });\n };\n process.on('SIGINT', handleSigint);\n\n try {\n await new Promise<void>((resolve, reject) => {\n actor!.subscribe({\n complete: () => {\n const snapshot = actor!.getSnapshot();\n if (snapshot.value === 'error') {\n const err = snapshot.context.error;\n installerStatus = 'error';\n reject(err ?? new Error('Wizard failed'));\n } else if (snapshot.value === 'cancelled') {\n installerStatus = 'cancelled';\n resolve();\n } else {\n resolve();\n }\n },\n error: (err) => {\n installerStatus = 'error';\n reject(err);\n },\n });\n\n actor!.start();\n actor!.send({ type: 'START' });\n });\n } catch (error) {\n installerStatus = 'error';\n logError('Wizard failed with error:', error instanceof Error ? error.stack || error.message : String(error));\n throw error;\n } finally {\n process.off('SIGINT', handleSigint);\n // Record the detected framework so session.end carries it (and the API can\n // tag install metrics by integration). Known only after detection runs, so\n // it's read from the final machine snapshot here; absent if the session\n // aborted before detection.\n const finalContext = actor?.getSnapshot().context;\n const detectedIntegration = finalContext?.integration;\n if (detectedIntegration) {\n analytics.setTag('installer.integration', detectedIntegration);\n }\n // Record whether the empty-dir flow scaffolded a new app, so session.end\n // carries it for adoption + scaffold-failure tracking.\n if (finalContext?.scaffolded) {\n analytics.setTag('scaffolded', true);\n }\n await analytics.shutdown(installerStatus);\n await adapter.stop();\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { CREATE_NEXT_APP_VERSION, SAFE_EMPTY_FILES, buildCreateNextAppArgs, isScaffoldableEmptyDir, resolvePackageManager, runCreateNextApp, type PackageManager, } from './scaffold.js';
|