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,50 @@
1
+ /**
2
+ * DOM Extractor Module
3
+ *
4
+ * Extracts semantic DOM representation from LinkedIn pages using Playwright.
5
+ * Provides structured data extraction for AI agent action planning.
6
+ */
7
+ import type { Page } from 'playwright';
8
+ import type { DOMElement, DOMRepresentation } from './types';
9
+ /**
10
+ * Extracts DOM representation from a Playwright page
11
+ */
12
+ export declare class DOMExtractor {
13
+ /**
14
+ * Extract complete DOM representation from the page
15
+ */
16
+ extract(page: Page): Promise<DOMRepresentation>;
17
+ /**
18
+ * Extract interactive elements from the page
19
+ */
20
+ private extractElements;
21
+ /**
22
+ * Extract metadata from the page
23
+ */
24
+ private extractMetadata;
25
+ /**
26
+ * Find element by ID in the extracted DOM representation
27
+ */
28
+ findElementById(dom: DOMRepresentation, elementId: string): DOMElement | undefined;
29
+ /**
30
+ * Find elements by tag name
31
+ */
32
+ findElementsByTag(dom: DOMRepresentation, tag: string): DOMElement[];
33
+ /**
34
+ * Find elements by text content (partial match)
35
+ */
36
+ findElementsByText(dom: DOMRepresentation, text: string): DOMElement[];
37
+ /**
38
+ * Get clickable elements (buttons and links)
39
+ */
40
+ getClickableElements(dom: DOMRepresentation): DOMElement[];
41
+ /**
42
+ * Get input elements (inputs, textareas, selects)
43
+ */
44
+ getInputElements(dom: DOMRepresentation): DOMElement[];
45
+ }
46
+ /**
47
+ * Create a new DOMExtractor instance
48
+ */
49
+ export declare function createDOMExtractor(): DOMExtractor;
50
+ //# sourceMappingURL=dom-extractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dom-extractor.d.ts","sourceRoot":"","sources":["../../src/agent/dom-extractor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,KAAK,EACV,UAAU,EACV,iBAAiB,EAIlB,MAAM,SAAS,CAAC;AAEjB;;GAEG;AACH,qBAAa,YAAY;IACvB;;OAEG;IACG,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAkBrD;;OAEG;YACW,eAAe;IA2K7B;;OAEG;YACW,eAAe;IA8J7B;;OAEG;IACH,eAAe,CAAC,GAAG,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAIlF;;OAEG;IACH,iBAAiB,CAAC,GAAG,EAAE,iBAAiB,EAAE,GAAG,EAAE,MAAM,GAAG,UAAU,EAAE;IAIpE;;OAEG;IACH,kBAAkB,CAAC,GAAG,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE;IAStE;;OAEG;IACH,oBAAoB,CAAC,GAAG,EAAE,iBAAiB,GAAG,UAAU,EAAE;IAS1D;;OAEG;IACH,gBAAgB,CAAC,GAAG,EAAE,iBAAiB,GAAG,UAAU,EAAE;CAYvD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,YAAY,CAEjD"}
@@ -0,0 +1,374 @@
1
+ "use strict";
2
+ /**
3
+ * DOM Extractor Module
4
+ *
5
+ * Extracts semantic DOM representation from LinkedIn pages using Playwright.
6
+ * Provides structured data extraction for AI agent action planning.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.DOMExtractor = void 0;
10
+ exports.createDOMExtractor = createDOMExtractor;
11
+ /**
12
+ * Extracts DOM representation from a Playwright page
13
+ */
14
+ class DOMExtractor {
15
+ /**
16
+ * Extract complete DOM representation from the page
17
+ */
18
+ async extract(page) {
19
+ const url = page.url();
20
+ const title = await page.title();
21
+ // Extract elements and metadata in parallel
22
+ const [elements, metadata] = await Promise.all([
23
+ this.extractElements(page),
24
+ this.extractMetadata(page),
25
+ ]);
26
+ return {
27
+ url,
28
+ title,
29
+ elements,
30
+ metadata,
31
+ };
32
+ }
33
+ /**
34
+ * Extract interactive elements from the page
35
+ */
36
+ async extractElements(page) {
37
+ return page.evaluate(() => {
38
+ const elements = [];
39
+ const seenElements = new Set();
40
+ // Define selectors for interactive elements
41
+ const selectors = [
42
+ 'button',
43
+ 'a[href]',
44
+ 'input',
45
+ 'textarea',
46
+ 'select',
47
+ '[role="button"]',
48
+ '[role="link"]',
49
+ '[role="textbox"]',
50
+ '[role="checkbox"]',
51
+ '[role="radio"]',
52
+ '[role="combobox"]',
53
+ '[role="menuitem"]',
54
+ '[role="tab"]',
55
+ '[contenteditable="true"]',
56
+ ];
57
+ // Find all matching elements
58
+ const candidates = document.querySelectorAll(selectors.join(', '));
59
+ candidates.forEach((element, index) => {
60
+ // Skip duplicates
61
+ if (seenElements.has(element))
62
+ return;
63
+ seenElements.add(element);
64
+ // Check visibility
65
+ if (!isElementVisible(element))
66
+ return;
67
+ const extracted = extractElementData(element, index);
68
+ if (extracted) {
69
+ elements.push(extracted);
70
+ }
71
+ });
72
+ return elements;
73
+ /**
74
+ * Check if element is visible
75
+ */
76
+ function isElementVisible(element) {
77
+ const style = window.getComputedStyle(element);
78
+ if (style.display === 'none' || style.visibility === 'hidden' || style.opacity === '0') {
79
+ return false;
80
+ }
81
+ // Check if element has dimensions
82
+ const rect = element.getBoundingClientRect();
83
+ if (rect.width === 0 || rect.height === 0) {
84
+ return false;
85
+ }
86
+ return true;
87
+ }
88
+ /**
89
+ * Extract data from a single element
90
+ */
91
+ function extractElementData(element, index) {
92
+ const rect = element.getBoundingClientRect();
93
+ const htmlElement = element;
94
+ // Get basic properties
95
+ const tag = element.tagName.toLowerCase();
96
+ const text = getElementText(element);
97
+ const ariaLabel = element.getAttribute('aria-label') || undefined;
98
+ const role = element.getAttribute('role') || undefined;
99
+ // Get input-specific properties
100
+ let type;
101
+ let value;
102
+ // eslint-disable-next-line no-undef
103
+ if (element instanceof HTMLInputElement) {
104
+ type = element.type;
105
+ value = element.value || undefined;
106
+ // eslint-disable-next-line no-undef
107
+ }
108
+ else if (element instanceof HTMLSelectElement) {
109
+ value = element.value || undefined;
110
+ // eslint-disable-next-line no-undef
111
+ }
112
+ else if (element instanceof HTMLTextAreaElement) {
113
+ type = 'textarea';
114
+ value = element.value || undefined;
115
+ }
116
+ // Check if enabled
117
+ const enabled = !('disabled' in htmlElement &&
118
+ htmlElement.disabled === true);
119
+ // Generate ID
120
+ const id = generateElementId(tag, text || ariaLabel || '', index);
121
+ return {
122
+ id,
123
+ tag,
124
+ role,
125
+ ariaLabel,
126
+ text: truncateText(text, 200),
127
+ type,
128
+ value,
129
+ visible: true,
130
+ enabled,
131
+ bbox: {
132
+ x: Math.round(rect.x),
133
+ y: Math.round(rect.y),
134
+ width: Math.round(rect.width),
135
+ height: Math.round(rect.height),
136
+ },
137
+ };
138
+ }
139
+ /**
140
+ * Get visible text content of an element
141
+ */
142
+ function getElementText(element) {
143
+ // For inputs, use placeholder or value
144
+ // eslint-disable-next-line no-undef
145
+ if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement) {
146
+ return (element.placeholder ||
147
+ element.value ||
148
+ '');
149
+ }
150
+ // For links, get text content
151
+ const text = element.textContent?.trim() || '';
152
+ // For buttons, get aria-label if no text
153
+ if (!text && element.getAttribute('aria-label')) {
154
+ return element.getAttribute('aria-label');
155
+ }
156
+ return text;
157
+ }
158
+ /**
159
+ * Truncate text to max length
160
+ */
161
+ function truncateText(text, maxLength) {
162
+ if (!text)
163
+ return '';
164
+ if (text.length <= maxLength)
165
+ return text;
166
+ return text.substring(0, maxLength) + '...';
167
+ }
168
+ /**
169
+ * Generate unique element ID
170
+ * Format: elem-{tag}-{label}-{index}
171
+ */
172
+ function generateElementId(tag, label, index) {
173
+ const cleanLabel = label
174
+ .toLowerCase()
175
+ .replace(/[^a-z0-9]+/g, '-')
176
+ .replace(/^-+|-+$/g, '')
177
+ .substring(0, 30);
178
+ if (cleanLabel) {
179
+ return `elem-${tag}-${cleanLabel}-${index}`;
180
+ }
181
+ return `elem-${tag}-${index}`;
182
+ }
183
+ });
184
+ }
185
+ /**
186
+ * Extract metadata from the page
187
+ */
188
+ async extractMetadata(page) {
189
+ return page.evaluate(() => {
190
+ const url = window.location.href;
191
+ const pageType = detectPageType(url);
192
+ const profileName = extractProfileName();
193
+ const profileTitle = extractProfileTitle();
194
+ const connectionState = detectConnectionState();
195
+ const statusMessages = extractStatusMessages();
196
+ return {
197
+ pageType,
198
+ profileName,
199
+ profileTitle,
200
+ connectionState,
201
+ statusMessages,
202
+ };
203
+ /**
204
+ * Detect the type of LinkedIn page
205
+ */
206
+ function detectPageType(url) {
207
+ if (url.includes('/in/'))
208
+ return 'profile';
209
+ if (url.includes('/messaging'))
210
+ return 'messaging';
211
+ if (url.includes('/feed'))
212
+ return 'feed';
213
+ if (url.includes('/search'))
214
+ return 'search';
215
+ if (url.includes('/notifications'))
216
+ return 'notifications';
217
+ return 'unknown';
218
+ }
219
+ /**
220
+ * Extract profile name from page
221
+ */
222
+ function extractProfileName() {
223
+ // Try h1 first
224
+ const h1 = document.querySelector('h1');
225
+ if (h1) {
226
+ const text = h1.textContent?.trim();
227
+ if (text)
228
+ return text;
229
+ }
230
+ // Try data-testid attributes common in LinkedIn
231
+ const selectors = [
232
+ '[data-testid="profile-name"]',
233
+ '[data-testid="top-card-profile-name"]',
234
+ '.profile-name',
235
+ '.top-card-layout__title',
236
+ 'h1.text-heading-xlarge',
237
+ ];
238
+ for (const selector of selectors) {
239
+ const element = document.querySelector(selector);
240
+ if (element) {
241
+ const text = element.textContent?.trim();
242
+ if (text)
243
+ return text;
244
+ }
245
+ }
246
+ return undefined;
247
+ }
248
+ /**
249
+ * Extract profile title/headline
250
+ */
251
+ function extractProfileTitle() {
252
+ const selectors = [
253
+ '[data-testid="profile-headline"]',
254
+ '[data-testid="top-card-profile-headline"]',
255
+ '.profile-headline',
256
+ '.top-card-layout__headline',
257
+ '.text-body-medium',
258
+ ];
259
+ for (const selector of selectors) {
260
+ const element = document.querySelector(selector);
261
+ if (element) {
262
+ const text = element.textContent?.trim();
263
+ if (text)
264
+ return text;
265
+ }
266
+ }
267
+ return undefined;
268
+ }
269
+ /**
270
+ * Detect connection state from page
271
+ */
272
+ function detectConnectionState() {
273
+ // Look for connection indicators
274
+ const pageText = document.body.innerText.toLowerCase();
275
+ // Check for "Connect" button text
276
+ const hasConnectButton = document.querySelector('button[aria-label*="connect" i], button:contains("Connect")');
277
+ // Check for pending status
278
+ const hasPendingText = pageText.includes('pending') || pageText.includes('invitation sent');
279
+ // Check for "Message" button (indicates connected)
280
+ const hasMessageButton = document.querySelector('button[aria-label*="message" i], button[data-control-name="message"], a[href*="messaging"]:not([href*="invite"])');
281
+ // Check for "Connected" text or similar indicators
282
+ const hasConnectedText = pageText.includes('connected') ||
283
+ pageText.includes('1st') ||
284
+ pageText.includes('1st degree');
285
+ if (hasConnectedText || hasMessageButton) {
286
+ return 'connected';
287
+ }
288
+ if (hasPendingText) {
289
+ return 'pending';
290
+ }
291
+ if (hasConnectButton) {
292
+ return 'not_connected';
293
+ }
294
+ return 'unknown';
295
+ }
296
+ /**
297
+ * Extract status messages/notifications visible on page
298
+ */
299
+ function extractStatusMessages() {
300
+ const messages = [];
301
+ // Look for common status message containers
302
+ const selectors = [
303
+ '[data-testid="status-message"]',
304
+ '.artdeco-toast-item',
305
+ '.alert',
306
+ '.notification-badge',
307
+ '[role="alert"]',
308
+ '[role="status"]',
309
+ '.feed-shared-update-v2__description',
310
+ '.artdeco-inline-feedback',
311
+ ];
312
+ for (const selector of selectors) {
313
+ const elements = document.querySelectorAll(selector);
314
+ elements.forEach((el) => {
315
+ const text = el.textContent?.trim();
316
+ if (text && text.length > 0 && text.length < 500) {
317
+ messages.push(text);
318
+ }
319
+ });
320
+ }
321
+ // Deduplicate
322
+ return [...new Set(messages)];
323
+ }
324
+ });
325
+ }
326
+ /**
327
+ * Find element by ID in the extracted DOM representation
328
+ */
329
+ findElementById(dom, elementId) {
330
+ return dom.elements.find((el) => el.id === elementId);
331
+ }
332
+ /**
333
+ * Find elements by tag name
334
+ */
335
+ findElementsByTag(dom, tag) {
336
+ return dom.elements.filter((el) => el.tag === tag.toLowerCase());
337
+ }
338
+ /**
339
+ * Find elements by text content (partial match)
340
+ */
341
+ findElementsByText(dom, text) {
342
+ const searchText = text.toLowerCase();
343
+ return dom.elements.filter((el) => el.text.toLowerCase().includes(searchText) ||
344
+ (el.ariaLabel && el.ariaLabel.toLowerCase().includes(searchText)));
345
+ }
346
+ /**
347
+ * Get clickable elements (buttons and links)
348
+ */
349
+ getClickableElements(dom) {
350
+ return dom.elements.filter((el) => (el.tag === 'button' || el.tag === 'a' || el.role === 'button' || el.role === 'link') &&
351
+ el.visible &&
352
+ el.enabled);
353
+ }
354
+ /**
355
+ * Get input elements (inputs, textareas, selects)
356
+ */
357
+ getInputElements(dom) {
358
+ return dom.elements.filter((el) => (el.tag === 'input' ||
359
+ el.tag === 'textarea' ||
360
+ el.tag === 'select' ||
361
+ el.role === 'textbox' ||
362
+ el.role === 'combobox') &&
363
+ el.visible &&
364
+ el.enabled);
365
+ }
366
+ }
367
+ exports.DOMExtractor = DOMExtractor;
368
+ /**
369
+ * Create a new DOMExtractor instance
370
+ */
371
+ function createDOMExtractor() {
372
+ return new DOMExtractor();
373
+ }
374
+ //# sourceMappingURL=dom-extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dom-extractor.js","sourceRoot":"","sources":["../../src/agent/dom-extractor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * DOM Extractor Tests
3
+ *
4
+ * Tests for the DOMExtractor class using mocked Playwright page.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=dom-extractor.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dom-extractor.test.d.ts","sourceRoot":"","sources":["../../src/agent/dom-extractor.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}