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/adapters/auto-routes.js +263 -189
- package/dist/adapters/base-handler.d.ts.map +1 -1
- package/dist/adapters/index.js +260 -186
- package/dist/adapters/nextjs.js +260 -186
- package/dist/adapters/node.js +260 -186
- package/dist/adapters/svelte-kit.js +260 -186
- package/dist/adapters/tanstack-start.js +260 -186
- package/dist/index.js +254 -180
- package/dist/oauth.js +254 -180
- package/dist/server.js +247 -173
- package/dist/src/adapters/base-handler.d.ts.map +1 -1
- package/dist/src/client.d.ts +7 -0
- package/dist/src/client.d.ts.map +1 -1
- package/dist/src/server.d.ts.map +1 -1
- package/dist/src/triggers/executor.d.ts +50 -0
- package/dist/src/triggers/executor.d.ts.map +1 -0
- package/dist/src/triggers/index.d.ts +2 -0
- package/dist/src/triggers/index.d.ts.map +1 -1
- package/dist/src/triggers/types.d.ts +11 -4
- package/dist/src/triggers/types.d.ts.map +1 -1
- package/package.json +1 -1
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
10635
|
-
|
|
10636
|
-
|
|
10637
|
-
|
|
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
|
-
|
|
10691
|
-
|
|
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
|
-
|
|
10712
|
-
|
|
10713
|
-
|
|
10714
|
-
|
|
10715
|
-
|
|
10716
|
-
|
|
10717
|
-
|
|
10718
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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",
|
|
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
|
-
|
|
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 =
|
|
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
|
-
|
|
11789
|
+
logger33.error(`Failed to delete token for ${request.provider} from database via removeProviderToken:`, error);
|
|
11716
11790
|
}
|
|
11717
11791
|
}
|
|
11718
11792
|
} catch (error) {
|
|
11719
|
-
|
|
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",
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
11933
|
+
logger34.error(`[OAuth ${action}] Error:`, error);
|
|
11860
11934
|
return createErrorResponse(error.message, 500);
|
|
11861
11935
|
}
|
|
11862
11936
|
}
|