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/index.js CHANGED
@@ -1731,6 +1731,7 @@ class MCPClientBase {
1731
1731
  apiRouteBase;
1732
1732
  apiBaseUrl;
1733
1733
  databaseDetected = false;
1734
+ _connectingPromise = null;
1734
1735
  __configuredIntegrations;
1735
1736
  __useServerConfig;
1736
1737
  oauthCallbackPromise;
@@ -2044,6 +2045,17 @@ class MCPClientBase {
2044
2045
  throw parsedError;
2045
2046
  }
2046
2047
  }
2048
+ async ensureConnected() {
2049
+ if (this.isConnected()) {
2050
+ return;
2051
+ }
2052
+ if (!this._connectingPromise) {
2053
+ this._connectingPromise = this.connect().finally(() => {
2054
+ this._connectingPromise = null;
2055
+ });
2056
+ }
2057
+ return this._connectingPromise;
2058
+ }
2047
2059
  async initializeIntegrations() {
2048
2060
  for (const integration of this.integrations) {
2049
2061
  if (integration.onInit) {
@@ -2102,6 +2114,7 @@ class MCPClientBase {
2102
2114
  const transportHeaders = this.transport.headers || {};
2103
2115
  const hasApiKey = !!transportHeaders["X-API-KEY"];
2104
2116
  if (hasApiKey) {
2117
+ await this.ensureConnected();
2105
2118
  if (provider) {
2106
2119
  const tokenData = await this.oauthManager.getProviderToken(provider, undefined, options?.context);
2107
2120
  if (tokenData && this.transport.setHeader) {
@@ -10347,21 +10360,7 @@ var init_ai = __esm(() => {
10347
10360
  init_trigger_tools();
10348
10361
  });
10349
10362
 
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
10363
  // src/triggers/webhooks.ts
10359
- var exports_webhooks = {};
10360
- __export(exports_webhooks, {
10361
- signPayload: () => signPayload,
10362
- deliverWebhooks: () => deliverWebhooks,
10363
- deliverWebhook: () => deliverWebhook
10364
- });
10365
10364
  async function signPayload(payload, secret) {
10366
10365
  const encoder = new TextEncoder;
10367
10366
  const data = encoder.encode(JSON.stringify(payload));
@@ -10410,6 +10409,155 @@ var init_webhooks = __esm(() => {
10410
10409
  logger30 = createLogger("Webhooks", "server");
10411
10410
  });
10412
10411
 
10412
+ // src/triggers/types.ts
10413
+ var MAX_TRIGGER_STEPS = 20, WEBHOOK_DELIVERY_TIMEOUT_MS = 1e4;
10414
+
10415
+ // src/triggers/executor.ts
10416
+ var exports_executor = {};
10417
+ __export(exports_executor, {
10418
+ executeTrigger: () => executeTrigger
10419
+ });
10420
+ async function executeTrigger(trigger, config, context) {
10421
+ const steps = [];
10422
+ let currentToolName = trigger.toolName;
10423
+ let currentToolArguments = trigger.toolArguments;
10424
+ let currentProvider = trigger.provider;
10425
+ let stepIndex = 0;
10426
+ while (stepIndex < MAX_TRIGGER_STEPS) {
10427
+ const stepValidation = validateStepLimit(stepIndex, MAX_TRIGGER_STEPS);
10428
+ if (!stepValidation.valid) {
10429
+ logger31.error(`[Trigger ${trigger.id}] ${stepValidation.error}`);
10430
+ break;
10431
+ }
10432
+ const providerToken = await config.getProviderToken(currentProvider, undefined, context);
10433
+ if (!providerToken) {
10434
+ const error = `No OAuth token available for provider '${currentProvider}'`;
10435
+ logger31.error(`[Trigger ${trigger.id}] ${error}`);
10436
+ steps.push({
10437
+ stepIndex,
10438
+ toolName: currentToolName,
10439
+ success: false,
10440
+ error,
10441
+ duration: 0,
10442
+ executedAt: new Date().toISOString()
10443
+ });
10444
+ await config.triggers.update(trigger.id, {
10445
+ lastRunAt: new Date().toISOString(),
10446
+ runCount: (trigger.runCount || 0) + 1,
10447
+ lastError: error,
10448
+ status: "failed"
10449
+ }, context);
10450
+ return { success: false, steps, error };
10451
+ }
10452
+ const startTime = Date.now();
10453
+ let toolResult;
10454
+ let stepSuccess = true;
10455
+ let stepError;
10456
+ try {
10457
+ toolResult = await config.handleToolCall({ name: currentToolName, arguments: currentToolArguments }, `${providerToken.tokenType || "Bearer"} ${providerToken.accessToken}`, null);
10458
+ } catch (err) {
10459
+ stepSuccess = false;
10460
+ stepError = err.message || "Tool execution failed";
10461
+ logger31.error(`[Trigger ${trigger.id}] Step ${stepIndex} failed:`, err);
10462
+ }
10463
+ const duration = Date.now() - startTime;
10464
+ const executedAt = new Date().toISOString();
10465
+ steps.push({
10466
+ stepIndex,
10467
+ toolName: currentToolName,
10468
+ success: stepSuccess,
10469
+ result: stepSuccess ? toolResult : undefined,
10470
+ error: stepError,
10471
+ duration,
10472
+ executedAt
10473
+ });
10474
+ if (!config.triggers.onComplete || !stepSuccess) {
10475
+ const updates = {
10476
+ lastRunAt: executedAt,
10477
+ runCount: (trigger.runCount || 0) + 1
10478
+ };
10479
+ if (stepSuccess) {
10480
+ updates.lastResult = toolResult;
10481
+ updates.lastError = undefined;
10482
+ if (trigger.schedule.type === "once") {
10483
+ updates.status = "completed";
10484
+ }
10485
+ } else {
10486
+ updates.lastError = stepError;
10487
+ updates.status = "failed";
10488
+ }
10489
+ await config.triggers.update(trigger.id, updates, context);
10490
+ return { success: stepSuccess, steps, error: stepError };
10491
+ }
10492
+ const completeRequest = {
10493
+ success: stepSuccess,
10494
+ result: stepSuccess ? toolResult : undefined,
10495
+ error: stepError,
10496
+ executedAt,
10497
+ duration,
10498
+ stepIndex,
10499
+ previousResults: steps,
10500
+ final: false
10501
+ };
10502
+ const completeResponse = await config.triggers.onComplete({
10503
+ trigger,
10504
+ request: completeRequest,
10505
+ context
10506
+ });
10507
+ if (completeResponse.hasMore && completeResponse.nextStep) {
10508
+ currentToolName = completeResponse.nextStep.toolName;
10509
+ currentToolArguments = completeResponse.nextStep.toolArguments;
10510
+ currentProvider = completeResponse.nextStep.provider;
10511
+ stepIndex++;
10512
+ continue;
10513
+ }
10514
+ const finalUpdates = {
10515
+ lastRunAt: executedAt,
10516
+ runCount: (trigger.runCount || 0) + 1
10517
+ };
10518
+ if (stepSuccess) {
10519
+ finalUpdates.lastResult = toolResult;
10520
+ finalUpdates.lastError = undefined;
10521
+ if (trigger.schedule.type === "once") {
10522
+ finalUpdates.status = "completed";
10523
+ }
10524
+ } else {
10525
+ finalUpdates.lastError = stepError;
10526
+ finalUpdates.status = "failed";
10527
+ }
10528
+ await config.triggers.update(trigger.id, finalUpdates, context);
10529
+ if (completeResponse.webhooks && completeResponse.webhooks.length > 0) {
10530
+ const totalDuration = steps.reduce((sum, s) => sum + (s.duration || 0), 0);
10531
+ const payload = {
10532
+ triggerId: trigger.id,
10533
+ success: steps.every((s) => s.success),
10534
+ steps,
10535
+ totalSteps: steps.length,
10536
+ totalDuration,
10537
+ executedAt
10538
+ };
10539
+ deliverWebhooks(completeResponse.webhooks, payload, WEBHOOK_DELIVERY_TIMEOUT_MS).catch(() => {});
10540
+ }
10541
+ return { success: stepSuccess, steps, error: stepError };
10542
+ }
10543
+ const limitError = `Trigger execution exceeded maximum of ${MAX_TRIGGER_STEPS} steps`;
10544
+ logger31.error(`[Trigger ${trigger.id}] ${limitError}`);
10545
+ await config.triggers.update(trigger.id, {
10546
+ lastRunAt: new Date().toISOString(),
10547
+ runCount: (trigger.runCount || 0) + 1,
10548
+ lastError: limitError,
10549
+ status: "failed"
10550
+ }, context);
10551
+ return { success: false, steps, error: limitError };
10552
+ }
10553
+ var logger31;
10554
+ var init_executor = __esm(() => {
10555
+ init_logger();
10556
+ init_utils2();
10557
+ init_webhooks();
10558
+ logger31 = createLogger("TriggerExecutor", "server");
10559
+ });
10560
+
10413
10561
  // src/server.ts
10414
10562
  var exports_server = {};
10415
10563
  __export(exports_server, {
@@ -10503,7 +10651,7 @@ function createMCPServer(config) {
10503
10651
  if (integration.oauth) {
10504
10652
  const { clientId, clientSecret, redirectUri: integrationRedirectUri, config: oauthConfig } = integration.oauth;
10505
10653
  if (!clientId || !clientSecret) {
10506
- logger31.warn(`Warning: Integration "${integration.id}" is missing OAuth credentials. ` + `Provide clientId and clientSecret in the integration configuration.`);
10654
+ logger32.warn(`Warning: Integration "${integration.id}" is missing OAuth credentials. ` + `Provide clientId and clientSecret in the integration configuration.`);
10507
10655
  return integration;
10508
10656
  }
10509
10657
  const redirectUri = integrationRedirectUri || config.redirectUri || getDefaultRedirectUri();
@@ -10634,7 +10782,7 @@ function createMCPServer(config) {
10634
10782
  }
10635
10783
  return response2;
10636
10784
  } catch (error) {
10637
- logger31.error("[MCP Tool Call] Error:", error);
10785
+ logger32.error("[MCP Tool Call] Error:", error);
10638
10786
  return Response.json({ error: error.message || "Failed to execute tool call" }, { status: error.statusCode || 500 });
10639
10787
  }
10640
10788
  }
@@ -10650,6 +10798,57 @@ function createMCPServer(config) {
10650
10798
  }));
10651
10799
  return Response.json({ integrations });
10652
10800
  }
10801
+ if (segments.length === 2 && segments[0] === "triggers" && segments[1] === "notify" && method === "POST") {
10802
+ if (!config.triggers) {
10803
+ return Response.json({ error: "Triggers not configured. Add triggers callbacks to createMCPServer config." }, { status: 501 });
10804
+ }
10805
+ try {
10806
+ const apiKey = webRequest.headers.get("x-api-key");
10807
+ if (!apiKey || apiKey !== config.apiKey) {
10808
+ return Response.json({ error: "Unauthorized" }, { status: 401 });
10809
+ }
10810
+ const body = await webRequest.json();
10811
+ const { triggerId } = body;
10812
+ if (!triggerId) {
10813
+ return Response.json({ error: "triggerId is required" }, { status: 400 });
10814
+ }
10815
+ const trigger = await config.triggers.get(triggerId);
10816
+ if (!trigger) {
10817
+ return Response.json({ error: "Trigger not found" }, { status: 404 });
10818
+ }
10819
+ if (!trigger.provider) {
10820
+ return Response.json({ error: "Trigger has no provider configured" }, { status: 400 });
10821
+ }
10822
+ const triggerContext = trigger.userId ? { userId: trigger.userId } : undefined;
10823
+ const { executeTrigger: executeTrigger2 } = await Promise.resolve().then(() => (init_executor(), exports_executor));
10824
+ const { OAuthHandler: OAuthHandler2 } = await Promise.resolve().then(() => (init_base_handler(), exports_base_handler));
10825
+ const oauthHandler = new OAuthHandler2({
10826
+ providers,
10827
+ serverUrl: config.serverUrl,
10828
+ apiKey: config.apiKey,
10829
+ setProviderToken: config.setProviderToken,
10830
+ removeProviderToken: config.removeProviderToken,
10831
+ getSessionContext: config.getSessionContext
10832
+ });
10833
+ const executionResult = await executeTrigger2(trigger, {
10834
+ triggers: config.triggers,
10835
+ getProviderToken: async (provider, email, ctx) => {
10836
+ return config.getProviderToken ? await config.getProviderToken(provider, email, ctx) : undefined;
10837
+ },
10838
+ handleToolCall: (toolBody, authHeader, integrationsHeader) => {
10839
+ return oauthHandler.handleToolCall(toolBody, authHeader, integrationsHeader);
10840
+ }
10841
+ }, triggerContext);
10842
+ return Response.json({
10843
+ success: executionResult.success,
10844
+ steps: executionResult.steps,
10845
+ error: executionResult.error
10846
+ });
10847
+ } catch (error) {
10848
+ logger32.error("[Trigger Notify] Error:", error);
10849
+ return Response.json({ error: error.message || "Failed to execute trigger" }, { status: 500 });
10850
+ }
10851
+ }
10653
10852
  if (segments.length >= 1 && segments[0] === "triggers") {
10654
10853
  if (!config.triggers) {
10655
10854
  return Response.json({ error: "Triggers not configured. Add triggers callbacks to createMCPServer config." }, { status: 501 });
@@ -10690,8 +10889,9 @@ function createMCPServer(config) {
10690
10889
  };
10691
10890
  const created = await config.triggers.create(trigger, context2);
10692
10891
  const schedulerUrl = config.schedulerUrl || config.serverUrl || "https://mcp.integrate.dev";
10693
- const callbackBaseUrl = process.env.INTEGRATE_URL || (typeof window !== "undefined" ? window.location.origin : "http://localhost:3000");
10892
+ const defaultCallbackBaseUrl = process.env.INTEGRATE_URL || (typeof window !== "undefined" ? window.location.origin : "http://localhost:3000");
10694
10893
  try {
10894
+ const callbackBaseUrl = config.triggers.getCallbackUrl ? await config.triggers.getCallbackUrl(context2) : defaultCallbackBaseUrl;
10695
10895
  await fetch(`${schedulerUrl}/scheduler/register`, {
10696
10896
  method: "POST",
10697
10897
  headers: {
@@ -10701,8 +10901,7 @@ function createMCPServer(config) {
10701
10901
  body: JSON.stringify({
10702
10902
  triggerId: created.id,
10703
10903
  schedule: created.schedule,
10704
- callbackUrl: `${callbackBaseUrl}/api/integrate/triggers/${created.id}/execute`,
10705
- completeUrl: `${callbackBaseUrl}/api/integrate/triggers/${created.id}/complete`,
10904
+ callbackUrl: `${callbackBaseUrl}/api/integrate/triggers/notify`,
10706
10905
  metadata: {
10707
10906
  userId: context2?.userId,
10708
10907
  provider: created.provider
@@ -10710,7 +10909,7 @@ function createMCPServer(config) {
10710
10909
  })
10711
10910
  });
10712
10911
  } catch (scheduleError) {
10713
- logger31.error("[Trigger] Failed to register with scheduler:", scheduleError);
10912
+ logger32.error("[Trigger] Failed to register with scheduler:", scheduleError);
10714
10913
  }
10715
10914
  return Response.json(created, { status: 201 });
10716
10915
  }
@@ -10745,7 +10944,7 @@ function createMCPServer(config) {
10745
10944
  body: JSON.stringify({ triggerId })
10746
10945
  });
10747
10946
  } catch (error) {
10748
- logger31.error("[Trigger] Failed to pause in scheduler:", error);
10947
+ logger32.error("[Trigger] Failed to pause in scheduler:", error);
10749
10948
  }
10750
10949
  return Response.json(updated);
10751
10950
  } else if (subAction === "resume" && method === "POST") {
@@ -10773,7 +10972,7 @@ function createMCPServer(config) {
10773
10972
  body: JSON.stringify({ triggerId })
10774
10973
  });
10775
10974
  } catch (error) {
10776
- logger31.error("[Trigger] Failed to resume in scheduler:", error);
10975
+ logger32.error("[Trigger] Failed to resume in scheduler:", error);
10777
10976
  }
10778
10977
  return Response.json(updated);
10779
10978
  } else if (subAction === "run" && method === "POST") {
@@ -10784,10 +10983,7 @@ function createMCPServer(config) {
10784
10983
  if (!trigger.provider) {
10785
10984
  return Response.json({ error: "Trigger has no provider configured" }, { status: 400 });
10786
10985
  }
10787
- const providerToken = config.getProviderToken ? await config.getProviderToken(trigger.provider, undefined, context2) : undefined;
10788
- if (!providerToken) {
10789
- return Response.json({ error: "No OAuth token available for this trigger" }, { status: 401 });
10790
- }
10986
+ const { executeTrigger: executeTrigger2 } = await Promise.resolve().then(() => (init_executor(), exports_executor));
10791
10987
  const { OAuthHandler: OAuthHandler2 } = await Promise.resolve().then(() => (init_base_handler(), exports_base_handler));
10792
10988
  const oauthHandler = new OAuthHandler2({
10793
10989
  providers,
@@ -10797,145 +10993,23 @@ function createMCPServer(config) {
10797
10993
  removeProviderToken: config.removeProviderToken,
10798
10994
  getSessionContext: config.getSessionContext
10799
10995
  });
10800
- const startTime = Date.now();
10801
- try {
10802
- const result = await oauthHandler.handleToolCall({ name: trigger.toolName, arguments: trigger.toolArguments }, `Bearer ${providerToken.accessToken}`, null);
10803
- const duration = Date.now() - startTime;
10804
- const executionResult = {
10805
- success: true,
10806
- result,
10807
- executedAt: new Date().toISOString(),
10808
- duration
10809
- };
10810
- await config.triggers.update(triggerId, {
10811
- lastRunAt: executionResult.executedAt,
10812
- runCount: (trigger.runCount || 0) + 1,
10813
- lastResult: result,
10814
- lastError: undefined
10815
- }, context2);
10816
- return Response.json(executionResult);
10817
- } catch (error) {
10818
- const duration = Date.now() - startTime;
10819
- const executionResult = {
10820
- success: false,
10821
- error: error.message || "Tool execution failed",
10822
- executedAt: new Date().toISOString(),
10823
- duration
10824
- };
10825
- await config.triggers.update(triggerId, {
10826
- lastRunAt: executionResult.executedAt,
10827
- runCount: (trigger.runCount || 0) + 1,
10828
- lastError: error.message,
10829
- status: "failed"
10830
- }, context2);
10831
- return Response.json(executionResult, { status: 500 });
10832
- }
10833
- } else if (subAction === "execute" && method === "GET") {
10834
- const apiKey = webRequest.headers.get("x-api-key");
10835
- if (!apiKey || apiKey !== config.apiKey) {
10836
- return Response.json({ error: "Unauthorized" }, { status: 401 });
10837
- }
10838
- const trigger = await config.triggers.get(triggerId, context2);
10839
- if (!trigger) {
10840
- return Response.json({ error: "Trigger not found" }, { status: 404 });
10841
- }
10842
- if (!trigger.provider) {
10843
- return Response.json({ error: "Trigger has no provider configured" }, { status: 400 });
10844
- }
10845
- const providerToken = config.getProviderToken ? await config.getProviderToken(trigger.provider, undefined, context2) : undefined;
10846
- if (!providerToken) {
10847
- return Response.json({ error: "No OAuth token available for this trigger" }, { status: 401 });
10848
- }
10849
- return Response.json({
10850
- trigger: {
10851
- id: trigger.id,
10852
- toolName: trigger.toolName,
10853
- toolArguments: trigger.toolArguments,
10854
- provider: trigger.provider
10996
+ const executionResult = await executeTrigger2(trigger, {
10997
+ triggers: config.triggers,
10998
+ getProviderToken: async (provider, email, ctx) => {
10999
+ return config.getProviderToken ? await config.getProviderToken(provider, email, ctx) : undefined;
10855
11000
  },
10856
- accessToken: providerToken.accessToken,
10857
- tokenType: providerToken.tokenType || "Bearer"
10858
- });
10859
- } else if (subAction === "complete" && method === "POST") {
10860
- const apiKey = webRequest.headers.get("x-api-key");
10861
- if (!apiKey || apiKey !== config.apiKey) {
10862
- return Response.json({ error: "Unauthorized" }, { status: 401 });
10863
- }
10864
- const body = await webRequest.json();
10865
- const trigger = await config.triggers.get(triggerId, context2);
10866
- if (!trigger) {
10867
- return Response.json({ error: "Trigger not found" }, { status: 404 });
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 });
11001
+ handleToolCall: (toolBody, authHeader, integrationsHeader) => {
11002
+ return oauthHandler.handleToolCall(toolBody, authHeader, integrationsHeader);
10875
11003
  }
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
- }
10923
- const updates = {
10924
- lastRunAt: body.executedAt,
10925
- runCount: (trigger.runCount || 0) + 1
10926
- };
10927
- if (body.success) {
10928
- updates.lastResult = body.result;
10929
- updates.lastError = undefined;
10930
- if (trigger.schedule.type === "once") {
10931
- updates.status = "completed";
10932
- }
10933
- } else {
10934
- updates.lastError = body.error;
10935
- updates.status = "failed";
10936
- }
10937
- await config.triggers.update(triggerId, updates, context2);
10938
- return Response.json({ success: true });
11004
+ }, context2);
11005
+ return Response.json({
11006
+ success: executionResult.success,
11007
+ result: executionResult.steps[0]?.result,
11008
+ executedAt: executionResult.steps[0]?.executedAt || new Date().toISOString(),
11009
+ duration: executionResult.steps[0]?.duration,
11010
+ error: executionResult.error,
11011
+ steps: executionResult.steps
11012
+ }, { status: executionResult.success ? 200 : 500 });
10939
11013
  } else if (!subAction && method === "GET") {
10940
11014
  const trigger = await config.triggers.get(triggerId, context2);
10941
11015
  if (!trigger) {
@@ -10968,7 +11042,7 @@ function createMCPServer(config) {
10968
11042
  })
10969
11043
  });
10970
11044
  } catch (error) {
10971
- logger31.error("[Trigger] Failed to update scheduler:", error);
11045
+ logger32.error("[Trigger] Failed to update scheduler:", error);
10972
11046
  }
10973
11047
  }
10974
11048
  return Response.json(updated);
@@ -10985,14 +11059,14 @@ function createMCPServer(config) {
10985
11059
  body: JSON.stringify({ triggerId })
10986
11060
  });
10987
11061
  } catch (error) {
10988
- logger31.error("[Trigger] Failed to unregister from scheduler:", error);
11062
+ logger32.error("[Trigger] Failed to unregister from scheduler:", error);
10989
11063
  }
10990
11064
  return new Response(null, { status: 204 });
10991
11065
  }
10992
11066
  }
10993
11067
  return Response.json({ error: "Invalid trigger route or method" }, { status: 404 });
10994
11068
  } catch (error) {
10995
- logger31.error("[Trigger] Error:", error);
11069
+ logger32.error("[Trigger] Error:", error);
10996
11070
  return Response.json({ error: error.message || "Failed to process trigger request" }, { status: error.statusCode || 500 });
10997
11071
  }
10998
11072
  }
@@ -11018,11 +11092,11 @@ function createMCPServer(config) {
11018
11092
  const errorRedirectUrl = "/auth-error";
11019
11093
  if (error) {
11020
11094
  const errorMsg = errorDescription || error;
11021
- logger31.error("[OAuth Redirect] Error:", errorMsg);
11095
+ logger32.error("[OAuth Redirect] Error:", errorMsg);
11022
11096
  return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent(errorMsg)}`, webRequest.url));
11023
11097
  }
11024
11098
  if (!code || !state) {
11025
- logger31.error("[OAuth Redirect] Missing code or state parameter");
11099
+ logger32.error("[OAuth Redirect] Missing code or state parameter");
11026
11100
  return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent("Invalid OAuth callback")}`, webRequest.url));
11027
11101
  }
11028
11102
  let returnUrl = defaultRedirectUrl;
@@ -11098,7 +11172,7 @@ function createMCPServer(config) {
11098
11172
  frontendUrl.hash = `oauth_callback=${encodeURIComponent(JSON.stringify({ code, state, tokenData }))}`;
11099
11173
  return Response.redirect(frontendUrl);
11100
11174
  } catch (error2) {
11101
- logger31.error("[OAuth Backend Callback] Error:", error2);
11175
+ logger32.error("[OAuth Backend Callback] Error:", error2);
11102
11176
  return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent(error2.message || "Failed to exchange token")}`, webRequest.url));
11103
11177
  }
11104
11178
  } else {
@@ -11317,7 +11391,7 @@ function toSvelteKitHandler(clientOrHandlerOrOptions, _redirectOptions) {
11317
11391
  }
11318
11392
  };
11319
11393
  }
11320
- var SERVER_LOG_CONTEXT2 = "server", logger31, globalServerConfig = null, codeVerifierStorage, POST = async (req, context) => {
11394
+ var SERVER_LOG_CONTEXT2 = "server", logger32, globalServerConfig = null, codeVerifierStorage, POST = async (req, context) => {
11321
11395
  if (!globalServerConfig) {
11322
11396
  return Response.json({ error: "OAuth not configured. Call createMCPServer() in your server initialization file first." }, { status: 500 });
11323
11397
  }
@@ -11365,7 +11439,7 @@ var init_server = __esm(() => {
11365
11439
  init_anthropic();
11366
11440
  init_google();
11367
11441
  init_ai();
11368
- logger31 = createLogger("MCPServer", SERVER_LOG_CONTEXT2);
11442
+ logger32 = createLogger("MCPServer", SERVER_LOG_CONTEXT2);
11369
11443
  codeVerifierStorage = new Map;
11370
11444
  });
11371
11445
 
@@ -11716,7 +11790,7 @@ class OAuthHandler {
11716
11790
  url.searchParams.set("state", authorizeRequest.state);
11717
11791
  url.searchParams.set("code_challenge", authorizeRequest.codeChallenge);
11718
11792
  url.searchParams.set("code_challenge_method", authorizeRequest.codeChallengeMethod);
11719
- const redirectUri = authorizeRequest.redirectUri || providerConfig.redirectUri;
11793
+ const redirectUri = providerConfig.redirectUri;
11720
11794
  if (redirectUri) {
11721
11795
  url.searchParams.set("redirect_uri", redirectUri);
11722
11796
  }
@@ -11828,7 +11902,7 @@ class OAuthHandler {
11828
11902
  tokenType: result.tokenType,
11829
11903
  expiresIn: result.expiresIn,
11830
11904
  expiresAt: result.expiresAt,
11831
- scopes: result.scopes
11905
+ scopes: result.scopes ? result.scopes.flatMap((s) => s.split(" ").filter(Boolean)) : result.scopes
11832
11906
  };
11833
11907
  await this.config.setProviderToken(callbackRequest.provider, tokenData, undefined, context);
11834
11908
  } catch (error) {}
@@ -11878,11 +11952,11 @@ class OAuthHandler {
11878
11952
  try {
11879
11953
  await this.config.removeProviderToken(request.provider, undefined, context);
11880
11954
  } catch (error) {
11881
- logger32.error(`Failed to delete token for ${request.provider} from database via removeProviderToken:`, error);
11955
+ logger33.error(`Failed to delete token for ${request.provider} from database via removeProviderToken:`, error);
11882
11956
  }
11883
11957
  }
11884
11958
  } catch (error) {
11885
- logger32.error(`Failed to extract context for disconnect:`, error);
11959
+ logger33.error(`Failed to extract context for disconnect:`, error);
11886
11960
  }
11887
11961
  }
11888
11962
  const url = new URL("/oauth/disconnect", this.serverUrl);
@@ -11942,10 +12016,10 @@ class OAuthHandler {
11942
12016
  return jsonRpcResponse.result;
11943
12017
  }
11944
12018
  }
11945
- var SERVER_LOG_CONTEXT3 = "server", logger32, MCP_SERVER_URL2 = "https://mcp.integrate.dev/api/v1/mcp";
12019
+ var SERVER_LOG_CONTEXT3 = "server", logger33, MCP_SERVER_URL2 = "https://mcp.integrate.dev/api/v1/mcp";
11946
12020
  var init_base_handler = __esm(() => {
11947
12021
  init_logger();
11948
- logger32 = createLogger("OAuthHandler", SERVER_LOG_CONTEXT3);
12022
+ logger33 = createLogger("OAuthHandler", SERVER_LOG_CONTEXT3);
11949
12023
  });
11950
12024
 
11951
12025
  // src/index.ts
@@ -11958,7 +12032,7 @@ init_nextjs();
11958
12032
  // src/adapters/nextjs-oauth-redirect.ts
11959
12033
  init_logger();
11960
12034
  var SERVER_LOG_CONTEXT4 = "server";
11961
- var logger33 = createLogger("OAuthRedirect", SERVER_LOG_CONTEXT4);
12035
+ var logger34 = createLogger("OAuthRedirect", SERVER_LOG_CONTEXT4);
11962
12036
  function createOAuthRedirectHandler(config) {
11963
12037
  const defaultRedirectUrl = config?.redirectUrl || "/";
11964
12038
  const errorRedirectUrl = config?.errorRedirectUrl || "/auth-error";
@@ -11970,11 +12044,11 @@ function createOAuthRedirectHandler(config) {
11970
12044
  const errorDescription = searchParams.get("error_description");
11971
12045
  if (error) {
11972
12046
  const errorMsg = errorDescription || error;
11973
- logger33.error("[OAuth Redirect] Error:", errorMsg);
12047
+ logger34.error("[OAuth Redirect] Error:", errorMsg);
11974
12048
  return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent(errorMsg)}`, req.url));
11975
12049
  }
11976
12050
  if (!code || !state) {
11977
- logger33.error("[OAuth Redirect] Missing code or state parameter");
12051
+ logger34.error("[OAuth Redirect] Missing code or state parameter");
11978
12052
  return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent("Invalid OAuth callback")}`, req.url));
11979
12053
  }
11980
12054
  let returnUrl = defaultRedirectUrl;