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.
- package/dist/adapters/index.js +80 -35
- package/dist/adapters/solid-start.js +80 -35
- package/dist/adapters/svelte-kit.js +80 -35
- package/dist/ai/anthropic.d.ts.map +1 -1
- package/dist/ai/anthropic.js +11 -2
- package/dist/ai/google.d.ts.map +1 -1
- package/dist/ai/google.js +11 -2
- package/dist/ai/index.js +93 -7
- package/dist/ai/openai.d.ts.map +1 -1
- package/dist/ai/openai.js +11 -2
- package/dist/ai/tool-cache.d.ts +50 -0
- package/dist/ai/tool-cache.d.ts.map +1 -0
- package/dist/ai/utils.d.ts +26 -0
- package/dist/ai/utils.d.ts.map +1 -1
- package/dist/ai/utils.js +10 -0
- package/dist/ai/vercel-ai.d.ts.map +1 -1
- package/dist/ai/vercel-ai.js +87 -1
- package/dist/database/index.d.ts +1 -1
- package/dist/database/index.d.ts.map +1 -1
- package/dist/database/index.js +39 -0
- package/dist/index.js +142 -32
- package/dist/integrations.js +142 -32
- package/dist/react.d.ts +2 -2
- package/dist/react.d.ts.map +1 -1
- package/dist/react.js +86 -0
- package/dist/server.js +578 -189
- package/dist/src/ai/anthropic.d.ts.map +1 -1
- package/dist/src/ai/google.d.ts.map +1 -1
- package/dist/src/ai/openai.d.ts.map +1 -1
- package/dist/src/ai/tool-cache.d.ts +50 -0
- package/dist/src/ai/tool-cache.d.ts.map +1 -0
- package/dist/src/ai/utils.d.ts +26 -0
- package/dist/src/ai/utils.d.ts.map +1 -1
- package/dist/src/ai/vercel-ai.d.ts.map +1 -1
- package/dist/src/client.d.ts +5 -5
- package/dist/src/client.d.ts.map +1 -1
- package/dist/src/config/types.d.ts +30 -0
- package/dist/src/config/types.d.ts.map +1 -1
- package/dist/src/database/index.d.ts +1 -1
- package/dist/src/database/index.d.ts.map +1 -1
- package/dist/src/database/token-store.d.ts +10 -0
- package/dist/src/database/token-store.d.ts.map +1 -1
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/integrations/bundle.d.ts +18 -0
- package/dist/src/integrations/bundle.d.ts.map +1 -0
- package/dist/src/react/hooks.d.ts +16 -0
- package/dist/src/react/hooks.d.ts.map +1 -1
- package/dist/src/server.d.ts +13 -1
- package/dist/src/server.d.ts.map +1 -1
- package/dist/src/utils/normalize-tool-name.d.ts +14 -0
- package/dist/src/utils/normalize-tool-name.d.ts.map +1 -0
- package/dist/src/utils/parse-tool-result.d.ts +23 -0
- package/dist/src/utils/parse-tool-result.d.ts.map +1 -0
- package/package.json +1 -1
- 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
|
|
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,
|
package/dist/ai/openai.d.ts.map
CHANGED
|
@@ -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,
|
|
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"}
|
package/dist/ai/utils.d.ts
CHANGED
|
@@ -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
|
package/dist/ai/utils.d.ts.map
CHANGED
|
@@ -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;
|
|
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,
|
|
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"}
|
package/dist/ai/vercel-ai.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
|
}
|
|
@@ -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
|
|
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) {
|
package/dist/database/index.d.ts
CHANGED
|
@@ -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,
|
|
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"}
|
package/dist/database/index.js
CHANGED
|
@@ -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,
|