integrate-sdk 0.8.60-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.
@@ -7924,6 +7924,7 @@ var init_nanoid = __esm(() => {
7924
7924
  // ../triggers/utils.ts
7925
7925
  var exports_utils = {};
7926
7926
  __export(exports_utils, {
7927
+ validateStepLimit: () => validateStepLimit,
7927
7928
  validateStatusTransition: () => validateStatusTransition,
7928
7929
  generateTriggerId: () => generateTriggerId,
7929
7930
  extractProviderFromToolName: () => extractProviderFromToolName,
@@ -7951,6 +7952,15 @@ function validateStatusTransition(currentStatus, targetStatus) {
7951
7952
  }
7952
7953
  return { valid: true };
7953
7954
  }
7955
+ function validateStepLimit(stepIndex, maxSteps) {
7956
+ if (stepIndex >= maxSteps) {
7957
+ return {
7958
+ valid: false,
7959
+ error: `Step index ${stepIndex} exceeds maximum of ${maxSteps} steps`
7960
+ };
7961
+ }
7962
+ return { valid: true };
7963
+ }
7954
7964
  function calculateHasMore(offset, returnedCount, total) {
7955
7965
  return offset + returnedCount < total;
7956
7966
  }
@@ -9958,6 +9968,69 @@ var init_ai = __esm(() => {
9958
9968
  init_trigger_tools();
9959
9969
  });
9960
9970
 
9971
+ // ../triggers/types.ts
9972
+ var exports_types = {};
9973
+ __export(exports_types, {
9974
+ WEBHOOK_DELIVERY_TIMEOUT_MS: () => WEBHOOK_DELIVERY_TIMEOUT_MS,
9975
+ MAX_TRIGGER_STEPS: () => MAX_TRIGGER_STEPS
9976
+ });
9977
+ var MAX_TRIGGER_STEPS = 20, WEBHOOK_DELIVERY_TIMEOUT_MS = 1e4;
9978
+
9979
+ // ../triggers/webhooks.ts
9980
+ var exports_webhooks = {};
9981
+ __export(exports_webhooks, {
9982
+ signPayload: () => signPayload,
9983
+ deliverWebhooks: () => deliverWebhooks,
9984
+ deliverWebhook: () => deliverWebhook
9985
+ });
9986
+ async function signPayload(payload, secret) {
9987
+ const encoder = new TextEncoder;
9988
+ const data = encoder.encode(JSON.stringify(payload));
9989
+ const key = await crypto.subtle.importKey("raw", encoder.encode(secret), { name: "HMAC", hash: "SHA-256" }, false, ["sign"]);
9990
+ const signature = await crypto.subtle.sign("HMAC", key, data);
9991
+ return Array.from(new Uint8Array(signature)).map((b) => b.toString(16).padStart(2, "0")).join("");
9992
+ }
9993
+ async function deliverWebhook(webhook, payload, timeoutMs) {
9994
+ const headers = {
9995
+ "Content-Type": "application/json",
9996
+ ...webhook.headers
9997
+ };
9998
+ if (webhook.secret) {
9999
+ headers["X-Webhook-Signature"] = await signPayload(payload, webhook.secret);
10000
+ }
10001
+ const controller = new AbortController;
10002
+ const timeout = setTimeout(() => controller.abort(), timeoutMs);
10003
+ try {
10004
+ const response = await fetch(webhook.url, {
10005
+ method: "POST",
10006
+ headers,
10007
+ body: JSON.stringify(payload),
10008
+ signal: controller.signal
10009
+ });
10010
+ if (!response.ok) {
10011
+ logger29.warn(`Webhook delivery to ${webhook.url} returned ${response.status}`);
10012
+ }
10013
+ } finally {
10014
+ clearTimeout(timeout);
10015
+ }
10016
+ }
10017
+ async function deliverWebhooks(webhooks, payload, timeoutMs) {
10018
+ if (webhooks.length === 0)
10019
+ return;
10020
+ const results = await Promise.allSettled(webhooks.map((webhook) => deliverWebhook(webhook, payload, timeoutMs)));
10021
+ for (let i = 0;i < results.length; i++) {
10022
+ const result = results[i];
10023
+ if (result.status === "rejected") {
10024
+ logger29.warn(`Webhook delivery to ${webhooks[i].url} failed:`, result.reason);
10025
+ }
10026
+ }
10027
+ }
10028
+ var logger29;
10029
+ var init_webhooks = __esm(() => {
10030
+ init_logger();
10031
+ logger29 = createLogger("Webhooks", "server");
10032
+ });
10033
+
9961
10034
  // ../server.ts
9962
10035
  var exports_server = {};
9963
10036
  __export(exports_server, {
@@ -10051,7 +10124,7 @@ function createMCPServer(config) {
10051
10124
  if (integration.oauth) {
10052
10125
  const { clientId, clientSecret, redirectUri: integrationRedirectUri, config: oauthConfig } = integration.oauth;
10053
10126
  if (!clientId || !clientSecret) {
10054
- logger29.warn(`Warning: Integration "${integration.id}" is missing OAuth credentials. ` + `Provide clientId and clientSecret in the integration configuration.`);
10127
+ logger30.warn(`Warning: Integration "${integration.id}" is missing OAuth credentials. ` + `Provide clientId and clientSecret in the integration configuration.`);
10055
10128
  return integration;
10056
10129
  }
10057
10130
  const redirectUri = integrationRedirectUri || config.redirectUri || getDefaultRedirectUri();
@@ -10182,7 +10255,7 @@ function createMCPServer(config) {
10182
10255
  }
10183
10256
  return response2;
10184
10257
  } catch (error) {
10185
- logger29.error("[MCP Tool Call] Error:", error);
10258
+ logger30.error("[MCP Tool Call] Error:", error);
10186
10259
  return Response.json({ error: error.message || "Failed to execute tool call" }, { status: error.statusCode || 500 });
10187
10260
  }
10188
10261
  }
@@ -10258,7 +10331,7 @@ function createMCPServer(config) {
10258
10331
  })
10259
10332
  });
10260
10333
  } catch (scheduleError) {
10261
- logger29.error("[Trigger] Failed to register with scheduler:", scheduleError);
10334
+ logger30.error("[Trigger] Failed to register with scheduler:", scheduleError);
10262
10335
  }
10263
10336
  return Response.json(created, { status: 201 });
10264
10337
  }
@@ -10293,7 +10366,7 @@ function createMCPServer(config) {
10293
10366
  body: JSON.stringify({ triggerId })
10294
10367
  });
10295
10368
  } catch (error) {
10296
- logger29.error("[Trigger] Failed to pause in scheduler:", error);
10369
+ logger30.error("[Trigger] Failed to pause in scheduler:", error);
10297
10370
  }
10298
10371
  return Response.json(updated);
10299
10372
  } else if (subAction === "resume" && method === "POST") {
@@ -10321,7 +10394,7 @@ function createMCPServer(config) {
10321
10394
  body: JSON.stringify({ triggerId })
10322
10395
  });
10323
10396
  } catch (error) {
10324
- logger29.error("[Trigger] Failed to resume in scheduler:", error);
10397
+ logger30.error("[Trigger] Failed to resume in scheduler:", error);
10325
10398
  }
10326
10399
  return Response.json(updated);
10327
10400
  } else if (subAction === "run" && method === "POST") {
@@ -10414,6 +10487,60 @@ function createMCPServer(config) {
10414
10487
  if (!trigger) {
10415
10488
  return Response.json({ error: "Trigger not found" }, { status: 404 });
10416
10489
  }
10490
+ if (body.stepIndex != null) {
10491
+ const { validateStepLimit: validateStepLimit2 } = await Promise.resolve().then(() => (init_utils2(), exports_utils));
10492
+ const { MAX_TRIGGER_STEPS: MAX_TRIGGER_STEPS2 } = await Promise.resolve().then(() => exports_types);
10493
+ const stepValidation = validateStepLimit2(body.stepIndex, MAX_TRIGGER_STEPS2);
10494
+ if (!stepValidation.valid) {
10495
+ return Response.json({ error: stepValidation.error }, { status: 400 });
10496
+ }
10497
+ }
10498
+ if (config.triggers.onComplete) {
10499
+ try {
10500
+ const completeResponse = await config.triggers.onComplete({
10501
+ trigger,
10502
+ request: body,
10503
+ context: context2
10504
+ });
10505
+ if (completeResponse.hasMore) {
10506
+ return Response.json(completeResponse);
10507
+ }
10508
+ const updates2 = {
10509
+ lastRunAt: body.executedAt,
10510
+ runCount: (trigger.runCount || 0) + 1
10511
+ };
10512
+ if (body.success) {
10513
+ updates2.lastResult = body.result;
10514
+ updates2.lastError = undefined;
10515
+ if (trigger.schedule.type === "once") {
10516
+ updates2.status = "completed";
10517
+ }
10518
+ } else {
10519
+ updates2.lastError = body.error;
10520
+ updates2.status = "failed";
10521
+ }
10522
+ await config.triggers.update(triggerId, updates2, context2);
10523
+ if (completeResponse.webhooks && completeResponse.webhooks.length > 0) {
10524
+ const { deliverWebhooks: deliverWebhooks2 } = await Promise.resolve().then(() => (init_webhooks(), exports_webhooks));
10525
+ const { WEBHOOK_DELIVERY_TIMEOUT_MS: WEBHOOK_DELIVERY_TIMEOUT_MS2 } = await Promise.resolve().then(() => exports_types);
10526
+ const steps = body.previousResults || [];
10527
+ const totalDuration = steps.reduce((sum, s) => sum + (s.duration || 0), 0);
10528
+ const payload = {
10529
+ triggerId,
10530
+ success: body.success,
10531
+ steps,
10532
+ totalSteps: steps.length,
10533
+ totalDuration,
10534
+ executedAt: body.executedAt
10535
+ };
10536
+ deliverWebhooks2(completeResponse.webhooks, payload, WEBHOOK_DELIVERY_TIMEOUT_MS2).catch(() => {});
10537
+ }
10538
+ return Response.json(completeResponse);
10539
+ } catch (error) {
10540
+ logger30.error("onComplete callback error:", error);
10541
+ return Response.json({ error: "Internal server error in onComplete callback" }, { status: 500 });
10542
+ }
10543
+ }
10417
10544
  const updates = {
10418
10545
  lastRunAt: body.executedAt,
10419
10546
  runCount: (trigger.runCount || 0) + 1
@@ -10462,7 +10589,7 @@ function createMCPServer(config) {
10462
10589
  })
10463
10590
  });
10464
10591
  } catch (error) {
10465
- logger29.error("[Trigger] Failed to update scheduler:", error);
10592
+ logger30.error("[Trigger] Failed to update scheduler:", error);
10466
10593
  }
10467
10594
  }
10468
10595
  return Response.json(updated);
@@ -10479,14 +10606,14 @@ function createMCPServer(config) {
10479
10606
  body: JSON.stringify({ triggerId })
10480
10607
  });
10481
10608
  } catch (error) {
10482
- logger29.error("[Trigger] Failed to unregister from scheduler:", error);
10609
+ logger30.error("[Trigger] Failed to unregister from scheduler:", error);
10483
10610
  }
10484
10611
  return new Response(null, { status: 204 });
10485
10612
  }
10486
10613
  }
10487
10614
  return Response.json({ error: "Invalid trigger route or method" }, { status: 404 });
10488
10615
  } catch (error) {
10489
- logger29.error("[Trigger] Error:", error);
10616
+ logger30.error("[Trigger] Error:", error);
10490
10617
  return Response.json({ error: error.message || "Failed to process trigger request" }, { status: error.statusCode || 500 });
10491
10618
  }
10492
10619
  }
@@ -10512,11 +10639,11 @@ function createMCPServer(config) {
10512
10639
  const errorRedirectUrl = "/auth-error";
10513
10640
  if (error) {
10514
10641
  const errorMsg = errorDescription || error;
10515
- logger29.error("[OAuth Redirect] Error:", errorMsg);
10642
+ logger30.error("[OAuth Redirect] Error:", errorMsg);
10516
10643
  return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent(errorMsg)}`, webRequest.url));
10517
10644
  }
10518
10645
  if (!code || !state) {
10519
- logger29.error("[OAuth Redirect] Missing code or state parameter");
10646
+ logger30.error("[OAuth Redirect] Missing code or state parameter");
10520
10647
  return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent("Invalid OAuth callback")}`, webRequest.url));
10521
10648
  }
10522
10649
  let returnUrl = defaultRedirectUrl;
@@ -10592,7 +10719,7 @@ function createMCPServer(config) {
10592
10719
  frontendUrl.hash = `oauth_callback=${encodeURIComponent(JSON.stringify({ code, state, tokenData }))}`;
10593
10720
  return Response.redirect(frontendUrl);
10594
10721
  } catch (error2) {
10595
- logger29.error("[OAuth Backend Callback] Error:", error2);
10722
+ logger30.error("[OAuth Backend Callback] Error:", error2);
10596
10723
  return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent(error2.message || "Failed to exchange token")}`, webRequest.url));
10597
10724
  }
10598
10725
  } else {
@@ -10811,7 +10938,7 @@ function toSvelteKitHandler(clientOrHandlerOrOptions, _redirectOptions) {
10811
10938
  }
10812
10939
  };
10813
10940
  }
10814
- var SERVER_LOG_CONTEXT = "server", logger29, globalServerConfig = null, codeVerifierStorage, POST = async (req, context) => {
10941
+ var SERVER_LOG_CONTEXT = "server", logger30, globalServerConfig = null, codeVerifierStorage, POST = async (req, context) => {
10815
10942
  if (!globalServerConfig) {
10816
10943
  return Response.json({ error: "OAuth not configured. Call createMCPServer() in your server initialization file first." }, { status: 500 });
10817
10944
  }
@@ -10859,7 +10986,7 @@ var init_server = __esm(() => {
10859
10986
  init_anthropic();
10860
10987
  init_google();
10861
10988
  init_ai();
10862
- logger29 = createLogger("MCPServer", SERVER_LOG_CONTEXT);
10989
+ logger30 = createLogger("MCPServer", SERVER_LOG_CONTEXT);
10863
10990
  codeVerifierStorage = new Map;
10864
10991
  });
10865
10992
 
@@ -11372,11 +11499,11 @@ class OAuthHandler {
11372
11499
  try {
11373
11500
  await this.config.removeProviderToken(request.provider, undefined, context);
11374
11501
  } catch (error) {
11375
- logger30.error(`Failed to delete token for ${request.provider} from database via removeProviderToken:`, error);
11502
+ logger31.error(`Failed to delete token for ${request.provider} from database via removeProviderToken:`, error);
11376
11503
  }
11377
11504
  }
11378
11505
  } catch (error) {
11379
- logger30.error(`Failed to extract context for disconnect:`, error);
11506
+ logger31.error(`Failed to extract context for disconnect:`, error);
11380
11507
  }
11381
11508
  }
11382
11509
  const url = new URL("/oauth/disconnect", this.serverUrl);
@@ -11436,10 +11563,10 @@ class OAuthHandler {
11436
11563
  return jsonRpcResponse.result;
11437
11564
  }
11438
11565
  }
11439
- var SERVER_LOG_CONTEXT2 = "server", logger30, MCP_SERVER_URL2 = "https://mcp.integrate.dev/api/v1/mcp";
11566
+ var SERVER_LOG_CONTEXT2 = "server", logger31, MCP_SERVER_URL2 = "https://mcp.integrate.dev/api/v1/mcp";
11440
11567
  var init_base_handler = __esm(() => {
11441
11568
  init_logger();
11442
- logger30 = createLogger("OAuthHandler", SERVER_LOG_CONTEXT2);
11569
+ logger31 = createLogger("OAuthHandler", SERVER_LOG_CONTEXT2);
11443
11570
  });
11444
11571
 
11445
11572
  // nextjs.ts
@@ -11458,7 +11585,7 @@ function createNextOAuthHandler(config) {
11458
11585
  }
11459
11586
  return response;
11460
11587
  } catch (error) {
11461
- logger31.error("[OAuth Authorize] Error:", error);
11588
+ logger32.error("[OAuth Authorize] Error:", error);
11462
11589
  return Response.json({ error: error.message || "Failed to get authorization URL" }, { status: 500 });
11463
11590
  }
11464
11591
  },
@@ -11474,7 +11601,7 @@ function createNextOAuthHandler(config) {
11474
11601
  }
11475
11602
  return response;
11476
11603
  } catch (error) {
11477
- logger31.error("[OAuth Callback] Error:", error);
11604
+ logger32.error("[OAuth Callback] Error:", error);
11478
11605
  return Response.json({ error: error.message || "Failed to exchange authorization code" }, { status: 500 });
11479
11606
  }
11480
11607
  },
@@ -11496,7 +11623,7 @@ function createNextOAuthHandler(config) {
11496
11623
  }
11497
11624
  return response;
11498
11625
  } catch (error) {
11499
- logger31.error("[OAuth Status] Error:", error);
11626
+ logger32.error("[OAuth Status] Error:", error);
11500
11627
  return Response.json({ error: error.message || "Failed to check authorization status" }, { status: 500 });
11501
11628
  }
11502
11629
  },
@@ -11519,7 +11646,7 @@ function createNextOAuthHandler(config) {
11519
11646
  }
11520
11647
  return response;
11521
11648
  } catch (error) {
11522
- logger31.error("[OAuth Disconnect] Error:", error);
11649
+ logger32.error("[OAuth Disconnect] Error:", error);
11523
11650
  return Response.json({ error: error.message || "Failed to disconnect provider" }, { status: 500 });
11524
11651
  }
11525
11652
  },
@@ -11560,7 +11687,7 @@ function createNextOAuthHandler(config) {
11560
11687
  const result = await handler.handleToolCall(body, authHeader, integrationsHeader);
11561
11688
  return Response.json(result);
11562
11689
  } catch (error) {
11563
- logger31.error("[MCP Tool Call] Error:", error);
11690
+ logger32.error("[MCP Tool Call] Error:", error);
11564
11691
  return Response.json({ error: error.message || "Failed to execute tool call" }, { status: error.statusCode || 500 });
11565
11692
  }
11566
11693
  },
@@ -11605,11 +11732,11 @@ function createNextOAuthHandler(config) {
11605
11732
  const errorDescription = searchParams.get("error_description");
11606
11733
  if (error) {
11607
11734
  const errorMsg = errorDescription || error;
11608
- logger31.error("[OAuth Redirect] Error:", errorMsg);
11735
+ logger32.error("[OAuth Redirect] Error:", errorMsg);
11609
11736
  return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent(errorMsg)}`, req.url));
11610
11737
  }
11611
11738
  if (!code || !state) {
11612
- logger31.error("[OAuth Redirect] Missing code or state parameter");
11739
+ logger32.error("[OAuth Redirect] Missing code or state parameter");
11613
11740
  return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent("Invalid OAuth callback")}`, req.url));
11614
11741
  }
11615
11742
  let returnUrl = defaultRedirectUrl;
@@ -11648,11 +11775,11 @@ function createNextOAuthHandler(config) {
11648
11775
  };
11649
11776
  return handlers;
11650
11777
  }
11651
- var SERVER_LOG_CONTEXT3 = "server", logger31;
11778
+ var SERVER_LOG_CONTEXT3 = "server", logger32;
11652
11779
  var init_nextjs = __esm(() => {
11653
11780
  init_base_handler();
11654
11781
  init_logger();
11655
- logger31 = createLogger("NextJSOAuth", SERVER_LOG_CONTEXT3);
11782
+ logger32 = createLogger("NextJSOAuth", SERVER_LOG_CONTEXT3);
11656
11783
  });
11657
11784
  init_nextjs();
11658
11785