react-native-ai-devtools 1.3.4 → 1.3.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1242,7 +1242,7 @@ The server prioritizes devices in this order:
1242
1242
  - Try `clear_logs` then trigger some actions in the app
1243
1243
  - Check `get_apps` to verify connection status
1244
1244
 
1245
- ## Telemetry
1245
+ ## Telemetry & Data Collection
1246
1246
 
1247
1247
  This package collects anonymous usage telemetry to help improve the product. No personal information is collected.
1248
1248
 
@@ -1259,9 +1259,25 @@ This package collects anonymous usage telemetry to help improve the product. No
1259
1259
 
1260
1260
  **Not collected**: No file paths, code content, network data, or personally identifiable information.
1261
1261
 
1262
+ ### Auto-registration
1263
+
1264
+ On first tool use, the package automatically registers your installation with our backend. No account or login is required — the Tool works fully out of the box.
1265
+
1266
+ **Why we do this:** The product roadmap includes features that build on installation identity — project memory (your AI assistant gets smarter with every session by remembering navigation maps, element signatures, and debug patterns), cloud sync across machines, team collaboration with shared debugging context, and a Pro dashboard for managing installations and subscriptions. Auto-registration lays the groundwork so these features work seamlessly when they ship, without requiring a disruptive setup step later.
1267
+
1268
+ **What is sent:**
1269
+
1270
+ - A random installation ID (UUID)
1271
+ - A device fingerprint (one-way SHA-256 hash — cannot be reversed to recover its components)
1272
+ - Platform, hostname, OS version, and server version
1273
+
1274
+ **What is NOT sent:** No source code, file paths, console logs, network data, component names, or any content from your app. The fingerprint exists solely to prevent installation hijacking — it ties your installation to your physical machine so no one else can claim it.
1275
+
1276
+ Registration is fire-and-forget — it never blocks your work, fails silently if the network is unavailable, and can be disabled entirely (see Opt-out below). See [PRIVACY.md](./PRIVACY.md) for full details on data handling, storage, and your rights.
1277
+
1262
1278
  ### Opt-out
1263
1279
 
1264
- To disable telemetry, set the environment variable:
1280
+ To disable telemetry and auto-registration, set the environment variable:
1265
1281
 
1266
1282
  ```bash
1267
1283
  export RN_DEBUGGER_TELEMETRY=false
@@ -1273,6 +1289,8 @@ Or inline:
1273
1289
  RN_DEBUGGER_TELEMETRY=false npx react-native-ai-devtools
1274
1290
  ```
1275
1291
 
1292
+ All debugging tools work normally with telemetry disabled. For the complete privacy policy, see [PRIVACY.md](./PRIVACY.md).
1293
+
1276
1294
  ## License
1277
1295
 
1278
1296
  MIT
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=fingerprint.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fingerprint.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/unit/fingerprint.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,89 @@
1
+ import { jest } from "@jest/globals";
2
+ const mockExecSync = jest.fn();
3
+ jest.unstable_mockModule("child_process", () => ({
4
+ execSync: mockExecSync,
5
+ }));
6
+ const mockReadFileSync = jest.fn();
7
+ const mockExistsSync = jest.fn();
8
+ jest.unstable_mockModule("fs", () => ({
9
+ readFileSync: mockReadFileSync,
10
+ existsSync: mockExistsSync,
11
+ }));
12
+ const mockUserInfo = jest.fn();
13
+ const mockCpus = jest.fn();
14
+ const mockPlatform = jest.fn();
15
+ jest.unstable_mockModule("os", () => ({
16
+ userInfo: mockUserInfo,
17
+ cpus: mockCpus,
18
+ platform: mockPlatform,
19
+ }));
20
+ const { getDeviceFingerprint, getMachineId } = await import("../../core/fingerprint.js");
21
+ describe("fingerprint", () => {
22
+ beforeEach(() => {
23
+ jest.clearAllMocks();
24
+ mockUserInfo.mockReturnValue({ username: "testuser" });
25
+ mockCpus.mockReturnValue([{ model: "Apple M2 Pro" }]);
26
+ });
27
+ describe("getMachineId", () => {
28
+ it("reads hardware UUID on macOS", () => {
29
+ mockPlatform.mockReturnValue("darwin");
30
+ mockExecSync.mockReturnValue("Hardware UUID: ABC123-DEF456-GHI789\n");
31
+ const id = getMachineId();
32
+ expect(id).toBe("ABC123-DEF456-GHI789");
33
+ expect(mockExecSync).toHaveBeenCalledWith("system_profiler SPHardwareDataType", expect.any(Object));
34
+ });
35
+ it("reads /etc/machine-id on Linux", () => {
36
+ mockPlatform.mockReturnValue("linux");
37
+ mockExistsSync.mockReturnValue(true);
38
+ mockReadFileSync.mockReturnValue("abc123def456\n");
39
+ const id = getMachineId();
40
+ expect(id).toBe("abc123def456");
41
+ });
42
+ it("reads MachineGuid from registry on Windows", () => {
43
+ mockPlatform.mockReturnValue("win32");
44
+ mockExecSync.mockReturnValue(" MachineGuid REG_SZ {12345-ABCDE}\n");
45
+ const id = getMachineId();
46
+ expect(id).toBe("{12345-ABCDE}");
47
+ });
48
+ it("returns empty string on unsupported platform", () => {
49
+ mockPlatform.mockReturnValue("freebsd");
50
+ const id = getMachineId();
51
+ expect(id).toBe("");
52
+ });
53
+ it("returns empty string when command fails", () => {
54
+ mockPlatform.mockReturnValue("darwin");
55
+ mockExecSync.mockImplementation(() => {
56
+ throw new Error("command not found");
57
+ });
58
+ const id = getMachineId();
59
+ expect(id).toBe("");
60
+ });
61
+ });
62
+ describe("getDeviceFingerprint", () => {
63
+ it("returns consistent SHA256 hash", () => {
64
+ mockPlatform.mockReturnValue("darwin");
65
+ mockExecSync.mockReturnValue("Hardware UUID: ABC123\n");
66
+ const fp1 = getDeviceFingerprint();
67
+ const fp2 = getDeviceFingerprint();
68
+ expect(fp1).toBe(fp2);
69
+ expect(fp1).toMatch(/^[a-f0-9]{64}$/);
70
+ });
71
+ it("produces different hashes for different inputs", () => {
72
+ mockPlatform.mockReturnValue("darwin");
73
+ mockExecSync.mockReturnValue("Hardware UUID: ABC123\n");
74
+ const fp1 = getDeviceFingerprint();
75
+ mockUserInfo.mockReturnValue({ username: "otheruser" });
76
+ const fp2 = getDeviceFingerprint();
77
+ expect(fp1).not.toBe(fp2);
78
+ });
79
+ it("still produces a hash when machineId is unavailable (degraded mode)", () => {
80
+ mockPlatform.mockReturnValue("darwin");
81
+ mockExecSync.mockImplementation(() => {
82
+ throw new Error("permission denied");
83
+ });
84
+ const fp = getDeviceFingerprint();
85
+ expect(fp).toMatch(/^[a-f0-9]{64}$/);
86
+ });
87
+ });
88
+ });
89
+ //# sourceMappingURL=fingerprint.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fingerprint.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/fingerprint.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Resolution order:
3
+ * 1. config.json apiUrl (if set)
4
+ * 2. --http flag → localhost:3000
5
+ * 3. Default → production URL
6
+ */
7
+ export declare const API_BASE_URL: string;
8
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AA0BA;;;;;GAKG;AACH,eAAO,MAAM,YAAY,EAAE,MAC+B,CAAC"}
@@ -0,0 +1,27 @@
1
+ import { readFileSync, existsSync } from "fs";
2
+ import { homedir } from "os";
3
+ import { join } from "path";
4
+ const CONFIG_FILE = join(homedir(), ".rn-ai-debugger", "config.json");
5
+ const IS_DEV = process.argv.includes("--http");
6
+ const PRODUCTION_URL = "https://mobile-ai-devtools.link";
7
+ const LOCAL_URL = "http://localhost:3000";
8
+ function loadConfig() {
9
+ if (!existsSync(CONFIG_FILE))
10
+ return {};
11
+ try {
12
+ const raw = readFileSync(CONFIG_FILE, "utf-8");
13
+ return JSON.parse(raw);
14
+ }
15
+ catch {
16
+ return {};
17
+ }
18
+ }
19
+ const config = loadConfig();
20
+ /**
21
+ * Resolution order:
22
+ * 1. config.json apiUrl (if set)
23
+ * 2. --http flag → localhost:3000
24
+ * 3. Default → production URL
25
+ */
26
+ export const API_BASE_URL = config.apiUrl ?? (IS_DEV ? LOCAL_URL : PRODUCTION_URL);
27
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,iBAAiB,EAAE,aAAa,CAAC,CAAC;AACtE,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAE/C,MAAM,cAAc,GAAG,iCAAiC,CAAC;AACzD,MAAM,SAAS,GAAG,uBAAuB,CAAC;AAM1C,SAAS,UAAU;IACf,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,EAAE,CAAC;IACxC,IAAI,CAAC;QACD,MAAM,GAAG,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,EAAE,CAAC;IACd,CAAC;AACL,CAAC;AAED,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;AAE5B;;;;;GAKG;AACH,MAAM,CAAC,MAAM,YAAY,GACrB,MAAM,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare function getMachineId(): string;
2
+ export declare function getDeviceFingerprint(): string;
3
+ export declare function getFingerprintVersion(): number;
4
+ //# sourceMappingURL=fingerprint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fingerprint.d.ts","sourceRoot":"","sources":["../../src/core/fingerprint.ts"],"names":[],"mappings":"AAOA,wBAAgB,YAAY,IAAI,MAAM,CAiCrC;AAED,wBAAgB,oBAAoB,IAAI,MAAM,CAW7C;AAED,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C"}
@@ -0,0 +1,47 @@
1
+ import { createHash } from "crypto";
2
+ import { userInfo, cpus, platform } from "os";
3
+ import { execSync } from "child_process";
4
+ import { readFileSync, existsSync } from "fs";
5
+ const FINGERPRINT_VERSION = 1;
6
+ export function getMachineId() {
7
+ const os = platform();
8
+ try {
9
+ if (os === "darwin") {
10
+ const output = execSync("system_profiler SPHardwareDataType", {
11
+ encoding: "utf-8",
12
+ timeout: 5000,
13
+ });
14
+ const match = output.match(/Hardware UUID:\s*(.+)/);
15
+ return match ? match[1].trim() : "";
16
+ }
17
+ if (os === "linux") {
18
+ if (existsSync("/etc/machine-id")) {
19
+ return readFileSync("/etc/machine-id", "utf-8").trim();
20
+ }
21
+ return "";
22
+ }
23
+ if (os === "win32") {
24
+ const output = execSync('reg query "HKLM\\SOFTWARE\\Microsoft\\Cryptography" /v MachineGuid', { encoding: "utf-8", timeout: 5000 });
25
+ const match = output.match(/MachineGuid\s+REG_SZ\s+(.+)/);
26
+ return match ? match[1].trim() : "";
27
+ }
28
+ return "";
29
+ }
30
+ catch {
31
+ return "";
32
+ }
33
+ }
34
+ export function getDeviceFingerprint() {
35
+ const username = userInfo().username;
36
+ const cpuModel = cpus()[0]?.model ?? "unknown";
37
+ const machineId = getMachineId();
38
+ if (!machineId) {
39
+ console.warn("[rn-ai-debugger] Device fingerprint: machineId unavailable, using degraded fingerprint");
40
+ }
41
+ const input = username + cpuModel + machineId;
42
+ return createHash("sha256").update(input).digest("hex");
43
+ }
44
+ export function getFingerprintVersion() {
45
+ return FINGERPRINT_VERSION;
46
+ }
47
+ //# sourceMappingURL=fingerprint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fingerprint.js","sourceRoot":"","sources":["../../src/core/fingerprint.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAE9C,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAE9B,MAAM,UAAU,YAAY;IACxB,MAAM,EAAE,GAAG,QAAQ,EAAE,CAAC;IAEtB,IAAI,CAAC;QACD,IAAI,EAAE,KAAK,QAAQ,EAAE,CAAC;YAClB,MAAM,MAAM,GAAG,QAAQ,CAAC,oCAAoC,EAAE;gBAC1D,QAAQ,EAAE,OAAO;gBACjB,OAAO,EAAE,IAAI;aAChB,CAAC,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;YACpD,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxC,CAAC;QAED,IAAI,EAAE,KAAK,OAAO,EAAE,CAAC;YACjB,IAAI,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC;gBAChC,OAAO,YAAY,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;YAC3D,CAAC;YACD,OAAO,EAAE,CAAC;QACd,CAAC;QAED,IAAI,EAAE,KAAK,OAAO,EAAE,CAAC;YACjB,MAAM,MAAM,GAAG,QAAQ,CACnB,oEAAoE,EACpE,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CACvC,CAAC;YACF,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;YAC1D,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxC,CAAC;QAED,OAAO,EAAE,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,EAAE,CAAC;IACd,CAAC;AACL,CAAC;AAED,MAAM,UAAU,oBAAoB;IAChC,MAAM,QAAQ,GAAG,QAAQ,EAAE,CAAC,QAAQ,CAAC;IACrC,MAAM,QAAQ,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,SAAS,CAAC;IAC/C,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;IAEjC,IAAI,CAAC,SAAS,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,wFAAwF,CAAC,CAAC;IAC3G,CAAC;IAED,MAAM,KAAK,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC9C,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,qBAAqB;IACjC,OAAO,mBAAmB,CAAC;AAC/B,CAAC"}
@@ -1,7 +1,8 @@
1
1
  export type LicenseTier = "free" | "pro" | "team";
2
2
  export interface LicenseStatus {
3
3
  installationId: string;
4
- status: LicenseTier;
4
+ tier: LicenseTier;
5
+ accountStatus: "anonymous" | "linked";
5
6
  validatedAt: string;
6
7
  cacheExpiresAt: string;
7
8
  plan?: {
@@ -21,5 +22,6 @@ interface LicenseResult {
21
22
  export declare function ensureLicense(): Promise<LicenseResult>;
22
23
  export declare function getLicenseStatus(): LicenseStatus;
23
24
  export declare function getDashboardUrl(): string;
25
+ export declare function resetLicense(): void;
24
26
  export {};
25
27
  //# sourceMappingURL=license.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"license.d.ts","sourceRoot":"","sources":["../../src/core/license.ts"],"names":[],"mappings":"AAmBA,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;AAElD,MAAM,WAAW,aAAa;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,WAAW,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE;QACH,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;KACrB,CAAC;CACL;AAqGD,UAAU,aAAa;IACnB,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,EAAE,OAAO,GAAG,KAAK,GAAG,SAAS,CAAC;IACpC,UAAU,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAgB,aAAa,IAAI,OAAO,CAAC,aAAa,CAAC,CAKtD;AAgDD,wBAAgB,gBAAgB,IAAI,aAAa,CAOhD;AAED,wBAAgB,eAAe,IAAI,MAAM,CAExC"}
1
+ {"version":3,"file":"license.d.ts","sourceRoot":"","sources":["../../src/core/license.ts"],"names":[],"mappings":"AA0BA,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;AAElD,MAAM,WAAW,aAAa;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,WAAW,CAAC;IAClB,aAAa,EAAE,WAAW,GAAG,QAAQ,CAAC;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE;QACH,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;KACrB,CAAC;CACL;AA6JD,UAAU,aAAa;IACnB,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,EAAE,OAAO,GAAG,KAAK,GAAG,SAAS,CAAC;IACpC,UAAU,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAgB,aAAa,IAAI,OAAO,CAAC,aAAa,CAAC,CAKtD;AAqDD,wBAAgB,gBAAgB,IAAI,aAAa,CAOhD;AAED,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,wBAAgB,YAAY,IAAI,IAAI,CAWnC"}
@@ -1,15 +1,21 @@
1
- import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
2
- import { homedir } from "os";
1
+ import { readFileSync, writeFileSync, existsSync, mkdirSync, unlinkSync } from "fs";
2
+ import { homedir, platform, hostname, release } from "os";
3
3
  import { join, dirname } from "path";
4
+ import { fileURLToPath } from "url";
4
5
  import { getInstallationId } from "./telemetry.js";
6
+ import { getDeviceFingerprint, getFingerprintVersion } from "./fingerprint.js";
5
7
  // ============================================================================
6
8
  // Configuration
7
9
  // ============================================================================
8
- const CACHE_TTL_MS = 24 * 60 * 60 * 1000; // 24 hours
9
- const VALIDATION_ENDPOINT = ""; // Placeholder — set when backend is built
10
+ import { API_BASE_URL } from "./config.js";
11
+ const IS_DEV = process.argv.includes("--http");
12
+ const CACHE_TTL_MS = IS_DEV ? 0 : 24 * 60 * 60 * 1000; // No cache in dev, 24h in prod
13
+ const VALIDATION_ENDPOINT = API_BASE_URL;
14
+ const REGISTRATION_ENDPOINT = API_BASE_URL;
15
+ const ACCOUNTS_API_KEY = "fb4b5d8f410ff8d0dfe3ade01adc0b2444479ac9380b3f256554dd9d7044f5d2";
10
16
  const API_TIMEOUT_MS = 5_000;
11
17
  const LICENSE_FILE = join(homedir(), ".rn-ai-debugger", "license.json");
12
- const DASHBOARD_URL = ""; // Placeholder — set when dashboard is built
18
+ const DASHBOARD_URL = API_BASE_URL;
13
19
  // ============================================================================
14
20
  // State
15
21
  // ============================================================================
@@ -24,7 +30,7 @@ function readCache() {
24
30
  const data = readFileSync(LICENSE_FILE, "utf-8");
25
31
  const parsed = JSON.parse(data);
26
32
  // Validate required fields
27
- if (!parsed.installationId || !parsed.status || !parsed.cacheExpiresAt) {
33
+ if (!parsed.installationId || !parsed.tier || !parsed.cacheExpiresAt) {
28
34
  return null;
29
35
  }
30
36
  return parsed;
@@ -54,33 +60,86 @@ function createDefaultStatus(installationId) {
54
60
  const now = new Date().toISOString();
55
61
  return {
56
62
  installationId,
57
- status: "free",
63
+ tier: "free",
64
+ accountStatus: "anonymous",
58
65
  validatedAt: now,
59
66
  cacheExpiresAt: now, // Already expired — will trigger API call next startup
60
67
  };
61
68
  }
62
69
  // ============================================================================
70
+ // Registration
71
+ // ============================================================================
72
+ let registrationAttempted = false;
73
+ async function registerInstallation(installationId) {
74
+ if (registrationAttempted || !REGISTRATION_ENDPOINT)
75
+ return;
76
+ registrationAttempted = true;
77
+ try {
78
+ const controller = new AbortController();
79
+ const timeout = setTimeout(() => controller.abort(), API_TIMEOUT_MS);
80
+ await fetch(`${REGISTRATION_ENDPOINT}/api/accounts/register`, {
81
+ method: "POST",
82
+ headers: {
83
+ "Content-Type": "application/json",
84
+ "X-API-Key": ACCOUNTS_API_KEY,
85
+ },
86
+ body: JSON.stringify({
87
+ installationId,
88
+ fingerprint: getDeviceFingerprint(),
89
+ fingerprintVersion: getFingerprintVersion(),
90
+ platform: platform(),
91
+ serverVersion: getServerVersion(),
92
+ hostname: hostname(),
93
+ osVersion: `${platform()} ${release()}`,
94
+ }),
95
+ signal: controller.signal,
96
+ });
97
+ clearTimeout(timeout);
98
+ }
99
+ catch {
100
+ registrationAttempted = false;
101
+ }
102
+ }
103
+ function getServerVersion() {
104
+ try {
105
+ const __dirname = dirname(fileURLToPath(import.meta.url));
106
+ const pkgPath = join(__dirname, "..", "..", "package.json");
107
+ const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
108
+ return pkg.version || "unknown";
109
+ }
110
+ catch {
111
+ return "unknown";
112
+ }
113
+ }
114
+ // ============================================================================
63
115
  // API Validation
64
116
  // ============================================================================
65
117
  async function callValidationApi(installationId) {
66
- // Skip if endpoint not configured
67
118
  if (!VALIDATION_ENDPOINT)
68
119
  return null;
69
120
  try {
70
121
  const controller = new AbortController();
71
122
  const timeout = setTimeout(() => controller.abort(), API_TIMEOUT_MS);
72
- const response = await fetch(`${VALIDATION_ENDPOINT}/validate?installationId=${encodeURIComponent(installationId)}`, { signal: controller.signal });
123
+ const response = await fetch(`${VALIDATION_ENDPOINT}/api/license/validate`, {
124
+ method: "POST",
125
+ headers: {
126
+ "Content-Type": "application/json",
127
+ "X-API-Key": ACCOUNTS_API_KEY,
128
+ },
129
+ body: JSON.stringify({
130
+ installationId,
131
+ fingerprint: getDeviceFingerprint(),
132
+ }),
133
+ signal: controller.signal,
134
+ });
73
135
  clearTimeout(timeout);
74
- if (response.status === 404) {
75
- return { status: "free" };
76
- }
77
- if (!response.ok) {
78
- return null; // 5xx or unexpected — fail open
136
+ if (!response.ok && response.status !== 200) {
137
+ return null;
79
138
  }
80
139
  return (await response.json());
81
140
  }
82
141
  catch {
83
- return null; // Network error, timeout — fail open
142
+ return null;
84
143
  }
85
144
  }
86
145
  // ============================================================================
@@ -100,6 +159,8 @@ export function ensureLicense() {
100
159
  async function resolveLicense() {
101
160
  const startTime = Date.now();
102
161
  const installationId = getInstallationId();
162
+ // Fire-and-forget registration on first run
163
+ registerInstallation(installationId);
103
164
  const cache = readCache();
104
165
  let source = "default";
105
166
  // Check if cache is fresh and matches current installation
@@ -115,10 +176,11 @@ async function resolveLicense() {
115
176
  const expiresAt = new Date(now.getTime() + CACHE_TTL_MS);
116
177
  currentStatus = {
117
178
  installationId,
118
- status: apiResponse.status,
119
- validatedAt: now.toISOString(),
120
- cacheExpiresAt: expiresAt.toISOString(),
121
- plan: apiResponse.plan,
179
+ tier: apiResponse.tier,
180
+ accountStatus: "anonymous",
181
+ validatedAt: apiResponse.validatedAt || now.toISOString(),
182
+ cacheExpiresAt: apiResponse.cacheExpiresAt || expiresAt.toISOString(),
183
+ plan: apiResponse.plan || undefined,
122
184
  };
123
185
  writeCache(currentStatus);
124
186
  source = "api";
@@ -146,4 +208,17 @@ export function getLicenseStatus() {
146
208
  export function getDashboardUrl() {
147
209
  return DASHBOARD_URL;
148
210
  }
211
+ export function resetLicense() {
212
+ currentStatus = null;
213
+ licensePromise = null;
214
+ registrationAttempted = false;
215
+ try {
216
+ if (existsSync(LICENSE_FILE)) {
217
+ unlinkSync(LICENSE_FILE);
218
+ }
219
+ }
220
+ catch {
221
+ // Best-effort cleanup
222
+ }
223
+ }
149
224
  //# sourceMappingURL=license.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"license.js","sourceRoot":"","sources":["../../src/core/license.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"license.js","sourceRoot":"","sources":["../../src/core/license.ts"],"names":[],"mappings":"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"}
@@ -1,42 +1,67 @@
1
- /**
2
- * Check if the SDK is installed in the connected app.
3
- */
1
+ interface SDKNetworkEntry {
2
+ id: string;
3
+ timestamp: number;
4
+ method: string;
5
+ url: string;
6
+ status?: number;
7
+ statusText?: string;
8
+ duration?: number;
9
+ requestHeaders: Record<string, string>;
10
+ requestBody?: string;
11
+ responseHeaders: Record<string, string>;
12
+ responseBody?: string;
13
+ mimeType?: string;
14
+ error?: string;
15
+ completed: boolean;
16
+ }
17
+ interface SDKConsoleEntry {
18
+ id: string;
19
+ timestamp: number;
20
+ level: string;
21
+ message: string;
22
+ }
23
+ type SDKResult<T> = {
24
+ success: true;
25
+ data: T;
26
+ } | {
27
+ success: false;
28
+ error: string;
29
+ };
4
30
  export declare function isSDKInstalled(): Promise<boolean>;
5
- /**
6
- * Read network requests from the SDK's in-app buffer.
7
- */
8
- export declare function readSDKNetworkRequests(options?: {
31
+ export declare function querySDKNetwork(options?: {
9
32
  count?: number;
10
33
  method?: string;
11
34
  urlPattern?: string;
12
35
  status?: number;
13
- }): Promise<{
14
- success: boolean;
15
- data?: any;
16
- error?: string;
17
- }>;
18
- /**
19
- * Read a single network request by ID from the SDK (includes full body).
20
- */
21
- export declare function readSDKNetworkRequest(id: string): Promise<{
22
- success: boolean;
23
- data?: any;
24
- error?: string;
25
- }>;
26
- /**
27
- * Read network stats from the SDK.
28
- */
29
- export declare function readSDKNetworkStats(): Promise<{
36
+ }): Promise<SDKResult<SDKNetworkEntry[]>>;
37
+ export declare function getSDKNetworkEntry(id: string): Promise<SDKResult<SDKNetworkEntry | null>>;
38
+ export declare function getSDKNetworkStats(): Promise<SDKResult<{
39
+ total: number;
40
+ completed: number;
41
+ errors: number;
42
+ avgDuration: number | null;
43
+ byMethod: Record<string, number>;
44
+ byStatus: Record<string, number>;
45
+ byDomain: Record<string, number>;
46
+ }>>;
47
+ export declare function querySDKConsole(options?: {
48
+ count?: number;
49
+ level?: string;
50
+ text?: string;
51
+ }): Promise<SDKResult<SDKConsoleEntry[]>>;
52
+ export declare function getSDKConsoleStats(): Promise<SDKResult<{
53
+ total: number;
54
+ byLevel: Record<string, number>;
55
+ }>>;
56
+ export declare function clearSDKNetwork(): Promise<{
30
57
  success: boolean;
31
- data?: any;
58
+ count?: number;
32
59
  error?: string;
33
60
  }>;
34
- /**
35
- * Clear the SDK's network buffer.
36
- */
37
- export declare function clearSDKNetwork(): Promise<{
61
+ export declare function clearSDKConsole(): Promise<{
38
62
  success: boolean;
39
63
  count?: number;
40
64
  error?: string;
41
65
  }>;
66
+ export {};
42
67
  //# sourceMappingURL=sdkBridge.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sdkBridge.d.ts","sourceRoot":"","sources":["../../src/core/sdkBridge.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC,CAQvD;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAAC,OAAO,GAAE;IAClD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACd,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,GAAG,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAcjE;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,GAAG,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAajH;AAED;;GAEG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,GAAG,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAarG;AAED;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CASrG"}
1
+ {"version":3,"file":"sdkBridge.d.ts","sourceRoot":"","sources":["../../src/core/sdkBridge.ts"],"names":[],"mappings":"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"}