@lhremote/core 0.6.0 → 0.8.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 (356) hide show
  1. package/README.md +39 -0
  2. package/dist/cdp/client.d.ts +5 -1
  3. package/dist/cdp/client.d.ts.map +1 -1
  4. package/dist/cdp/client.js +11 -3
  5. package/dist/cdp/client.js.map +1 -1
  6. package/dist/data/index.d.ts +1 -0
  7. package/dist/data/index.d.ts.map +1 -1
  8. package/dist/data/index.js +1 -0
  9. package/dist/data/index.js.map +1 -1
  10. package/dist/data/linkedin-reference.d.ts +44 -0
  11. package/dist/data/linkedin-reference.d.ts.map +1 -0
  12. package/dist/data/linkedin-reference.js +316 -0
  13. package/dist/data/linkedin-reference.js.map +1 -0
  14. package/dist/data/linkedin-reference.test.d.ts +2 -0
  15. package/dist/data/linkedin-reference.test.d.ts.map +1 -0
  16. package/dist/data/linkedin-reference.test.js +124 -0
  17. package/dist/data/linkedin-reference.test.js.map +1 -0
  18. package/dist/db/index.d.ts +1 -1
  19. package/dist/db/index.d.ts.map +1 -1
  20. package/dist/db/index.js +1 -1
  21. package/dist/db/index.js.map +1 -1
  22. package/dist/db/repositories/action-budget.d.ts +29 -0
  23. package/dist/db/repositories/action-budget.d.ts.map +1 -0
  24. package/dist/db/repositories/action-budget.js +100 -0
  25. package/dist/db/repositories/action-budget.js.map +1 -0
  26. package/dist/db/repositories/action-budget.test.d.ts +2 -0
  27. package/dist/db/repositories/action-budget.test.d.ts.map +1 -0
  28. package/dist/db/repositories/action-budget.test.js +181 -0
  29. package/dist/db/repositories/action-budget.test.js.map +1 -0
  30. package/dist/db/repositories/campaign-hard-delete.integration.test.d.ts +2 -0
  31. package/dist/db/repositories/campaign-hard-delete.integration.test.d.ts.map +1 -0
  32. package/dist/db/repositories/campaign-hard-delete.integration.test.js +78 -0
  33. package/dist/db/repositories/campaign-hard-delete.integration.test.js.map +1 -0
  34. package/dist/db/repositories/campaign.d.ts +14 -0
  35. package/dist/db/repositories/campaign.d.ts.map +1 -1
  36. package/dist/db/repositories/campaign.js +125 -0
  37. package/dist/db/repositories/campaign.js.map +1 -1
  38. package/dist/db/repositories/index.d.ts +1 -0
  39. package/dist/db/repositories/index.d.ts.map +1 -1
  40. package/dist/db/repositories/index.js +1 -0
  41. package/dist/db/repositories/index.js.map +1 -1
  42. package/dist/index.d.ts +6 -5
  43. package/dist/index.d.ts.map +1 -1
  44. package/dist/index.js +28 -6
  45. package/dist/index.js.map +1 -1
  46. package/dist/linkedin/__tests__/dom-automation.integration.test.d.ts +2 -0
  47. package/dist/linkedin/__tests__/dom-automation.integration.test.d.ts.map +1 -0
  48. package/dist/linkedin/__tests__/dom-automation.integration.test.js +160 -0
  49. package/dist/linkedin/__tests__/dom-automation.integration.test.js.map +1 -0
  50. package/dist/linkedin/__tests__/selectors.integration.test.d.ts +2 -0
  51. package/dist/linkedin/__tests__/selectors.integration.test.d.ts.map +1 -0
  52. package/dist/linkedin/__tests__/selectors.integration.test.js +258 -0
  53. package/dist/linkedin/__tests__/selectors.integration.test.js.map +1 -0
  54. package/dist/linkedin/dom-automation.d.ts +67 -0
  55. package/dist/linkedin/dom-automation.d.ts.map +1 -0
  56. package/dist/linkedin/dom-automation.js +139 -0
  57. package/dist/linkedin/dom-automation.js.map +1 -0
  58. package/dist/linkedin/index.d.ts +3 -0
  59. package/dist/linkedin/index.d.ts.map +1 -0
  60. package/dist/linkedin/index.js +5 -0
  61. package/dist/linkedin/index.js.map +1 -0
  62. package/dist/linkedin/selectors.d.ts +67 -0
  63. package/dist/linkedin/selectors.d.ts.map +1 -0
  64. package/dist/linkedin/selectors.js +74 -0
  65. package/dist/linkedin/selectors.js.map +1 -0
  66. package/dist/operations/build-linkedin-url.d.ts +39 -0
  67. package/dist/operations/build-linkedin-url.d.ts.map +1 -0
  68. package/dist/operations/build-linkedin-url.js +72 -0
  69. package/dist/operations/build-linkedin-url.js.map +1 -0
  70. package/dist/operations/campaign-delete.d.ts +6 -2
  71. package/dist/operations/campaign-delete.d.ts.map +1 -1
  72. package/dist/operations/campaign-delete.js +9 -2
  73. package/dist/operations/campaign-delete.js.map +1 -1
  74. package/dist/operations/campaign-delete.test.js +41 -1
  75. package/dist/operations/campaign-delete.test.js.map +1 -1
  76. package/dist/operations/campaign-erase.d.ts +19 -0
  77. package/dist/operations/campaign-erase.d.ts.map +1 -0
  78. package/dist/operations/campaign-erase.js +22 -0
  79. package/dist/operations/campaign-erase.js.map +1 -0
  80. package/dist/operations/campaign-erase.test.d.ts +2 -0
  81. package/dist/operations/campaign-erase.test.d.ts.map +1 -0
  82. package/dist/operations/campaign-erase.test.js +101 -0
  83. package/dist/operations/campaign-erase.test.js.map +1 -0
  84. package/dist/operations/comment-on-post.d.ts +34 -0
  85. package/dist/operations/comment-on-post.d.ts.map +1 -0
  86. package/dist/operations/comment-on-post.js +108 -0
  87. package/dist/operations/comment-on-post.js.map +1 -0
  88. package/dist/operations/comment-on-post.test.d.ts +2 -0
  89. package/dist/operations/comment-on-post.test.d.ts.map +1 -0
  90. package/dist/operations/comment-on-post.test.js +240 -0
  91. package/dist/operations/comment-on-post.test.js.map +1 -0
  92. package/dist/operations/dismiss-errors.d.ts +22 -0
  93. package/dist/operations/dismiss-errors.d.ts.map +1 -0
  94. package/dist/operations/dismiss-errors.js +55 -0
  95. package/dist/operations/dismiss-errors.js.map +1 -0
  96. package/dist/operations/dismiss-errors.test.d.ts +2 -0
  97. package/dist/operations/dismiss-errors.test.d.ts.map +1 -0
  98. package/dist/operations/dismiss-errors.test.js +136 -0
  99. package/dist/operations/dismiss-errors.test.js.map +1 -0
  100. package/dist/operations/endorse-skills.d.ts +10 -0
  101. package/dist/operations/endorse-skills.d.ts.map +1 -0
  102. package/dist/operations/endorse-skills.js +12 -0
  103. package/dist/operations/endorse-skills.js.map +1 -0
  104. package/dist/operations/enrich-profile.d.ts +18 -0
  105. package/dist/operations/enrich-profile.d.ts.map +1 -0
  106. package/dist/operations/enrich-profile.js +15 -0
  107. package/dist/operations/enrich-profile.js.map +1 -0
  108. package/dist/operations/ephemeral-action.d.ts +22 -0
  109. package/dist/operations/ephemeral-action.d.ts.map +1 -0
  110. package/dist/operations/ephemeral-action.js +31 -0
  111. package/dist/operations/ephemeral-action.js.map +1 -0
  112. package/dist/operations/follow-person.d.ts +9 -0
  113. package/dist/operations/follow-person.d.ts.map +1 -0
  114. package/dist/operations/follow-person.js +11 -0
  115. package/dist/operations/follow-person.js.map +1 -0
  116. package/dist/operations/get-action-budget.d.ts +6 -0
  117. package/dist/operations/get-action-budget.d.ts.map +1 -0
  118. package/dist/operations/get-action-budget.js +22 -0
  119. package/dist/operations/get-action-budget.js.map +1 -0
  120. package/dist/operations/get-action-budget.test.d.ts +2 -0
  121. package/dist/operations/get-action-budget.test.d.ts.map +1 -0
  122. package/dist/operations/get-action-budget.test.js +79 -0
  123. package/dist/operations/get-action-budget.test.js.map +1 -0
  124. package/dist/operations/get-errors.d.ts +9 -3
  125. package/dist/operations/get-errors.d.ts.map +1 -1
  126. package/dist/operations/get-errors.js +41 -4
  127. package/dist/operations/get-errors.js.map +1 -1
  128. package/dist/operations/get-errors.test.js +108 -42
  129. package/dist/operations/get-errors.test.js.map +1 -1
  130. package/dist/operations/get-feed.d.ts +33 -0
  131. package/dist/operations/get-feed.d.ts.map +1 -0
  132. package/dist/operations/get-feed.js +220 -0
  133. package/dist/operations/get-feed.js.map +1 -0
  134. package/dist/operations/get-feed.test.d.ts +2 -0
  135. package/dist/operations/get-feed.test.d.ts.map +1 -0
  136. package/dist/operations/get-feed.test.js +276 -0
  137. package/dist/operations/get-feed.test.js.map +1 -0
  138. package/dist/operations/get-post-engagers.d.ts +40 -0
  139. package/dist/operations/get-post-engagers.d.ts.map +1 -0
  140. package/dist/operations/get-post-engagers.js +128 -0
  141. package/dist/operations/get-post-engagers.js.map +1 -0
  142. package/dist/operations/get-post-engagers.test.d.ts +2 -0
  143. package/dist/operations/get-post-engagers.test.d.ts.map +1 -0
  144. package/dist/operations/get-post-engagers.test.js +19 -0
  145. package/dist/operations/get-post-engagers.test.js.map +1 -0
  146. package/dist/operations/get-post-stats.d.ts +38 -0
  147. package/dist/operations/get-post-stats.d.ts.map +1 -0
  148. package/dist/operations/get-post-stats.js +100 -0
  149. package/dist/operations/get-post-stats.js.map +1 -0
  150. package/dist/operations/get-post-stats.test.d.ts +2 -0
  151. package/dist/operations/get-post-stats.test.d.ts.map +1 -0
  152. package/dist/operations/get-post-stats.test.js +34 -0
  153. package/dist/operations/get-post-stats.test.js.map +1 -0
  154. package/dist/operations/get-post.d.ts +183 -0
  155. package/dist/operations/get-post.d.ts.map +1 -0
  156. package/dist/operations/get-post.js +270 -0
  157. package/dist/operations/get-post.js.map +1 -0
  158. package/dist/operations/get-post.test.d.ts +2 -0
  159. package/dist/operations/get-post.test.d.ts.map +1 -0
  160. package/dist/operations/get-post.test.js +449 -0
  161. package/dist/operations/get-post.test.js.map +1 -0
  162. package/dist/operations/get-profile-activity.d.ts +129 -0
  163. package/dist/operations/get-profile-activity.d.ts.map +1 -0
  164. package/dist/operations/get-profile-activity.js +181 -0
  165. package/dist/operations/get-profile-activity.js.map +1 -0
  166. package/dist/operations/get-profile-activity.test.d.ts +2 -0
  167. package/dist/operations/get-profile-activity.test.d.ts.map +1 -0
  168. package/dist/operations/get-profile-activity.test.js +205 -0
  169. package/dist/operations/get-profile-activity.test.js.map +1 -0
  170. package/dist/operations/get-throttle-status.d.ts +6 -0
  171. package/dist/operations/get-throttle-status.d.ts.map +1 -0
  172. package/dist/operations/get-throttle-status.js +30 -0
  173. package/dist/operations/get-throttle-status.js.map +1 -0
  174. package/dist/operations/get-throttle-status.test.d.ts +2 -0
  175. package/dist/operations/get-throttle-status.test.d.ts.map +1 -0
  176. package/dist/operations/get-throttle-status.test.js +62 -0
  177. package/dist/operations/get-throttle-status.test.js.map +1 -0
  178. package/dist/operations/index.d.ts +24 -0
  179. package/dist/operations/index.d.ts.map +1 -1
  180. package/dist/operations/index.js +35 -0
  181. package/dist/operations/index.js.map +1 -1
  182. package/dist/operations/like-person-posts.d.ts +14 -0
  183. package/dist/operations/like-person-posts.d.ts.map +1 -0
  184. package/dist/operations/like-person-posts.js +28 -0
  185. package/dist/operations/like-person-posts.js.map +1 -0
  186. package/dist/operations/message-person.d.ts +11 -0
  187. package/dist/operations/message-person.d.ts.map +1 -0
  188. package/dist/operations/message-person.js +19 -0
  189. package/dist/operations/message-person.js.map +1 -0
  190. package/dist/operations/react-to-post.d.ts +38 -0
  191. package/dist/operations/react-to-post.d.ts.map +1 -0
  192. package/dist/operations/react-to-post.js +82 -0
  193. package/dist/operations/react-to-post.js.map +1 -0
  194. package/dist/operations/react-to-post.test.d.ts +2 -0
  195. package/dist/operations/react-to-post.test.d.ts.map +1 -0
  196. package/dist/operations/react-to-post.test.js +154 -0
  197. package/dist/operations/react-to-post.test.js.map +1 -0
  198. package/dist/operations/remove-connection.d.ts +6 -0
  199. package/dist/operations/remove-connection.d.ts.map +1 -0
  200. package/dist/operations/remove-connection.js +7 -0
  201. package/dist/operations/remove-connection.js.map +1 -0
  202. package/dist/operations/resolve-linkedin-entity.d.ts +33 -0
  203. package/dist/operations/resolve-linkedin-entity.d.ts.map +1 -0
  204. package/dist/operations/resolve-linkedin-entity.js +198 -0
  205. package/dist/operations/resolve-linkedin-entity.js.map +1 -0
  206. package/dist/operations/search-posts.d.ts +143 -0
  207. package/dist/operations/search-posts.d.ts.map +1 -0
  208. package/dist/operations/search-posts.js +220 -0
  209. package/dist/operations/search-posts.js.map +1 -0
  210. package/dist/operations/search-posts.test.d.ts +2 -0
  211. package/dist/operations/search-posts.test.d.ts.map +1 -0
  212. package/dist/operations/search-posts.test.js +261 -0
  213. package/dist/operations/search-posts.test.js.map +1 -0
  214. package/dist/operations/send-inmail.d.ts +11 -0
  215. package/dist/operations/send-inmail.d.ts.map +1 -0
  216. package/dist/operations/send-inmail.js +19 -0
  217. package/dist/operations/send-inmail.js.map +1 -0
  218. package/dist/operations/send-invite.d.ts +9 -0
  219. package/dist/operations/send-invite.d.ts.map +1 -0
  220. package/dist/operations/send-invite.js +14 -0
  221. package/dist/operations/send-invite.js.map +1 -0
  222. package/dist/operations/visit-profile.d.ts +14 -0
  223. package/dist/operations/visit-profile.d.ts.map +1 -0
  224. package/dist/operations/visit-profile.js +49 -0
  225. package/dist/operations/visit-profile.js.map +1 -0
  226. package/dist/operations/visit-profile.test.d.ts +2 -0
  227. package/dist/operations/visit-profile.test.d.ts.map +1 -0
  228. package/dist/operations/visit-profile.test.js +193 -0
  229. package/dist/operations/visit-profile.test.js.map +1 -0
  230. package/dist/services/app.d.ts.map +1 -1
  231. package/dist/services/app.js +37 -12
  232. package/dist/services/app.js.map +1 -1
  233. package/dist/services/app.test.js +57 -0
  234. package/dist/services/app.test.js.map +1 -1
  235. package/dist/services/boolean-expression.d.ts +29 -0
  236. package/dist/services/boolean-expression.d.ts.map +1 -0
  237. package/dist/services/boolean-expression.js +79 -0
  238. package/dist/services/boolean-expression.js.map +1 -0
  239. package/dist/services/boolean-expression.test.d.ts +2 -0
  240. package/dist/services/boolean-expression.test.d.ts.map +1 -0
  241. package/dist/services/boolean-expression.test.js +64 -0
  242. package/dist/services/boolean-expression.test.js.map +1 -0
  243. package/dist/services/campaign.d.ts +10 -0
  244. package/dist/services/campaign.d.ts.map +1 -1
  245. package/dist/services/campaign.js +16 -0
  246. package/dist/services/campaign.js.map +1 -1
  247. package/dist/services/collection.d.ts +5 -2
  248. package/dist/services/collection.d.ts.map +1 -1
  249. package/dist/services/collection.js +33 -5
  250. package/dist/services/collection.js.map +1 -1
  251. package/dist/services/collection.test.js +64 -6
  252. package/dist/services/collection.test.js.map +1 -1
  253. package/dist/services/ephemeral-campaign.d.ts +64 -0
  254. package/dist/services/ephemeral-campaign.d.ts.map +1 -0
  255. package/dist/services/ephemeral-campaign.js +210 -0
  256. package/dist/services/ephemeral-campaign.js.map +1 -0
  257. package/dist/services/ephemeral-campaign.test.d.ts +2 -0
  258. package/dist/services/ephemeral-campaign.test.d.ts.map +1 -0
  259. package/dist/services/ephemeral-campaign.test.js +333 -0
  260. package/dist/services/ephemeral-campaign.test.js.map +1 -0
  261. package/dist/services/errors.d.ts +21 -0
  262. package/dist/services/errors.d.ts.map +1 -1
  263. package/dist/services/errors.js +35 -0
  264. package/dist/services/errors.js.map +1 -1
  265. package/dist/services/index.d.ts +7 -1
  266. package/dist/services/index.d.ts.map +1 -1
  267. package/dist/services/index.js +7 -1
  268. package/dist/services/index.js.map +1 -1
  269. package/dist/services/instance-context.d.ts.map +1 -1
  270. package/dist/services/instance-context.js +9 -1
  271. package/dist/services/instance-context.js.map +1 -1
  272. package/dist/services/instance-context.test.js +77 -1
  273. package/dist/services/instance-context.test.js.map +1 -1
  274. package/dist/services/instance.d.ts +43 -0
  275. package/dist/services/instance.d.ts.map +1 -1
  276. package/dist/services/instance.js +151 -0
  277. package/dist/services/instance.js.map +1 -1
  278. package/dist/services/instance.test.js +101 -0
  279. package/dist/services/instance.test.js.map +1 -1
  280. package/dist/services/launcher.d.ts +23 -0
  281. package/dist/services/launcher.d.ts.map +1 -1
  282. package/dist/services/launcher.js +81 -11
  283. package/dist/services/launcher.js.map +1 -1
  284. package/dist/services/launcher.test.js +109 -42
  285. package/dist/services/launcher.test.js.map +1 -1
  286. package/dist/services/sn-url-builder.d.ts +21 -0
  287. package/dist/services/sn-url-builder.d.ts.map +1 -0
  288. package/dist/services/sn-url-builder.js +132 -0
  289. package/dist/services/sn-url-builder.js.map +1 -0
  290. package/dist/services/sn-url-builder.test.d.ts +2 -0
  291. package/dist/services/sn-url-builder.test.d.ts.map +1 -0
  292. package/dist/services/sn-url-builder.test.js +130 -0
  293. package/dist/services/sn-url-builder.test.js.map +1 -0
  294. package/dist/services/url-builder.d.ts +12 -0
  295. package/dist/services/url-builder.d.ts.map +1 -0
  296. package/dist/services/url-builder.js +100 -0
  297. package/dist/services/url-builder.js.map +1 -0
  298. package/dist/services/url-builder.test.d.ts +2 -0
  299. package/dist/services/url-builder.test.d.ts.map +1 -0
  300. package/dist/services/url-builder.test.js +79 -0
  301. package/dist/services/url-builder.test.js.map +1 -0
  302. package/dist/services/url-templates.d.ts +41 -0
  303. package/dist/services/url-templates.d.ts.map +1 -0
  304. package/dist/services/url-templates.js +118 -0
  305. package/dist/services/url-templates.js.map +1 -0
  306. package/dist/services/url-templates.test.d.ts +2 -0
  307. package/dist/services/url-templates.test.d.ts.map +1 -0
  308. package/dist/services/url-templates.test.js +159 -0
  309. package/dist/services/url-templates.test.js.map +1 -0
  310. package/dist/types/action-budget.d.ts +52 -0
  311. package/dist/types/action-budget.d.ts.map +1 -0
  312. package/dist/types/action-budget.js +4 -0
  313. package/dist/types/action-budget.js.map +1 -0
  314. package/dist/types/campaign.d.ts +24 -0
  315. package/dist/types/campaign.d.ts.map +1 -1
  316. package/dist/types/feed.d.ts +32 -0
  317. package/dist/types/feed.d.ts.map +1 -0
  318. package/dist/types/feed.js +4 -0
  319. package/dist/types/feed.js.map +1 -0
  320. package/dist/types/index.d.ts +8 -2
  321. package/dist/types/index.d.ts.map +1 -1
  322. package/dist/types/linkedin-url.d.ts +109 -0
  323. package/dist/types/linkedin-url.d.ts.map +1 -0
  324. package/dist/types/linkedin-url.js +4 -0
  325. package/dist/types/linkedin-url.js.map +1 -0
  326. package/dist/types/post-analytics.d.ts +40 -0
  327. package/dist/types/post-analytics.d.ts.map +1 -0
  328. package/dist/types/post-analytics.js +4 -0
  329. package/dist/types/post-analytics.js.map +1 -0
  330. package/dist/types/post.d.ts +43 -0
  331. package/dist/types/post.d.ts.map +1 -0
  332. package/dist/types/post.js +4 -0
  333. package/dist/types/post.js.map +1 -0
  334. package/dist/types/search-posts.d.ts +22 -0
  335. package/dist/types/search-posts.d.ts.map +1 -0
  336. package/dist/types/search-posts.js +4 -0
  337. package/dist/types/search-posts.js.map +1 -0
  338. package/dist/types/ui-health.d.ts +16 -0
  339. package/dist/types/ui-health.d.ts.map +1 -1
  340. package/dist/voyager/index.d.ts +2 -0
  341. package/dist/voyager/index.d.ts.map +1 -0
  342. package/dist/voyager/index.js +4 -0
  343. package/dist/voyager/index.js.map +1 -0
  344. package/dist/voyager/interceptor.d.ts +100 -0
  345. package/dist/voyager/interceptor.d.ts.map +1 -0
  346. package/dist/voyager/interceptor.integration.test.d.ts +2 -0
  347. package/dist/voyager/interceptor.integration.test.d.ts.map +1 -0
  348. package/dist/voyager/interceptor.integration.test.js +89 -0
  349. package/dist/voyager/interceptor.integration.test.js.map +1 -0
  350. package/dist/voyager/interceptor.js +235 -0
  351. package/dist/voyager/interceptor.js.map +1 -0
  352. package/dist/voyager/interceptor.test.d.ts +2 -0
  353. package/dist/voyager/interceptor.test.d.ts.map +1 -0
  354. package/dist/voyager/interceptor.test.js +372 -0
  355. package/dist/voyager/interceptor.test.js.map +1 -0
  356. package/package.json +1 -1
@@ -0,0 +1,198 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (C) 2026 Oleksii PELYKH
3
+ import { DEFAULT_CDP_PORT } from "../constants.js";
4
+ import { CDPClient } from "../cdp/client.js";
5
+ import { discoverTargets } from "../cdp/discovery.js";
6
+ /**
7
+ * Public typeahead endpoint (no auth required).
8
+ *
9
+ * Works for COMPANY and GEO entity types.
10
+ */
11
+ const PUBLIC_TYPEAHEAD_URL = "https://www.linkedin.com/jobs-guest/api/typeaheadHits";
12
+ /**
13
+ * Map our entity types to public typeahead's `typeaheadType` param.
14
+ */
15
+ const PUBLIC_TYPEAHEAD_TYPE = {
16
+ COMPANY: "COMPANY",
17
+ GEO: "GEO",
18
+ };
19
+ /**
20
+ * Map our entity types to Voyager's `type` param.
21
+ */
22
+ const VOYAGER_TYPE = {
23
+ COMPANY: "COMPANY",
24
+ GEO: "GEO",
25
+ SCHOOL: "SCHOOL",
26
+ };
27
+ /**
28
+ * Try the public typeahead endpoint first.
29
+ *
30
+ * @returns Matches, or `undefined` if the public endpoint is not
31
+ * available for this entity type or the request fails.
32
+ */
33
+ async function tryPublicTypeahead(query, entityType) {
34
+ const typeaheadType = PUBLIC_TYPEAHEAD_TYPE[entityType];
35
+ if (typeaheadType === undefined)
36
+ return undefined;
37
+ const url = new URL(PUBLIC_TYPEAHEAD_URL);
38
+ url.searchParams.set("typeaheadType", typeaheadType);
39
+ url.searchParams.set("query", query);
40
+ try {
41
+ const response = await fetch(url.toString(), {
42
+ headers: { Accept: "application/json" },
43
+ });
44
+ if (!response.ok)
45
+ return undefined;
46
+ const data = (await response.json());
47
+ return parsePublicTypeaheadResponse(data, entityType);
48
+ }
49
+ catch {
50
+ return undefined;
51
+ }
52
+ }
53
+ /**
54
+ * Parse the public typeahead response into normalised matches.
55
+ */
56
+ function parsePublicTypeaheadResponse(data, entityType) {
57
+ if (!data.elements)
58
+ return [];
59
+ return data.elements
60
+ .filter((el) => el.hitInfo?.id !== undefined)
61
+ .map((el) => ({
62
+ id: el.hitInfo.id,
63
+ name: el.hitInfo?.displayName ??
64
+ el.hitInfo?.companyName ??
65
+ el.hitInfo?.locationName ??
66
+ "",
67
+ type: entityType,
68
+ }))
69
+ .slice(0, 10);
70
+ }
71
+ /**
72
+ * Try the Voyager typeahead endpoint via CDP.
73
+ *
74
+ * Connects to the LinkedIn webview in LinkedHelper and executes
75
+ * the Voyager request from within the page context (which has
76
+ * the LinkedIn session cookies).
77
+ */
78
+ async function tryVoyagerTypeahead(query, entityType, cdpPort, cdpHost, allowRemote) {
79
+ // Enforce loopback guard before making any network requests
80
+ if (!allowRemote && cdpHost !== "127.0.0.1" && cdpHost !== "localhost") {
81
+ throw new Error(`Non-loopback CDP host "${cdpHost}" requires --allow-remote. ` +
82
+ "This is a security measure to prevent remote code execution.");
83
+ }
84
+ // Find the LinkedIn page target
85
+ const targets = await discoverTargets(cdpPort, cdpHost);
86
+ const linkedInTarget = targets.find((t) => t.type === "page" && t.url?.includes("linkedin.com"));
87
+ if (!linkedInTarget) {
88
+ throw new Error("No LinkedIn page found in LinkedHelper. " +
89
+ "Ensure LinkedHelper is running with an active LinkedIn session.");
90
+ }
91
+ const client = new CDPClient(cdpPort, {
92
+ host: cdpHost,
93
+ allowRemote,
94
+ });
95
+ await client.connect(linkedInTarget.id);
96
+ try {
97
+ // Execute the Voyager typeahead request from within the LinkedIn page
98
+ // context where session cookies are already available.
99
+ const voyagerType = VOYAGER_TYPE[entityType];
100
+ const result = await client.evaluate(`(async () => {
101
+ const params = new URLSearchParams({
102
+ type: ${JSON.stringify(voyagerType)},
103
+ keywords: ${JSON.stringify(query)},
104
+ q: "type",
105
+ origin: "OTHER",
106
+ });
107
+ const url = "https://www.linkedin.com/voyager/api/typeahead/hitsV2?" + params;
108
+
109
+ // Extract CSRF token from cookies. The JSESSIONID value is
110
+ // typically stored as "ajax:<token>" (with quotes); strip quotes
111
+ // and use as-is for the Csrf-Token header.
112
+ const jsessionid = document.cookie
113
+ .split(";")
114
+ .map(c => c.trim())
115
+ .find(c => c.startsWith("JSESSIONID="));
116
+ let csrfToken = jsessionid
117
+ ? jsessionid.substring(jsessionid.indexOf("=") + 1).replace(/"/g, "")
118
+ : "";
119
+ // Ensure "ajax:" prefix is present exactly once
120
+ if (!csrfToken.startsWith("ajax:")) {
121
+ csrfToken = "ajax:" + csrfToken;
122
+ }
123
+
124
+ const response = await fetch(url, {
125
+ headers: {
126
+ "Csrf-Token": csrfToken,
127
+ "X-RestLi-Protocol-Version": "2.0.0",
128
+ },
129
+ credentials: "include",
130
+ });
131
+
132
+ if (!response.ok) {
133
+ return { error: "HTTP " + response.status + ": " + response.statusText };
134
+ }
135
+
136
+ const data = await response.json();
137
+ return { data };
138
+ })()`, true);
139
+ if (result.error) {
140
+ throw new Error(`Voyager typeahead request failed: ${result.error}`);
141
+ }
142
+ return parseVoyagerResponse(result.data, entityType);
143
+ }
144
+ finally {
145
+ client.disconnect();
146
+ }
147
+ }
148
+ /**
149
+ * Parse the Voyager typeahead response into normalised matches.
150
+ */
151
+ function parseVoyagerResponse(data, entityType) {
152
+ if (!data?.elements)
153
+ return [];
154
+ return data.elements
155
+ .filter((el) => el.targetUrn !== undefined || el.trackingUrn !== undefined)
156
+ .map((el) => {
157
+ // Extract numeric ID from URN (e.g., "urn:li:organization:1441" → "1441")
158
+ const urn = el.targetUrn ?? el.trackingUrn ?? "";
159
+ const id = urn.split(":").pop() ?? urn;
160
+ return {
161
+ id,
162
+ name: el.title?.text ?? "",
163
+ type: entityType,
164
+ };
165
+ })
166
+ .slice(0, 10);
167
+ }
168
+ /**
169
+ * Resolve human-readable names (company names, locations, schools) to
170
+ * LinkedIn entity IDs via typeahead endpoints.
171
+ *
172
+ * Two-strategy approach:
173
+ * 1. **Public typeahead** (primary for COMPANY/GEO) — no auth required
174
+ * 2. **Voyager typeahead** (fallback, primary for SCHOOL) — requires CDP
175
+ *
176
+ * @param input - Resolution parameters
177
+ * @returns Resolved matches with strategy used
178
+ */
179
+ export async function resolveLinkedInEntity(input) {
180
+ const cdpPort = input.cdpPort ?? DEFAULT_CDP_PORT;
181
+ const cdpHost = input.cdpHost ?? "127.0.0.1";
182
+ const allowRemote = input.allowRemote ?? false;
183
+ // For SCHOOL, public endpoint doesn't support it — go straight to Voyager
184
+ if (input.entityType === "SCHOOL") {
185
+ const matches = await tryVoyagerTypeahead(input.query, input.entityType, cdpPort, cdpHost, allowRemote);
186
+ return { matches, strategy: "voyager" };
187
+ }
188
+ // Try public endpoint first — only fall back to Voyager if the request
189
+ // itself failed (undefined), not when it succeeded with zero matches.
190
+ const publicMatches = await tryPublicTypeahead(input.query, input.entityType);
191
+ if (publicMatches !== undefined) {
192
+ return { matches: publicMatches, strategy: "public" };
193
+ }
194
+ // Public endpoint failed — fallback to Voyager
195
+ const voyagerMatches = await tryVoyagerTypeahead(input.query, input.entityType, cdpPort, cdpHost, allowRemote);
196
+ return { matches: voyagerMatches, strategy: "voyager" };
197
+ }
198
+ //# sourceMappingURL=resolve-linkedin-entity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-linkedin-entity.js","sourceRoot":"","sources":["../../src/operations/resolve-linkedin-entity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,143 @@
1
+ import type { SearchPostResult } from "../types/search-posts.js";
2
+ import type { ConnectionOptions } from "./types.js";
3
+ /**
4
+ * Input for the search-posts operation.
5
+ */
6
+ export interface SearchPostsInput extends ConnectionOptions {
7
+ /** Search query (keywords or hashtag, e.g. `"AI agents"` or `"#AIAgents"`). */
8
+ readonly query: string;
9
+ /** Number of results per page (default: 10). */
10
+ readonly count?: number | undefined;
11
+ /** Pagination offset (default: 0). */
12
+ readonly start?: number | undefined;
13
+ }
14
+ /**
15
+ * Output from the search-posts operation.
16
+ */
17
+ export interface SearchPostsOutput {
18
+ /** The search query that was executed. */
19
+ readonly query: string;
20
+ /** List of matching posts. */
21
+ readonly posts: SearchPostResult[];
22
+ /** Pagination metadata. */
23
+ readonly paging: {
24
+ readonly start: number;
25
+ readonly count: number;
26
+ readonly total: number;
27
+ };
28
+ }
29
+ /** Top-level search clusters response. */
30
+ interface VoyagerSearchResponse {
31
+ data?: {
32
+ elements?: VoyagerSearchCluster[];
33
+ paging?: VoyagerPaging;
34
+ };
35
+ elements?: VoyagerSearchCluster[];
36
+ paging?: VoyagerPaging;
37
+ included?: VoyagerIncludedEntity[];
38
+ }
39
+ interface VoyagerSearchCluster {
40
+ items?: VoyagerSearchItem[];
41
+ }
42
+ interface VoyagerSearchItem {
43
+ item?: {
44
+ entityResult?: VoyagerEntityResult;
45
+ };
46
+ }
47
+ interface VoyagerEntityResult {
48
+ /** URN of the search result entity (e.g. `urn:li:activity:...`). */
49
+ entityUrn?: string;
50
+ /** Reference to the underlying update entity in `included`. */
51
+ "*entity"?: string;
52
+ title?: VoyagerTextWrapper;
53
+ primarySubtitle?: VoyagerTextWrapper;
54
+ summary?: VoyagerTextWrapper;
55
+ insightsResolutionResults?: VoyagerInsight[];
56
+ socialProofText?: string;
57
+ secondarySubtitle?: VoyagerTextWrapper;
58
+ }
59
+ interface VoyagerTextWrapper {
60
+ text?: string;
61
+ }
62
+ interface VoyagerInsight {
63
+ simpleInsight?: {
64
+ title?: VoyagerTextWrapper;
65
+ };
66
+ }
67
+ interface VoyagerIncludedEntity {
68
+ $type?: string;
69
+ entityUrn?: string;
70
+ /** Reference to the actor profile. */
71
+ "*actor"?: string;
72
+ actor?: VoyagerActor;
73
+ commentary?: VoyagerTextWrapper;
74
+ socialDetail?: VoyagerSocialDetail | string;
75
+ numLikes?: number;
76
+ numComments?: number;
77
+ firstName?: string;
78
+ lastName?: string;
79
+ publicIdentifier?: string;
80
+ headline?: VoyagerTextWrapper | string;
81
+ occupation?: string;
82
+ }
83
+ interface VoyagerActor {
84
+ name?: VoyagerTextWrapper;
85
+ description?: VoyagerTextWrapper;
86
+ navigationUrl?: string;
87
+ }
88
+ interface VoyagerSocialDetail {
89
+ totalSocialActivityCounts?: {
90
+ numLikes?: number;
91
+ numComments?: number;
92
+ };
93
+ }
94
+ interface VoyagerPaging {
95
+ start?: number;
96
+ count?: number;
97
+ total?: number;
98
+ }
99
+ /**
100
+ * Extract a LinkedIn public identifier from a navigation URL.
101
+ *
102
+ * Handles patterns like:
103
+ * - `https://www.linkedin.com/in/johndoe`
104
+ * - `https://www.linkedin.com/in/johndoe?miniProfileUrn=...`
105
+ */
106
+ export declare function extractPublicId(url: string | undefined): string | null;
107
+ /**
108
+ * Extract the activity URN from the entity URN.
109
+ *
110
+ * The search API may return URNs in several formats:
111
+ * - `urn:li:fs_updateV2:(urn:li:activity:1234,...)` → extract `urn:li:activity:1234`
112
+ * - `urn:li:activity:1234` → use directly
113
+ * - `urn:li:ugcPost:1234` → use directly
114
+ */
115
+ export declare function extractActivityUrn(urn: string | undefined): string | null;
116
+ /**
117
+ * Parse the Voyager content search response into normalised search results.
118
+ *
119
+ * LinkedIn's search API returns results in a "clusters" structure with
120
+ * entities referenced via URN in the `included` array. This parser
121
+ * handles both inline and reference-based entity resolution.
122
+ */
123
+ export declare function parseSearchResponse(raw: VoyagerSearchResponse): {
124
+ posts: SearchPostResult[];
125
+ paging: {
126
+ start: number;
127
+ count: number;
128
+ total: number;
129
+ };
130
+ };
131
+ /**
132
+ * Search LinkedIn for posts matching a keyword query.
133
+ *
134
+ * Connects to the LinkedIn webview in LinkedHelper and calls the
135
+ * Voyager search API with content-type filtering to find posts.
136
+ * Supports keyword search, hashtag search, and cursor-based pagination.
137
+ *
138
+ * @param input - Search query, pagination parameters, and CDP connection options.
139
+ * @returns List of matching posts with pagination metadata.
140
+ */
141
+ export declare function searchPosts(input: SearchPostsInput): Promise<SearchPostsOutput>;
142
+ export {};
143
+ //# sourceMappingURL=search-posts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-posts.d.ts","sourceRoot":"","sources":["../../src/operations/search-posts.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAKjE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD;;GAEG;AACH,MAAM,WAAW,gBAAiB,SAAQ,iBAAiB;IACzD,+EAA+E;IAC/E,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,gDAAgD;IAChD,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,sCAAsC;IACtC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACrC;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,0CAA0C;IAC1C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,8BAA8B;IAC9B,QAAQ,CAAC,KAAK,EAAE,gBAAgB,EAAE,CAAC;IACnC,2BAA2B;IAC3B,QAAQ,CAAC,MAAM,EAAE;QACf,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;KACxB,CAAC;CACH;AAMD,0CAA0C;AAC1C,UAAU,qBAAqB;IAC7B,IAAI,CAAC,EAAE;QACL,QAAQ,CAAC,EAAE,oBAAoB,EAAE,CAAC;QAClC,MAAM,CAAC,EAAE,aAAa,CAAC;KACxB,CAAC;IACF,QAAQ,CAAC,EAAE,oBAAoB,EAAE,CAAC;IAClC,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,QAAQ,CAAC,EAAE,qBAAqB,EAAE,CAAC;CACpC;AAED,UAAU,oBAAoB;IAC5B,KAAK,CAAC,EAAE,iBAAiB,EAAE,CAAC;CAC7B;AAED,UAAU,iBAAiB;IACzB,IAAI,CAAC,EAAE;QACL,YAAY,CAAC,EAAE,mBAAmB,CAAC;KACpC,CAAC;CACH;AAED,UAAU,mBAAmB;IAC3B,oEAAoE;IACpE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+DAA+D;IAC/D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,kBAAkB,CAAC;IAC3B,eAAe,CAAC,EAAE,kBAAkB,CAAC;IACrC,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAC7B,yBAAyB,CAAC,EAAE,cAAc,EAAE,CAAC;IAC7C,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iBAAiB,CAAC,EAAE,kBAAkB,CAAC;CACxC;AAED,UAAU,kBAAkB;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,UAAU,cAAc;IACtB,aAAa,CAAC,EAAE;QACd,KAAK,CAAC,EAAE,kBAAkB,CAAC;KAC5B,CAAC;CACH;AAED,UAAU,qBAAqB;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sCAAsC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,UAAU,CAAC,EAAE,kBAAkB,CAAC;IAChC,YAAY,CAAC,EAAE,mBAAmB,GAAG,MAAM,CAAC;IAC5C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,kBAAkB,GAAG,MAAM,CAAC;IACvC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,UAAU,YAAY;IACpB,IAAI,CAAC,EAAE,kBAAkB,CAAC;IAC1B,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,UAAU,mBAAmB;IAC3B,yBAAyB,CAAC,EAAE;QAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;CACH;AAED,UAAU,aAAa;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAItE;AAaD;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAYzE;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,qBAAqB,GAAG;IAC/D,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CACzD,CAkHA;AAED;;;;;;;;;GASG;AACH,wBAAsB,WAAW,CAC/B,KAAK,EAAE,gBAAgB,GACtB,OAAO,CAAC,iBAAiB,CAAC,CAwE5B"}
@@ -0,0 +1,220 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (C) 2026 Oleksii PELYKH
3
+ import { CDPClient } from "../cdp/client.js";
4
+ import { discoverTargets } from "../cdp/discovery.js";
5
+ import { VoyagerInterceptor } from "../voyager/interceptor.js";
6
+ import { DEFAULT_CDP_PORT } from "../constants.js";
7
+ /**
8
+ * Extract a LinkedIn public identifier from a navigation URL.
9
+ *
10
+ * Handles patterns like:
11
+ * - `https://www.linkedin.com/in/johndoe`
12
+ * - `https://www.linkedin.com/in/johndoe?miniProfileUrn=...`
13
+ */
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
+ }
30
+ /**
31
+ * Extract the activity URN from the entity URN.
32
+ *
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.
53
+ *
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.
57
+ */
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
+ });
147
+ }
148
+ }
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
+ };
157
+ }
158
+ /**
159
+ * Search LinkedIn for posts matching a keyword query.
160
+ *
161
+ * Connects to the LinkedIn webview in LinkedHelper and calls the
162
+ * Voyager search API with content-type filtering to find posts.
163
+ * Supports keyword search, hashtag search, and cursor-based pagination.
164
+ *
165
+ * @param input - Search query, pagination parameters, and CDP connection options.
166
+ * @returns List of matching posts with pagination metadata.
167
+ */
168
+ export async function searchPosts(input) {
169
+ const cdpPort = input.cdpPort ?? DEFAULT_CDP_PORT;
170
+ const cdpHost = input.cdpHost ?? "127.0.0.1";
171
+ const allowRemote = input.allowRemote ?? false;
172
+ const count = input.count ?? 10;
173
+ const start = input.start ?? 0;
174
+ if (!input.query.trim()) {
175
+ throw new Error("Search query must not be empty");
176
+ }
177
+ // Enforce loopback guard
178
+ if (!allowRemote && cdpHost !== "127.0.0.1" && cdpHost !== "localhost") {
179
+ throw new Error(`Non-loopback CDP host "${cdpHost}" requires --allow-remote. ` +
180
+ "This is a security measure to prevent remote code execution.");
181
+ }
182
+ const targets = await discoverTargets(cdpPort, cdpHost);
183
+ const linkedInTarget = targets.find((t) => t.type === "page" && t.url?.includes("linkedin.com"));
184
+ if (!linkedInTarget) {
185
+ throw new Error("No LinkedIn page found in LinkedHelper. " +
186
+ "Ensure LinkedHelper is running with an active LinkedIn session.");
187
+ }
188
+ const client = new CDPClient(cdpPort, { host: cdpHost, allowRemote });
189
+ await client.connect(linkedInTarget.id);
190
+ 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`);
204
+ }
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");
208
+ }
209
+ const parsed = parseSearchResponse(body);
210
+ return {
211
+ query: input.query,
212
+ posts: parsed.posts,
213
+ paging: parsed.paging,
214
+ };
215
+ }
216
+ finally {
217
+ client.disconnect();
218
+ }
219
+ }
220
+ //# sourceMappingURL=search-posts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-posts.js","sourceRoot":"","sources":["../../src/operations/search-posts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=search-posts.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-posts.test.d.ts","sourceRoot":"","sources":["../../src/operations/search-posts.test.ts"],"names":[],"mappings":""}