@lhremote/core 0.8.0 → 0.10.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 (480) hide show
  1. package/dist/cdp/app-discovery.d.ts +57 -0
  2. package/dist/cdp/app-discovery.d.ts.map +1 -1
  3. package/dist/cdp/app-discovery.js +90 -7
  4. package/dist/cdp/app-discovery.js.map +1 -1
  5. package/dist/cdp/app-discovery.test.js +180 -9
  6. package/dist/cdp/app-discovery.test.js.map +1 -1
  7. package/dist/cdp/client.d.ts +8 -1
  8. package/dist/cdp/client.d.ts.map +1 -1
  9. package/dist/cdp/client.js +8 -1
  10. package/dist/cdp/client.js.map +1 -1
  11. package/dist/cdp/discovery.d.ts.map +1 -1
  12. package/dist/cdp/discovery.js +5 -1
  13. package/dist/cdp/discovery.js.map +1 -1
  14. package/dist/cdp/discovery.test.js +7 -0
  15. package/dist/cdp/discovery.test.js.map +1 -1
  16. package/dist/cdp/index.d.ts +1 -1
  17. package/dist/cdp/index.d.ts.map +1 -1
  18. package/dist/cdp/index.js +1 -1
  19. package/dist/cdp/index.js.map +1 -1
  20. package/dist/cdp/instance-discovery.d.ts.map +1 -1
  21. package/dist/cdp/instance-discovery.js +25 -10
  22. package/dist/cdp/instance-discovery.js.map +1 -1
  23. package/dist/cdp/instance-discovery.test.js +17 -0
  24. package/dist/cdp/instance-discovery.test.js.map +1 -1
  25. package/dist/cdp/testing/launch-chromium.d.ts +1 -1
  26. package/dist/cdp/testing/launch-chromium.js +2 -2
  27. package/dist/db/client.d.ts.map +1 -1
  28. package/dist/db/client.js +3 -0
  29. package/dist/db/client.js.map +1 -1
  30. package/dist/db/repositories/campaign-hard-delete.integration.test.js +4 -1
  31. package/dist/db/repositories/campaign-hard-delete.integration.test.js.map +1 -1
  32. package/dist/db/repositories/campaign.d.ts.map +1 -1
  33. package/dist/db/repositories/campaign.js +81 -33
  34. package/dist/db/repositories/campaign.js.map +1 -1
  35. package/dist/db/repositories/campaign.test.js +2 -2
  36. package/dist/db/repositories/collection-list.d.ts +11 -0
  37. package/dist/db/repositories/collection-list.d.ts.map +1 -1
  38. package/dist/db/repositories/collection-list.integration.test.js +6 -4
  39. package/dist/db/repositories/collection-list.integration.test.js.map +1 -1
  40. package/dist/db/repositories/collection-list.js +92 -2
  41. package/dist/db/repositories/collection-list.js.map +1 -1
  42. package/dist/db/testing/create-fixture.js +36 -2
  43. package/dist/db/testing/create-fixture.js.map +1 -1
  44. package/dist/index.d.ts +6 -6
  45. package/dist/index.d.ts.map +1 -1
  46. package/dist/index.js +6 -6
  47. package/dist/index.js.map +1 -1
  48. package/dist/linkedin/dom-automation-retry.test.d.ts +2 -0
  49. package/dist/linkedin/dom-automation-retry.test.d.ts.map +1 -0
  50. package/dist/linkedin/dom-automation-retry.test.js +51 -0
  51. package/dist/linkedin/dom-automation-retry.test.js.map +1 -0
  52. package/dist/linkedin/dom-automation.d.ts +166 -6
  53. package/dist/linkedin/dom-automation.d.ts.map +1 -1
  54. package/dist/linkedin/dom-automation.js +496 -21
  55. package/dist/linkedin/dom-automation.js.map +1 -1
  56. package/dist/linkedin/humanized-mouse.d.ts +69 -0
  57. package/dist/linkedin/humanized-mouse.d.ts.map +1 -0
  58. package/dist/linkedin/humanized-mouse.js +109 -0
  59. package/dist/linkedin/humanized-mouse.js.map +1 -0
  60. package/dist/linkedin/index.d.ts +3 -2
  61. package/dist/linkedin/index.d.ts.map +1 -1
  62. package/dist/linkedin/index.js +3 -2
  63. package/dist/linkedin/index.js.map +1 -1
  64. package/dist/linkedin/selectors.d.ts +74 -48
  65. package/dist/linkedin/selectors.d.ts.map +1 -1
  66. package/dist/linkedin/selectors.js +64 -41
  67. package/dist/linkedin/selectors.js.map +1 -1
  68. package/dist/operations/add-people-to-collection.d.ts +1 -1
  69. package/dist/operations/add-people-to-collection.d.ts.map +1 -1
  70. package/dist/operations/add-people-to-collection.js +3 -6
  71. package/dist/operations/add-people-to-collection.js.map +1 -1
  72. package/dist/operations/build-linkedin-url.test.d.ts +2 -0
  73. package/dist/operations/build-linkedin-url.test.d.ts.map +1 -0
  74. package/dist/operations/build-linkedin-url.test.js +158 -0
  75. package/dist/operations/build-linkedin-url.test.js.map +1 -0
  76. package/dist/operations/campaign-add-action.d.ts +1 -1
  77. package/dist/operations/campaign-add-action.d.ts.map +1 -1
  78. package/dist/operations/campaign-add-action.js +3 -6
  79. package/dist/operations/campaign-add-action.js.map +1 -1
  80. package/dist/operations/campaign-create.d.ts +1 -1
  81. package/dist/operations/campaign-create.d.ts.map +1 -1
  82. package/dist/operations/campaign-create.js +3 -6
  83. package/dist/operations/campaign-create.js.map +1 -1
  84. package/dist/operations/campaign-delete.d.ts +1 -1
  85. package/dist/operations/campaign-delete.d.ts.map +1 -1
  86. package/dist/operations/campaign-delete.js +3 -6
  87. package/dist/operations/campaign-delete.js.map +1 -1
  88. package/dist/operations/campaign-erase.d.ts +1 -1
  89. package/dist/operations/campaign-erase.d.ts.map +1 -1
  90. package/dist/operations/campaign-erase.js +3 -6
  91. package/dist/operations/campaign-erase.js.map +1 -1
  92. package/dist/operations/campaign-exclude-add.d.ts +1 -1
  93. package/dist/operations/campaign-exclude-add.d.ts.map +1 -1
  94. package/dist/operations/campaign-exclude-add.js +3 -6
  95. package/dist/operations/campaign-exclude-add.js.map +1 -1
  96. package/dist/operations/campaign-exclude-list.d.ts +1 -1
  97. package/dist/operations/campaign-exclude-list.d.ts.map +1 -1
  98. package/dist/operations/campaign-exclude-list.js +3 -6
  99. package/dist/operations/campaign-exclude-list.js.map +1 -1
  100. package/dist/operations/campaign-exclude-remove.d.ts +1 -1
  101. package/dist/operations/campaign-exclude-remove.d.ts.map +1 -1
  102. package/dist/operations/campaign-exclude-remove.js +3 -6
  103. package/dist/operations/campaign-exclude-remove.js.map +1 -1
  104. package/dist/operations/campaign-export.d.ts +1 -1
  105. package/dist/operations/campaign-export.d.ts.map +1 -1
  106. package/dist/operations/campaign-export.js +3 -6
  107. package/dist/operations/campaign-export.js.map +1 -1
  108. package/dist/operations/campaign-get.d.ts +1 -1
  109. package/dist/operations/campaign-get.d.ts.map +1 -1
  110. package/dist/operations/campaign-get.js +3 -6
  111. package/dist/operations/campaign-get.js.map +1 -1
  112. package/dist/operations/campaign-list-people.d.ts +1 -1
  113. package/dist/operations/campaign-list-people.d.ts.map +1 -1
  114. package/dist/operations/campaign-list-people.js +3 -6
  115. package/dist/operations/campaign-list-people.js.map +1 -1
  116. package/dist/operations/campaign-list.d.ts +1 -1
  117. package/dist/operations/campaign-list.d.ts.map +1 -1
  118. package/dist/operations/campaign-list.js +3 -6
  119. package/dist/operations/campaign-list.js.map +1 -1
  120. package/dist/operations/campaign-move-next.d.ts +1 -1
  121. package/dist/operations/campaign-move-next.d.ts.map +1 -1
  122. package/dist/operations/campaign-move-next.js +3 -6
  123. package/dist/operations/campaign-move-next.js.map +1 -1
  124. package/dist/operations/campaign-remove-action.d.ts +1 -1
  125. package/dist/operations/campaign-remove-action.d.ts.map +1 -1
  126. package/dist/operations/campaign-remove-action.js +3 -6
  127. package/dist/operations/campaign-remove-action.js.map +1 -1
  128. package/dist/operations/campaign-remove-people.d.ts +1 -1
  129. package/dist/operations/campaign-remove-people.d.ts.map +1 -1
  130. package/dist/operations/campaign-remove-people.js +3 -6
  131. package/dist/operations/campaign-remove-people.js.map +1 -1
  132. package/dist/operations/campaign-reorder-actions.d.ts +1 -1
  133. package/dist/operations/campaign-reorder-actions.d.ts.map +1 -1
  134. package/dist/operations/campaign-reorder-actions.js +3 -6
  135. package/dist/operations/campaign-reorder-actions.js.map +1 -1
  136. package/dist/operations/campaign-retry.d.ts +1 -1
  137. package/dist/operations/campaign-retry.d.ts.map +1 -1
  138. package/dist/operations/campaign-retry.js +3 -6
  139. package/dist/operations/campaign-retry.js.map +1 -1
  140. package/dist/operations/campaign-start.d.ts +1 -1
  141. package/dist/operations/campaign-start.d.ts.map +1 -1
  142. package/dist/operations/campaign-start.js +3 -6
  143. package/dist/operations/campaign-start.js.map +1 -1
  144. package/dist/operations/campaign-statistics.d.ts +1 -1
  145. package/dist/operations/campaign-statistics.d.ts.map +1 -1
  146. package/dist/operations/campaign-statistics.js +3 -6
  147. package/dist/operations/campaign-statistics.js.map +1 -1
  148. package/dist/operations/campaign-status.d.ts +1 -1
  149. package/dist/operations/campaign-status.d.ts.map +1 -1
  150. package/dist/operations/campaign-status.js +3 -6
  151. package/dist/operations/campaign-status.js.map +1 -1
  152. package/dist/operations/campaign-stop.d.ts +1 -1
  153. package/dist/operations/campaign-stop.d.ts.map +1 -1
  154. package/dist/operations/campaign-stop.js +3 -6
  155. package/dist/operations/campaign-stop.js.map +1 -1
  156. package/dist/operations/campaign-update-action.d.ts +1 -1
  157. package/dist/operations/campaign-update-action.d.ts.map +1 -1
  158. package/dist/operations/campaign-update-action.js +3 -6
  159. package/dist/operations/campaign-update-action.js.map +1 -1
  160. package/dist/operations/campaign-update.d.ts +1 -1
  161. package/dist/operations/campaign-update.d.ts.map +1 -1
  162. package/dist/operations/campaign-update.js +3 -6
  163. package/dist/operations/campaign-update.js.map +1 -1
  164. package/dist/operations/check-replies.d.ts +3 -1
  165. package/dist/operations/check-replies.d.ts.map +1 -1
  166. package/dist/operations/check-replies.js +124 -17
  167. package/dist/operations/check-replies.js.map +1 -1
  168. package/dist/operations/check-replies.test.js +152 -17
  169. package/dist/operations/check-replies.test.js.map +1 -1
  170. package/dist/operations/collect-people.d.ts +1 -1
  171. package/dist/operations/collect-people.d.ts.map +1 -1
  172. package/dist/operations/collect-people.js +18 -12
  173. package/dist/operations/collect-people.js.map +1 -1
  174. package/dist/operations/collect-people.test.js +21 -5
  175. package/dist/operations/collect-people.test.js.map +1 -1
  176. package/dist/operations/comment-on-post.d.ts +4 -1
  177. package/dist/operations/comment-on-post.d.ts.map +1 -1
  178. package/dist/operations/comment-on-post.js +15 -19
  179. package/dist/operations/comment-on-post.js.map +1 -1
  180. package/dist/operations/comment-on-post.test.js +8 -6
  181. package/dist/operations/comment-on-post.test.js.map +1 -1
  182. package/dist/operations/create-collection.d.ts +1 -1
  183. package/dist/operations/create-collection.d.ts.map +1 -1
  184. package/dist/operations/create-collection.js +5 -7
  185. package/dist/operations/create-collection.js.map +1 -1
  186. package/dist/operations/create-collection.test.js +3 -1
  187. package/dist/operations/create-collection.test.js.map +1 -1
  188. package/dist/operations/delete-collection.d.ts +1 -1
  189. package/dist/operations/delete-collection.d.ts.map +1 -1
  190. package/dist/operations/delete-collection.js +3 -6
  191. package/dist/operations/delete-collection.js.map +1 -1
  192. package/dist/operations/dismiss-errors.d.ts +11 -5
  193. package/dist/operations/dismiss-errors.d.ts.map +1 -1
  194. package/dist/operations/dismiss-errors.js +68 -34
  195. package/dist/operations/dismiss-errors.js.map +1 -1
  196. package/dist/operations/dismiss-errors.test.js +129 -8
  197. package/dist/operations/dismiss-errors.test.js.map +1 -1
  198. package/dist/operations/endorse-skills.test.d.ts +2 -0
  199. package/dist/operations/endorse-skills.test.d.ts.map +1 -0
  200. package/dist/operations/endorse-skills.test.js +70 -0
  201. package/dist/operations/endorse-skills.test.js.map +1 -0
  202. package/dist/operations/enrich-profile.test.d.ts +2 -0
  203. package/dist/operations/enrich-profile.test.d.ts.map +1 -0
  204. package/dist/operations/enrich-profile.test.js +73 -0
  205. package/dist/operations/enrich-profile.test.js.map +1 -0
  206. package/dist/operations/ephemeral-action.d.ts +2 -1
  207. package/dist/operations/ephemeral-action.d.ts.map +1 -1
  208. package/dist/operations/ephemeral-action.js +5 -7
  209. package/dist/operations/ephemeral-action.js.map +1 -1
  210. package/dist/operations/ephemeral-action.test.d.ts +2 -0
  211. package/dist/operations/ephemeral-action.test.d.ts.map +1 -0
  212. package/dist/operations/ephemeral-action.test.js +159 -0
  213. package/dist/operations/ephemeral-action.test.js.map +1 -0
  214. package/dist/operations/follow-person.test.d.ts +2 -0
  215. package/dist/operations/follow-person.test.d.ts.map +1 -0
  216. package/dist/operations/follow-person.test.js +57 -0
  217. package/dist/operations/follow-person.test.js.map +1 -0
  218. package/dist/operations/get-action-budget.d.ts +1 -1
  219. package/dist/operations/get-action-budget.d.ts.map +1 -1
  220. package/dist/operations/get-action-budget.js +3 -6
  221. package/dist/operations/get-action-budget.js.map +1 -1
  222. package/dist/operations/get-errors.d.ts +5 -1
  223. package/dist/operations/get-errors.d.ts.map +1 -1
  224. package/dist/operations/get-errors.js +55 -33
  225. package/dist/operations/get-errors.js.map +1 -1
  226. package/dist/operations/get-errors.test.js +54 -55
  227. package/dist/operations/get-errors.test.js.map +1 -1
  228. package/dist/operations/get-feed.d.ts +83 -4
  229. package/dist/operations/get-feed.d.ts.map +1 -1
  230. package/dist/operations/get-feed.js +400 -153
  231. package/dist/operations/get-feed.js.map +1 -1
  232. package/dist/operations/get-feed.test.js +416 -190
  233. package/dist/operations/get-feed.test.js.map +1 -1
  234. package/dist/operations/get-post-engagers.d.ts +6 -3
  235. package/dist/operations/get-post-engagers.d.ts.map +1 -1
  236. package/dist/operations/get-post-engagers.js +278 -78
  237. package/dist/operations/get-post-engagers.js.map +1 -1
  238. package/dist/operations/get-post-engagers.test.js +292 -14
  239. package/dist/operations/get-post-engagers.test.js.map +1 -1
  240. package/dist/operations/get-post-stats.d.ts +8 -3
  241. package/dist/operations/get-post-stats.d.ts.map +1 -1
  242. package/dist/operations/get-post-stats.js +101 -37
  243. package/dist/operations/get-post-stats.js.map +1 -1
  244. package/dist/operations/get-post-stats.test.js +137 -2
  245. package/dist/operations/get-post-stats.test.js.map +1 -1
  246. package/dist/operations/get-post.d.ts +9 -150
  247. package/dist/operations/get-post.d.ts.map +1 -1
  248. package/dist/operations/get-post.js +356 -210
  249. package/dist/operations/get-post.js.map +1 -1
  250. package/dist/operations/get-post.test.js +210 -387
  251. package/dist/operations/get-post.test.js.map +1 -1
  252. package/dist/operations/get-profile-activity.d.ts +13 -92
  253. package/dist/operations/get-profile-activity.d.ts.map +1 -1
  254. package/dist/operations/get-profile-activity.js +305 -105
  255. package/dist/operations/get-profile-activity.js.map +1 -1
  256. package/dist/operations/get-profile-activity.test.js +277 -158
  257. package/dist/operations/get-profile-activity.test.js.map +1 -1
  258. package/dist/operations/get-throttle-status.d.ts +1 -1
  259. package/dist/operations/get-throttle-status.d.ts.map +1 -1
  260. package/dist/operations/get-throttle-status.js +4 -10
  261. package/dist/operations/get-throttle-status.js.map +1 -1
  262. package/dist/operations/import-people-from-collection.d.ts +1 -1
  263. package/dist/operations/import-people-from-collection.d.ts.map +1 -1
  264. package/dist/operations/import-people-from-collection.js +3 -6
  265. package/dist/operations/import-people-from-collection.js.map +1 -1
  266. package/dist/operations/import-people-from-urls.d.ts +1 -1
  267. package/dist/operations/import-people-from-urls.d.ts.map +1 -1
  268. package/dist/operations/import-people-from-urls.js +3 -6
  269. package/dist/operations/import-people-from-urls.js.map +1 -1
  270. package/dist/operations/index.d.ts +2 -2
  271. package/dist/operations/index.d.ts.map +1 -1
  272. package/dist/operations/index.js +2 -1
  273. package/dist/operations/index.js.map +1 -1
  274. package/dist/operations/like-person-posts.test.d.ts +2 -0
  275. package/dist/operations/like-person-posts.test.d.ts.map +1 -0
  276. package/dist/operations/like-person-posts.test.js +103 -0
  277. package/dist/operations/like-person-posts.test.js.map +1 -0
  278. package/dist/operations/list-collections.d.ts +1 -1
  279. package/dist/operations/list-collections.d.ts.map +1 -1
  280. package/dist/operations/list-collections.js +3 -6
  281. package/dist/operations/list-collections.js.map +1 -1
  282. package/dist/operations/message-person.test.d.ts +2 -0
  283. package/dist/operations/message-person.test.d.ts.map +1 -0
  284. package/dist/operations/message-person.test.js +108 -0
  285. package/dist/operations/message-person.test.js.map +1 -0
  286. package/dist/operations/navigate-away.d.ts +14 -0
  287. package/dist/operations/navigate-away.d.ts.map +1 -0
  288. package/dist/operations/navigate-away.js +24 -0
  289. package/dist/operations/navigate-away.js.map +1 -0
  290. package/dist/operations/navigate-away.test.d.ts +2 -0
  291. package/dist/operations/navigate-away.test.d.ts.map +1 -0
  292. package/dist/operations/navigate-away.test.js +51 -0
  293. package/dist/operations/navigate-away.test.js.map +1 -0
  294. package/dist/operations/query-messages.d.ts +1 -1
  295. package/dist/operations/query-messages.d.ts.map +1 -1
  296. package/dist/operations/query-messages.js +3 -6
  297. package/dist/operations/query-messages.js.map +1 -1
  298. package/dist/operations/react-to-post.d.ts +16 -4
  299. package/dist/operations/react-to-post.d.ts.map +1 -1
  300. package/dist/operations/react-to-post.js +86 -24
  301. package/dist/operations/react-to-post.js.map +1 -1
  302. package/dist/operations/react-to-post.test.js +55 -5
  303. package/dist/operations/react-to-post.test.js.map +1 -1
  304. package/dist/operations/remove-connection.test.d.ts +2 -0
  305. package/dist/operations/remove-connection.test.d.ts.map +1 -0
  306. package/dist/operations/remove-connection.test.js +45 -0
  307. package/dist/operations/remove-connection.test.js.map +1 -0
  308. package/dist/operations/remove-people-from-collection.d.ts +1 -1
  309. package/dist/operations/remove-people-from-collection.d.ts.map +1 -1
  310. package/dist/operations/remove-people-from-collection.js +3 -6
  311. package/dist/operations/remove-people-from-collection.js.map +1 -1
  312. package/dist/operations/resolve-linkedin-entity.d.ts.map +1 -1
  313. package/dist/operations/resolve-linkedin-entity.js +2 -2
  314. package/dist/operations/resolve-linkedin-entity.js.map +1 -1
  315. package/dist/operations/resolve-linkedin-entity.test.d.ts +2 -0
  316. package/dist/operations/resolve-linkedin-entity.test.d.ts.map +1 -0
  317. package/dist/operations/resolve-linkedin-entity.test.js +343 -0
  318. package/dist/operations/resolve-linkedin-entity.test.js.map +1 -0
  319. package/dist/operations/scrape-messaging-history.d.ts +2 -1
  320. package/dist/operations/scrape-messaging-history.d.ts.map +1 -1
  321. package/dist/operations/scrape-messaging-history.js +113 -18
  322. package/dist/operations/scrape-messaging-history.js.map +1 -1
  323. package/dist/operations/scrape-messaging-history.test.js +109 -12
  324. package/dist/operations/scrape-messaging-history.test.js.map +1 -1
  325. package/dist/operations/search-posts.d.ts +20 -112
  326. package/dist/operations/search-posts.d.ts.map +1 -1
  327. package/dist/operations/search-posts.js +369 -170
  328. package/dist/operations/search-posts.js.map +1 -1
  329. package/dist/operations/search-posts.test.js +273 -234
  330. package/dist/operations/search-posts.test.js.map +1 -1
  331. package/dist/operations/send-inmail.test.d.ts +2 -0
  332. package/dist/operations/send-inmail.test.d.ts.map +1 -0
  333. package/dist/operations/send-inmail.test.js +108 -0
  334. package/dist/operations/send-inmail.test.js.map +1 -0
  335. package/dist/operations/send-invite.test.d.ts +2 -0
  336. package/dist/operations/send-invite.test.d.ts.map +1 -0
  337. package/dist/operations/send-invite.test.js +59 -0
  338. package/dist/operations/send-invite.test.js.map +1 -0
  339. package/dist/operations/types.d.ts +27 -1
  340. package/dist/operations/types.d.ts.map +1 -1
  341. package/dist/operations/types.js +14 -1
  342. package/dist/operations/types.js.map +1 -1
  343. package/dist/operations/visit-profile.d.ts +1 -1
  344. package/dist/operations/visit-profile.d.ts.map +1 -1
  345. package/dist/operations/visit-profile.js +3 -6
  346. package/dist/operations/visit-profile.js.map +1 -1
  347. package/dist/services/account-resolution.d.ts +10 -4
  348. package/dist/services/account-resolution.d.ts.map +1 -1
  349. package/dist/services/account-resolution.js +63 -5
  350. package/dist/services/account-resolution.js.map +1 -1
  351. package/dist/services/app.d.ts +6 -2
  352. package/dist/services/app.d.ts.map +1 -1
  353. package/dist/services/app.js +18 -6
  354. package/dist/services/app.js.map +1 -1
  355. package/dist/services/app.test.js +41 -7
  356. package/dist/services/app.test.js.map +1 -1
  357. package/dist/services/campaign.d.ts +40 -4
  358. package/dist/services/campaign.d.ts.map +1 -1
  359. package/dist/services/campaign.js +176 -10
  360. package/dist/services/campaign.js.map +1 -1
  361. package/dist/services/campaign.test.js +53 -15
  362. package/dist/services/campaign.test.js.map +1 -1
  363. package/dist/services/collection.d.ts +16 -21
  364. package/dist/services/collection.d.ts.map +1 -1
  365. package/dist/services/collection.js +34 -47
  366. package/dist/services/collection.js.map +1 -1
  367. package/dist/services/collection.test.js +30 -91
  368. package/dist/services/collection.test.js.map +1 -1
  369. package/dist/services/ephemeral-campaign.d.ts +6 -0
  370. package/dist/services/ephemeral-campaign.d.ts.map +1 -1
  371. package/dist/services/ephemeral-campaign.js +54 -10
  372. package/dist/services/ephemeral-campaign.js.map +1 -1
  373. package/dist/services/ephemeral-campaign.test.js +23 -10
  374. package/dist/services/ephemeral-campaign.test.js.map +1 -1
  375. package/dist/services/errors.d.ts +2 -1
  376. package/dist/services/errors.d.ts.map +1 -1
  377. package/dist/services/errors.js +6 -3
  378. package/dist/services/errors.js.map +1 -1
  379. package/dist/services/index.d.ts +1 -2
  380. package/dist/services/index.d.ts.map +1 -1
  381. package/dist/services/index.js +1 -2
  382. package/dist/services/index.js.map +1 -1
  383. package/dist/services/instance-context.d.ts +5 -1
  384. package/dist/services/instance-context.d.ts.map +1 -1
  385. package/dist/services/instance-context.js +87 -28
  386. package/dist/services/instance-context.js.map +1 -1
  387. package/dist/services/instance-context.test.js +5 -1
  388. package/dist/services/instance-context.test.js.map +1 -1
  389. package/dist/services/instance-lifecycle.d.ts.map +1 -1
  390. package/dist/services/instance-lifecycle.js +32 -1
  391. package/dist/services/instance-lifecycle.js.map +1 -1
  392. package/dist/services/instance-lifecycle.test.js +52 -1
  393. package/dist/services/instance-lifecycle.test.js.map +1 -1
  394. package/dist/services/instance.d.ts +37 -9
  395. package/dist/services/instance.d.ts.map +1 -1
  396. package/dist/services/instance.js +100 -25
  397. package/dist/services/instance.js.map +1 -1
  398. package/dist/services/instance.test.js +157 -0
  399. package/dist/services/instance.test.js.map +1 -1
  400. package/dist/services/launcher.d.ts +47 -3
  401. package/dist/services/launcher.d.ts.map +1 -1
  402. package/dist/services/launcher.js +205 -33
  403. package/dist/services/launcher.js.map +1 -1
  404. package/dist/services/launcher.test.js +133 -6
  405. package/dist/services/launcher.test.js.map +1 -1
  406. package/dist/services/source-type-registry.d.ts +8 -0
  407. package/dist/services/source-type-registry.d.ts.map +1 -1
  408. package/dist/services/source-type-registry.js +39 -0
  409. package/dist/services/source-type-registry.js.map +1 -1
  410. package/dist/services/source-type-registry.test.js +31 -1
  411. package/dist/services/source-type-registry.test.js.map +1 -1
  412. package/dist/services/status.d.ts +6 -2
  413. package/dist/services/status.d.ts.map +1 -1
  414. package/dist/services/status.js +67 -34
  415. package/dist/services/status.js.map +1 -1
  416. package/dist/services/status.test.js +9 -2
  417. package/dist/services/status.test.js.map +1 -1
  418. package/dist/testing/e2e-helpers.d.ts +47 -1
  419. package/dist/testing/e2e-helpers.d.ts.map +1 -1
  420. package/dist/testing/e2e-helpers.js +244 -7
  421. package/dist/testing/e2e-helpers.js.map +1 -1
  422. package/dist/testing/index.d.ts +1 -1
  423. package/dist/testing/index.d.ts.map +1 -1
  424. package/dist/testing/index.js +1 -1
  425. package/dist/testing/index.js.map +1 -1
  426. package/dist/types/account.d.ts +1 -1
  427. package/dist/types/campaign.d.ts +1 -1
  428. package/dist/types/campaign.d.ts.map +1 -1
  429. package/dist/types/feed.d.ts +1 -3
  430. package/dist/types/feed.d.ts.map +1 -1
  431. package/dist/types/index.d.ts +0 -1
  432. package/dist/types/index.d.ts.map +1 -1
  433. package/dist/utils/cdp-port.d.ts.map +1 -1
  434. package/dist/utils/cdp-port.js +3 -1
  435. package/dist/utils/cdp-port.js.map +1 -1
  436. package/dist/utils/cdp-port.test.js +1 -1
  437. package/dist/utils/cdp-port.test.js.map +1 -1
  438. package/dist/utils/delay.d.ts +79 -0
  439. package/dist/utils/delay.d.ts.map +1 -1
  440. package/dist/utils/delay.js +118 -0
  441. package/dist/utils/delay.js.map +1 -1
  442. package/dist/utils/delay.test.js +111 -1
  443. package/dist/utils/delay.test.js.map +1 -1
  444. package/dist/utils/index.d.ts +2 -1
  445. package/dist/utils/index.d.ts.map +1 -1
  446. package/dist/utils/index.js +2 -1
  447. package/dist/utils/index.js.map +1 -1
  448. package/dist/utils/session-pacer.d.ts +27 -0
  449. package/dist/utils/session-pacer.d.ts.map +1 -0
  450. package/dist/utils/session-pacer.js +55 -0
  451. package/dist/utils/session-pacer.js.map +1 -0
  452. package/dist/utils/session-pacer.test.d.ts +2 -0
  453. package/dist/utils/session-pacer.test.d.ts.map +1 -0
  454. package/dist/utils/session-pacer.test.js +111 -0
  455. package/dist/utils/session-pacer.test.js.map +1 -0
  456. package/package.json +1 -1
  457. package/dist/linkedin/__tests__/selectors.integration.test.d.ts +0 -2
  458. package/dist/linkedin/__tests__/selectors.integration.test.d.ts.map +0 -1
  459. package/dist/linkedin/__tests__/selectors.integration.test.js +0 -258
  460. package/dist/linkedin/__tests__/selectors.integration.test.js.map +0 -1
  461. package/dist/types/search-posts.d.ts +0 -22
  462. package/dist/types/search-posts.d.ts.map +0 -1
  463. package/dist/types/search-posts.js +0 -4
  464. package/dist/types/search-posts.js.map +0 -1
  465. package/dist/voyager/index.d.ts +0 -2
  466. package/dist/voyager/index.d.ts.map +0 -1
  467. package/dist/voyager/index.js +0 -4
  468. package/dist/voyager/index.js.map +0 -1
  469. package/dist/voyager/interceptor.d.ts +0 -100
  470. package/dist/voyager/interceptor.d.ts.map +0 -1
  471. package/dist/voyager/interceptor.integration.test.d.ts +0 -2
  472. package/dist/voyager/interceptor.integration.test.d.ts.map +0 -1
  473. package/dist/voyager/interceptor.integration.test.js +0 -89
  474. package/dist/voyager/interceptor.integration.test.js.map +0 -1
  475. package/dist/voyager/interceptor.js +0 -235
  476. package/dist/voyager/interceptor.js.map +0 -1
  477. package/dist/voyager/interceptor.test.d.ts +0 -2
  478. package/dist/voyager/interceptor.test.d.ts.map +0 -1
  479. package/dist/voyager/interceptor.test.js +0 -372
  480. package/dist/voyager/interceptor.test.js.map +0 -1
@@ -1,176 +1,278 @@
1
1
  // SPDX-License-Identifier: AGPL-3.0-only
2
2
  // Copyright (C) 2026 Oleksii PELYKH
3
+ import { resolveInstancePort } from "../cdp/index.js";
3
4
  import { CDPClient } from "../cdp/client.js";
4
5
  import { discoverTargets } from "../cdp/discovery.js";
5
- import { VoyagerInterceptor } from "../voyager/interceptor.js";
6
- import { DEFAULT_CDP_PORT } from "../constants.js";
6
+ import { navigateAwayIf } from "./navigate-away.js";
7
+ import { gaussianDelay, gaussianBetween, maybeHesitate, maybeBreak, simulateReadingTime } from "../utils/delay.js";
8
+ import { humanizedScrollToByIndex, retryInteraction } from "../linkedin/dom-automation.js";
9
+ import { mapRawPosts, scrollFeed, delay, } from "./get-feed.js";
10
+ // ---------------------------------------------------------------------------
11
+ // Search-specific DOM scraping script
12
+ // ---------------------------------------------------------------------------
7
13
  /**
8
- * Extract a LinkedIn public identifier from a navigation URL.
14
+ * JavaScript evaluated inside the LinkedIn search results page. Returns
15
+ * an array of {@link RawDomPost} objects.
9
16
  *
10
- * Handles patterns like:
11
- * - `https://www.linkedin.com/in/johndoe`
12
- * - `https://www.linkedin.com/in/johndoe?miniProfileUrn=...`
17
+ * Search result items are `div[role="listitem"]` elements (NOT wrapped
18
+ * in `data-testid="mainFeed"` like the feed page). URNs/URLs are NOT
19
+ * exposed inline — they are extracted in a subsequent phase by opening
20
+ * each post's three-dot menu and clicking "Copy link to post", which
21
+ * writes the URL to `navigator.clipboard.writeText`.
13
22
  */
14
- export function extractPublicId(url) {
15
- if (!url)
16
- return null;
17
- const match = /linkedin\.com\/in\/([^/?]+)/.exec(url);
18
- return match?.[1] ?? null;
19
- }
20
- /**
21
- * Resolve a headline value that may be a string or an object with a `text` field.
22
- */
23
- function resolveTextOrWrapper(value) {
24
- if (value === undefined || value === null)
25
- return null;
26
- if (typeof value === "string")
27
- return value;
28
- return value.text ?? null;
29
- }
23
+ const SCRAPE_SEARCH_RESULTS_SCRIPT = `(() => {
24
+ const posts = [];
25
+
26
+ // --- Strategy 1: div[role="listitem"] search results (no mainFeed wrapper) ---
27
+ const searchItems = document.querySelectorAll('div[role="listitem"]');
28
+ const isSearchPage = searchItems.length > 0
29
+ && !document.querySelector('[data-testid="mainFeed"]');
30
+ if (isSearchPage) {
31
+ for (const card of searchItems) {
32
+ if (card.offsetHeight < 100) continue;
33
+ const menuBtn = card.querySelector('button[aria-label^="Open control menu for post"]');
34
+ if (!menuBtn) continue;
35
+
36
+ // URL extracted via three-dot menu
37
+
38
+ let authorName = null;
39
+ let authorHeadline = null;
40
+ let authorProfileUrl = null;
41
+
42
+ const authorLink = card.querySelector('a[href*="/in/"], a[href*="/company/"]');
43
+ if (authorLink) {
44
+ authorProfileUrl = authorLink.href.split('?')[0] || null;
45
+ const nameEl = authorLink.querySelector('span[dir="ltr"], span[aria-hidden="true"]')
46
+ || authorLink;
47
+ const rawName = (nameEl.textContent || '').trim();
48
+ authorName = rawName || null;
49
+ }
50
+
51
+ const allSpans = card.querySelectorAll('span');
52
+ for (const span of allSpans) {
53
+ const txt = (span.textContent || '').trim();
54
+ if (
55
+ txt &&
56
+ txt.length > 5 &&
57
+ txt.length < 200 &&
58
+ txt !== authorName &&
59
+ !txt.match(/^\\d+[smhdw]$/) &&
60
+ !txt.match(/^\\d[\\d,]*\\s+(reactions?|comments?|reposts?|likes?)$/i) &&
61
+ !txt.match(/^Follow$|^Promoted$/i)
62
+ ) {
63
+ authorHeadline = txt;
64
+ break;
65
+ }
66
+ }
67
+
68
+ let text = null;
69
+ const ltrSpans = card.querySelectorAll('span[dir="ltr"]');
70
+ let longestText = '';
71
+ for (const span of ltrSpans) {
72
+ const txt = (span.textContent || '').trim();
73
+ if (txt.length > longestText.length && txt !== authorName && txt !== authorHeadline) {
74
+ longestText = txt;
75
+ }
76
+ }
77
+ if (longestText.length > 20) text = longestText;
78
+
79
+ let mediaType = null;
80
+ if (card.querySelector('video')) {
81
+ mediaType = 'video';
82
+ } else if (card.querySelector('img[src*="media.licdn.com"]')) {
83
+ const imgs = card.querySelectorAll('img[src*="media.licdn.com"]');
84
+ for (const img of imgs) {
85
+ if (img.offsetHeight > 100) { mediaType = 'image'; break; }
86
+ }
87
+ }
88
+
89
+ const cardText = card.textContent || '';
90
+ function parseCount(pattern) {
91
+ const m = cardText.match(pattern);
92
+ if (!m) return 0;
93
+ const raw = m[1].replace(/,/g, '');
94
+ const num = parseInt(raw, 10);
95
+ return isNaN(num) ? 0 : num;
96
+ }
97
+
98
+ const reactionCount = parseCount(/(\\d[\\d,]*)\\s+reactions?/i);
99
+ const commentCount = parseCount(/(\\d[\\d,]*)\\s+comments?/i);
100
+ const shareCount = parseCount(/(\\d[\\d,]*)\\s+reposts?/i);
101
+
102
+ let timestamp = null;
103
+ const timeEl = card.querySelector('time');
104
+ if (timeEl) {
105
+ const dt = timeEl.getAttribute('datetime');
106
+ if (dt) timestamp = dt;
107
+ }
108
+ if (!timestamp) {
109
+ const timeMatch = cardText.match(/(?:^|\\s)(\\d+[smhdw])(?:\\s|$|\\u00B7|\\xB7)/);
110
+ if (timeMatch) timestamp = timeMatch[1];
111
+ }
112
+
113
+ posts.push({
114
+ url: null,
115
+ authorName,
116
+ authorHeadline,
117
+ authorProfileUrl,
118
+ text,
119
+ mediaType,
120
+ reactionCount,
121
+ commentCount,
122
+ shareCount,
123
+ timestamp,
124
+ });
125
+ }
126
+ return posts;
127
+ }
128
+
129
+ // --- Strategy 2: mainFeed fallback (older LinkedIn renders) ---
130
+ const feedList = document.querySelector('[data-testid="mainFeed"]');
131
+ if (!feedList) return posts;
132
+
133
+ const items = feedList.querySelectorAll('div[role="listitem"]');
134
+ for (const item of items) {
135
+ if (item.offsetHeight < 100) continue;
136
+ const menuBtn = item.querySelector('button[aria-label^="Open control menu for post"]');
137
+ if (!menuBtn) continue;
138
+
139
+ let authorName = null;
140
+ let authorHeadline = null;
141
+ let authorProfileUrl = null;
142
+
143
+ const authorLink = item.querySelector('a[href*="/in/"], a[href*="/company/"]');
144
+ if (authorLink) {
145
+ authorProfileUrl = authorLink.href.split('?')[0] || null;
146
+ const nameEl = authorLink.querySelector('span[dir="ltr"], span[aria-hidden="true"]')
147
+ || authorLink;
148
+ authorName = (nameEl.textContent || '').trim() || null;
149
+ }
150
+
151
+ const allSpans = item.querySelectorAll('span');
152
+ for (const span of allSpans) {
153
+ const txt = (span.textContent || '').trim();
154
+ if (
155
+ txt && txt.length > 5 && txt.length < 200 &&
156
+ txt !== authorName &&
157
+ !txt.match(/^\\d+[smhdw]$/) &&
158
+ !txt.match(/^\\d[\\d,]*\\s+(reactions?|comments?|reposts?|likes?)$/i) &&
159
+ !txt.match(/^Follow$|^Promoted$/i)
160
+ ) {
161
+ authorHeadline = txt;
162
+ break;
163
+ }
164
+ }
165
+
166
+ let text = null;
167
+ const ltrSpans = item.querySelectorAll('span[dir="ltr"]');
168
+ let longestText = '';
169
+ for (const span of ltrSpans) {
170
+ const txt = (span.textContent || '').trim();
171
+ if (txt.length > longestText.length && txt !== authorName && txt !== authorHeadline) {
172
+ longestText = txt;
173
+ }
174
+ }
175
+ if (longestText.length > 20) text = longestText;
176
+
177
+ let mediaType = null;
178
+ if (item.querySelector('video')) {
179
+ mediaType = 'video';
180
+ } else if (item.querySelector('img[src*="media.licdn.com"]')) {
181
+ const imgs = item.querySelectorAll('img[src*="media.licdn.com"]');
182
+ for (const img of imgs) {
183
+ if (img.offsetHeight > 100) { mediaType = 'image'; break; }
184
+ }
185
+ }
186
+
187
+ const itemText = item.textContent || '';
188
+ function parseCount2(pattern) {
189
+ const m = itemText.match(pattern);
190
+ if (!m) return 0;
191
+ const raw = m[1].replace(/,/g, '');
192
+ const num = parseInt(raw, 10);
193
+ return isNaN(num) ? 0 : num;
194
+ }
195
+
196
+ const reactionCount = parseCount2(/(\\d[\\d,]*)\\s+reactions?/i);
197
+ const commentCount = parseCount2(/(\\d[\\d,]*)\\s+comments?/i);
198
+ const shareCount = parseCount2(/(\\d[\\d,]*)\\s+reposts?/i);
199
+
200
+ let timestamp = null;
201
+ const timeEl = item.querySelector('time');
202
+ if (timeEl) {
203
+ const dt = timeEl.getAttribute('datetime');
204
+ if (dt) timestamp = dt;
205
+ }
206
+ if (!timestamp) {
207
+ const timeMatch = itemText.match(/(?:^|\\s)(\\d+[smhdw])(?:\\s|$|\\u00B7|\\xB7)/);
208
+ if (timeMatch) timestamp = timeMatch[1];
209
+ }
210
+
211
+ posts.push({
212
+ url: null,
213
+ authorName,
214
+ authorHeadline,
215
+ authorProfileUrl,
216
+ text,
217
+ mediaType,
218
+ reactionCount,
219
+ commentCount,
220
+ shareCount,
221
+ timestamp,
222
+ });
223
+ }
224
+
225
+ return posts;
226
+ })()`;
227
+ // ---------------------------------------------------------------------------
228
+ // Search-specific readiness check
229
+ // ---------------------------------------------------------------------------
30
230
  /**
31
- * Extract the activity URN from the entity URN.
231
+ * Wait until search results are visible in the DOM.
32
232
  *
33
- * The search API may return URNs in several formats:
34
- * - `urn:li:fs_updateV2:(urn:li:activity:1234,...)` extract `urn:li:activity:1234`
35
- * - `urn:li:activity:1234` use directly
36
- * - `urn:li:ugcPost:1234` → use directly
37
- */
38
- export function extractActivityUrn(urn) {
39
- if (!urn)
40
- return null;
41
- // Extract nested activity URN from fs_updateV2 wrapper
42
- // e.g. urn:li:fs_updateV2:(urn:li:activity:123,FEED_DETAIL)
43
- const nestedMatch = /\((urn:li:(?:activity|ugcPost):\d+)[,)]/.exec(urn);
44
- if (nestedMatch?.[1])
45
- return nestedMatch[1];
46
- // Direct activity/ugcPost URN
47
- if (/^urn:li:(?:activity|ugcPost):\d+$/.test(urn))
48
- return urn;
49
- return urn;
50
- }
51
- /**
52
- * Parse the Voyager content search response into normalised search results.
233
+ * Checks for two possible page structures:
234
+ * 1. `[data-chameleon-result-urn]` modern search results with inline URNs.
235
+ * 2. `[data-testid="mainFeed"]` with menu buttons — older layout sharing
236
+ * the feed container.
53
237
  *
54
- * LinkedIn's search API returns results in a "clusters" structure with
55
- * entities referenced via URN in the `included` array. This parser
56
- * handles both inline and reference-based entity resolution.
238
+ * @internal Exported for testing.
57
239
  */
58
- export function parseSearchResponse(raw) {
59
- const clusters = raw.data?.elements ?? raw.elements ?? [];
60
- const paging = raw.data?.paging ?? raw.paging;
61
- const included = raw.included ?? [];
62
- // Build lookup maps for included entities by URN
63
- const entitiesByUrn = new Map();
64
- for (const entity of included) {
65
- if (entity.entityUrn) {
66
- entitiesByUrn.set(entity.entityUrn, entity);
67
- }
68
- }
69
- const posts = [];
70
- for (const cluster of clusters) {
71
- for (const searchItem of cluster.items ?? []) {
72
- const entityResult = searchItem.item?.entityResult;
73
- if (!entityResult)
74
- continue;
75
- const postUrn = extractActivityUrn(entityResult.entityUrn);
76
- if (!postUrn)
77
- continue;
78
- // Try to find the update entity in included
79
- const entityRef = entityResult["*entity"] ?? entityResult.entityUrn;
80
- const updateEntity = entityRef
81
- ? entitiesByUrn.get(entityRef)
82
- : undefined;
83
- // Extract post text from entity result summary or update commentary
84
- const text = entityResult.summary?.text ??
85
- updateEntity?.commentary?.text ??
86
- null;
87
- // Extract author info from entity result or included actor
88
- let authorFirstName = null;
89
- let authorLastName = null;
90
- let authorPublicId = null;
91
- let authorHeadline = null;
92
- // Try entity result title (author name in search results)
93
- const authorName = entityResult.title?.text ?? null;
94
- if (authorName) {
95
- const nameParts = authorName.split(" ");
96
- authorFirstName = nameParts[0] ?? null;
97
- authorLastName = nameParts.slice(1).join(" ") || null;
98
- }
99
- authorHeadline =
100
- entityResult.primarySubtitle?.text ?? null;
101
- // Try to resolve from included actor profile
102
- if (updateEntity?.["*actor"]) {
103
- const actorProfile = entitiesByUrn.get(updateEntity["*actor"]);
104
- if (actorProfile) {
105
- if (!authorFirstName) {
106
- authorFirstName = actorProfile.firstName ?? null;
107
- }
108
- if (!authorLastName) {
109
- authorLastName = actorProfile.lastName ?? null;
110
- }
111
- if (!authorPublicId) {
112
- authorPublicId = actorProfile.publicIdentifier ?? null;
113
- }
114
- if (!authorHeadline) {
115
- authorHeadline = resolveTextOrWrapper(actorProfile.headline) ??
116
- actorProfile.occupation ?? null;
117
- }
118
- }
119
- }
120
- // Try to extract publicId from actor navigation URL
121
- if (!authorPublicId && updateEntity?.actor?.navigationUrl) {
122
- authorPublicId = extractPublicId(updateEntity.actor.navigationUrl);
123
- }
124
- // Extract engagement counts
125
- let reactionCount = 0;
126
- let commentCount = 0;
127
- if (updateEntity?.socialDetail && typeof updateEntity.socialDetail === "object") {
128
- reactionCount =
129
- updateEntity.socialDetail.totalSocialActivityCounts?.numLikes ?? 0;
130
- commentCount =
131
- updateEntity.socialDetail.totalSocialActivityCounts?.numComments ?? 0;
132
- }
133
- else {
134
- reactionCount = updateEntity?.numLikes ?? 0;
135
- commentCount = updateEntity?.numComments ?? 0;
136
- }
137
- posts.push({
138
- postUrn,
139
- text,
140
- authorFirstName,
141
- authorLastName,
142
- authorPublicId,
143
- authorHeadline,
144
- reactionCount,
145
- commentCount,
146
- });
240
+ export async function waitForSearchResults(client, timeoutMs = 15_000) {
241
+ const deadline = Date.now() + timeoutMs;
242
+ while (Date.now() < deadline) {
243
+ const ready = await client.evaluate(`(() => {
244
+ // Search results render as div[role="listitem"] with post menu buttons.
245
+ // Unlike the feed page they are NOT wrapped in data-testid="mainFeed".
246
+ const items = document.querySelectorAll('div[role="listitem"]');
247
+ for (const item of items) {
248
+ if (item.querySelector('button[aria-label^="Open control menu for post"]')) {
249
+ return true;
147
250
  }
251
+ }
252
+ return false;
253
+ })()`);
254
+ if (ready)
255
+ return;
256
+ await delay(500);
148
257
  }
149
- return {
150
- posts,
151
- paging: {
152
- start: paging?.start ?? 0,
153
- count: paging?.count ?? posts.length,
154
- total: paging?.total ?? posts.length,
155
- },
156
- };
258
+ throw new Error("Timed out waiting for search results to appear in the DOM");
157
259
  }
158
260
  /**
159
261
  * Search LinkedIn for posts matching a keyword query.
160
262
  *
161
- * Connects to the LinkedIn webview in LinkedHelper and calls the
162
- * Voyager search API with content-type filtering to find posts.
263
+ * Connects to the LinkedIn webview in LinkedHelper, navigates to the
264
+ * content search page, and extracts posts from the rendered DOM.
163
265
  * Supports keyword search, hashtag search, and cursor-based pagination.
164
266
  *
165
267
  * @param input - Search query, pagination parameters, and CDP connection options.
166
- * @returns List of matching posts with pagination metadata.
268
+ * @returns List of matching posts with cursor for the next page.
167
269
  */
168
270
  export async function searchPosts(input) {
169
- const cdpPort = input.cdpPort ?? DEFAULT_CDP_PORT;
271
+ const cdpPort = await resolveInstancePort(input.cdpPort, input.cdpHost);
170
272
  const cdpHost = input.cdpHost ?? "127.0.0.1";
171
273
  const allowRemote = input.allowRemote ?? false;
172
274
  const count = input.count ?? 10;
173
- const start = input.start ?? 0;
275
+ const cursor = input.cursor ?? null;
174
276
  if (!input.query.trim()) {
175
277
  throw new Error("Search query must not be empty");
176
278
  }
@@ -188,30 +290,127 @@ export async function searchPosts(input) {
188
290
  const client = new CDPClient(cdpPort, { host: cdpHost, allowRemote });
189
291
  await client.connect(linkedInTarget.id);
190
292
  try {
191
- const voyager = new VoyagerInterceptor(client);
192
- const encodedQuery = encodeURIComponent(input.query);
193
- const encodedFilters = encodeURIComponent("List(resultType->CONTENT)");
194
- const path = `/voyager/api/search/dash/clusters` +
195
- `?q=all` +
196
- `&keywords=${encodedQuery}` +
197
- `&filters=${encodedFilters}` +
198
- `&origin=GLOBAL_SEARCH_HEADER` +
199
- `&start=${String(start)}` +
200
- `&count=${String(count)}`;
201
- const response = await voyager.fetch(path);
202
- if (response.status !== 200) {
203
- throw new Error(`Voyager API returned HTTP ${String(response.status)} for post search`);
293
+ // Navigate away if already on the search page to force a fresh load
294
+ await navigateAwayIf(client, "/search/results/");
295
+ // Navigate to LinkedIn content search
296
+ const searchUrl = new URL("https://www.linkedin.com/search/results/content/");
297
+ searchUrl.searchParams.set("keywords", input.query);
298
+ searchUrl.searchParams.set("origin", "GLOBAL_SEARCH_HEADER");
299
+ await client.navigate(searchUrl.toString());
300
+ // Wait for the search results to render
301
+ await waitForSearchResults(client);
302
+ const mouse = input.mouse ?? null;
303
+ // Collect posts scroll to load more if needed.
304
+ //
305
+ // Cursor is an index-based offset (e.g. "10" means start from post
306
+ // at index 10). URN-based cursors are not possible because search
307
+ // result posts don't expose URNs in the DOM.
308
+ const maxScrollAttempts = 10;
309
+ let allPosts = [];
310
+ let previousCount = 0;
311
+ const startIdx = cursor ?? 0;
312
+ if (startIdx < 0) {
313
+ throw new Error(`Invalid cursor ${String(cursor)} — must be a non-negative integer offset`);
314
+ }
315
+ for (let scroll = 0; scroll <= maxScrollAttempts; scroll++) {
316
+ const countBeforeScroll = previousCount;
317
+ const scraped = await client.evaluate(SCRAPE_SEARCH_RESULTS_SCRIPT);
318
+ allPosts = scraped ?? [];
319
+ const available = allPosts.length - startIdx;
320
+ if (available >= count)
321
+ break;
322
+ // No new posts appeared after scroll — stop
323
+ if (allPosts.length === previousCount && scroll > 0)
324
+ break;
325
+ previousCount = allPosts.length;
326
+ // Scroll to load more
327
+ if (scroll < maxScrollAttempts) {
328
+ await scrollFeed(client, mouse);
329
+ // Progressive session fatigue: delays increase with each scroll
330
+ const fatigueMultiplier = 1 + scroll * 0.1;
331
+ // Scale delay by newly visible content volume
332
+ const newPostCount = allPosts.length - countBeforeScroll;
333
+ const contentBonus = Math.min(newPostCount * gaussianBetween(350, 75, 200, 500), 3_000);
334
+ await gaussianDelay(1_500 * fatigueMultiplier + contentBonus, 150 * fatigueMultiplier, 1_200 * fatigueMultiplier + contentBonus, 1_800 * fatigueMultiplier + contentBonus);
335
+ // Reading simulation: pause proportional to visible content volume.
336
+ // Estimate ~300 chars per newly visible post (headline + snippet).
337
+ if (newPostCount > 0) {
338
+ await simulateReadingTime(newPostCount * 300);
339
+ }
340
+ await maybeBreak();
341
+ }
204
342
  }
205
- const body = response.body;
206
- if (body === null || typeof body !== "object") {
207
- throw new Error("Voyager API returned an unexpected response format for post search");
343
+ // --- URL extraction via three-dot menu → "Copy link to post" ---
344
+ // Search result posts don't expose URLs in the DOM. For each post
345
+ // with urn === null, open the three-dot menu, click "Copy link to
346
+ // post" which writes the URL to the clipboard.
347
+ //
348
+ // Note: URNs are NOT extractable from search results — only the URL
349
+ // is captured here. Do not attempt to reconstruct URNs from URLs.
350
+ //
351
+ // Electron's clipboard API is broken (readText returns {}) so we
352
+ // monkey-patch navigator.clipboard.writeText to capture into a
353
+ // window global instead.
354
+ const needsUrlExtraction = allPosts.some((p) => p.url === null);
355
+ if (needsUrlExtraction) {
356
+ // Install clipboard interceptor once
357
+ await client.evaluate(`navigator.clipboard.writeText = function(text) {
358
+ window.__capturedClipboard = text;
359
+ return Promise.resolve();
360
+ };`);
361
+ const SEARCH_MENU_BUTTON_SELECTOR = 'div[role="listitem"] button[aria-label^="Open control menu for post"]';
362
+ for (let i = 0; i < allPosts.length; i++) {
363
+ const post = allPosts[i];
364
+ if (!post || post.url)
365
+ continue;
366
+ if (i > 0)
367
+ await gaussianDelay(550, 125, 300, 800); // Inter-post delay
368
+ await maybeBreak();
369
+ const url = await retryInteraction(async () => {
370
+ await maybeHesitate(); // Probabilistic pause before menu interaction
371
+ // Reset capture
372
+ await client.evaluate(`window.__capturedClipboard = null;`);
373
+ // Scroll the menu button into view (humanized when mouse available)
374
+ await humanizedScrollToByIndex(client, SEARCH_MENU_BUTTON_SELECTOR, i, mouse);
375
+ // Click the i-th menu button
376
+ const clicked = await client.evaluate(`(() => {
377
+ const btns = document.querySelectorAll(
378
+ ${JSON.stringify(SEARCH_MENU_BUTTON_SELECTOR)}
379
+ );
380
+ const btn = btns[${String(i)}];
381
+ if (!btn) return false;
382
+ btn.click();
383
+ return true;
384
+ })()`);
385
+ if (!clicked)
386
+ return null;
387
+ await gaussianDelay(700, 100, 500, 900);
388
+ // Click "Copy link to post" menu item
389
+ await client.evaluate(`(() => {
390
+ for (const el of document.querySelectorAll('[role="menuitem"]')) {
391
+ if (el.textContent.trim() === 'Copy link to post') {
392
+ el.click();
393
+ return;
394
+ }
395
+ }
396
+ })()`);
397
+ await gaussianDelay(550, 75, 400, 700);
398
+ // Read captured URL
399
+ return client.evaluate(`window.__capturedClipboard`);
400
+ });
401
+ if (url) {
402
+ post.url = url.split("?")[0] ?? url;
403
+ }
404
+ }
208
405
  }
209
- const parsed = parseSearchResponse(body);
210
- return {
211
- query: input.query,
212
- posts: parsed.posts,
213
- paging: parsed.paging,
214
- };
406
+ // Slice the result window
407
+ const window = allPosts.slice(startIdx, startIdx + count);
408
+ const posts = mapRawPosts(window);
409
+ // Determine next cursor (index-based offset)
410
+ const hasMore = startIdx + count < allPosts.length;
411
+ const nextCursor = hasMore ? startIdx + count : null;
412
+ await gaussianDelay(800, 300, 300, 1_800); // Post-action dwell
413
+ return { query: input.query, posts, nextCursor };
215
414
  }
216
415
  finally {
217
416
  client.disconnect();
@@ -1 +1 @@
1
- {"version":3,"file":"search-posts.js","sourceRoot":"","sources":["../../src/operations/search-posts.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"search-posts.js","sourceRoot":"","sources":["../../src/operations/search-posts.ts"],"names":[],"mappings":"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"}