integrate-sdk 0.8.59-dev.0 → 0.8.61-dev.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.
package/dist/index.js CHANGED
@@ -3446,7 +3446,15 @@ function airtableIntegration(config = {}) {
3446
3446
  provider: "airtable",
3447
3447
  clientId: config.clientId ?? getEnv("AIRTABLE_CLIENT_ID"),
3448
3448
  clientSecret: config.clientSecret ?? getEnv("AIRTABLE_CLIENT_SECRET"),
3449
- scopes: config.scopes || ["data.records:read", "data.records:write", "schema.bases:read"],
3449
+ scopes: config.scopes || [
3450
+ "data.records:read",
3451
+ "data.records:write",
3452
+ "data.recordComments:read",
3453
+ "data.recordComments:write",
3454
+ "schema.bases:read",
3455
+ "schema.bases:write",
3456
+ "webhook:manage"
3457
+ ],
3450
3458
  redirectUri: config.redirectUri,
3451
3459
  config: {
3452
3460
  ...config
@@ -3479,7 +3487,22 @@ var init_airtable = __esm(() => {
3479
3487
  "airtable_get_record",
3480
3488
  "airtable_create_record",
3481
3489
  "airtable_update_record",
3482
- "airtable_search_records"
3490
+ "airtable_search_records",
3491
+ "airtable_delete_record",
3492
+ "airtable_create_base",
3493
+ "airtable_create_table",
3494
+ "airtable_update_table",
3495
+ "airtable_create_field",
3496
+ "airtable_update_field",
3497
+ "airtable_list_comments",
3498
+ "airtable_create_comment",
3499
+ "airtable_update_comment",
3500
+ "airtable_delete_comment",
3501
+ "airtable_list_webhooks",
3502
+ "airtable_create_webhook",
3503
+ "airtable_delete_webhook",
3504
+ "airtable_list_webhook_payloads",
3505
+ "airtable_refresh_webhook"
3483
3506
  ];
3484
3507
  });
3485
3508
 
@@ -3575,7 +3598,7 @@ function calcomIntegration(config = {}) {
3575
3598
  provider: "calcom",
3576
3599
  clientId: config.clientId ?? getEnv("CALCOM_CLIENT_ID"),
3577
3600
  clientSecret: config.clientSecret ?? getEnv("CALCOM_CLIENT_SECRET"),
3578
- scopes: config.scopes || ["read:bookings", "write:bookings", "read:event-types", "read:schedules"],
3601
+ scopes: config.scopes || ["READ_BOOKING", "WRITE_BOOKING", "READ_PROFILE", "WRITE_PROFILE"],
3579
3602
  redirectUri: config.redirectUri,
3580
3603
  config: {
3581
3604
  apiBaseUrl: config.apiBaseUrl || "https://api.cal.com/v1",
@@ -3606,9 +3629,53 @@ var init_calcom = __esm(() => {
3606
3629
  "calcom_create_booking",
3607
3630
  "calcom_cancel_booking",
3608
3631
  "calcom_reschedule_booking",
3632
+ "calcom_update_booking",
3633
+ "calcom_get_booking_recordings",
3634
+ "calcom_get_booking_transcripts",
3609
3635
  "calcom_list_event_types",
3636
+ "calcom_get_event_type",
3637
+ "calcom_create_event_type",
3638
+ "calcom_update_event_type",
3639
+ "calcom_delete_event_type",
3640
+ "calcom_list_team_event_types",
3610
3641
  "calcom_get_availability",
3642
+ "calcom_get_availability_rule",
3643
+ "calcom_create_availability_rule",
3644
+ "calcom_update_availability_rule",
3645
+ "calcom_delete_availability_rule",
3611
3646
  "calcom_list_schedules",
3647
+ "calcom_get_schedule",
3648
+ "calcom_create_schedule",
3649
+ "calcom_update_schedule",
3650
+ "calcom_delete_schedule",
3651
+ "calcom_get_slots",
3652
+ "calcom_list_attendees",
3653
+ "calcom_get_attendee",
3654
+ "calcom_create_attendee",
3655
+ "calcom_update_attendee",
3656
+ "calcom_delete_attendee",
3657
+ "calcom_list_teams",
3658
+ "calcom_get_team",
3659
+ "calcom_create_team",
3660
+ "calcom_update_team",
3661
+ "calcom_delete_team",
3662
+ "calcom_list_memberships",
3663
+ "calcom_get_membership",
3664
+ "calcom_create_membership",
3665
+ "calcom_update_membership",
3666
+ "calcom_delete_membership",
3667
+ "calcom_list_webhooks",
3668
+ "calcom_get_webhook",
3669
+ "calcom_create_webhook",
3670
+ "calcom_update_webhook",
3671
+ "calcom_delete_webhook",
3672
+ "calcom_list_payments",
3673
+ "calcom_get_payment",
3674
+ "calcom_list_users",
3675
+ "calcom_get_user",
3676
+ "calcom_create_user",
3677
+ "calcom_update_user",
3678
+ "calcom_delete_user",
3612
3679
  "calcom_get_me"
3613
3680
  ];
3614
3681
  });
@@ -8236,6 +8303,7 @@ var init_index_browser = () => {};
8236
8303
  // src/triggers/utils.ts
8237
8304
  var exports_utils = {};
8238
8305
  __export(exports_utils, {
8306
+ validateStepLimit: () => validateStepLimit,
8239
8307
  validateStatusTransition: () => validateStatusTransition,
8240
8308
  generateTriggerId: () => generateTriggerId,
8241
8309
  extractProviderFromToolName: () => extractProviderFromToolName,
@@ -8263,6 +8331,15 @@ function validateStatusTransition(currentStatus, targetStatus) {
8263
8331
  }
8264
8332
  return { valid: true };
8265
8333
  }
8334
+ function validateStepLimit(stepIndex, maxSteps) {
8335
+ if (stepIndex >= maxSteps) {
8336
+ return {
8337
+ valid: false,
8338
+ error: `Step index ${stepIndex} exceeds maximum of ${maxSteps} steps`
8339
+ };
8340
+ }
8341
+ return { valid: true };
8342
+ }
8266
8343
  function calculateHasMore(offset, returnedCount, total) {
8267
8344
  return offset + returnedCount < total;
8268
8345
  }
@@ -10270,6 +10347,69 @@ var init_ai = __esm(() => {
10270
10347
  init_trigger_tools();
10271
10348
  });
10272
10349
 
10350
+ // src/triggers/types.ts
10351
+ var exports_types = {};
10352
+ __export(exports_types, {
10353
+ WEBHOOK_DELIVERY_TIMEOUT_MS: () => WEBHOOK_DELIVERY_TIMEOUT_MS,
10354
+ MAX_TRIGGER_STEPS: () => MAX_TRIGGER_STEPS
10355
+ });
10356
+ var MAX_TRIGGER_STEPS = 20, WEBHOOK_DELIVERY_TIMEOUT_MS = 1e4;
10357
+
10358
+ // src/triggers/webhooks.ts
10359
+ var exports_webhooks = {};
10360
+ __export(exports_webhooks, {
10361
+ signPayload: () => signPayload,
10362
+ deliverWebhooks: () => deliverWebhooks,
10363
+ deliverWebhook: () => deliverWebhook
10364
+ });
10365
+ async function signPayload(payload, secret) {
10366
+ const encoder = new TextEncoder;
10367
+ const data = encoder.encode(JSON.stringify(payload));
10368
+ const key = await crypto.subtle.importKey("raw", encoder.encode(secret), { name: "HMAC", hash: "SHA-256" }, false, ["sign"]);
10369
+ const signature = await crypto.subtle.sign("HMAC", key, data);
10370
+ return Array.from(new Uint8Array(signature)).map((b) => b.toString(16).padStart(2, "0")).join("");
10371
+ }
10372
+ async function deliverWebhook(webhook, payload, timeoutMs) {
10373
+ const headers = {
10374
+ "Content-Type": "application/json",
10375
+ ...webhook.headers
10376
+ };
10377
+ if (webhook.secret) {
10378
+ headers["X-Webhook-Signature"] = await signPayload(payload, webhook.secret);
10379
+ }
10380
+ const controller = new AbortController;
10381
+ const timeout = setTimeout(() => controller.abort(), timeoutMs);
10382
+ try {
10383
+ const response = await fetch(webhook.url, {
10384
+ method: "POST",
10385
+ headers,
10386
+ body: JSON.stringify(payload),
10387
+ signal: controller.signal
10388
+ });
10389
+ if (!response.ok) {
10390
+ logger30.warn(`Webhook delivery to ${webhook.url} returned ${response.status}`);
10391
+ }
10392
+ } finally {
10393
+ clearTimeout(timeout);
10394
+ }
10395
+ }
10396
+ async function deliverWebhooks(webhooks, payload, timeoutMs) {
10397
+ if (webhooks.length === 0)
10398
+ return;
10399
+ const results = await Promise.allSettled(webhooks.map((webhook) => deliverWebhook(webhook, payload, timeoutMs)));
10400
+ for (let i = 0;i < results.length; i++) {
10401
+ const result = results[i];
10402
+ if (result.status === "rejected") {
10403
+ logger30.warn(`Webhook delivery to ${webhooks[i].url} failed:`, result.reason);
10404
+ }
10405
+ }
10406
+ }
10407
+ var logger30;
10408
+ var init_webhooks = __esm(() => {
10409
+ init_logger();
10410
+ logger30 = createLogger("Webhooks", "server");
10411
+ });
10412
+
10273
10413
  // src/server.ts
10274
10414
  var exports_server = {};
10275
10415
  __export(exports_server, {
@@ -10363,7 +10503,7 @@ function createMCPServer(config) {
10363
10503
  if (integration.oauth) {
10364
10504
  const { clientId, clientSecret, redirectUri: integrationRedirectUri, config: oauthConfig } = integration.oauth;
10365
10505
  if (!clientId || !clientSecret) {
10366
- logger30.warn(`Warning: Integration "${integration.id}" is missing OAuth credentials. ` + `Provide clientId and clientSecret in the integration configuration.`);
10506
+ logger31.warn(`Warning: Integration "${integration.id}" is missing OAuth credentials. ` + `Provide clientId and clientSecret in the integration configuration.`);
10367
10507
  return integration;
10368
10508
  }
10369
10509
  const redirectUri = integrationRedirectUri || config.redirectUri || getDefaultRedirectUri();
@@ -10494,7 +10634,7 @@ function createMCPServer(config) {
10494
10634
  }
10495
10635
  return response2;
10496
10636
  } catch (error) {
10497
- logger30.error("[MCP Tool Call] Error:", error);
10637
+ logger31.error("[MCP Tool Call] Error:", error);
10498
10638
  return Response.json({ error: error.message || "Failed to execute tool call" }, { status: error.statusCode || 500 });
10499
10639
  }
10500
10640
  }
@@ -10570,7 +10710,7 @@ function createMCPServer(config) {
10570
10710
  })
10571
10711
  });
10572
10712
  } catch (scheduleError) {
10573
- logger30.error("[Trigger] Failed to register with scheduler:", scheduleError);
10713
+ logger31.error("[Trigger] Failed to register with scheduler:", scheduleError);
10574
10714
  }
10575
10715
  return Response.json(created, { status: 201 });
10576
10716
  }
@@ -10605,7 +10745,7 @@ function createMCPServer(config) {
10605
10745
  body: JSON.stringify({ triggerId })
10606
10746
  });
10607
10747
  } catch (error) {
10608
- logger30.error("[Trigger] Failed to pause in scheduler:", error);
10748
+ logger31.error("[Trigger] Failed to pause in scheduler:", error);
10609
10749
  }
10610
10750
  return Response.json(updated);
10611
10751
  } else if (subAction === "resume" && method === "POST") {
@@ -10633,7 +10773,7 @@ function createMCPServer(config) {
10633
10773
  body: JSON.stringify({ triggerId })
10634
10774
  });
10635
10775
  } catch (error) {
10636
- logger30.error("[Trigger] Failed to resume in scheduler:", error);
10776
+ logger31.error("[Trigger] Failed to resume in scheduler:", error);
10637
10777
  }
10638
10778
  return Response.json(updated);
10639
10779
  } else if (subAction === "run" && method === "POST") {
@@ -10726,6 +10866,60 @@ function createMCPServer(config) {
10726
10866
  if (!trigger) {
10727
10867
  return Response.json({ error: "Trigger not found" }, { status: 404 });
10728
10868
  }
10869
+ if (body.stepIndex != null) {
10870
+ const { validateStepLimit: validateStepLimit2 } = await Promise.resolve().then(() => (init_utils2(), exports_utils));
10871
+ const { MAX_TRIGGER_STEPS: MAX_TRIGGER_STEPS2 } = await Promise.resolve().then(() => exports_types);
10872
+ const stepValidation = validateStepLimit2(body.stepIndex, MAX_TRIGGER_STEPS2);
10873
+ if (!stepValidation.valid) {
10874
+ return Response.json({ error: stepValidation.error }, { status: 400 });
10875
+ }
10876
+ }
10877
+ if (config.triggers.onComplete) {
10878
+ try {
10879
+ const completeResponse = await config.triggers.onComplete({
10880
+ trigger,
10881
+ request: body,
10882
+ context: context2
10883
+ });
10884
+ if (completeResponse.hasMore) {
10885
+ return Response.json(completeResponse);
10886
+ }
10887
+ const updates2 = {
10888
+ lastRunAt: body.executedAt,
10889
+ runCount: (trigger.runCount || 0) + 1
10890
+ };
10891
+ if (body.success) {
10892
+ updates2.lastResult = body.result;
10893
+ updates2.lastError = undefined;
10894
+ if (trigger.schedule.type === "once") {
10895
+ updates2.status = "completed";
10896
+ }
10897
+ } else {
10898
+ updates2.lastError = body.error;
10899
+ updates2.status = "failed";
10900
+ }
10901
+ await config.triggers.update(triggerId, updates2, context2);
10902
+ if (completeResponse.webhooks && completeResponse.webhooks.length > 0) {
10903
+ const { deliverWebhooks: deliverWebhooks2 } = await Promise.resolve().then(() => (init_webhooks(), exports_webhooks));
10904
+ const { WEBHOOK_DELIVERY_TIMEOUT_MS: WEBHOOK_DELIVERY_TIMEOUT_MS2 } = await Promise.resolve().then(() => exports_types);
10905
+ const steps = body.previousResults || [];
10906
+ const totalDuration = steps.reduce((sum, s) => sum + (s.duration || 0), 0);
10907
+ const payload = {
10908
+ triggerId,
10909
+ success: body.success,
10910
+ steps,
10911
+ totalSteps: steps.length,
10912
+ totalDuration,
10913
+ executedAt: body.executedAt
10914
+ };
10915
+ deliverWebhooks2(completeResponse.webhooks, payload, WEBHOOK_DELIVERY_TIMEOUT_MS2).catch(() => {});
10916
+ }
10917
+ return Response.json(completeResponse);
10918
+ } catch (error) {
10919
+ logger31.error("onComplete callback error:", error);
10920
+ return Response.json({ error: "Internal server error in onComplete callback" }, { status: 500 });
10921
+ }
10922
+ }
10729
10923
  const updates = {
10730
10924
  lastRunAt: body.executedAt,
10731
10925
  runCount: (trigger.runCount || 0) + 1
@@ -10774,7 +10968,7 @@ function createMCPServer(config) {
10774
10968
  })
10775
10969
  });
10776
10970
  } catch (error) {
10777
- logger30.error("[Trigger] Failed to update scheduler:", error);
10971
+ logger31.error("[Trigger] Failed to update scheduler:", error);
10778
10972
  }
10779
10973
  }
10780
10974
  return Response.json(updated);
@@ -10791,14 +10985,14 @@ function createMCPServer(config) {
10791
10985
  body: JSON.stringify({ triggerId })
10792
10986
  });
10793
10987
  } catch (error) {
10794
- logger30.error("[Trigger] Failed to unregister from scheduler:", error);
10988
+ logger31.error("[Trigger] Failed to unregister from scheduler:", error);
10795
10989
  }
10796
10990
  return new Response(null, { status: 204 });
10797
10991
  }
10798
10992
  }
10799
10993
  return Response.json({ error: "Invalid trigger route or method" }, { status: 404 });
10800
10994
  } catch (error) {
10801
- logger30.error("[Trigger] Error:", error);
10995
+ logger31.error("[Trigger] Error:", error);
10802
10996
  return Response.json({ error: error.message || "Failed to process trigger request" }, { status: error.statusCode || 500 });
10803
10997
  }
10804
10998
  }
@@ -10824,11 +11018,11 @@ function createMCPServer(config) {
10824
11018
  const errorRedirectUrl = "/auth-error";
10825
11019
  if (error) {
10826
11020
  const errorMsg = errorDescription || error;
10827
- logger30.error("[OAuth Redirect] Error:", errorMsg);
11021
+ logger31.error("[OAuth Redirect] Error:", errorMsg);
10828
11022
  return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent(errorMsg)}`, webRequest.url));
10829
11023
  }
10830
11024
  if (!code || !state) {
10831
- logger30.error("[OAuth Redirect] Missing code or state parameter");
11025
+ logger31.error("[OAuth Redirect] Missing code or state parameter");
10832
11026
  return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent("Invalid OAuth callback")}`, webRequest.url));
10833
11027
  }
10834
11028
  let returnUrl = defaultRedirectUrl;
@@ -10904,7 +11098,7 @@ function createMCPServer(config) {
10904
11098
  frontendUrl.hash = `oauth_callback=${encodeURIComponent(JSON.stringify({ code, state, tokenData }))}`;
10905
11099
  return Response.redirect(frontendUrl);
10906
11100
  } catch (error2) {
10907
- logger30.error("[OAuth Backend Callback] Error:", error2);
11101
+ logger31.error("[OAuth Backend Callback] Error:", error2);
10908
11102
  return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent(error2.message || "Failed to exchange token")}`, webRequest.url));
10909
11103
  }
10910
11104
  } else {
@@ -11123,7 +11317,7 @@ function toSvelteKitHandler(clientOrHandlerOrOptions, _redirectOptions) {
11123
11317
  }
11124
11318
  };
11125
11319
  }
11126
- var SERVER_LOG_CONTEXT2 = "server", logger30, globalServerConfig = null, codeVerifierStorage, POST = async (req, context) => {
11320
+ var SERVER_LOG_CONTEXT2 = "server", logger31, globalServerConfig = null, codeVerifierStorage, POST = async (req, context) => {
11127
11321
  if (!globalServerConfig) {
11128
11322
  return Response.json({ error: "OAuth not configured. Call createMCPServer() in your server initialization file first." }, { status: 500 });
11129
11323
  }
@@ -11171,7 +11365,7 @@ var init_server = __esm(() => {
11171
11365
  init_anthropic();
11172
11366
  init_google();
11173
11367
  init_ai();
11174
- logger30 = createLogger("MCPServer", SERVER_LOG_CONTEXT2);
11368
+ logger31 = createLogger("MCPServer", SERVER_LOG_CONTEXT2);
11175
11369
  codeVerifierStorage = new Map;
11176
11370
  });
11177
11371
 
@@ -11684,11 +11878,11 @@ class OAuthHandler {
11684
11878
  try {
11685
11879
  await this.config.removeProviderToken(request.provider, undefined, context);
11686
11880
  } catch (error) {
11687
- logger31.error(`Failed to delete token for ${request.provider} from database via removeProviderToken:`, error);
11881
+ logger32.error(`Failed to delete token for ${request.provider} from database via removeProviderToken:`, error);
11688
11882
  }
11689
11883
  }
11690
11884
  } catch (error) {
11691
- logger31.error(`Failed to extract context for disconnect:`, error);
11885
+ logger32.error(`Failed to extract context for disconnect:`, error);
11692
11886
  }
11693
11887
  }
11694
11888
  const url = new URL("/oauth/disconnect", this.serverUrl);
@@ -11748,10 +11942,10 @@ class OAuthHandler {
11748
11942
  return jsonRpcResponse.result;
11749
11943
  }
11750
11944
  }
11751
- var SERVER_LOG_CONTEXT3 = "server", logger31, MCP_SERVER_URL2 = "https://mcp.integrate.dev/api/v1/mcp";
11945
+ var SERVER_LOG_CONTEXT3 = "server", logger32, MCP_SERVER_URL2 = "https://mcp.integrate.dev/api/v1/mcp";
11752
11946
  var init_base_handler = __esm(() => {
11753
11947
  init_logger();
11754
- logger31 = createLogger("OAuthHandler", SERVER_LOG_CONTEXT3);
11948
+ logger32 = createLogger("OAuthHandler", SERVER_LOG_CONTEXT3);
11755
11949
  });
11756
11950
 
11757
11951
  // src/index.ts
@@ -11764,7 +11958,7 @@ init_nextjs();
11764
11958
  // src/adapters/nextjs-oauth-redirect.ts
11765
11959
  init_logger();
11766
11960
  var SERVER_LOG_CONTEXT4 = "server";
11767
- var logger32 = createLogger("OAuthRedirect", SERVER_LOG_CONTEXT4);
11961
+ var logger33 = createLogger("OAuthRedirect", SERVER_LOG_CONTEXT4);
11768
11962
  function createOAuthRedirectHandler(config) {
11769
11963
  const defaultRedirectUrl = config?.redirectUrl || "/";
11770
11964
  const errorRedirectUrl = config?.errorRedirectUrl || "/auth-error";
@@ -11776,11 +11970,11 @@ function createOAuthRedirectHandler(config) {
11776
11970
  const errorDescription = searchParams.get("error_description");
11777
11971
  if (error) {
11778
11972
  const errorMsg = errorDescription || error;
11779
- logger32.error("[OAuth Redirect] Error:", errorMsg);
11973
+ logger33.error("[OAuth Redirect] Error:", errorMsg);
11780
11974
  return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent(errorMsg)}`, req.url));
11781
11975
  }
11782
11976
  if (!code || !state) {
11783
- logger32.error("[OAuth Redirect] Missing code or state parameter");
11977
+ logger33.error("[OAuth Redirect] Missing code or state parameter");
11784
11978
  return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent("Invalid OAuth callback")}`, req.url));
11785
11979
  }
11786
11980
  let returnUrl = defaultRedirectUrl;
@@ -11860,6 +12054,8 @@ init_intercom();
11860
12054
  init_hubspot();
11861
12055
  init_youtube();
11862
12056
  init_cursor();
12057
+ init_utils2();
12058
+ init_webhooks();
11863
12059
  init_generic();
11864
12060
  init_messages();
11865
12061
  init_http_session();
@@ -11922,6 +12118,7 @@ export {
11922
12118
  youtubeIntegration,
11923
12119
  whatsappIntegration,
11924
12120
  vercelIntegration,
12121
+ validateStepLimit,
11925
12122
  todoistIntegration,
11926
12123
  toWebRequest,
11927
12124
  toTanStackStartHandler,
@@ -11955,6 +12152,7 @@ export {
11955
12152
  gcalIntegration,
11956
12153
  fromNodeHeaders,
11957
12154
  figmaIntegration,
12155
+ deliverWebhooks,
11958
12156
  cursorIntegration,
11959
12157
  createTanStackOAuthHandler,
11960
12158
  createSimpleIntegration,
@@ -11965,6 +12163,7 @@ export {
11965
12163
  clearClientCache,
11966
12164
  calcomIntegration,
11967
12165
  airtableIntegration,
12166
+ WEBHOOK_DELIVERY_TIMEOUT_MS,
11968
12167
  TriggerClient,
11969
12168
  ToolCallError,
11970
12169
  TokenExpiredError,
@@ -11973,6 +12172,7 @@ export {
11973
12172
  OAuthHandler,
11974
12173
  MCPMethod,
11975
12174
  MCPClientBase,
12175
+ MAX_TRIGGER_STEPS,
11976
12176
  IntegrateSDKError,
11977
12177
  HttpSessionTransport,
11978
12178
  ConnectionError,