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.
Files changed (314) hide show
  1. package/.env.example +12 -0
  2. package/.github/workflows/ci.yml +66 -0
  3. package/.github/workflows/publish.yml +48 -0
  4. package/.husky/pre-commit +6 -0
  5. package/.prettierignore +4 -0
  6. package/.prettierrc +10 -0
  7. package/AGENTS.md +294 -0
  8. package/CHANGELOG.md +40 -0
  9. package/GIT_RELEASE.md +167 -0
  10. package/LICENSE +21 -0
  11. package/Makefile +30 -0
  12. package/NPM_PUBLISHING.md +230 -0
  13. package/PYEOF +0 -0
  14. package/README.md +295 -0
  15. package/TESTING-GUIDE.md +151 -0
  16. package/cmd/linkedin/main.go +9 -0
  17. package/dist/agent/action-executor.d.ts +81 -0
  18. package/dist/agent/action-executor.d.ts.map +1 -0
  19. package/dist/agent/action-executor.js +170 -0
  20. package/dist/agent/action-executor.js.map +1 -0
  21. package/dist/agent/action-executor.test.d.ts +2 -0
  22. package/dist/agent/action-executor.test.d.ts.map +1 -0
  23. package/dist/agent/action-executor.test.js +366 -0
  24. package/dist/agent/action-executor.test.js.map +1 -0
  25. package/dist/agent/claude-client.d.ts +74 -0
  26. package/dist/agent/claude-client.d.ts.map +1 -0
  27. package/dist/agent/claude-client.js +314 -0
  28. package/dist/agent/claude-client.js.map +1 -0
  29. package/dist/agent/claude-client.test.d.ts +2 -0
  30. package/dist/agent/claude-client.test.d.ts.map +1 -0
  31. package/dist/agent/claude-client.test.js +590 -0
  32. package/dist/agent/claude-client.test.js.map +1 -0
  33. package/dist/agent/dom-extractor.d.ts +50 -0
  34. package/dist/agent/dom-extractor.d.ts.map +1 -0
  35. package/dist/agent/dom-extractor.js +374 -0
  36. package/dist/agent/dom-extractor.js.map +1 -0
  37. package/dist/agent/dom-extractor.test.d.ts +7 -0
  38. package/dist/agent/dom-extractor.test.d.ts.map +1 -0
  39. package/dist/agent/dom-extractor.test.js +504 -0
  40. package/dist/agent/dom-extractor.test.js.map +1 -0
  41. package/dist/agent/extension-client.d.ts +75 -0
  42. package/dist/agent/extension-client.d.ts.map +1 -0
  43. package/dist/agent/extension-client.js +245 -0
  44. package/dist/agent/extension-client.js.map +1 -0
  45. package/dist/agent/index.d.ts +8 -0
  46. package/dist/agent/index.d.ts.map +1 -0
  47. package/dist/agent/index.js +16 -0
  48. package/dist/agent/index.js.map +1 -0
  49. package/dist/agent/page-agent.d.ts +76 -0
  50. package/dist/agent/page-agent.d.ts.map +1 -0
  51. package/dist/agent/page-agent.js +236 -0
  52. package/dist/agent/page-agent.js.map +1 -0
  53. package/dist/agent/types.d.ts +236 -0
  54. package/dist/agent/types.d.ts.map +1 -0
  55. package/dist/agent/types.js +37 -0
  56. package/dist/agent/types.js.map +1 -0
  57. package/dist/cli/agent-commands.d.ts +3 -0
  58. package/dist/cli/agent-commands.d.ts.map +1 -0
  59. package/dist/cli/agent-commands.js +250 -0
  60. package/dist/cli/agent-commands.js.map +1 -0
  61. package/dist/cli/auth.d.ts +3 -0
  62. package/dist/cli/auth.d.ts.map +1 -0
  63. package/dist/cli/auth.js +288 -0
  64. package/dist/cli/auth.js.map +1 -0
  65. package/dist/cli/company.d.ts +3 -0
  66. package/dist/cli/company.d.ts.map +1 -0
  67. package/dist/cli/company.js +55 -0
  68. package/dist/cli/company.js.map +1 -0
  69. package/dist/cli/connection.d.ts +3 -0
  70. package/dist/cli/connection.d.ts.map +1 -0
  71. package/dist/cli/connection.js +79 -0
  72. package/dist/cli/connection.js.map +1 -0
  73. package/dist/cli/index.d.ts +7 -0
  74. package/dist/cli/index.d.ts.map +1 -0
  75. package/dist/cli/index.js +17 -0
  76. package/dist/cli/index.js.map +1 -0
  77. package/dist/cli/messages.d.ts +3 -0
  78. package/dist/cli/messages.d.ts.map +1 -0
  79. package/dist/cli/messages.js +268 -0
  80. package/dist/cli/messages.js.map +1 -0
  81. package/dist/cli/profile.d.ts +3 -0
  82. package/dist/cli/profile.d.ts.map +1 -0
  83. package/dist/cli/profile.js +81 -0
  84. package/dist/cli/profile.js.map +1 -0
  85. package/dist/cli/profile.test.d.ts +2 -0
  86. package/dist/cli/profile.test.d.ts.map +1 -0
  87. package/dist/cli/profile.test.js +15 -0
  88. package/dist/cli/profile.test.js.map +1 -0
  89. package/dist/cli/reply.d.ts +3 -0
  90. package/dist/cli/reply.d.ts.map +1 -0
  91. package/dist/cli/reply.js +129 -0
  92. package/dist/cli/reply.js.map +1 -0
  93. package/dist/core/audit.d.ts +17 -0
  94. package/dist/core/audit.d.ts.map +1 -0
  95. package/dist/core/audit.js +121 -0
  96. package/dist/core/audit.js.map +1 -0
  97. package/dist/core/audit.test.d.ts +2 -0
  98. package/dist/core/audit.test.d.ts.map +1 -0
  99. package/dist/core/audit.test.js +142 -0
  100. package/dist/core/audit.test.js.map +1 -0
  101. package/dist/core/browser-cookies.d.ts +19 -0
  102. package/dist/core/browser-cookies.d.ts.map +1 -0
  103. package/dist/core/browser-cookies.js +181 -0
  104. package/dist/core/browser-cookies.js.map +1 -0
  105. package/dist/core/browser.d.ts +50 -0
  106. package/dist/core/browser.d.ts.map +1 -0
  107. package/dist/core/browser.js +318 -0
  108. package/dist/core/browser.js.map +1 -0
  109. package/dist/core/config.d.ts +20 -0
  110. package/dist/core/config.d.ts.map +1 -0
  111. package/dist/core/config.js +103 -0
  112. package/dist/core/config.js.map +1 -0
  113. package/dist/core/config.test.d.ts +2 -0
  114. package/dist/core/config.test.d.ts.map +1 -0
  115. package/dist/core/config.test.js +111 -0
  116. package/dist/core/config.test.js.map +1 -0
  117. package/dist/core/storage.d.ts +19 -0
  118. package/dist/core/storage.d.ts.map +1 -0
  119. package/dist/core/storage.js +124 -0
  120. package/dist/core/storage.js.map +1 -0
  121. package/dist/core/storage.test.d.ts +2 -0
  122. package/dist/core/storage.test.d.ts.map +1 -0
  123. package/dist/core/storage.test.js +142 -0
  124. package/dist/core/storage.test.js.map +1 -0
  125. package/dist/index.d.ts +3 -0
  126. package/dist/index.d.ts.map +1 -0
  127. package/dist/index.js +63 -0
  128. package/dist/index.js.map +1 -0
  129. package/dist/linkedin/auth.d.ts +22 -0
  130. package/dist/linkedin/auth.d.ts.map +1 -0
  131. package/dist/linkedin/auth.js +167 -0
  132. package/dist/linkedin/auth.js.map +1 -0
  133. package/dist/linkedin/company-extractor.d.ts +36 -0
  134. package/dist/linkedin/company-extractor.d.ts.map +1 -0
  135. package/dist/linkedin/company-extractor.js +211 -0
  136. package/dist/linkedin/company-extractor.js.map +1 -0
  137. package/dist/linkedin/company-extractor.test.d.ts +2 -0
  138. package/dist/linkedin/company-extractor.test.d.ts.map +1 -0
  139. package/dist/linkedin/company-extractor.test.js +52 -0
  140. package/dist/linkedin/company-extractor.test.js.map +1 -0
  141. package/dist/linkedin/connector.d.ts +45 -0
  142. package/dist/linkedin/connector.d.ts.map +1 -0
  143. package/dist/linkedin/connector.js +245 -0
  144. package/dist/linkedin/connector.js.map +1 -0
  145. package/dist/linkedin/message-sender.d.ts +32 -0
  146. package/dist/linkedin/message-sender.d.ts.map +1 -0
  147. package/dist/linkedin/message-sender.js +112 -0
  148. package/dist/linkedin/message-sender.js.map +1 -0
  149. package/dist/linkedin/messages.d.ts +78 -0
  150. package/dist/linkedin/messages.d.ts.map +1 -0
  151. package/dist/linkedin/messages.js +745 -0
  152. package/dist/linkedin/messages.js.map +1 -0
  153. package/dist/linkedin/profile.d.ts +37 -0
  154. package/dist/linkedin/profile.d.ts.map +1 -0
  155. package/dist/linkedin/profile.js +268 -0
  156. package/dist/linkedin/profile.js.map +1 -0
  157. package/dist/linkedin/profile.test.d.ts +2 -0
  158. package/dist/linkedin/profile.test.d.ts.map +1 -0
  159. package/dist/linkedin/profile.test.js +68 -0
  160. package/dist/linkedin/profile.test.js.map +1 -0
  161. package/dist/linkedin/reply.d.ts +21 -0
  162. package/dist/linkedin/reply.d.ts.map +1 -0
  163. package/dist/linkedin/reply.js +76 -0
  164. package/dist/linkedin/reply.js.map +1 -0
  165. package/dist/linkedin/selector-engine.d.ts +69 -0
  166. package/dist/linkedin/selector-engine.d.ts.map +1 -0
  167. package/dist/linkedin/selector-engine.js +339 -0
  168. package/dist/linkedin/selector-engine.js.map +1 -0
  169. package/dist/linkedin/selector-engine.test.d.ts +2 -0
  170. package/dist/linkedin/selector-engine.test.d.ts.map +1 -0
  171. package/dist/linkedin/selector-engine.test.js +135 -0
  172. package/dist/linkedin/selector-engine.test.js.map +1 -0
  173. package/dist/linkedin/selectors.d.ts +65 -0
  174. package/dist/linkedin/selectors.d.ts.map +1 -0
  175. package/dist/linkedin/selectors.js +261 -0
  176. package/dist/linkedin/selectors.js.map +1 -0
  177. package/dist/templates/engine.d.ts +37 -0
  178. package/dist/templates/engine.d.ts.map +1 -0
  179. package/dist/templates/engine.js +215 -0
  180. package/dist/templates/engine.js.map +1 -0
  181. package/dist/templates/engine.test.d.ts +2 -0
  182. package/dist/templates/engine.test.d.ts.map +1 -0
  183. package/dist/templates/engine.test.js +212 -0
  184. package/dist/templates/engine.test.js.map +1 -0
  185. package/dist/templates/index.d.ts +2 -0
  186. package/dist/templates/index.d.ts.map +1 -0
  187. package/dist/templates/index.js +7 -0
  188. package/dist/templates/index.js.map +1 -0
  189. package/dist/types/index.d.ts +113 -0
  190. package/dist/types/index.d.ts.map +1 -0
  191. package/dist/types/index.js +3 -0
  192. package/dist/types/index.js.map +1 -0
  193. package/dist/types/index.test.d.ts +2 -0
  194. package/dist/types/index.test.d.ts.map +1 -0
  195. package/dist/types/index.test.js +90 -0
  196. package/dist/types/index.test.js.map +1 -0
  197. package/dist/utils/paths.d.ts +8 -0
  198. package/dist/utils/paths.d.ts.map +1 -0
  199. package/dist/utils/paths.js +68 -0
  200. package/dist/utils/paths.js.map +1 -0
  201. package/dist/utils/rate-limiter.d.ts +22 -0
  202. package/dist/utils/rate-limiter.d.ts.map +1 -0
  203. package/dist/utils/rate-limiter.js +57 -0
  204. package/dist/utils/rate-limiter.js.map +1 -0
  205. package/dist/utils/retry.d.ts +18 -0
  206. package/dist/utils/retry.d.ts.map +1 -0
  207. package/dist/utils/retry.js +49 -0
  208. package/dist/utils/retry.js.map +1 -0
  209. package/docs/connection-command.md +52 -0
  210. package/docs/plans/2025-03-03-linkedin-cli-design.md +280 -0
  211. package/docs/plans/2025-03-03-linkedin-cli-implementation-plan.md +2087 -0
  212. package/docs/plans/2025-03-03-linkedin-cli-implementation.md +2420 -0
  213. package/docs/plans/2026-02-19-linkedin-connection-feature.md +596 -0
  214. package/docs/plans/2026-02-28-messages-send-feature.md +480 -0
  215. package/docs/plans/2026-02-28-messages-show-design.md +243 -0
  216. package/docs/plans/2026-03-03-linkedin-cli-oss-publishing-design.md +394 -0
  217. package/docs/plans/2026-03-03-linkedin-cli-oss-publishing-plan.md +1592 -0
  218. package/docs/superpowers/plans/2026-03-13-linkedin-automation-resilience-migration.md +425 -0
  219. package/docs/superpowers/plans/2026-03-13-playwright-fara-migration.md +1112 -0
  220. package/docs/superpowers/plans/2026-03-14-page-agent-plan.md +1598 -0
  221. package/docs/superpowers/plans/2026-03-15-company-profile-extraction.md +591 -0
  222. package/docs/superpowers/plans/2026-03-15-profile-extraction-plan.md +943 -0
  223. package/docs/superpowers/specs/2026-03-14-company-profile-extraction-design.md +371 -0
  224. package/docs/superpowers/specs/2026-03-14-page-agent-design.md +385 -0
  225. package/docs/superpowers/specs/2026-03-15-profile-extraction-design.md +409 -0
  226. package/eslint.config.mjs +58 -0
  227. package/go.mod +9 -0
  228. package/go.sum +10 -0
  229. package/import-cookies.js +376 -0
  230. package/internal/cmd/actions.go +123 -0
  231. package/internal/cmd/auth.go +108 -0
  232. package/internal/cmd/connect.go +42 -0
  233. package/internal/cmd/message.go +44 -0
  234. package/internal/cmd/people.go +454 -0
  235. package/internal/cmd/profiles.go +121 -0
  236. package/internal/cmd/root.go +89 -0
  237. package/internal/cmd/sequence.go +192 -0
  238. package/internal/config/config.go +187 -0
  239. package/internal/config/config_test.go +121 -0
  240. package/internal/config/profile.go +65 -0
  241. package/internal/linkedin/navigator.go +195 -0
  242. package/internal/linkedin/selectors.go +39 -0
  243. package/internal/linkedin/validator.go +69 -0
  244. package/internal/pinchtab/client.go +183 -0
  245. package/internal/pinchtab/client_test.go +67 -0
  246. package/internal/pinchtab/types.go +50 -0
  247. package/internal/ratelimit/limiter.go +115 -0
  248. package/internal/ratelimit/limits.go +32 -0
  249. package/package.json +67 -0
  250. package/release.sh +66 -0
  251. package/scripts/debug-linkedin.js +156 -0
  252. package/scripts/debug-login.js +193 -0
  253. package/scripts/extract-from-edge.js +96 -0
  254. package/scripts/import-cookies.js +101 -0
  255. package/scripts/poc-show-data.js +205 -0
  256. package/scripts/proof-of-access.js +87 -0
  257. package/scripts/prove-connection.js +110 -0
  258. package/scripts/show-linkedin-data.js +173 -0
  259. package/src/agent/action-executor.test.ts +464 -0
  260. package/src/agent/action-executor.ts +203 -0
  261. package/src/agent/claude-client.test.ts +707 -0
  262. package/src/agent/claude-client.ts +422 -0
  263. package/src/agent/dom-extractor.test.ts +574 -0
  264. package/src/agent/dom-extractor.ts +437 -0
  265. package/src/agent/extension-client.ts +306 -0
  266. package/src/agent/index.ts +28 -0
  267. package/src/agent/page-agent.ts +292 -0
  268. package/src/agent/types.ts +288 -0
  269. package/src/cli/agent-commands.ts +274 -0
  270. package/src/cli/auth.ts +343 -0
  271. package/src/cli/company.ts +66 -0
  272. package/src/cli/connection.ts +89 -0
  273. package/src/cli/index.ts +7 -0
  274. package/src/cli/messages.ts +338 -0
  275. package/src/cli/profile.test.ts +14 -0
  276. package/src/cli/profile.ts +95 -0
  277. package/src/cli/reply.ts +110 -0
  278. package/src/core/audit.test.ts +134 -0
  279. package/src/core/audit.ts +98 -0
  280. package/src/core/browser-cookies.ts +203 -0
  281. package/src/core/browser.ts +304 -0
  282. package/src/core/config.test.ts +90 -0
  283. package/src/core/config.ts +81 -0
  284. package/src/core/storage.test.ts +129 -0
  285. package/src/core/storage.ts +100 -0
  286. package/src/index.ts +70 -0
  287. package/src/linkedin/auth.ts +218 -0
  288. package/src/linkedin/company-extractor.test.ts +58 -0
  289. package/src/linkedin/company-extractor.ts +222 -0
  290. package/src/linkedin/connector.ts +336 -0
  291. package/src/linkedin/message-sender.ts +141 -0
  292. package/src/linkedin/messages.ts +894 -0
  293. package/src/linkedin/profile.test.ts +79 -0
  294. package/src/linkedin/profile.ts +314 -0
  295. package/src/linkedin/reply.ts +96 -0
  296. package/src/linkedin/selector-engine.test.ts +167 -0
  297. package/src/linkedin/selector-engine.ts +393 -0
  298. package/src/linkedin/selectors.ts +268 -0
  299. package/src/templates/defaults/followup.txt +14 -0
  300. package/src/templates/defaults/meeting.txt +16 -0
  301. package/src/templates/defaults/welcome.txt +14 -0
  302. package/src/templates/engine.test.ts +228 -0
  303. package/src/templates/engine.ts +208 -0
  304. package/src/templates/index.ts +1 -0
  305. package/src/types/index.test.ts +94 -0
  306. package/src/types/index.ts +143 -0
  307. package/src/types/sql.js.d.ts +23 -0
  308. package/src/utils/paths.ts +33 -0
  309. package/src/utils/rate-limiter.ts +75 -0
  310. package/src/utils/retry.ts +78 -0
  311. package/test-cli.sh +85 -0
  312. package/test-real-data.sh +97 -0
  313. package/tsconfig.json +23 -0
  314. package/vitest.config.ts +35 -0
@@ -0,0 +1,288 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.registerAuthCommands = registerAuthCommands;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const inquirer_1 = __importDefault(require("inquirer"));
9
+ const browser_1 = require("../core/browser");
10
+ const auth_1 = require("../linkedin/auth");
11
+ const storage_1 = require("../core/storage");
12
+ const audit_1 = require("../core/audit");
13
+ const config_1 = require("../core/config");
14
+ const browser_cookies_1 = require("../core/browser-cookies");
15
+ const SESSION_KEY = 'linkedin-session';
16
+ function registerAuthCommands(program) {
17
+ const auth = program.command('auth').description('Authentication commands');
18
+ auth
19
+ .command('login')
20
+ .description('Log in to LinkedIn')
21
+ .option('-e, --email <email>', 'LinkedIn email')
22
+ .option('--headless', 'Run browser in headless mode', false)
23
+ .option('--debug', 'Enable debug mode with screenshots and verbose logging', false)
24
+ .action(async (options) => {
25
+ const storage = (0, storage_1.getSecureStorage)();
26
+ const logger = (0, audit_1.getAuditLogger)();
27
+ const config = (0, config_1.getConfig)();
28
+ try {
29
+ // Get email if not provided
30
+ let email = options.email;
31
+ if (!email) {
32
+ const answer = await inquirer_1.default.prompt([
33
+ {
34
+ type: 'input',
35
+ name: 'email',
36
+ message: 'LinkedIn email:',
37
+ validate: (input) => input.includes('@') || 'Please enter a valid email',
38
+ },
39
+ ]);
40
+ email = answer.email;
41
+ }
42
+ // Get password securely
43
+ const { password } = await inquirer_1.default.prompt([
44
+ {
45
+ type: 'password',
46
+ name: 'password',
47
+ message: 'LinkedIn password:',
48
+ mask: '*',
49
+ },
50
+ ]);
51
+ console.log(chalk_1.default.blue('Launching browser...'));
52
+ // Launch browser with config
53
+ const browser = new browser_1.BrowserController({
54
+ headless: options.headless ?? config.getValue('headless'),
55
+ debug: options.debug ?? false,
56
+ });
57
+ // Check for existing session
58
+ if (storage.exists(SESSION_KEY)) {
59
+ const sessionData = storage.load(SESSION_KEY);
60
+ if (sessionData) {
61
+ console.log(chalk_1.default.blue('Found existing session, attempting to restore...'));
62
+ await browser.launch();
63
+ const session = JSON.parse(sessionData);
64
+ await browser.restoreSession(session);
65
+ // Verify session is still valid
66
+ const linkedInAuth = new auth_1.LinkedInAuth(browser, options.debug ?? false);
67
+ if (await linkedInAuth.isSessionValid()) {
68
+ console.log(chalk_1.default.green('✓ Already logged in (restored session)'));
69
+ logger.log('auth.login', { method: 'restored_session' }, true);
70
+ await browser.close().catch(() => { });
71
+ return;
72
+ }
73
+ console.log(chalk_1.default.yellow('⚠ Session expired, logging in again...'));
74
+ // Browser is still open, continue to fresh login
75
+ }
76
+ }
77
+ // Fresh login (browser may already be launched from session check above)
78
+ if (!browser.isLaunched()) {
79
+ await browser.launch();
80
+ }
81
+ const linkedInAuth = new auth_1.LinkedInAuth(browser, options.debug ?? false);
82
+ console.log(chalk_1.default.blue('Logging in to LinkedIn...'));
83
+ const result = await linkedInAuth.login({
84
+ email,
85
+ password,
86
+ });
87
+ if (result.requires2FA) {
88
+ // Prompt for TOTP code
89
+ const { totpCode } = await inquirer_1.default.prompt([
90
+ {
91
+ type: 'input',
92
+ name: 'totpCode',
93
+ message: 'Enter TOTP code from Microsoft Authenticator:',
94
+ validate: (input) => /^\d{6}$/.test(input) || 'Please enter a 6-digit code',
95
+ },
96
+ ]);
97
+ console.log(chalk_1.default.blue('Verifying 2FA code...'));
98
+ // Retry login with TOTP
99
+ const result2FA = await linkedInAuth.login({
100
+ email,
101
+ password,
102
+ totpCode,
103
+ });
104
+ if (!result2FA.success) {
105
+ console.error(chalk_1.default.red('✗ Login failed:'), result2FA.error);
106
+ logger.log('auth.login', { email, error: result2FA.error }, false);
107
+ await browser.close();
108
+ process.exit(1);
109
+ }
110
+ // Save session
111
+ if (result2FA.session) {
112
+ storage.save(SESSION_KEY, JSON.stringify(result2FA.session));
113
+ }
114
+ console.log(chalk_1.default.green('✓ Login successful!'));
115
+ logger.log('auth.login', { email, method: '2fa' }, true);
116
+ await browser.close().catch(() => { });
117
+ }
118
+ else if (!result.success) {
119
+ console.error(chalk_1.default.red('✗ Login failed:'), result.error);
120
+ logger.log('auth.login', { email, error: result.error }, false);
121
+ await browser.close();
122
+ process.exit(1);
123
+ }
124
+ else {
125
+ // Success without 2FA
126
+ if (result.session) {
127
+ storage.save(SESSION_KEY, JSON.stringify(result.session));
128
+ }
129
+ console.log(chalk_1.default.green('✓ Login successful!'));
130
+ logger.log('auth.login', { email }, true);
131
+ }
132
+ await browser.close().catch(() => { });
133
+ }
134
+ catch (error) {
135
+ console.error(chalk_1.default.red('✗ Login failed:'), error instanceof Error ? error.message : error);
136
+ process.exit(1);
137
+ }
138
+ });
139
+ auth
140
+ .command('logout')
141
+ .description('Log out and clear session')
142
+ .action(async () => {
143
+ const storage = (0, storage_1.getSecureStorage)();
144
+ const logger = (0, audit_1.getAuditLogger)();
145
+ try {
146
+ console.log(chalk_1.default.blue('Logging out...'));
147
+ // Clear the session from secure storage
148
+ const hadSession = storage.delete(SESSION_KEY);
149
+ if (hadSession) {
150
+ console.log(chalk_1.default.green('✓ Logged out successfully'));
151
+ logger.log('auth.logout', {}, true);
152
+ }
153
+ else {
154
+ console.log(chalk_1.default.yellow('⚠ No active session found'));
155
+ }
156
+ }
157
+ catch (error) {
158
+ console.error(chalk_1.default.red('✗ Logout failed:'), error instanceof Error ? error.message : error);
159
+ logger.log('auth.logout', { error: String(error) }, false);
160
+ process.exit(1);
161
+ }
162
+ });
163
+ auth
164
+ .command('status')
165
+ .description('Check authentication status')
166
+ .action(async () => {
167
+ const storage = (0, storage_1.getSecureStorage)();
168
+ const config = (0, config_1.getConfig)();
169
+ let browser = null;
170
+ try {
171
+ console.log(chalk_1.default.blue('Checking authentication status...'));
172
+ // First try to connect to existing browser via CDP
173
+ console.log(chalk_1.default.blue('Checking for existing browser (Chrome/Edge)...'));
174
+ browser = new browser_1.BrowserController({
175
+ headless: config.getValue('headless'),
176
+ });
177
+ try {
178
+ await browser.launch();
179
+ const linkedInAuth = new auth_1.LinkedInAuth(browser);
180
+ if (await linkedInAuth.isSessionValid()) {
181
+ console.log(chalk_1.default.green('✓ Logged in (via existing browser session)'));
182
+ await browser.close();
183
+ return;
184
+ }
185
+ await browser.close();
186
+ browser = null;
187
+ }
188
+ catch (cdpError) {
189
+ console.log(chalk_1.default.gray('Could not connect to existing browser'));
190
+ if (browser) {
191
+ await browser.close().catch(() => { });
192
+ browser = null;
193
+ }
194
+ }
195
+ // Check if session exists in storage
196
+ if (!storage.exists(SESSION_KEY)) {
197
+ console.log(chalk_1.default.yellow('⚠ Not logged in'));
198
+ console.log(chalk_1.default.gray('Run: linkedin-cli auth login'));
199
+ return;
200
+ }
201
+ // Session exists, try to restore and verify
202
+ const sessionData = storage.load(SESSION_KEY);
203
+ if (!sessionData) {
204
+ console.log(chalk_1.default.yellow('⚠ Session data corrupted'));
205
+ console.log(chalk_1.default.gray('Run: linkedin-cli auth login'));
206
+ return;
207
+ }
208
+ console.log(chalk_1.default.blue('Found saved session, verifying...'));
209
+ // Launch browser to verify session
210
+ browser = new browser_1.BrowserController({
211
+ headless: config.getValue('headless'),
212
+ });
213
+ await browser.launch();
214
+ const session = JSON.parse(sessionData);
215
+ await browser.restoreSession(session);
216
+ const linkedInAuth = new auth_1.LinkedInAuth(browser);
217
+ const isValid = await linkedInAuth.isSessionValid();
218
+ if (isValid) {
219
+ const sessionAge = new Date().getTime() - new Date(session.timestamp).getTime();
220
+ const hoursAgo = Math.floor(sessionAge / (1000 * 60 * 60));
221
+ const daysAgo = Math.floor(sessionAge / (1000 * 60 * 60 * 24));
222
+ console.log(chalk_1.default.green('✓ Logged in'));
223
+ if (daysAgo > 0) {
224
+ console.log(chalk_1.default.gray(`Session created ${daysAgo} day${daysAgo !== 1 ? 's' : ''} ago`));
225
+ }
226
+ else if (hoursAgo > 0) {
227
+ console.log(chalk_1.default.gray(`Session created ${hoursAgo} hour${hoursAgo !== 1 ? 's' : ''} ago`));
228
+ }
229
+ else {
230
+ console.log(chalk_1.default.gray('Session created recently'));
231
+ }
232
+ }
233
+ else {
234
+ console.log(chalk_1.default.yellow('⚠ Session expired'));
235
+ console.log(chalk_1.default.gray('Run: linkedin-cli auth login'));
236
+ }
237
+ await browser.close();
238
+ browser = null;
239
+ }
240
+ catch (error) {
241
+ if (browser) {
242
+ await browser.close().catch(() => { });
243
+ }
244
+ console.error(chalk_1.default.red('✗ Error checking status:'), error instanceof Error ? error.message : error);
245
+ process.exit(1);
246
+ }
247
+ });
248
+ auth
249
+ .command('login-from-browser <browser>')
250
+ .description('Import LinkedIn session from browser (chrome, edge, arc, brave)')
251
+ .action(async (browserName) => {
252
+ const storage = (0, storage_1.getSecureStorage)();
253
+ const logger = (0, audit_1.getAuditLogger)();
254
+ try {
255
+ console.log(chalk_1.default.blue(`Extracting LinkedIn cookies from ${browserName}...`));
256
+ console.log(chalk_1.default.gray('macOS will show a permission dialog to access browser data.'));
257
+ // Extract LinkedIn cookies from browser
258
+ const cookies = await (0, browser_cookies_1.getLinkedinCookies)(browserName);
259
+ if (cookies.length === 0) {
260
+ console.error(chalk_1.default.red('✗ No LinkedIn cookies found.'), chalk_1.default.gray('Make sure you are logged into LinkedIn in', browserName));
261
+ process.exit(1);
262
+ }
263
+ console.log(chalk_1.default.green(`✓ Found ${cookies.length} LinkedIn cookies`));
264
+ // Save cookies to session storage
265
+ const session = {
266
+ cookies,
267
+ localStorage: {},
268
+ timestamp: new Date(),
269
+ };
270
+ storage.save(SESSION_KEY, JSON.stringify(session));
271
+ console.log(chalk_1.default.green('✓ Session imported successfully'));
272
+ logger.log('auth.login-from-browser', { browser: browserName, cookieCount: cookies.length }, true);
273
+ console.log(chalk_1.default.yellow('⚠ Note: Chrome encrypts cookies at rest.'));
274
+ console.log(chalk_1.default.gray(' For best results, keep the browser open while using the CLI.'));
275
+ console.log(chalk_1.default.blue(''));
276
+ console.log(chalk_1.default.blue('Next steps:'));
277
+ console.log(chalk_1.default.gray(' 1. Close any browser windows completely'));
278
+ console.log(chalk_1.default.gray(' 2. Run: linkedin-cli messages list'));
279
+ console.log(chalk_1.default.gray(' 3. The CLI will connect to your browser via CDP'));
280
+ }
281
+ catch (error) {
282
+ console.error(chalk_1.default.red('✗ Failed to import session:'), error instanceof Error ? error.message : error);
283
+ logger.log('auth.login-from-browser', { browser: browserName, error: String(error) }, false);
284
+ process.exit(1);
285
+ }
286
+ });
287
+ }
288
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/cli/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerCompanyCommands(program: Command): void;
3
+ //# sourceMappingURL=company.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"company.d.ts","sourceRoot":"","sources":["../../src/cli/company.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA2D9D"}
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.registerCompanyCommands = registerCompanyCommands;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const company_extractor_1 = require("../linkedin/company-extractor");
9
+ const browser_1 = require("../core/browser");
10
+ const audit_1 = require("../core/audit");
11
+ function registerCompanyCommands(program) {
12
+ const company = program
13
+ .command('company')
14
+ .description('Extract information from LinkedIn company profiles');
15
+ company
16
+ .command('info')
17
+ .description('Extract company profile information')
18
+ .argument('<url>', 'LinkedIn company URL (e.g., https://www.linkedin.com/company/openai/)')
19
+ .action(async (url) => {
20
+ const logger = (0, audit_1.getAuditLogger)();
21
+ let browserController;
22
+ try {
23
+ // Validate URL
24
+ if (!(0, company_extractor_1.isValidCompanyUrl)(url)) {
25
+ console.error(chalk_1.default.red('✗ Invalid company URL'));
26
+ console.log(chalk_1.default.gray('Expected format: https://www.linkedin.com/company/<name>/'));
27
+ process.exit(1);
28
+ }
29
+ console.error(chalk_1.default.gray(`Extracting company info from ${url}...`));
30
+ // Connect to existing browser via CDP (uses authenticated session)
31
+ browserController = await (0, browser_1.createBrowser)();
32
+ const page = browserController.getPage();
33
+ if (!page) {
34
+ throw new Error('Failed to get page from browser');
35
+ }
36
+ // Extract company profile
37
+ const extractor = new company_extractor_1.CompanyExtractor(page);
38
+ const profile = await extractor.extract(url);
39
+ // Log successful extraction
40
+ const fieldsExtracted = Object.keys(profile).filter((k) => profile[k] !== null);
41
+ logger.log('company.info', { url, fieldsExtracted }, true);
42
+ // Output JSON to stdout
43
+ console.log(JSON.stringify(profile, null, 2));
44
+ await browserController.close();
45
+ }
46
+ catch (error) {
47
+ if (browserController)
48
+ await browserController.close();
49
+ logger.log('company.info', { url, error: error instanceof Error ? error.message : String(error) }, false);
50
+ console.error(chalk_1.default.red('✗ Failed to extract company data:'), error instanceof Error ? error.message : error);
51
+ process.exit(1);
52
+ }
53
+ });
54
+ }
55
+ //# sourceMappingURL=company.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"company.js","sourceRoot":"","sources":["../../src/cli/company.ts"],"names":[],"mappings":";;;;;AAMA,0DA2DC;AAhED,kDAA0B;AAC1B,qEAAoF;AACpF,6CAAgD;AAChD,yCAA+C;AAE/C,SAAgB,uBAAuB,CAAC,OAAgB;IACtD,MAAM,OAAO,GAAG,OAAO;SACpB,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,oDAAoD,CAAC,CAAC;IAErE,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,qCAAqC,CAAC;SAClD,QAAQ,CAAC,OAAO,EAAE,uEAAuE,CAAC;SAC1F,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACpB,MAAM,MAAM,GAAG,IAAA,sBAAc,GAAE,CAAC;QAChC,IAAI,iBAAiB,CAAC;QAEtB,IAAI,CAAC;YACH,eAAe;YACf,IAAI,CAAC,IAAA,qCAAiB,EAAC,GAAG,CAAC,EAAE,CAAC;gBAC5B,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC,CAAC;gBAClD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAC,CAAC;gBACrF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,IAAI,CAAC,gCAAgC,GAAG,KAAK,CAAC,CAAC,CAAC;YAEpE,mEAAmE;YACnE,iBAAiB,GAAG,MAAM,IAAA,uBAAa,GAAE,CAAC;YAC1C,MAAM,IAAI,GAAG,iBAAiB,CAAC,OAAO,EAAE,CAAC;YAEzC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;YACrD,CAAC;YAED,0BAA0B;YAC1B,MAAM,SAAS,GAAG,IAAI,oCAAgB,CAAC,IAAI,CAAC,CAAC;YAC7C,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAE7C,4BAA4B;YAC5B,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,CACjD,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAyB,CAAC,KAAK,IAAI,CACnD,CAAC;YACF,MAAM,CAAC,GAAG,CAAC,cAAc,EAAE,EAAE,GAAG,EAAE,eAAe,EAAE,EAAE,IAAI,CAAC,CAAC;YAE3D,wBAAwB;YACxB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAE9C,MAAM,iBAAiB,CAAC,KAAK,EAAE,CAAC;QAClC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,iBAAiB;gBAAE,MAAM,iBAAiB,CAAC,KAAK,EAAE,CAAC;YACvD,MAAM,CAAC,GAAG,CACR,cAAc,EACd,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EACtE,KAAK,CACN,CAAC;YACF,OAAO,CAAC,KAAK,CACX,eAAK,CAAC,GAAG,CAAC,mCAAmC,CAAC,EAC9C,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAC/C,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerConnectionCommands(program: Command): void;
3
+ //# sourceMappingURL=connection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../src/cli/connection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgFjE"}
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.registerConnectionCommands = registerConnectionCommands;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const browser_1 = require("../core/browser");
9
+ const connector_1 = require("../linkedin/connector");
10
+ const auth_1 = require("../linkedin/auth");
11
+ const audit_1 = require("../core/audit");
12
+ const config_1 = require("../core/config");
13
+ function registerConnectionCommands(program) {
14
+ const connection = program
15
+ .command('connect')
16
+ .description('Send connection requests to LinkedIn profiles');
17
+ connection
18
+ .command('send')
19
+ .description('Send a connection request to a profile')
20
+ .argument('<profile-url>', 'LinkedIn profile URL (e.g., https://www.linkedin.com/in/williamhgates/)')
21
+ .option('-n, --note <note>', 'Personalized note to include with connection request (max 300 characters)')
22
+ .option('--headless', 'Run browser in headless mode', false)
23
+ .action(async (profileUrl, options) => {
24
+ const logger = (0, audit_1.getAuditLogger)();
25
+ const config = (0, config_1.getConfig)();
26
+ let browser = null;
27
+ try {
28
+ // Validate profile URL
29
+ if (!profileUrl.match(/^https?:\/\/www\.linkedin\.com\/in\/[^\/]+\/?$/)) {
30
+ console.error(chalk_1.default.red('✗ Invalid profile URL'));
31
+ console.log(chalk_1.default.gray('Expected format: https://www.linkedin.com/in/username/'));
32
+ process.exit(1);
33
+ }
34
+ console.log(chalk_1.default.blue(`Preparing to connect with ${profileUrl}...`));
35
+ // Launch browser (will try Edge CDP first)
36
+ browser = new browser_1.BrowserController({
37
+ headless: options.headless ?? config.getValue('headless'),
38
+ });
39
+ await browser.launch();
40
+ // Verify we're logged in
41
+ const linkedInAuth = new auth_1.LinkedInAuth(browser);
42
+ if (!(await linkedInAuth.isSessionValid())) {
43
+ console.error(chalk_1.default.red('✗ Not logged in'));
44
+ console.log(chalk_1.default.gray('Run: linkedin-cli auth login'));
45
+ await browser.close();
46
+ process.exit(1);
47
+ }
48
+ console.log(chalk_1.default.blue('Sending connection request...'));
49
+ // Create connector and send request
50
+ const connector = new connector_1.LinkedInConnector(browser);
51
+ const result = await connector.connect({
52
+ profileUrl,
53
+ note: options.note,
54
+ });
55
+ if (result.success && result.sent) {
56
+ console.log(chalk_1.default.green('✓ Connection request sent successfully!'));
57
+ logger.log('connection.send', { profileUrl, hasNote: !!options.note }, true);
58
+ }
59
+ else if (result.pending) {
60
+ console.log(chalk_1.default.yellow('⚠ Connection request already pending'));
61
+ }
62
+ else if (result.error?.includes('Already connected')) {
63
+ console.log(chalk_1.default.yellow('✓ Already connected to this person'));
64
+ }
65
+ else {
66
+ console.error(chalk_1.default.red('✗ Failed to send connection request:'), result.error);
67
+ logger.log('connection.send', { profileUrl, error: result.error }, false);
68
+ await browser.close();
69
+ process.exit(1);
70
+ }
71
+ await browser.close();
72
+ }
73
+ catch (error) {
74
+ console.error(chalk_1.default.red('✗ Connection failed:'), error instanceof Error ? error.message : error);
75
+ process.exit(1);
76
+ }
77
+ });
78
+ }
79
+ //# sourceMappingURL=connection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection.js","sourceRoot":"","sources":["../../src/cli/connection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export { registerAuthCommands } from './auth';
2
+ export { registerMessageCommands } from './messages';
3
+ export { registerReplyCommands } from './reply';
4
+ export { registerConnectionCommands } from './connection';
5
+ export { registerCompanyCommands } from './company';
6
+ export { registerProfileCommands } from './profile';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerProfileCommands = exports.registerCompanyCommands = exports.registerConnectionCommands = exports.registerReplyCommands = exports.registerMessageCommands = exports.registerAuthCommands = void 0;
4
+ // Re-export command registrations from implementation files
5
+ var auth_1 = require("./auth");
6
+ Object.defineProperty(exports, "registerAuthCommands", { enumerable: true, get: function () { return auth_1.registerAuthCommands; } });
7
+ var messages_1 = require("./messages");
8
+ Object.defineProperty(exports, "registerMessageCommands", { enumerable: true, get: function () { return messages_1.registerMessageCommands; } });
9
+ var reply_1 = require("./reply");
10
+ Object.defineProperty(exports, "registerReplyCommands", { enumerable: true, get: function () { return reply_1.registerReplyCommands; } });
11
+ var connection_1 = require("./connection");
12
+ Object.defineProperty(exports, "registerConnectionCommands", { enumerable: true, get: function () { return connection_1.registerConnectionCommands; } });
13
+ var company_1 = require("./company");
14
+ Object.defineProperty(exports, "registerCompanyCommands", { enumerable: true, get: function () { return company_1.registerCompanyCommands; } });
15
+ var profile_1 = require("./profile");
16
+ Object.defineProperty(exports, "registerProfileCommands", { enumerable: true, get: function () { return profile_1.registerProfileCommands; } });
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;;AAAA,4DAA4D;AAC5D,+BAA8C;AAArC,4GAAA,oBAAoB,OAAA;AAC7B,uCAAqD;AAA5C,mHAAA,uBAAuB,OAAA;AAChC,iCAAgD;AAAvC,8GAAA,qBAAqB,OAAA;AAC9B,2CAA0D;AAAjD,wHAAA,0BAA0B,OAAA;AACnC,qCAAoD;AAA3C,kHAAA,uBAAuB,OAAA;AAChC,qCAAoD;AAA3C,kHAAA,uBAAuB,OAAA"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerMessageCommands(program: Command): void;
3
+ //# sourceMappingURL=messages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../src/cli/messages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwU9D"}