cc-control-agent 2.0.2 → 2.0.4

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.
Files changed (94) hide show
  1. package/dist/src/auth/device-manager.d.ts.map +1 -0
  2. package/dist/{auth → src/auth}/device-manager.js +11 -5
  3. package/dist/src/auth/device-manager.js.map +1 -0
  4. package/dist/src/auth/encryption.d.ts +21 -0
  5. package/dist/src/auth/encryption.d.ts.map +1 -0
  6. package/dist/src/auth/encryption.js +85 -0
  7. package/dist/src/auth/encryption.js.map +1 -0
  8. package/dist/src/auth/onboarding.d.ts +81 -0
  9. package/dist/src/auth/onboarding.d.ts.map +1 -0
  10. package/dist/src/auth/onboarding.js +327 -0
  11. package/dist/src/auth/onboarding.js.map +1 -0
  12. package/dist/{auth → src/auth}/user-credentials.d.ts +5 -0
  13. package/dist/src/auth/user-credentials.d.ts.map +1 -0
  14. package/dist/{auth → src/auth}/user-credentials.js +45 -5
  15. package/dist/src/auth/user-credentials.js.map +1 -0
  16. package/dist/src/claude/hook-handler.d.ts.map +1 -0
  17. package/dist/src/claude/hook-handler.js.map +1 -0
  18. package/dist/src/cli.d.ts.map +1 -0
  19. package/dist/src/cli.js +308 -0
  20. package/dist/src/cli.js.map +1 -0
  21. package/dist/src/command/handler.d.ts.map +1 -0
  22. package/dist/src/command/handler.js.map +1 -0
  23. package/dist/src/command/validator.d.ts.map +1 -0
  24. package/dist/src/command/validator.js.map +1 -0
  25. package/dist/src/communication/websocket-client.d.ts.map +1 -0
  26. package/dist/{communication → src/communication}/websocket-client.js +25 -1
  27. package/dist/src/communication/websocket-client.js.map +1 -0
  28. package/dist/src/config/default.d.ts.map +1 -0
  29. package/dist/{config → src/config}/default.js +1 -1
  30. package/dist/src/config/default.js.map +1 -0
  31. package/dist/src/index.d.ts.map +1 -0
  32. package/dist/src/index.js.map +1 -0
  33. package/dist/src/session/claude-monitor.d.ts.map +1 -0
  34. package/dist/{session → src/session}/claude-monitor.js +13 -8
  35. package/dist/{session → src/session}/claude-monitor.js.map +1 -1
  36. package/dist/src/session/monitor.d.ts.map +1 -0
  37. package/dist/src/session/monitor.js.map +1 -0
  38. package/dist/src/session/parser.d.ts.map +1 -0
  39. package/dist/src/session/parser.js.map +1 -0
  40. package/dist/src/utils/logger-new.d.ts +2 -0
  41. package/dist/{utils → src/utils}/logger-new.d.ts.map +1 -1
  42. package/dist/src/utils/logger-new.js +2 -0
  43. package/dist/{utils → src/utils}/logger-new.js.map +1 -1
  44. package/dist/src/utils/logger.d.ts.map +1 -0
  45. package/dist/src/utils/logger.js.map +1 -0
  46. package/dist/tsconfig.tsbuildinfo +1 -0
  47. package/package.json +16 -20
  48. package/dist/auth/device-manager.d.ts.map +0 -1
  49. package/dist/auth/device-manager.js.map +0 -1
  50. package/dist/auth/user-credentials.d.ts.map +0 -1
  51. package/dist/auth/user-credentials.js.map +0 -1
  52. package/dist/claude/hook-handler.d.ts.map +0 -1
  53. package/dist/claude/hook-handler.js.map +0 -1
  54. package/dist/cli.d.ts.map +0 -1
  55. package/dist/cli.js +0 -195
  56. package/dist/cli.js.map +0 -1
  57. package/dist/command/handler.d.ts.map +0 -1
  58. package/dist/command/handler.js.map +0 -1
  59. package/dist/command/validator.d.ts.map +0 -1
  60. package/dist/command/validator.js.map +0 -1
  61. package/dist/communication/websocket-client.d.ts.map +0 -1
  62. package/dist/communication/websocket-client.js.map +0 -1
  63. package/dist/config/default.d.ts.map +0 -1
  64. package/dist/config/default.js.map +0 -1
  65. package/dist/index.d.ts.map +0 -1
  66. package/dist/index.js.map +0 -1
  67. package/dist/session/claude-monitor.d.ts.map +0 -1
  68. package/dist/session/monitor.d.ts.map +0 -1
  69. package/dist/session/monitor.js.map +0 -1
  70. package/dist/session/parser.d.ts.map +0 -1
  71. package/dist/session/parser.js.map +0 -1
  72. package/dist/utils/logger-new.d.ts +0 -1
  73. package/dist/utils/logger-new.js +0 -2
  74. package/dist/utils/logger.d.ts.map +0 -1
  75. package/dist/utils/logger.js.map +0 -1
  76. /package/dist/{auth → src/auth}/device-manager.d.ts +0 -0
  77. /package/dist/{claude → src/claude}/hook-handler.d.ts +0 -0
  78. /package/dist/{claude → src/claude}/hook-handler.js +0 -0
  79. /package/dist/{cli.d.ts → src/cli.d.ts} +0 -0
  80. /package/dist/{command → src/command}/handler.d.ts +0 -0
  81. /package/dist/{command → src/command}/handler.js +0 -0
  82. /package/dist/{command → src/command}/validator.d.ts +0 -0
  83. /package/dist/{command → src/command}/validator.js +0 -0
  84. /package/dist/{communication → src/communication}/websocket-client.d.ts +0 -0
  85. /package/dist/{config → src/config}/default.d.ts +0 -0
  86. /package/dist/{index.d.ts → src/index.d.ts} +0 -0
  87. /package/dist/{index.js → src/index.js} +0 -0
  88. /package/dist/{session → src/session}/claude-monitor.d.ts +0 -0
  89. /package/dist/{session → src/session}/monitor.d.ts +0 -0
  90. /package/dist/{session → src/session}/monitor.js +0 -0
  91. /package/dist/{session → src/session}/parser.d.ts +0 -0
  92. /package/dist/{session → src/session}/parser.js +0 -0
  93. /package/dist/{utils → src/utils}/logger.d.ts +0 -0
  94. /package/dist/{utils → src/utils}/logger.js +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"device-manager.d.ts","sourceRoot":"","sources":["../../../src/auth/device-manager.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAM5D,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAc;IAC9B,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,UAAU,CAAS;;IAcrB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAoCjC,WAAW,IAAI,MAAM;IAIrB,aAAa,IAAI,MAAM;IAIvB,cAAc,IAAI,MAAM,GAAG,SAAS;IAIpC,eAAe,IAAI,MAAM,GAAG,SAAS;IAIrC,aAAa,IAAI,OAAO;IAIlB,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBnD,kBAAkB,CAAC,MAAM,EAAE,QAAQ,GAAG,SAAS,GAAG,IAAI;IAKtD,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,IAAI;IAIxC,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAK5B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAIhC"}
@@ -1,10 +1,10 @@
1
1
  // ============================================================================
2
2
  // Device Manager - Loads user credentials and device info for agent
3
3
  // ============================================================================
4
- import { promises as fs } from "fs";
5
4
  import { join } from "path";
6
5
  import { logger } from "../utils/logger.js";
7
6
  import { getConfig } from "../config/default.js";
7
+ import { readEncryptedFile, writeEncryptedFile } from "./encryption.js";
8
8
  const CONFIG_DIR = join(process.env.HOME || "~", ".cc-control");
9
9
  const CREDENTIALS_FILE = join(CONFIG_DIR, "credentials.json");
10
10
  export class DeviceManager {
@@ -26,7 +26,11 @@ export class DeviceManager {
26
26
  async initialize() {
27
27
  try {
28
28
  // Load user credentials (created by `cc-control login`)
29
- const data = await fs.readFile(CREDENTIALS_FILE, "utf-8");
29
+ // Note: Credentials are encrypted at rest, so we need to decrypt them
30
+ const data = await readEncryptedFile(CREDENTIALS_FILE);
31
+ if (!data) {
32
+ throw new Error("No credentials file found");
33
+ }
30
34
  const creds = JSON.parse(data);
31
35
  if (!creds.accessToken || !creds.deviceId) {
32
36
  throw new Error("Incomplete credentials. Run 'cc-control login' first.");
@@ -69,14 +73,16 @@ export class DeviceManager {
69
73
  async saveTokens(tokens) {
70
74
  this.accessToken = tokens.accessToken;
71
75
  this.refreshToken = tokens.refreshToken;
72
- // Update the credentials file
76
+ // Update the credentials file (credentials are encrypted)
73
77
  try {
74
- const data = await fs.readFile(CREDENTIALS_FILE, "utf-8");
78
+ const data = await readEncryptedFile(CREDENTIALS_FILE);
79
+ if (!data)
80
+ return;
75
81
  const creds = JSON.parse(data);
76
82
  creds.accessToken = tokens.accessToken;
77
83
  creds.refreshToken = tokens.refreshToken;
78
84
  creds.expiresAt = tokens.expiresAt.toISOString();
79
- await fs.writeFile(CREDENTIALS_FILE, JSON.stringify(creds, null, 2), "utf-8");
85
+ await writeEncryptedFile(CREDENTIALS_FILE, JSON.stringify(creds, null, 2));
80
86
  }
81
87
  catch {
82
88
  // ignore
@@ -0,0 +1 @@
1
+ {"version":3,"file":"device-manager.js","sourceRoot":"","sources":["../../../src/auth/device-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Encrypt data using AES-256-GCM
3
+ */
4
+ export declare function encrypt(plaintext: string): {
5
+ encrypted: string;
6
+ iv: string;
7
+ tag: string;
8
+ };
9
+ /**
10
+ * Decrypt data using AES-256-GCM
11
+ */
12
+ export declare function decrypt(encrypted: string, iv: string, tag: string): string;
13
+ /**
14
+ * Read and decrypt encrypted file
15
+ */
16
+ export declare function readEncryptedFile(filePath: string): Promise<string | null>;
17
+ /**
18
+ * Encrypt and write file
19
+ */
20
+ export declare function writeEncryptedFile(filePath: string, plaintext: string): Promise<void>;
21
+ //# sourceMappingURL=encryption.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encryption.d.ts","sourceRoot":"","sources":["../../../src/auth/encryption.ts"],"names":[],"mappings":"AAoCA;;GAEG;AACH,wBAAgB,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAgBzF;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAe1E;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAehF;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAO3F"}
@@ -0,0 +1,85 @@
1
+ // ============================================================================
2
+ // Encryption Utilities - Secure credential storage at rest
3
+ // ============================================================================
4
+ import { createCipheriv, createDecipheriv, randomBytes, scryptSync } from 'crypto';
5
+ import { promises as fs } from 'fs';
6
+ import { hostname } from 'os';
7
+ const ALGORITHM = 'aes-256-gcm';
8
+ const KEY_LENGTH = 32;
9
+ const IV_LENGTH = 16;
10
+ const SALT_LENGTH = 32;
11
+ const TAG_LENGTH = 16;
12
+ /**
13
+ * Get encryption key from machine-specific data
14
+ * Uses scrypt for key derivation with machine hostname as salt
15
+ */
16
+ function getEncryptionKey() {
17
+ // Use machine-specific data for key derivation
18
+ const machineId = hostname() + process.platform + process.arch;
19
+ const salt = Buffer.from(machineId.padEnd(SALT_LENGTH, 'x').substring(0, SALT_LENGTH));
20
+ // Use a pepper from environment if available, otherwise derive from machine
21
+ const pepper = process.env.CC_CONTROL_ENCRYPTION_PEPPER || 'cc-control-default-pepper';
22
+ // Derive key using scrypt (memory-hard KDF)
23
+ // Node.js scryptSync uses: (password, salt, keylen, options?)
24
+ return scryptSync(pepper, salt, KEY_LENGTH, {
25
+ N: 16384, // CPU/memory cost parameter
26
+ r: 8, // Block size parameter
27
+ p: 1, // Parallelization parameter
28
+ });
29
+ }
30
+ /**
31
+ * Encrypt data using AES-256-GCM
32
+ */
33
+ export function encrypt(plaintext) {
34
+ const key = getEncryptionKey();
35
+ const iv = randomBytes(IV_LENGTH);
36
+ const cipher = createCipheriv(ALGORITHM, key, iv);
37
+ let encrypted = cipher.update(plaintext, 'utf8', 'hex');
38
+ encrypted += cipher.final('hex');
39
+ const tag = cipher.getAuthTag();
40
+ return {
41
+ encrypted,
42
+ iv: iv.toString('hex'),
43
+ tag: tag.toString('hex'),
44
+ };
45
+ }
46
+ /**
47
+ * Decrypt data using AES-256-GCM
48
+ */
49
+ export function decrypt(encrypted, iv, tag) {
50
+ const key = getEncryptionKey();
51
+ const decipher = createDecipheriv(ALGORITHM, key, Buffer.from(iv, 'hex'));
52
+ decipher.setAuthTag(Buffer.from(tag, 'hex'));
53
+ let decrypted = decipher.update(encrypted, 'hex', 'utf8');
54
+ decrypted += decipher.final('utf8');
55
+ return decrypted;
56
+ }
57
+ /**
58
+ * Read and decrypt encrypted file
59
+ */
60
+ export async function readEncryptedFile(filePath) {
61
+ try {
62
+ const data = await fs.readFile(filePath, 'utf8');
63
+ const parsed = JSON.parse(data);
64
+ // Handle both old (plaintext) and new (encrypted) formats
65
+ if (parsed.encrypted && parsed.iv && parsed.tag) {
66
+ return decrypt(parsed.encrypted, parsed.iv, parsed.tag);
67
+ }
68
+ else {
69
+ // Old format - return as-is for migration
70
+ return data;
71
+ }
72
+ }
73
+ catch {
74
+ return null;
75
+ }
76
+ }
77
+ /**
78
+ * Encrypt and write file
79
+ */
80
+ export async function writeEncryptedFile(filePath, plaintext) {
81
+ const encrypted = encrypt(plaintext);
82
+ await fs.writeFile(filePath, JSON.stringify(encrypted, null, 2), { mode: 0o600 } // User read/write only
83
+ );
84
+ }
85
+ //# sourceMappingURL=encryption.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encryption.js","sourceRoot":"","sources":["../../../src/auth/encryption.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,81 @@
1
+ import { type StoredCredentials } from "./user-credentials.js";
2
+ interface OnboardingOptions {
3
+ relayUrl?: string;
4
+ skipWelcome?: boolean;
5
+ }
6
+ interface OnboardingResult {
7
+ success: boolean;
8
+ credentials?: StoredCredentials;
9
+ started?: boolean;
10
+ }
11
+ export declare class InteractiveOnboarding {
12
+ private credManager;
13
+ private relayUrl;
14
+ constructor(options?: OnboardingOptions);
15
+ /**
16
+ * Display welcome message
17
+ */
18
+ private showWelcome;
19
+ /**
20
+ * Display success message
21
+ */
22
+ private showSuccess;
23
+ /**
24
+ * Display error message
25
+ */
26
+ private showError;
27
+ /**
28
+ * Prompt user for email
29
+ */
30
+ private promptEmail;
31
+ /**
32
+ * Prompt user for password (login)
33
+ */
34
+ private promptPassword;
35
+ /**
36
+ * Prompt user for new password (registration)
37
+ */
38
+ private promptNewPassword;
39
+ /**
40
+ * Prompt for device name
41
+ */
42
+ private promptDeviceName;
43
+ /**
44
+ * Ask if user wants to start now
45
+ */
46
+ private promptStartNow;
47
+ /**
48
+ * Ask if user wants to transfer the device
49
+ */
50
+ private promptDeviceTransfer;
51
+ /**
52
+ * Choose between login and signup
53
+ */
54
+ private chooseAuthMethod;
55
+ /**
56
+ * Show email verification notice
57
+ */
58
+ private showEmailVerificationNotice;
59
+ /**
60
+ * Run the login flow
61
+ */
62
+ private runLoginFlow;
63
+ /**
64
+ * Run the registration flow
65
+ */
66
+ private runRegisterFlow;
67
+ /**
68
+ * Register device or handle transfer if already registered
69
+ */
70
+ private registerOrTransferDevice;
71
+ /**
72
+ * Run the complete onboarding flow
73
+ */
74
+ run(options?: OnboardingOptions): Promise<OnboardingResult>;
75
+ }
76
+ /**
77
+ * Run onboarding from CLI
78
+ */
79
+ export declare function runOnboarding(options?: OnboardingOptions): Promise<OnboardingResult>;
80
+ export {};
81
+ //# sourceMappingURL=onboarding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onboarding.d.ts","sourceRoot":"","sources":["../../../src/auth/onboarding.ts"],"names":[],"mappings":"AAMA,OAAO,EAAyB,KAAK,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAetF,UAAU,iBAAiB;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,UAAU,gBAAgB;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAChC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,qBAAa,qBAAqB;IAChC,OAAO,CAAC,WAAW,CAAwB;IAC3C,OAAO,CAAC,QAAQ,CAAS;gBAEb,OAAO,GAAE,iBAAsB;IAK3C;;OAEG;IACH,OAAO,CAAC,WAAW;IAYnB;;OAEG;IACH,OAAO,CAAC,WAAW;IAUnB;;OAEG;IACH,OAAO,CAAC,SAAS;IAMjB;;OAEG;YACW,WAAW;IAgBzB;;OAEG;YACW,cAAc;IAe5B;;OAEG;YACW,iBAAiB;IAqB/B;;OAEG;YACW,gBAAgB;IAW9B;;OAEG;YACW,cAAc;IAU5B;;OAEG;YACW,oBAAoB;IAkBlC;;OAEG;YACW,gBAAgB;IAc9B;;OAEG;IACH,OAAO,CAAC,2BAA2B;IAYnC;;OAEG;YACW,YAAY;IA0B1B;;OAEG;YACW,eAAe;IAwB7B;;OAEG;YACW,wBAAwB;IA8BtC;;OAEG;IACG,GAAG,CAAC,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC,gBAAgB,CAAC;CA0DtE;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAG9F"}
@@ -0,0 +1,327 @@
1
+ // ============================================================================
2
+ // Interactive Onboarding - CLI-based user onboarding flow
3
+ // ============================================================================
4
+ import prompts from "prompts";
5
+ import { UserCredentialManager } from "./user-credentials.js";
6
+ const DEFAULT_RELAY = process.env.CC_CONTROL_RELAY_URL || "http://localhost:3030";
7
+ // ANSI codes for terminal styling
8
+ const style = {
9
+ bold: (text) => `\x1b[1m${text}\x1b[0m`,
10
+ dim: (text) => `\x1b[2m${text}\x1b[0m`,
11
+ green: (text) => `\x1b[32m${text}\x1b[0m`,
12
+ blue: (text) => `\x1b[34m${text}\x1b[0m`,
13
+ yellow: (text) => `\x1b[33m${text}\x1b[0m`,
14
+ red: (text) => `\x1b[31m${text}\x1b[0m`,
15
+ cyan: (text) => `\x1b[36m${text}\x1b[0m`,
16
+ };
17
+ export class InteractiveOnboarding {
18
+ credManager;
19
+ relayUrl;
20
+ constructor(options = {}) {
21
+ this.credManager = new UserCredentialManager();
22
+ this.relayUrl = options.relayUrl || DEFAULT_RELAY;
23
+ }
24
+ /**
25
+ * Display welcome message
26
+ */
27
+ showWelcome() {
28
+ console.clear();
29
+ console.log();
30
+ console.log(style.cyan("╔════════════════════════════════════════════════════════════╗"));
31
+ console.log(style.cyan("║") + style.bold(" Welcome to CC-Control Desktop Agent v2.0 ") + style.cyan("║"));
32
+ console.log(style.cyan("╠════════════════════════════════════════════════════════════╣"));
33
+ console.log(style.cyan("║") + " Monitor and control your Claude Code sessions " + style.cyan("║"));
34
+ console.log(style.cyan("║") + " from anywhere using your mobile device " + style.cyan("║"));
35
+ console.log(style.cyan("╚════════════════════════════════════════════════════════════╝"));
36
+ console.log();
37
+ }
38
+ /**
39
+ * Display success message
40
+ */
41
+ showSuccess(email, deviceId) {
42
+ console.log();
43
+ console.log(style.green("✓ Setup complete!"));
44
+ console.log();
45
+ console.log(style.bold(" Account: ") + email);
46
+ console.log(style.bold(" Device: ") + deviceId);
47
+ console.log(style.bold(" Relay: ") + this.relayUrl);
48
+ console.log();
49
+ }
50
+ /**
51
+ * Display error message
52
+ */
53
+ showError(message) {
54
+ console.log();
55
+ console.log(style.red("✗ Error: ") + message);
56
+ console.log();
57
+ }
58
+ /**
59
+ * Prompt user for email
60
+ */
61
+ async promptEmail(initial) {
62
+ const response = await prompts({
63
+ type: "text",
64
+ name: "email",
65
+ message: "Email address:",
66
+ initial,
67
+ validate: (value) => {
68
+ if (!value || !value.includes("@")) {
69
+ return "Please enter a valid email address";
70
+ }
71
+ return true;
72
+ },
73
+ });
74
+ return response.email;
75
+ }
76
+ /**
77
+ * Prompt user for password (login)
78
+ */
79
+ async promptPassword() {
80
+ const response = await prompts({
81
+ type: "password",
82
+ name: "password",
83
+ message: "Password:",
84
+ validate: (value) => {
85
+ if (!value || value.length < 1) {
86
+ return "Please enter your password";
87
+ }
88
+ return true;
89
+ },
90
+ });
91
+ return response.password;
92
+ }
93
+ /**
94
+ * Prompt user for new password (registration)
95
+ */
96
+ async promptNewPassword() {
97
+ const response = await prompts({
98
+ type: "password",
99
+ name: "password",
100
+ message: "Password (min 8 chars, include a number):",
101
+ validate: (value) => {
102
+ if (!value) {
103
+ return "Please enter a password";
104
+ }
105
+ if (value.length < 8) {
106
+ return "Password must be at least 8 characters";
107
+ }
108
+ if (!/\d/.test(value)) {
109
+ return "Password must include at least one number";
110
+ }
111
+ return true;
112
+ },
113
+ });
114
+ return response.password;
115
+ }
116
+ /**
117
+ * Prompt for device name
118
+ */
119
+ async promptDeviceName() {
120
+ const defaultName = `${process.env.USER || "user"}'s Desktop`;
121
+ const response = await prompts({
122
+ type: "text",
123
+ name: "deviceName",
124
+ message: "Device name:",
125
+ initial: defaultName,
126
+ });
127
+ return response.deviceName || defaultName;
128
+ }
129
+ /**
130
+ * Ask if user wants to start now
131
+ */
132
+ async promptStartNow() {
133
+ const response = await prompts({
134
+ type: "confirm",
135
+ name: "start",
136
+ message: "Start monitoring now?",
137
+ initial: true,
138
+ });
139
+ return response.start ?? true;
140
+ }
141
+ /**
142
+ * Ask if user wants to transfer the device
143
+ */
144
+ async promptDeviceTransfer(existingOwnerEmail) {
145
+ const message = existingOwnerEmail
146
+ ? `This device is registered to ${style.yellow(existingOwnerEmail)}. Transfer it to your account?`
147
+ : "This device is registered to another account. Transfer it to your account?";
148
+ console.log();
149
+ console.log(style.yellow("⚠ Device already registered"));
150
+ console.log();
151
+ const response = await prompts({
152
+ type: "confirm",
153
+ name: "transfer",
154
+ message,
155
+ initial: true,
156
+ });
157
+ return response.transfer ?? true;
158
+ }
159
+ /**
160
+ * Choose between login and signup
161
+ */
162
+ async chooseAuthMethod() {
163
+ const response = await prompts({
164
+ type: "select",
165
+ name: "method",
166
+ message: "Choose an option:",
167
+ choices: [
168
+ { title: "Log in to existing account", value: "login" },
169
+ { title: "Create a new account", value: "register" },
170
+ ],
171
+ initial: 0,
172
+ });
173
+ return response.method || "login";
174
+ }
175
+ /**
176
+ * Show email verification notice
177
+ */
178
+ showEmailVerificationNotice(email) {
179
+ console.log();
180
+ console.log(style.yellow("⚠ Email verification required"));
181
+ console.log();
182
+ console.log(style.dim(" A verification email has been sent to:"));
183
+ console.log(style.bold(` ${email}`));
184
+ console.log();
185
+ console.log(style.dim(" Please check your inbox and click the verification link."));
186
+ console.log(style.dim(" You can still use CC-Control, but some features may be limited."));
187
+ console.log();
188
+ }
189
+ /**
190
+ * Run the login flow
191
+ */
192
+ async runLoginFlow(email) {
193
+ try {
194
+ const userEmail = email || await this.promptEmail();
195
+ const password = await this.promptPassword();
196
+ console.log();
197
+ console.log(style.dim("Logging in..."));
198
+ const creds = await this.credManager.login(userEmail, password, this.relayUrl);
199
+ // Check email verification status
200
+ if (creds.emailVerified === false) {
201
+ this.showEmailVerificationNotice(creds.email);
202
+ }
203
+ // Try to register device
204
+ await this.registerOrTransferDevice();
205
+ this.showSuccess(creds.email, creds.deviceId || "unknown");
206
+ return { success: true };
207
+ }
208
+ catch (error) {
209
+ const msg = error.response?.data?.error || error.message;
210
+ return { success: false, error: msg };
211
+ }
212
+ }
213
+ /**
214
+ * Run the registration flow
215
+ */
216
+ async runRegisterFlow(email) {
217
+ try {
218
+ const userEmail = email || await this.promptEmail();
219
+ const password = await this.promptNewPassword();
220
+ console.log();
221
+ console.log(style.dim("Creating account..."));
222
+ const creds = await this.credManager.register(userEmail, password, this.relayUrl);
223
+ // New accounts need email verification
224
+ this.showEmailVerificationNotice(creds.email);
225
+ // Register device
226
+ await this.registerOrTransferDevice();
227
+ this.showSuccess(creds.email, creds.deviceId || "unknown");
228
+ return { success: true };
229
+ }
230
+ catch (error) {
231
+ const msg = error.response?.data?.error || error.message;
232
+ return { success: false, error: msg };
233
+ }
234
+ }
235
+ /**
236
+ * Register device or handle transfer if already registered
237
+ */
238
+ async registerOrTransferDevice() {
239
+ const deviceName = await this.promptDeviceName();
240
+ console.log();
241
+ console.log(style.dim("Registering device..."));
242
+ try {
243
+ await this.credManager.registerDevice(deviceName);
244
+ console.log(style.green("✓ Device registered"));
245
+ }
246
+ catch (error) {
247
+ const errorMsg = error.response?.data?.error || error.message;
248
+ // Check if this is a "device already registered" error
249
+ if (errorMsg.includes("already registered") || error.response?.status === 409) {
250
+ const shouldTransfer = await this.promptDeviceTransfer();
251
+ if (shouldTransfer) {
252
+ console.log();
253
+ console.log(style.dim("Transferring device..."));
254
+ await this.credManager.transferDevice(deviceName);
255
+ console.log(style.green("✓ Device transferred"));
256
+ }
257
+ else {
258
+ throw new Error("Device registration cancelled. Please unlink the device from the other account first.");
259
+ }
260
+ }
261
+ else {
262
+ throw error;
263
+ }
264
+ }
265
+ }
266
+ /**
267
+ * Run the complete onboarding flow
268
+ */
269
+ async run(options = {}) {
270
+ // Load existing credentials
271
+ await this.credManager.load();
272
+ // Show welcome unless skipped
273
+ if (!options.skipWelcome) {
274
+ this.showWelcome();
275
+ }
276
+ // Check if already logged in
277
+ const existing = this.credManager.get();
278
+ if (existing && this.credManager.isLoggedIn()) {
279
+ console.log(style.green("✓ Already logged in as ") + style.bold(existing.email));
280
+ console.log();
281
+ // Check if device is registered
282
+ if (!existing.deviceId) {
283
+ console.log(style.yellow("⚠ No device registered. Registering now..."));
284
+ await this.registerOrTransferDevice();
285
+ this.showSuccess(existing.email, existing.deviceId || "unknown");
286
+ }
287
+ else {
288
+ console.log(style.dim("Device: ") + existing.deviceId);
289
+ console.log();
290
+ }
291
+ const startNow = await this.promptStartNow();
292
+ return {
293
+ success: true,
294
+ credentials: existing,
295
+ started: startNow,
296
+ };
297
+ }
298
+ // Choose auth method
299
+ const method = await this.chooseAuthMethod();
300
+ let result;
301
+ if (method === "login") {
302
+ result = await this.runLoginFlow();
303
+ }
304
+ else {
305
+ result = await this.runRegisterFlow();
306
+ }
307
+ if (!result.success) {
308
+ this.showError(result.error || "Authentication failed");
309
+ return { success: false };
310
+ }
311
+ // Ask if user wants to start now
312
+ const startNow = await this.promptStartNow();
313
+ return {
314
+ success: true,
315
+ credentials: this.credManager.get() || undefined,
316
+ started: startNow,
317
+ };
318
+ }
319
+ }
320
+ /**
321
+ * Run onboarding from CLI
322
+ */
323
+ export async function runOnboarding(options = {}) {
324
+ const onboarding = new InteractiveOnboarding(options);
325
+ return onboarding.run(options);
326
+ }
327
+ //# sourceMappingURL=onboarding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onboarding.js","sourceRoot":"","sources":["../../../src/auth/onboarding.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  export interface StoredCredentials {
2
2
  userId: string;
3
3
  email: string;
4
+ emailVerified?: boolean;
4
5
  accessToken: string;
5
6
  refreshToken: string;
6
7
  expiresAt: string;
@@ -26,6 +27,10 @@ export declare class UserCredentialManager {
26
27
  * Register this machine as a device
27
28
  */
28
29
  registerDevice(deviceName: string): Promise<string>;
30
+ /**
31
+ * Transfer a device from another account to this user
32
+ */
33
+ transferDevice(deviceName: string): Promise<string>;
29
34
  /**
30
35
  * Refresh the access token
31
36
  */
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-credentials.d.ts","sourceRoot":"","sources":["../../../src/auth/user-credentials.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAKD,qBAAa,qBAAqB;IAChC,OAAO,CAAC,WAAW,CAAkC;IAE/C,IAAI,IAAI,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAgBzC,IAAI,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAO7C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAS5B,GAAG,IAAI,iBAAiB,GAAG,IAAI;IAI/B,UAAU,IAAI,OAAO;IAMrB;;OAEG;IACG,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAuB1F;;OAEG;IACG,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAuB7F;;OAEG;IACG,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA0BzD;;OAEG;IACG,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA0BzD;;OAEG;IACG,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC;IAmB3C,OAAO,CAAC,qBAAqB;CAc9B"}