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
package/dist/index.js
CHANGED
|
@@ -10347,21 +10347,7 @@ var init_ai = __esm(() => {
|
|
|
10347
10347
|
init_trigger_tools();
|
|
10348
10348
|
});
|
|
10349
10349
|
|
|
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
10350
|
// src/triggers/webhooks.ts
|
|
10359
|
-
var exports_webhooks = {};
|
|
10360
|
-
__export(exports_webhooks, {
|
|
10361
|
-
signPayload: () => signPayload,
|
|
10362
|
-
deliverWebhooks: () => deliverWebhooks,
|
|
10363
|
-
deliverWebhook: () => deliverWebhook
|
|
10364
|
-
});
|
|
10365
10351
|
async function signPayload(payload, secret) {
|
|
10366
10352
|
const encoder = new TextEncoder;
|
|
10367
10353
|
const data = encoder.encode(JSON.stringify(payload));
|
|
@@ -10410,6 +10396,155 @@ var init_webhooks = __esm(() => {
|
|
|
10410
10396
|
logger30 = createLogger("Webhooks", "server");
|
|
10411
10397
|
});
|
|
10412
10398
|
|
|
10399
|
+
// src/triggers/types.ts
|
|
10400
|
+
var MAX_TRIGGER_STEPS = 20, WEBHOOK_DELIVERY_TIMEOUT_MS = 1e4;
|
|
10401
|
+
|
|
10402
|
+
// src/triggers/executor.ts
|
|
10403
|
+
var exports_executor = {};
|
|
10404
|
+
__export(exports_executor, {
|
|
10405
|
+
executeTrigger: () => executeTrigger
|
|
10406
|
+
});
|
|
10407
|
+
async function executeTrigger(trigger, config, context) {
|
|
10408
|
+
const steps = [];
|
|
10409
|
+
let currentToolName = trigger.toolName;
|
|
10410
|
+
let currentToolArguments = trigger.toolArguments;
|
|
10411
|
+
let currentProvider = trigger.provider;
|
|
10412
|
+
let stepIndex = 0;
|
|
10413
|
+
while (stepIndex < MAX_TRIGGER_STEPS) {
|
|
10414
|
+
const stepValidation = validateStepLimit(stepIndex, MAX_TRIGGER_STEPS);
|
|
10415
|
+
if (!stepValidation.valid) {
|
|
10416
|
+
logger31.error(`[Trigger ${trigger.id}] ${stepValidation.error}`);
|
|
10417
|
+
break;
|
|
10418
|
+
}
|
|
10419
|
+
const providerToken = await config.getProviderToken(currentProvider, undefined, context);
|
|
10420
|
+
if (!providerToken) {
|
|
10421
|
+
const error = `No OAuth token available for provider '${currentProvider}'`;
|
|
10422
|
+
logger31.error(`[Trigger ${trigger.id}] ${error}`);
|
|
10423
|
+
steps.push({
|
|
10424
|
+
stepIndex,
|
|
10425
|
+
toolName: currentToolName,
|
|
10426
|
+
success: false,
|
|
10427
|
+
error,
|
|
10428
|
+
duration: 0,
|
|
10429
|
+
executedAt: new Date().toISOString()
|
|
10430
|
+
});
|
|
10431
|
+
await config.triggers.update(trigger.id, {
|
|
10432
|
+
lastRunAt: new Date().toISOString(),
|
|
10433
|
+
runCount: (trigger.runCount || 0) + 1,
|
|
10434
|
+
lastError: error,
|
|
10435
|
+
status: "failed"
|
|
10436
|
+
}, context);
|
|
10437
|
+
return { success: false, steps, error };
|
|
10438
|
+
}
|
|
10439
|
+
const startTime = Date.now();
|
|
10440
|
+
let toolResult;
|
|
10441
|
+
let stepSuccess = true;
|
|
10442
|
+
let stepError;
|
|
10443
|
+
try {
|
|
10444
|
+
toolResult = await config.handleToolCall({ name: currentToolName, arguments: currentToolArguments }, `${providerToken.tokenType || "Bearer"} ${providerToken.accessToken}`, null);
|
|
10445
|
+
} catch (err) {
|
|
10446
|
+
stepSuccess = false;
|
|
10447
|
+
stepError = err.message || "Tool execution failed";
|
|
10448
|
+
logger31.error(`[Trigger ${trigger.id}] Step ${stepIndex} failed:`, err);
|
|
10449
|
+
}
|
|
10450
|
+
const duration = Date.now() - startTime;
|
|
10451
|
+
const executedAt = new Date().toISOString();
|
|
10452
|
+
steps.push({
|
|
10453
|
+
stepIndex,
|
|
10454
|
+
toolName: currentToolName,
|
|
10455
|
+
success: stepSuccess,
|
|
10456
|
+
result: stepSuccess ? toolResult : undefined,
|
|
10457
|
+
error: stepError,
|
|
10458
|
+
duration,
|
|
10459
|
+
executedAt
|
|
10460
|
+
});
|
|
10461
|
+
if (!config.triggers.onComplete || !stepSuccess) {
|
|
10462
|
+
const updates = {
|
|
10463
|
+
lastRunAt: executedAt,
|
|
10464
|
+
runCount: (trigger.runCount || 0) + 1
|
|
10465
|
+
};
|
|
10466
|
+
if (stepSuccess) {
|
|
10467
|
+
updates.lastResult = toolResult;
|
|
10468
|
+
updates.lastError = undefined;
|
|
10469
|
+
if (trigger.schedule.type === "once") {
|
|
10470
|
+
updates.status = "completed";
|
|
10471
|
+
}
|
|
10472
|
+
} else {
|
|
10473
|
+
updates.lastError = stepError;
|
|
10474
|
+
updates.status = "failed";
|
|
10475
|
+
}
|
|
10476
|
+
await config.triggers.update(trigger.id, updates, context);
|
|
10477
|
+
return { success: stepSuccess, steps, error: stepError };
|
|
10478
|
+
}
|
|
10479
|
+
const completeRequest = {
|
|
10480
|
+
success: stepSuccess,
|
|
10481
|
+
result: stepSuccess ? toolResult : undefined,
|
|
10482
|
+
error: stepError,
|
|
10483
|
+
executedAt,
|
|
10484
|
+
duration,
|
|
10485
|
+
stepIndex,
|
|
10486
|
+
previousResults: steps,
|
|
10487
|
+
final: false
|
|
10488
|
+
};
|
|
10489
|
+
const completeResponse = await config.triggers.onComplete({
|
|
10490
|
+
trigger,
|
|
10491
|
+
request: completeRequest,
|
|
10492
|
+
context
|
|
10493
|
+
});
|
|
10494
|
+
if (completeResponse.hasMore && completeResponse.nextStep) {
|
|
10495
|
+
currentToolName = completeResponse.nextStep.toolName;
|
|
10496
|
+
currentToolArguments = completeResponse.nextStep.toolArguments;
|
|
10497
|
+
currentProvider = completeResponse.nextStep.provider;
|
|
10498
|
+
stepIndex++;
|
|
10499
|
+
continue;
|
|
10500
|
+
}
|
|
10501
|
+
const finalUpdates = {
|
|
10502
|
+
lastRunAt: executedAt,
|
|
10503
|
+
runCount: (trigger.runCount || 0) + 1
|
|
10504
|
+
};
|
|
10505
|
+
if (stepSuccess) {
|
|
10506
|
+
finalUpdates.lastResult = toolResult;
|
|
10507
|
+
finalUpdates.lastError = undefined;
|
|
10508
|
+
if (trigger.schedule.type === "once") {
|
|
10509
|
+
finalUpdates.status = "completed";
|
|
10510
|
+
}
|
|
10511
|
+
} else {
|
|
10512
|
+
finalUpdates.lastError = stepError;
|
|
10513
|
+
finalUpdates.status = "failed";
|
|
10514
|
+
}
|
|
10515
|
+
await config.triggers.update(trigger.id, finalUpdates, context);
|
|
10516
|
+
if (completeResponse.webhooks && completeResponse.webhooks.length > 0) {
|
|
10517
|
+
const totalDuration = steps.reduce((sum, s) => sum + (s.duration || 0), 0);
|
|
10518
|
+
const payload = {
|
|
10519
|
+
triggerId: trigger.id,
|
|
10520
|
+
success: steps.every((s) => s.success),
|
|
10521
|
+
steps,
|
|
10522
|
+
totalSteps: steps.length,
|
|
10523
|
+
totalDuration,
|
|
10524
|
+
executedAt
|
|
10525
|
+
};
|
|
10526
|
+
deliverWebhooks(completeResponse.webhooks, payload, WEBHOOK_DELIVERY_TIMEOUT_MS).catch(() => {});
|
|
10527
|
+
}
|
|
10528
|
+
return { success: stepSuccess, steps, error: stepError };
|
|
10529
|
+
}
|
|
10530
|
+
const limitError = `Trigger execution exceeded maximum of ${MAX_TRIGGER_STEPS} steps`;
|
|
10531
|
+
logger31.error(`[Trigger ${trigger.id}] ${limitError}`);
|
|
10532
|
+
await config.triggers.update(trigger.id, {
|
|
10533
|
+
lastRunAt: new Date().toISOString(),
|
|
10534
|
+
runCount: (trigger.runCount || 0) + 1,
|
|
10535
|
+
lastError: limitError,
|
|
10536
|
+
status: "failed"
|
|
10537
|
+
}, context);
|
|
10538
|
+
return { success: false, steps, error: limitError };
|
|
10539
|
+
}
|
|
10540
|
+
var logger31;
|
|
10541
|
+
var init_executor = __esm(() => {
|
|
10542
|
+
init_logger();
|
|
10543
|
+
init_utils2();
|
|
10544
|
+
init_webhooks();
|
|
10545
|
+
logger31 = createLogger("TriggerExecutor", "server");
|
|
10546
|
+
});
|
|
10547
|
+
|
|
10413
10548
|
// src/server.ts
|
|
10414
10549
|
var exports_server = {};
|
|
10415
10550
|
__export(exports_server, {
|
|
@@ -10503,7 +10638,7 @@ function createMCPServer(config) {
|
|
|
10503
10638
|
if (integration.oauth) {
|
|
10504
10639
|
const { clientId, clientSecret, redirectUri: integrationRedirectUri, config: oauthConfig } = integration.oauth;
|
|
10505
10640
|
if (!clientId || !clientSecret) {
|
|
10506
|
-
|
|
10641
|
+
logger32.warn(`Warning: Integration "${integration.id}" is missing OAuth credentials. ` + `Provide clientId and clientSecret in the integration configuration.`);
|
|
10507
10642
|
return integration;
|
|
10508
10643
|
}
|
|
10509
10644
|
const redirectUri = integrationRedirectUri || config.redirectUri || getDefaultRedirectUri();
|
|
@@ -10634,7 +10769,7 @@ function createMCPServer(config) {
|
|
|
10634
10769
|
}
|
|
10635
10770
|
return response2;
|
|
10636
10771
|
} catch (error) {
|
|
10637
|
-
|
|
10772
|
+
logger32.error("[MCP Tool Call] Error:", error);
|
|
10638
10773
|
return Response.json({ error: error.message || "Failed to execute tool call" }, { status: error.statusCode || 500 });
|
|
10639
10774
|
}
|
|
10640
10775
|
}
|
|
@@ -10650,6 +10785,57 @@ function createMCPServer(config) {
|
|
|
10650
10785
|
}));
|
|
10651
10786
|
return Response.json({ integrations });
|
|
10652
10787
|
}
|
|
10788
|
+
if (segments.length === 2 && segments[0] === "triggers" && segments[1] === "notify" && method === "POST") {
|
|
10789
|
+
if (!config.triggers) {
|
|
10790
|
+
return Response.json({ error: "Triggers not configured. Add triggers callbacks to createMCPServer config." }, { status: 501 });
|
|
10791
|
+
}
|
|
10792
|
+
try {
|
|
10793
|
+
const apiKey = webRequest.headers.get("x-api-key");
|
|
10794
|
+
if (!apiKey || apiKey !== config.apiKey) {
|
|
10795
|
+
return Response.json({ error: "Unauthorized" }, { status: 401 });
|
|
10796
|
+
}
|
|
10797
|
+
const body = await webRequest.json();
|
|
10798
|
+
const { triggerId } = body;
|
|
10799
|
+
if (!triggerId) {
|
|
10800
|
+
return Response.json({ error: "triggerId is required" }, { status: 400 });
|
|
10801
|
+
}
|
|
10802
|
+
const trigger = await config.triggers.get(triggerId);
|
|
10803
|
+
if (!trigger) {
|
|
10804
|
+
return Response.json({ error: "Trigger not found" }, { status: 404 });
|
|
10805
|
+
}
|
|
10806
|
+
if (!trigger.provider) {
|
|
10807
|
+
return Response.json({ error: "Trigger has no provider configured" }, { status: 400 });
|
|
10808
|
+
}
|
|
10809
|
+
const triggerContext = trigger.userId ? { userId: trigger.userId } : undefined;
|
|
10810
|
+
const { executeTrigger: executeTrigger2 } = await Promise.resolve().then(() => (init_executor(), exports_executor));
|
|
10811
|
+
const { OAuthHandler: OAuthHandler2 } = await Promise.resolve().then(() => (init_base_handler(), exports_base_handler));
|
|
10812
|
+
const oauthHandler = new OAuthHandler2({
|
|
10813
|
+
providers,
|
|
10814
|
+
serverUrl: config.serverUrl,
|
|
10815
|
+
apiKey: config.apiKey,
|
|
10816
|
+
setProviderToken: config.setProviderToken,
|
|
10817
|
+
removeProviderToken: config.removeProviderToken,
|
|
10818
|
+
getSessionContext: config.getSessionContext
|
|
10819
|
+
});
|
|
10820
|
+
const executionResult = await executeTrigger2(trigger, {
|
|
10821
|
+
triggers: config.triggers,
|
|
10822
|
+
getProviderToken: async (provider, email, ctx) => {
|
|
10823
|
+
return config.getProviderToken ? await config.getProviderToken(provider, email, ctx) : undefined;
|
|
10824
|
+
},
|
|
10825
|
+
handleToolCall: (toolBody, authHeader, integrationsHeader) => {
|
|
10826
|
+
return oauthHandler.handleToolCall(toolBody, authHeader, integrationsHeader);
|
|
10827
|
+
}
|
|
10828
|
+
}, triggerContext);
|
|
10829
|
+
return Response.json({
|
|
10830
|
+
success: executionResult.success,
|
|
10831
|
+
steps: executionResult.steps,
|
|
10832
|
+
error: executionResult.error
|
|
10833
|
+
});
|
|
10834
|
+
} catch (error) {
|
|
10835
|
+
logger32.error("[Trigger Notify] Error:", error);
|
|
10836
|
+
return Response.json({ error: error.message || "Failed to execute trigger" }, { status: 500 });
|
|
10837
|
+
}
|
|
10838
|
+
}
|
|
10653
10839
|
if (segments.length >= 1 && segments[0] === "triggers") {
|
|
10654
10840
|
if (!config.triggers) {
|
|
10655
10841
|
return Response.json({ error: "Triggers not configured. Add triggers callbacks to createMCPServer config." }, { status: 501 });
|
|
@@ -10690,8 +10876,9 @@ function createMCPServer(config) {
|
|
|
10690
10876
|
};
|
|
10691
10877
|
const created = await config.triggers.create(trigger, context2);
|
|
10692
10878
|
const schedulerUrl = config.schedulerUrl || config.serverUrl || "https://mcp.integrate.dev";
|
|
10693
|
-
const
|
|
10879
|
+
const defaultCallbackBaseUrl = process.env.INTEGRATE_URL || (typeof window !== "undefined" ? window.location.origin : "http://localhost:3000");
|
|
10694
10880
|
try {
|
|
10881
|
+
const callbackBaseUrl = config.triggers.getCallbackUrl ? await config.triggers.getCallbackUrl(context2) : defaultCallbackBaseUrl;
|
|
10695
10882
|
await fetch(`${schedulerUrl}/scheduler/register`, {
|
|
10696
10883
|
method: "POST",
|
|
10697
10884
|
headers: {
|
|
@@ -10701,8 +10888,7 @@ function createMCPServer(config) {
|
|
|
10701
10888
|
body: JSON.stringify({
|
|
10702
10889
|
triggerId: created.id,
|
|
10703
10890
|
schedule: created.schedule,
|
|
10704
|
-
callbackUrl: `${callbackBaseUrl}/api/integrate/triggers
|
|
10705
|
-
completeUrl: `${callbackBaseUrl}/api/integrate/triggers/${created.id}/complete`,
|
|
10891
|
+
callbackUrl: `${callbackBaseUrl}/api/integrate/triggers/notify`,
|
|
10706
10892
|
metadata: {
|
|
10707
10893
|
userId: context2?.userId,
|
|
10708
10894
|
provider: created.provider
|
|
@@ -10710,7 +10896,7 @@ function createMCPServer(config) {
|
|
|
10710
10896
|
})
|
|
10711
10897
|
});
|
|
10712
10898
|
} catch (scheduleError) {
|
|
10713
|
-
|
|
10899
|
+
logger32.error("[Trigger] Failed to register with scheduler:", scheduleError);
|
|
10714
10900
|
}
|
|
10715
10901
|
return Response.json(created, { status: 201 });
|
|
10716
10902
|
}
|
|
@@ -10745,7 +10931,7 @@ function createMCPServer(config) {
|
|
|
10745
10931
|
body: JSON.stringify({ triggerId })
|
|
10746
10932
|
});
|
|
10747
10933
|
} catch (error) {
|
|
10748
|
-
|
|
10934
|
+
logger32.error("[Trigger] Failed to pause in scheduler:", error);
|
|
10749
10935
|
}
|
|
10750
10936
|
return Response.json(updated);
|
|
10751
10937
|
} else if (subAction === "resume" && method === "POST") {
|
|
@@ -10773,7 +10959,7 @@ function createMCPServer(config) {
|
|
|
10773
10959
|
body: JSON.stringify({ triggerId })
|
|
10774
10960
|
});
|
|
10775
10961
|
} catch (error) {
|
|
10776
|
-
|
|
10962
|
+
logger32.error("[Trigger] Failed to resume in scheduler:", error);
|
|
10777
10963
|
}
|
|
10778
10964
|
return Response.json(updated);
|
|
10779
10965
|
} else if (subAction === "run" && method === "POST") {
|
|
@@ -10784,10 +10970,7 @@ function createMCPServer(config) {
|
|
|
10784
10970
|
if (!trigger.provider) {
|
|
10785
10971
|
return Response.json({ error: "Trigger has no provider configured" }, { status: 400 });
|
|
10786
10972
|
}
|
|
10787
|
-
const
|
|
10788
|
-
if (!providerToken) {
|
|
10789
|
-
return Response.json({ error: "No OAuth token available for this trigger" }, { status: 401 });
|
|
10790
|
-
}
|
|
10973
|
+
const { executeTrigger: executeTrigger2 } = await Promise.resolve().then(() => (init_executor(), exports_executor));
|
|
10791
10974
|
const { OAuthHandler: OAuthHandler2 } = await Promise.resolve().then(() => (init_base_handler(), exports_base_handler));
|
|
10792
10975
|
const oauthHandler = new OAuthHandler2({
|
|
10793
10976
|
providers,
|
|
@@ -10797,145 +10980,23 @@ function createMCPServer(config) {
|
|
|
10797
10980
|
removeProviderToken: config.removeProviderToken,
|
|
10798
10981
|
getSessionContext: config.getSessionContext
|
|
10799
10982
|
});
|
|
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
|
|
10983
|
+
const executionResult = await executeTrigger2(trigger, {
|
|
10984
|
+
triggers: config.triggers,
|
|
10985
|
+
getProviderToken: async (provider, email, ctx) => {
|
|
10986
|
+
return config.getProviderToken ? await config.getProviderToken(provider, email, ctx) : undefined;
|
|
10855
10987
|
},
|
|
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 });
|
|
10988
|
+
handleToolCall: (toolBody, authHeader, integrationsHeader) => {
|
|
10989
|
+
return oauthHandler.handleToolCall(toolBody, authHeader, integrationsHeader);
|
|
10875
10990
|
}
|
|
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 });
|
|
10991
|
+
}, context2);
|
|
10992
|
+
return Response.json({
|
|
10993
|
+
success: executionResult.success,
|
|
10994
|
+
result: executionResult.steps[0]?.result,
|
|
10995
|
+
executedAt: executionResult.steps[0]?.executedAt || new Date().toISOString(),
|
|
10996
|
+
duration: executionResult.steps[0]?.duration,
|
|
10997
|
+
error: executionResult.error,
|
|
10998
|
+
steps: executionResult.steps
|
|
10999
|
+
}, { status: executionResult.success ? 200 : 500 });
|
|
10939
11000
|
} else if (!subAction && method === "GET") {
|
|
10940
11001
|
const trigger = await config.triggers.get(triggerId, context2);
|
|
10941
11002
|
if (!trigger) {
|
|
@@ -10968,7 +11029,7 @@ function createMCPServer(config) {
|
|
|
10968
11029
|
})
|
|
10969
11030
|
});
|
|
10970
11031
|
} catch (error) {
|
|
10971
|
-
|
|
11032
|
+
logger32.error("[Trigger] Failed to update scheduler:", error);
|
|
10972
11033
|
}
|
|
10973
11034
|
}
|
|
10974
11035
|
return Response.json(updated);
|
|
@@ -10985,14 +11046,14 @@ function createMCPServer(config) {
|
|
|
10985
11046
|
body: JSON.stringify({ triggerId })
|
|
10986
11047
|
});
|
|
10987
11048
|
} catch (error) {
|
|
10988
|
-
|
|
11049
|
+
logger32.error("[Trigger] Failed to unregister from scheduler:", error);
|
|
10989
11050
|
}
|
|
10990
11051
|
return new Response(null, { status: 204 });
|
|
10991
11052
|
}
|
|
10992
11053
|
}
|
|
10993
11054
|
return Response.json({ error: "Invalid trigger route or method" }, { status: 404 });
|
|
10994
11055
|
} catch (error) {
|
|
10995
|
-
|
|
11056
|
+
logger32.error("[Trigger] Error:", error);
|
|
10996
11057
|
return Response.json({ error: error.message || "Failed to process trigger request" }, { status: error.statusCode || 500 });
|
|
10997
11058
|
}
|
|
10998
11059
|
}
|
|
@@ -11018,11 +11079,11 @@ function createMCPServer(config) {
|
|
|
11018
11079
|
const errorRedirectUrl = "/auth-error";
|
|
11019
11080
|
if (error) {
|
|
11020
11081
|
const errorMsg = errorDescription || error;
|
|
11021
|
-
|
|
11082
|
+
logger32.error("[OAuth Redirect] Error:", errorMsg);
|
|
11022
11083
|
return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent(errorMsg)}`, webRequest.url));
|
|
11023
11084
|
}
|
|
11024
11085
|
if (!code || !state) {
|
|
11025
|
-
|
|
11086
|
+
logger32.error("[OAuth Redirect] Missing code or state parameter");
|
|
11026
11087
|
return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent("Invalid OAuth callback")}`, webRequest.url));
|
|
11027
11088
|
}
|
|
11028
11089
|
let returnUrl = defaultRedirectUrl;
|
|
@@ -11098,7 +11159,7 @@ function createMCPServer(config) {
|
|
|
11098
11159
|
frontendUrl.hash = `oauth_callback=${encodeURIComponent(JSON.stringify({ code, state, tokenData }))}`;
|
|
11099
11160
|
return Response.redirect(frontendUrl);
|
|
11100
11161
|
} catch (error2) {
|
|
11101
|
-
|
|
11162
|
+
logger32.error("[OAuth Backend Callback] Error:", error2);
|
|
11102
11163
|
return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent(error2.message || "Failed to exchange token")}`, webRequest.url));
|
|
11103
11164
|
}
|
|
11104
11165
|
} else {
|
|
@@ -11317,7 +11378,7 @@ function toSvelteKitHandler(clientOrHandlerOrOptions, _redirectOptions) {
|
|
|
11317
11378
|
}
|
|
11318
11379
|
};
|
|
11319
11380
|
}
|
|
11320
|
-
var SERVER_LOG_CONTEXT2 = "server",
|
|
11381
|
+
var SERVER_LOG_CONTEXT2 = "server", logger32, globalServerConfig = null, codeVerifierStorage, POST = async (req, context) => {
|
|
11321
11382
|
if (!globalServerConfig) {
|
|
11322
11383
|
return Response.json({ error: "OAuth not configured. Call createMCPServer() in your server initialization file first." }, { status: 500 });
|
|
11323
11384
|
}
|
|
@@ -11365,7 +11426,7 @@ var init_server = __esm(() => {
|
|
|
11365
11426
|
init_anthropic();
|
|
11366
11427
|
init_google();
|
|
11367
11428
|
init_ai();
|
|
11368
|
-
|
|
11429
|
+
logger32 = createLogger("MCPServer", SERVER_LOG_CONTEXT2);
|
|
11369
11430
|
codeVerifierStorage = new Map;
|
|
11370
11431
|
});
|
|
11371
11432
|
|
|
@@ -11716,7 +11777,7 @@ class OAuthHandler {
|
|
|
11716
11777
|
url.searchParams.set("state", authorizeRequest.state);
|
|
11717
11778
|
url.searchParams.set("code_challenge", authorizeRequest.codeChallenge);
|
|
11718
11779
|
url.searchParams.set("code_challenge_method", authorizeRequest.codeChallengeMethod);
|
|
11719
|
-
const redirectUri =
|
|
11780
|
+
const redirectUri = providerConfig.redirectUri;
|
|
11720
11781
|
if (redirectUri) {
|
|
11721
11782
|
url.searchParams.set("redirect_uri", redirectUri);
|
|
11722
11783
|
}
|
|
@@ -11828,7 +11889,7 @@ class OAuthHandler {
|
|
|
11828
11889
|
tokenType: result.tokenType,
|
|
11829
11890
|
expiresIn: result.expiresIn,
|
|
11830
11891
|
expiresAt: result.expiresAt,
|
|
11831
|
-
scopes: result.scopes
|
|
11892
|
+
scopes: result.scopes ? result.scopes.flatMap((s) => s.split(" ").filter(Boolean)) : result.scopes
|
|
11832
11893
|
};
|
|
11833
11894
|
await this.config.setProviderToken(callbackRequest.provider, tokenData, undefined, context);
|
|
11834
11895
|
} catch (error) {}
|
|
@@ -11878,11 +11939,11 @@ class OAuthHandler {
|
|
|
11878
11939
|
try {
|
|
11879
11940
|
await this.config.removeProviderToken(request.provider, undefined, context);
|
|
11880
11941
|
} catch (error) {
|
|
11881
|
-
|
|
11942
|
+
logger33.error(`Failed to delete token for ${request.provider} from database via removeProviderToken:`, error);
|
|
11882
11943
|
}
|
|
11883
11944
|
}
|
|
11884
11945
|
} catch (error) {
|
|
11885
|
-
|
|
11946
|
+
logger33.error(`Failed to extract context for disconnect:`, error);
|
|
11886
11947
|
}
|
|
11887
11948
|
}
|
|
11888
11949
|
const url = new URL("/oauth/disconnect", this.serverUrl);
|
|
@@ -11942,10 +12003,10 @@ class OAuthHandler {
|
|
|
11942
12003
|
return jsonRpcResponse.result;
|
|
11943
12004
|
}
|
|
11944
12005
|
}
|
|
11945
|
-
var SERVER_LOG_CONTEXT3 = "server",
|
|
12006
|
+
var SERVER_LOG_CONTEXT3 = "server", logger33, MCP_SERVER_URL2 = "https://mcp.integrate.dev/api/v1/mcp";
|
|
11946
12007
|
var init_base_handler = __esm(() => {
|
|
11947
12008
|
init_logger();
|
|
11948
|
-
|
|
12009
|
+
logger33 = createLogger("OAuthHandler", SERVER_LOG_CONTEXT3);
|
|
11949
12010
|
});
|
|
11950
12011
|
|
|
11951
12012
|
// src/index.ts
|
|
@@ -11958,7 +12019,7 @@ init_nextjs();
|
|
|
11958
12019
|
// src/adapters/nextjs-oauth-redirect.ts
|
|
11959
12020
|
init_logger();
|
|
11960
12021
|
var SERVER_LOG_CONTEXT4 = "server";
|
|
11961
|
-
var
|
|
12022
|
+
var logger34 = createLogger("OAuthRedirect", SERVER_LOG_CONTEXT4);
|
|
11962
12023
|
function createOAuthRedirectHandler(config) {
|
|
11963
12024
|
const defaultRedirectUrl = config?.redirectUrl || "/";
|
|
11964
12025
|
const errorRedirectUrl = config?.errorRedirectUrl || "/auth-error";
|
|
@@ -11970,11 +12031,11 @@ function createOAuthRedirectHandler(config) {
|
|
|
11970
12031
|
const errorDescription = searchParams.get("error_description");
|
|
11971
12032
|
if (error) {
|
|
11972
12033
|
const errorMsg = errorDescription || error;
|
|
11973
|
-
|
|
12034
|
+
logger34.error("[OAuth Redirect] Error:", errorMsg);
|
|
11974
12035
|
return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent(errorMsg)}`, req.url));
|
|
11975
12036
|
}
|
|
11976
12037
|
if (!code || !state) {
|
|
11977
|
-
|
|
12038
|
+
logger34.error("[OAuth Redirect] Missing code or state parameter");
|
|
11978
12039
|
return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent("Invalid OAuth callback")}`, req.url));
|
|
11979
12040
|
}
|
|
11980
12041
|
let returnUrl = defaultRedirectUrl;
|