@forestadmin/workflow-executor 1.13.0 → 1.15.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.
- package/README.md +18 -0
- package/dist/adapters/ai-client-adapter.d.ts +5 -1
- package/dist/adapters/ai-client-adapter.js +4 -1
- package/dist/adapters/always-error-ai-model-port.d.ts +5 -1
- package/dist/adapters/always-error-ai-model-port.js +6 -1
- package/dist/adapters/server-ai-adapter.d.ts +5 -1
- package/dist/adapters/server-ai-adapter.js +4 -1
- package/dist/adapters/step-outcome-to-update-step-mapper.js +4 -1
- package/dist/build-workflow-executor.js +87 -2
- package/dist/crypto/credential-encryption.d.ts +10 -0
- package/dist/crypto/credential-encryption.js +75 -0
- package/dist/defaults.d.ts +1 -0
- package/dist/defaults.js +5 -2
- package/dist/errors.d.ts +22 -0
- package/dist/errors.js +59 -2
- package/dist/executors/load-related-record-step-executor.d.ts +4 -9
- package/dist/executors/load-related-record-step-executor.js +164 -97
- package/dist/executors/mcp-step-executor.d.ts +7 -2
- package/dist/executors/mcp-step-executor.js +78 -14
- package/dist/executors/step-executor-factory.d.ts +1 -1
- package/dist/executors/step-executor-factory.js +24 -3
- package/dist/http/executor-http-server.d.ts +12 -0
- package/dist/http/executor-http-server.js +90 -1
- package/dist/http/mcp-oauth-credentials.d.ts +24 -0
- package/dist/http/mcp-oauth-credentials.js +77 -0
- package/dist/http/step-serializer.js +5 -2
- package/dist/index.d.ts +7 -1
- package/dist/index.js +10 -3
- package/dist/oauth/keyed-mutex.d.ts +5 -0
- package/dist/oauth/keyed-mutex.js +27 -0
- package/dist/oauth/refresh-grant.d.ts +15 -0
- package/dist/oauth/refresh-grant.js +112 -0
- package/dist/oauth/token-endpoint-url.d.ts +2 -0
- package/dist/oauth/token-endpoint-url.js +103 -0
- package/dist/oauth/token-service.d.ts +34 -0
- package/dist/oauth/token-service.js +172 -0
- package/dist/ports/ai-model-port.d.ts +5 -1
- package/dist/ports/mcp-oauth-credentials-store.d.ts +24 -0
- package/dist/ports/mcp-oauth-credentials-store.js +3 -0
- package/dist/ports/run-store.d.ts +1 -0
- package/dist/remote-tool-fetcher.d.ts +7 -2
- package/dist/remote-tool-fetcher.js +53 -6
- package/dist/runner.d.ts +2 -0
- package/dist/runner.js +3 -3
- package/dist/stores/database-mcp-oauth-credentials-store.d.ts +22 -0
- package/dist/stores/database-mcp-oauth-credentials-store.js +188 -0
- package/dist/stores/database-store.d.ts +1 -1
- package/dist/stores/database-store.js +17 -50
- package/dist/stores/in-memory-mcp-oauth-credentials-store.d.ts +13 -0
- package/dist/stores/in-memory-mcp-oauth-credentials-store.js +44 -0
- package/dist/stores/in-memory-store.d.ts +1 -0
- package/dist/stores/in-memory-store.js +6 -1
- package/dist/stores/schema-migrations.d.ts +19 -0
- package/dist/stores/schema-migrations.js +69 -0
- package/dist/types/step-execution-data.d.ts +2 -1
- package/dist/types/validated/execution.d.ts +15 -6
- package/dist/types/validated/step-definition.d.ts +9 -6
- package/dist/types/validated/step-definition.js +4 -4
- package/dist/types/validated/step-outcome.d.ts +10 -0
- package/dist/types/validated/step-outcome.js +7 -2
- package/package.json +4 -4
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type OAuthTokenService from './oauth/token-service';
|
|
1
2
|
import type { AiModelPort } from './ports/ai-model-port';
|
|
2
3
|
import type { Logger } from './ports/logger-port';
|
|
3
4
|
import type { WorkflowPort } from './ports/workflow-port';
|
|
@@ -6,13 +7,17 @@ export declare function scopeConfigsToServer(configs: Record<string, ToolConfig>
|
|
|
6
7
|
export interface FetchRemoteToolsResult {
|
|
7
8
|
tools: RemoteTool[];
|
|
8
9
|
mcpServerName?: string;
|
|
10
|
+
loadFailed?: boolean;
|
|
11
|
+
reloadWithFreshAuth?: () => Promise<RemoteTool[]>;
|
|
9
12
|
}
|
|
10
13
|
export default class RemoteToolFetcher {
|
|
11
14
|
private readonly workflowPort;
|
|
12
15
|
private readonly aiModelPort;
|
|
13
16
|
private readonly logger;
|
|
14
|
-
|
|
15
|
-
|
|
17
|
+
private readonly oauthTokenService;
|
|
18
|
+
constructor(workflowPort: WorkflowPort, aiModelPort: AiModelPort, logger: Logger, oauthTokenService: OAuthTokenService);
|
|
19
|
+
fetch(mcpServerId: string, userId: number): Promise<FetchRemoteToolsResult>;
|
|
20
|
+
private fetchOAuthTools;
|
|
16
21
|
private warnMissingTargetServer;
|
|
17
22
|
private errorOnPartialLoadFailure;
|
|
18
23
|
}
|
|
@@ -1,26 +1,72 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.scopeConfigsToServer = scopeConfigsToServer;
|
|
4
|
+
const ai_proxy_1 = require("@forestadmin/ai-proxy");
|
|
5
|
+
const errors_1 = require("./errors");
|
|
6
|
+
const OAUTH2_AUTH_TYPE = 'oauth2';
|
|
4
7
|
// Match by config.id, not by Record key: server names can collide across configs.
|
|
5
8
|
function scopeConfigsToServer(configs, mcpServerId) {
|
|
6
9
|
return Object.fromEntries(Object.entries(configs).filter(([, cfg]) => cfg.id === mcpServerId));
|
|
7
10
|
}
|
|
11
|
+
function readAuthType(config) {
|
|
12
|
+
return config?.authType;
|
|
13
|
+
}
|
|
8
14
|
class RemoteToolFetcher {
|
|
9
|
-
constructor(workflowPort, aiModelPort, logger) {
|
|
15
|
+
constructor(workflowPort, aiModelPort, logger, oauthTokenService) {
|
|
16
|
+
// Fail loudly here instead of a cryptic undefined dereference at the first OAuth fetch —
|
|
17
|
+
// Runner/RunnerConfig are public API, so a JS caller can bypass the compile-time check.
|
|
18
|
+
if (!oauthTokenService) {
|
|
19
|
+
throw new Error('RemoteToolFetcher requires an OAuth token service (mcpOAuthTokenService)');
|
|
20
|
+
}
|
|
10
21
|
this.workflowPort = workflowPort;
|
|
11
22
|
this.aiModelPort = aiModelPort;
|
|
12
23
|
this.logger = logger;
|
|
24
|
+
this.oauthTokenService = oauthTokenService;
|
|
13
25
|
}
|
|
14
|
-
async fetch(mcpServerId) {
|
|
26
|
+
async fetch(mcpServerId, userId) {
|
|
15
27
|
const configs = await this.workflowPort.getMcpServerConfigs();
|
|
16
28
|
const scoped = scopeConfigsToServer(configs, mcpServerId);
|
|
17
29
|
const [mcpServerName] = Object.keys(scoped);
|
|
18
30
|
this.warnMissingTargetServer(configs, scoped, mcpServerId, mcpServerName);
|
|
19
31
|
if (Object.keys(scoped).length === 0)
|
|
20
32
|
return { tools: [], mcpServerName };
|
|
33
|
+
if (readAuthType(scoped[mcpServerName]) === OAUTH2_AUTH_TYPE) {
|
|
34
|
+
return this.fetchOAuthTools(scoped, mcpServerName, mcpServerId, userId);
|
|
35
|
+
}
|
|
21
36
|
const tools = await this.aiModelPort.loadRemoteTools(scoped);
|
|
22
|
-
this.errorOnPartialLoadFailure(scoped, tools, mcpServerId, mcpServerName);
|
|
23
|
-
return { tools, mcpServerName };
|
|
37
|
+
const loadFailed = this.errorOnPartialLoadFailure(scoped, tools, mcpServerId, mcpServerName);
|
|
38
|
+
return { tools, mcpServerName, loadFailed };
|
|
39
|
+
}
|
|
40
|
+
// OAuth2 path: acquire a per-user access token, inject it as a Bearer header, then list tools.
|
|
41
|
+
// Tool listing is the first authenticated call, so an auth failure here forces one token refresh
|
|
42
|
+
// and a single retry; a still-failing load is a genuine re-auth case.
|
|
43
|
+
async fetchOAuthTools(scoped, mcpServerName, mcpServerId, userId) {
|
|
44
|
+
const tokenService = this.oauthTokenService;
|
|
45
|
+
const attemptLoad = async (forceRefresh) => {
|
|
46
|
+
const token = await tokenService.getAccessToken(userId, mcpServerId, { forceRefresh });
|
|
47
|
+
const bearer = `Bearer ${token}`;
|
|
48
|
+
// All scoped configs share this mcpServerId, so inject the token for every one — not just the
|
|
49
|
+
// first key — or extra same-id servers load unauthenticated and report spurious auth failures.
|
|
50
|
+
const injected = (0, ai_proxy_1.injectOauthTokens)({
|
|
51
|
+
configs: scoped,
|
|
52
|
+
tokensByMcpServerName: Object.fromEntries(Object.keys(scoped).map(name => [name, bearer])),
|
|
53
|
+
}) ?? scoped;
|
|
54
|
+
const { tools, failures } = await this.aiModelPort.loadRemoteToolsWithFailures(injected);
|
|
55
|
+
return { tools, hasAuthFailure: failures.some(failure => failure.kind === 'auth') };
|
|
56
|
+
};
|
|
57
|
+
const reloadWithFreshAuth = async () => {
|
|
58
|
+
const attempt = await attemptLoad(true);
|
|
59
|
+
if (attempt.hasAuthFailure)
|
|
60
|
+
throw new errors_1.OAuthReauthRequiredError(mcpServerId);
|
|
61
|
+
this.errorOnPartialLoadFailure(scoped, attempt.tools, mcpServerId, mcpServerName);
|
|
62
|
+
return attempt.tools;
|
|
63
|
+
};
|
|
64
|
+
const initial = await attemptLoad(false);
|
|
65
|
+
if (initial.hasAuthFailure) {
|
|
66
|
+
return { tools: await reloadWithFreshAuth(), mcpServerName, reloadWithFreshAuth };
|
|
67
|
+
}
|
|
68
|
+
const loadFailed = this.errorOnPartialLoadFailure(scoped, initial.tools, mcpServerId, mcpServerName);
|
|
69
|
+
return { tools: initial.tools, mcpServerName, reloadWithFreshAuth, loadFailed };
|
|
24
70
|
}
|
|
25
71
|
// Distinguish "no configs at all" (deployment misconfig) from "configs exist but none match"
|
|
26
72
|
// (orchestrator/executor drift on server id) — both yield zero tools, but ops need to know
|
|
@@ -44,13 +90,14 @@ class RemoteToolFetcher {
|
|
|
44
90
|
.filter(([, cfg]) => !loadedMcpServerIds.has(cfg.id))
|
|
45
91
|
.map(([name]) => name);
|
|
46
92
|
if (failedConfigNames.length === 0)
|
|
47
|
-
return;
|
|
93
|
+
return false;
|
|
48
94
|
this.logger('Error', 'MCP servers failed to load tools', {
|
|
49
95
|
requestedMcpServerId: mcpServerId,
|
|
50
96
|
mcpServerName,
|
|
51
97
|
failedConfigNames,
|
|
52
98
|
});
|
|
99
|
+
return true;
|
|
53
100
|
}
|
|
54
101
|
}
|
|
55
102
|
exports.default = RemoteToolFetcher;
|
|
56
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
103
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVtb3RlLXRvb2wtZmV0Y2hlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9yZW1vdGUtdG9vbC1mZXRjaGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBYUEsb0RBS0M7QUFaRCxvREFBMEQ7QUFFMUQscUNBQW9EO0FBRXBELE1BQU0sZ0JBQWdCLEdBQUcsUUFBUSxDQUFDO0FBRWxDLGtGQUFrRjtBQUNsRixTQUFnQixvQkFBb0IsQ0FDbEMsT0FBbUMsRUFDbkMsV0FBbUI7SUFFbkIsT0FBTyxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUM7QUFDakcsQ0FBQztBQUVELFNBQVMsWUFBWSxDQUFDLE1BQThCO0lBQ2xELE9BQVEsTUFBNEMsRUFBRSxRQUFRLENBQUM7QUFDakUsQ0FBQztBQWNELE1BQXFCLGlCQUFpQjtJQU1wQyxZQUNFLFlBQTBCLEVBQzFCLFdBQXdCLEVBQ3hCLE1BQWMsRUFDZCxpQkFBb0M7UUFFcEMseUZBQXlGO1FBQ3pGLHdGQUF3RjtRQUN4RixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUN2QixNQUFNLElBQUksS0FBSyxDQUFDLDBFQUEwRSxDQUFDLENBQUM7UUFDOUYsQ0FBQztRQUVELElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBQy9CLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxpQkFBaUIsQ0FBQztJQUM3QyxDQUFDO0lBRUQsS0FBSyxDQUFDLEtBQUssQ0FBQyxXQUFtQixFQUFFLE1BQWM7UUFDN0MsTUFBTSxPQUFPLEdBQUcsTUFBTSxJ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
|
package/dist/runner.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type OAuthTokenService from './oauth/token-service';
|
|
1
2
|
import type { ActivityLogPortFactory } from './ports/activity-log-port';
|
|
2
3
|
import type { AgentPort } from './ports/agent-port';
|
|
3
4
|
import type { AiModelPort } from './ports/ai-model-port';
|
|
@@ -22,6 +23,7 @@ export interface RunnerConfig {
|
|
|
22
23
|
stepTimeoutS?: number;
|
|
23
24
|
aiInvokeTimeoutS?: number;
|
|
24
25
|
maxChainDepth?: number;
|
|
26
|
+
mcpOAuthTokenService: OAuthTokenService;
|
|
25
27
|
}
|
|
26
28
|
export default class Runner {
|
|
27
29
|
private readonly config;
|
package/dist/runner.js
CHANGED
|
@@ -20,7 +20,7 @@ class Runner {
|
|
|
20
20
|
this._state = 'idle';
|
|
21
21
|
this.config = config;
|
|
22
22
|
this.logger = config.logger ?? (0, console_logger_1.default)();
|
|
23
|
-
this.remoteToolFetcher = new remote_tool_fetcher_1.default(config.workflowPort, config.aiModelPort, this.logger);
|
|
23
|
+
this.remoteToolFetcher = new remote_tool_fetcher_1.default(config.workflowPort, config.aiModelPort, this.logger, config.mcpOAuthTokenService);
|
|
24
24
|
}
|
|
25
25
|
get state() {
|
|
26
26
|
return this._state;
|
|
@@ -216,7 +216,7 @@ class Runner {
|
|
|
216
216
|
while (true) {
|
|
217
217
|
let result;
|
|
218
218
|
try {
|
|
219
|
-
const executor = await step_executor_factory_1.default.create(currentStep, this.contextConfig, this.config.activityLogPortFactory.forRun(currentToken), mcpServerId => this.remoteToolFetcher.fetch(mcpServerId), currentIncomingData, currentToken);
|
|
219
|
+
const executor = await step_executor_factory_1.default.create(currentStep, this.contextConfig, this.config.activityLogPortFactory.forRun(currentToken), (mcpServerId, userId) => this.remoteToolFetcher.fetch(mcpServerId, userId), currentIncomingData, currentToken);
|
|
220
220
|
result = await executor.execute();
|
|
221
221
|
}
|
|
222
222
|
catch (error) {
|
|
@@ -333,4 +333,4 @@ class Runner {
|
|
|
333
333
|
}
|
|
334
334
|
}
|
|
335
335
|
exports.default = Runner;
|
|
336
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVubmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3J1bm5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQVlBLCtFQUE0RDtBQUM1RCx5Q0FBNkU7QUFDN0UscUNBT2tCO0FBQ2xCLDhGQUFvRTtBQUNwRSxzRkFBMkQ7QUFDM0QsZ0ZBQXNEO0FBQ3RELGlFQUF1RTtBQUN2RSwwRUFBaUQ7QUE0QmpELHlHQUF5RztBQUN6RyxNQUFNLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLEdBQUcsT0FBTyxDQUFDLGlCQUFpQixDQUF3QixDQUFDO0FBRXhGLE1BQXFCLE1BQU07SUFRekIsWUFBWSxNQUFvQjtRQU54QixpQkFBWSxHQUEwQixJQUFJLENBQUM7UUFDbEMsaUJBQVksR0FBRyxJQUFJLGdDQUFtQixFQUFFLENBQUM7UUFHbEQsV0FBTSxHQUFnQixNQUFNLENBQUM7UUFHbkMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxJQUFJLElBQUEsd0JBQW1CLEdBQUUsQ0FBQztRQUNyRCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSw2QkFBaUIsQ0FDNUMsTUFBTSxDQUFDLFlBQVksRUFDbkIsTUFBTSxDQUFDLFdBQVcsRUFDbEIsSUFBSSxDQUFDLE1BQU0sQ0FDWixDQUFDO0lBQ0osQ0FBQztJQUVELElBQUksS0FBSztRQUNQLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDO0lBRUQsS0FBSyxDQUFDLEtBQUs7UUFDVCxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDNUQsTUFBTSxJQUFJLEtBQUssQ0FBQyxpREFBaUQsQ0FBQyxDQUFDO1FBQ3JFLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssU0FBUztZQUFFLE9BQU87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
|
|
336
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVubmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3J1bm5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQWFBLCtFQUE0RDtBQUM1RCx5Q0FBNkU7QUFDN0UscUNBT2tCO0FBQ2xCLDhGQUFvRTtBQUNwRSxzRkFBMkQ7QUFDM0QsZ0ZBQXNEO0FBQ3RELGlFQUF1RTtBQUN2RSwwRUFBaUQ7QUErQmpELHlHQUF5RztBQUN6RyxNQUFNLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLEdBQUcsT0FBTyxDQUFDLGlCQUFpQixDQUF3QixDQUFDO0FBRXhGLE1BQXFCLE1BQU07SUFRekIsWUFBWSxNQUFvQjtRQU54QixpQkFBWSxHQUEwQixJQUFJLENBQUM7UUFDbEMsaUJBQVksR0FBRyxJQUFJLGdDQUFtQixFQUFFLENBQUM7UUFHbEQsV0FBTSxHQUFnQixNQUFNLENBQUM7UUFHbkMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxJQUFJLElBQUEsd0JBQW1CLEdBQUUsQ0FBQztRQUNyRCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSw2QkFBaUIsQ0FDNUMsTUFBTSxDQUFDLFlBQVksRUFDbkIsTUFBTSxDQUFDLFdBQVcsRUFDbEIsSUFBSSxDQUFDLE1BQU0sRUFDWCxNQUFNLENBQUMsb0JBQW9CLENBQzVCLENBQUM7SUFDSixDQUFDO0lBRUQsSUFBSSxLQUFLO1FBQ1AsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFFRCxLQUFLLENBQUMsS0FBSztRQUNULElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxTQUFTLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUM1RCxNQUFNLElBQUksS0FBSyxDQUFDLGlEQUFpRCxDQUFDLENBQUM7UUFDckUsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLE1B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
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { Logger } from '../ports/logger-port';
|
|
2
|
+
import type { McpOAuthCredentialInput, McpOAuthCredentialsStore, StoredMcpOAuthCredential } from '../ports/mcp-oauth-credentials-store';
|
|
3
|
+
import type { Sequelize } from 'sequelize';
|
|
4
|
+
export interface DatabaseMcpOAuthCredentialsStoreOptions {
|
|
5
|
+
sequelize: Sequelize;
|
|
6
|
+
schema?: string;
|
|
7
|
+
}
|
|
8
|
+
export default class DatabaseMcpOAuthCredentialsStore implements McpOAuthCredentialsStore {
|
|
9
|
+
private readonly sequelize;
|
|
10
|
+
private readonly configuredSchema?;
|
|
11
|
+
constructor(options: DatabaseMcpOAuthCredentialsStoreOptions);
|
|
12
|
+
private get schema();
|
|
13
|
+
private get tableReference();
|
|
14
|
+
init(logger?: Logger): Promise<void>;
|
|
15
|
+
get(userId: number, mcpServerId: string): Promise<StoredMcpOAuthCredential | null>;
|
|
16
|
+
upsert(credential: McpOAuthCredentialInput): Promise<void>;
|
|
17
|
+
updateIfPresent(id: number, credential: McpOAuthCredentialInput): Promise<void>;
|
|
18
|
+
delete(userId: number, mcpServerId: string): Promise<void>;
|
|
19
|
+
close(logger?: Logger): Promise<void>;
|
|
20
|
+
private static toCredential;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=database-mcp-oauth-credentials-store.d.ts.map
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const sequelize_1 = require("sequelize");
|
|
4
|
+
const umzug_1 = require("umzug");
|
|
5
|
+
const errors_1 = require("../errors");
|
|
6
|
+
const schema_migrations_1 = require("./schema-migrations");
|
|
7
|
+
const TABLE_NAME = 'ai_mcp_oauth_credentials';
|
|
8
|
+
class DatabaseMcpOAuthCredentialsStore {
|
|
9
|
+
constructor(options) {
|
|
10
|
+
this.sequelize = options.sequelize;
|
|
11
|
+
this.configuredSchema = options.schema;
|
|
12
|
+
}
|
|
13
|
+
get schema() {
|
|
14
|
+
return (0, schema_migrations_1.resolveSchema)(this.sequelize, this.configuredSchema);
|
|
15
|
+
}
|
|
16
|
+
get tableReference() {
|
|
17
|
+
return (0, schema_migrations_1.tableReference)(this.schema, TABLE_NAME);
|
|
18
|
+
}
|
|
19
|
+
async init(logger) {
|
|
20
|
+
const { schema } = this;
|
|
21
|
+
const tableId = (0, schema_migrations_1.tableId)(schema, TABLE_NAME);
|
|
22
|
+
const umzug = new umzug_1.Umzug({
|
|
23
|
+
migrations: [
|
|
24
|
+
{
|
|
25
|
+
name: '002_create_mcp_oauth_credentials',
|
|
26
|
+
up: async ({ context }) => {
|
|
27
|
+
// Atomic (table + index) and idempotent so a half-applied or already-applied run can't
|
|
28
|
+
// crash-loop boot.
|
|
29
|
+
await context.sequelize.transaction(async (transaction) => {
|
|
30
|
+
if (await context.tableExists(tableId, { transaction }))
|
|
31
|
+
return;
|
|
32
|
+
await context.createTable(tableId, {
|
|
33
|
+
id: { type: sequelize_1.DataTypes.INTEGER, primaryKey: true, autoIncrement: true },
|
|
34
|
+
userId: { type: sequelize_1.DataTypes.INTEGER, allowNull: false, field: 'user_id' },
|
|
35
|
+
mcpServerId: {
|
|
36
|
+
type: sequelize_1.DataTypes.STRING(255),
|
|
37
|
+
allowNull: false,
|
|
38
|
+
field: 'mcp_server_id',
|
|
39
|
+
},
|
|
40
|
+
refreshTokenEnc: {
|
|
41
|
+
type: sequelize_1.DataTypes.BLOB,
|
|
42
|
+
allowNull: false,
|
|
43
|
+
field: 'refresh_token_enc',
|
|
44
|
+
},
|
|
45
|
+
clientId: { type: sequelize_1.DataTypes.STRING(255), allowNull: true, field: 'client_id' },
|
|
46
|
+
clientSecretEnc: {
|
|
47
|
+
type: sequelize_1.DataTypes.BLOB,
|
|
48
|
+
allowNull: true,
|
|
49
|
+
field: 'client_secret_enc',
|
|
50
|
+
},
|
|
51
|
+
clientSecretExpiresAt: {
|
|
52
|
+
type: sequelize_1.DataTypes.DATE,
|
|
53
|
+
allowNull: true,
|
|
54
|
+
field: 'client_secret_expires_at',
|
|
55
|
+
},
|
|
56
|
+
tokenEndpoint: {
|
|
57
|
+
type: sequelize_1.DataTypes.STRING(2048),
|
|
58
|
+
allowNull: false,
|
|
59
|
+
field: 'token_endpoint',
|
|
60
|
+
},
|
|
61
|
+
tokenEndpointAuthMethod: {
|
|
62
|
+
type: sequelize_1.DataTypes.STRING(64),
|
|
63
|
+
allowNull: true,
|
|
64
|
+
field: 'token_endpoint_auth_method',
|
|
65
|
+
},
|
|
66
|
+
scopes: { type: sequelize_1.DataTypes.STRING(2048), allowNull: true, field: 'scopes' },
|
|
67
|
+
createdAt: {
|
|
68
|
+
type: sequelize_1.DataTypes.DATE,
|
|
69
|
+
allowNull: false,
|
|
70
|
+
defaultValue: sequelize_1.DataTypes.NOW,
|
|
71
|
+
field: 'created_at',
|
|
72
|
+
},
|
|
73
|
+
updatedAt: {
|
|
74
|
+
type: sequelize_1.DataTypes.DATE,
|
|
75
|
+
allowNull: false,
|
|
76
|
+
defaultValue: sequelize_1.DataTypes.NOW,
|
|
77
|
+
field: 'updated_at',
|
|
78
|
+
},
|
|
79
|
+
}, { transaction });
|
|
80
|
+
await context.addIndex(tableId, ['user_id', 'mcp_server_id'], {
|
|
81
|
+
unique: true,
|
|
82
|
+
name: 'idx_user_id_mcp_server_id',
|
|
83
|
+
transaction,
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
},
|
|
87
|
+
down: async ({ context }) => {
|
|
88
|
+
await context.dropTable(tableId);
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
],
|
|
92
|
+
context: this.sequelize.getQueryInterface(),
|
|
93
|
+
storage: new umzug_1.SequelizeStorage({
|
|
94
|
+
sequelize: this.sequelize,
|
|
95
|
+
...(schema ? { schema } : {}),
|
|
96
|
+
}),
|
|
97
|
+
logger: undefined,
|
|
98
|
+
});
|
|
99
|
+
await (0, schema_migrations_1.runMigrations)({
|
|
100
|
+
sequelize: this.sequelize,
|
|
101
|
+
umzug,
|
|
102
|
+
schema,
|
|
103
|
+
logger,
|
|
104
|
+
failMessage: 'MCP OAuth credentials migration failed',
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
async get(userId, mcpServerId) {
|
|
108
|
+
const [rows] = await this.sequelize.query(`SELECT * FROM ${this.tableReference} WHERE user_id = :userId AND mcp_server_id = :mcpServerId`, { replacements: { userId, mcpServerId } });
|
|
109
|
+
const row = rows[0];
|
|
110
|
+
return row ? DatabaseMcpOAuthCredentialsStore.toCredential(row) : null;
|
|
111
|
+
}
|
|
112
|
+
async upsert(credential) {
|
|
113
|
+
await this.sequelize.transaction(async (transaction) => {
|
|
114
|
+
const now = new Date();
|
|
115
|
+
const replacements = {
|
|
116
|
+
userId: credential.userId,
|
|
117
|
+
mcpServerId: credential.mcpServerId,
|
|
118
|
+
refreshTokenEnc: credential.refreshTokenEnc,
|
|
119
|
+
clientId: credential.clientId ?? null,
|
|
120
|
+
clientSecretEnc: credential.clientSecretEnc ?? null,
|
|
121
|
+
clientSecretExpiresAt: credential.clientSecretExpiresAt ?? null,
|
|
122
|
+
tokenEndpoint: credential.tokenEndpoint,
|
|
123
|
+
tokenEndpointAuthMethod: credential.tokenEndpointAuthMethod ?? null,
|
|
124
|
+
scopes: credential.scopes ?? null,
|
|
125
|
+
now,
|
|
126
|
+
};
|
|
127
|
+
// Delete + insert in transaction: dialect-agnostic upsert (avoids ON CONFLICT / ON DUPLICATE).
|
|
128
|
+
await this.sequelize.query(`DELETE FROM ${this.tableReference} WHERE user_id = :userId AND mcp_server_id = :mcpServerId`, { replacements, transaction });
|
|
129
|
+
await this.sequelize.query(`INSERT INTO ${this.tableReference} ` +
|
|
130
|
+
'(user_id, mcp_server_id, refresh_token_enc, client_id, client_secret_enc, ' +
|
|
131
|
+
'client_secret_expires_at, token_endpoint, token_endpoint_auth_method, scopes, ' +
|
|
132
|
+
'created_at, updated_at) VALUES ' +
|
|
133
|
+
'(:userId, :mcpServerId, :refreshTokenEnc, :clientId, :clientSecretEnc, ' +
|
|
134
|
+
':clientSecretExpiresAt, :tokenEndpoint, :tokenEndpointAuthMethod, :scopes, ' +
|
|
135
|
+
':now, :now)', { replacements, transaction });
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
async updateIfPresent(id, credential) {
|
|
139
|
+
// Single atomic UPDATE … WHERE id — affects zero rows if that row was deleted or re-created.
|
|
140
|
+
await this.sequelize.query(`UPDATE ${this.tableReference} SET ` +
|
|
141
|
+
'refresh_token_enc = :refreshTokenEnc, client_id = :clientId, ' +
|
|
142
|
+
'client_secret_enc = :clientSecretEnc, client_secret_expires_at = :clientSecretExpiresAt, ' +
|
|
143
|
+
'token_endpoint = :tokenEndpoint, token_endpoint_auth_method = :tokenEndpointAuthMethod, ' +
|
|
144
|
+
'scopes = :scopes, updated_at = :now ' +
|
|
145
|
+
'WHERE id = :id', {
|
|
146
|
+
replacements: {
|
|
147
|
+
id,
|
|
148
|
+
refreshTokenEnc: credential.refreshTokenEnc,
|
|
149
|
+
clientId: credential.clientId ?? null,
|
|
150
|
+
clientSecretEnc: credential.clientSecretEnc ?? null,
|
|
151
|
+
clientSecretExpiresAt: credential.clientSecretExpiresAt ?? null,
|
|
152
|
+
tokenEndpoint: credential.tokenEndpoint,
|
|
153
|
+
tokenEndpointAuthMethod: credential.tokenEndpointAuthMethod ?? null,
|
|
154
|
+
scopes: credential.scopes ?? null,
|
|
155
|
+
now: new Date(),
|
|
156
|
+
},
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
async delete(userId, mcpServerId) {
|
|
160
|
+
await this.sequelize.query(`DELETE FROM ${this.tableReference} WHERE user_id = :userId AND mcp_server_id = :mcpServerId`, { replacements: { userId, mcpServerId } });
|
|
161
|
+
}
|
|
162
|
+
async close(logger) {
|
|
163
|
+
try {
|
|
164
|
+
await this.sequelize.close();
|
|
165
|
+
}
|
|
166
|
+
catch (error) {
|
|
167
|
+
logger?.('Error', 'Failed to close database connection', {
|
|
168
|
+
error: (0, errors_1.extractErrorMessage)(error),
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
static toCredential(row) {
|
|
173
|
+
return {
|
|
174
|
+
id: Number(row.id),
|
|
175
|
+
userId: Number(row.user_id),
|
|
176
|
+
mcpServerId: row.mcp_server_id,
|
|
177
|
+
refreshTokenEnc: row.refresh_token_enc,
|
|
178
|
+
clientId: row.client_id ?? null,
|
|
179
|
+
clientSecretEnc: row.client_secret_enc ?? null,
|
|
180
|
+
clientSecretExpiresAt: row.client_secret_expires_at == null ? null : new Date(row.client_secret_expires_at),
|
|
181
|
+
tokenEndpoint: row.token_endpoint,
|
|
182
|
+
tokenEndpointAuthMethod: row.token_endpoint_auth_method ?? null,
|
|
183
|
+
scopes: row.scopes ?? null,
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
exports.default = DatabaseMcpOAuthCredentialsStore;
|
|
188
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJhc2UtbWNwLW9hdXRoLWNyZWRlbnRpYWxzLXN0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0b3Jlcy9kYXRhYmFzZS1tY3Atb2F1dGgtY3JlZGVudGlhbHMtc3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFRQSx5Q0FBc0M7QUFDdEMsaUNBQWdEO0FBRWhELHNDQUFnRDtBQUNoRCwyREFLNkI7QUFFN0IsTUFBTSxVQUFVLEdBQUcsMEJBQTBCLENBQUM7QUFvQjlDLE1BQXFCLGdDQUFnQztJQUtuRCxZQUFZLE9BQWdEO1FBQzFELElBQUksQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQztRQUNuQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQztJQUN6QyxDQUFDO0lBRUQsSUFBWSxNQUFNO1FBQ2hCLE9BQU8sSUFBQSxpQ0FBYSxFQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVELElBQVksY0FBYztRQUN4QixPQUFPLElBQUEsa0NBQWdCLEVBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFlO1FBQ3hCLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFDeEIsTUFBTSxPQUFPLEdBQUcsSUFBQSwyQkFBUyxFQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUU5QyxNQUFNLEtBQUssR0FBRyxJQUFJLGFBQUssQ0FBQztZQUN0QixVQUFVLEVBQUU7Z0JBQ1Y7b0JBQ0UsSUFBSSxFQUFFLGtDQUFrQztvQkFDeEMsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLE9BQU8sRUFBK0IsRUFBRSxFQUFFO3dCQUNyRCx1RkFBdUY7d0JBQ3ZGLG1CQUFtQjt3QkFDbkIsTUFBTSxPQUFP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
|
|
@@ -14,9 +14,9 @@ export default class DatabaseStore implements RunStore {
|
|
|
14
14
|
private get tableId();
|
|
15
15
|
private get tableReference();
|
|
16
16
|
init(logger?: Logger): Promise<void>;
|
|
17
|
-
private withMigrationLock;
|
|
18
17
|
getStepExecutions(runId: string): Promise<StepExecutionData[]>;
|
|
19
18
|
saveStepExecution(runId: string, stepExecution: StepExecutionData): Promise<void>;
|
|
19
|
+
deleteStepExecution(runId: string, stepIndex: number): Promise<void>;
|
|
20
20
|
close(logger?: Logger): Promise<void>;
|
|
21
21
|
private callPort;
|
|
22
22
|
}
|
|
@@ -3,25 +3,21 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
const sequelize_1 = require("sequelize");
|
|
4
4
|
const umzug_1 = require("umzug");
|
|
5
5
|
const errors_1 = require("../errors");
|
|
6
|
+
const schema_migrations_1 = require("./schema-migrations");
|
|
6
7
|
const TABLE_NAME = 'workflow_step_executions';
|
|
7
|
-
const DEFAULT_SCHEMA = 'forest';
|
|
8
|
-
// Must stay constant across releases, or an old and a new deploy could migrate concurrently.
|
|
9
|
-
const MIGRATION_ADVISORY_LOCK_KEY = 6438071259157;
|
|
10
8
|
class DatabaseStore {
|
|
11
9
|
constructor(options) {
|
|
12
10
|
this.sequelize = options.sequelize;
|
|
13
11
|
this.configuredSchema = options.schema;
|
|
14
12
|
}
|
|
15
13
|
get schema() {
|
|
16
|
-
|
|
17
|
-
return undefined;
|
|
18
|
-
return this.configuredSchema || DEFAULT_SCHEMA;
|
|
14
|
+
return (0, schema_migrations_1.resolveSchema)(this.sequelize, this.configuredSchema);
|
|
19
15
|
}
|
|
20
16
|
get tableId() {
|
|
21
|
-
return
|
|
17
|
+
return (0, schema_migrations_1.tableId)(this.schema, TABLE_NAME);
|
|
22
18
|
}
|
|
23
19
|
get tableReference() {
|
|
24
|
-
return
|
|
20
|
+
return (0, schema_migrations_1.tableReference)(this.schema, TABLE_NAME);
|
|
25
21
|
}
|
|
26
22
|
async init(logger) {
|
|
27
23
|
const { schema, tableId } = this;
|
|
@@ -88,47 +84,13 @@ class DatabaseStore {
|
|
|
88
84
|
}),
|
|
89
85
|
logger: undefined,
|
|
90
86
|
});
|
|
91
|
-
return this.callPort('init',
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
const { pool } = this.sequelize.connectionManager;
|
|
99
|
-
const poolMax = pool?.maxSize ?? 1;
|
|
100
|
-
if (poolMax < 2) {
|
|
101
|
-
throw new Error('workflow-executor requires pool.max >= 2 on Postgres: the migration lock holds one connection while migrations run on another');
|
|
102
|
-
}
|
|
103
|
-
// Schema in its own committed transaction so umzug (on other connections) sees it.
|
|
104
|
-
if (schema) {
|
|
105
|
-
await this.withMigrationLock(transaction => this.sequelize.query(`CREATE SCHEMA IF NOT EXISTS "${schema}"`, { transaction }));
|
|
106
|
-
}
|
|
107
|
-
await this.withMigrationLock(() => umzug.up());
|
|
108
|
-
}
|
|
109
|
-
catch (error) {
|
|
110
|
-
logger?.('Error', 'Database migration failed', {
|
|
111
|
-
error: (0, errors_1.extractErrorMessage)(error),
|
|
112
|
-
});
|
|
113
|
-
throw error;
|
|
114
|
-
}
|
|
115
|
-
});
|
|
116
|
-
}
|
|
117
|
-
// Serializes booting instances via a transaction-scoped advisory lock: auto-releases at commit
|
|
118
|
-
// and is pooler-safe (RDS Proxy / PgBouncer), unlike a session lock which would leak there.
|
|
119
|
-
async withMigrationLock(run) {
|
|
120
|
-
await this.sequelize.transaction(async (transaction) => {
|
|
121
|
-
// Stop a client idle-in-transaction timeout from killing this idle txn mid-migration,
|
|
122
|
-
// which would drop the lock.
|
|
123
|
-
await this.sequelize.query('SET LOCAL idle_in_transaction_session_timeout = 0', {
|
|
124
|
-
transaction,
|
|
125
|
-
});
|
|
126
|
-
await this.sequelize.query('SELECT pg_advisory_xact_lock($1)', {
|
|
127
|
-
bind: [MIGRATION_ADVISORY_LOCK_KEY],
|
|
128
|
-
transaction,
|
|
129
|
-
});
|
|
130
|
-
await run(transaction);
|
|
131
|
-
});
|
|
87
|
+
return this.callPort('init', () => (0, schema_migrations_1.runMigrations)({
|
|
88
|
+
sequelize: this.sequelize,
|
|
89
|
+
umzug,
|
|
90
|
+
schema,
|
|
91
|
+
logger,
|
|
92
|
+
failMessage: 'Database migration failed',
|
|
93
|
+
}));
|
|
132
94
|
}
|
|
133
95
|
async getStepExecutions(runId) {
|
|
134
96
|
return this.callPort('getStepExecutions', async () => {
|
|
@@ -148,6 +110,11 @@ class DatabaseStore {
|
|
|
148
110
|
});
|
|
149
111
|
});
|
|
150
112
|
}
|
|
113
|
+
async deleteStepExecution(runId, stepIndex) {
|
|
114
|
+
return this.callPort('deleteStepExecution', async () => {
|
|
115
|
+
await this.sequelize.query(`DELETE FROM ${this.tableReference} WHERE run_id = :runId AND step_index = :stepIndex`, { replacements: { runId, stepIndex } });
|
|
116
|
+
});
|
|
117
|
+
}
|
|
151
118
|
async close(logger) {
|
|
152
119
|
return this.callPort('close', async () => {
|
|
153
120
|
try {
|
|
@@ -172,4 +139,4 @@ class DatabaseStore {
|
|
|
172
139
|
}
|
|
173
140
|
}
|
|
174
141
|
exports.default = DatabaseStore;
|
|
175
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
142
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJhc2Utc3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc3RvcmVzL2RhdGFiYXNlLXN0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBS0EseUNBQXNDO0FBQ3RDLGlDQUFnRDtBQUVoRCxzQ0FBMEY7QUFDMUYsMkRBSzZCO0FBRTdCLE1BQU0sVUFBVSxHQUFHLDBCQUEwQixDQUFDO0FBTzlDLE1BQXFCLGFBQWE7SUFLaEMsWUFBWSxPQUE2QjtRQUN2QyxJQUFJLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUM7UUFDbkMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7SUFDekMsQ0FBQztJQUVELElBQVksTUFBTTtRQUNoQixPQUFPLElBQUEsaUNBQWEsRUFBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFRCxJQUFZLE9BQU87UUFDakIsT0FBTyxJQUFBLDJCQUFTLEVBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQsSUFBWSxjQUFjO1FBQ3hCLE9BQU8sSUFBQSxrQ0FBZ0IsRUFBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRCxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQWU7UUFDeEIsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFFakMsTUFBTSxLQUFLLEdBQUcsSUFBSSxhQUFLLENBQUM7WUFDdEIsVUFBVSxFQUFFO2dCQUNWO29CQUNFLElBQUksRUFBRSxxQ0FBcUM7b0JBQzNDLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxPQUFPLEVBQStCLEVBQUUsRUFBRTt3QkFDckQsbUZBQW1GO3dCQUNuRix5QkFBeUI7d0JBQ3pCLE1BQU0sT0FBTyxDQUFDLFNBQVMs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
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { McpOAuthCredentialInput, McpOAuthCredentialsStore, StoredMcpOAuthCredential } from '../ports/mcp-oauth-credentials-store';
|
|
2
|
+
export default class InMemoryMcpOAuthCredentialsStore implements McpOAuthCredentialsStore {
|
|
3
|
+
private readonly data;
|
|
4
|
+
private nextId;
|
|
5
|
+
init(): Promise<void>;
|
|
6
|
+
close(): Promise<void>;
|
|
7
|
+
get(userId: number, mcpServerId: string): Promise<StoredMcpOAuthCredential | null>;
|
|
8
|
+
upsert(credential: McpOAuthCredentialInput): Promise<void>;
|
|
9
|
+
updateIfPresent(id: number, credential: McpOAuthCredentialInput): Promise<void>;
|
|
10
|
+
delete(userId: number, mcpServerId: string): Promise<void>;
|
|
11
|
+
private static key;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=in-memory-mcp-oauth-credentials-store.d.ts.map
|