@lhremote/mcp 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.
- package/LICENSE +661 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/server.d.ts +6 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +14 -0
- package/dist/server.js.map +1 -0
- package/dist/server.test.d.ts +2 -0
- package/dist/server.test.d.ts.map +1 -0
- package/dist/server.test.js +58 -0
- package/dist/server.test.js.map +1 -0
- package/dist/stdio.d.ts +7 -0
- package/dist/stdio.d.ts.map +1 -0
- package/dist/stdio.js +34 -0
- package/dist/stdio.js.map +1 -0
- package/dist/tools/check-status.d.ts +3 -0
- package/dist/tools/check-status.d.ts.map +1 -0
- package/dist/tools/check-status.js +35 -0
- package/dist/tools/check-status.js.map +1 -0
- package/dist/tools/check-status.test.d.ts +2 -0
- package/dist/tools/check-status.test.d.ts.map +1 -0
- package/dist/tools/check-status.test.js +86 -0
- package/dist/tools/check-status.test.js.map +1 -0
- package/dist/tools/index.d.ts +3 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +17 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/launch-app.d.ts +3 -0
- package/dist/tools/launch-app.d.ts.map +1 -0
- package/dist/tools/launch-app.js +42 -0
- package/dist/tools/launch-app.js.map +1 -0
- package/dist/tools/launch-app.test.d.ts +2 -0
- package/dist/tools/launch-app.test.d.ts.map +1 -0
- package/dist/tools/launch-app.test.js +102 -0
- package/dist/tools/launch-app.test.js.map +1 -0
- package/dist/tools/list-accounts.d.ts +3 -0
- package/dist/tools/list-accounts.d.ts.map +1 -0
- package/dist/tools/list-accounts.js +62 -0
- package/dist/tools/list-accounts.js.map +1 -0
- package/dist/tools/list-accounts.test.d.ts +2 -0
- package/dist/tools/list-accounts.test.d.ts.map +1 -0
- package/dist/tools/list-accounts.test.js +99 -0
- package/dist/tools/list-accounts.test.js.map +1 -0
- package/dist/tools/quit-app.d.ts +3 -0
- package/dist/tools/quit-app.d.ts.map +1 -0
- package/dist/tools/quit-app.js +31 -0
- package/dist/tools/quit-app.js.map +1 -0
- package/dist/tools/quit-app.test.d.ts +2 -0
- package/dist/tools/quit-app.test.d.ts.map +1 -0
- package/dist/tools/quit-app.test.js +65 -0
- package/dist/tools/quit-app.test.js.map +1 -0
- package/dist/tools/start-instance.d.ts +3 -0
- package/dist/tools/start-instance.d.ts.map +1 -0
- package/dist/tools/start-instance.js +115 -0
- package/dist/tools/start-instance.js.map +1 -0
- package/dist/tools/start-instance.test.d.ts +2 -0
- package/dist/tools/start-instance.test.d.ts.map +1 -0
- package/dist/tools/start-instance.test.js +232 -0
- package/dist/tools/start-instance.test.js.map +1 -0
- package/dist/tools/stop-instance.d.ts +3 -0
- package/dist/tools/stop-instance.d.ts.map +1 -0
- package/dist/tools/stop-instance.js +101 -0
- package/dist/tools/stop-instance.js.map +1 -0
- package/dist/tools/stop-instance.test.d.ts +2 -0
- package/dist/tools/stop-instance.test.d.ts.map +1 -0
- package/dist/tools/stop-instance.test.js +177 -0
- package/dist/tools/stop-instance.test.js.map +1 -0
- package/dist/tools/testing/mock-server.d.ts +6 -0
- package/dist/tools/testing/mock-server.d.ts.map +1 -0
- package/dist/tools/testing/mock-server.js +19 -0
- package/dist/tools/testing/mock-server.js.map +1 -0
- package/dist/tools/visit-and-extract.d.ts +3 -0
- package/dist/tools/visit-and-extract.d.ts.map +1 -0
- package/dist/tools/visit-and-extract.js +183 -0
- package/dist/tools/visit-and-extract.js.map +1 -0
- package/dist/tools/visit-and-extract.test.d.ts +2 -0
- package/dist/tools/visit-and-extract.test.d.ts.map +1 -0
- package/dist/tools/visit-and-extract.test.js +399 -0
- package/dist/tools/visit-and-extract.test.js.map +1 -0
- package/package.json +29 -13
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { LauncherService, LinkedHelperNotRunningError, } from "@lhremote/core";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
export function registerStopInstance(server) {
|
|
4
|
+
server.tool("stop-instance", "Stop a running LinkedHelper instance", {
|
|
5
|
+
accountId: z
|
|
6
|
+
.number()
|
|
7
|
+
.int()
|
|
8
|
+
.positive()
|
|
9
|
+
.optional()
|
|
10
|
+
.describe("Account ID (omit to stop the only running instance)"),
|
|
11
|
+
cdpPort: z
|
|
12
|
+
.number()
|
|
13
|
+
.int()
|
|
14
|
+
.positive()
|
|
15
|
+
.optional()
|
|
16
|
+
.default(9222)
|
|
17
|
+
.describe("CDP port (default: 9222)"),
|
|
18
|
+
}, async ({ accountId, cdpPort }) => {
|
|
19
|
+
const launcher = new LauncherService(cdpPort);
|
|
20
|
+
try {
|
|
21
|
+
await launcher.connect();
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
if (error instanceof LinkedHelperNotRunningError) {
|
|
25
|
+
return {
|
|
26
|
+
isError: true,
|
|
27
|
+
content: [
|
|
28
|
+
{
|
|
29
|
+
type: "text",
|
|
30
|
+
text: "LinkedHelper is not running. Use launch-app first.",
|
|
31
|
+
},
|
|
32
|
+
],
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
36
|
+
return {
|
|
37
|
+
isError: true,
|
|
38
|
+
content: [
|
|
39
|
+
{
|
|
40
|
+
type: "text",
|
|
41
|
+
text: `Failed to connect to LinkedHelper: ${message}`,
|
|
42
|
+
},
|
|
43
|
+
],
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
try {
|
|
47
|
+
let resolvedId = accountId;
|
|
48
|
+
if (resolvedId === undefined) {
|
|
49
|
+
const accounts = await launcher.listAccounts();
|
|
50
|
+
if (accounts.length === 0) {
|
|
51
|
+
return {
|
|
52
|
+
isError: true,
|
|
53
|
+
content: [
|
|
54
|
+
{
|
|
55
|
+
type: "text",
|
|
56
|
+
text: "No accounts found.",
|
|
57
|
+
},
|
|
58
|
+
],
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
if (accounts.length > 1) {
|
|
62
|
+
return {
|
|
63
|
+
isError: true,
|
|
64
|
+
content: [
|
|
65
|
+
{
|
|
66
|
+
type: "text",
|
|
67
|
+
text: "Multiple accounts found. Specify accountId. Use list-accounts to see available accounts.",
|
|
68
|
+
},
|
|
69
|
+
],
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
resolvedId = accounts[0].id;
|
|
73
|
+
}
|
|
74
|
+
await launcher.stopInstance(resolvedId);
|
|
75
|
+
return {
|
|
76
|
+
content: [
|
|
77
|
+
{
|
|
78
|
+
type: "text",
|
|
79
|
+
text: `Instance stopped for account ${String(resolvedId)}`,
|
|
80
|
+
},
|
|
81
|
+
],
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
86
|
+
return {
|
|
87
|
+
isError: true,
|
|
88
|
+
content: [
|
|
89
|
+
{
|
|
90
|
+
type: "text",
|
|
91
|
+
text: `Failed to stop instance: ${message}`,
|
|
92
|
+
},
|
|
93
|
+
],
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
finally {
|
|
97
|
+
launcher.disconnect();
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=stop-instance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stop-instance.js","sourceRoot":"","sources":["../../src/tools/stop-instance.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stop-instance.test.d.ts","sourceRoot":"","sources":["../../src/tools/stop-instance.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,177 @@
|
|
|
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 { registerStopInstance } from "./stop-instance.js";
|
|
11
|
+
import { createMockServer } from "./testing/mock-server.js";
|
|
12
|
+
function mockLauncher(overrides = {}) {
|
|
13
|
+
const disconnect = vi.fn();
|
|
14
|
+
vi.mocked(LauncherService).mockImplementation(function () {
|
|
15
|
+
return {
|
|
16
|
+
connect: vi.fn().mockResolvedValue(undefined),
|
|
17
|
+
disconnect,
|
|
18
|
+
listAccounts: vi.fn().mockResolvedValue([]),
|
|
19
|
+
stopInstance: vi.fn().mockResolvedValue(undefined),
|
|
20
|
+
...overrides,
|
|
21
|
+
};
|
|
22
|
+
});
|
|
23
|
+
return { disconnect };
|
|
24
|
+
}
|
|
25
|
+
describe("registerStopInstance", () => {
|
|
26
|
+
beforeEach(() => {
|
|
27
|
+
vi.clearAllMocks();
|
|
28
|
+
});
|
|
29
|
+
afterEach(() => {
|
|
30
|
+
vi.restoreAllMocks();
|
|
31
|
+
});
|
|
32
|
+
it("registers a tool named stop-instance", () => {
|
|
33
|
+
const { server } = createMockServer();
|
|
34
|
+
registerStopInstance(server);
|
|
35
|
+
expect(server.tool).toHaveBeenCalledOnce();
|
|
36
|
+
expect(server.tool).toHaveBeenCalledWith("stop-instance", expect.any(String), expect.any(Object), expect.any(Function));
|
|
37
|
+
});
|
|
38
|
+
it("returns success when instance stopped", async () => {
|
|
39
|
+
const { server, getHandler } = createMockServer();
|
|
40
|
+
registerStopInstance(server);
|
|
41
|
+
const stopInstance = vi.fn().mockResolvedValue(undefined);
|
|
42
|
+
mockLauncher({ stopInstance });
|
|
43
|
+
const handler = getHandler("stop-instance");
|
|
44
|
+
const result = await handler({ accountId: 42, cdpPort: 9222 });
|
|
45
|
+
expect(stopInstance).toHaveBeenCalledWith(42);
|
|
46
|
+
expect(result).toEqual({
|
|
47
|
+
content: [
|
|
48
|
+
{ type: "text", text: "Instance stopped for account 42" },
|
|
49
|
+
],
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
it("auto-selects single account when accountId omitted", async () => {
|
|
53
|
+
const { server, getHandler } = createMockServer();
|
|
54
|
+
registerStopInstance(server);
|
|
55
|
+
const accounts = [
|
|
56
|
+
{ id: 42, liId: 42, name: "Alice" },
|
|
57
|
+
];
|
|
58
|
+
const stopInstance = vi.fn().mockResolvedValue(undefined);
|
|
59
|
+
mockLauncher({
|
|
60
|
+
listAccounts: vi.fn().mockResolvedValue(accounts),
|
|
61
|
+
stopInstance,
|
|
62
|
+
});
|
|
63
|
+
const handler = getHandler("stop-instance");
|
|
64
|
+
const result = await handler({ cdpPort: 9222 });
|
|
65
|
+
expect(stopInstance).toHaveBeenCalledWith(42);
|
|
66
|
+
expect(result).toEqual({
|
|
67
|
+
content: [
|
|
68
|
+
{ type: "text", text: "Instance stopped for account 42" },
|
|
69
|
+
],
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
it("returns error when no accounts and accountId omitted", async () => {
|
|
73
|
+
const { server, getHandler } = createMockServer();
|
|
74
|
+
registerStopInstance(server);
|
|
75
|
+
mockLauncher({
|
|
76
|
+
listAccounts: vi.fn().mockResolvedValue([]),
|
|
77
|
+
});
|
|
78
|
+
const handler = getHandler("stop-instance");
|
|
79
|
+
const result = await handler({ cdpPort: 9222 });
|
|
80
|
+
expect(result).toEqual({
|
|
81
|
+
isError: true,
|
|
82
|
+
content: [{ type: "text", text: "No accounts found." }],
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
it("returns error when multiple accounts and accountId omitted", async () => {
|
|
86
|
+
const { server, getHandler } = createMockServer();
|
|
87
|
+
registerStopInstance(server);
|
|
88
|
+
const accounts = [
|
|
89
|
+
{ id: 1, liId: 1, name: "Alice" },
|
|
90
|
+
{ id: 2, liId: 2, name: "Bob" },
|
|
91
|
+
];
|
|
92
|
+
mockLauncher({
|
|
93
|
+
listAccounts: vi.fn().mockResolvedValue(accounts),
|
|
94
|
+
});
|
|
95
|
+
const handler = getHandler("stop-instance");
|
|
96
|
+
const result = await handler({ cdpPort: 9222 });
|
|
97
|
+
expect(result).toEqual({
|
|
98
|
+
isError: true,
|
|
99
|
+
content: [
|
|
100
|
+
{
|
|
101
|
+
type: "text",
|
|
102
|
+
text: "Multiple accounts found. Specify accountId. Use list-accounts to see available accounts.",
|
|
103
|
+
},
|
|
104
|
+
],
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
it("returns error when LinkedHelper not running", async () => {
|
|
108
|
+
const { server, getHandler } = createMockServer();
|
|
109
|
+
registerStopInstance(server);
|
|
110
|
+
vi.mocked(LauncherService).mockImplementation(function () {
|
|
111
|
+
return {
|
|
112
|
+
connect: vi
|
|
113
|
+
.fn()
|
|
114
|
+
.mockRejectedValue(new LinkedHelperNotRunningError(9222)),
|
|
115
|
+
disconnect: vi.fn(),
|
|
116
|
+
};
|
|
117
|
+
});
|
|
118
|
+
const handler = getHandler("stop-instance");
|
|
119
|
+
const result = await handler({ accountId: 42, cdpPort: 9222 });
|
|
120
|
+
expect(result).toEqual({
|
|
121
|
+
isError: true,
|
|
122
|
+
content: [
|
|
123
|
+
{
|
|
124
|
+
type: "text",
|
|
125
|
+
text: "LinkedHelper is not running. Use launch-app first.",
|
|
126
|
+
},
|
|
127
|
+
],
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
it("returns error on unexpected error", async () => {
|
|
131
|
+
const { server, getHandler } = createMockServer();
|
|
132
|
+
registerStopInstance(server);
|
|
133
|
+
mockLauncher({
|
|
134
|
+
stopInstance: vi
|
|
135
|
+
.fn()
|
|
136
|
+
.mockRejectedValue(new Error("unexpected failure")),
|
|
137
|
+
});
|
|
138
|
+
const handler = getHandler("stop-instance");
|
|
139
|
+
const result = await handler({ accountId: 42, cdpPort: 9222 });
|
|
140
|
+
expect(result).toEqual({
|
|
141
|
+
isError: true,
|
|
142
|
+
content: [
|
|
143
|
+
{
|
|
144
|
+
type: "text",
|
|
145
|
+
text: "Failed to stop instance: unexpected failure",
|
|
146
|
+
},
|
|
147
|
+
],
|
|
148
|
+
});
|
|
149
|
+
});
|
|
150
|
+
it("passes cdpPort to LauncherService", async () => {
|
|
151
|
+
const { server, getHandler } = createMockServer();
|
|
152
|
+
registerStopInstance(server);
|
|
153
|
+
mockLauncher();
|
|
154
|
+
const handler = getHandler("stop-instance");
|
|
155
|
+
await handler({ accountId: 42, cdpPort: 4567 });
|
|
156
|
+
expect(LauncherService).toHaveBeenCalledWith(4567);
|
|
157
|
+
});
|
|
158
|
+
it("disconnects after successful call", async () => {
|
|
159
|
+
const { server, getHandler } = createMockServer();
|
|
160
|
+
registerStopInstance(server);
|
|
161
|
+
const { disconnect } = mockLauncher();
|
|
162
|
+
const handler = getHandler("stop-instance");
|
|
163
|
+
await handler({ accountId: 42, cdpPort: 9222 });
|
|
164
|
+
expect(disconnect).toHaveBeenCalledOnce();
|
|
165
|
+
});
|
|
166
|
+
it("disconnects after error", async () => {
|
|
167
|
+
const { server, getHandler } = createMockServer();
|
|
168
|
+
registerStopInstance(server);
|
|
169
|
+
const { disconnect } = mockLauncher({
|
|
170
|
+
stopInstance: vi.fn().mockRejectedValue(new Error("fail")),
|
|
171
|
+
});
|
|
172
|
+
const handler = getHandler("stop-instance");
|
|
173
|
+
await handler({ accountId: 42, cdpPort: 9222 });
|
|
174
|
+
expect(disconnect).toHaveBeenCalledOnce();
|
|
175
|
+
});
|
|
176
|
+
});
|
|
177
|
+
//# sourceMappingURL=stop-instance.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stop-instance.test.js","sourceRoot":"","sources":["../../src/tools/stop-instance.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock-server.d.ts","sourceRoot":"","sources":["../../../src/tools/testing/mock-server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,wBAAgB,gBAAgB;;uBAgBJ,MAAM,eAbpB,OAAO,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC;EAoB3C"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { vi } from "vitest";
|
|
2
|
+
export function createMockServer() {
|
|
3
|
+
const tools = new Map();
|
|
4
|
+
const server = {
|
|
5
|
+
tool: vi.fn((...args) => {
|
|
6
|
+
const name = args[0];
|
|
7
|
+
const handler = args[args.length - 1];
|
|
8
|
+
tools.set(name, handler);
|
|
9
|
+
}),
|
|
10
|
+
};
|
|
11
|
+
function getHandler(name) {
|
|
12
|
+
const handler = tools.get(name);
|
|
13
|
+
if (!handler)
|
|
14
|
+
throw new Error(`Tool "${name}" not registered`);
|
|
15
|
+
return handler;
|
|
16
|
+
}
|
|
17
|
+
return { server, getHandler };
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=mock-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock-server.js","sourceRoot":"","sources":["../../../src/tools/testing/mock-server.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE5B,MAAM,UAAU,gBAAgB;IAC9B,MAAM,KAAK,GAAG,IAAI,GAAG,EAGlB,CAAC;IAEJ,MAAM,MAAM,GAAG;QACb,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,IAAe,EAAE,EAAE;YACjC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAW,CAAC;YAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAEf,CAAC;YACtB,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC3B,CAAC,CAAC;KACqB,CAAC;IAE1B,SAAS,UAAU,CAAC,IAAY;QAC9B,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,SAAS,IAAI,kBAAkB,CAAC,CAAC;QAC/D,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;AAChC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"visit-and-extract.d.ts","sourceRoot":"","sources":["../../src/tools/visit-and-extract.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAezE,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAsL/D"}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import { DatabaseClient, discoverDatabase, discoverInstancePort, ExtractionTimeoutError, InstanceNotRunningError, InstanceService, LauncherService, LinkedHelperNotRunningError, ProfileService, } from "@lhremote/core";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
export function registerVisitAndExtract(server) {
|
|
4
|
+
server.tool("visit-and-extract", "Visit a LinkedIn profile via LinkedHelper and extract all available data (name, positions, education, skills, emails). Requires a running instance.", {
|
|
5
|
+
profileUrl: z
|
|
6
|
+
.string()
|
|
7
|
+
.url()
|
|
8
|
+
.describe("LinkedIn profile URL (e.g., https://www.linkedin.com/in/username)"),
|
|
9
|
+
cdpPort: z
|
|
10
|
+
.number()
|
|
11
|
+
.int()
|
|
12
|
+
.positive()
|
|
13
|
+
.optional()
|
|
14
|
+
.default(9222)
|
|
15
|
+
.describe("CDP port (default: 9222)"),
|
|
16
|
+
}, async ({ profileUrl, cdpPort }) => {
|
|
17
|
+
// Validate LinkedIn URL format
|
|
18
|
+
if (!isLinkedInProfileUrl(profileUrl)) {
|
|
19
|
+
return {
|
|
20
|
+
isError: true,
|
|
21
|
+
content: [
|
|
22
|
+
{
|
|
23
|
+
type: "text",
|
|
24
|
+
text: "Invalid LinkedIn profile URL. Expected: https://www.linkedin.com/in/username",
|
|
25
|
+
},
|
|
26
|
+
],
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
// Connect to launcher to find running instance
|
|
30
|
+
const launcher = new LauncherService(cdpPort);
|
|
31
|
+
try {
|
|
32
|
+
await launcher.connect();
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
if (error instanceof LinkedHelperNotRunningError) {
|
|
36
|
+
return {
|
|
37
|
+
isError: true,
|
|
38
|
+
content: [
|
|
39
|
+
{
|
|
40
|
+
type: "text",
|
|
41
|
+
text: "LinkedHelper is not running. Use launch-app first.",
|
|
42
|
+
},
|
|
43
|
+
],
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
47
|
+
return {
|
|
48
|
+
isError: true,
|
|
49
|
+
content: [
|
|
50
|
+
{
|
|
51
|
+
type: "text",
|
|
52
|
+
text: `Failed to connect to LinkedHelper: ${message}`,
|
|
53
|
+
},
|
|
54
|
+
],
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
let accountId;
|
|
58
|
+
try {
|
|
59
|
+
const accounts = await launcher.listAccounts();
|
|
60
|
+
if (accounts.length === 0) {
|
|
61
|
+
return {
|
|
62
|
+
isError: true,
|
|
63
|
+
content: [
|
|
64
|
+
{
|
|
65
|
+
type: "text",
|
|
66
|
+
text: "No accounts found.",
|
|
67
|
+
},
|
|
68
|
+
],
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
if (accounts.length > 1) {
|
|
72
|
+
return {
|
|
73
|
+
isError: true,
|
|
74
|
+
content: [
|
|
75
|
+
{
|
|
76
|
+
type: "text",
|
|
77
|
+
text: "Multiple accounts found. Cannot determine which instance to use.",
|
|
78
|
+
},
|
|
79
|
+
],
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
accountId = accounts[0].id;
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
86
|
+
return {
|
|
87
|
+
isError: true,
|
|
88
|
+
content: [
|
|
89
|
+
{
|
|
90
|
+
type: "text",
|
|
91
|
+
text: `Failed to list accounts: ${message}`,
|
|
92
|
+
},
|
|
93
|
+
],
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
finally {
|
|
97
|
+
launcher.disconnect();
|
|
98
|
+
}
|
|
99
|
+
// Discover instance CDP port
|
|
100
|
+
const instancePort = await discoverInstancePort(cdpPort);
|
|
101
|
+
if (instancePort === null) {
|
|
102
|
+
return {
|
|
103
|
+
isError: true,
|
|
104
|
+
content: [
|
|
105
|
+
{
|
|
106
|
+
type: "text",
|
|
107
|
+
text: "No LinkedHelper instance is running. Use start-instance first.",
|
|
108
|
+
},
|
|
109
|
+
],
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
// Connect to instance
|
|
113
|
+
const instance = new InstanceService(instancePort);
|
|
114
|
+
let db = null;
|
|
115
|
+
try {
|
|
116
|
+
await instance.connect();
|
|
117
|
+
// Discover and open database
|
|
118
|
+
const dbPath = discoverDatabase(accountId);
|
|
119
|
+
db = new DatabaseClient(dbPath);
|
|
120
|
+
// Run visit-and-extract workflow
|
|
121
|
+
const profileService = new ProfileService(instance, db);
|
|
122
|
+
const profile = await profileService.visitAndExtract(profileUrl);
|
|
123
|
+
return {
|
|
124
|
+
content: [
|
|
125
|
+
{
|
|
126
|
+
type: "text",
|
|
127
|
+
text: JSON.stringify(profile, null, 2),
|
|
128
|
+
},
|
|
129
|
+
],
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
if (error instanceof InstanceNotRunningError) {
|
|
134
|
+
return {
|
|
135
|
+
isError: true,
|
|
136
|
+
content: [
|
|
137
|
+
{
|
|
138
|
+
type: "text",
|
|
139
|
+
text: "No LinkedHelper instance is running. Use start-instance first.",
|
|
140
|
+
},
|
|
141
|
+
],
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
if (error instanceof ExtractionTimeoutError) {
|
|
145
|
+
return {
|
|
146
|
+
isError: true,
|
|
147
|
+
content: [
|
|
148
|
+
{
|
|
149
|
+
type: "text",
|
|
150
|
+
text: "Profile extraction timed out. The profile may not have loaded correctly.",
|
|
151
|
+
},
|
|
152
|
+
],
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
156
|
+
return {
|
|
157
|
+
isError: true,
|
|
158
|
+
content: [
|
|
159
|
+
{
|
|
160
|
+
type: "text",
|
|
161
|
+
text: `Failed to extract profile: ${message}`,
|
|
162
|
+
},
|
|
163
|
+
],
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
finally {
|
|
167
|
+
instance.disconnect();
|
|
168
|
+
db?.close();
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
function isLinkedInProfileUrl(url) {
|
|
173
|
+
try {
|
|
174
|
+
const parsed = new URL(url);
|
|
175
|
+
return ((parsed.hostname === "www.linkedin.com" ||
|
|
176
|
+
parsed.hostname === "linkedin.com") &&
|
|
177
|
+
parsed.pathname.startsWith("/in/"));
|
|
178
|
+
}
|
|
179
|
+
catch {
|
|
180
|
+
return false;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=visit-and-extract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"visit-and-extract.js","sourceRoot":"","sources":["../../src/tools/visit-and-extract.ts"],"names":[],"mappings":"AACA,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,oBAAoB,EACpB,sBAAsB,EACtB,uBAAuB,EACvB,eAAe,EACf,eAAe,EACf,2BAA2B,EAC3B,cAAc,GAEf,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,UAAU,uBAAuB,CAAC,MAAiB;IACvD,MAAM,CAAC,IAAI,CACT,mBAAmB,EACnB,qJAAqJ,EACrJ;QACE,UAAU,EAAE,CAAC;aACV,MAAM,EAAE;aACR,GAAG,EAAE;aACL,QAAQ,CACP,mEAAmE,CACpE;QACH,OAAO,EAAE,CAAC;aACP,MAAM,EAAE;aACR,GAAG,EAAE;aACL,QAAQ,EAAE;aACV,QAAQ,EAAE;aACV,OAAO,CAAC,IAAI,CAAC;aACb,QAAQ,CAAC,0BAA0B,CAAC;KACxC,EACD,KAAK,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,EAAE;QAChC,+BAA+B;QAC/B,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,EAAE,CAAC;YACtC,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,8EAA8E;qBACrF;iBACF;aACF,CAAC;QACJ,CAAC;QAED,+CAA+C;QAC/C,MAAM,QAAQ,GAAG,IAAI,eAAe,CAAC,OAAO,CAAC,CAAC;QAE9C,IAAI,CAAC;YACH,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;QAC3B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,2BAA2B,EAAE,CAAC;gBACjD,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,oDAAoD;yBAC3D;qBACF;iBACF,CAAC;YACJ,CAAC;YACD,MAAM,OAAO,GACX,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACzD,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,sCAAsC,OAAO,EAAE;qBACtD;iBACF;aACF,CAAC;QACJ,CAAC;QAED,IAAI,SAAiB,CAAC;QACtB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,CAAC;YAC/C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC1B,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,oBAAoB;yBAC3B;qBACF;iBACF,CAAC;YACJ,CAAC;YACD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxB,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,kEAAkE;yBACzE;qBACF;iBACF,CAAC;YACJ,CAAC;YACD,SAAS,GAAI,QAAQ,CAAC,CAAC,CAAa,CAAC,EAAE,CAAC;QAC1C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GACX,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACzD,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,4BAA4B,OAAO,EAAE;qBAC5C;iBACF;aACF,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,QAAQ,CAAC,UAAU,EAAE,CAAC;QACxB,CAAC;QAED,6BAA6B;QAC7B,MAAM,YAAY,GAAG,MAAM,oBAAoB,CAAC,OAAO,CAAC,CAAC;QACzD,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;YAC1B,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,gEAAgE;qBACvE;iBACF;aACF,CAAC;QACJ,CAAC;QAED,sBAAsB;QACtB,MAAM,QAAQ,GAAG,IAAI,eAAe,CAAC,YAAY,CAAC,CAAC;QACnD,IAAI,EAAE,GAA0B,IAAI,CAAC;QAErC,IAAI,CAAC;YACH,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;YAEzB,6BAA6B;YAC7B,MAAM,MAAM,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;YAC3C,EAAE,GAAG,IAAI,cAAc,CAAC,MAAM,CAAC,CAAC;YAEhC,iCAAiC;YACjC,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YACxD,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;YAEjE,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;qBACvC;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,uBAAuB,EAAE,CAAC;gBAC7C,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,gEAAgE;yBACvE;qBACF;iBACF,CAAC;YACJ,CAAC;YACD,IAAI,KAAK,YAAY,sBAAsB,EAAE,CAAC;gBAC5C,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,0EAA0E;yBACjF;qBACF;iBACF,CAAC;YACJ,CAAC;YACD,MAAM,OAAO,GACX,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACzD,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,8BAA8B,OAAO,EAAE;qBAC9C;iBACF;aACF,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,QAAQ,CAAC,UAAU,EAAE,CAAC;YACtB,EAAE,EAAE,KAAK,EAAE,CAAC;QACd,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAAC,GAAW;IACvC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,OAAO,CACL,CAAC,MAAM,CAAC,QAAQ,KAAK,kBAAkB;YACrC,MAAM,CAAC,QAAQ,KAAK,cAAc,CAAC;YACrC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CACnC,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"visit-and-extract.test.d.ts","sourceRoot":"","sources":["../../src/tools/visit-and-extract.test.ts"],"names":[],"mappings":""}
|