integrate-sdk 0.8.60-dev.0 → 0.8.61-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 +156 -29
- package/dist/adapters/index.js +153 -26
- package/dist/adapters/nextjs.js +153 -26
- package/dist/adapters/node.js +153 -26
- package/dist/adapters/svelte-kit.js +153 -26
- package/dist/adapters/tanstack-start.js +153 -26
- package/dist/index.js +153 -20
- package/dist/oauth.js +147 -20
- package/dist/server.js +140 -13
- package/dist/src/index.d.ts +4 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/server.d.ts.map +1 -1
- package/dist/src/triggers/index.d.ts +4 -2
- package/dist/src/triggers/index.d.ts.map +1 -1
- package/dist/src/triggers/types.d.ts +109 -0
- package/dist/src/triggers/types.d.ts.map +1 -1
- package/dist/src/triggers/utils.d.ts +20 -0
- package/dist/src/triggers/utils.d.ts.map +1 -1
- package/dist/src/triggers/webhooks.d.ts +28 -0
- package/dist/src/triggers/webhooks.d.ts.map +1 -0
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -8303,6 +8303,7 @@ var init_index_browser = () => {};
|
|
|
8303
8303
|
// src/triggers/utils.ts
|
|
8304
8304
|
var exports_utils = {};
|
|
8305
8305
|
__export(exports_utils, {
|
|
8306
|
+
validateStepLimit: () => validateStepLimit,
|
|
8306
8307
|
validateStatusTransition: () => validateStatusTransition,
|
|
8307
8308
|
generateTriggerId: () => generateTriggerId,
|
|
8308
8309
|
extractProviderFromToolName: () => extractProviderFromToolName,
|
|
@@ -8330,6 +8331,15 @@ function validateStatusTransition(currentStatus, targetStatus) {
|
|
|
8330
8331
|
}
|
|
8331
8332
|
return { valid: true };
|
|
8332
8333
|
}
|
|
8334
|
+
function validateStepLimit(stepIndex, maxSteps) {
|
|
8335
|
+
if (stepIndex >= maxSteps) {
|
|
8336
|
+
return {
|
|
8337
|
+
valid: false,
|
|
8338
|
+
error: `Step index ${stepIndex} exceeds maximum of ${maxSteps} steps`
|
|
8339
|
+
};
|
|
8340
|
+
}
|
|
8341
|
+
return { valid: true };
|
|
8342
|
+
}
|
|
8333
8343
|
function calculateHasMore(offset, returnedCount, total) {
|
|
8334
8344
|
return offset + returnedCount < total;
|
|
8335
8345
|
}
|
|
@@ -10337,6 +10347,69 @@ var init_ai = __esm(() => {
|
|
|
10337
10347
|
init_trigger_tools();
|
|
10338
10348
|
});
|
|
10339
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
|
+
// src/triggers/webhooks.ts
|
|
10359
|
+
var exports_webhooks = {};
|
|
10360
|
+
__export(exports_webhooks, {
|
|
10361
|
+
signPayload: () => signPayload,
|
|
10362
|
+
deliverWebhooks: () => deliverWebhooks,
|
|
10363
|
+
deliverWebhook: () => deliverWebhook
|
|
10364
|
+
});
|
|
10365
|
+
async function signPayload(payload, secret) {
|
|
10366
|
+
const encoder = new TextEncoder;
|
|
10367
|
+
const data = encoder.encode(JSON.stringify(payload));
|
|
10368
|
+
const key = await crypto.subtle.importKey("raw", encoder.encode(secret), { name: "HMAC", hash: "SHA-256" }, false, ["sign"]);
|
|
10369
|
+
const signature = await crypto.subtle.sign("HMAC", key, data);
|
|
10370
|
+
return Array.from(new Uint8Array(signature)).map((b) => b.toString(16).padStart(2, "0")).join("");
|
|
10371
|
+
}
|
|
10372
|
+
async function deliverWebhook(webhook, payload, timeoutMs) {
|
|
10373
|
+
const headers = {
|
|
10374
|
+
"Content-Type": "application/json",
|
|
10375
|
+
...webhook.headers
|
|
10376
|
+
};
|
|
10377
|
+
if (webhook.secret) {
|
|
10378
|
+
headers["X-Webhook-Signature"] = await signPayload(payload, webhook.secret);
|
|
10379
|
+
}
|
|
10380
|
+
const controller = new AbortController;
|
|
10381
|
+
const timeout = setTimeout(() => controller.abort(), timeoutMs);
|
|
10382
|
+
try {
|
|
10383
|
+
const response = await fetch(webhook.url, {
|
|
10384
|
+
method: "POST",
|
|
10385
|
+
headers,
|
|
10386
|
+
body: JSON.stringify(payload),
|
|
10387
|
+
signal: controller.signal
|
|
10388
|
+
});
|
|
10389
|
+
if (!response.ok) {
|
|
10390
|
+
logger30.warn(`Webhook delivery to ${webhook.url} returned ${response.status}`);
|
|
10391
|
+
}
|
|
10392
|
+
} finally {
|
|
10393
|
+
clearTimeout(timeout);
|
|
10394
|
+
}
|
|
10395
|
+
}
|
|
10396
|
+
async function deliverWebhooks(webhooks, payload, timeoutMs) {
|
|
10397
|
+
if (webhooks.length === 0)
|
|
10398
|
+
return;
|
|
10399
|
+
const results = await Promise.allSettled(webhooks.map((webhook) => deliverWebhook(webhook, payload, timeoutMs)));
|
|
10400
|
+
for (let i = 0;i < results.length; i++) {
|
|
10401
|
+
const result = results[i];
|
|
10402
|
+
if (result.status === "rejected") {
|
|
10403
|
+
logger30.warn(`Webhook delivery to ${webhooks[i].url} failed:`, result.reason);
|
|
10404
|
+
}
|
|
10405
|
+
}
|
|
10406
|
+
}
|
|
10407
|
+
var logger30;
|
|
10408
|
+
var init_webhooks = __esm(() => {
|
|
10409
|
+
init_logger();
|
|
10410
|
+
logger30 = createLogger("Webhooks", "server");
|
|
10411
|
+
});
|
|
10412
|
+
|
|
10340
10413
|
// src/server.ts
|
|
10341
10414
|
var exports_server = {};
|
|
10342
10415
|
__export(exports_server, {
|
|
@@ -10430,7 +10503,7 @@ function createMCPServer(config) {
|
|
|
10430
10503
|
if (integration.oauth) {
|
|
10431
10504
|
const { clientId, clientSecret, redirectUri: integrationRedirectUri, config: oauthConfig } = integration.oauth;
|
|
10432
10505
|
if (!clientId || !clientSecret) {
|
|
10433
|
-
|
|
10506
|
+
logger31.warn(`Warning: Integration "${integration.id}" is missing OAuth credentials. ` + `Provide clientId and clientSecret in the integration configuration.`);
|
|
10434
10507
|
return integration;
|
|
10435
10508
|
}
|
|
10436
10509
|
const redirectUri = integrationRedirectUri || config.redirectUri || getDefaultRedirectUri();
|
|
@@ -10561,7 +10634,7 @@ function createMCPServer(config) {
|
|
|
10561
10634
|
}
|
|
10562
10635
|
return response2;
|
|
10563
10636
|
} catch (error) {
|
|
10564
|
-
|
|
10637
|
+
logger31.error("[MCP Tool Call] Error:", error);
|
|
10565
10638
|
return Response.json({ error: error.message || "Failed to execute tool call" }, { status: error.statusCode || 500 });
|
|
10566
10639
|
}
|
|
10567
10640
|
}
|
|
@@ -10637,7 +10710,7 @@ function createMCPServer(config) {
|
|
|
10637
10710
|
})
|
|
10638
10711
|
});
|
|
10639
10712
|
} catch (scheduleError) {
|
|
10640
|
-
|
|
10713
|
+
logger31.error("[Trigger] Failed to register with scheduler:", scheduleError);
|
|
10641
10714
|
}
|
|
10642
10715
|
return Response.json(created, { status: 201 });
|
|
10643
10716
|
}
|
|
@@ -10672,7 +10745,7 @@ function createMCPServer(config) {
|
|
|
10672
10745
|
body: JSON.stringify({ triggerId })
|
|
10673
10746
|
});
|
|
10674
10747
|
} catch (error) {
|
|
10675
|
-
|
|
10748
|
+
logger31.error("[Trigger] Failed to pause in scheduler:", error);
|
|
10676
10749
|
}
|
|
10677
10750
|
return Response.json(updated);
|
|
10678
10751
|
} else if (subAction === "resume" && method === "POST") {
|
|
@@ -10700,7 +10773,7 @@ function createMCPServer(config) {
|
|
|
10700
10773
|
body: JSON.stringify({ triggerId })
|
|
10701
10774
|
});
|
|
10702
10775
|
} catch (error) {
|
|
10703
|
-
|
|
10776
|
+
logger31.error("[Trigger] Failed to resume in scheduler:", error);
|
|
10704
10777
|
}
|
|
10705
10778
|
return Response.json(updated);
|
|
10706
10779
|
} else if (subAction === "run" && method === "POST") {
|
|
@@ -10793,6 +10866,60 @@ function createMCPServer(config) {
|
|
|
10793
10866
|
if (!trigger) {
|
|
10794
10867
|
return Response.json({ error: "Trigger not found" }, { status: 404 });
|
|
10795
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 });
|
|
10875
|
+
}
|
|
10876
|
+
}
|
|
10877
|
+
if (config.triggers.onComplete) {
|
|
10878
|
+
try {
|
|
10879
|
+
const completeResponse = await config.triggers.onComplete({
|
|
10880
|
+
trigger,
|
|
10881
|
+
request: body,
|
|
10882
|
+
context: context2
|
|
10883
|
+
});
|
|
10884
|
+
if (completeResponse.hasMore) {
|
|
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
|
+
}
|
|
10796
10923
|
const updates = {
|
|
10797
10924
|
lastRunAt: body.executedAt,
|
|
10798
10925
|
runCount: (trigger.runCount || 0) + 1
|
|
@@ -10841,7 +10968,7 @@ function createMCPServer(config) {
|
|
|
10841
10968
|
})
|
|
10842
10969
|
});
|
|
10843
10970
|
} catch (error) {
|
|
10844
|
-
|
|
10971
|
+
logger31.error("[Trigger] Failed to update scheduler:", error);
|
|
10845
10972
|
}
|
|
10846
10973
|
}
|
|
10847
10974
|
return Response.json(updated);
|
|
@@ -10858,14 +10985,14 @@ function createMCPServer(config) {
|
|
|
10858
10985
|
body: JSON.stringify({ triggerId })
|
|
10859
10986
|
});
|
|
10860
10987
|
} catch (error) {
|
|
10861
|
-
|
|
10988
|
+
logger31.error("[Trigger] Failed to unregister from scheduler:", error);
|
|
10862
10989
|
}
|
|
10863
10990
|
return new Response(null, { status: 204 });
|
|
10864
10991
|
}
|
|
10865
10992
|
}
|
|
10866
10993
|
return Response.json({ error: "Invalid trigger route or method" }, { status: 404 });
|
|
10867
10994
|
} catch (error) {
|
|
10868
|
-
|
|
10995
|
+
logger31.error("[Trigger] Error:", error);
|
|
10869
10996
|
return Response.json({ error: error.message || "Failed to process trigger request" }, { status: error.statusCode || 500 });
|
|
10870
10997
|
}
|
|
10871
10998
|
}
|
|
@@ -10891,11 +11018,11 @@ function createMCPServer(config) {
|
|
|
10891
11018
|
const errorRedirectUrl = "/auth-error";
|
|
10892
11019
|
if (error) {
|
|
10893
11020
|
const errorMsg = errorDescription || error;
|
|
10894
|
-
|
|
11021
|
+
logger31.error("[OAuth Redirect] Error:", errorMsg);
|
|
10895
11022
|
return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent(errorMsg)}`, webRequest.url));
|
|
10896
11023
|
}
|
|
10897
11024
|
if (!code || !state) {
|
|
10898
|
-
|
|
11025
|
+
logger31.error("[OAuth Redirect] Missing code or state parameter");
|
|
10899
11026
|
return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent("Invalid OAuth callback")}`, webRequest.url));
|
|
10900
11027
|
}
|
|
10901
11028
|
let returnUrl = defaultRedirectUrl;
|
|
@@ -10971,7 +11098,7 @@ function createMCPServer(config) {
|
|
|
10971
11098
|
frontendUrl.hash = `oauth_callback=${encodeURIComponent(JSON.stringify({ code, state, tokenData }))}`;
|
|
10972
11099
|
return Response.redirect(frontendUrl);
|
|
10973
11100
|
} catch (error2) {
|
|
10974
|
-
|
|
11101
|
+
logger31.error("[OAuth Backend Callback] Error:", error2);
|
|
10975
11102
|
return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent(error2.message || "Failed to exchange token")}`, webRequest.url));
|
|
10976
11103
|
}
|
|
10977
11104
|
} else {
|
|
@@ -11190,7 +11317,7 @@ function toSvelteKitHandler(clientOrHandlerOrOptions, _redirectOptions) {
|
|
|
11190
11317
|
}
|
|
11191
11318
|
};
|
|
11192
11319
|
}
|
|
11193
|
-
var SERVER_LOG_CONTEXT2 = "server",
|
|
11320
|
+
var SERVER_LOG_CONTEXT2 = "server", logger31, globalServerConfig = null, codeVerifierStorage, POST = async (req, context) => {
|
|
11194
11321
|
if (!globalServerConfig) {
|
|
11195
11322
|
return Response.json({ error: "OAuth not configured. Call createMCPServer() in your server initialization file first." }, { status: 500 });
|
|
11196
11323
|
}
|
|
@@ -11238,7 +11365,7 @@ var init_server = __esm(() => {
|
|
|
11238
11365
|
init_anthropic();
|
|
11239
11366
|
init_google();
|
|
11240
11367
|
init_ai();
|
|
11241
|
-
|
|
11368
|
+
logger31 = createLogger("MCPServer", SERVER_LOG_CONTEXT2);
|
|
11242
11369
|
codeVerifierStorage = new Map;
|
|
11243
11370
|
});
|
|
11244
11371
|
|
|
@@ -11751,11 +11878,11 @@ class OAuthHandler {
|
|
|
11751
11878
|
try {
|
|
11752
11879
|
await this.config.removeProviderToken(request.provider, undefined, context);
|
|
11753
11880
|
} catch (error) {
|
|
11754
|
-
|
|
11881
|
+
logger32.error(`Failed to delete token for ${request.provider} from database via removeProviderToken:`, error);
|
|
11755
11882
|
}
|
|
11756
11883
|
}
|
|
11757
11884
|
} catch (error) {
|
|
11758
|
-
|
|
11885
|
+
logger32.error(`Failed to extract context for disconnect:`, error);
|
|
11759
11886
|
}
|
|
11760
11887
|
}
|
|
11761
11888
|
const url = new URL("/oauth/disconnect", this.serverUrl);
|
|
@@ -11815,10 +11942,10 @@ class OAuthHandler {
|
|
|
11815
11942
|
return jsonRpcResponse.result;
|
|
11816
11943
|
}
|
|
11817
11944
|
}
|
|
11818
|
-
var SERVER_LOG_CONTEXT3 = "server",
|
|
11945
|
+
var SERVER_LOG_CONTEXT3 = "server", logger32, MCP_SERVER_URL2 = "https://mcp.integrate.dev/api/v1/mcp";
|
|
11819
11946
|
var init_base_handler = __esm(() => {
|
|
11820
11947
|
init_logger();
|
|
11821
|
-
|
|
11948
|
+
logger32 = createLogger("OAuthHandler", SERVER_LOG_CONTEXT3);
|
|
11822
11949
|
});
|
|
11823
11950
|
|
|
11824
11951
|
// src/index.ts
|
|
@@ -11831,7 +11958,7 @@ init_nextjs();
|
|
|
11831
11958
|
// src/adapters/nextjs-oauth-redirect.ts
|
|
11832
11959
|
init_logger();
|
|
11833
11960
|
var SERVER_LOG_CONTEXT4 = "server";
|
|
11834
|
-
var
|
|
11961
|
+
var logger33 = createLogger("OAuthRedirect", SERVER_LOG_CONTEXT4);
|
|
11835
11962
|
function createOAuthRedirectHandler(config) {
|
|
11836
11963
|
const defaultRedirectUrl = config?.redirectUrl || "/";
|
|
11837
11964
|
const errorRedirectUrl = config?.errorRedirectUrl || "/auth-error";
|
|
@@ -11843,11 +11970,11 @@ function createOAuthRedirectHandler(config) {
|
|
|
11843
11970
|
const errorDescription = searchParams.get("error_description");
|
|
11844
11971
|
if (error) {
|
|
11845
11972
|
const errorMsg = errorDescription || error;
|
|
11846
|
-
|
|
11973
|
+
logger33.error("[OAuth Redirect] Error:", errorMsg);
|
|
11847
11974
|
return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent(errorMsg)}`, req.url));
|
|
11848
11975
|
}
|
|
11849
11976
|
if (!code || !state) {
|
|
11850
|
-
|
|
11977
|
+
logger33.error("[OAuth Redirect] Missing code or state parameter");
|
|
11851
11978
|
return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent("Invalid OAuth callback")}`, req.url));
|
|
11852
11979
|
}
|
|
11853
11980
|
let returnUrl = defaultRedirectUrl;
|
|
@@ -11927,6 +12054,8 @@ init_intercom();
|
|
|
11927
12054
|
init_hubspot();
|
|
11928
12055
|
init_youtube();
|
|
11929
12056
|
init_cursor();
|
|
12057
|
+
init_utils2();
|
|
12058
|
+
init_webhooks();
|
|
11930
12059
|
init_generic();
|
|
11931
12060
|
init_messages();
|
|
11932
12061
|
init_http_session();
|
|
@@ -11989,6 +12118,7 @@ export {
|
|
|
11989
12118
|
youtubeIntegration,
|
|
11990
12119
|
whatsappIntegration,
|
|
11991
12120
|
vercelIntegration,
|
|
12121
|
+
validateStepLimit,
|
|
11992
12122
|
todoistIntegration,
|
|
11993
12123
|
toWebRequest,
|
|
11994
12124
|
toTanStackStartHandler,
|
|
@@ -12022,6 +12152,7 @@ export {
|
|
|
12022
12152
|
gcalIntegration,
|
|
12023
12153
|
fromNodeHeaders,
|
|
12024
12154
|
figmaIntegration,
|
|
12155
|
+
deliverWebhooks,
|
|
12025
12156
|
cursorIntegration,
|
|
12026
12157
|
createTanStackOAuthHandler,
|
|
12027
12158
|
createSimpleIntegration,
|
|
@@ -12032,6 +12163,7 @@ export {
|
|
|
12032
12163
|
clearClientCache,
|
|
12033
12164
|
calcomIntegration,
|
|
12034
12165
|
airtableIntegration,
|
|
12166
|
+
WEBHOOK_DELIVERY_TIMEOUT_MS,
|
|
12035
12167
|
TriggerClient,
|
|
12036
12168
|
ToolCallError,
|
|
12037
12169
|
TokenExpiredError,
|
|
@@ -12040,6 +12172,7 @@ export {
|
|
|
12040
12172
|
OAuthHandler,
|
|
12041
12173
|
MCPMethod,
|
|
12042
12174
|
MCPClientBase,
|
|
12175
|
+
MAX_TRIGGER_STEPS,
|
|
12043
12176
|
IntegrateSDKError,
|
|
12044
12177
|
HttpSessionTransport,
|
|
12045
12178
|
ConnectionError,
|
package/dist/oauth.js
CHANGED
|
@@ -8137,6 +8137,7 @@ var init_nanoid = __esm(() => {
|
|
|
8137
8137
|
// src/triggers/utils.ts
|
|
8138
8138
|
var exports_utils = {};
|
|
8139
8139
|
__export(exports_utils, {
|
|
8140
|
+
validateStepLimit: () => validateStepLimit,
|
|
8140
8141
|
validateStatusTransition: () => validateStatusTransition,
|
|
8141
8142
|
generateTriggerId: () => generateTriggerId,
|
|
8142
8143
|
extractProviderFromToolName: () => extractProviderFromToolName,
|
|
@@ -8164,6 +8165,15 @@ function validateStatusTransition(currentStatus, targetStatus) {
|
|
|
8164
8165
|
}
|
|
8165
8166
|
return { valid: true };
|
|
8166
8167
|
}
|
|
8168
|
+
function validateStepLimit(stepIndex, maxSteps) {
|
|
8169
|
+
if (stepIndex >= maxSteps) {
|
|
8170
|
+
return {
|
|
8171
|
+
valid: false,
|
|
8172
|
+
error: `Step index ${stepIndex} exceeds maximum of ${maxSteps} steps`
|
|
8173
|
+
};
|
|
8174
|
+
}
|
|
8175
|
+
return { valid: true };
|
|
8176
|
+
}
|
|
8167
8177
|
function calculateHasMore(offset, returnedCount, total) {
|
|
8168
8178
|
return offset + returnedCount < total;
|
|
8169
8179
|
}
|
|
@@ -10171,6 +10181,69 @@ var init_ai = __esm(() => {
|
|
|
10171
10181
|
init_trigger_tools();
|
|
10172
10182
|
});
|
|
10173
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
|
+
// src/triggers/webhooks.ts
|
|
10193
|
+
var exports_webhooks = {};
|
|
10194
|
+
__export(exports_webhooks, {
|
|
10195
|
+
signPayload: () => signPayload,
|
|
10196
|
+
deliverWebhooks: () => deliverWebhooks,
|
|
10197
|
+
deliverWebhook: () => deliverWebhook
|
|
10198
|
+
});
|
|
10199
|
+
async function signPayload(payload, secret) {
|
|
10200
|
+
const encoder = new TextEncoder;
|
|
10201
|
+
const data = encoder.encode(JSON.stringify(payload));
|
|
10202
|
+
const key = await crypto.subtle.importKey("raw", encoder.encode(secret), { name: "HMAC", hash: "SHA-256" }, false, ["sign"]);
|
|
10203
|
+
const signature = await crypto.subtle.sign("HMAC", key, data);
|
|
10204
|
+
return Array.from(new Uint8Array(signature)).map((b) => b.toString(16).padStart(2, "0")).join("");
|
|
10205
|
+
}
|
|
10206
|
+
async function deliverWebhook(webhook, payload, timeoutMs) {
|
|
10207
|
+
const headers = {
|
|
10208
|
+
"Content-Type": "application/json",
|
|
10209
|
+
...webhook.headers
|
|
10210
|
+
};
|
|
10211
|
+
if (webhook.secret) {
|
|
10212
|
+
headers["X-Webhook-Signature"] = await signPayload(payload, webhook.secret);
|
|
10213
|
+
}
|
|
10214
|
+
const controller = new AbortController;
|
|
10215
|
+
const timeout = setTimeout(() => controller.abort(), timeoutMs);
|
|
10216
|
+
try {
|
|
10217
|
+
const response = await fetch(webhook.url, {
|
|
10218
|
+
method: "POST",
|
|
10219
|
+
headers,
|
|
10220
|
+
body: JSON.stringify(payload),
|
|
10221
|
+
signal: controller.signal
|
|
10222
|
+
});
|
|
10223
|
+
if (!response.ok) {
|
|
10224
|
+
logger30.warn(`Webhook delivery to ${webhook.url} returned ${response.status}`);
|
|
10225
|
+
}
|
|
10226
|
+
} finally {
|
|
10227
|
+
clearTimeout(timeout);
|
|
10228
|
+
}
|
|
10229
|
+
}
|
|
10230
|
+
async function deliverWebhooks(webhooks, payload, timeoutMs) {
|
|
10231
|
+
if (webhooks.length === 0)
|
|
10232
|
+
return;
|
|
10233
|
+
const results = await Promise.allSettled(webhooks.map((webhook) => deliverWebhook(webhook, payload, timeoutMs)));
|
|
10234
|
+
for (let i = 0;i < results.length; i++) {
|
|
10235
|
+
const result = results[i];
|
|
10236
|
+
if (result.status === "rejected") {
|
|
10237
|
+
logger30.warn(`Webhook delivery to ${webhooks[i].url} failed:`, result.reason);
|
|
10238
|
+
}
|
|
10239
|
+
}
|
|
10240
|
+
}
|
|
10241
|
+
var logger30;
|
|
10242
|
+
var init_webhooks = __esm(() => {
|
|
10243
|
+
init_logger();
|
|
10244
|
+
logger30 = createLogger("Webhooks", "server");
|
|
10245
|
+
});
|
|
10246
|
+
|
|
10174
10247
|
// src/server.ts
|
|
10175
10248
|
var exports_server = {};
|
|
10176
10249
|
__export(exports_server, {
|
|
@@ -10264,7 +10337,7 @@ function createMCPServer(config) {
|
|
|
10264
10337
|
if (integration.oauth) {
|
|
10265
10338
|
const { clientId, clientSecret, redirectUri: integrationRedirectUri, config: oauthConfig } = integration.oauth;
|
|
10266
10339
|
if (!clientId || !clientSecret) {
|
|
10267
|
-
|
|
10340
|
+
logger31.warn(`Warning: Integration "${integration.id}" is missing OAuth credentials. ` + `Provide clientId and clientSecret in the integration configuration.`);
|
|
10268
10341
|
return integration;
|
|
10269
10342
|
}
|
|
10270
10343
|
const redirectUri = integrationRedirectUri || config.redirectUri || getDefaultRedirectUri();
|
|
@@ -10395,7 +10468,7 @@ function createMCPServer(config) {
|
|
|
10395
10468
|
}
|
|
10396
10469
|
return response2;
|
|
10397
10470
|
} catch (error) {
|
|
10398
|
-
|
|
10471
|
+
logger31.error("[MCP Tool Call] Error:", error);
|
|
10399
10472
|
return Response.json({ error: error.message || "Failed to execute tool call" }, { status: error.statusCode || 500 });
|
|
10400
10473
|
}
|
|
10401
10474
|
}
|
|
@@ -10471,7 +10544,7 @@ function createMCPServer(config) {
|
|
|
10471
10544
|
})
|
|
10472
10545
|
});
|
|
10473
10546
|
} catch (scheduleError) {
|
|
10474
|
-
|
|
10547
|
+
logger31.error("[Trigger] Failed to register with scheduler:", scheduleError);
|
|
10475
10548
|
}
|
|
10476
10549
|
return Response.json(created, { status: 201 });
|
|
10477
10550
|
}
|
|
@@ -10506,7 +10579,7 @@ function createMCPServer(config) {
|
|
|
10506
10579
|
body: JSON.stringify({ triggerId })
|
|
10507
10580
|
});
|
|
10508
10581
|
} catch (error) {
|
|
10509
|
-
|
|
10582
|
+
logger31.error("[Trigger] Failed to pause in scheduler:", error);
|
|
10510
10583
|
}
|
|
10511
10584
|
return Response.json(updated);
|
|
10512
10585
|
} else if (subAction === "resume" && method === "POST") {
|
|
@@ -10534,7 +10607,7 @@ function createMCPServer(config) {
|
|
|
10534
10607
|
body: JSON.stringify({ triggerId })
|
|
10535
10608
|
});
|
|
10536
10609
|
} catch (error) {
|
|
10537
|
-
|
|
10610
|
+
logger31.error("[Trigger] Failed to resume in scheduler:", error);
|
|
10538
10611
|
}
|
|
10539
10612
|
return Response.json(updated);
|
|
10540
10613
|
} else if (subAction === "run" && method === "POST") {
|
|
@@ -10627,6 +10700,60 @@ function createMCPServer(config) {
|
|
|
10627
10700
|
if (!trigger) {
|
|
10628
10701
|
return Response.json({ error: "Trigger not found" }, { status: 404 });
|
|
10629
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 });
|
|
10709
|
+
}
|
|
10710
|
+
}
|
|
10711
|
+
if (config.triggers.onComplete) {
|
|
10712
|
+
try {
|
|
10713
|
+
const completeResponse = await config.triggers.onComplete({
|
|
10714
|
+
trigger,
|
|
10715
|
+
request: body,
|
|
10716
|
+
context: context2
|
|
10717
|
+
});
|
|
10718
|
+
if (completeResponse.hasMore) {
|
|
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
|
+
}
|
|
10630
10757
|
const updates = {
|
|
10631
10758
|
lastRunAt: body.executedAt,
|
|
10632
10759
|
runCount: (trigger.runCount || 0) + 1
|
|
@@ -10675,7 +10802,7 @@ function createMCPServer(config) {
|
|
|
10675
10802
|
})
|
|
10676
10803
|
});
|
|
10677
10804
|
} catch (error) {
|
|
10678
|
-
|
|
10805
|
+
logger31.error("[Trigger] Failed to update scheduler:", error);
|
|
10679
10806
|
}
|
|
10680
10807
|
}
|
|
10681
10808
|
return Response.json(updated);
|
|
@@ -10692,14 +10819,14 @@ function createMCPServer(config) {
|
|
|
10692
10819
|
body: JSON.stringify({ triggerId })
|
|
10693
10820
|
});
|
|
10694
10821
|
} catch (error) {
|
|
10695
|
-
|
|
10822
|
+
logger31.error("[Trigger] Failed to unregister from scheduler:", error);
|
|
10696
10823
|
}
|
|
10697
10824
|
return new Response(null, { status: 204 });
|
|
10698
10825
|
}
|
|
10699
10826
|
}
|
|
10700
10827
|
return Response.json({ error: "Invalid trigger route or method" }, { status: 404 });
|
|
10701
10828
|
} catch (error) {
|
|
10702
|
-
|
|
10829
|
+
logger31.error("[Trigger] Error:", error);
|
|
10703
10830
|
return Response.json({ error: error.message || "Failed to process trigger request" }, { status: error.statusCode || 500 });
|
|
10704
10831
|
}
|
|
10705
10832
|
}
|
|
@@ -10725,11 +10852,11 @@ function createMCPServer(config) {
|
|
|
10725
10852
|
const errorRedirectUrl = "/auth-error";
|
|
10726
10853
|
if (error) {
|
|
10727
10854
|
const errorMsg = errorDescription || error;
|
|
10728
|
-
|
|
10855
|
+
logger31.error("[OAuth Redirect] Error:", errorMsg);
|
|
10729
10856
|
return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent(errorMsg)}`, webRequest.url));
|
|
10730
10857
|
}
|
|
10731
10858
|
if (!code || !state) {
|
|
10732
|
-
|
|
10859
|
+
logger31.error("[OAuth Redirect] Missing code or state parameter");
|
|
10733
10860
|
return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent("Invalid OAuth callback")}`, webRequest.url));
|
|
10734
10861
|
}
|
|
10735
10862
|
let returnUrl = defaultRedirectUrl;
|
|
@@ -10805,7 +10932,7 @@ function createMCPServer(config) {
|
|
|
10805
10932
|
frontendUrl.hash = `oauth_callback=${encodeURIComponent(JSON.stringify({ code, state, tokenData }))}`;
|
|
10806
10933
|
return Response.redirect(frontendUrl);
|
|
10807
10934
|
} catch (error2) {
|
|
10808
|
-
|
|
10935
|
+
logger31.error("[OAuth Backend Callback] Error:", error2);
|
|
10809
10936
|
return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent(error2.message || "Failed to exchange token")}`, webRequest.url));
|
|
10810
10937
|
}
|
|
10811
10938
|
} else {
|
|
@@ -11024,7 +11151,7 @@ function toSvelteKitHandler(clientOrHandlerOrOptions, _redirectOptions) {
|
|
|
11024
11151
|
}
|
|
11025
11152
|
};
|
|
11026
11153
|
}
|
|
11027
|
-
var SERVER_LOG_CONTEXT2 = "server",
|
|
11154
|
+
var SERVER_LOG_CONTEXT2 = "server", logger31, globalServerConfig = null, codeVerifierStorage, POST = async (req, context) => {
|
|
11028
11155
|
if (!globalServerConfig) {
|
|
11029
11156
|
return Response.json({ error: "OAuth not configured. Call createMCPServer() in your server initialization file first." }, { status: 500 });
|
|
11030
11157
|
}
|
|
@@ -11072,7 +11199,7 @@ var init_server = __esm(() => {
|
|
|
11072
11199
|
init_anthropic();
|
|
11073
11200
|
init_google();
|
|
11074
11201
|
init_ai();
|
|
11075
|
-
|
|
11202
|
+
logger31 = createLogger("MCPServer", SERVER_LOG_CONTEXT2);
|
|
11076
11203
|
codeVerifierStorage = new Map;
|
|
11077
11204
|
});
|
|
11078
11205
|
|
|
@@ -11585,11 +11712,11 @@ class OAuthHandler {
|
|
|
11585
11712
|
try {
|
|
11586
11713
|
await this.config.removeProviderToken(request.provider, undefined, context);
|
|
11587
11714
|
} catch (error) {
|
|
11588
|
-
|
|
11715
|
+
logger32.error(`Failed to delete token for ${request.provider} from database via removeProviderToken:`, error);
|
|
11589
11716
|
}
|
|
11590
11717
|
}
|
|
11591
11718
|
} catch (error) {
|
|
11592
|
-
|
|
11719
|
+
logger32.error(`Failed to extract context for disconnect:`, error);
|
|
11593
11720
|
}
|
|
11594
11721
|
}
|
|
11595
11722
|
const url = new URL("/oauth/disconnect", this.serverUrl);
|
|
@@ -11649,17 +11776,17 @@ class OAuthHandler {
|
|
|
11649
11776
|
return jsonRpcResponse.result;
|
|
11650
11777
|
}
|
|
11651
11778
|
}
|
|
11652
|
-
var SERVER_LOG_CONTEXT3 = "server",
|
|
11779
|
+
var SERVER_LOG_CONTEXT3 = "server", logger32, MCP_SERVER_URL2 = "https://mcp.integrate.dev/api/v1/mcp";
|
|
11653
11780
|
var init_base_handler = __esm(() => {
|
|
11654
11781
|
init_logger();
|
|
11655
|
-
|
|
11782
|
+
logger32 = createLogger("OAuthHandler", SERVER_LOG_CONTEXT3);
|
|
11656
11783
|
});
|
|
11657
11784
|
|
|
11658
11785
|
// src/adapters/auto-routes.ts
|
|
11659
11786
|
init_base_handler();
|
|
11660
11787
|
init_logger();
|
|
11661
11788
|
var SERVER_LOG_CONTEXT4 = "server";
|
|
11662
|
-
var
|
|
11789
|
+
var logger33 = createLogger("AutoRoutes", SERVER_LOG_CONTEXT4);
|
|
11663
11790
|
var globalOAuthConfig = null;
|
|
11664
11791
|
async function POST2(req, context) {
|
|
11665
11792
|
if (!globalOAuthConfig) {
|
|
@@ -11701,7 +11828,7 @@ async function POST2(req, context) {
|
|
|
11701
11828
|
}
|
|
11702
11829
|
return createErrorResponse(`Unknown action: ${action}`, 404);
|
|
11703
11830
|
} catch (error) {
|
|
11704
|
-
|
|
11831
|
+
logger33.error(`[OAuth ${action}] Error:`, error);
|
|
11705
11832
|
return createErrorResponse(error.message, 500);
|
|
11706
11833
|
}
|
|
11707
11834
|
}
|
|
@@ -11729,7 +11856,7 @@ async function GET2(req, context) {
|
|
|
11729
11856
|
}
|
|
11730
11857
|
return createErrorResponse(`Unknown action: ${action}`, 404);
|
|
11731
11858
|
} catch (error) {
|
|
11732
|
-
|
|
11859
|
+
logger33.error(`[OAuth ${action}] Error:`, error);
|
|
11733
11860
|
return createErrorResponse(error.message, 500);
|
|
11734
11861
|
}
|
|
11735
11862
|
}
|