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.
package/dist/oauth.js CHANGED
@@ -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) {
@@ -10181,21 +10194,7 @@ var init_ai = __esm(() => {
10181
10194
  init_trigger_tools();
10182
10195
  });
10183
10196
 
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
10197
  // src/triggers/webhooks.ts
10193
- var exports_webhooks = {};
10194
- __export(exports_webhooks, {
10195
- signPayload: () => signPayload,
10196
- deliverWebhooks: () => deliverWebhooks,
10197
- deliverWebhook: () => deliverWebhook
10198
- });
10199
10198
  async function signPayload(payload, secret) {
10200
10199
  const encoder = new TextEncoder;
10201
10200
  const data = encoder.encode(JSON.stringify(payload));
@@ -10244,6 +10243,155 @@ var init_webhooks = __esm(() => {
10244
10243
  logger30 = createLogger("Webhooks", "server");
10245
10244
  });
10246
10245
 
10246
+ // src/triggers/types.ts
10247
+ var MAX_TRIGGER_STEPS = 20, WEBHOOK_DELIVERY_TIMEOUT_MS = 1e4;
10248
+
10249
+ // src/triggers/executor.ts
10250
+ var exports_executor = {};
10251
+ __export(exports_executor, {
10252
+ executeTrigger: () => executeTrigger
10253
+ });
10254
+ async function executeTrigger(trigger, config, context) {
10255
+ const steps = [];
10256
+ let currentToolName = trigger.toolName;
10257
+ let currentToolArguments = trigger.toolArguments;
10258
+ let currentProvider = trigger.provider;
10259
+ let stepIndex = 0;
10260
+ while (stepIndex < MAX_TRIGGER_STEPS) {
10261
+ const stepValidation = validateStepLimit(stepIndex, MAX_TRIGGER_STEPS);
10262
+ if (!stepValidation.valid) {
10263
+ logger31.error(`[Trigger ${trigger.id}] ${stepValidation.error}`);
10264
+ break;
10265
+ }
10266
+ const providerToken = await config.getProviderToken(currentProvider, undefined, context);
10267
+ if (!providerToken) {
10268
+ const error = `No OAuth token available for provider '${currentProvider}'`;
10269
+ logger31.error(`[Trigger ${trigger.id}] ${error}`);
10270
+ steps.push({
10271
+ stepIndex,
10272
+ toolName: currentToolName,
10273
+ success: false,
10274
+ error,
10275
+ duration: 0,
10276
+ executedAt: new Date().toISOString()
10277
+ });
10278
+ await config.triggers.update(trigger.id, {
10279
+ lastRunAt: new Date().toISOString(),
10280
+ runCount: (trigger.runCount || 0) + 1,
10281
+ lastError: error,
10282
+ status: "failed"
10283
+ }, context);
10284
+ return { success: false, steps, error };
10285
+ }
10286
+ const startTime = Date.now();
10287
+ let toolResult;
10288
+ let stepSuccess = true;
10289
+ let stepError;
10290
+ try {
10291
+ toolResult = await config.handleToolCall({ name: currentToolName, arguments: currentToolArguments }, `${providerToken.tokenType || "Bearer"} ${providerToken.accessToken}`, null);
10292
+ } catch (err) {
10293
+ stepSuccess = false;
10294
+ stepError = err.message || "Tool execution failed";
10295
+ logger31.error(`[Trigger ${trigger.id}] Step ${stepIndex} failed:`, err);
10296
+ }
10297
+ const duration = Date.now() - startTime;
10298
+ const executedAt = new Date().toISOString();
10299
+ steps.push({
10300
+ stepIndex,
10301
+ toolName: currentToolName,
10302
+ success: stepSuccess,
10303
+ result: stepSuccess ? toolResult : undefined,
10304
+ error: stepError,
10305
+ duration,
10306
+ executedAt
10307
+ });
10308
+ if (!config.triggers.onComplete || !stepSuccess) {
10309
+ const updates = {
10310
+ lastRunAt: executedAt,
10311
+ runCount: (trigger.runCount || 0) + 1
10312
+ };
10313
+ if (stepSuccess) {
10314
+ updates.lastResult = toolResult;
10315
+ updates.lastError = undefined;
10316
+ if (trigger.schedule.type === "once") {
10317
+ updates.status = "completed";
10318
+ }
10319
+ } else {
10320
+ updates.lastError = stepError;
10321
+ updates.status = "failed";
10322
+ }
10323
+ await config.triggers.update(trigger.id, updates, context);
10324
+ return { success: stepSuccess, steps, error: stepError };
10325
+ }
10326
+ const completeRequest = {
10327
+ success: stepSuccess,
10328
+ result: stepSuccess ? toolResult : undefined,
10329
+ error: stepError,
10330
+ executedAt,
10331
+ duration,
10332
+ stepIndex,
10333
+ previousResults: steps,
10334
+ final: false
10335
+ };
10336
+ const completeResponse = await config.triggers.onComplete({
10337
+ trigger,
10338
+ request: completeRequest,
10339
+ context
10340
+ });
10341
+ if (completeResponse.hasMore && completeResponse.nextStep) {
10342
+ currentToolName = completeResponse.nextStep.toolName;
10343
+ currentToolArguments = completeResponse.nextStep.toolArguments;
10344
+ currentProvider = completeResponse.nextStep.provider;
10345
+ stepIndex++;
10346
+ continue;
10347
+ }
10348
+ const finalUpdates = {
10349
+ lastRunAt: executedAt,
10350
+ runCount: (trigger.runCount || 0) + 1
10351
+ };
10352
+ if (stepSuccess) {
10353
+ finalUpdates.lastResult = toolResult;
10354
+ finalUpdates.lastError = undefined;
10355
+ if (trigger.schedule.type === "once") {
10356
+ finalUpdates.status = "completed";
10357
+ }
10358
+ } else {
10359
+ finalUpdates.lastError = stepError;
10360
+ finalUpdates.status = "failed";
10361
+ }
10362
+ await config.triggers.update(trigger.id, finalUpdates, context);
10363
+ if (completeResponse.webhooks && completeResponse.webhooks.length > 0) {
10364
+ const totalDuration = steps.reduce((sum, s) => sum + (s.duration || 0), 0);
10365
+ const payload = {
10366
+ triggerId: trigger.id,
10367
+ success: steps.every((s) => s.success),
10368
+ steps,
10369
+ totalSteps: steps.length,
10370
+ totalDuration,
10371
+ executedAt
10372
+ };
10373
+ deliverWebhooks(completeResponse.webhooks, payload, WEBHOOK_DELIVERY_TIMEOUT_MS).catch(() => {});
10374
+ }
10375
+ return { success: stepSuccess, steps, error: stepError };
10376
+ }
10377
+ const limitError = `Trigger execution exceeded maximum of ${MAX_TRIGGER_STEPS} steps`;
10378
+ logger31.error(`[Trigger ${trigger.id}] ${limitError}`);
10379
+ await config.triggers.update(trigger.id, {
10380
+ lastRunAt: new Date().toISOString(),
10381
+ runCount: (trigger.runCount || 0) + 1,
10382
+ lastError: limitError,
10383
+ status: "failed"
10384
+ }, context);
10385
+ return { success: false, steps, error: limitError };
10386
+ }
10387
+ var logger31;
10388
+ var init_executor = __esm(() => {
10389
+ init_logger();
10390
+ init_utils2();
10391
+ init_webhooks();
10392
+ logger31 = createLogger("TriggerExecutor", "server");
10393
+ });
10394
+
10247
10395
  // src/server.ts
10248
10396
  var exports_server = {};
10249
10397
  __export(exports_server, {
@@ -10337,7 +10485,7 @@ function createMCPServer(config) {
10337
10485
  if (integration.oauth) {
10338
10486
  const { clientId, clientSecret, redirectUri: integrationRedirectUri, config: oauthConfig } = integration.oauth;
10339
10487
  if (!clientId || !clientSecret) {
10340
- logger31.warn(`Warning: Integration "${integration.id}" is missing OAuth credentials. ` + `Provide clientId and clientSecret in the integration configuration.`);
10488
+ logger32.warn(`Warning: Integration "${integration.id}" is missing OAuth credentials. ` + `Provide clientId and clientSecret in the integration configuration.`);
10341
10489
  return integration;
10342
10490
  }
10343
10491
  const redirectUri = integrationRedirectUri || config.redirectUri || getDefaultRedirectUri();
@@ -10468,7 +10616,7 @@ function createMCPServer(config) {
10468
10616
  }
10469
10617
  return response2;
10470
10618
  } catch (error) {
10471
- logger31.error("[MCP Tool Call] Error:", error);
10619
+ logger32.error("[MCP Tool Call] Error:", error);
10472
10620
  return Response.json({ error: error.message || "Failed to execute tool call" }, { status: error.statusCode || 500 });
10473
10621
  }
10474
10622
  }
@@ -10484,6 +10632,57 @@ function createMCPServer(config) {
10484
10632
  }));
10485
10633
  return Response.json({ integrations });
10486
10634
  }
10635
+ if (segments.length === 2 && segments[0] === "triggers" && segments[1] === "notify" && method === "POST") {
10636
+ if (!config.triggers) {
10637
+ return Response.json({ error: "Triggers not configured. Add triggers callbacks to createMCPServer config." }, { status: 501 });
10638
+ }
10639
+ try {
10640
+ const apiKey = webRequest.headers.get("x-api-key");
10641
+ if (!apiKey || apiKey !== config.apiKey) {
10642
+ return Response.json({ error: "Unauthorized" }, { status: 401 });
10643
+ }
10644
+ const body = await webRequest.json();
10645
+ const { triggerId } = body;
10646
+ if (!triggerId) {
10647
+ return Response.json({ error: "triggerId is required" }, { status: 400 });
10648
+ }
10649
+ const trigger = await config.triggers.get(triggerId);
10650
+ if (!trigger) {
10651
+ return Response.json({ error: "Trigger not found" }, { status: 404 });
10652
+ }
10653
+ if (!trigger.provider) {
10654
+ return Response.json({ error: "Trigger has no provider configured" }, { status: 400 });
10655
+ }
10656
+ const triggerContext = trigger.userId ? { userId: trigger.userId } : undefined;
10657
+ const { executeTrigger: executeTrigger2 } = await Promise.resolve().then(() => (init_executor(), exports_executor));
10658
+ const { OAuthHandler: OAuthHandler2 } = await Promise.resolve().then(() => (init_base_handler(), exports_base_handler));
10659
+ const oauthHandler = new OAuthHandler2({
10660
+ providers,
10661
+ serverUrl: config.serverUrl,
10662
+ apiKey: config.apiKey,
10663
+ setProviderToken: config.setProviderToken,
10664
+ removeProviderToken: config.removeProviderToken,
10665
+ getSessionContext: config.getSessionContext
10666
+ });
10667
+ const executionResult = await executeTrigger2(trigger, {
10668
+ triggers: config.triggers,
10669
+ getProviderToken: async (provider, email, ctx) => {
10670
+ return config.getProviderToken ? await config.getProviderToken(provider, email, ctx) : undefined;
10671
+ },
10672
+ handleToolCall: (toolBody, authHeader, integrationsHeader) => {
10673
+ return oauthHandler.handleToolCall(toolBody, authHeader, integrationsHeader);
10674
+ }
10675
+ }, triggerContext);
10676
+ return Response.json({
10677
+ success: executionResult.success,
10678
+ steps: executionResult.steps,
10679
+ error: executionResult.error
10680
+ });
10681
+ } catch (error) {
10682
+ logger32.error("[Trigger Notify] Error:", error);
10683
+ return Response.json({ error: error.message || "Failed to execute trigger" }, { status: 500 });
10684
+ }
10685
+ }
10487
10686
  if (segments.length >= 1 && segments[0] === "triggers") {
10488
10687
  if (!config.triggers) {
10489
10688
  return Response.json({ error: "Triggers not configured. Add triggers callbacks to createMCPServer config." }, { status: 501 });
@@ -10524,8 +10723,9 @@ function createMCPServer(config) {
10524
10723
  };
10525
10724
  const created = await config.triggers.create(trigger, context2);
10526
10725
  const schedulerUrl = config.schedulerUrl || config.serverUrl || "https://mcp.integrate.dev";
10527
- const callbackBaseUrl = process.env.INTEGRATE_URL || (typeof window !== "undefined" ? window.location.origin : "http://localhost:3000");
10726
+ const defaultCallbackBaseUrl = process.env.INTEGRATE_URL || (typeof window !== "undefined" ? window.location.origin : "http://localhost:3000");
10528
10727
  try {
10728
+ const callbackBaseUrl = config.triggers.getCallbackUrl ? await config.triggers.getCallbackUrl(context2) : defaultCallbackBaseUrl;
10529
10729
  await fetch(`${schedulerUrl}/scheduler/register`, {
10530
10730
  method: "POST",
10531
10731
  headers: {
@@ -10535,8 +10735,7 @@ function createMCPServer(config) {
10535
10735
  body: JSON.stringify({
10536
10736
  triggerId: created.id,
10537
10737
  schedule: created.schedule,
10538
- callbackUrl: `${callbackBaseUrl}/api/integrate/triggers/${created.id}/execute`,
10539
- completeUrl: `${callbackBaseUrl}/api/integrate/triggers/${created.id}/complete`,
10738
+ callbackUrl: `${callbackBaseUrl}/api/integrate/triggers/notify`,
10540
10739
  metadata: {
10541
10740
  userId: context2?.userId,
10542
10741
  provider: created.provider
@@ -10544,7 +10743,7 @@ function createMCPServer(config) {
10544
10743
  })
10545
10744
  });
10546
10745
  } catch (scheduleError) {
10547
- logger31.error("[Trigger] Failed to register with scheduler:", scheduleError);
10746
+ logger32.error("[Trigger] Failed to register with scheduler:", scheduleError);
10548
10747
  }
10549
10748
  return Response.json(created, { status: 201 });
10550
10749
  }
@@ -10579,7 +10778,7 @@ function createMCPServer(config) {
10579
10778
  body: JSON.stringify({ triggerId })
10580
10779
  });
10581
10780
  } catch (error) {
10582
- logger31.error("[Trigger] Failed to pause in scheduler:", error);
10781
+ logger32.error("[Trigger] Failed to pause in scheduler:", error);
10583
10782
  }
10584
10783
  return Response.json(updated);
10585
10784
  } else if (subAction === "resume" && method === "POST") {
@@ -10607,7 +10806,7 @@ function createMCPServer(config) {
10607
10806
  body: JSON.stringify({ triggerId })
10608
10807
  });
10609
10808
  } catch (error) {
10610
- logger31.error("[Trigger] Failed to resume in scheduler:", error);
10809
+ logger32.error("[Trigger] Failed to resume in scheduler:", error);
10611
10810
  }
10612
10811
  return Response.json(updated);
10613
10812
  } else if (subAction === "run" && method === "POST") {
@@ -10618,10 +10817,7 @@ function createMCPServer(config) {
10618
10817
  if (!trigger.provider) {
10619
10818
  return Response.json({ error: "Trigger has no provider configured" }, { status: 400 });
10620
10819
  }
10621
- const providerToken = config.getProviderToken ? await config.getProviderToken(trigger.provider, undefined, context2) : undefined;
10622
- if (!providerToken) {
10623
- return Response.json({ error: "No OAuth token available for this trigger" }, { status: 401 });
10624
- }
10820
+ const { executeTrigger: executeTrigger2 } = await Promise.resolve().then(() => (init_executor(), exports_executor));
10625
10821
  const { OAuthHandler: OAuthHandler2 } = await Promise.resolve().then(() => (init_base_handler(), exports_base_handler));
10626
10822
  const oauthHandler = new OAuthHandler2({
10627
10823
  providers,
@@ -10631,145 +10827,23 @@ function createMCPServer(config) {
10631
10827
  removeProviderToken: config.removeProviderToken,
10632
10828
  getSessionContext: config.getSessionContext
10633
10829
  });
10634
- const startTime = Date.now();
10635
- try {
10636
- const result = await oauthHandler.handleToolCall({ name: trigger.toolName, arguments: trigger.toolArguments }, `Bearer ${providerToken.accessToken}`, null);
10637
- const duration = Date.now() - startTime;
10638
- const executionResult = {
10639
- success: true,
10640
- result,
10641
- executedAt: new Date().toISOString(),
10642
- duration
10643
- };
10644
- await config.triggers.update(triggerId, {
10645
- lastRunAt: executionResult.executedAt,
10646
- runCount: (trigger.runCount || 0) + 1,
10647
- lastResult: result,
10648
- lastError: undefined
10649
- }, context2);
10650
- return Response.json(executionResult);
10651
- } catch (error) {
10652
- const duration = Date.now() - startTime;
10653
- const executionResult = {
10654
- success: false,
10655
- error: error.message || "Tool execution failed",
10656
- executedAt: new Date().toISOString(),
10657
- duration
10658
- };
10659
- await config.triggers.update(triggerId, {
10660
- lastRunAt: executionResult.executedAt,
10661
- runCount: (trigger.runCount || 0) + 1,
10662
- lastError: error.message,
10663
- status: "failed"
10664
- }, context2);
10665
- return Response.json(executionResult, { status: 500 });
10666
- }
10667
- } else if (subAction === "execute" && method === "GET") {
10668
- const apiKey = webRequest.headers.get("x-api-key");
10669
- if (!apiKey || apiKey !== config.apiKey) {
10670
- return Response.json({ error: "Unauthorized" }, { status: 401 });
10671
- }
10672
- const trigger = await config.triggers.get(triggerId, context2);
10673
- if (!trigger) {
10674
- return Response.json({ error: "Trigger not found" }, { status: 404 });
10675
- }
10676
- if (!trigger.provider) {
10677
- return Response.json({ error: "Trigger has no provider configured" }, { status: 400 });
10678
- }
10679
- const providerToken = config.getProviderToken ? await config.getProviderToken(trigger.provider, undefined, context2) : undefined;
10680
- if (!providerToken) {
10681
- return Response.json({ error: "No OAuth token available for this trigger" }, { status: 401 });
10682
- }
10683
- return Response.json({
10684
- trigger: {
10685
- id: trigger.id,
10686
- toolName: trigger.toolName,
10687
- toolArguments: trigger.toolArguments,
10688
- provider: trigger.provider
10830
+ const executionResult = await executeTrigger2(trigger, {
10831
+ triggers: config.triggers,
10832
+ getProviderToken: async (provider, email, ctx) => {
10833
+ return config.getProviderToken ? await config.getProviderToken(provider, email, ctx) : undefined;
10689
10834
  },
10690
- accessToken: providerToken.accessToken,
10691
- tokenType: providerToken.tokenType || "Bearer"
10692
- });
10693
- } else if (subAction === "complete" && method === "POST") {
10694
- const apiKey = webRequest.headers.get("x-api-key");
10695
- if (!apiKey || apiKey !== config.apiKey) {
10696
- return Response.json({ error: "Unauthorized" }, { status: 401 });
10697
- }
10698
- const body = await webRequest.json();
10699
- const trigger = await config.triggers.get(triggerId, context2);
10700
- if (!trigger) {
10701
- return Response.json({ error: "Trigger not found" }, { status: 404 });
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 });
10835
+ handleToolCall: (toolBody, authHeader, integrationsHeader) => {
10836
+ return oauthHandler.handleToolCall(toolBody, authHeader, integrationsHeader);
10709
10837
  }
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
- }
10757
- const updates = {
10758
- lastRunAt: body.executedAt,
10759
- runCount: (trigger.runCount || 0) + 1
10760
- };
10761
- if (body.success) {
10762
- updates.lastResult = body.result;
10763
- updates.lastError = undefined;
10764
- if (trigger.schedule.type === "once") {
10765
- updates.status = "completed";
10766
- }
10767
- } else {
10768
- updates.lastError = body.error;
10769
- updates.status = "failed";
10770
- }
10771
- await config.triggers.update(triggerId, updates, context2);
10772
- return Response.json({ success: true });
10838
+ }, context2);
10839
+ return Response.json({
10840
+ success: executionResult.success,
10841
+ result: executionResult.steps[0]?.result,
10842
+ executedAt: executionResult.steps[0]?.executedAt || new Date().toISOString(),
10843
+ duration: executionResult.steps[0]?.duration,
10844
+ error: executionResult.error,
10845
+ steps: executionResult.steps
10846
+ }, { status: executionResult.success ? 200 : 500 });
10773
10847
  } else if (!subAction && method === "GET") {
10774
10848
  const trigger = await config.triggers.get(triggerId, context2);
10775
10849
  if (!trigger) {
@@ -10802,7 +10876,7 @@ function createMCPServer(config) {
10802
10876
  })
10803
10877
  });
10804
10878
  } catch (error) {
10805
- logger31.error("[Trigger] Failed to update scheduler:", error);
10879
+ logger32.error("[Trigger] Failed to update scheduler:", error);
10806
10880
  }
10807
10881
  }
10808
10882
  return Response.json(updated);
@@ -10819,14 +10893,14 @@ function createMCPServer(config) {
10819
10893
  body: JSON.stringify({ triggerId })
10820
10894
  });
10821
10895
  } catch (error) {
10822
- logger31.error("[Trigger] Failed to unregister from scheduler:", error);
10896
+ logger32.error("[Trigger] Failed to unregister from scheduler:", error);
10823
10897
  }
10824
10898
  return new Response(null, { status: 204 });
10825
10899
  }
10826
10900
  }
10827
10901
  return Response.json({ error: "Invalid trigger route or method" }, { status: 404 });
10828
10902
  } catch (error) {
10829
- logger31.error("[Trigger] Error:", error);
10903
+ logger32.error("[Trigger] Error:", error);
10830
10904
  return Response.json({ error: error.message || "Failed to process trigger request" }, { status: error.statusCode || 500 });
10831
10905
  }
10832
10906
  }
@@ -10852,11 +10926,11 @@ function createMCPServer(config) {
10852
10926
  const errorRedirectUrl = "/auth-error";
10853
10927
  if (error) {
10854
10928
  const errorMsg = errorDescription || error;
10855
- logger31.error("[OAuth Redirect] Error:", errorMsg);
10929
+ logger32.error("[OAuth Redirect] Error:", errorMsg);
10856
10930
  return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent(errorMsg)}`, webRequest.url));
10857
10931
  }
10858
10932
  if (!code || !state) {
10859
- logger31.error("[OAuth Redirect] Missing code or state parameter");
10933
+ logger32.error("[OAuth Redirect] Missing code or state parameter");
10860
10934
  return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent("Invalid OAuth callback")}`, webRequest.url));
10861
10935
  }
10862
10936
  let returnUrl = defaultRedirectUrl;
@@ -10932,7 +11006,7 @@ function createMCPServer(config) {
10932
11006
  frontendUrl.hash = `oauth_callback=${encodeURIComponent(JSON.stringify({ code, state, tokenData }))}`;
10933
11007
  return Response.redirect(frontendUrl);
10934
11008
  } catch (error2) {
10935
- logger31.error("[OAuth Backend Callback] Error:", error2);
11009
+ logger32.error("[OAuth Backend Callback] Error:", error2);
10936
11010
  return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent(error2.message || "Failed to exchange token")}`, webRequest.url));
10937
11011
  }
10938
11012
  } else {
@@ -11151,7 +11225,7 @@ function toSvelteKitHandler(clientOrHandlerOrOptions, _redirectOptions) {
11151
11225
  }
11152
11226
  };
11153
11227
  }
11154
- var SERVER_LOG_CONTEXT2 = "server", logger31, globalServerConfig = null, codeVerifierStorage, POST = async (req, context) => {
11228
+ var SERVER_LOG_CONTEXT2 = "server", logger32, globalServerConfig = null, codeVerifierStorage, POST = async (req, context) => {
11155
11229
  if (!globalServerConfig) {
11156
11230
  return Response.json({ error: "OAuth not configured. Call createMCPServer() in your server initialization file first." }, { status: 500 });
11157
11231
  }
@@ -11199,7 +11273,7 @@ var init_server = __esm(() => {
11199
11273
  init_anthropic();
11200
11274
  init_google();
11201
11275
  init_ai();
11202
- logger31 = createLogger("MCPServer", SERVER_LOG_CONTEXT2);
11276
+ logger32 = createLogger("MCPServer", SERVER_LOG_CONTEXT2);
11203
11277
  codeVerifierStorage = new Map;
11204
11278
  });
11205
11279
 
@@ -11550,7 +11624,7 @@ class OAuthHandler {
11550
11624
  url.searchParams.set("state", authorizeRequest.state);
11551
11625
  url.searchParams.set("code_challenge", authorizeRequest.codeChallenge);
11552
11626
  url.searchParams.set("code_challenge_method", authorizeRequest.codeChallengeMethod);
11553
- const redirectUri = authorizeRequest.redirectUri || providerConfig.redirectUri;
11627
+ const redirectUri = providerConfig.redirectUri;
11554
11628
  if (redirectUri) {
11555
11629
  url.searchParams.set("redirect_uri", redirectUri);
11556
11630
  }
@@ -11662,7 +11736,7 @@ class OAuthHandler {
11662
11736
  tokenType: result.tokenType,
11663
11737
  expiresIn: result.expiresIn,
11664
11738
  expiresAt: result.expiresAt,
11665
- scopes: result.scopes
11739
+ scopes: result.scopes ? result.scopes.flatMap((s) => s.split(" ").filter(Boolean)) : result.scopes
11666
11740
  };
11667
11741
  await this.config.setProviderToken(callbackRequest.provider, tokenData, undefined, context);
11668
11742
  } catch (error) {}
@@ -11712,11 +11786,11 @@ class OAuthHandler {
11712
11786
  try {
11713
11787
  await this.config.removeProviderToken(request.provider, undefined, context);
11714
11788
  } catch (error) {
11715
- logger32.error(`Failed to delete token for ${request.provider} from database via removeProviderToken:`, error);
11789
+ logger33.error(`Failed to delete token for ${request.provider} from database via removeProviderToken:`, error);
11716
11790
  }
11717
11791
  }
11718
11792
  } catch (error) {
11719
- logger32.error(`Failed to extract context for disconnect:`, error);
11793
+ logger33.error(`Failed to extract context for disconnect:`, error);
11720
11794
  }
11721
11795
  }
11722
11796
  const url = new URL("/oauth/disconnect", this.serverUrl);
@@ -11776,17 +11850,17 @@ class OAuthHandler {
11776
11850
  return jsonRpcResponse.result;
11777
11851
  }
11778
11852
  }
11779
- var SERVER_LOG_CONTEXT3 = "server", logger32, MCP_SERVER_URL2 = "https://mcp.integrate.dev/api/v1/mcp";
11853
+ var SERVER_LOG_CONTEXT3 = "server", logger33, MCP_SERVER_URL2 = "https://mcp.integrate.dev/api/v1/mcp";
11780
11854
  var init_base_handler = __esm(() => {
11781
11855
  init_logger();
11782
- logger32 = createLogger("OAuthHandler", SERVER_LOG_CONTEXT3);
11856
+ logger33 = createLogger("OAuthHandler", SERVER_LOG_CONTEXT3);
11783
11857
  });
11784
11858
 
11785
11859
  // src/adapters/auto-routes.ts
11786
11860
  init_base_handler();
11787
11861
  init_logger();
11788
11862
  var SERVER_LOG_CONTEXT4 = "server";
11789
- var logger33 = createLogger("AutoRoutes", SERVER_LOG_CONTEXT4);
11863
+ var logger34 = createLogger("AutoRoutes", SERVER_LOG_CONTEXT4);
11790
11864
  var globalOAuthConfig = null;
11791
11865
  async function POST2(req, context) {
11792
11866
  if (!globalOAuthConfig) {
@@ -11828,7 +11902,7 @@ async function POST2(req, context) {
11828
11902
  }
11829
11903
  return createErrorResponse(`Unknown action: ${action}`, 404);
11830
11904
  } catch (error) {
11831
- logger33.error(`[OAuth ${action}] Error:`, error);
11905
+ logger34.error(`[OAuth ${action}] Error:`, error);
11832
11906
  return createErrorResponse(error.message, 500);
11833
11907
  }
11834
11908
  }
@@ -11856,7 +11930,7 @@ async function GET2(req, context) {
11856
11930
  }
11857
11931
  return createErrorResponse(`Unknown action: ${action}`, 404);
11858
11932
  } catch (error) {
11859
- logger33.error(`[OAuth ${action}] Error:`, error);
11933
+ logger34.error(`[OAuth ${action}] Error:`, error);
11860
11934
  return createErrorResponse(error.message, 500);
11861
11935
  }
11862
11936
  }