@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,11 @@
|
|
|
1
|
+
import { FastifyInstance } from 'fastify';
|
|
2
|
+
import { WebSocketMessage, ServiceStatusUpdate, DeckUpdate } from '@agent-deck/shared';
|
|
3
|
+
export declare function registerWebSocketRoutes(fastify: FastifyInstance): Promise<void>;
|
|
4
|
+
declare module 'fastify' {
|
|
5
|
+
interface FastifyInstance {
|
|
6
|
+
broadcastServiceUpdate: (update: ServiceStatusUpdate) => void;
|
|
7
|
+
broadcastDeckUpdate: (update: DeckUpdate) => void;
|
|
8
|
+
broadcastToAll: (message: WebSocketMessage) => void;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=websocket.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websocket.d.ts","sourceRoot":"","sources":["../../src/routes/websocket.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAkB,MAAM,SAAS,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAQvF,wBAAsB,uBAAuB,CAAC,OAAO,EAAE,eAAe,iBAwKrE;AAGD,OAAO,QAAQ,SAAS,CAAC;IACvB,UAAU,eAAe;QACvB,sBAAsB,EAAE,CAAC,MAAM,EAAE,mBAAmB,KAAK,IAAI,CAAC;QAC9D,mBAAmB,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;QAClD,cAAc,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,IAAI,CAAC;KACrD;CACF"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerWebSocketRoutes = registerWebSocketRoutes;
|
|
4
|
+
async function registerWebSocketRoutes(fastify) {
|
|
5
|
+
const connections = new Map();
|
|
6
|
+
// Enable WebSocket connections
|
|
7
|
+
fastify.get('/events', { websocket: true }, (socket, _req) => {
|
|
8
|
+
const connectionId = `conn-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
|
|
9
|
+
console.log(`WebSocket connection established: ${connectionId}`);
|
|
10
|
+
const wsConnection = {
|
|
11
|
+
id: connectionId,
|
|
12
|
+
socket,
|
|
13
|
+
subscriptions: new Set(['services', 'decks']) // Subscribe to all channels by default
|
|
14
|
+
};
|
|
15
|
+
connections.set(connectionId, wsConnection);
|
|
16
|
+
// Send welcome message
|
|
17
|
+
const welcomeMessage = {
|
|
18
|
+
type: 'connected',
|
|
19
|
+
data: { connectionId },
|
|
20
|
+
timestamp: new Date().toISOString(),
|
|
21
|
+
};
|
|
22
|
+
try {
|
|
23
|
+
socket.send(JSON.stringify(welcomeMessage));
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
console.error('Error sending welcome message:', error);
|
|
27
|
+
}
|
|
28
|
+
// Handle incoming messages
|
|
29
|
+
socket.on('message', (message) => {
|
|
30
|
+
try {
|
|
31
|
+
const parsed = JSON.parse(message);
|
|
32
|
+
switch (parsed.type) {
|
|
33
|
+
case 'subscribe':
|
|
34
|
+
handleSubscribe(wsConnection, parsed.channel);
|
|
35
|
+
break;
|
|
36
|
+
case 'unsubscribe':
|
|
37
|
+
handleUnsubscribe(wsConnection, parsed.channel);
|
|
38
|
+
break;
|
|
39
|
+
case 'ping':
|
|
40
|
+
handlePing(wsConnection);
|
|
41
|
+
break;
|
|
42
|
+
default:
|
|
43
|
+
console.log('Unknown message type:', parsed.type);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
console.error('Error parsing WebSocket message:', error);
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
// Handle connection close
|
|
51
|
+
socket.on('close', () => {
|
|
52
|
+
console.log(`WebSocket connection closed: ${connectionId}`);
|
|
53
|
+
connections.delete(connectionId);
|
|
54
|
+
});
|
|
55
|
+
// Handle connection error
|
|
56
|
+
socket.on('error', (error) => {
|
|
57
|
+
console.error(`WebSocket connection error: ${connectionId}`, error);
|
|
58
|
+
connections.delete(connectionId);
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
function handleSubscribe(connection, channel) {
|
|
62
|
+
connection.subscriptions.add(channel);
|
|
63
|
+
const message = {
|
|
64
|
+
type: 'subscribed',
|
|
65
|
+
data: { channel },
|
|
66
|
+
timestamp: new Date().toISOString(),
|
|
67
|
+
};
|
|
68
|
+
try {
|
|
69
|
+
connection.socket.send(JSON.stringify(message));
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
console.error('Error sending subscribe message:', error);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
function handleUnsubscribe(connection, channel) {
|
|
76
|
+
connection.subscriptions.delete(channel);
|
|
77
|
+
const message = {
|
|
78
|
+
type: 'unsubscribed',
|
|
79
|
+
data: { channel },
|
|
80
|
+
timestamp: new Date().toISOString(),
|
|
81
|
+
};
|
|
82
|
+
try {
|
|
83
|
+
connection.socket.send(JSON.stringify(message));
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
console.error('Error sending unsubscribe message:', error);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
function handlePing(connection) {
|
|
90
|
+
const message = {
|
|
91
|
+
type: 'pong',
|
|
92
|
+
data: {},
|
|
93
|
+
timestamp: new Date().toISOString(),
|
|
94
|
+
};
|
|
95
|
+
try {
|
|
96
|
+
connection.socket.send(JSON.stringify(message));
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
console.error('Error sending pong message:', error);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// Broadcast functions for other parts of the application
|
|
103
|
+
fastify.decorate('broadcastServiceUpdate', (update) => {
|
|
104
|
+
console.log('Broadcasting service update:', update);
|
|
105
|
+
const message = {
|
|
106
|
+
type: 'service_update',
|
|
107
|
+
data: update,
|
|
108
|
+
timestamp: new Date().toISOString(),
|
|
109
|
+
};
|
|
110
|
+
broadcastToSubscribers('services', message);
|
|
111
|
+
});
|
|
112
|
+
fastify.decorate('broadcastDeckUpdate', (update) => {
|
|
113
|
+
console.log('Broadcasting deck update:', update);
|
|
114
|
+
const message = {
|
|
115
|
+
type: 'deck_update',
|
|
116
|
+
data: update,
|
|
117
|
+
timestamp: new Date().toISOString(),
|
|
118
|
+
};
|
|
119
|
+
broadcastToSubscribers('decks', message);
|
|
120
|
+
});
|
|
121
|
+
function broadcastToSubscribers(channel, message) {
|
|
122
|
+
console.log(`Broadcasting to ${channel} channel:`, message.type, `(${connections.size} connections)`);
|
|
123
|
+
if (connections.size === 0) {
|
|
124
|
+
console.log('No WebSocket connections available for broadcasting');
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
for (const connection of connections.values()) {
|
|
128
|
+
if (connection.subscriptions.has(channel)) {
|
|
129
|
+
try {
|
|
130
|
+
connection.socket.send(JSON.stringify(message));
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
console.error(`Failed to send message to connection ${connection.id}:`, error);
|
|
134
|
+
// Remove broken connection
|
|
135
|
+
connections.delete(connection.id);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
// Broadcast to all connections
|
|
141
|
+
fastify.decorate('broadcastToAll', (message) => {
|
|
142
|
+
for (const connection of connections.values()) {
|
|
143
|
+
try {
|
|
144
|
+
connection.socket.send(JSON.stringify(message));
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
console.error(`Failed to send message to connection ${connection.id}:`, error);
|
|
148
|
+
// Remove broken connection
|
|
149
|
+
connections.delete(connection.id);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=websocket.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../src/routes/websocket.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { RepoDeckManifest } from '@agent-deck/shared';
|
|
2
|
+
export declare class RepoDeckManifestError extends Error {
|
|
3
|
+
constructor(message: string);
|
|
4
|
+
}
|
|
5
|
+
/** Lightweight parser — avoids a YAML dependency for the single-field MVP manifest. */
|
|
6
|
+
export declare function parseRepoDeckManifest(content: string): RepoDeckManifest;
|
|
7
|
+
export declare function repoDeckManifestFilePath(workspaceRoot: string): string;
|
|
8
|
+
export declare function loadRepoDeckManifest(workspaceRoot: string): Promise<RepoDeckManifest | null>;
|
|
9
|
+
export declare function formatRepoDeckManifest(deckId: string, name?: string): string;
|
|
10
|
+
//# sourceMappingURL=repo-deck.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo-deck.d.ts","sourceRoot":"","sources":["../../src/scope/repo-deck.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAmD,MAAM,oBAAoB,CAAC;AAEvG,qBAAa,qBAAsB,SAAQ,KAAK;gBAClC,OAAO,EAAE,MAAM;CAI5B;AAED,uFAAuF;AACvF,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,CAavE;AAED,wBAAgB,wBAAwB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAEtE;AAED,wBAAsB,oBAAoB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAiBlG;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAS5E"}
|
|
@@ -0,0 +1,63 @@
|
|
|
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.RepoDeckManifestError = void 0;
|
|
7
|
+
exports.parseRepoDeckManifest = parseRepoDeckManifest;
|
|
8
|
+
exports.repoDeckManifestFilePath = repoDeckManifestFilePath;
|
|
9
|
+
exports.loadRepoDeckManifest = loadRepoDeckManifest;
|
|
10
|
+
exports.formatRepoDeckManifest = formatRepoDeckManifest;
|
|
11
|
+
const promises_1 = __importDefault(require("node:fs/promises"));
|
|
12
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
13
|
+
const shared_1 = require("@agent-deck/shared");
|
|
14
|
+
class RepoDeckManifestError extends Error {
|
|
15
|
+
constructor(message) {
|
|
16
|
+
super(message);
|
|
17
|
+
this.name = 'RepoDeckManifestError';
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
exports.RepoDeckManifestError = RepoDeckManifestError;
|
|
21
|
+
/** Lightweight parser — avoids a YAML dependency for the single-field MVP manifest. */
|
|
22
|
+
function parseRepoDeckManifest(content) {
|
|
23
|
+
const deckIdMatch = content.match(/^deck_id:\s*["']?([0-9a-f-]{36})["']?\s*$/im);
|
|
24
|
+
if (!deckIdMatch) {
|
|
25
|
+
throw new RepoDeckManifestError('deck_id is required in .agent-deck/deck.yaml');
|
|
26
|
+
}
|
|
27
|
+
const nameMatch = content.match(/^name:\s*["']?(.+?)["']?\s*$/im);
|
|
28
|
+
const raw = {
|
|
29
|
+
deck_id: deckIdMatch[1],
|
|
30
|
+
...(nameMatch ? { name: nameMatch[1].trim() } : {}),
|
|
31
|
+
};
|
|
32
|
+
return shared_1.RepoDeckManifestSchema.parse(raw);
|
|
33
|
+
}
|
|
34
|
+
function repoDeckManifestFilePath(workspaceRoot) {
|
|
35
|
+
return node_path_1.default.join(node_path_1.default.resolve(workspaceRoot), shared_1.REPO_DECK_MANIFEST_PATH);
|
|
36
|
+
}
|
|
37
|
+
async function loadRepoDeckManifest(workspaceRoot) {
|
|
38
|
+
const filePath = repoDeckManifestFilePath(workspaceRoot);
|
|
39
|
+
try {
|
|
40
|
+
const content = await promises_1.default.readFile(filePath, 'utf8');
|
|
41
|
+
return parseRepoDeckManifest(content);
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
if (error.code === 'ENOENT') {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
if (error instanceof RepoDeckManifestError) {
|
|
48
|
+
throw error;
|
|
49
|
+
}
|
|
50
|
+
throw new RepoDeckManifestError(error instanceof Error ? error.message : 'Failed to read .agent-deck/deck.yaml');
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
function formatRepoDeckManifest(deckId, name) {
|
|
54
|
+
const lines = [
|
|
55
|
+
'# Link this repo to an Agent Deck (copy to .agent-deck/deck.yaml in your project)',
|
|
56
|
+
`deck_id: ${deckId}`,
|
|
57
|
+
];
|
|
58
|
+
if (name) {
|
|
59
|
+
lines.push(`name: ${name}`);
|
|
60
|
+
}
|
|
61
|
+
return lines.join('\n') + '\n';
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=repo-deck.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo-deck.js","sourceRoot":"","sources":["../../src/scope/repo-deck.ts"],"names":[],"mappings":";;;;;;AAYA,sDAaC;AAED,4DAEC;AAED,oDAiBC;AAED,wDASC;AA3DD,gEAAkC;AAClC,0DAA6B;AAC7B,+CAAuG;AAEvG,MAAa,qBAAsB,SAAQ,KAAK;IAC9C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;IACtC,CAAC;CACF;AALD,sDAKC;AAED,uFAAuF;AACvF,SAAgB,qBAAqB,CAAC,OAAe;IACnD,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACjF,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,qBAAqB,CAAC,8CAA8C,CAAC,CAAC;IAClF,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;IAClE,MAAM,GAAG,GAAG;QACV,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC;QACvB,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACpD,CAAC;IAEF,OAAO,+BAAsB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAC3C,CAAC;AAED,SAAgB,wBAAwB,CAAC,aAAqB;IAC5D,OAAO,mBAAI,CAAC,IAAI,CAAC,mBAAI,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,gCAAuB,CAAC,CAAC;AACzE,CAAC;AAEM,KAAK,UAAU,oBAAoB,CAAC,aAAqB;IAC9D,MAAM,QAAQ,GAAG,wBAAwB,CAAC,aAAa,CAAC,CAAC;IAEzD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACpD,OAAO,qBAAqB,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,KAAK,YAAY,qBAAqB,EAAE,CAAC;YAC3C,MAAM,KAAK,CAAC;QACd,CAAC;QACD,MAAM,IAAI,qBAAqB,CAC7B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,sCAAsC,CAChF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAgB,sBAAsB,CAAC,MAAc,EAAE,IAAa;IAClE,MAAM,KAAK,GAAG;QACZ,mFAAmF;QACnF,YAAY,MAAM,EAAE;KACrB,CAAC;IACF,IAAI,IAAI,EAAE,CAAC;QACT,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AACjC,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { DatabaseManager } from '../models/database';
|
|
2
|
+
import { ServiceManager } from '../services/service-manager';
|
|
3
|
+
import { MCPClientManager } from '../services/mcp-client-manager';
|
|
4
|
+
import { OAuthManager } from '../services/oauth-manager';
|
|
5
|
+
import { ServiceStatusUpdate, DeckUpdate, WebSocketMessage } from '@agent-deck/shared';
|
|
6
|
+
import { CredentialManager } from '../vault';
|
|
7
|
+
import { CollectionWarningService } from '../services/collection-warning-service';
|
|
8
|
+
import { PlaybookManager } from '../playbooks/playbook-manager';
|
|
9
|
+
export declare function createServer(): Promise<import("fastify").FastifyInstance<import("http").Server<typeof import("http").IncomingMessage, typeof import("http").ServerResponse>, import("http").IncomingMessage, import("http").ServerResponse<import("http").IncomingMessage>, import("fastify").FastifyBaseLogger, import("fastify").FastifyTypeProviderDefault>>;
|
|
10
|
+
declare module 'fastify' {
|
|
11
|
+
interface FastifyInstance {
|
|
12
|
+
db: DatabaseManager;
|
|
13
|
+
serviceManager: ServiceManager;
|
|
14
|
+
mcpClient: MCPClientManager;
|
|
15
|
+
oauthManager: OAuthManager;
|
|
16
|
+
credentialManager: CredentialManager;
|
|
17
|
+
playbookManager: PlaybookManager;
|
|
18
|
+
collectionWarningService: CollectionWarningService;
|
|
19
|
+
broadcastServiceUpdate: (update: ServiceStatusUpdate) => void;
|
|
20
|
+
broadcastDeckUpdate: (update: DeckUpdate) => void;
|
|
21
|
+
broadcastToAll: (message: WebSocketMessage) => void;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAUzD,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACvF,OAAO,EAAqB,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAEhE,OAAO,EAAE,wBAAwB,EAAE,MAAM,wCAAwC,CAAC;AAElF,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAGhE,wBAAsB,YAAY,qUAyFjC;AAGD,OAAO,QAAQ,SAAS,CAAC;IACvB,UAAU,eAAe;QACvB,EAAE,EAAE,eAAe,CAAC;QACpB,cAAc,EAAE,cAAc,CAAC;QAC/B,SAAS,EAAE,gBAAgB,CAAC;QAC5B,YAAY,EAAE,YAAY,CAAC;QAC3B,iBAAiB,EAAE,iBAAiB,CAAC;QACrC,eAAe,EAAE,eAAe,CAAC;QACjC,wBAAwB,EAAE,wBAAwB,CAAC;QACnD,sBAAsB,EAAE,CAAC,MAAM,EAAE,mBAAmB,KAAK,IAAI,CAAC;QAC9D,mBAAmB,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;QAClD,cAAc,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,IAAI,CAAC;KACrD;CACF"}
|
|
@@ -0,0 +1,111 @@
|
|
|
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.createServer = createServer;
|
|
7
|
+
const fastify_1 = __importDefault(require("fastify"));
|
|
8
|
+
const cors_1 = __importDefault(require("@fastify/cors"));
|
|
9
|
+
const websocket_1 = __importDefault(require("@fastify/websocket"));
|
|
10
|
+
const static_1 = __importDefault(require("@fastify/static"));
|
|
11
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
12
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
13
|
+
const database_1 = require("../models/database");
|
|
14
|
+
const service_manager_1 = require("../services/service-manager");
|
|
15
|
+
const mcp_client_manager_1 = require("../services/mcp-client-manager");
|
|
16
|
+
const oauth_manager_1 = require("../services/oauth-manager");
|
|
17
|
+
const services_1 = require("../routes/services");
|
|
18
|
+
const decks_1 = require("../routes/decks");
|
|
19
|
+
const oauth_1 = require("../routes/oauth");
|
|
20
|
+
const websocket_2 = require("../routes/websocket");
|
|
21
|
+
const mcp_1 = __importDefault(require("../routes/mcp"));
|
|
22
|
+
const local_mcp_1 = require("../routes/local-mcp");
|
|
23
|
+
const credentials_1 = require("../routes/credentials");
|
|
24
|
+
const scope_1 = require("../routes/scope");
|
|
25
|
+
const playbooks_1 = require("../routes/playbooks");
|
|
26
|
+
const vault_1 = require("../vault");
|
|
27
|
+
const paths_1 = require("../lib/paths");
|
|
28
|
+
const collection_warning_service_1 = require("../services/collection-warning-service");
|
|
29
|
+
const collection_1 = require("../routes/collection");
|
|
30
|
+
const playbook_manager_1 = require("../playbooks/playbook-manager");
|
|
31
|
+
const version_1 = require("../lib/version");
|
|
32
|
+
async function createServer() {
|
|
33
|
+
const fastify = (0, fastify_1.default)({
|
|
34
|
+
logger: {
|
|
35
|
+
level: 'info',
|
|
36
|
+
},
|
|
37
|
+
});
|
|
38
|
+
// Register plugins
|
|
39
|
+
await fastify.register(cors_1.default, {
|
|
40
|
+
origin: true, // Allow all origins in development
|
|
41
|
+
credentials: true,
|
|
42
|
+
});
|
|
43
|
+
await fastify.register(websocket_1.default);
|
|
44
|
+
// Initialize services
|
|
45
|
+
const db = new database_1.DatabaseManager((0, paths_1.resolveDatabasePath)());
|
|
46
|
+
const mcpClient = new mcp_client_manager_1.MCPClientManager();
|
|
47
|
+
const oauthManager = new oauth_manager_1.OAuthManager(db);
|
|
48
|
+
const serviceManager = new service_manager_1.ServiceManager(db, mcpClient, oauthManager);
|
|
49
|
+
const credentialManager = new vault_1.CredentialManager(db, (0, vault_1.createSecretStore)());
|
|
50
|
+
const playbookManager = new playbook_manager_1.PlaybookManager(db);
|
|
51
|
+
const collectionWarningService = new collection_warning_service_1.CollectionWarningService();
|
|
52
|
+
// Register routes
|
|
53
|
+
await fastify.register(websocket_2.registerWebSocketRoutes, { prefix: '/api/ws' });
|
|
54
|
+
await fastify.register(services_1.registerServiceRoutes, { prefix: '/api/services' });
|
|
55
|
+
await fastify.register(decks_1.registerDeckRoutes, { prefix: '/api/decks' });
|
|
56
|
+
await fastify.register(credentials_1.registerCredentialRoutes, { prefix: '/api/credentials' });
|
|
57
|
+
await fastify.register(scope_1.registerScopeRoutes, { prefix: '/api/scope' });
|
|
58
|
+
await fastify.register(playbooks_1.registerPlaybookRoutes, { prefix: '/api/playbooks' });
|
|
59
|
+
await fastify.register(collection_1.registerCollectionRoutes, { prefix: '/api/collection' });
|
|
60
|
+
await fastify.register(oauth_1.registerOAuthRoutes, { prefix: '/api/oauth' });
|
|
61
|
+
await fastify.register(mcp_1.default, { prefix: '/api/mcp' });
|
|
62
|
+
await fastify.register(local_mcp_1.registerLocalMCPRoutes, { prefix: '/api/local-mcp' });
|
|
63
|
+
// Health check endpoint
|
|
64
|
+
fastify.get('/health', async (request, reply) => {
|
|
65
|
+
return { status: 'ok', timestamp: new Date().toISOString(), version: (0, version_1.getAgentDeckVersion)() };
|
|
66
|
+
});
|
|
67
|
+
const uiDist = process.env.AGENT_DECK_UI_DIST?.trim();
|
|
68
|
+
if (uiDist && node_fs_1.default.existsSync(uiDist)) {
|
|
69
|
+
await fastify.register(static_1.default, {
|
|
70
|
+
root: node_path_1.default.resolve(uiDist),
|
|
71
|
+
prefix: '/',
|
|
72
|
+
});
|
|
73
|
+
fastify.setNotFoundHandler(async (request, reply) => {
|
|
74
|
+
if (request.url.startsWith('/api/')) {
|
|
75
|
+
return reply.status(404).send({ success: false, error: 'Not found' });
|
|
76
|
+
}
|
|
77
|
+
return reply.sendFile('index.html', node_path_1.default.resolve(uiDist));
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
else if (!uiDist) {
|
|
81
|
+
// Root endpoint when UI is not bundled (API-only mode)
|
|
82
|
+
fastify.get('/', async () => ({
|
|
83
|
+
name: 'Agent Deck Backend',
|
|
84
|
+
version: (0, version_1.getAgentDeckVersion)(),
|
|
85
|
+
status: 'running',
|
|
86
|
+
}));
|
|
87
|
+
}
|
|
88
|
+
// Add services to request context
|
|
89
|
+
fastify.decorate('db', db);
|
|
90
|
+
fastify.decorate('serviceManager', serviceManager);
|
|
91
|
+
fastify.decorate('mcpClient', mcpClient);
|
|
92
|
+
fastify.decorate('oauthManager', oauthManager);
|
|
93
|
+
fastify.decorate('credentialManager', credentialManager);
|
|
94
|
+
fastify.decorate('playbookManager', playbookManager);
|
|
95
|
+
fastify.decorate('collectionWarningService', collectionWarningService);
|
|
96
|
+
// Add broadcast decorators for WebSocket functionality
|
|
97
|
+
fastify.decorate('broadcastServiceUpdate', (update) => {
|
|
98
|
+
console.log('Broadcasting service update:', update);
|
|
99
|
+
// This will be implemented when WebSocket is properly connected
|
|
100
|
+
});
|
|
101
|
+
fastify.decorate('broadcastDeckUpdate', (update) => {
|
|
102
|
+
console.log('Broadcasting deck update:', update);
|
|
103
|
+
// This will be implemented when WebSocket is properly connected
|
|
104
|
+
});
|
|
105
|
+
fastify.decorate('broadcastToAll', (message) => {
|
|
106
|
+
console.log('Broadcasting to all:', message);
|
|
107
|
+
// This will be implemented when WebSocket is properly connected
|
|
108
|
+
});
|
|
109
|
+
return fastify;
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type CollectionCardWarning, type CollectionWarningKind, type Credential, type Playbook, type Service } from '@agent-deck/shared';
|
|
2
|
+
export type CollectionWarningsPayload = {
|
|
3
|
+
total: number;
|
|
4
|
+
byKind: Record<CollectionWarningKind, number>;
|
|
5
|
+
services: Record<string, CollectionCardWarning[]>;
|
|
6
|
+
credentials: Record<string, CollectionCardWarning[]>;
|
|
7
|
+
playbooks: Record<string, CollectionCardWarning[]>;
|
|
8
|
+
};
|
|
9
|
+
export declare class CollectionWarningService {
|
|
10
|
+
private discoveryService;
|
|
11
|
+
private oauthRequiredCache;
|
|
12
|
+
private emptyByKind;
|
|
13
|
+
private probeOAuthRequired;
|
|
14
|
+
private shouldProbeOAuth;
|
|
15
|
+
summarize(services: Service[], credentials: Credential[], playbooks: Playbook[]): Promise<CollectionWarningsPayload>;
|
|
16
|
+
clearCache(serviceId?: string): void;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=collection-warning-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collection-warning-service.d.ts","sourceRoot":"","sources":["../../src/services/collection-warning-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,EAC1B,KAAK,UAAU,EACf,KAAK,QAAQ,EACb,KAAK,OAAO,EACb,MAAM,oBAAoB,CAAC;AAG5B,MAAM,MAAM,yBAAyB,GAAG;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;IAC9C,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,qBAAqB,EAAE,CAAC,CAAC;IAClD,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,qBAAqB,EAAE,CAAC,CAAC;IACrD,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,qBAAqB,EAAE,CAAC,CAAC;CACpD,CAAC;AAIF,qBAAa,wBAAwB;IACnC,OAAO,CAAC,gBAAgB,CAA6B;IACrD,OAAO,CAAC,kBAAkB,CAA+D;IAEzF,OAAO,CAAC,WAAW;YAUL,kBAAkB;IAmChC,OAAO,CAAC,gBAAgB;IA0BlB,SAAS,CACb,QAAQ,EAAE,OAAO,EAAE,EACnB,WAAW,EAAE,UAAU,EAAE,EACzB,SAAS,EAAE,QAAQ,EAAE,GACpB,OAAO,CAAC,yBAAyB,CAAC;IA+DrC,UAAU,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI;CAOrC"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CollectionWarningService = void 0;
|
|
4
|
+
const shared_1 = require("@agent-deck/shared");
|
|
5
|
+
const mcp_discovery_service_1 = require("./mcp-discovery-service");
|
|
6
|
+
const OAUTH_PROBE_TTL_MS = 5 * 60 * 1000;
|
|
7
|
+
class CollectionWarningService {
|
|
8
|
+
discoveryService = new mcp_discovery_service_1.MCPDiscoveryService();
|
|
9
|
+
oauthRequiredCache = new Map();
|
|
10
|
+
emptyByKind() {
|
|
11
|
+
return {
|
|
12
|
+
oauth_required: 0,
|
|
13
|
+
oauth_expired: 0,
|
|
14
|
+
service_unhealthy: 0,
|
|
15
|
+
credential_missing_secret: 0,
|
|
16
|
+
playbook_missing_deps: 0,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
async probeOAuthRequired(service) {
|
|
20
|
+
if (service.type !== 'mcp') {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
if (service.oauthClientId ||
|
|
24
|
+
service.oauthAuthorizationUrl ||
|
|
25
|
+
service.oauthTokenUrl) {
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
const cached = this.oauthRequiredCache.get(service.id);
|
|
29
|
+
if (cached && cached.expiresAt > Date.now()) {
|
|
30
|
+
return cached.required;
|
|
31
|
+
}
|
|
32
|
+
try {
|
|
33
|
+
const discovery = await this.discoveryService.discoverService(service.url);
|
|
34
|
+
const required = discovery.oauth.required;
|
|
35
|
+
this.oauthRequiredCache.set(service.id, {
|
|
36
|
+
required,
|
|
37
|
+
expiresAt: Date.now() + OAUTH_PROBE_TTL_MS,
|
|
38
|
+
});
|
|
39
|
+
return required;
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
this.oauthRequiredCache.set(service.id, {
|
|
43
|
+
required: false,
|
|
44
|
+
expiresAt: Date.now() + OAUTH_PROBE_TTL_MS,
|
|
45
|
+
});
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
shouldProbeOAuth(service) {
|
|
50
|
+
if (service.type !== 'mcp') {
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
const hasToken = Boolean(service.oauthAccessToken);
|
|
54
|
+
const hasAuthHeader = Boolean(service.headers?.Authorization);
|
|
55
|
+
if (hasToken &&
|
|
56
|
+
hasAuthHeader &&
|
|
57
|
+
!(0, shared_1.isOAuthTokenExpiringSoon)(service.oauthTokenExpiresAt)) {
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
if (service.oauthClientId ||
|
|
61
|
+
service.oauthAuthorizationUrl ||
|
|
62
|
+
service.oauthTokenUrl) {
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
return true;
|
|
66
|
+
}
|
|
67
|
+
async summarize(services, credentials, playbooks) {
|
|
68
|
+
const catalog = (0, shared_1.buildCollectionCatalog)(credentials, services);
|
|
69
|
+
const serviceWarningContext = {};
|
|
70
|
+
await Promise.all(services.map(async (service) => {
|
|
71
|
+
if (!this.shouldProbeOAuth(service)) {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
const oauthRequired = await this.probeOAuthRequired(service);
|
|
75
|
+
if (oauthRequired) {
|
|
76
|
+
serviceWarningContext[service.id] = { oauthRequired: true };
|
|
77
|
+
}
|
|
78
|
+
}));
|
|
79
|
+
const servicesMap = {};
|
|
80
|
+
const credentialsMap = {};
|
|
81
|
+
const playbooksMap = {};
|
|
82
|
+
const byKind = this.emptyByKind();
|
|
83
|
+
for (const service of services) {
|
|
84
|
+
const warnings = (0, shared_1.getServiceWarnings)(service, serviceWarningContext[service.id]);
|
|
85
|
+
if (warnings.length > 0) {
|
|
86
|
+
servicesMap[service.id] = warnings;
|
|
87
|
+
for (const warning of warnings) {
|
|
88
|
+
byKind[warning.kind] += 1;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
for (const credential of credentials) {
|
|
93
|
+
const warnings = (0, shared_1.getCredentialWarnings)(credential);
|
|
94
|
+
if (warnings.length > 0) {
|
|
95
|
+
credentialsMap[credential.id] = warnings;
|
|
96
|
+
for (const warning of warnings) {
|
|
97
|
+
byKind[warning.kind] += 1;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
for (const playbook of playbooks) {
|
|
102
|
+
const warnings = (0, shared_1.getPlaybookWarnings)(playbook, catalog);
|
|
103
|
+
if (warnings.length > 0) {
|
|
104
|
+
playbooksMap[playbook.id] = warnings;
|
|
105
|
+
for (const warning of warnings) {
|
|
106
|
+
byKind[warning.kind] += 1;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return {
|
|
111
|
+
total: Object.keys(servicesMap).length +
|
|
112
|
+
Object.keys(credentialsMap).length +
|
|
113
|
+
Object.keys(playbooksMap).length,
|
|
114
|
+
byKind,
|
|
115
|
+
services: servicesMap,
|
|
116
|
+
credentials: credentialsMap,
|
|
117
|
+
playbooks: playbooksMap,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
clearCache(serviceId) {
|
|
121
|
+
if (serviceId) {
|
|
122
|
+
this.oauthRequiredCache.delete(serviceId);
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
this.oauthRequiredCache.clear();
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
exports.CollectionWarningService = CollectionWarningService;
|
|
129
|
+
//# sourceMappingURL=collection-warning-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collection-warning-service.js","sourceRoot":"","sources":["../../src/services/collection-warning-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { MCPServersManifest, LocalMCPServerConfig, CreateServiceInput } from '@agent-deck/shared';
|
|
2
|
+
export declare class ConfigManager {
|
|
3
|
+
/**
|
|
4
|
+
* Parse and validate MCP servers manifest from JSON
|
|
5
|
+
*/
|
|
6
|
+
parseManifest(jsonContent: string): MCPServersManifest;
|
|
7
|
+
/**
|
|
8
|
+
* Convert manifest to service creation inputs
|
|
9
|
+
*/
|
|
10
|
+
manifestToServices(manifest: MCPServersManifest): CreateServiceInput[];
|
|
11
|
+
/**
|
|
12
|
+
* Validate a single local MCP server configuration
|
|
13
|
+
*/
|
|
14
|
+
validateLocalServerConfig(config: LocalMCPServerConfig): void;
|
|
15
|
+
/**
|
|
16
|
+
* Generate a sample manifest
|
|
17
|
+
*/
|
|
18
|
+
generateSampleManifest(): MCPServersManifest;
|
|
19
|
+
/**
|
|
20
|
+
* Convert manifest to JSON string
|
|
21
|
+
*/
|
|
22
|
+
manifestToJson(manifest: MCPServersManifest): string;
|
|
23
|
+
/**
|
|
24
|
+
* Check if a command is safe to execute (basic security check)
|
|
25
|
+
*/
|
|
26
|
+
isCommandSafe(command: string): boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Validate and sanitize environment variables
|
|
29
|
+
*/
|
|
30
|
+
sanitizeEnvironment(env: Record<string, string>): Record<string, string>;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=config-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-manager.d.ts","sourceRoot":"","sources":["../../src/services/config-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAelG,qBAAa,aAAa;IACxB;;OAEG;IACH,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,kBAAkB;IAatD;;OAEG;IACH,kBAAkB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,kBAAkB,EAAE;IAsBtE;;OAEG;IACH,yBAAyB,CAAC,MAAM,EAAE,oBAAoB,GAAG,IAAI;IAI7D;;OAEG;IACH,sBAAsB,IAAI,kBAAkB;IAuB5C;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,kBAAkB,GAAG,MAAM;IAIpD;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAUvC;;OAEG;IACH,mBAAmB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;CAczE"}
|