@lhremote/cli 0.0.0 → 0.1.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.
Files changed (72) hide show
  1. package/LICENSE +661 -0
  2. package/dist/cli.js +2 -2
  3. package/dist/cli.js.map +1 -1
  4. package/dist/handlers/check-status.d.ts +5 -0
  5. package/dist/handlers/check-status.d.ts.map +1 -0
  6. package/dist/handlers/check-status.js +44 -0
  7. package/dist/handlers/check-status.js.map +1 -0
  8. package/dist/handlers/check-status.test.d.ts +2 -0
  9. package/dist/handlers/check-status.test.d.ts.map +1 -0
  10. package/dist/handlers/check-status.test.js +110 -0
  11. package/dist/handlers/check-status.test.js.map +1 -0
  12. package/dist/handlers/index.d.ts +8 -0
  13. package/dist/handlers/index.d.ts.map +1 -0
  14. package/dist/handlers/index.js +8 -0
  15. package/dist/handlers/index.js.map +1 -0
  16. package/dist/handlers/launch-app.d.ts +4 -0
  17. package/dist/handlers/launch-app.d.ts.map +1 -0
  18. package/dist/handlers/launch-app.js +15 -0
  19. package/dist/handlers/launch-app.js.map +1 -0
  20. package/dist/handlers/launch-app.test.d.ts +2 -0
  21. package/dist/handlers/launch-app.test.d.ts.map +1 -0
  22. package/dist/handlers/launch-app.test.js +62 -0
  23. package/dist/handlers/launch-app.test.js.map +1 -0
  24. package/dist/handlers/list-accounts.d.ts +5 -0
  25. package/dist/handlers/list-accounts.d.ts.map +1 -0
  26. package/dist/handlers/list-accounts.js +37 -0
  27. package/dist/handlers/list-accounts.js.map +1 -0
  28. package/dist/handlers/list-accounts.test.d.ts +2 -0
  29. package/dist/handlers/list-accounts.test.d.ts.map +1 -0
  30. package/dist/handlers/list-accounts.test.js +96 -0
  31. package/dist/handlers/list-accounts.test.js.map +1 -0
  32. package/dist/handlers/quit-app.d.ts +4 -0
  33. package/dist/handlers/quit-app.d.ts.map +1 -0
  34. package/dist/handlers/quit-app.js +15 -0
  35. package/dist/handlers/quit-app.js.map +1 -0
  36. package/dist/handlers/quit-app.test.d.ts +2 -0
  37. package/dist/handlers/quit-app.test.d.ts.map +1 -0
  38. package/dist/handlers/quit-app.test.js +68 -0
  39. package/dist/handlers/quit-app.test.js.map +1 -0
  40. package/dist/handlers/start-instance.d.ts +4 -0
  41. package/dist/handlers/start-instance.d.ts.map +1 -0
  42. package/dist/handlers/start-instance.js +36 -0
  43. package/dist/handlers/start-instance.js.map +1 -0
  44. package/dist/handlers/start-instance.test.d.ts +2 -0
  45. package/dist/handlers/start-instance.test.d.ts.map +1 -0
  46. package/dist/handlers/start-instance.test.js +122 -0
  47. package/dist/handlers/start-instance.test.js.map +1 -0
  48. package/dist/handlers/stop-instance.d.ts +4 -0
  49. package/dist/handlers/stop-instance.d.ts.map +1 -0
  50. package/dist/handlers/stop-instance.js +28 -0
  51. package/dist/handlers/stop-instance.js.map +1 -0
  52. package/dist/handlers/stop-instance.test.d.ts +2 -0
  53. package/dist/handlers/stop-instance.test.d.ts.map +1 -0
  54. package/dist/handlers/stop-instance.test.js +82 -0
  55. package/dist/handlers/stop-instance.test.js.map +1 -0
  56. package/dist/handlers/visit-and-extract.d.ts +5 -0
  57. package/dist/handlers/visit-and-extract.d.ts.map +1 -0
  58. package/dist/handlers/visit-and-extract.js +105 -0
  59. package/dist/handlers/visit-and-extract.js.map +1 -0
  60. package/dist/handlers/visit-and-extract.test.d.ts +2 -0
  61. package/dist/handlers/visit-and-extract.test.d.ts.map +1 -0
  62. package/dist/handlers/visit-and-extract.test.js +279 -0
  63. package/dist/handlers/visit-and-extract.test.js.map +1 -0
  64. package/dist/program.d.ts +6 -0
  65. package/dist/program.d.ts.map +1 -0
  66. package/dist/program.js +65 -0
  67. package/dist/program.js.map +1 -0
  68. package/dist/program.test.d.ts +2 -0
  69. package/dist/program.test.d.ts.map +1 -0
  70. package/dist/program.test.js +92 -0
  71. package/dist/program.test.js.map +1 -0
  72. package/package.json +22 -12
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-status.d.ts","sourceRoot":"","sources":["../../src/handlers/check-status.ts"],"names":[],"mappings":"AAEA,wBAAsB,iBAAiB,CAAC,OAAO,EAAE;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,GAAG,OAAO,CAAC,IAAI,CAAC,CAkDhB"}
@@ -0,0 +1,44 @@
1
+ import { checkStatus } from "@lhremote/core";
2
+ export async function handleCheckStatus(options) {
3
+ try {
4
+ const report = await checkStatus(options.cdpPort);
5
+ if (options.json) {
6
+ process.stdout.write(JSON.stringify(report, null, 2) + "\n");
7
+ return;
8
+ }
9
+ // Launcher status
10
+ if (report.launcher.reachable) {
11
+ process.stdout.write(`Launcher: reachable on port ${String(report.launcher.port)}\n`);
12
+ }
13
+ else {
14
+ process.stdout.write(`Launcher: not reachable on port ${String(report.launcher.port)}\n`);
15
+ }
16
+ // Instance status
17
+ if (report.instances.length === 0) {
18
+ process.stdout.write("Instances: none\n");
19
+ }
20
+ else {
21
+ for (const instance of report.instances) {
22
+ const port = instance.cdpPort !== null
23
+ ? `CDP port ${String(instance.cdpPort)}`
24
+ : "not running";
25
+ process.stdout.write(`Instance: ${instance.accountName} (${String(instance.accountId)}) — ${port}\n`);
26
+ }
27
+ }
28
+ // Database status
29
+ if (report.databases.length === 0) {
30
+ process.stdout.write("Databases: none found\n");
31
+ }
32
+ else {
33
+ for (const db of report.databases) {
34
+ process.stdout.write(`Database: account ${String(db.accountId)} — ${String(db.profileCount)} profiles — ${db.path}\n`);
35
+ }
36
+ }
37
+ }
38
+ catch (error) {
39
+ const message = error instanceof Error ? error.message : String(error);
40
+ process.stderr.write(`${message}\n`);
41
+ process.exitCode = 1;
42
+ }
43
+ }
44
+ //# sourceMappingURL=check-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-status.js","sourceRoot":"","sources":["../../src/handlers/check-status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAGvC;IACC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAElD,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;YAC7D,OAAO;QACT,CAAC;QAED,kBAAkB;QAClB,IAAI,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;YAC9B,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,+BAA+B,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAChE,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,mCAAmC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CACpE,CAAC;QACJ,CAAC;QAED,kBAAkB;QAClB,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;QAC5C,CAAC;aAAM,CAAC;YACN,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;gBACxC,MAAM,IAAI,GACR,QAAQ,CAAC,OAAO,KAAK,IAAI;oBACvB,CAAC,CAAC,YAAY,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;oBACxC,CAAC,CAAC,aAAa,CAAC;gBACpB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,aAAa,QAAQ,CAAC,WAAW,KAAK,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,IAAI,IAAI,CAChF,CAAC;YACJ,CAAC;QACH,CAAC;QAED,kBAAkB;QAClB,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAClD,CAAC;aAAM,CAAC;YACN,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;gBAClC,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,qBAAqB,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,MAAM,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,CAAC,IAAI,IAAI,CACjG,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC;QACrC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=check-status.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-status.test.d.ts","sourceRoot":"","sources":["../../src/handlers/check-status.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,110 @@
1
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
2
+ vi.mock("@lhremote/core", async (importOriginal) => {
3
+ const actual = await importOriginal();
4
+ return {
5
+ ...actual,
6
+ checkStatus: vi.fn(),
7
+ };
8
+ });
9
+ import { checkStatus } from "@lhremote/core";
10
+ import { handleCheckStatus } from "./check-status.js";
11
+ const mockedCheckStatus = vi.mocked(checkStatus);
12
+ describe("handleCheckStatus", () => {
13
+ const originalExitCode = process.exitCode;
14
+ beforeEach(() => {
15
+ process.exitCode = undefined;
16
+ vi.clearAllMocks();
17
+ });
18
+ afterEach(() => {
19
+ process.exitCode = originalExitCode;
20
+ vi.restoreAllMocks();
21
+ });
22
+ it("prints JSON with --json", async () => {
23
+ const stdoutSpy = vi
24
+ .spyOn(process.stdout, "write")
25
+ .mockReturnValue(true);
26
+ const report = {
27
+ launcher: { reachable: true, port: 9222 },
28
+ instances: [
29
+ { accountId: 1, accountName: "Alice", cdpPort: 54321 },
30
+ ],
31
+ databases: [
32
+ { accountId: 1, path: "/path/to/db.db", profileCount: 100 },
33
+ ],
34
+ };
35
+ mockedCheckStatus.mockResolvedValue(report);
36
+ await handleCheckStatus({ json: true });
37
+ expect(process.exitCode).toBeUndefined();
38
+ const output = stdoutSpy.mock.calls
39
+ .map((call) => String(call[0]))
40
+ .join("");
41
+ expect(JSON.parse(output)).toEqual(report);
42
+ });
43
+ it("prints human-friendly output when launcher is reachable", async () => {
44
+ const stdoutSpy = vi
45
+ .spyOn(process.stdout, "write")
46
+ .mockReturnValue(true);
47
+ mockedCheckStatus.mockResolvedValue({
48
+ launcher: { reachable: true, port: 9222 },
49
+ instances: [
50
+ { accountId: 1, accountName: "Alice", cdpPort: 54321 },
51
+ ],
52
+ databases: [
53
+ { accountId: 1, path: "/path/to/db.db", profileCount: 42 },
54
+ ],
55
+ });
56
+ await handleCheckStatus({});
57
+ expect(process.exitCode).toBeUndefined();
58
+ expect(stdoutSpy).toHaveBeenCalledWith("Launcher: reachable on port 9222\n");
59
+ expect(stdoutSpy).toHaveBeenCalledWith("Instance: Alice (1) — CDP port 54321\n");
60
+ expect(stdoutSpy).toHaveBeenCalledWith("Database: account 1 — 42 profiles — /path/to/db.db\n");
61
+ });
62
+ it("prints not reachable when launcher is down", async () => {
63
+ const stdoutSpy = vi
64
+ .spyOn(process.stdout, "write")
65
+ .mockReturnValue(true);
66
+ mockedCheckStatus.mockResolvedValue({
67
+ launcher: { reachable: false, port: 9222 },
68
+ instances: [],
69
+ databases: [],
70
+ });
71
+ await handleCheckStatus({});
72
+ expect(stdoutSpy).toHaveBeenCalledWith("Launcher: not reachable on port 9222\n");
73
+ expect(stdoutSpy).toHaveBeenCalledWith("Instances: none\n");
74
+ expect(stdoutSpy).toHaveBeenCalledWith("Databases: none found\n");
75
+ });
76
+ it("prints not running when instance has no CDP port", async () => {
77
+ const stdoutSpy = vi
78
+ .spyOn(process.stdout, "write")
79
+ .mockReturnValue(true);
80
+ mockedCheckStatus.mockResolvedValue({
81
+ launcher: { reachable: true, port: 9222 },
82
+ instances: [
83
+ { accountId: 1, accountName: "Alice", cdpPort: null },
84
+ ],
85
+ databases: [],
86
+ });
87
+ await handleCheckStatus({});
88
+ expect(stdoutSpy).toHaveBeenCalledWith("Instance: Alice (1) — not running\n");
89
+ });
90
+ it("sets exitCode 1 on error", async () => {
91
+ const stderrSpy = vi
92
+ .spyOn(process.stderr, "write")
93
+ .mockReturnValue(true);
94
+ mockedCheckStatus.mockRejectedValue(new Error("unexpected"));
95
+ await handleCheckStatus({});
96
+ expect(process.exitCode).toBe(1);
97
+ expect(stderrSpy).toHaveBeenCalledWith("unexpected\n");
98
+ });
99
+ it("passes cdpPort to checkStatus", async () => {
100
+ vi.spyOn(process.stdout, "write").mockReturnValue(true);
101
+ mockedCheckStatus.mockResolvedValue({
102
+ launcher: { reachable: false, port: 4567 },
103
+ instances: [],
104
+ databases: [],
105
+ });
106
+ await handleCheckStatus({ cdpPort: 4567 });
107
+ expect(mockedCheckStatus).toHaveBeenCalledWith(4567);
108
+ });
109
+ });
110
+ //# sourceMappingURL=check-status.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-status.test.js","sourceRoot":"","sources":["../../src/handlers/check-status.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export { handleCheckStatus } from "./check-status.js";
2
+ export { handleLaunchApp } from "./launch-app.js";
3
+ export { handleListAccounts } from "./list-accounts.js";
4
+ export { handleQuitApp } from "./quit-app.js";
5
+ export { handleStartInstance } from "./start-instance.js";
6
+ export { handleStopInstance } from "./stop-instance.js";
7
+ export { handleVisitAndExtract } from "./visit-and-extract.js";
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/handlers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,8 @@
1
+ export { handleCheckStatus } from "./check-status.js";
2
+ export { handleLaunchApp } from "./launch-app.js";
3
+ export { handleListAccounts } from "./list-accounts.js";
4
+ export { handleQuitApp } from "./quit-app.js";
5
+ export { handleStartInstance } from "./start-instance.js";
6
+ export { handleStopInstance } from "./stop-instance.js";
7
+ export { handleVisitAndExtract } from "./visit-and-extract.js";
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/handlers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare function handleLaunchApp(options: {
2
+ cdpPort?: number;
3
+ }): Promise<void>;
4
+ //# sourceMappingURL=launch-app.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launch-app.d.ts","sourceRoot":"","sources":["../../src/handlers/launch-app.ts"],"names":[],"mappings":"AAEA,wBAAsB,eAAe,CAAC,OAAO,EAAE;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,IAAI,CAAC,CAehB"}
@@ -0,0 +1,15 @@
1
+ import { AppService } from "@lhremote/core";
2
+ export async function handleLaunchApp(options) {
3
+ const app = new AppService(options.cdpPort);
4
+ try {
5
+ await app.launch();
6
+ }
7
+ catch (error) {
8
+ const message = error instanceof Error ? error.message : String(error);
9
+ process.stderr.write(`${message}\n`);
10
+ process.exitCode = 1;
11
+ return;
12
+ }
13
+ process.stdout.write(`LinkedHelper launched on CDP port ${String(app.cdpPort)}\n`);
14
+ }
15
+ //# sourceMappingURL=launch-app.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launch-app.js","sourceRoot":"","sources":["../../src/handlers/launch-app.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAErC;IACC,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAE5C,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC;IACrB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC;QACrC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,qCAAqC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAC7D,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=launch-app.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launch-app.test.d.ts","sourceRoot":"","sources":["../../src/handlers/launch-app.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,62 @@
1
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
2
+ vi.mock("@lhremote/core", async (importOriginal) => {
3
+ const actual = await importOriginal();
4
+ return {
5
+ ...actual,
6
+ AppService: vi.fn(),
7
+ };
8
+ });
9
+ import { AppNotFoundError, AppService } from "@lhremote/core";
10
+ import { handleLaunchApp } from "./launch-app.js";
11
+ describe("handleLaunchApp", () => {
12
+ const originalExitCode = process.exitCode;
13
+ beforeEach(() => {
14
+ process.exitCode = undefined;
15
+ vi.clearAllMocks();
16
+ });
17
+ afterEach(() => {
18
+ process.exitCode = originalExitCode;
19
+ vi.restoreAllMocks();
20
+ });
21
+ it("prints port on successful launch", async () => {
22
+ const stdoutSpy = vi
23
+ .spyOn(process.stdout, "write")
24
+ .mockReturnValue(true);
25
+ vi.mocked(AppService).mockImplementation(function () {
26
+ return {
27
+ launch: vi.fn().mockResolvedValue(undefined),
28
+ cdpPort: 9222,
29
+ };
30
+ });
31
+ await handleLaunchApp({});
32
+ expect(stdoutSpy).toHaveBeenCalledWith("LinkedHelper launched on CDP port 9222\n");
33
+ expect(process.exitCode).toBeUndefined();
34
+ });
35
+ it("passes cdpPort option to AppService", async () => {
36
+ vi.spyOn(process.stdout, "write").mockReturnValue(true);
37
+ vi.mocked(AppService).mockImplementation(function () {
38
+ return {
39
+ launch: vi.fn().mockResolvedValue(undefined),
40
+ cdpPort: 4567,
41
+ };
42
+ });
43
+ await handleLaunchApp({ cdpPort: 4567 });
44
+ expect(AppService).toHaveBeenCalledWith(4567);
45
+ });
46
+ it("sets exitCode 1 on error", async () => {
47
+ const stderrSpy = vi
48
+ .spyOn(process.stderr, "write")
49
+ .mockReturnValue(true);
50
+ vi.mocked(AppService).mockImplementation(function () {
51
+ return {
52
+ launch: vi
53
+ .fn()
54
+ .mockRejectedValue(new AppNotFoundError("Binary not found at /foo")),
55
+ };
56
+ });
57
+ await handleLaunchApp({});
58
+ expect(process.exitCode).toBe(1);
59
+ expect(stderrSpy).toHaveBeenCalledWith("Binary not found at /foo\n");
60
+ });
61
+ });
62
+ //# sourceMappingURL=launch-app.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launch-app.test.js","sourceRoot":"","sources":["../../src/handlers/launch-app.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function handleListAccounts(options: {
2
+ cdpPort?: number;
3
+ json?: boolean;
4
+ }): Promise<void>;
5
+ //# sourceMappingURL=list-accounts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-accounts.d.ts","sourceRoot":"","sources":["../../src/handlers/list-accounts.ts"],"names":[],"mappings":"AAEA,wBAAsB,kBAAkB,CAAC,OAAO,EAAE;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,GAAG,OAAO,CAAC,IAAI,CAAC,CAkChB"}
@@ -0,0 +1,37 @@
1
+ import { LauncherService } from "@lhremote/core";
2
+ export async function handleListAccounts(options) {
3
+ const launcher = new LauncherService(options.cdpPort);
4
+ try {
5
+ await launcher.connect();
6
+ }
7
+ catch (error) {
8
+ const message = error instanceof Error ? error.message : String(error);
9
+ process.stderr.write(`${message}\n`);
10
+ process.exitCode = 1;
11
+ return;
12
+ }
13
+ try {
14
+ const accounts = await launcher.listAccounts();
15
+ if (options.json) {
16
+ process.stdout.write(JSON.stringify(accounts, null, 2) + "\n");
17
+ }
18
+ else if (accounts.length === 0) {
19
+ process.stdout.write("No accounts found\n");
20
+ }
21
+ else {
22
+ for (const account of accounts) {
23
+ const email = account.email ? ` <${account.email}>` : "";
24
+ process.stdout.write(`${String(account.id)}\t${account.name}${email}\n`);
25
+ }
26
+ }
27
+ }
28
+ catch (error) {
29
+ const message = error instanceof Error ? error.message : String(error);
30
+ process.stderr.write(`${message}\n`);
31
+ process.exitCode = 1;
32
+ }
33
+ finally {
34
+ launcher.disconnect();
35
+ }
36
+ }
37
+ //# sourceMappingURL=list-accounts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-accounts.js","sourceRoot":"","sources":["../../src/handlers/list-accounts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,OAGxC;IACC,MAAM,QAAQ,GAAG,IAAI,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAEtD,IAAI,CAAC;QACH,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC;QACrC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,CAAC;QAE/C,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QACjE,CAAC;aAAM,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;QAC9C,CAAC;aAAM,CAAC;YACN,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAC/B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBACzD,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,GAAG,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,GAAG,KAAK,IAAI,CACnD,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC;QACrC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;YAAS,CAAC;QACT,QAAQ,CAAC,UAAU,EAAE,CAAC;IACxB,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=list-accounts.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-accounts.test.d.ts","sourceRoot":"","sources":["../../src/handlers/list-accounts.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,96 @@
1
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
2
+ vi.mock("@lhremote/core", async (importOriginal) => {
3
+ const actual = await importOriginal();
4
+ return {
5
+ ...actual,
6
+ LauncherService: vi.fn(),
7
+ };
8
+ });
9
+ import { LauncherService, LinkedHelperNotRunningError, } from "@lhremote/core";
10
+ import { handleListAccounts } from "./list-accounts.js";
11
+ function mockLauncher(overrides = {}) {
12
+ const disconnect = vi.fn();
13
+ vi.mocked(LauncherService).mockImplementation(function () {
14
+ return {
15
+ connect: vi.fn().mockResolvedValue(undefined),
16
+ disconnect,
17
+ listAccounts: vi.fn().mockResolvedValue([]),
18
+ ...overrides,
19
+ };
20
+ });
21
+ return { disconnect };
22
+ }
23
+ describe("handleListAccounts", () => {
24
+ const originalExitCode = process.exitCode;
25
+ beforeEach(() => {
26
+ process.exitCode = undefined;
27
+ vi.clearAllMocks();
28
+ });
29
+ afterEach(() => {
30
+ process.exitCode = originalExitCode;
31
+ vi.restoreAllMocks();
32
+ });
33
+ it("prints JSON array with --json", async () => {
34
+ const stdoutSpy = vi
35
+ .spyOn(process.stdout, "write")
36
+ .mockReturnValue(true);
37
+ const accounts = [
38
+ { id: 1, liId: 100, name: "Alice" },
39
+ { id: 2, liId: 200, name: "Bob", email: "bob@example.com" },
40
+ ];
41
+ mockLauncher({ listAccounts: vi.fn().mockResolvedValue(accounts) });
42
+ await handleListAccounts({ json: true });
43
+ const firstCall = stdoutSpy.mock.calls[0];
44
+ expect(JSON.parse(firstCall[0])).toEqual(accounts);
45
+ });
46
+ it("prints formatted table by default", async () => {
47
+ const stdoutSpy = vi
48
+ .spyOn(process.stdout, "write")
49
+ .mockReturnValue(true);
50
+ const accounts = [
51
+ { id: 1, liId: 100, name: "Alice" },
52
+ { id: 2, liId: 200, name: "Bob", email: "bob@example.com" },
53
+ ];
54
+ mockLauncher({ listAccounts: vi.fn().mockResolvedValue(accounts) });
55
+ await handleListAccounts({});
56
+ expect(stdoutSpy).toHaveBeenCalledWith("1\tAlice\n");
57
+ expect(stdoutSpy).toHaveBeenCalledWith("2\tBob <bob@example.com>\n");
58
+ });
59
+ it("prints message when no accounts", async () => {
60
+ const stdoutSpy = vi
61
+ .spyOn(process.stdout, "write")
62
+ .mockReturnValue(true);
63
+ mockLauncher({ listAccounts: vi.fn().mockResolvedValue([]) });
64
+ await handleListAccounts({});
65
+ expect(stdoutSpy).toHaveBeenCalledWith("No accounts found\n");
66
+ });
67
+ it("sets exitCode 1 when not running", async () => {
68
+ const stderrSpy = vi
69
+ .spyOn(process.stderr, "write")
70
+ .mockReturnValue(true);
71
+ vi.mocked(LauncherService).mockImplementation(function () {
72
+ return {
73
+ connect: vi
74
+ .fn()
75
+ .mockRejectedValue(new LinkedHelperNotRunningError(9222)),
76
+ disconnect: vi.fn(),
77
+ };
78
+ });
79
+ await handleListAccounts({});
80
+ expect(process.exitCode).toBe(1);
81
+ expect(stderrSpy).toHaveBeenCalled();
82
+ });
83
+ it("passes cdpPort to LauncherService", async () => {
84
+ vi.spyOn(process.stdout, "write").mockReturnValue(true);
85
+ mockLauncher();
86
+ await handleListAccounts({ cdpPort: 4567 });
87
+ expect(LauncherService).toHaveBeenCalledWith(4567);
88
+ });
89
+ it("disconnects after successful call", async () => {
90
+ vi.spyOn(process.stdout, "write").mockReturnValue(true);
91
+ const { disconnect } = mockLauncher();
92
+ await handleListAccounts({});
93
+ expect(disconnect).toHaveBeenCalledOnce();
94
+ });
95
+ });
96
+ //# sourceMappingURL=list-accounts.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-accounts.test.js","sourceRoot":"","sources":["../../src/handlers/list-accounts.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function handleQuitApp(options: {
2
+ cdpPort?: number;
3
+ }): Promise<void>;
4
+ //# sourceMappingURL=quit-app.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quit-app.d.ts","sourceRoot":"","sources":["../../src/handlers/quit-app.ts"],"names":[],"mappings":"AAEA,wBAAsB,aAAa,CAAC,OAAO,EAAE;IAC3C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,IAAI,CAAC,CAahB"}
@@ -0,0 +1,15 @@
1
+ import { AppService } from "@lhremote/core";
2
+ export async function handleQuitApp(options) {
3
+ const app = new AppService(options.cdpPort ?? 9222);
4
+ try {
5
+ await app.quit();
6
+ }
7
+ catch (error) {
8
+ const message = error instanceof Error ? error.message : String(error);
9
+ process.stderr.write(`${message}\n`);
10
+ process.exitCode = 1;
11
+ return;
12
+ }
13
+ process.stdout.write("LinkedHelper quit\n");
14
+ }
15
+ //# sourceMappingURL=quit-app.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quit-app.js","sourceRoot":"","sources":["../../src/handlers/quit-app.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAEnC;IACC,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC;IAEpD,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;IACnB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC;QACrC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=quit-app.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quit-app.test.d.ts","sourceRoot":"","sources":["../../src/handlers/quit-app.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,68 @@
1
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
2
+ vi.mock("@lhremote/core", async (importOriginal) => {
3
+ const actual = await importOriginal();
4
+ return {
5
+ ...actual,
6
+ AppService: vi.fn(),
7
+ };
8
+ });
9
+ import { AppService } from "@lhremote/core";
10
+ import { handleQuitApp } from "./quit-app.js";
11
+ describe("handleQuitApp", () => {
12
+ const originalExitCode = process.exitCode;
13
+ beforeEach(() => {
14
+ process.exitCode = undefined;
15
+ vi.clearAllMocks();
16
+ });
17
+ afterEach(() => {
18
+ process.exitCode = originalExitCode;
19
+ vi.restoreAllMocks();
20
+ });
21
+ it("prints success message on quit", async () => {
22
+ const stdoutSpy = vi
23
+ .spyOn(process.stdout, "write")
24
+ .mockReturnValue(true);
25
+ vi.mocked(AppService).mockImplementation(function () {
26
+ return {
27
+ quit: vi.fn().mockResolvedValue(undefined),
28
+ };
29
+ });
30
+ await handleQuitApp({});
31
+ expect(stdoutSpy).toHaveBeenCalledWith("LinkedHelper quit\n");
32
+ expect(process.exitCode).toBeUndefined();
33
+ });
34
+ it("passes cdpPort to AppService", async () => {
35
+ vi.spyOn(process.stdout, "write").mockReturnValue(true);
36
+ vi.mocked(AppService).mockImplementation(function () {
37
+ return {
38
+ quit: vi.fn().mockResolvedValue(undefined),
39
+ };
40
+ });
41
+ await handleQuitApp({ cdpPort: 4567 });
42
+ expect(AppService).toHaveBeenCalledWith(4567);
43
+ });
44
+ it("defaults cdpPort to 9222", async () => {
45
+ vi.spyOn(process.stdout, "write").mockReturnValue(true);
46
+ vi.mocked(AppService).mockImplementation(function () {
47
+ return {
48
+ quit: vi.fn().mockResolvedValue(undefined),
49
+ };
50
+ });
51
+ await handleQuitApp({});
52
+ expect(AppService).toHaveBeenCalledWith(9222);
53
+ });
54
+ it("sets exitCode 1 on error", async () => {
55
+ const stderrSpy = vi
56
+ .spyOn(process.stderr, "write")
57
+ .mockReturnValue(true);
58
+ vi.mocked(AppService).mockImplementation(function () {
59
+ return {
60
+ quit: vi.fn().mockRejectedValue(new Error("SIGTERM failed")),
61
+ };
62
+ });
63
+ await handleQuitApp({});
64
+ expect(process.exitCode).toBe(1);
65
+ expect(stderrSpy).toHaveBeenCalledWith("SIGTERM failed\n");
66
+ });
67
+ });
68
+ //# sourceMappingURL=quit-app.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quit-app.test.js","sourceRoot":"","sources":["../../src/handlers/quit-app.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function handleStartInstance(accountIdArg: string, options: {
2
+ cdpPort?: number;
3
+ }): Promise<void>;
4
+ //# sourceMappingURL=start-instance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start-instance.d.ts","sourceRoot":"","sources":["../../src/handlers/start-instance.ts"],"names":[],"mappings":"AAKA,wBAAsB,mBAAmB,CACvC,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAC5B,OAAO,CAAC,IAAI,CAAC,CA4Cf"}