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.
- package/dist/src/auth/device-manager.d.ts.map +1 -0
- package/dist/{auth → src/auth}/device-manager.js +11 -5
- package/dist/src/auth/device-manager.js.map +1 -0
- package/dist/src/auth/encryption.d.ts +21 -0
- package/dist/src/auth/encryption.d.ts.map +1 -0
- package/dist/src/auth/encryption.js +85 -0
- package/dist/src/auth/encryption.js.map +1 -0
- package/dist/src/auth/onboarding.d.ts +81 -0
- package/dist/src/auth/onboarding.d.ts.map +1 -0
- package/dist/src/auth/onboarding.js +327 -0
- package/dist/src/auth/onboarding.js.map +1 -0
- package/dist/{auth → src/auth}/user-credentials.d.ts +5 -0
- package/dist/src/auth/user-credentials.d.ts.map +1 -0
- package/dist/{auth → src/auth}/user-credentials.js +45 -5
- package/dist/src/auth/user-credentials.js.map +1 -0
- package/dist/src/claude/hook-handler.d.ts.map +1 -0
- package/dist/src/claude/hook-handler.js.map +1 -0
- package/dist/src/cli.d.ts.map +1 -0
- package/dist/src/cli.js +308 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/command/handler.d.ts.map +1 -0
- package/dist/src/command/handler.js.map +1 -0
- package/dist/src/command/validator.d.ts.map +1 -0
- package/dist/src/command/validator.js.map +1 -0
- package/dist/src/communication/websocket-client.d.ts.map +1 -0
- package/dist/{communication → src/communication}/websocket-client.js +25 -1
- package/dist/src/communication/websocket-client.js.map +1 -0
- package/dist/src/config/default.d.ts.map +1 -0
- package/dist/{config → src/config}/default.js +1 -1
- package/dist/src/config/default.js.map +1 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/session/claude-monitor.d.ts.map +1 -0
- package/dist/{session → src/session}/claude-monitor.js +13 -8
- package/dist/{session → src/session}/claude-monitor.js.map +1 -1
- package/dist/src/session/monitor.d.ts.map +1 -0
- package/dist/src/session/monitor.js.map +1 -0
- package/dist/src/session/parser.d.ts.map +1 -0
- package/dist/src/session/parser.js.map +1 -0
- package/dist/src/utils/logger-new.d.ts +2 -0
- package/dist/{utils → src/utils}/logger-new.d.ts.map +1 -1
- package/dist/src/utils/logger-new.js +2 -0
- package/dist/{utils → src/utils}/logger-new.js.map +1 -1
- package/dist/src/utils/logger.d.ts.map +1 -0
- package/dist/src/utils/logger.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +16 -20
- package/dist/auth/device-manager.d.ts.map +0 -1
- package/dist/auth/device-manager.js.map +0 -1
- package/dist/auth/user-credentials.d.ts.map +0 -1
- package/dist/auth/user-credentials.js.map +0 -1
- package/dist/claude/hook-handler.d.ts.map +0 -1
- package/dist/claude/hook-handler.js.map +0 -1
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js +0 -195
- package/dist/cli.js.map +0 -1
- package/dist/command/handler.d.ts.map +0 -1
- package/dist/command/handler.js.map +0 -1
- package/dist/command/validator.d.ts.map +0 -1
- package/dist/command/validator.js.map +0 -1
- package/dist/communication/websocket-client.d.ts.map +0 -1
- package/dist/communication/websocket-client.js.map +0 -1
- package/dist/config/default.d.ts.map +0 -1
- package/dist/config/default.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/session/claude-monitor.d.ts.map +0 -1
- package/dist/session/monitor.d.ts.map +0 -1
- package/dist/session/monitor.js.map +0 -1
- package/dist/session/parser.d.ts.map +0 -1
- package/dist/session/parser.js.map +0 -1
- package/dist/utils/logger-new.d.ts +0 -1
- package/dist/utils/logger-new.js +0 -2
- package/dist/utils/logger.d.ts.map +0 -1
- package/dist/utils/logger.js.map +0 -1
- /package/dist/{auth → src/auth}/device-manager.d.ts +0 -0
- /package/dist/{claude → src/claude}/hook-handler.d.ts +0 -0
- /package/dist/{claude → src/claude}/hook-handler.js +0 -0
- /package/dist/{cli.d.ts → src/cli.d.ts} +0 -0
- /package/dist/{command → src/command}/handler.d.ts +0 -0
- /package/dist/{command → src/command}/handler.js +0 -0
- /package/dist/{command → src/command}/validator.d.ts +0 -0
- /package/dist/{command → src/command}/validator.js +0 -0
- /package/dist/{communication → src/communication}/websocket-client.d.ts +0 -0
- /package/dist/{config → src/config}/default.d.ts +0 -0
- /package/dist/{index.d.ts → src/index.d.ts} +0 -0
- /package/dist/{index.js → src/index.js} +0 -0
- /package/dist/{session → src/session}/claude-monitor.d.ts +0 -0
- /package/dist/{session → src/session}/monitor.d.ts +0 -0
- /package/dist/{session → src/session}/monitor.js +0 -0
- /package/dist/{session → src/session}/parser.d.ts +0 -0
- /package/dist/{session → src/session}/parser.js +0 -0
- /package/dist/{utils → src/utils}/logger.d.ts +0 -0
- /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
|
-
|
|
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
|
|
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
|
|
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":"AAAA,+EAA+E;AAC/E,oEAAoE;AACpE,+EAA+E;AAG/E,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAIxE,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,EAAE,aAAa,CAAC,CAAC;AAChE,MAAM,gBAAgB,GAAG,IAAI,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC;AAE9D,MAAM,OAAO,aAAa;IAChB,QAAQ,GAAW,EAAE,CAAC;IACtB,WAAW,CAAqB;IAChC,YAAY,CAAqB;IACjC,UAAU,CAAS;IAE3B;QACE,IAAI,CAAC,UAAU,GAAG;YAChB,EAAE,EAAE,EAAE;YACN,IAAI,EAAE,EAAE;YACR,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,SAAS;YACjB,QAAQ,EAAE,IAAI,IAAI,EAAE;YACpB,aAAa,EAAE,EAAE;YACjB,YAAY,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE;SACjD,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,UAAU;QACd,IAAI,CAAC;YACH,wDAAwD;YACxD,sEAAsE;YACtE,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;YACvD,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;YAC/C,CAAC;YACD,MAAM,KAAK,GAAsB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAElD,IAAI,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;gBAC1C,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;YAC3E,CAAC;YAED,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;YAC/B,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;YACrC,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC;YAEvC,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;YAC3B,IAAI,CAAC,UAAU,GAAG;gBAChB,EAAE,EAAE,IAAI,CAAC,QAAQ;gBACjB,IAAI,EAAE,MAAM,CAAC,UAAU;gBACvB,IAAI,EAAE,SAAS;gBACf,MAAM,EAAE,SAAS;gBACjB,QAAQ,EAAE,IAAI,IAAI,EAAE;gBACpB,aAAa,EAAE,EAAE;gBACjB,YAAY,EAAE,MAAM,CAAC,YAAY;aAClC,CAAC;YAEF,MAAM,CAAC,IAAI,CAAC,4BAA4B,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;QAC7F,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,qCAAqC,EAAE,KAAK,CAAC,CAAC;YAC3D,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CAAC;QAC3F,CAAC;IACH,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,aAAa;QACX,OAAO,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;IAChC,CAAC;IAED,cAAc;QACZ,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED,eAAe;QACb,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED,aAAa;QACX,OAAO,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,MAAkB;QACjC,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;QACtC,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;QACxC,0DAA0D;QAC1D,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;YACvD,IAAI,CAAC,IAAI;gBAAE,OAAO;YAClB,MAAM,KAAK,GAAsB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAClD,KAAK,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;YACvC,KAAK,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;YACzC,KAAK,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC;YACjD,MAAM,kBAAkB,CAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7E,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;IAED,kBAAkB,CAAC,MAA4B;QAC7C,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,MAAM,CAAC;QAChC,IAAI,CAAC,UAAU,CAAC,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC;IACxC,CAAC;IAED,mBAAmB,CAAC,SAAmB;QACrC,IAAI,CAAC,UAAU,CAAC,aAAa,GAAG,SAAS,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,WAAW;QACf,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;QAC7B,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;QACnC,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;IAC1C,CAAC;CACF"}
|
|
@@ -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"}
|