@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,119 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ConfigManager = void 0;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
// Validation schemas
|
|
6
|
+
const LocalMCPServerConfigSchema = zod_1.z.object({
|
|
7
|
+
command: zod_1.z.string().min(1, 'Command is required'),
|
|
8
|
+
args: zod_1.z.array(zod_1.z.string()).optional().default([]),
|
|
9
|
+
workingDir: zod_1.z.string().optional(),
|
|
10
|
+
env: zod_1.z.record(zod_1.z.string()).optional(),
|
|
11
|
+
});
|
|
12
|
+
const MCPServersManifestSchema = zod_1.z.object({
|
|
13
|
+
mcpServers: zod_1.z.record(zod_1.z.string(), LocalMCPServerConfigSchema),
|
|
14
|
+
});
|
|
15
|
+
class ConfigManager {
|
|
16
|
+
/**
|
|
17
|
+
* Parse and validate MCP servers manifest from JSON
|
|
18
|
+
*/
|
|
19
|
+
parseManifest(jsonContent) {
|
|
20
|
+
try {
|
|
21
|
+
const parsed = JSON.parse(jsonContent);
|
|
22
|
+
const validated = MCPServersManifestSchema.parse(parsed);
|
|
23
|
+
return validated;
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
if (error instanceof zod_1.z.ZodError) {
|
|
27
|
+
throw new Error(`Invalid manifest format: ${error.errors.map(e => e.message).join(', ')}`);
|
|
28
|
+
}
|
|
29
|
+
throw new Error(`Failed to parse JSON: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Convert manifest to service creation inputs
|
|
34
|
+
*/
|
|
35
|
+
manifestToServices(manifest) {
|
|
36
|
+
const services = [];
|
|
37
|
+
for (const [name, config] of Object.entries(manifest.mcpServers)) {
|
|
38
|
+
const service = {
|
|
39
|
+
name,
|
|
40
|
+
type: 'local-mcp',
|
|
41
|
+
url: `local://${name}`, // Use a local URL scheme for local servers
|
|
42
|
+
description: `Local MCP server: ${config.command} ${config.args.join(' ')}`,
|
|
43
|
+
cardColor: '#92E4DD', // Cyan for local MCP servers
|
|
44
|
+
localCommand: config.command,
|
|
45
|
+
localArgs: config.args,
|
|
46
|
+
localWorkingDir: config.workingDir,
|
|
47
|
+
localEnv: config.env,
|
|
48
|
+
};
|
|
49
|
+
services.push(service);
|
|
50
|
+
}
|
|
51
|
+
return services;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Validate a single local MCP server configuration
|
|
55
|
+
*/
|
|
56
|
+
validateLocalServerConfig(config) {
|
|
57
|
+
LocalMCPServerConfigSchema.parse(config);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Generate a sample manifest
|
|
61
|
+
*/
|
|
62
|
+
generateSampleManifest() {
|
|
63
|
+
return {
|
|
64
|
+
mcpServers: {
|
|
65
|
+
memory: {
|
|
66
|
+
command: "npx",
|
|
67
|
+
args: ["-y", "@modelcontextprotocol/server-memory"]
|
|
68
|
+
},
|
|
69
|
+
filesystem: {
|
|
70
|
+
command: "npx",
|
|
71
|
+
args: ["-y", "@modelcontextprotocol/server-filesystem"],
|
|
72
|
+
env: {
|
|
73
|
+
MCP_SERVER_FILESYSTEM_ROOT: "/path/to/root"
|
|
74
|
+
}
|
|
75
|
+
},
|
|
76
|
+
git: {
|
|
77
|
+
command: "python",
|
|
78
|
+
args: ["-m", "mcp.server.git"],
|
|
79
|
+
workingDir: "/path/to/git/repo"
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Convert manifest to JSON string
|
|
86
|
+
*/
|
|
87
|
+
manifestToJson(manifest) {
|
|
88
|
+
return JSON.stringify(manifest, null, 2);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Check if a command is safe to execute (basic security check)
|
|
92
|
+
*/
|
|
93
|
+
isCommandSafe(command) {
|
|
94
|
+
const unsafeCommands = [
|
|
95
|
+
'rm', 'del', 'format', 'mkfs', 'dd', 'shred',
|
|
96
|
+
'sudo', 'su', 'chmod', 'chown', 'mount', 'umount'
|
|
97
|
+
];
|
|
98
|
+
const lowerCommand = command.toLowerCase();
|
|
99
|
+
return !unsafeCommands.some(unsafe => lowerCommand.includes(unsafe));
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Validate and sanitize environment variables
|
|
103
|
+
*/
|
|
104
|
+
sanitizeEnvironment(env) {
|
|
105
|
+
const sanitized = {};
|
|
106
|
+
for (const [key, value] of Object.entries(env)) {
|
|
107
|
+
// Only allow safe environment variable names
|
|
108
|
+
if (/^[A-Z_][A-Z0-9_]*$/.test(key)) {
|
|
109
|
+
sanitized[key] = value;
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
console.warn(`⚠️ Skipping potentially unsafe environment variable: ${key}`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return sanitized;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
exports.ConfigManager = ConfigManager;
|
|
119
|
+
//# sourceMappingURL=config-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-manager.js","sourceRoot":"","sources":["../../src/services/config-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export type IconResolveResult = {
|
|
2
|
+
iconPath: string | null;
|
|
3
|
+
source: string | null;
|
|
4
|
+
domain: string | null;
|
|
5
|
+
};
|
|
6
|
+
export declare function getServiceIconsDir(): string;
|
|
7
|
+
export declare function getServiceIconPath(serviceId: string): string;
|
|
8
|
+
export declare function serviceIconApiPath(serviceId: string): string;
|
|
9
|
+
export declare function credentialIconApiPath(credentialId: string): string;
|
|
10
|
+
export declare function removeCachedIcon(entityId: string): Promise<void>;
|
|
11
|
+
/** Derive likely product domains from an MCP server URL. */
|
|
12
|
+
export declare function brandingDomainsFromUrl(urlString: string): string[];
|
|
13
|
+
export declare function resolveIconForUrl(urlString: string): Promise<{
|
|
14
|
+
buffer: Buffer;
|
|
15
|
+
source: string;
|
|
16
|
+
domain: string;
|
|
17
|
+
} | null>;
|
|
18
|
+
export declare function cacheIconForService(serviceId: string, urlString: string): Promise<IconResolveResult>;
|
|
19
|
+
export declare function cacheIconForCredential(credentialId: string, urlString: string): Promise<IconResolveResult>;
|
|
20
|
+
//# sourceMappingURL=icon-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icon-resolver.d.ts","sourceRoot":"","sources":["../../src/services/icon-resolver.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB,CAAC;AAEF,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAElE;AAED,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAStE;AAED,4DAA4D;AAC5D,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAqClE;AAkHD,wBAAsB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;IAClE,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,IAAI,CAAC,CAwBR;AAED,wBAAsB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAE1G;AAED,wBAAsB,sBAAsB,CAC1C,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,iBAAiB,CAAC,CAE5B"}
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.getServiceIconsDir = getServiceIconsDir;
|
|
7
|
+
exports.getServiceIconPath = getServiceIconPath;
|
|
8
|
+
exports.serviceIconApiPath = serviceIconApiPath;
|
|
9
|
+
exports.credentialIconApiPath = credentialIconApiPath;
|
|
10
|
+
exports.removeCachedIcon = removeCachedIcon;
|
|
11
|
+
exports.brandingDomainsFromUrl = brandingDomainsFromUrl;
|
|
12
|
+
exports.resolveIconForUrl = resolveIconForUrl;
|
|
13
|
+
exports.cacheIconForService = cacheIconForService;
|
|
14
|
+
exports.cacheIconForCredential = cacheIconForCredential;
|
|
15
|
+
const promises_1 = __importDefault(require("node:fs/promises"));
|
|
16
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
17
|
+
const yaml_sync_1 = require("../vault/yaml-sync");
|
|
18
|
+
const FETCH_TIMEOUT_MS = 8000;
|
|
19
|
+
const MAX_ICON_BYTES = 512 * 1024;
|
|
20
|
+
function getServiceIconsDir() {
|
|
21
|
+
return node_path_1.default.join((0, yaml_sync_1.getAgentDeckHome)(), 'icons');
|
|
22
|
+
}
|
|
23
|
+
function getServiceIconPath(serviceId) {
|
|
24
|
+
return node_path_1.default.join(getServiceIconsDir(), `${serviceId}.ico`);
|
|
25
|
+
}
|
|
26
|
+
function serviceIconApiPath(serviceId) {
|
|
27
|
+
return `/api/services/${serviceId}/icon`;
|
|
28
|
+
}
|
|
29
|
+
function credentialIconApiPath(credentialId) {
|
|
30
|
+
return `/api/credentials/${credentialId}/icon`;
|
|
31
|
+
}
|
|
32
|
+
async function removeCachedIcon(entityId) {
|
|
33
|
+
try {
|
|
34
|
+
await promises_1.default.unlink(getServiceIconPath(entityId));
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
const nodeError = error;
|
|
38
|
+
if (nodeError.code !== 'ENOENT') {
|
|
39
|
+
throw error;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/** Derive likely product domains from an MCP server URL. */
|
|
44
|
+
function brandingDomainsFromUrl(urlString) {
|
|
45
|
+
if (urlString.startsWith('local://')) {
|
|
46
|
+
return [];
|
|
47
|
+
}
|
|
48
|
+
let hostname;
|
|
49
|
+
try {
|
|
50
|
+
hostname = new URL(urlString).hostname.toLowerCase();
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return [];
|
|
54
|
+
}
|
|
55
|
+
const domains = new Set();
|
|
56
|
+
domains.add(hostname);
|
|
57
|
+
const stripped = hostname
|
|
58
|
+
.replace(/^mcp\./, '')
|
|
59
|
+
.replace(/^api\./, '')
|
|
60
|
+
.replace(/^remote\./, '');
|
|
61
|
+
if (stripped !== hostname) {
|
|
62
|
+
domains.add(stripped);
|
|
63
|
+
}
|
|
64
|
+
if (hostname.includes('github')) {
|
|
65
|
+
domains.add('github.com');
|
|
66
|
+
}
|
|
67
|
+
const parts = stripped.split('.').filter(Boolean);
|
|
68
|
+
if (parts.length >= 2) {
|
|
69
|
+
domains.add(parts.slice(-2).join('.'));
|
|
70
|
+
}
|
|
71
|
+
if (parts.length >= 3 && parts[parts.length - 2].length <= 3) {
|
|
72
|
+
domains.add(parts.slice(-3).join('.'));
|
|
73
|
+
}
|
|
74
|
+
return [...domains];
|
|
75
|
+
}
|
|
76
|
+
async function fetchWithTimeout(url, init) {
|
|
77
|
+
const controller = new AbortController();
|
|
78
|
+
const timeout = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);
|
|
79
|
+
try {
|
|
80
|
+
return await fetch(url, {
|
|
81
|
+
...init,
|
|
82
|
+
signal: controller.signal,
|
|
83
|
+
redirect: 'follow',
|
|
84
|
+
headers: {
|
|
85
|
+
'User-Agent': 'AgentDeck/1.0 (icon resolver)',
|
|
86
|
+
Accept: 'image/*,*/*;q=0.8',
|
|
87
|
+
...(init?.headers ?? {}),
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
finally {
|
|
92
|
+
clearTimeout(timeout);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
async function readIconResponse(response) {
|
|
96
|
+
if (!response.ok) {
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
const contentType = response.headers.get('content-type') ?? '';
|
|
100
|
+
if (contentType.includes('text/html')) {
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
const arrayBuffer = await response.arrayBuffer();
|
|
104
|
+
if (arrayBuffer.byteLength === 0 || arrayBuffer.byteLength > MAX_ICON_BYTES) {
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
return Buffer.from(arrayBuffer);
|
|
108
|
+
}
|
|
109
|
+
function extractIconHref(html, pageUrl) {
|
|
110
|
+
const linkTags = html.match(/<link[^>]+>/gi) ?? [];
|
|
111
|
+
for (const tag of linkTags) {
|
|
112
|
+
if (!/rel=["'][^"']*icon[^"']*["']/i.test(tag)) {
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
const hrefMatch = tag.match(/href=["']([^"']+)["']/i);
|
|
116
|
+
if (hrefMatch?.[1]) {
|
|
117
|
+
try {
|
|
118
|
+
return new URL(hrefMatch[1], pageUrl).toString();
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
async function tryDirectFavicon(domain) {
|
|
128
|
+
for (const scheme of ['https', 'http']) {
|
|
129
|
+
const faviconUrl = `${scheme}://${domain}/favicon.ico`;
|
|
130
|
+
try {
|
|
131
|
+
const response = await fetchWithTimeout(faviconUrl);
|
|
132
|
+
const buffer = await readIconResponse(response);
|
|
133
|
+
if (buffer) {
|
|
134
|
+
return { buffer, source: faviconUrl };
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
// try next
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return null;
|
|
142
|
+
}
|
|
143
|
+
async function tryHomepageIcon(domain) {
|
|
144
|
+
const homepage = `https://${domain}/`;
|
|
145
|
+
try {
|
|
146
|
+
const response = await fetchWithTimeout(homepage, {
|
|
147
|
+
headers: { Accept: 'text/html,application/xhtml+xml' },
|
|
148
|
+
});
|
|
149
|
+
if (!response.ok) {
|
|
150
|
+
return null;
|
|
151
|
+
}
|
|
152
|
+
const html = await response.text();
|
|
153
|
+
const iconHref = extractIconHref(html, homepage);
|
|
154
|
+
if (!iconHref) {
|
|
155
|
+
return null;
|
|
156
|
+
}
|
|
157
|
+
const iconResponse = await fetchWithTimeout(iconHref);
|
|
158
|
+
const buffer = await readIconResponse(iconResponse);
|
|
159
|
+
if (buffer) {
|
|
160
|
+
return { buffer, source: iconHref };
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
return null;
|
|
165
|
+
}
|
|
166
|
+
return null;
|
|
167
|
+
}
|
|
168
|
+
async function tryGoogleFavicon(domain) {
|
|
169
|
+
const faviconUrl = `https://www.google.com/s2/favicons?domain=${encodeURIComponent(domain)}&sz=128`;
|
|
170
|
+
try {
|
|
171
|
+
const response = await fetchWithTimeout(faviconUrl);
|
|
172
|
+
const buffer = await readIconResponse(response);
|
|
173
|
+
if (buffer && buffer.byteLength > 200) {
|
|
174
|
+
return { buffer, source: faviconUrl };
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
return null;
|
|
179
|
+
}
|
|
180
|
+
return null;
|
|
181
|
+
}
|
|
182
|
+
async function resolveIconForUrl(urlString) {
|
|
183
|
+
const domains = brandingDomainsFromUrl(urlString);
|
|
184
|
+
if (domains.length === 0) {
|
|
185
|
+
return null;
|
|
186
|
+
}
|
|
187
|
+
for (const domain of domains) {
|
|
188
|
+
const direct = await tryDirectFavicon(domain);
|
|
189
|
+
if (direct) {
|
|
190
|
+
return { ...direct, domain };
|
|
191
|
+
}
|
|
192
|
+
const homepage = await tryHomepageIcon(domain);
|
|
193
|
+
if (homepage) {
|
|
194
|
+
return { ...homepage, domain };
|
|
195
|
+
}
|
|
196
|
+
const google = await tryGoogleFavicon(domain);
|
|
197
|
+
if (google) {
|
|
198
|
+
return { ...google, domain };
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
return null;
|
|
202
|
+
}
|
|
203
|
+
async function cacheIconForService(serviceId, urlString) {
|
|
204
|
+
return cacheIconForEntity(serviceId, urlString);
|
|
205
|
+
}
|
|
206
|
+
async function cacheIconForCredential(credentialId, urlString) {
|
|
207
|
+
return cacheIconForEntity(credentialId, urlString);
|
|
208
|
+
}
|
|
209
|
+
async function cacheIconForEntity(entityId, urlString) {
|
|
210
|
+
const resolved = await resolveIconForUrl(urlString);
|
|
211
|
+
if (!resolved) {
|
|
212
|
+
return { iconPath: null, source: null, domain: null };
|
|
213
|
+
}
|
|
214
|
+
const iconsDir = getServiceIconsDir();
|
|
215
|
+
await promises_1.default.mkdir(iconsDir, { recursive: true });
|
|
216
|
+
const iconPath = getServiceIconPath(entityId);
|
|
217
|
+
await promises_1.default.writeFile(iconPath, resolved.buffer);
|
|
218
|
+
return {
|
|
219
|
+
iconPath,
|
|
220
|
+
source: resolved.source,
|
|
221
|
+
domain: resolved.domain,
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
//# sourceMappingURL=icon-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icon-resolver.js","sourceRoot":"","sources":["../../src/services/icon-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
2
|
+
import { Service, LocalMCPServerProcess } from '@agent-deck/shared';
|
|
3
|
+
export declare class LocalMCPServerManager {
|
|
4
|
+
private processes;
|
|
5
|
+
private clients;
|
|
6
|
+
/**
|
|
7
|
+
* Start a local MCP server process
|
|
8
|
+
*/
|
|
9
|
+
startLocalServer(service: Service): Promise<LocalMCPServerProcess>;
|
|
10
|
+
/**
|
|
11
|
+
* Stop a local MCP server process
|
|
12
|
+
*/
|
|
13
|
+
stopLocalServer(serviceId: string): Promise<void>;
|
|
14
|
+
/**
|
|
15
|
+
* Get a local MCP server process
|
|
16
|
+
*/
|
|
17
|
+
getLocalServer(serviceId: string): LocalMCPServerProcess | undefined;
|
|
18
|
+
/**
|
|
19
|
+
* Get the MCP client for a local server
|
|
20
|
+
*/
|
|
21
|
+
getClient(serviceId: string): Client | undefined;
|
|
22
|
+
/**
|
|
23
|
+
* Check if a local server is running
|
|
24
|
+
*/
|
|
25
|
+
isLocalServerRunning(serviceId: string): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Discover capabilities of a local MCP server
|
|
28
|
+
*/
|
|
29
|
+
private discoverCapabilities;
|
|
30
|
+
/**
|
|
31
|
+
* Call a tool on a local MCP server
|
|
32
|
+
*/
|
|
33
|
+
callTool(serviceId: string, toolName: string, arguments_: any): Promise<any>;
|
|
34
|
+
/**
|
|
35
|
+
* Get a resource from a local MCP server
|
|
36
|
+
*/
|
|
37
|
+
getResource(serviceId: string, resourceUri: string): Promise<any>;
|
|
38
|
+
/**
|
|
39
|
+
* Get a prompt from a local MCP server
|
|
40
|
+
*/
|
|
41
|
+
getPrompt(serviceId: string, promptName: string, arguments_?: Record<string, any>): Promise<any>;
|
|
42
|
+
/**
|
|
43
|
+
* Get all running local servers
|
|
44
|
+
*/
|
|
45
|
+
getAllRunningServers(): LocalMCPServerProcess[];
|
|
46
|
+
/**
|
|
47
|
+
* Cleanup all local servers
|
|
48
|
+
*/
|
|
49
|
+
cleanup(): Promise<void>;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=local-mcp-server-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-mcp-server-manager.d.ts","sourceRoot":"","sources":["../../src/services/local-mcp-server-manager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAEnE,OAAO,EAAE,OAAO,EAAe,qBAAqB,EAAwB,MAAM,oBAAoB,CAAC;AAGvG,qBAAa,qBAAqB;IAChC,OAAO,CAAC,SAAS,CAA4C;IAC7D,OAAO,CAAC,OAAO,CAA6B;IAE5C;;OAEG;IACG,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAoExE;;OAEG;IACG,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA2BvD;;OAEG;IACH,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,qBAAqB,GAAG,SAAS;IAIpE;;OAEG;IACH,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIhD;;OAEG;IACH,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAKhD;;OAEG;YACW,oBAAoB;IAgClC;;OAEG;IACG,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IA+BlF;;OAEG;IACG,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IA6BvE;;OAEG;IACG,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC;IA8BtG;;OAEG;IACH,oBAAoB,IAAI,qBAAqB,EAAE;IAI/C;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAU/B"}
|