integrate-sdk 0.9.4-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 (55) hide show
  1. package/dist/adapters/auto-routes.js +76 -16
  2. package/dist/adapters/index.js +76 -16
  3. package/dist/adapters/nextjs.js +76 -16
  4. package/dist/adapters/node.js +76 -16
  5. package/dist/adapters/svelte-kit.js +76 -16
  6. package/dist/adapters/tanstack-start.js +76 -16
  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 +45 -9
  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 +45 -9
  13. package/dist/ai/index.js +51 -15
  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 +45 -9
  17. package/dist/ai/trigger-tools.d.ts +7 -7
  18. package/dist/ai/trigger-tools.js +7 -7
  19. package/dist/ai/vercel-ai.d.ts +2 -2
  20. package/dist/ai/vercel-ai.d.ts.map +1 -1
  21. package/dist/ai/vercel-ai.js +45 -9
  22. package/dist/code-mode/executor.d.ts +5 -0
  23. package/dist/code-mode/executor.d.ts.map +1 -1
  24. package/dist/code-mode/executor.js +35 -0
  25. package/dist/code-mode/index.d.ts +1 -1
  26. package/dist/code-mode/index.d.ts.map +1 -1
  27. package/dist/code-mode/index.js +43 -0
  28. package/dist/code-mode/runtime-stub.d.ts +1 -1
  29. package/dist/code-mode/runtime-stub.d.ts.map +1 -1
  30. package/dist/code-mode/runtime-stub.js +2 -0
  31. package/dist/code-mode/tool-builder.d.ts +1 -0
  32. package/dist/code-mode/tool-builder.d.ts.map +1 -1
  33. package/dist/code-mode/tool-builder.js +43 -0
  34. package/dist/index.js +76 -16
  35. package/dist/oauth.js +76 -16
  36. package/dist/server.js +76 -16
  37. package/dist/src/ai/anthropic.d.ts +2 -2
  38. package/dist/src/ai/anthropic.d.ts.map +1 -1
  39. package/dist/src/ai/google.d.ts +2 -2
  40. package/dist/src/ai/google.d.ts.map +1 -1
  41. package/dist/src/ai/openai.d.ts +2 -2
  42. package/dist/src/ai/openai.d.ts.map +1 -1
  43. package/dist/src/ai/trigger-tools.d.ts +7 -7
  44. package/dist/src/ai/vercel-ai.d.ts +2 -2
  45. package/dist/src/ai/vercel-ai.d.ts.map +1 -1
  46. package/dist/src/code-mode/executor.d.ts +5 -0
  47. package/dist/src/code-mode/executor.d.ts.map +1 -1
  48. package/dist/src/code-mode/index.d.ts +1 -1
  49. package/dist/src/code-mode/index.d.ts.map +1 -1
  50. package/dist/src/code-mode/runtime-stub.d.ts +1 -1
  51. package/dist/src/code-mode/runtime-stub.d.ts.map +1 -1
  52. package/dist/src/code-mode/tool-builder.d.ts +1 -0
  53. package/dist/src/code-mode/tool-builder.d.ts.map +1 -1
  54. package/dist/src/server.d.ts.map +1 -1
  55. package/package.json +3 -6
@@ -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;AAQpB;;;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,gCA0D/B"}
@@ -4251,7 +4251,7 @@ function calculateHasMore(offset, returnedCount, total) {
4251
4251
  function createTriggerTools(config, context) {
4252
4252
  const { callbacks } = config;
4253
4253
  return {
4254
- create_trigger: {
4254
+ trigger_create: {
4255
4255
  description: "Schedule a tool to run at a specific time or on a recurring schedule. Use this when the user wants to do something later.",
4256
4256
  inputSchema: exports_external.object({
4257
4257
  name: exports_external.string().optional().describe("Human-readable trigger name"),
@@ -4285,7 +4285,7 @@ function createTriggerTools(config, context) {
4285
4285
  return callbacks.create(trigger, context);
4286
4286
  }
4287
4287
  },
4288
- list_triggers: {
4288
+ trigger_list: {
4289
4289
  description: "List all scheduled triggers with optional filtering by status or tool name",
4290
4290
  inputSchema: exports_external.object({
4291
4291
  status: exports_external.enum(["active", "paused", "completed", "failed"]).optional().describe("Filter by trigger status"),
@@ -4309,7 +4309,7 @@ function createTriggerTools(config, context) {
4309
4309
  };
4310
4310
  }
4311
4311
  },
4312
- get_trigger: {
4312
+ trigger_get: {
4313
4313
  description: "Get details of a specific trigger by its ID",
4314
4314
  inputSchema: exports_external.object({
4315
4315
  triggerId: exports_external.string().describe("The trigger ID to retrieve")
@@ -4322,7 +4322,7 @@ function createTriggerTools(config, context) {
4322
4322
  return trigger;
4323
4323
  }
4324
4324
  },
4325
- update_trigger: {
4325
+ trigger_update: {
4326
4326
  description: "Update a trigger's properties like name, description, arguments, or schedule",
4327
4327
  inputSchema: exports_external.object({
4328
4328
  triggerId: exports_external.string().describe("The trigger ID to update"),
@@ -4349,7 +4349,7 @@ function createTriggerTools(config, context) {
4349
4349
  return callbacks.update(triggerId, updatesWithTimestamp, context);
4350
4350
  }
4351
4351
  },
4352
- delete_trigger: {
4352
+ trigger_delete: {
4353
4353
  description: "Delete a trigger permanently. This cannot be undone.",
4354
4354
  inputSchema: exports_external.object({
4355
4355
  triggerId: exports_external.string().describe("The trigger ID to delete")
@@ -4359,7 +4359,7 @@ function createTriggerTools(config, context) {
4359
4359
  return { success: true, message: `Trigger ${args.triggerId} deleted` };
4360
4360
  }
4361
4361
  },
4362
- pause_trigger: {
4362
+ trigger_pause: {
4363
4363
  description: "Pause a trigger to temporarily stop it from executing. Can be resumed later.",
4364
4364
  inputSchema: exports_external.object({
4365
4365
  triggerId: exports_external.string().describe("The trigger ID to pause")
@@ -4379,7 +4379,7 @@ function createTriggerTools(config, context) {
4379
4379
  }, context);
4380
4380
  }
4381
4381
  },
4382
- resume_trigger: {
4382
+ trigger_resume: {
4383
4383
  description: "Resume a paused trigger to start executing it again on schedule",
4384
4384
  inputSchema: exports_external.object({
4385
4385
  triggerId: exports_external.string().describe("The trigger ID to resume")
@@ -4621,6 +4621,7 @@ function pascalCase(id) {
4621
4621
  var RUNTIME_STUB_SOURCE = `// runtime.mjs — generated by integrate-sdk code mode
4622
4622
  const MCP_URL = process.env.INTEGRATE_MCP_URL;
4623
4623
  const SESSION_TOKEN = process.env.INTEGRATE_SESSION_TOKEN;
4624
+ const API_KEY = process.env.INTEGRATE_API_KEY || '';
4624
4625
  const PROVIDER_TOKENS = process.env.INTEGRATE_PROVIDER_TOKENS || '';
4625
4626
  const INTEGRATIONS_HEADER = process.env.INTEGRATE_INTEGRATIONS || '';
4626
4627
  const CONTEXT_JSON = process.env.INTEGRATE_CONTEXT || '';
@@ -4639,6 +4640,7 @@ async function callTool(toolName, args) {
4639
4640
  'x-integrate-code-mode': '1',
4640
4641
  };
4641
4642
  if (SESSION_TOKEN) headers['Authorization'] = 'Bearer ' + SESSION_TOKEN;
4643
+ if (API_KEY) headers['x-integrate-api-key'] = API_KEY;
4642
4644
  if (PROVIDER_TOKENS) headers['x-integrate-tokens'] = PROVIDER_TOKENS;
4643
4645
  if (INTEGRATIONS_HEADER) headers['x-integrations'] = INTEGRATIONS_HEADER;
4644
4646
  if (CONTEXT_JSON) headers['x-integrate-context'] = CONTEXT_JSON;
@@ -4689,6 +4691,29 @@ export { callTool };
4689
4691
 
4690
4692
  // ../code-mode/executor.ts
4691
4693
  var sandboxFactoryOverride = null;
4694
+ var _sandboxAvailableCache = null;
4695
+ var _sandboxForcedUnavailableForTests = false;
4696
+ async function isSandboxAvailable() {
4697
+ if (_sandboxAvailableCache !== null)
4698
+ return _sandboxAvailableCache;
4699
+ if (_sandboxForcedUnavailableForTests) {
4700
+ _sandboxAvailableCache = false;
4701
+ return false;
4702
+ }
4703
+ if (sandboxFactoryOverride) {
4704
+ _sandboxAvailableCache = true;
4705
+ return true;
4706
+ }
4707
+ try {
4708
+ const dynamicImport = new Function("specifier", "return import(specifier)");
4709
+ await dynamicImport("@" + "vercel/sandbox");
4710
+ _sandboxAvailableCache = true;
4711
+ return true;
4712
+ } catch {
4713
+ _sandboxAvailableCache = false;
4714
+ return false;
4715
+ }
4716
+ }
4692
4717
  async function loadSandboxFactory() {
4693
4718
  if (sandboxFactoryOverride)
4694
4719
  return sandboxFactoryOverride;
@@ -4775,6 +4800,8 @@ async function executeSandboxCode(options) {
4775
4800
  const env = {
4776
4801
  INTEGRATE_MCP_URL: options.mcpUrl
4777
4802
  };
4803
+ if (options.apiKey)
4804
+ env.INTEGRATE_API_KEY = options.apiKey;
4778
4805
  if (options.sessionToken)
4779
4806
  env.INTEGRATE_SESSION_TOKEN = options.sessionToken;
4780
4807
  if (options.providerTokens && Object.keys(options.providerTokens).length > 0) {
@@ -4866,6 +4893,13 @@ function resolveCodeModeClientConfig(client) {
4866
4893
  const oauthConfig = client.__oauthConfig;
4867
4894
  return oauthConfig?.codeMode ?? {};
4868
4895
  }
4896
+ async function canUseCodeMode(client) {
4897
+ if (!await isSandboxAvailable())
4898
+ return false;
4899
+ const serverConfig = resolveCodeModeClientConfig(client);
4900
+ const publicUrl = serverConfig.publicUrl ?? getEnv("INTEGRATE_PUBLIC_URL");
4901
+ return !!publicUrl;
4902
+ }
4869
4903
  function buildCodeModeTool(client, options) {
4870
4904
  const { tools, providerTokens, context, integrationIds } = options;
4871
4905
  const generated = generateCodeModeTypes(tools);
@@ -4878,6 +4912,7 @@ ${generated.source}
4878
4912
  \`\`\``;
4879
4913
  const execute = async ({ code }) => {
4880
4914
  const publicUrl = sandboxOverrides.publicUrl ?? serverCodeModeConfig.publicUrl ?? getEnv("INTEGRATE_PUBLIC_URL");
4915
+ const apiKey = client.__oauthConfig?.apiKey;
4881
4916
  if (!publicUrl) {
4882
4917
  return {
4883
4918
  success: false,
@@ -4892,6 +4927,7 @@ ${generated.source}
4892
4927
  return executeSandboxCode({
4893
4928
  code,
4894
4929
  mcpUrl,
4930
+ apiKey,
4895
4931
  providerTokens,
4896
4932
  context,
4897
4933
  integrationsHeader: integrationIds && integrationIds.length > 0 ? integrationIds.join(",") : undefined,
@@ -4943,8 +4979,8 @@ async function getVercelAITools(client, options) {
4943
4979
  await ensureClientConnected(client);
4944
4980
  const mcpTools = await client.getEnabledToolsAsync();
4945
4981
  const vercelTools = {};
4946
- const mode = options?.mode ?? "code";
4947
- if (mode === "code") {
4982
+ const effectiveMode = options?.mode !== undefined ? options.mode : await canUseCodeMode(client) ? "code" : "tools";
4983
+ if (effectiveMode === "code") {
4948
4984
  const codeTool = buildCodeModeTool(client, {
4949
4985
  tools: mcpTools,
4950
4986
  providerTokens,
@@ -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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"}
@@ -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;
@@ -70,8 +72,37 @@ export { callTool };
70
72
 
71
73
  // executor.ts
72
74
  var sandboxFactoryOverride = null;
75
+ var _sandboxAvailableCache = null;
76
+ var _sandboxForcedUnavailableForTests = false;
73
77
  function __setSandboxFactoryForTests(factory) {
74
78
  sandboxFactoryOverride = factory;
79
+ _sandboxForcedUnavailableForTests = false;
80
+ _sandboxAvailableCache = null;
81
+ }
82
+ function __setSandboxUnavailableForTests(force) {
83
+ _sandboxForcedUnavailableForTests = force;
84
+ _sandboxAvailableCache = null;
85
+ }
86
+ async function isSandboxAvailable() {
87
+ if (_sandboxAvailableCache !== null)
88
+ return _sandboxAvailableCache;
89
+ if (_sandboxForcedUnavailableForTests) {
90
+ _sandboxAvailableCache = false;
91
+ return false;
92
+ }
93
+ if (sandboxFactoryOverride) {
94
+ _sandboxAvailableCache = true;
95
+ return true;
96
+ }
97
+ try {
98
+ const dynamicImport = new Function("specifier", "return import(specifier)");
99
+ await dynamicImport("@" + "vercel/sandbox");
100
+ _sandboxAvailableCache = true;
101
+ return true;
102
+ } catch {
103
+ _sandboxAvailableCache = false;
104
+ return false;
105
+ }
75
106
  }
76
107
  async function loadSandboxFactory() {
77
108
  if (sandboxFactoryOverride)
@@ -159,6 +190,8 @@ async function executeSandboxCode(options) {
159
190
  const env = {
160
191
  INTEGRATE_MCP_URL: options.mcpUrl
161
192
  };
193
+ if (options.apiKey)
194
+ env.INTEGRATE_API_KEY = options.apiKey;
162
195
  if (options.sessionToken)
163
196
  env.INTEGRATE_SESSION_TOKEN = options.sessionToken;
164
197
  if (options.providerTokens && Object.keys(options.providerTokens).length > 0) {
@@ -202,6 +235,8 @@ async function executeSandboxCode(options) {
202
235
  }
203
236
  }
204
237
  export {
238
+ isSandboxAvailable,
205
239
  executeSandboxCode,
240
+ __setSandboxUnavailableForTests,
206
241
  __setSandboxFactoryForTests
207
242
  };
@@ -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"}
@@ -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
  };