integrate-sdk 0.8.60-dev.0 → 0.8.62-dev.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -7924,6 +7924,7 @@ var init_nanoid = __esm(() => {
7924
7924
  // ../triggers/utils.ts
7925
7925
  var exports_utils = {};
7926
7926
  __export(exports_utils, {
7927
+ validateStepLimit: () => validateStepLimit,
7927
7928
  validateStatusTransition: () => validateStatusTransition,
7928
7929
  generateTriggerId: () => generateTriggerId,
7929
7930
  extractProviderFromToolName: () => extractProviderFromToolName,
@@ -7951,6 +7952,15 @@ function validateStatusTransition(currentStatus, targetStatus) {
7951
7952
  }
7952
7953
  return { valid: true };
7953
7954
  }
7955
+ function validateStepLimit(stepIndex, maxSteps) {
7956
+ if (stepIndex >= maxSteps) {
7957
+ return {
7958
+ valid: false,
7959
+ error: `Step index ${stepIndex} exceeds maximum of ${maxSteps} steps`
7960
+ };
7961
+ }
7962
+ return { valid: true };
7963
+ }
7954
7964
  function calculateHasMore(offset, returnedCount, total) {
7955
7965
  return offset + returnedCount < total;
7956
7966
  }
@@ -9958,6 +9968,204 @@ var init_ai = __esm(() => {
9958
9968
  init_trigger_tools();
9959
9969
  });
9960
9970
 
9971
+ // ../triggers/webhooks.ts
9972
+ async function signPayload(payload, secret) {
9973
+ const encoder = new TextEncoder;
9974
+ const data = encoder.encode(JSON.stringify(payload));
9975
+ const key = await crypto.subtle.importKey("raw", encoder.encode(secret), { name: "HMAC", hash: "SHA-256" }, false, ["sign"]);
9976
+ const signature = await crypto.subtle.sign("HMAC", key, data);
9977
+ return Array.from(new Uint8Array(signature)).map((b) => b.toString(16).padStart(2, "0")).join("");
9978
+ }
9979
+ async function deliverWebhook(webhook, payload, timeoutMs) {
9980
+ const headers = {
9981
+ "Content-Type": "application/json",
9982
+ ...webhook.headers
9983
+ };
9984
+ if (webhook.secret) {
9985
+ headers["X-Webhook-Signature"] = await signPayload(payload, webhook.secret);
9986
+ }
9987
+ const controller = new AbortController;
9988
+ const timeout = setTimeout(() => controller.abort(), timeoutMs);
9989
+ try {
9990
+ const response = await fetch(webhook.url, {
9991
+ method: "POST",
9992
+ headers,
9993
+ body: JSON.stringify(payload),
9994
+ signal: controller.signal
9995
+ });
9996
+ if (!response.ok) {
9997
+ logger29.warn(`Webhook delivery to ${webhook.url} returned ${response.status}`);
9998
+ }
9999
+ } finally {
10000
+ clearTimeout(timeout);
10001
+ }
10002
+ }
10003
+ async function deliverWebhooks(webhooks, payload, timeoutMs) {
10004
+ if (webhooks.length === 0)
10005
+ return;
10006
+ const results = await Promise.allSettled(webhooks.map((webhook) => deliverWebhook(webhook, payload, timeoutMs)));
10007
+ for (let i = 0;i < results.length; i++) {
10008
+ const result = results[i];
10009
+ if (result.status === "rejected") {
10010
+ logger29.warn(`Webhook delivery to ${webhooks[i].url} failed:`, result.reason);
10011
+ }
10012
+ }
10013
+ }
10014
+ var logger29;
10015
+ var init_webhooks = __esm(() => {
10016
+ init_logger();
10017
+ logger29 = createLogger("Webhooks", "server");
10018
+ });
10019
+
10020
+ // ../triggers/types.ts
10021
+ var MAX_TRIGGER_STEPS = 20, WEBHOOK_DELIVERY_TIMEOUT_MS = 1e4;
10022
+
10023
+ // ../triggers/executor.ts
10024
+ var exports_executor = {};
10025
+ __export(exports_executor, {
10026
+ executeTrigger: () => executeTrigger
10027
+ });
10028
+ async function executeTrigger(trigger, config, context) {
10029
+ const steps = [];
10030
+ let currentToolName = trigger.toolName;
10031
+ let currentToolArguments = trigger.toolArguments;
10032
+ let currentProvider = trigger.provider;
10033
+ let stepIndex = 0;
10034
+ while (stepIndex < MAX_TRIGGER_STEPS) {
10035
+ const stepValidation = validateStepLimit(stepIndex, MAX_TRIGGER_STEPS);
10036
+ if (!stepValidation.valid) {
10037
+ logger30.error(`[Trigger ${trigger.id}] ${stepValidation.error}`);
10038
+ break;
10039
+ }
10040
+ const providerToken = await config.getProviderToken(currentProvider, undefined, context);
10041
+ if (!providerToken) {
10042
+ const error = `No OAuth token available for provider '${currentProvider}'`;
10043
+ logger30.error(`[Trigger ${trigger.id}] ${error}`);
10044
+ steps.push({
10045
+ stepIndex,
10046
+ toolName: currentToolName,
10047
+ success: false,
10048
+ error,
10049
+ duration: 0,
10050
+ executedAt: new Date().toISOString()
10051
+ });
10052
+ await config.triggers.update(trigger.id, {
10053
+ lastRunAt: new Date().toISOString(),
10054
+ runCount: (trigger.runCount || 0) + 1,
10055
+ lastError: error,
10056
+ status: "failed"
10057
+ }, context);
10058
+ return { success: false, steps, error };
10059
+ }
10060
+ const startTime = Date.now();
10061
+ let toolResult;
10062
+ let stepSuccess = true;
10063
+ let stepError;
10064
+ try {
10065
+ toolResult = await config.handleToolCall({ name: currentToolName, arguments: currentToolArguments }, `${providerToken.tokenType || "Bearer"} ${providerToken.accessToken}`, null);
10066
+ } catch (err) {
10067
+ stepSuccess = false;
10068
+ stepError = err.message || "Tool execution failed";
10069
+ logger30.error(`[Trigger ${trigger.id}] Step ${stepIndex} failed:`, err);
10070
+ }
10071
+ const duration = Date.now() - startTime;
10072
+ const executedAt = new Date().toISOString();
10073
+ steps.push({
10074
+ stepIndex,
10075
+ toolName: currentToolName,
10076
+ success: stepSuccess,
10077
+ result: stepSuccess ? toolResult : undefined,
10078
+ error: stepError,
10079
+ duration,
10080
+ executedAt
10081
+ });
10082
+ if (!config.triggers.onComplete || !stepSuccess) {
10083
+ const updates = {
10084
+ lastRunAt: executedAt,
10085
+ runCount: (trigger.runCount || 0) + 1
10086
+ };
10087
+ if (stepSuccess) {
10088
+ updates.lastResult = toolResult;
10089
+ updates.lastError = undefined;
10090
+ if (trigger.schedule.type === "once") {
10091
+ updates.status = "completed";
10092
+ }
10093
+ } else {
10094
+ updates.lastError = stepError;
10095
+ updates.status = "failed";
10096
+ }
10097
+ await config.triggers.update(trigger.id, updates, context);
10098
+ return { success: stepSuccess, steps, error: stepError };
10099
+ }
10100
+ const completeRequest = {
10101
+ success: stepSuccess,
10102
+ result: stepSuccess ? toolResult : undefined,
10103
+ error: stepError,
10104
+ executedAt,
10105
+ duration,
10106
+ stepIndex,
10107
+ previousResults: steps,
10108
+ final: false
10109
+ };
10110
+ const completeResponse = await config.triggers.onComplete({
10111
+ trigger,
10112
+ request: completeRequest,
10113
+ context
10114
+ });
10115
+ if (completeResponse.hasMore && completeResponse.nextStep) {
10116
+ currentToolName = completeResponse.nextStep.toolName;
10117
+ currentToolArguments = completeResponse.nextStep.toolArguments;
10118
+ currentProvider = completeResponse.nextStep.provider;
10119
+ stepIndex++;
10120
+ continue;
10121
+ }
10122
+ const finalUpdates = {
10123
+ lastRunAt: executedAt,
10124
+ runCount: (trigger.runCount || 0) + 1
10125
+ };
10126
+ if (stepSuccess) {
10127
+ finalUpdates.lastResult = toolResult;
10128
+ finalUpdates.lastError = undefined;
10129
+ if (trigger.schedule.type === "once") {
10130
+ finalUpdates.status = "completed";
10131
+ }
10132
+ } else {
10133
+ finalUpdates.lastError = stepError;
10134
+ finalUpdates.status = "failed";
10135
+ }
10136
+ await config.triggers.update(trigger.id, finalUpdates, context);
10137
+ if (completeResponse.webhooks && completeResponse.webhooks.length > 0) {
10138
+ const totalDuration = steps.reduce((sum, s) => sum + (s.duration || 0), 0);
10139
+ const payload = {
10140
+ triggerId: trigger.id,
10141
+ success: steps.every((s) => s.success),
10142
+ steps,
10143
+ totalSteps: steps.length,
10144
+ totalDuration,
10145
+ executedAt
10146
+ };
10147
+ deliverWebhooks(completeResponse.webhooks, payload, WEBHOOK_DELIVERY_TIMEOUT_MS).catch(() => {});
10148
+ }
10149
+ return { success: stepSuccess, steps, error: stepError };
10150
+ }
10151
+ const limitError = `Trigger execution exceeded maximum of ${MAX_TRIGGER_STEPS} steps`;
10152
+ logger30.error(`[Trigger ${trigger.id}] ${limitError}`);
10153
+ await config.triggers.update(trigger.id, {
10154
+ lastRunAt: new Date().toISOString(),
10155
+ runCount: (trigger.runCount || 0) + 1,
10156
+ lastError: limitError,
10157
+ status: "failed"
10158
+ }, context);
10159
+ return { success: false, steps, error: limitError };
10160
+ }
10161
+ var logger30;
10162
+ var init_executor = __esm(() => {
10163
+ init_logger();
10164
+ init_utils2();
10165
+ init_webhooks();
10166
+ logger30 = createLogger("TriggerExecutor", "server");
10167
+ });
10168
+
9961
10169
  // ../server.ts
9962
10170
  var exports_server = {};
9963
10171
  __export(exports_server, {
@@ -10051,7 +10259,7 @@ function createMCPServer(config) {
10051
10259
  if (integration.oauth) {
10052
10260
  const { clientId, clientSecret, redirectUri: integrationRedirectUri, config: oauthConfig } = integration.oauth;
10053
10261
  if (!clientId || !clientSecret) {
10054
- logger29.warn(`Warning: Integration "${integration.id}" is missing OAuth credentials. ` + `Provide clientId and clientSecret in the integration configuration.`);
10262
+ logger31.warn(`Warning: Integration "${integration.id}" is missing OAuth credentials. ` + `Provide clientId and clientSecret in the integration configuration.`);
10055
10263
  return integration;
10056
10264
  }
10057
10265
  const redirectUri = integrationRedirectUri || config.redirectUri || getDefaultRedirectUri();
@@ -10182,7 +10390,7 @@ function createMCPServer(config) {
10182
10390
  }
10183
10391
  return response2;
10184
10392
  } catch (error) {
10185
- logger29.error("[MCP Tool Call] Error:", error);
10393
+ logger31.error("[MCP Tool Call] Error:", error);
10186
10394
  return Response.json({ error: error.message || "Failed to execute tool call" }, { status: error.statusCode || 500 });
10187
10395
  }
10188
10396
  }
@@ -10198,6 +10406,57 @@ function createMCPServer(config) {
10198
10406
  }));
10199
10407
  return Response.json({ integrations });
10200
10408
  }
10409
+ if (segments.length === 2 && segments[0] === "triggers" && segments[1] === "notify" && method === "POST") {
10410
+ if (!config.triggers) {
10411
+ return Response.json({ error: "Triggers not configured. Add triggers callbacks to createMCPServer config." }, { status: 501 });
10412
+ }
10413
+ try {
10414
+ const apiKey = webRequest.headers.get("x-api-key");
10415
+ if (!apiKey || apiKey !== config.apiKey) {
10416
+ return Response.json({ error: "Unauthorized" }, { status: 401 });
10417
+ }
10418
+ const body = await webRequest.json();
10419
+ const { triggerId } = body;
10420
+ if (!triggerId) {
10421
+ return Response.json({ error: "triggerId is required" }, { status: 400 });
10422
+ }
10423
+ const trigger = await config.triggers.get(triggerId);
10424
+ if (!trigger) {
10425
+ return Response.json({ error: "Trigger not found" }, { status: 404 });
10426
+ }
10427
+ if (!trigger.provider) {
10428
+ return Response.json({ error: "Trigger has no provider configured" }, { status: 400 });
10429
+ }
10430
+ const triggerContext = trigger.userId ? { userId: trigger.userId } : undefined;
10431
+ const { executeTrigger: executeTrigger2 } = await Promise.resolve().then(() => (init_executor(), exports_executor));
10432
+ const { OAuthHandler } = await Promise.resolve().then(() => (init_base_handler(), exports_base_handler));
10433
+ const oauthHandler = new OAuthHandler({
10434
+ providers,
10435
+ serverUrl: config.serverUrl,
10436
+ apiKey: config.apiKey,
10437
+ setProviderToken: config.setProviderToken,
10438
+ removeProviderToken: config.removeProviderToken,
10439
+ getSessionContext: config.getSessionContext
10440
+ });
10441
+ const executionResult = await executeTrigger2(trigger, {
10442
+ triggers: config.triggers,
10443
+ getProviderToken: async (provider, email, ctx) => {
10444
+ return config.getProviderToken ? await config.getProviderToken(provider, email, ctx) : undefined;
10445
+ },
10446
+ handleToolCall: (toolBody, authHeader, integrationsHeader) => {
10447
+ return oauthHandler.handleToolCall(toolBody, authHeader, integrationsHeader);
10448
+ }
10449
+ }, triggerContext);
10450
+ return Response.json({
10451
+ success: executionResult.success,
10452
+ steps: executionResult.steps,
10453
+ error: executionResult.error
10454
+ });
10455
+ } catch (error) {
10456
+ logger31.error("[Trigger Notify] Error:", error);
10457
+ return Response.json({ error: error.message || "Failed to execute trigger" }, { status: 500 });
10458
+ }
10459
+ }
10201
10460
  if (segments.length >= 1 && segments[0] === "triggers") {
10202
10461
  if (!config.triggers) {
10203
10462
  return Response.json({ error: "Triggers not configured. Add triggers callbacks to createMCPServer config." }, { status: 501 });
@@ -10238,8 +10497,9 @@ function createMCPServer(config) {
10238
10497
  };
10239
10498
  const created = await config.triggers.create(trigger, context2);
10240
10499
  const schedulerUrl = config.schedulerUrl || config.serverUrl || "https://mcp.integrate.dev";
10241
- const callbackBaseUrl = process.env.INTEGRATE_URL || (typeof window !== "undefined" ? window.location.origin : "http://localhost:3000");
10500
+ const defaultCallbackBaseUrl = process.env.INTEGRATE_URL || (typeof window !== "undefined" ? window.location.origin : "http://localhost:3000");
10242
10501
  try {
10502
+ const callbackBaseUrl = config.triggers.getCallbackUrl ? await config.triggers.getCallbackUrl(context2) : defaultCallbackBaseUrl;
10243
10503
  await fetch(`${schedulerUrl}/scheduler/register`, {
10244
10504
  method: "POST",
10245
10505
  headers: {
@@ -10249,8 +10509,7 @@ function createMCPServer(config) {
10249
10509
  body: JSON.stringify({
10250
10510
  triggerId: created.id,
10251
10511
  schedule: created.schedule,
10252
- callbackUrl: `${callbackBaseUrl}/api/integrate/triggers/${created.id}/execute`,
10253
- completeUrl: `${callbackBaseUrl}/api/integrate/triggers/${created.id}/complete`,
10512
+ callbackUrl: `${callbackBaseUrl}/api/integrate/triggers/notify`,
10254
10513
  metadata: {
10255
10514
  userId: context2?.userId,
10256
10515
  provider: created.provider
@@ -10258,7 +10517,7 @@ function createMCPServer(config) {
10258
10517
  })
10259
10518
  });
10260
10519
  } catch (scheduleError) {
10261
- logger29.error("[Trigger] Failed to register with scheduler:", scheduleError);
10520
+ logger31.error("[Trigger] Failed to register with scheduler:", scheduleError);
10262
10521
  }
10263
10522
  return Response.json(created, { status: 201 });
10264
10523
  }
@@ -10293,7 +10552,7 @@ function createMCPServer(config) {
10293
10552
  body: JSON.stringify({ triggerId })
10294
10553
  });
10295
10554
  } catch (error) {
10296
- logger29.error("[Trigger] Failed to pause in scheduler:", error);
10555
+ logger31.error("[Trigger] Failed to pause in scheduler:", error);
10297
10556
  }
10298
10557
  return Response.json(updated);
10299
10558
  } else if (subAction === "resume" && method === "POST") {
@@ -10321,7 +10580,7 @@ function createMCPServer(config) {
10321
10580
  body: JSON.stringify({ triggerId })
10322
10581
  });
10323
10582
  } catch (error) {
10324
- logger29.error("[Trigger] Failed to resume in scheduler:", error);
10583
+ logger31.error("[Trigger] Failed to resume in scheduler:", error);
10325
10584
  }
10326
10585
  return Response.json(updated);
10327
10586
  } else if (subAction === "run" && method === "POST") {
@@ -10332,10 +10591,7 @@ function createMCPServer(config) {
10332
10591
  if (!trigger.provider) {
10333
10592
  return Response.json({ error: "Trigger has no provider configured" }, { status: 400 });
10334
10593
  }
10335
- const providerToken = config.getProviderToken ? await config.getProviderToken(trigger.provider, undefined, context2) : undefined;
10336
- if (!providerToken) {
10337
- return Response.json({ error: "No OAuth token available for this trigger" }, { status: 401 });
10338
- }
10594
+ const { executeTrigger: executeTrigger2 } = await Promise.resolve().then(() => (init_executor(), exports_executor));
10339
10595
  const { OAuthHandler } = await Promise.resolve().then(() => (init_base_handler(), exports_base_handler));
10340
10596
  const oauthHandler = new OAuthHandler({
10341
10597
  providers,
@@ -10345,91 +10601,23 @@ function createMCPServer(config) {
10345
10601
  removeProviderToken: config.removeProviderToken,
10346
10602
  getSessionContext: config.getSessionContext
10347
10603
  });
10348
- const startTime = Date.now();
10349
- try {
10350
- const result = await oauthHandler.handleToolCall({ name: trigger.toolName, arguments: trigger.toolArguments }, `Bearer ${providerToken.accessToken}`, null);
10351
- const duration = Date.now() - startTime;
10352
- const executionResult = {
10353
- success: true,
10354
- result,
10355
- executedAt: new Date().toISOString(),
10356
- duration
10357
- };
10358
- await config.triggers.update(triggerId, {
10359
- lastRunAt: executionResult.executedAt,
10360
- runCount: (trigger.runCount || 0) + 1,
10361
- lastResult: result,
10362
- lastError: undefined
10363
- }, context2);
10364
- return Response.json(executionResult);
10365
- } catch (error) {
10366
- const duration = Date.now() - startTime;
10367
- const executionResult = {
10368
- success: false,
10369
- error: error.message || "Tool execution failed",
10370
- executedAt: new Date().toISOString(),
10371
- duration
10372
- };
10373
- await config.triggers.update(triggerId, {
10374
- lastRunAt: executionResult.executedAt,
10375
- runCount: (trigger.runCount || 0) + 1,
10376
- lastError: error.message,
10377
- status: "failed"
10378
- }, context2);
10379
- return Response.json(executionResult, { status: 500 });
10380
- }
10381
- } else if (subAction === "execute" && method === "GET") {
10382
- const apiKey = webRequest.headers.get("x-api-key");
10383
- if (!apiKey || apiKey !== config.apiKey) {
10384
- return Response.json({ error: "Unauthorized" }, { status: 401 });
10385
- }
10386
- const trigger = await config.triggers.get(triggerId, context2);
10387
- if (!trigger) {
10388
- return Response.json({ error: "Trigger not found" }, { status: 404 });
10389
- }
10390
- if (!trigger.provider) {
10391
- return Response.json({ error: "Trigger has no provider configured" }, { status: 400 });
10392
- }
10393
- const providerToken = config.getProviderToken ? await config.getProviderToken(trigger.provider, undefined, context2) : undefined;
10394
- if (!providerToken) {
10395
- return Response.json({ error: "No OAuth token available for this trigger" }, { status: 401 });
10396
- }
10397
- return Response.json({
10398
- trigger: {
10399
- id: trigger.id,
10400
- toolName: trigger.toolName,
10401
- toolArguments: trigger.toolArguments,
10402
- provider: trigger.provider
10604
+ const executionResult = await executeTrigger2(trigger, {
10605
+ triggers: config.triggers,
10606
+ getProviderToken: async (provider, email, ctx) => {
10607
+ return config.getProviderToken ? await config.getProviderToken(provider, email, ctx) : undefined;
10403
10608
  },
10404
- accessToken: providerToken.accessToken,
10405
- tokenType: providerToken.tokenType || "Bearer"
10406
- });
10407
- } else if (subAction === "complete" && method === "POST") {
10408
- const apiKey = webRequest.headers.get("x-api-key");
10409
- if (!apiKey || apiKey !== config.apiKey) {
10410
- return Response.json({ error: "Unauthorized" }, { status: 401 });
10411
- }
10412
- const body = await webRequest.json();
10413
- const trigger = await config.triggers.get(triggerId, context2);
10414
- if (!trigger) {
10415
- return Response.json({ error: "Trigger not found" }, { status: 404 });
10416
- }
10417
- const updates = {
10418
- lastRunAt: body.executedAt,
10419
- runCount: (trigger.runCount || 0) + 1
10420
- };
10421
- if (body.success) {
10422
- updates.lastResult = body.result;
10423
- updates.lastError = undefined;
10424
- if (trigger.schedule.type === "once") {
10425
- updates.status = "completed";
10609
+ handleToolCall: (toolBody, authHeader, integrationsHeader) => {
10610
+ return oauthHandler.handleToolCall(toolBody, authHeader, integrationsHeader);
10426
10611
  }
10427
- } else {
10428
- updates.lastError = body.error;
10429
- updates.status = "failed";
10430
- }
10431
- await config.triggers.update(triggerId, updates, context2);
10432
- return Response.json({ success: true });
10612
+ }, context2);
10613
+ return Response.json({
10614
+ success: executionResult.success,
10615
+ result: executionResult.steps[0]?.result,
10616
+ executedAt: executionResult.steps[0]?.executedAt || new Date().toISOString(),
10617
+ duration: executionResult.steps[0]?.duration,
10618
+ error: executionResult.error,
10619
+ steps: executionResult.steps
10620
+ }, { status: executionResult.success ? 200 : 500 });
10433
10621
  } else if (!subAction && method === "GET") {
10434
10622
  const trigger = await config.triggers.get(triggerId, context2);
10435
10623
  if (!trigger) {
@@ -10462,7 +10650,7 @@ function createMCPServer(config) {
10462
10650
  })
10463
10651
  });
10464
10652
  } catch (error) {
10465
- logger29.error("[Trigger] Failed to update scheduler:", error);
10653
+ logger31.error("[Trigger] Failed to update scheduler:", error);
10466
10654
  }
10467
10655
  }
10468
10656
  return Response.json(updated);
@@ -10479,14 +10667,14 @@ function createMCPServer(config) {
10479
10667
  body: JSON.stringify({ triggerId })
10480
10668
  });
10481
10669
  } catch (error) {
10482
- logger29.error("[Trigger] Failed to unregister from scheduler:", error);
10670
+ logger31.error("[Trigger] Failed to unregister from scheduler:", error);
10483
10671
  }
10484
10672
  return new Response(null, { status: 204 });
10485
10673
  }
10486
10674
  }
10487
10675
  return Response.json({ error: "Invalid trigger route or method" }, { status: 404 });
10488
10676
  } catch (error) {
10489
- logger29.error("[Trigger] Error:", error);
10677
+ logger31.error("[Trigger] Error:", error);
10490
10678
  return Response.json({ error: error.message || "Failed to process trigger request" }, { status: error.statusCode || 500 });
10491
10679
  }
10492
10680
  }
@@ -10512,11 +10700,11 @@ function createMCPServer(config) {
10512
10700
  const errorRedirectUrl = "/auth-error";
10513
10701
  if (error) {
10514
10702
  const errorMsg = errorDescription || error;
10515
- logger29.error("[OAuth Redirect] Error:", errorMsg);
10703
+ logger31.error("[OAuth Redirect] Error:", errorMsg);
10516
10704
  return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent(errorMsg)}`, webRequest.url));
10517
10705
  }
10518
10706
  if (!code || !state) {
10519
- logger29.error("[OAuth Redirect] Missing code or state parameter");
10707
+ logger31.error("[OAuth Redirect] Missing code or state parameter");
10520
10708
  return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent("Invalid OAuth callback")}`, webRequest.url));
10521
10709
  }
10522
10710
  let returnUrl = defaultRedirectUrl;
@@ -10592,7 +10780,7 @@ function createMCPServer(config) {
10592
10780
  frontendUrl.hash = `oauth_callback=${encodeURIComponent(JSON.stringify({ code, state, tokenData }))}`;
10593
10781
  return Response.redirect(frontendUrl);
10594
10782
  } catch (error2) {
10595
- logger29.error("[OAuth Backend Callback] Error:", error2);
10783
+ logger31.error("[OAuth Backend Callback] Error:", error2);
10596
10784
  return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent(error2.message || "Failed to exchange token")}`, webRequest.url));
10597
10785
  }
10598
10786
  } else {
@@ -10811,7 +10999,7 @@ function toSvelteKitHandler(clientOrHandlerOrOptions, _redirectOptions) {
10811
10999
  }
10812
11000
  };
10813
11001
  }
10814
- var SERVER_LOG_CONTEXT = "server", logger29, globalServerConfig = null, codeVerifierStorage, POST = async (req, context) => {
11002
+ var SERVER_LOG_CONTEXT = "server", logger31, globalServerConfig = null, codeVerifierStorage, POST = async (req, context) => {
10815
11003
  if (!globalServerConfig) {
10816
11004
  return Response.json({ error: "OAuth not configured. Call createMCPServer() in your server initialization file first." }, { status: 500 });
10817
11005
  }
@@ -10859,7 +11047,7 @@ var init_server = __esm(() => {
10859
11047
  init_anthropic();
10860
11048
  init_google();
10861
11049
  init_ai();
10862
- logger29 = createLogger("MCPServer", SERVER_LOG_CONTEXT);
11050
+ logger31 = createLogger("MCPServer", SERVER_LOG_CONTEXT);
10863
11051
  codeVerifierStorage = new Map;
10864
11052
  });
10865
11053
 
@@ -11210,7 +11398,7 @@ class OAuthHandler {
11210
11398
  url.searchParams.set("state", authorizeRequest.state);
11211
11399
  url.searchParams.set("code_challenge", authorizeRequest.codeChallenge);
11212
11400
  url.searchParams.set("code_challenge_method", authorizeRequest.codeChallengeMethod);
11213
- const redirectUri = authorizeRequest.redirectUri || providerConfig.redirectUri;
11401
+ const redirectUri = providerConfig.redirectUri;
11214
11402
  if (redirectUri) {
11215
11403
  url.searchParams.set("redirect_uri", redirectUri);
11216
11404
  }
@@ -11322,7 +11510,7 @@ class OAuthHandler {
11322
11510
  tokenType: result.tokenType,
11323
11511
  expiresIn: result.expiresIn,
11324
11512
  expiresAt: result.expiresAt,
11325
- scopes: result.scopes
11513
+ scopes: result.scopes ? result.scopes.flatMap((s) => s.split(" ").filter(Boolean)) : result.scopes
11326
11514
  };
11327
11515
  await this.config.setProviderToken(callbackRequest.provider, tokenData, undefined, context);
11328
11516
  } catch (error) {}
@@ -11372,11 +11560,11 @@ class OAuthHandler {
11372
11560
  try {
11373
11561
  await this.config.removeProviderToken(request.provider, undefined, context);
11374
11562
  } catch (error) {
11375
- logger30.error(`Failed to delete token for ${request.provider} from database via removeProviderToken:`, error);
11563
+ logger32.error(`Failed to delete token for ${request.provider} from database via removeProviderToken:`, error);
11376
11564
  }
11377
11565
  }
11378
11566
  } catch (error) {
11379
- logger30.error(`Failed to extract context for disconnect:`, error);
11567
+ logger32.error(`Failed to extract context for disconnect:`, error);
11380
11568
  }
11381
11569
  }
11382
11570
  const url = new URL("/oauth/disconnect", this.serverUrl);
@@ -11436,10 +11624,10 @@ class OAuthHandler {
11436
11624
  return jsonRpcResponse.result;
11437
11625
  }
11438
11626
  }
11439
- var SERVER_LOG_CONTEXT2 = "server", logger30, MCP_SERVER_URL2 = "https://mcp.integrate.dev/api/v1/mcp";
11627
+ var SERVER_LOG_CONTEXT2 = "server", logger32, MCP_SERVER_URL2 = "https://mcp.integrate.dev/api/v1/mcp";
11440
11628
  var init_base_handler = __esm(() => {
11441
11629
  init_logger();
11442
- logger30 = createLogger("OAuthHandler", SERVER_LOG_CONTEXT2);
11630
+ logger32 = createLogger("OAuthHandler", SERVER_LOG_CONTEXT2);
11443
11631
  });
11444
11632
 
11445
11633
  // nextjs.ts
@@ -11458,7 +11646,7 @@ function createNextOAuthHandler(config) {
11458
11646
  }
11459
11647
  return response;
11460
11648
  } catch (error) {
11461
- logger31.error("[OAuth Authorize] Error:", error);
11649
+ logger33.error("[OAuth Authorize] Error:", error);
11462
11650
  return Response.json({ error: error.message || "Failed to get authorization URL" }, { status: 500 });
11463
11651
  }
11464
11652
  },
@@ -11474,7 +11662,7 @@ function createNextOAuthHandler(config) {
11474
11662
  }
11475
11663
  return response;
11476
11664
  } catch (error) {
11477
- logger31.error("[OAuth Callback] Error:", error);
11665
+ logger33.error("[OAuth Callback] Error:", error);
11478
11666
  return Response.json({ error: error.message || "Failed to exchange authorization code" }, { status: 500 });
11479
11667
  }
11480
11668
  },
@@ -11496,7 +11684,7 @@ function createNextOAuthHandler(config) {
11496
11684
  }
11497
11685
  return response;
11498
11686
  } catch (error) {
11499
- logger31.error("[OAuth Status] Error:", error);
11687
+ logger33.error("[OAuth Status] Error:", error);
11500
11688
  return Response.json({ error: error.message || "Failed to check authorization status" }, { status: 500 });
11501
11689
  }
11502
11690
  },
@@ -11519,7 +11707,7 @@ function createNextOAuthHandler(config) {
11519
11707
  }
11520
11708
  return response;
11521
11709
  } catch (error) {
11522
- logger31.error("[OAuth Disconnect] Error:", error);
11710
+ logger33.error("[OAuth Disconnect] Error:", error);
11523
11711
  return Response.json({ error: error.message || "Failed to disconnect provider" }, { status: 500 });
11524
11712
  }
11525
11713
  },
@@ -11560,7 +11748,7 @@ function createNextOAuthHandler(config) {
11560
11748
  const result = await handler.handleToolCall(body, authHeader, integrationsHeader);
11561
11749
  return Response.json(result);
11562
11750
  } catch (error) {
11563
- logger31.error("[MCP Tool Call] Error:", error);
11751
+ logger33.error("[MCP Tool Call] Error:", error);
11564
11752
  return Response.json({ error: error.message || "Failed to execute tool call" }, { status: error.statusCode || 500 });
11565
11753
  }
11566
11754
  },
@@ -11605,11 +11793,11 @@ function createNextOAuthHandler(config) {
11605
11793
  const errorDescription = searchParams.get("error_description");
11606
11794
  if (error) {
11607
11795
  const errorMsg = errorDescription || error;
11608
- logger31.error("[OAuth Redirect] Error:", errorMsg);
11796
+ logger33.error("[OAuth Redirect] Error:", errorMsg);
11609
11797
  return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent(errorMsg)}`, req.url));
11610
11798
  }
11611
11799
  if (!code || !state) {
11612
- logger31.error("[OAuth Redirect] Missing code or state parameter");
11800
+ logger33.error("[OAuth Redirect] Missing code or state parameter");
11613
11801
  return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent("Invalid OAuth callback")}`, req.url));
11614
11802
  }
11615
11803
  let returnUrl = defaultRedirectUrl;
@@ -11648,11 +11836,11 @@ function createNextOAuthHandler(config) {
11648
11836
  };
11649
11837
  return handlers;
11650
11838
  }
11651
- var SERVER_LOG_CONTEXT3 = "server", logger31;
11839
+ var SERVER_LOG_CONTEXT3 = "server", logger33;
11652
11840
  var init_nextjs = __esm(() => {
11653
11841
  init_base_handler();
11654
11842
  init_logger();
11655
- logger31 = createLogger("NextJSOAuth", SERVER_LOG_CONTEXT3);
11843
+ logger33 = createLogger("NextJSOAuth", SERVER_LOG_CONTEXT3);
11656
11844
  });
11657
11845
 
11658
11846
  // solid-start.ts