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