integrate-sdk 0.9.5-dev.0 → 0.9.9-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 +129 -10
- package/dist/adapters/index.js +129 -10
- package/dist/adapters/nextjs.js +129 -10
- package/dist/adapters/node.js +129 -10
- package/dist/adapters/svelte-kit.js +129 -10
- package/dist/adapters/tanstack-start.js +129 -10
- package/dist/ai/anthropic.d.ts +2 -2
- package/dist/ai/anthropic.d.ts.map +1 -1
- package/dist/ai/anthropic.js +64 -2
- package/dist/ai/google.d.ts +2 -2
- package/dist/ai/google.d.ts.map +1 -1
- package/dist/ai/google.js +64 -2
- package/dist/ai/index.js +103 -8
- package/dist/ai/openai.d.ts +2 -2
- package/dist/ai/openai.d.ts.map +1 -1
- package/dist/ai/openai.js +64 -2
- package/dist/ai/vercel-ai.d.ts +2 -2
- package/dist/ai/vercel-ai.d.ts.map +1 -1
- package/dist/ai/vercel-ai.js +64 -2
- package/dist/code-mode/executor.d.ts +5 -0
- package/dist/code-mode/executor.d.ts.map +1 -1
- package/dist/code-mode/executor.js +35 -0
- package/dist/code-mode/index.d.ts +1 -1
- package/dist/code-mode/index.d.ts.map +1 -1
- package/dist/code-mode/index.js +64 -0
- package/dist/code-mode/runtime-stub.d.ts +1 -1
- package/dist/code-mode/runtime-stub.d.ts.map +1 -1
- package/dist/code-mode/runtime-stub.js +2 -0
- package/dist/code-mode/tool-builder.d.ts +17 -0
- package/dist/code-mode/tool-builder.d.ts.map +1 -1
- package/dist/code-mode/tool-builder.js +67 -0
- package/dist/index.js +129 -10
- package/dist/oauth.js +129 -10
- package/dist/server.js +129 -10
- package/dist/src/ai/anthropic.d.ts +2 -2
- package/dist/src/ai/anthropic.d.ts.map +1 -1
- package/dist/src/ai/google.d.ts +2 -2
- package/dist/src/ai/google.d.ts.map +1 -1
- package/dist/src/ai/openai.d.ts +2 -2
- package/dist/src/ai/openai.d.ts.map +1 -1
- package/dist/src/ai/vercel-ai.d.ts +2 -2
- package/dist/src/ai/vercel-ai.d.ts.map +1 -1
- package/dist/src/code-mode/executor.d.ts +5 -0
- package/dist/src/code-mode/executor.d.ts.map +1 -1
- package/dist/src/code-mode/index.d.ts +1 -1
- package/dist/src/code-mode/index.d.ts.map +1 -1
- package/dist/src/code-mode/runtime-stub.d.ts +1 -1
- package/dist/src/code-mode/runtime-stub.d.ts.map +1 -1
- package/dist/src/code-mode/tool-builder.d.ts +17 -0
- package/dist/src/code-mode/tool-builder.d.ts.map +1 -1
- package/dist/src/server.d.ts.map +1 -1
- package/package.json +3 -6
package/dist/oauth.js
CHANGED
|
@@ -8777,6 +8777,7 @@ var init_type_generator = __esm(() => {
|
|
|
8777
8777
|
var RUNTIME_STUB_SOURCE = `// runtime.mjs — generated by integrate-sdk code mode
|
|
8778
8778
|
const MCP_URL = process.env.INTEGRATE_MCP_URL;
|
|
8779
8779
|
const SESSION_TOKEN = process.env.INTEGRATE_SESSION_TOKEN;
|
|
8780
|
+
const API_KEY = process.env.INTEGRATE_API_KEY || '';
|
|
8780
8781
|
const PROVIDER_TOKENS = process.env.INTEGRATE_PROVIDER_TOKENS || '';
|
|
8781
8782
|
const INTEGRATIONS_HEADER = process.env.INTEGRATE_INTEGRATIONS || '';
|
|
8782
8783
|
const CONTEXT_JSON = process.env.INTEGRATE_CONTEXT || '';
|
|
@@ -8795,6 +8796,7 @@ async function callTool(toolName, args) {
|
|
|
8795
8796
|
'x-integrate-code-mode': '1',
|
|
8796
8797
|
};
|
|
8797
8798
|
if (SESSION_TOKEN) headers['Authorization'] = 'Bearer ' + SESSION_TOKEN;
|
|
8799
|
+
if (API_KEY) headers['x-integrate-api-key'] = API_KEY;
|
|
8798
8800
|
if (PROVIDER_TOKENS) headers['x-integrate-tokens'] = PROVIDER_TOKENS;
|
|
8799
8801
|
if (INTEGRATIONS_HEADER) headers['x-integrations'] = INTEGRATIONS_HEADER;
|
|
8800
8802
|
if (CONTEXT_JSON) headers['x-integrate-context'] = CONTEXT_JSON;
|
|
@@ -8846,11 +8848,40 @@ export { callTool };
|
|
|
8846
8848
|
// src/code-mode/executor.ts
|
|
8847
8849
|
var exports_executor = {};
|
|
8848
8850
|
__export(exports_executor, {
|
|
8851
|
+
isSandboxAvailable: () => isSandboxAvailable,
|
|
8849
8852
|
executeSandboxCode: () => executeSandboxCode,
|
|
8853
|
+
__setSandboxUnavailableForTests: () => __setSandboxUnavailableForTests,
|
|
8850
8854
|
__setSandboxFactoryForTests: () => __setSandboxFactoryForTests
|
|
8851
8855
|
});
|
|
8852
8856
|
function __setSandboxFactoryForTests(factory) {
|
|
8853
8857
|
sandboxFactoryOverride = factory;
|
|
8858
|
+
_sandboxForcedUnavailableForTests = false;
|
|
8859
|
+
_sandboxAvailableCache = null;
|
|
8860
|
+
}
|
|
8861
|
+
function __setSandboxUnavailableForTests(force) {
|
|
8862
|
+
_sandboxForcedUnavailableForTests = force;
|
|
8863
|
+
_sandboxAvailableCache = null;
|
|
8864
|
+
}
|
|
8865
|
+
async function isSandboxAvailable() {
|
|
8866
|
+
if (_sandboxAvailableCache !== null)
|
|
8867
|
+
return _sandboxAvailableCache;
|
|
8868
|
+
if (_sandboxForcedUnavailableForTests) {
|
|
8869
|
+
_sandboxAvailableCache = false;
|
|
8870
|
+
return false;
|
|
8871
|
+
}
|
|
8872
|
+
if (sandboxFactoryOverride) {
|
|
8873
|
+
_sandboxAvailableCache = true;
|
|
8874
|
+
return true;
|
|
8875
|
+
}
|
|
8876
|
+
try {
|
|
8877
|
+
const dynamicImport = new Function("specifier", "return import(specifier)");
|
|
8878
|
+
await dynamicImport("@" + "vercel/sandbox");
|
|
8879
|
+
_sandboxAvailableCache = true;
|
|
8880
|
+
return true;
|
|
8881
|
+
} catch {
|
|
8882
|
+
_sandboxAvailableCache = false;
|
|
8883
|
+
return false;
|
|
8884
|
+
}
|
|
8854
8885
|
}
|
|
8855
8886
|
async function loadSandboxFactory() {
|
|
8856
8887
|
if (sandboxFactoryOverride)
|
|
@@ -8937,6 +8968,8 @@ async function executeSandboxCode(options) {
|
|
|
8937
8968
|
const env = {
|
|
8938
8969
|
INTEGRATE_MCP_URL: options.mcpUrl
|
|
8939
8970
|
};
|
|
8971
|
+
if (options.apiKey)
|
|
8972
|
+
env.INTEGRATE_API_KEY = options.apiKey;
|
|
8940
8973
|
if (options.sessionToken)
|
|
8941
8974
|
env.INTEGRATE_SESSION_TOKEN = options.sessionToken;
|
|
8942
8975
|
if (options.providerTokens && Object.keys(options.providerTokens).length > 0) {
|
|
@@ -8979,7 +9012,7 @@ async function executeSandboxCode(options) {
|
|
|
8979
9012
|
}
|
|
8980
9013
|
}
|
|
8981
9014
|
}
|
|
8982
|
-
var sandboxFactoryOverride = null, RESULT_SENTINEL = "__INTEGRATE_RESULT__";
|
|
9015
|
+
var sandboxFactoryOverride = null, _sandboxAvailableCache = null, _sandboxForcedUnavailableForTests = false, RESULT_SENTINEL = "__INTEGRATE_RESULT__";
|
|
8983
9016
|
var init_executor = () => {};
|
|
8984
9017
|
|
|
8985
9018
|
// src/code-mode/tool-builder.ts
|
|
@@ -8987,6 +9020,23 @@ function resolveCodeModeClientConfig(client) {
|
|
|
8987
9020
|
const oauthConfig = client.__oauthConfig;
|
|
8988
9021
|
return oauthConfig?.codeMode ?? {};
|
|
8989
9022
|
}
|
|
9023
|
+
async function diagnoseCodeMode(client) {
|
|
9024
|
+
if (!await isSandboxAvailable()) {
|
|
9025
|
+
return { available: false, reason: "sandbox-missing" };
|
|
9026
|
+
}
|
|
9027
|
+
const serverConfig = resolveCodeModeClientConfig(client);
|
|
9028
|
+
const publicUrl = serverConfig.publicUrl ?? getEnv("INTEGRATE_PUBLIC_URL");
|
|
9029
|
+
if (!publicUrl) {
|
|
9030
|
+
return { available: false, reason: "no-public-url" };
|
|
9031
|
+
}
|
|
9032
|
+
return { available: true };
|
|
9033
|
+
}
|
|
9034
|
+
function warnCodeModeFallback(reason) {
|
|
9035
|
+
if (warnedCodeModeReasons.has(reason))
|
|
9036
|
+
return;
|
|
9037
|
+
warnedCodeModeReasons.add(reason);
|
|
9038
|
+
console.warn(CODE_MODE_UNAVAILABLE_MESSAGES[reason]);
|
|
9039
|
+
}
|
|
8990
9040
|
function buildCodeModeTool(client, options) {
|
|
8991
9041
|
const { tools, providerTokens, context, integrationIds } = options;
|
|
8992
9042
|
const generated = generateCodeModeTypes(tools);
|
|
@@ -8999,6 +9049,7 @@ ${generated.source}
|
|
|
8999
9049
|
\`\`\``;
|
|
9000
9050
|
const execute = async ({ code }) => {
|
|
9001
9051
|
const publicUrl = sandboxOverrides.publicUrl ?? serverCodeModeConfig.publicUrl ?? getEnv("INTEGRATE_PUBLIC_URL");
|
|
9052
|
+
const apiKey = client.__oauthConfig?.apiKey;
|
|
9002
9053
|
if (!publicUrl) {
|
|
9003
9054
|
return {
|
|
9004
9055
|
success: false,
|
|
@@ -9013,6 +9064,7 @@ ${generated.source}
|
|
|
9013
9064
|
return executeSandboxCode({
|
|
9014
9065
|
code,
|
|
9015
9066
|
mcpUrl,
|
|
9067
|
+
apiKey,
|
|
9016
9068
|
providerTokens,
|
|
9017
9069
|
context,
|
|
9018
9070
|
integrationsHeader: integrationIds && integrationIds.length > 0 ? integrationIds.join(",") : undefined,
|
|
@@ -9039,7 +9091,7 @@ ${generated.source}
|
|
|
9039
9091
|
execute
|
|
9040
9092
|
};
|
|
9041
9093
|
}
|
|
9042
|
-
var CODE_MODE_TOOL_NAME = "execute_code", DEFAULT_INSTRUCTIONS;
|
|
9094
|
+
var CODE_MODE_TOOL_NAME = "execute_code", DEFAULT_INSTRUCTIONS, CODE_MODE_UNAVAILABLE_MESSAGES, warnedCodeModeReasons;
|
|
9043
9095
|
var init_tool_builder = __esm(() => {
|
|
9044
9096
|
init_type_generator();
|
|
9045
9097
|
init_executor();
|
|
@@ -9064,6 +9116,11 @@ var init_tool_builder = __esm(() => {
|
|
|
9064
9116
|
"API surface:"
|
|
9065
9117
|
].join(`
|
|
9066
9118
|
`);
|
|
9119
|
+
CODE_MODE_UNAVAILABLE_MESSAGES = {
|
|
9120
|
+
"sandbox-missing": "[integrate-sdk] Code Mode unavailable (reason: sandbox-missing) — falling back to tool mode. " + "Install `@vercel/sandbox` (e.g. `bun add @vercel/sandbox`) to enable Code Mode.",
|
|
9121
|
+
"no-public-url": "[integrate-sdk] Code Mode unavailable (reason: no-public-url) — falling back to tool mode. " + "Set `codeMode.publicUrl` on your server config or the `INTEGRATE_PUBLIC_URL` env var."
|
|
9122
|
+
};
|
|
9123
|
+
warnedCodeModeReasons = new Set;
|
|
9067
9124
|
});
|
|
9068
9125
|
|
|
9069
9126
|
// src/ai/vercel-ai.ts
|
|
@@ -9090,8 +9147,19 @@ async function getVercelAITools(client, options) {
|
|
|
9090
9147
|
await ensureClientConnected(client);
|
|
9091
9148
|
const mcpTools = await client.getEnabledToolsAsync();
|
|
9092
9149
|
const vercelTools = {};
|
|
9093
|
-
|
|
9094
|
-
if (mode
|
|
9150
|
+
let effectiveMode;
|
|
9151
|
+
if (options?.mode !== undefined) {
|
|
9152
|
+
effectiveMode = options.mode;
|
|
9153
|
+
} else {
|
|
9154
|
+
const diagnosis = await diagnoseCodeMode(client);
|
|
9155
|
+
if (diagnosis.available) {
|
|
9156
|
+
effectiveMode = "code";
|
|
9157
|
+
} else {
|
|
9158
|
+
warnCodeModeFallback(diagnosis.reason);
|
|
9159
|
+
effectiveMode = "tools";
|
|
9160
|
+
}
|
|
9161
|
+
}
|
|
9162
|
+
if (effectiveMode === "code") {
|
|
9095
9163
|
const codeTool = buildCodeModeTool(client, {
|
|
9096
9164
|
tools: mcpTools,
|
|
9097
9165
|
providerTokens,
|
|
@@ -10549,8 +10617,19 @@ async function getOpenAITools(client, options) {
|
|
|
10549
10617
|
const finalOptions = providerTokens ? { ...options, providerTokens } : options;
|
|
10550
10618
|
await ensureClientConnected(client);
|
|
10551
10619
|
const mcpTools = await client.getEnabledToolsAsync();
|
|
10552
|
-
|
|
10553
|
-
|
|
10620
|
+
let effectiveMode;
|
|
10621
|
+
if (options?.mode !== undefined) {
|
|
10622
|
+
effectiveMode = options.mode;
|
|
10623
|
+
} else {
|
|
10624
|
+
const diagnosis = await diagnoseCodeMode(client);
|
|
10625
|
+
if (diagnosis.available) {
|
|
10626
|
+
effectiveMode = "code";
|
|
10627
|
+
} else {
|
|
10628
|
+
warnCodeModeFallback(diagnosis.reason);
|
|
10629
|
+
effectiveMode = "tools";
|
|
10630
|
+
}
|
|
10631
|
+
}
|
|
10632
|
+
const openaiTools = effectiveMode === "code" ? (() => {
|
|
10554
10633
|
const codeTool = buildCodeModeTool(client, {
|
|
10555
10634
|
tools: mcpTools,
|
|
10556
10635
|
providerTokens,
|
|
@@ -10729,8 +10808,19 @@ async function getAnthropicTools(client, options) {
|
|
|
10729
10808
|
const finalOptions = providerTokens ? { ...options, providerTokens } : options;
|
|
10730
10809
|
await ensureClientConnected(client);
|
|
10731
10810
|
const mcpTools = await client.getEnabledToolsAsync();
|
|
10732
|
-
|
|
10733
|
-
|
|
10811
|
+
let effectiveMode;
|
|
10812
|
+
if (options?.mode !== undefined) {
|
|
10813
|
+
effectiveMode = options.mode;
|
|
10814
|
+
} else {
|
|
10815
|
+
const diagnosis = await diagnoseCodeMode(client);
|
|
10816
|
+
if (diagnosis.available) {
|
|
10817
|
+
effectiveMode = "code";
|
|
10818
|
+
} else {
|
|
10819
|
+
warnCodeModeFallback(diagnosis.reason);
|
|
10820
|
+
effectiveMode = "tools";
|
|
10821
|
+
}
|
|
10822
|
+
}
|
|
10823
|
+
const anthropicTools = effectiveMode === "code" ? (() => {
|
|
10734
10824
|
const codeTool = buildCodeModeTool(client, {
|
|
10735
10825
|
tools: mcpTools,
|
|
10736
10826
|
providerTokens,
|
|
@@ -10918,9 +11008,20 @@ async function getGoogleTools(client, options) {
|
|
|
10918
11008
|
const finalOptions = providerTokens ? { ...options, providerTokens } : options;
|
|
10919
11009
|
await ensureClientConnected(client);
|
|
10920
11010
|
const mcpTools = await client.getEnabledToolsAsync();
|
|
10921
|
-
|
|
11011
|
+
let effectiveMode;
|
|
11012
|
+
if (options?.mode !== undefined) {
|
|
11013
|
+
effectiveMode = options.mode;
|
|
11014
|
+
} else {
|
|
11015
|
+
const diagnosis = await diagnoseCodeMode(client);
|
|
11016
|
+
if (diagnosis.available) {
|
|
11017
|
+
effectiveMode = "code";
|
|
11018
|
+
} else {
|
|
11019
|
+
warnCodeModeFallback(diagnosis.reason);
|
|
11020
|
+
effectiveMode = "tools";
|
|
11021
|
+
}
|
|
11022
|
+
}
|
|
10922
11023
|
let googleTools;
|
|
10923
|
-
if (
|
|
11024
|
+
if (effectiveMode === "code") {
|
|
10924
11025
|
const TypeEnum = await getGoogleType();
|
|
10925
11026
|
const codeTool = buildCodeModeTool(client, {
|
|
10926
11027
|
tools: mcpTools,
|
|
@@ -11467,6 +11568,24 @@ function createMCPServer(config) {
|
|
|
11467
11568
|
} catch {}
|
|
11468
11569
|
}
|
|
11469
11570
|
}
|
|
11571
|
+
if (!authHeader && config.getProviderToken) {
|
|
11572
|
+
const codeModeHeader = webRequest.headers.get("x-integrate-code-mode");
|
|
11573
|
+
const contextHeader = webRequest.headers.get("x-integrate-context");
|
|
11574
|
+
const callbackApiKey = webRequest.headers.get("x-integrate-api-key");
|
|
11575
|
+
const toolName = typeof body?.name === "string" ? body.name : "";
|
|
11576
|
+
if (codeModeHeader === "1" && contextHeader && toolName && config.apiKey && callbackApiKey === config.apiKey) {
|
|
11577
|
+
try {
|
|
11578
|
+
const context2 = JSON.parse(contextHeader);
|
|
11579
|
+
const provider = toolName.split("_")[0];
|
|
11580
|
+
if (provider) {
|
|
11581
|
+
const tokenData = await config.getProviderToken(provider, undefined, context2);
|
|
11582
|
+
if (tokenData?.accessToken) {
|
|
11583
|
+
authHeader = `Bearer ${tokenData.accessToken}`;
|
|
11584
|
+
}
|
|
11585
|
+
}
|
|
11586
|
+
} catch {}
|
|
11587
|
+
}
|
|
11588
|
+
}
|
|
11470
11589
|
const { OAuthHandler: OAuthHandler2 } = await Promise.resolve().then(() => (init_base_handler(), exports_base_handler));
|
|
11471
11590
|
const oauthHandler = new OAuthHandler2({
|
|
11472
11591
|
providers,
|
package/dist/server.js
CHANGED
|
@@ -9457,6 +9457,7 @@ var init_type_generator = __esm(() => {
|
|
|
9457
9457
|
var RUNTIME_STUB_SOURCE = `// runtime.mjs — generated by integrate-sdk code mode
|
|
9458
9458
|
const MCP_URL = process.env.INTEGRATE_MCP_URL;
|
|
9459
9459
|
const SESSION_TOKEN = process.env.INTEGRATE_SESSION_TOKEN;
|
|
9460
|
+
const API_KEY = process.env.INTEGRATE_API_KEY || '';
|
|
9460
9461
|
const PROVIDER_TOKENS = process.env.INTEGRATE_PROVIDER_TOKENS || '';
|
|
9461
9462
|
const INTEGRATIONS_HEADER = process.env.INTEGRATE_INTEGRATIONS || '';
|
|
9462
9463
|
const CONTEXT_JSON = process.env.INTEGRATE_CONTEXT || '';
|
|
@@ -9475,6 +9476,7 @@ async function callTool(toolName, args) {
|
|
|
9475
9476
|
'x-integrate-code-mode': '1',
|
|
9476
9477
|
};
|
|
9477
9478
|
if (SESSION_TOKEN) headers['Authorization'] = 'Bearer ' + SESSION_TOKEN;
|
|
9479
|
+
if (API_KEY) headers['x-integrate-api-key'] = API_KEY;
|
|
9478
9480
|
if (PROVIDER_TOKENS) headers['x-integrate-tokens'] = PROVIDER_TOKENS;
|
|
9479
9481
|
if (INTEGRATIONS_HEADER) headers['x-integrations'] = INTEGRATIONS_HEADER;
|
|
9480
9482
|
if (CONTEXT_JSON) headers['x-integrate-context'] = CONTEXT_JSON;
|
|
@@ -9526,11 +9528,40 @@ export { callTool };
|
|
|
9526
9528
|
// src/code-mode/executor.ts
|
|
9527
9529
|
var exports_executor = {};
|
|
9528
9530
|
__export(exports_executor, {
|
|
9531
|
+
isSandboxAvailable: () => isSandboxAvailable,
|
|
9529
9532
|
executeSandboxCode: () => executeSandboxCode,
|
|
9533
|
+
__setSandboxUnavailableForTests: () => __setSandboxUnavailableForTests,
|
|
9530
9534
|
__setSandboxFactoryForTests: () => __setSandboxFactoryForTests
|
|
9531
9535
|
});
|
|
9532
9536
|
function __setSandboxFactoryForTests(factory) {
|
|
9533
9537
|
sandboxFactoryOverride = factory;
|
|
9538
|
+
_sandboxForcedUnavailableForTests = false;
|
|
9539
|
+
_sandboxAvailableCache = null;
|
|
9540
|
+
}
|
|
9541
|
+
function __setSandboxUnavailableForTests(force) {
|
|
9542
|
+
_sandboxForcedUnavailableForTests = force;
|
|
9543
|
+
_sandboxAvailableCache = null;
|
|
9544
|
+
}
|
|
9545
|
+
async function isSandboxAvailable() {
|
|
9546
|
+
if (_sandboxAvailableCache !== null)
|
|
9547
|
+
return _sandboxAvailableCache;
|
|
9548
|
+
if (_sandboxForcedUnavailableForTests) {
|
|
9549
|
+
_sandboxAvailableCache = false;
|
|
9550
|
+
return false;
|
|
9551
|
+
}
|
|
9552
|
+
if (sandboxFactoryOverride) {
|
|
9553
|
+
_sandboxAvailableCache = true;
|
|
9554
|
+
return true;
|
|
9555
|
+
}
|
|
9556
|
+
try {
|
|
9557
|
+
const dynamicImport = new Function("specifier", "return import(specifier)");
|
|
9558
|
+
await dynamicImport("@" + "vercel/sandbox");
|
|
9559
|
+
_sandboxAvailableCache = true;
|
|
9560
|
+
return true;
|
|
9561
|
+
} catch {
|
|
9562
|
+
_sandboxAvailableCache = false;
|
|
9563
|
+
return false;
|
|
9564
|
+
}
|
|
9534
9565
|
}
|
|
9535
9566
|
async function loadSandboxFactory() {
|
|
9536
9567
|
if (sandboxFactoryOverride)
|
|
@@ -9617,6 +9648,8 @@ async function executeSandboxCode(options) {
|
|
|
9617
9648
|
const env = {
|
|
9618
9649
|
INTEGRATE_MCP_URL: options.mcpUrl
|
|
9619
9650
|
};
|
|
9651
|
+
if (options.apiKey)
|
|
9652
|
+
env.INTEGRATE_API_KEY = options.apiKey;
|
|
9620
9653
|
if (options.sessionToken)
|
|
9621
9654
|
env.INTEGRATE_SESSION_TOKEN = options.sessionToken;
|
|
9622
9655
|
if (options.providerTokens && Object.keys(options.providerTokens).length > 0) {
|
|
@@ -9659,7 +9692,7 @@ async function executeSandboxCode(options) {
|
|
|
9659
9692
|
}
|
|
9660
9693
|
}
|
|
9661
9694
|
}
|
|
9662
|
-
var sandboxFactoryOverride = null, RESULT_SENTINEL = "__INTEGRATE_RESULT__";
|
|
9695
|
+
var sandboxFactoryOverride = null, _sandboxAvailableCache = null, _sandboxForcedUnavailableForTests = false, RESULT_SENTINEL = "__INTEGRATE_RESULT__";
|
|
9663
9696
|
var init_executor = () => {};
|
|
9664
9697
|
|
|
9665
9698
|
// src/code-mode/tool-builder.ts
|
|
@@ -9667,6 +9700,23 @@ function resolveCodeModeClientConfig(client) {
|
|
|
9667
9700
|
const oauthConfig = client.__oauthConfig;
|
|
9668
9701
|
return oauthConfig?.codeMode ?? {};
|
|
9669
9702
|
}
|
|
9703
|
+
async function diagnoseCodeMode(client) {
|
|
9704
|
+
if (!await isSandboxAvailable()) {
|
|
9705
|
+
return { available: false, reason: "sandbox-missing" };
|
|
9706
|
+
}
|
|
9707
|
+
const serverConfig = resolveCodeModeClientConfig(client);
|
|
9708
|
+
const publicUrl = serverConfig.publicUrl ?? getEnv("INTEGRATE_PUBLIC_URL");
|
|
9709
|
+
if (!publicUrl) {
|
|
9710
|
+
return { available: false, reason: "no-public-url" };
|
|
9711
|
+
}
|
|
9712
|
+
return { available: true };
|
|
9713
|
+
}
|
|
9714
|
+
function warnCodeModeFallback(reason) {
|
|
9715
|
+
if (warnedCodeModeReasons.has(reason))
|
|
9716
|
+
return;
|
|
9717
|
+
warnedCodeModeReasons.add(reason);
|
|
9718
|
+
console.warn(CODE_MODE_UNAVAILABLE_MESSAGES[reason]);
|
|
9719
|
+
}
|
|
9670
9720
|
function buildCodeModeTool(client, options) {
|
|
9671
9721
|
const { tools, providerTokens, context, integrationIds } = options;
|
|
9672
9722
|
const generated = generateCodeModeTypes(tools);
|
|
@@ -9679,6 +9729,7 @@ ${generated.source}
|
|
|
9679
9729
|
\`\`\``;
|
|
9680
9730
|
const execute = async ({ code }) => {
|
|
9681
9731
|
const publicUrl = sandboxOverrides.publicUrl ?? serverCodeModeConfig.publicUrl ?? getEnv("INTEGRATE_PUBLIC_URL");
|
|
9732
|
+
const apiKey = client.__oauthConfig?.apiKey;
|
|
9682
9733
|
if (!publicUrl) {
|
|
9683
9734
|
return {
|
|
9684
9735
|
success: false,
|
|
@@ -9693,6 +9744,7 @@ ${generated.source}
|
|
|
9693
9744
|
return executeSandboxCode({
|
|
9694
9745
|
code,
|
|
9695
9746
|
mcpUrl,
|
|
9747
|
+
apiKey,
|
|
9696
9748
|
providerTokens,
|
|
9697
9749
|
context,
|
|
9698
9750
|
integrationsHeader: integrationIds && integrationIds.length > 0 ? integrationIds.join(",") : undefined,
|
|
@@ -9719,7 +9771,7 @@ ${generated.source}
|
|
|
9719
9771
|
execute
|
|
9720
9772
|
};
|
|
9721
9773
|
}
|
|
9722
|
-
var CODE_MODE_TOOL_NAME = "execute_code", DEFAULT_INSTRUCTIONS;
|
|
9774
|
+
var CODE_MODE_TOOL_NAME = "execute_code", DEFAULT_INSTRUCTIONS, CODE_MODE_UNAVAILABLE_MESSAGES, warnedCodeModeReasons;
|
|
9723
9775
|
var init_tool_builder = __esm(() => {
|
|
9724
9776
|
init_type_generator();
|
|
9725
9777
|
init_executor();
|
|
@@ -9744,6 +9796,11 @@ var init_tool_builder = __esm(() => {
|
|
|
9744
9796
|
"API surface:"
|
|
9745
9797
|
].join(`
|
|
9746
9798
|
`);
|
|
9799
|
+
CODE_MODE_UNAVAILABLE_MESSAGES = {
|
|
9800
|
+
"sandbox-missing": "[integrate-sdk] Code Mode unavailable (reason: sandbox-missing) — falling back to tool mode. " + "Install `@vercel/sandbox` (e.g. `bun add @vercel/sandbox`) to enable Code Mode.",
|
|
9801
|
+
"no-public-url": "[integrate-sdk] Code Mode unavailable (reason: no-public-url) — falling back to tool mode. " + "Set `codeMode.publicUrl` on your server config or the `INTEGRATE_PUBLIC_URL` env var."
|
|
9802
|
+
};
|
|
9803
|
+
warnedCodeModeReasons = new Set;
|
|
9747
9804
|
});
|
|
9748
9805
|
|
|
9749
9806
|
// src/ai/vercel-ai.ts
|
|
@@ -9770,8 +9827,19 @@ async function getVercelAITools(client, options) {
|
|
|
9770
9827
|
await ensureClientConnected(client);
|
|
9771
9828
|
const mcpTools = await client.getEnabledToolsAsync();
|
|
9772
9829
|
const vercelTools = {};
|
|
9773
|
-
|
|
9774
|
-
if (mode
|
|
9830
|
+
let effectiveMode;
|
|
9831
|
+
if (options?.mode !== undefined) {
|
|
9832
|
+
effectiveMode = options.mode;
|
|
9833
|
+
} else {
|
|
9834
|
+
const diagnosis = await diagnoseCodeMode(client);
|
|
9835
|
+
if (diagnosis.available) {
|
|
9836
|
+
effectiveMode = "code";
|
|
9837
|
+
} else {
|
|
9838
|
+
warnCodeModeFallback(diagnosis.reason);
|
|
9839
|
+
effectiveMode = "tools";
|
|
9840
|
+
}
|
|
9841
|
+
}
|
|
9842
|
+
if (effectiveMode === "code") {
|
|
9775
9843
|
const codeTool = buildCodeModeTool(client, {
|
|
9776
9844
|
tools: mcpTools,
|
|
9777
9845
|
providerTokens,
|
|
@@ -11229,8 +11297,19 @@ async function getOpenAITools(client, options) {
|
|
|
11229
11297
|
const finalOptions = providerTokens ? { ...options, providerTokens } : options;
|
|
11230
11298
|
await ensureClientConnected(client);
|
|
11231
11299
|
const mcpTools = await client.getEnabledToolsAsync();
|
|
11232
|
-
|
|
11233
|
-
|
|
11300
|
+
let effectiveMode;
|
|
11301
|
+
if (options?.mode !== undefined) {
|
|
11302
|
+
effectiveMode = options.mode;
|
|
11303
|
+
} else {
|
|
11304
|
+
const diagnosis = await diagnoseCodeMode(client);
|
|
11305
|
+
if (diagnosis.available) {
|
|
11306
|
+
effectiveMode = "code";
|
|
11307
|
+
} else {
|
|
11308
|
+
warnCodeModeFallback(diagnosis.reason);
|
|
11309
|
+
effectiveMode = "tools";
|
|
11310
|
+
}
|
|
11311
|
+
}
|
|
11312
|
+
const openaiTools = effectiveMode === "code" ? (() => {
|
|
11234
11313
|
const codeTool = buildCodeModeTool(client, {
|
|
11235
11314
|
tools: mcpTools,
|
|
11236
11315
|
providerTokens,
|
|
@@ -11409,8 +11488,19 @@ async function getAnthropicTools(client, options) {
|
|
|
11409
11488
|
const finalOptions = providerTokens ? { ...options, providerTokens } : options;
|
|
11410
11489
|
await ensureClientConnected(client);
|
|
11411
11490
|
const mcpTools = await client.getEnabledToolsAsync();
|
|
11412
|
-
|
|
11413
|
-
|
|
11491
|
+
let effectiveMode;
|
|
11492
|
+
if (options?.mode !== undefined) {
|
|
11493
|
+
effectiveMode = options.mode;
|
|
11494
|
+
} else {
|
|
11495
|
+
const diagnosis = await diagnoseCodeMode(client);
|
|
11496
|
+
if (diagnosis.available) {
|
|
11497
|
+
effectiveMode = "code";
|
|
11498
|
+
} else {
|
|
11499
|
+
warnCodeModeFallback(diagnosis.reason);
|
|
11500
|
+
effectiveMode = "tools";
|
|
11501
|
+
}
|
|
11502
|
+
}
|
|
11503
|
+
const anthropicTools = effectiveMode === "code" ? (() => {
|
|
11414
11504
|
const codeTool = buildCodeModeTool(client, {
|
|
11415
11505
|
tools: mcpTools,
|
|
11416
11506
|
providerTokens,
|
|
@@ -11598,9 +11688,20 @@ async function getGoogleTools(client, options) {
|
|
|
11598
11688
|
const finalOptions = providerTokens ? { ...options, providerTokens } : options;
|
|
11599
11689
|
await ensureClientConnected(client);
|
|
11600
11690
|
const mcpTools = await client.getEnabledToolsAsync();
|
|
11601
|
-
|
|
11691
|
+
let effectiveMode;
|
|
11692
|
+
if (options?.mode !== undefined) {
|
|
11693
|
+
effectiveMode = options.mode;
|
|
11694
|
+
} else {
|
|
11695
|
+
const diagnosis = await diagnoseCodeMode(client);
|
|
11696
|
+
if (diagnosis.available) {
|
|
11697
|
+
effectiveMode = "code";
|
|
11698
|
+
} else {
|
|
11699
|
+
warnCodeModeFallback(diagnosis.reason);
|
|
11700
|
+
effectiveMode = "tools";
|
|
11701
|
+
}
|
|
11702
|
+
}
|
|
11602
11703
|
let googleTools;
|
|
11603
|
-
if (
|
|
11704
|
+
if (effectiveMode === "code") {
|
|
11604
11705
|
const TypeEnum = await getGoogleType();
|
|
11605
11706
|
const codeTool = buildCodeModeTool(client, {
|
|
11606
11707
|
tools: mcpTools,
|
|
@@ -12147,6 +12248,24 @@ function createMCPServer(config) {
|
|
|
12147
12248
|
} catch {}
|
|
12148
12249
|
}
|
|
12149
12250
|
}
|
|
12251
|
+
if (!authHeader && config.getProviderToken) {
|
|
12252
|
+
const codeModeHeader = webRequest.headers.get("x-integrate-code-mode");
|
|
12253
|
+
const contextHeader = webRequest.headers.get("x-integrate-context");
|
|
12254
|
+
const callbackApiKey = webRequest.headers.get("x-integrate-api-key");
|
|
12255
|
+
const toolName = typeof body?.name === "string" ? body.name : "";
|
|
12256
|
+
if (codeModeHeader === "1" && contextHeader && toolName && config.apiKey && callbackApiKey === config.apiKey) {
|
|
12257
|
+
try {
|
|
12258
|
+
const context2 = JSON.parse(contextHeader);
|
|
12259
|
+
const provider = toolName.split("_")[0];
|
|
12260
|
+
if (provider) {
|
|
12261
|
+
const tokenData = await config.getProviderToken(provider, undefined, context2);
|
|
12262
|
+
if (tokenData?.accessToken) {
|
|
12263
|
+
authHeader = `Bearer ${tokenData.accessToken}`;
|
|
12264
|
+
}
|
|
12265
|
+
}
|
|
12266
|
+
} catch {}
|
|
12267
|
+
}
|
|
12268
|
+
}
|
|
12150
12269
|
const { OAuthHandler: OAuthHandler2 } = await Promise.resolve().then(() => (init_base_handler(), exports_base_handler));
|
|
12151
12270
|
const oauthHandler = new OAuthHandler2({
|
|
12152
12271
|
providers,
|
|
@@ -30,12 +30,12 @@ export interface AnthropicToolsOptions extends AIToolsOptions {
|
|
|
30
30
|
/**
|
|
31
31
|
* How to expose MCP tools to the model.
|
|
32
32
|
*
|
|
33
|
-
* - `'code'
|
|
33
|
+
* - `'code'`: Returns a single `execute_code` tool backed by a
|
|
34
34
|
* Vercel Sandbox. The model writes TypeScript that calls the typed
|
|
35
35
|
* `client.<integration>.<method>()` API and chains operations in one round-trip.
|
|
36
36
|
* - `'tools'`: Legacy behavior — one Anthropic tool per MCP tool.
|
|
37
37
|
*
|
|
38
|
-
* @default 'code'
|
|
38
|
+
* @default auto-detects `'code'` when sandbox + public URL are available, otherwise `'tools'`
|
|
39
39
|
*/
|
|
40
40
|
mode?: 'code' | 'tools';
|
|
41
41
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../../src/ai/anthropic.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAkE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../../src/ai/anthropic.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAkE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AASjH,OAAO,KAAK,SAAS,MAAM,mBAAmB,CAAC;AAE/C;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE;QACZ,IAAI,EAAE,QAAQ,CAAC;QACf,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACrC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;QACpB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,qBAAsB,SAAQ,cAAc;IAC3D,kDAAkD;IAClD,OAAO,CAAC,EAAE,UAAU,CAAC;IACrB;;;;;;;;;OASG;IACH,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,UAAU,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,aAAa,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AA4ID;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,aAAa,EAAE,CAAC,CA2E1B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,OAAO,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAA,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,CAAC,CAAA;CAAE,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACpG,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,GAAG,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAA,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,CAAC,CAAA;CAAE,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAkC5I"}
|
package/dist/src/ai/google.d.ts
CHANGED
|
@@ -19,12 +19,12 @@ export interface GoogleToolsOptions extends AIToolsOptions {
|
|
|
19
19
|
/**
|
|
20
20
|
* How to expose MCP tools to the model.
|
|
21
21
|
*
|
|
22
|
-
* - `'code'
|
|
22
|
+
* - `'code'`: Returns a single `execute_code` tool backed by a
|
|
23
23
|
* Vercel Sandbox. The model writes TypeScript that calls the typed
|
|
24
24
|
* `client.<integration>.<method>()` API and chains operations in one round-trip.
|
|
25
25
|
* - `'tools'`: Legacy behavior — one Google FunctionDeclaration per MCP tool.
|
|
26
26
|
*
|
|
27
|
-
* @default 'code'
|
|
27
|
+
* @default auto-detects `'code'` when sandbox + public URL are available, otherwise `'tools'`
|
|
28
28
|
*/
|
|
29
29
|
mode?: 'code' | 'tools';
|
|
30
30
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"google.d.ts","sourceRoot":"","sources":["../../../src/ai/google.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAkE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"google.d.ts","sourceRoot":"","sources":["../../../src/ai/google.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAkE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AAYjH,OAAO,KAAK,EACV,MAAM,EACN,mBAAmB,EACnB,YAAY,EACZ,IAAI,EACL,MAAM,eAAe,CAAC;AAGvB,MAAM,MAAM,UAAU,GAAG,mBAAmB,CAAC;AAC7C,MAAM,MAAM,kBAAkB,GAAG,YAAY,CAAC;AAC9C,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AAuB7B;;GAEG;AACH,MAAM,WAAW,kBAAmB,SAAQ,cAAc;IACxD,kDAAkD;IAClD,OAAO,CAAC,EAAE,UAAU,CAAC;IACrB;;;;;;;;;OASG;IACH,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACzB;AAsGD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,wBAAsB,0BAA0B,CAC9C,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,aAAa,EAAE,kBAAkB,EAAE,GAAG,SAAS,GAAG,IAAI,EACtD,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,MAAM,EAAE,CAAC,CA4DnB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyEG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,UAAU,EAAE,CAAC,CAwFvB"}
|
package/dist/src/ai/openai.d.ts
CHANGED
|
@@ -34,12 +34,12 @@ export interface OpenAIToolsOptions extends AIToolsOptions {
|
|
|
34
34
|
/**
|
|
35
35
|
* How to expose MCP tools to the model.
|
|
36
36
|
*
|
|
37
|
-
* - `'code'
|
|
37
|
+
* - `'code'`: Returns a single `execute_code` tool backed by a
|
|
38
38
|
* Vercel Sandbox. The model writes TypeScript that calls the typed
|
|
39
39
|
* `client.<integration>.<method>()` API and chains operations in one round-trip.
|
|
40
40
|
* - `'tools'`: Legacy behavior — one OpenAI function tool per MCP tool.
|
|
41
41
|
*
|
|
42
|
-
* @default 'code'
|
|
42
|
+
* @default auto-detects `'code'` when sandbox + public URL are available, otherwise `'tools'`
|
|
43
43
|
*/
|
|
44
44
|
mode?: 'code' | 'tools';
|
|
45
45
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../../src/ai/openai.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAkE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../../src/ai/openai.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAkE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AASjH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAErC;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE;QACV,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,GAAG,IAAI,CAAC;IACT,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,kBAAmB,SAAQ,cAAc;IACxD;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,kDAAkD;IAClD,OAAO,CAAC,EAAE,UAAU,CAAC;IACrB;;;;;;;;;OASG;IACH,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACzB;AAiCD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,UAAU,EAAE,CAAC,CA2EvB;AA0GD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0DG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,QAAQ,EAAE;IAAE,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAA,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,CAAC,CAAA;CAAE,EAChE,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,iBAAiB,CAAC,kBAAkB,EAAE,GAAG;IAAE,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAA,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CAyB3H"}
|
|
@@ -25,14 +25,14 @@ export interface VercelAIToolsOptions extends AIToolsOptions {
|
|
|
25
25
|
/**
|
|
26
26
|
* How to expose MCP tools to the model.
|
|
27
27
|
*
|
|
28
|
-
* - `'code'
|
|
28
|
+
* - `'code'`: Returns a single `execute_code` tool. The model writes
|
|
29
29
|
* a TypeScript snippet that calls the typed `client.<integration>.<method>()`
|
|
30
30
|
* API; the snippet runs in an isolated Vercel Sandbox and calls back into
|
|
31
31
|
* `/api/integrate/mcp`. Chains multiple operations in one round-trip.
|
|
32
32
|
* - `'tools'`: Legacy behavior — returns one AI tool per MCP tool. Use this
|
|
33
33
|
* if you can't run `@vercel/sandbox` or need the model to see every tool.
|
|
34
34
|
*
|
|
35
|
-
* @default 'code'
|
|
35
|
+
* @default auto-detects `'code'` when sandbox + public URL are available, otherwise `'tools'`
|
|
36
36
|
*/
|
|
37
37
|
mode?: 'code' | 'tools';
|
|
38
38
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vercel-ai.d.ts","sourceRoot":"","sources":["../../../src/ai/vercel-ai.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAKL,KAAK,cAAc,EACpB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"vercel-ai.d.ts","sourceRoot":"","sources":["../../../src/ai/vercel-ai.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAKL,KAAK,cAAc,EACpB,MAAM,YAAY,CAAC;AASpB;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC5B,OAAO,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;CACrD;AAED;;GAEG;AACH,MAAM,WAAW,oBAAqB,SAAQ,cAAc;IAC1D,kDAAkD;IAClD,OAAO,CAAC,EAAE,UAAU,CAAC;IACrB;;;;;;;;;;;OAWG;IACH,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACzB;AA+BD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmDG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,OAAO,CAAC,EAAE,oBAAoB,gCAkE/B"}
|
|
@@ -43,11 +43,16 @@ interface SandboxFactory {
|
|
|
43
43
|
}
|
|
44
44
|
/** @internal — used by unit tests to stub the sandbox SDK. */
|
|
45
45
|
export declare function __setSandboxFactoryForTests(factory: SandboxFactory | null): void;
|
|
46
|
+
/** @internal — used by unit tests to simulate missing @vercel/sandbox. */
|
|
47
|
+
export declare function __setSandboxUnavailableForTests(force: boolean): void;
|
|
48
|
+
export declare function isSandboxAvailable(): Promise<boolean>;
|
|
46
49
|
export interface ExecuteSandboxCodeOptions {
|
|
47
50
|
/** Source code the LLM produced. Treated as an async function body. */
|
|
48
51
|
code: string;
|
|
49
52
|
/** Fully-qualified MCP route URL, e.g. `https://myapp.com/api/integrate/mcp`. */
|
|
50
53
|
mcpUrl: string;
|
|
54
|
+
/** Server API key forwarded to trusted sandbox callbacks. */
|
|
55
|
+
apiKey?: string;
|
|
51
56
|
/** Session token forwarded as `Authorization: Bearer <token>` by the stub. */
|
|
52
57
|
sessionToken?: string;
|
|
53
58
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../../src/code-mode/executor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGrD;;;;GAIG;AACH,UAAU,WAAW;IACnB,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3E,UAAU,CACR,MAAM,EAAE;QACN,GAAG,EAAE,MAAM,CAAC;QACZ,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;KACd,GACA,OAAO,CAAC;QACT,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;QAC1B,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;KAC3B,CAAC,CAAC;IACH,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1B;AAED,UAAU,cAAc;IACtB,MAAM,CAAC,OAAO,EAAE;QACd,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,SAAS,CAAC,EAAE;YAAE,KAAK,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QAC/B,aAAa,CAAC,EAAE,OAAO,CAAC;KACzB,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;CAC1B;
|
|
1
|
+
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../../src/code-mode/executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,5 +8,5 @@
|
|
|
8
8
|
export { generateCodeModeTypes, type GeneratedTypes, } from "./type-generator.js";
|
|
9
9
|
export { executeSandboxCode, __setSandboxFactoryForTests, type ExecuteSandboxCodeOptions, type ExecuteSandboxCodeResult, } from "./executor.js";
|
|
10
10
|
export { RUNTIME_STUB_SOURCE } from "./runtime-stub.js";
|
|
11
|
-
export { buildCodeModeTool, CODE_MODE_TOOL_NAME, type CodeModeToolOptions, type CodeModeToolDefinition, } from "./tool-builder.js";
|
|
11
|
+
export { buildCodeModeTool, canUseCodeMode, CODE_MODE_TOOL_NAME, type CodeModeToolOptions, type CodeModeToolDefinition, } from "./tool-builder.js";
|
|
12
12
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/code-mode/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,qBAAqB,EACrB,KAAK,cAAc,GACpB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,kBAAkB,EAClB,2BAA2B,EAC3B,KAAK,yBAAyB,EAC9B,KAAK,wBAAwB,GAC9B,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAExD,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,KAAK,mBAAmB,EACxB,KAAK,sBAAsB,GAC5B,MAAM,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/code-mode/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,qBAAqB,EACrB,KAAK,cAAc,GACpB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,kBAAkB,EAClB,2BAA2B,EAC3B,KAAK,yBAAyB,EAC9B,KAAK,wBAAwB,GAC9B,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAExD,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,mBAAmB,EACnB,KAAK,mBAAmB,EACxB,KAAK,sBAAsB,GAC5B,MAAM,mBAAmB,CAAC"}
|
|
@@ -12,5 +12,5 @@
|
|
|
12
12
|
* dependencies. It is NOT imported by the host SDK — it only ships as a
|
|
13
13
|
* literal payload to the sandbox.
|
|
14
14
|
*/
|
|
15
|
-
export declare const RUNTIME_STUB_SOURCE = "// runtime.mjs \u2014 generated by integrate-sdk code mode\nconst MCP_URL = process.env.INTEGRATE_MCP_URL;\nconst SESSION_TOKEN = process.env.INTEGRATE_SESSION_TOKEN;\nconst PROVIDER_TOKENS = process.env.INTEGRATE_PROVIDER_TOKENS || '';\nconst INTEGRATIONS_HEADER = process.env.INTEGRATE_INTEGRATIONS || '';\nconst CONTEXT_JSON = process.env.INTEGRATE_CONTEXT || '';\n\nif (!MCP_URL) {\n throw new Error('INTEGRATE_MCP_URL is not set \u2014 the sandbox cannot reach the MCP route.');\n}\n\nfunction camelToSnake(str) {\n return str.replace(/[A-Z]/g, (letter) => '_' + letter.toLowerCase());\n}\n\nasync function callTool(toolName, args) {\n const headers = {\n 'Content-Type': 'application/json',\n 'x-integrate-code-mode': '1',\n };\n if (SESSION_TOKEN) headers['Authorization'] = 'Bearer ' + SESSION_TOKEN;\n if (PROVIDER_TOKENS) headers['x-integrate-tokens'] = PROVIDER_TOKENS;\n if (INTEGRATIONS_HEADER) headers['x-integrations'] = INTEGRATIONS_HEADER;\n if (CONTEXT_JSON) headers['x-integrate-context'] = CONTEXT_JSON;\n\n const res = await fetch(MCP_URL, {\n method: 'POST',\n headers,\n body: JSON.stringify({ name: toolName, arguments: args || {} }),\n });\n\n const text = await res.text();\n let payload;\n try {\n payload = text ? JSON.parse(text) : null;\n } catch {\n payload = { content: [{ type: 'text', text }] };\n }\n\n if (!res.ok) {\n const message = (payload && (payload.error || payload.message)) || 'Tool call failed: HTTP ' + res.status;\n const err = new Error(message);\n err.status = res.status;\n err.toolName = toolName;\n throw err;\n }\n\n return payload;\n}\n\nfunction createIntegrationProxy(integrationId) {\n return new Proxy({}, {\n get(_target, methodName) {\n if (typeof methodName !== 'string') return undefined;\n return (args) => callTool(integrationId + '_' + camelToSnake(methodName), args);\n },\n });\n}\n\nexport const client = new Proxy({}, {\n get(_target, integrationId) {\n if (typeof integrationId !== 'string') return undefined;\n return createIntegrationProxy(integrationId);\n },\n});\n\nexport { callTool };\n";
|
|
15
|
+
export declare const RUNTIME_STUB_SOURCE = "// runtime.mjs \u2014 generated by integrate-sdk code mode\nconst MCP_URL = process.env.INTEGRATE_MCP_URL;\nconst SESSION_TOKEN = process.env.INTEGRATE_SESSION_TOKEN;\nconst API_KEY = process.env.INTEGRATE_API_KEY || '';\nconst PROVIDER_TOKENS = process.env.INTEGRATE_PROVIDER_TOKENS || '';\nconst INTEGRATIONS_HEADER = process.env.INTEGRATE_INTEGRATIONS || '';\nconst CONTEXT_JSON = process.env.INTEGRATE_CONTEXT || '';\n\nif (!MCP_URL) {\n throw new Error('INTEGRATE_MCP_URL is not set \u2014 the sandbox cannot reach the MCP route.');\n}\n\nfunction camelToSnake(str) {\n return str.replace(/[A-Z]/g, (letter) => '_' + letter.toLowerCase());\n}\n\nasync function callTool(toolName, args) {\n const headers = {\n 'Content-Type': 'application/json',\n 'x-integrate-code-mode': '1',\n };\n if (SESSION_TOKEN) headers['Authorization'] = 'Bearer ' + SESSION_TOKEN;\n if (API_KEY) headers['x-integrate-api-key'] = API_KEY;\n if (PROVIDER_TOKENS) headers['x-integrate-tokens'] = PROVIDER_TOKENS;\n if (INTEGRATIONS_HEADER) headers['x-integrations'] = INTEGRATIONS_HEADER;\n if (CONTEXT_JSON) headers['x-integrate-context'] = CONTEXT_JSON;\n\n const res = await fetch(MCP_URL, {\n method: 'POST',\n headers,\n body: JSON.stringify({ name: toolName, arguments: args || {} }),\n });\n\n const text = await res.text();\n let payload;\n try {\n payload = text ? JSON.parse(text) : null;\n } catch {\n payload = { content: [{ type: 'text', text }] };\n }\n\n if (!res.ok) {\n const message = (payload && (payload.error || payload.message)) || 'Tool call failed: HTTP ' + res.status;\n const err = new Error(message);\n err.status = res.status;\n err.toolName = toolName;\n throw err;\n }\n\n return payload;\n}\n\nfunction createIntegrationProxy(integrationId) {\n return new Proxy({}, {\n get(_target, methodName) {\n if (typeof methodName !== 'string') return undefined;\n return (args) => callTool(integrationId + '_' + camelToSnake(methodName), args);\n },\n });\n}\n\nexport const client = new Proxy({}, {\n get(_target, integrationId) {\n if (typeof integrationId !== 'string') return undefined;\n return createIntegrationProxy(integrationId);\n },\n});\n\nexport { callTool };\n";
|
|
16
16
|
//# sourceMappingURL=runtime-stub.d.ts.map
|