lumnisai 0.1.7 → 0.1.9

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.
package/dist/index.cjs CHANGED
@@ -2,6 +2,13 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
+ const node_buffer = require('node:buffer');
6
+ const crypto$1 = require('node:crypto');
7
+
8
+ function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e.default : e; }
9
+
10
+ const crypto__default = /*#__PURE__*/_interopDefaultCompat(crypto$1);
11
+
5
12
  const DEFAULT_BASE_URL = "https://api.lumnis.ai";
6
13
  const DEFAULT_POLL_INTERVAL_MS = 2e3;
7
14
  const LONG_POLL_TIMEOUT_S = 10;
@@ -207,15 +214,33 @@ class IntegrationsResource {
207
214
  * Check the status of a specific connection
208
215
  */
209
216
  async getConnectionStatus(params) {
210
- const { userId, appName, provider } = params;
217
+ const { userId, appName, provider, includeEnabled } = params;
211
218
  const queryParams = new URLSearchParams();
212
219
  if (provider)
213
220
  queryParams.append("provider", provider);
221
+ if (includeEnabled)
222
+ queryParams.append("include_enabled", "true");
214
223
  const query = queryParams.toString() ? `?${queryParams.toString()}` : "";
215
224
  return this.http.get(
216
225
  `/integrations/connections/${encodeURIComponent(userId)}/${appName.toUpperCase()}${query}`
217
226
  );
218
227
  }
228
+ /**
229
+ * Check connection status for multiple apps in a single request
230
+ * Optimized for onboarding flows - checks multiple connections in parallel
231
+ */
232
+ async getConnectionsBatch(params) {
233
+ const requestData = {
234
+ userId: params.userId,
235
+ appNames: params.appNames.map((name) => name.toUpperCase()),
236
+ provider: params.provider || "composio",
237
+ includeEnabledStatus: params.includeEnabledStatus ?? true
238
+ };
239
+ return this.http.post(
240
+ "/integrations/connections/batch",
241
+ requestData
242
+ );
243
+ }
219
244
  /**
220
245
  * Get all connections for a user
221
246
  */
@@ -391,50 +416,6 @@ class MCPServersResource {
391
416
  }
392
417
  }
393
418
 
394
- class ModelPreferencesResource {
395
- constructor(http) {
396
- this.http = http;
397
- }
398
- /**
399
- * Get all model preferences for the tenant
400
- */
401
- async get(includeDefaults = true) {
402
- const params = new URLSearchParams();
403
- params.append("include_defaults", includeDefaults.toString());
404
- return this.http.get(`/model-preferences?${params.toString()}`);
405
- }
406
- /**
407
- * Update multiple model preferences in a single request
408
- */
409
- async updateBulk(data) {
410
- return this.http.put("/model-preferences", data);
411
- }
412
- /**
413
- * Update a specific model type preference
414
- */
415
- async update(modelType, data) {
416
- return this.http.patch(`/model-preferences/${modelType}`, data);
417
- }
418
- /**
419
- * Delete a model preference to revert to system default
420
- */
421
- async delete(modelType) {
422
- await this.http.delete(`/model-preferences/${modelType}`);
423
- }
424
- /**
425
- * Check which models are available based on API key configuration
426
- */
427
- async checkAvailability(models) {
428
- return this.http.post("/model-preferences/check-availability", models);
429
- }
430
- /**
431
- * List all model preferences (alias for get)
432
- */
433
- async list(params) {
434
- return this.get(params?.includeDefaults);
435
- }
436
- }
437
-
438
419
  class LumnisError extends Error {
439
420
  code;
440
421
  statusCode;
@@ -508,6 +489,319 @@ class SourcesNotAvailableError extends ValidationError {
508
489
  this.availableSources = availableSources;
509
490
  }
510
491
  }
492
+ class MessagingAPIError extends LumnisError {
493
+ constructor(message, options = {}) {
494
+ super(message, options);
495
+ this.name = "MessagingAPIError";
496
+ }
497
+ }
498
+ class MessagingNotFoundError extends MessagingAPIError {
499
+ constructor(message, options = {}) {
500
+ super(message, { ...options, statusCode: 404 });
501
+ this.name = "MessagingNotFoundError";
502
+ }
503
+ }
504
+ class MessagingValidationError extends MessagingAPIError {
505
+ constructor(message, options = {}) {
506
+ super(message, { ...options, statusCode: 400 });
507
+ this.name = "MessagingValidationError";
508
+ }
509
+ }
510
+ class MessagingSendError extends MessagingAPIError {
511
+ constructor(message, options = {}) {
512
+ super(message, { ...options, statusCode: 400 });
513
+ this.name = "MessagingSendError";
514
+ }
515
+ }
516
+ class MessagingConnectionError extends MessagingAPIError {
517
+ constructor(message, options = {}) {
518
+ super(message, { ...options, statusCode: 400 });
519
+ this.name = "MessagingConnectionError";
520
+ }
521
+ }
522
+
523
+ class MessagingResource {
524
+ constructor(http) {
525
+ this.http = http;
526
+ }
527
+ /**
528
+ * Sync conversations from connected providers for specific prospects.
529
+ * Prospects list is REQUIRED.
530
+ */
531
+ async syncConversations(userId, request) {
532
+ if (!request.prospects || request.prospects.length === 0) {
533
+ throw new MessagingValidationError("prospects array is required and must not be empty", { code: "VALIDATION_ERROR" });
534
+ }
535
+ for (const prospect of request.prospects) {
536
+ const hasIdentifier = prospect.email || prospect.linkedinUrl || prospect.providerId;
537
+ if (!hasIdentifier) {
538
+ throw new MessagingValidationError("Each prospect must have at least one identifier (email, linkedinUrl, or providerId)", { code: "VALIDATION_ERROR" });
539
+ }
540
+ }
541
+ const queryParams = new URLSearchParams();
542
+ queryParams.append("user_id", userId);
543
+ return this.http.post(
544
+ `/messaging/sync?${queryParams.toString()}`,
545
+ request
546
+ );
547
+ }
548
+ /**
549
+ * Sync conversation for a single prospect on-demand.
550
+ * Use when viewing a prospect's detail page.
551
+ */
552
+ async syncProspect(userId, request) {
553
+ const queryParams = new URLSearchParams();
554
+ queryParams.append("user_id", userId);
555
+ return this.http.post(
556
+ `/messaging/sync/prospect?${queryParams.toString()}`,
557
+ request
558
+ );
559
+ }
560
+ /**
561
+ * Get sync job status
562
+ */
563
+ async getSyncStatus(jobId) {
564
+ return this.http.get(`/messaging/sync/${encodeURIComponent(jobId)}`);
565
+ }
566
+ /**
567
+ * List conversations with filtering
568
+ */
569
+ async listConversations(userId, params) {
570
+ const queryParams = new URLSearchParams();
571
+ queryParams.append("user_id", userId);
572
+ if (params?.status)
573
+ queryParams.append("status", params.status);
574
+ if (params?.channel)
575
+ queryParams.append("channel", params.channel);
576
+ if (params?.projectId)
577
+ queryParams.append("project_id", params.projectId);
578
+ if (params?.networkDistance)
579
+ queryParams.append("network_distance", params.networkDistance);
580
+ if (params?.limit !== void 0)
581
+ queryParams.append("limit", String(params.limit));
582
+ if (params?.offset !== void 0)
583
+ queryParams.append("offset", String(params.offset));
584
+ return this.http.get(
585
+ `/messaging/conversations?${queryParams.toString()}`
586
+ );
587
+ }
588
+ /**
589
+ * Get all conversations for a project
590
+ */
591
+ async listConversationsByProject(projectId, userId, params) {
592
+ const queryParams = new URLSearchParams();
593
+ queryParams.append("user_id", userId);
594
+ if (params?.limit !== void 0)
595
+ queryParams.append("limit", String(params.limit));
596
+ if (params?.offset !== void 0)
597
+ queryParams.append("offset", String(params.offset));
598
+ return this.http.get(
599
+ `/messaging/conversations/by-project/${encodeURIComponent(projectId)}?${queryParams.toString()}`
600
+ );
601
+ }
602
+ /**
603
+ * Get conversation with messages
604
+ */
605
+ async getConversation(conversationId, userId, params) {
606
+ const queryParams = new URLSearchParams();
607
+ queryParams.append("user_id", userId);
608
+ if (params?.fetchLive !== void 0)
609
+ queryParams.append("fetch_live", String(params.fetchLive));
610
+ return this.http.get(
611
+ `/messaging/conversations/${encodeURIComponent(conversationId)}?${queryParams.toString()}`
612
+ );
613
+ }
614
+ /**
615
+ * Send a message (creates new conversation or adds to existing)
616
+ */
617
+ async sendMessage(userId, request) {
618
+ const queryParams = new URLSearchParams();
619
+ queryParams.append("user_id", userId);
620
+ return this.http.post(
621
+ `/messaging/send?${queryParams.toString()}`,
622
+ request
623
+ );
624
+ }
625
+ /**
626
+ * Reply to an existing conversation
627
+ */
628
+ async replyToConversation(conversationId, userId, request) {
629
+ const queryParams = new URLSearchParams();
630
+ queryParams.append("user_id", userId);
631
+ return this.http.post(
632
+ `/messaging/conversations/${encodeURIComponent(conversationId)}/reply?${queryParams.toString()}`,
633
+ request
634
+ );
635
+ }
636
+ /**
637
+ * Get all email threads with a specific person
638
+ */
639
+ async getEmailThreads(emailAddress, userId, params) {
640
+ const queryParams = new URLSearchParams();
641
+ queryParams.append("user_id", userId);
642
+ if (params?.limit !== void 0)
643
+ queryParams.append("limit", String(params.limit));
644
+ return this.http.get(
645
+ `/messaging/email-threads/${encodeURIComponent(emailAddress)}?${queryParams.toString()}`
646
+ );
647
+ }
648
+ /**
649
+ * Check if user is connected to a prospect on LinkedIn
650
+ */
651
+ async checkLinkedInConnection(userId, request) {
652
+ const queryParams = new URLSearchParams();
653
+ queryParams.append("user_id", userId);
654
+ return this.http.post(
655
+ `/messaging/linkedin/check-connection?${queryParams.toString()}`,
656
+ request
657
+ );
658
+ }
659
+ /**
660
+ * Batch check connection status for multiple prospects
661
+ */
662
+ async batchCheckLinkedInConnections(userId, request) {
663
+ const queryParams = new URLSearchParams();
664
+ queryParams.append("user_id", userId);
665
+ return this.http.post(
666
+ `/messaging/linkedin/check-connections/batch?${queryParams.toString()}`,
667
+ request
668
+ );
669
+ }
670
+ /**
671
+ * Smart LinkedIn outreach with automatic method selection
672
+ */
673
+ async sendLinkedInOutreach(userId, request) {
674
+ const queryParams = new URLSearchParams();
675
+ queryParams.append("user_id", userId);
676
+ return this.http.post(
677
+ `/messaging/linkedin/send?${queryParams.toString()}`,
678
+ request
679
+ );
680
+ }
681
+ /**
682
+ * Get InMail credit information.
683
+ * By default returns cached data. Set forceRefresh=true to fetch real-time data from Unipile API.
684
+ */
685
+ async getLinkedInCredits(userId, options) {
686
+ const queryParams = new URLSearchParams();
687
+ queryParams.append("user_id", userId);
688
+ if (options?.forceRefresh) {
689
+ queryParams.append("force_refresh", "true");
690
+ }
691
+ return this.http.get(
692
+ `/messaging/linkedin/credits?${queryParams.toString()}`
693
+ );
694
+ }
695
+ /**
696
+ * Force refresh InMail credits from Unipile API.
697
+ * Fetches real-time credit balance from provider and updates cache.
698
+ */
699
+ async refreshLinkedInCredits(userId) {
700
+ const queryParams = new URLSearchParams();
701
+ queryParams.append("user_id", userId);
702
+ return this.http.post(
703
+ `/messaging/linkedin/refresh-credits?${queryParams.toString()}`
704
+ );
705
+ }
706
+ /**
707
+ * Update LinkedIn subscription type and credits
708
+ */
709
+ async updateLinkedInSubscription(userId, request) {
710
+ const queryParams = new URLSearchParams();
711
+ queryParams.append("user_id", userId);
712
+ return this.http.put(
713
+ `/messaging/linkedin/subscription?${queryParams.toString()}`,
714
+ request
715
+ );
716
+ }
717
+ /**
718
+ * Create a single draft message
719
+ */
720
+ async createDraft(userId, request) {
721
+ const queryParams = new URLSearchParams();
722
+ queryParams.append("user_id", userId);
723
+ return this.http.post(
724
+ `/messaging/drafts?${queryParams.toString()}`,
725
+ request
726
+ );
727
+ }
728
+ /**
729
+ * Create drafts for multiple prospects with AI generation
730
+ */
731
+ async createBatchDrafts(userId, request) {
732
+ const queryParams = new URLSearchParams();
733
+ queryParams.append("user_id", userId);
734
+ return this.http.post(
735
+ `/messaging/drafts/batch?${queryParams.toString()}`,
736
+ request
737
+ );
738
+ }
739
+ /**
740
+ * Approve and send a single draft
741
+ */
742
+ async sendDraft(draftId, userId) {
743
+ const queryParams = new URLSearchParams();
744
+ queryParams.append("user_id", userId);
745
+ return this.http.post(
746
+ `/messaging/drafts/${encodeURIComponent(draftId)}/send?${queryParams.toString()}`
747
+ );
748
+ }
749
+ /**
750
+ * Send multiple drafts with rate limiting
751
+ */
752
+ async sendBatchDrafts(userId, request) {
753
+ const queryParams = new URLSearchParams();
754
+ queryParams.append("user_id", userId);
755
+ return this.http.post(
756
+ `/messaging/drafts/batch/send?${queryParams.toString()}`,
757
+ request
758
+ );
759
+ }
760
+ }
761
+
762
+ class ModelPreferencesResource {
763
+ constructor(http) {
764
+ this.http = http;
765
+ }
766
+ /**
767
+ * Get all model preferences for the tenant
768
+ */
769
+ async get(includeDefaults = true) {
770
+ const params = new URLSearchParams();
771
+ params.append("include_defaults", includeDefaults.toString());
772
+ return this.http.get(`/model-preferences?${params.toString()}`);
773
+ }
774
+ /**
775
+ * Update multiple model preferences in a single request
776
+ */
777
+ async updateBulk(data) {
778
+ return this.http.put("/model-preferences", data);
779
+ }
780
+ /**
781
+ * Update a specific model type preference
782
+ */
783
+ async update(modelType, data) {
784
+ return this.http.patch(`/model-preferences/${modelType}`, data);
785
+ }
786
+ /**
787
+ * Delete a model preference to revert to system default
788
+ */
789
+ async delete(modelType) {
790
+ await this.http.delete(`/model-preferences/${modelType}`);
791
+ }
792
+ /**
793
+ * Check which models are available based on API key configuration
794
+ */
795
+ async checkAvailability(models) {
796
+ return this.http.post("/model-preferences/check-availability", models);
797
+ }
798
+ /**
799
+ * List all model preferences (alias for get)
800
+ */
801
+ async list(params) {
802
+ return this.get(params?.includeDefaults);
803
+ }
804
+ }
511
805
 
512
806
  var PeopleDataSource = /* @__PURE__ */ ((PeopleDataSource2) => {
513
807
  PeopleDataSource2["PDL"] = "PDL";
@@ -709,6 +1003,35 @@ class ResponsesResource {
709
1003
  queryParams.progress_id = options.progressId;
710
1004
  return this.http.get(`/responses/${responseId}/feedback`, { params: queryParams });
711
1005
  }
1006
+ /**
1007
+ * Perform a quick people search using the specialized quick_people_search agent
1008
+ * @param query - Natural language search query (e.g., "Find engineers at Google in SF")
1009
+ * @param options - Optional search parameters
1010
+ * @param options.limit - Maximum number of results (1-100, default: 20)
1011
+ * @param options.dataSources - Specific data sources to use: ["PDL", "CORESIGNAL", "CRUST_DATA"]
1012
+ * @returns Response with structured_response containing:
1013
+ * - candidates: List of person results
1014
+ * - totalFound: Total unique candidates found
1015
+ * - appliedFilters: Extracted search filters
1016
+ * - executionTimeMs: Search duration
1017
+ * - dataSourcesUsed: Which sources were queried
1018
+ */
1019
+ async quickPeopleSearch(query, options) {
1020
+ const request = {
1021
+ messages: [{ role: "user", content: query }],
1022
+ specializedAgent: "quick_people_search"
1023
+ };
1024
+ if (options) {
1025
+ const params = {};
1026
+ if (options.limit !== void 0)
1027
+ params.limit = options.limit;
1028
+ if (options.dataSources)
1029
+ params.dataSources = options.dataSources;
1030
+ if (Object.keys(params).length > 0)
1031
+ request.specializedAgentParams = params;
1032
+ }
1033
+ return this.create(request);
1034
+ }
712
1035
  }
713
1036
 
714
1037
  class SkillsResource {
@@ -943,12 +1266,20 @@ class UsersResource {
943
1266
  }
944
1267
  }
945
1268
 
1269
+ const UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
1270
+ function isUUID(s) {
1271
+ return UUID_PATTERN.test(s);
1272
+ }
946
1273
  function toCamel(s) {
1274
+ if (isUUID(s))
1275
+ return s;
947
1276
  return s.replace(/([-_][a-z])/gi, ($1) => {
948
1277
  return $1.toUpperCase().replace("-", "").replace("_", "");
949
1278
  });
950
1279
  }
951
1280
  function toSnake(s) {
1281
+ if (isUUID(s))
1282
+ return s;
952
1283
  return s.replace(/[A-Z]/g, (letter, index) => {
953
1284
  return index === 0 ? letter.toLowerCase() : `_${letter.toLowerCase()}`;
954
1285
  });
@@ -1121,6 +1452,7 @@ class LumnisClient {
1121
1452
  mcpServers;
1122
1453
  skills;
1123
1454
  people;
1455
+ messaging;
1124
1456
  _scopedUserId;
1125
1457
  _defaultScope;
1126
1458
  constructor(options = {}) {
@@ -1152,6 +1484,7 @@ class LumnisClient {
1152
1484
  this.mcpServers = new MCPServersResource(this.http);
1153
1485
  this.skills = new SkillsResource(this.http);
1154
1486
  this.people = new PeopleResource(this.http);
1487
+ this.messaging = new MessagingResource(this.http);
1155
1488
  }
1156
1489
  forUser(userId) {
1157
1490
  return new LumnisClient({
@@ -1331,8 +1664,28 @@ class LumnisClient {
1331
1664
  async initiateConnection(params) {
1332
1665
  return this.integrations.initiateConnection(params);
1333
1666
  }
1334
- async getConnectionStatus(userId, appName, provider) {
1335
- return this.integrations.getConnectionStatus({ userId, appName, provider });
1667
+ async getConnectionStatus(userId, appName, providerOrOptions) {
1668
+ if (typeof providerOrOptions === "string") {
1669
+ return this.integrations.getConnectionStatus({
1670
+ userId,
1671
+ appName,
1672
+ provider: providerOrOptions
1673
+ });
1674
+ }
1675
+ return this.integrations.getConnectionStatus({
1676
+ userId,
1677
+ appName,
1678
+ provider: providerOrOptions?.provider,
1679
+ includeEnabled: providerOrOptions?.includeEnabled
1680
+ });
1681
+ }
1682
+ async getConnectionsBatch(params) {
1683
+ return this.integrations.getConnectionsBatch({
1684
+ userId: params.userId,
1685
+ appNames: params.appNames,
1686
+ provider: params.provider,
1687
+ includeEnabledStatus: params.includeEnabledStatus
1688
+ });
1336
1689
  }
1337
1690
  async listConnections(userId, params) {
1338
1691
  return this.integrations.listConnections(userId, params);
@@ -1437,6 +1790,76 @@ var ProviderType = /* @__PURE__ */ ((ProviderType2) => {
1437
1790
  return ProviderType2;
1438
1791
  })(ProviderType || {});
1439
1792
 
1793
+ var ChannelType = /* @__PURE__ */ ((ChannelType2) => {
1794
+ ChannelType2["GMAIL"] = "gmail";
1795
+ ChannelType2["OUTLOOK"] = "outlook";
1796
+ ChannelType2["LINKEDIN"] = "linkedin";
1797
+ return ChannelType2;
1798
+ })(ChannelType || {});
1799
+ var OutreachMethod = /* @__PURE__ */ ((OutreachMethod2) => {
1800
+ OutreachMethod2["CONNECTION_REQUEST"] = "connection_request";
1801
+ OutreachMethod2["DIRECT_MESSAGE"] = "direct_message";
1802
+ OutreachMethod2["INMAIL"] = "inmail";
1803
+ OutreachMethod2["INMAIL_ESCALATION"] = "inmail_escalation";
1804
+ OutreachMethod2["EMAIL"] = "email";
1805
+ return OutreachMethod2;
1806
+ })(OutreachMethod || {});
1807
+ var ConversationStatus = /* @__PURE__ */ ((ConversationStatus2) => {
1808
+ ConversationStatus2["ACTIVE"] = "active";
1809
+ ConversationStatus2["NEEDS_RESPONSE"] = "needs_response";
1810
+ ConversationStatus2["WAITING"] = "waiting";
1811
+ ConversationStatus2["BOOKED"] = "booked";
1812
+ ConversationStatus2["CLOSED"] = "closed";
1813
+ return ConversationStatus2;
1814
+ })(ConversationStatus || {});
1815
+ var MessageType = /* @__PURE__ */ ((MessageType2) => {
1816
+ MessageType2["MESSAGE"] = "message";
1817
+ MessageType2["CONNECTION_REQUEST"] = "connection_request";
1818
+ MessageType2["CONNECTION_ACCEPTED"] = "connection_accepted";
1819
+ MessageType2["INMAIL"] = "inmail";
1820
+ return MessageType2;
1821
+ })(MessageType || {});
1822
+ var DraftStatus = /* @__PURE__ */ ((DraftStatus2) => {
1823
+ DraftStatus2["PENDING_REVIEW"] = "pending_review";
1824
+ DraftStatus2["APPROVED"] = "approved";
1825
+ DraftStatus2["SCHEDULED"] = "scheduled";
1826
+ DraftStatus2["SENDING"] = "sending";
1827
+ DraftStatus2["SENT"] = "sent";
1828
+ DraftStatus2["FAILED"] = "failed";
1829
+ DraftStatus2["DISCARDED"] = "discarded";
1830
+ return DraftStatus2;
1831
+ })(DraftStatus || {});
1832
+ var SyncJobStatus = /* @__PURE__ */ ((SyncJobStatus2) => {
1833
+ SyncJobStatus2["QUEUED"] = "queued";
1834
+ SyncJobStatus2["IN_PROGRESS"] = "in_progress";
1835
+ SyncJobStatus2["COMPLETED"] = "completed";
1836
+ SyncJobStatus2["FAILED"] = "failed";
1837
+ return SyncJobStatus2;
1838
+ })(SyncJobStatus || {});
1839
+ var QueueItemStatus = /* @__PURE__ */ ((QueueItemStatus2) => {
1840
+ QueueItemStatus2["QUEUED"] = "queued";
1841
+ QueueItemStatus2["PROCESSING"] = "processing";
1842
+ QueueItemStatus2["COMPLETED"] = "completed";
1843
+ QueueItemStatus2["FAILED"] = "failed";
1844
+ QueueItemStatus2["CANCELLED"] = "cancelled";
1845
+ return QueueItemStatus2;
1846
+ })(QueueItemStatus || {});
1847
+ var LinkedInSubscriptionType = /* @__PURE__ */ ((LinkedInSubscriptionType2) => {
1848
+ LinkedInSubscriptionType2["BASIC"] = "basic";
1849
+ LinkedInSubscriptionType2["PREMIUM"] = "premium";
1850
+ LinkedInSubscriptionType2["SALES_NAVIGATOR"] = "sales_navigator";
1851
+ LinkedInSubscriptionType2["RECRUITER_LITE"] = "recruiter_lite";
1852
+ LinkedInSubscriptionType2["RECRUITER_CORPORATE"] = "recruiter_corporate";
1853
+ return LinkedInSubscriptionType2;
1854
+ })(LinkedInSubscriptionType || {});
1855
+ var NetworkDistance = /* @__PURE__ */ ((NetworkDistance2) => {
1856
+ NetworkDistance2["FIRST_DEGREE"] = "FIRST_DEGREE";
1857
+ NetworkDistance2["SECOND_DEGREE"] = "SECOND_DEGREE";
1858
+ NetworkDistance2["THIRD_DEGREE"] = "THIRD_DEGREE";
1859
+ NetworkDistance2["OUT_OF_NETWORK"] = "OUT_OF_NETWORK";
1860
+ return NetworkDistance2;
1861
+ })(NetworkDistance || {});
1862
+
1440
1863
  function displayProgress(update, indent = " ") {
1441
1864
  if (update.state === "tool_update") {
1442
1865
  if (update.toolCalls && update.toolCalls.length > 0) {
@@ -1532,19 +1955,48 @@ class ProgressTracker {
1532
1955
  }
1533
1956
  }
1534
1957
 
1958
+ function verifyWebhookSignature(payload, signature, secret) {
1959
+ if (!signature || !secret) {
1960
+ return false;
1961
+ }
1962
+ const expectedSignature = crypto__default.createHmac("sha256", secret).update(payload).digest("hex");
1963
+ if (signature.length !== expectedSignature.length) {
1964
+ return false;
1965
+ }
1966
+ return crypto__default.timingSafeEqual(
1967
+ node_buffer.Buffer.from(signature),
1968
+ node_buffer.Buffer.from(expectedSignature)
1969
+ );
1970
+ }
1971
+
1535
1972
  exports.AuthenticationError = AuthenticationError;
1973
+ exports.ChannelType = ChannelType;
1974
+ exports.ConversationStatus = ConversationStatus;
1975
+ exports.DraftStatus = DraftStatus;
1536
1976
  exports.InternalServerError = InternalServerError;
1977
+ exports.LinkedInSubscriptionType = LinkedInSubscriptionType;
1537
1978
  exports.LocalFileNotSupportedError = LocalFileNotSupportedError;
1538
1979
  exports.LumnisClient = LumnisClient;
1539
1980
  exports.LumnisError = LumnisError;
1981
+ exports.MessageType = MessageType;
1982
+ exports.MessagingAPIError = MessagingAPIError;
1983
+ exports.MessagingConnectionError = MessagingConnectionError;
1984
+ exports.MessagingNotFoundError = MessagingNotFoundError;
1985
+ exports.MessagingSendError = MessagingSendError;
1986
+ exports.MessagingValidationError = MessagingValidationError;
1987
+ exports.NetworkDistance = NetworkDistance;
1540
1988
  exports.NoDataSourcesError = NoDataSourcesError;
1541
1989
  exports.NotFoundError = NotFoundError;
1990
+ exports.OutreachMethod = OutreachMethod;
1542
1991
  exports.PeopleDataSource = PeopleDataSource;
1543
1992
  exports.ProgressTracker = ProgressTracker;
1544
1993
  exports.ProviderType = ProviderType;
1994
+ exports.QueueItemStatus = QueueItemStatus;
1545
1995
  exports.RateLimitError = RateLimitError;
1546
1996
  exports.SourcesNotAvailableError = SourcesNotAvailableError;
1997
+ exports.SyncJobStatus = SyncJobStatus;
1547
1998
  exports.ValidationError = ValidationError;
1548
1999
  exports.default = LumnisClient;
1549
2000
  exports.displayProgress = displayProgress;
1550
2001
  exports.formatProgressEntry = formatProgressEntry;
2002
+ exports.verifyWebhookSignature = verifyWebhookSignature;