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/oauth.js CHANGED
@@ -3268,7 +3268,15 @@ function airtableIntegration(config = {}) {
3268
3268
  provider: "airtable",
3269
3269
  clientId: config.clientId ?? getEnv("AIRTABLE_CLIENT_ID"),
3270
3270
  clientSecret: config.clientSecret ?? getEnv("AIRTABLE_CLIENT_SECRET"),
3271
- scopes: config.scopes || ["data.records:read", "data.records:write", "schema.bases:read"],
3271
+ scopes: config.scopes || [
3272
+ "data.records:read",
3273
+ "data.records:write",
3274
+ "data.recordComments:read",
3275
+ "data.recordComments:write",
3276
+ "schema.bases:read",
3277
+ "schema.bases:write",
3278
+ "webhook:manage"
3279
+ ],
3272
3280
  redirectUri: config.redirectUri,
3273
3281
  config: {
3274
3282
  ...config
@@ -3301,7 +3309,22 @@ var init_airtable = __esm(() => {
3301
3309
  "airtable_get_record",
3302
3310
  "airtable_create_record",
3303
3311
  "airtable_update_record",
3304
- "airtable_search_records"
3312
+ "airtable_search_records",
3313
+ "airtable_delete_record",
3314
+ "airtable_create_base",
3315
+ "airtable_create_table",
3316
+ "airtable_update_table",
3317
+ "airtable_create_field",
3318
+ "airtable_update_field",
3319
+ "airtable_list_comments",
3320
+ "airtable_create_comment",
3321
+ "airtable_update_comment",
3322
+ "airtable_delete_comment",
3323
+ "airtable_list_webhooks",
3324
+ "airtable_create_webhook",
3325
+ "airtable_delete_webhook",
3326
+ "airtable_list_webhook_payloads",
3327
+ "airtable_refresh_webhook"
3305
3328
  ];
3306
3329
  });
3307
3330
 
@@ -3397,7 +3420,7 @@ function calcomIntegration(config = {}) {
3397
3420
  provider: "calcom",
3398
3421
  clientId: config.clientId ?? getEnv("CALCOM_CLIENT_ID"),
3399
3422
  clientSecret: config.clientSecret ?? getEnv("CALCOM_CLIENT_SECRET"),
3400
- scopes: config.scopes || ["read:bookings", "write:bookings", "read:event-types", "read:schedules"],
3423
+ scopes: config.scopes || ["READ_BOOKING", "WRITE_BOOKING", "READ_PROFILE", "WRITE_PROFILE"],
3401
3424
  redirectUri: config.redirectUri,
3402
3425
  config: {
3403
3426
  apiBaseUrl: config.apiBaseUrl || "https://api.cal.com/v1",
@@ -3428,9 +3451,53 @@ var init_calcom = __esm(() => {
3428
3451
  "calcom_create_booking",
3429
3452
  "calcom_cancel_booking",
3430
3453
  "calcom_reschedule_booking",
3454
+ "calcom_update_booking",
3455
+ "calcom_get_booking_recordings",
3456
+ "calcom_get_booking_transcripts",
3431
3457
  "calcom_list_event_types",
3458
+ "calcom_get_event_type",
3459
+ "calcom_create_event_type",
3460
+ "calcom_update_event_type",
3461
+ "calcom_delete_event_type",
3462
+ "calcom_list_team_event_types",
3432
3463
  "calcom_get_availability",
3464
+ "calcom_get_availability_rule",
3465
+ "calcom_create_availability_rule",
3466
+ "calcom_update_availability_rule",
3467
+ "calcom_delete_availability_rule",
3433
3468
  "calcom_list_schedules",
3469
+ "calcom_get_schedule",
3470
+ "calcom_create_schedule",
3471
+ "calcom_update_schedule",
3472
+ "calcom_delete_schedule",
3473
+ "calcom_get_slots",
3474
+ "calcom_list_attendees",
3475
+ "calcom_get_attendee",
3476
+ "calcom_create_attendee",
3477
+ "calcom_update_attendee",
3478
+ "calcom_delete_attendee",
3479
+ "calcom_list_teams",
3480
+ "calcom_get_team",
3481
+ "calcom_create_team",
3482
+ "calcom_update_team",
3483
+ "calcom_delete_team",
3484
+ "calcom_list_memberships",
3485
+ "calcom_get_membership",
3486
+ "calcom_create_membership",
3487
+ "calcom_update_membership",
3488
+ "calcom_delete_membership",
3489
+ "calcom_list_webhooks",
3490
+ "calcom_get_webhook",
3491
+ "calcom_create_webhook",
3492
+ "calcom_update_webhook",
3493
+ "calcom_delete_webhook",
3494
+ "calcom_list_payments",
3495
+ "calcom_get_payment",
3496
+ "calcom_list_users",
3497
+ "calcom_get_user",
3498
+ "calcom_create_user",
3499
+ "calcom_update_user",
3500
+ "calcom_delete_user",
3434
3501
  "calcom_get_me"
3435
3502
  ];
3436
3503
  });
@@ -8070,6 +8137,7 @@ var init_nanoid = __esm(() => {
8070
8137
  // src/triggers/utils.ts
8071
8138
  var exports_utils = {};
8072
8139
  __export(exports_utils, {
8140
+ validateStepLimit: () => validateStepLimit,
8073
8141
  validateStatusTransition: () => validateStatusTransition,
8074
8142
  generateTriggerId: () => generateTriggerId,
8075
8143
  extractProviderFromToolName: () => extractProviderFromToolName,
@@ -8097,6 +8165,15 @@ function validateStatusTransition(currentStatus, targetStatus) {
8097
8165
  }
8098
8166
  return { valid: true };
8099
8167
  }
8168
+ function validateStepLimit(stepIndex, maxSteps) {
8169
+ if (stepIndex >= maxSteps) {
8170
+ return {
8171
+ valid: false,
8172
+ error: `Step index ${stepIndex} exceeds maximum of ${maxSteps} steps`
8173
+ };
8174
+ }
8175
+ return { valid: true };
8176
+ }
8100
8177
  function calculateHasMore(offset, returnedCount, total) {
8101
8178
  return offset + returnedCount < total;
8102
8179
  }
@@ -10104,6 +10181,69 @@ var init_ai = __esm(() => {
10104
10181
  init_trigger_tools();
10105
10182
  });
10106
10183
 
10184
+ // src/triggers/types.ts
10185
+ var exports_types = {};
10186
+ __export(exports_types, {
10187
+ WEBHOOK_DELIVERY_TIMEOUT_MS: () => WEBHOOK_DELIVERY_TIMEOUT_MS,
10188
+ MAX_TRIGGER_STEPS: () => MAX_TRIGGER_STEPS
10189
+ });
10190
+ var MAX_TRIGGER_STEPS = 20, WEBHOOK_DELIVERY_TIMEOUT_MS = 1e4;
10191
+
10192
+ // src/triggers/webhooks.ts
10193
+ var exports_webhooks = {};
10194
+ __export(exports_webhooks, {
10195
+ signPayload: () => signPayload,
10196
+ deliverWebhooks: () => deliverWebhooks,
10197
+ deliverWebhook: () => deliverWebhook
10198
+ });
10199
+ async function signPayload(payload, secret) {
10200
+ const encoder = new TextEncoder;
10201
+ const data = encoder.encode(JSON.stringify(payload));
10202
+ const key = await crypto.subtle.importKey("raw", encoder.encode(secret), { name: "HMAC", hash: "SHA-256" }, false, ["sign"]);
10203
+ const signature = await crypto.subtle.sign("HMAC", key, data);
10204
+ return Array.from(new Uint8Array(signature)).map((b) => b.toString(16).padStart(2, "0")).join("");
10205
+ }
10206
+ async function deliverWebhook(webhook, payload, timeoutMs) {
10207
+ const headers = {
10208
+ "Content-Type": "application/json",
10209
+ ...webhook.headers
10210
+ };
10211
+ if (webhook.secret) {
10212
+ headers["X-Webhook-Signature"] = await signPayload(payload, webhook.secret);
10213
+ }
10214
+ const controller = new AbortController;
10215
+ const timeout = setTimeout(() => controller.abort(), timeoutMs);
10216
+ try {
10217
+ const response = await fetch(webhook.url, {
10218
+ method: "POST",
10219
+ headers,
10220
+ body: JSON.stringify(payload),
10221
+ signal: controller.signal
10222
+ });
10223
+ if (!response.ok) {
10224
+ logger30.warn(`Webhook delivery to ${webhook.url} returned ${response.status}`);
10225
+ }
10226
+ } finally {
10227
+ clearTimeout(timeout);
10228
+ }
10229
+ }
10230
+ async function deliverWebhooks(webhooks, payload, timeoutMs) {
10231
+ if (webhooks.length === 0)
10232
+ return;
10233
+ const results = await Promise.allSettled(webhooks.map((webhook) => deliverWebhook(webhook, payload, timeoutMs)));
10234
+ for (let i = 0;i < results.length; i++) {
10235
+ const result = results[i];
10236
+ if (result.status === "rejected") {
10237
+ logger30.warn(`Webhook delivery to ${webhooks[i].url} failed:`, result.reason);
10238
+ }
10239
+ }
10240
+ }
10241
+ var logger30;
10242
+ var init_webhooks = __esm(() => {
10243
+ init_logger();
10244
+ logger30 = createLogger("Webhooks", "server");
10245
+ });
10246
+
10107
10247
  // src/server.ts
10108
10248
  var exports_server = {};
10109
10249
  __export(exports_server, {
@@ -10197,7 +10337,7 @@ function createMCPServer(config) {
10197
10337
  if (integration.oauth) {
10198
10338
  const { clientId, clientSecret, redirectUri: integrationRedirectUri, config: oauthConfig } = integration.oauth;
10199
10339
  if (!clientId || !clientSecret) {
10200
- logger30.warn(`Warning: Integration "${integration.id}" is missing OAuth credentials. ` + `Provide clientId and clientSecret in the integration configuration.`);
10340
+ logger31.warn(`Warning: Integration "${integration.id}" is missing OAuth credentials. ` + `Provide clientId and clientSecret in the integration configuration.`);
10201
10341
  return integration;
10202
10342
  }
10203
10343
  const redirectUri = integrationRedirectUri || config.redirectUri || getDefaultRedirectUri();
@@ -10328,7 +10468,7 @@ function createMCPServer(config) {
10328
10468
  }
10329
10469
  return response2;
10330
10470
  } catch (error) {
10331
- logger30.error("[MCP Tool Call] Error:", error);
10471
+ logger31.error("[MCP Tool Call] Error:", error);
10332
10472
  return Response.json({ error: error.message || "Failed to execute tool call" }, { status: error.statusCode || 500 });
10333
10473
  }
10334
10474
  }
@@ -10404,7 +10544,7 @@ function createMCPServer(config) {
10404
10544
  })
10405
10545
  });
10406
10546
  } catch (scheduleError) {
10407
- logger30.error("[Trigger] Failed to register with scheduler:", scheduleError);
10547
+ logger31.error("[Trigger] Failed to register with scheduler:", scheduleError);
10408
10548
  }
10409
10549
  return Response.json(created, { status: 201 });
10410
10550
  }
@@ -10439,7 +10579,7 @@ function createMCPServer(config) {
10439
10579
  body: JSON.stringify({ triggerId })
10440
10580
  });
10441
10581
  } catch (error) {
10442
- logger30.error("[Trigger] Failed to pause in scheduler:", error);
10582
+ logger31.error("[Trigger] Failed to pause in scheduler:", error);
10443
10583
  }
10444
10584
  return Response.json(updated);
10445
10585
  } else if (subAction === "resume" && method === "POST") {
@@ -10467,7 +10607,7 @@ function createMCPServer(config) {
10467
10607
  body: JSON.stringify({ triggerId })
10468
10608
  });
10469
10609
  } catch (error) {
10470
- logger30.error("[Trigger] Failed to resume in scheduler:", error);
10610
+ logger31.error("[Trigger] Failed to resume in scheduler:", error);
10471
10611
  }
10472
10612
  return Response.json(updated);
10473
10613
  } else if (subAction === "run" && method === "POST") {
@@ -10560,6 +10700,60 @@ function createMCPServer(config) {
10560
10700
  if (!trigger) {
10561
10701
  return Response.json({ error: "Trigger not found" }, { status: 404 });
10562
10702
  }
10703
+ if (body.stepIndex != null) {
10704
+ const { validateStepLimit: validateStepLimit2 } = await Promise.resolve().then(() => (init_utils2(), exports_utils));
10705
+ const { MAX_TRIGGER_STEPS: MAX_TRIGGER_STEPS2 } = await Promise.resolve().then(() => exports_types);
10706
+ const stepValidation = validateStepLimit2(body.stepIndex, MAX_TRIGGER_STEPS2);
10707
+ if (!stepValidation.valid) {
10708
+ return Response.json({ error: stepValidation.error }, { status: 400 });
10709
+ }
10710
+ }
10711
+ if (config.triggers.onComplete) {
10712
+ try {
10713
+ const completeResponse = await config.triggers.onComplete({
10714
+ trigger,
10715
+ request: body,
10716
+ context: context2
10717
+ });
10718
+ if (completeResponse.hasMore) {
10719
+ return Response.json(completeResponse);
10720
+ }
10721
+ const updates2 = {
10722
+ lastRunAt: body.executedAt,
10723
+ runCount: (trigger.runCount || 0) + 1
10724
+ };
10725
+ if (body.success) {
10726
+ updates2.lastResult = body.result;
10727
+ updates2.lastError = undefined;
10728
+ if (trigger.schedule.type === "once") {
10729
+ updates2.status = "completed";
10730
+ }
10731
+ } else {
10732
+ updates2.lastError = body.error;
10733
+ updates2.status = "failed";
10734
+ }
10735
+ await config.triggers.update(triggerId, updates2, context2);
10736
+ if (completeResponse.webhooks && completeResponse.webhooks.length > 0) {
10737
+ const { deliverWebhooks: deliverWebhooks2 } = await Promise.resolve().then(() => (init_webhooks(), exports_webhooks));
10738
+ const { WEBHOOK_DELIVERY_TIMEOUT_MS: WEBHOOK_DELIVERY_TIMEOUT_MS2 } = await Promise.resolve().then(() => exports_types);
10739
+ const steps = body.previousResults || [];
10740
+ const totalDuration = steps.reduce((sum, s) => sum + (s.duration || 0), 0);
10741
+ const payload = {
10742
+ triggerId,
10743
+ success: body.success,
10744
+ steps,
10745
+ totalSteps: steps.length,
10746
+ totalDuration,
10747
+ executedAt: body.executedAt
10748
+ };
10749
+ deliverWebhooks2(completeResponse.webhooks, payload, WEBHOOK_DELIVERY_TIMEOUT_MS2).catch(() => {});
10750
+ }
10751
+ return Response.json(completeResponse);
10752
+ } catch (error) {
10753
+ logger31.error("onComplete callback error:", error);
10754
+ return Response.json({ error: "Internal server error in onComplete callback" }, { status: 500 });
10755
+ }
10756
+ }
10563
10757
  const updates = {
10564
10758
  lastRunAt: body.executedAt,
10565
10759
  runCount: (trigger.runCount || 0) + 1
@@ -10608,7 +10802,7 @@ function createMCPServer(config) {
10608
10802
  })
10609
10803
  });
10610
10804
  } catch (error) {
10611
- logger30.error("[Trigger] Failed to update scheduler:", error);
10805
+ logger31.error("[Trigger] Failed to update scheduler:", error);
10612
10806
  }
10613
10807
  }
10614
10808
  return Response.json(updated);
@@ -10625,14 +10819,14 @@ function createMCPServer(config) {
10625
10819
  body: JSON.stringify({ triggerId })
10626
10820
  });
10627
10821
  } catch (error) {
10628
- logger30.error("[Trigger] Failed to unregister from scheduler:", error);
10822
+ logger31.error("[Trigger] Failed to unregister from scheduler:", error);
10629
10823
  }
10630
10824
  return new Response(null, { status: 204 });
10631
10825
  }
10632
10826
  }
10633
10827
  return Response.json({ error: "Invalid trigger route or method" }, { status: 404 });
10634
10828
  } catch (error) {
10635
- logger30.error("[Trigger] Error:", error);
10829
+ logger31.error("[Trigger] Error:", error);
10636
10830
  return Response.json({ error: error.message || "Failed to process trigger request" }, { status: error.statusCode || 500 });
10637
10831
  }
10638
10832
  }
@@ -10658,11 +10852,11 @@ function createMCPServer(config) {
10658
10852
  const errorRedirectUrl = "/auth-error";
10659
10853
  if (error) {
10660
10854
  const errorMsg = errorDescription || error;
10661
- logger30.error("[OAuth Redirect] Error:", errorMsg);
10855
+ logger31.error("[OAuth Redirect] Error:", errorMsg);
10662
10856
  return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent(errorMsg)}`, webRequest.url));
10663
10857
  }
10664
10858
  if (!code || !state) {
10665
- logger30.error("[OAuth Redirect] Missing code or state parameter");
10859
+ logger31.error("[OAuth Redirect] Missing code or state parameter");
10666
10860
  return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent("Invalid OAuth callback")}`, webRequest.url));
10667
10861
  }
10668
10862
  let returnUrl = defaultRedirectUrl;
@@ -10738,7 +10932,7 @@ function createMCPServer(config) {
10738
10932
  frontendUrl.hash = `oauth_callback=${encodeURIComponent(JSON.stringify({ code, state, tokenData }))}`;
10739
10933
  return Response.redirect(frontendUrl);
10740
10934
  } catch (error2) {
10741
- logger30.error("[OAuth Backend Callback] Error:", error2);
10935
+ logger31.error("[OAuth Backend Callback] Error:", error2);
10742
10936
  return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent(error2.message || "Failed to exchange token")}`, webRequest.url));
10743
10937
  }
10744
10938
  } else {
@@ -10957,7 +11151,7 @@ function toSvelteKitHandler(clientOrHandlerOrOptions, _redirectOptions) {
10957
11151
  }
10958
11152
  };
10959
11153
  }
10960
- var SERVER_LOG_CONTEXT2 = "server", logger30, globalServerConfig = null, codeVerifierStorage, POST = async (req, context) => {
11154
+ var SERVER_LOG_CONTEXT2 = "server", logger31, globalServerConfig = null, codeVerifierStorage, POST = async (req, context) => {
10961
11155
  if (!globalServerConfig) {
10962
11156
  return Response.json({ error: "OAuth not configured. Call createMCPServer() in your server initialization file first." }, { status: 500 });
10963
11157
  }
@@ -11005,7 +11199,7 @@ var init_server = __esm(() => {
11005
11199
  init_anthropic();
11006
11200
  init_google();
11007
11201
  init_ai();
11008
- logger30 = createLogger("MCPServer", SERVER_LOG_CONTEXT2);
11202
+ logger31 = createLogger("MCPServer", SERVER_LOG_CONTEXT2);
11009
11203
  codeVerifierStorage = new Map;
11010
11204
  });
11011
11205
 
@@ -11518,11 +11712,11 @@ class OAuthHandler {
11518
11712
  try {
11519
11713
  await this.config.removeProviderToken(request.provider, undefined, context);
11520
11714
  } catch (error) {
11521
- logger31.error(`Failed to delete token for ${request.provider} from database via removeProviderToken:`, error);
11715
+ logger32.error(`Failed to delete token for ${request.provider} from database via removeProviderToken:`, error);
11522
11716
  }
11523
11717
  }
11524
11718
  } catch (error) {
11525
- logger31.error(`Failed to extract context for disconnect:`, error);
11719
+ logger32.error(`Failed to extract context for disconnect:`, error);
11526
11720
  }
11527
11721
  }
11528
11722
  const url = new URL("/oauth/disconnect", this.serverUrl);
@@ -11582,17 +11776,17 @@ class OAuthHandler {
11582
11776
  return jsonRpcResponse.result;
11583
11777
  }
11584
11778
  }
11585
- var SERVER_LOG_CONTEXT3 = "server", logger31, MCP_SERVER_URL2 = "https://mcp.integrate.dev/api/v1/mcp";
11779
+ var SERVER_LOG_CONTEXT3 = "server", logger32, MCP_SERVER_URL2 = "https://mcp.integrate.dev/api/v1/mcp";
11586
11780
  var init_base_handler = __esm(() => {
11587
11781
  init_logger();
11588
- logger31 = createLogger("OAuthHandler", SERVER_LOG_CONTEXT3);
11782
+ logger32 = createLogger("OAuthHandler", SERVER_LOG_CONTEXT3);
11589
11783
  });
11590
11784
 
11591
11785
  // src/adapters/auto-routes.ts
11592
11786
  init_base_handler();
11593
11787
  init_logger();
11594
11788
  var SERVER_LOG_CONTEXT4 = "server";
11595
- var logger32 = createLogger("AutoRoutes", SERVER_LOG_CONTEXT4);
11789
+ var logger33 = createLogger("AutoRoutes", SERVER_LOG_CONTEXT4);
11596
11790
  var globalOAuthConfig = null;
11597
11791
  async function POST2(req, context) {
11598
11792
  if (!globalOAuthConfig) {
@@ -11634,7 +11828,7 @@ async function POST2(req, context) {
11634
11828
  }
11635
11829
  return createErrorResponse(`Unknown action: ${action}`, 404);
11636
11830
  } catch (error) {
11637
- logger32.error(`[OAuth ${action}] Error:`, error);
11831
+ logger33.error(`[OAuth ${action}] Error:`, error);
11638
11832
  return createErrorResponse(error.message, 500);
11639
11833
  }
11640
11834
  }
@@ -11662,7 +11856,7 @@ async function GET2(req, context) {
11662
11856
  }
11663
11857
  return createErrorResponse(`Unknown action: ${action}`, 404);
11664
11858
  } catch (error) {
11665
- logger32.error(`[OAuth ${action}] Error:`, error);
11859
+ logger33.error(`[OAuth ${action}] Error:`, error);
11666
11860
  return createErrorResponse(error.message, 500);
11667
11861
  }
11668
11862
  }