integrate-sdk 0.8.61-dev.0 → 0.8.64-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.
@@ -1703,6 +1703,7 @@ class MCPClientBase {
1703
1703
  apiRouteBase;
1704
1704
  apiBaseUrl;
1705
1705
  databaseDetected = false;
1706
+ _connectingPromise = null;
1706
1707
  __configuredIntegrations;
1707
1708
  __useServerConfig;
1708
1709
  oauthCallbackPromise;
@@ -2016,6 +2017,17 @@ class MCPClientBase {
2016
2017
  throw parsedError;
2017
2018
  }
2018
2019
  }
2020
+ async ensureConnected() {
2021
+ if (this.isConnected()) {
2022
+ return;
2023
+ }
2024
+ if (!this._connectingPromise) {
2025
+ this._connectingPromise = this.connect().finally(() => {
2026
+ this._connectingPromise = null;
2027
+ });
2028
+ }
2029
+ return this._connectingPromise;
2030
+ }
2019
2031
  async initializeIntegrations() {
2020
2032
  for (const integration of this.integrations) {
2021
2033
  if (integration.onInit) {
@@ -2074,6 +2086,7 @@ class MCPClientBase {
2074
2086
  const transportHeaders = this.transport.headers || {};
2075
2087
  const hasApiKey = !!transportHeaders["X-API-KEY"];
2076
2088
  if (hasApiKey) {
2089
+ await this.ensureConnected();
2077
2090
  if (provider) {
2078
2091
  const tokenData = await this.oauthManager.getProviderToken(provider, undefined, options?.context);
2079
2092
  if (tokenData && this.transport.setHeader) {
@@ -9968,21 +9981,7 @@ var init_ai = __esm(() => {
9968
9981
  init_trigger_tools();
9969
9982
  });
9970
9983
 
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
9984
  // ../triggers/webhooks.ts
9980
- var exports_webhooks = {};
9981
- __export(exports_webhooks, {
9982
- signPayload: () => signPayload,
9983
- deliverWebhooks: () => deliverWebhooks,
9984
- deliverWebhook: () => deliverWebhook
9985
- });
9986
9985
  async function signPayload(payload, secret) {
9987
9986
  const encoder = new TextEncoder;
9988
9987
  const data = encoder.encode(JSON.stringify(payload));
@@ -10031,6 +10030,155 @@ var init_webhooks = __esm(() => {
10031
10030
  logger29 = createLogger("Webhooks", "server");
10032
10031
  });
10033
10032
 
10033
+ // ../triggers/types.ts
10034
+ var MAX_TRIGGER_STEPS = 20, WEBHOOK_DELIVERY_TIMEOUT_MS = 1e4;
10035
+
10036
+ // ../triggers/executor.ts
10037
+ var exports_executor = {};
10038
+ __export(exports_executor, {
10039
+ executeTrigger: () => executeTrigger
10040
+ });
10041
+ async function executeTrigger(trigger, config, context) {
10042
+ const steps = [];
10043
+ let currentToolName = trigger.toolName;
10044
+ let currentToolArguments = trigger.toolArguments;
10045
+ let currentProvider = trigger.provider;
10046
+ let stepIndex = 0;
10047
+ while (stepIndex < MAX_TRIGGER_STEPS) {
10048
+ const stepValidation = validateStepLimit(stepIndex, MAX_TRIGGER_STEPS);
10049
+ if (!stepValidation.valid) {
10050
+ logger30.error(`[Trigger ${trigger.id}] ${stepValidation.error}`);
10051
+ break;
10052
+ }
10053
+ const providerToken = await config.getProviderToken(currentProvider, undefined, context);
10054
+ if (!providerToken) {
10055
+ const error = `No OAuth token available for provider '${currentProvider}'`;
10056
+ logger30.error(`[Trigger ${trigger.id}] ${error}`);
10057
+ steps.push({
10058
+ stepIndex,
10059
+ toolName: currentToolName,
10060
+ success: false,
10061
+ error,
10062
+ duration: 0,
10063
+ executedAt: new Date().toISOString()
10064
+ });
10065
+ await config.triggers.update(trigger.id, {
10066
+ lastRunAt: new Date().toISOString(),
10067
+ runCount: (trigger.runCount || 0) + 1,
10068
+ lastError: error,
10069
+ status: "failed"
10070
+ }, context);
10071
+ return { success: false, steps, error };
10072
+ }
10073
+ const startTime = Date.now();
10074
+ let toolResult;
10075
+ let stepSuccess = true;
10076
+ let stepError;
10077
+ try {
10078
+ toolResult = await config.handleToolCall({ name: currentToolName, arguments: currentToolArguments }, `${providerToken.tokenType || "Bearer"} ${providerToken.accessToken}`, null);
10079
+ } catch (err) {
10080
+ stepSuccess = false;
10081
+ stepError = err.message || "Tool execution failed";
10082
+ logger30.error(`[Trigger ${trigger.id}] Step ${stepIndex} failed:`, err);
10083
+ }
10084
+ const duration = Date.now() - startTime;
10085
+ const executedAt = new Date().toISOString();
10086
+ steps.push({
10087
+ stepIndex,
10088
+ toolName: currentToolName,
10089
+ success: stepSuccess,
10090
+ result: stepSuccess ? toolResult : undefined,
10091
+ error: stepError,
10092
+ duration,
10093
+ executedAt
10094
+ });
10095
+ if (!config.triggers.onComplete || !stepSuccess) {
10096
+ const updates = {
10097
+ lastRunAt: executedAt,
10098
+ runCount: (trigger.runCount || 0) + 1
10099
+ };
10100
+ if (stepSuccess) {
10101
+ updates.lastResult = toolResult;
10102
+ updates.lastError = undefined;
10103
+ if (trigger.schedule.type === "once") {
10104
+ updates.status = "completed";
10105
+ }
10106
+ } else {
10107
+ updates.lastError = stepError;
10108
+ updates.status = "failed";
10109
+ }
10110
+ await config.triggers.update(trigger.id, updates, context);
10111
+ return { success: stepSuccess, steps, error: stepError };
10112
+ }
10113
+ const completeRequest = {
10114
+ success: stepSuccess,
10115
+ result: stepSuccess ? toolResult : undefined,
10116
+ error: stepError,
10117
+ executedAt,
10118
+ duration,
10119
+ stepIndex,
10120
+ previousResults: steps,
10121
+ final: false
10122
+ };
10123
+ const completeResponse = await config.triggers.onComplete({
10124
+ trigger,
10125
+ request: completeRequest,
10126
+ context
10127
+ });
10128
+ if (completeResponse.hasMore && completeResponse.nextStep) {
10129
+ currentToolName = completeResponse.nextStep.toolName;
10130
+ currentToolArguments = completeResponse.nextStep.toolArguments;
10131
+ currentProvider = completeResponse.nextStep.provider;
10132
+ stepIndex++;
10133
+ continue;
10134
+ }
10135
+ const finalUpdates = {
10136
+ lastRunAt: executedAt,
10137
+ runCount: (trigger.runCount || 0) + 1
10138
+ };
10139
+ if (stepSuccess) {
10140
+ finalUpdates.lastResult = toolResult;
10141
+ finalUpdates.lastError = undefined;
10142
+ if (trigger.schedule.type === "once") {
10143
+ finalUpdates.status = "completed";
10144
+ }
10145
+ } else {
10146
+ finalUpdates.lastError = stepError;
10147
+ finalUpdates.status = "failed";
10148
+ }
10149
+ await config.triggers.update(trigger.id, finalUpdates, context);
10150
+ if (completeResponse.webhooks && completeResponse.webhooks.length > 0) {
10151
+ const totalDuration = steps.reduce((sum, s) => sum + (s.duration || 0), 0);
10152
+ const payload = {
10153
+ triggerId: trigger.id,
10154
+ success: steps.every((s) => s.success),
10155
+ steps,
10156
+ totalSteps: steps.length,
10157
+ totalDuration,
10158
+ executedAt
10159
+ };
10160
+ deliverWebhooks(completeResponse.webhooks, payload, WEBHOOK_DELIVERY_TIMEOUT_MS).catch(() => {});
10161
+ }
10162
+ return { success: stepSuccess, steps, error: stepError };
10163
+ }
10164
+ const limitError = `Trigger execution exceeded maximum of ${MAX_TRIGGER_STEPS} steps`;
10165
+ logger30.error(`[Trigger ${trigger.id}] ${limitError}`);
10166
+ await config.triggers.update(trigger.id, {
10167
+ lastRunAt: new Date().toISOString(),
10168
+ runCount: (trigger.runCount || 0) + 1,
10169
+ lastError: limitError,
10170
+ status: "failed"
10171
+ }, context);
10172
+ return { success: false, steps, error: limitError };
10173
+ }
10174
+ var logger30;
10175
+ var init_executor = __esm(() => {
10176
+ init_logger();
10177
+ init_utils2();
10178
+ init_webhooks();
10179
+ logger30 = createLogger("TriggerExecutor", "server");
10180
+ });
10181
+
10034
10182
  // ../server.ts
10035
10183
  var exports_server = {};
10036
10184
  __export(exports_server, {
@@ -10124,7 +10272,7 @@ function createMCPServer(config) {
10124
10272
  if (integration.oauth) {
10125
10273
  const { clientId, clientSecret, redirectUri: integrationRedirectUri, config: oauthConfig } = integration.oauth;
10126
10274
  if (!clientId || !clientSecret) {
10127
- logger30.warn(`Warning: Integration "${integration.id}" is missing OAuth credentials. ` + `Provide clientId and clientSecret in the integration configuration.`);
10275
+ logger31.warn(`Warning: Integration "${integration.id}" is missing OAuth credentials. ` + `Provide clientId and clientSecret in the integration configuration.`);
10128
10276
  return integration;
10129
10277
  }
10130
10278
  const redirectUri = integrationRedirectUri || config.redirectUri || getDefaultRedirectUri();
@@ -10255,7 +10403,7 @@ function createMCPServer(config) {
10255
10403
  }
10256
10404
  return response2;
10257
10405
  } catch (error) {
10258
- logger30.error("[MCP Tool Call] Error:", error);
10406
+ logger31.error("[MCP Tool Call] Error:", error);
10259
10407
  return Response.json({ error: error.message || "Failed to execute tool call" }, { status: error.statusCode || 500 });
10260
10408
  }
10261
10409
  }
@@ -10271,6 +10419,57 @@ function createMCPServer(config) {
10271
10419
  }));
10272
10420
  return Response.json({ integrations });
10273
10421
  }
10422
+ if (segments.length === 2 && segments[0] === "triggers" && segments[1] === "notify" && method === "POST") {
10423
+ if (!config.triggers) {
10424
+ return Response.json({ error: "Triggers not configured. Add triggers callbacks to createMCPServer config." }, { status: 501 });
10425
+ }
10426
+ try {
10427
+ const apiKey = webRequest.headers.get("x-api-key");
10428
+ if (!apiKey || apiKey !== config.apiKey) {
10429
+ return Response.json({ error: "Unauthorized" }, { status: 401 });
10430
+ }
10431
+ const body = await webRequest.json();
10432
+ const { triggerId } = body;
10433
+ if (!triggerId) {
10434
+ return Response.json({ error: "triggerId is required" }, { status: 400 });
10435
+ }
10436
+ const trigger = await config.triggers.get(triggerId);
10437
+ if (!trigger) {
10438
+ return Response.json({ error: "Trigger not found" }, { status: 404 });
10439
+ }
10440
+ if (!trigger.provider) {
10441
+ return Response.json({ error: "Trigger has no provider configured" }, { status: 400 });
10442
+ }
10443
+ const triggerContext = trigger.userId ? { userId: trigger.userId } : undefined;
10444
+ const { executeTrigger: executeTrigger2 } = await Promise.resolve().then(() => (init_executor(), exports_executor));
10445
+ const { OAuthHandler } = await Promise.resolve().then(() => (init_base_handler(), exports_base_handler));
10446
+ const oauthHandler = new OAuthHandler({
10447
+ providers,
10448
+ serverUrl: config.serverUrl,
10449
+ apiKey: config.apiKey,
10450
+ setProviderToken: config.setProviderToken,
10451
+ removeProviderToken: config.removeProviderToken,
10452
+ getSessionContext: config.getSessionContext
10453
+ });
10454
+ const executionResult = await executeTrigger2(trigger, {
10455
+ triggers: config.triggers,
10456
+ getProviderToken: async (provider, email, ctx) => {
10457
+ return config.getProviderToken ? await config.getProviderToken(provider, email, ctx) : undefined;
10458
+ },
10459
+ handleToolCall: (toolBody, authHeader, integrationsHeader) => {
10460
+ return oauthHandler.handleToolCall(toolBody, authHeader, integrationsHeader);
10461
+ }
10462
+ }, triggerContext);
10463
+ return Response.json({
10464
+ success: executionResult.success,
10465
+ steps: executionResult.steps,
10466
+ error: executionResult.error
10467
+ });
10468
+ } catch (error) {
10469
+ logger31.error("[Trigger Notify] Error:", error);
10470
+ return Response.json({ error: error.message || "Failed to execute trigger" }, { status: 500 });
10471
+ }
10472
+ }
10274
10473
  if (segments.length >= 1 && segments[0] === "triggers") {
10275
10474
  if (!config.triggers) {
10276
10475
  return Response.json({ error: "Triggers not configured. Add triggers callbacks to createMCPServer config." }, { status: 501 });
@@ -10311,8 +10510,9 @@ function createMCPServer(config) {
10311
10510
  };
10312
10511
  const created = await config.triggers.create(trigger, context2);
10313
10512
  const schedulerUrl = config.schedulerUrl || config.serverUrl || "https://mcp.integrate.dev";
10314
- const callbackBaseUrl = process.env.INTEGRATE_URL || (typeof window !== "undefined" ? window.location.origin : "http://localhost:3000");
10513
+ const defaultCallbackBaseUrl = process.env.INTEGRATE_URL || (typeof window !== "undefined" ? window.location.origin : "http://localhost:3000");
10315
10514
  try {
10515
+ const callbackBaseUrl = config.triggers.getCallbackUrl ? await config.triggers.getCallbackUrl(context2) : defaultCallbackBaseUrl;
10316
10516
  await fetch(`${schedulerUrl}/scheduler/register`, {
10317
10517
  method: "POST",
10318
10518
  headers: {
@@ -10322,8 +10522,7 @@ function createMCPServer(config) {
10322
10522
  body: JSON.stringify({
10323
10523
  triggerId: created.id,
10324
10524
  schedule: created.schedule,
10325
- callbackUrl: `${callbackBaseUrl}/api/integrate/triggers/${created.id}/execute`,
10326
- completeUrl: `${callbackBaseUrl}/api/integrate/triggers/${created.id}/complete`,
10525
+ callbackUrl: `${callbackBaseUrl}/api/integrate/triggers/notify`,
10327
10526
  metadata: {
10328
10527
  userId: context2?.userId,
10329
10528
  provider: created.provider
@@ -10331,7 +10530,7 @@ function createMCPServer(config) {
10331
10530
  })
10332
10531
  });
10333
10532
  } catch (scheduleError) {
10334
- logger30.error("[Trigger] Failed to register with scheduler:", scheduleError);
10533
+ logger31.error("[Trigger] Failed to register with scheduler:", scheduleError);
10335
10534
  }
10336
10535
  return Response.json(created, { status: 201 });
10337
10536
  }
@@ -10366,7 +10565,7 @@ function createMCPServer(config) {
10366
10565
  body: JSON.stringify({ triggerId })
10367
10566
  });
10368
10567
  } catch (error) {
10369
- logger30.error("[Trigger] Failed to pause in scheduler:", error);
10568
+ logger31.error("[Trigger] Failed to pause in scheduler:", error);
10370
10569
  }
10371
10570
  return Response.json(updated);
10372
10571
  } else if (subAction === "resume" && method === "POST") {
@@ -10394,7 +10593,7 @@ function createMCPServer(config) {
10394
10593
  body: JSON.stringify({ triggerId })
10395
10594
  });
10396
10595
  } catch (error) {
10397
- logger30.error("[Trigger] Failed to resume in scheduler:", error);
10596
+ logger31.error("[Trigger] Failed to resume in scheduler:", error);
10398
10597
  }
10399
10598
  return Response.json(updated);
10400
10599
  } else if (subAction === "run" && method === "POST") {
@@ -10405,10 +10604,7 @@ function createMCPServer(config) {
10405
10604
  if (!trigger.provider) {
10406
10605
  return Response.json({ error: "Trigger has no provider configured" }, { status: 400 });
10407
10606
  }
10408
- const providerToken = config.getProviderToken ? await config.getProviderToken(trigger.provider, undefined, context2) : undefined;
10409
- if (!providerToken) {
10410
- return Response.json({ error: "No OAuth token available for this trigger" }, { status: 401 });
10411
- }
10607
+ const { executeTrigger: executeTrigger2 } = await Promise.resolve().then(() => (init_executor(), exports_executor));
10412
10608
  const { OAuthHandler } = await Promise.resolve().then(() => (init_base_handler(), exports_base_handler));
10413
10609
  const oauthHandler = new OAuthHandler({
10414
10610
  providers,
@@ -10418,145 +10614,23 @@ function createMCPServer(config) {
10418
10614
  removeProviderToken: config.removeProviderToken,
10419
10615
  getSessionContext: config.getSessionContext
10420
10616
  });
10421
- const startTime = Date.now();
10422
- try {
10423
- const result = await oauthHandler.handleToolCall({ name: trigger.toolName, arguments: trigger.toolArguments }, `Bearer ${providerToken.accessToken}`, null);
10424
- const duration = Date.now() - startTime;
10425
- const executionResult = {
10426
- success: true,
10427
- result,
10428
- executedAt: new Date().toISOString(),
10429
- duration
10430
- };
10431
- await config.triggers.update(triggerId, {
10432
- lastRunAt: executionResult.executedAt,
10433
- runCount: (trigger.runCount || 0) + 1,
10434
- lastResult: result,
10435
- lastError: undefined
10436
- }, context2);
10437
- return Response.json(executionResult);
10438
- } catch (error) {
10439
- const duration = Date.now() - startTime;
10440
- const executionResult = {
10441
- success: false,
10442
- error: error.message || "Tool execution failed",
10443
- executedAt: new Date().toISOString(),
10444
- duration
10445
- };
10446
- await config.triggers.update(triggerId, {
10447
- lastRunAt: executionResult.executedAt,
10448
- runCount: (trigger.runCount || 0) + 1,
10449
- lastError: error.message,
10450
- status: "failed"
10451
- }, context2);
10452
- return Response.json(executionResult, { status: 500 });
10453
- }
10454
- } else if (subAction === "execute" && method === "GET") {
10455
- const apiKey = webRequest.headers.get("x-api-key");
10456
- if (!apiKey || apiKey !== config.apiKey) {
10457
- return Response.json({ error: "Unauthorized" }, { status: 401 });
10458
- }
10459
- const trigger = await config.triggers.get(triggerId, context2);
10460
- if (!trigger) {
10461
- return Response.json({ error: "Trigger not found" }, { status: 404 });
10462
- }
10463
- if (!trigger.provider) {
10464
- return Response.json({ error: "Trigger has no provider configured" }, { status: 400 });
10465
- }
10466
- const providerToken = config.getProviderToken ? await config.getProviderToken(trigger.provider, undefined, context2) : undefined;
10467
- if (!providerToken) {
10468
- return Response.json({ error: "No OAuth token available for this trigger" }, { status: 401 });
10469
- }
10470
- return Response.json({
10471
- trigger: {
10472
- id: trigger.id,
10473
- toolName: trigger.toolName,
10474
- toolArguments: trigger.toolArguments,
10475
- provider: trigger.provider
10617
+ const executionResult = await executeTrigger2(trigger, {
10618
+ triggers: config.triggers,
10619
+ getProviderToken: async (provider, email, ctx) => {
10620
+ return config.getProviderToken ? await config.getProviderToken(provider, email, ctx) : undefined;
10476
10621
  },
10477
- accessToken: providerToken.accessToken,
10478
- tokenType: providerToken.tokenType || "Bearer"
10479
- });
10480
- } else if (subAction === "complete" && method === "POST") {
10481
- const apiKey = webRequest.headers.get("x-api-key");
10482
- if (!apiKey || apiKey !== config.apiKey) {
10483
- return Response.json({ error: "Unauthorized" }, { status: 401 });
10484
- }
10485
- const body = await webRequest.json();
10486
- const trigger = await config.triggers.get(triggerId, context2);
10487
- if (!trigger) {
10488
- return Response.json({ error: "Trigger not found" }, { status: 404 });
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 });
10622
+ handleToolCall: (toolBody, authHeader, integrationsHeader) => {
10623
+ return oauthHandler.handleToolCall(toolBody, authHeader, integrationsHeader);
10496
10624
  }
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
- }
10544
- const updates = {
10545
- lastRunAt: body.executedAt,
10546
- runCount: (trigger.runCount || 0) + 1
10547
- };
10548
- if (body.success) {
10549
- updates.lastResult = body.result;
10550
- updates.lastError = undefined;
10551
- if (trigger.schedule.type === "once") {
10552
- updates.status = "completed";
10553
- }
10554
- } else {
10555
- updates.lastError = body.error;
10556
- updates.status = "failed";
10557
- }
10558
- await config.triggers.update(triggerId, updates, context2);
10559
- return Response.json({ success: true });
10625
+ }, context2);
10626
+ return Response.json({
10627
+ success: executionResult.success,
10628
+ result: executionResult.steps[0]?.result,
10629
+ executedAt: executionResult.steps[0]?.executedAt || new Date().toISOString(),
10630
+ duration: executionResult.steps[0]?.duration,
10631
+ error: executionResult.error,
10632
+ steps: executionResult.steps
10633
+ }, { status: executionResult.success ? 200 : 500 });
10560
10634
  } else if (!subAction && method === "GET") {
10561
10635
  const trigger = await config.triggers.get(triggerId, context2);
10562
10636
  if (!trigger) {
@@ -10589,7 +10663,7 @@ function createMCPServer(config) {
10589
10663
  })
10590
10664
  });
10591
10665
  } catch (error) {
10592
- logger30.error("[Trigger] Failed to update scheduler:", error);
10666
+ logger31.error("[Trigger] Failed to update scheduler:", error);
10593
10667
  }
10594
10668
  }
10595
10669
  return Response.json(updated);
@@ -10606,14 +10680,14 @@ function createMCPServer(config) {
10606
10680
  body: JSON.stringify({ triggerId })
10607
10681
  });
10608
10682
  } catch (error) {
10609
- logger30.error("[Trigger] Failed to unregister from scheduler:", error);
10683
+ logger31.error("[Trigger] Failed to unregister from scheduler:", error);
10610
10684
  }
10611
10685
  return new Response(null, { status: 204 });
10612
10686
  }
10613
10687
  }
10614
10688
  return Response.json({ error: "Invalid trigger route or method" }, { status: 404 });
10615
10689
  } catch (error) {
10616
- logger30.error("[Trigger] Error:", error);
10690
+ logger31.error("[Trigger] Error:", error);
10617
10691
  return Response.json({ error: error.message || "Failed to process trigger request" }, { status: error.statusCode || 500 });
10618
10692
  }
10619
10693
  }
@@ -10639,11 +10713,11 @@ function createMCPServer(config) {
10639
10713
  const errorRedirectUrl = "/auth-error";
10640
10714
  if (error) {
10641
10715
  const errorMsg = errorDescription || error;
10642
- logger30.error("[OAuth Redirect] Error:", errorMsg);
10716
+ logger31.error("[OAuth Redirect] Error:", errorMsg);
10643
10717
  return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent(errorMsg)}`, webRequest.url));
10644
10718
  }
10645
10719
  if (!code || !state) {
10646
- logger30.error("[OAuth Redirect] Missing code or state parameter");
10720
+ logger31.error("[OAuth Redirect] Missing code or state parameter");
10647
10721
  return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent("Invalid OAuth callback")}`, webRequest.url));
10648
10722
  }
10649
10723
  let returnUrl = defaultRedirectUrl;
@@ -10719,7 +10793,7 @@ function createMCPServer(config) {
10719
10793
  frontendUrl.hash = `oauth_callback=${encodeURIComponent(JSON.stringify({ code, state, tokenData }))}`;
10720
10794
  return Response.redirect(frontendUrl);
10721
10795
  } catch (error2) {
10722
- logger30.error("[OAuth Backend Callback] Error:", error2);
10796
+ logger31.error("[OAuth Backend Callback] Error:", error2);
10723
10797
  return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent(error2.message || "Failed to exchange token")}`, webRequest.url));
10724
10798
  }
10725
10799
  } else {
@@ -10938,7 +11012,7 @@ function toSvelteKitHandler(clientOrHandlerOrOptions, _redirectOptions) {
10938
11012
  }
10939
11013
  };
10940
11014
  }
10941
- var SERVER_LOG_CONTEXT = "server", logger30, globalServerConfig = null, codeVerifierStorage, POST = async (req, context) => {
11015
+ var SERVER_LOG_CONTEXT = "server", logger31, globalServerConfig = null, codeVerifierStorage, POST = async (req, context) => {
10942
11016
  if (!globalServerConfig) {
10943
11017
  return Response.json({ error: "OAuth not configured. Call createMCPServer() in your server initialization file first." }, { status: 500 });
10944
11018
  }
@@ -10986,7 +11060,7 @@ var init_server = __esm(() => {
10986
11060
  init_anthropic();
10987
11061
  init_google();
10988
11062
  init_ai();
10989
- logger30 = createLogger("MCPServer", SERVER_LOG_CONTEXT);
11063
+ logger31 = createLogger("MCPServer", SERVER_LOG_CONTEXT);
10990
11064
  codeVerifierStorage = new Map;
10991
11065
  });
10992
11066
 
@@ -11337,7 +11411,7 @@ class OAuthHandler {
11337
11411
  url.searchParams.set("state", authorizeRequest.state);
11338
11412
  url.searchParams.set("code_challenge", authorizeRequest.codeChallenge);
11339
11413
  url.searchParams.set("code_challenge_method", authorizeRequest.codeChallengeMethod);
11340
- const redirectUri = authorizeRequest.redirectUri || providerConfig.redirectUri;
11414
+ const redirectUri = providerConfig.redirectUri;
11341
11415
  if (redirectUri) {
11342
11416
  url.searchParams.set("redirect_uri", redirectUri);
11343
11417
  }
@@ -11449,7 +11523,7 @@ class OAuthHandler {
11449
11523
  tokenType: result.tokenType,
11450
11524
  expiresIn: result.expiresIn,
11451
11525
  expiresAt: result.expiresAt,
11452
- scopes: result.scopes
11526
+ scopes: result.scopes ? result.scopes.flatMap((s) => s.split(" ").filter(Boolean)) : result.scopes
11453
11527
  };
11454
11528
  await this.config.setProviderToken(callbackRequest.provider, tokenData, undefined, context);
11455
11529
  } catch (error) {}
@@ -11499,11 +11573,11 @@ class OAuthHandler {
11499
11573
  try {
11500
11574
  await this.config.removeProviderToken(request.provider, undefined, context);
11501
11575
  } catch (error) {
11502
- logger31.error(`Failed to delete token for ${request.provider} from database via removeProviderToken:`, error);
11576
+ logger32.error(`Failed to delete token for ${request.provider} from database via removeProviderToken:`, error);
11503
11577
  }
11504
11578
  }
11505
11579
  } catch (error) {
11506
- logger31.error(`Failed to extract context for disconnect:`, error);
11580
+ logger32.error(`Failed to extract context for disconnect:`, error);
11507
11581
  }
11508
11582
  }
11509
11583
  const url = new URL("/oauth/disconnect", this.serverUrl);
@@ -11563,10 +11637,10 @@ class OAuthHandler {
11563
11637
  return jsonRpcResponse.result;
11564
11638
  }
11565
11639
  }
11566
- var SERVER_LOG_CONTEXT2 = "server", logger31, MCP_SERVER_URL2 = "https://mcp.integrate.dev/api/v1/mcp";
11640
+ var SERVER_LOG_CONTEXT2 = "server", logger32, MCP_SERVER_URL2 = "https://mcp.integrate.dev/api/v1/mcp";
11567
11641
  var init_base_handler = __esm(() => {
11568
11642
  init_logger();
11569
- logger31 = createLogger("OAuthHandler", SERVER_LOG_CONTEXT2);
11643
+ logger32 = createLogger("OAuthHandler", SERVER_LOG_CONTEXT2);
11570
11644
  });
11571
11645
 
11572
11646
  // nextjs.ts
@@ -11585,7 +11659,7 @@ function createNextOAuthHandler(config) {
11585
11659
  }
11586
11660
  return response;
11587
11661
  } catch (error) {
11588
- logger32.error("[OAuth Authorize] Error:", error);
11662
+ logger33.error("[OAuth Authorize] Error:", error);
11589
11663
  return Response.json({ error: error.message || "Failed to get authorization URL" }, { status: 500 });
11590
11664
  }
11591
11665
  },
@@ -11601,7 +11675,7 @@ function createNextOAuthHandler(config) {
11601
11675
  }
11602
11676
  return response;
11603
11677
  } catch (error) {
11604
- logger32.error("[OAuth Callback] Error:", error);
11678
+ logger33.error("[OAuth Callback] Error:", error);
11605
11679
  return Response.json({ error: error.message || "Failed to exchange authorization code" }, { status: 500 });
11606
11680
  }
11607
11681
  },
@@ -11623,7 +11697,7 @@ function createNextOAuthHandler(config) {
11623
11697
  }
11624
11698
  return response;
11625
11699
  } catch (error) {
11626
- logger32.error("[OAuth Status] Error:", error);
11700
+ logger33.error("[OAuth Status] Error:", error);
11627
11701
  return Response.json({ error: error.message || "Failed to check authorization status" }, { status: 500 });
11628
11702
  }
11629
11703
  },
@@ -11646,7 +11720,7 @@ function createNextOAuthHandler(config) {
11646
11720
  }
11647
11721
  return response;
11648
11722
  } catch (error) {
11649
- logger32.error("[OAuth Disconnect] Error:", error);
11723
+ logger33.error("[OAuth Disconnect] Error:", error);
11650
11724
  return Response.json({ error: error.message || "Failed to disconnect provider" }, { status: 500 });
11651
11725
  }
11652
11726
  },
@@ -11687,7 +11761,7 @@ function createNextOAuthHandler(config) {
11687
11761
  const result = await handler.handleToolCall(body, authHeader, integrationsHeader);
11688
11762
  return Response.json(result);
11689
11763
  } catch (error) {
11690
- logger32.error("[MCP Tool Call] Error:", error);
11764
+ logger33.error("[MCP Tool Call] Error:", error);
11691
11765
  return Response.json({ error: error.message || "Failed to execute tool call" }, { status: error.statusCode || 500 });
11692
11766
  }
11693
11767
  },
@@ -11732,11 +11806,11 @@ function createNextOAuthHandler(config) {
11732
11806
  const errorDescription = searchParams.get("error_description");
11733
11807
  if (error) {
11734
11808
  const errorMsg = errorDescription || error;
11735
- logger32.error("[OAuth Redirect] Error:", errorMsg);
11809
+ logger33.error("[OAuth Redirect] Error:", errorMsg);
11736
11810
  return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent(errorMsg)}`, req.url));
11737
11811
  }
11738
11812
  if (!code || !state) {
11739
- logger32.error("[OAuth Redirect] Missing code or state parameter");
11813
+ logger33.error("[OAuth Redirect] Missing code or state parameter");
11740
11814
  return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent("Invalid OAuth callback")}`, req.url));
11741
11815
  }
11742
11816
  let returnUrl = defaultRedirectUrl;
@@ -11775,11 +11849,11 @@ function createNextOAuthHandler(config) {
11775
11849
  };
11776
11850
  return handlers;
11777
11851
  }
11778
- var SERVER_LOG_CONTEXT3 = "server", logger32;
11852
+ var SERVER_LOG_CONTEXT3 = "server", logger33;
11779
11853
  var init_nextjs = __esm(() => {
11780
11854
  init_base_handler();
11781
11855
  init_logger();
11782
- logger32 = createLogger("NextJSOAuth", SERVER_LOG_CONTEXT3);
11856
+ logger33 = createLogger("NextJSOAuth", SERVER_LOG_CONTEXT3);
11783
11857
  });
11784
11858
  export {
11785
11859
  toWebRequest,