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/oauth.js
CHANGED
|
@@ -10181,21 +10181,7 @@ var init_ai = __esm(() => {
|
|
|
10181
10181
|
init_trigger_tools();
|
|
10182
10182
|
});
|
|
10183
10183
|
|
|
10184
|
-
// src/triggers/types.ts
|
|
10185
|
-
var exports_types = {};
|
|
10186
|
-
__export(exports_types, {
|
|
10187
|
-
WEBHOOK_DELIVERY_TIMEOUT_MS: () => WEBHOOK_DELIVERY_TIMEOUT_MS,
|
|
10188
|
-
MAX_TRIGGER_STEPS: () => MAX_TRIGGER_STEPS
|
|
10189
|
-
});
|
|
10190
|
-
var MAX_TRIGGER_STEPS = 20, WEBHOOK_DELIVERY_TIMEOUT_MS = 1e4;
|
|
10191
|
-
|
|
10192
10184
|
// src/triggers/webhooks.ts
|
|
10193
|
-
var exports_webhooks = {};
|
|
10194
|
-
__export(exports_webhooks, {
|
|
10195
|
-
signPayload: () => signPayload,
|
|
10196
|
-
deliverWebhooks: () => deliverWebhooks,
|
|
10197
|
-
deliverWebhook: () => deliverWebhook
|
|
10198
|
-
});
|
|
10199
10185
|
async function signPayload(payload, secret) {
|
|
10200
10186
|
const encoder = new TextEncoder;
|
|
10201
10187
|
const data = encoder.encode(JSON.stringify(payload));
|
|
@@ -10244,6 +10230,155 @@ var init_webhooks = __esm(() => {
|
|
|
10244
10230
|
logger30 = createLogger("Webhooks", "server");
|
|
10245
10231
|
});
|
|
10246
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
|
+
|
|
10247
10382
|
// src/server.ts
|
|
10248
10383
|
var exports_server = {};
|
|
10249
10384
|
__export(exports_server, {
|
|
@@ -10337,7 +10472,7 @@ function createMCPServer(config) {
|
|
|
10337
10472
|
if (integration.oauth) {
|
|
10338
10473
|
const { clientId, clientSecret, redirectUri: integrationRedirectUri, config: oauthConfig } = integration.oauth;
|
|
10339
10474
|
if (!clientId || !clientSecret) {
|
|
10340
|
-
|
|
10475
|
+
logger32.warn(`Warning: Integration "${integration.id}" is missing OAuth credentials. ` + `Provide clientId and clientSecret in the integration configuration.`);
|
|
10341
10476
|
return integration;
|
|
10342
10477
|
}
|
|
10343
10478
|
const redirectUri = integrationRedirectUri || config.redirectUri || getDefaultRedirectUri();
|
|
@@ -10468,7 +10603,7 @@ function createMCPServer(config) {
|
|
|
10468
10603
|
}
|
|
10469
10604
|
return response2;
|
|
10470
10605
|
} catch (error) {
|
|
10471
|
-
|
|
10606
|
+
logger32.error("[MCP Tool Call] Error:", error);
|
|
10472
10607
|
return Response.json({ error: error.message || "Failed to execute tool call" }, { status: error.statusCode || 500 });
|
|
10473
10608
|
}
|
|
10474
10609
|
}
|
|
@@ -10484,6 +10619,57 @@ function createMCPServer(config) {
|
|
|
10484
10619
|
}));
|
|
10485
10620
|
return Response.json({ integrations });
|
|
10486
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
|
+
}
|
|
10487
10673
|
if (segments.length >= 1 && segments[0] === "triggers") {
|
|
10488
10674
|
if (!config.triggers) {
|
|
10489
10675
|
return Response.json({ error: "Triggers not configured. Add triggers callbacks to createMCPServer config." }, { status: 501 });
|
|
@@ -10524,8 +10710,9 @@ function createMCPServer(config) {
|
|
|
10524
10710
|
};
|
|
10525
10711
|
const created = await config.triggers.create(trigger, context2);
|
|
10526
10712
|
const schedulerUrl = config.schedulerUrl || config.serverUrl || "https://mcp.integrate.dev";
|
|
10527
|
-
const
|
|
10713
|
+
const defaultCallbackBaseUrl = process.env.INTEGRATE_URL || (typeof window !== "undefined" ? window.location.origin : "http://localhost:3000");
|
|
10528
10714
|
try {
|
|
10715
|
+
const callbackBaseUrl = config.triggers.getCallbackUrl ? await config.triggers.getCallbackUrl(context2) : defaultCallbackBaseUrl;
|
|
10529
10716
|
await fetch(`${schedulerUrl}/scheduler/register`, {
|
|
10530
10717
|
method: "POST",
|
|
10531
10718
|
headers: {
|
|
@@ -10535,8 +10722,7 @@ function createMCPServer(config) {
|
|
|
10535
10722
|
body: JSON.stringify({
|
|
10536
10723
|
triggerId: created.id,
|
|
10537
10724
|
schedule: created.schedule,
|
|
10538
|
-
callbackUrl: `${callbackBaseUrl}/api/integrate/triggers
|
|
10539
|
-
completeUrl: `${callbackBaseUrl}/api/integrate/triggers/${created.id}/complete`,
|
|
10725
|
+
callbackUrl: `${callbackBaseUrl}/api/integrate/triggers/notify`,
|
|
10540
10726
|
metadata: {
|
|
10541
10727
|
userId: context2?.userId,
|
|
10542
10728
|
provider: created.provider
|
|
@@ -10544,7 +10730,7 @@ function createMCPServer(config) {
|
|
|
10544
10730
|
})
|
|
10545
10731
|
});
|
|
10546
10732
|
} catch (scheduleError) {
|
|
10547
|
-
|
|
10733
|
+
logger32.error("[Trigger] Failed to register with scheduler:", scheduleError);
|
|
10548
10734
|
}
|
|
10549
10735
|
return Response.json(created, { status: 201 });
|
|
10550
10736
|
}
|
|
@@ -10579,7 +10765,7 @@ function createMCPServer(config) {
|
|
|
10579
10765
|
body: JSON.stringify({ triggerId })
|
|
10580
10766
|
});
|
|
10581
10767
|
} catch (error) {
|
|
10582
|
-
|
|
10768
|
+
logger32.error("[Trigger] Failed to pause in scheduler:", error);
|
|
10583
10769
|
}
|
|
10584
10770
|
return Response.json(updated);
|
|
10585
10771
|
} else if (subAction === "resume" && method === "POST") {
|
|
@@ -10607,7 +10793,7 @@ function createMCPServer(config) {
|
|
|
10607
10793
|
body: JSON.stringify({ triggerId })
|
|
10608
10794
|
});
|
|
10609
10795
|
} catch (error) {
|
|
10610
|
-
|
|
10796
|
+
logger32.error("[Trigger] Failed to resume in scheduler:", error);
|
|
10611
10797
|
}
|
|
10612
10798
|
return Response.json(updated);
|
|
10613
10799
|
} else if (subAction === "run" && method === "POST") {
|
|
@@ -10618,10 +10804,7 @@ function createMCPServer(config) {
|
|
|
10618
10804
|
if (!trigger.provider) {
|
|
10619
10805
|
return Response.json({ error: "Trigger has no provider configured" }, { status: 400 });
|
|
10620
10806
|
}
|
|
10621
|
-
const
|
|
10622
|
-
if (!providerToken) {
|
|
10623
|
-
return Response.json({ error: "No OAuth token available for this trigger" }, { status: 401 });
|
|
10624
|
-
}
|
|
10807
|
+
const { executeTrigger: executeTrigger2 } = await Promise.resolve().then(() => (init_executor(), exports_executor));
|
|
10625
10808
|
const { OAuthHandler: OAuthHandler2 } = await Promise.resolve().then(() => (init_base_handler(), exports_base_handler));
|
|
10626
10809
|
const oauthHandler = new OAuthHandler2({
|
|
10627
10810
|
providers,
|
|
@@ -10631,145 +10814,23 @@ function createMCPServer(config) {
|
|
|
10631
10814
|
removeProviderToken: config.removeProviderToken,
|
|
10632
10815
|
getSessionContext: config.getSessionContext
|
|
10633
10816
|
});
|
|
10634
|
-
const
|
|
10635
|
-
|
|
10636
|
-
|
|
10637
|
-
|
|
10638
|
-
const executionResult = {
|
|
10639
|
-
success: true,
|
|
10640
|
-
result,
|
|
10641
|
-
executedAt: new Date().toISOString(),
|
|
10642
|
-
duration
|
|
10643
|
-
};
|
|
10644
|
-
await config.triggers.update(triggerId, {
|
|
10645
|
-
lastRunAt: executionResult.executedAt,
|
|
10646
|
-
runCount: (trigger.runCount || 0) + 1,
|
|
10647
|
-
lastResult: result,
|
|
10648
|
-
lastError: undefined
|
|
10649
|
-
}, context2);
|
|
10650
|
-
return Response.json(executionResult);
|
|
10651
|
-
} catch (error) {
|
|
10652
|
-
const duration = Date.now() - startTime;
|
|
10653
|
-
const executionResult = {
|
|
10654
|
-
success: false,
|
|
10655
|
-
error: error.message || "Tool execution failed",
|
|
10656
|
-
executedAt: new Date().toISOString(),
|
|
10657
|
-
duration
|
|
10658
|
-
};
|
|
10659
|
-
await config.triggers.update(triggerId, {
|
|
10660
|
-
lastRunAt: executionResult.executedAt,
|
|
10661
|
-
runCount: (trigger.runCount || 0) + 1,
|
|
10662
|
-
lastError: error.message,
|
|
10663
|
-
status: "failed"
|
|
10664
|
-
}, context2);
|
|
10665
|
-
return Response.json(executionResult, { status: 500 });
|
|
10666
|
-
}
|
|
10667
|
-
} else if (subAction === "execute" && method === "GET") {
|
|
10668
|
-
const apiKey = webRequest.headers.get("x-api-key");
|
|
10669
|
-
if (!apiKey || apiKey !== config.apiKey) {
|
|
10670
|
-
return Response.json({ error: "Unauthorized" }, { status: 401 });
|
|
10671
|
-
}
|
|
10672
|
-
const trigger = await config.triggers.get(triggerId, context2);
|
|
10673
|
-
if (!trigger) {
|
|
10674
|
-
return Response.json({ error: "Trigger not found" }, { status: 404 });
|
|
10675
|
-
}
|
|
10676
|
-
if (!trigger.provider) {
|
|
10677
|
-
return Response.json({ error: "Trigger has no provider configured" }, { status: 400 });
|
|
10678
|
-
}
|
|
10679
|
-
const providerToken = config.getProviderToken ? await config.getProviderToken(trigger.provider, undefined, context2) : undefined;
|
|
10680
|
-
if (!providerToken) {
|
|
10681
|
-
return Response.json({ error: "No OAuth token available for this trigger" }, { status: 401 });
|
|
10682
|
-
}
|
|
10683
|
-
return Response.json({
|
|
10684
|
-
trigger: {
|
|
10685
|
-
id: trigger.id,
|
|
10686
|
-
toolName: trigger.toolName,
|
|
10687
|
-
toolArguments: trigger.toolArguments,
|
|
10688
|
-
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;
|
|
10689
10821
|
},
|
|
10690
|
-
|
|
10691
|
-
|
|
10692
|
-
});
|
|
10693
|
-
} else if (subAction === "complete" && method === "POST") {
|
|
10694
|
-
const apiKey = webRequest.headers.get("x-api-key");
|
|
10695
|
-
if (!apiKey || apiKey !== config.apiKey) {
|
|
10696
|
-
return Response.json({ error: "Unauthorized" }, { status: 401 });
|
|
10697
|
-
}
|
|
10698
|
-
const body = await webRequest.json();
|
|
10699
|
-
const trigger = await config.triggers.get(triggerId, context2);
|
|
10700
|
-
if (!trigger) {
|
|
10701
|
-
return Response.json({ error: "Trigger not found" }, { status: 404 });
|
|
10702
|
-
}
|
|
10703
|
-
if (body.stepIndex != null) {
|
|
10704
|
-
const { validateStepLimit: validateStepLimit2 } = await Promise.resolve().then(() => (init_utils2(), exports_utils));
|
|
10705
|
-
const { MAX_TRIGGER_STEPS: MAX_TRIGGER_STEPS2 } = await Promise.resolve().then(() => exports_types);
|
|
10706
|
-
const stepValidation = validateStepLimit2(body.stepIndex, MAX_TRIGGER_STEPS2);
|
|
10707
|
-
if (!stepValidation.valid) {
|
|
10708
|
-
return Response.json({ error: stepValidation.error }, { status: 400 });
|
|
10822
|
+
handleToolCall: (toolBody, authHeader, integrationsHeader) => {
|
|
10823
|
+
return oauthHandler.handleToolCall(toolBody, authHeader, integrationsHeader);
|
|
10709
10824
|
}
|
|
10710
|
-
}
|
|
10711
|
-
|
|
10712
|
-
|
|
10713
|
-
|
|
10714
|
-
|
|
10715
|
-
|
|
10716
|
-
|
|
10717
|
-
|
|
10718
|
-
|
|
10719
|
-
return Response.json(completeResponse);
|
|
10720
|
-
}
|
|
10721
|
-
const updates2 = {
|
|
10722
|
-
lastRunAt: body.executedAt,
|
|
10723
|
-
runCount: (trigger.runCount || 0) + 1
|
|
10724
|
-
};
|
|
10725
|
-
if (body.success) {
|
|
10726
|
-
updates2.lastResult = body.result;
|
|
10727
|
-
updates2.lastError = undefined;
|
|
10728
|
-
if (trigger.schedule.type === "once") {
|
|
10729
|
-
updates2.status = "completed";
|
|
10730
|
-
}
|
|
10731
|
-
} else {
|
|
10732
|
-
updates2.lastError = body.error;
|
|
10733
|
-
updates2.status = "failed";
|
|
10734
|
-
}
|
|
10735
|
-
await config.triggers.update(triggerId, updates2, context2);
|
|
10736
|
-
if (completeResponse.webhooks && completeResponse.webhooks.length > 0) {
|
|
10737
|
-
const { deliverWebhooks: deliverWebhooks2 } = await Promise.resolve().then(() => (init_webhooks(), exports_webhooks));
|
|
10738
|
-
const { WEBHOOK_DELIVERY_TIMEOUT_MS: WEBHOOK_DELIVERY_TIMEOUT_MS2 } = await Promise.resolve().then(() => exports_types);
|
|
10739
|
-
const steps = body.previousResults || [];
|
|
10740
|
-
const totalDuration = steps.reduce((sum, s) => sum + (s.duration || 0), 0);
|
|
10741
|
-
const payload = {
|
|
10742
|
-
triggerId,
|
|
10743
|
-
success: body.success,
|
|
10744
|
-
steps,
|
|
10745
|
-
totalSteps: steps.length,
|
|
10746
|
-
totalDuration,
|
|
10747
|
-
executedAt: body.executedAt
|
|
10748
|
-
};
|
|
10749
|
-
deliverWebhooks2(completeResponse.webhooks, payload, WEBHOOK_DELIVERY_TIMEOUT_MS2).catch(() => {});
|
|
10750
|
-
}
|
|
10751
|
-
return Response.json(completeResponse);
|
|
10752
|
-
} catch (error) {
|
|
10753
|
-
logger31.error("onComplete callback error:", error);
|
|
10754
|
-
return Response.json({ error: "Internal server error in onComplete callback" }, { status: 500 });
|
|
10755
|
-
}
|
|
10756
|
-
}
|
|
10757
|
-
const updates = {
|
|
10758
|
-
lastRunAt: body.executedAt,
|
|
10759
|
-
runCount: (trigger.runCount || 0) + 1
|
|
10760
|
-
};
|
|
10761
|
-
if (body.success) {
|
|
10762
|
-
updates.lastResult = body.result;
|
|
10763
|
-
updates.lastError = undefined;
|
|
10764
|
-
if (trigger.schedule.type === "once") {
|
|
10765
|
-
updates.status = "completed";
|
|
10766
|
-
}
|
|
10767
|
-
} else {
|
|
10768
|
-
updates.lastError = body.error;
|
|
10769
|
-
updates.status = "failed";
|
|
10770
|
-
}
|
|
10771
|
-
await config.triggers.update(triggerId, updates, context2);
|
|
10772
|
-
return Response.json({ success: true });
|
|
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 });
|
|
10773
10834
|
} else if (!subAction && method === "GET") {
|
|
10774
10835
|
const trigger = await config.triggers.get(triggerId, context2);
|
|
10775
10836
|
if (!trigger) {
|
|
@@ -10802,7 +10863,7 @@ function createMCPServer(config) {
|
|
|
10802
10863
|
})
|
|
10803
10864
|
});
|
|
10804
10865
|
} catch (error) {
|
|
10805
|
-
|
|
10866
|
+
logger32.error("[Trigger] Failed to update scheduler:", error);
|
|
10806
10867
|
}
|
|
10807
10868
|
}
|
|
10808
10869
|
return Response.json(updated);
|
|
@@ -10819,14 +10880,14 @@ function createMCPServer(config) {
|
|
|
10819
10880
|
body: JSON.stringify({ triggerId })
|
|
10820
10881
|
});
|
|
10821
10882
|
} catch (error) {
|
|
10822
|
-
|
|
10883
|
+
logger32.error("[Trigger] Failed to unregister from scheduler:", error);
|
|
10823
10884
|
}
|
|
10824
10885
|
return new Response(null, { status: 204 });
|
|
10825
10886
|
}
|
|
10826
10887
|
}
|
|
10827
10888
|
return Response.json({ error: "Invalid trigger route or method" }, { status: 404 });
|
|
10828
10889
|
} catch (error) {
|
|
10829
|
-
|
|
10890
|
+
logger32.error("[Trigger] Error:", error);
|
|
10830
10891
|
return Response.json({ error: error.message || "Failed to process trigger request" }, { status: error.statusCode || 500 });
|
|
10831
10892
|
}
|
|
10832
10893
|
}
|
|
@@ -10852,11 +10913,11 @@ function createMCPServer(config) {
|
|
|
10852
10913
|
const errorRedirectUrl = "/auth-error";
|
|
10853
10914
|
if (error) {
|
|
10854
10915
|
const errorMsg = errorDescription || error;
|
|
10855
|
-
|
|
10916
|
+
logger32.error("[OAuth Redirect] Error:", errorMsg);
|
|
10856
10917
|
return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent(errorMsg)}`, webRequest.url));
|
|
10857
10918
|
}
|
|
10858
10919
|
if (!code || !state) {
|
|
10859
|
-
|
|
10920
|
+
logger32.error("[OAuth Redirect] Missing code or state parameter");
|
|
10860
10921
|
return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent("Invalid OAuth callback")}`, webRequest.url));
|
|
10861
10922
|
}
|
|
10862
10923
|
let returnUrl = defaultRedirectUrl;
|
|
@@ -10932,7 +10993,7 @@ function createMCPServer(config) {
|
|
|
10932
10993
|
frontendUrl.hash = `oauth_callback=${encodeURIComponent(JSON.stringify({ code, state, tokenData }))}`;
|
|
10933
10994
|
return Response.redirect(frontendUrl);
|
|
10934
10995
|
} catch (error2) {
|
|
10935
|
-
|
|
10996
|
+
logger32.error("[OAuth Backend Callback] Error:", error2);
|
|
10936
10997
|
return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent(error2.message || "Failed to exchange token")}`, webRequest.url));
|
|
10937
10998
|
}
|
|
10938
10999
|
} else {
|
|
@@ -11151,7 +11212,7 @@ function toSvelteKitHandler(clientOrHandlerOrOptions, _redirectOptions) {
|
|
|
11151
11212
|
}
|
|
11152
11213
|
};
|
|
11153
11214
|
}
|
|
11154
|
-
var SERVER_LOG_CONTEXT2 = "server",
|
|
11215
|
+
var SERVER_LOG_CONTEXT2 = "server", logger32, globalServerConfig = null, codeVerifierStorage, POST = async (req, context) => {
|
|
11155
11216
|
if (!globalServerConfig) {
|
|
11156
11217
|
return Response.json({ error: "OAuth not configured. Call createMCPServer() in your server initialization file first." }, { status: 500 });
|
|
11157
11218
|
}
|
|
@@ -11199,7 +11260,7 @@ var init_server = __esm(() => {
|
|
|
11199
11260
|
init_anthropic();
|
|
11200
11261
|
init_google();
|
|
11201
11262
|
init_ai();
|
|
11202
|
-
|
|
11263
|
+
logger32 = createLogger("MCPServer", SERVER_LOG_CONTEXT2);
|
|
11203
11264
|
codeVerifierStorage = new Map;
|
|
11204
11265
|
});
|
|
11205
11266
|
|
|
@@ -11550,7 +11611,7 @@ class OAuthHandler {
|
|
|
11550
11611
|
url.searchParams.set("state", authorizeRequest.state);
|
|
11551
11612
|
url.searchParams.set("code_challenge", authorizeRequest.codeChallenge);
|
|
11552
11613
|
url.searchParams.set("code_challenge_method", authorizeRequest.codeChallengeMethod);
|
|
11553
|
-
const redirectUri =
|
|
11614
|
+
const redirectUri = providerConfig.redirectUri;
|
|
11554
11615
|
if (redirectUri) {
|
|
11555
11616
|
url.searchParams.set("redirect_uri", redirectUri);
|
|
11556
11617
|
}
|
|
@@ -11662,7 +11723,7 @@ class OAuthHandler {
|
|
|
11662
11723
|
tokenType: result.tokenType,
|
|
11663
11724
|
expiresIn: result.expiresIn,
|
|
11664
11725
|
expiresAt: result.expiresAt,
|
|
11665
|
-
scopes: result.scopes
|
|
11726
|
+
scopes: result.scopes ? result.scopes.flatMap((s) => s.split(" ").filter(Boolean)) : result.scopes
|
|
11666
11727
|
};
|
|
11667
11728
|
await this.config.setProviderToken(callbackRequest.provider, tokenData, undefined, context);
|
|
11668
11729
|
} catch (error) {}
|
|
@@ -11712,11 +11773,11 @@ class OAuthHandler {
|
|
|
11712
11773
|
try {
|
|
11713
11774
|
await this.config.removeProviderToken(request.provider, undefined, context);
|
|
11714
11775
|
} catch (error) {
|
|
11715
|
-
|
|
11776
|
+
logger33.error(`Failed to delete token for ${request.provider} from database via removeProviderToken:`, error);
|
|
11716
11777
|
}
|
|
11717
11778
|
}
|
|
11718
11779
|
} catch (error) {
|
|
11719
|
-
|
|
11780
|
+
logger33.error(`Failed to extract context for disconnect:`, error);
|
|
11720
11781
|
}
|
|
11721
11782
|
}
|
|
11722
11783
|
const url = new URL("/oauth/disconnect", this.serverUrl);
|
|
@@ -11776,17 +11837,17 @@ class OAuthHandler {
|
|
|
11776
11837
|
return jsonRpcResponse.result;
|
|
11777
11838
|
}
|
|
11778
11839
|
}
|
|
11779
|
-
var SERVER_LOG_CONTEXT3 = "server",
|
|
11840
|
+
var SERVER_LOG_CONTEXT3 = "server", logger33, MCP_SERVER_URL2 = "https://mcp.integrate.dev/api/v1/mcp";
|
|
11780
11841
|
var init_base_handler = __esm(() => {
|
|
11781
11842
|
init_logger();
|
|
11782
|
-
|
|
11843
|
+
logger33 = createLogger("OAuthHandler", SERVER_LOG_CONTEXT3);
|
|
11783
11844
|
});
|
|
11784
11845
|
|
|
11785
11846
|
// src/adapters/auto-routes.ts
|
|
11786
11847
|
init_base_handler();
|
|
11787
11848
|
init_logger();
|
|
11788
11849
|
var SERVER_LOG_CONTEXT4 = "server";
|
|
11789
|
-
var
|
|
11850
|
+
var logger34 = createLogger("AutoRoutes", SERVER_LOG_CONTEXT4);
|
|
11790
11851
|
var globalOAuthConfig = null;
|
|
11791
11852
|
async function POST2(req, context) {
|
|
11792
11853
|
if (!globalOAuthConfig) {
|
|
@@ -11828,7 +11889,7 @@ async function POST2(req, context) {
|
|
|
11828
11889
|
}
|
|
11829
11890
|
return createErrorResponse(`Unknown action: ${action}`, 404);
|
|
11830
11891
|
} catch (error) {
|
|
11831
|
-
|
|
11892
|
+
logger34.error(`[OAuth ${action}] Error:`, error);
|
|
11832
11893
|
return createErrorResponse(error.message, 500);
|
|
11833
11894
|
}
|
|
11834
11895
|
}
|
|
@@ -11856,7 +11917,7 @@ async function GET2(req, context) {
|
|
|
11856
11917
|
}
|
|
11857
11918
|
return createErrorResponse(`Unknown action: ${action}`, 404);
|
|
11858
11919
|
} catch (error) {
|
|
11859
|
-
|
|
11920
|
+
logger34.error(`[OAuth ${action}] Error:`, error);
|
|
11860
11921
|
return createErrorResponse(error.message, 500);
|
|
11861
11922
|
}
|
|
11862
11923
|
}
|