integrate-sdk 0.9.56 → 0.9.61

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 (56) hide show
  1. package/dist/adapters/index.js +80 -35
  2. package/dist/adapters/solid-start.js +80 -35
  3. package/dist/adapters/svelte-kit.js +80 -35
  4. package/dist/ai/anthropic.d.ts.map +1 -1
  5. package/dist/ai/anthropic.js +11 -2
  6. package/dist/ai/google.d.ts.map +1 -1
  7. package/dist/ai/google.js +11 -2
  8. package/dist/ai/index.js +93 -7
  9. package/dist/ai/openai.d.ts.map +1 -1
  10. package/dist/ai/openai.js +11 -2
  11. package/dist/ai/tool-cache.d.ts +50 -0
  12. package/dist/ai/tool-cache.d.ts.map +1 -0
  13. package/dist/ai/utils.d.ts +26 -0
  14. package/dist/ai/utils.d.ts.map +1 -1
  15. package/dist/ai/utils.js +10 -0
  16. package/dist/ai/vercel-ai.d.ts.map +1 -1
  17. package/dist/ai/vercel-ai.js +87 -1
  18. package/dist/database/index.d.ts +1 -1
  19. package/dist/database/index.d.ts.map +1 -1
  20. package/dist/database/index.js +39 -0
  21. package/dist/index.js +142 -32
  22. package/dist/integrations.js +142 -32
  23. package/dist/react.d.ts +2 -2
  24. package/dist/react.d.ts.map +1 -1
  25. package/dist/react.js +86 -0
  26. package/dist/server.js +578 -189
  27. package/dist/src/ai/anthropic.d.ts.map +1 -1
  28. package/dist/src/ai/google.d.ts.map +1 -1
  29. package/dist/src/ai/openai.d.ts.map +1 -1
  30. package/dist/src/ai/tool-cache.d.ts +50 -0
  31. package/dist/src/ai/tool-cache.d.ts.map +1 -0
  32. package/dist/src/ai/utils.d.ts +26 -0
  33. package/dist/src/ai/utils.d.ts.map +1 -1
  34. package/dist/src/ai/vercel-ai.d.ts.map +1 -1
  35. package/dist/src/client.d.ts +5 -5
  36. package/dist/src/client.d.ts.map +1 -1
  37. package/dist/src/config/types.d.ts +30 -0
  38. package/dist/src/config/types.d.ts.map +1 -1
  39. package/dist/src/database/index.d.ts +1 -1
  40. package/dist/src/database/index.d.ts.map +1 -1
  41. package/dist/src/database/token-store.d.ts +10 -0
  42. package/dist/src/database/token-store.d.ts.map +1 -1
  43. package/dist/src/index.d.ts +1 -0
  44. package/dist/src/index.d.ts.map +1 -1
  45. package/dist/src/integrations/bundle.d.ts +18 -0
  46. package/dist/src/integrations/bundle.d.ts.map +1 -0
  47. package/dist/src/react/hooks.d.ts +16 -0
  48. package/dist/src/react/hooks.d.ts.map +1 -1
  49. package/dist/src/server.d.ts +13 -1
  50. package/dist/src/server.d.ts.map +1 -1
  51. package/dist/src/utils/normalize-tool-name.d.ts +14 -0
  52. package/dist/src/utils/normalize-tool-name.d.ts.map +1 -0
  53. package/dist/src/utils/parse-tool-result.d.ts +23 -0
  54. package/dist/src/utils/parse-tool-result.d.ts.map +1 -0
  55. package/package.json +1 -1
  56. package/react.ts +10 -2
package/dist/ai/index.js CHANGED
@@ -4060,6 +4060,15 @@ async function tryGetProviderTokens(manualTokens) {
4060
4060
  }
4061
4061
 
4062
4062
  // utils.ts
4063
+ function toEnabledToolsAsyncOptions(options) {
4064
+ if (!options)
4065
+ return;
4066
+ const { integrationIds, connectedOnly, context, fetchConcurrency } = options;
4067
+ if (integrationIds === undefined && connectedOnly === undefined && context === undefined && fetchConcurrency === undefined) {
4068
+ return;
4069
+ }
4070
+ return { integrationIds, connectedOnly, context, fetchConcurrency };
4071
+ }
4063
4072
  function getProviderForTool(client, toolName) {
4064
4073
  return client.getProviderForTool?.(toolName);
4065
4074
  }
@@ -5141,7 +5150,7 @@ async function handleAnthropicToolCalls(client, messageContent, options) {
5141
5150
  const getCodeModeTool = async () => {
5142
5151
  if (cachedCodeModeTool)
5143
5152
  return cachedCodeModeTool;
5144
- const mcpTools = await client.getEnabledToolsAsync();
5153
+ const mcpTools = await client.getEnabledToolsAsync(toEnabledToolsAsyncOptions(options));
5145
5154
  cachedCodeModeTool = buildCodeModeTool(client, {
5146
5155
  tools: mcpTools,
5147
5156
  providerTokens: options?.providerTokens,
@@ -5192,7 +5201,7 @@ async function getAnthropicTools(client, options) {
5192
5201
  }
5193
5202
  const finalOptions = providerTokens ? { ...options, providerTokens } : options;
5194
5203
  await ensureClientConnected(client);
5195
- const mcpTools = await client.getEnabledToolsAsync();
5204
+ const mcpTools = await client.getEnabledToolsAsync(toEnabledToolsAsyncOptions(options));
5196
5205
  let effectiveMode;
5197
5206
  if (options?.mode !== undefined) {
5198
5207
  effectiveMode = options.mode;
@@ -5359,7 +5368,7 @@ async function executeGoogleFunctionCalls(client, functionCalls, options) {
5359
5368
  const getCodeModeTool = async () => {
5360
5369
  if (cachedCodeModeTool)
5361
5370
  return cachedCodeModeTool;
5362
- const mcpTools = await client.getEnabledToolsAsync();
5371
+ const mcpTools = await client.getEnabledToolsAsync(toEnabledToolsAsyncOptions(options));
5363
5372
  cachedCodeModeTool = buildCodeModeTool(client, {
5364
5373
  tools: mcpTools,
5365
5374
  providerTokens: finalOptions?.providerTokens,
@@ -5398,7 +5407,7 @@ async function getGoogleTools(client, options) {
5398
5407
  }
5399
5408
  const finalOptions = providerTokens ? { ...options, providerTokens } : options;
5400
5409
  await ensureClientConnected(client);
5401
- const mcpTools = await client.getEnabledToolsAsync();
5410
+ const mcpTools = await client.getEnabledToolsAsync(toEnabledToolsAsyncOptions(options));
5402
5411
  let effectiveMode;
5403
5412
  if (options?.mode !== undefined) {
5404
5413
  effectiveMode = options.mode;
@@ -5525,6 +5534,69 @@ function convertJsonSchemaToGoogleSchema(jsonSchema, TypeEnum) {
5525
5534
  return result;
5526
5535
  }
5527
5536
 
5537
+ // ../database/token-store.ts
5538
+ var USABLE_ACCESS_TOKEN_BUFFER_MS = 30 * 1000;
5539
+ var MIN_MEANINGFUL_EXPIRY_MS = Date.UTC(2000, 0, 1);
5540
+ async function listConnectedProviders(configuredIntegrationIds, getProviderToken, context) {
5541
+ if (!context.userId || configuredIntegrationIds.length === 0) {
5542
+ return [];
5543
+ }
5544
+ const connected = [];
5545
+ await Promise.all(configuredIntegrationIds.map(async (provider) => {
5546
+ try {
5547
+ const token = await getProviderToken(provider, undefined, context);
5548
+ if (token?.accessToken || typeof token?.refreshToken === "string" && token.refreshToken.length > 0) {
5549
+ connected.push(provider);
5550
+ }
5551
+ } catch {}
5552
+ }));
5553
+ return connected.sort();
5554
+ }
5555
+
5556
+ // tool-cache.ts
5557
+ function buildToolDiscoveryCacheKey(userId, connectedIntegrationIds) {
5558
+ const sorted = [...connectedIntegrationIds].sort().join(",");
5559
+ return `${userId}:${sorted}`;
5560
+ }
5561
+ async function resolveToolDiscoveryCacheKey(client, context, options) {
5562
+ const userId = context.userId;
5563
+ if (!userId)
5564
+ return;
5565
+ const configuredIds = (client.integrations ?? []).map((i) => i.id);
5566
+ let targetIds;
5567
+ if (options?.integrationIds?.length) {
5568
+ targetIds = options.integrationIds;
5569
+ } else if (options?.connectedOnly) {
5570
+ targetIds = await listConnectedProviders(configuredIds, (provider, email, ctx) => client.getProviderToken(provider, email, ctx), context);
5571
+ } else {
5572
+ targetIds = configuredIds;
5573
+ }
5574
+ return buildToolDiscoveryCacheKey(userId, targetIds);
5575
+ }
5576
+ function stubsFromTools(tools) {
5577
+ return tools.map((t) => ({
5578
+ name: t.name,
5579
+ description: t.description,
5580
+ inputSchema: t.inputSchema
5581
+ }));
5582
+ }
5583
+ function applyToolDiscoveryCache(client, stubs) {
5584
+ client.hydrateToolCache(stubs);
5585
+ }
5586
+ async function persistToolDiscoveryCache(client, cache, cacheKey, ttlMs) {
5587
+ const tools = client.getAvailableTools();
5588
+ if (tools.length === 0)
5589
+ return;
5590
+ await cache.set(cacheKey, stubsFromTools(tools), ttlMs);
5591
+ }
5592
+ async function warmToolDiscoveryFromCache(client, cache, cacheKey) {
5593
+ const stubs = await cache.get(cacheKey);
5594
+ if (!stubs || stubs.length === 0)
5595
+ return false;
5596
+ applyToolDiscoveryCache(client, stubs);
5597
+ return true;
5598
+ }
5599
+
5528
5600
  // vercel-ai.ts
5529
5601
  function convertMCPToolToVercelAI(mcpTool, client, options) {
5530
5602
  return {
@@ -5547,7 +5619,21 @@ async function getVercelAITools(client, options) {
5547
5619
  }
5548
5620
  const finalOptions = providerTokens ? { ...options, providerTokens } : options;
5549
5621
  await ensureClientConnected(client);
5550
- const mcpTools = await client.getEnabledToolsAsync();
5622
+ const cacheConfig = options?.cache;
5623
+ let cacheKey;
5624
+ if (cacheConfig?.cache && options?.context) {
5625
+ cacheKey = await resolveToolDiscoveryCacheKey(client, options.context, {
5626
+ integrationIds: options.integrationIds,
5627
+ connectedOnly: options.connectedOnly
5628
+ });
5629
+ if (cacheKey) {
5630
+ await warmToolDiscoveryFromCache(client, cacheConfig.cache, cacheKey);
5631
+ }
5632
+ }
5633
+ const mcpTools = await client.getEnabledToolsAsync(toEnabledToolsAsyncOptions(options));
5634
+ if (cacheConfig?.cache && cacheKey) {
5635
+ await persistToolDiscoveryCache(client, cacheConfig.cache, cacheKey, cacheConfig.ttlMs);
5636
+ }
5551
5637
  const vercelTools = {};
5552
5638
  let effectiveMode;
5553
5639
  if (options?.mode !== undefined) {
@@ -5616,7 +5702,7 @@ async function getOpenAITools(client, options) {
5616
5702
  }
5617
5703
  const finalOptions = providerTokens ? { ...options, providerTokens } : options;
5618
5704
  await ensureClientConnected(client);
5619
- const mcpTools = await client.getEnabledToolsAsync();
5705
+ const mcpTools = await client.getEnabledToolsAsync(toEnabledToolsAsyncOptions(options));
5620
5706
  let effectiveMode;
5621
5707
  if (options?.mode !== undefined) {
5622
5708
  effectiveMode = options.mode;
@@ -5678,7 +5764,7 @@ async function handleOpenAIToolCalls(client, toolCalls, options) {
5678
5764
  const getCodeModeTool = async () => {
5679
5765
  if (cachedCodeModeTool)
5680
5766
  return cachedCodeModeTool;
5681
- const mcpTools = await client.getEnabledToolsAsync();
5767
+ const mcpTools = await client.getEnabledToolsAsync(toEnabledToolsAsyncOptions(options));
5682
5768
  cachedCodeModeTool = buildCodeModeTool(client, {
5683
5769
  tools: mcpTools,
5684
5770
  providerTokens: options?.providerTokens,
@@ -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;AAUjH,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,CAiFvB;AA6GD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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,EAA8B,MAAM,YAAY,CAAC;AAU7I,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,CAiFvB;AA6GD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
package/dist/ai/openai.js CHANGED
@@ -4060,6 +4060,15 @@ async function tryGetProviderTokens(manualTokens) {
4060
4060
  }
4061
4061
 
4062
4062
  // utils.ts
4063
+ function toEnabledToolsAsyncOptions(options) {
4064
+ if (!options)
4065
+ return;
4066
+ const { integrationIds, connectedOnly, context, fetchConcurrency } = options;
4067
+ if (integrationIds === undefined && connectedOnly === undefined && context === undefined && fetchConcurrency === undefined) {
4068
+ return;
4069
+ }
4070
+ return { integrationIds, connectedOnly, context, fetchConcurrency };
4071
+ }
4063
4072
  function getProviderForTool(client, toolName) {
4064
4073
  return client.getProviderForTool?.(toolName);
4065
4074
  }
@@ -5141,7 +5150,7 @@ async function getOpenAITools(client, options) {
5141
5150
  }
5142
5151
  const finalOptions = providerTokens ? { ...options, providerTokens } : options;
5143
5152
  await ensureClientConnected(client);
5144
- const mcpTools = await client.getEnabledToolsAsync();
5153
+ const mcpTools = await client.getEnabledToolsAsync(toEnabledToolsAsyncOptions(options));
5145
5154
  let effectiveMode;
5146
5155
  if (options?.mode !== undefined) {
5147
5156
  effectiveMode = options.mode;
@@ -5203,7 +5212,7 @@ async function handleOpenAIToolCalls(client, toolCalls, options) {
5203
5212
  const getCodeModeTool = async () => {
5204
5213
  if (cachedCodeModeTool)
5205
5214
  return cachedCodeModeTool;
5206
- const mcpTools = await client.getEnabledToolsAsync();
5215
+ const mcpTools = await client.getEnabledToolsAsync(toEnabledToolsAsyncOptions(options));
5207
5216
  cachedCodeModeTool = buildCodeModeTool(client, {
5208
5217
  tools: mcpTools,
5209
5218
  providerTokens: options?.providerTokens,
@@ -0,0 +1,50 @@
1
+ import type { MCPClient } from "../client.js";
2
+ import type { MCPTool } from "../protocol/messages.js";
3
+ import type { MCPContext } from "../config/types.js";
4
+ /** Serializable MCP tool metadata for cross-request / Redis caching. */
5
+ export type ToolMetadataStub = Pick<MCPTool, "name" | "description" | "inputSchema">;
6
+ export interface ToolDiscoveryCacheAdapter {
7
+ get(key: string): Promise<ToolMetadataStub[] | null>;
8
+ set(key: string, stubs: ToolMetadataStub[], ttlMs?: number): Promise<void>;
9
+ /** Invalidate all keys for a user (prefix match) or a single key when exact. */
10
+ invalidate(userIdOrKey: string): Promise<void>;
11
+ }
12
+ export interface ToolDiscoveryCacheOptions {
13
+ cache: ToolDiscoveryCacheAdapter;
14
+ /** @default 5 minutes */
15
+ ttlMs?: number;
16
+ }
17
+ /**
18
+ * Build a cache key from user id and connected integration ids.
19
+ * Include connected providers so reconnecting OAuth invalidates stale tool lists.
20
+ */
21
+ export declare function buildToolDiscoveryCacheKey(userId: string, connectedIntegrationIds: readonly string[]): string;
22
+ /**
23
+ * In-memory tool discovery cache (single process). Use Redis in production serverless.
24
+ */
25
+ export declare function createMemoryToolDiscoveryCache(): ToolDiscoveryCacheAdapter;
26
+ /**
27
+ * Hook for database adapter `onTokenChange` — invalidates cached tool metadata for the user.
28
+ */
29
+ export declare function createToolDiscoveryCacheInvalidator(cache: ToolDiscoveryCacheAdapter): (event: {
30
+ userId: string;
31
+ }) => void;
32
+ export declare function resolveToolDiscoveryCacheKey(client: MCPClient<any>, context: MCPContext, options?: {
33
+ integrationIds?: string[];
34
+ connectedOnly?: boolean;
35
+ }): Promise<string | undefined>;
36
+ export declare function stubsFromTools(tools: readonly MCPTool[]): ToolMetadataStub[];
37
+ /**
38
+ * Hydrate the client tool cache from persisted stubs (serverless cold start).
39
+ */
40
+ export declare function applyToolDiscoveryCache(client: MCPClient<any>, stubs: readonly ToolMetadataStub[]): void;
41
+ /**
42
+ * Persist current client tool metadata to a cache adapter.
43
+ */
44
+ export declare function persistToolDiscoveryCache(client: MCPClient<any>, cache: ToolDiscoveryCacheAdapter, cacheKey: string, ttlMs?: number): Promise<void>;
45
+ /**
46
+ * Load stubs from cache into the client before tool discovery.
47
+ * @returns true when cache was hydrated
48
+ */
49
+ export declare function warmToolDiscoveryFromCache(client: MCPClient<any>, cache: ToolDiscoveryCacheAdapter, cacheKey: string): Promise<boolean>;
50
+ //# sourceMappingURL=tool-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-cache.d.ts","sourceRoot":"","sources":["../../../src/ai/tool-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGrD,wEAAwE;AACxE,MAAM,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,GAAG,aAAa,CAAC,CAAC;AAErF,MAAM,WAAW,yBAAyB;IACxC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,GAAG,IAAI,CAAC,CAAC;IACrD,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,EAAE,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3E,gFAAgF;IAChF,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAChD;AAED,MAAM,WAAW,yBAAyB;IACxC,KAAK,EAAE,yBAAyB,CAAC;IACjC,yBAAyB;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,MAAM,EACd,uBAAuB,EAAE,SAAS,MAAM,EAAE,GACzC,MAAM,CAGR;AAED;;GAEG;AACH,wBAAgB,8BAA8B,IAAI,yBAAyB,CAwB1E;AAED;;GAEG;AACH,wBAAgB,mCAAmC,CACjD,KAAK,EAAE,yBAAyB,GAC/B,CAAC,KAAK,EAAE;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,KAAK,IAAI,CAIrC;AAED,wBAAsB,4BAA4B,CAChD,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,OAAO,EAAE,UAAU,EACnB,OAAO,CAAC,EAAE;IACR,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,GACA,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAuB7B;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,SAAS,OAAO,EAAE,GAAG,gBAAgB,EAAE,CAM5E;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,KAAK,EAAE,SAAS,gBAAgB,EAAE,GACjC,IAAI,CAEN;AAED;;GAEG;AACH,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,KAAK,EAAE,yBAAyB,EAChC,QAAQ,EAAE,MAAM,EAChB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAIf;AAED;;;GAGG;AACH,wBAAsB,0BAA0B,CAC9C,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,KAAK,EAAE,yBAAyB,EAChC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,OAAO,CAAC,CAKlB"}
@@ -5,6 +5,8 @@
5
5
  */
6
6
  import { z } from "zod";
7
7
  import type { MCPClient } from "../client.js";
8
+ import type { MCPContext } from "../config/types.js";
9
+ import type { EnabledToolsAsyncOptions } from "../config/types.js";
8
10
  /**
9
11
  * Options for AI provider tool conversions
10
12
  */
@@ -38,7 +40,31 @@ export interface AIToolsOptions {
38
40
  * ```
39
41
  */
40
42
  providerTokens?: Record<string, string>;
43
+ /**
44
+ * Limit tool discovery to specific integration IDs (e.g. `['github', 'gmail']`).
45
+ * Only `list_tools_by_integration` calls for these integrations are made.
46
+ */
47
+ integrationIds?: string[];
48
+ /**
49
+ * When true with `context.userId`, only fetch tools for integrations the user
50
+ * has OAuth tokens for (via `getProviderToken` / database adapter).
51
+ */
52
+ connectedOnly?: boolean;
53
+ /** User context for connected-only filtering and multi-tenant token lookup */
54
+ context?: MCPContext;
55
+ /**
56
+ * Max parallel `list_tools_by_integration` requests during cold discovery.
57
+ * @default 8
58
+ */
59
+ fetchConcurrency?: number;
60
+ /**
61
+ * Optional cache for tool metadata (serverless cold-start optimization).
62
+ * Pair with {@link createToolDiscoveryCacheInvalidator} on `onTokenChange`.
63
+ */
64
+ cache?: import("./tool-cache.js").ToolDiscoveryCacheOptions;
41
65
  }
66
+ /** Map AI helper options to client tool-discovery options */
67
+ export declare function toEnabledToolsAsyncOptions(options?: Pick<AIToolsOptions, "integrationIds" | "connectedOnly" | "context" | "fetchConcurrency">): EnabledToolsAsyncOptions | undefined;
42
68
  /**
43
69
  * Get the provider for a tool by checking which integration includes it
44
70
  * @internal
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/ai/utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACzC;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAG/F;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAqFvE;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAoD7D;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,GAAG,CAAC,CAuCd;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAIjF;AAED;;;GAGG;AACH,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/ai/utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAEnE;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,8EAA8E;IAC9E,OAAO,CAAC,EAAE,UAAU,CAAC;IACrB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,iBAAiB,EAAE,yBAAyB,CAAC;CAC7D;AAED,6DAA6D;AAC7D,wBAAgB,0BAA0B,CACxC,OAAO,CAAC,EAAE,IAAI,CACZ,cAAc,EACd,gBAAgB,GAAG,eAAe,GAAG,SAAS,GAAG,kBAAkB,CACpE,GACA,wBAAwB,GAAG,SAAS,CAYtC;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAG/F;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAqFvE;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAoD7D;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,GAAG,CAAC,CAuCd;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAIjF;AAED;;;GAGG;AACH,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC"}
package/dist/ai/utils.js CHANGED
@@ -4060,6 +4060,15 @@ async function tryGetProviderTokens(manualTokens) {
4060
4060
  }
4061
4061
 
4062
4062
  // utils.ts
4063
+ function toEnabledToolsAsyncOptions(options) {
4064
+ if (!options)
4065
+ return;
4066
+ const { integrationIds, connectedOnly, context, fetchConcurrency } = options;
4067
+ if (integrationIds === undefined && connectedOnly === undefined && context === undefined && fetchConcurrency === undefined) {
4068
+ return;
4069
+ }
4070
+ return { integrationIds, connectedOnly, context, fetchConcurrency };
4071
+ }
4063
4072
  function getProviderForTool(client, toolName) {
4064
4073
  return client.getProviderForTool?.(toolName);
4065
4074
  }
@@ -4208,6 +4217,7 @@ async function ensureClientConnected(client) {
4208
4217
  }
4209
4218
  export {
4210
4219
  tryGetProviderTokens,
4220
+ toEnabledToolsAsyncOptions,
4211
4221
  jsonSchemaToZod,
4212
4222
  jsonSchemaPropertyToZod,
4213
4223
  getProviderTokens,
@@ -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;AAUpB;;;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,gCAyE/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,EAML,KAAK,cAAc,EACpB,MAAM,YAAY,CAAC;AAepB;;;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,gCA+F/B"}
@@ -4060,6 +4060,15 @@ async function tryGetProviderTokens(manualTokens) {
4060
4060
  }
4061
4061
 
4062
4062
  // utils.ts
4063
+ function toEnabledToolsAsyncOptions(options) {
4064
+ if (!options)
4065
+ return;
4066
+ const { integrationIds, connectedOnly, context, fetchConcurrency } = options;
4067
+ if (integrationIds === undefined && connectedOnly === undefined && context === undefined && fetchConcurrency === undefined) {
4068
+ return;
4069
+ }
4070
+ return { integrationIds, connectedOnly, context, fetchConcurrency };
4071
+ }
4063
4072
  function getProviderForTool(client, toolName) {
4064
4073
  return client.getProviderForTool?.(toolName);
4065
4074
  }
@@ -5120,6 +5129,69 @@ ${generated.compact}`;
5120
5129
  return { codeTool, typesTool };
5121
5130
  }
5122
5131
 
5132
+ // ../database/token-store.ts
5133
+ var USABLE_ACCESS_TOKEN_BUFFER_MS = 30 * 1000;
5134
+ var MIN_MEANINGFUL_EXPIRY_MS = Date.UTC(2000, 0, 1);
5135
+ async function listConnectedProviders(configuredIntegrationIds, getProviderToken, context) {
5136
+ if (!context.userId || configuredIntegrationIds.length === 0) {
5137
+ return [];
5138
+ }
5139
+ const connected = [];
5140
+ await Promise.all(configuredIntegrationIds.map(async (provider) => {
5141
+ try {
5142
+ const token = await getProviderToken(provider, undefined, context);
5143
+ if (token?.accessToken || typeof token?.refreshToken === "string" && token.refreshToken.length > 0) {
5144
+ connected.push(provider);
5145
+ }
5146
+ } catch {}
5147
+ }));
5148
+ return connected.sort();
5149
+ }
5150
+
5151
+ // tool-cache.ts
5152
+ function buildToolDiscoveryCacheKey(userId, connectedIntegrationIds) {
5153
+ const sorted = [...connectedIntegrationIds].sort().join(",");
5154
+ return `${userId}:${sorted}`;
5155
+ }
5156
+ async function resolveToolDiscoveryCacheKey(client, context, options) {
5157
+ const userId = context.userId;
5158
+ if (!userId)
5159
+ return;
5160
+ const configuredIds = (client.integrations ?? []).map((i) => i.id);
5161
+ let targetIds;
5162
+ if (options?.integrationIds?.length) {
5163
+ targetIds = options.integrationIds;
5164
+ } else if (options?.connectedOnly) {
5165
+ targetIds = await listConnectedProviders(configuredIds, (provider, email, ctx) => client.getProviderToken(provider, email, ctx), context);
5166
+ } else {
5167
+ targetIds = configuredIds;
5168
+ }
5169
+ return buildToolDiscoveryCacheKey(userId, targetIds);
5170
+ }
5171
+ function stubsFromTools(tools) {
5172
+ return tools.map((t) => ({
5173
+ name: t.name,
5174
+ description: t.description,
5175
+ inputSchema: t.inputSchema
5176
+ }));
5177
+ }
5178
+ function applyToolDiscoveryCache(client, stubs) {
5179
+ client.hydrateToolCache(stubs);
5180
+ }
5181
+ async function persistToolDiscoveryCache(client, cache, cacheKey, ttlMs) {
5182
+ const tools = client.getAvailableTools();
5183
+ if (tools.length === 0)
5184
+ return;
5185
+ await cache.set(cacheKey, stubsFromTools(tools), ttlMs);
5186
+ }
5187
+ async function warmToolDiscoveryFromCache(client, cache, cacheKey) {
5188
+ const stubs = await cache.get(cacheKey);
5189
+ if (!stubs || stubs.length === 0)
5190
+ return false;
5191
+ applyToolDiscoveryCache(client, stubs);
5192
+ return true;
5193
+ }
5194
+
5123
5195
  // vercel-ai.ts
5124
5196
  function convertMCPToolToVercelAI(mcpTool, client, options) {
5125
5197
  return {
@@ -5142,7 +5214,21 @@ async function getVercelAITools(client, options) {
5142
5214
  }
5143
5215
  const finalOptions = providerTokens ? { ...options, providerTokens } : options;
5144
5216
  await ensureClientConnected(client);
5145
- const mcpTools = await client.getEnabledToolsAsync();
5217
+ const cacheConfig = options?.cache;
5218
+ let cacheKey;
5219
+ if (cacheConfig?.cache && options?.context) {
5220
+ cacheKey = await resolveToolDiscoveryCacheKey(client, options.context, {
5221
+ integrationIds: options.integrationIds,
5222
+ connectedOnly: options.connectedOnly
5223
+ });
5224
+ if (cacheKey) {
5225
+ await warmToolDiscoveryFromCache(client, cacheConfig.cache, cacheKey);
5226
+ }
5227
+ }
5228
+ const mcpTools = await client.getEnabledToolsAsync(toEnabledToolsAsyncOptions(options));
5229
+ if (cacheConfig?.cache && cacheKey) {
5230
+ await persistToolDiscoveryCache(client, cacheConfig.cache, cacheKey, cacheConfig.ttlMs);
5231
+ }
5146
5232
  const vercelTools = {};
5147
5233
  let effectiveMode;
5148
5234
  if (options?.mode !== undefined) {
@@ -1,6 +1,6 @@
1
1
  export type { AccountIdentity, CreateTriggerInput, DatabaseDriver, DeleteDuplicateProviderTokensInput, DeleteProviderTokensInput, FlattenedTrigger, IntegrateAdapterHooks, IntegrateDatabaseAdapter, IntegrateDatabaseCallbacks, ListTriggersQuery, ProviderTokenRecord, TokenChangeEvent, TokenDatabaseDriver, TriggerDatabaseDriver, TriggerRecord, UpsertProviderTokenInput, } from "./types.js";
2
2
  export { createDatabaseAdapterCallbacks, createDatabaseAdapterFactory, } from "./factory.js";
3
- export { defaultResolveAccountIdentity, hasMeaningfulExpiresAt, hasUsableAccessToken, isLikelyUsableToken, normalizeAccountEmail, normalizeAccountEmailHint, normalizeAccountIdHint, normalizeAccountIdentifier, normalizeProviderTokenType, parseScopes, providerTokenRecordToData, selectProviderTokenRow, } from "./token-store.js";
3
+ export { defaultResolveAccountIdentity, hasMeaningfulExpiresAt, hasUsableAccessToken, isLikelyUsableToken, normalizeAccountEmail, normalizeAccountEmailHint, normalizeAccountIdHint, normalizeAccountIdentifier, normalizeProviderTokenType, parseScopes, providerTokenRecordToData, selectProviderTokenRow, listConnectedProviders, listConnectedProvidersFromRows, } from "./token-store.js";
4
4
  export { flattenedTriggerToCreateInput, toDbSchedule, toDbTriggerUpdates, toSdkSchedule, toSdkTrigger, } from "./trigger-store.js";
5
5
  export { drizzleAdapter, drizzleAdapterCallbacks, createDrizzleDatabaseDriver, type DrizzleAdapterConfig, type DrizzleIntegrateSchema, type DrizzleProvider, } from "./adapters/drizzle.js";
6
6
  export { prismaAdapter, prismaAdapterCallbacks, createPrismaDatabaseDriver, type PrismaAdapterConfig, type PrismaIntegrateModelNames, type PrismaProvider, } from "./adapters/prisma.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/database/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,kCAAkC,EAClC,yBAAyB,EACzB,gBAAgB,EAChB,qBAAqB,EACrB,wBAAwB,EACxB,0BAA0B,EAC1B,iBAAiB,EACjB,mBAAmB,EACnB,gBAAgB,EAChB,mBAAmB,EACnB,qBAAqB,EACrB,aAAa,EACb,wBAAwB,GACzB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,8BAA8B,EAC9B,4BAA4B,GAC7B,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,6BAA6B,EAC7B,sBAAsB,EACtB,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,EACrB,yBAAyB,EACzB,sBAAsB,EACtB,0BAA0B,EAC1B,0BAA0B,EAC1B,WAAW,EACX,yBAAyB,EACzB,sBAAsB,GACvB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,6BAA6B,EAC7B,YAAY,EACZ,kBAAkB,EAClB,aAAa,EACb,YAAY,GACb,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,cAAc,EACd,uBAAuB,EACvB,2BAA2B,EAC3B,KAAK,oBAAoB,EACzB,KAAK,sBAAsB,EAC3B,KAAK,eAAe,GACrB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,aAAa,EACb,sBAAsB,EACtB,0BAA0B,EAC1B,KAAK,mBAAmB,EACxB,KAAK,yBAAyB,EAC9B,KAAK,cAAc,GACpB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,cAAc,EACd,uBAAuB,EACvB,yBAAyB,EACzB,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,GAC1B,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,sBAAsB,EACtB,gBAAgB,GACjB,MAAM,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/database/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,kCAAkC,EAClC,yBAAyB,EACzB,gBAAgB,EAChB,qBAAqB,EACrB,wBAAwB,EACxB,0BAA0B,EAC1B,iBAAiB,EACjB,mBAAmB,EACnB,gBAAgB,EAChB,mBAAmB,EACnB,qBAAqB,EACrB,aAAa,EACb,wBAAwB,GACzB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,8BAA8B,EAC9B,4BAA4B,GAC7B,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,6BAA6B,EAC7B,sBAAsB,EACtB,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,EACrB,yBAAyB,EACzB,sBAAsB,EACtB,0BAA0B,EAC1B,0BAA0B,EAC1B,WAAW,EACX,yBAAyB,EACzB,sBAAsB,EACtB,sBAAsB,EACtB,8BAA8B,GAC/B,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,6BAA6B,EAC7B,YAAY,EACZ,kBAAkB,EAClB,aAAa,EACb,YAAY,GACb,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,cAAc,EACd,uBAAuB,EACvB,2BAA2B,EAC3B,KAAK,oBAAoB,EACzB,KAAK,sBAAsB,EAC3B,KAAK,eAAe,GACrB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,aAAa,EACb,sBAAsB,EACtB,0BAA0B,EAC1B,KAAK,mBAAmB,EACxB,KAAK,yBAAyB,EAC9B,KAAK,cAAc,GACpB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,cAAc,EACd,uBAAuB,EACvB,yBAAyB,EACzB,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,GAC1B,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,sBAAsB,EACtB,gBAAgB,GACjB,MAAM,sBAAsB,CAAC"}
@@ -113,6 +113,43 @@ function providerTokenRecordToData(row) {
113
113
  accountId: row.accountId ?? undefined
114
114
  };
115
115
  }
116
+ function listConnectedProvidersFromRows(rows, configuredIntegrationIds) {
117
+ const allowed = configuredIntegrationIds ? new Set(configuredIntegrationIds) : undefined;
118
+ const rowsByProvider = new Map;
119
+ for (const row of rows) {
120
+ if (allowed && !allowed.has(row.provider))
121
+ continue;
122
+ const existing = rowsByProvider.get(row.provider);
123
+ if (existing) {
124
+ existing.push(row);
125
+ } else {
126
+ rowsByProvider.set(row.provider, [row]);
127
+ }
128
+ }
129
+ const connected = [];
130
+ for (const [provider, providerRows] of rowsByProvider.entries()) {
131
+ const selected = selectProviderTokenRow(providerRows);
132
+ if (selected && isLikelyUsableToken(selected)) {
133
+ connected.push(provider);
134
+ }
135
+ }
136
+ return connected.sort();
137
+ }
138
+ async function listConnectedProviders(configuredIntegrationIds, getProviderToken, context) {
139
+ if (!context.userId || configuredIntegrationIds.length === 0) {
140
+ return [];
141
+ }
142
+ const connected = [];
143
+ await Promise.all(configuredIntegrationIds.map(async (provider) => {
144
+ try {
145
+ const token = await getProviderToken(provider, undefined, context);
146
+ if (token?.accessToken || typeof token?.refreshToken === "string" && token.refreshToken.length > 0) {
147
+ connected.push(provider);
148
+ }
149
+ } catch {}
150
+ }));
151
+ return connected.sort();
152
+ }
116
153
  function defaultResolveAccountIdentity(provider, tokenData, emailHint) {
117
154
  const accountEmail = normalizeAccountEmail(emailHint ?? tokenData.email ?? null);
118
155
  let accountId = normalizeAccountIdHint(tokenData.accountId ?? null);
@@ -1111,6 +1148,8 @@ export {
1111
1148
  normalizeAccountEmail,
1112
1149
  mongodbAdapterCallbacks,
1113
1150
  mongodbAdapter,
1151
+ listConnectedProvidersFromRows,
1152
+ listConnectedProviders,
1114
1153
  isLikelyUsableToken,
1115
1154
  integrateTrigger,
1116
1155
  integrateProviderToken,