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.
package/dist/oauth.js CHANGED
@@ -8137,6 +8137,7 @@ var init_nanoid = __esm(() => {
8137
8137
  // src/triggers/utils.ts
8138
8138
  var exports_utils = {};
8139
8139
  __export(exports_utils, {
8140
+ validateStepLimit: () => validateStepLimit,
8140
8141
  validateStatusTransition: () => validateStatusTransition,
8141
8142
  generateTriggerId: () => generateTriggerId,
8142
8143
  extractProviderFromToolName: () => extractProviderFromToolName,
@@ -8164,6 +8165,15 @@ function validateStatusTransition(currentStatus, targetStatus) {
8164
8165
  }
8165
8166
  return { valid: true };
8166
8167
  }
8168
+ function validateStepLimit(stepIndex, maxSteps) {
8169
+ if (stepIndex >= maxSteps) {
8170
+ return {
8171
+ valid: false,
8172
+ error: `Step index ${stepIndex} exceeds maximum of ${maxSteps} steps`
8173
+ };
8174
+ }
8175
+ return { valid: true };
8176
+ }
8167
8177
  function calculateHasMore(offset, returnedCount, total) {
8168
8178
  return offset + returnedCount < total;
8169
8179
  }
@@ -10171,6 +10181,204 @@ var init_ai = __esm(() => {
10171
10181
  init_trigger_tools();
10172
10182
  });
10173
10183
 
10184
+ // src/triggers/webhooks.ts
10185
+ async function signPayload(payload, secret) {
10186
+ const encoder = new TextEncoder;
10187
+ const data = encoder.encode(JSON.stringify(payload));
10188
+ const key = await crypto.subtle.importKey("raw", encoder.encode(secret), { name: "HMAC", hash: "SHA-256" }, false, ["sign"]);
10189
+ const signature = await crypto.subtle.sign("HMAC", key, data);
10190
+ return Array.from(new Uint8Array(signature)).map((b) => b.toString(16).padStart(2, "0")).join("");
10191
+ }
10192
+ async function deliverWebhook(webhook, payload, timeoutMs) {
10193
+ const headers = {
10194
+ "Content-Type": "application/json",
10195
+ ...webhook.headers
10196
+ };
10197
+ if (webhook.secret) {
10198
+ headers["X-Webhook-Signature"] = await signPayload(payload, webhook.secret);
10199
+ }
10200
+ const controller = new AbortController;
10201
+ const timeout = setTimeout(() => controller.abort(), timeoutMs);
10202
+ try {
10203
+ const response = await fetch(webhook.url, {
10204
+ method: "POST",
10205
+ headers,
10206
+ body: JSON.stringify(payload),
10207
+ signal: controller.signal
10208
+ });
10209
+ if (!response.ok) {
10210
+ logger30.warn(`Webhook delivery to ${webhook.url} returned ${response.status}`);
10211
+ }
10212
+ } finally {
10213
+ clearTimeout(timeout);
10214
+ }
10215
+ }
10216
+ async function deliverWebhooks(webhooks, payload, timeoutMs) {
10217
+ if (webhooks.length === 0)
10218
+ return;
10219
+ const results = await Promise.allSettled(webhooks.map((webhook) => deliverWebhook(webhook, payload, timeoutMs)));
10220
+ for (let i = 0;i < results.length; i++) {
10221
+ const result = results[i];
10222
+ if (result.status === "rejected") {
10223
+ logger30.warn(`Webhook delivery to ${webhooks[i].url} failed:`, result.reason);
10224
+ }
10225
+ }
10226
+ }
10227
+ var logger30;
10228
+ var init_webhooks = __esm(() => {
10229
+ init_logger();
10230
+ logger30 = createLogger("Webhooks", "server");
10231
+ });
10232
+
10233
+ // src/triggers/types.ts
10234
+ var MAX_TRIGGER_STEPS = 20, WEBHOOK_DELIVERY_TIMEOUT_MS = 1e4;
10235
+
10236
+ // src/triggers/executor.ts
10237
+ var exports_executor = {};
10238
+ __export(exports_executor, {
10239
+ executeTrigger: () => executeTrigger
10240
+ });
10241
+ async function executeTrigger(trigger, config, context) {
10242
+ const steps = [];
10243
+ let currentToolName = trigger.toolName;
10244
+ let currentToolArguments = trigger.toolArguments;
10245
+ let currentProvider = trigger.provider;
10246
+ let stepIndex = 0;
10247
+ while (stepIndex < MAX_TRIGGER_STEPS) {
10248
+ const stepValidation = validateStepLimit(stepIndex, MAX_TRIGGER_STEPS);
10249
+ if (!stepValidation.valid) {
10250
+ logger31.error(`[Trigger ${trigger.id}] ${stepValidation.error}`);
10251
+ break;
10252
+ }
10253
+ const providerToken = await config.getProviderToken(currentProvider, undefined, context);
10254
+ if (!providerToken) {
10255
+ const error = `No OAuth token available for provider '${currentProvider}'`;
10256
+ logger31.error(`[Trigger ${trigger.id}] ${error}`);
10257
+ steps.push({
10258
+ stepIndex,
10259
+ toolName: currentToolName,
10260
+ success: false,
10261
+ error,
10262
+ duration: 0,
10263
+ executedAt: new Date().toISOString()
10264
+ });
10265
+ await config.triggers.update(trigger.id, {
10266
+ lastRunAt: new Date().toISOString(),
10267
+ runCount: (trigger.runCount || 0) + 1,
10268
+ lastError: error,
10269
+ status: "failed"
10270
+ }, context);
10271
+ return { success: false, steps, error };
10272
+ }
10273
+ const startTime = Date.now();
10274
+ let toolResult;
10275
+ let stepSuccess = true;
10276
+ let stepError;
10277
+ try {
10278
+ toolResult = await config.handleToolCall({ name: currentToolName, arguments: currentToolArguments }, `${providerToken.tokenType || "Bearer"} ${providerToken.accessToken}`, null);
10279
+ } catch (err) {
10280
+ stepSuccess = false;
10281
+ stepError = err.message || "Tool execution failed";
10282
+ logger31.error(`[Trigger ${trigger.id}] Step ${stepIndex} failed:`, err);
10283
+ }
10284
+ const duration = Date.now() - startTime;
10285
+ const executedAt = new Date().toISOString();
10286
+ steps.push({
10287
+ stepIndex,
10288
+ toolName: currentToolName,
10289
+ success: stepSuccess,
10290
+ result: stepSuccess ? toolResult : undefined,
10291
+ error: stepError,
10292
+ duration,
10293
+ executedAt
10294
+ });
10295
+ if (!config.triggers.onComplete || !stepSuccess) {
10296
+ const updates = {
10297
+ lastRunAt: executedAt,
10298
+ runCount: (trigger.runCount || 0) + 1
10299
+ };
10300
+ if (stepSuccess) {
10301
+ updates.lastResult = toolResult;
10302
+ updates.lastError = undefined;
10303
+ if (trigger.schedule.type === "once") {
10304
+ updates.status = "completed";
10305
+ }
10306
+ } else {
10307
+ updates.lastError = stepError;
10308
+ updates.status = "failed";
10309
+ }
10310
+ await config.triggers.update(trigger.id, updates, context);
10311
+ return { success: stepSuccess, steps, error: stepError };
10312
+ }
10313
+ const completeRequest = {
10314
+ success: stepSuccess,
10315
+ result: stepSuccess ? toolResult : undefined,
10316
+ error: stepError,
10317
+ executedAt,
10318
+ duration,
10319
+ stepIndex,
10320
+ previousResults: steps,
10321
+ final: false
10322
+ };
10323
+ const completeResponse = await config.triggers.onComplete({
10324
+ trigger,
10325
+ request: completeRequest,
10326
+ context
10327
+ });
10328
+ if (completeResponse.hasMore && completeResponse.nextStep) {
10329
+ currentToolName = completeResponse.nextStep.toolName;
10330
+ currentToolArguments = completeResponse.nextStep.toolArguments;
10331
+ currentProvider = completeResponse.nextStep.provider;
10332
+ stepIndex++;
10333
+ continue;
10334
+ }
10335
+ const finalUpdates = {
10336
+ lastRunAt: executedAt,
10337
+ runCount: (trigger.runCount || 0) + 1
10338
+ };
10339
+ if (stepSuccess) {
10340
+ finalUpdates.lastResult = toolResult;
10341
+ finalUpdates.lastError = undefined;
10342
+ if (trigger.schedule.type === "once") {
10343
+ finalUpdates.status = "completed";
10344
+ }
10345
+ } else {
10346
+ finalUpdates.lastError = stepError;
10347
+ finalUpdates.status = "failed";
10348
+ }
10349
+ await config.triggers.update(trigger.id, finalUpdates, context);
10350
+ if (completeResponse.webhooks && completeResponse.webhooks.length > 0) {
10351
+ const totalDuration = steps.reduce((sum, s) => sum + (s.duration || 0), 0);
10352
+ const payload = {
10353
+ triggerId: trigger.id,
10354
+ success: steps.every((s) => s.success),
10355
+ steps,
10356
+ totalSteps: steps.length,
10357
+ totalDuration,
10358
+ executedAt
10359
+ };
10360
+ deliverWebhooks(completeResponse.webhooks, payload, WEBHOOK_DELIVERY_TIMEOUT_MS).catch(() => {});
10361
+ }
10362
+ return { success: stepSuccess, steps, error: stepError };
10363
+ }
10364
+ const limitError = `Trigger execution exceeded maximum of ${MAX_TRIGGER_STEPS} steps`;
10365
+ logger31.error(`[Trigger ${trigger.id}] ${limitError}`);
10366
+ await config.triggers.update(trigger.id, {
10367
+ lastRunAt: new Date().toISOString(),
10368
+ runCount: (trigger.runCount || 0) + 1,
10369
+ lastError: limitError,
10370
+ status: "failed"
10371
+ }, context);
10372
+ return { success: false, steps, error: limitError };
10373
+ }
10374
+ var logger31;
10375
+ var init_executor = __esm(() => {
10376
+ init_logger();
10377
+ init_utils2();
10378
+ init_webhooks();
10379
+ logger31 = createLogger("TriggerExecutor", "server");
10380
+ });
10381
+
10174
10382
  // src/server.ts
10175
10383
  var exports_server = {};
10176
10384
  __export(exports_server, {
@@ -10264,7 +10472,7 @@ function createMCPServer(config) {
10264
10472
  if (integration.oauth) {
10265
10473
  const { clientId, clientSecret, redirectUri: integrationRedirectUri, config: oauthConfig } = integration.oauth;
10266
10474
  if (!clientId || !clientSecret) {
10267
- logger30.warn(`Warning: Integration "${integration.id}" is missing OAuth credentials. ` + `Provide clientId and clientSecret in the integration configuration.`);
10475
+ logger32.warn(`Warning: Integration "${integration.id}" is missing OAuth credentials. ` + `Provide clientId and clientSecret in the integration configuration.`);
10268
10476
  return integration;
10269
10477
  }
10270
10478
  const redirectUri = integrationRedirectUri || config.redirectUri || getDefaultRedirectUri();
@@ -10395,7 +10603,7 @@ function createMCPServer(config) {
10395
10603
  }
10396
10604
  return response2;
10397
10605
  } catch (error) {
10398
- logger30.error("[MCP Tool Call] Error:", error);
10606
+ logger32.error("[MCP Tool Call] Error:", error);
10399
10607
  return Response.json({ error: error.message || "Failed to execute tool call" }, { status: error.statusCode || 500 });
10400
10608
  }
10401
10609
  }
@@ -10411,6 +10619,57 @@ function createMCPServer(config) {
10411
10619
  }));
10412
10620
  return Response.json({ integrations });
10413
10621
  }
10622
+ if (segments.length === 2 && segments[0] === "triggers" && segments[1] === "notify" && method === "POST") {
10623
+ if (!config.triggers) {
10624
+ return Response.json({ error: "Triggers not configured. Add triggers callbacks to createMCPServer config." }, { status: 501 });
10625
+ }
10626
+ try {
10627
+ const apiKey = webRequest.headers.get("x-api-key");
10628
+ if (!apiKey || apiKey !== config.apiKey) {
10629
+ return Response.json({ error: "Unauthorized" }, { status: 401 });
10630
+ }
10631
+ const body = await webRequest.json();
10632
+ const { triggerId } = body;
10633
+ if (!triggerId) {
10634
+ return Response.json({ error: "triggerId is required" }, { status: 400 });
10635
+ }
10636
+ const trigger = await config.triggers.get(triggerId);
10637
+ if (!trigger) {
10638
+ return Response.json({ error: "Trigger not found" }, { status: 404 });
10639
+ }
10640
+ if (!trigger.provider) {
10641
+ return Response.json({ error: "Trigger has no provider configured" }, { status: 400 });
10642
+ }
10643
+ const triggerContext = trigger.userId ? { userId: trigger.userId } : undefined;
10644
+ const { executeTrigger: executeTrigger2 } = await Promise.resolve().then(() => (init_executor(), exports_executor));
10645
+ const { OAuthHandler: OAuthHandler2 } = await Promise.resolve().then(() => (init_base_handler(), exports_base_handler));
10646
+ const oauthHandler = new OAuthHandler2({
10647
+ providers,
10648
+ serverUrl: config.serverUrl,
10649
+ apiKey: config.apiKey,
10650
+ setProviderToken: config.setProviderToken,
10651
+ removeProviderToken: config.removeProviderToken,
10652
+ getSessionContext: config.getSessionContext
10653
+ });
10654
+ const executionResult = await executeTrigger2(trigger, {
10655
+ triggers: config.triggers,
10656
+ getProviderToken: async (provider, email, ctx) => {
10657
+ return config.getProviderToken ? await config.getProviderToken(provider, email, ctx) : undefined;
10658
+ },
10659
+ handleToolCall: (toolBody, authHeader, integrationsHeader) => {
10660
+ return oauthHandler.handleToolCall(toolBody, authHeader, integrationsHeader);
10661
+ }
10662
+ }, triggerContext);
10663
+ return Response.json({
10664
+ success: executionResult.success,
10665
+ steps: executionResult.steps,
10666
+ error: executionResult.error
10667
+ });
10668
+ } catch (error) {
10669
+ logger32.error("[Trigger Notify] Error:", error);
10670
+ return Response.json({ error: error.message || "Failed to execute trigger" }, { status: 500 });
10671
+ }
10672
+ }
10414
10673
  if (segments.length >= 1 && segments[0] === "triggers") {
10415
10674
  if (!config.triggers) {
10416
10675
  return Response.json({ error: "Triggers not configured. Add triggers callbacks to createMCPServer config." }, { status: 501 });
@@ -10451,8 +10710,9 @@ function createMCPServer(config) {
10451
10710
  };
10452
10711
  const created = await config.triggers.create(trigger, context2);
10453
10712
  const schedulerUrl = config.schedulerUrl || config.serverUrl || "https://mcp.integrate.dev";
10454
- const callbackBaseUrl = process.env.INTEGRATE_URL || (typeof window !== "undefined" ? window.location.origin : "http://localhost:3000");
10713
+ const defaultCallbackBaseUrl = process.env.INTEGRATE_URL || (typeof window !== "undefined" ? window.location.origin : "http://localhost:3000");
10455
10714
  try {
10715
+ const callbackBaseUrl = config.triggers.getCallbackUrl ? await config.triggers.getCallbackUrl(context2) : defaultCallbackBaseUrl;
10456
10716
  await fetch(`${schedulerUrl}/scheduler/register`, {
10457
10717
  method: "POST",
10458
10718
  headers: {
@@ -10462,8 +10722,7 @@ function createMCPServer(config) {
10462
10722
  body: JSON.stringify({
10463
10723
  triggerId: created.id,
10464
10724
  schedule: created.schedule,
10465
- callbackUrl: `${callbackBaseUrl}/api/integrate/triggers/${created.id}/execute`,
10466
- completeUrl: `${callbackBaseUrl}/api/integrate/triggers/${created.id}/complete`,
10725
+ callbackUrl: `${callbackBaseUrl}/api/integrate/triggers/notify`,
10467
10726
  metadata: {
10468
10727
  userId: context2?.userId,
10469
10728
  provider: created.provider
@@ -10471,7 +10730,7 @@ function createMCPServer(config) {
10471
10730
  })
10472
10731
  });
10473
10732
  } catch (scheduleError) {
10474
- logger30.error("[Trigger] Failed to register with scheduler:", scheduleError);
10733
+ logger32.error("[Trigger] Failed to register with scheduler:", scheduleError);
10475
10734
  }
10476
10735
  return Response.json(created, { status: 201 });
10477
10736
  }
@@ -10506,7 +10765,7 @@ function createMCPServer(config) {
10506
10765
  body: JSON.stringify({ triggerId })
10507
10766
  });
10508
10767
  } catch (error) {
10509
- logger30.error("[Trigger] Failed to pause in scheduler:", error);
10768
+ logger32.error("[Trigger] Failed to pause in scheduler:", error);
10510
10769
  }
10511
10770
  return Response.json(updated);
10512
10771
  } else if (subAction === "resume" && method === "POST") {
@@ -10534,7 +10793,7 @@ function createMCPServer(config) {
10534
10793
  body: JSON.stringify({ triggerId })
10535
10794
  });
10536
10795
  } catch (error) {
10537
- logger30.error("[Trigger] Failed to resume in scheduler:", error);
10796
+ logger32.error("[Trigger] Failed to resume in scheduler:", error);
10538
10797
  }
10539
10798
  return Response.json(updated);
10540
10799
  } else if (subAction === "run" && method === "POST") {
@@ -10545,10 +10804,7 @@ function createMCPServer(config) {
10545
10804
  if (!trigger.provider) {
10546
10805
  return Response.json({ error: "Trigger has no provider configured" }, { status: 400 });
10547
10806
  }
10548
- const providerToken = config.getProviderToken ? await config.getProviderToken(trigger.provider, undefined, context2) : undefined;
10549
- if (!providerToken) {
10550
- return Response.json({ error: "No OAuth token available for this trigger" }, { status: 401 });
10551
- }
10807
+ const { executeTrigger: executeTrigger2 } = await Promise.resolve().then(() => (init_executor(), exports_executor));
10552
10808
  const { OAuthHandler: OAuthHandler2 } = await Promise.resolve().then(() => (init_base_handler(), exports_base_handler));
10553
10809
  const oauthHandler = new OAuthHandler2({
10554
10810
  providers,
@@ -10558,91 +10814,23 @@ function createMCPServer(config) {
10558
10814
  removeProviderToken: config.removeProviderToken,
10559
10815
  getSessionContext: config.getSessionContext
10560
10816
  });
10561
- const startTime = Date.now();
10562
- try {
10563
- const result = await oauthHandler.handleToolCall({ name: trigger.toolName, arguments: trigger.toolArguments }, `Bearer ${providerToken.accessToken}`, null);
10564
- const duration = Date.now() - startTime;
10565
- const executionResult = {
10566
- success: true,
10567
- result,
10568
- executedAt: new Date().toISOString(),
10569
- duration
10570
- };
10571
- await config.triggers.update(triggerId, {
10572
- lastRunAt: executionResult.executedAt,
10573
- runCount: (trigger.runCount || 0) + 1,
10574
- lastResult: result,
10575
- lastError: undefined
10576
- }, context2);
10577
- return Response.json(executionResult);
10578
- } catch (error) {
10579
- const duration = Date.now() - startTime;
10580
- const executionResult = {
10581
- success: false,
10582
- error: error.message || "Tool execution failed",
10583
- executedAt: new Date().toISOString(),
10584
- duration
10585
- };
10586
- await config.triggers.update(triggerId, {
10587
- lastRunAt: executionResult.executedAt,
10588
- runCount: (trigger.runCount || 0) + 1,
10589
- lastError: error.message,
10590
- status: "failed"
10591
- }, context2);
10592
- return Response.json(executionResult, { status: 500 });
10593
- }
10594
- } else if (subAction === "execute" && method === "GET") {
10595
- const apiKey = webRequest.headers.get("x-api-key");
10596
- if (!apiKey || apiKey !== config.apiKey) {
10597
- return Response.json({ error: "Unauthorized" }, { status: 401 });
10598
- }
10599
- const trigger = await config.triggers.get(triggerId, context2);
10600
- if (!trigger) {
10601
- return Response.json({ error: "Trigger not found" }, { status: 404 });
10602
- }
10603
- if (!trigger.provider) {
10604
- return Response.json({ error: "Trigger has no provider configured" }, { status: 400 });
10605
- }
10606
- const providerToken = config.getProviderToken ? await config.getProviderToken(trigger.provider, undefined, context2) : undefined;
10607
- if (!providerToken) {
10608
- return Response.json({ error: "No OAuth token available for this trigger" }, { status: 401 });
10609
- }
10610
- return Response.json({
10611
- trigger: {
10612
- id: trigger.id,
10613
- toolName: trigger.toolName,
10614
- toolArguments: trigger.toolArguments,
10615
- provider: trigger.provider
10817
+ const executionResult = await executeTrigger2(trigger, {
10818
+ triggers: config.triggers,
10819
+ getProviderToken: async (provider, email, ctx) => {
10820
+ return config.getProviderToken ? await config.getProviderToken(provider, email, ctx) : undefined;
10616
10821
  },
10617
- accessToken: providerToken.accessToken,
10618
- tokenType: providerToken.tokenType || "Bearer"
10619
- });
10620
- } else if (subAction === "complete" && method === "POST") {
10621
- const apiKey = webRequest.headers.get("x-api-key");
10622
- if (!apiKey || apiKey !== config.apiKey) {
10623
- return Response.json({ error: "Unauthorized" }, { status: 401 });
10624
- }
10625
- const body = await webRequest.json();
10626
- const trigger = await config.triggers.get(triggerId, context2);
10627
- if (!trigger) {
10628
- return Response.json({ error: "Trigger not found" }, { status: 404 });
10629
- }
10630
- const updates = {
10631
- lastRunAt: body.executedAt,
10632
- runCount: (trigger.runCount || 0) + 1
10633
- };
10634
- if (body.success) {
10635
- updates.lastResult = body.result;
10636
- updates.lastError = undefined;
10637
- if (trigger.schedule.type === "once") {
10638
- updates.status = "completed";
10822
+ handleToolCall: (toolBody, authHeader, integrationsHeader) => {
10823
+ return oauthHandler.handleToolCall(toolBody, authHeader, integrationsHeader);
10639
10824
  }
10640
- } else {
10641
- updates.lastError = body.error;
10642
- updates.status = "failed";
10643
- }
10644
- await config.triggers.update(triggerId, updates, context2);
10645
- return Response.json({ success: true });
10825
+ }, context2);
10826
+ return Response.json({
10827
+ success: executionResult.success,
10828
+ result: executionResult.steps[0]?.result,
10829
+ executedAt: executionResult.steps[0]?.executedAt || new Date().toISOString(),
10830
+ duration: executionResult.steps[0]?.duration,
10831
+ error: executionResult.error,
10832
+ steps: executionResult.steps
10833
+ }, { status: executionResult.success ? 200 : 500 });
10646
10834
  } else if (!subAction && method === "GET") {
10647
10835
  const trigger = await config.triggers.get(triggerId, context2);
10648
10836
  if (!trigger) {
@@ -10675,7 +10863,7 @@ function createMCPServer(config) {
10675
10863
  })
10676
10864
  });
10677
10865
  } catch (error) {
10678
- logger30.error("[Trigger] Failed to update scheduler:", error);
10866
+ logger32.error("[Trigger] Failed to update scheduler:", error);
10679
10867
  }
10680
10868
  }
10681
10869
  return Response.json(updated);
@@ -10692,14 +10880,14 @@ function createMCPServer(config) {
10692
10880
  body: JSON.stringify({ triggerId })
10693
10881
  });
10694
10882
  } catch (error) {
10695
- logger30.error("[Trigger] Failed to unregister from scheduler:", error);
10883
+ logger32.error("[Trigger] Failed to unregister from scheduler:", error);
10696
10884
  }
10697
10885
  return new Response(null, { status: 204 });
10698
10886
  }
10699
10887
  }
10700
10888
  return Response.json({ error: "Invalid trigger route or method" }, { status: 404 });
10701
10889
  } catch (error) {
10702
- logger30.error("[Trigger] Error:", error);
10890
+ logger32.error("[Trigger] Error:", error);
10703
10891
  return Response.json({ error: error.message || "Failed to process trigger request" }, { status: error.statusCode || 500 });
10704
10892
  }
10705
10893
  }
@@ -10725,11 +10913,11 @@ function createMCPServer(config) {
10725
10913
  const errorRedirectUrl = "/auth-error";
10726
10914
  if (error) {
10727
10915
  const errorMsg = errorDescription || error;
10728
- logger30.error("[OAuth Redirect] Error:", errorMsg);
10916
+ logger32.error("[OAuth Redirect] Error:", errorMsg);
10729
10917
  return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent(errorMsg)}`, webRequest.url));
10730
10918
  }
10731
10919
  if (!code || !state) {
10732
- logger30.error("[OAuth Redirect] Missing code or state parameter");
10920
+ logger32.error("[OAuth Redirect] Missing code or state parameter");
10733
10921
  return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent("Invalid OAuth callback")}`, webRequest.url));
10734
10922
  }
10735
10923
  let returnUrl = defaultRedirectUrl;
@@ -10805,7 +10993,7 @@ function createMCPServer(config) {
10805
10993
  frontendUrl.hash = `oauth_callback=${encodeURIComponent(JSON.stringify({ code, state, tokenData }))}`;
10806
10994
  return Response.redirect(frontendUrl);
10807
10995
  } catch (error2) {
10808
- logger30.error("[OAuth Backend Callback] Error:", error2);
10996
+ logger32.error("[OAuth Backend Callback] Error:", error2);
10809
10997
  return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent(error2.message || "Failed to exchange token")}`, webRequest.url));
10810
10998
  }
10811
10999
  } else {
@@ -11024,7 +11212,7 @@ function toSvelteKitHandler(clientOrHandlerOrOptions, _redirectOptions) {
11024
11212
  }
11025
11213
  };
11026
11214
  }
11027
- var SERVER_LOG_CONTEXT2 = "server", logger30, globalServerConfig = null, codeVerifierStorage, POST = async (req, context) => {
11215
+ var SERVER_LOG_CONTEXT2 = "server", logger32, globalServerConfig = null, codeVerifierStorage, POST = async (req, context) => {
11028
11216
  if (!globalServerConfig) {
11029
11217
  return Response.json({ error: "OAuth not configured. Call createMCPServer() in your server initialization file first." }, { status: 500 });
11030
11218
  }
@@ -11072,7 +11260,7 @@ var init_server = __esm(() => {
11072
11260
  init_anthropic();
11073
11261
  init_google();
11074
11262
  init_ai();
11075
- logger30 = createLogger("MCPServer", SERVER_LOG_CONTEXT2);
11263
+ logger32 = createLogger("MCPServer", SERVER_LOG_CONTEXT2);
11076
11264
  codeVerifierStorage = new Map;
11077
11265
  });
11078
11266
 
@@ -11423,7 +11611,7 @@ class OAuthHandler {
11423
11611
  url.searchParams.set("state", authorizeRequest.state);
11424
11612
  url.searchParams.set("code_challenge", authorizeRequest.codeChallenge);
11425
11613
  url.searchParams.set("code_challenge_method", authorizeRequest.codeChallengeMethod);
11426
- const redirectUri = authorizeRequest.redirectUri || providerConfig.redirectUri;
11614
+ const redirectUri = providerConfig.redirectUri;
11427
11615
  if (redirectUri) {
11428
11616
  url.searchParams.set("redirect_uri", redirectUri);
11429
11617
  }
@@ -11535,7 +11723,7 @@ class OAuthHandler {
11535
11723
  tokenType: result.tokenType,
11536
11724
  expiresIn: result.expiresIn,
11537
11725
  expiresAt: result.expiresAt,
11538
- scopes: result.scopes
11726
+ scopes: result.scopes ? result.scopes.flatMap((s) => s.split(" ").filter(Boolean)) : result.scopes
11539
11727
  };
11540
11728
  await this.config.setProviderToken(callbackRequest.provider, tokenData, undefined, context);
11541
11729
  } catch (error) {}
@@ -11585,11 +11773,11 @@ class OAuthHandler {
11585
11773
  try {
11586
11774
  await this.config.removeProviderToken(request.provider, undefined, context);
11587
11775
  } catch (error) {
11588
- logger31.error(`Failed to delete token for ${request.provider} from database via removeProviderToken:`, error);
11776
+ logger33.error(`Failed to delete token for ${request.provider} from database via removeProviderToken:`, error);
11589
11777
  }
11590
11778
  }
11591
11779
  } catch (error) {
11592
- logger31.error(`Failed to extract context for disconnect:`, error);
11780
+ logger33.error(`Failed to extract context for disconnect:`, error);
11593
11781
  }
11594
11782
  }
11595
11783
  const url = new URL("/oauth/disconnect", this.serverUrl);
@@ -11649,17 +11837,17 @@ class OAuthHandler {
11649
11837
  return jsonRpcResponse.result;
11650
11838
  }
11651
11839
  }
11652
- var SERVER_LOG_CONTEXT3 = "server", logger31, MCP_SERVER_URL2 = "https://mcp.integrate.dev/api/v1/mcp";
11840
+ var SERVER_LOG_CONTEXT3 = "server", logger33, MCP_SERVER_URL2 = "https://mcp.integrate.dev/api/v1/mcp";
11653
11841
  var init_base_handler = __esm(() => {
11654
11842
  init_logger();
11655
- logger31 = createLogger("OAuthHandler", SERVER_LOG_CONTEXT3);
11843
+ logger33 = createLogger("OAuthHandler", SERVER_LOG_CONTEXT3);
11656
11844
  });
11657
11845
 
11658
11846
  // src/adapters/auto-routes.ts
11659
11847
  init_base_handler();
11660
11848
  init_logger();
11661
11849
  var SERVER_LOG_CONTEXT4 = "server";
11662
- var logger32 = createLogger("AutoRoutes", SERVER_LOG_CONTEXT4);
11850
+ var logger34 = createLogger("AutoRoutes", SERVER_LOG_CONTEXT4);
11663
11851
  var globalOAuthConfig = null;
11664
11852
  async function POST2(req, context) {
11665
11853
  if (!globalOAuthConfig) {
@@ -11701,7 +11889,7 @@ async function POST2(req, context) {
11701
11889
  }
11702
11890
  return createErrorResponse(`Unknown action: ${action}`, 404);
11703
11891
  } catch (error) {
11704
- logger32.error(`[OAuth ${action}] Error:`, error);
11892
+ logger34.error(`[OAuth ${action}] Error:`, error);
11705
11893
  return createErrorResponse(error.message, 500);
11706
11894
  }
11707
11895
  }
@@ -11729,7 +11917,7 @@ async function GET2(req, context) {
11729
11917
  }
11730
11918
  return createErrorResponse(`Unknown action: ${action}`, 404);
11731
11919
  } catch (error) {
11732
- logger32.error(`[OAuth ${action}] Error:`, error);
11920
+ logger34.error(`[OAuth ${action}] Error:`, error);
11733
11921
  return createErrorResponse(error.message, 500);
11734
11922
  }
11735
11923
  }