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