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.
package/dist/index.js CHANGED
@@ -8303,6 +8303,7 @@ var init_index_browser = () => {};
8303
8303
  // src/triggers/utils.ts
8304
8304
  var exports_utils = {};
8305
8305
  __export(exports_utils, {
8306
+ validateStepLimit: () => validateStepLimit,
8306
8307
  validateStatusTransition: () => validateStatusTransition,
8307
8308
  generateTriggerId: () => generateTriggerId,
8308
8309
  extractProviderFromToolName: () => extractProviderFromToolName,
@@ -8330,6 +8331,15 @@ function validateStatusTransition(currentStatus, targetStatus) {
8330
8331
  }
8331
8332
  return { valid: true };
8332
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
+ }
8333
8343
  function calculateHasMore(offset, returnedCount, total) {
8334
8344
  return offset + returnedCount < total;
8335
8345
  }
@@ -10337,6 +10347,69 @@ var init_ai = __esm(() => {
10337
10347
  init_trigger_tools();
10338
10348
  });
10339
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
+
10340
10413
  // src/server.ts
10341
10414
  var exports_server = {};
10342
10415
  __export(exports_server, {
@@ -10430,7 +10503,7 @@ function createMCPServer(config) {
10430
10503
  if (integration.oauth) {
10431
10504
  const { clientId, clientSecret, redirectUri: integrationRedirectUri, config: oauthConfig } = integration.oauth;
10432
10505
  if (!clientId || !clientSecret) {
10433
- 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.`);
10434
10507
  return integration;
10435
10508
  }
10436
10509
  const redirectUri = integrationRedirectUri || config.redirectUri || getDefaultRedirectUri();
@@ -10561,7 +10634,7 @@ function createMCPServer(config) {
10561
10634
  }
10562
10635
  return response2;
10563
10636
  } catch (error) {
10564
- logger30.error("[MCP Tool Call] Error:", error);
10637
+ logger31.error("[MCP Tool Call] Error:", error);
10565
10638
  return Response.json({ error: error.message || "Failed to execute tool call" }, { status: error.statusCode || 500 });
10566
10639
  }
10567
10640
  }
@@ -10637,7 +10710,7 @@ function createMCPServer(config) {
10637
10710
  })
10638
10711
  });
10639
10712
  } catch (scheduleError) {
10640
- logger30.error("[Trigger] Failed to register with scheduler:", scheduleError);
10713
+ logger31.error("[Trigger] Failed to register with scheduler:", scheduleError);
10641
10714
  }
10642
10715
  return Response.json(created, { status: 201 });
10643
10716
  }
@@ -10672,7 +10745,7 @@ function createMCPServer(config) {
10672
10745
  body: JSON.stringify({ triggerId })
10673
10746
  });
10674
10747
  } catch (error) {
10675
- logger30.error("[Trigger] Failed to pause in scheduler:", error);
10748
+ logger31.error("[Trigger] Failed to pause in scheduler:", error);
10676
10749
  }
10677
10750
  return Response.json(updated);
10678
10751
  } else if (subAction === "resume" && method === "POST") {
@@ -10700,7 +10773,7 @@ function createMCPServer(config) {
10700
10773
  body: JSON.stringify({ triggerId })
10701
10774
  });
10702
10775
  } catch (error) {
10703
- logger30.error("[Trigger] Failed to resume in scheduler:", error);
10776
+ logger31.error("[Trigger] Failed to resume in scheduler:", error);
10704
10777
  }
10705
10778
  return Response.json(updated);
10706
10779
  } else if (subAction === "run" && method === "POST") {
@@ -10793,6 +10866,60 @@ function createMCPServer(config) {
10793
10866
  if (!trigger) {
10794
10867
  return Response.json({ error: "Trigger not found" }, { status: 404 });
10795
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
+ }
10796
10923
  const updates = {
10797
10924
  lastRunAt: body.executedAt,
10798
10925
  runCount: (trigger.runCount || 0) + 1
@@ -10841,7 +10968,7 @@ function createMCPServer(config) {
10841
10968
  })
10842
10969
  });
10843
10970
  } catch (error) {
10844
- logger30.error("[Trigger] Failed to update scheduler:", error);
10971
+ logger31.error("[Trigger] Failed to update scheduler:", error);
10845
10972
  }
10846
10973
  }
10847
10974
  return Response.json(updated);
@@ -10858,14 +10985,14 @@ function createMCPServer(config) {
10858
10985
  body: JSON.stringify({ triggerId })
10859
10986
  });
10860
10987
  } catch (error) {
10861
- logger30.error("[Trigger] Failed to unregister from scheduler:", error);
10988
+ logger31.error("[Trigger] Failed to unregister from scheduler:", error);
10862
10989
  }
10863
10990
  return new Response(null, { status: 204 });
10864
10991
  }
10865
10992
  }
10866
10993
  return Response.json({ error: "Invalid trigger route or method" }, { status: 404 });
10867
10994
  } catch (error) {
10868
- logger30.error("[Trigger] Error:", error);
10995
+ logger31.error("[Trigger] Error:", error);
10869
10996
  return Response.json({ error: error.message || "Failed to process trigger request" }, { status: error.statusCode || 500 });
10870
10997
  }
10871
10998
  }
@@ -10891,11 +11018,11 @@ function createMCPServer(config) {
10891
11018
  const errorRedirectUrl = "/auth-error";
10892
11019
  if (error) {
10893
11020
  const errorMsg = errorDescription || error;
10894
- logger30.error("[OAuth Redirect] Error:", errorMsg);
11021
+ logger31.error("[OAuth Redirect] Error:", errorMsg);
10895
11022
  return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent(errorMsg)}`, webRequest.url));
10896
11023
  }
10897
11024
  if (!code || !state) {
10898
- logger30.error("[OAuth Redirect] Missing code or state parameter");
11025
+ logger31.error("[OAuth Redirect] Missing code or state parameter");
10899
11026
  return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent("Invalid OAuth callback")}`, webRequest.url));
10900
11027
  }
10901
11028
  let returnUrl = defaultRedirectUrl;
@@ -10971,7 +11098,7 @@ function createMCPServer(config) {
10971
11098
  frontendUrl.hash = `oauth_callback=${encodeURIComponent(JSON.stringify({ code, state, tokenData }))}`;
10972
11099
  return Response.redirect(frontendUrl);
10973
11100
  } catch (error2) {
10974
- logger30.error("[OAuth Backend Callback] Error:", error2);
11101
+ logger31.error("[OAuth Backend Callback] Error:", error2);
10975
11102
  return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent(error2.message || "Failed to exchange token")}`, webRequest.url));
10976
11103
  }
10977
11104
  } else {
@@ -11190,7 +11317,7 @@ function toSvelteKitHandler(clientOrHandlerOrOptions, _redirectOptions) {
11190
11317
  }
11191
11318
  };
11192
11319
  }
11193
- 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) => {
11194
11321
  if (!globalServerConfig) {
11195
11322
  return Response.json({ error: "OAuth not configured. Call createMCPServer() in your server initialization file first." }, { status: 500 });
11196
11323
  }
@@ -11238,7 +11365,7 @@ var init_server = __esm(() => {
11238
11365
  init_anthropic();
11239
11366
  init_google();
11240
11367
  init_ai();
11241
- logger30 = createLogger("MCPServer", SERVER_LOG_CONTEXT2);
11368
+ logger31 = createLogger("MCPServer", SERVER_LOG_CONTEXT2);
11242
11369
  codeVerifierStorage = new Map;
11243
11370
  });
11244
11371
 
@@ -11751,11 +11878,11 @@ class OAuthHandler {
11751
11878
  try {
11752
11879
  await this.config.removeProviderToken(request.provider, undefined, context);
11753
11880
  } catch (error) {
11754
- 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);
11755
11882
  }
11756
11883
  }
11757
11884
  } catch (error) {
11758
- logger31.error(`Failed to extract context for disconnect:`, error);
11885
+ logger32.error(`Failed to extract context for disconnect:`, error);
11759
11886
  }
11760
11887
  }
11761
11888
  const url = new URL("/oauth/disconnect", this.serverUrl);
@@ -11815,10 +11942,10 @@ class OAuthHandler {
11815
11942
  return jsonRpcResponse.result;
11816
11943
  }
11817
11944
  }
11818
- 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";
11819
11946
  var init_base_handler = __esm(() => {
11820
11947
  init_logger();
11821
- logger31 = createLogger("OAuthHandler", SERVER_LOG_CONTEXT3);
11948
+ logger32 = createLogger("OAuthHandler", SERVER_LOG_CONTEXT3);
11822
11949
  });
11823
11950
 
11824
11951
  // src/index.ts
@@ -11831,7 +11958,7 @@ init_nextjs();
11831
11958
  // src/adapters/nextjs-oauth-redirect.ts
11832
11959
  init_logger();
11833
11960
  var SERVER_LOG_CONTEXT4 = "server";
11834
- var logger32 = createLogger("OAuthRedirect", SERVER_LOG_CONTEXT4);
11961
+ var logger33 = createLogger("OAuthRedirect", SERVER_LOG_CONTEXT4);
11835
11962
  function createOAuthRedirectHandler(config) {
11836
11963
  const defaultRedirectUrl = config?.redirectUrl || "/";
11837
11964
  const errorRedirectUrl = config?.errorRedirectUrl || "/auth-error";
@@ -11843,11 +11970,11 @@ function createOAuthRedirectHandler(config) {
11843
11970
  const errorDescription = searchParams.get("error_description");
11844
11971
  if (error) {
11845
11972
  const errorMsg = errorDescription || error;
11846
- logger32.error("[OAuth Redirect] Error:", errorMsg);
11973
+ logger33.error("[OAuth Redirect] Error:", errorMsg);
11847
11974
  return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent(errorMsg)}`, req.url));
11848
11975
  }
11849
11976
  if (!code || !state) {
11850
- logger32.error("[OAuth Redirect] Missing code or state parameter");
11977
+ logger33.error("[OAuth Redirect] Missing code or state parameter");
11851
11978
  return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent("Invalid OAuth callback")}`, req.url));
11852
11979
  }
11853
11980
  let returnUrl = defaultRedirectUrl;
@@ -11927,6 +12054,8 @@ init_intercom();
11927
12054
  init_hubspot();
11928
12055
  init_youtube();
11929
12056
  init_cursor();
12057
+ init_utils2();
12058
+ init_webhooks();
11930
12059
  init_generic();
11931
12060
  init_messages();
11932
12061
  init_http_session();
@@ -11989,6 +12118,7 @@ export {
11989
12118
  youtubeIntegration,
11990
12119
  whatsappIntegration,
11991
12120
  vercelIntegration,
12121
+ validateStepLimit,
11992
12122
  todoistIntegration,
11993
12123
  toWebRequest,
11994
12124
  toTanStackStartHandler,
@@ -12022,6 +12152,7 @@ export {
12022
12152
  gcalIntegration,
12023
12153
  fromNodeHeaders,
12024
12154
  figmaIntegration,
12155
+ deliverWebhooks,
12025
12156
  cursorIntegration,
12026
12157
  createTanStackOAuthHandler,
12027
12158
  createSimpleIntegration,
@@ -12032,6 +12163,7 @@ export {
12032
12163
  clearClientCache,
12033
12164
  calcomIntegration,
12034
12165
  airtableIntegration,
12166
+ WEBHOOK_DELIVERY_TIMEOUT_MS,
12035
12167
  TriggerClient,
12036
12168
  ToolCallError,
12037
12169
  TokenExpiredError,
@@ -12040,6 +12172,7 @@ export {
12040
12172
  OAuthHandler,
12041
12173
  MCPMethod,
12042
12174
  MCPClientBase,
12175
+ MAX_TRIGGER_STEPS,
12043
12176
  IntegrateSDKError,
12044
12177
  HttpSessionTransport,
12045
12178
  ConnectionError,
package/dist/oauth.js CHANGED
@@ -8137,6 +8137,7 @@ var init_nanoid = __esm(() => {
8137
8137
  // src/triggers/utils.ts
8138
8138
  var exports_utils = {};
8139
8139
  __export(exports_utils, {
8140
+ validateStepLimit: () => validateStepLimit,
8140
8141
  validateStatusTransition: () => validateStatusTransition,
8141
8142
  generateTriggerId: () => generateTriggerId,
8142
8143
  extractProviderFromToolName: () => extractProviderFromToolName,
@@ -8164,6 +8165,15 @@ function validateStatusTransition(currentStatus, targetStatus) {
8164
8165
  }
8165
8166
  return { valid: true };
8166
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
+ }
8167
8177
  function calculateHasMore(offset, returnedCount, total) {
8168
8178
  return offset + returnedCount < total;
8169
8179
  }
@@ -10171,6 +10181,69 @@ var init_ai = __esm(() => {
10171
10181
  init_trigger_tools();
10172
10182
  });
10173
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
+
10174
10247
  // src/server.ts
10175
10248
  var exports_server = {};
10176
10249
  __export(exports_server, {
@@ -10264,7 +10337,7 @@ function createMCPServer(config) {
10264
10337
  if (integration.oauth) {
10265
10338
  const { clientId, clientSecret, redirectUri: integrationRedirectUri, config: oauthConfig } = integration.oauth;
10266
10339
  if (!clientId || !clientSecret) {
10267
- 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.`);
10268
10341
  return integration;
10269
10342
  }
10270
10343
  const redirectUri = integrationRedirectUri || config.redirectUri || getDefaultRedirectUri();
@@ -10395,7 +10468,7 @@ function createMCPServer(config) {
10395
10468
  }
10396
10469
  return response2;
10397
10470
  } catch (error) {
10398
- logger30.error("[MCP Tool Call] Error:", error);
10471
+ logger31.error("[MCP Tool Call] Error:", error);
10399
10472
  return Response.json({ error: error.message || "Failed to execute tool call" }, { status: error.statusCode || 500 });
10400
10473
  }
10401
10474
  }
@@ -10471,7 +10544,7 @@ function createMCPServer(config) {
10471
10544
  })
10472
10545
  });
10473
10546
  } catch (scheduleError) {
10474
- logger30.error("[Trigger] Failed to register with scheduler:", scheduleError);
10547
+ logger31.error("[Trigger] Failed to register with scheduler:", scheduleError);
10475
10548
  }
10476
10549
  return Response.json(created, { status: 201 });
10477
10550
  }
@@ -10506,7 +10579,7 @@ function createMCPServer(config) {
10506
10579
  body: JSON.stringify({ triggerId })
10507
10580
  });
10508
10581
  } catch (error) {
10509
- logger30.error("[Trigger] Failed to pause in scheduler:", error);
10582
+ logger31.error("[Trigger] Failed to pause in scheduler:", error);
10510
10583
  }
10511
10584
  return Response.json(updated);
10512
10585
  } else if (subAction === "resume" && method === "POST") {
@@ -10534,7 +10607,7 @@ function createMCPServer(config) {
10534
10607
  body: JSON.stringify({ triggerId })
10535
10608
  });
10536
10609
  } catch (error) {
10537
- logger30.error("[Trigger] Failed to resume in scheduler:", error);
10610
+ logger31.error("[Trigger] Failed to resume in scheduler:", error);
10538
10611
  }
10539
10612
  return Response.json(updated);
10540
10613
  } else if (subAction === "run" && method === "POST") {
@@ -10627,6 +10700,60 @@ function createMCPServer(config) {
10627
10700
  if (!trigger) {
10628
10701
  return Response.json({ error: "Trigger not found" }, { status: 404 });
10629
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
+ }
10630
10757
  const updates = {
10631
10758
  lastRunAt: body.executedAt,
10632
10759
  runCount: (trigger.runCount || 0) + 1
@@ -10675,7 +10802,7 @@ function createMCPServer(config) {
10675
10802
  })
10676
10803
  });
10677
10804
  } catch (error) {
10678
- logger30.error("[Trigger] Failed to update scheduler:", error);
10805
+ logger31.error("[Trigger] Failed to update scheduler:", error);
10679
10806
  }
10680
10807
  }
10681
10808
  return Response.json(updated);
@@ -10692,14 +10819,14 @@ function createMCPServer(config) {
10692
10819
  body: JSON.stringify({ triggerId })
10693
10820
  });
10694
10821
  } catch (error) {
10695
- logger30.error("[Trigger] Failed to unregister from scheduler:", error);
10822
+ logger31.error("[Trigger] Failed to unregister from scheduler:", error);
10696
10823
  }
10697
10824
  return new Response(null, { status: 204 });
10698
10825
  }
10699
10826
  }
10700
10827
  return Response.json({ error: "Invalid trigger route or method" }, { status: 404 });
10701
10828
  } catch (error) {
10702
- logger30.error("[Trigger] Error:", error);
10829
+ logger31.error("[Trigger] Error:", error);
10703
10830
  return Response.json({ error: error.message || "Failed to process trigger request" }, { status: error.statusCode || 500 });
10704
10831
  }
10705
10832
  }
@@ -10725,11 +10852,11 @@ function createMCPServer(config) {
10725
10852
  const errorRedirectUrl = "/auth-error";
10726
10853
  if (error) {
10727
10854
  const errorMsg = errorDescription || error;
10728
- logger30.error("[OAuth Redirect] Error:", errorMsg);
10855
+ logger31.error("[OAuth Redirect] Error:", errorMsg);
10729
10856
  return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent(errorMsg)}`, webRequest.url));
10730
10857
  }
10731
10858
  if (!code || !state) {
10732
- logger30.error("[OAuth Redirect] Missing code or state parameter");
10859
+ logger31.error("[OAuth Redirect] Missing code or state parameter");
10733
10860
  return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent("Invalid OAuth callback")}`, webRequest.url));
10734
10861
  }
10735
10862
  let returnUrl = defaultRedirectUrl;
@@ -10805,7 +10932,7 @@ function createMCPServer(config) {
10805
10932
  frontendUrl.hash = `oauth_callback=${encodeURIComponent(JSON.stringify({ code, state, tokenData }))}`;
10806
10933
  return Response.redirect(frontendUrl);
10807
10934
  } catch (error2) {
10808
- logger30.error("[OAuth Backend Callback] Error:", error2);
10935
+ logger31.error("[OAuth Backend Callback] Error:", error2);
10809
10936
  return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent(error2.message || "Failed to exchange token")}`, webRequest.url));
10810
10937
  }
10811
10938
  } else {
@@ -11024,7 +11151,7 @@ function toSvelteKitHandler(clientOrHandlerOrOptions, _redirectOptions) {
11024
11151
  }
11025
11152
  };
11026
11153
  }
11027
- 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) => {
11028
11155
  if (!globalServerConfig) {
11029
11156
  return Response.json({ error: "OAuth not configured. Call createMCPServer() in your server initialization file first." }, { status: 500 });
11030
11157
  }
@@ -11072,7 +11199,7 @@ var init_server = __esm(() => {
11072
11199
  init_anthropic();
11073
11200
  init_google();
11074
11201
  init_ai();
11075
- logger30 = createLogger("MCPServer", SERVER_LOG_CONTEXT2);
11202
+ logger31 = createLogger("MCPServer", SERVER_LOG_CONTEXT2);
11076
11203
  codeVerifierStorage = new Map;
11077
11204
  });
11078
11205
 
@@ -11585,11 +11712,11 @@ class OAuthHandler {
11585
11712
  try {
11586
11713
  await this.config.removeProviderToken(request.provider, undefined, context);
11587
11714
  } catch (error) {
11588
- 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);
11589
11716
  }
11590
11717
  }
11591
11718
  } catch (error) {
11592
- logger31.error(`Failed to extract context for disconnect:`, error);
11719
+ logger32.error(`Failed to extract context for disconnect:`, error);
11593
11720
  }
11594
11721
  }
11595
11722
  const url = new URL("/oauth/disconnect", this.serverUrl);
@@ -11649,17 +11776,17 @@ class OAuthHandler {
11649
11776
  return jsonRpcResponse.result;
11650
11777
  }
11651
11778
  }
11652
- 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";
11653
11780
  var init_base_handler = __esm(() => {
11654
11781
  init_logger();
11655
- logger31 = createLogger("OAuthHandler", SERVER_LOG_CONTEXT3);
11782
+ logger32 = createLogger("OAuthHandler", SERVER_LOG_CONTEXT3);
11656
11783
  });
11657
11784
 
11658
11785
  // src/adapters/auto-routes.ts
11659
11786
  init_base_handler();
11660
11787
  init_logger();
11661
11788
  var SERVER_LOG_CONTEXT4 = "server";
11662
- var logger32 = createLogger("AutoRoutes", SERVER_LOG_CONTEXT4);
11789
+ var logger33 = createLogger("AutoRoutes", SERVER_LOG_CONTEXT4);
11663
11790
  var globalOAuthConfig = null;
11664
11791
  async function POST2(req, context) {
11665
11792
  if (!globalOAuthConfig) {
@@ -11701,7 +11828,7 @@ async function POST2(req, context) {
11701
11828
  }
11702
11829
  return createErrorResponse(`Unknown action: ${action}`, 404);
11703
11830
  } catch (error) {
11704
- logger32.error(`[OAuth ${action}] Error:`, error);
11831
+ logger33.error(`[OAuth ${action}] Error:`, error);
11705
11832
  return createErrorResponse(error.message, 500);
11706
11833
  }
11707
11834
  }
@@ -11729,7 +11856,7 @@ async function GET2(req, context) {
11729
11856
  }
11730
11857
  return createErrorResponse(`Unknown action: ${action}`, 404);
11731
11858
  } catch (error) {
11732
- logger32.error(`[OAuth ${action}] Error:`, error);
11859
+ logger33.error(`[OAuth ${action}] Error:`, error);
11733
11860
  return createErrorResponse(error.message, 500);
11734
11861
  }
11735
11862
  }