@lhremote/cli 0.1.0 → 0.2.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 (277) hide show
  1. package/README.md +58 -2
  2. package/dist/cli.js +2 -0
  3. package/dist/cli.js.map +1 -1
  4. package/dist/handlers/campaign-add-action.d.ts +14 -0
  5. package/dist/handlers/campaign-add-action.d.ts.map +1 -0
  6. package/dist/handlers/campaign-add-action.js +51 -0
  7. package/dist/handlers/campaign-add-action.js.map +1 -0
  8. package/dist/handlers/campaign-add-action.test.d.ts +2 -0
  9. package/dist/handlers/campaign-add-action.test.d.ts.map +1 -0
  10. package/dist/handlers/campaign-add-action.test.js +121 -0
  11. package/dist/handlers/campaign-add-action.test.js.map +1 -0
  12. package/dist/handlers/campaign-create.d.ts +11 -0
  13. package/dist/handlers/campaign-create.d.ts.map +1 -0
  14. package/dist/handlers/campaign-create.js +79 -0
  15. package/dist/handlers/campaign-create.js.map +1 -0
  16. package/dist/handlers/campaign-create.test.d.ts +2 -0
  17. package/dist/handlers/campaign-create.test.d.ts.map +1 -0
  18. package/dist/handlers/campaign-create.test.js +139 -0
  19. package/dist/handlers/campaign-create.test.js.map +1 -0
  20. package/dist/handlers/campaign-delete.d.ts +8 -0
  21. package/dist/handlers/campaign-delete.d.ts.map +1 -0
  22. package/dist/handlers/campaign-delete.js +39 -0
  23. package/dist/handlers/campaign-delete.js.map +1 -0
  24. package/dist/handlers/campaign-delete.test.d.ts +2 -0
  25. package/dist/handlers/campaign-delete.test.d.ts.map +1 -0
  26. package/dist/handlers/campaign-delete.test.js +73 -0
  27. package/dist/handlers/campaign-delete.test.js.map +1 -0
  28. package/dist/handlers/campaign-exclude-add.d.ts +11 -0
  29. package/dist/handlers/campaign-exclude-add.d.ts.map +1 -0
  30. package/dist/handlers/campaign-exclude-add.js +58 -0
  31. package/dist/handlers/campaign-exclude-add.js.map +1 -0
  32. package/dist/handlers/campaign-exclude-add.test.d.ts +2 -0
  33. package/dist/handlers/campaign-exclude-add.test.d.ts.map +1 -0
  34. package/dist/handlers/campaign-exclude-add.test.js +144 -0
  35. package/dist/handlers/campaign-exclude-add.test.js.map +1 -0
  36. package/dist/handlers/campaign-exclude-list.d.ts +9 -0
  37. package/dist/handlers/campaign-exclude-list.d.ts.map +1 -0
  38. package/dist/handlers/campaign-exclude-list.js +46 -0
  39. package/dist/handlers/campaign-exclude-list.js.map +1 -0
  40. package/dist/handlers/campaign-exclude-list.test.d.ts +2 -0
  41. package/dist/handlers/campaign-exclude-list.test.d.ts.map +1 -0
  42. package/dist/handlers/campaign-exclude-list.test.js +109 -0
  43. package/dist/handlers/campaign-exclude-list.test.js.map +1 -0
  44. package/dist/handlers/campaign-exclude-remove.d.ts +11 -0
  45. package/dist/handlers/campaign-exclude-remove.d.ts.map +1 -0
  46. package/dist/handlers/campaign-exclude-remove.js +58 -0
  47. package/dist/handlers/campaign-exclude-remove.js.map +1 -0
  48. package/dist/handlers/campaign-exclude-remove.test.d.ts +2 -0
  49. package/dist/handlers/campaign-exclude-remove.test.d.ts.map +1 -0
  50. package/dist/handlers/campaign-exclude-remove.test.js +147 -0
  51. package/dist/handlers/campaign-exclude-remove.test.js.map +1 -0
  52. package/dist/handlers/campaign-export.d.ts +9 -0
  53. package/dist/handlers/campaign-export.d.ts.map +1 -0
  54. package/dist/handlers/campaign-export.js +42 -0
  55. package/dist/handlers/campaign-export.js.map +1 -0
  56. package/dist/handlers/campaign-export.test.d.ts +2 -0
  57. package/dist/handlers/campaign-export.test.d.ts.map +1 -0
  58. package/dist/handlers/campaign-export.test.js +84 -0
  59. package/dist/handlers/campaign-export.test.js.map +1 -0
  60. package/dist/handlers/campaign-get.d.ts +8 -0
  61. package/dist/handlers/campaign-get.d.ts.map +1 -0
  62. package/dist/handlers/campaign-get.js +46 -0
  63. package/dist/handlers/campaign-get.js.map +1 -0
  64. package/dist/handlers/campaign-get.test.d.ts +2 -0
  65. package/dist/handlers/campaign-get.test.d.ts.map +1 -0
  66. package/dist/handlers/campaign-get.test.js +131 -0
  67. package/dist/handlers/campaign-get.test.js.map +1 -0
  68. package/dist/handlers/campaign-list.d.ts +6 -0
  69. package/dist/handlers/campaign-list.d.ts.map +1 -0
  70. package/dist/handlers/campaign-list.js +55 -0
  71. package/dist/handlers/campaign-list.js.map +1 -0
  72. package/dist/handlers/campaign-list.test.d.ts +2 -0
  73. package/dist/handlers/campaign-list.test.d.ts.map +1 -0
  74. package/dist/handlers/campaign-list.test.js +129 -0
  75. package/dist/handlers/campaign-list.test.js.map +1 -0
  76. package/dist/handlers/campaign-move-next.d.ts +10 -0
  77. package/dist/handlers/campaign-move-next.d.ts.map +1 -0
  78. package/dist/handlers/campaign-move-next.js +52 -0
  79. package/dist/handlers/campaign-move-next.js.map +1 -0
  80. package/dist/handlers/campaign-move-next.test.d.ts +2 -0
  81. package/dist/handlers/campaign-move-next.test.d.ts.map +1 -0
  82. package/dist/handlers/campaign-move-next.test.js +127 -0
  83. package/dist/handlers/campaign-move-next.test.js.map +1 -0
  84. package/dist/handlers/campaign-remove-action.d.ts +8 -0
  85. package/dist/handlers/campaign-remove-action.d.ts.map +1 -0
  86. package/dist/handlers/campaign-remove-action.js +43 -0
  87. package/dist/handlers/campaign-remove-action.js.map +1 -0
  88. package/dist/handlers/campaign-remove-action.test.d.ts +2 -0
  89. package/dist/handlers/campaign-remove-action.test.d.ts.map +1 -0
  90. package/dist/handlers/campaign-remove-action.test.js +79 -0
  91. package/dist/handlers/campaign-remove-action.test.js.map +1 -0
  92. package/dist/handlers/campaign-reorder-actions.d.ts +9 -0
  93. package/dist/handlers/campaign-reorder-actions.d.ts.map +1 -0
  94. package/dist/handlers/campaign-reorder-actions.js +66 -0
  95. package/dist/handlers/campaign-reorder-actions.js.map +1 -0
  96. package/dist/handlers/campaign-reorder-actions.test.d.ts +2 -0
  97. package/dist/handlers/campaign-reorder-actions.test.d.ts.map +1 -0
  98. package/dist/handlers/campaign-reorder-actions.test.js +118 -0
  99. package/dist/handlers/campaign-reorder-actions.test.js.map +1 -0
  100. package/dist/handlers/campaign-retry.d.ts +10 -0
  101. package/dist/handlers/campaign-retry.d.ts.map +1 -0
  102. package/dist/handlers/campaign-retry.js +45 -0
  103. package/dist/handlers/campaign-retry.js.map +1 -0
  104. package/dist/handlers/campaign-retry.test.d.ts +2 -0
  105. package/dist/handlers/campaign-retry.test.d.ts.map +1 -0
  106. package/dist/handlers/campaign-retry.test.js +111 -0
  107. package/dist/handlers/campaign-retry.test.js.map +1 -0
  108. package/dist/handlers/campaign-start.d.ts +10 -0
  109. package/dist/handlers/campaign-start.d.ts.map +1 -0
  110. package/dist/handlers/campaign-start.js +54 -0
  111. package/dist/handlers/campaign-start.js.map +1 -0
  112. package/dist/handlers/campaign-start.test.d.ts +2 -0
  113. package/dist/handlers/campaign-start.test.d.ts.map +1 -0
  114. package/dist/handlers/campaign-start.test.js +119 -0
  115. package/dist/handlers/campaign-start.test.js.map +1 -0
  116. package/dist/handlers/campaign-statistics.d.ts +10 -0
  117. package/dist/handlers/campaign-statistics.d.ts.map +1 -0
  118. package/dist/handlers/campaign-statistics.js +63 -0
  119. package/dist/handlers/campaign-statistics.js.map +1 -0
  120. package/dist/handlers/campaign-statistics.test.d.ts +2 -0
  121. package/dist/handlers/campaign-statistics.test.d.ts.map +1 -0
  122. package/dist/handlers/campaign-statistics.test.js +141 -0
  123. package/dist/handlers/campaign-statistics.test.js.map +1 -0
  124. package/dist/handlers/campaign-status.d.ts +10 -0
  125. package/dist/handlers/campaign-status.d.ts.map +1 -0
  126. package/dist/handlers/campaign-status.js +62 -0
  127. package/dist/handlers/campaign-status.js.map +1 -0
  128. package/dist/handlers/campaign-status.test.d.ts +2 -0
  129. package/dist/handlers/campaign-status.test.d.ts.map +1 -0
  130. package/dist/handlers/campaign-status.test.js +123 -0
  131. package/dist/handlers/campaign-status.test.js.map +1 -0
  132. package/dist/handlers/campaign-stop.d.ts +8 -0
  133. package/dist/handlers/campaign-stop.d.ts.map +1 -0
  134. package/dist/handlers/campaign-stop.js +39 -0
  135. package/dist/handlers/campaign-stop.js.map +1 -0
  136. package/dist/handlers/campaign-stop.test.d.ts +2 -0
  137. package/dist/handlers/campaign-stop.test.d.ts.map +1 -0
  138. package/dist/handlers/campaign-stop.test.js +73 -0
  139. package/dist/handlers/campaign-stop.test.js.map +1 -0
  140. package/dist/handlers/campaign-update.d.ts +11 -0
  141. package/dist/handlers/campaign-update.d.ts.map +1 -0
  142. package/dist/handlers/campaign-update.js +51 -0
  143. package/dist/handlers/campaign-update.js.map +1 -0
  144. package/dist/handlers/campaign-update.test.d.ts +2 -0
  145. package/dist/handlers/campaign-update.test.d.ts.map +1 -0
  146. package/dist/handlers/campaign-update.test.js +95 -0
  147. package/dist/handlers/campaign-update.test.js.map +1 -0
  148. package/dist/handlers/check-replies.d.ts +9 -0
  149. package/dist/handlers/check-replies.d.ts.map +1 -0
  150. package/dist/handlers/check-replies.js +49 -0
  151. package/dist/handlers/check-replies.js.map +1 -0
  152. package/dist/handlers/check-replies.test.d.ts +2 -0
  153. package/dist/handlers/check-replies.test.d.ts.map +1 -0
  154. package/dist/handlers/check-replies.test.js +138 -0
  155. package/dist/handlers/check-replies.test.js.map +1 -0
  156. package/dist/handlers/check-status.d.ts +3 -0
  157. package/dist/handlers/check-status.d.ts.map +1 -1
  158. package/dist/handlers/check-status.js +9 -3
  159. package/dist/handlers/check-status.js.map +1 -1
  160. package/dist/handlers/check-status.test.js +3 -1
  161. package/dist/handlers/check-status.test.js.map +1 -1
  162. package/dist/handlers/describe-actions.d.ts +7 -0
  163. package/dist/handlers/describe-actions.d.ts.map +1 -0
  164. package/dist/handlers/describe-actions.js +74 -0
  165. package/dist/handlers/describe-actions.js.map +1 -0
  166. package/dist/handlers/describe-actions.test.d.ts +2 -0
  167. package/dist/handlers/describe-actions.test.d.ts.map +1 -0
  168. package/dist/handlers/describe-actions.test.js +95 -0
  169. package/dist/handlers/describe-actions.test.js.map +1 -0
  170. package/dist/handlers/find-app.d.ts +5 -0
  171. package/dist/handlers/find-app.d.ts.map +1 -0
  172. package/dist/handlers/find-app.js +28 -0
  173. package/dist/handlers/find-app.js.map +1 -0
  174. package/dist/handlers/find-app.test.d.ts +2 -0
  175. package/dist/handlers/find-app.test.d.ts.map +1 -0
  176. package/dist/handlers/find-app.test.js +75 -0
  177. package/dist/handlers/find-app.test.js.map +1 -0
  178. package/dist/handlers/import-people-from-urls.d.ts +10 -0
  179. package/dist/handlers/import-people-from-urls.d.ts.map +1 -0
  180. package/dist/handlers/import-people-from-urls.js +96 -0
  181. package/dist/handlers/import-people-from-urls.js.map +1 -0
  182. package/dist/handlers/import-people-from-urls.test.d.ts +2 -0
  183. package/dist/handlers/import-people-from-urls.test.d.ts.map +1 -0
  184. package/dist/handlers/import-people-from-urls.test.js +166 -0
  185. package/dist/handlers/import-people-from-urls.test.js.map +1 -0
  186. package/dist/handlers/index.d.ts +26 -1
  187. package/dist/handlers/index.d.ts.map +1 -1
  188. package/dist/handlers/index.js +28 -1
  189. package/dist/handlers/index.js.map +1 -1
  190. package/dist/handlers/launch-app.d.ts +2 -3
  191. package/dist/handlers/launch-app.d.ts.map +1 -1
  192. package/dist/handlers/launch-app.js +7 -4
  193. package/dist/handlers/launch-app.js.map +1 -1
  194. package/dist/handlers/launch-app.test.js +8 -6
  195. package/dist/handlers/launch-app.test.js.map +1 -1
  196. package/dist/handlers/list-accounts.d.ts +3 -0
  197. package/dist/handlers/list-accounts.d.ts.map +1 -1
  198. package/dist/handlers/list-accounts.js +10 -4
  199. package/dist/handlers/list-accounts.js.map +1 -1
  200. package/dist/handlers/list-accounts.test.js +4 -13
  201. package/dist/handlers/list-accounts.test.js.map +1 -1
  202. package/dist/handlers/person-ids.d.ts +7 -0
  203. package/dist/handlers/person-ids.d.ts.map +1 -0
  204. package/dist/handlers/person-ids.js +50 -0
  205. package/dist/handlers/person-ids.js.map +1 -0
  206. package/dist/handlers/query-messages.d.ts +10 -0
  207. package/dist/handlers/query-messages.d.ts.map +1 -0
  208. package/dist/handlers/query-messages.integration.test.d.ts +2 -0
  209. package/dist/handlers/query-messages.integration.test.d.ts.map +1 -0
  210. package/dist/handlers/query-messages.integration.test.js +106 -0
  211. package/dist/handlers/query-messages.integration.test.js.map +1 -0
  212. package/dist/handlers/query-messages.js +113 -0
  213. package/dist/handlers/query-messages.js.map +1 -0
  214. package/dist/handlers/query-messages.test.d.ts +2 -0
  215. package/dist/handlers/query-messages.test.d.ts.map +1 -0
  216. package/dist/handlers/query-messages.test.js +231 -0
  217. package/dist/handlers/query-messages.test.js.map +1 -0
  218. package/dist/handlers/query-profile.d.ts +7 -0
  219. package/dist/handlers/query-profile.d.ts.map +1 -0
  220. package/dist/handlers/query-profile.js +79 -0
  221. package/dist/handlers/query-profile.js.map +1 -0
  222. package/dist/handlers/query-profile.test.d.ts +2 -0
  223. package/dist/handlers/query-profile.test.d.ts.map +1 -0
  224. package/dist/handlers/query-profile.test.js +221 -0
  225. package/dist/handlers/query-profile.test.js.map +1 -0
  226. package/dist/handlers/query-profiles.d.ts +9 -0
  227. package/dist/handlers/query-profiles.d.ts.map +1 -0
  228. package/dist/handlers/query-profiles.js +83 -0
  229. package/dist/handlers/query-profiles.js.map +1 -0
  230. package/dist/handlers/query-profiles.test.d.ts +2 -0
  231. package/dist/handlers/query-profiles.test.d.ts.map +1 -0
  232. package/dist/handlers/query-profiles.test.js +286 -0
  233. package/dist/handlers/query-profiles.test.js.map +1 -0
  234. package/dist/handlers/quit-app.d.ts +2 -3
  235. package/dist/handlers/quit-app.d.ts.map +1 -1
  236. package/dist/handlers/quit-app.js +7 -4
  237. package/dist/handlers/quit-app.js.map +1 -1
  238. package/dist/handlers/quit-app.test.js +6 -14
  239. package/dist/handlers/quit-app.test.js.map +1 -1
  240. package/dist/handlers/scrape-messaging-history.d.ts +8 -0
  241. package/dist/handlers/scrape-messaging-history.d.ts.map +1 -0
  242. package/dist/handlers/scrape-messaging-history.js +45 -0
  243. package/dist/handlers/scrape-messaging-history.js.map +1 -0
  244. package/dist/handlers/scrape-messaging-history.test.d.ts +2 -0
  245. package/dist/handlers/scrape-messaging-history.test.d.ts.map +1 -0
  246. package/dist/handlers/scrape-messaging-history.test.js +101 -0
  247. package/dist/handlers/scrape-messaging-history.test.js.map +1 -0
  248. package/dist/handlers/start-instance.d.ts +3 -0
  249. package/dist/handlers/start-instance.d.ts.map +1 -1
  250. package/dist/handlers/start-instance.js +11 -5
  251. package/dist/handlers/start-instance.js.map +1 -1
  252. package/dist/handlers/start-instance.test.js +13 -38
  253. package/dist/handlers/start-instance.test.js.map +1 -1
  254. package/dist/handlers/stop-instance.d.ts +3 -0
  255. package/dist/handlers/stop-instance.d.ts.map +1 -1
  256. package/dist/handlers/stop-instance.js +11 -5
  257. package/dist/handlers/stop-instance.js.map +1 -1
  258. package/dist/handlers/stop-instance.test.js +14 -30
  259. package/dist/handlers/stop-instance.test.js.map +1 -1
  260. package/dist/handlers/testing/mock-helpers.d.ts +56 -0
  261. package/dist/handlers/testing/mock-helpers.d.ts.map +1 -0
  262. package/dist/handlers/testing/mock-helpers.js +95 -0
  263. package/dist/handlers/testing/mock-helpers.js.map +1 -0
  264. package/dist/program.d.ts.map +1 -1
  265. package/dist/program.js +284 -8
  266. package/dist/program.js.map +1 -1
  267. package/dist/program.test.js +74 -12
  268. package/dist/program.test.js.map +1 -1
  269. package/package.json +9 -5
  270. package/dist/handlers/visit-and-extract.d.ts +0 -5
  271. package/dist/handlers/visit-and-extract.d.ts.map +0 -1
  272. package/dist/handlers/visit-and-extract.js +0 -105
  273. package/dist/handlers/visit-and-extract.js.map +0 -1
  274. package/dist/handlers/visit-and-extract.test.d.ts +0 -2
  275. package/dist/handlers/visit-and-extract.test.d.ts.map +0 -1
  276. package/dist/handlers/visit-and-extract.test.js +0 -279
  277. package/dist/handlers/visit-and-extract.test.js.map +0 -1
@@ -0,0 +1,5 @@
1
+ /** Handle the {@link https://github.com/alexey-pelykh/lhremote#app-management | find-app} CLI command. */
2
+ export declare function handleFindApp(options: {
3
+ json?: boolean;
4
+ }): Promise<void>;
5
+ //# sourceMappingURL=find-app.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-app.d.ts","sourceRoot":"","sources":["../../src/handlers/find-app.ts"],"names":[],"mappings":"AAKA,0GAA0G;AAC1G,wBAAsB,aAAa,CAAC,OAAO,EAAE;IAC3C,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2BhB"}
@@ -0,0 +1,28 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (C) 2026 Oleksii PELYKH
3
+ import { errorMessage, findApp } from "@lhremote/core";
4
+ /** Handle the {@link https://github.com/alexey-pelykh/lhremote#app-management | find-app} CLI command. */
5
+ export async function handleFindApp(options) {
6
+ try {
7
+ const apps = await findApp();
8
+ if (options.json) {
9
+ process.stdout.write(JSON.stringify(apps, null, 2) + "\n");
10
+ return;
11
+ }
12
+ if (apps.length === 0) {
13
+ process.stdout.write("No running LinkedHelper instances found\n");
14
+ return;
15
+ }
16
+ for (const app of apps) {
17
+ const port = app.cdpPort !== null ? `CDP port ${String(app.cdpPort)}` : "no CDP port";
18
+ const status = app.connectable ? "connectable" : "not connectable";
19
+ process.stdout.write(`PID ${String(app.pid)} — ${port} — ${status}\n`);
20
+ }
21
+ }
22
+ catch (error) {
23
+ const message = errorMessage(error);
24
+ process.stderr.write(`${message}\n`);
25
+ process.exitCode = 1;
26
+ }
27
+ }
28
+ //# sourceMappingURL=find-app.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-app.js","sourceRoot":"","sources":["../../src/handlers/find-app.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,oCAAoC;AAEpC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAEvD,0GAA0G;AAC1G,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAEnC;IACC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,OAAO,EAAE,CAAC;QAE7B,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;YAC3D,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;YAClE,OAAO;QACT,CAAC;QAED,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,IAAI,GACR,GAAG,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,YAAY,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC;YAC3E,MAAM,MAAM,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,iBAAiB,CAAC;YACnE,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,OAAO,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,IAAI,MAAM,MAAM,IAAI,CACjD,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QACpC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC;QACrC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=find-app.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-app.test.d.ts","sourceRoot":"","sources":["../../src/handlers/find-app.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,75 @@
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("@lhremote/core", async (importOriginal) => {
5
+ const actual = await importOriginal();
6
+ return {
7
+ ...actual,
8
+ findApp: vi.fn(),
9
+ };
10
+ });
11
+ import { findApp } from "@lhremote/core";
12
+ import { handleFindApp } from "./find-app.js";
13
+ import { getStdout } from "./testing/mock-helpers.js";
14
+ describe("handleFindApp", () => {
15
+ const originalExitCode = process.exitCode;
16
+ let stdoutSpy;
17
+ let stderrSpy;
18
+ beforeEach(() => {
19
+ process.exitCode = undefined;
20
+ vi.clearAllMocks();
21
+ stdoutSpy = vi.spyOn(process.stdout, "write").mockReturnValue(true);
22
+ stderrSpy = vi.spyOn(process.stderr, "write").mockReturnValue(true);
23
+ });
24
+ afterEach(() => {
25
+ process.exitCode = originalExitCode;
26
+ vi.restoreAllMocks();
27
+ });
28
+ it("prints JSON with --json", async () => {
29
+ const apps = [
30
+ { pid: 1234, cdpPort: 9222, connectable: true },
31
+ ];
32
+ vi.mocked(findApp).mockResolvedValue(apps);
33
+ await handleFindApp({ json: true });
34
+ expect(process.exitCode).toBeUndefined();
35
+ const parsed = JSON.parse(getStdout(stdoutSpy));
36
+ expect(parsed).toEqual(apps);
37
+ });
38
+ it("prints human-readable output for connectable instance", async () => {
39
+ vi.mocked(findApp).mockResolvedValue([
40
+ { pid: 1234, cdpPort: 9222, connectable: true },
41
+ ]);
42
+ await handleFindApp({});
43
+ expect(process.exitCode).toBeUndefined();
44
+ expect(getStdout(stdoutSpy)).toContain("PID 1234");
45
+ expect(getStdout(stdoutSpy)).toContain("CDP port 9222");
46
+ expect(getStdout(stdoutSpy)).toContain("connectable");
47
+ });
48
+ it("prints 'not connectable' for non-connectable instance", async () => {
49
+ vi.mocked(findApp).mockResolvedValue([
50
+ { pid: 5678, cdpPort: 9222, connectable: false },
51
+ ]);
52
+ await handleFindApp({});
53
+ expect(getStdout(stdoutSpy)).toContain("not connectable");
54
+ });
55
+ it("prints 'no CDP port' when cdpPort is null", async () => {
56
+ vi.mocked(findApp).mockResolvedValue([
57
+ { pid: 5678, cdpPort: null, connectable: false },
58
+ ]);
59
+ await handleFindApp({});
60
+ expect(getStdout(stdoutSpy)).toContain("no CDP port");
61
+ });
62
+ it("prints message when no instances found", async () => {
63
+ vi.mocked(findApp).mockResolvedValue([]);
64
+ await handleFindApp({});
65
+ expect(process.exitCode).toBeUndefined();
66
+ expect(getStdout(stdoutSpy)).toContain("No running LinkedHelper instances found");
67
+ });
68
+ it("sets exitCode 1 on error", async () => {
69
+ vi.mocked(findApp).mockRejectedValue(new Error("scan failed"));
70
+ await handleFindApp({});
71
+ expect(process.exitCode).toBe(1);
72
+ expect(stderrSpy).toHaveBeenCalledWith("scan failed\n");
73
+ });
74
+ });
75
+ //# sourceMappingURL=find-app.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-app.test.js","sourceRoot":"","sources":["../../src/handlers/find-app.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /** Handle the {@link https://github.com/alexey-pelykh/lhremote#campaign-targeting | import-people-from-urls} CLI command. */
2
+ export declare function handleImportPeopleFromUrls(campaignId: number, options: {
3
+ urls?: string;
4
+ urlsFile?: string;
5
+ cdpPort?: number;
6
+ cdpHost?: string;
7
+ allowRemote?: boolean;
8
+ json?: boolean;
9
+ }): Promise<void>;
10
+ //# sourceMappingURL=import-people-from-urls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import-people-from-urls.d.ts","sourceRoot":"","sources":["../../src/handlers/import-people-from-urls.ts"],"names":[],"mappings":"AA8BA,6HAA6H;AAC7H,wBAAsB,0BAA0B,CAC9C,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE;IACP,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,GACA,OAAO,CAAC,IAAI,CAAC,CA4Ef"}
@@ -0,0 +1,96 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (C) 2026 Oleksii PELYKH
3
+ import { readFileSync } from "node:fs";
4
+ import { CampaignExecutionError, CampaignNotFoundError, DEFAULT_CDP_PORT, errorMessage, InstanceNotRunningError, importPeopleFromUrls, } from "@lhremote/core";
5
+ function parseUrls(raw) {
6
+ return raw
7
+ .split(",")
8
+ .map((s) => s.trim())
9
+ .filter((s) => s.length > 0);
10
+ }
11
+ function readUrlsFile(filePath) {
12
+ const content = readFileSync(filePath, "utf-8");
13
+ return content
14
+ .split(/[\n,]/)
15
+ .map((s) => s.trim())
16
+ .filter((s) => s.length > 0);
17
+ }
18
+ /** Handle the {@link https://github.com/alexey-pelykh/lhremote#campaign-targeting | import-people-from-urls} CLI command. */
19
+ export async function handleImportPeopleFromUrls(campaignId, options) {
20
+ // Reject conflicting options
21
+ if (options.urls && options.urlsFile) {
22
+ process.stderr.write("Use only one of --urls or --urls-file.\n");
23
+ process.exitCode = 1;
24
+ return;
25
+ }
26
+ // Parse URLs from options
27
+ let linkedInUrls;
28
+ if (options.urls) {
29
+ linkedInUrls = parseUrls(options.urls);
30
+ }
31
+ else if (options.urlsFile) {
32
+ try {
33
+ linkedInUrls = readUrlsFile(options.urlsFile);
34
+ }
35
+ catch (error) {
36
+ const message = errorMessage(error);
37
+ process.stderr.write(`${message}\n`);
38
+ process.exitCode = 1;
39
+ return;
40
+ }
41
+ }
42
+ else {
43
+ process.stderr.write("Either --urls or --urls-file is required.\n");
44
+ process.exitCode = 1;
45
+ return;
46
+ }
47
+ if (linkedInUrls.length === 0) {
48
+ process.stderr.write("No URLs provided.\n");
49
+ process.exitCode = 1;
50
+ return;
51
+ }
52
+ let result;
53
+ try {
54
+ result = await importPeopleFromUrls({
55
+ campaignId,
56
+ linkedInUrls,
57
+ cdpPort: options.cdpPort ?? DEFAULT_CDP_PORT,
58
+ cdpHost: options.cdpHost,
59
+ allowRemote: options.allowRemote,
60
+ });
61
+ }
62
+ catch (error) {
63
+ if (error instanceof CampaignNotFoundError) {
64
+ process.stderr.write(`Campaign ${String(campaignId)} not found.\n`);
65
+ }
66
+ else if (error instanceof CampaignExecutionError) {
67
+ process.stderr.write(`Failed to import people: ${error.message}\n`);
68
+ }
69
+ else if (error instanceof InstanceNotRunningError) {
70
+ process.stderr.write(`${error.message}\n`);
71
+ }
72
+ else {
73
+ const message = errorMessage(error);
74
+ process.stderr.write(`${message}\n`);
75
+ }
76
+ process.exitCode = 1;
77
+ return;
78
+ }
79
+ if (options.json) {
80
+ process.stdout.write(JSON.stringify(result, null, 2) + "\n");
81
+ }
82
+ else {
83
+ process.stdout.write(`Imported ${String(result.imported)} people into campaign ${String(campaignId)} action ${String(result.actionId)}.` +
84
+ (result.alreadyInQueue > 0
85
+ ? ` ${String(result.alreadyInQueue)} already in queue.`
86
+ : "") +
87
+ (result.alreadyProcessed > 0
88
+ ? ` ${String(result.alreadyProcessed)} already processed.`
89
+ : "") +
90
+ (result.failed > 0
91
+ ? ` ${String(result.failed)} failed.`
92
+ : "") +
93
+ "\n");
94
+ }
95
+ }
96
+ //# sourceMappingURL=import-people-from-urls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import-people-from-urls.js","sourceRoot":"","sources":["../../src/handlers/import-people-from-urls.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=import-people-from-urls.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import-people-from-urls.test.d.ts","sourceRoot":"","sources":["../../src/handlers/import-people-from-urls.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,166 @@
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("@lhremote/core", async (importOriginal) => {
5
+ const actual = await importOriginal();
6
+ return {
7
+ ...actual,
8
+ importPeopleFromUrls: vi.fn(),
9
+ };
10
+ });
11
+ vi.mock("node:fs", async (importOriginal) => {
12
+ const actual = await importOriginal();
13
+ return {
14
+ ...actual,
15
+ readFileSync: vi.fn(),
16
+ };
17
+ });
18
+ import { CampaignExecutionError, CampaignNotFoundError, InstanceNotRunningError, importPeopleFromUrls, } from "@lhremote/core";
19
+ import { readFileSync } from "node:fs";
20
+ import { handleImportPeopleFromUrls } from "./import-people-from-urls.js";
21
+ import { getStdout } from "./testing/mock-helpers.js";
22
+ const MOCK_RESULT = {
23
+ success: true,
24
+ campaignId: 1,
25
+ actionId: 10,
26
+ imported: 3,
27
+ alreadyInQueue: 1,
28
+ alreadyProcessed: 0,
29
+ failed: 0,
30
+ };
31
+ describe("handleImportPeopleFromUrls", () => {
32
+ const originalExitCode = process.exitCode;
33
+ let stdoutSpy;
34
+ let stderrSpy;
35
+ beforeEach(() => {
36
+ process.exitCode = undefined;
37
+ vi.clearAllMocks();
38
+ stdoutSpy = vi.spyOn(process.stdout, "write").mockReturnValue(true);
39
+ stderrSpy = vi.spyOn(process.stderr, "write").mockReturnValue(true);
40
+ });
41
+ afterEach(() => {
42
+ process.exitCode = originalExitCode;
43
+ vi.restoreAllMocks();
44
+ });
45
+ it("imports people from --urls and prints result", async () => {
46
+ vi.mocked(importPeopleFromUrls).mockResolvedValue(MOCK_RESULT);
47
+ await handleImportPeopleFromUrls(1, {
48
+ urls: "https://linkedin.com/in/alice,https://linkedin.com/in/bob",
49
+ });
50
+ expect(process.exitCode).toBeUndefined();
51
+ const output = getStdout(stdoutSpy);
52
+ expect(output).toContain("Imported 3 people into campaign 1 action 10.");
53
+ expect(output).toContain("1 already in queue.");
54
+ });
55
+ it("imports from --urls-file", async () => {
56
+ vi.mocked(readFileSync).mockReturnValue("https://linkedin.com/in/alice\nhttps://linkedin.com/in/bob");
57
+ vi.mocked(importPeopleFromUrls).mockResolvedValue(MOCK_RESULT);
58
+ await handleImportPeopleFromUrls(1, { urlsFile: "urls.txt" });
59
+ expect(process.exitCode).toBeUndefined();
60
+ expect(getStdout(stdoutSpy)).toContain("Imported 3 people");
61
+ });
62
+ it("prints JSON with --json", async () => {
63
+ vi.mocked(importPeopleFromUrls).mockResolvedValue(MOCK_RESULT);
64
+ await handleImportPeopleFromUrls(1, {
65
+ urls: "https://linkedin.com/in/alice",
66
+ json: true,
67
+ });
68
+ expect(process.exitCode).toBeUndefined();
69
+ const parsed = JSON.parse(getStdout(stdoutSpy));
70
+ expect(parsed.success).toBe(true);
71
+ expect(parsed.campaignId).toBe(1);
72
+ expect(parsed.actionId).toBe(10);
73
+ expect(parsed.imported).toBe(3);
74
+ expect(parsed.alreadyInQueue).toBe(1);
75
+ });
76
+ it("shows already-processed and failed counts when non-zero", async () => {
77
+ vi.mocked(importPeopleFromUrls).mockResolvedValue({
78
+ ...MOCK_RESULT,
79
+ imported: 1,
80
+ alreadyInQueue: 0,
81
+ alreadyProcessed: 2,
82
+ failed: 1,
83
+ });
84
+ await handleImportPeopleFromUrls(1, {
85
+ urls: "https://linkedin.com/in/alice",
86
+ });
87
+ const output = getStdout(stdoutSpy);
88
+ expect(output).toContain("2 already processed.");
89
+ expect(output).toContain("1 failed.");
90
+ });
91
+ it("omits zero counts from human output", async () => {
92
+ vi.mocked(importPeopleFromUrls).mockResolvedValue({
93
+ ...MOCK_RESULT,
94
+ alreadyInQueue: 0,
95
+ alreadyProcessed: 0,
96
+ failed: 0,
97
+ });
98
+ await handleImportPeopleFromUrls(1, {
99
+ urls: "https://linkedin.com/in/alice",
100
+ });
101
+ const output = getStdout(stdoutSpy);
102
+ expect(output).not.toContain("already in queue");
103
+ expect(output).not.toContain("already processed");
104
+ expect(output).not.toContain("failed");
105
+ });
106
+ it("sets exitCode 1 when both url options provided", async () => {
107
+ await handleImportPeopleFromUrls(1, {
108
+ urls: "https://linkedin.com/in/alice",
109
+ urlsFile: "urls.txt",
110
+ });
111
+ expect(process.exitCode).toBe(1);
112
+ expect(stderrSpy).toHaveBeenCalledWith("Use only one of --urls or --urls-file.\n");
113
+ });
114
+ it("sets exitCode 1 when no url option provided", async () => {
115
+ await handleImportPeopleFromUrls(1, {});
116
+ expect(process.exitCode).toBe(1);
117
+ expect(stderrSpy).toHaveBeenCalledWith("Either --urls or --urls-file is required.\n");
118
+ });
119
+ it("sets exitCode 1 when URLs are empty", async () => {
120
+ vi.mocked(readFileSync).mockReturnValue("");
121
+ await handleImportPeopleFromUrls(1, { urlsFile: "empty.txt" });
122
+ expect(process.exitCode).toBe(1);
123
+ expect(stderrSpy).toHaveBeenCalledWith("No URLs provided.\n");
124
+ });
125
+ it("sets exitCode 1 when campaign not found", async () => {
126
+ vi.mocked(importPeopleFromUrls).mockRejectedValue(new CampaignNotFoundError(999));
127
+ await handleImportPeopleFromUrls(999, {
128
+ urls: "https://linkedin.com/in/alice",
129
+ });
130
+ expect(process.exitCode).toBe(1);
131
+ expect(stderrSpy).toHaveBeenCalledWith("Campaign 999 not found.\n");
132
+ });
133
+ it("sets exitCode 1 on CampaignExecutionError", async () => {
134
+ vi.mocked(importPeopleFromUrls).mockRejectedValue(new CampaignExecutionError("import failed"));
135
+ await handleImportPeopleFromUrls(1, {
136
+ urls: "https://linkedin.com/in/alice",
137
+ });
138
+ expect(process.exitCode).toBe(1);
139
+ expect(stderrSpy).toHaveBeenCalledWith("Failed to import people: import failed\n");
140
+ });
141
+ it("sets exitCode 1 on InstanceNotRunningError", async () => {
142
+ vi.mocked(importPeopleFromUrls).mockRejectedValue(new InstanceNotRunningError("No LinkedHelper instance is running."));
143
+ await handleImportPeopleFromUrls(1, {
144
+ urls: "https://linkedin.com/in/alice",
145
+ });
146
+ expect(process.exitCode).toBe(1);
147
+ expect(stderrSpy).toHaveBeenCalledWith("No LinkedHelper instance is running.\n");
148
+ });
149
+ it("sets exitCode 1 when resolveAccount fails", async () => {
150
+ vi.mocked(importPeopleFromUrls).mockRejectedValue(new Error("timeout"));
151
+ await handleImportPeopleFromUrls(1, {
152
+ urls: "https://linkedin.com/in/alice",
153
+ });
154
+ expect(process.exitCode).toBe(1);
155
+ expect(stderrSpy).toHaveBeenCalledWith("timeout\n");
156
+ });
157
+ it("sets exitCode 1 when urls-file read fails", async () => {
158
+ vi.mocked(readFileSync).mockImplementation(() => {
159
+ throw new Error("ENOENT: no such file");
160
+ });
161
+ await handleImportPeopleFromUrls(1, { urlsFile: "missing.txt" });
162
+ expect(process.exitCode).toBe(1);
163
+ expect(stderrSpy).toHaveBeenCalledWith(expect.stringContaining("ENOENT"));
164
+ });
165
+ });
166
+ //# sourceMappingURL=import-people-from-urls.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import-people-from-urls.test.js","sourceRoot":"","sources":["../../src/handlers/import-people-from-urls.test.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,33 @@
1
+ export { handleCampaignAddAction } from "./campaign-add-action.js";
2
+ export { handleCampaignCreate } from "./campaign-create.js";
3
+ export { handleCampaignDelete } from "./campaign-delete.js";
4
+ export { handleCampaignExcludeAdd } from "./campaign-exclude-add.js";
5
+ export { handleCampaignExcludeList } from "./campaign-exclude-list.js";
6
+ export { handleCampaignExcludeRemove } from "./campaign-exclude-remove.js";
7
+ export { handleCampaignExport } from "./campaign-export.js";
8
+ export { handleCampaignGet } from "./campaign-get.js";
9
+ export { handleCampaignList } from "./campaign-list.js";
10
+ export { handleCampaignMoveNext } from "./campaign-move-next.js";
11
+ export { handleCampaignRemoveAction } from "./campaign-remove-action.js";
12
+ export { handleCampaignReorderActions } from "./campaign-reorder-actions.js";
13
+ export { handleCampaignRetry } from "./campaign-retry.js";
14
+ export { handleCampaignStart } from "./campaign-start.js";
15
+ export { handleCampaignStatistics } from "./campaign-statistics.js";
16
+ export { handleCampaignStatus } from "./campaign-status.js";
17
+ export { handleImportPeopleFromUrls } from "./import-people-from-urls.js";
18
+ export { handleCampaignStop } from "./campaign-stop.js";
19
+ export { handleCampaignUpdate } from "./campaign-update.js";
20
+ export { handleCheckReplies } from "./check-replies.js";
21
+ export { handleDescribeActions } from "./describe-actions.js";
1
22
  export { handleCheckStatus } from "./check-status.js";
23
+ export { handleFindApp } from "./find-app.js";
24
+ export { handleQueryMessages } from "./query-messages.js";
25
+ export { handleQueryProfile } from "./query-profile.js";
26
+ export { handleQueryProfiles } from "./query-profiles.js";
27
+ export { handleScrapeMessagingHistory } from "./scrape-messaging-history.js";
2
28
  export { handleLaunchApp } from "./launch-app.js";
3
29
  export { handleListAccounts } from "./list-accounts.js";
4
30
  export { handleQuitApp } from "./quit-app.js";
5
31
  export { handleStartInstance } from "./start-instance.js";
6
32
  export { handleStopInstance } from "./stop-instance.js";
7
- export { handleVisitAndExtract } from "./visit-and-extract.js";
8
33
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/handlers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/handlers/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAE,2BAA2B,EAAE,MAAM,8BAA8B,CAAC;AAC3E,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AACzE,OAAO,EAAE,4BAA4B,EAAE,MAAM,+BAA+B,CAAC;AAC7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,4BAA4B,EAAE,MAAM,+BAA+B,CAAC;AAC7E,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -1,8 +1,35 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (C) 2026 Oleksii PELYKH
3
+ export { handleCampaignAddAction } from "./campaign-add-action.js";
4
+ export { handleCampaignCreate } from "./campaign-create.js";
5
+ export { handleCampaignDelete } from "./campaign-delete.js";
6
+ export { handleCampaignExcludeAdd } from "./campaign-exclude-add.js";
7
+ export { handleCampaignExcludeList } from "./campaign-exclude-list.js";
8
+ export { handleCampaignExcludeRemove } from "./campaign-exclude-remove.js";
9
+ export { handleCampaignExport } from "./campaign-export.js";
10
+ export { handleCampaignGet } from "./campaign-get.js";
11
+ export { handleCampaignList } from "./campaign-list.js";
12
+ export { handleCampaignMoveNext } from "./campaign-move-next.js";
13
+ export { handleCampaignRemoveAction } from "./campaign-remove-action.js";
14
+ export { handleCampaignReorderActions } from "./campaign-reorder-actions.js";
15
+ export { handleCampaignRetry } from "./campaign-retry.js";
16
+ export { handleCampaignStart } from "./campaign-start.js";
17
+ export { handleCampaignStatistics } from "./campaign-statistics.js";
18
+ export { handleCampaignStatus } from "./campaign-status.js";
19
+ export { handleImportPeopleFromUrls } from "./import-people-from-urls.js";
20
+ export { handleCampaignStop } from "./campaign-stop.js";
21
+ export { handleCampaignUpdate } from "./campaign-update.js";
22
+ export { handleCheckReplies } from "./check-replies.js";
23
+ export { handleDescribeActions } from "./describe-actions.js";
1
24
  export { handleCheckStatus } from "./check-status.js";
25
+ export { handleFindApp } from "./find-app.js";
26
+ export { handleQueryMessages } from "./query-messages.js";
27
+ export { handleQueryProfile } from "./query-profile.js";
28
+ export { handleQueryProfiles } from "./query-profiles.js";
29
+ export { handleScrapeMessagingHistory } from "./scrape-messaging-history.js";
2
30
  export { handleLaunchApp } from "./launch-app.js";
3
31
  export { handleListAccounts } from "./list-accounts.js";
4
32
  export { handleQuitApp } from "./quit-app.js";
5
33
  export { handleStartInstance } from "./start-instance.js";
6
34
  export { handleStopInstance } from "./stop-instance.js";
7
- export { handleVisitAndExtract } from "./visit-and-extract.js";
8
35
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/handlers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/handlers/index.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,oCAAoC;AAEpC,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAE,2BAA2B,EAAE,MAAM,8BAA8B,CAAC;AAC3E,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AACzE,OAAO,EAAE,4BAA4B,EAAE,MAAM,+BAA+B,CAAC;AAC7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,4BAA4B,EAAE,MAAM,+BAA+B,CAAC;AAC7E,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -1,4 +1,3 @@
1
- export declare function handleLaunchApp(options: {
2
- cdpPort?: number;
3
- }): Promise<void>;
1
+ /** Handle the {@link https://github.com/alexey-pelykh/lhremote#app-management | launch-app} CLI command. */
2
+ export declare function handleLaunchApp(): Promise<void>;
4
3
  //# sourceMappingURL=launch-app.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"launch-app.d.ts","sourceRoot":"","sources":["../../src/handlers/launch-app.ts"],"names":[],"mappings":"AAEA,wBAAsB,eAAe,CAAC,OAAO,EAAE;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,IAAI,CAAC,CAehB"}
1
+ {"version":3,"file":"launch-app.d.ts","sourceRoot":"","sources":["../../src/handlers/launch-app.ts"],"names":[],"mappings":"AAKA,4GAA4G;AAC5G,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAerD"}
@@ -1,11 +1,14 @@
1
- import { AppService } from "@lhremote/core";
2
- export async function handleLaunchApp(options) {
3
- const app = new AppService(options.cdpPort);
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (C) 2026 Oleksii PELYKH
3
+ import { AppService, errorMessage } from "@lhremote/core";
4
+ /** Handle the {@link https://github.com/alexey-pelykh/lhremote#app-management | launch-app} CLI command. */
5
+ export async function handleLaunchApp() {
6
+ const app = new AppService();
4
7
  try {
5
8
  await app.launch();
6
9
  }
7
10
  catch (error) {
8
- const message = error instanceof Error ? error.message : String(error);
11
+ const message = errorMessage(error);
9
12
  process.stderr.write(`${message}\n`);
10
13
  process.exitCode = 1;
11
14
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"launch-app.js","sourceRoot":"","sources":["../../src/handlers/launch-app.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAErC;IACC,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAE5C,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC;IACrB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC;QACrC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,qCAAqC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAC7D,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"launch-app.js","sourceRoot":"","sources":["../../src/handlers/launch-app.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,oCAAoC;AAEpC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE1D,4GAA4G;AAC5G,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,MAAM,GAAG,GAAG,IAAI,UAAU,EAAE,CAAC;IAE7B,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC;IACrB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QACpC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC;QACrC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,qCAAqC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAC7D,CAAC;AACJ,CAAC"}
@@ -1,3 +1,5 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (C) 2026 Oleksii PELYKH
1
3
  import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
2
4
  vi.mock("@lhremote/core", async (importOriginal) => {
3
5
  const actual = await importOriginal();
@@ -28,20 +30,20 @@ describe("handleLaunchApp", () => {
28
30
  cdpPort: 9222,
29
31
  };
30
32
  });
31
- await handleLaunchApp({});
33
+ await handleLaunchApp();
32
34
  expect(stdoutSpy).toHaveBeenCalledWith("LinkedHelper launched on CDP port 9222\n");
33
35
  expect(process.exitCode).toBeUndefined();
34
36
  });
35
- it("passes cdpPort option to AppService", async () => {
37
+ it("creates AppService without explicit port", async () => {
36
38
  vi.spyOn(process.stdout, "write").mockReturnValue(true);
37
39
  vi.mocked(AppService).mockImplementation(function () {
38
40
  return {
39
41
  launch: vi.fn().mockResolvedValue(undefined),
40
- cdpPort: 4567,
42
+ cdpPort: 9222,
41
43
  };
42
44
  });
43
- await handleLaunchApp({ cdpPort: 4567 });
44
- expect(AppService).toHaveBeenCalledWith(4567);
45
+ await handleLaunchApp();
46
+ expect(AppService).toHaveBeenCalledWith();
45
47
  });
46
48
  it("sets exitCode 1 on error", async () => {
47
49
  const stderrSpy = vi
@@ -54,7 +56,7 @@ describe("handleLaunchApp", () => {
54
56
  .mockRejectedValue(new AppNotFoundError("Binary not found at /foo")),
55
57
  };
56
58
  });
57
- await handleLaunchApp({});
59
+ await handleLaunchApp();
58
60
  expect(process.exitCode).toBe(1);
59
61
  expect(stderrSpy).toHaveBeenCalledWith("Binary not found at /foo\n");
60
62
  });
@@ -1 +1 @@
1
- {"version":3,"file":"launch-app.test.js","sourceRoot":"","sources":["../../src/handlers/launch-app.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"launch-app.test.js","sourceRoot":"","sources":["../../src/handlers/launch-app.test.ts"],"names":[],"mappings":"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"}