@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,9 +1,12 @@
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, humanizedScrollY, retryInteraction } from "../linkedin/dom-automation.js";
9
+ import { mapRawPosts, scrollFeed, delay, } from "./get-feed.js";
7
10
  /** Regex to extract the public ID from a LinkedIn profile URL. */
8
11
  const LINKEDIN_PROFILE_RE = /linkedin\.com\/in\/([^/?#]+)/;
9
12
  /**
@@ -28,95 +31,215 @@ export function extractProfileId(input) {
28
31
  "Expected a LinkedIn profile URL (https://www.linkedin.com/in/<id>) or a bare public ID.");
29
32
  }
30
33
  // ---------------------------------------------------------------------------
31
- // Response parsing
34
+ // Activity-page-specific DOM scraping
32
35
  // ---------------------------------------------------------------------------
33
36
  /**
34
- * Resolve a headline value that may be a string or an object with a `text` field.
37
+ * JavaScript evaluated inside the LinkedIn profile activity page.
38
+ *
39
+ * The activity page uses Ember.js rendering with `div[role="article"]`
40
+ * containers and stable class names (unlike the SSR main feed).
41
+ * Each post has a three-dot menu button matching
42
+ * `button[aria-label^="Open control menu"]`.
35
43
  */
36
- function resolveText(value) {
37
- if (value === undefined || value === null)
38
- return null;
39
- if (typeof value === "string")
40
- return value;
41
- return value.text ?? null;
42
- }
44
+ const SCRAPE_ACTIVITY_POSTS_SCRIPT = `(() => {
45
+ const posts = [];
46
+
47
+ const articles = document.querySelectorAll('div[role="article"]');
48
+ for (const item of articles) {
49
+ if (item.offsetHeight < 100) continue;
50
+
51
+ const menuBtn = item.querySelector('button[aria-label^="Open control menu"]');
52
+ if (!menuBtn) continue;
53
+
54
+ // --- Author info ---
55
+ let authorName = null;
56
+ let authorHeadline = null;
57
+ let authorProfileUrl = null;
58
+
59
+ const authorLink = item.querySelector('a[href*="/in/"], a[href*="/company/"]');
60
+ if (authorLink) {
61
+ authorProfileUrl = authorLink.href.split('?')[0] || null;
62
+ const nameEl = authorLink.querySelector('span[dir="ltr"], span[aria-hidden="true"]')
63
+ || authorLink;
64
+ const rawName = (nameEl.textContent || '').trim();
65
+ authorName = rawName || null;
66
+ }
67
+
68
+ const allSpans = item.querySelectorAll('span');
69
+ for (const span of allSpans) {
70
+ const txt = (span.textContent || '').trim();
71
+ if (
72
+ txt &&
73
+ txt.length > 5 &&
74
+ txt.length < 200 &&
75
+ txt !== authorName &&
76
+ !txt.match(/^\\d+[smhdw]$/) &&
77
+ !txt.match(/^\\d[\\d,]*\\s+(reactions?|comments?|reposts?|likes?)$/i) &&
78
+ !txt.match(/^Follow$|^Promoted$/i)
79
+ ) {
80
+ authorHeadline = txt;
81
+ break;
82
+ }
83
+ }
84
+
85
+ // --- Post text ---
86
+ let text = null;
87
+ const ltrSpans = item.querySelectorAll('span[dir="ltr"]');
88
+ let longestText = '';
89
+ for (const span of ltrSpans) {
90
+ const txt = (span.textContent || '').trim();
91
+ if (txt.length > longestText.length && txt !== authorName && txt !== authorHeadline) {
92
+ longestText = txt;
93
+ }
94
+ }
95
+ if (longestText.length > 20) {
96
+ text = longestText;
97
+ }
98
+
99
+ // --- Media type ---
100
+ let mediaType = null;
101
+ if (item.querySelector('video')) {
102
+ mediaType = 'video';
103
+ } else if (item.querySelector('img[src*="media.licdn.com"]')) {
104
+ const imgs = item.querySelectorAll('img[src*="media.licdn.com"]');
105
+ for (const img of imgs) {
106
+ if (img.offsetHeight > 100) { mediaType = 'image'; break; }
107
+ }
108
+ }
109
+
110
+ // --- Engagement counts ---
111
+ const itemText = item.textContent || '';
112
+
113
+ function parseCount(pattern) {
114
+ const m = itemText.match(pattern);
115
+ if (!m) return 0;
116
+ const raw = m[1].replace(/,/g, '');
117
+ const num = parseInt(raw, 10);
118
+ return isNaN(num) ? 0 : num;
119
+ }
120
+
121
+ const reactionCount = parseCount(/(\\d[\\d,]*)\\s+reactions?/i);
122
+ const commentCount = parseCount(/(\\d[\\d,]*)\\s+comments?/i);
123
+ const shareCount = parseCount(/(\\d[\\d,]*)\\s+reposts?/i);
124
+
125
+ // --- Timestamp ---
126
+ let timestamp = null;
127
+ const timeEl = item.querySelector('time');
128
+ if (timeEl) {
129
+ const dt = timeEl.getAttribute('datetime');
130
+ if (dt) timestamp = dt;
131
+ }
132
+ if (!timestamp) {
133
+ const timeMatch = itemText.match(/(?:^|\\s)(\\d+[smhdw])(?:\\s|$|\\u00B7|\\xB7)/);
134
+ if (timeMatch) timestamp = timeMatch[1];
135
+ }
136
+
137
+ posts.push({
138
+ url: null,
139
+ authorName: authorName,
140
+ authorHeadline: authorHeadline,
141
+ authorProfileUrl: authorProfileUrl,
142
+ text: text,
143
+ mediaType: mediaType,
144
+ reactionCount: reactionCount,
145
+ commentCount: commentCount,
146
+ shareCount: shareCount,
147
+ timestamp: timestamp,
148
+ });
149
+ }
150
+
151
+ return posts;
152
+ })()`;
43
153
  /**
44
- * Build a lookup map of included mini-profile entities by URN.
154
+ * Wait for the profile activity page to render posts.
155
+ * Polls for `div[role="article"]` elements with menu buttons.
45
156
  */
46
- function buildProfileLookup(included) {
47
- const map = new Map();
48
- for (const entity of included) {
49
- if (entity.entityUrn) {
50
- map.set(entity.entityUrn, entity);
157
+ async function waitForActivityLoad(client, timeoutMs = 15_000) {
158
+ const deadline = Date.now() + timeoutMs;
159
+ while (Date.now() < deadline) {
160
+ const ready = await client.evaluate(`(() => {
161
+ const articles = document.querySelectorAll('div[role="article"]');
162
+ for (const a of articles) {
163
+ if (a.querySelector('button[aria-label^="Open control menu"]')) {
164
+ return true;
51
165
  }
166
+ }
167
+ return false;
168
+ })()`);
169
+ if (ready)
170
+ return;
171
+ await delay(500);
52
172
  }
53
- return map;
173
+ throw new Error("Timed out waiting for activity posts to appear in the DOM");
54
174
  }
175
+ /** CSS selector for activity post menu buttons. */
176
+ const ACTIVITY_MENU_BUTTON_SELECTOR = 'div[role="article"] button[aria-label^="Open control menu"]';
55
177
  /**
56
- * Parse the Voyager profile-updates response into normalised FeedPost entries.
178
+ * Capture the post URL for a single activity post by opening its
179
+ * three-dot menu and clicking "Copy link to post".
57
180
  *
58
- * @internal Exported for testing only.
181
+ * Requires the clipboard interceptor to be installed beforehand.
182
+ *
183
+ * @returns The post URL (query params stripped) or `null` if capture failed.
59
184
  */
60
- export function parseProfileUpdatesResponse(raw) {
61
- const elements = raw.data?.elements ?? raw.elements ?? [];
62
- const paging = raw.data?.paging ?? raw.paging;
63
- const included = raw.included ?? [];
64
- const profilesByUrn = buildProfileLookup(included);
65
- const posts = [];
66
- for (const el of elements) {
67
- const urn = el.updateMetadata?.urn ?? el.urn;
68
- if (!urn)
69
- continue;
70
- // Resolve text — primary commentary, fall back to reshared
71
- const text = resolveText(el.commentary?.text) ??
72
- resolveText(el.resharedUpdate?.commentary?.text) ??
73
- null;
74
- // Resolve author info — inline actor or included entity lookup
75
- let authorName = resolveText(el.actor?.name) ?? null;
76
- let authorPublicId = el.actor?.publicIdentifier ?? null;
77
- let authorHeadline = resolveText(el.actor?.description) ?? null;
78
- if (authorName === null) {
79
- const actorUrn = el.actor?.urn ?? el.actor?.["*miniProfile"];
80
- if (actorUrn) {
81
- const profile = profilesByUrn.get(actorUrn);
82
- if (profile) {
83
- authorName = [profile.firstName, profile.lastName]
84
- .filter(Boolean)
85
- .join(" ") || null;
86
- authorPublicId = profile.publicIdentifier ?? null;
87
- authorHeadline =
88
- resolveText(profile.headline) ?? profile.occupation ?? null;
89
- }
90
- }
185
+ async function captureActivityPostUrl(client, postIndex, mouse) {
186
+ const MAX_ATTEMPTS = 3;
187
+ for (let attempt = 0; attempt < MAX_ATTEMPTS; attempt++) {
188
+ await maybeHesitate(); // Probabilistic pause before menu interaction
189
+ // Reset clipboard capture
190
+ await client.evaluate(`window.__capturedClipboard = null;`);
191
+ // Scroll the menu button into view (humanized when mouse available)
192
+ await humanizedScrollToByIndex(client, ACTIVITY_MENU_BUTTON_SELECTOR, postIndex, mouse);
193
+ // Click the menu button
194
+ const clicked = await client.evaluate(`(() => {
195
+ const btns = document.querySelectorAll(
196
+ ${JSON.stringify(ACTIVITY_MENU_BUTTON_SELECTOR)}
197
+ );
198
+ const btn = btns[${postIndex}];
199
+ if (!btn) return false;
200
+ btn.click();
201
+ return true;
202
+ })()`);
203
+ if (!clicked)
204
+ return null; // No menu button — structural, retrying won't help
205
+ await gaussianDelay(700, 100, 500, 900);
206
+ // Click "Copy link to post" menu item
207
+ await client.evaluate(`(() => {
208
+ for (const el of document.querySelectorAll('[role="menuitem"]')) {
209
+ if (el.textContent.trim() === 'Copy link to post') {
210
+ el.click();
211
+ return;
91
212
  }
92
- // Build post URL from share URL or URN
93
- const url = el.updateMetadata?.shareUrl ?? null;
94
- // Social counts
95
- const counts = el.socialDetail?.totalSocialActivityCounts;
96
- posts.push({
97
- urn,
98
- url,
99
- authorName,
100
- authorHeadline,
101
- authorProfileUrl: null,
102
- authorPublicId,
103
- text,
104
- mediaType: null,
105
- reactionCount: counts?.numLikes ?? 0,
106
- commentCount: counts?.numComments ?? 0,
107
- shareCount: counts?.numShares ?? 0,
108
- timestamp: el.publishedAt ?? null,
109
- hashtags: [],
110
- });
111
- }
112
- return {
113
- posts,
114
- paging: {
115
- start: paging?.start ?? 0,
116
- count: paging?.count ?? posts.length,
117
- total: paging?.total ?? posts.length,
118
- },
119
- };
213
+ }
214
+ })()`);
215
+ await gaussianDelay(550, 75, 400, 700);
216
+ // Read captured URL
217
+ const postUrl = await client.evaluate(`window.__capturedClipboard`);
218
+ if (postUrl) {
219
+ // Strip query parameters
220
+ return postUrl.split("?")[0] ?? postUrl;
221
+ }
222
+ // Dismiss any open menu before retrying
223
+ await client.evaluate(`(() => {
224
+ document.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape', bubbles: true }));
225
+ })()`);
226
+ // Escalating retry delays: longer waits on later attempts
227
+ const retryDelays = [
228
+ { mean: 700, stdDev: 200 },
229
+ { mean: 1_200, stdDev: 400 },
230
+ { mean: 2_500, stdDev: 800 },
231
+ ];
232
+ const rd = retryDelays[attempt] ?? retryDelays[2];
233
+ await gaussianDelay(rd.mean, rd.stdDev, rd.mean * 0.5, rd.mean * 1.5);
234
+ // 50% chance of a small "confusion" scroll to reset visual state
235
+ if (Math.random() < 0.5) {
236
+ const scrollDist = Math.round(gaussianBetween(75, 15, 50, 100));
237
+ const dir = Math.random() < 0.5 ? -1 : 1;
238
+ await humanizedScrollY(client, scrollDist * dir, 300, 400, mouse);
239
+ await gaussianDelay(300, 100, 150, 500);
240
+ }
241
+ }
242
+ return null;
120
243
  }
121
244
  // ---------------------------------------------------------------------------
122
245
  // Main operation
@@ -124,19 +247,20 @@ export function parseProfileUpdatesResponse(raw) {
124
247
  /**
125
248
  * Retrieve recent posts/activity from a LinkedIn profile.
126
249
  *
127
- * Connects to the LinkedIn webview in LinkedHelper and calls the
128
- * Voyager identity/profileUpdates API to get the profile's recent
129
- * posts with engagement counts.
250
+ * Navigates to the profile's activity page and extracts posts from the
251
+ * rendered DOM. The activity page uses Ember.js rendering with
252
+ * `div[role="article"]` containers (different from the SSR main feed).
253
+ * Supports cursor-based pagination via scrolling.
130
254
  *
131
255
  * @param input - Profile identifier, pagination, and CDP connection options.
132
- * @returns List of posts with pagination metadata.
256
+ * @returns List of posts with a cursor for the next page.
133
257
  */
134
258
  export async function getProfileActivity(input) {
135
- const cdpPort = input.cdpPort ?? DEFAULT_CDP_PORT;
259
+ const cdpPort = await resolveInstancePort(input.cdpPort, input.cdpHost);
136
260
  const cdpHost = input.cdpHost ?? "127.0.0.1";
137
261
  const allowRemote = input.allowRemote ?? false;
138
- const count = input.count ?? 20;
139
- const start = input.start ?? 0;
262
+ const count = input.count ?? 10;
263
+ const cursor = input.cursor ?? null;
140
264
  const profilePublicId = extractProfileId(input.profile);
141
265
  // Enforce loopback guard
142
266
  if (!allowRemote && cdpHost !== "127.0.0.1" && cdpHost !== "localhost") {
@@ -152,27 +276,103 @@ export async function getProfileActivity(input) {
152
276
  const client = new CDPClient(cdpPort, { host: cdpHost, allowRemote });
153
277
  await client.connect(linkedInTarget.id);
154
278
  try {
155
- const voyager = new VoyagerInterceptor(client);
156
- const encodedId = encodeURIComponent(profilePublicId);
157
- const profileUrn = `urn:li:fsd_profile:${encodedId}`;
158
- const encodedUrn = encodeURIComponent(profileUrn);
159
- const path = `/voyager/api/identity/dash/profileUpdates` +
160
- `?q=memberShareFeed&profileUrn=${encodedUrn}` +
161
- `&start=${String(start)}&count=${String(count)}`;
162
- const response = await voyager.fetch(path);
163
- if (response.status !== 200) {
164
- throw new Error(`Voyager API returned HTTP ${String(response.status)} for profile activity`);
279
+ // Navigate away if already on the activity page to force a fresh load
280
+ await navigateAwayIf(client, "/recent-activity/");
281
+ const activityUrl = `https://www.linkedin.com/in/${encodeURIComponent(profilePublicId)}/recent-activity/all/`;
282
+ await client.navigate(activityUrl);
283
+ // Wait for activity posts to render
284
+ await waitForActivityLoad(client);
285
+ const mouse = input.mouse ?? null;
286
+ // Collect posts scroll to load more if needed
287
+ const maxScrollAttempts = 10;
288
+ let allPosts = [];
289
+ let previousCount = 0;
290
+ const cursorUrl = cursor;
291
+ for (let scroll = 0; scroll <= maxScrollAttempts; scroll++) {
292
+ const countBeforeScroll = previousCount;
293
+ const scraped = await client.evaluate(SCRAPE_ACTIVITY_POSTS_SCRIPT);
294
+ allPosts = scraped ?? [];
295
+ const available = allPosts.length;
296
+ if (available >= count && !cursorUrl)
297
+ break;
298
+ // No new posts appeared after scroll — stop
299
+ if (allPosts.length === previousCount && scroll > 0)
300
+ break;
301
+ previousCount = allPosts.length;
302
+ // Scroll to load more
303
+ if (scroll < maxScrollAttempts) {
304
+ await scrollFeed(client, mouse);
305
+ // Progressive session fatigue: delays increase with each scroll
306
+ const fatigueMultiplier = 1 + scroll * 0.1;
307
+ // Scale delay by newly visible content volume
308
+ const newPostCount = allPosts.length - countBeforeScroll;
309
+ const contentBonus = Math.min(newPostCount * gaussianBetween(350, 75, 200, 500), 3_000);
310
+ await gaussianDelay(1_500 * fatigueMultiplier + contentBonus, 150 * fatigueMultiplier, 1_200 * fatigueMultiplier + contentBonus, 1_800 * fatigueMultiplier + contentBonus);
311
+ // Reading simulation: pause proportional to visible content volume.
312
+ // Estimate ~300 chars per newly visible post (headline + snippet).
313
+ if (newPostCount > 0) {
314
+ await simulateReadingTime(newPostCount * 300);
315
+ }
316
+ await maybeBreak();
317
+ }
318
+ }
319
+ // --- URL extraction phase ---
320
+ // Install clipboard interceptor (Electron's clipboard API is broken)
321
+ await client.evaluate(`navigator.clipboard.writeText = function(text) {
322
+ window.__capturedClipboard = text;
323
+ return Promise.resolve();
324
+ };`);
325
+ // Determine result window start before URL extraction
326
+ let startIdx = 0;
327
+ if (cursorUrl) {
328
+ // Extract URLs to locate cursor position
329
+ for (let i = 0; i < allPosts.length; i++) {
330
+ const post = allPosts[i];
331
+ if (!post)
332
+ continue;
333
+ if (i > 0)
334
+ await gaussianDelay(550, 125, 300, 800);
335
+ await maybeBreak();
336
+ const url = await retryInteraction(() => captureActivityPostUrl(client, i, mouse));
337
+ if (url) {
338
+ post.url = url;
339
+ if (url === cursorUrl) {
340
+ startIdx = i + 1;
341
+ break;
342
+ }
343
+ }
344
+ }
345
+ }
346
+ // Only extract URLs for posts in the returned window
347
+ const windowEnd = Math.min(startIdx + count, allPosts.length);
348
+ for (let i = startIdx; i < windowEnd; i++) {
349
+ const post = allPosts[i];
350
+ if (!post || post.url)
351
+ continue;
352
+ if (i > startIdx)
353
+ await gaussianDelay(550, 125, 300, 800);
354
+ await maybeBreak();
355
+ const url = await retryInteraction(() => captureActivityPostUrl(client, i, mouse));
356
+ if (url) {
357
+ post.url = url;
358
+ }
165
359
  }
166
- const body = response.body;
167
- if (body === null || typeof body !== "object") {
168
- throw new Error("Voyager API returned an unexpected response format for profile activity");
360
+ const window = allPosts.slice(startIdx, startIdx + count);
361
+ const posts = mapRawPosts(window);
362
+ // Determine next cursor use last post with a non-null URL
363
+ const hasMore = startIdx + count < allPosts.length;
364
+ let nextCursor = null;
365
+ if (hasMore) {
366
+ for (let i = window.length - 1; i >= 0; i--) {
367
+ const url = window[i]?.url;
368
+ if (url) {
369
+ nextCursor = url;
370
+ break;
371
+ }
372
+ }
169
373
  }
170
- const parsed = parseProfileUpdatesResponse(body);
171
- return {
172
- profilePublicId,
173
- posts: parsed.posts,
174
- paging: parsed.paging,
175
- };
374
+ await gaussianDelay(800, 300, 300, 1_800); // Post-action dwell
375
+ return { profilePublicId, posts, nextCursor };
176
376
  }
177
377
  finally {
178
378
  client.disconnect();
@@ -1 +1 @@
1
- {"version":3,"file":"get-profile-activity.js","sourceRoot":"","sources":["../../src/operations/get-profile-activity.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"get-profile-activity.js","sourceRoot":"","sources":["../../src/operations/get-profile-activity.ts"],"names":[],"mappings":"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"}