@agent-deck/backend 1.1.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/dist/.tsbuildinfo +1 -0
- package/dist/cli-runtime.d.ts +4 -0
- package/dist/cli-runtime.d.ts.map +1 -0
- package/dist/cli-runtime.js +12 -0
- package/dist/cli-runtime.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +30 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/agent-deck-context.d.ts +8 -0
- package/dist/lib/agent-deck-context.d.ts.map +1 -0
- package/dist/lib/agent-deck-context.js +48 -0
- package/dist/lib/agent-deck-context.js.map +1 -0
- package/dist/lib/bound-deck-scope.d.ts +15 -0
- package/dist/lib/bound-deck-scope.d.ts.map +1 -0
- package/dist/lib/bound-deck-scope.js +68 -0
- package/dist/lib/bound-deck-scope.js.map +1 -0
- package/dist/lib/client-scope.d.ts +14 -0
- package/dist/lib/client-scope.d.ts.map +1 -0
- package/dist/lib/client-scope.js +46 -0
- package/dist/lib/client-scope.js.map +1 -0
- package/dist/lib/paths.d.ts +2 -0
- package/dist/lib/paths.d.ts.map +1 -0
- package/dist/lib/paths.js +24 -0
- package/dist/lib/paths.js.map +1 -0
- package/dist/lib/version.d.ts +3 -0
- package/dist/lib/version.d.ts.map +1 -0
- package/dist/lib/version.js +20 -0
- package/dist/lib/version.js.map +1 -0
- package/dist/mcp-index.d.ts +2 -0
- package/dist/mcp-index.d.ts.map +1 -0
- package/dist/mcp-index.js +32 -0
- package/dist/mcp-index.js.map +1 -0
- package/dist/mcp-server.d.ts +25 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +1121 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/mcp-stdio.d.ts +2 -0
- package/dist/mcp-stdio.d.ts.map +1 -0
- package/dist/mcp-stdio.js.map +1 -0
- package/dist/models/database.d.ts +64 -0
- package/dist/models/database.d.ts.map +1 -0
- package/dist/models/database.js +965 -0
- package/dist/models/database.js.map +1 -0
- package/dist/playbooks/playbook-manager.d.ts +29 -0
- package/dist/playbooks/playbook-manager.d.ts.map +1 -0
- package/dist/playbooks/playbook-manager.js +198 -0
- package/dist/playbooks/playbook-manager.js.map +1 -0
- package/dist/playbooks/playbook-parser.d.ts +8 -0
- package/dist/playbooks/playbook-parser.d.ts.map +1 -0
- package/dist/playbooks/playbook-parser.js +76 -0
- package/dist/playbooks/playbook-parser.js.map +1 -0
- package/dist/playbooks/playbook-service.d.ts +9 -0
- package/dist/playbooks/playbook-service.d.ts.map +1 -0
- package/dist/playbooks/playbook-service.js +107 -0
- package/dist/playbooks/playbook-service.js.map +1 -0
- package/dist/routes/collection.d.ts +3 -0
- package/dist/routes/collection.d.ts.map +1 -0
- package/dist/routes/collection.js +34 -0
- package/dist/routes/collection.js.map +1 -0
- package/dist/routes/credentials.d.ts +3 -0
- package/dist/routes/credentials.d.ts.map +1 -0
- package/dist/routes/credentials.js +241 -0
- package/dist/routes/credentials.js.map +1 -0
- package/dist/routes/decks.d.ts +3 -0
- package/dist/routes/decks.d.ts.map +1 -0
- package/dist/routes/decks.js +430 -0
- package/dist/routes/decks.js.map +1 -0
- package/dist/routes/local-mcp.d.ts +3 -0
- package/dist/routes/local-mcp.d.ts.map +1 -0
- package/dist/routes/local-mcp.js +189 -0
- package/dist/routes/local-mcp.js.map +1 -0
- package/dist/routes/mcp.d.ts +3 -0
- package/dist/routes/mcp.d.ts.map +1 -0
- package/dist/routes/mcp.js +170 -0
- package/dist/routes/mcp.js.map +1 -0
- package/dist/routes/oauth.d.ts +3 -0
- package/dist/routes/oauth.d.ts.map +1 -0
- package/dist/routes/oauth.js +242 -0
- package/dist/routes/oauth.js.map +1 -0
- package/dist/routes/playbooks.d.ts +5 -0
- package/dist/routes/playbooks.d.ts.map +1 -0
- package/dist/routes/playbooks.js +220 -0
- package/dist/routes/playbooks.js.map +1 -0
- package/dist/routes/scope.d.ts +3 -0
- package/dist/routes/scope.d.ts.map +1 -0
- package/dist/routes/scope.js +107 -0
- package/dist/routes/scope.js.map +1 -0
- package/dist/routes/services.d.ts +3 -0
- package/dist/routes/services.d.ts.map +1 -0
- package/dist/routes/services.js +281 -0
- package/dist/routes/services.js.map +1 -0
- package/dist/routes/websocket.d.ts +11 -0
- package/dist/routes/websocket.d.ts.map +1 -0
- package/dist/routes/websocket.js +154 -0
- package/dist/routes/websocket.js.map +1 -0
- package/dist/scope/repo-deck.d.ts +10 -0
- package/dist/scope/repo-deck.d.ts.map +1 -0
- package/dist/scope/repo-deck.js +63 -0
- package/dist/scope/repo-deck.js.map +1 -0
- package/dist/server/index.d.ts +24 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +111 -0
- package/dist/server/index.js.map +1 -0
- package/dist/services/collection-warning-service.d.ts +18 -0
- package/dist/services/collection-warning-service.d.ts.map +1 -0
- package/dist/services/collection-warning-service.js +129 -0
- package/dist/services/collection-warning-service.js.map +1 -0
- package/dist/services/config-manager.d.ts +32 -0
- package/dist/services/config-manager.d.ts.map +1 -0
- package/dist/services/config-manager.js +119 -0
- package/dist/services/config-manager.js.map +1 -0
- package/dist/services/icon-resolver.d.ts +20 -0
- package/dist/services/icon-resolver.d.ts.map +1 -0
- package/dist/services/icon-resolver.js +224 -0
- package/dist/services/icon-resolver.js.map +1 -0
- package/dist/services/local-mcp-server-manager.d.ts +51 -0
- package/dist/services/local-mcp-server-manager.d.ts.map +1 -0
- package/dist/services/local-mcp-server-manager.js +246 -0
- package/dist/services/local-mcp-server-manager.js.map +1 -0
- package/dist/services/mcp-client-manager.d.ts +22 -0
- package/dist/services/mcp-client-manager.d.ts.map +1 -0
- package/dist/services/mcp-client-manager.js +257 -0
- package/dist/services/mcp-client-manager.js.map +1 -0
- package/dist/services/mcp-discovery-service.d.ts +31 -0
- package/dist/services/mcp-discovery-service.d.ts.map +1 -0
- package/dist/services/mcp-discovery-service.js +164 -0
- package/dist/services/mcp-discovery-service.js.map +1 -0
- package/dist/services/oauth-manager.d.ts +25 -0
- package/dist/services/oauth-manager.d.ts.map +1 -0
- package/dist/services/oauth-manager.js +365 -0
- package/dist/services/oauth-manager.js.map +1 -0
- package/dist/services/service-manager.d.ts +61 -0
- package/dist/services/service-manager.d.ts.map +1 -0
- package/dist/services/service-manager.js +447 -0
- package/dist/services/service-manager.js.map +1 -0
- package/dist/test-local-mcp-e2e.d.ts +3 -0
- package/dist/test-local-mcp-e2e.d.ts.map +1 -0
- package/dist/test-local-mcp-e2e.js +104 -0
- package/dist/test-local-mcp-e2e.js.map +1 -0
- package/dist/test-local-mcp.d.ts +3 -0
- package/dist/test-local-mcp.d.ts.map +1 -0
- package/dist/test-local-mcp.js +54 -0
- package/dist/test-local-mcp.js.map +1 -0
- package/dist/vault/credential-manager.d.ts +45 -0
- package/dist/vault/credential-manager.d.ts.map +1 -0
- package/dist/vault/credential-manager.js +237 -0
- package/dist/vault/credential-manager.js.map +1 -0
- package/dist/vault/index.d.ts +4 -0
- package/dist/vault/index.d.ts.map +1 -0
- package/dist/vault/index.js +20 -0
- package/dist/vault/index.js.map +1 -0
- package/dist/vault/secret-store.d.ts +36 -0
- package/dist/vault/secret-store.d.ts.map +1 -0
- package/dist/vault/secret-store.js +207 -0
- package/dist/vault/secret-store.js.map +1 -0
- package/dist/vault/yaml-sync.d.ts +8 -0
- package/dist/vault/yaml-sync.d.ts.map +1 -0
- package/dist/vault/yaml-sync.js +60 -0
- package/dist/vault/yaml-sync.js.map +1 -0
- package/package.json +64 -0
- package/static-ui/assets/AgentDeckLogo2-z3pVqJJ3.png +0 -0
- package/static-ui/assets/index-BnA3AsqY.css +1 -0
- package/static-ui/assets/index-D1IuraRt.js +334 -0
- package/static-ui/favicon.png +0 -0
- package/static-ui/index.html +17 -0
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MCPDiscoveryService = void 0;
|
|
4
|
+
class MCPDiscoveryService {
|
|
5
|
+
async discoverService(url) {
|
|
6
|
+
const result = {
|
|
7
|
+
success: false,
|
|
8
|
+
transport_type: 'http',
|
|
9
|
+
url,
|
|
10
|
+
tools_count: 0,
|
|
11
|
+
tools: [],
|
|
12
|
+
capabilities: {
|
|
13
|
+
supports_tool_discovery: false,
|
|
14
|
+
supports_tool_calling: false,
|
|
15
|
+
},
|
|
16
|
+
oauth: {
|
|
17
|
+
required: false,
|
|
18
|
+
},
|
|
19
|
+
health: 'unknown',
|
|
20
|
+
error: null,
|
|
21
|
+
};
|
|
22
|
+
try {
|
|
23
|
+
// First, check for OAuth requirements
|
|
24
|
+
const oauthInfo = await this.detectOAuthRequirements(url);
|
|
25
|
+
result.oauth = oauthInfo;
|
|
26
|
+
if (oauthInfo.required) {
|
|
27
|
+
// Service requires OAuth, mark as successful discovery
|
|
28
|
+
result.success = true;
|
|
29
|
+
result.health = 'oauth_required';
|
|
30
|
+
return result;
|
|
31
|
+
}
|
|
32
|
+
// Try basic MCP discovery without OAuth
|
|
33
|
+
const basicResult = await this.tryBasicDiscovery(url);
|
|
34
|
+
return basicResult;
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
result.error = error instanceof Error ? error.message : 'Unknown error';
|
|
38
|
+
return result;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
async tryBasicDiscovery(url) {
|
|
42
|
+
const result = {
|
|
43
|
+
success: false,
|
|
44
|
+
transport_type: 'http',
|
|
45
|
+
url,
|
|
46
|
+
tools_count: 0,
|
|
47
|
+
tools: [],
|
|
48
|
+
capabilities: {
|
|
49
|
+
supports_tool_discovery: false,
|
|
50
|
+
supports_tool_calling: false,
|
|
51
|
+
},
|
|
52
|
+
oauth: {
|
|
53
|
+
required: false,
|
|
54
|
+
},
|
|
55
|
+
health: 'unknown',
|
|
56
|
+
error: null,
|
|
57
|
+
};
|
|
58
|
+
try {
|
|
59
|
+
// Try a simple HTTP request to check if the service is reachable
|
|
60
|
+
const response = await fetch(url, {
|
|
61
|
+
method: 'GET',
|
|
62
|
+
headers: {
|
|
63
|
+
'Accept': 'application/json, text/event-stream',
|
|
64
|
+
},
|
|
65
|
+
});
|
|
66
|
+
if (response.ok) {
|
|
67
|
+
result.success = true;
|
|
68
|
+
result.health = 'healthy';
|
|
69
|
+
result.capabilities.supports_tool_discovery = true;
|
|
70
|
+
result.capabilities.supports_tool_calling = true;
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
result.error = `HTTP ${response.status}: ${response.statusText}`;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
result.error = error instanceof Error ? error.message : 'Connection failed';
|
|
78
|
+
}
|
|
79
|
+
return result;
|
|
80
|
+
}
|
|
81
|
+
async detectOAuthRequirements(url) {
|
|
82
|
+
const oauthInfo = {
|
|
83
|
+
required: false,
|
|
84
|
+
};
|
|
85
|
+
try {
|
|
86
|
+
// Check for OAuth metadata endpoints
|
|
87
|
+
const baseUrl = new URL(url);
|
|
88
|
+
// Try OAuth Protected Resource metadata (RFC 9449)
|
|
89
|
+
const prUrl = `${baseUrl.origin}/.well-known/oauth-protected-resource`;
|
|
90
|
+
try {
|
|
91
|
+
const response = await fetch(prUrl);
|
|
92
|
+
if (response.ok) {
|
|
93
|
+
const data = await response.json();
|
|
94
|
+
oauthInfo.required = true;
|
|
95
|
+
oauthInfo.resourceName = data.resource_name;
|
|
96
|
+
oauthInfo.scopesSupported = data.scopes_supported || [];
|
|
97
|
+
oauthInfo.bearerMethodsSupported = data.bearer_methods_supported || [];
|
|
98
|
+
// Check for authorization servers
|
|
99
|
+
const authServers = data.authorization_servers || [];
|
|
100
|
+
if (authServers.length > 0) {
|
|
101
|
+
const asUrl = authServers[0];
|
|
102
|
+
const asResponse = await fetch(`${asUrl}/.well-known/oauth-authorization-server`);
|
|
103
|
+
if (asResponse.ok) {
|
|
104
|
+
const asData = await asResponse.json();
|
|
105
|
+
oauthInfo.authorizationUrl = asData.authorization_endpoint;
|
|
106
|
+
oauthInfo.tokenUrl = asData.token_endpoint;
|
|
107
|
+
oauthInfo.issuer = asData.issuer;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return oauthInfo;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
// Ignore errors for this endpoint
|
|
115
|
+
}
|
|
116
|
+
// Try OAuth Authorization Server metadata
|
|
117
|
+
const asUrl = `${baseUrl.origin}/.well-known/oauth-authorization-server`;
|
|
118
|
+
try {
|
|
119
|
+
const response = await fetch(asUrl);
|
|
120
|
+
if (response.ok) {
|
|
121
|
+
const data = await response.json();
|
|
122
|
+
oauthInfo.required = true;
|
|
123
|
+
oauthInfo.authorizationUrl = data.authorization_endpoint;
|
|
124
|
+
oauthInfo.tokenUrl = data.token_endpoint;
|
|
125
|
+
oauthInfo.issuer = data.issuer;
|
|
126
|
+
oauthInfo.scopesSupported = data.scopes_supported || [];
|
|
127
|
+
return oauthInfo;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
// Ignore errors for this endpoint
|
|
132
|
+
}
|
|
133
|
+
// Check for WWW-Authenticate header
|
|
134
|
+
try {
|
|
135
|
+
const response = await fetch(url, {
|
|
136
|
+
method: 'GET',
|
|
137
|
+
headers: {
|
|
138
|
+
'Accept': 'application/json, text/event-stream',
|
|
139
|
+
},
|
|
140
|
+
});
|
|
141
|
+
const wwwAuth = response.headers.get('www-authenticate');
|
|
142
|
+
if (wwwAuth && wwwAuth.toLowerCase().includes('oauth')) {
|
|
143
|
+
oauthInfo.required = true;
|
|
144
|
+
// Extract URLs from WWW-Authenticate header
|
|
145
|
+
const urlRegex = /https?:\/\/[^\s,;\"]+/g;
|
|
146
|
+
const urls = wwwAuth.match(urlRegex) || [];
|
|
147
|
+
if (urls.length > 0) {
|
|
148
|
+
oauthInfo.authorizationUrl = urls[0];
|
|
149
|
+
}
|
|
150
|
+
return oauthInfo;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
// Ignore errors for this check
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
catch (error) {
|
|
158
|
+
oauthInfo.error = error instanceof Error ? error.message : 'OAuth detection failed';
|
|
159
|
+
}
|
|
160
|
+
return oauthInfo;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
exports.MCPDiscoveryService = MCPDiscoveryService;
|
|
164
|
+
//# sourceMappingURL=mcp-discovery-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-discovery-service.js","sourceRoot":"","sources":["../../src/services/mcp-discovery-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { OAuthDiscoveryResult, OAuthConfig, OAuthToken, OAuthFlowInput, OAuthCallbackInput, OAuthRefreshInput } from '@agent-deck/shared';
|
|
2
|
+
import { DatabaseManager } from '../models/database';
|
|
3
|
+
export declare class OAuthManager {
|
|
4
|
+
private db;
|
|
5
|
+
private oauthStates;
|
|
6
|
+
getOAuthState(state: string): string | undefined;
|
|
7
|
+
constructor(db: DatabaseManager);
|
|
8
|
+
discoverOAuth(serviceUrl: string): Promise<OAuthDiscoveryResult>;
|
|
9
|
+
initiateOAuthFlow(input: OAuthFlowInput): Promise<{
|
|
10
|
+
authorizationUrl: string;
|
|
11
|
+
state: string;
|
|
12
|
+
}>;
|
|
13
|
+
handleOAuthCallback(input: OAuthCallbackInput): Promise<OAuthToken>;
|
|
14
|
+
refreshOAuthToken(input: OAuthRefreshInput): Promise<OAuthToken>;
|
|
15
|
+
isTokenExpired(serviceId: string): Promise<boolean>;
|
|
16
|
+
getValidAccessToken(serviceId: string): Promise<string | null>;
|
|
17
|
+
autoRegisterOAuthApp(serviceUrl: string, config: OAuthConfig): Promise<{
|
|
18
|
+
success: boolean;
|
|
19
|
+
clientId?: string;
|
|
20
|
+
clientSecret?: string;
|
|
21
|
+
error?: string;
|
|
22
|
+
registrationUrl?: string;
|
|
23
|
+
}>;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=oauth-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-manager.d.ts","sourceRoot":"","sources":["../../src/services/oauth-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,WAAW,EACX,UAAU,EACV,cAAc,EACd,kBAAkB,EAClB,iBAAiB,EAClB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAwBrD,qBAAa,YAAY;IAOX,OAAO,CAAC,EAAE;IANtB,OAAO,CAAC,WAAW,CAA6B;IAEhD,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;gBAI5B,EAAE,EAAE,eAAe;IAEjC,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAkEhE,iBAAiB,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC;QAAE,gBAAgB,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IA8B9F,mBAAmB,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,UAAU,CAAC;IA8EnE,iBAAiB,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,UAAU,CAAC;IAoDhE,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAanD,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IA4B9D,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC;QAC3E,OAAO,EAAE,OAAO,CAAC;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,CAAC;CAyIH"}
|
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OAuthManager = void 0;
|
|
4
|
+
const crypto_1 = require("crypto");
|
|
5
|
+
class OAuthManager {
|
|
6
|
+
db;
|
|
7
|
+
oauthStates = new Map(); // state -> serviceId mapping
|
|
8
|
+
getOAuthState(state) {
|
|
9
|
+
return this.oauthStates.get(state);
|
|
10
|
+
}
|
|
11
|
+
constructor(db) {
|
|
12
|
+
this.db = db;
|
|
13
|
+
}
|
|
14
|
+
async discoverOAuth(serviceUrl) {
|
|
15
|
+
try {
|
|
16
|
+
// Try to get OAuth metadata from the service
|
|
17
|
+
const response = await fetch(`${serviceUrl}/.well-known/oauth-authorization-server`, {
|
|
18
|
+
method: 'GET',
|
|
19
|
+
headers: {
|
|
20
|
+
'Accept': 'application/json',
|
|
21
|
+
},
|
|
22
|
+
});
|
|
23
|
+
if (response.ok) {
|
|
24
|
+
const metadata = await response.json();
|
|
25
|
+
const config = {
|
|
26
|
+
clientId: '', // Will be provided by user
|
|
27
|
+
clientSecret: '', // Will be provided by user
|
|
28
|
+
authorizationUrl: metadata.authorization_endpoint || '',
|
|
29
|
+
tokenUrl: metadata.token_endpoint || '',
|
|
30
|
+
redirectUri: '', // Will be set during OAuth flow
|
|
31
|
+
scope: metadata.scopes_supported?.[0] || 'read write',
|
|
32
|
+
};
|
|
33
|
+
return {
|
|
34
|
+
hasOAuth: true,
|
|
35
|
+
config,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
// Try alternative discovery methods
|
|
39
|
+
const alternativeResponse = await fetch(`${serviceUrl}/oauth/metadata`, {
|
|
40
|
+
method: 'GET',
|
|
41
|
+
headers: {
|
|
42
|
+
'Accept': 'application/json',
|
|
43
|
+
},
|
|
44
|
+
});
|
|
45
|
+
if (alternativeResponse.ok) {
|
|
46
|
+
const metadata = await alternativeResponse.json();
|
|
47
|
+
const config = {
|
|
48
|
+
clientId: '',
|
|
49
|
+
clientSecret: '',
|
|
50
|
+
authorizationUrl: metadata.authorizationUrl || metadata.authorization_endpoint || '',
|
|
51
|
+
tokenUrl: metadata.tokenUrl || metadata.token_endpoint || '',
|
|
52
|
+
redirectUri: '',
|
|
53
|
+
scope: metadata.scope || 'read write',
|
|
54
|
+
};
|
|
55
|
+
return {
|
|
56
|
+
hasOAuth: true,
|
|
57
|
+
config,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
return {
|
|
61
|
+
hasOAuth: false,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
console.warn('OAuth discovery failed:', error);
|
|
66
|
+
return {
|
|
67
|
+
hasOAuth: false,
|
|
68
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
async initiateOAuthFlow(input) {
|
|
73
|
+
const service = await this.db.getService(input.serviceId);
|
|
74
|
+
if (!service) {
|
|
75
|
+
throw new Error(`Service ${input.serviceId} not found`);
|
|
76
|
+
}
|
|
77
|
+
if (!service.oauthAuthorizationUrl) {
|
|
78
|
+
throw new Error('Service does not have OAuth configuration');
|
|
79
|
+
}
|
|
80
|
+
// Generate state parameter for security
|
|
81
|
+
const state = (0, crypto_1.randomBytes)(32).toString('hex');
|
|
82
|
+
// Store state mapping in memory
|
|
83
|
+
this.oauthStates.set(state, input.serviceId);
|
|
84
|
+
// Build authorization URL
|
|
85
|
+
const url = new URL(service.oauthAuthorizationUrl);
|
|
86
|
+
url.searchParams.set('response_type', 'code');
|
|
87
|
+
url.searchParams.set('client_id', service.oauthClientId || '');
|
|
88
|
+
url.searchParams.set('redirect_uri', input.redirectUri);
|
|
89
|
+
url.searchParams.set('scope', service.oauthScope || 'read write');
|
|
90
|
+
url.searchParams.set('state', state);
|
|
91
|
+
return {
|
|
92
|
+
authorizationUrl: url.toString(),
|
|
93
|
+
state,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
async handleOAuthCallback(input) {
|
|
97
|
+
// Extract service ID from state parameter
|
|
98
|
+
const serviceId = this.oauthStates.get(input.state);
|
|
99
|
+
if (!serviceId) {
|
|
100
|
+
throw new Error('Invalid or expired OAuth state parameter');
|
|
101
|
+
}
|
|
102
|
+
// Clean up the state after successful retrieval
|
|
103
|
+
this.oauthStates.delete(input.state);
|
|
104
|
+
const service = await this.db.getService(serviceId);
|
|
105
|
+
if (!service) {
|
|
106
|
+
throw new Error(`Service ${serviceId} not found`);
|
|
107
|
+
}
|
|
108
|
+
if (!service.oauthTokenUrl) {
|
|
109
|
+
throw new Error('Service does not have OAuth token URL configured');
|
|
110
|
+
}
|
|
111
|
+
// Use the exact same redirect URI that was used in the authorization request
|
|
112
|
+
// This should match the redirect URI stored in the service configuration
|
|
113
|
+
const redirectUri = service.oauthRedirectUri || 'http://localhost:3000/oauth/callback';
|
|
114
|
+
console.log('OAuth callback debug:', {
|
|
115
|
+
serviceId: input.serviceId,
|
|
116
|
+
clientId: service.oauthClientId,
|
|
117
|
+
redirectUri,
|
|
118
|
+
tokenUrl: service.oauthTokenUrl,
|
|
119
|
+
});
|
|
120
|
+
// Exchange authorization code for tokens
|
|
121
|
+
const tokenResponse = await fetch(service.oauthTokenUrl, {
|
|
122
|
+
method: 'POST',
|
|
123
|
+
headers: {
|
|
124
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
125
|
+
},
|
|
126
|
+
body: new URLSearchParams({
|
|
127
|
+
grant_type: 'authorization_code',
|
|
128
|
+
client_id: service.oauthClientId || '',
|
|
129
|
+
client_secret: service.oauthClientSecret || '',
|
|
130
|
+
code: input.code,
|
|
131
|
+
redirect_uri: redirectUri,
|
|
132
|
+
}),
|
|
133
|
+
});
|
|
134
|
+
if (!tokenResponse.ok) {
|
|
135
|
+
const errorText = await tokenResponse.text();
|
|
136
|
+
throw new Error(`OAuth token exchange failed: ${tokenResponse.status} ${errorText}`);
|
|
137
|
+
}
|
|
138
|
+
const tokenData = await tokenResponse.json();
|
|
139
|
+
const token = {
|
|
140
|
+
accessToken: tokenData.access_token,
|
|
141
|
+
refreshToken: tokenData.refresh_token,
|
|
142
|
+
expiresAt: tokenData.expires_in ?
|
|
143
|
+
new Date(Date.now() + tokenData.expires_in * 1000).toISOString() :
|
|
144
|
+
undefined,
|
|
145
|
+
tokenType: tokenData.token_type || 'Bearer',
|
|
146
|
+
scope: tokenData.scope,
|
|
147
|
+
};
|
|
148
|
+
// Store tokens in database
|
|
149
|
+
await this.db.updateOAuthTokens(serviceId, token.accessToken, token.refreshToken, token.expiresAt);
|
|
150
|
+
// Clear state - we'll need to implement this properly
|
|
151
|
+
// await this.db.updateService(input.serviceId, {
|
|
152
|
+
// oauthState: undefined,
|
|
153
|
+
// });
|
|
154
|
+
return token;
|
|
155
|
+
}
|
|
156
|
+
async refreshOAuthToken(input) {
|
|
157
|
+
const service = await this.db.getService(input.serviceId);
|
|
158
|
+
if (!service) {
|
|
159
|
+
throw new Error(`Service ${input.serviceId} not found`);
|
|
160
|
+
}
|
|
161
|
+
if (!service.oauthTokenUrl) {
|
|
162
|
+
throw new Error('Service does not have OAuth token URL configured');
|
|
163
|
+
}
|
|
164
|
+
// Exchange refresh token for new access token
|
|
165
|
+
const tokenResponse = await fetch(service.oauthTokenUrl, {
|
|
166
|
+
method: 'POST',
|
|
167
|
+
headers: {
|
|
168
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
169
|
+
},
|
|
170
|
+
body: new URLSearchParams({
|
|
171
|
+
grant_type: 'refresh_token',
|
|
172
|
+
client_id: service.oauthClientId || '',
|
|
173
|
+
client_secret: service.oauthClientSecret || '',
|
|
174
|
+
refresh_token: input.refreshToken,
|
|
175
|
+
}),
|
|
176
|
+
});
|
|
177
|
+
if (!tokenResponse.ok) {
|
|
178
|
+
const errorText = await tokenResponse.text();
|
|
179
|
+
throw new Error(`OAuth token refresh failed: ${tokenResponse.status} ${errorText}`);
|
|
180
|
+
}
|
|
181
|
+
const tokenData = await tokenResponse.json();
|
|
182
|
+
const token = {
|
|
183
|
+
accessToken: tokenData.access_token,
|
|
184
|
+
refreshToken: tokenData.refresh_token || input.refreshToken,
|
|
185
|
+
expiresAt: tokenData.expires_in ?
|
|
186
|
+
new Date(Date.now() + tokenData.expires_in * 1000).toISOString() :
|
|
187
|
+
undefined,
|
|
188
|
+
tokenType: tokenData.token_type || 'Bearer',
|
|
189
|
+
scope: tokenData.scope,
|
|
190
|
+
};
|
|
191
|
+
// Store new tokens in database
|
|
192
|
+
await this.db.updateOAuthTokens(input.serviceId, token.accessToken, token.refreshToken, token.expiresAt);
|
|
193
|
+
return token;
|
|
194
|
+
}
|
|
195
|
+
async isTokenExpired(serviceId) {
|
|
196
|
+
const service = await this.db.getService(serviceId);
|
|
197
|
+
if (!service || !service.oauthTokenExpiresAt) {
|
|
198
|
+
return true;
|
|
199
|
+
}
|
|
200
|
+
const expiresAt = new Date(service.oauthTokenExpiresAt);
|
|
201
|
+
const now = new Date();
|
|
202
|
+
// Consider token expired if it expires within the next 5 minutes
|
|
203
|
+
return expiresAt.getTime() <= now.getTime() + 5 * 60 * 1000;
|
|
204
|
+
}
|
|
205
|
+
async getValidAccessToken(serviceId) {
|
|
206
|
+
const service = await this.db.getService(serviceId);
|
|
207
|
+
if (!service || !service.oauthAccessToken) {
|
|
208
|
+
return null;
|
|
209
|
+
}
|
|
210
|
+
// Check if token is expired
|
|
211
|
+
if (await this.isTokenExpired(serviceId)) {
|
|
212
|
+
// Try to refresh the token
|
|
213
|
+
if (service.oauthRefreshToken) {
|
|
214
|
+
try {
|
|
215
|
+
const newToken = await this.refreshOAuthToken({
|
|
216
|
+
serviceId,
|
|
217
|
+
refreshToken: service.oauthRefreshToken,
|
|
218
|
+
});
|
|
219
|
+
return newToken.accessToken;
|
|
220
|
+
}
|
|
221
|
+
catch (error) {
|
|
222
|
+
console.error(`Failed to refresh OAuth token for service ${serviceId}:`, error);
|
|
223
|
+
return null;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
else {
|
|
227
|
+
return null;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
return service.oauthAccessToken;
|
|
231
|
+
}
|
|
232
|
+
async autoRegisterOAuthApp(serviceUrl, config) {
|
|
233
|
+
try {
|
|
234
|
+
const baseUrl = new URL(serviceUrl);
|
|
235
|
+
console.log('Attempting OAuth auto-registration for:', serviceUrl);
|
|
236
|
+
// Step 1: Try to get OAuth information from the MCP service itself
|
|
237
|
+
console.log('Step 1: Checking MCP service OAuth capabilities');
|
|
238
|
+
try {
|
|
239
|
+
// Try to get OAuth metadata from the MCP service
|
|
240
|
+
const oauthMetadataUrl = `${baseUrl.origin}/.well-known/oauth-authorization-server`;
|
|
241
|
+
console.log('Trying OAuth metadata at:', oauthMetadataUrl);
|
|
242
|
+
const metadataResponse = await fetch(oauthMetadataUrl);
|
|
243
|
+
if (metadataResponse.ok) {
|
|
244
|
+
const metadata = await metadataResponse.json();
|
|
245
|
+
console.log('OAuth metadata found:', metadata);
|
|
246
|
+
if (metadata.registration_endpoint) {
|
|
247
|
+
console.log('Found registration endpoint:', metadata.registration_endpoint);
|
|
248
|
+
// Try dynamic client registration with the MCP service
|
|
249
|
+
const registrationResponse = await fetch(metadata.registration_endpoint, {
|
|
250
|
+
method: 'POST',
|
|
251
|
+
headers: {
|
|
252
|
+
'Content-Type': 'application/json',
|
|
253
|
+
'Accept': 'application/json',
|
|
254
|
+
},
|
|
255
|
+
body: JSON.stringify({
|
|
256
|
+
client_name: 'AgentDeck',
|
|
257
|
+
redirect_uris: [`http://localhost:8000/api/oauth/callback`],
|
|
258
|
+
grant_types: ['authorization_code', 'refresh_token'],
|
|
259
|
+
response_types: ['code'],
|
|
260
|
+
token_endpoint_auth_method: 'client_secret_basic',
|
|
261
|
+
scope: config.scope || 'read write',
|
|
262
|
+
}),
|
|
263
|
+
});
|
|
264
|
+
if (registrationResponse.ok) {
|
|
265
|
+
const data = await registrationResponse.json();
|
|
266
|
+
console.log('Dynamic client registration successful:', data);
|
|
267
|
+
// Validate that we got real client credentials
|
|
268
|
+
if (data.client_id && data.client_secret &&
|
|
269
|
+
typeof data.client_id === 'string' &&
|
|
270
|
+
typeof data.client_secret === 'string' &&
|
|
271
|
+
data.client_id.length > 10 &&
|
|
272
|
+
data.client_secret.length > 10) {
|
|
273
|
+
return {
|
|
274
|
+
success: true,
|
|
275
|
+
clientId: data.client_id,
|
|
276
|
+
clientSecret: data.client_secret,
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
else {
|
|
280
|
+
console.log('Invalid client credentials received from MCP service');
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
else {
|
|
284
|
+
console.log('MCP service registration failed:', await registrationResponse.text());
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
else {
|
|
288
|
+
console.log('No registration endpoint found in MCP service OAuth metadata');
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
console.log('MCP service OAuth metadata not found at:', oauthMetadataUrl);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
catch (error) {
|
|
296
|
+
console.log('Failed to get OAuth metadata from MCP service:', error);
|
|
297
|
+
}
|
|
298
|
+
// Step 2: Try MCP service-specific OAuth registration endpoints
|
|
299
|
+
console.log('Step 2: Trying MCP service-specific OAuth registration');
|
|
300
|
+
const mcpOAuthEndpoints = [
|
|
301
|
+
`${serviceUrl}/oauth/register`,
|
|
302
|
+
`${serviceUrl}/oauth/credentials`,
|
|
303
|
+
`${baseUrl.origin}/oauth/register`,
|
|
304
|
+
`${baseUrl.origin}/oauth/credentials`,
|
|
305
|
+
];
|
|
306
|
+
for (const endpoint of mcpOAuthEndpoints) {
|
|
307
|
+
try {
|
|
308
|
+
console.log('Trying MCP OAuth endpoint:', endpoint);
|
|
309
|
+
const response = await fetch(endpoint, {
|
|
310
|
+
method: 'POST',
|
|
311
|
+
headers: {
|
|
312
|
+
'Content-Type': 'application/json',
|
|
313
|
+
'Accept': 'application/json',
|
|
314
|
+
},
|
|
315
|
+
body: JSON.stringify({
|
|
316
|
+
client_name: 'AgentDeck',
|
|
317
|
+
redirect_uri: `http://localhost:8000/api/oauth/callback`,
|
|
318
|
+
scope: config.scope || 'read write',
|
|
319
|
+
}),
|
|
320
|
+
});
|
|
321
|
+
if (response.ok) {
|
|
322
|
+
const data = await response.json();
|
|
323
|
+
console.log('MCP OAuth registration successful at:', endpoint, data);
|
|
324
|
+
// Validate that we got real client credentials
|
|
325
|
+
if (data.client_id && data.client_secret &&
|
|
326
|
+
typeof data.client_id === 'string' &&
|
|
327
|
+
typeof data.client_secret === 'string' &&
|
|
328
|
+
data.client_id.length > 10 &&
|
|
329
|
+
data.client_secret.length > 10) {
|
|
330
|
+
return {
|
|
331
|
+
success: true,
|
|
332
|
+
clientId: data.client_id,
|
|
333
|
+
clientSecret: data.client_secret,
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
else {
|
|
337
|
+
console.log('Invalid client credentials received from MCP endpoint:', endpoint);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
else {
|
|
341
|
+
console.log('MCP OAuth endpoint failed:', endpoint, await response.text());
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
catch (error) {
|
|
345
|
+
console.log('MCP OAuth endpoint error:', endpoint, error);
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
// Step 3: If all automated methods fail, provide generic manual registration instructions
|
|
349
|
+
console.log('Step 3: All automated registration methods failed, providing manual instructions');
|
|
350
|
+
return {
|
|
351
|
+
success: false,
|
|
352
|
+
error: 'This OAuth provider requires manual registration. Please create an OAuth application and add your credentials.',
|
|
353
|
+
};
|
|
354
|
+
}
|
|
355
|
+
catch (error) {
|
|
356
|
+
console.log('OAuth auto-registration failed:', error);
|
|
357
|
+
return {
|
|
358
|
+
success: false,
|
|
359
|
+
error: error instanceof Error ? error.message : 'Auto-registration failed',
|
|
360
|
+
};
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
exports.OAuthManager = OAuthManager;
|
|
365
|
+
//# sourceMappingURL=oauth-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-manager.js","sourceRoot":"","sources":["../../src/services/oauth-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { Service, CreateServiceInput, UpdateServiceInput, ServiceTool, ServiceCallInput, ServiceCallResult, UpdateServiceToolSettingsInput, ServiceStatusUpdate } from '@agent-deck/shared';
|
|
2
|
+
import { DatabaseManager } from '../models/database';
|
|
3
|
+
import { MCPClientManager } from './mcp-client-manager';
|
|
4
|
+
import { OAuthManager } from './oauth-manager';
|
|
5
|
+
export declare class ServiceManager {
|
|
6
|
+
private db;
|
|
7
|
+
private mcpClient;
|
|
8
|
+
private oauthManager;
|
|
9
|
+
private configManager;
|
|
10
|
+
constructor(db: DatabaseManager, mcpClient: MCPClientManager, oauthManager: OAuthManager);
|
|
11
|
+
get mcpClientManager(): MCPClientManager;
|
|
12
|
+
createService(input: CreateServiceInput): Promise<Service>;
|
|
13
|
+
private probeInitialHealth;
|
|
14
|
+
refreshUnknownServiceHealth(onUpdate?: (update: ServiceStatusUpdate) => void): Promise<void>;
|
|
15
|
+
private shouldBackgroundProbe;
|
|
16
|
+
refreshServiceIcon(serviceId: string): Promise<Service | null>;
|
|
17
|
+
getService(id: string): Promise<Service | null>;
|
|
18
|
+
getAllServices(): Promise<Service[]>;
|
|
19
|
+
updateService(id: string, input: UpdateServiceInput): Promise<Service | null>;
|
|
20
|
+
deleteService(id: string): Promise<boolean>;
|
|
21
|
+
discoverServiceTools(serviceId: string, options?: {
|
|
22
|
+
forAgent?: boolean;
|
|
23
|
+
}): Promise<ServiceTool[] | {
|
|
24
|
+
success: false;
|
|
25
|
+
error: string;
|
|
26
|
+
}>;
|
|
27
|
+
updateToolSettings(serviceId: string, input: UpdateServiceToolSettingsInput): Promise<Service | null>;
|
|
28
|
+
private annotateToolEnabledState;
|
|
29
|
+
callServiceTool(input: ServiceCallInput): Promise<ServiceCallResult>;
|
|
30
|
+
checkServiceHealth(serviceId: string): Promise<{
|
|
31
|
+
success: boolean;
|
|
32
|
+
health: string;
|
|
33
|
+
isConnected: boolean;
|
|
34
|
+
} | {
|
|
35
|
+
success: false;
|
|
36
|
+
error: string;
|
|
37
|
+
}>;
|
|
38
|
+
private discoverA2ATools;
|
|
39
|
+
private callA2ATool;
|
|
40
|
+
/**
|
|
41
|
+
* Import local MCP servers from JSON configuration
|
|
42
|
+
*/
|
|
43
|
+
importLocalServersFromConfig(jsonContent: string): Promise<Service[]>;
|
|
44
|
+
/**
|
|
45
|
+
* Get sample configuration
|
|
46
|
+
*/
|
|
47
|
+
getSampleConfig(): string;
|
|
48
|
+
/**
|
|
49
|
+
* Start a local MCP server
|
|
50
|
+
*/
|
|
51
|
+
startLocalServer(serviceId: string): Promise<void>;
|
|
52
|
+
/**
|
|
53
|
+
* Stop a local MCP server
|
|
54
|
+
*/
|
|
55
|
+
stopLocalServer(serviceId: string): Promise<void>;
|
|
56
|
+
/**
|
|
57
|
+
* Get local MCP server status
|
|
58
|
+
*/
|
|
59
|
+
getLocalServerStatus(serviceId: string): Promise<any>;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=service-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-manager.d.ts","sourceRoot":"","sources":["../../src/services/service-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EACP,kBAAkB,EAClB,kBAAkB,EAClB,WAAW,EACX,gBAAgB,EAChB,iBAAiB,EAIjB,8BAA8B,EAC9B,mBAAmB,EACpB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAmB/C,qBAAa,cAAc;IAIvB,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,YAAY;IALtB,OAAO,CAAC,aAAa,CAAgB;gBAG3B,EAAE,EAAE,eAAe,EACnB,SAAS,EAAE,gBAAgB,EAC3B,YAAY,EAAE,YAAY;IAKpC,IAAI,gBAAgB,IAAI,gBAAgB,CAEvC;IAEK,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,OAAO,CAAC;IA0ChE,OAAO,CAAC,kBAAkB;IAMpB,2BAA2B,CAC/B,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,mBAAmB,KAAK,IAAI,GAC/C,OAAO,CAAC,IAAI,CAAC;IAwBhB,OAAO,CAAC,qBAAqB;IA0BvB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAoB9D,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAI/C,cAAc,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAIpC,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAO7E,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA6B3C,oBAAoB,CACxB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,GAC/B,OAAO,CAAC,WAAW,EAAE,GAAG;QAAE,OAAO,EAAE,KAAK,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAgCvD,kBAAkB,CACtB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,8BAA8B,GACpC,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAgB1B,OAAO,CAAC,wBAAwB;IAW1B,eAAe,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAmDpE,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,OAAO,CAAA;KAAE,GAAG;QAAE,OAAO,EAAE,KAAK,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;YAsBtI,gBAAgB;YA2BhB,WAAW;IAsBzB;;OAEG;IACG,4BAA4B,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAwC3E;;OAEG;IACH,eAAe,IAAI,MAAM;IAKzB;;OAEG;IACG,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAcxD;;OAEG;IACG,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBvD;;OAEG;IACG,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;CA+B5D"}
|