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/adapters/node.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) {
|
|
@@ -9968,21 +9981,7 @@ var init_ai = __esm(() => {
|
|
|
9968
9981
|
init_trigger_tools();
|
|
9969
9982
|
});
|
|
9970
9983
|
|
|
9971
|
-
// ../triggers/types.ts
|
|
9972
|
-
var exports_types = {};
|
|
9973
|
-
__export(exports_types, {
|
|
9974
|
-
WEBHOOK_DELIVERY_TIMEOUT_MS: () => WEBHOOK_DELIVERY_TIMEOUT_MS,
|
|
9975
|
-
MAX_TRIGGER_STEPS: () => MAX_TRIGGER_STEPS
|
|
9976
|
-
});
|
|
9977
|
-
var MAX_TRIGGER_STEPS = 20, WEBHOOK_DELIVERY_TIMEOUT_MS = 1e4;
|
|
9978
|
-
|
|
9979
9984
|
// ../triggers/webhooks.ts
|
|
9980
|
-
var exports_webhooks = {};
|
|
9981
|
-
__export(exports_webhooks, {
|
|
9982
|
-
signPayload: () => signPayload,
|
|
9983
|
-
deliverWebhooks: () => deliverWebhooks,
|
|
9984
|
-
deliverWebhook: () => deliverWebhook
|
|
9985
|
-
});
|
|
9986
9985
|
async function signPayload(payload, secret) {
|
|
9987
9986
|
const encoder = new TextEncoder;
|
|
9988
9987
|
const data = encoder.encode(JSON.stringify(payload));
|
|
@@ -10031,6 +10030,155 @@ var init_webhooks = __esm(() => {
|
|
|
10031
10030
|
logger29 = createLogger("Webhooks", "server");
|
|
10032
10031
|
});
|
|
10033
10032
|
|
|
10033
|
+
// ../triggers/types.ts
|
|
10034
|
+
var MAX_TRIGGER_STEPS = 20, WEBHOOK_DELIVERY_TIMEOUT_MS = 1e4;
|
|
10035
|
+
|
|
10036
|
+
// ../triggers/executor.ts
|
|
10037
|
+
var exports_executor = {};
|
|
10038
|
+
__export(exports_executor, {
|
|
10039
|
+
executeTrigger: () => executeTrigger
|
|
10040
|
+
});
|
|
10041
|
+
async function executeTrigger(trigger, config, context) {
|
|
10042
|
+
const steps = [];
|
|
10043
|
+
let currentToolName = trigger.toolName;
|
|
10044
|
+
let currentToolArguments = trigger.toolArguments;
|
|
10045
|
+
let currentProvider = trigger.provider;
|
|
10046
|
+
let stepIndex = 0;
|
|
10047
|
+
while (stepIndex < MAX_TRIGGER_STEPS) {
|
|
10048
|
+
const stepValidation = validateStepLimit(stepIndex, MAX_TRIGGER_STEPS);
|
|
10049
|
+
if (!stepValidation.valid) {
|
|
10050
|
+
logger30.error(`[Trigger ${trigger.id}] ${stepValidation.error}`);
|
|
10051
|
+
break;
|
|
10052
|
+
}
|
|
10053
|
+
const providerToken = await config.getProviderToken(currentProvider, undefined, context);
|
|
10054
|
+
if (!providerToken) {
|
|
10055
|
+
const error = `No OAuth token available for provider '${currentProvider}'`;
|
|
10056
|
+
logger30.error(`[Trigger ${trigger.id}] ${error}`);
|
|
10057
|
+
steps.push({
|
|
10058
|
+
stepIndex,
|
|
10059
|
+
toolName: currentToolName,
|
|
10060
|
+
success: false,
|
|
10061
|
+
error,
|
|
10062
|
+
duration: 0,
|
|
10063
|
+
executedAt: new Date().toISOString()
|
|
10064
|
+
});
|
|
10065
|
+
await config.triggers.update(trigger.id, {
|
|
10066
|
+
lastRunAt: new Date().toISOString(),
|
|
10067
|
+
runCount: (trigger.runCount || 0) + 1,
|
|
10068
|
+
lastError: error,
|
|
10069
|
+
status: "failed"
|
|
10070
|
+
}, context);
|
|
10071
|
+
return { success: false, steps, error };
|
|
10072
|
+
}
|
|
10073
|
+
const startTime = Date.now();
|
|
10074
|
+
let toolResult;
|
|
10075
|
+
let stepSuccess = true;
|
|
10076
|
+
let stepError;
|
|
10077
|
+
try {
|
|
10078
|
+
toolResult = await config.handleToolCall({ name: currentToolName, arguments: currentToolArguments }, `${providerToken.tokenType || "Bearer"} ${providerToken.accessToken}`, null);
|
|
10079
|
+
} catch (err) {
|
|
10080
|
+
stepSuccess = false;
|
|
10081
|
+
stepError = err.message || "Tool execution failed";
|
|
10082
|
+
logger30.error(`[Trigger ${trigger.id}] Step ${stepIndex} failed:`, err);
|
|
10083
|
+
}
|
|
10084
|
+
const duration = Date.now() - startTime;
|
|
10085
|
+
const executedAt = new Date().toISOString();
|
|
10086
|
+
steps.push({
|
|
10087
|
+
stepIndex,
|
|
10088
|
+
toolName: currentToolName,
|
|
10089
|
+
success: stepSuccess,
|
|
10090
|
+
result: stepSuccess ? toolResult : undefined,
|
|
10091
|
+
error: stepError,
|
|
10092
|
+
duration,
|
|
10093
|
+
executedAt
|
|
10094
|
+
});
|
|
10095
|
+
if (!config.triggers.onComplete || !stepSuccess) {
|
|
10096
|
+
const updates = {
|
|
10097
|
+
lastRunAt: executedAt,
|
|
10098
|
+
runCount: (trigger.runCount || 0) + 1
|
|
10099
|
+
};
|
|
10100
|
+
if (stepSuccess) {
|
|
10101
|
+
updates.lastResult = toolResult;
|
|
10102
|
+
updates.lastError = undefined;
|
|
10103
|
+
if (trigger.schedule.type === "once") {
|
|
10104
|
+
updates.status = "completed";
|
|
10105
|
+
}
|
|
10106
|
+
} else {
|
|
10107
|
+
updates.lastError = stepError;
|
|
10108
|
+
updates.status = "failed";
|
|
10109
|
+
}
|
|
10110
|
+
await config.triggers.update(trigger.id, updates, context);
|
|
10111
|
+
return { success: stepSuccess, steps, error: stepError };
|
|
10112
|
+
}
|
|
10113
|
+
const completeRequest = {
|
|
10114
|
+
success: stepSuccess,
|
|
10115
|
+
result: stepSuccess ? toolResult : undefined,
|
|
10116
|
+
error: stepError,
|
|
10117
|
+
executedAt,
|
|
10118
|
+
duration,
|
|
10119
|
+
stepIndex,
|
|
10120
|
+
previousResults: steps,
|
|
10121
|
+
final: false
|
|
10122
|
+
};
|
|
10123
|
+
const completeResponse = await config.triggers.onComplete({
|
|
10124
|
+
trigger,
|
|
10125
|
+
request: completeRequest,
|
|
10126
|
+
context
|
|
10127
|
+
});
|
|
10128
|
+
if (completeResponse.hasMore && completeResponse.nextStep) {
|
|
10129
|
+
currentToolName = completeResponse.nextStep.toolName;
|
|
10130
|
+
currentToolArguments = completeResponse.nextStep.toolArguments;
|
|
10131
|
+
currentProvider = completeResponse.nextStep.provider;
|
|
10132
|
+
stepIndex++;
|
|
10133
|
+
continue;
|
|
10134
|
+
}
|
|
10135
|
+
const finalUpdates = {
|
|
10136
|
+
lastRunAt: executedAt,
|
|
10137
|
+
runCount: (trigger.runCount || 0) + 1
|
|
10138
|
+
};
|
|
10139
|
+
if (stepSuccess) {
|
|
10140
|
+
finalUpdates.lastResult = toolResult;
|
|
10141
|
+
finalUpdates.lastError = undefined;
|
|
10142
|
+
if (trigger.schedule.type === "once") {
|
|
10143
|
+
finalUpdates.status = "completed";
|
|
10144
|
+
}
|
|
10145
|
+
} else {
|
|
10146
|
+
finalUpdates.lastError = stepError;
|
|
10147
|
+
finalUpdates.status = "failed";
|
|
10148
|
+
}
|
|
10149
|
+
await config.triggers.update(trigger.id, finalUpdates, context);
|
|
10150
|
+
if (completeResponse.webhooks && completeResponse.webhooks.length > 0) {
|
|
10151
|
+
const totalDuration = steps.reduce((sum, s) => sum + (s.duration || 0), 0);
|
|
10152
|
+
const payload = {
|
|
10153
|
+
triggerId: trigger.id,
|
|
10154
|
+
success: steps.every((s) => s.success),
|
|
10155
|
+
steps,
|
|
10156
|
+
totalSteps: steps.length,
|
|
10157
|
+
totalDuration,
|
|
10158
|
+
executedAt
|
|
10159
|
+
};
|
|
10160
|
+
deliverWebhooks(completeResponse.webhooks, payload, WEBHOOK_DELIVERY_TIMEOUT_MS).catch(() => {});
|
|
10161
|
+
}
|
|
10162
|
+
return { success: stepSuccess, steps, error: stepError };
|
|
10163
|
+
}
|
|
10164
|
+
const limitError = `Trigger execution exceeded maximum of ${MAX_TRIGGER_STEPS} steps`;
|
|
10165
|
+
logger30.error(`[Trigger ${trigger.id}] ${limitError}`);
|
|
10166
|
+
await config.triggers.update(trigger.id, {
|
|
10167
|
+
lastRunAt: new Date().toISOString(),
|
|
10168
|
+
runCount: (trigger.runCount || 0) + 1,
|
|
10169
|
+
lastError: limitError,
|
|
10170
|
+
status: "failed"
|
|
10171
|
+
}, context);
|
|
10172
|
+
return { success: false, steps, error: limitError };
|
|
10173
|
+
}
|
|
10174
|
+
var logger30;
|
|
10175
|
+
var init_executor = __esm(() => {
|
|
10176
|
+
init_logger();
|
|
10177
|
+
init_utils2();
|
|
10178
|
+
init_webhooks();
|
|
10179
|
+
logger30 = createLogger("TriggerExecutor", "server");
|
|
10180
|
+
});
|
|
10181
|
+
|
|
10034
10182
|
// ../server.ts
|
|
10035
10183
|
var exports_server = {};
|
|
10036
10184
|
__export(exports_server, {
|
|
@@ -10124,7 +10272,7 @@ function createMCPServer(config) {
|
|
|
10124
10272
|
if (integration.oauth) {
|
|
10125
10273
|
const { clientId, clientSecret, redirectUri: integrationRedirectUri, config: oauthConfig } = integration.oauth;
|
|
10126
10274
|
if (!clientId || !clientSecret) {
|
|
10127
|
-
|
|
10275
|
+
logger31.warn(`Warning: Integration "${integration.id}" is missing OAuth credentials. ` + `Provide clientId and clientSecret in the integration configuration.`);
|
|
10128
10276
|
return integration;
|
|
10129
10277
|
}
|
|
10130
10278
|
const redirectUri = integrationRedirectUri || config.redirectUri || getDefaultRedirectUri();
|
|
@@ -10255,7 +10403,7 @@ function createMCPServer(config) {
|
|
|
10255
10403
|
}
|
|
10256
10404
|
return response2;
|
|
10257
10405
|
} catch (error) {
|
|
10258
|
-
|
|
10406
|
+
logger31.error("[MCP Tool Call] Error:", error);
|
|
10259
10407
|
return Response.json({ error: error.message || "Failed to execute tool call" }, { status: error.statusCode || 500 });
|
|
10260
10408
|
}
|
|
10261
10409
|
}
|
|
@@ -10271,6 +10419,57 @@ function createMCPServer(config) {
|
|
|
10271
10419
|
}));
|
|
10272
10420
|
return Response.json({ integrations });
|
|
10273
10421
|
}
|
|
10422
|
+
if (segments.length === 2 && segments[0] === "triggers" && segments[1] === "notify" && method === "POST") {
|
|
10423
|
+
if (!config.triggers) {
|
|
10424
|
+
return Response.json({ error: "Triggers not configured. Add triggers callbacks to createMCPServer config." }, { status: 501 });
|
|
10425
|
+
}
|
|
10426
|
+
try {
|
|
10427
|
+
const apiKey = webRequest.headers.get("x-api-key");
|
|
10428
|
+
if (!apiKey || apiKey !== config.apiKey) {
|
|
10429
|
+
return Response.json({ error: "Unauthorized" }, { status: 401 });
|
|
10430
|
+
}
|
|
10431
|
+
const body = await webRequest.json();
|
|
10432
|
+
const { triggerId } = body;
|
|
10433
|
+
if (!triggerId) {
|
|
10434
|
+
return Response.json({ error: "triggerId is required" }, { status: 400 });
|
|
10435
|
+
}
|
|
10436
|
+
const trigger = await config.triggers.get(triggerId);
|
|
10437
|
+
if (!trigger) {
|
|
10438
|
+
return Response.json({ error: "Trigger not found" }, { status: 404 });
|
|
10439
|
+
}
|
|
10440
|
+
if (!trigger.provider) {
|
|
10441
|
+
return Response.json({ error: "Trigger has no provider configured" }, { status: 400 });
|
|
10442
|
+
}
|
|
10443
|
+
const triggerContext = trigger.userId ? { userId: trigger.userId } : undefined;
|
|
10444
|
+
const { executeTrigger: executeTrigger2 } = await Promise.resolve().then(() => (init_executor(), exports_executor));
|
|
10445
|
+
const { OAuthHandler } = await Promise.resolve().then(() => (init_base_handler(), exports_base_handler));
|
|
10446
|
+
const oauthHandler = new OAuthHandler({
|
|
10447
|
+
providers,
|
|
10448
|
+
serverUrl: config.serverUrl,
|
|
10449
|
+
apiKey: config.apiKey,
|
|
10450
|
+
setProviderToken: config.setProviderToken,
|
|
10451
|
+
removeProviderToken: config.removeProviderToken,
|
|
10452
|
+
getSessionContext: config.getSessionContext
|
|
10453
|
+
});
|
|
10454
|
+
const executionResult = await executeTrigger2(trigger, {
|
|
10455
|
+
triggers: config.triggers,
|
|
10456
|
+
getProviderToken: async (provider, email, ctx) => {
|
|
10457
|
+
return config.getProviderToken ? await config.getProviderToken(provider, email, ctx) : undefined;
|
|
10458
|
+
},
|
|
10459
|
+
handleToolCall: (toolBody, authHeader, integrationsHeader) => {
|
|
10460
|
+
return oauthHandler.handleToolCall(toolBody, authHeader, integrationsHeader);
|
|
10461
|
+
}
|
|
10462
|
+
}, triggerContext);
|
|
10463
|
+
return Response.json({
|
|
10464
|
+
success: executionResult.success,
|
|
10465
|
+
steps: executionResult.steps,
|
|
10466
|
+
error: executionResult.error
|
|
10467
|
+
});
|
|
10468
|
+
} catch (error) {
|
|
10469
|
+
logger31.error("[Trigger Notify] Error:", error);
|
|
10470
|
+
return Response.json({ error: error.message || "Failed to execute trigger" }, { status: 500 });
|
|
10471
|
+
}
|
|
10472
|
+
}
|
|
10274
10473
|
if (segments.length >= 1 && segments[0] === "triggers") {
|
|
10275
10474
|
if (!config.triggers) {
|
|
10276
10475
|
return Response.json({ error: "Triggers not configured. Add triggers callbacks to createMCPServer config." }, { status: 501 });
|
|
@@ -10311,8 +10510,9 @@ function createMCPServer(config) {
|
|
|
10311
10510
|
};
|
|
10312
10511
|
const created = await config.triggers.create(trigger, context2);
|
|
10313
10512
|
const schedulerUrl = config.schedulerUrl || config.serverUrl || "https://mcp.integrate.dev";
|
|
10314
|
-
const
|
|
10513
|
+
const defaultCallbackBaseUrl = process.env.INTEGRATE_URL || (typeof window !== "undefined" ? window.location.origin : "http://localhost:3000");
|
|
10315
10514
|
try {
|
|
10515
|
+
const callbackBaseUrl = config.triggers.getCallbackUrl ? await config.triggers.getCallbackUrl(context2) : defaultCallbackBaseUrl;
|
|
10316
10516
|
await fetch(`${schedulerUrl}/scheduler/register`, {
|
|
10317
10517
|
method: "POST",
|
|
10318
10518
|
headers: {
|
|
@@ -10322,8 +10522,7 @@ function createMCPServer(config) {
|
|
|
10322
10522
|
body: JSON.stringify({
|
|
10323
10523
|
triggerId: created.id,
|
|
10324
10524
|
schedule: created.schedule,
|
|
10325
|
-
callbackUrl: `${callbackBaseUrl}/api/integrate/triggers
|
|
10326
|
-
completeUrl: `${callbackBaseUrl}/api/integrate/triggers/${created.id}/complete`,
|
|
10525
|
+
callbackUrl: `${callbackBaseUrl}/api/integrate/triggers/notify`,
|
|
10327
10526
|
metadata: {
|
|
10328
10527
|
userId: context2?.userId,
|
|
10329
10528
|
provider: created.provider
|
|
@@ -10331,7 +10530,7 @@ function createMCPServer(config) {
|
|
|
10331
10530
|
})
|
|
10332
10531
|
});
|
|
10333
10532
|
} catch (scheduleError) {
|
|
10334
|
-
|
|
10533
|
+
logger31.error("[Trigger] Failed to register with scheduler:", scheduleError);
|
|
10335
10534
|
}
|
|
10336
10535
|
return Response.json(created, { status: 201 });
|
|
10337
10536
|
}
|
|
@@ -10366,7 +10565,7 @@ function createMCPServer(config) {
|
|
|
10366
10565
|
body: JSON.stringify({ triggerId })
|
|
10367
10566
|
});
|
|
10368
10567
|
} catch (error) {
|
|
10369
|
-
|
|
10568
|
+
logger31.error("[Trigger] Failed to pause in scheduler:", error);
|
|
10370
10569
|
}
|
|
10371
10570
|
return Response.json(updated);
|
|
10372
10571
|
} else if (subAction === "resume" && method === "POST") {
|
|
@@ -10394,7 +10593,7 @@ function createMCPServer(config) {
|
|
|
10394
10593
|
body: JSON.stringify({ triggerId })
|
|
10395
10594
|
});
|
|
10396
10595
|
} catch (error) {
|
|
10397
|
-
|
|
10596
|
+
logger31.error("[Trigger] Failed to resume in scheduler:", error);
|
|
10398
10597
|
}
|
|
10399
10598
|
return Response.json(updated);
|
|
10400
10599
|
} else if (subAction === "run" && method === "POST") {
|
|
@@ -10405,10 +10604,7 @@ function createMCPServer(config) {
|
|
|
10405
10604
|
if (!trigger.provider) {
|
|
10406
10605
|
return Response.json({ error: "Trigger has no provider configured" }, { status: 400 });
|
|
10407
10606
|
}
|
|
10408
|
-
const
|
|
10409
|
-
if (!providerToken) {
|
|
10410
|
-
return Response.json({ error: "No OAuth token available for this trigger" }, { status: 401 });
|
|
10411
|
-
}
|
|
10607
|
+
const { executeTrigger: executeTrigger2 } = await Promise.resolve().then(() => (init_executor(), exports_executor));
|
|
10412
10608
|
const { OAuthHandler } = await Promise.resolve().then(() => (init_base_handler(), exports_base_handler));
|
|
10413
10609
|
const oauthHandler = new OAuthHandler({
|
|
10414
10610
|
providers,
|
|
@@ -10418,145 +10614,23 @@ function createMCPServer(config) {
|
|
|
10418
10614
|
removeProviderToken: config.removeProviderToken,
|
|
10419
10615
|
getSessionContext: config.getSessionContext
|
|
10420
10616
|
});
|
|
10421
|
-
const
|
|
10422
|
-
|
|
10423
|
-
|
|
10424
|
-
|
|
10425
|
-
const executionResult = {
|
|
10426
|
-
success: true,
|
|
10427
|
-
result,
|
|
10428
|
-
executedAt: new Date().toISOString(),
|
|
10429
|
-
duration
|
|
10430
|
-
};
|
|
10431
|
-
await config.triggers.update(triggerId, {
|
|
10432
|
-
lastRunAt: executionResult.executedAt,
|
|
10433
|
-
runCount: (trigger.runCount || 0) + 1,
|
|
10434
|
-
lastResult: result,
|
|
10435
|
-
lastError: undefined
|
|
10436
|
-
}, context2);
|
|
10437
|
-
return Response.json(executionResult);
|
|
10438
|
-
} catch (error) {
|
|
10439
|
-
const duration = Date.now() - startTime;
|
|
10440
|
-
const executionResult = {
|
|
10441
|
-
success: false,
|
|
10442
|
-
error: error.message || "Tool execution failed",
|
|
10443
|
-
executedAt: new Date().toISOString(),
|
|
10444
|
-
duration
|
|
10445
|
-
};
|
|
10446
|
-
await config.triggers.update(triggerId, {
|
|
10447
|
-
lastRunAt: executionResult.executedAt,
|
|
10448
|
-
runCount: (trigger.runCount || 0) + 1,
|
|
10449
|
-
lastError: error.message,
|
|
10450
|
-
status: "failed"
|
|
10451
|
-
}, context2);
|
|
10452
|
-
return Response.json(executionResult, { status: 500 });
|
|
10453
|
-
}
|
|
10454
|
-
} else if (subAction === "execute" && method === "GET") {
|
|
10455
|
-
const apiKey = webRequest.headers.get("x-api-key");
|
|
10456
|
-
if (!apiKey || apiKey !== config.apiKey) {
|
|
10457
|
-
return Response.json({ error: "Unauthorized" }, { status: 401 });
|
|
10458
|
-
}
|
|
10459
|
-
const trigger = await config.triggers.get(triggerId, context2);
|
|
10460
|
-
if (!trigger) {
|
|
10461
|
-
return Response.json({ error: "Trigger not found" }, { status: 404 });
|
|
10462
|
-
}
|
|
10463
|
-
if (!trigger.provider) {
|
|
10464
|
-
return Response.json({ error: "Trigger has no provider configured" }, { status: 400 });
|
|
10465
|
-
}
|
|
10466
|
-
const providerToken = config.getProviderToken ? await config.getProviderToken(trigger.provider, undefined, context2) : undefined;
|
|
10467
|
-
if (!providerToken) {
|
|
10468
|
-
return Response.json({ error: "No OAuth token available for this trigger" }, { status: 401 });
|
|
10469
|
-
}
|
|
10470
|
-
return Response.json({
|
|
10471
|
-
trigger: {
|
|
10472
|
-
id: trigger.id,
|
|
10473
|
-
toolName: trigger.toolName,
|
|
10474
|
-
toolArguments: trigger.toolArguments,
|
|
10475
|
-
provider: trigger.provider
|
|
10617
|
+
const executionResult = await executeTrigger2(trigger, {
|
|
10618
|
+
triggers: config.triggers,
|
|
10619
|
+
getProviderToken: async (provider, email, ctx) => {
|
|
10620
|
+
return config.getProviderToken ? await config.getProviderToken(provider, email, ctx) : undefined;
|
|
10476
10621
|
},
|
|
10477
|
-
|
|
10478
|
-
|
|
10479
|
-
});
|
|
10480
|
-
} else if (subAction === "complete" && method === "POST") {
|
|
10481
|
-
const apiKey = webRequest.headers.get("x-api-key");
|
|
10482
|
-
if (!apiKey || apiKey !== config.apiKey) {
|
|
10483
|
-
return Response.json({ error: "Unauthorized" }, { status: 401 });
|
|
10484
|
-
}
|
|
10485
|
-
const body = await webRequest.json();
|
|
10486
|
-
const trigger = await config.triggers.get(triggerId, context2);
|
|
10487
|
-
if (!trigger) {
|
|
10488
|
-
return Response.json({ error: "Trigger not found" }, { status: 404 });
|
|
10489
|
-
}
|
|
10490
|
-
if (body.stepIndex != null) {
|
|
10491
|
-
const { validateStepLimit: validateStepLimit2 } = await Promise.resolve().then(() => (init_utils2(), exports_utils));
|
|
10492
|
-
const { MAX_TRIGGER_STEPS: MAX_TRIGGER_STEPS2 } = await Promise.resolve().then(() => exports_types);
|
|
10493
|
-
const stepValidation = validateStepLimit2(body.stepIndex, MAX_TRIGGER_STEPS2);
|
|
10494
|
-
if (!stepValidation.valid) {
|
|
10495
|
-
return Response.json({ error: stepValidation.error }, { status: 400 });
|
|
10622
|
+
handleToolCall: (toolBody, authHeader, integrationsHeader) => {
|
|
10623
|
+
return oauthHandler.handleToolCall(toolBody, authHeader, integrationsHeader);
|
|
10496
10624
|
}
|
|
10497
|
-
}
|
|
10498
|
-
|
|
10499
|
-
|
|
10500
|
-
|
|
10501
|
-
|
|
10502
|
-
|
|
10503
|
-
|
|
10504
|
-
|
|
10505
|
-
|
|
10506
|
-
return Response.json(completeResponse);
|
|
10507
|
-
}
|
|
10508
|
-
const updates2 = {
|
|
10509
|
-
lastRunAt: body.executedAt,
|
|
10510
|
-
runCount: (trigger.runCount || 0) + 1
|
|
10511
|
-
};
|
|
10512
|
-
if (body.success) {
|
|
10513
|
-
updates2.lastResult = body.result;
|
|
10514
|
-
updates2.lastError = undefined;
|
|
10515
|
-
if (trigger.schedule.type === "once") {
|
|
10516
|
-
updates2.status = "completed";
|
|
10517
|
-
}
|
|
10518
|
-
} else {
|
|
10519
|
-
updates2.lastError = body.error;
|
|
10520
|
-
updates2.status = "failed";
|
|
10521
|
-
}
|
|
10522
|
-
await config.triggers.update(triggerId, updates2, context2);
|
|
10523
|
-
if (completeResponse.webhooks && completeResponse.webhooks.length > 0) {
|
|
10524
|
-
const { deliverWebhooks: deliverWebhooks2 } = await Promise.resolve().then(() => (init_webhooks(), exports_webhooks));
|
|
10525
|
-
const { WEBHOOK_DELIVERY_TIMEOUT_MS: WEBHOOK_DELIVERY_TIMEOUT_MS2 } = await Promise.resolve().then(() => exports_types);
|
|
10526
|
-
const steps = body.previousResults || [];
|
|
10527
|
-
const totalDuration = steps.reduce((sum, s) => sum + (s.duration || 0), 0);
|
|
10528
|
-
const payload = {
|
|
10529
|
-
triggerId,
|
|
10530
|
-
success: body.success,
|
|
10531
|
-
steps,
|
|
10532
|
-
totalSteps: steps.length,
|
|
10533
|
-
totalDuration,
|
|
10534
|
-
executedAt: body.executedAt
|
|
10535
|
-
};
|
|
10536
|
-
deliverWebhooks2(completeResponse.webhooks, payload, WEBHOOK_DELIVERY_TIMEOUT_MS2).catch(() => {});
|
|
10537
|
-
}
|
|
10538
|
-
return Response.json(completeResponse);
|
|
10539
|
-
} catch (error) {
|
|
10540
|
-
logger30.error("onComplete callback error:", error);
|
|
10541
|
-
return Response.json({ error: "Internal server error in onComplete callback" }, { status: 500 });
|
|
10542
|
-
}
|
|
10543
|
-
}
|
|
10544
|
-
const updates = {
|
|
10545
|
-
lastRunAt: body.executedAt,
|
|
10546
|
-
runCount: (trigger.runCount || 0) + 1
|
|
10547
|
-
};
|
|
10548
|
-
if (body.success) {
|
|
10549
|
-
updates.lastResult = body.result;
|
|
10550
|
-
updates.lastError = undefined;
|
|
10551
|
-
if (trigger.schedule.type === "once") {
|
|
10552
|
-
updates.status = "completed";
|
|
10553
|
-
}
|
|
10554
|
-
} else {
|
|
10555
|
-
updates.lastError = body.error;
|
|
10556
|
-
updates.status = "failed";
|
|
10557
|
-
}
|
|
10558
|
-
await config.triggers.update(triggerId, updates, context2);
|
|
10559
|
-
return Response.json({ success: true });
|
|
10625
|
+
}, context2);
|
|
10626
|
+
return Response.json({
|
|
10627
|
+
success: executionResult.success,
|
|
10628
|
+
result: executionResult.steps[0]?.result,
|
|
10629
|
+
executedAt: executionResult.steps[0]?.executedAt || new Date().toISOString(),
|
|
10630
|
+
duration: executionResult.steps[0]?.duration,
|
|
10631
|
+
error: executionResult.error,
|
|
10632
|
+
steps: executionResult.steps
|
|
10633
|
+
}, { status: executionResult.success ? 200 : 500 });
|
|
10560
10634
|
} else if (!subAction && method === "GET") {
|
|
10561
10635
|
const trigger = await config.triggers.get(triggerId, context2);
|
|
10562
10636
|
if (!trigger) {
|
|
@@ -10589,7 +10663,7 @@ function createMCPServer(config) {
|
|
|
10589
10663
|
})
|
|
10590
10664
|
});
|
|
10591
10665
|
} catch (error) {
|
|
10592
|
-
|
|
10666
|
+
logger31.error("[Trigger] Failed to update scheduler:", error);
|
|
10593
10667
|
}
|
|
10594
10668
|
}
|
|
10595
10669
|
return Response.json(updated);
|
|
@@ -10606,14 +10680,14 @@ function createMCPServer(config) {
|
|
|
10606
10680
|
body: JSON.stringify({ triggerId })
|
|
10607
10681
|
});
|
|
10608
10682
|
} catch (error) {
|
|
10609
|
-
|
|
10683
|
+
logger31.error("[Trigger] Failed to unregister from scheduler:", error);
|
|
10610
10684
|
}
|
|
10611
10685
|
return new Response(null, { status: 204 });
|
|
10612
10686
|
}
|
|
10613
10687
|
}
|
|
10614
10688
|
return Response.json({ error: "Invalid trigger route or method" }, { status: 404 });
|
|
10615
10689
|
} catch (error) {
|
|
10616
|
-
|
|
10690
|
+
logger31.error("[Trigger] Error:", error);
|
|
10617
10691
|
return Response.json({ error: error.message || "Failed to process trigger request" }, { status: error.statusCode || 500 });
|
|
10618
10692
|
}
|
|
10619
10693
|
}
|
|
@@ -10639,11 +10713,11 @@ function createMCPServer(config) {
|
|
|
10639
10713
|
const errorRedirectUrl = "/auth-error";
|
|
10640
10714
|
if (error) {
|
|
10641
10715
|
const errorMsg = errorDescription || error;
|
|
10642
|
-
|
|
10716
|
+
logger31.error("[OAuth Redirect] Error:", errorMsg);
|
|
10643
10717
|
return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent(errorMsg)}`, webRequest.url));
|
|
10644
10718
|
}
|
|
10645
10719
|
if (!code || !state) {
|
|
10646
|
-
|
|
10720
|
+
logger31.error("[OAuth Redirect] Missing code or state parameter");
|
|
10647
10721
|
return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent("Invalid OAuth callback")}`, webRequest.url));
|
|
10648
10722
|
}
|
|
10649
10723
|
let returnUrl = defaultRedirectUrl;
|
|
@@ -10719,7 +10793,7 @@ function createMCPServer(config) {
|
|
|
10719
10793
|
frontendUrl.hash = `oauth_callback=${encodeURIComponent(JSON.stringify({ code, state, tokenData }))}`;
|
|
10720
10794
|
return Response.redirect(frontendUrl);
|
|
10721
10795
|
} catch (error2) {
|
|
10722
|
-
|
|
10796
|
+
logger31.error("[OAuth Backend Callback] Error:", error2);
|
|
10723
10797
|
return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent(error2.message || "Failed to exchange token")}`, webRequest.url));
|
|
10724
10798
|
}
|
|
10725
10799
|
} else {
|
|
@@ -10938,7 +11012,7 @@ function toSvelteKitHandler(clientOrHandlerOrOptions, _redirectOptions) {
|
|
|
10938
11012
|
}
|
|
10939
11013
|
};
|
|
10940
11014
|
}
|
|
10941
|
-
var SERVER_LOG_CONTEXT = "server",
|
|
11015
|
+
var SERVER_LOG_CONTEXT = "server", logger31, globalServerConfig = null, codeVerifierStorage, POST = async (req, context) => {
|
|
10942
11016
|
if (!globalServerConfig) {
|
|
10943
11017
|
return Response.json({ error: "OAuth not configured. Call createMCPServer() in your server initialization file first." }, { status: 500 });
|
|
10944
11018
|
}
|
|
@@ -10986,7 +11060,7 @@ var init_server = __esm(() => {
|
|
|
10986
11060
|
init_anthropic();
|
|
10987
11061
|
init_google();
|
|
10988
11062
|
init_ai();
|
|
10989
|
-
|
|
11063
|
+
logger31 = createLogger("MCPServer", SERVER_LOG_CONTEXT);
|
|
10990
11064
|
codeVerifierStorage = new Map;
|
|
10991
11065
|
});
|
|
10992
11066
|
|
|
@@ -11337,7 +11411,7 @@ class OAuthHandler {
|
|
|
11337
11411
|
url.searchParams.set("state", authorizeRequest.state);
|
|
11338
11412
|
url.searchParams.set("code_challenge", authorizeRequest.codeChallenge);
|
|
11339
11413
|
url.searchParams.set("code_challenge_method", authorizeRequest.codeChallengeMethod);
|
|
11340
|
-
const redirectUri =
|
|
11414
|
+
const redirectUri = providerConfig.redirectUri;
|
|
11341
11415
|
if (redirectUri) {
|
|
11342
11416
|
url.searchParams.set("redirect_uri", redirectUri);
|
|
11343
11417
|
}
|
|
@@ -11449,7 +11523,7 @@ class OAuthHandler {
|
|
|
11449
11523
|
tokenType: result.tokenType,
|
|
11450
11524
|
expiresIn: result.expiresIn,
|
|
11451
11525
|
expiresAt: result.expiresAt,
|
|
11452
|
-
scopes: result.scopes
|
|
11526
|
+
scopes: result.scopes ? result.scopes.flatMap((s) => s.split(" ").filter(Boolean)) : result.scopes
|
|
11453
11527
|
};
|
|
11454
11528
|
await this.config.setProviderToken(callbackRequest.provider, tokenData, undefined, context);
|
|
11455
11529
|
} catch (error) {}
|
|
@@ -11499,11 +11573,11 @@ class OAuthHandler {
|
|
|
11499
11573
|
try {
|
|
11500
11574
|
await this.config.removeProviderToken(request.provider, undefined, context);
|
|
11501
11575
|
} catch (error) {
|
|
11502
|
-
|
|
11576
|
+
logger32.error(`Failed to delete token for ${request.provider} from database via removeProviderToken:`, error);
|
|
11503
11577
|
}
|
|
11504
11578
|
}
|
|
11505
11579
|
} catch (error) {
|
|
11506
|
-
|
|
11580
|
+
logger32.error(`Failed to extract context for disconnect:`, error);
|
|
11507
11581
|
}
|
|
11508
11582
|
}
|
|
11509
11583
|
const url = new URL("/oauth/disconnect", this.serverUrl);
|
|
@@ -11563,10 +11637,10 @@ class OAuthHandler {
|
|
|
11563
11637
|
return jsonRpcResponse.result;
|
|
11564
11638
|
}
|
|
11565
11639
|
}
|
|
11566
|
-
var SERVER_LOG_CONTEXT2 = "server",
|
|
11640
|
+
var SERVER_LOG_CONTEXT2 = "server", logger32, MCP_SERVER_URL2 = "https://mcp.integrate.dev/api/v1/mcp";
|
|
11567
11641
|
var init_base_handler = __esm(() => {
|
|
11568
11642
|
init_logger();
|
|
11569
|
-
|
|
11643
|
+
logger32 = createLogger("OAuthHandler", SERVER_LOG_CONTEXT2);
|
|
11570
11644
|
});
|
|
11571
11645
|
|
|
11572
11646
|
// nextjs.ts
|
|
@@ -11585,7 +11659,7 @@ function createNextOAuthHandler(config) {
|
|
|
11585
11659
|
}
|
|
11586
11660
|
return response;
|
|
11587
11661
|
} catch (error) {
|
|
11588
|
-
|
|
11662
|
+
logger33.error("[OAuth Authorize] Error:", error);
|
|
11589
11663
|
return Response.json({ error: error.message || "Failed to get authorization URL" }, { status: 500 });
|
|
11590
11664
|
}
|
|
11591
11665
|
},
|
|
@@ -11601,7 +11675,7 @@ function createNextOAuthHandler(config) {
|
|
|
11601
11675
|
}
|
|
11602
11676
|
return response;
|
|
11603
11677
|
} catch (error) {
|
|
11604
|
-
|
|
11678
|
+
logger33.error("[OAuth Callback] Error:", error);
|
|
11605
11679
|
return Response.json({ error: error.message || "Failed to exchange authorization code" }, { status: 500 });
|
|
11606
11680
|
}
|
|
11607
11681
|
},
|
|
@@ -11623,7 +11697,7 @@ function createNextOAuthHandler(config) {
|
|
|
11623
11697
|
}
|
|
11624
11698
|
return response;
|
|
11625
11699
|
} catch (error) {
|
|
11626
|
-
|
|
11700
|
+
logger33.error("[OAuth Status] Error:", error);
|
|
11627
11701
|
return Response.json({ error: error.message || "Failed to check authorization status" }, { status: 500 });
|
|
11628
11702
|
}
|
|
11629
11703
|
},
|
|
@@ -11646,7 +11720,7 @@ function createNextOAuthHandler(config) {
|
|
|
11646
11720
|
}
|
|
11647
11721
|
return response;
|
|
11648
11722
|
} catch (error) {
|
|
11649
|
-
|
|
11723
|
+
logger33.error("[OAuth Disconnect] Error:", error);
|
|
11650
11724
|
return Response.json({ error: error.message || "Failed to disconnect provider" }, { status: 500 });
|
|
11651
11725
|
}
|
|
11652
11726
|
},
|
|
@@ -11687,7 +11761,7 @@ function createNextOAuthHandler(config) {
|
|
|
11687
11761
|
const result = await handler.handleToolCall(body, authHeader, integrationsHeader);
|
|
11688
11762
|
return Response.json(result);
|
|
11689
11763
|
} catch (error) {
|
|
11690
|
-
|
|
11764
|
+
logger33.error("[MCP Tool Call] Error:", error);
|
|
11691
11765
|
return Response.json({ error: error.message || "Failed to execute tool call" }, { status: error.statusCode || 500 });
|
|
11692
11766
|
}
|
|
11693
11767
|
},
|
|
@@ -11732,11 +11806,11 @@ function createNextOAuthHandler(config) {
|
|
|
11732
11806
|
const errorDescription = searchParams.get("error_description");
|
|
11733
11807
|
if (error) {
|
|
11734
11808
|
const errorMsg = errorDescription || error;
|
|
11735
|
-
|
|
11809
|
+
logger33.error("[OAuth Redirect] Error:", errorMsg);
|
|
11736
11810
|
return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent(errorMsg)}`, req.url));
|
|
11737
11811
|
}
|
|
11738
11812
|
if (!code || !state) {
|
|
11739
|
-
|
|
11813
|
+
logger33.error("[OAuth Redirect] Missing code or state parameter");
|
|
11740
11814
|
return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent("Invalid OAuth callback")}`, req.url));
|
|
11741
11815
|
}
|
|
11742
11816
|
let returnUrl = defaultRedirectUrl;
|
|
@@ -11775,11 +11849,11 @@ function createNextOAuthHandler(config) {
|
|
|
11775
11849
|
};
|
|
11776
11850
|
return handlers;
|
|
11777
11851
|
}
|
|
11778
|
-
var SERVER_LOG_CONTEXT3 = "server",
|
|
11852
|
+
var SERVER_LOG_CONTEXT3 = "server", logger33;
|
|
11779
11853
|
var init_nextjs = __esm(() => {
|
|
11780
11854
|
init_base_handler();
|
|
11781
11855
|
init_logger();
|
|
11782
|
-
|
|
11856
|
+
logger33 = createLogger("NextJSOAuth", SERVER_LOG_CONTEXT3);
|
|
11783
11857
|
});
|
|
11784
11858
|
export {
|
|
11785
11859
|
toWebRequest,
|