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.
Files changed (52) hide show
  1. package/dist/adapters/auto-routes.js +129 -10
  2. package/dist/adapters/index.js +129 -10
  3. package/dist/adapters/nextjs.js +129 -10
  4. package/dist/adapters/node.js +129 -10
  5. package/dist/adapters/svelte-kit.js +129 -10
  6. package/dist/adapters/tanstack-start.js +129 -10
  7. package/dist/ai/anthropic.d.ts +2 -2
  8. package/dist/ai/anthropic.d.ts.map +1 -1
  9. package/dist/ai/anthropic.js +64 -2
  10. package/dist/ai/google.d.ts +2 -2
  11. package/dist/ai/google.d.ts.map +1 -1
  12. package/dist/ai/google.js +64 -2
  13. package/dist/ai/index.js +103 -8
  14. package/dist/ai/openai.d.ts +2 -2
  15. package/dist/ai/openai.d.ts.map +1 -1
  16. package/dist/ai/openai.js +64 -2
  17. package/dist/ai/vercel-ai.d.ts +2 -2
  18. package/dist/ai/vercel-ai.d.ts.map +1 -1
  19. package/dist/ai/vercel-ai.js +64 -2
  20. package/dist/code-mode/executor.d.ts +5 -0
  21. package/dist/code-mode/executor.d.ts.map +1 -1
  22. package/dist/code-mode/executor.js +35 -0
  23. package/dist/code-mode/index.d.ts +1 -1
  24. package/dist/code-mode/index.d.ts.map +1 -1
  25. package/dist/code-mode/index.js +64 -0
  26. package/dist/code-mode/runtime-stub.d.ts +1 -1
  27. package/dist/code-mode/runtime-stub.d.ts.map +1 -1
  28. package/dist/code-mode/runtime-stub.js +2 -0
  29. package/dist/code-mode/tool-builder.d.ts +17 -0
  30. package/dist/code-mode/tool-builder.d.ts.map +1 -1
  31. package/dist/code-mode/tool-builder.js +67 -0
  32. package/dist/index.js +129 -10
  33. package/dist/oauth.js +129 -10
  34. package/dist/server.js +129 -10
  35. package/dist/src/ai/anthropic.d.ts +2 -2
  36. package/dist/src/ai/anthropic.d.ts.map +1 -1
  37. package/dist/src/ai/google.d.ts +2 -2
  38. package/dist/src/ai/google.d.ts.map +1 -1
  39. package/dist/src/ai/openai.d.ts +2 -2
  40. package/dist/src/ai/openai.d.ts.map +1 -1
  41. package/dist/src/ai/vercel-ai.d.ts +2 -2
  42. package/dist/src/ai/vercel-ai.d.ts.map +1 -1
  43. package/dist/src/code-mode/executor.d.ts +5 -0
  44. package/dist/src/code-mode/executor.d.ts.map +1 -1
  45. package/dist/src/code-mode/index.d.ts +1 -1
  46. package/dist/src/code-mode/index.d.ts.map +1 -1
  47. package/dist/src/code-mode/runtime-stub.d.ts +1 -1
  48. package/dist/src/code-mode/runtime-stub.d.ts.map +1 -1
  49. package/dist/src/code-mode/tool-builder.d.ts +17 -0
  50. package/dist/src/code-mode/tool-builder.d.ts.map +1 -1
  51. package/dist/src/server.d.ts.map +1 -1
  52. 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
- const mode = options?.mode ?? "code";
9094
- if (mode === "code") {
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
- const mode = options?.mode ?? "code";
10553
- const openaiTools = mode === "code" ? (() => {
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
- const mode = options?.mode ?? "code";
10733
- const anthropicTools = mode === "code" ? (() => {
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
- const mode = options?.mode ?? "code";
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 (mode === "code") {
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
- const mode = options?.mode ?? "code";
9774
- if (mode === "code") {
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
- const mode = options?.mode ?? "code";
11233
- const openaiTools = mode === "code" ? (() => {
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
- const mode = options?.mode ?? "code";
11413
- const anthropicTools = mode === "code" ? (() => {
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
- const mode = options?.mode ?? "code";
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 (mode === "code") {
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'` (default): Returns a single `execute_code` tool backed by a
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;AAIjH,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,CAgE1B;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"}
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"}
@@ -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'` (default): Returns a single `execute_code` tool backed by a
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;AAOjH,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,CA6EvB"}
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"}
@@ -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'` (default): Returns a single `execute_code` tool backed by a
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;AAIjH,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,CAgEvB;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"}
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'` (default): Returns a single `execute_code` tool. The model writes
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;AAIpB;;;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,gCAuD/B"}
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;AAQD,8DAA8D;AAC9D,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,GAAG,IAAI,CAEhF;AAkBD,MAAM,WAAW,yBAAyB;IACxC,uEAAuE;IACvE,IAAI,EAAE,MAAM,CAAC;IACb,iFAAiF;IACjF,MAAM,EAAE,MAAM,CAAC;IACf,8EAA8E;IAC9E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,uEAAuE;IACvE,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,8EAA8E;IAC9E,OAAO,CAAC,EAAE,UAAU,CAAC;IACrB,qDAAqD;IACrD,OAAO,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC9B,iDAAiD;IACjD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+EAA+E;IAC/E,aAAa,CAAC,EAAE,WAAW,GAAG,UAAU,GAAG;QAAE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,OAAO,CAAC,EAAE;YAAE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;SAAE,CAAA;KAAE,CAAC;CAClH;AAED,MAAM,WAAW,wBAAwB;IACvC,sDAAsD;IACtD,OAAO,EAAE,OAAO,CAAC;IACjB,sCAAsC;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,kEAAkE;IAClE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,4EAA4E;IAC5E,MAAM,EAAE,MAAM,CAAC;IACf,yBAAyB;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,2CAA2C;IAC3C,UAAU,EAAE,MAAM,CAAC;IACnB,4EAA4E;IAC5E,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA4DD;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAqE9G"}
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