salesprompter-cli 0.1.49 → 0.1.50

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 (2) hide show
  1. package/dist/cli.js +36 -7
  2. package/package.json +1 -1
package/dist/cli.js CHANGED
@@ -7755,6 +7755,8 @@ async function createLocalAccountSearchBrowserRelay(requestedPort) {
7755
7755
  status: "task",
7756
7756
  requestId: pending.requestId,
7757
7757
  url: pending.url,
7758
+ headers: pending.headers,
7759
+ requiredHeaders: pending.requiredHeaders,
7758
7760
  }
7759
7761
  : { status: "idle" });
7760
7762
  return;
@@ -7793,7 +7795,10 @@ async function createLocalAccountSearchBrowserRelay(requestedPort) {
7793
7795
  return;
7794
7796
  }
7795
7797
  if (!Number.isFinite(status) || status < 200 || status >= 300) {
7796
- current.reject(new Error(`Sales Navigator browser relay failed with HTTP ${status}: ${bodyPreview}`));
7798
+ const recovery = status === 401 || status === 403
7799
+ ? " Refresh the Sales Navigator search, capture the current csrf-token from a native Lead Search request, and replay this task with the supplied headers."
7800
+ : "";
7801
+ current.reject(new Error(`Sales Navigator browser relay failed with HTTP ${status}: ${bodyPreview}.${recovery}`));
7797
7802
  writeLocalAccountSearchRelayJson(response, 200, {
7798
7803
  status: "failed",
7799
7804
  });
@@ -7828,21 +7833,37 @@ async function createLocalAccountSearchBrowserRelay(requestedPort) {
7828
7833
  }
7829
7834
  return {
7830
7835
  port: address.port,
7831
- request(url) {
7836
+ request(request) {
7832
7837
  if (pending) {
7833
7838
  throw new Error("Account Search browser relay already has a pending task.");
7834
7839
  }
7835
- const parsedUrl = new URL(url);
7840
+ const parsedUrl = new URL(request.url);
7836
7841
  if (!/(^|\.)linkedin\.com$/i.test(parsedUrl.hostname) ||
7837
7842
  !(parsedUrl.pathname.includes("/sales-api/salesApiAccountSearch") ||
7838
7843
  parsedUrl.pathname.includes("/sales-api/salesApiLeadSearch"))) {
7839
7844
  throw new Error("Browser relay only accepts LinkedIn Account or Lead Search API URLs.");
7840
7845
  }
7846
+ const headers = Object.fromEntries(Object.entries(request.headers)
7847
+ .map(([name, value]) => [name.toLowerCase(), value])
7848
+ .filter(([name]) => ![
7849
+ "cookie",
7850
+ "host",
7851
+ "origin",
7852
+ "referer",
7853
+ "content-length",
7854
+ "user-agent",
7855
+ ].includes(name)));
7856
+ headers.accept ??= "*/*";
7857
+ headers["x-restli-protocol-version"] ??= "2.0.0";
7841
7858
  requestSequence += 1;
7842
7859
  return new Promise((resolve, reject) => {
7843
7860
  pending = {
7844
7861
  requestId: `sales-nav-search-${requestSequence}`,
7845
- url,
7862
+ url: request.url,
7863
+ headers,
7864
+ requiredHeaders: parsedUrl.pathname.includes("salesApiLeadSearch")
7865
+ ? ["csrf-token"]
7866
+ : [],
7846
7867
  resolve,
7847
7868
  reject,
7848
7869
  };
@@ -13281,7 +13302,7 @@ async function runSalesNavigatorPeopleCollectCommand(options) {
13281
13302
  retryMaxDelayMs: 10_000
13282
13303
  },
13283
13304
  executeRequest: browserRelay
13284
- ? (request) => browserRelay.request(request.url)
13305
+ ? (request) => browserRelay.request(request)
13285
13306
  : undefined
13286
13307
  });
13287
13308
  }
@@ -13303,6 +13324,14 @@ async function runSalesNavigatorPeopleCollectCommand(options) {
13303
13324
  dryRun: false,
13304
13325
  collected: collected.people.length,
13305
13326
  totalResults: collected.totalResults,
13327
+ collectionComplete: collected.totalResults != null &&
13328
+ collected.people.length >= collected.totalResults,
13329
+ truncated: collected.totalResults != null &&
13330
+ collected.totalResults > collected.people.length &&
13331
+ collected.people.length >= maxResults,
13332
+ remainingResults: collected.totalResults == null
13333
+ ? null
13334
+ : Math.max(0, collected.totalResults - collected.people.length),
13306
13335
  fetchedPages: collected.fetchedPages,
13307
13336
  runId: imported.runId,
13308
13337
  imported: imported.imported,
@@ -13359,7 +13388,7 @@ async function runAffiliateLaunchCommand(options) {
13359
13388
  retryMaxDelayMs: 10_000,
13360
13389
  },
13361
13390
  executeRequest: browserRelay
13362
- ? (request) => browserRelay.request(request.url)
13391
+ ? (request) => browserRelay.request(request)
13363
13392
  : undefined,
13364
13393
  });
13365
13394
  }
@@ -14464,7 +14493,7 @@ program
14464
14493
  };
14465
14494
  };
14466
14495
  const executeRequest = (request) => browserRelay
14467
- ? browserRelay.request(request.url)
14496
+ ? browserRelay.request(request)
14468
14497
  : fetchLocalSalesNavigatorRequest(request, retry);
14469
14498
  try {
14470
14499
  let requestsThisRun = 0;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "salesprompter-cli",
3
- "version": "0.1.49",
3
+ "version": "0.1.50",
4
4
  "description": "Sales workflow CLI for guided lead generation, enrichment, scoring, and sync.",
5
5
  "author": "Daniel Sinewe <hello@danielsinewe.com>",
6
6
  "type": "module",