@lhremote/core 0.9.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 (119) hide show
  1. package/dist/db/repositories/campaign-hard-delete.integration.test.js +4 -1
  2. package/dist/db/repositories/campaign-hard-delete.integration.test.js.map +1 -1
  3. package/dist/db/repositories/campaign.d.ts.map +1 -1
  4. package/dist/db/repositories/campaign.js +81 -33
  5. package/dist/db/repositories/campaign.js.map +1 -1
  6. package/dist/db/repositories/campaign.test.js +2 -2
  7. package/dist/db/repositories/collection-list.d.ts +11 -0
  8. package/dist/db/repositories/collection-list.d.ts.map +1 -1
  9. package/dist/db/repositories/collection-list.js +92 -2
  10. package/dist/db/repositories/collection-list.js.map +1 -1
  11. package/dist/db/testing/create-fixture.js +36 -2
  12. package/dist/db/testing/create-fixture.js.map +1 -1
  13. package/dist/index.d.ts +1 -1
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +1 -1
  16. package/dist/index.js.map +1 -1
  17. package/dist/linkedin/dom-automation.d.ts +9 -6
  18. package/dist/linkedin/dom-automation.d.ts.map +1 -1
  19. package/dist/linkedin/dom-automation.js +20 -20
  20. package/dist/linkedin/dom-automation.js.map +1 -1
  21. package/dist/linkedin/index.d.ts +1 -1
  22. package/dist/linkedin/index.d.ts.map +1 -1
  23. package/dist/linkedin/index.js +1 -1
  24. package/dist/linkedin/index.js.map +1 -1
  25. package/dist/linkedin/selectors.d.ts +74 -48
  26. package/dist/linkedin/selectors.d.ts.map +1 -1
  27. package/dist/linkedin/selectors.js +64 -41
  28. package/dist/linkedin/selectors.js.map +1 -1
  29. package/dist/operations/check-replies.d.ts.map +1 -1
  30. package/dist/operations/check-replies.js +7 -15
  31. package/dist/operations/check-replies.js.map +1 -1
  32. package/dist/operations/check-replies.test.js +1 -26
  33. package/dist/operations/check-replies.test.js.map +1 -1
  34. package/dist/operations/collect-people.d.ts.map +1 -1
  35. package/dist/operations/collect-people.js +15 -6
  36. package/dist/operations/collect-people.js.map +1 -1
  37. package/dist/operations/collect-people.test.js +21 -5
  38. package/dist/operations/collect-people.test.js.map +1 -1
  39. package/dist/operations/create-collection.d.ts.map +1 -1
  40. package/dist/operations/create-collection.js +2 -1
  41. package/dist/operations/create-collection.js.map +1 -1
  42. package/dist/operations/create-collection.test.js +3 -1
  43. package/dist/operations/create-collection.test.js.map +1 -1
  44. package/dist/operations/dismiss-errors.d.ts +4 -1
  45. package/dist/operations/dismiss-errors.d.ts.map +1 -1
  46. package/dist/operations/dismiss-errors.js +16 -1
  47. package/dist/operations/dismiss-errors.js.map +1 -1
  48. package/dist/operations/dismiss-errors.test.js +76 -2
  49. package/dist/operations/dismiss-errors.test.js.map +1 -1
  50. package/dist/operations/ephemeral-action.d.ts +1 -0
  51. package/dist/operations/ephemeral-action.d.ts.map +1 -1
  52. package/dist/operations/ephemeral-action.js +2 -1
  53. package/dist/operations/ephemeral-action.js.map +1 -1
  54. package/dist/operations/ephemeral-action.test.js +20 -1
  55. package/dist/operations/ephemeral-action.test.js.map +1 -1
  56. package/dist/operations/react-to-post.d.ts +13 -4
  57. package/dist/operations/react-to-post.d.ts.map +1 -1
  58. package/dist/operations/react-to-post.js +74 -10
  59. package/dist/operations/react-to-post.js.map +1 -1
  60. package/dist/operations/react-to-post.test.js +49 -2
  61. package/dist/operations/react-to-post.test.js.map +1 -1
  62. package/dist/operations/scrape-messaging-history.d.ts.map +1 -1
  63. package/dist/operations/scrape-messaging-history.js +7 -15
  64. package/dist/operations/scrape-messaging-history.js.map +1 -1
  65. package/dist/operations/scrape-messaging-history.test.js +1 -26
  66. package/dist/operations/scrape-messaging-history.test.js.map +1 -1
  67. package/dist/operations/types.d.ts +3 -0
  68. package/dist/operations/types.d.ts.map +1 -1
  69. package/dist/operations/types.js +1 -0
  70. package/dist/operations/types.js.map +1 -1
  71. package/dist/services/account-resolution.d.ts +1 -0
  72. package/dist/services/account-resolution.d.ts.map +1 -1
  73. package/dist/services/account-resolution.js +3 -0
  74. package/dist/services/account-resolution.js.map +1 -1
  75. package/dist/services/campaign.d.ts +7 -3
  76. package/dist/services/campaign.d.ts.map +1 -1
  77. package/dist/services/campaign.js +73 -14
  78. package/dist/services/campaign.js.map +1 -1
  79. package/dist/services/campaign.test.js +53 -15
  80. package/dist/services/campaign.test.js.map +1 -1
  81. package/dist/services/collection.d.ts +16 -21
  82. package/dist/services/collection.d.ts.map +1 -1
  83. package/dist/services/collection.js +34 -47
  84. package/dist/services/collection.js.map +1 -1
  85. package/dist/services/collection.test.js +30 -91
  86. package/dist/services/collection.test.js.map +1 -1
  87. package/dist/services/ephemeral-campaign.d.ts +6 -0
  88. package/dist/services/ephemeral-campaign.d.ts.map +1 -1
  89. package/dist/services/ephemeral-campaign.js +54 -10
  90. package/dist/services/ephemeral-campaign.js.map +1 -1
  91. package/dist/services/ephemeral-campaign.test.js +23 -10
  92. package/dist/services/ephemeral-campaign.test.js.map +1 -1
  93. package/dist/services/index.d.ts +1 -1
  94. package/dist/services/index.d.ts.map +1 -1
  95. package/dist/services/index.js +1 -1
  96. package/dist/services/index.js.map +1 -1
  97. package/dist/services/instance.d.ts +18 -2
  98. package/dist/services/instance.d.ts.map +1 -1
  99. package/dist/services/instance.js +44 -8
  100. package/dist/services/instance.js.map +1 -1
  101. package/dist/services/instance.test.js +92 -0
  102. package/dist/services/instance.test.js.map +1 -1
  103. package/dist/services/source-type-registry.d.ts +8 -0
  104. package/dist/services/source-type-registry.d.ts.map +1 -1
  105. package/dist/services/source-type-registry.js +39 -0
  106. package/dist/services/source-type-registry.js.map +1 -1
  107. package/dist/services/source-type-registry.test.js +31 -1
  108. package/dist/services/source-type-registry.test.js.map +1 -1
  109. package/dist/testing/e2e-helpers.d.ts +24 -0
  110. package/dist/testing/e2e-helpers.d.ts.map +1 -1
  111. package/dist/testing/e2e-helpers.js +135 -3
  112. package/dist/testing/e2e-helpers.js.map +1 -1
  113. package/dist/testing/index.d.ts +1 -1
  114. package/dist/testing/index.d.ts.map +1 -1
  115. package/dist/testing/index.js +1 -1
  116. package/dist/testing/index.js.map +1 -1
  117. package/dist/types/campaign.d.ts +1 -1
  118. package/dist/types/campaign.d.ts.map +1 -1
  119. package/package.json +1 -1
@@ -2,7 +2,7 @@
2
2
  // Copyright (C) 2026 Oleksii PELYKH
3
3
  import { delay } from "../utils/delay.js";
4
4
  import { errorMessage } from "../utils/error-message.js";
5
- import { detectSourceType } from "./source-type-registry.js";
5
+ import { detectSourceType, toInternalSourceType } from "./source-type-registry.js";
6
6
  import { CollectionBusyError, CollectionError } from "./errors.js";
7
7
  /** Timeout for polling `canCollect` after navigation (ms). */
8
8
  const CAN_COLLECT_TIMEOUT = 10_000;
@@ -27,8 +27,9 @@ export class CollectionService {
27
27
  * Initiate people collection from a LinkedIn source URL.
28
28
  *
29
29
  * Validates that the source URL is a recognized LinkedIn page type,
30
- * ensures the instance is idle, then calls `canCollect`
31
- * `prepareCollecting` `collect` via CDP.
30
+ * ensures the instance is idle, navigates to the URL, verifies the
31
+ * page is recognized, then drives the LinkedHelper state machine
32
+ * through its Redux saga to start collection.
32
33
  *
33
34
  * Returns immediately after initiating collection — the actual
34
35
  * collection runs asynchronously in LinkedHelper. Poll the runner
@@ -41,7 +42,7 @@ export class CollectionService {
41
42
  * or the CDP calls fail.
42
43
  * @throws {CollectionBusyError} if the instance is not idle.
43
44
  */
44
- async collect(sourceUrl, _campaignId, options) {
45
+ async collect(sourceUrl, campaignId, actionId) {
45
46
  const sourceType = detectSourceType(sourceUrl);
46
47
  if (!sourceType) {
47
48
  throw new CollectionError(`Unrecognized source URL: ${sourceUrl} — cannot determine LinkedIn page type`);
@@ -58,16 +59,7 @@ export class CollectionService {
58
59
  }
59
60
  await this.assertCanCollect(sourceType);
60
61
  try {
61
- await this.prepareCollecting(sourceType);
62
- }
63
- catch (error) {
64
- if (error instanceof CollectionError)
65
- throw error;
66
- const message = errorMessage(error);
67
- throw new CollectionError(`Failed to prepare collection for ${sourceType}: ${message}`, { cause: error });
68
- }
69
- try {
70
- await this.startCollecting(options);
62
+ await this.startCollecting(sourceType, campaignId, actionId);
71
63
  }
72
64
  catch (error) {
73
65
  if (error instanceof CollectionError)
@@ -83,9 +75,10 @@ export class CollectionService {
83
75
  * LinkedHelper browser is currently on a matching source page.
84
76
  */
85
77
  async canCollect(sourceType) {
78
+ const internalType = toInternalSourceType(sourceType);
86
79
  return this.instance.evaluateUI(`(async () => {
87
80
  const mws = window.mainWindowService;
88
- return await mws.call('canCollect', ${JSON.stringify(sourceType)});
81
+ return await mws.call('canCollect', ${JSON.stringify(internalType)});
89
82
  })()`);
90
83
  }
91
84
  /**
@@ -131,43 +124,37 @@ export class CollectionService {
131
124
  throw new CollectionError(`Cannot collect from ${sourceType} — the LinkedIn browser is not on a matching page (polled for ${String(elapsed)}ms)`);
132
125
  }
133
126
  /**
134
- * Call `prepareCollecting` to transition the state machine from
135
- * `idle` to `preparing-collecting`.
127
+ * Call `collect` on the main process with the correct two-argument
128
+ * signature discovered from LinkedHelper's renderer source:
136
129
  *
137
- * @throws {CollectionError} if the call returns `false`.
138
- */
139
- async prepareCollecting(sourceType) {
140
- const result = await this.instance.evaluateUI(`(async () => {
141
- const mws = window.mainWindowService;
142
- return await mws.call('prepareCollecting', ${JSON.stringify({
143
- type: sourceType,
144
- actionType: "AutoCollectPeople",
145
- })});
146
- })()`);
147
- if (!result) {
148
- throw new CollectionError(`prepareCollecting returned false for ${sourceType} — state machine did not transition`);
149
- }
150
- }
151
- /**
152
- * Call `collect` to start the actual collection process.
130
+ * ```
131
+ * mainWindowService.call("collect", sourceType, {
132
+ * campaignId, actionId, target, withoutScraping
133
+ * })
134
+ * ```
135
+ *
136
+ * The main process `collect` method expects the source type as the
137
+ * first argument and a config object as the second. The config must
138
+ * include `actionId` (the campaign action to collect into) and
139
+ * `target` (the collection target type).
153
140
  *
154
141
  * @throws {CollectionError} if the call returns `false`.
155
142
  */
156
- async startCollecting(options) {
157
- const params = {};
158
- if (options?.limit !== undefined)
159
- params.limit = options.limit;
160
- if (options?.maxPages !== undefined)
161
- params.maxPages = options.maxPages;
162
- if (options?.pageSize !== undefined)
163
- params.pageSize = options.pageSize;
164
- const result = await this.instance.evaluateUI(`(async () => {
143
+ async startCollecting(sourceType, campaignId, actionId) {
144
+ const internalType = toInternalSourceType(sourceType);
145
+ const config = {
146
+ campaignId,
147
+ actionId,
148
+ target: "target",
149
+ };
150
+ // Fire-and-forget: the collect IPC method blocks until collection
151
+ // finishes (which can take minutes). We start it without awaiting
152
+ // the result — callers poll getRunnerState() for progress.
153
+ await this.instance.evaluateUI(`(() => {
165
154
  const mws = window.mainWindowService;
166
- return await mws.call('collect', ${JSON.stringify(params)});
167
- })()`);
168
- if (!result) {
169
- throw new CollectionError("collect returned false — state machine was not in collecting state");
170
- }
155
+ mws.call('collect', ${JSON.stringify(internalType)}, ${JSON.stringify(config)});
156
+ return true;
157
+ })()`, false);
171
158
  }
172
159
  }
173
160
  //# sourceMappingURL=collection.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"collection.js","sourceRoot":"","sources":["../../src/services/collection.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"collection.js","sourceRoot":"","sources":["../../src/services/collection.ts"],"names":[],"mappings":"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"}
@@ -32,71 +32,49 @@ describe("CollectionService", () => {
32
32
  mockEvaluateUI
33
33
  .mockResolvedValueOnce("idle") // getRunnerState
34
34
  .mockResolvedValueOnce(true) // canCollect
35
- .mockResolvedValueOnce(true) // prepareCollecting
36
35
  .mockResolvedValueOnce(true); // collect
37
- await service.collect(SEARCH_URL, 1);
36
+ await service.collect(SEARCH_URL, 1, 10);
38
37
  // Navigation via LinkedIn webview
39
38
  expect(mockNavigateLinkedIn).toHaveBeenCalledWith(SEARCH_URL);
40
- expect(mockEvaluateUI).toHaveBeenCalledTimes(4);
39
+ expect(mockEvaluateUI).toHaveBeenCalledTimes(3);
41
40
  // 1. Runner state check
42
41
  const stateExpr = mockEvaluateUI.mock.calls[0]?.[0];
43
42
  expect(stateExpr).toContain("mainWindowService.mainWindow.state");
44
- // 2. canCollect
43
+ // 2. canCollect — uses internal kebab-case type
45
44
  const canCollectExpr = mockEvaluateUI.mock.calls[1]?.[0];
46
45
  expect(canCollectExpr).toContain("canCollect");
47
- expect(canCollectExpr).toContain("SearchPage");
48
- // 3. prepareCollecting
49
- const prepareExpr = mockEvaluateUI.mock.calls[2]?.[0];
50
- expect(prepareExpr).toContain("prepareCollecting");
51
- expect(prepareExpr).toContain("SearchPage");
52
- expect(prepareExpr).toContain("AutoCollectPeople");
53
- // 4. collect
54
- const collectExpr = mockEvaluateUI.mock.calls[3]?.[0];
46
+ expect(canCollectExpr).toContain("search-page");
47
+ // 3. collect — uses internal kebab-case type as first arg, config as second
48
+ const collectExpr = mockEvaluateUI.mock.calls[2]?.[0];
55
49
  expect(collectExpr).toContain("mws.call('collect'");
50
+ expect(collectExpr).toContain("search-page");
51
+ expect(collectExpr).toContain('"campaignId":1');
52
+ expect(collectExpr).toContain('"actionId":10');
56
53
  });
57
- it("passes limit, maxPages, pageSize to collect call", async () => {
54
+ it("passes actionId and target in collect config", async () => {
58
55
  mockEvaluateUI
59
56
  .mockResolvedValueOnce("idle")
60
57
  .mockResolvedValueOnce(true)
61
- .mockResolvedValueOnce(true)
62
- .mockResolvedValueOnce(true);
63
- await service.collect(SEARCH_URL, 1, {
64
- limit: 100,
65
- maxPages: 5,
66
- pageSize: 25,
67
- });
68
- const collectExpr = mockEvaluateUI.mock.calls[3]?.[0];
69
- expect(collectExpr).toContain('"limit":100');
70
- expect(collectExpr).toContain('"maxPages":5');
71
- expect(collectExpr).toContain('"pageSize":25');
72
- });
73
- it("omits undefined options from collect call", async () => {
74
- mockEvaluateUI
75
- .mockResolvedValueOnce("idle")
76
- .mockResolvedValueOnce(true)
77
- .mockResolvedValueOnce(true)
78
58
  .mockResolvedValueOnce(true);
79
- await service.collect(SEARCH_URL, 1, { limit: 50 });
80
- const collectExpr = mockEvaluateUI.mock.calls[3]?.[0];
81
- expect(collectExpr).toContain('"limit":50');
82
- expect(collectExpr).not.toContain("maxPages");
83
- expect(collectExpr).not.toContain("pageSize");
59
+ await service.collect(SEARCH_URL, 1, 10);
60
+ const collectExpr = mockEvaluateUI.mock.calls[2]?.[0];
61
+ expect(collectExpr).toContain('"actionId":10');
62
+ expect(collectExpr).toContain('"target":"target"');
84
63
  });
85
64
  it("detects OrganizationPeople source type from company URL", async () => {
86
65
  mockEvaluateUI
87
66
  .mockResolvedValueOnce("idle")
88
67
  .mockResolvedValueOnce(true)
89
- .mockResolvedValueOnce(true)
90
68
  .mockResolvedValueOnce(true);
91
- await service.collect(ORG_PEOPLE_URL, 1);
69
+ await service.collect(ORG_PEOPLE_URL, 1, 10);
92
70
  const canCollectExpr = mockEvaluateUI.mock.calls[1]?.[0];
93
- expect(canCollectExpr).toContain("OrganizationPeople");
94
- const prepareExpr = mockEvaluateUI.mock.calls[2]?.[0];
95
- expect(prepareExpr).toContain("OrganizationPeople");
71
+ expect(canCollectExpr).toContain("organization-people");
72
+ const collectExpr = mockEvaluateUI.mock.calls[2]?.[0];
73
+ expect(collectExpr).toContain("organization-people");
96
74
  });
97
75
  it("throws CollectionError for unrecognized source URL", async () => {
98
76
  const error = await service
99
- .collect("https://www.linkedin.com/feed/", 1)
77
+ .collect("https://www.linkedin.com/feed/", 1, 10)
100
78
  .catch((e) => e);
101
79
  expect(error).toBeInstanceOf(CollectionError);
102
80
  expect(error.message).toContain("Unrecognized source URL");
@@ -105,14 +83,14 @@ describe("CollectionService", () => {
105
83
  });
106
84
  it("throws CollectionBusyError when runner is not idle", async () => {
107
85
  mockEvaluateUI.mockResolvedValueOnce("campaigns");
108
- await expect(service.collect(SEARCH_URL, 1)).rejects.toThrow(CollectionBusyError);
86
+ await expect(service.collect(SEARCH_URL, 1, 10)).rejects.toThrow(CollectionBusyError);
109
87
  // Only the runner state check should be made
110
88
  expect(mockEvaluateUI).toHaveBeenCalledTimes(1);
111
89
  });
112
90
  it("includes runner state in CollectionBusyError", async () => {
113
91
  mockEvaluateUI.mockResolvedValueOnce("campaigns");
114
92
  try {
115
- await service.collect(SEARCH_URL, 1);
93
+ await service.collect(SEARCH_URL, 1, 10);
116
94
  expect.unreachable("should have thrown");
117
95
  }
118
96
  catch (error) {
@@ -133,28 +111,24 @@ describe("CollectionService", () => {
133
111
  .mockResolvedValueOnce(false) // canCollect attempt 1
134
112
  .mockResolvedValueOnce(false) // canCollect attempt 2
135
113
  .mockResolvedValueOnce(true) // canCollect attempt 3 — success
136
- .mockResolvedValueOnce(true) // prepareCollecting
137
114
  .mockResolvedValueOnce(true); // collect
138
- const promise = service.collect(SEARCH_URL, 1);
115
+ const promise = service.collect(SEARCH_URL, 1, 10);
139
116
  await vi.advanceTimersByTimeAsync(2000);
140
117
  await promise;
141
118
  // canCollect was called 3 times before success
142
- const canCollectCalls = mockEvaluateUI.mock.calls.filter((call) => call[0].includes("canCollect") &&
143
- !call[0].includes("prepareCollecting"));
119
+ const canCollectCalls = mockEvaluateUI.mock.calls.filter((call) => call[0].includes("canCollect"));
144
120
  expect(canCollectCalls).toHaveLength(3);
145
121
  });
146
122
  it("succeeds on first canCollect check without polling delay", async () => {
147
123
  mockEvaluateUI
148
124
  .mockResolvedValueOnce("idle") // getRunnerState
149
125
  .mockResolvedValueOnce(true) // canCollect — immediate success
150
- .mockResolvedValueOnce(true) // prepareCollecting
151
126
  .mockResolvedValueOnce(true); // collect
152
- const promise = service.collect(SEARCH_URL, 1);
127
+ const promise = service.collect(SEARCH_URL, 1, 10);
153
128
  await vi.advanceTimersByTimeAsync(0);
154
129
  await promise;
155
130
  // Only 1 canCollect call — no polling needed
156
- const canCollectCalls = mockEvaluateUI.mock.calls.filter((call) => call[0].includes("canCollect") &&
157
- !call[0].includes("prepareCollecting"));
131
+ const canCollectCalls = mockEvaluateUI.mock.calls.filter((call) => call[0].includes("canCollect"));
158
132
  expect(canCollectCalls).toHaveLength(1);
159
133
  });
160
134
  it("throws CollectionError after polling timeout with elapsed time", async () => {
@@ -162,7 +136,7 @@ describe("CollectionService", () => {
162
136
  .mockResolvedValueOnce("idle") // getRunnerState
163
137
  .mockResolvedValue(false); // canCollect always returns false
164
138
  // Attach catch before advancing timers to avoid unhandled rejection
165
- const errorPromise = service.collect(SEARCH_URL, 1).catch((e) => e);
139
+ const errorPromise = service.collect(SEARCH_URL, 1, 10).catch((e) => e);
166
140
  await vi.advanceTimersByTimeAsync(11_000);
167
141
  const error = await errorPromise;
168
142
  expect(error).toBeInstanceOf(CollectionError);
@@ -175,67 +149,32 @@ describe("CollectionService", () => {
175
149
  it("throws CollectionError when navigation fails", async () => {
176
150
  mockEvaluateUI.mockResolvedValueOnce("idle"); // getRunnerState
177
151
  mockNavigateLinkedIn.mockRejectedValueOnce(new Error("Page.navigate timeout"));
178
- const error = await service.collect(SEARCH_URL, 1).catch((e) => e);
152
+ const error = await service.collect(SEARCH_URL, 1, 10).catch((e) => e);
179
153
  expect(error).toBeInstanceOf(CollectionError);
180
154
  expect(error.message).toContain("Failed to navigate to source URL");
181
155
  expect(error.cause).toBeInstanceOf(Error);
182
156
  // canCollect should not be called after navigation failure
183
157
  expect(mockEvaluateUI).toHaveBeenCalledTimes(1);
184
158
  });
185
- it("throws CollectionError when prepareCollecting returns false", async () => {
186
- mockEvaluateUI
187
- .mockResolvedValueOnce("idle")
188
- .mockResolvedValueOnce(true)
189
- .mockResolvedValueOnce(false); // prepareCollecting returns false
190
- await expect(service.collect(SEARCH_URL, 1)).rejects.toThrow(CollectionError);
191
- });
192
- it("throws CollectionError when collect returns false", async () => {
193
- mockEvaluateUI
194
- .mockResolvedValueOnce("idle")
195
- .mockResolvedValueOnce(true)
196
- .mockResolvedValueOnce(true)
197
- .mockResolvedValueOnce(false); // collect returns false
198
- await expect(service.collect(SEARCH_URL, 1)).rejects.toThrow(CollectionError);
199
- });
200
- it("wraps CDP errors in CollectionError for prepareCollecting", async () => {
201
- mockEvaluateUI
202
- .mockResolvedValueOnce("idle")
203
- .mockResolvedValueOnce(true)
204
- .mockRejectedValueOnce(new Error("CDP timeout"));
205
- const error = await service.collect(SEARCH_URL, 1).catch((e) => e);
206
- expect(error).toBeInstanceOf(CollectionError);
207
- expect(error.message).toContain("Failed to prepare collection");
208
- expect(error.cause).toBeInstanceOf(Error);
209
- });
210
159
  it("wraps CDP errors in CollectionError for collect", async () => {
211
160
  mockEvaluateUI
212
161
  .mockResolvedValueOnce("idle")
213
162
  .mockResolvedValueOnce(true)
214
- .mockResolvedValueOnce(true)
215
163
  .mockRejectedValueOnce(new Error("CDP timeout"));
216
- const error = await service.collect(SEARCH_URL, 1).catch((e) => e);
164
+ const error = await service.collect(SEARCH_URL, 1, 10).catch((e) => e);
217
165
  expect(error).toBeInstanceOf(CollectionError);
218
166
  expect(error.message).toContain("Failed to start collection");
219
167
  expect(error.cause).toBeInstanceOf(Error);
220
168
  });
221
- it("does not wrap CollectionError from prepareCollecting", async () => {
222
- mockEvaluateUI
223
- .mockResolvedValueOnce("idle")
224
- .mockResolvedValueOnce(true)
225
- .mockResolvedValueOnce(false); // triggers CollectionError inside prepareCollecting
226
- const error = await service.collect(SEARCH_URL, 1).catch((e) => e);
227
- expect(error).toBeInstanceOf(CollectionError);
228
- expect(error.message).toContain("prepareCollecting returned false");
229
- });
230
169
  });
231
170
  describe("canCollect", () => {
232
- it("calls canCollect IPC method via CDP", async () => {
171
+ it("calls canCollect IPC method via CDP with internal kebab-case type", async () => {
233
172
  mockEvaluateUI.mockResolvedValueOnce(true);
234
173
  const result = await service.canCollect("SearchPage");
235
174
  expect(result).toBe(true);
236
175
  const expr = mockEvaluateUI.mock.calls[0]?.[0];
237
176
  expect(expr).toContain("canCollect");
238
- expect(expr).toContain("SearchPage");
177
+ expect(expr).toContain("search-page");
239
178
  });
240
179
  it("returns false when LinkedHelper reports false", async () => {
241
180
  mockEvaluateUI.mockResolvedValueOnce(false);
@@ -1 +1 @@
1
- {"version":3,"file":"collection.test.js","sourceRoot":"","sources":["../../src/services/collection.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"collection.test.js","sourceRoot":"","sources":["../../src/services/collection.test.ts"],"names":[],"mappings":"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"}
@@ -11,6 +11,7 @@ import type { InstanceService } from "./instance.js";
11
11
  * if `keepCampaign: true`).
12
12
  */
13
13
  export declare class EphemeralCampaignService {
14
+ private readonly instance;
14
15
  private readonly campaignService;
15
16
  private readonly profileRepo;
16
17
  constructor(instance: InstanceService, db: DatabaseClient);
@@ -44,6 +45,11 @@ export declare class EphemeralCampaignService {
44
45
  * Poll campaign status until the target person's action completes or times out.
45
46
  */
46
47
  private pollForCompletion;
48
+ /**
49
+ * Run an async operation, automatically dismissing UI popups on
50
+ * {@link UIBlockedError} and retrying up to 3 times.
51
+ */
52
+ private dismissAndRetry;
47
53
  /**
48
54
  * Stop and remove/archive an ephemeral campaign (best-effort).
49
55
  */
@@ -1 +1 @@
1
- {"version":3,"file":"ephemeral-campaign.d.ts","sourceRoot":"","sources":["../../src/services/ephemeral-campaign.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,cAAc,EACd,qBAAqB,EACrB,uBAAuB,EACxB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAarD;;;;;;;;GAQG;AACH,qBAAa,wBAAwB;IACnC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkB;IAClD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAoB;gBAEpC,QAAQ,EAAE,eAAe,EAAE,EAAE,EAAE,cAAc;IAKzD;;;;;;;;;;;;OAYG;IACG,OAAO,CACX,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,GAAG,MAAM,EACvB,cAAc,CAAC,EAAE,cAAc,EAC/B,OAAO,CAAC,EAAE,uBAAuB,GAChC,OAAO,CAAC,qBAAqB,CAAC;IAiEjC;;OAEG;IACH,OAAO,CAAC,aAAa;IAqCrB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAc9B;;OAEG;IACH,OAAO,CAAC,WAAW;IAUnB;;OAEG;YACW,iBAAiB;IAgC/B;;OAEG;YACW,OAAO;IAUrB;;OAEG;YACW,QAAQ;IAQtB;;OAEG;YACW,WAAW;IAQzB;;OAEG;IACH,OAAO,CAAC,cAAc;CAOvB"}
1
+ {"version":3,"file":"ephemeral-campaign.d.ts","sourceRoot":"","sources":["../../src/services/ephemeral-campaign.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,cAAc,EACd,qBAAqB,EACrB,uBAAuB,EACxB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAarD;;;;;;;;GAQG;AACH,qBAAa,wBAAwB;IACnC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkB;IAC3C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkB;IAClD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAoB;gBAEpC,QAAQ,EAAE,eAAe,EAAE,EAAE,EAAE,cAAc;IAMzD;;;;;;;;;;;;OAYG;IACG,OAAO,CACX,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,GAAG,MAAM,EACvB,cAAc,CAAC,EAAE,cAAc,EAC/B,OAAO,CAAC,EAAE,uBAAuB,GAChC,OAAO,CAAC,qBAAqB,CAAC;IA0EjC;;OAEG;IACH,OAAO,CAAC,aAAa;IAqCrB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAc9B;;OAEG;IACH,OAAO,CAAC,WAAW;IAUnB;;OAEG;YACW,iBAAiB;IA+C/B;;;OAGG;YACW,eAAe;IAgB7B;;OAEG;YACW,OAAO;IAUrB;;OAEG;YACW,QAAQ;IAQtB;;OAEG;YACW,WAAW;IAQzB;;OAEG;IACH,OAAO,CAAC,cAAc;CAOvB"}
@@ -3,7 +3,7 @@
3
3
  import { ProfileRepository } from "../db/index.js";
4
4
  import { delay } from "../utils/delay.js";
5
5
  import { CampaignService } from "./campaign.js";
6
- import { CampaignExecutionError, CampaignTimeoutError } from "./errors.js";
6
+ import { CampaignExecutionError, CampaignTimeoutError, UIBlockedError } from "./errors.js";
7
7
  /** Default timeout for ephemeral action execution (5 minutes). */
8
8
  const DEFAULT_TIMEOUT = 300_000;
9
9
  /** Default interval between status polls (2 seconds). */
@@ -20,9 +20,11 @@ const CAMPAIGN_NAME_PREFIX = "[ephemeral]";
20
20
  * if `keepCampaign: true`).
21
21
  */
22
22
  export class EphemeralCampaignService {
23
+ instance;
23
24
  campaignService;
24
25
  profileRepo;
25
26
  constructor(instance, db) {
27
+ this.instance = instance;
26
28
  this.campaignService = new CampaignService(instance, db);
27
29
  this.profileRepo = new ProfileRepository(db);
28
30
  }
@@ -58,23 +60,25 @@ export class EphemeralCampaignService {
58
60
  },
59
61
  ],
60
62
  });
63
+ // Step 3: Pause all other campaigns so the runner is free for us
64
+ const previouslyActive = await this.dismissAndRetry(() => this.campaignService.pauseAllExcept(campaign.id));
61
65
  try {
62
- // Step 3: Import target person
63
- const importResult = await this.campaignService.importPeopleFromUrls(campaign.id, [resolved.linkedInUrl]);
66
+ // Step 4: Import target person
67
+ const importResult = await this.dismissAndRetry(() => this.campaignService.importPeopleFromUrls(campaign.id, [resolved.linkedInUrl]));
64
68
  if (importResult.successful === 0 && importResult.alreadyInQueue === 0 && importResult.alreadyProcessed === 0) {
65
69
  throw new CampaignExecutionError(`Failed to import target into campaign: ${resolved.linkedInUrl}`, campaign.id);
66
70
  }
67
71
  // Resolve person ID if not yet known (URL-based target)
68
72
  const personId = resolved.personId ?? this.resolvePersonIdFromUrl(resolved.linkedInUrl);
69
- // Step 4: Start campaign
70
- await this.campaignService.start(campaign.id, []);
71
- // Step 5: Poll for completion
73
+ // Step 5: Start campaign
74
+ await this.dismissAndRetry(() => this.campaignService.start(campaign.id, []));
75
+ // Step 6: Poll for completion
72
76
  await this.pollForCompletion(campaign.id, timeout, pollInterval);
73
- // Step 6: Get results
74
- const runResult = await this.campaignService.getResults(campaign.id);
77
+ // Step 7: Get results
78
+ const runResult = await this.dismissAndRetry(() => this.campaignService.getResults(campaign.id));
75
79
  const results = runResult.results;
76
80
  const success = results.some((r) => r.result > 0);
77
- // Step 7: Cleanup
81
+ // Step 8: Cleanup
78
82
  await this.cleanup(campaign.id, keepCampaign);
79
83
  return {
80
84
  success,
@@ -87,6 +91,10 @@ export class EphemeralCampaignService {
87
91
  await this.cleanup(campaign.id, keepCampaign);
88
92
  throw error;
89
93
  }
94
+ finally {
95
+ // Restore previously active campaigns
96
+ await this.campaignService.unpauseCampaigns(previouslyActive);
97
+ }
90
98
  }
91
99
  /**
92
100
  * Resolve a target (person ID or URL) to a LinkedIn URL and optional person ID.
@@ -144,7 +152,23 @@ export class EphemeralCampaignService {
144
152
  async pollForCompletion(campaignId, timeout, pollInterval) {
145
153
  const deadline = Date.now() + timeout;
146
154
  while (Date.now() < deadline) {
147
- const status = await this.campaignService.getStatus(campaignId);
155
+ let status;
156
+ try {
157
+ status = await this.campaignService.getStatus(campaignId);
158
+ }
159
+ catch (error) {
160
+ if (error instanceof UIBlockedError) {
161
+ // Action may have produced a popup (e.g. "no endorsable skills").
162
+ // Dismiss and continue polling — the campaign may still complete.
163
+ await this.instance.dismissInstancePopups().catch(() => { });
164
+ const remaining = deadline - Date.now();
165
+ if (remaining <= 0)
166
+ break;
167
+ await delay(Math.min(pollInterval, remaining));
168
+ continue;
169
+ }
170
+ throw error;
171
+ }
148
172
  const counts = status.actionCounts[0];
149
173
  // Action complete when at least one person is successful or failed
150
174
  if (counts && (counts.successful > 0 || counts.failed > 0)) {
@@ -161,6 +185,26 @@ export class EphemeralCampaignService {
161
185
  }
162
186
  throw new CampaignTimeoutError(`Ephemeral action did not complete within ${String(timeout)}ms`, campaignId);
163
187
  }
188
+ /**
189
+ * Run an async operation, automatically dismissing UI popups on
190
+ * {@link UIBlockedError} and retrying up to 3 times.
191
+ */
192
+ async dismissAndRetry(fn) {
193
+ const maxAttempts = 3;
194
+ for (let attempt = 1;; attempt++) {
195
+ try {
196
+ return await fn();
197
+ }
198
+ catch (error) {
199
+ if (error instanceof UIBlockedError && attempt < maxAttempts) {
200
+ await this.instance.dismissInstancePopups().catch(() => { });
201
+ await delay(1_000);
202
+ continue;
203
+ }
204
+ throw error;
205
+ }
206
+ }
207
+ }
164
208
  /**
165
209
  * Stop and remove/archive an ephemeral campaign (best-effort).
166
210
  */
@@ -1 +1 @@
1
- {"version":3,"file":"ephemeral-campaign.js","sourceRoot":"","sources":["../../src/services/ephemeral-campaign.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ephemeral-campaign.js","sourceRoot":"","sources":["../../src/services/ephemeral-campaign.ts"],"names":[],"mappings":"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"}