@lhremote/core 0.5.0 → 0.6.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 (113) hide show
  1. package/dist/db/index.d.ts +1 -1
  2. package/dist/db/index.d.ts.map +1 -1
  3. package/dist/db/index.js +1 -1
  4. package/dist/db/index.js.map +1 -1
  5. package/dist/db/repositories/collection-list.d.ts +69 -0
  6. package/dist/db/repositories/collection-list.d.ts.map +1 -0
  7. package/dist/db/repositories/collection-list.integration.test.d.ts +2 -0
  8. package/dist/db/repositories/collection-list.integration.test.d.ts.map +1 -0
  9. package/dist/db/repositories/collection-list.integration.test.js +124 -0
  10. package/dist/db/repositories/collection-list.integration.test.js.map +1 -0
  11. package/dist/db/repositories/collection-list.js +161 -0
  12. package/dist/db/repositories/collection-list.js.map +1 -0
  13. package/dist/db/repositories/index.d.ts +1 -0
  14. package/dist/db/repositories/index.d.ts.map +1 -1
  15. package/dist/db/repositories/index.js +1 -0
  16. package/dist/db/repositories/index.js.map +1 -1
  17. package/dist/db/testing/create-fixture.js +17 -0
  18. package/dist/db/testing/create-fixture.js.map +1 -1
  19. package/dist/index.d.ts +4 -4
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.js +7 -3
  22. package/dist/index.js.map +1 -1
  23. package/dist/operations/add-people-to-collection.d.ts +22 -0
  24. package/dist/operations/add-people-to-collection.d.ts.map +1 -0
  25. package/dist/operations/add-people-to-collection.js +27 -0
  26. package/dist/operations/add-people-to-collection.js.map +1 -0
  27. package/dist/operations/add-people-to-collection.test.d.ts +2 -0
  28. package/dist/operations/add-people-to-collection.test.d.ts.map +1 -0
  29. package/dist/operations/add-people-to-collection.test.js +69 -0
  30. package/dist/operations/add-people-to-collection.test.js.map +1 -0
  31. package/dist/operations/collect-people.d.ts +40 -0
  32. package/dist/operations/collect-people.d.ts.map +1 -0
  33. package/dist/operations/collect-people.js +55 -0
  34. package/dist/operations/collect-people.js.map +1 -0
  35. package/dist/operations/collect-people.test.d.ts +2 -0
  36. package/dist/operations/collect-people.test.d.ts.map +1 -0
  37. package/dist/operations/collect-people.test.js +156 -0
  38. package/dist/operations/collect-people.test.js.map +1 -0
  39. package/dist/operations/create-collection.d.ts +20 -0
  40. package/dist/operations/create-collection.d.ts.map +1 -0
  41. package/dist/operations/create-collection.js +26 -0
  42. package/dist/operations/create-collection.js.map +1 -0
  43. package/dist/operations/create-collection.test.d.ts +2 -0
  44. package/dist/operations/create-collection.test.d.ts.map +1 -0
  45. package/dist/operations/create-collection.test.js +72 -0
  46. package/dist/operations/create-collection.test.js.map +1 -0
  47. package/dist/operations/delete-collection.d.ts +20 -0
  48. package/dist/operations/delete-collection.d.ts.map +1 -0
  49. package/dist/operations/delete-collection.js +26 -0
  50. package/dist/operations/delete-collection.js.map +1 -0
  51. package/dist/operations/delete-collection.test.d.ts +2 -0
  52. package/dist/operations/delete-collection.test.d.ts.map +1 -0
  53. package/dist/operations/delete-collection.test.js +61 -0
  54. package/dist/operations/delete-collection.test.js.map +1 -0
  55. package/dist/operations/import-people-from-collection.d.ts +30 -0
  56. package/dist/operations/import-people-from-collection.d.ts.map +1 -0
  57. package/dist/operations/import-people-from-collection.js +65 -0
  58. package/dist/operations/import-people-from-collection.js.map +1 -0
  59. package/dist/operations/import-people-from-collection.test.d.ts +2 -0
  60. package/dist/operations/import-people-from-collection.test.d.ts.map +1 -0
  61. package/dist/operations/import-people-from-collection.test.js +170 -0
  62. package/dist/operations/import-people-from-collection.test.js.map +1 -0
  63. package/dist/operations/index.d.ts +7 -0
  64. package/dist/operations/index.d.ts.map +1 -1
  65. package/dist/operations/index.js +9 -0
  66. package/dist/operations/index.js.map +1 -1
  67. package/dist/operations/list-collections.d.ts +18 -0
  68. package/dist/operations/list-collections.d.ts.map +1 -0
  69. package/dist/operations/list-collections.js +22 -0
  70. package/dist/operations/list-collections.js.map +1 -0
  71. package/dist/operations/list-collections.test.d.ts +2 -0
  72. package/dist/operations/list-collections.test.d.ts.map +1 -0
  73. package/dist/operations/list-collections.test.js +73 -0
  74. package/dist/operations/list-collections.test.js.map +1 -0
  75. package/dist/operations/remove-people-from-collection.d.ts +21 -0
  76. package/dist/operations/remove-people-from-collection.d.ts.map +1 -0
  77. package/dist/operations/remove-people-from-collection.js +26 -0
  78. package/dist/operations/remove-people-from-collection.js.map +1 -0
  79. package/dist/operations/remove-people-from-collection.test.d.ts +2 -0
  80. package/dist/operations/remove-people-from-collection.test.d.ts.map +1 -0
  81. package/dist/operations/remove-people-from-collection.test.js +68 -0
  82. package/dist/operations/remove-people-from-collection.test.js.map +1 -0
  83. package/dist/services/collection.d.ts +84 -0
  84. package/dist/services/collection.d.ts.map +1 -0
  85. package/dist/services/collection.js +145 -0
  86. package/dist/services/collection.js.map +1 -0
  87. package/dist/services/collection.test.d.ts +2 -0
  88. package/dist/services/collection.test.d.ts.map +1 -0
  89. package/dist/services/collection.test.js +203 -0
  90. package/dist/services/collection.test.js.map +1 -0
  91. package/dist/services/errors.d.ts +16 -0
  92. package/dist/services/errors.d.ts.map +1 -1
  93. package/dist/services/errors.js +23 -0
  94. package/dist/services/errors.js.map +1 -1
  95. package/dist/services/index.d.ts +3 -1
  96. package/dist/services/index.d.ts.map +1 -1
  97. package/dist/services/index.js +3 -1
  98. package/dist/services/index.js.map +1 -1
  99. package/dist/services/source-type-registry.d.ts +19 -0
  100. package/dist/services/source-type-registry.d.ts.map +1 -0
  101. package/dist/services/source-type-registry.js +66 -0
  102. package/dist/services/source-type-registry.js.map +1 -0
  103. package/dist/services/source-type-registry.test.d.ts +2 -0
  104. package/dist/services/source-type-registry.test.d.ts.map +1 -0
  105. package/dist/services/source-type-registry.test.js +124 -0
  106. package/dist/services/source-type-registry.test.js.map +1 -0
  107. package/dist/types/collection.d.ts +12 -0
  108. package/dist/types/collection.d.ts.map +1 -0
  109. package/dist/types/collection.js +4 -0
  110. package/dist/types/collection.js.map +1 -0
  111. package/dist/types/index.d.ts +1 -0
  112. package/dist/types/index.d.ts.map +1 -1
  113. package/package.json +1 -1
@@ -0,0 +1,68 @@
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
+ withDatabase: vi.fn(),
9
+ }));
10
+ vi.mock("../db/index.js", () => ({
11
+ CollectionListRepository: vi.fn(),
12
+ }));
13
+ import { resolveAccount } from "../services/account-resolution.js";
14
+ import { withDatabase } from "../services/instance-context.js";
15
+ import { CollectionListRepository } from "../db/index.js";
16
+ import { removePeopleFromCollection } from "./remove-people-from-collection.js";
17
+ function setupMocks(removed = 2) {
18
+ vi.mocked(resolveAccount).mockResolvedValue(1);
19
+ vi.mocked(withDatabase).mockImplementation(async (_accountId, callback) => callback({ accountId: 1, db: {} }));
20
+ vi.mocked(CollectionListRepository).mockImplementation(function () {
21
+ return {
22
+ removePeople: vi.fn().mockReturnValue(removed),
23
+ };
24
+ });
25
+ }
26
+ describe("removePeopleFromCollection", () => {
27
+ beforeEach(() => {
28
+ vi.clearAllMocks();
29
+ });
30
+ afterEach(() => {
31
+ vi.restoreAllMocks();
32
+ });
33
+ it("returns removed count", async () => {
34
+ setupMocks(2);
35
+ const result = await removePeopleFromCollection({
36
+ collectionId: 10,
37
+ personIds: [1, 3],
38
+ cdpPort: 9222,
39
+ });
40
+ expect(result.success).toBe(true);
41
+ expect(result.collectionId).toBe(10);
42
+ expect(result.removed).toBe(2);
43
+ });
44
+ it("passes collectionId and personIds to repository", async () => {
45
+ setupMocks();
46
+ await removePeopleFromCollection({
47
+ collectionId: 10,
48
+ personIds: [1, 3],
49
+ cdpPort: 9222,
50
+ });
51
+ const mockResult = vi.mocked(CollectionListRepository).mock.results[0];
52
+ expect(mockResult.value.removePeople).toHaveBeenCalledWith(10, [1, 3]);
53
+ });
54
+ it("opens database in write mode", async () => {
55
+ setupMocks();
56
+ await removePeopleFromCollection({
57
+ collectionId: 10,
58
+ personIds: [1],
59
+ cdpPort: 9222,
60
+ });
61
+ expect(withDatabase).toHaveBeenCalledWith(1, expect.any(Function), { readOnly: false });
62
+ });
63
+ it("propagates resolveAccount errors", async () => {
64
+ vi.mocked(resolveAccount).mockRejectedValue(new Error("connection refused"));
65
+ await expect(removePeopleFromCollection({ collectionId: 10, personIds: [1], cdpPort: 9222 })).rejects.toThrow("connection refused");
66
+ });
67
+ });
68
+ //# sourceMappingURL=remove-people-from-collection.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove-people-from-collection.test.js","sourceRoot":"","sources":["../../src/operations/remove-people-from-collection.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,84 @@
1
+ import type { SourceType } from "../types/index.js";
2
+ import type { RunnerState } from "../types/index.js";
3
+ import type { InstanceService } from "./instance.js";
4
+ /**
5
+ * Options for initiating a collection operation.
6
+ */
7
+ export interface CollectOptions {
8
+ /** Maximum number of profiles to collect. */
9
+ readonly limit?: number;
10
+ /** Maximum number of pages to process. */
11
+ readonly maxPages?: number;
12
+ /** Number of results per page. */
13
+ readonly pageSize?: number;
14
+ }
15
+ /**
16
+ * Manages people collection from LinkedIn pages via CDP.
17
+ *
18
+ * Collection uses the dedicated `prepareCollecting` → `collect` IPC
19
+ * entry point, which drives the LinkedHelper state machine through
20
+ * `idle → preparing-collecting → collecting → idle`.
21
+ *
22
+ * The {@link collect} method returns immediately — callers should poll
23
+ * the runner state (`mainWindow.state`) for progress.
24
+ */
25
+ export declare class CollectionService {
26
+ private readonly instance;
27
+ constructor(instance: InstanceService);
28
+ /**
29
+ * Initiate people collection from a LinkedIn source URL.
30
+ *
31
+ * Validates that the source URL is a recognized LinkedIn page type,
32
+ * ensures the instance is idle, then calls `canCollect` →
33
+ * `prepareCollecting` → `collect` via CDP.
34
+ *
35
+ * Returns immediately after initiating collection — the actual
36
+ * collection runs asynchronously in LinkedHelper. Poll the runner
37
+ * state via {@link getRunnerState} for progress.
38
+ *
39
+ * @param sourceUrl - LinkedIn page URL to collect from (e.g., search results URL).
40
+ * @param campaignId - Campaign to associate the collection with.
41
+ * @param options - Collection parameters (limit, maxPages, pageSize).
42
+ * @throws {CollectionError} if the source URL is not recognized, canCollect returns false,
43
+ * or the CDP calls fail.
44
+ * @throws {CollectionBusyError} if the instance is not idle.
45
+ */
46
+ collect(sourceUrl: string, _campaignId: number, options?: CollectOptions): Promise<void>;
47
+ /**
48
+ * Check whether collection is possible for a given source type.
49
+ *
50
+ * This is a page-state check — returns `true` only when the
51
+ * LinkedHelper browser is currently on a matching source page.
52
+ */
53
+ canCollect(sourceType: SourceType): Promise<boolean>;
54
+ /**
55
+ * Get the current runner state from the LinkedHelper main window.
56
+ */
57
+ getRunnerState(): Promise<RunnerState>;
58
+ /**
59
+ * Ensure the instance runner is idle.
60
+ *
61
+ * @throws {CollectionBusyError} if the runner is not idle.
62
+ */
63
+ private ensureIdle;
64
+ /**
65
+ * Assert that `canCollect` returns `true` for the source type.
66
+ *
67
+ * @throws {CollectionError} if `canCollect` returns `false`.
68
+ */
69
+ private assertCanCollect;
70
+ /**
71
+ * Call `prepareCollecting` to transition the state machine from
72
+ * `idle` to `preparing-collecting`.
73
+ *
74
+ * @throws {CollectionError} if the call returns `false`.
75
+ */
76
+ private prepareCollecting;
77
+ /**
78
+ * Call `collect` to start the actual collection process.
79
+ *
80
+ * @throws {CollectionError} if the call returns `false`.
81
+ */
82
+ private startCollecting;
83
+ }
84
+ //# sourceMappingURL=collection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collection.d.ts","sourceRoot":"","sources":["../../src/services/collection.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAGrD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,6CAA6C;IAC7C,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,0CAA0C;IAC1C,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,kCAAkC;IAClC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;;;;;GASG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkB;gBAE/B,QAAQ,EAAE,eAAe;IAIrC;;;;;;;;;;;;;;;;;OAiBG;IACG,OAAO,CACX,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,IAAI,CAAC;IAkChB;;;;;OAKG;IACG,UAAU,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC;IAS1D;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,WAAW,CAAC;IAO5C;;;;OAIG;YACW,UAAU;IAOxB;;;;OAIG;YACW,gBAAgB;IAS9B;;;;;OAKG;YACW,iBAAiB;IAkB/B;;;;OAIG;YACW,eAAe;CAmB9B"}
@@ -0,0 +1,145 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (C) 2026 Oleksii PELYKH
3
+ import { errorMessage } from "../utils/error-message.js";
4
+ import { detectSourceType } from "./source-type-registry.js";
5
+ import { CollectionBusyError, CollectionError } from "./errors.js";
6
+ /**
7
+ * Manages people collection from LinkedIn pages via CDP.
8
+ *
9
+ * Collection uses the dedicated `prepareCollecting` → `collect` IPC
10
+ * entry point, which drives the LinkedHelper state machine through
11
+ * `idle → preparing-collecting → collecting → idle`.
12
+ *
13
+ * The {@link collect} method returns immediately — callers should poll
14
+ * the runner state (`mainWindow.state`) for progress.
15
+ */
16
+ export class CollectionService {
17
+ instance;
18
+ constructor(instance) {
19
+ this.instance = instance;
20
+ }
21
+ /**
22
+ * Initiate people collection from a LinkedIn source URL.
23
+ *
24
+ * Validates that the source URL is a recognized LinkedIn page type,
25
+ * ensures the instance is idle, then calls `canCollect` →
26
+ * `prepareCollecting` → `collect` via CDP.
27
+ *
28
+ * Returns immediately after initiating collection — the actual
29
+ * collection runs asynchronously in LinkedHelper. Poll the runner
30
+ * state via {@link getRunnerState} for progress.
31
+ *
32
+ * @param sourceUrl - LinkedIn page URL to collect from (e.g., search results URL).
33
+ * @param campaignId - Campaign to associate the collection with.
34
+ * @param options - Collection parameters (limit, maxPages, pageSize).
35
+ * @throws {CollectionError} if the source URL is not recognized, canCollect returns false,
36
+ * or the CDP calls fail.
37
+ * @throws {CollectionBusyError} if the instance is not idle.
38
+ */
39
+ async collect(sourceUrl, _campaignId, options) {
40
+ const sourceType = detectSourceType(sourceUrl);
41
+ if (!sourceType) {
42
+ throw new CollectionError(`Unrecognized source URL: ${sourceUrl} — cannot determine LinkedIn page type`);
43
+ }
44
+ await this.ensureIdle();
45
+ await this.assertCanCollect(sourceType);
46
+ try {
47
+ await this.prepareCollecting(sourceType);
48
+ }
49
+ catch (error) {
50
+ if (error instanceof CollectionError)
51
+ throw error;
52
+ const message = errorMessage(error);
53
+ throw new CollectionError(`Failed to prepare collection for ${sourceType}: ${message}`, { cause: error });
54
+ }
55
+ try {
56
+ await this.startCollecting(options);
57
+ }
58
+ catch (error) {
59
+ if (error instanceof CollectionError)
60
+ throw error;
61
+ const message = errorMessage(error);
62
+ throw new CollectionError(`Failed to start collection: ${message}`, { cause: error });
63
+ }
64
+ }
65
+ /**
66
+ * Check whether collection is possible for a given source type.
67
+ *
68
+ * This is a page-state check — returns `true` only when the
69
+ * LinkedHelper browser is currently on a matching source page.
70
+ */
71
+ async canCollect(sourceType) {
72
+ return this.instance.evaluateUI(`(async () => {
73
+ const mws = window.mainWindowService;
74
+ return await mws.call('canCollect', ${JSON.stringify(sourceType)});
75
+ })()`);
76
+ }
77
+ /**
78
+ * Get the current runner state from the LinkedHelper main window.
79
+ */
80
+ async getRunnerState() {
81
+ return this.instance.evaluateUI(`window.mainWindowService.mainWindow.state`, false);
82
+ }
83
+ /**
84
+ * Ensure the instance runner is idle.
85
+ *
86
+ * @throws {CollectionBusyError} if the runner is not idle.
87
+ */
88
+ async ensureIdle() {
89
+ const state = await this.getRunnerState();
90
+ if (state !== "idle") {
91
+ throw new CollectionBusyError(state);
92
+ }
93
+ }
94
+ /**
95
+ * Assert that `canCollect` returns `true` for the source type.
96
+ *
97
+ * @throws {CollectionError} if `canCollect` returns `false`.
98
+ */
99
+ async assertCanCollect(sourceType) {
100
+ const result = await this.canCollect(sourceType);
101
+ if (!result) {
102
+ throw new CollectionError(`Cannot collect from ${sourceType} — the LinkedIn browser is not on a matching page`);
103
+ }
104
+ }
105
+ /**
106
+ * Call `prepareCollecting` to transition the state machine from
107
+ * `idle` to `preparing-collecting`.
108
+ *
109
+ * @throws {CollectionError} if the call returns `false`.
110
+ */
111
+ async prepareCollecting(sourceType) {
112
+ const result = await this.instance.evaluateUI(`(async () => {
113
+ const mws = window.mainWindowService;
114
+ return await mws.call('prepareCollecting', ${JSON.stringify({
115
+ type: sourceType,
116
+ actionType: "AutoCollectPeople",
117
+ })});
118
+ })()`);
119
+ if (!result) {
120
+ throw new CollectionError(`prepareCollecting returned false for ${sourceType} — state machine did not transition`);
121
+ }
122
+ }
123
+ /**
124
+ * Call `collect` to start the actual collection process.
125
+ *
126
+ * @throws {CollectionError} if the call returns `false`.
127
+ */
128
+ async startCollecting(options) {
129
+ const params = {};
130
+ if (options?.limit !== undefined)
131
+ params.limit = options.limit;
132
+ if (options?.maxPages !== undefined)
133
+ params.maxPages = options.maxPages;
134
+ if (options?.pageSize !== undefined)
135
+ params.pageSize = options.pageSize;
136
+ const result = await this.instance.evaluateUI(`(async () => {
137
+ const mws = window.mainWindowService;
138
+ return await mws.call('collect', ${JSON.stringify(params)});
139
+ })()`);
140
+ if (!result) {
141
+ throw new CollectionError("collect returned false — state machine was not in collecting state");
142
+ }
143
+ }
144
+ }
145
+ //# sourceMappingURL=collection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collection.js","sourceRoot":"","sources":["../../src/services/collection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=collection.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collection.test.d.ts","sourceRoot":"","sources":["../../src/services/collection.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,203 @@
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
+ import { CollectionBusyError, CollectionError } from "./errors.js";
5
+ import { CollectionService } from "./collection.js";
6
+ // Mock InstanceService
7
+ const mockEvaluateUI = vi.fn();
8
+ vi.mock("./instance.js", () => ({
9
+ InstanceService: vi.fn().mockImplementation(function () {
10
+ this.evaluateUI = mockEvaluateUI;
11
+ }),
12
+ }));
13
+ import { InstanceService } from "./instance.js";
14
+ /** LinkedIn people search URL for tests. */
15
+ const SEARCH_URL = "https://www.linkedin.com/search/results/people/?keywords=software%20engineer";
16
+ /** LinkedIn company people URL for tests. */
17
+ const ORG_PEOPLE_URL = "https://www.linkedin.com/company/acme-corp/people/";
18
+ afterEach(() => {
19
+ vi.restoreAllMocks();
20
+ });
21
+ describe("CollectionService", () => {
22
+ let service;
23
+ beforeEach(() => {
24
+ vi.clearAllMocks();
25
+ const instance = new InstanceService(9223);
26
+ service = new CollectionService(instance);
27
+ });
28
+ describe("collect", () => {
29
+ it("calls canCollect, prepareCollecting, and collect via CDP", async () => {
30
+ mockEvaluateUI
31
+ .mockResolvedValueOnce("idle") // getRunnerState
32
+ .mockResolvedValueOnce(true) // canCollect
33
+ .mockResolvedValueOnce(true) // prepareCollecting
34
+ .mockResolvedValueOnce(true); // collect
35
+ await service.collect(SEARCH_URL, 1);
36
+ expect(mockEvaluateUI).toHaveBeenCalledTimes(4);
37
+ // 1. Runner state check
38
+ const stateExpr = mockEvaluateUI.mock.calls[0]?.[0];
39
+ expect(stateExpr).toContain("mainWindowService.mainWindow.state");
40
+ // 2. canCollect
41
+ const canCollectExpr = mockEvaluateUI.mock.calls[1]?.[0];
42
+ expect(canCollectExpr).toContain("canCollect");
43
+ expect(canCollectExpr).toContain("SearchPage");
44
+ // 3. prepareCollecting
45
+ const prepareExpr = mockEvaluateUI.mock.calls[2]?.[0];
46
+ expect(prepareExpr).toContain("prepareCollecting");
47
+ expect(prepareExpr).toContain("SearchPage");
48
+ expect(prepareExpr).toContain("AutoCollectPeople");
49
+ // 4. collect
50
+ const collectExpr = mockEvaluateUI.mock.calls[3]?.[0];
51
+ expect(collectExpr).toContain("mws.call('collect'");
52
+ });
53
+ it("passes limit, maxPages, pageSize to collect call", async () => {
54
+ mockEvaluateUI
55
+ .mockResolvedValueOnce("idle")
56
+ .mockResolvedValueOnce(true)
57
+ .mockResolvedValueOnce(true)
58
+ .mockResolvedValueOnce(true);
59
+ await service.collect(SEARCH_URL, 1, {
60
+ limit: 100,
61
+ maxPages: 5,
62
+ pageSize: 25,
63
+ });
64
+ const collectExpr = mockEvaluateUI.mock.calls[3]?.[0];
65
+ expect(collectExpr).toContain('"limit":100');
66
+ expect(collectExpr).toContain('"maxPages":5');
67
+ expect(collectExpr).toContain('"pageSize":25');
68
+ });
69
+ it("omits undefined options from collect call", async () => {
70
+ mockEvaluateUI
71
+ .mockResolvedValueOnce("idle")
72
+ .mockResolvedValueOnce(true)
73
+ .mockResolvedValueOnce(true)
74
+ .mockResolvedValueOnce(true);
75
+ await service.collect(SEARCH_URL, 1, { limit: 50 });
76
+ const collectExpr = mockEvaluateUI.mock.calls[3]?.[0];
77
+ expect(collectExpr).toContain('"limit":50');
78
+ expect(collectExpr).not.toContain("maxPages");
79
+ expect(collectExpr).not.toContain("pageSize");
80
+ });
81
+ it("detects OrganizationPeople source type from company URL", async () => {
82
+ mockEvaluateUI
83
+ .mockResolvedValueOnce("idle")
84
+ .mockResolvedValueOnce(true)
85
+ .mockResolvedValueOnce(true)
86
+ .mockResolvedValueOnce(true);
87
+ await service.collect(ORG_PEOPLE_URL, 1);
88
+ const canCollectExpr = mockEvaluateUI.mock.calls[1]?.[0];
89
+ expect(canCollectExpr).toContain("OrganizationPeople");
90
+ const prepareExpr = mockEvaluateUI.mock.calls[2]?.[0];
91
+ expect(prepareExpr).toContain("OrganizationPeople");
92
+ });
93
+ it("throws CollectionError for unrecognized source URL", async () => {
94
+ const error = await service
95
+ .collect("https://www.linkedin.com/feed/", 1)
96
+ .catch((e) => e);
97
+ expect(error).toBeInstanceOf(CollectionError);
98
+ expect(error.message).toContain("Unrecognized source URL");
99
+ // No CDP calls should be made
100
+ expect(mockEvaluateUI).not.toHaveBeenCalled();
101
+ });
102
+ it("throws CollectionBusyError when runner is not idle", async () => {
103
+ mockEvaluateUI.mockResolvedValueOnce("campaigns");
104
+ await expect(service.collect(SEARCH_URL, 1)).rejects.toThrow(CollectionBusyError);
105
+ // Only the runner state check should be made
106
+ expect(mockEvaluateUI).toHaveBeenCalledTimes(1);
107
+ });
108
+ it("includes runner state in CollectionBusyError", async () => {
109
+ mockEvaluateUI.mockResolvedValueOnce("campaigns");
110
+ try {
111
+ await service.collect(SEARCH_URL, 1);
112
+ expect.unreachable("should have thrown");
113
+ }
114
+ catch (error) {
115
+ expect(error).toBeInstanceOf(CollectionBusyError);
116
+ expect(error.runnerState).toBe("campaigns");
117
+ }
118
+ });
119
+ it("throws CollectionError when canCollect returns false", async () => {
120
+ mockEvaluateUI
121
+ .mockResolvedValueOnce("idle")
122
+ .mockResolvedValueOnce(false); // canCollect returns false
123
+ const error = await service.collect(SEARCH_URL, 1).catch((e) => e);
124
+ expect(error).toBeInstanceOf(CollectionError);
125
+ expect(error.message).toContain("not on a matching page");
126
+ });
127
+ it("throws CollectionError when prepareCollecting returns false", async () => {
128
+ mockEvaluateUI
129
+ .mockResolvedValueOnce("idle")
130
+ .mockResolvedValueOnce(true)
131
+ .mockResolvedValueOnce(false); // prepareCollecting returns false
132
+ await expect(service.collect(SEARCH_URL, 1)).rejects.toThrow(CollectionError);
133
+ });
134
+ it("throws CollectionError when collect returns false", async () => {
135
+ mockEvaluateUI
136
+ .mockResolvedValueOnce("idle")
137
+ .mockResolvedValueOnce(true)
138
+ .mockResolvedValueOnce(true)
139
+ .mockResolvedValueOnce(false); // collect returns false
140
+ await expect(service.collect(SEARCH_URL, 1)).rejects.toThrow(CollectionError);
141
+ });
142
+ it("wraps CDP errors in CollectionError for prepareCollecting", async () => {
143
+ mockEvaluateUI
144
+ .mockResolvedValueOnce("idle")
145
+ .mockResolvedValueOnce(true)
146
+ .mockRejectedValueOnce(new Error("CDP timeout"));
147
+ const error = await service.collect(SEARCH_URL, 1).catch((e) => e);
148
+ expect(error).toBeInstanceOf(CollectionError);
149
+ expect(error.message).toContain("Failed to prepare collection");
150
+ expect(error.cause).toBeInstanceOf(Error);
151
+ });
152
+ it("wraps CDP errors in CollectionError for collect", async () => {
153
+ mockEvaluateUI
154
+ .mockResolvedValueOnce("idle")
155
+ .mockResolvedValueOnce(true)
156
+ .mockResolvedValueOnce(true)
157
+ .mockRejectedValueOnce(new Error("CDP timeout"));
158
+ const error = await service.collect(SEARCH_URL, 1).catch((e) => e);
159
+ expect(error).toBeInstanceOf(CollectionError);
160
+ expect(error.message).toContain("Failed to start collection");
161
+ expect(error.cause).toBeInstanceOf(Error);
162
+ });
163
+ it("does not wrap CollectionError from prepareCollecting", async () => {
164
+ mockEvaluateUI
165
+ .mockResolvedValueOnce("idle")
166
+ .mockResolvedValueOnce(true)
167
+ .mockResolvedValueOnce(false); // triggers CollectionError inside prepareCollecting
168
+ const error = await service.collect(SEARCH_URL, 1).catch((e) => e);
169
+ expect(error).toBeInstanceOf(CollectionError);
170
+ expect(error.message).toContain("prepareCollecting returned false");
171
+ });
172
+ });
173
+ describe("canCollect", () => {
174
+ it("calls canCollect IPC method via CDP", async () => {
175
+ mockEvaluateUI.mockResolvedValueOnce(true);
176
+ const result = await service.canCollect("SearchPage");
177
+ expect(result).toBe(true);
178
+ const expr = mockEvaluateUI.mock.calls[0]?.[0];
179
+ expect(expr).toContain("canCollect");
180
+ expect(expr).toContain("SearchPage");
181
+ });
182
+ it("returns false when LinkedHelper reports false", async () => {
183
+ mockEvaluateUI.mockResolvedValueOnce(false);
184
+ const result = await service.canCollect("MyConnections");
185
+ expect(result).toBe(false);
186
+ });
187
+ });
188
+ describe("getRunnerState", () => {
189
+ it("reads state from mainWindow.state via CDP", async () => {
190
+ mockEvaluateUI.mockResolvedValueOnce("idle");
191
+ const state = await service.getRunnerState();
192
+ expect(state).toBe("idle");
193
+ const expr = mockEvaluateUI.mock.calls[0]?.[0];
194
+ expect(expr).toContain("mainWindowService.mainWindow.state");
195
+ });
196
+ it("returns non-idle states", async () => {
197
+ mockEvaluateUI.mockResolvedValueOnce("campaigns");
198
+ const state = await service.getRunnerState();
199
+ expect(state).toBe("campaigns");
200
+ });
201
+ });
202
+ });
203
+ //# sourceMappingURL=collection.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collection.test.js","sourceRoot":"","sources":["../../src/services/collection.test.ts"],"names":[],"mappings":"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"}
@@ -78,6 +78,22 @@ export declare class InvalidProfileUrlError extends ServiceError {
78
78
  export declare class ExtractionTimeoutError extends ServiceError {
79
79
  constructor(profileUrl: string, timeoutMs: number);
80
80
  }
81
+ /**
82
+ * Thrown when a collection operation fails during execution
83
+ * (canCollect, prepareCollecting, collect, or other CDP-based operations).
84
+ */
85
+ export declare class CollectionError extends ServiceError {
86
+ constructor(message: string, options?: ErrorOptions);
87
+ }
88
+ /**
89
+ * Thrown when a collection operation cannot proceed because the
90
+ * LinkedHelper instance is busy (running a campaign, another
91
+ * collection, or a single action).
92
+ */
93
+ export declare class CollectionBusyError extends CollectionError {
94
+ readonly runnerState: string;
95
+ constructor(runnerState: string, options?: ErrorOptions);
96
+ }
81
97
  /**
82
98
  * Thrown when a campaign operation fails during execution
83
99
  * (create, start, stop, or other CDP-based operations).
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/services/errors.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAErD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD;;GAEG;AACH,qBAAa,YAAa,SAAQ,KAAK;gBACzB,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY;CAIpD;AAED;;;GAGG;AACH,qBAAa,gBAAiB,SAAQ,YAAY;gBACpC,OAAO,CAAC,EAAE,MAAM;CAM7B;AAED;;GAEG;AACH,qBAAa,cAAe,SAAQ,YAAY;gBAClC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY;CAIpD;AAED;;GAEG;AACH,qBAAa,2BAA4B,SAAQ,YAAY;gBAC/C,IAAI,EAAE,MAAM;CAMzB;AAED;;;;;;;GAOG;AACH,qBAAa,4BAA6B,SAAQ,YAAY;IAC5D,QAAQ,CAAC,SAAS,EAAE,aAAa,EAAE,CAAC;gBAExB,SAAS,EAAE,aAAa,EAAE;CASvC;AAED;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,YAAY;gBACtC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;CAM/C;AAED;;GAEG;AACH,qBAAa,uBAAwB,SAAQ,YAAY;gBAC3C,OAAO,CAAC,EAAE,MAAM;CAI7B;AAED;;;GAGG;AACH,qBAAa,cAAe,SAAQ,YAAY;gBAClC,IAAI,EAAE,MAAM;CAOzB;AAED;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,YAAY;IACpD,oEAAoE;IACpE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;gBAEhB,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY;CAQzE;AAED;;;GAGG;AACH,qBAAa,sBAAuB,SAAQ,YAAY;gBAC1C,GAAG,EAAE,MAAM;CAMxB;AAED;;;GAGG;AACH,qBAAa,sBAAuB,SAAQ,YAAY;gBAC1C,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;CAMlD;AAED;;;GAGG;AACH,qBAAa,sBAAuB,SAAQ,YAAY;IACtD,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;gBAE5B,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY;CAKzE;AAED;;;GAGG;AACH,qBAAa,oBAAqB,SAAQ,YAAY;IACpD,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;gBAE5B,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY;CAKzE;AAED;;;;;;GAMG;AACH,qBAAa,cAAe,SAAQ,YAAY;IAC9C,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;gBAEpB,MAAM,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,YAAY;CAsB3D"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/services/errors.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAErD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD;;GAEG;AACH,qBAAa,YAAa,SAAQ,KAAK;gBACzB,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY;CAIpD;AAED;;;GAGG;AACH,qBAAa,gBAAiB,SAAQ,YAAY;gBACpC,OAAO,CAAC,EAAE,MAAM;CAM7B;AAED;;GAEG;AACH,qBAAa,cAAe,SAAQ,YAAY;gBAClC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY;CAIpD;AAED;;GAEG;AACH,qBAAa,2BAA4B,SAAQ,YAAY;gBAC/C,IAAI,EAAE,MAAM;CAMzB;AAED;;;;;;;GAOG;AACH,qBAAa,4BAA6B,SAAQ,YAAY;IAC5D,QAAQ,CAAC,SAAS,EAAE,aAAa,EAAE,CAAC;gBAExB,SAAS,EAAE,aAAa,EAAE;CASvC;AAED;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,YAAY;gBACtC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;CAM/C;AAED;;GAEG;AACH,qBAAa,uBAAwB,SAAQ,YAAY;gBAC3C,OAAO,CAAC,EAAE,MAAM;CAI7B;AAED;;;GAGG;AACH,qBAAa,cAAe,SAAQ,YAAY;gBAClC,IAAI,EAAE,MAAM;CAOzB;AAED;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,YAAY;IACpD,oEAAoE;IACpE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;gBAEhB,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY;CAQzE;AAED;;;GAGG;AACH,qBAAa,sBAAuB,SAAQ,YAAY;gBAC1C,GAAG,EAAE,MAAM;CAMxB;AAED;;;GAGG;AACH,qBAAa,sBAAuB,SAAQ,YAAY;gBAC1C,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;CAMlD;AAED;;;GAGG;AACH,qBAAa,eAAgB,SAAQ,YAAY;gBACnC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY;CAIpD;AAED;;;;GAIG;AACH,qBAAa,mBAAoB,SAAQ,eAAe;IACtD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;gBAEjB,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY;CAQxD;AAED;;;GAGG;AACH,qBAAa,sBAAuB,SAAQ,YAAY;IACtD,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;gBAE5B,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY;CAKzE;AAED;;;GAGG;AACH,qBAAa,oBAAqB,SAAQ,YAAY;IACpD,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;gBAE5B,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY;CAKzE;AAED;;;;;;GAMG;AACH,qBAAa,cAAe,SAAQ,YAAY;IAC9C,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;gBAEpB,MAAM,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,YAAY;CAsB3D"}
@@ -117,6 +117,29 @@ export class ExtractionTimeoutError extends ServiceError {
117
117
  this.name = "ExtractionTimeoutError";
118
118
  }
119
119
  }
120
+ /**
121
+ * Thrown when a collection operation fails during execution
122
+ * (canCollect, prepareCollecting, collect, or other CDP-based operations).
123
+ */
124
+ export class CollectionError extends ServiceError {
125
+ constructor(message, options) {
126
+ super(message, options);
127
+ this.name = "CollectionError";
128
+ }
129
+ }
130
+ /**
131
+ * Thrown when a collection operation cannot proceed because the
132
+ * LinkedHelper instance is busy (running a campaign, another
133
+ * collection, or a single action).
134
+ */
135
+ export class CollectionBusyError extends CollectionError {
136
+ runnerState;
137
+ constructor(runnerState, options) {
138
+ super(`Cannot start collection — instance is busy (runner state: ${runnerState})`, options);
139
+ this.name = "CollectionBusyError";
140
+ this.runnerState = runnerState;
141
+ }
142
+ }
120
143
  /**
121
144
  * Thrown when a campaign operation fails during execution
122
145
  * (create, start, stop, or other CDP-based operations).
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/services/errors.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,oCAAoC;AAGpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAGnD;;GAEG;AACH,MAAM,OAAO,YAAa,SAAQ,KAAK;IACrC,YAAY,OAAe,EAAE,OAAsB;QACjD,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAO,gBAAiB,SAAQ,YAAY;IAChD,YAAY,OAAgB;QAC1B,KAAK,CACH,OAAO,IAAI,+EAA+E,CAC3F,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,cAAe,SAAQ,YAAY;IAC9C,YAAY,OAAe,EAAE,OAAsB;QACjD,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,2BAA4B,SAAQ,YAAY;IAC3D,YAAY,IAAY;QACtB,KAAK,CACH,wDAAwD,MAAM,CAAC,IAAI,CAAC,GAAG,CACxE,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,6BAA6B,CAAC;IAC5C,CAAC;CACF;AAED;;;;;;;GAOG;AACH,MAAM,OAAO,4BAA6B,SAAQ,YAAY;IACnD,SAAS,CAAkB;IAEpC,YAAY,SAA0B;QACpC,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5D,KAAK,CACH,gCAAgC,IAAI,8BAA8B;YAChE,0DAA0D,CAC7D,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,8BAA8B,CAAC;QAC3C,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,kBAAmB,SAAQ,YAAY;IAClD,YAAY,SAAiB,EAAE,MAAe;QAC5C,KAAK,CACH,wCAAwC,MAAM,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAC1F,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,uBAAwB,SAAQ,YAAY;IACvD,YAAY,OAAgB;QAC1B,KAAK,CAAC,OAAO,IAAI,sBAAsB,CAAC,CAAC;QACzC,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;IACxC,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAO,cAAe,SAAQ,YAAY;IAC9C,YAAY,IAAY;QACtB,KAAK,CACH,YAAY,MAAM,CAAC,IAAI,CAAC,4DAA4D;YAClF,2CAA2C,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAC1E,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,oBAAqB,SAAQ,YAAY;IACpD,oEAAoE;IAC3D,UAAU,CAAS;IAE5B,YAAY,UAAkB,EAAE,OAAgB,EAAE,OAAsB;QACtE,KAAK,CACH,OAAO,IAAI,WAAW,UAAU,UAAU,EAC1C,OAAO,CACR,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;QACnC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAO,sBAAuB,SAAQ,YAAY;IACtD,YAAY,GAAW;QACrB,KAAK,CACH,wBAAwB,GAAG,gDAAgD,CAC5E,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAO,sBAAuB,SAAQ,YAAY;IACtD,YAAY,UAAkB,EAAE,SAAiB;QAC/C,KAAK,CACH,sCAAsC,MAAM,CAAC,SAAS,CAAC,UAAU,UAAU,EAAE,CAC9E,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAO,sBAAuB,SAAQ,YAAY;IAC7C,UAAU,CAAqB;IAExC,YAAY,OAAe,EAAE,UAAmB,EAAE,OAAsB;QACtE,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;QACrC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAO,oBAAqB,SAAQ,YAAY;IAC3C,UAAU,CAAqB;IAExC,YAAY,OAAe,EAAE,UAAmB,EAAE,OAAsB;QACtE,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;QACnC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;CACF;AAED;;;;;;GAMG;AACH,MAAM,OAAO,cAAe,SAAQ,YAAY;IACrC,MAAM,CAAiB;IAEhC,YAAY,MAAsB,EAAE,OAAsB;QACxD,MAAM,OAAO,GAAa,EAAE,CAAC;QAE7B,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClC,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC5B,OAAO,CAAC,IAAI,CAAC,WAAW,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;YACxD,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CAAC,mBAAmB,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;YACxD,CAAC;QACH,CAAC;QAED,IAAI,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC;YAC1B,OAAO,CAAC,IAAI,CAAC,UAAU,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,yBAAyB,EAAE,CAAC,CAAC;QAC9E,CAAC;QAED,KAAK,CACH,gCAAgC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EACpD,OAAO,CACR,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;QAC7B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF"}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/services/errors.ts"],"names":[],"mappings":"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"}
@@ -6,5 +6,7 @@ export { checkStatus, type AccountInstanceStatus, type DatabaseStatus, type Laun
6
6
  export { CampaignService } from "./campaign.js";
7
7
  export { AccountResolutionError, resolveAccount, } from "./account-resolution.js";
8
8
  export { withDatabase, withInstanceDatabase, type DatabaseContext, type InstanceDatabaseContext, } from "./instance-context.js";
9
- export { ActionExecutionError, AppLaunchError, AppNotFoundError, CampaignExecutionError, CampaignTimeoutError, ExtractionTimeoutError, InstanceNotRunningError, InvalidProfileUrlError, LinkedHelperNotRunningError, LinkedHelperUnreachableError, ServiceError, StartInstanceError, UIBlockedError, WrongPortError, } from "./errors.js";
9
+ export { detectSourceType, validateSourceType } from "./source-type-registry.js";
10
+ export { CollectionService } from "./collection.js";
11
+ export { ActionExecutionError, AppLaunchError, AppNotFoundError, CampaignExecutionError, CampaignTimeoutError, CollectionBusyError, CollectionError, ExtractionTimeoutError, InstanceNotRunningError, InvalidProfileUrlError, LinkedHelperNotRunningError, LinkedHelperUnreachableError, ServiceError, StartInstanceError, UIBlockedError, WrongPortError, } from "./errors.js";
10
12
  //# sourceMappingURL=index.d.ts.map