integrate-sdk 0.8.61-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 +250 -189
- package/dist/adapters/base-handler.d.ts.map +1 -1
- package/dist/adapters/index.js +247 -186
- package/dist/adapters/nextjs.js +247 -186
- package/dist/adapters/node.js +247 -186
- package/dist/adapters/svelte-kit.js +247 -186
- package/dist/adapters/tanstack-start.js +247 -186
- package/dist/index.js +241 -180
- package/dist/oauth.js +241 -180
- package/dist/server.js +234 -173
- package/dist/src/adapters/base-handler.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
|
@@ -9968,21 +9968,7 @@ var init_ai = __esm(() => {
|
|
|
9968
9968
|
init_trigger_tools();
|
|
9969
9969
|
});
|
|
9970
9970
|
|
|
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
9971
|
// ../triggers/webhooks.ts
|
|
9980
|
-
var exports_webhooks = {};
|
|
9981
|
-
__export(exports_webhooks, {
|
|
9982
|
-
signPayload: () => signPayload,
|
|
9983
|
-
deliverWebhooks: () => deliverWebhooks,
|
|
9984
|
-
deliverWebhook: () => deliverWebhook
|
|
9985
|
-
});
|
|
9986
9972
|
async function signPayload(payload, secret) {
|
|
9987
9973
|
const encoder = new TextEncoder;
|
|
9988
9974
|
const data = encoder.encode(JSON.stringify(payload));
|
|
@@ -10031,6 +10017,155 @@ var init_webhooks = __esm(() => {
|
|
|
10031
10017
|
logger29 = createLogger("Webhooks", "server");
|
|
10032
10018
|
});
|
|
10033
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
|
+
|
|
10034
10169
|
// ../server.ts
|
|
10035
10170
|
var exports_server = {};
|
|
10036
10171
|
__export(exports_server, {
|
|
@@ -10124,7 +10259,7 @@ function createMCPServer(config) {
|
|
|
10124
10259
|
if (integration.oauth) {
|
|
10125
10260
|
const { clientId, clientSecret, redirectUri: integrationRedirectUri, config: oauthConfig } = integration.oauth;
|
|
10126
10261
|
if (!clientId || !clientSecret) {
|
|
10127
|
-
|
|
10262
|
+
logger31.warn(`Warning: Integration "${integration.id}" is missing OAuth credentials. ` + `Provide clientId and clientSecret in the integration configuration.`);
|
|
10128
10263
|
return integration;
|
|
10129
10264
|
}
|
|
10130
10265
|
const redirectUri = integrationRedirectUri || config.redirectUri || getDefaultRedirectUri();
|
|
@@ -10255,7 +10390,7 @@ function createMCPServer(config) {
|
|
|
10255
10390
|
}
|
|
10256
10391
|
return response2;
|
|
10257
10392
|
} catch (error) {
|
|
10258
|
-
|
|
10393
|
+
logger31.error("[MCP Tool Call] Error:", error);
|
|
10259
10394
|
return Response.json({ error: error.message || "Failed to execute tool call" }, { status: error.statusCode || 500 });
|
|
10260
10395
|
}
|
|
10261
10396
|
}
|
|
@@ -10271,6 +10406,57 @@ function createMCPServer(config) {
|
|
|
10271
10406
|
}));
|
|
10272
10407
|
return Response.json({ integrations });
|
|
10273
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
|
+
}
|
|
10274
10460
|
if (segments.length >= 1 && segments[0] === "triggers") {
|
|
10275
10461
|
if (!config.triggers) {
|
|
10276
10462
|
return Response.json({ error: "Triggers not configured. Add triggers callbacks to createMCPServer config." }, { status: 501 });
|
|
@@ -10311,8 +10497,9 @@ function createMCPServer(config) {
|
|
|
10311
10497
|
};
|
|
10312
10498
|
const created = await config.triggers.create(trigger, context2);
|
|
10313
10499
|
const schedulerUrl = config.schedulerUrl || config.serverUrl || "https://mcp.integrate.dev";
|
|
10314
|
-
const
|
|
10500
|
+
const defaultCallbackBaseUrl = process.env.INTEGRATE_URL || (typeof window !== "undefined" ? window.location.origin : "http://localhost:3000");
|
|
10315
10501
|
try {
|
|
10502
|
+
const callbackBaseUrl = config.triggers.getCallbackUrl ? await config.triggers.getCallbackUrl(context2) : defaultCallbackBaseUrl;
|
|
10316
10503
|
await fetch(`${schedulerUrl}/scheduler/register`, {
|
|
10317
10504
|
method: "POST",
|
|
10318
10505
|
headers: {
|
|
@@ -10322,8 +10509,7 @@ function createMCPServer(config) {
|
|
|
10322
10509
|
body: JSON.stringify({
|
|
10323
10510
|
triggerId: created.id,
|
|
10324
10511
|
schedule: created.schedule,
|
|
10325
|
-
callbackUrl: `${callbackBaseUrl}/api/integrate/triggers
|
|
10326
|
-
completeUrl: `${callbackBaseUrl}/api/integrate/triggers/${created.id}/complete`,
|
|
10512
|
+
callbackUrl: `${callbackBaseUrl}/api/integrate/triggers/notify`,
|
|
10327
10513
|
metadata: {
|
|
10328
10514
|
userId: context2?.userId,
|
|
10329
10515
|
provider: created.provider
|
|
@@ -10331,7 +10517,7 @@ function createMCPServer(config) {
|
|
|
10331
10517
|
})
|
|
10332
10518
|
});
|
|
10333
10519
|
} catch (scheduleError) {
|
|
10334
|
-
|
|
10520
|
+
logger31.error("[Trigger] Failed to register with scheduler:", scheduleError);
|
|
10335
10521
|
}
|
|
10336
10522
|
return Response.json(created, { status: 201 });
|
|
10337
10523
|
}
|
|
@@ -10366,7 +10552,7 @@ function createMCPServer(config) {
|
|
|
10366
10552
|
body: JSON.stringify({ triggerId })
|
|
10367
10553
|
});
|
|
10368
10554
|
} catch (error) {
|
|
10369
|
-
|
|
10555
|
+
logger31.error("[Trigger] Failed to pause in scheduler:", error);
|
|
10370
10556
|
}
|
|
10371
10557
|
return Response.json(updated);
|
|
10372
10558
|
} else if (subAction === "resume" && method === "POST") {
|
|
@@ -10394,7 +10580,7 @@ function createMCPServer(config) {
|
|
|
10394
10580
|
body: JSON.stringify({ triggerId })
|
|
10395
10581
|
});
|
|
10396
10582
|
} catch (error) {
|
|
10397
|
-
|
|
10583
|
+
logger31.error("[Trigger] Failed to resume in scheduler:", error);
|
|
10398
10584
|
}
|
|
10399
10585
|
return Response.json(updated);
|
|
10400
10586
|
} else if (subAction === "run" && method === "POST") {
|
|
@@ -10405,10 +10591,7 @@ function createMCPServer(config) {
|
|
|
10405
10591
|
if (!trigger.provider) {
|
|
10406
10592
|
return Response.json({ error: "Trigger has no provider configured" }, { status: 400 });
|
|
10407
10593
|
}
|
|
10408
|
-
const
|
|
10409
|
-
if (!providerToken) {
|
|
10410
|
-
return Response.json({ error: "No OAuth token available for this trigger" }, { status: 401 });
|
|
10411
|
-
}
|
|
10594
|
+
const { executeTrigger: executeTrigger2 } = await Promise.resolve().then(() => (init_executor(), exports_executor));
|
|
10412
10595
|
const { OAuthHandler } = await Promise.resolve().then(() => (init_base_handler(), exports_base_handler));
|
|
10413
10596
|
const oauthHandler = new OAuthHandler({
|
|
10414
10597
|
providers,
|
|
@@ -10418,145 +10601,23 @@ function createMCPServer(config) {
|
|
|
10418
10601
|
removeProviderToken: config.removeProviderToken,
|
|
10419
10602
|
getSessionContext: config.getSessionContext
|
|
10420
10603
|
});
|
|
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
|
|
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;
|
|
10476
10608
|
},
|
|
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 });
|
|
10609
|
+
handleToolCall: (toolBody, authHeader, integrationsHeader) => {
|
|
10610
|
+
return oauthHandler.handleToolCall(toolBody, authHeader, integrationsHeader);
|
|
10496
10611
|
}
|
|
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 });
|
|
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 });
|
|
10560
10621
|
} else if (!subAction && method === "GET") {
|
|
10561
10622
|
const trigger = await config.triggers.get(triggerId, context2);
|
|
10562
10623
|
if (!trigger) {
|
|
@@ -10589,7 +10650,7 @@ function createMCPServer(config) {
|
|
|
10589
10650
|
})
|
|
10590
10651
|
});
|
|
10591
10652
|
} catch (error) {
|
|
10592
|
-
|
|
10653
|
+
logger31.error("[Trigger] Failed to update scheduler:", error);
|
|
10593
10654
|
}
|
|
10594
10655
|
}
|
|
10595
10656
|
return Response.json(updated);
|
|
@@ -10606,14 +10667,14 @@ function createMCPServer(config) {
|
|
|
10606
10667
|
body: JSON.stringify({ triggerId })
|
|
10607
10668
|
});
|
|
10608
10669
|
} catch (error) {
|
|
10609
|
-
|
|
10670
|
+
logger31.error("[Trigger] Failed to unregister from scheduler:", error);
|
|
10610
10671
|
}
|
|
10611
10672
|
return new Response(null, { status: 204 });
|
|
10612
10673
|
}
|
|
10613
10674
|
}
|
|
10614
10675
|
return Response.json({ error: "Invalid trigger route or method" }, { status: 404 });
|
|
10615
10676
|
} catch (error) {
|
|
10616
|
-
|
|
10677
|
+
logger31.error("[Trigger] Error:", error);
|
|
10617
10678
|
return Response.json({ error: error.message || "Failed to process trigger request" }, { status: error.statusCode || 500 });
|
|
10618
10679
|
}
|
|
10619
10680
|
}
|
|
@@ -10639,11 +10700,11 @@ function createMCPServer(config) {
|
|
|
10639
10700
|
const errorRedirectUrl = "/auth-error";
|
|
10640
10701
|
if (error) {
|
|
10641
10702
|
const errorMsg = errorDescription || error;
|
|
10642
|
-
|
|
10703
|
+
logger31.error("[OAuth Redirect] Error:", errorMsg);
|
|
10643
10704
|
return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent(errorMsg)}`, webRequest.url));
|
|
10644
10705
|
}
|
|
10645
10706
|
if (!code || !state) {
|
|
10646
|
-
|
|
10707
|
+
logger31.error("[OAuth Redirect] Missing code or state parameter");
|
|
10647
10708
|
return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent("Invalid OAuth callback")}`, webRequest.url));
|
|
10648
10709
|
}
|
|
10649
10710
|
let returnUrl = defaultRedirectUrl;
|
|
@@ -10719,7 +10780,7 @@ function createMCPServer(config) {
|
|
|
10719
10780
|
frontendUrl.hash = `oauth_callback=${encodeURIComponent(JSON.stringify({ code, state, tokenData }))}`;
|
|
10720
10781
|
return Response.redirect(frontendUrl);
|
|
10721
10782
|
} catch (error2) {
|
|
10722
|
-
|
|
10783
|
+
logger31.error("[OAuth Backend Callback] Error:", error2);
|
|
10723
10784
|
return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent(error2.message || "Failed to exchange token")}`, webRequest.url));
|
|
10724
10785
|
}
|
|
10725
10786
|
} else {
|
|
@@ -10938,7 +10999,7 @@ function toSvelteKitHandler(clientOrHandlerOrOptions, _redirectOptions) {
|
|
|
10938
10999
|
}
|
|
10939
11000
|
};
|
|
10940
11001
|
}
|
|
10941
|
-
var SERVER_LOG_CONTEXT = "server",
|
|
11002
|
+
var SERVER_LOG_CONTEXT = "server", logger31, globalServerConfig = null, codeVerifierStorage, POST = async (req, context) => {
|
|
10942
11003
|
if (!globalServerConfig) {
|
|
10943
11004
|
return Response.json({ error: "OAuth not configured. Call createMCPServer() in your server initialization file first." }, { status: 500 });
|
|
10944
11005
|
}
|
|
@@ -10986,7 +11047,7 @@ var init_server = __esm(() => {
|
|
|
10986
11047
|
init_anthropic();
|
|
10987
11048
|
init_google();
|
|
10988
11049
|
init_ai();
|
|
10989
|
-
|
|
11050
|
+
logger31 = createLogger("MCPServer", SERVER_LOG_CONTEXT);
|
|
10990
11051
|
codeVerifierStorage = new Map;
|
|
10991
11052
|
});
|
|
10992
11053
|
|
|
@@ -11337,7 +11398,7 @@ class OAuthHandler {
|
|
|
11337
11398
|
url.searchParams.set("state", authorizeRequest.state);
|
|
11338
11399
|
url.searchParams.set("code_challenge", authorizeRequest.codeChallenge);
|
|
11339
11400
|
url.searchParams.set("code_challenge_method", authorizeRequest.codeChallengeMethod);
|
|
11340
|
-
const redirectUri =
|
|
11401
|
+
const redirectUri = providerConfig.redirectUri;
|
|
11341
11402
|
if (redirectUri) {
|
|
11342
11403
|
url.searchParams.set("redirect_uri", redirectUri);
|
|
11343
11404
|
}
|
|
@@ -11449,7 +11510,7 @@ class OAuthHandler {
|
|
|
11449
11510
|
tokenType: result.tokenType,
|
|
11450
11511
|
expiresIn: result.expiresIn,
|
|
11451
11512
|
expiresAt: result.expiresAt,
|
|
11452
|
-
scopes: result.scopes
|
|
11513
|
+
scopes: result.scopes ? result.scopes.flatMap((s) => s.split(" ").filter(Boolean)) : result.scopes
|
|
11453
11514
|
};
|
|
11454
11515
|
await this.config.setProviderToken(callbackRequest.provider, tokenData, undefined, context);
|
|
11455
11516
|
} catch (error) {}
|
|
@@ -11499,11 +11560,11 @@ class OAuthHandler {
|
|
|
11499
11560
|
try {
|
|
11500
11561
|
await this.config.removeProviderToken(request.provider, undefined, context);
|
|
11501
11562
|
} catch (error) {
|
|
11502
|
-
|
|
11563
|
+
logger32.error(`Failed to delete token for ${request.provider} from database via removeProviderToken:`, error);
|
|
11503
11564
|
}
|
|
11504
11565
|
}
|
|
11505
11566
|
} catch (error) {
|
|
11506
|
-
|
|
11567
|
+
logger32.error(`Failed to extract context for disconnect:`, error);
|
|
11507
11568
|
}
|
|
11508
11569
|
}
|
|
11509
11570
|
const url = new URL("/oauth/disconnect", this.serverUrl);
|
|
@@ -11563,10 +11624,10 @@ class OAuthHandler {
|
|
|
11563
11624
|
return jsonRpcResponse.result;
|
|
11564
11625
|
}
|
|
11565
11626
|
}
|
|
11566
|
-
var SERVER_LOG_CONTEXT2 = "server",
|
|
11627
|
+
var SERVER_LOG_CONTEXT2 = "server", logger32, MCP_SERVER_URL2 = "https://mcp.integrate.dev/api/v1/mcp";
|
|
11567
11628
|
var init_base_handler = __esm(() => {
|
|
11568
11629
|
init_logger();
|
|
11569
|
-
|
|
11630
|
+
logger32 = createLogger("OAuthHandler", SERVER_LOG_CONTEXT2);
|
|
11570
11631
|
});
|
|
11571
11632
|
|
|
11572
11633
|
// nextjs.ts
|
|
@@ -11585,7 +11646,7 @@ function createNextOAuthHandler(config) {
|
|
|
11585
11646
|
}
|
|
11586
11647
|
return response;
|
|
11587
11648
|
} catch (error) {
|
|
11588
|
-
|
|
11649
|
+
logger33.error("[OAuth Authorize] Error:", error);
|
|
11589
11650
|
return Response.json({ error: error.message || "Failed to get authorization URL" }, { status: 500 });
|
|
11590
11651
|
}
|
|
11591
11652
|
},
|
|
@@ -11601,7 +11662,7 @@ function createNextOAuthHandler(config) {
|
|
|
11601
11662
|
}
|
|
11602
11663
|
return response;
|
|
11603
11664
|
} catch (error) {
|
|
11604
|
-
|
|
11665
|
+
logger33.error("[OAuth Callback] Error:", error);
|
|
11605
11666
|
return Response.json({ error: error.message || "Failed to exchange authorization code" }, { status: 500 });
|
|
11606
11667
|
}
|
|
11607
11668
|
},
|
|
@@ -11623,7 +11684,7 @@ function createNextOAuthHandler(config) {
|
|
|
11623
11684
|
}
|
|
11624
11685
|
return response;
|
|
11625
11686
|
} catch (error) {
|
|
11626
|
-
|
|
11687
|
+
logger33.error("[OAuth Status] Error:", error);
|
|
11627
11688
|
return Response.json({ error: error.message || "Failed to check authorization status" }, { status: 500 });
|
|
11628
11689
|
}
|
|
11629
11690
|
},
|
|
@@ -11646,7 +11707,7 @@ function createNextOAuthHandler(config) {
|
|
|
11646
11707
|
}
|
|
11647
11708
|
return response;
|
|
11648
11709
|
} catch (error) {
|
|
11649
|
-
|
|
11710
|
+
logger33.error("[OAuth Disconnect] Error:", error);
|
|
11650
11711
|
return Response.json({ error: error.message || "Failed to disconnect provider" }, { status: 500 });
|
|
11651
11712
|
}
|
|
11652
11713
|
},
|
|
@@ -11687,7 +11748,7 @@ function createNextOAuthHandler(config) {
|
|
|
11687
11748
|
const result = await handler.handleToolCall(body, authHeader, integrationsHeader);
|
|
11688
11749
|
return Response.json(result);
|
|
11689
11750
|
} catch (error) {
|
|
11690
|
-
|
|
11751
|
+
logger33.error("[MCP Tool Call] Error:", error);
|
|
11691
11752
|
return Response.json({ error: error.message || "Failed to execute tool call" }, { status: error.statusCode || 500 });
|
|
11692
11753
|
}
|
|
11693
11754
|
},
|
|
@@ -11732,11 +11793,11 @@ function createNextOAuthHandler(config) {
|
|
|
11732
11793
|
const errorDescription = searchParams.get("error_description");
|
|
11733
11794
|
if (error) {
|
|
11734
11795
|
const errorMsg = errorDescription || error;
|
|
11735
|
-
|
|
11796
|
+
logger33.error("[OAuth Redirect] Error:", errorMsg);
|
|
11736
11797
|
return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent(errorMsg)}`, req.url));
|
|
11737
11798
|
}
|
|
11738
11799
|
if (!code || !state) {
|
|
11739
|
-
|
|
11800
|
+
logger33.error("[OAuth Redirect] Missing code or state parameter");
|
|
11740
11801
|
return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent("Invalid OAuth callback")}`, req.url));
|
|
11741
11802
|
}
|
|
11742
11803
|
let returnUrl = defaultRedirectUrl;
|
|
@@ -11775,18 +11836,18 @@ function createNextOAuthHandler(config) {
|
|
|
11775
11836
|
};
|
|
11776
11837
|
return handlers;
|
|
11777
11838
|
}
|
|
11778
|
-
var SERVER_LOG_CONTEXT3 = "server",
|
|
11839
|
+
var SERVER_LOG_CONTEXT3 = "server", logger33;
|
|
11779
11840
|
var init_nextjs = __esm(() => {
|
|
11780
11841
|
init_base_handler();
|
|
11781
11842
|
init_logger();
|
|
11782
|
-
|
|
11843
|
+
logger33 = createLogger("NextJSOAuth", SERVER_LOG_CONTEXT3);
|
|
11783
11844
|
});
|
|
11784
11845
|
|
|
11785
11846
|
// auto-routes.ts
|
|
11786
11847
|
init_base_handler();
|
|
11787
11848
|
init_logger();
|
|
11788
11849
|
var SERVER_LOG_CONTEXT4 = "server";
|
|
11789
|
-
var
|
|
11850
|
+
var logger34 = createLogger("AutoRoutes", SERVER_LOG_CONTEXT4);
|
|
11790
11851
|
var globalOAuthConfig = null;
|
|
11791
11852
|
function setGlobalOAuthConfig(config) {
|
|
11792
11853
|
globalOAuthConfig = config;
|
|
@@ -11834,7 +11895,7 @@ async function POST2(req, context) {
|
|
|
11834
11895
|
}
|
|
11835
11896
|
return createErrorResponse(`Unknown action: ${action}`, 404);
|
|
11836
11897
|
} catch (error) {
|
|
11837
|
-
|
|
11898
|
+
logger34.error(`[OAuth ${action}] Error:`, error);
|
|
11838
11899
|
return createErrorResponse(error.message, 500);
|
|
11839
11900
|
}
|
|
11840
11901
|
}
|
|
@@ -11862,7 +11923,7 @@ async function GET2(req, context) {
|
|
|
11862
11923
|
}
|
|
11863
11924
|
return createErrorResponse(`Unknown action: ${action}`, 404);
|
|
11864
11925
|
} catch (error) {
|
|
11865
|
-
|
|
11926
|
+
logger34.error(`[OAuth ${action}] Error:`, error);
|
|
11866
11927
|
return createErrorResponse(error.message, 500);
|
|
11867
11928
|
}
|
|
11868
11929
|
}
|