@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.
Files changed (166) hide show
  1. package/dist/.tsbuildinfo +1 -0
  2. package/dist/cli-runtime.d.ts +4 -0
  3. package/dist/cli-runtime.d.ts.map +1 -0
  4. package/dist/cli-runtime.js +12 -0
  5. package/dist/cli-runtime.js.map +1 -0
  6. package/dist/index.d.ts +2 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +30 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/lib/agent-deck-context.d.ts +8 -0
  11. package/dist/lib/agent-deck-context.d.ts.map +1 -0
  12. package/dist/lib/agent-deck-context.js +48 -0
  13. package/dist/lib/agent-deck-context.js.map +1 -0
  14. package/dist/lib/bound-deck-scope.d.ts +15 -0
  15. package/dist/lib/bound-deck-scope.d.ts.map +1 -0
  16. package/dist/lib/bound-deck-scope.js +68 -0
  17. package/dist/lib/bound-deck-scope.js.map +1 -0
  18. package/dist/lib/client-scope.d.ts +14 -0
  19. package/dist/lib/client-scope.d.ts.map +1 -0
  20. package/dist/lib/client-scope.js +46 -0
  21. package/dist/lib/client-scope.js.map +1 -0
  22. package/dist/lib/paths.d.ts +2 -0
  23. package/dist/lib/paths.d.ts.map +1 -0
  24. package/dist/lib/paths.js +24 -0
  25. package/dist/lib/paths.js.map +1 -0
  26. package/dist/lib/version.d.ts +3 -0
  27. package/dist/lib/version.d.ts.map +1 -0
  28. package/dist/lib/version.js +20 -0
  29. package/dist/lib/version.js.map +1 -0
  30. package/dist/mcp-index.d.ts +2 -0
  31. package/dist/mcp-index.d.ts.map +1 -0
  32. package/dist/mcp-index.js +32 -0
  33. package/dist/mcp-index.js.map +1 -0
  34. package/dist/mcp-server.d.ts +25 -0
  35. package/dist/mcp-server.d.ts.map +1 -0
  36. package/dist/mcp-server.js +1121 -0
  37. package/dist/mcp-server.js.map +1 -0
  38. package/dist/mcp-stdio.d.ts +2 -0
  39. package/dist/mcp-stdio.d.ts.map +1 -0
  40. package/dist/mcp-stdio.js.map +1 -0
  41. package/dist/models/database.d.ts +64 -0
  42. package/dist/models/database.d.ts.map +1 -0
  43. package/dist/models/database.js +965 -0
  44. package/dist/models/database.js.map +1 -0
  45. package/dist/playbooks/playbook-manager.d.ts +29 -0
  46. package/dist/playbooks/playbook-manager.d.ts.map +1 -0
  47. package/dist/playbooks/playbook-manager.js +198 -0
  48. package/dist/playbooks/playbook-manager.js.map +1 -0
  49. package/dist/playbooks/playbook-parser.d.ts +8 -0
  50. package/dist/playbooks/playbook-parser.d.ts.map +1 -0
  51. package/dist/playbooks/playbook-parser.js +76 -0
  52. package/dist/playbooks/playbook-parser.js.map +1 -0
  53. package/dist/playbooks/playbook-service.d.ts +9 -0
  54. package/dist/playbooks/playbook-service.d.ts.map +1 -0
  55. package/dist/playbooks/playbook-service.js +107 -0
  56. package/dist/playbooks/playbook-service.js.map +1 -0
  57. package/dist/routes/collection.d.ts +3 -0
  58. package/dist/routes/collection.d.ts.map +1 -0
  59. package/dist/routes/collection.js +34 -0
  60. package/dist/routes/collection.js.map +1 -0
  61. package/dist/routes/credentials.d.ts +3 -0
  62. package/dist/routes/credentials.d.ts.map +1 -0
  63. package/dist/routes/credentials.js +241 -0
  64. package/dist/routes/credentials.js.map +1 -0
  65. package/dist/routes/decks.d.ts +3 -0
  66. package/dist/routes/decks.d.ts.map +1 -0
  67. package/dist/routes/decks.js +430 -0
  68. package/dist/routes/decks.js.map +1 -0
  69. package/dist/routes/local-mcp.d.ts +3 -0
  70. package/dist/routes/local-mcp.d.ts.map +1 -0
  71. package/dist/routes/local-mcp.js +189 -0
  72. package/dist/routes/local-mcp.js.map +1 -0
  73. package/dist/routes/mcp.d.ts +3 -0
  74. package/dist/routes/mcp.d.ts.map +1 -0
  75. package/dist/routes/mcp.js +170 -0
  76. package/dist/routes/mcp.js.map +1 -0
  77. package/dist/routes/oauth.d.ts +3 -0
  78. package/dist/routes/oauth.d.ts.map +1 -0
  79. package/dist/routes/oauth.js +242 -0
  80. package/dist/routes/oauth.js.map +1 -0
  81. package/dist/routes/playbooks.d.ts +5 -0
  82. package/dist/routes/playbooks.d.ts.map +1 -0
  83. package/dist/routes/playbooks.js +220 -0
  84. package/dist/routes/playbooks.js.map +1 -0
  85. package/dist/routes/scope.d.ts +3 -0
  86. package/dist/routes/scope.d.ts.map +1 -0
  87. package/dist/routes/scope.js +107 -0
  88. package/dist/routes/scope.js.map +1 -0
  89. package/dist/routes/services.d.ts +3 -0
  90. package/dist/routes/services.d.ts.map +1 -0
  91. package/dist/routes/services.js +281 -0
  92. package/dist/routes/services.js.map +1 -0
  93. package/dist/routes/websocket.d.ts +11 -0
  94. package/dist/routes/websocket.d.ts.map +1 -0
  95. package/dist/routes/websocket.js +154 -0
  96. package/dist/routes/websocket.js.map +1 -0
  97. package/dist/scope/repo-deck.d.ts +10 -0
  98. package/dist/scope/repo-deck.d.ts.map +1 -0
  99. package/dist/scope/repo-deck.js +63 -0
  100. package/dist/scope/repo-deck.js.map +1 -0
  101. package/dist/server/index.d.ts +24 -0
  102. package/dist/server/index.d.ts.map +1 -0
  103. package/dist/server/index.js +111 -0
  104. package/dist/server/index.js.map +1 -0
  105. package/dist/services/collection-warning-service.d.ts +18 -0
  106. package/dist/services/collection-warning-service.d.ts.map +1 -0
  107. package/dist/services/collection-warning-service.js +129 -0
  108. package/dist/services/collection-warning-service.js.map +1 -0
  109. package/dist/services/config-manager.d.ts +32 -0
  110. package/dist/services/config-manager.d.ts.map +1 -0
  111. package/dist/services/config-manager.js +119 -0
  112. package/dist/services/config-manager.js.map +1 -0
  113. package/dist/services/icon-resolver.d.ts +20 -0
  114. package/dist/services/icon-resolver.d.ts.map +1 -0
  115. package/dist/services/icon-resolver.js +224 -0
  116. package/dist/services/icon-resolver.js.map +1 -0
  117. package/dist/services/local-mcp-server-manager.d.ts +51 -0
  118. package/dist/services/local-mcp-server-manager.d.ts.map +1 -0
  119. package/dist/services/local-mcp-server-manager.js +246 -0
  120. package/dist/services/local-mcp-server-manager.js.map +1 -0
  121. package/dist/services/mcp-client-manager.d.ts +22 -0
  122. package/dist/services/mcp-client-manager.d.ts.map +1 -0
  123. package/dist/services/mcp-client-manager.js +257 -0
  124. package/dist/services/mcp-client-manager.js.map +1 -0
  125. package/dist/services/mcp-discovery-service.d.ts +31 -0
  126. package/dist/services/mcp-discovery-service.d.ts.map +1 -0
  127. package/dist/services/mcp-discovery-service.js +164 -0
  128. package/dist/services/mcp-discovery-service.js.map +1 -0
  129. package/dist/services/oauth-manager.d.ts +25 -0
  130. package/dist/services/oauth-manager.d.ts.map +1 -0
  131. package/dist/services/oauth-manager.js +365 -0
  132. package/dist/services/oauth-manager.js.map +1 -0
  133. package/dist/services/service-manager.d.ts +61 -0
  134. package/dist/services/service-manager.d.ts.map +1 -0
  135. package/dist/services/service-manager.js +447 -0
  136. package/dist/services/service-manager.js.map +1 -0
  137. package/dist/test-local-mcp-e2e.d.ts +3 -0
  138. package/dist/test-local-mcp-e2e.d.ts.map +1 -0
  139. package/dist/test-local-mcp-e2e.js +104 -0
  140. package/dist/test-local-mcp-e2e.js.map +1 -0
  141. package/dist/test-local-mcp.d.ts +3 -0
  142. package/dist/test-local-mcp.d.ts.map +1 -0
  143. package/dist/test-local-mcp.js +54 -0
  144. package/dist/test-local-mcp.js.map +1 -0
  145. package/dist/vault/credential-manager.d.ts +45 -0
  146. package/dist/vault/credential-manager.d.ts.map +1 -0
  147. package/dist/vault/credential-manager.js +237 -0
  148. package/dist/vault/credential-manager.js.map +1 -0
  149. package/dist/vault/index.d.ts +4 -0
  150. package/dist/vault/index.d.ts.map +1 -0
  151. package/dist/vault/index.js +20 -0
  152. package/dist/vault/index.js.map +1 -0
  153. package/dist/vault/secret-store.d.ts +36 -0
  154. package/dist/vault/secret-store.d.ts.map +1 -0
  155. package/dist/vault/secret-store.js +207 -0
  156. package/dist/vault/secret-store.js.map +1 -0
  157. package/dist/vault/yaml-sync.d.ts +8 -0
  158. package/dist/vault/yaml-sync.d.ts.map +1 -0
  159. package/dist/vault/yaml-sync.js +60 -0
  160. package/dist/vault/yaml-sync.js.map +1 -0
  161. package/package.json +64 -0
  162. package/static-ui/assets/AgentDeckLogo2-z3pVqJJ3.png +0 -0
  163. package/static-ui/assets/index-BnA3AsqY.css +1 -0
  164. package/static-ui/assets/index-D1IuraRt.js +334 -0
  165. package/static-ui/favicon.png +0 -0
  166. 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"}