linkedin-automation-cli 1.0.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/.env.example +12 -0
- package/.github/workflows/ci.yml +66 -0
- package/.github/workflows/publish.yml +48 -0
- package/.husky/pre-commit +6 -0
- package/.prettierignore +4 -0
- package/.prettierrc +10 -0
- package/AGENTS.md +294 -0
- package/CHANGELOG.md +40 -0
- package/GIT_RELEASE.md +167 -0
- package/LICENSE +21 -0
- package/Makefile +30 -0
- package/NPM_PUBLISHING.md +230 -0
- package/PYEOF +0 -0
- package/README.md +295 -0
- package/TESTING-GUIDE.md +151 -0
- package/cmd/linkedin/main.go +9 -0
- package/dist/agent/action-executor.d.ts +81 -0
- package/dist/agent/action-executor.d.ts.map +1 -0
- package/dist/agent/action-executor.js +170 -0
- package/dist/agent/action-executor.js.map +1 -0
- package/dist/agent/action-executor.test.d.ts +2 -0
- package/dist/agent/action-executor.test.d.ts.map +1 -0
- package/dist/agent/action-executor.test.js +366 -0
- package/dist/agent/action-executor.test.js.map +1 -0
- package/dist/agent/claude-client.d.ts +74 -0
- package/dist/agent/claude-client.d.ts.map +1 -0
- package/dist/agent/claude-client.js +314 -0
- package/dist/agent/claude-client.js.map +1 -0
- package/dist/agent/claude-client.test.d.ts +2 -0
- package/dist/agent/claude-client.test.d.ts.map +1 -0
- package/dist/agent/claude-client.test.js +590 -0
- package/dist/agent/claude-client.test.js.map +1 -0
- package/dist/agent/dom-extractor.d.ts +50 -0
- package/dist/agent/dom-extractor.d.ts.map +1 -0
- package/dist/agent/dom-extractor.js +374 -0
- package/dist/agent/dom-extractor.js.map +1 -0
- package/dist/agent/dom-extractor.test.d.ts +7 -0
- package/dist/agent/dom-extractor.test.d.ts.map +1 -0
- package/dist/agent/dom-extractor.test.js +504 -0
- package/dist/agent/dom-extractor.test.js.map +1 -0
- package/dist/agent/extension-client.d.ts +75 -0
- package/dist/agent/extension-client.d.ts.map +1 -0
- package/dist/agent/extension-client.js +245 -0
- package/dist/agent/extension-client.js.map +1 -0
- package/dist/agent/index.d.ts +8 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +16 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/page-agent.d.ts +76 -0
- package/dist/agent/page-agent.d.ts.map +1 -0
- package/dist/agent/page-agent.js +236 -0
- package/dist/agent/page-agent.js.map +1 -0
- package/dist/agent/types.d.ts +236 -0
- package/dist/agent/types.d.ts.map +1 -0
- package/dist/agent/types.js +37 -0
- package/dist/agent/types.js.map +1 -0
- package/dist/cli/agent-commands.d.ts +3 -0
- package/dist/cli/agent-commands.d.ts.map +1 -0
- package/dist/cli/agent-commands.js +250 -0
- package/dist/cli/agent-commands.js.map +1 -0
- package/dist/cli/auth.d.ts +3 -0
- package/dist/cli/auth.d.ts.map +1 -0
- package/dist/cli/auth.js +288 -0
- package/dist/cli/auth.js.map +1 -0
- package/dist/cli/company.d.ts +3 -0
- package/dist/cli/company.d.ts.map +1 -0
- package/dist/cli/company.js +55 -0
- package/dist/cli/company.js.map +1 -0
- package/dist/cli/connection.d.ts +3 -0
- package/dist/cli/connection.d.ts.map +1 -0
- package/dist/cli/connection.js +79 -0
- package/dist/cli/connection.js.map +1 -0
- package/dist/cli/index.d.ts +7 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +17 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/messages.d.ts +3 -0
- package/dist/cli/messages.d.ts.map +1 -0
- package/dist/cli/messages.js +268 -0
- package/dist/cli/messages.js.map +1 -0
- package/dist/cli/profile.d.ts +3 -0
- package/dist/cli/profile.d.ts.map +1 -0
- package/dist/cli/profile.js +81 -0
- package/dist/cli/profile.js.map +1 -0
- package/dist/cli/profile.test.d.ts +2 -0
- package/dist/cli/profile.test.d.ts.map +1 -0
- package/dist/cli/profile.test.js +15 -0
- package/dist/cli/profile.test.js.map +1 -0
- package/dist/cli/reply.d.ts +3 -0
- package/dist/cli/reply.d.ts.map +1 -0
- package/dist/cli/reply.js +129 -0
- package/dist/cli/reply.js.map +1 -0
- package/dist/core/audit.d.ts +17 -0
- package/dist/core/audit.d.ts.map +1 -0
- package/dist/core/audit.js +121 -0
- package/dist/core/audit.js.map +1 -0
- package/dist/core/audit.test.d.ts +2 -0
- package/dist/core/audit.test.d.ts.map +1 -0
- package/dist/core/audit.test.js +142 -0
- package/dist/core/audit.test.js.map +1 -0
- package/dist/core/browser-cookies.d.ts +19 -0
- package/dist/core/browser-cookies.d.ts.map +1 -0
- package/dist/core/browser-cookies.js +181 -0
- package/dist/core/browser-cookies.js.map +1 -0
- package/dist/core/browser.d.ts +50 -0
- package/dist/core/browser.d.ts.map +1 -0
- package/dist/core/browser.js +318 -0
- package/dist/core/browser.js.map +1 -0
- package/dist/core/config.d.ts +20 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +103 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/config.test.d.ts +2 -0
- package/dist/core/config.test.d.ts.map +1 -0
- package/dist/core/config.test.js +111 -0
- package/dist/core/config.test.js.map +1 -0
- package/dist/core/storage.d.ts +19 -0
- package/dist/core/storage.d.ts.map +1 -0
- package/dist/core/storage.js +124 -0
- package/dist/core/storage.js.map +1 -0
- package/dist/core/storage.test.d.ts +2 -0
- package/dist/core/storage.test.d.ts.map +1 -0
- package/dist/core/storage.test.js +142 -0
- package/dist/core/storage.test.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +63 -0
- package/dist/index.js.map +1 -0
- package/dist/linkedin/auth.d.ts +22 -0
- package/dist/linkedin/auth.d.ts.map +1 -0
- package/dist/linkedin/auth.js +167 -0
- package/dist/linkedin/auth.js.map +1 -0
- package/dist/linkedin/company-extractor.d.ts +36 -0
- package/dist/linkedin/company-extractor.d.ts.map +1 -0
- package/dist/linkedin/company-extractor.js +211 -0
- package/dist/linkedin/company-extractor.js.map +1 -0
- package/dist/linkedin/company-extractor.test.d.ts +2 -0
- package/dist/linkedin/company-extractor.test.d.ts.map +1 -0
- package/dist/linkedin/company-extractor.test.js +52 -0
- package/dist/linkedin/company-extractor.test.js.map +1 -0
- package/dist/linkedin/connector.d.ts +45 -0
- package/dist/linkedin/connector.d.ts.map +1 -0
- package/dist/linkedin/connector.js +245 -0
- package/dist/linkedin/connector.js.map +1 -0
- package/dist/linkedin/message-sender.d.ts +32 -0
- package/dist/linkedin/message-sender.d.ts.map +1 -0
- package/dist/linkedin/message-sender.js +112 -0
- package/dist/linkedin/message-sender.js.map +1 -0
- package/dist/linkedin/messages.d.ts +78 -0
- package/dist/linkedin/messages.d.ts.map +1 -0
- package/dist/linkedin/messages.js +745 -0
- package/dist/linkedin/messages.js.map +1 -0
- package/dist/linkedin/profile.d.ts +37 -0
- package/dist/linkedin/profile.d.ts.map +1 -0
- package/dist/linkedin/profile.js +268 -0
- package/dist/linkedin/profile.js.map +1 -0
- package/dist/linkedin/profile.test.d.ts +2 -0
- package/dist/linkedin/profile.test.d.ts.map +1 -0
- package/dist/linkedin/profile.test.js +68 -0
- package/dist/linkedin/profile.test.js.map +1 -0
- package/dist/linkedin/reply.d.ts +21 -0
- package/dist/linkedin/reply.d.ts.map +1 -0
- package/dist/linkedin/reply.js +76 -0
- package/dist/linkedin/reply.js.map +1 -0
- package/dist/linkedin/selector-engine.d.ts +69 -0
- package/dist/linkedin/selector-engine.d.ts.map +1 -0
- package/dist/linkedin/selector-engine.js +339 -0
- package/dist/linkedin/selector-engine.js.map +1 -0
- package/dist/linkedin/selector-engine.test.d.ts +2 -0
- package/dist/linkedin/selector-engine.test.d.ts.map +1 -0
- package/dist/linkedin/selector-engine.test.js +135 -0
- package/dist/linkedin/selector-engine.test.js.map +1 -0
- package/dist/linkedin/selectors.d.ts +65 -0
- package/dist/linkedin/selectors.d.ts.map +1 -0
- package/dist/linkedin/selectors.js +261 -0
- package/dist/linkedin/selectors.js.map +1 -0
- package/dist/templates/engine.d.ts +37 -0
- package/dist/templates/engine.d.ts.map +1 -0
- package/dist/templates/engine.js +215 -0
- package/dist/templates/engine.js.map +1 -0
- package/dist/templates/engine.test.d.ts +2 -0
- package/dist/templates/engine.test.d.ts.map +1 -0
- package/dist/templates/engine.test.js +212 -0
- package/dist/templates/engine.test.js.map +1 -0
- package/dist/templates/index.d.ts +2 -0
- package/dist/templates/index.d.ts.map +1 -0
- package/dist/templates/index.js +7 -0
- package/dist/templates/index.js.map +1 -0
- package/dist/types/index.d.ts +113 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/index.test.d.ts +2 -0
- package/dist/types/index.test.d.ts.map +1 -0
- package/dist/types/index.test.js +90 -0
- package/dist/types/index.test.js.map +1 -0
- package/dist/utils/paths.d.ts +8 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +68 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/utils/rate-limiter.d.ts +22 -0
- package/dist/utils/rate-limiter.d.ts.map +1 -0
- package/dist/utils/rate-limiter.js +57 -0
- package/dist/utils/rate-limiter.js.map +1 -0
- package/dist/utils/retry.d.ts +18 -0
- package/dist/utils/retry.d.ts.map +1 -0
- package/dist/utils/retry.js +49 -0
- package/dist/utils/retry.js.map +1 -0
- package/docs/connection-command.md +52 -0
- package/docs/plans/2025-03-03-linkedin-cli-design.md +280 -0
- package/docs/plans/2025-03-03-linkedin-cli-implementation-plan.md +2087 -0
- package/docs/plans/2025-03-03-linkedin-cli-implementation.md +2420 -0
- package/docs/plans/2026-02-19-linkedin-connection-feature.md +596 -0
- package/docs/plans/2026-02-28-messages-send-feature.md +480 -0
- package/docs/plans/2026-02-28-messages-show-design.md +243 -0
- package/docs/plans/2026-03-03-linkedin-cli-oss-publishing-design.md +394 -0
- package/docs/plans/2026-03-03-linkedin-cli-oss-publishing-plan.md +1592 -0
- package/docs/superpowers/plans/2026-03-13-linkedin-automation-resilience-migration.md +425 -0
- package/docs/superpowers/plans/2026-03-13-playwright-fara-migration.md +1112 -0
- package/docs/superpowers/plans/2026-03-14-page-agent-plan.md +1598 -0
- package/docs/superpowers/plans/2026-03-15-company-profile-extraction.md +591 -0
- package/docs/superpowers/plans/2026-03-15-profile-extraction-plan.md +943 -0
- package/docs/superpowers/specs/2026-03-14-company-profile-extraction-design.md +371 -0
- package/docs/superpowers/specs/2026-03-14-page-agent-design.md +385 -0
- package/docs/superpowers/specs/2026-03-15-profile-extraction-design.md +409 -0
- package/eslint.config.mjs +58 -0
- package/go.mod +9 -0
- package/go.sum +10 -0
- package/import-cookies.js +376 -0
- package/internal/cmd/actions.go +123 -0
- package/internal/cmd/auth.go +108 -0
- package/internal/cmd/connect.go +42 -0
- package/internal/cmd/message.go +44 -0
- package/internal/cmd/people.go +454 -0
- package/internal/cmd/profiles.go +121 -0
- package/internal/cmd/root.go +89 -0
- package/internal/cmd/sequence.go +192 -0
- package/internal/config/config.go +187 -0
- package/internal/config/config_test.go +121 -0
- package/internal/config/profile.go +65 -0
- package/internal/linkedin/navigator.go +195 -0
- package/internal/linkedin/selectors.go +39 -0
- package/internal/linkedin/validator.go +69 -0
- package/internal/pinchtab/client.go +183 -0
- package/internal/pinchtab/client_test.go +67 -0
- package/internal/pinchtab/types.go +50 -0
- package/internal/ratelimit/limiter.go +115 -0
- package/internal/ratelimit/limits.go +32 -0
- package/package.json +67 -0
- package/release.sh +66 -0
- package/scripts/debug-linkedin.js +156 -0
- package/scripts/debug-login.js +193 -0
- package/scripts/extract-from-edge.js +96 -0
- package/scripts/import-cookies.js +101 -0
- package/scripts/poc-show-data.js +205 -0
- package/scripts/proof-of-access.js +87 -0
- package/scripts/prove-connection.js +110 -0
- package/scripts/show-linkedin-data.js +173 -0
- package/src/agent/action-executor.test.ts +464 -0
- package/src/agent/action-executor.ts +203 -0
- package/src/agent/claude-client.test.ts +707 -0
- package/src/agent/claude-client.ts +422 -0
- package/src/agent/dom-extractor.test.ts +574 -0
- package/src/agent/dom-extractor.ts +437 -0
- package/src/agent/extension-client.ts +306 -0
- package/src/agent/index.ts +28 -0
- package/src/agent/page-agent.ts +292 -0
- package/src/agent/types.ts +288 -0
- package/src/cli/agent-commands.ts +274 -0
- package/src/cli/auth.ts +343 -0
- package/src/cli/company.ts +66 -0
- package/src/cli/connection.ts +89 -0
- package/src/cli/index.ts +7 -0
- package/src/cli/messages.ts +338 -0
- package/src/cli/profile.test.ts +14 -0
- package/src/cli/profile.ts +95 -0
- package/src/cli/reply.ts +110 -0
- package/src/core/audit.test.ts +134 -0
- package/src/core/audit.ts +98 -0
- package/src/core/browser-cookies.ts +203 -0
- package/src/core/browser.ts +304 -0
- package/src/core/config.test.ts +90 -0
- package/src/core/config.ts +81 -0
- package/src/core/storage.test.ts +129 -0
- package/src/core/storage.ts +100 -0
- package/src/index.ts +70 -0
- package/src/linkedin/auth.ts +218 -0
- package/src/linkedin/company-extractor.test.ts +58 -0
- package/src/linkedin/company-extractor.ts +222 -0
- package/src/linkedin/connector.ts +336 -0
- package/src/linkedin/message-sender.ts +141 -0
- package/src/linkedin/messages.ts +894 -0
- package/src/linkedin/profile.test.ts +79 -0
- package/src/linkedin/profile.ts +314 -0
- package/src/linkedin/reply.ts +96 -0
- package/src/linkedin/selector-engine.test.ts +167 -0
- package/src/linkedin/selector-engine.ts +393 -0
- package/src/linkedin/selectors.ts +268 -0
- package/src/templates/defaults/followup.txt +14 -0
- package/src/templates/defaults/meeting.txt +16 -0
- package/src/templates/defaults/welcome.txt +14 -0
- package/src/templates/engine.test.ts +228 -0
- package/src/templates/engine.ts +208 -0
- package/src/templates/index.ts +1 -0
- package/src/types/index.test.ts +94 -0
- package/src/types/index.ts +143 -0
- package/src/types/sql.js.d.ts +23 -0
- package/src/utils/paths.ts +33 -0
- package/src/utils/rate-limiter.ts +75 -0
- package/src/utils/retry.ts +78 -0
- package/test-cli.sh +85 -0
- package/test-real-data.sh +97 -0
- package/tsconfig.json +23 -0
- package/vitest.config.ts +35 -0
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LinkedInMessageSender = void 0;
|
|
4
|
+
const selector_engine_1 = require("./selector-engine");
|
|
5
|
+
class LinkedInMessageSender {
|
|
6
|
+
page;
|
|
7
|
+
selectorEngine;
|
|
8
|
+
linkedInDomain = 'https://www.linkedin.com';
|
|
9
|
+
constructor(page) {
|
|
10
|
+
this.page = page;
|
|
11
|
+
this.selectorEngine = new selector_engine_1.SelectorEngine(page);
|
|
12
|
+
// Always use linkedin.com for messaging (linkedin.cn has limited functionality)
|
|
13
|
+
// The browser session cookies will still work across domains
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Send a message to a LinkedIn profile
|
|
17
|
+
*/
|
|
18
|
+
async sendMessage(options) {
|
|
19
|
+
try {
|
|
20
|
+
// Navigate to messaging page directly (works on both domains)
|
|
21
|
+
const messagingUrl = `${this.linkedInDomain}/messaging/`;
|
|
22
|
+
console.log(`Navigating to messaging page: ${messagingUrl}`);
|
|
23
|
+
await this.page.goto(messagingUrl, {
|
|
24
|
+
waitUntil: 'domcontentloaded',
|
|
25
|
+
timeout: 30000,
|
|
26
|
+
});
|
|
27
|
+
// Wait for page to load
|
|
28
|
+
await this.page.waitForTimeout(3000);
|
|
29
|
+
// Extract profile ID from URL
|
|
30
|
+
const profileId = this.extractProfileId(options.profileUrl);
|
|
31
|
+
// Navigate to compose URL with recipient
|
|
32
|
+
const composeUrl = `${this.linkedInDomain}/messaging/compose/?recipient=${profileId}`;
|
|
33
|
+
console.log(`Navigating to compose URL with recipient: ${profileId}`);
|
|
34
|
+
await this.page.goto(composeUrl, {
|
|
35
|
+
waitUntil: 'domcontentloaded',
|
|
36
|
+
timeout: 30000,
|
|
37
|
+
});
|
|
38
|
+
// Wait for message input to appear
|
|
39
|
+
await this.page.waitForTimeout(3000);
|
|
40
|
+
// Wait for message input field
|
|
41
|
+
const inputResult = await this.selectorEngine.findElement('messages', 'messageInput', {
|
|
42
|
+
timeout: 10000,
|
|
43
|
+
visible: true,
|
|
44
|
+
});
|
|
45
|
+
if (!inputResult.element) {
|
|
46
|
+
return { success: false, error: 'Could not find message input field' };
|
|
47
|
+
}
|
|
48
|
+
// Type the message
|
|
49
|
+
await inputResult.element.fill(options.text);
|
|
50
|
+
// Check if dry run
|
|
51
|
+
if (options.dryRun) {
|
|
52
|
+
return {
|
|
53
|
+
success: true,
|
|
54
|
+
messageId: `dry-run-${Date.now()}`,
|
|
55
|
+
threadId: this.extractThreadId(),
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
// Click send button
|
|
59
|
+
const sendResult = await this.selectorEngine.findElement('messages', 'sendButton', {
|
|
60
|
+
timeout: 5000,
|
|
61
|
+
visible: true,
|
|
62
|
+
});
|
|
63
|
+
if (!sendResult.element) {
|
|
64
|
+
return { success: false, error: 'Could not find send button' };
|
|
65
|
+
}
|
|
66
|
+
await sendResult.element.click();
|
|
67
|
+
// Wait for message to be sent
|
|
68
|
+
await this.page.waitForTimeout(1000);
|
|
69
|
+
// Try to get message ID
|
|
70
|
+
const messageId = await this.page.evaluate(() => {
|
|
71
|
+
const lastMessage = document.querySelector('[data-urn*="urn:li:fsd_message:"]');
|
|
72
|
+
if (lastMessage) {
|
|
73
|
+
const urn = lastMessage.getAttribute('data-urn');
|
|
74
|
+
if (urn) {
|
|
75
|
+
const match = urn.match(/urn:li:fsd_message:(\d+)/);
|
|
76
|
+
return match ? match[1] : urn;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return `msg-${Date.now()}`;
|
|
80
|
+
});
|
|
81
|
+
return {
|
|
82
|
+
success: true,
|
|
83
|
+
messageId,
|
|
84
|
+
threadId: this.extractThreadId(),
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
return {
|
|
89
|
+
success: false,
|
|
90
|
+
error: error instanceof Error ? error.message : 'Unknown error sending message',
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Extract profile ID from LinkedIn profile URL
|
|
96
|
+
* e.g., https://www.linkedin.com/in/lily-q-7145971b9/ -> lily-q-7145971b9
|
|
97
|
+
*/
|
|
98
|
+
extractProfileId(profileUrl) {
|
|
99
|
+
const match = profileUrl.match(/\/in\/([^/?]+)/);
|
|
100
|
+
return match ? match[1] : '';
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Extract thread ID from current URL
|
|
104
|
+
*/
|
|
105
|
+
extractThreadId() {
|
|
106
|
+
const url = this.page.url();
|
|
107
|
+
const match = url.match(/\/messaging\/thread\/([^/]+)/);
|
|
108
|
+
return match ? match[1] : undefined;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
exports.LinkedInMessageSender = LinkedInMessageSender;
|
|
112
|
+
//# sourceMappingURL=message-sender.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-sender.js","sourceRoot":"","sources":["../../src/linkedin/message-sender.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import type { Page } from 'playwright';
|
|
2
|
+
import type { Thread } from '../types';
|
|
3
|
+
import type { BrowserController } from '../core/browser';
|
|
4
|
+
export interface MessageListOptions {
|
|
5
|
+
limit?: number;
|
|
6
|
+
unreadOnly?: boolean;
|
|
7
|
+
}
|
|
8
|
+
export interface ThreadOptions {
|
|
9
|
+
threadId: string;
|
|
10
|
+
limit?: number;
|
|
11
|
+
}
|
|
12
|
+
export declare class LinkedInMessages {
|
|
13
|
+
private page;
|
|
14
|
+
private selectorEngine;
|
|
15
|
+
constructor(page: Page, _browser?: BrowserController);
|
|
16
|
+
/**
|
|
17
|
+
* Navigate to LinkedIn messaging page
|
|
18
|
+
*/
|
|
19
|
+
navigateToMessages(): Promise<void>;
|
|
20
|
+
/**
|
|
21
|
+
* Get list of conversation threads
|
|
22
|
+
*/
|
|
23
|
+
getThreads(options?: MessageListOptions): Promise<Thread[]>;
|
|
24
|
+
/**
|
|
25
|
+
* Parse a single conversation item element into a Thread
|
|
26
|
+
*/
|
|
27
|
+
private parseThreadItem;
|
|
28
|
+
/**
|
|
29
|
+
* Extract multiple text values from an element - returns array of strings
|
|
30
|
+
*/
|
|
31
|
+
private extractTextArrayFromElement;
|
|
32
|
+
/**
|
|
33
|
+
* Extract single text value from an element - returns string
|
|
34
|
+
*/
|
|
35
|
+
private extractTextFromElementSingle;
|
|
36
|
+
/**
|
|
37
|
+
* Check if a conversation item has unread messages
|
|
38
|
+
*/
|
|
39
|
+
private checkForUnreadIndicator;
|
|
40
|
+
/**
|
|
41
|
+
* Parse relative timestamps like "5m", "2h", "Yesterday"
|
|
42
|
+
*/
|
|
43
|
+
private parseRelativeTimestamp;
|
|
44
|
+
/**
|
|
45
|
+
* Get full thread with all messages
|
|
46
|
+
*/
|
|
47
|
+
getThread(options: ThreadOptions): Promise<Thread | null>;
|
|
48
|
+
/**
|
|
49
|
+
* Show a thread by clicking on a conversation card (for ember IDs) or direct navigation
|
|
50
|
+
* Returns the thread with messages, handling both ember IDs and real thread IDs
|
|
51
|
+
*/
|
|
52
|
+
showThread(threadId: string, limit?: number): Promise<Thread | null>;
|
|
53
|
+
/**
|
|
54
|
+
* Click on a conversation card and extract the real thread ID from the URL
|
|
55
|
+
*/
|
|
56
|
+
private clickAndGetThreadId;
|
|
57
|
+
/**
|
|
58
|
+
* Scrape messages from a loaded thread page
|
|
59
|
+
*/
|
|
60
|
+
private scrapeMessages;
|
|
61
|
+
/**
|
|
62
|
+
* Format thread messages as human-readable text (Style A)
|
|
63
|
+
*/
|
|
64
|
+
formatThreadText(thread: Thread): string;
|
|
65
|
+
/**
|
|
66
|
+
* Format thread messages as JSON for LLM processing
|
|
67
|
+
*/
|
|
68
|
+
formatThreadJson(thread: Thread): string;
|
|
69
|
+
/**
|
|
70
|
+
* Parse a single message element
|
|
71
|
+
*/
|
|
72
|
+
private parseMessage;
|
|
73
|
+
/**
|
|
74
|
+
* Get thread participant information
|
|
75
|
+
*/
|
|
76
|
+
private getThreadParticipants;
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=messages.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../src/linkedin/messages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAiB,MAAM,YAAY,CAAC;AACtD,OAAO,KAAK,EAAW,MAAM,EAAE,MAAM,UAAU,CAAC;AAGhD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEzD,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,IAAI,CAAO;IACnB,OAAO,CAAC,cAAc,CAAiB;gBAE3B,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,iBAAiB;IAKpD;;OAEG;IACG,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC;IAQzC;;OAEG;IACG,UAAU,CAAC,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAgGrE;;OAEG;YACW,eAAe;IAmJ7B;;OAEG;YACW,2BAA2B;IAiBzC;;OAEG;YACW,4BAA4B;IAe1C;;OAEG;YACW,uBAAuB;IAgCrC;;OAEG;IACH,OAAO,CAAC,sBAAsB;IA+B9B;;OAEG;IACG,SAAS,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IA6C/D;;;OAGG;IACG,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAoD9E;;OAEG;YACW,mBAAmB;IA2EjC;;OAEG;YACW,cAAc;IAuI5B;;OAEG;IACH,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IA6BxC;;OAEG;IACH,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAoBxC;;OAEG;YACW,YAAY;IAmG1B;;OAEG;YACW,qBAAqB;CAqBpC"}
|