@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,36 @@
1
+ import { LauncherService, startInstanceWithRecovery, } from "@lhremote/core";
2
+ export async function handleStartInstance(accountIdArg, options) {
3
+ const accountId = Number(accountIdArg);
4
+ const cdpPort = options.cdpPort ?? 9222;
5
+ const launcher = new LauncherService(cdpPort);
6
+ try {
7
+ await launcher.connect();
8
+ }
9
+ catch (error) {
10
+ const message = error instanceof Error ? error.message : String(error);
11
+ process.stderr.write(`${message}\n`);
12
+ process.exitCode = 1;
13
+ return;
14
+ }
15
+ try {
16
+ const outcome = await startInstanceWithRecovery(launcher, accountId, cdpPort);
17
+ if (outcome.status === "timeout") {
18
+ process.stderr.write("Instance started but failed to initialize within timeout.\n");
19
+ process.exitCode = 1;
20
+ return;
21
+ }
22
+ const verb = outcome.status === "already_running"
23
+ ? "already running"
24
+ : "started";
25
+ process.stdout.write(`Instance ${verb} for account ${String(accountId)} on CDP port ${String(outcome.port)}\n`);
26
+ }
27
+ catch (error) {
28
+ const message = error instanceof Error ? error.message : String(error);
29
+ process.stderr.write(`${message}\n`);
30
+ process.exitCode = 1;
31
+ }
32
+ finally {
33
+ launcher.disconnect();
34
+ }
35
+ }
36
+ //# sourceMappingURL=start-instance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start-instance.js","sourceRoot":"","sources":["../../src/handlers/start-instance.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,yBAAyB,GAC1B,MAAM,gBAAgB,CAAC;AAExB,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,YAAoB,EACpB,OAA6B;IAE7B,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;IACvC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC;IACxC,MAAM,QAAQ,GAAG,IAAI,eAAe,CAAC,OAAO,CAAC,CAAC;IAE9C,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,OAAO,GAAG,MAAM,yBAAyB,CAC7C,QAAQ,EACR,SAAS,EACT,OAAO,CACR,CAAC;QAEF,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACjC,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,6DAA6D,CAC9D,CAAC;YACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GACR,OAAO,CAAC,MAAM,KAAK,iBAAiB;YAClC,CAAC,CAAC,iBAAiB;YACnB,CAAC,CAAC,SAAS,CAAC;QAEhB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,YAAY,IAAI,gBAAgB,MAAM,CAAC,SAAS,CAAC,gBAAgB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAC1F,CAAC;IACJ,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=start-instance.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start-instance.test.d.ts","sourceRoot":"","sources":["../../src/handlers/start-instance.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,122 @@
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
+ startInstanceWithRecovery: vi.fn(),
8
+ };
9
+ });
10
+ import { LauncherService, LinkedHelperNotRunningError, startInstanceWithRecovery, } from "@lhremote/core";
11
+ import { handleStartInstance } from "./start-instance.js";
12
+ describe("handleStartInstance", () => {
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 success with port on successful start", async () => {
23
+ const stdoutSpy = vi
24
+ .spyOn(process.stdout, "write")
25
+ .mockReturnValue(true);
26
+ vi.mocked(LauncherService).mockImplementation(function () {
27
+ return {
28
+ connect: vi.fn().mockResolvedValue(undefined),
29
+ disconnect: vi.fn(),
30
+ };
31
+ });
32
+ vi.mocked(startInstanceWithRecovery).mockResolvedValue({
33
+ status: "started",
34
+ port: 55123,
35
+ });
36
+ await handleStartInstance("42", {});
37
+ expect(stdoutSpy).toHaveBeenCalledWith("Instance started for account 42 on CDP port 55123\n");
38
+ expect(process.exitCode).toBeUndefined();
39
+ });
40
+ it("sets exitCode 1 on connection error", async () => {
41
+ const stderrSpy = vi
42
+ .spyOn(process.stderr, "write")
43
+ .mockReturnValue(true);
44
+ vi.mocked(LauncherService).mockImplementation(function () {
45
+ return {
46
+ connect: vi
47
+ .fn()
48
+ .mockRejectedValue(new LinkedHelperNotRunningError(9222)),
49
+ disconnect: vi.fn(),
50
+ };
51
+ });
52
+ await handleStartInstance("42", {});
53
+ expect(process.exitCode).toBe(1);
54
+ expect(stderrSpy).toHaveBeenCalledWith(expect.stringContaining("not running"));
55
+ });
56
+ it("handles idempotent 'already running' when port available", async () => {
57
+ const stdoutSpy = vi
58
+ .spyOn(process.stdout, "write")
59
+ .mockReturnValue(true);
60
+ vi.mocked(LauncherService).mockImplementation(function () {
61
+ return {
62
+ connect: vi.fn().mockResolvedValue(undefined),
63
+ disconnect: vi.fn(),
64
+ };
65
+ });
66
+ vi.mocked(startInstanceWithRecovery).mockResolvedValue({
67
+ status: "already_running",
68
+ port: 55123,
69
+ });
70
+ await handleStartInstance("42", {});
71
+ expect(stdoutSpy).toHaveBeenCalledWith("Instance already running for account 42 on CDP port 55123\n");
72
+ expect(process.exitCode).toBeUndefined();
73
+ });
74
+ it("sets exitCode 1 on unexpected error", async () => {
75
+ const stderrSpy = vi
76
+ .spyOn(process.stderr, "write")
77
+ .mockReturnValue(true);
78
+ vi.mocked(LauncherService).mockImplementation(function () {
79
+ return {
80
+ connect: vi.fn().mockResolvedValue(undefined),
81
+ disconnect: vi.fn(),
82
+ };
83
+ });
84
+ vi.mocked(startInstanceWithRecovery).mockRejectedValue(new Error("unexpected failure"));
85
+ await handleStartInstance("42", {});
86
+ expect(process.exitCode).toBe(1);
87
+ expect(stderrSpy).toHaveBeenCalledWith(expect.stringContaining("unexpected failure"));
88
+ });
89
+ it("passes cdpPort option to LauncherService", async () => {
90
+ vi.spyOn(process.stdout, "write").mockReturnValue(true);
91
+ vi.mocked(LauncherService).mockImplementation(function () {
92
+ return {
93
+ connect: vi.fn().mockResolvedValue(undefined),
94
+ disconnect: vi.fn(),
95
+ };
96
+ });
97
+ vi.mocked(startInstanceWithRecovery).mockResolvedValue({
98
+ status: "started",
99
+ port: 55123,
100
+ });
101
+ await handleStartInstance("42", { cdpPort: 4567 });
102
+ expect(LauncherService).toHaveBeenCalledWith(4567);
103
+ });
104
+ it("sets exitCode 1 when instance fails to initialize within timeout", async () => {
105
+ const stderrSpy = vi
106
+ .spyOn(process.stderr, "write")
107
+ .mockReturnValue(true);
108
+ vi.mocked(LauncherService).mockImplementation(function () {
109
+ return {
110
+ connect: vi.fn().mockResolvedValue(undefined),
111
+ disconnect: vi.fn(),
112
+ };
113
+ });
114
+ vi.mocked(startInstanceWithRecovery).mockResolvedValue({
115
+ status: "timeout",
116
+ });
117
+ await handleStartInstance("42", {});
118
+ expect(process.exitCode).toBe(1);
119
+ expect(stderrSpy).toHaveBeenCalledWith("Instance started but failed to initialize within timeout.\n");
120
+ });
121
+ });
122
+ //# sourceMappingURL=start-instance.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start-instance.test.js","sourceRoot":"","sources":["../../src/handlers/start-instance.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function handleStopInstance(accountIdArg: string, options: {
2
+ cdpPort?: number;
3
+ }): Promise<void>;
4
+ //# sourceMappingURL=stop-instance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stop-instance.d.ts","sourceRoot":"","sources":["../../src/handlers/stop-instance.ts"],"names":[],"mappings":"AAEA,wBAAsB,kBAAkB,CACtC,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAC5B,OAAO,CAAC,IAAI,CAAC,CA0Bf"}
@@ -0,0 +1,28 @@
1
+ import { LauncherService } from "@lhremote/core";
2
+ export async function handleStopInstance(accountIdArg, options) {
3
+ const accountId = Number(accountIdArg);
4
+ const cdpPort = options.cdpPort ?? 9222;
5
+ const launcher = new LauncherService(cdpPort);
6
+ try {
7
+ await launcher.connect();
8
+ }
9
+ catch (error) {
10
+ const message = error instanceof Error ? error.message : String(error);
11
+ process.stderr.write(`${message}\n`);
12
+ process.exitCode = 1;
13
+ return;
14
+ }
15
+ try {
16
+ await launcher.stopInstance(accountId);
17
+ process.stdout.write(`Instance stopped for account ${String(accountId)}\n`);
18
+ }
19
+ catch (error) {
20
+ const message = error instanceof Error ? error.message : String(error);
21
+ process.stderr.write(`${message}\n`);
22
+ process.exitCode = 1;
23
+ }
24
+ finally {
25
+ launcher.disconnect();
26
+ }
27
+ }
28
+ //# sourceMappingURL=stop-instance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stop-instance.js","sourceRoot":"","sources":["../../src/handlers/stop-instance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,YAAoB,EACpB,OAA6B;IAE7B,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;IACvC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC;IACxC,MAAM,QAAQ,GAAG,IAAI,eAAe,CAAC,OAAO,CAAC,CAAC;IAE9C,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,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;QACvC,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,gCAAgC,MAAM,CAAC,SAAS,CAAC,IAAI,CACtD,CAAC;IACJ,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=stop-instance.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stop-instance.test.d.ts","sourceRoot":"","sources":["../../src/handlers/stop-instance.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,82 @@
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 { handleStopInstance } from "./stop-instance.js";
11
+ describe("handleStopInstance", () => {
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 on successful stop", async () => {
22
+ const stdoutSpy = vi
23
+ .spyOn(process.stdout, "write")
24
+ .mockReturnValue(true);
25
+ vi.mocked(LauncherService).mockImplementation(function () {
26
+ return {
27
+ connect: vi.fn().mockResolvedValue(undefined),
28
+ disconnect: vi.fn(),
29
+ stopInstance: vi.fn().mockResolvedValue(undefined),
30
+ };
31
+ });
32
+ await handleStopInstance("42", {});
33
+ expect(stdoutSpy).toHaveBeenCalledWith("Instance stopped for account 42\n");
34
+ expect(process.exitCode).toBeUndefined();
35
+ });
36
+ it("sets exitCode 1 on connection error", async () => {
37
+ const stderrSpy = vi
38
+ .spyOn(process.stderr, "write")
39
+ .mockReturnValue(true);
40
+ vi.mocked(LauncherService).mockImplementation(function () {
41
+ return {
42
+ connect: vi
43
+ .fn()
44
+ .mockRejectedValue(new LinkedHelperNotRunningError(9222)),
45
+ disconnect: vi.fn(),
46
+ };
47
+ });
48
+ await handleStopInstance("42", {});
49
+ expect(process.exitCode).toBe(1);
50
+ expect(stderrSpy).toHaveBeenCalledWith(expect.stringContaining("not running"));
51
+ });
52
+ it("sets exitCode 1 on unexpected error", async () => {
53
+ const stderrSpy = vi
54
+ .spyOn(process.stderr, "write")
55
+ .mockReturnValue(true);
56
+ vi.mocked(LauncherService).mockImplementation(function () {
57
+ return {
58
+ connect: vi.fn().mockResolvedValue(undefined),
59
+ disconnect: vi.fn(),
60
+ stopInstance: vi
61
+ .fn()
62
+ .mockRejectedValue(new Error("unexpected failure")),
63
+ };
64
+ });
65
+ await handleStopInstance("42", {});
66
+ expect(process.exitCode).toBe(1);
67
+ expect(stderrSpy).toHaveBeenCalledWith("unexpected failure\n");
68
+ });
69
+ it("passes cdpPort option to LauncherService", async () => {
70
+ vi.spyOn(process.stdout, "write").mockReturnValue(true);
71
+ vi.mocked(LauncherService).mockImplementation(function () {
72
+ return {
73
+ connect: vi.fn().mockResolvedValue(undefined),
74
+ disconnect: vi.fn(),
75
+ stopInstance: vi.fn().mockResolvedValue(undefined),
76
+ };
77
+ });
78
+ await handleStopInstance("42", { cdpPort: 4567 });
79
+ expect(LauncherService).toHaveBeenCalledWith(4567);
80
+ });
81
+ });
82
+ //# sourceMappingURL=stop-instance.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stop-instance.test.js","sourceRoot":"","sources":["../../src/handlers/stop-instance.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAEzE,EAAE,CAAC,IAAI,CAAC,gBAAgB,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE;IACjD,MAAM,MAAM,GAAG,MAAM,cAAc,EAAmC,CAAC;IACvE,OAAO;QACL,GAAG,MAAM;QACT,eAAe,EAAE,EAAE,CAAC,EAAE,EAAE;KACzB,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,OAAO,EACL,eAAe,EACf,2BAA2B,GAC5B,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,MAAM,gBAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAE1C,UAAU,CAAC,GAAG,EAAE;QACd,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC;QAC7B,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,CAAC,QAAQ,GAAG,gBAAgB,CAAC;QACpC,EAAE,CAAC,eAAe,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,SAAS,GAAG,EAAE;aACjB,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC;aAC9B,eAAe,CAAC,IAAI,CAAC,CAAC;QAEzB,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,kBAAkB,CAAC;YAC5C,OAAO;gBACL,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;gBAC7C,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE;gBACnB,YAAY,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;aACrB,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,MAAM,kBAAkB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAEnC,MAAM,CAAC,SAAS,CAAC,CAAC,oBAAoB,CACpC,mCAAmC,CACpC,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,aAAa,EAAE,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACnD,MAAM,SAAS,GAAG,EAAE;aACjB,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC;aAC9B,eAAe,CAAC,IAAI,CAAC,CAAC;QAEzB,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,kBAAkB,CAAC;YAC5C,OAAO;gBACL,OAAO,EAAE,EAAE;qBACR,EAAE,EAAE;qBACJ,iBAAiB,CAAC,IAAI,2BAA2B,CAAC,IAAI,CAAC,CAAC;gBAC3D,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE;aACU,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,MAAM,kBAAkB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAEnC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,CAAC,SAAS,CAAC,CAAC,oBAAoB,CACpC,MAAM,CAAC,gBAAgB,CAAC,aAAa,CAAC,CACvC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACnD,MAAM,SAAS,GAAG,EAAE;aACjB,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC;aAC9B,eAAe,CAAC,IAAI,CAAC,CAAC;QAEzB,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,kBAAkB,CAAC;YAC5C,OAAO;gBACL,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;gBAC7C,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE;gBACnB,YAAY,EAAE,EAAE;qBACb,EAAE,EAAE;qBACJ,iBAAiB,CAAC,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;aACxB,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,MAAM,kBAAkB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAEnC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,CAAC,SAAS,CAAC,CAAC,oBAAoB,CAAC,sBAAsB,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAExD,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,kBAAkB,CAAC;YAC5C,OAAO;gBACL,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;gBAC7C,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE;gBACnB,YAAY,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;aACrB,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,MAAM,kBAAkB,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAElD,MAAM,CAAC,eAAe,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare function handleVisitAndExtract(profileUrl: string, options: {
2
+ cdpPort?: number;
3
+ json?: boolean;
4
+ }): Promise<void>;
5
+ //# sourceMappingURL=visit-and-extract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"visit-and-extract.d.ts","sourceRoot":"","sources":["../../src/handlers/visit-and-extract.ts"],"names":[],"mappings":"AAUA,wBAAsB,qBAAqB,CACzC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAC5C,OAAO,CAAC,IAAI,CAAC,CAiHf"}
@@ -0,0 +1,105 @@
1
+ import { DatabaseClient, discoverDatabase, discoverInstancePort, InstanceService, LauncherService, ProfileService, } from "@lhremote/core";
2
+ export async function handleVisitAndExtract(profileUrl, options) {
3
+ if (!isLinkedInProfileUrl(profileUrl)) {
4
+ process.stderr.write("Invalid LinkedIn profile URL. Expected: https://www.linkedin.com/in/username\n");
5
+ process.exitCode = 1;
6
+ return;
7
+ }
8
+ const cdpPort = options.cdpPort ?? 9222;
9
+ // Connect to launcher to find the running account
10
+ const launcher = new LauncherService(cdpPort);
11
+ let accountId;
12
+ try {
13
+ await launcher.connect();
14
+ const accounts = await launcher.listAccounts();
15
+ if (accounts.length === 0) {
16
+ process.stderr.write("No accounts found.\n");
17
+ process.exitCode = 1;
18
+ return;
19
+ }
20
+ if (accounts.length > 1) {
21
+ process.stderr.write("Multiple accounts found. Cannot determine which instance to use.\n");
22
+ process.exitCode = 1;
23
+ return;
24
+ }
25
+ accountId = accounts[0].id;
26
+ }
27
+ catch (error) {
28
+ const message = error instanceof Error ? error.message : String(error);
29
+ process.stderr.write(`${message}\n`);
30
+ process.exitCode = 1;
31
+ return;
32
+ }
33
+ finally {
34
+ launcher.disconnect();
35
+ }
36
+ // Discover instance CDP port
37
+ const instancePort = await discoverInstancePort(cdpPort);
38
+ if (instancePort === null) {
39
+ process.stderr.write("No LinkedHelper instance is running. Use start-instance first.\n");
40
+ process.exitCode = 1;
41
+ return;
42
+ }
43
+ // Connect to instance and extract profile
44
+ const instance = new InstanceService(instancePort);
45
+ let db = null;
46
+ try {
47
+ await instance.connect();
48
+ const dbPath = discoverDatabase(accountId);
49
+ db = new DatabaseClient(dbPath);
50
+ const profileService = new ProfileService(instance, db);
51
+ const profile = await profileService.visitAndExtract(profileUrl);
52
+ if (options.json) {
53
+ process.stdout.write(JSON.stringify(profile, null, 2) + "\n");
54
+ }
55
+ else {
56
+ const name = [
57
+ profile.miniProfile.firstName,
58
+ profile.miniProfile.lastName,
59
+ ]
60
+ .filter(Boolean)
61
+ .join(" ");
62
+ process.stdout.write(`${name}\n`);
63
+ if (profile.miniProfile.headline) {
64
+ process.stdout.write(`${profile.miniProfile.headline}\n`);
65
+ }
66
+ if (profile.currentPosition) {
67
+ const parts = [
68
+ profile.currentPosition.title,
69
+ profile.currentPosition.company,
70
+ ].filter(Boolean);
71
+ if (parts.length > 0) {
72
+ process.stdout.write(`${parts.join(" at ")}\n`);
73
+ }
74
+ }
75
+ if (profile.emails.length > 0) {
76
+ process.stdout.write(`Emails: ${profile.emails.join(", ")}\n`);
77
+ }
78
+ if (profile.skills.length > 0) {
79
+ process.stdout.write(`Skills: ${profile.skills.map((s) => s.name).join(", ")}\n`);
80
+ }
81
+ process.stdout.write(`Positions: ${String(profile.positions.length)}, Education: ${String(profile.education.length)}\n`);
82
+ }
83
+ }
84
+ catch (error) {
85
+ const message = error instanceof Error ? error.message : String(error);
86
+ process.stderr.write(`${message}\n`);
87
+ process.exitCode = 1;
88
+ }
89
+ finally {
90
+ instance.disconnect();
91
+ db?.close();
92
+ }
93
+ }
94
+ function isLinkedInProfileUrl(url) {
95
+ try {
96
+ const parsed = new URL(url);
97
+ return ((parsed.hostname === "www.linkedin.com" ||
98
+ parsed.hostname === "linkedin.com") &&
99
+ parsed.pathname.startsWith("/in/"));
100
+ }
101
+ catch {
102
+ return false;
103
+ }
104
+ }
105
+ //# sourceMappingURL=visit-and-extract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"visit-and-extract.js","sourceRoot":"","sources":["../../src/handlers/visit-and-extract.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=visit-and-extract.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"visit-and-extract.test.d.ts","sourceRoot":"","sources":["../../src/handlers/visit-and-extract.test.ts"],"names":[],"mappings":""}