integrate-sdk 0.8.61-dev.0 → 0.8.64-dev.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapters/auto-routes.js +263 -189
- package/dist/adapters/base-handler.d.ts.map +1 -1
- package/dist/adapters/index.js +260 -186
- package/dist/adapters/nextjs.js +260 -186
- package/dist/adapters/node.js +260 -186
- package/dist/adapters/svelte-kit.js +260 -186
- package/dist/adapters/tanstack-start.js +260 -186
- package/dist/index.js +254 -180
- package/dist/oauth.js +254 -180
- package/dist/server.js +247 -173
- package/dist/src/adapters/base-handler.d.ts.map +1 -1
- package/dist/src/client.d.ts +7 -0
- package/dist/src/client.d.ts.map +1 -1
- package/dist/src/server.d.ts.map +1 -1
- package/dist/src/triggers/executor.d.ts +50 -0
- package/dist/src/triggers/executor.d.ts.map +1 -0
- package/dist/src/triggers/index.d.ts +2 -0
- package/dist/src/triggers/index.d.ts.map +1 -1
- package/dist/src/triggers/types.d.ts +11 -4
- package/dist/src/triggers/types.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1731,6 +1731,7 @@ class MCPClientBase {
|
|
|
1731
1731
|
apiRouteBase;
|
|
1732
1732
|
apiBaseUrl;
|
|
1733
1733
|
databaseDetected = false;
|
|
1734
|
+
_connectingPromise = null;
|
|
1734
1735
|
__configuredIntegrations;
|
|
1735
1736
|
__useServerConfig;
|
|
1736
1737
|
oauthCallbackPromise;
|
|
@@ -2044,6 +2045,17 @@ class MCPClientBase {
|
|
|
2044
2045
|
throw parsedError;
|
|
2045
2046
|
}
|
|
2046
2047
|
}
|
|
2048
|
+
async ensureConnected() {
|
|
2049
|
+
if (this.isConnected()) {
|
|
2050
|
+
return;
|
|
2051
|
+
}
|
|
2052
|
+
if (!this._connectingPromise) {
|
|
2053
|
+
this._connectingPromise = this.connect().finally(() => {
|
|
2054
|
+
this._connectingPromise = null;
|
|
2055
|
+
});
|
|
2056
|
+
}
|
|
2057
|
+
return this._connectingPromise;
|
|
2058
|
+
}
|
|
2047
2059
|
async initializeIntegrations() {
|
|
2048
2060
|
for (const integration of this.integrations) {
|
|
2049
2061
|
if (integration.onInit) {
|
|
@@ -2102,6 +2114,7 @@ class MCPClientBase {
|
|
|
2102
2114
|
const transportHeaders = this.transport.headers || {};
|
|
2103
2115
|
const hasApiKey = !!transportHeaders["X-API-KEY"];
|
|
2104
2116
|
if (hasApiKey) {
|
|
2117
|
+
await this.ensureConnected();
|
|
2105
2118
|
if (provider) {
|
|
2106
2119
|
const tokenData = await this.oauthManager.getProviderToken(provider, undefined, options?.context);
|
|
2107
2120
|
if (tokenData && this.transport.setHeader) {
|
|
@@ -10347,21 +10360,7 @@ var init_ai = __esm(() => {
|
|
|
10347
10360
|
init_trigger_tools();
|
|
10348
10361
|
});
|
|
10349
10362
|
|
|
10350
|
-
// src/triggers/types.ts
|
|
10351
|
-
var exports_types = {};
|
|
10352
|
-
__export(exports_types, {
|
|
10353
|
-
WEBHOOK_DELIVERY_TIMEOUT_MS: () => WEBHOOK_DELIVERY_TIMEOUT_MS,
|
|
10354
|
-
MAX_TRIGGER_STEPS: () => MAX_TRIGGER_STEPS
|
|
10355
|
-
});
|
|
10356
|
-
var MAX_TRIGGER_STEPS = 20, WEBHOOK_DELIVERY_TIMEOUT_MS = 1e4;
|
|
10357
|
-
|
|
10358
10363
|
// src/triggers/webhooks.ts
|
|
10359
|
-
var exports_webhooks = {};
|
|
10360
|
-
__export(exports_webhooks, {
|
|
10361
|
-
signPayload: () => signPayload,
|
|
10362
|
-
deliverWebhooks: () => deliverWebhooks,
|
|
10363
|
-
deliverWebhook: () => deliverWebhook
|
|
10364
|
-
});
|
|
10365
10364
|
async function signPayload(payload, secret) {
|
|
10366
10365
|
const encoder = new TextEncoder;
|
|
10367
10366
|
const data = encoder.encode(JSON.stringify(payload));
|
|
@@ -10410,6 +10409,155 @@ var init_webhooks = __esm(() => {
|
|
|
10410
10409
|
logger30 = createLogger("Webhooks", "server");
|
|
10411
10410
|
});
|
|
10412
10411
|
|
|
10412
|
+
// src/triggers/types.ts
|
|
10413
|
+
var MAX_TRIGGER_STEPS = 20, WEBHOOK_DELIVERY_TIMEOUT_MS = 1e4;
|
|
10414
|
+
|
|
10415
|
+
// src/triggers/executor.ts
|
|
10416
|
+
var exports_executor = {};
|
|
10417
|
+
__export(exports_executor, {
|
|
10418
|
+
executeTrigger: () => executeTrigger
|
|
10419
|
+
});
|
|
10420
|
+
async function executeTrigger(trigger, config, context) {
|
|
10421
|
+
const steps = [];
|
|
10422
|
+
let currentToolName = trigger.toolName;
|
|
10423
|
+
let currentToolArguments = trigger.toolArguments;
|
|
10424
|
+
let currentProvider = trigger.provider;
|
|
10425
|
+
let stepIndex = 0;
|
|
10426
|
+
while (stepIndex < MAX_TRIGGER_STEPS) {
|
|
10427
|
+
const stepValidation = validateStepLimit(stepIndex, MAX_TRIGGER_STEPS);
|
|
10428
|
+
if (!stepValidation.valid) {
|
|
10429
|
+
logger31.error(`[Trigger ${trigger.id}] ${stepValidation.error}`);
|
|
10430
|
+
break;
|
|
10431
|
+
}
|
|
10432
|
+
const providerToken = await config.getProviderToken(currentProvider, undefined, context);
|
|
10433
|
+
if (!providerToken) {
|
|
10434
|
+
const error = `No OAuth token available for provider '${currentProvider}'`;
|
|
10435
|
+
logger31.error(`[Trigger ${trigger.id}] ${error}`);
|
|
10436
|
+
steps.push({
|
|
10437
|
+
stepIndex,
|
|
10438
|
+
toolName: currentToolName,
|
|
10439
|
+
success: false,
|
|
10440
|
+
error,
|
|
10441
|
+
duration: 0,
|
|
10442
|
+
executedAt: new Date().toISOString()
|
|
10443
|
+
});
|
|
10444
|
+
await config.triggers.update(trigger.id, {
|
|
10445
|
+
lastRunAt: new Date().toISOString(),
|
|
10446
|
+
runCount: (trigger.runCount || 0) + 1,
|
|
10447
|
+
lastError: error,
|
|
10448
|
+
status: "failed"
|
|
10449
|
+
}, context);
|
|
10450
|
+
return { success: false, steps, error };
|
|
10451
|
+
}
|
|
10452
|
+
const startTime = Date.now();
|
|
10453
|
+
let toolResult;
|
|
10454
|
+
let stepSuccess = true;
|
|
10455
|
+
let stepError;
|
|
10456
|
+
try {
|
|
10457
|
+
toolResult = await config.handleToolCall({ name: currentToolName, arguments: currentToolArguments }, `${providerToken.tokenType || "Bearer"} ${providerToken.accessToken}`, null);
|
|
10458
|
+
} catch (err) {
|
|
10459
|
+
stepSuccess = false;
|
|
10460
|
+
stepError = err.message || "Tool execution failed";
|
|
10461
|
+
logger31.error(`[Trigger ${trigger.id}] Step ${stepIndex} failed:`, err);
|
|
10462
|
+
}
|
|
10463
|
+
const duration = Date.now() - startTime;
|
|
10464
|
+
const executedAt = new Date().toISOString();
|
|
10465
|
+
steps.push({
|
|
10466
|
+
stepIndex,
|
|
10467
|
+
toolName: currentToolName,
|
|
10468
|
+
success: stepSuccess,
|
|
10469
|
+
result: stepSuccess ? toolResult : undefined,
|
|
10470
|
+
error: stepError,
|
|
10471
|
+
duration,
|
|
10472
|
+
executedAt
|
|
10473
|
+
});
|
|
10474
|
+
if (!config.triggers.onComplete || !stepSuccess) {
|
|
10475
|
+
const updates = {
|
|
10476
|
+
lastRunAt: executedAt,
|
|
10477
|
+
runCount: (trigger.runCount || 0) + 1
|
|
10478
|
+
};
|
|
10479
|
+
if (stepSuccess) {
|
|
10480
|
+
updates.lastResult = toolResult;
|
|
10481
|
+
updates.lastError = undefined;
|
|
10482
|
+
if (trigger.schedule.type === "once") {
|
|
10483
|
+
updates.status = "completed";
|
|
10484
|
+
}
|
|
10485
|
+
} else {
|
|
10486
|
+
updates.lastError = stepError;
|
|
10487
|
+
updates.status = "failed";
|
|
10488
|
+
}
|
|
10489
|
+
await config.triggers.update(trigger.id, updates, context);
|
|
10490
|
+
return { success: stepSuccess, steps, error: stepError };
|
|
10491
|
+
}
|
|
10492
|
+
const completeRequest = {
|
|
10493
|
+
success: stepSuccess,
|
|
10494
|
+
result: stepSuccess ? toolResult : undefined,
|
|
10495
|
+
error: stepError,
|
|
10496
|
+
executedAt,
|
|
10497
|
+
duration,
|
|
10498
|
+
stepIndex,
|
|
10499
|
+
previousResults: steps,
|
|
10500
|
+
final: false
|
|
10501
|
+
};
|
|
10502
|
+
const completeResponse = await config.triggers.onComplete({
|
|
10503
|
+
trigger,
|
|
10504
|
+
request: completeRequest,
|
|
10505
|
+
context
|
|
10506
|
+
});
|
|
10507
|
+
if (completeResponse.hasMore && completeResponse.nextStep) {
|
|
10508
|
+
currentToolName = completeResponse.nextStep.toolName;
|
|
10509
|
+
currentToolArguments = completeResponse.nextStep.toolArguments;
|
|
10510
|
+
currentProvider = completeResponse.nextStep.provider;
|
|
10511
|
+
stepIndex++;
|
|
10512
|
+
continue;
|
|
10513
|
+
}
|
|
10514
|
+
const finalUpdates = {
|
|
10515
|
+
lastRunAt: executedAt,
|
|
10516
|
+
runCount: (trigger.runCount || 0) + 1
|
|
10517
|
+
};
|
|
10518
|
+
if (stepSuccess) {
|
|
10519
|
+
finalUpdates.lastResult = toolResult;
|
|
10520
|
+
finalUpdates.lastError = undefined;
|
|
10521
|
+
if (trigger.schedule.type === "once") {
|
|
10522
|
+
finalUpdates.status = "completed";
|
|
10523
|
+
}
|
|
10524
|
+
} else {
|
|
10525
|
+
finalUpdates.lastError = stepError;
|
|
10526
|
+
finalUpdates.status = "failed";
|
|
10527
|
+
}
|
|
10528
|
+
await config.triggers.update(trigger.id, finalUpdates, context);
|
|
10529
|
+
if (completeResponse.webhooks && completeResponse.webhooks.length > 0) {
|
|
10530
|
+
const totalDuration = steps.reduce((sum, s) => sum + (s.duration || 0), 0);
|
|
10531
|
+
const payload = {
|
|
10532
|
+
triggerId: trigger.id,
|
|
10533
|
+
success: steps.every((s) => s.success),
|
|
10534
|
+
steps,
|
|
10535
|
+
totalSteps: steps.length,
|
|
10536
|
+
totalDuration,
|
|
10537
|
+
executedAt
|
|
10538
|
+
};
|
|
10539
|
+
deliverWebhooks(completeResponse.webhooks, payload, WEBHOOK_DELIVERY_TIMEOUT_MS).catch(() => {});
|
|
10540
|
+
}
|
|
10541
|
+
return { success: stepSuccess, steps, error: stepError };
|
|
10542
|
+
}
|
|
10543
|
+
const limitError = `Trigger execution exceeded maximum of ${MAX_TRIGGER_STEPS} steps`;
|
|
10544
|
+
logger31.error(`[Trigger ${trigger.id}] ${limitError}`);
|
|
10545
|
+
await config.triggers.update(trigger.id, {
|
|
10546
|
+
lastRunAt: new Date().toISOString(),
|
|
10547
|
+
runCount: (trigger.runCount || 0) + 1,
|
|
10548
|
+
lastError: limitError,
|
|
10549
|
+
status: "failed"
|
|
10550
|
+
}, context);
|
|
10551
|
+
return { success: false, steps, error: limitError };
|
|
10552
|
+
}
|
|
10553
|
+
var logger31;
|
|
10554
|
+
var init_executor = __esm(() => {
|
|
10555
|
+
init_logger();
|
|
10556
|
+
init_utils2();
|
|
10557
|
+
init_webhooks();
|
|
10558
|
+
logger31 = createLogger("TriggerExecutor", "server");
|
|
10559
|
+
});
|
|
10560
|
+
|
|
10413
10561
|
// src/server.ts
|
|
10414
10562
|
var exports_server = {};
|
|
10415
10563
|
__export(exports_server, {
|
|
@@ -10503,7 +10651,7 @@ function createMCPServer(config) {
|
|
|
10503
10651
|
if (integration.oauth) {
|
|
10504
10652
|
const { clientId, clientSecret, redirectUri: integrationRedirectUri, config: oauthConfig } = integration.oauth;
|
|
10505
10653
|
if (!clientId || !clientSecret) {
|
|
10506
|
-
|
|
10654
|
+
logger32.warn(`Warning: Integration "${integration.id}" is missing OAuth credentials. ` + `Provide clientId and clientSecret in the integration configuration.`);
|
|
10507
10655
|
return integration;
|
|
10508
10656
|
}
|
|
10509
10657
|
const redirectUri = integrationRedirectUri || config.redirectUri || getDefaultRedirectUri();
|
|
@@ -10634,7 +10782,7 @@ function createMCPServer(config) {
|
|
|
10634
10782
|
}
|
|
10635
10783
|
return response2;
|
|
10636
10784
|
} catch (error) {
|
|
10637
|
-
|
|
10785
|
+
logger32.error("[MCP Tool Call] Error:", error);
|
|
10638
10786
|
return Response.json({ error: error.message || "Failed to execute tool call" }, { status: error.statusCode || 500 });
|
|
10639
10787
|
}
|
|
10640
10788
|
}
|
|
@@ -10650,6 +10798,57 @@ function createMCPServer(config) {
|
|
|
10650
10798
|
}));
|
|
10651
10799
|
return Response.json({ integrations });
|
|
10652
10800
|
}
|
|
10801
|
+
if (segments.length === 2 && segments[0] === "triggers" && segments[1] === "notify" && method === "POST") {
|
|
10802
|
+
if (!config.triggers) {
|
|
10803
|
+
return Response.json({ error: "Triggers not configured. Add triggers callbacks to createMCPServer config." }, { status: 501 });
|
|
10804
|
+
}
|
|
10805
|
+
try {
|
|
10806
|
+
const apiKey = webRequest.headers.get("x-api-key");
|
|
10807
|
+
if (!apiKey || apiKey !== config.apiKey) {
|
|
10808
|
+
return Response.json({ error: "Unauthorized" }, { status: 401 });
|
|
10809
|
+
}
|
|
10810
|
+
const body = await webRequest.json();
|
|
10811
|
+
const { triggerId } = body;
|
|
10812
|
+
if (!triggerId) {
|
|
10813
|
+
return Response.json({ error: "triggerId is required" }, { status: 400 });
|
|
10814
|
+
}
|
|
10815
|
+
const trigger = await config.triggers.get(triggerId);
|
|
10816
|
+
if (!trigger) {
|
|
10817
|
+
return Response.json({ error: "Trigger not found" }, { status: 404 });
|
|
10818
|
+
}
|
|
10819
|
+
if (!trigger.provider) {
|
|
10820
|
+
return Response.json({ error: "Trigger has no provider configured" }, { status: 400 });
|
|
10821
|
+
}
|
|
10822
|
+
const triggerContext = trigger.userId ? { userId: trigger.userId } : undefined;
|
|
10823
|
+
const { executeTrigger: executeTrigger2 } = await Promise.resolve().then(() => (init_executor(), exports_executor));
|
|
10824
|
+
const { OAuthHandler: OAuthHandler2 } = await Promise.resolve().then(() => (init_base_handler(), exports_base_handler));
|
|
10825
|
+
const oauthHandler = new OAuthHandler2({
|
|
10826
|
+
providers,
|
|
10827
|
+
serverUrl: config.serverUrl,
|
|
10828
|
+
apiKey: config.apiKey,
|
|
10829
|
+
setProviderToken: config.setProviderToken,
|
|
10830
|
+
removeProviderToken: config.removeProviderToken,
|
|
10831
|
+
getSessionContext: config.getSessionContext
|
|
10832
|
+
});
|
|
10833
|
+
const executionResult = await executeTrigger2(trigger, {
|
|
10834
|
+
triggers: config.triggers,
|
|
10835
|
+
getProviderToken: async (provider, email, ctx) => {
|
|
10836
|
+
return config.getProviderToken ? await config.getProviderToken(provider, email, ctx) : undefined;
|
|
10837
|
+
},
|
|
10838
|
+
handleToolCall: (toolBody, authHeader, integrationsHeader) => {
|
|
10839
|
+
return oauthHandler.handleToolCall(toolBody, authHeader, integrationsHeader);
|
|
10840
|
+
}
|
|
10841
|
+
}, triggerContext);
|
|
10842
|
+
return Response.json({
|
|
10843
|
+
success: executionResult.success,
|
|
10844
|
+
steps: executionResult.steps,
|
|
10845
|
+
error: executionResult.error
|
|
10846
|
+
});
|
|
10847
|
+
} catch (error) {
|
|
10848
|
+
logger32.error("[Trigger Notify] Error:", error);
|
|
10849
|
+
return Response.json({ error: error.message || "Failed to execute trigger" }, { status: 500 });
|
|
10850
|
+
}
|
|
10851
|
+
}
|
|
10653
10852
|
if (segments.length >= 1 && segments[0] === "triggers") {
|
|
10654
10853
|
if (!config.triggers) {
|
|
10655
10854
|
return Response.json({ error: "Triggers not configured. Add triggers callbacks to createMCPServer config." }, { status: 501 });
|
|
@@ -10690,8 +10889,9 @@ function createMCPServer(config) {
|
|
|
10690
10889
|
};
|
|
10691
10890
|
const created = await config.triggers.create(trigger, context2);
|
|
10692
10891
|
const schedulerUrl = config.schedulerUrl || config.serverUrl || "https://mcp.integrate.dev";
|
|
10693
|
-
const
|
|
10892
|
+
const defaultCallbackBaseUrl = process.env.INTEGRATE_URL || (typeof window !== "undefined" ? window.location.origin : "http://localhost:3000");
|
|
10694
10893
|
try {
|
|
10894
|
+
const callbackBaseUrl = config.triggers.getCallbackUrl ? await config.triggers.getCallbackUrl(context2) : defaultCallbackBaseUrl;
|
|
10695
10895
|
await fetch(`${schedulerUrl}/scheduler/register`, {
|
|
10696
10896
|
method: "POST",
|
|
10697
10897
|
headers: {
|
|
@@ -10701,8 +10901,7 @@ function createMCPServer(config) {
|
|
|
10701
10901
|
body: JSON.stringify({
|
|
10702
10902
|
triggerId: created.id,
|
|
10703
10903
|
schedule: created.schedule,
|
|
10704
|
-
callbackUrl: `${callbackBaseUrl}/api/integrate/triggers
|
|
10705
|
-
completeUrl: `${callbackBaseUrl}/api/integrate/triggers/${created.id}/complete`,
|
|
10904
|
+
callbackUrl: `${callbackBaseUrl}/api/integrate/triggers/notify`,
|
|
10706
10905
|
metadata: {
|
|
10707
10906
|
userId: context2?.userId,
|
|
10708
10907
|
provider: created.provider
|
|
@@ -10710,7 +10909,7 @@ function createMCPServer(config) {
|
|
|
10710
10909
|
})
|
|
10711
10910
|
});
|
|
10712
10911
|
} catch (scheduleError) {
|
|
10713
|
-
|
|
10912
|
+
logger32.error("[Trigger] Failed to register with scheduler:", scheduleError);
|
|
10714
10913
|
}
|
|
10715
10914
|
return Response.json(created, { status: 201 });
|
|
10716
10915
|
}
|
|
@@ -10745,7 +10944,7 @@ function createMCPServer(config) {
|
|
|
10745
10944
|
body: JSON.stringify({ triggerId })
|
|
10746
10945
|
});
|
|
10747
10946
|
} catch (error) {
|
|
10748
|
-
|
|
10947
|
+
logger32.error("[Trigger] Failed to pause in scheduler:", error);
|
|
10749
10948
|
}
|
|
10750
10949
|
return Response.json(updated);
|
|
10751
10950
|
} else if (subAction === "resume" && method === "POST") {
|
|
@@ -10773,7 +10972,7 @@ function createMCPServer(config) {
|
|
|
10773
10972
|
body: JSON.stringify({ triggerId })
|
|
10774
10973
|
});
|
|
10775
10974
|
} catch (error) {
|
|
10776
|
-
|
|
10975
|
+
logger32.error("[Trigger] Failed to resume in scheduler:", error);
|
|
10777
10976
|
}
|
|
10778
10977
|
return Response.json(updated);
|
|
10779
10978
|
} else if (subAction === "run" && method === "POST") {
|
|
@@ -10784,10 +10983,7 @@ function createMCPServer(config) {
|
|
|
10784
10983
|
if (!trigger.provider) {
|
|
10785
10984
|
return Response.json({ error: "Trigger has no provider configured" }, { status: 400 });
|
|
10786
10985
|
}
|
|
10787
|
-
const
|
|
10788
|
-
if (!providerToken) {
|
|
10789
|
-
return Response.json({ error: "No OAuth token available for this trigger" }, { status: 401 });
|
|
10790
|
-
}
|
|
10986
|
+
const { executeTrigger: executeTrigger2 } = await Promise.resolve().then(() => (init_executor(), exports_executor));
|
|
10791
10987
|
const { OAuthHandler: OAuthHandler2 } = await Promise.resolve().then(() => (init_base_handler(), exports_base_handler));
|
|
10792
10988
|
const oauthHandler = new OAuthHandler2({
|
|
10793
10989
|
providers,
|
|
@@ -10797,145 +10993,23 @@ function createMCPServer(config) {
|
|
|
10797
10993
|
removeProviderToken: config.removeProviderToken,
|
|
10798
10994
|
getSessionContext: config.getSessionContext
|
|
10799
10995
|
});
|
|
10800
|
-
const
|
|
10801
|
-
|
|
10802
|
-
|
|
10803
|
-
|
|
10804
|
-
const executionResult = {
|
|
10805
|
-
success: true,
|
|
10806
|
-
result,
|
|
10807
|
-
executedAt: new Date().toISOString(),
|
|
10808
|
-
duration
|
|
10809
|
-
};
|
|
10810
|
-
await config.triggers.update(triggerId, {
|
|
10811
|
-
lastRunAt: executionResult.executedAt,
|
|
10812
|
-
runCount: (trigger.runCount || 0) + 1,
|
|
10813
|
-
lastResult: result,
|
|
10814
|
-
lastError: undefined
|
|
10815
|
-
}, context2);
|
|
10816
|
-
return Response.json(executionResult);
|
|
10817
|
-
} catch (error) {
|
|
10818
|
-
const duration = Date.now() - startTime;
|
|
10819
|
-
const executionResult = {
|
|
10820
|
-
success: false,
|
|
10821
|
-
error: error.message || "Tool execution failed",
|
|
10822
|
-
executedAt: new Date().toISOString(),
|
|
10823
|
-
duration
|
|
10824
|
-
};
|
|
10825
|
-
await config.triggers.update(triggerId, {
|
|
10826
|
-
lastRunAt: executionResult.executedAt,
|
|
10827
|
-
runCount: (trigger.runCount || 0) + 1,
|
|
10828
|
-
lastError: error.message,
|
|
10829
|
-
status: "failed"
|
|
10830
|
-
}, context2);
|
|
10831
|
-
return Response.json(executionResult, { status: 500 });
|
|
10832
|
-
}
|
|
10833
|
-
} else if (subAction === "execute" && method === "GET") {
|
|
10834
|
-
const apiKey = webRequest.headers.get("x-api-key");
|
|
10835
|
-
if (!apiKey || apiKey !== config.apiKey) {
|
|
10836
|
-
return Response.json({ error: "Unauthorized" }, { status: 401 });
|
|
10837
|
-
}
|
|
10838
|
-
const trigger = await config.triggers.get(triggerId, context2);
|
|
10839
|
-
if (!trigger) {
|
|
10840
|
-
return Response.json({ error: "Trigger not found" }, { status: 404 });
|
|
10841
|
-
}
|
|
10842
|
-
if (!trigger.provider) {
|
|
10843
|
-
return Response.json({ error: "Trigger has no provider configured" }, { status: 400 });
|
|
10844
|
-
}
|
|
10845
|
-
const providerToken = config.getProviderToken ? await config.getProviderToken(trigger.provider, undefined, context2) : undefined;
|
|
10846
|
-
if (!providerToken) {
|
|
10847
|
-
return Response.json({ error: "No OAuth token available for this trigger" }, { status: 401 });
|
|
10848
|
-
}
|
|
10849
|
-
return Response.json({
|
|
10850
|
-
trigger: {
|
|
10851
|
-
id: trigger.id,
|
|
10852
|
-
toolName: trigger.toolName,
|
|
10853
|
-
toolArguments: trigger.toolArguments,
|
|
10854
|
-
provider: trigger.provider
|
|
10996
|
+
const executionResult = await executeTrigger2(trigger, {
|
|
10997
|
+
triggers: config.triggers,
|
|
10998
|
+
getProviderToken: async (provider, email, ctx) => {
|
|
10999
|
+
return config.getProviderToken ? await config.getProviderToken(provider, email, ctx) : undefined;
|
|
10855
11000
|
},
|
|
10856
|
-
|
|
10857
|
-
|
|
10858
|
-
});
|
|
10859
|
-
} else if (subAction === "complete" && method === "POST") {
|
|
10860
|
-
const apiKey = webRequest.headers.get("x-api-key");
|
|
10861
|
-
if (!apiKey || apiKey !== config.apiKey) {
|
|
10862
|
-
return Response.json({ error: "Unauthorized" }, { status: 401 });
|
|
10863
|
-
}
|
|
10864
|
-
const body = await webRequest.json();
|
|
10865
|
-
const trigger = await config.triggers.get(triggerId, context2);
|
|
10866
|
-
if (!trigger) {
|
|
10867
|
-
return Response.json({ error: "Trigger not found" }, { status: 404 });
|
|
10868
|
-
}
|
|
10869
|
-
if (body.stepIndex != null) {
|
|
10870
|
-
const { validateStepLimit: validateStepLimit2 } = await Promise.resolve().then(() => (init_utils2(), exports_utils));
|
|
10871
|
-
const { MAX_TRIGGER_STEPS: MAX_TRIGGER_STEPS2 } = await Promise.resolve().then(() => exports_types);
|
|
10872
|
-
const stepValidation = validateStepLimit2(body.stepIndex, MAX_TRIGGER_STEPS2);
|
|
10873
|
-
if (!stepValidation.valid) {
|
|
10874
|
-
return Response.json({ error: stepValidation.error }, { status: 400 });
|
|
11001
|
+
handleToolCall: (toolBody, authHeader, integrationsHeader) => {
|
|
11002
|
+
return oauthHandler.handleToolCall(toolBody, authHeader, integrationsHeader);
|
|
10875
11003
|
}
|
|
10876
|
-
}
|
|
10877
|
-
|
|
10878
|
-
|
|
10879
|
-
|
|
10880
|
-
|
|
10881
|
-
|
|
10882
|
-
|
|
10883
|
-
|
|
10884
|
-
|
|
10885
|
-
return Response.json(completeResponse);
|
|
10886
|
-
}
|
|
10887
|
-
const updates2 = {
|
|
10888
|
-
lastRunAt: body.executedAt,
|
|
10889
|
-
runCount: (trigger.runCount || 0) + 1
|
|
10890
|
-
};
|
|
10891
|
-
if (body.success) {
|
|
10892
|
-
updates2.lastResult = body.result;
|
|
10893
|
-
updates2.lastError = undefined;
|
|
10894
|
-
if (trigger.schedule.type === "once") {
|
|
10895
|
-
updates2.status = "completed";
|
|
10896
|
-
}
|
|
10897
|
-
} else {
|
|
10898
|
-
updates2.lastError = body.error;
|
|
10899
|
-
updates2.status = "failed";
|
|
10900
|
-
}
|
|
10901
|
-
await config.triggers.update(triggerId, updates2, context2);
|
|
10902
|
-
if (completeResponse.webhooks && completeResponse.webhooks.length > 0) {
|
|
10903
|
-
const { deliverWebhooks: deliverWebhooks2 } = await Promise.resolve().then(() => (init_webhooks(), exports_webhooks));
|
|
10904
|
-
const { WEBHOOK_DELIVERY_TIMEOUT_MS: WEBHOOK_DELIVERY_TIMEOUT_MS2 } = await Promise.resolve().then(() => exports_types);
|
|
10905
|
-
const steps = body.previousResults || [];
|
|
10906
|
-
const totalDuration = steps.reduce((sum, s) => sum + (s.duration || 0), 0);
|
|
10907
|
-
const payload = {
|
|
10908
|
-
triggerId,
|
|
10909
|
-
success: body.success,
|
|
10910
|
-
steps,
|
|
10911
|
-
totalSteps: steps.length,
|
|
10912
|
-
totalDuration,
|
|
10913
|
-
executedAt: body.executedAt
|
|
10914
|
-
};
|
|
10915
|
-
deliverWebhooks2(completeResponse.webhooks, payload, WEBHOOK_DELIVERY_TIMEOUT_MS2).catch(() => {});
|
|
10916
|
-
}
|
|
10917
|
-
return Response.json(completeResponse);
|
|
10918
|
-
} catch (error) {
|
|
10919
|
-
logger31.error("onComplete callback error:", error);
|
|
10920
|
-
return Response.json({ error: "Internal server error in onComplete callback" }, { status: 500 });
|
|
10921
|
-
}
|
|
10922
|
-
}
|
|
10923
|
-
const updates = {
|
|
10924
|
-
lastRunAt: body.executedAt,
|
|
10925
|
-
runCount: (trigger.runCount || 0) + 1
|
|
10926
|
-
};
|
|
10927
|
-
if (body.success) {
|
|
10928
|
-
updates.lastResult = body.result;
|
|
10929
|
-
updates.lastError = undefined;
|
|
10930
|
-
if (trigger.schedule.type === "once") {
|
|
10931
|
-
updates.status = "completed";
|
|
10932
|
-
}
|
|
10933
|
-
} else {
|
|
10934
|
-
updates.lastError = body.error;
|
|
10935
|
-
updates.status = "failed";
|
|
10936
|
-
}
|
|
10937
|
-
await config.triggers.update(triggerId, updates, context2);
|
|
10938
|
-
return Response.json({ success: true });
|
|
11004
|
+
}, context2);
|
|
11005
|
+
return Response.json({
|
|
11006
|
+
success: executionResult.success,
|
|
11007
|
+
result: executionResult.steps[0]?.result,
|
|
11008
|
+
executedAt: executionResult.steps[0]?.executedAt || new Date().toISOString(),
|
|
11009
|
+
duration: executionResult.steps[0]?.duration,
|
|
11010
|
+
error: executionResult.error,
|
|
11011
|
+
steps: executionResult.steps
|
|
11012
|
+
}, { status: executionResult.success ? 200 : 500 });
|
|
10939
11013
|
} else if (!subAction && method === "GET") {
|
|
10940
11014
|
const trigger = await config.triggers.get(triggerId, context2);
|
|
10941
11015
|
if (!trigger) {
|
|
@@ -10968,7 +11042,7 @@ function createMCPServer(config) {
|
|
|
10968
11042
|
})
|
|
10969
11043
|
});
|
|
10970
11044
|
} catch (error) {
|
|
10971
|
-
|
|
11045
|
+
logger32.error("[Trigger] Failed to update scheduler:", error);
|
|
10972
11046
|
}
|
|
10973
11047
|
}
|
|
10974
11048
|
return Response.json(updated);
|
|
@@ -10985,14 +11059,14 @@ function createMCPServer(config) {
|
|
|
10985
11059
|
body: JSON.stringify({ triggerId })
|
|
10986
11060
|
});
|
|
10987
11061
|
} catch (error) {
|
|
10988
|
-
|
|
11062
|
+
logger32.error("[Trigger] Failed to unregister from scheduler:", error);
|
|
10989
11063
|
}
|
|
10990
11064
|
return new Response(null, { status: 204 });
|
|
10991
11065
|
}
|
|
10992
11066
|
}
|
|
10993
11067
|
return Response.json({ error: "Invalid trigger route or method" }, { status: 404 });
|
|
10994
11068
|
} catch (error) {
|
|
10995
|
-
|
|
11069
|
+
logger32.error("[Trigger] Error:", error);
|
|
10996
11070
|
return Response.json({ error: error.message || "Failed to process trigger request" }, { status: error.statusCode || 500 });
|
|
10997
11071
|
}
|
|
10998
11072
|
}
|
|
@@ -11018,11 +11092,11 @@ function createMCPServer(config) {
|
|
|
11018
11092
|
const errorRedirectUrl = "/auth-error";
|
|
11019
11093
|
if (error) {
|
|
11020
11094
|
const errorMsg = errorDescription || error;
|
|
11021
|
-
|
|
11095
|
+
logger32.error("[OAuth Redirect] Error:", errorMsg);
|
|
11022
11096
|
return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent(errorMsg)}`, webRequest.url));
|
|
11023
11097
|
}
|
|
11024
11098
|
if (!code || !state) {
|
|
11025
|
-
|
|
11099
|
+
logger32.error("[OAuth Redirect] Missing code or state parameter");
|
|
11026
11100
|
return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent("Invalid OAuth callback")}`, webRequest.url));
|
|
11027
11101
|
}
|
|
11028
11102
|
let returnUrl = defaultRedirectUrl;
|
|
@@ -11098,7 +11172,7 @@ function createMCPServer(config) {
|
|
|
11098
11172
|
frontendUrl.hash = `oauth_callback=${encodeURIComponent(JSON.stringify({ code, state, tokenData }))}`;
|
|
11099
11173
|
return Response.redirect(frontendUrl);
|
|
11100
11174
|
} catch (error2) {
|
|
11101
|
-
|
|
11175
|
+
logger32.error("[OAuth Backend Callback] Error:", error2);
|
|
11102
11176
|
return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent(error2.message || "Failed to exchange token")}`, webRequest.url));
|
|
11103
11177
|
}
|
|
11104
11178
|
} else {
|
|
@@ -11317,7 +11391,7 @@ function toSvelteKitHandler(clientOrHandlerOrOptions, _redirectOptions) {
|
|
|
11317
11391
|
}
|
|
11318
11392
|
};
|
|
11319
11393
|
}
|
|
11320
|
-
var SERVER_LOG_CONTEXT2 = "server",
|
|
11394
|
+
var SERVER_LOG_CONTEXT2 = "server", logger32, globalServerConfig = null, codeVerifierStorage, POST = async (req, context) => {
|
|
11321
11395
|
if (!globalServerConfig) {
|
|
11322
11396
|
return Response.json({ error: "OAuth not configured. Call createMCPServer() in your server initialization file first." }, { status: 500 });
|
|
11323
11397
|
}
|
|
@@ -11365,7 +11439,7 @@ var init_server = __esm(() => {
|
|
|
11365
11439
|
init_anthropic();
|
|
11366
11440
|
init_google();
|
|
11367
11441
|
init_ai();
|
|
11368
|
-
|
|
11442
|
+
logger32 = createLogger("MCPServer", SERVER_LOG_CONTEXT2);
|
|
11369
11443
|
codeVerifierStorage = new Map;
|
|
11370
11444
|
});
|
|
11371
11445
|
|
|
@@ -11716,7 +11790,7 @@ class OAuthHandler {
|
|
|
11716
11790
|
url.searchParams.set("state", authorizeRequest.state);
|
|
11717
11791
|
url.searchParams.set("code_challenge", authorizeRequest.codeChallenge);
|
|
11718
11792
|
url.searchParams.set("code_challenge_method", authorizeRequest.codeChallengeMethod);
|
|
11719
|
-
const redirectUri =
|
|
11793
|
+
const redirectUri = providerConfig.redirectUri;
|
|
11720
11794
|
if (redirectUri) {
|
|
11721
11795
|
url.searchParams.set("redirect_uri", redirectUri);
|
|
11722
11796
|
}
|
|
@@ -11828,7 +11902,7 @@ class OAuthHandler {
|
|
|
11828
11902
|
tokenType: result.tokenType,
|
|
11829
11903
|
expiresIn: result.expiresIn,
|
|
11830
11904
|
expiresAt: result.expiresAt,
|
|
11831
|
-
scopes: result.scopes
|
|
11905
|
+
scopes: result.scopes ? result.scopes.flatMap((s) => s.split(" ").filter(Boolean)) : result.scopes
|
|
11832
11906
|
};
|
|
11833
11907
|
await this.config.setProviderToken(callbackRequest.provider, tokenData, undefined, context);
|
|
11834
11908
|
} catch (error) {}
|
|
@@ -11878,11 +11952,11 @@ class OAuthHandler {
|
|
|
11878
11952
|
try {
|
|
11879
11953
|
await this.config.removeProviderToken(request.provider, undefined, context);
|
|
11880
11954
|
} catch (error) {
|
|
11881
|
-
|
|
11955
|
+
logger33.error(`Failed to delete token for ${request.provider} from database via removeProviderToken:`, error);
|
|
11882
11956
|
}
|
|
11883
11957
|
}
|
|
11884
11958
|
} catch (error) {
|
|
11885
|
-
|
|
11959
|
+
logger33.error(`Failed to extract context for disconnect:`, error);
|
|
11886
11960
|
}
|
|
11887
11961
|
}
|
|
11888
11962
|
const url = new URL("/oauth/disconnect", this.serverUrl);
|
|
@@ -11942,10 +12016,10 @@ class OAuthHandler {
|
|
|
11942
12016
|
return jsonRpcResponse.result;
|
|
11943
12017
|
}
|
|
11944
12018
|
}
|
|
11945
|
-
var SERVER_LOG_CONTEXT3 = "server",
|
|
12019
|
+
var SERVER_LOG_CONTEXT3 = "server", logger33, MCP_SERVER_URL2 = "https://mcp.integrate.dev/api/v1/mcp";
|
|
11946
12020
|
var init_base_handler = __esm(() => {
|
|
11947
12021
|
init_logger();
|
|
11948
|
-
|
|
12022
|
+
logger33 = createLogger("OAuthHandler", SERVER_LOG_CONTEXT3);
|
|
11949
12023
|
});
|
|
11950
12024
|
|
|
11951
12025
|
// src/index.ts
|
|
@@ -11958,7 +12032,7 @@ init_nextjs();
|
|
|
11958
12032
|
// src/adapters/nextjs-oauth-redirect.ts
|
|
11959
12033
|
init_logger();
|
|
11960
12034
|
var SERVER_LOG_CONTEXT4 = "server";
|
|
11961
|
-
var
|
|
12035
|
+
var logger34 = createLogger("OAuthRedirect", SERVER_LOG_CONTEXT4);
|
|
11962
12036
|
function createOAuthRedirectHandler(config) {
|
|
11963
12037
|
const defaultRedirectUrl = config?.redirectUrl || "/";
|
|
11964
12038
|
const errorRedirectUrl = config?.errorRedirectUrl || "/auth-error";
|
|
@@ -11970,11 +12044,11 @@ function createOAuthRedirectHandler(config) {
|
|
|
11970
12044
|
const errorDescription = searchParams.get("error_description");
|
|
11971
12045
|
if (error) {
|
|
11972
12046
|
const errorMsg = errorDescription || error;
|
|
11973
|
-
|
|
12047
|
+
logger34.error("[OAuth Redirect] Error:", errorMsg);
|
|
11974
12048
|
return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent(errorMsg)}`, req.url));
|
|
11975
12049
|
}
|
|
11976
12050
|
if (!code || !state) {
|
|
11977
|
-
|
|
12051
|
+
logger34.error("[OAuth Redirect] Missing code or state parameter");
|
|
11978
12052
|
return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent("Invalid OAuth callback")}`, req.url));
|
|
11979
12053
|
}
|
|
11980
12054
|
let returnUrl = defaultRedirectUrl;
|