@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
@@ -0,0 +1,159 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (C) 2026 Oleksii PELYKH
3
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
4
+ vi.mock("../services/account-resolution.js", () => ({
5
+ resolveAccount: vi.fn(),
6
+ }));
7
+ vi.mock("../services/instance-context.js", () => ({
8
+ withInstanceDatabase: vi.fn(),
9
+ }));
10
+ vi.mock("../services/ephemeral-campaign.js", () => ({
11
+ EphemeralCampaignService: vi.fn(),
12
+ }));
13
+ import { resolveAccount } from "../services/account-resolution.js";
14
+ import { withInstanceDatabase } from "../services/instance-context.js";
15
+ import { EphemeralCampaignService } from "../services/ephemeral-campaign.js";
16
+ import { executeEphemeralAction } from "./ephemeral-action.js";
17
+ const MOCK_RESULT = {
18
+ success: true,
19
+ personId: 42,
20
+ results: [{ result: 1 }],
21
+ };
22
+ const mockExecute = vi.fn().mockResolvedValue(MOCK_RESULT);
23
+ function setupMocks() {
24
+ vi.mocked(resolveAccount).mockResolvedValue(1);
25
+ vi.mocked(withInstanceDatabase).mockImplementation(async (_cdpPort, _accountId, callback) => callback({
26
+ accountId: 1,
27
+ instance: {},
28
+ db: {},
29
+ }));
30
+ vi.mocked(EphemeralCampaignService).mockImplementation(function () {
31
+ return { execute: mockExecute };
32
+ });
33
+ }
34
+ describe("executeEphemeralAction", () => {
35
+ beforeEach(() => {
36
+ vi.clearAllMocks();
37
+ });
38
+ afterEach(() => {
39
+ vi.restoreAllMocks();
40
+ });
41
+ it("throws when neither personId nor url is provided", async () => {
42
+ await expect(executeEphemeralAction("Follow", { cdpPort: 9222 })).rejects.toThrow("Exactly one of personId or url must be provided");
43
+ });
44
+ it("throws when both personId and url are provided", async () => {
45
+ await expect(executeEphemeralAction("Follow", {
46
+ personId: 42,
47
+ url: "https://www.linkedin.com/in/test",
48
+ cdpPort: 9222,
49
+ })).rejects.toThrow("Exactly one of personId or url must be provided");
50
+ });
51
+ it("resolves account and executes action with personId target", async () => {
52
+ setupMocks();
53
+ const result = await executeEphemeralAction("Follow", {
54
+ personId: 42,
55
+ cdpPort: 9222,
56
+ });
57
+ expect(resolveAccount).toHaveBeenCalledWith(9222, {});
58
+ expect(withInstanceDatabase).toHaveBeenCalledWith(9222, 1, expect.any(Function), { db: { readOnly: false } });
59
+ expect(mockExecute).toHaveBeenCalledWith("Follow", 42, undefined, {});
60
+ expect(result).toBe(MOCK_RESULT);
61
+ });
62
+ it("passes url as target when personId is not provided", async () => {
63
+ setupMocks();
64
+ await executeEphemeralAction("Follow", {
65
+ url: "https://www.linkedin.com/in/test",
66
+ cdpPort: 9222,
67
+ });
68
+ expect(mockExecute).toHaveBeenCalledWith("Follow", "https://www.linkedin.com/in/test", undefined, {});
69
+ });
70
+ it("forwards actionSettings to execute", async () => {
71
+ setupMocks();
72
+ const settings = { skipIfUnfollowable: true, mode: "follow" };
73
+ await executeEphemeralAction("Follow", { personId: 42, cdpPort: 9222 }, settings);
74
+ expect(mockExecute).toHaveBeenCalledWith("Follow", 42, settings, {});
75
+ });
76
+ it("forwards keepCampaign option when provided", async () => {
77
+ setupMocks();
78
+ await executeEphemeralAction("Follow", {
79
+ personId: 42,
80
+ cdpPort: 9222,
81
+ keepCampaign: true,
82
+ });
83
+ expect(mockExecute).toHaveBeenCalledWith("Follow", 42, undefined, {
84
+ keepCampaign: true,
85
+ });
86
+ });
87
+ it("omits keepCampaign from options when undefined", async () => {
88
+ setupMocks();
89
+ await executeEphemeralAction("Follow", {
90
+ personId: 42,
91
+ cdpPort: 9222,
92
+ });
93
+ expect(mockExecute).toHaveBeenCalledWith("Follow", 42, undefined, {});
94
+ });
95
+ it("forwards timeout option when provided", async () => {
96
+ setupMocks();
97
+ await executeEphemeralAction("Follow", {
98
+ personId: 42,
99
+ cdpPort: 9222,
100
+ timeout: 60_000,
101
+ });
102
+ expect(mockExecute).toHaveBeenCalledWith("Follow", 42, undefined, {
103
+ timeout: 60_000,
104
+ });
105
+ });
106
+ it("omits timeout from options when undefined", async () => {
107
+ setupMocks();
108
+ await executeEphemeralAction("Follow", {
109
+ personId: 42,
110
+ cdpPort: 9222,
111
+ });
112
+ expect(mockExecute).toHaveBeenCalledWith("Follow", 42, undefined, {});
113
+ });
114
+ it("passes connection options to resolveAccount", async () => {
115
+ setupMocks();
116
+ await executeEphemeralAction("Follow", {
117
+ personId: 42,
118
+ cdpPort: 1234,
119
+ cdpHost: "192.168.1.1",
120
+ allowRemote: true,
121
+ });
122
+ expect(resolveAccount).toHaveBeenCalledWith(1234, {
123
+ host: "192.168.1.1",
124
+ allowRemote: true,
125
+ });
126
+ });
127
+ it("omits undefined connection options from resolveAccount", async () => {
128
+ setupMocks();
129
+ await executeEphemeralAction("Follow", {
130
+ personId: 42,
131
+ cdpPort: 9222,
132
+ });
133
+ expect(resolveAccount).toHaveBeenCalledWith(9222, {});
134
+ });
135
+ it("propagates resolveAccount errors", async () => {
136
+ vi.mocked(resolveAccount).mockRejectedValue(new Error("connection refused"));
137
+ await expect(executeEphemeralAction("Follow", { personId: 42, cdpPort: 9222 })).rejects.toThrow("connection refused");
138
+ });
139
+ it("propagates withInstanceDatabase errors", async () => {
140
+ vi.mocked(resolveAccount).mockResolvedValue(1);
141
+ vi.mocked(withInstanceDatabase).mockRejectedValue(new Error("instance not running"));
142
+ await expect(executeEphemeralAction("Follow", { personId: 42, cdpPort: 9222 })).rejects.toThrow("instance not running");
143
+ });
144
+ it("propagates EphemeralCampaignService.execute errors", async () => {
145
+ vi.mocked(resolveAccount).mockResolvedValue(1);
146
+ vi.mocked(withInstanceDatabase).mockImplementation(async (_cdpPort, _accountId, callback) => callback({
147
+ accountId: 1,
148
+ instance: {},
149
+ db: {},
150
+ }));
151
+ vi.mocked(EphemeralCampaignService).mockImplementation(function () {
152
+ return {
153
+ execute: vi.fn().mockRejectedValue(new Error("campaign failed")),
154
+ };
155
+ });
156
+ await expect(executeEphemeralAction("Follow", { personId: 42, cdpPort: 9222 })).rejects.toThrow("campaign failed");
157
+ });
158
+ });
159
+ //# sourceMappingURL=ephemeral-action.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ephemeral-action.test.js","sourceRoot":"","sources":["../../src/operations/ephemeral-action.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=follow-person.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"follow-person.test.d.ts","sourceRoot":"","sources":["../../src/operations/follow-person.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,57 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (C) 2026 Oleksii PELYKH
3
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
4
+ vi.mock("./ephemeral-action.js", () => ({
5
+ executeEphemeralAction: vi.fn(),
6
+ }));
7
+ import { executeEphemeralAction } from "./ephemeral-action.js";
8
+ import { followPerson } from "./follow-person.js";
9
+ const MOCK_RESULT = { success: true, personId: 42, results: [] };
10
+ describe("followPerson", () => {
11
+ beforeEach(() => {
12
+ vi.clearAllMocks();
13
+ vi.mocked(executeEphemeralAction).mockResolvedValue(MOCK_RESULT);
14
+ });
15
+ afterEach(() => {
16
+ vi.restoreAllMocks();
17
+ });
18
+ it("calls executeEphemeralAction with Follow action type", async () => {
19
+ const input = { personId: 42, cdpPort: 9222 };
20
+ await followPerson(input);
21
+ expect(executeEphemeralAction).toHaveBeenCalledWith("Follow", input, expect.any(Object));
22
+ });
23
+ it("defaults skipIfUnfollowable to true", async () => {
24
+ await followPerson({ personId: 42, cdpPort: 9222 });
25
+ expect(executeEphemeralAction).toHaveBeenCalledWith("Follow", expect.any(Object), expect.objectContaining({ skipIfUnfollowable: true }));
26
+ });
27
+ it("passes explicit skipIfUnfollowable value", async () => {
28
+ await followPerson({
29
+ personId: 42,
30
+ cdpPort: 9222,
31
+ skipIfUnfollowable: false,
32
+ });
33
+ expect(executeEphemeralAction).toHaveBeenCalledWith("Follow", expect.any(Object), expect.objectContaining({ skipIfUnfollowable: false }));
34
+ });
35
+ it("includes mode when provided", async () => {
36
+ await followPerson({
37
+ personId: 42,
38
+ cdpPort: 9222,
39
+ mode: "unfollow",
40
+ });
41
+ expect(executeEphemeralAction).toHaveBeenCalledWith("Follow", expect.any(Object), expect.objectContaining({ mode: "unfollow" }));
42
+ });
43
+ it("omits mode when undefined", async () => {
44
+ await followPerson({ personId: 42, cdpPort: 9222 });
45
+ const settings = vi.mocked(executeEphemeralAction).mock.calls[0]?.[2];
46
+ expect(settings).not.toHaveProperty("mode");
47
+ });
48
+ it("returns the result from executeEphemeralAction", async () => {
49
+ const result = await followPerson({ personId: 42, cdpPort: 9222 });
50
+ expect(result).toBe(MOCK_RESULT);
51
+ });
52
+ it("propagates errors from executeEphemeralAction", async () => {
53
+ vi.mocked(executeEphemeralAction).mockRejectedValue(new Error("action failed"));
54
+ await expect(followPerson({ personId: 42, cdpPort: 9222 })).rejects.toThrow("action failed");
55
+ });
56
+ });
57
+ //# sourceMappingURL=follow-person.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"follow-person.test.js","sourceRoot":"","sources":["../../src/operations/follow-person.test.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,oCAAoC;AAEpC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAEzE,EAAE,CAAC,IAAI,CAAC,uBAAuB,EAAE,GAAG,EAAE,CAAC,CAAC;IACtC,sBAAsB,EAAE,EAAE,CAAC,EAAE,EAAE;CAChC,CAAC,CAAC,CAAC;AAEJ,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,WAAW,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;AAEjE,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,aAAa,EAAE,CAAC;QACnB,EAAE,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,eAAe,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACpE,MAAM,KAAK,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAE9C,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC;QAE1B,MAAM,CAAC,sBAAsB,CAAC,CAAC,oBAAoB,CACjD,QAAQ,EACR,KAAK,EACL,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CACnB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACnD,MAAM,YAAY,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAEpD,MAAM,CAAC,sBAAsB,CAAC,CAAC,oBAAoB,CACjD,QAAQ,EACR,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAClB,MAAM,CAAC,gBAAgB,CAAC,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC,CACtD,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,YAAY,CAAC;YACjB,QAAQ,EAAE,EAAE;YACZ,OAAO,EAAE,IAAI;YACb,kBAAkB,EAAE,KAAK;SAC1B,CAAC,CAAC;QAEH,MAAM,CAAC,sBAAsB,CAAC,CAAC,oBAAoB,CACjD,QAAQ,EACR,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAClB,MAAM,CAAC,gBAAgB,CAAC,EAAE,kBAAkB,EAAE,KAAK,EAAE,CAAC,CACvD,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;QAC3C,MAAM,YAAY,CAAC;YACjB,QAAQ,EAAE,EAAE;YACZ,OAAO,EAAE,IAAI;YACb,IAAI,EAAE,UAAU;SACjB,CAAC,CAAC;QAEH,MAAM,CAAC,sBAAsB,CAAC,CAAC,oBAAoB,CACjD,QAAQ,EACR,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAClB,MAAM,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAC9C,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;QACzC,MAAM,YAAY,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAEpD,MAAM,QAAQ,GAAG,EAAE,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAA4B,CAAC;QACjG,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC9D,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAEnE,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,EAAE,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC,iBAAiB,CACjD,IAAI,KAAK,CAAC,eAAe,CAAC,CAC3B,CAAC;QAEF,MAAM,MAAM,CACV,YAAY,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAC9C,CAAC,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import type { ActionBudget } from "../types/index.js";
2
- import type { ConnectionOptions } from "./types.js";
2
+ import { type ConnectionOptions } from "./types.js";
3
3
  export type GetActionBudgetInput = ConnectionOptions;
4
4
  export type GetActionBudgetOutput = ActionBudget;
5
5
  export declare function getActionBudget(input: GetActionBudgetInput): Promise<GetActionBudgetOutput>;
@@ -1 +1 @@
1
- {"version":3,"file":"get-action-budget.d.ts","sourceRoot":"","sources":["../../src/operations/get-action-budget.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAKtD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,MAAM,MAAM,oBAAoB,GAAG,iBAAiB,CAAC;AAErD,MAAM,MAAM,qBAAqB,GAAG,YAAY,CAAC;AAEjD,wBAAsB,eAAe,CACnC,KAAK,EAAE,oBAAoB,GAC1B,OAAO,CAAC,qBAAqB,CAAC,CAgBhC"}
1
+ {"version":3,"file":"get-action-budget.d.ts","sourceRoot":"","sources":["../../src/operations/get-action-budget.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAItD,OAAO,EAAmB,KAAK,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAErE,MAAM,MAAM,oBAAoB,GAAG,iBAAiB,CAAC;AAErD,MAAM,MAAM,qBAAqB,GAAG,YAAY,CAAC;AAEjD,wBAAsB,eAAe,CACnC,KAAK,EAAE,oBAAoB,GAC1B,OAAO,CAAC,qBAAqB,CAAC,CAahC"}
@@ -3,13 +3,10 @@
3
3
  import { resolveAccount } from "../services/account-resolution.js";
4
4
  import { withDatabase } from "../services/instance-context.js";
5
5
  import { ActionBudgetRepository } from "../db/index.js";
6
- import { DEFAULT_CDP_PORT } from "../constants.js";
6
+ import { buildCdpOptions } from "./types.js";
7
7
  export async function getActionBudget(input) {
8
- const cdpPort = input.cdpPort ?? DEFAULT_CDP_PORT;
9
- const accountId = await resolveAccount(cdpPort, {
10
- ...(input.cdpHost !== undefined && { host: input.cdpHost }),
11
- ...(input.allowRemote !== undefined && { allowRemote: input.allowRemote }),
12
- });
8
+ const cdpPort = input.cdpPort;
9
+ const accountId = await resolveAccount(cdpPort, buildCdpOptions(input));
13
10
  return withDatabase(accountId, ({ db }) => {
14
11
  const repo = new ActionBudgetRepository(db);
15
12
  const entries = repo.getActionBudget();
@@ -1 +1 @@
1
- {"version":3,"file":"get-action-budget.js","sourceRoot":"","sources":["../../src/operations/get-action-budget.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,oCAAoC;AAGpC,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAOnD,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,KAA2B;IAE3B,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,gBAAgB,CAAC;IAElD,MAAM,SAAS,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE;QAC9C,GAAG,CAAC,KAAK,CAAC,OAAO,KAAK,SAAS,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;QAC3D,GAAG,CAAC,KAAK,CAAC,WAAW,KAAK,SAAS,IAAI,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC;KAC3E,CAAC,CAAC;IAEH,OAAO,YAAY,CAAC,SAAS,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE;QACxC,MAAM,IAAI,GAAG,IAAI,sBAAsB,CAAC,EAAE,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACvC,OAAO;YACL,OAAO;YACP,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SAC/B,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"get-action-budget.js","sourceRoot":"","sources":["../../src/operations/get-action-budget.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,oCAAoC;AAGpC,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,eAAe,EAA0B,MAAM,YAAY,CAAC;AAMrE,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,KAA2B;IAE3B,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IAE9B,MAAM,SAAS,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;IAExE,OAAO,YAAY,CAAC,SAAS,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE;QACxC,MAAM,IAAI,GAAG,IAAI,sBAAsB,CAAC,EAAE,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACvC,OAAO;YACL,OAAO;YACP,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SAC/B,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import type { InstancePopup, UIHealthStatus } from "../types/index.js";
2
- import type { ConnectionOptions } from "./types.js";
2
+ import { type ConnectionOptions } from "./types.js";
3
3
  /**
4
4
  * Input for the get-errors operation.
5
5
  */
@@ -19,6 +19,10 @@ export interface GetErrorsOutput extends UIHealthStatus {
19
19
  * aggregated UI health status including active instance issues,
20
20
  * popup overlay state, and instance UI popups.
21
21
  *
22
+ * When the launcher is not available (e.g. connecting directly to an
23
+ * instance), launcher health is reported as healthy and only instance
24
+ * popups are checked.
25
+ *
22
26
  * Instance popups are detected on a best-effort basis: if the instance
23
27
  * is not running or the UI target is unavailable, the operation still
24
28
  * succeeds and returns an empty `instancePopups` array.
@@ -1 +1 @@
1
- {"version":3,"file":"get-errors.d.ts","sourceRoot":"","sources":["../../src/operations/get-errors.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAMvE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,iBAAiB,CAAC;AAE/C;;GAEG;AACH,MAAM,WAAW,eAAgB,SAAQ,cAAc;IACrD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,4EAA4E;IAC5E,QAAQ,CAAC,cAAc,EAAE,SAAS,aAAa,EAAE,CAAC;CACnD;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,SAAS,CAC7B,KAAK,EAAE,cAAc,GACpB,OAAO,CAAC,eAAe,CAAC,CA8B1B"}
1
+ {"version":3,"file":"get-errors.d.ts","sourceRoot":"","sources":["../../src/operations/get-errors.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAKvE,OAAO,EAAmB,KAAK,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAErE;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,iBAAiB,CAAC;AAE/C;;GAEG;AACH,MAAM,WAAW,eAAgB,SAAQ,cAAc;IACrD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,4EAA4E;IAC5E,QAAQ,CAAC,cAAc,EAAE,SAAS,aAAa,EAAE,CAAC;CACnD;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,SAAS,CAC7B,KAAK,EAAE,cAAc,GACpB,OAAO,CAAC,eAAe,CAAC,CAmD1B"}
@@ -1,10 +1,11 @@
1
1
  // SPDX-License-Identifier: AGPL-3.0-only
2
2
  // Copyright (C) 2026 Oleksii PELYKH
3
- import { discoverTargets } from "../cdp/index.js";
3
+ import { discoverInstancePort, resolveInstancePort } from "../cdp/index.js";
4
4
  import { resolveAccount } from "../services/account-resolution.js";
5
5
  import { InstanceService } from "../services/instance.js";
6
6
  import { LauncherService } from "../services/launcher.js";
7
- import { DEFAULT_CDP_PORT } from "../constants.js";
7
+ import { isLoopbackAddress } from "../utils/loopback.js";
8
+ import { buildCdpOptions } from "./types.js";
8
9
  /**
9
10
  * Query the current error/dialog/popup state of a LinkedHelper instance.
10
11
  *
@@ -12,56 +13,77 @@ import { DEFAULT_CDP_PORT } from "../constants.js";
12
13
  * aggregated UI health status including active instance issues,
13
14
  * popup overlay state, and instance UI popups.
14
15
  *
16
+ * When the launcher is not available (e.g. connecting directly to an
17
+ * instance), launcher health is reported as healthy and only instance
18
+ * popups are checked.
19
+ *
15
20
  * Instance popups are detected on a best-effort basis: if the instance
16
21
  * is not running or the UI target is unavailable, the operation still
17
22
  * succeeds and returns an empty `instancePopups` array.
18
23
  */
19
24
  export async function getErrors(input) {
20
- const cdpPort = input.cdpPort ?? DEFAULT_CDP_PORT;
21
- const cdpOptions = {
22
- ...(input.cdpHost !== undefined && { host: input.cdpHost }),
23
- ...(input.allowRemote !== undefined && { allowRemote: input.allowRemote }),
24
- };
25
+ const cdpPort = await resolveInstancePort(input.cdpPort, input.cdpHost);
26
+ const cdpOptions = buildCdpOptions(input);
25
27
  const accountId = await resolveAccount(cdpPort, cdpOptions);
26
- const launcher = new LauncherService(cdpPort, cdpOptions);
27
- let health;
28
+ // Launcher health check (best-effort — returns default healthy
29
+ // status when connected directly to an instance)
30
+ let health = {
31
+ issues: [],
32
+ popup: null,
33
+ instancePopups: [],
34
+ healthy: true,
35
+ };
36
+ let connectedToLauncher = false;
28
37
  try {
29
- await launcher.connect();
30
- health = await launcher.checkUIHealth(accountId);
38
+ const launcher = new LauncherService(cdpPort, cdpOptions);
39
+ try {
40
+ await launcher.connect();
41
+ connectedToLauncher = true;
42
+ health = await launcher.checkUIHealth(accountId);
43
+ }
44
+ finally {
45
+ launcher.disconnect();
46
+ }
31
47
  }
32
- finally {
33
- launcher.disconnect();
48
+ catch {
49
+ // Launcher not available — proceed with instance-only health info
50
+ }
51
+ // Best-effort: detect instance UI popups if the UI target is available.
52
+ // When connected to a launcher, discover the instance's dynamic CDP port
53
+ // first — the launcher port does not host instance UI targets.
54
+ // Discovery only works locally (process inspection), so skip for remote hosts.
55
+ const isLocal = input.cdpHost === undefined || isLoopbackAddress(input.cdpHost);
56
+ let instancePopups = [];
57
+ if (connectedToLauncher && isLocal) {
58
+ const instancePort = await discoverInstancePort(cdpPort).catch(() => null);
59
+ if (instancePort !== null) {
60
+ instancePopups = await detectInstancePopups(instancePort, cdpOptions);
61
+ }
62
+ }
63
+ else if (!connectedToLauncher) {
64
+ // Direct instance connection — cdpPort IS the instance port
65
+ instancePopups = await detectInstancePopups(cdpPort, cdpOptions);
34
66
  }
35
- // Best-effort: detect instance UI popups if the instance is running.
36
- const instancePopups = await detectInstancePopups(cdpPort, input.cdpHost, cdpOptions);
37
67
  const healthy = health.healthy && instancePopups.length === 0;
38
68
  return { accountId, ...health, healthy, instancePopups };
39
69
  }
40
70
  /**
41
- * Attempt to detect instance UI popups via a one-shot target discovery.
71
+ * Attempt to detect instance UI popups via {@link InstanceService.connectUiOnly}.
42
72
  *
43
- * Returns an empty array when the instance is not running or the
44
- * targets disappear between discovery and connection.
73
+ * Returns an empty array when the UI target is unavailable or the
74
+ * connection fails for any reason.
45
75
  */
46
- async function detectInstancePopups(cdpPort, cdpHost, cdpOptions) {
76
+ async function detectInstancePopups(cdpPort, cdpOptions) {
77
+ const instance = new InstanceService(cdpPort, cdpOptions);
47
78
  try {
48
- const targets = await discoverTargets(cdpPort, cdpHost ?? "127.0.0.1");
49
- const hasLinkedIn = targets.some((t) => t.type === "page" && t.url.includes("linkedin.com"));
50
- const hasUI = targets.some((t) => t.type === "page" && t.url.includes("index.html"));
51
- if (!hasLinkedIn || !hasUI) {
52
- return [];
53
- }
54
- const instance = new InstanceService(cdpPort, cdpOptions);
55
- try {
56
- await instance.connect();
57
- return await instance.getInstancePopups();
58
- }
59
- finally {
60
- instance.disconnect();
61
- }
79
+ await instance.connectUiOnly();
80
+ return await instance.getInstancePopups();
62
81
  }
63
82
  catch {
64
83
  return [];
65
84
  }
85
+ finally {
86
+ instance.disconnect();
87
+ }
66
88
  }
67
89
  //# sourceMappingURL=get-errors.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-errors.js","sourceRoot":"","sources":["../../src/operations/get-errors.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,oCAAoC;AAGpC,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAiBnD;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,KAAqB;IAErB,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,gBAAgB,CAAC;IAElD,MAAM,UAAU,GAAG;QACjB,GAAG,CAAC,KAAK,CAAC,OAAO,KAAK,SAAS,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;QAC3D,GAAG,CAAC,KAAK,CAAC,WAAW,KAAK,SAAS,IAAI,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC;KAC3E,CAAC;IAEF,MAAM,SAAS,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAE5D,MAAM,QAAQ,GAAG,IAAI,eAAe,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAC1D,IAAI,MAAsB,CAAC;IAC3B,IAAI,CAAC;QACH,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;QACzB,MAAM,GAAG,MAAM,QAAQ,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;IACnD,CAAC;YAAS,CAAC;QACT,QAAQ,CAAC,UAAU,EAAE,CAAC;IACxB,CAAC;IAED,qEAAqE;IACrE,MAAM,cAAc,GAAG,MAAM,oBAAoB,CAC/C,OAAO,EACP,KAAK,CAAC,OAAO,EACb,UAAU,CACX,CAAC;IAEF,MAAM,OAAO,GACX,MAAM,CAAC,OAAO,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,CAAC;IAEhD,OAAO,EAAE,SAAS,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC;AAC3D,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,oBAAoB,CACjC,OAAe,EACf,OAA2B,EAC3B,UAAoD;IAEpD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,OAAO,EAAE,OAAO,IAAI,WAAW,CAAC,CAAC;QACvE,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAC9B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC,CAC3D,CAAC;QACF,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CACxB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CACzD,CAAC;QACF,IAAI,CAAC,WAAW,IAAI,CAAC,KAAK,EAAE,CAAC;YAC3B,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,eAAe,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAC1D,IAAI,CAAC;YACH,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;YACzB,OAAO,MAAM,QAAQ,CAAC,iBAAiB,EAAE,CAAC;QAC5C,CAAC;gBAAS,CAAC;YACT,QAAQ,CAAC,UAAU,EAAE,CAAC;QACxB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"get-errors.js","sourceRoot":"","sources":["../../src/operations/get-errors.ts"],"names":[],"mappings":"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"}
@@ -1,19 +1,23 @@
1
1
  // SPDX-License-Identifier: AGPL-3.0-only
2
2
  // Copyright (C) 2026 Oleksii PELYKH
3
3
  import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
4
+ vi.mock("../cdp/index.js", async (importOriginal) => {
5
+ const original = await importOriginal();
6
+ return {
7
+ ...original,
8
+ discoverInstancePort: vi.fn().mockResolvedValue(null),
9
+ };
10
+ });
4
11
  vi.mock("../services/account-resolution.js", () => ({
5
12
  resolveAccount: vi.fn(),
6
13
  }));
7
14
  vi.mock("../services/launcher.js", () => ({
8
15
  LauncherService: vi.fn(),
9
16
  }));
10
- vi.mock("../cdp/index.js", () => ({
11
- discoverTargets: vi.fn(),
12
- }));
13
17
  vi.mock("../services/instance.js", () => ({
14
18
  InstanceService: vi.fn(),
15
19
  }));
16
- import { discoverTargets } from "../cdp/index.js";
20
+ import { discoverInstancePort } from "../cdp/index.js";
17
21
  import { resolveAccount } from "../services/account-resolution.js";
18
22
  import { InstanceService } from "../services/instance.js";
19
23
  import { LauncherService } from "../services/launcher.js";
@@ -21,12 +25,27 @@ import { getErrors } from "./get-errors.js";
21
25
  describe("getErrors", () => {
22
26
  beforeEach(() => {
23
27
  vi.clearAllMocks();
24
- // Default: no instance targets
25
- vi.mocked(discoverTargets).mockResolvedValue([]);
28
+ // Default: connectUiOnly rejects (instance not running)
29
+ mockInstance({ connectFails: true });
26
30
  });
27
31
  afterEach(() => {
28
32
  vi.restoreAllMocks();
29
33
  });
34
+ function mockInstance(opts) {
35
+ const mock = {
36
+ connectUiOnly: opts.connectFails
37
+ ? vi.fn().mockRejectedValue(new Error("UI target not found"))
38
+ : vi.fn().mockResolvedValue(undefined),
39
+ disconnect: vi.fn(),
40
+ getInstancePopups: opts.getPopupsFails
41
+ ? vi.fn().mockRejectedValue(new Error("DOM error"))
42
+ : vi.fn().mockResolvedValue(opts.popups ?? []),
43
+ };
44
+ vi.mocked(InstanceService).mockImplementation(function () {
45
+ return mock;
46
+ });
47
+ return mock;
48
+ }
30
49
  function mockLauncher(health) {
31
50
  const mock = {
32
51
  connect: vi.fn().mockResolvedValue(undefined),
@@ -99,7 +118,7 @@ describe("getErrors", () => {
99
118
  allowRemote: true,
100
119
  });
101
120
  });
102
- it("disconnects launcher even on error", async () => {
121
+ it("disconnects launcher and returns healthy status when launcher throws", async () => {
103
122
  vi.mocked(resolveAccount).mockResolvedValue(1);
104
123
  const mock = {
105
124
  connect: vi.fn().mockResolvedValue(undefined),
@@ -109,8 +128,11 @@ describe("getErrors", () => {
109
128
  vi.mocked(LauncherService).mockImplementation(function () {
110
129
  return mock;
111
130
  });
112
- await expect(getErrors({ cdpPort: 9222 })).rejects.toThrow("CDP failure");
131
+ const result = await getErrors({ cdpPort: 9222 });
113
132
  expect(mock.disconnect).toHaveBeenCalledOnce();
133
+ expect(result.healthy).toBe(true);
134
+ expect(result.issues).toEqual([]);
135
+ expect(result.instancePopups).toEqual([]);
114
136
  });
115
137
  it("propagates resolveAccount errors", async () => {
116
138
  vi.mocked(resolveAccount).mockRejectedValue(new Error("connection refused"));
@@ -118,84 +140,61 @@ describe("getErrors", () => {
118
140
  });
119
141
  it("includes instance popups when instance is running", async () => {
120
142
  vi.mocked(resolveAccount).mockResolvedValue(1);
143
+ vi.mocked(discoverInstancePort).mockResolvedValue(9223);
121
144
  mockLauncher({ healthy: true, issues: [], popup: null, instancePopups: [] });
122
- vi.mocked(discoverTargets).mockResolvedValue([
123
- { id: "t1", type: "page", title: "LinkedIn", url: "https://www.linkedin.com/feed/", description: "", devtoolsFrontendUrl: "", webSocketDebuggerUrl: "" },
124
- { id: "t2", type: "page", title: "LH", url: "file:///index.html", description: "", devtoolsFrontendUrl: "", webSocketDebuggerUrl: "" },
125
- ]);
126
- const mockInstance = {
127
- connect: vi.fn().mockResolvedValue(undefined),
128
- disconnect: vi.fn(),
129
- getInstancePopups: vi.fn().mockResolvedValue([
145
+ mockInstance({
146
+ popups: [
130
147
  { title: "Failed to initialize UI", description: "AsyncHandlerError", closable: true },
131
- ]),
132
- };
133
- vi.mocked(InstanceService).mockImplementation(function () {
134
- return mockInstance;
148
+ ],
135
149
  });
136
150
  const result = await getErrors({ cdpPort: 9222 });
151
+ expect(discoverInstancePort).toHaveBeenCalledWith(9222);
152
+ expect(InstanceService).toHaveBeenCalledWith(9223, expect.anything());
137
153
  expect(result.instancePopups).toHaveLength(1);
138
154
  expect(result.instancePopups[0]?.title).toBe("Failed to initialize UI");
139
155
  expect(result.healthy).toBe(false);
140
156
  });
141
157
  it("marks unhealthy when instance popups are present even if launcher is healthy", async () => {
142
158
  vi.mocked(resolveAccount).mockResolvedValue(1);
159
+ vi.mocked(discoverInstancePort).mockResolvedValue(9223);
143
160
  mockLauncher({ healthy: true, issues: [], popup: null, instancePopups: [] });
144
- vi.mocked(discoverTargets).mockResolvedValue([
145
- { id: "t1", type: "page", title: "LinkedIn", url: "https://www.linkedin.com/feed/", description: "", devtoolsFrontendUrl: "", webSocketDebuggerUrl: "" },
146
- { id: "t2", type: "page", title: "LH", url: "file:///index.html", description: "", devtoolsFrontendUrl: "", webSocketDebuggerUrl: "" },
147
- ]);
148
- const mockInstance = {
149
- connect: vi.fn().mockResolvedValue(undefined),
150
- disconnect: vi.fn(),
151
- getInstancePopups: vi.fn().mockResolvedValue([
152
- { title: "Error popup", closable: false },
153
- ]),
154
- };
155
- vi.mocked(InstanceService).mockImplementation(function () {
156
- return mockInstance;
161
+ mockInstance({
162
+ popups: [{ title: "Error popup", closable: false }],
157
163
  });
158
164
  const result = await getErrors({ cdpPort: 9222 });
159
165
  expect(result.healthy).toBe(false);
160
166
  expect(result.instancePopups).toHaveLength(1);
161
167
  });
162
- it("returns empty instancePopups when instance is not running", async () => {
168
+ it("returns empty instancePopups when UI target is absent", async () => {
163
169
  vi.mocked(resolveAccount).mockResolvedValue(1);
164
170
  mockLauncher({ healthy: true, issues: [], popup: null, instancePopups: [] });
165
- // Only launcher target, no instance targets
166
- vi.mocked(discoverTargets).mockResolvedValue([
167
- { id: "t1", type: "page", title: "Launcher", url: "file:///launcher.html", description: "", devtoolsFrontendUrl: "", webSocketDebuggerUrl: "" },
168
- ]);
171
+ // Default beforeEach already sets connectFails: true
169
172
  const result = await getErrors({ cdpPort: 9222 });
170
173
  expect(result.instancePopups).toEqual([]);
171
174
  expect(result.healthy).toBe(true);
172
175
  });
173
- it("returns empty instancePopups when target discovery fails", async () => {
176
+ it("disconnects instance service even when getInstancePopups fails", async () => {
174
177
  vi.mocked(resolveAccount).mockResolvedValue(1);
178
+ vi.mocked(discoverInstancePort).mockResolvedValue(9223);
175
179
  mockLauncher({ healthy: true, issues: [], popup: null, instancePopups: [] });
176
- vi.mocked(discoverTargets).mockRejectedValue(new Error("connection reset"));
180
+ const inst = mockInstance({ getPopupsFails: true });
177
181
  const result = await getErrors({ cdpPort: 9222 });
178
182
  expect(result.instancePopups).toEqual([]);
179
- expect(result.healthy).toBe(true);
183
+ expect(inst.disconnect).toHaveBeenCalledOnce();
180
184
  });
181
- it("disconnects instance service even when getInstancePopups fails", async () => {
185
+ it("detects popups when LinkedIn webview is absent (UI-only start)", async () => {
182
186
  vi.mocked(resolveAccount).mockResolvedValue(1);
187
+ vi.mocked(discoverInstancePort).mockResolvedValue(9223);
183
188
  mockLauncher({ healthy: true, issues: [], popup: null, instancePopups: [] });
184
- vi.mocked(discoverTargets).mockResolvedValue([
185
- { id: "t1", type: "page", title: "LinkedIn", url: "https://www.linkedin.com/feed/", description: "", devtoolsFrontendUrl: "", webSocketDebuggerUrl: "" },
186
- { id: "t2", type: "page", title: "LH", url: "file:///index.html", description: "", devtoolsFrontendUrl: "", webSocketDebuggerUrl: "" },
187
- ]);
188
- const mockInstance = {
189
- connect: vi.fn().mockResolvedValue(undefined),
190
- disconnect: vi.fn(),
191
- getInstancePopups: vi.fn().mockRejectedValue(new Error("DOM error")),
192
- };
193
- vi.mocked(InstanceService).mockImplementation(function () {
194
- return mockInstance;
189
+ mockInstance({
190
+ popups: [
191
+ { title: "Session expired", closable: true },
192
+ ],
195
193
  });
196
194
  const result = await getErrors({ cdpPort: 9222 });
197
- expect(result.instancePopups).toEqual([]);
198
- expect(mockInstance.disconnect).toHaveBeenCalledOnce();
195
+ expect(result.instancePopups).toHaveLength(1);
196
+ expect(result.instancePopups[0]?.title).toBe("Session expired");
197
+ expect(result.healthy).toBe(false);
199
198
  });
200
199
  });
201
200
  //# sourceMappingURL=get-errors.test.js.map