integrate-sdk 0.9.5-dev.0 → 0.9.8-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 +69 -9
  2. package/dist/adapters/index.js +69 -9
  3. package/dist/adapters/nextjs.js +69 -9
  4. package/dist/adapters/node.js +69 -9
  5. package/dist/adapters/svelte-kit.js +69 -9
  6. package/dist/adapters/tanstack-start.js +69 -9
  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 +38 -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 +38 -2
  13. package/dist/ai/index.js +44 -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 +38 -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 +38 -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 +43 -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 +1 -0
  30. package/dist/code-mode/tool-builder.d.ts.map +1 -1
  31. package/dist/code-mode/tool-builder.js +43 -0
  32. package/dist/index.js +69 -9
  33. package/dist/oauth.js +69 -9
  34. package/dist/server.js +69 -9
  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 +1 -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
@@ -217,6 +217,7 @@ function pascalCase(id) {
217
217
  var RUNTIME_STUB_SOURCE = `// runtime.mjs — generated by integrate-sdk code mode
218
218
  const MCP_URL = process.env.INTEGRATE_MCP_URL;
219
219
  const SESSION_TOKEN = process.env.INTEGRATE_SESSION_TOKEN;
220
+ const API_KEY = process.env.INTEGRATE_API_KEY || '';
220
221
  const PROVIDER_TOKENS = process.env.INTEGRATE_PROVIDER_TOKENS || '';
221
222
  const INTEGRATIONS_HEADER = process.env.INTEGRATE_INTEGRATIONS || '';
222
223
  const CONTEXT_JSON = process.env.INTEGRATE_CONTEXT || '';
@@ -235,6 +236,7 @@ async function callTool(toolName, args) {
235
236
  'x-integrate-code-mode': '1',
236
237
  };
237
238
  if (SESSION_TOKEN) headers['Authorization'] = 'Bearer ' + SESSION_TOKEN;
239
+ if (API_KEY) headers['x-integrate-api-key'] = API_KEY;
238
240
  if (PROVIDER_TOKENS) headers['x-integrate-tokens'] = PROVIDER_TOKENS;
239
241
  if (INTEGRATIONS_HEADER) headers['x-integrations'] = INTEGRATIONS_HEADER;
240
242
  if (CONTEXT_JSON) headers['x-integrate-context'] = CONTEXT_JSON;
@@ -285,8 +287,37 @@ export { callTool };
285
287
 
286
288
  // executor.ts
287
289
  var sandboxFactoryOverride = null;
290
+ var _sandboxAvailableCache = null;
291
+ var _sandboxForcedUnavailableForTests = false;
288
292
  function __setSandboxFactoryForTests(factory) {
289
293
  sandboxFactoryOverride = factory;
294
+ _sandboxForcedUnavailableForTests = false;
295
+ _sandboxAvailableCache = null;
296
+ }
297
+ function __setSandboxUnavailableForTests(force) {
298
+ _sandboxForcedUnavailableForTests = force;
299
+ _sandboxAvailableCache = null;
300
+ }
301
+ async function isSandboxAvailable() {
302
+ if (_sandboxAvailableCache !== null)
303
+ return _sandboxAvailableCache;
304
+ if (_sandboxForcedUnavailableForTests) {
305
+ _sandboxAvailableCache = false;
306
+ return false;
307
+ }
308
+ if (sandboxFactoryOverride) {
309
+ _sandboxAvailableCache = true;
310
+ return true;
311
+ }
312
+ try {
313
+ const dynamicImport = new Function("specifier", "return import(specifier)");
314
+ await dynamicImport("@" + "vercel/sandbox");
315
+ _sandboxAvailableCache = true;
316
+ return true;
317
+ } catch {
318
+ _sandboxAvailableCache = false;
319
+ return false;
320
+ }
290
321
  }
291
322
  async function loadSandboxFactory() {
292
323
  if (sandboxFactoryOverride)
@@ -374,6 +405,8 @@ async function executeSandboxCode(options) {
374
405
  const env = {
375
406
  INTEGRATE_MCP_URL: options.mcpUrl
376
407
  };
408
+ if (options.apiKey)
409
+ env.INTEGRATE_API_KEY = options.apiKey;
377
410
  if (options.sessionToken)
378
411
  env.INTEGRATE_SESSION_TOKEN = options.sessionToken;
379
412
  if (options.providerTokens && Object.keys(options.providerTokens).length > 0) {
@@ -465,6 +498,13 @@ function resolveCodeModeClientConfig(client) {
465
498
  const oauthConfig = client.__oauthConfig;
466
499
  return oauthConfig?.codeMode ?? {};
467
500
  }
501
+ async function canUseCodeMode(client) {
502
+ if (!await isSandboxAvailable())
503
+ return false;
504
+ const serverConfig = resolveCodeModeClientConfig(client);
505
+ const publicUrl = serverConfig.publicUrl ?? getEnv("INTEGRATE_PUBLIC_URL");
506
+ return !!publicUrl;
507
+ }
468
508
  function buildCodeModeTool(client, options) {
469
509
  const { tools, providerTokens, context, integrationIds } = options;
470
510
  const generated = generateCodeModeTypes(tools);
@@ -477,6 +517,7 @@ ${generated.source}
477
517
  \`\`\``;
478
518
  const execute = async ({ code }) => {
479
519
  const publicUrl = sandboxOverrides.publicUrl ?? serverCodeModeConfig.publicUrl ?? getEnv("INTEGRATE_PUBLIC_URL");
520
+ const apiKey = client.__oauthConfig?.apiKey;
480
521
  if (!publicUrl) {
481
522
  return {
482
523
  success: false,
@@ -491,6 +532,7 @@ ${generated.source}
491
532
  return executeSandboxCode({
492
533
  code,
493
534
  mcpUrl,
535
+ apiKey,
494
536
  providerTokens,
495
537
  context,
496
538
  integrationsHeader: integrationIds && integrationIds.length > 0 ? integrationIds.join(",") : undefined,
@@ -520,6 +562,7 @@ ${generated.source}
520
562
  export {
521
563
  generateCodeModeTypes,
522
564
  executeSandboxCode,
565
+ canUseCodeMode,
523
566
  buildCodeModeTool,
524
567
  __setSandboxFactoryForTests,
525
568
  RUNTIME_STUB_SOURCE,
@@ -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
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-stub.d.ts","sourceRoot":"","sources":["../../../src/code-mode/runtime-stub.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,eAAO,MAAM,mBAAmB,qmEAmE/B,CAAC"}
1
+ {"version":3,"file":"runtime-stub.d.ts","sourceRoot":"","sources":["../../../src/code-mode/runtime-stub.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,eAAO,MAAM,mBAAmB,qtEAqE/B,CAAC"}
@@ -2,6 +2,7 @@
2
2
  var RUNTIME_STUB_SOURCE = `// runtime.mjs — generated by integrate-sdk code mode
3
3
  const MCP_URL = process.env.INTEGRATE_MCP_URL;
4
4
  const SESSION_TOKEN = process.env.INTEGRATE_SESSION_TOKEN;
5
+ const API_KEY = process.env.INTEGRATE_API_KEY || '';
5
6
  const PROVIDER_TOKENS = process.env.INTEGRATE_PROVIDER_TOKENS || '';
6
7
  const INTEGRATIONS_HEADER = process.env.INTEGRATE_INTEGRATIONS || '';
7
8
  const CONTEXT_JSON = process.env.INTEGRATE_CONTEXT || '';
@@ -20,6 +21,7 @@ async function callTool(toolName, args) {
20
21
  'x-integrate-code-mode': '1',
21
22
  };
22
23
  if (SESSION_TOKEN) headers['Authorization'] = 'Bearer ' + SESSION_TOKEN;
24
+ if (API_KEY) headers['x-integrate-api-key'] = API_KEY;
23
25
  if (PROVIDER_TOKENS) headers['x-integrate-tokens'] = PROVIDER_TOKENS;
24
26
  if (INTEGRATIONS_HEADER) headers['x-integrations'] = INTEGRATIONS_HEADER;
25
27
  if (CONTEXT_JSON) headers['x-integrate-context'] = CONTEXT_JSON;
@@ -74,6 +74,7 @@ export declare function resolveCodeModeClientConfig(client: MCPClient<any>): {
74
74
  };
75
75
  };
76
76
  };
77
+ export declare function canUseCodeMode(client: MCPClient<any>): Promise<boolean>;
77
78
  /**
78
79
  * Build the `execute_code` tool definition. The returned `execute` function
79
80
  * is what the AI provider SDK ultimately invokes when the model picks the
@@ -1 +1 @@
1
- {"version":3,"file":"tool-builder.d.ts","sourceRoot":"","sources":["../../../src/code-mode/tool-builder.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAEvD,OAAO,EAAsB,KAAK,wBAAwB,EAAE,MAAM,eAAe,CAAC;AAGlF,eAAO,MAAM,mBAAmB,iBAAiB,CAAC;AAElD,MAAM,WAAW,mBAAmB;IAClC,yDAAyD;IACzD,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,iDAAiD;IACjD,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,iCAAiC;IACjC,OAAO,CAAC,EAAE,UAAU,CAAC;IACrB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B;;;;OAIG;IACH,OAAO,CAAC,EAAE;QACR,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;QAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,aAAa,CAAC,EAAE,WAAW,GAAG,UAAU,GAAG;YAAE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;YAAC,OAAO,CAAC,EAAE;gBAAE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;gBAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;aAAE,CAAA;SAAE,CAAC;KAClH,CAAC;CACH;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE;QACV,IAAI,EAAE,QAAQ,CAAC;QACf,UAAU,EAAE;YACV,IAAI,EAAE;gBAAE,IAAI,EAAE,QAAQ,CAAC;gBAAC,WAAW,EAAE,MAAM,CAAA;aAAE,CAAC;SAC/C,CAAC;QACF,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC;QACnB,oBAAoB,EAAE,KAAK,CAAC;KAC7B,CAAC;IACF,OAAO,EAAE,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,wBAAwB,CAAC,CAAC;CACzE;AAuBD,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,GAAG;IACnE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,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,CAGA;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,OAAO,EAAE,mBAAmB,GAC3B,sBAAsB,CA6DxB"}
1
+ {"version":3,"file":"tool-builder.d.ts","sourceRoot":"","sources":["../../../src/code-mode/tool-builder.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAEvD,OAAO,EAGL,KAAK,wBAAwB,EAC9B,MAAM,eAAe,CAAC;AAGvB,eAAO,MAAM,mBAAmB,iBAAiB,CAAC;AAElD,MAAM,WAAW,mBAAmB;IAClC,yDAAyD;IACzD,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,iDAAiD;IACjD,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,iCAAiC;IACjC,OAAO,CAAC,EAAE,UAAU,CAAC;IACrB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B;;;;OAIG;IACH,OAAO,CAAC,EAAE;QACR,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;QAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,aAAa,CAAC,EAAE,WAAW,GAAG,UAAU,GAAG;YAAE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;YAAC,OAAO,CAAC,EAAE;gBAAE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;gBAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;aAAE,CAAA;SAAE,CAAC;KAClH,CAAC;CACH;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE;QACV,IAAI,EAAE,QAAQ,CAAC;QACf,UAAU,EAAE;YACV,IAAI,EAAE;gBAAE,IAAI,EAAE,QAAQ,CAAC;gBAAC,WAAW,EAAE,MAAM,CAAA;aAAE,CAAC;SAC/C,CAAC;QACF,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC;QACnB,oBAAoB,EAAE,KAAK,CAAC;KAC7B,CAAC;IACF,OAAO,EAAE,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,wBAAwB,CAAC,CAAC;CACzE;AAuBD,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,GAAG;IACnE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,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,CAGA;AAED,wBAAsB,cAAc,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAK7E;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,OAAO,EAAE,mBAAmB,GAC3B,sBAAsB,CA+DxB"}
@@ -217,6 +217,7 @@ function pascalCase(id) {
217
217
  var RUNTIME_STUB_SOURCE = `// runtime.mjs — generated by integrate-sdk code mode
218
218
  const MCP_URL = process.env.INTEGRATE_MCP_URL;
219
219
  const SESSION_TOKEN = process.env.INTEGRATE_SESSION_TOKEN;
220
+ const API_KEY = process.env.INTEGRATE_API_KEY || '';
220
221
  const PROVIDER_TOKENS = process.env.INTEGRATE_PROVIDER_TOKENS || '';
221
222
  const INTEGRATIONS_HEADER = process.env.INTEGRATE_INTEGRATIONS || '';
222
223
  const CONTEXT_JSON = process.env.INTEGRATE_CONTEXT || '';
@@ -235,6 +236,7 @@ async function callTool(toolName, args) {
235
236
  'x-integrate-code-mode': '1',
236
237
  };
237
238
  if (SESSION_TOKEN) headers['Authorization'] = 'Bearer ' + SESSION_TOKEN;
239
+ if (API_KEY) headers['x-integrate-api-key'] = API_KEY;
238
240
  if (PROVIDER_TOKENS) headers['x-integrate-tokens'] = PROVIDER_TOKENS;
239
241
  if (INTEGRATIONS_HEADER) headers['x-integrations'] = INTEGRATIONS_HEADER;
240
242
  if (CONTEXT_JSON) headers['x-integrate-context'] = CONTEXT_JSON;
@@ -285,8 +287,37 @@ export { callTool };
285
287
 
286
288
  // executor.ts
287
289
  var sandboxFactoryOverride = null;
290
+ var _sandboxAvailableCache = null;
291
+ var _sandboxForcedUnavailableForTests = false;
288
292
  function __setSandboxFactoryForTests(factory) {
289
293
  sandboxFactoryOverride = factory;
294
+ _sandboxForcedUnavailableForTests = false;
295
+ _sandboxAvailableCache = null;
296
+ }
297
+ function __setSandboxUnavailableForTests(force) {
298
+ _sandboxForcedUnavailableForTests = force;
299
+ _sandboxAvailableCache = null;
300
+ }
301
+ async function isSandboxAvailable() {
302
+ if (_sandboxAvailableCache !== null)
303
+ return _sandboxAvailableCache;
304
+ if (_sandboxForcedUnavailableForTests) {
305
+ _sandboxAvailableCache = false;
306
+ return false;
307
+ }
308
+ if (sandboxFactoryOverride) {
309
+ _sandboxAvailableCache = true;
310
+ return true;
311
+ }
312
+ try {
313
+ const dynamicImport = new Function("specifier", "return import(specifier)");
314
+ await dynamicImport("@" + "vercel/sandbox");
315
+ _sandboxAvailableCache = true;
316
+ return true;
317
+ } catch {
318
+ _sandboxAvailableCache = false;
319
+ return false;
320
+ }
290
321
  }
291
322
  async function loadSandboxFactory() {
292
323
  if (sandboxFactoryOverride)
@@ -374,6 +405,8 @@ async function executeSandboxCode(options) {
374
405
  const env = {
375
406
  INTEGRATE_MCP_URL: options.mcpUrl
376
407
  };
408
+ if (options.apiKey)
409
+ env.INTEGRATE_API_KEY = options.apiKey;
377
410
  if (options.sessionToken)
378
411
  env.INTEGRATE_SESSION_TOKEN = options.sessionToken;
379
412
  if (options.providerTokens && Object.keys(options.providerTokens).length > 0) {
@@ -465,6 +498,13 @@ function resolveCodeModeClientConfig(client) {
465
498
  const oauthConfig = client.__oauthConfig;
466
499
  return oauthConfig?.codeMode ?? {};
467
500
  }
501
+ async function canUseCodeMode(client) {
502
+ if (!await isSandboxAvailable())
503
+ return false;
504
+ const serverConfig = resolveCodeModeClientConfig(client);
505
+ const publicUrl = serverConfig.publicUrl ?? getEnv("INTEGRATE_PUBLIC_URL");
506
+ return !!publicUrl;
507
+ }
468
508
  function buildCodeModeTool(client, options) {
469
509
  const { tools, providerTokens, context, integrationIds } = options;
470
510
  const generated = generateCodeModeTypes(tools);
@@ -477,6 +517,7 @@ ${generated.source}
477
517
  \`\`\``;
478
518
  const execute = async ({ code }) => {
479
519
  const publicUrl = sandboxOverrides.publicUrl ?? serverCodeModeConfig.publicUrl ?? getEnv("INTEGRATE_PUBLIC_URL");
520
+ const apiKey = client.__oauthConfig?.apiKey;
480
521
  if (!publicUrl) {
481
522
  return {
482
523
  success: false,
@@ -491,6 +532,7 @@ ${generated.source}
491
532
  return executeSandboxCode({
492
533
  code,
493
534
  mcpUrl,
535
+ apiKey,
494
536
  providerTokens,
495
537
  context,
496
538
  integrationsHeader: integrationIds && integrationIds.length > 0 ? integrationIds.join(",") : undefined,
@@ -519,6 +561,7 @@ ${generated.source}
519
561
  }
520
562
  export {
521
563
  resolveCodeModeClientConfig,
564
+ canUseCodeMode,
522
565
  buildCodeModeTool,
523
566
  CODE_MODE_TOOL_NAME
524
567
  };
package/dist/index.js CHANGED
@@ -8943,6 +8943,7 @@ var init_type_generator = __esm(() => {
8943
8943
  var RUNTIME_STUB_SOURCE = `// runtime.mjs — generated by integrate-sdk code mode
8944
8944
  const MCP_URL = process.env.INTEGRATE_MCP_URL;
8945
8945
  const SESSION_TOKEN = process.env.INTEGRATE_SESSION_TOKEN;
8946
+ const API_KEY = process.env.INTEGRATE_API_KEY || '';
8946
8947
  const PROVIDER_TOKENS = process.env.INTEGRATE_PROVIDER_TOKENS || '';
8947
8948
  const INTEGRATIONS_HEADER = process.env.INTEGRATE_INTEGRATIONS || '';
8948
8949
  const CONTEXT_JSON = process.env.INTEGRATE_CONTEXT || '';
@@ -8961,6 +8962,7 @@ async function callTool(toolName, args) {
8961
8962
  'x-integrate-code-mode': '1',
8962
8963
  };
8963
8964
  if (SESSION_TOKEN) headers['Authorization'] = 'Bearer ' + SESSION_TOKEN;
8965
+ if (API_KEY) headers['x-integrate-api-key'] = API_KEY;
8964
8966
  if (PROVIDER_TOKENS) headers['x-integrate-tokens'] = PROVIDER_TOKENS;
8965
8967
  if (INTEGRATIONS_HEADER) headers['x-integrations'] = INTEGRATIONS_HEADER;
8966
8968
  if (CONTEXT_JSON) headers['x-integrate-context'] = CONTEXT_JSON;
@@ -9012,11 +9014,40 @@ export { callTool };
9012
9014
  // src/code-mode/executor.ts
9013
9015
  var exports_executor = {};
9014
9016
  __export(exports_executor, {
9017
+ isSandboxAvailable: () => isSandboxAvailable,
9015
9018
  executeSandboxCode: () => executeSandboxCode,
9019
+ __setSandboxUnavailableForTests: () => __setSandboxUnavailableForTests,
9016
9020
  __setSandboxFactoryForTests: () => __setSandboxFactoryForTests
9017
9021
  });
9018
9022
  function __setSandboxFactoryForTests(factory) {
9019
9023
  sandboxFactoryOverride = factory;
9024
+ _sandboxForcedUnavailableForTests = false;
9025
+ _sandboxAvailableCache = null;
9026
+ }
9027
+ function __setSandboxUnavailableForTests(force) {
9028
+ _sandboxForcedUnavailableForTests = force;
9029
+ _sandboxAvailableCache = null;
9030
+ }
9031
+ async function isSandboxAvailable() {
9032
+ if (_sandboxAvailableCache !== null)
9033
+ return _sandboxAvailableCache;
9034
+ if (_sandboxForcedUnavailableForTests) {
9035
+ _sandboxAvailableCache = false;
9036
+ return false;
9037
+ }
9038
+ if (sandboxFactoryOverride) {
9039
+ _sandboxAvailableCache = true;
9040
+ return true;
9041
+ }
9042
+ try {
9043
+ const dynamicImport = new Function("specifier", "return import(specifier)");
9044
+ await dynamicImport("@" + "vercel/sandbox");
9045
+ _sandboxAvailableCache = true;
9046
+ return true;
9047
+ } catch {
9048
+ _sandboxAvailableCache = false;
9049
+ return false;
9050
+ }
9020
9051
  }
9021
9052
  async function loadSandboxFactory() {
9022
9053
  if (sandboxFactoryOverride)
@@ -9103,6 +9134,8 @@ async function executeSandboxCode(options) {
9103
9134
  const env = {
9104
9135
  INTEGRATE_MCP_URL: options.mcpUrl
9105
9136
  };
9137
+ if (options.apiKey)
9138
+ env.INTEGRATE_API_KEY = options.apiKey;
9106
9139
  if (options.sessionToken)
9107
9140
  env.INTEGRATE_SESSION_TOKEN = options.sessionToken;
9108
9141
  if (options.providerTokens && Object.keys(options.providerTokens).length > 0) {
@@ -9145,7 +9178,7 @@ async function executeSandboxCode(options) {
9145
9178
  }
9146
9179
  }
9147
9180
  }
9148
- var sandboxFactoryOverride = null, RESULT_SENTINEL = "__INTEGRATE_RESULT__";
9181
+ var sandboxFactoryOverride = null, _sandboxAvailableCache = null, _sandboxForcedUnavailableForTests = false, RESULT_SENTINEL = "__INTEGRATE_RESULT__";
9149
9182
  var init_executor = () => {};
9150
9183
 
9151
9184
  // src/code-mode/tool-builder.ts
@@ -9153,6 +9186,13 @@ function resolveCodeModeClientConfig(client) {
9153
9186
  const oauthConfig = client.__oauthConfig;
9154
9187
  return oauthConfig?.codeMode ?? {};
9155
9188
  }
9189
+ async function canUseCodeMode(client) {
9190
+ if (!await isSandboxAvailable())
9191
+ return false;
9192
+ const serverConfig = resolveCodeModeClientConfig(client);
9193
+ const publicUrl = serverConfig.publicUrl ?? getEnv("INTEGRATE_PUBLIC_URL");
9194
+ return !!publicUrl;
9195
+ }
9156
9196
  function buildCodeModeTool(client, options) {
9157
9197
  const { tools, providerTokens, context, integrationIds } = options;
9158
9198
  const generated = generateCodeModeTypes(tools);
@@ -9165,6 +9205,7 @@ ${generated.source}
9165
9205
  \`\`\``;
9166
9206
  const execute = async ({ code }) => {
9167
9207
  const publicUrl = sandboxOverrides.publicUrl ?? serverCodeModeConfig.publicUrl ?? getEnv("INTEGRATE_PUBLIC_URL");
9208
+ const apiKey = client.__oauthConfig?.apiKey;
9168
9209
  if (!publicUrl) {
9169
9210
  return {
9170
9211
  success: false,
@@ -9179,6 +9220,7 @@ ${generated.source}
9179
9220
  return executeSandboxCode({
9180
9221
  code,
9181
9222
  mcpUrl,
9223
+ apiKey,
9182
9224
  providerTokens,
9183
9225
  context,
9184
9226
  integrationsHeader: integrationIds && integrationIds.length > 0 ? integrationIds.join(",") : undefined,
@@ -9256,8 +9298,8 @@ async function getVercelAITools(client, options) {
9256
9298
  await ensureClientConnected(client);
9257
9299
  const mcpTools = await client.getEnabledToolsAsync();
9258
9300
  const vercelTools = {};
9259
- const mode = options?.mode ?? "code";
9260
- if (mode === "code") {
9301
+ const effectiveMode = options?.mode !== undefined ? options.mode : await canUseCodeMode(client) ? "code" : "tools";
9302
+ if (effectiveMode === "code") {
9261
9303
  const codeTool = buildCodeModeTool(client, {
9262
9304
  tools: mcpTools,
9263
9305
  providerTokens,
@@ -10715,8 +10757,8 @@ async function getOpenAITools(client, options) {
10715
10757
  const finalOptions = providerTokens ? { ...options, providerTokens } : options;
10716
10758
  await ensureClientConnected(client);
10717
10759
  const mcpTools = await client.getEnabledToolsAsync();
10718
- const mode = options?.mode ?? "code";
10719
- const openaiTools = mode === "code" ? (() => {
10760
+ const effectiveMode = options?.mode !== undefined ? options.mode : await canUseCodeMode(client) ? "code" : "tools";
10761
+ const openaiTools = effectiveMode === "code" ? (() => {
10720
10762
  const codeTool = buildCodeModeTool(client, {
10721
10763
  tools: mcpTools,
10722
10764
  providerTokens,
@@ -10895,8 +10937,8 @@ async function getAnthropicTools(client, options) {
10895
10937
  const finalOptions = providerTokens ? { ...options, providerTokens } : options;
10896
10938
  await ensureClientConnected(client);
10897
10939
  const mcpTools = await client.getEnabledToolsAsync();
10898
- const mode = options?.mode ?? "code";
10899
- const anthropicTools = mode === "code" ? (() => {
10940
+ const effectiveMode = options?.mode !== undefined ? options.mode : await canUseCodeMode(client) ? "code" : "tools";
10941
+ const anthropicTools = effectiveMode === "code" ? (() => {
10900
10942
  const codeTool = buildCodeModeTool(client, {
10901
10943
  tools: mcpTools,
10902
10944
  providerTokens,
@@ -11084,9 +11126,9 @@ async function getGoogleTools(client, options) {
11084
11126
  const finalOptions = providerTokens ? { ...options, providerTokens } : options;
11085
11127
  await ensureClientConnected(client);
11086
11128
  const mcpTools = await client.getEnabledToolsAsync();
11087
- const mode = options?.mode ?? "code";
11129
+ const effectiveMode = options?.mode !== undefined ? options.mode : await canUseCodeMode(client) ? "code" : "tools";
11088
11130
  let googleTools;
11089
- if (mode === "code") {
11131
+ if (effectiveMode === "code") {
11090
11132
  const TypeEnum = await getGoogleType();
11091
11133
  const codeTool = buildCodeModeTool(client, {
11092
11134
  tools: mcpTools,
@@ -11633,6 +11675,24 @@ function createMCPServer(config) {
11633
11675
  } catch {}
11634
11676
  }
11635
11677
  }
11678
+ if (!authHeader && config.getProviderToken) {
11679
+ const codeModeHeader = webRequest.headers.get("x-integrate-code-mode");
11680
+ const contextHeader = webRequest.headers.get("x-integrate-context");
11681
+ const callbackApiKey = webRequest.headers.get("x-integrate-api-key");
11682
+ const toolName = typeof body?.name === "string" ? body.name : "";
11683
+ if (codeModeHeader === "1" && contextHeader && toolName && config.apiKey && callbackApiKey === config.apiKey) {
11684
+ try {
11685
+ const context2 = JSON.parse(contextHeader);
11686
+ const provider = toolName.split("_")[0];
11687
+ if (provider) {
11688
+ const tokenData = await config.getProviderToken(provider, undefined, context2);
11689
+ if (tokenData?.accessToken) {
11690
+ authHeader = `Bearer ${tokenData.accessToken}`;
11691
+ }
11692
+ }
11693
+ } catch {}
11694
+ }
11695
+ }
11636
11696
  const { OAuthHandler: OAuthHandler2 } = await Promise.resolve().then(() => (init_base_handler(), exports_base_handler));
11637
11697
  const oauthHandler = new OAuthHandler2({
11638
11698
  providers,
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,13 @@ function resolveCodeModeClientConfig(client) {
8987
9020
  const oauthConfig = client.__oauthConfig;
8988
9021
  return oauthConfig?.codeMode ?? {};
8989
9022
  }
9023
+ async function canUseCodeMode(client) {
9024
+ if (!await isSandboxAvailable())
9025
+ return false;
9026
+ const serverConfig = resolveCodeModeClientConfig(client);
9027
+ const publicUrl = serverConfig.publicUrl ?? getEnv("INTEGRATE_PUBLIC_URL");
9028
+ return !!publicUrl;
9029
+ }
8990
9030
  function buildCodeModeTool(client, options) {
8991
9031
  const { tools, providerTokens, context, integrationIds } = options;
8992
9032
  const generated = generateCodeModeTypes(tools);
@@ -8999,6 +9039,7 @@ ${generated.source}
8999
9039
  \`\`\``;
9000
9040
  const execute = async ({ code }) => {
9001
9041
  const publicUrl = sandboxOverrides.publicUrl ?? serverCodeModeConfig.publicUrl ?? getEnv("INTEGRATE_PUBLIC_URL");
9042
+ const apiKey = client.__oauthConfig?.apiKey;
9002
9043
  if (!publicUrl) {
9003
9044
  return {
9004
9045
  success: false,
@@ -9013,6 +9054,7 @@ ${generated.source}
9013
9054
  return executeSandboxCode({
9014
9055
  code,
9015
9056
  mcpUrl,
9057
+ apiKey,
9016
9058
  providerTokens,
9017
9059
  context,
9018
9060
  integrationsHeader: integrationIds && integrationIds.length > 0 ? integrationIds.join(",") : undefined,
@@ -9090,8 +9132,8 @@ async function getVercelAITools(client, options) {
9090
9132
  await ensureClientConnected(client);
9091
9133
  const mcpTools = await client.getEnabledToolsAsync();
9092
9134
  const vercelTools = {};
9093
- const mode = options?.mode ?? "code";
9094
- if (mode === "code") {
9135
+ const effectiveMode = options?.mode !== undefined ? options.mode : await canUseCodeMode(client) ? "code" : "tools";
9136
+ if (effectiveMode === "code") {
9095
9137
  const codeTool = buildCodeModeTool(client, {
9096
9138
  tools: mcpTools,
9097
9139
  providerTokens,
@@ -10549,8 +10591,8 @@ async function getOpenAITools(client, options) {
10549
10591
  const finalOptions = providerTokens ? { ...options, providerTokens } : options;
10550
10592
  await ensureClientConnected(client);
10551
10593
  const mcpTools = await client.getEnabledToolsAsync();
10552
- const mode = options?.mode ?? "code";
10553
- const openaiTools = mode === "code" ? (() => {
10594
+ const effectiveMode = options?.mode !== undefined ? options.mode : await canUseCodeMode(client) ? "code" : "tools";
10595
+ const openaiTools = effectiveMode === "code" ? (() => {
10554
10596
  const codeTool = buildCodeModeTool(client, {
10555
10597
  tools: mcpTools,
10556
10598
  providerTokens,
@@ -10729,8 +10771,8 @@ async function getAnthropicTools(client, options) {
10729
10771
  const finalOptions = providerTokens ? { ...options, providerTokens } : options;
10730
10772
  await ensureClientConnected(client);
10731
10773
  const mcpTools = await client.getEnabledToolsAsync();
10732
- const mode = options?.mode ?? "code";
10733
- const anthropicTools = mode === "code" ? (() => {
10774
+ const effectiveMode = options?.mode !== undefined ? options.mode : await canUseCodeMode(client) ? "code" : "tools";
10775
+ const anthropicTools = effectiveMode === "code" ? (() => {
10734
10776
  const codeTool = buildCodeModeTool(client, {
10735
10777
  tools: mcpTools,
10736
10778
  providerTokens,
@@ -10918,9 +10960,9 @@ async function getGoogleTools(client, options) {
10918
10960
  const finalOptions = providerTokens ? { ...options, providerTokens } : options;
10919
10961
  await ensureClientConnected(client);
10920
10962
  const mcpTools = await client.getEnabledToolsAsync();
10921
- const mode = options?.mode ?? "code";
10963
+ const effectiveMode = options?.mode !== undefined ? options.mode : await canUseCodeMode(client) ? "code" : "tools";
10922
10964
  let googleTools;
10923
- if (mode === "code") {
10965
+ if (effectiveMode === "code") {
10924
10966
  const TypeEnum = await getGoogleType();
10925
10967
  const codeTool = buildCodeModeTool(client, {
10926
10968
  tools: mcpTools,
@@ -11467,6 +11509,24 @@ function createMCPServer(config) {
11467
11509
  } catch {}
11468
11510
  }
11469
11511
  }
11512
+ if (!authHeader && config.getProviderToken) {
11513
+ const codeModeHeader = webRequest.headers.get("x-integrate-code-mode");
11514
+ const contextHeader = webRequest.headers.get("x-integrate-context");
11515
+ const callbackApiKey = webRequest.headers.get("x-integrate-api-key");
11516
+ const toolName = typeof body?.name === "string" ? body.name : "";
11517
+ if (codeModeHeader === "1" && contextHeader && toolName && config.apiKey && callbackApiKey === config.apiKey) {
11518
+ try {
11519
+ const context2 = JSON.parse(contextHeader);
11520
+ const provider = toolName.split("_")[0];
11521
+ if (provider) {
11522
+ const tokenData = await config.getProviderToken(provider, undefined, context2);
11523
+ if (tokenData?.accessToken) {
11524
+ authHeader = `Bearer ${tokenData.accessToken}`;
11525
+ }
11526
+ }
11527
+ } catch {}
11528
+ }
11529
+ }
11470
11530
  const { OAuthHandler: OAuthHandler2 } = await Promise.resolve().then(() => (init_base_handler(), exports_base_handler));
11471
11531
  const oauthHandler = new OAuthHandler2({
11472
11532
  providers,