@agent-deck/backend 1.6.4 → 1.7.1
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 -1
- package/dist/lib/agent-deck-context.d.ts +4 -2
- package/dist/lib/agent-deck-context.d.ts.map +1 -1
- package/dist/lib/agent-deck-context.js +35 -8
- package/dist/lib/agent-deck-context.js.map +1 -1
- package/dist/lib/backend-api-error.d.ts +8 -0
- package/dist/lib/backend-api-error.d.ts.map +1 -0
- package/dist/lib/backend-api-error.js +35 -0
- package/dist/lib/backend-api-error.js.map +1 -0
- package/dist/lib/bound-deck-scope.d.ts +6 -1
- package/dist/lib/bound-deck-scope.d.ts.map +1 -1
- package/dist/lib/bound-deck-scope.js +21 -2
- package/dist/lib/bound-deck-scope.js.map +1 -1
- package/dist/lib/client-scope.d.ts.map +1 -1
- package/dist/lib/client-scope.js +3 -3
- package/dist/lib/client-scope.js.map +1 -1
- package/dist/lib/dashboard-auth.d.ts +7 -0
- package/dist/lib/dashboard-auth.d.ts.map +1 -0
- package/dist/lib/dashboard-auth.js +38 -0
- package/dist/lib/dashboard-auth.js.map +1 -0
- package/dist/lib/http-auth.d.ts +5 -0
- package/dist/lib/http-auth.d.ts.map +1 -0
- package/dist/lib/http-auth.js +11 -0
- package/dist/lib/http-auth.js.map +1 -0
- package/dist/lib/route-policy.d.ts +13 -0
- package/dist/lib/route-policy.d.ts.map +1 -0
- package/dist/lib/route-policy.js +50 -0
- package/dist/lib/route-policy.js.map +1 -0
- package/dist/mcp-server.d.ts +4 -4
- package/dist/mcp-server.d.ts.map +1 -1
- package/dist/mcp-server.js +81 -29
- package/dist/mcp-server.js.map +1 -1
- package/dist/mcp-session-binding.d.ts +16 -3
- package/dist/mcp-session-binding.d.ts.map +1 -1
- package/dist/mcp-session-binding.js +40 -5
- package/dist/mcp-session-binding.js.map +1 -1
- 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/mcp-tools/policy.d.ts +20 -0
- package/dist/mcp-tools/policy.d.ts.map +1 -0
- package/dist/mcp-tools/policy.js +61 -0
- package/dist/mcp-tools/policy.js.map +1 -0
- package/dist/mcp-tools/profile.d.ts +2 -2
- package/dist/mcp-tools/register.d.ts +13 -0
- package/dist/mcp-tools/register.d.ts.map +1 -1
- package/dist/mcp-tools/register.js +154 -89
- package/dist/mcp-tools/register.js.map +1 -1
- package/dist/mcp-tools/test-harness.d.ts +7 -2
- package/dist/mcp-tools/test-harness.d.ts.map +1 -1
- package/dist/mcp-tools/test-harness.js +37 -9
- package/dist/mcp-tools/test-harness.js.map +1 -1
- package/dist/models/database.d.ts +2 -0
- package/dist/models/database.d.ts.map +1 -1
- package/dist/models/database.js +3 -0
- package/dist/models/database.js.map +1 -1
- 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/credentials.d.ts.map +1 -1
- package/dist/routes/credentials.js +25 -23
- package/dist/routes/credentials.js.map +1 -1
- package/dist/routes/decks.d.ts.map +1 -1
- package/dist/routes/decks.js +48 -30
- package/dist/routes/decks.js.map +1 -1
- package/dist/routes/playbooks.d.ts +0 -2
- package/dist/routes/playbooks.d.ts.map +1 -1
- package/dist/routes/playbooks.js +58 -117
- package/dist/routes/playbooks.js.map +1 -1
- package/dist/routes/scope.d.ts.map +1 -1
- package/dist/routes/scope.js +4 -1
- package/dist/routes/scope.js.map +1 -1
- package/dist/routes/services.d.ts.map +1 -1
- package/dist/routes/services.js +55 -13
- package/dist/routes/services.js.map +1 -1
- package/dist/routes/trusted-session.d.ts +10 -0
- package/dist/routes/trusted-session.d.ts.map +1 -0
- package/dist/routes/trusted-session.js +383 -0
- package/dist/routes/trusted-session.js.map +1 -0
- package/dist/scope/bindings-sidecar.d.ts +9 -0
- package/dist/scope/bindings-sidecar.d.ts.map +1 -0
- package/dist/scope/bindings-sidecar.js +57 -0
- package/dist/scope/bindings-sidecar.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 +2 -0
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +23 -1
- package/dist/server/index.js.map +1 -1
- package/dist/test/auth-fixtures.d.ts +4 -0
- package/dist/test/auth-fixtures.d.ts.map +1 -0
- package/dist/test/auth-fixtures.js +28 -0
- package/dist/test/auth-fixtures.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/trusted-session/admin-secret.d.ts +6 -0
- package/dist/trusted-session/admin-secret.d.ts.map +1 -0
- package/dist/trusted-session/admin-secret.js +63 -0
- package/dist/trusted-session/admin-secret.js.map +1 -0
- package/dist/trusted-session/auth.d.ts +29 -0
- package/dist/trusted-session/auth.d.ts.map +1 -0
- package/dist/trusted-session/auth.js +176 -0
- package/dist/trusted-session/auth.js.map +1 -0
- package/dist/trusted-session/policy-hook.d.ts +12 -0
- package/dist/trusted-session/policy-hook.d.ts.map +1 -0
- package/dist/trusted-session/policy-hook.js +71 -0
- package/dist/trusted-session/policy-hook.js.map +1 -0
- package/dist/trusted-session/route-policy-registry.d.ts +20 -0
- package/dist/trusted-session/route-policy-registry.d.ts.map +1 -0
- package/dist/trusted-session/route-policy-registry.js +165 -0
- package/dist/trusted-session/route-policy-registry.js.map +1 -0
- package/dist/trusted-session/store.d.ts +93 -0
- package/dist/trusted-session/store.d.ts.map +1 -0
- package/dist/trusted-session/store.js +451 -0
- package/dist/trusted-session/store.js.map +1 -0
- package/package.json +3 -3
- package/static-ui/assets/index-DppGBI7V.css +1 -0
- package/static-ui/assets/index-DwI7IkPX.js +499 -0
- package/static-ui/favicon.png +0 -0
- package/static-ui/index.html +2 -2
- package/static-ui/assets/index-BG4SetCL.css +0 -1
- package/static-ui/assets/index-BV17LsZJ.js +0 -485
|
@@ -0,0 +1,383 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerTrustedSessionRoutes = registerTrustedSessionRoutes;
|
|
4
|
+
exports.registerDashboardAuthRoutes = registerDashboardAuthRoutes;
|
|
5
|
+
const node_crypto_1 = require("node:crypto");
|
|
6
|
+
const shared_1 = require("@agent-deck/shared");
|
|
7
|
+
const http_auth_1 = require("../lib/http-auth");
|
|
8
|
+
const auth_1 = require("../trusted-session/auth");
|
|
9
|
+
const dashboard_auth_1 = require("../lib/dashboard-auth");
|
|
10
|
+
const store_1 = require("../trusted-session/store");
|
|
11
|
+
const admin_secret_1 = require("../trusted-session/admin-secret");
|
|
12
|
+
/** Caller must own the runtime session (session header matches body id). */
|
|
13
|
+
function requireRuntimeSessionOwnership(request, runtimeSessionId) {
|
|
14
|
+
const header = request.headers[shared_1.AGENT_DECK_SESSION_HEADER];
|
|
15
|
+
const sessionHeader = typeof header === 'string' ? header.trim() : '';
|
|
16
|
+
if (!sessionHeader || sessionHeader !== runtimeSessionId.trim()) {
|
|
17
|
+
throw new auth_1.TrustedAuthError('GRANT_REQUIRED', 'Runtime session ownership required');
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function assertWorkspaceScope(store, workspaceKeyId, workspaceRoot) {
|
|
21
|
+
const key = store.getWorkspaceKeyById(workspaceKeyId);
|
|
22
|
+
if (!key) {
|
|
23
|
+
throw new auth_1.TrustedAuthError('GRANT_REQUIRED', 'No valid workspace grant');
|
|
24
|
+
}
|
|
25
|
+
const digest = (0, shared_1.digestCanonicalWorkspacePath)((0, shared_1.canonicalizeWorkspacePath)(workspaceRoot));
|
|
26
|
+
if (key.path_digest !== digest) {
|
|
27
|
+
throw new auth_1.TrustedAuthError('WORKSPACE_SCOPE_MISMATCH', 'Request targets a different workspace; elevation cannot override it');
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function resolveRuntimeSessionFromHeader(request, store) {
|
|
31
|
+
const sessionHeader = request.headers[shared_1.AGENT_DECK_SESSION_HEADER];
|
|
32
|
+
const sessionId = typeof sessionHeader === 'string' ? sessionHeader.trim() : '';
|
|
33
|
+
if (!sessionId) {
|
|
34
|
+
throw new auth_1.TrustedAuthError('GRANT_REQUIRED', 'No valid workspace grant');
|
|
35
|
+
}
|
|
36
|
+
const row = store.getRuntimeSessionRow(sessionId);
|
|
37
|
+
if (!row || row.revoked_at) {
|
|
38
|
+
throw new auth_1.TrustedAuthError('SESSION_REVOKED', 'Grant rotation or explicit revocation ended the session');
|
|
39
|
+
}
|
|
40
|
+
if (Date.parse(row.expires_at) <= Date.now()) {
|
|
41
|
+
throw new auth_1.TrustedAuthError('SESSION_INVALID', 'Runtime session absent or expired');
|
|
42
|
+
}
|
|
43
|
+
const session = store.touchRuntimeSession(sessionId);
|
|
44
|
+
if (!session) {
|
|
45
|
+
throw new auth_1.TrustedAuthError('SESSION_INVALID', 'Runtime session absent or expired');
|
|
46
|
+
}
|
|
47
|
+
return session;
|
|
48
|
+
}
|
|
49
|
+
async function registerTrustedSessionRoutes(fastify) {
|
|
50
|
+
const store = fastify.trustedSessionStore;
|
|
51
|
+
fastify.post('/workspace-grants/issue', async (request, reply) => {
|
|
52
|
+
try {
|
|
53
|
+
await (0, auth_1.requireTrustedWriterBearer)(request);
|
|
54
|
+
const { workspaceRoot, deckId } = request.body;
|
|
55
|
+
if (!workspaceRoot?.trim() || !deckId?.trim()) {
|
|
56
|
+
return reply.status(400).send({ success: false, error: 'workspaceRoot and deckId required' });
|
|
57
|
+
}
|
|
58
|
+
const deck = await fastify.db.getDeck(deckId);
|
|
59
|
+
if (!deck) {
|
|
60
|
+
return reply.status(404).send({ success: false, error: 'Deck not found' });
|
|
61
|
+
}
|
|
62
|
+
const canonical = (0, shared_1.canonicalizeWorkspacePath)(workspaceRoot);
|
|
63
|
+
const digest = (0, shared_1.digestCanonicalWorkspacePath)(canonical);
|
|
64
|
+
const workspaceKey = store.getOrCreateWorkspaceKey(digest);
|
|
65
|
+
const secret = (0, store_1.generateGrantSecret)();
|
|
66
|
+
const pending = store.createPendingGrant(workspaceKey.id, deckId, secret);
|
|
67
|
+
return reply.send({
|
|
68
|
+
success: true,
|
|
69
|
+
data: {
|
|
70
|
+
workspaceKey: workspaceKey.id,
|
|
71
|
+
grantId: pending.id,
|
|
72
|
+
deckId,
|
|
73
|
+
deckName: deck.name,
|
|
74
|
+
secret,
|
|
75
|
+
status: 'pending',
|
|
76
|
+
},
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
if (error instanceof auth_1.TrustedAuthError) {
|
|
81
|
+
return (0, auth_1.sendTrustedAuthError)(reply, error);
|
|
82
|
+
}
|
|
83
|
+
throw error;
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
fastify.post('/workspace-grants/:grantId/revoke-pending', async (request, reply) => {
|
|
87
|
+
try {
|
|
88
|
+
await (0, auth_1.requireTrustedWriterBearer)(request);
|
|
89
|
+
store.revokePendingGrant(request.params.grantId);
|
|
90
|
+
return reply.send({ success: true });
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
if (error instanceof auth_1.TrustedAuthError) {
|
|
94
|
+
return (0, auth_1.sendTrustedAuthError)(reply, error);
|
|
95
|
+
}
|
|
96
|
+
throw error;
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
fastify.post('/workspace-grants/:grantId/activate', async (request, reply) => {
|
|
100
|
+
try {
|
|
101
|
+
await (0, auth_1.requireTrustedWriterBearer)(request);
|
|
102
|
+
const { grantId } = request.params;
|
|
103
|
+
const activated = store.activateGrant(grantId);
|
|
104
|
+
if (!activated) {
|
|
105
|
+
return reply.status(409).send({
|
|
106
|
+
success: false,
|
|
107
|
+
error: 'Grant not pending or not found',
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
const deck = await fastify.db.getDeck(activated.deck_id);
|
|
111
|
+
return reply.send({
|
|
112
|
+
success: true,
|
|
113
|
+
data: {
|
|
114
|
+
grantId: activated.id,
|
|
115
|
+
deckId: activated.deck_id,
|
|
116
|
+
deckName: deck?.name,
|
|
117
|
+
status: activated.status,
|
|
118
|
+
},
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
if (error instanceof auth_1.TrustedAuthError) {
|
|
123
|
+
return (0, auth_1.sendTrustedAuthError)(reply, error);
|
|
124
|
+
}
|
|
125
|
+
throw error;
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
fastify.get('/runtime-session', async (request, reply) => {
|
|
129
|
+
try {
|
|
130
|
+
const sessionHeader = request.headers[shared_1.AGENT_DECK_SESSION_HEADER];
|
|
131
|
+
const sessionId = typeof sessionHeader === 'string' ? sessionHeader.trim() : '';
|
|
132
|
+
if (!sessionId) {
|
|
133
|
+
throw new auth_1.TrustedAuthError('GRANT_REQUIRED', 'No valid workspace grant');
|
|
134
|
+
}
|
|
135
|
+
const row = store.getRuntimeSessionRow(sessionId);
|
|
136
|
+
if (!row || row.revoked_at) {
|
|
137
|
+
throw new auth_1.TrustedAuthError('SESSION_REVOKED', 'Grant rotation or explicit revocation ended the session');
|
|
138
|
+
}
|
|
139
|
+
if (Date.parse(row.expires_at) <= Date.now()) {
|
|
140
|
+
throw new auth_1.TrustedAuthError('SESSION_INVALID', 'Runtime session absent or expired');
|
|
141
|
+
}
|
|
142
|
+
const session = store.touchRuntimeSession(sessionId);
|
|
143
|
+
if (!session) {
|
|
144
|
+
throw new auth_1.TrustedAuthError('SESSION_INVALID', 'Runtime session absent or expired');
|
|
145
|
+
}
|
|
146
|
+
const deck = await fastify.db.getDeck(session.deckId);
|
|
147
|
+
return reply.send({
|
|
148
|
+
success: true,
|
|
149
|
+
data: {
|
|
150
|
+
sessionId: session.sessionId,
|
|
151
|
+
deckId: session.deckId,
|
|
152
|
+
deckName: deck?.name,
|
|
153
|
+
mode: session.mode,
|
|
154
|
+
expiresAt: session.expiresAt,
|
|
155
|
+
adminExpiresAt: session.adminExpiresAt,
|
|
156
|
+
},
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
catch (error) {
|
|
160
|
+
if (error instanceof auth_1.TrustedAuthError) {
|
|
161
|
+
return (0, auth_1.sendTrustedAuthError)(reply, error);
|
|
162
|
+
}
|
|
163
|
+
throw error;
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
fastify.post('/bind-workspace', async (request, reply) => {
|
|
167
|
+
try {
|
|
168
|
+
const { workspaceRoot, deckId } = request.body;
|
|
169
|
+
if (!workspaceRoot?.trim() || !deckId?.trim()) {
|
|
170
|
+
return reply.status(400).send({ success: false, error: 'workspaceRoot and deckId required' });
|
|
171
|
+
}
|
|
172
|
+
const session = resolveRuntimeSessionFromHeader(request, store);
|
|
173
|
+
assertWorkspaceScope(store, session.workspaceKey, workspaceRoot);
|
|
174
|
+
const deck = await fastify.db.getDeck(deckId);
|
|
175
|
+
if (!deck) {
|
|
176
|
+
return reply.status(404).send({ success: false, error: 'Deck not found' });
|
|
177
|
+
}
|
|
178
|
+
if (session.deckId === deckId) {
|
|
179
|
+
return reply.send({
|
|
180
|
+
success: true,
|
|
181
|
+
data: {
|
|
182
|
+
deckId: session.deckId,
|
|
183
|
+
deckName: deck.name,
|
|
184
|
+
mode: session.mode,
|
|
185
|
+
grantRotated: false,
|
|
186
|
+
peersRevoked: 0,
|
|
187
|
+
},
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
if (session.mode !== 'agent-admin') {
|
|
191
|
+
throw new auth_1.TrustedAuthError('ADMIN_REQUIRED', 'Deck-admin elevation is required');
|
|
192
|
+
}
|
|
193
|
+
const workspaceCount = store.countWorkspacesForDeck(session.deckId);
|
|
194
|
+
const rotated = store.rotateGrantForElevatedSession(session.sessionId, deckId);
|
|
195
|
+
if (!rotated) {
|
|
196
|
+
throw new auth_1.TrustedAuthError('SESSION_INVALID', 'Runtime session absent or expired');
|
|
197
|
+
}
|
|
198
|
+
const newDeck = await fastify.db.getDeck(rotated.session.deckId);
|
|
199
|
+
return reply.send({
|
|
200
|
+
success: true,
|
|
201
|
+
data: {
|
|
202
|
+
deckId: rotated.session.deckId,
|
|
203
|
+
deckName: newDeck?.name ?? deck.name,
|
|
204
|
+
mode: rotated.session.mode,
|
|
205
|
+
grantRotated: true,
|
|
206
|
+
peersRevoked: rotated.peersRevoked,
|
|
207
|
+
previousDeckWorkspaceCount: workspaceCount,
|
|
208
|
+
grantRefreshNote: 'Run `agent-deck use <deck>` in this workspace to refresh the local grant file before the next MCP reconnect.',
|
|
209
|
+
},
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
catch (error) {
|
|
213
|
+
if (error instanceof auth_1.TrustedAuthError) {
|
|
214
|
+
return (0, auth_1.sendTrustedAuthError)(reply, error);
|
|
215
|
+
}
|
|
216
|
+
throw error;
|
|
217
|
+
}
|
|
218
|
+
});
|
|
219
|
+
fastify.get('/admin/challenges', async (_request, reply) => {
|
|
220
|
+
const pending = store.listPendingAdminChallenges();
|
|
221
|
+
const data = await Promise.all(pending.map(async (row) => {
|
|
222
|
+
const deck = await fastify.db.getDeck(row.deckId);
|
|
223
|
+
const approvalPath = `/admin/approve?challenge=${encodeURIComponent(row.challengeId)}&session=${encodeURIComponent(row.runtimeSessionId)}`;
|
|
224
|
+
return {
|
|
225
|
+
challengeId: row.challengeId,
|
|
226
|
+
runtimeSessionId: row.runtimeSessionId,
|
|
227
|
+
deckId: row.deckId,
|
|
228
|
+
deckName: deck?.name,
|
|
229
|
+
expiresAt: row.expiresAt,
|
|
230
|
+
approvalPath,
|
|
231
|
+
};
|
|
232
|
+
}));
|
|
233
|
+
return reply.send({ success: true, data });
|
|
234
|
+
});
|
|
235
|
+
fastify.post('/admin/request-elevation', async (request, reply) => {
|
|
236
|
+
try {
|
|
237
|
+
const { runtimeSessionId } = request.body;
|
|
238
|
+
if (!runtimeSessionId?.trim()) {
|
|
239
|
+
return reply.status(400).send({ success: false, error: 'runtimeSessionId required' });
|
|
240
|
+
}
|
|
241
|
+
requireRuntimeSessionOwnership(request, runtimeSessionId);
|
|
242
|
+
const row = store.getRuntimeSessionRow(runtimeSessionId);
|
|
243
|
+
if (!row || row.revoked_at) {
|
|
244
|
+
throw new auth_1.TrustedAuthError('SESSION_INVALID', 'Runtime session absent or expired');
|
|
245
|
+
}
|
|
246
|
+
const challenge = store.createAdminChallenge(runtimeSessionId);
|
|
247
|
+
const approvalUrl = `/admin/approve?challenge=${encodeURIComponent(challenge.id)}&session=${encodeURIComponent(runtimeSessionId)}`;
|
|
248
|
+
return reply.send({
|
|
249
|
+
success: true,
|
|
250
|
+
data: {
|
|
251
|
+
challengeId: challenge.id,
|
|
252
|
+
expiresAt: challenge.expires_at,
|
|
253
|
+
approvalUrl,
|
|
254
|
+
},
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
catch (error) {
|
|
258
|
+
if (error instanceof auth_1.TrustedAuthError) {
|
|
259
|
+
return (0, auth_1.sendTrustedAuthError)(reply, error);
|
|
260
|
+
}
|
|
261
|
+
throw error;
|
|
262
|
+
}
|
|
263
|
+
});
|
|
264
|
+
fastify.post('/admin/approve', async (request, reply) => {
|
|
265
|
+
try {
|
|
266
|
+
const bearer = (0, http_auth_1.parseBearerToken)(request);
|
|
267
|
+
const expected = await (0, admin_secret_1.readAdminSecretFromEnvOrFile)();
|
|
268
|
+
if (!bearer || !expected || !(0, admin_secret_1.verifyAdminSecret)(bearer, expected)) {
|
|
269
|
+
const token = (0, dashboard_auth_1.parseDashboardCookie)(request);
|
|
270
|
+
if (!token || !(0, dashboard_auth_1.validateDashboardSessionToken)(token)) {
|
|
271
|
+
throw new auth_1.TrustedAuthError('DASHBOARD_REQUIRED', 'Dashboard authentication required');
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
const { challengeId, runtimeSessionId } = request.body;
|
|
275
|
+
const consumed = store.consumeAdminChallenge(challengeId, runtimeSessionId);
|
|
276
|
+
if (!consumed) {
|
|
277
|
+
throw new auth_1.TrustedAuthError('ADMIN_CHALLENGE_EXPIRED', 'Approval challenge expired or was already consumed');
|
|
278
|
+
}
|
|
279
|
+
const elevated = store.elevateSessionToAdmin(runtimeSessionId);
|
|
280
|
+
if (!elevated) {
|
|
281
|
+
throw new auth_1.TrustedAuthError('SESSION_INVALID', 'Runtime session absent or expired');
|
|
282
|
+
}
|
|
283
|
+
return reply.send({ success: true, data: { session: elevated } });
|
|
284
|
+
}
|
|
285
|
+
catch (error) {
|
|
286
|
+
if (error instanceof auth_1.TrustedAuthError) {
|
|
287
|
+
return (0, auth_1.sendTrustedAuthError)(reply, error);
|
|
288
|
+
}
|
|
289
|
+
throw error;
|
|
290
|
+
}
|
|
291
|
+
});
|
|
292
|
+
fastify.post('/admin/exit', async (request, reply) => {
|
|
293
|
+
try {
|
|
294
|
+
const { runtimeSessionId } = request.body;
|
|
295
|
+
if (!runtimeSessionId?.trim()) {
|
|
296
|
+
return reply.status(400).send({ success: false, error: 'runtimeSessionId required' });
|
|
297
|
+
}
|
|
298
|
+
requireRuntimeSessionOwnership(request, runtimeSessionId);
|
|
299
|
+
const downgraded = store.downgradeSessionToNormal(runtimeSessionId);
|
|
300
|
+
if (!downgraded) {
|
|
301
|
+
return reply.status(404).send({ success: false, error: 'Session not found' });
|
|
302
|
+
}
|
|
303
|
+
return reply.send({ success: true, data: { session: downgraded } });
|
|
304
|
+
}
|
|
305
|
+
catch (error) {
|
|
306
|
+
if (error instanceof auth_1.TrustedAuthError) {
|
|
307
|
+
return (0, auth_1.sendTrustedAuthError)(reply, error);
|
|
308
|
+
}
|
|
309
|
+
throw error;
|
|
310
|
+
}
|
|
311
|
+
});
|
|
312
|
+
fastify.post('/mcp/connect', async (request, reply) => {
|
|
313
|
+
try {
|
|
314
|
+
const { grantSecret, mcpSessionId } = request.body;
|
|
315
|
+
if (!grantSecret?.trim()) {
|
|
316
|
+
throw new auth_1.TrustedAuthError('GRANT_REQUIRED', 'No valid workspace grant');
|
|
317
|
+
}
|
|
318
|
+
const grant = store.findActiveGrantBySecret(grantSecret);
|
|
319
|
+
if (!grant) {
|
|
320
|
+
throw new auth_1.TrustedAuthError('GRANT_REQUIRED', 'No valid workspace grant');
|
|
321
|
+
}
|
|
322
|
+
let session;
|
|
323
|
+
if (mcpSessionId?.trim()) {
|
|
324
|
+
session = store.findActiveRuntimeSessionForMcp(mcpSessionId.trim(), grant.id);
|
|
325
|
+
}
|
|
326
|
+
if (!session) {
|
|
327
|
+
session = store.createRuntimeSession({
|
|
328
|
+
workspaceKeyId: grant.workspace_key_id,
|
|
329
|
+
workspaceGrantId: grant.id,
|
|
330
|
+
deckId: grant.deck_id,
|
|
331
|
+
mcpSessionId: mcpSessionId?.trim(),
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
const deck = await fastify.db.getDeck(session.deckId);
|
|
335
|
+
return reply.send({
|
|
336
|
+
success: true,
|
|
337
|
+
data: {
|
|
338
|
+
sessionId: session.sessionId,
|
|
339
|
+
workspaceKey: session.workspaceKey,
|
|
340
|
+
deckId: session.deckId,
|
|
341
|
+
deckName: deck?.name,
|
|
342
|
+
mode: session.mode,
|
|
343
|
+
expiresAt: session.expiresAt,
|
|
344
|
+
},
|
|
345
|
+
});
|
|
346
|
+
}
|
|
347
|
+
catch (error) {
|
|
348
|
+
if (error instanceof auth_1.TrustedAuthError) {
|
|
349
|
+
return (0, auth_1.sendTrustedAuthError)(reply, error);
|
|
350
|
+
}
|
|
351
|
+
throw error;
|
|
352
|
+
}
|
|
353
|
+
});
|
|
354
|
+
}
|
|
355
|
+
async function registerDashboardAuthRoutes(fastify) {
|
|
356
|
+
const store = fastify.trustedSessionStore;
|
|
357
|
+
fastify.post('/bootstrap/nonce', async (request, reply) => {
|
|
358
|
+
try {
|
|
359
|
+
await (0, auth_1.requireTrustedWriterBearer)(request);
|
|
360
|
+
const nonce = (0, node_crypto_1.randomBytes)(24).toString('base64url');
|
|
361
|
+
const expiresAt = new Date(Date.now() + shared_1.DASHBOARD_NONCE_TTL_MS).toISOString();
|
|
362
|
+
store.createDashboardNonce(nonce, expiresAt);
|
|
363
|
+
return reply.send({ success: true, data: { nonce, expiresInMs: shared_1.DASHBOARD_NONCE_TTL_MS } });
|
|
364
|
+
}
|
|
365
|
+
catch (error) {
|
|
366
|
+
if (error instanceof auth_1.TrustedAuthError) {
|
|
367
|
+
return (0, auth_1.sendTrustedAuthError)(reply, error);
|
|
368
|
+
}
|
|
369
|
+
throw error;
|
|
370
|
+
}
|
|
371
|
+
});
|
|
372
|
+
fastify.post('/bootstrap/session', async (request, reply) => {
|
|
373
|
+
const { nonce } = request.body;
|
|
374
|
+
if (!store.consumeDashboardNonce(nonce)) {
|
|
375
|
+
return reply.status(410).send({ success: false, error: 'Bootstrap nonce expired or invalid' });
|
|
376
|
+
}
|
|
377
|
+
const token = (0, auth_1.createDashboardSessionToken)();
|
|
378
|
+
// Secure omitted intentionally — dashboard is localhost-http in v1.
|
|
379
|
+
reply.header('Set-Cookie', `${shared_1.AGENT_DECK_DASHBOARD_COOKIE}=${encodeURIComponent(token)}; HttpOnly; SameSite=Strict; Path=/`);
|
|
380
|
+
return reply.send({ success: true, data: { authenticated: true } });
|
|
381
|
+
});
|
|
382
|
+
}
|
|
383
|
+
//# sourceMappingURL=trusted-session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trusted-session.js","sourceRoot":"","sources":["../../src/routes/trusted-session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { BindingEntry } from '@agent-deck/shared';
|
|
2
|
+
/** Write workspace-keyed binding for terminal status line; prune orphaned MCP session UUID keys. */
|
|
3
|
+
export declare function upsertWorkspaceDisplayBinding(workspaceRoot: string, entry: BindingEntry): Promise<void>;
|
|
4
|
+
export declare function readBindingForDisplay(options: {
|
|
5
|
+
sessionId?: string;
|
|
6
|
+
workspaceRoot: string;
|
|
7
|
+
}): Promise<BindingEntry | null>;
|
|
8
|
+
export declare function readBindingForWorkspace(workspaceRoot: string): Promise<BindingEntry | null>;
|
|
9
|
+
//# sourceMappingURL=bindings-sidecar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bindings-sidecar.d.ts","sourceRoot":"","sources":["../../src/scope/bindings-sidecar.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,YAAY,EASb,MAAM,oBAAoB,CAAC;AAoC5B,oGAAoG;AACpG,wBAAsB,6BAA6B,CACjD,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,YAAY,GAClB,OAAO,CAAC,IAAI,CAAC,CAKf;AAED,wBAAsB,qBAAqB,CAAC,OAAO,EAAE;IACnD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;CACvB,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAG/B;AAED,wBAAsB,uBAAuB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAGjG"}
|
|
@@ -0,0 +1,57 @@
|
|
|
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.upsertWorkspaceDisplayBinding = upsertWorkspaceDisplayBinding;
|
|
7
|
+
exports.readBindingForDisplay = readBindingForDisplay;
|
|
8
|
+
exports.readBindingForWorkspace = readBindingForWorkspace;
|
|
9
|
+
const promises_1 = __importDefault(require("node:fs/promises"));
|
|
10
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
11
|
+
const shared_1 = require("@agent-deck/shared");
|
|
12
|
+
async function readBindingsFile() {
|
|
13
|
+
const merged = {};
|
|
14
|
+
for (const filePath of (0, shared_1.listBindingsFileCandidates)()) {
|
|
15
|
+
try {
|
|
16
|
+
const raw = await promises_1.default.readFile(filePath, 'utf8');
|
|
17
|
+
const parsed = shared_1.BindingsFileSchema.safeParse(JSON.parse(raw));
|
|
18
|
+
if (parsed.success) {
|
|
19
|
+
Object.assign(merged, parsed.data);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
if (error.code !== 'ENOENT') {
|
|
24
|
+
throw error;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return merged;
|
|
29
|
+
}
|
|
30
|
+
async function writeBindingsFile(bindings) {
|
|
31
|
+
const filePath = (0, shared_1.resolveBindingsFilePath)();
|
|
32
|
+
await promises_1.default.mkdir(node_path_1.default.dirname(filePath), { recursive: true });
|
|
33
|
+
await promises_1.default.writeFile(filePath, `${JSON.stringify(bindings, null, 2)}\n`, 'utf8');
|
|
34
|
+
}
|
|
35
|
+
function pruneLegacySessionKeys(bindings) {
|
|
36
|
+
for (const key of Object.keys(bindings)) {
|
|
37
|
+
if ((0, shared_1.isBindingSidecarSessionKey)(key)) {
|
|
38
|
+
delete bindings[key];
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/** Write workspace-keyed binding for terminal status line; prune orphaned MCP session UUID keys. */
|
|
43
|
+
async function upsertWorkspaceDisplayBinding(workspaceRoot, entry) {
|
|
44
|
+
const bindings = await readBindingsFile();
|
|
45
|
+
bindings[(0, shared_1.normalizeWorkspaceRoot)(workspaceRoot)] = entry;
|
|
46
|
+
pruneLegacySessionKeys(bindings);
|
|
47
|
+
await writeBindingsFile(bindings);
|
|
48
|
+
}
|
|
49
|
+
async function readBindingForDisplay(options) {
|
|
50
|
+
const bindings = await readBindingsFile();
|
|
51
|
+
return (0, shared_1.resolveBindingEntry)(bindings, options);
|
|
52
|
+
}
|
|
53
|
+
async function readBindingForWorkspace(workspaceRoot) {
|
|
54
|
+
const bindings = await readBindingsFile();
|
|
55
|
+
return (0, shared_1.lookupWorkspaceBinding)(bindings, workspaceRoot);
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=bindings-sidecar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bindings-sidecar.js","sourceRoot":"","sources":["../../src/scope/bindings-sidecar.ts"],"names":[],"mappings":";;;;;AAiDA,sEAQC;AAED,sDAMC;AAED,0DAGC;AAtED,gEAAkC;AAClC,0DAA6B;AAC7B,+CAU4B;AAE5B,KAAK,UAAU,gBAAgB;IAC7B,MAAM,MAAM,GAAiB,EAAE,CAAC;IAEhC,KAAK,MAAM,QAAQ,IAAI,IAAA,mCAA0B,GAAE,EAAE,CAAC;QACpD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAChD,MAAM,MAAM,GAAG,2BAAkB,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;YAC7D,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACvD,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,QAAsB;IACrD,MAAM,QAAQ,GAAG,IAAA,gCAAuB,GAAE,CAAC;IAC3C,MAAM,kBAAE,CAAC,KAAK,CAAC,mBAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,MAAM,kBAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AACjF,CAAC;AAED,SAAS,sBAAsB,CAAC,QAAsB;IACpD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QACxC,IAAI,IAAA,mCAA0B,EAAC,GAAG,CAAC,EAAE,CAAC;YACpC,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;AACH,CAAC;AAED,oGAAoG;AAC7F,KAAK,UAAU,6BAA6B,CACjD,aAAqB,EACrB,KAAmB;IAEnB,MAAM,QAAQ,GAAG,MAAM,gBAAgB,EAAE,CAAC;IAC1C,QAAQ,CAAC,IAAA,+BAAsB,EAAC,aAAa,CAAC,CAAC,GAAG,KAAK,CAAC;IACxD,sBAAsB,CAAC,QAAQ,CAAC,CAAC;IACjC,MAAM,iBAAiB,CAAC,QAAQ,CAAC,CAAC;AACpC,CAAC;AAEM,KAAK,UAAU,qBAAqB,CAAC,OAG3C;IACC,MAAM,QAAQ,GAAG,MAAM,gBAAgB,EAAE,CAAC;IAC1C,OAAO,IAAA,4BAAmB,EAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AAChD,CAAC;AAEM,KAAK,UAAU,uBAAuB,CAAC,aAAqB;IACjE,MAAM,QAAQ,GAAG,MAAM,gBAAgB,EAAE,CAAC;IAC1C,OAAO,IAAA,+BAAsB,EAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;AACzD,CAAC"}
|
|
@@ -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"}
|
package/dist/server/index.d.ts
CHANGED
|
@@ -8,10 +8,12 @@ import { CollectionWarningService } from '../services/collection-warning-service
|
|
|
8
8
|
import { PlaybookManager } from '../playbooks/playbook-manager';
|
|
9
9
|
import { PatchManager } from '../playbooks/patch-manager';
|
|
10
10
|
import { LiveDisplayRegistry } from '../scope/live-display-registry';
|
|
11
|
+
import { TrustedSessionStore } from '../trusted-session/store';
|
|
11
12
|
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>>;
|
|
12
13
|
declare module 'fastify' {
|
|
13
14
|
interface FastifyInstance {
|
|
14
15
|
db: DatabaseManager;
|
|
16
|
+
trustedSessionStore: TrustedSessionStore;
|
|
15
17
|
serviceManager: ServiceManager;
|
|
16
18
|
mcpClient: MCPClientManager;
|
|
17
19
|
oauthManager: OAuthManager;
|
|
@@ -1 +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,sBAAsB,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAE7H,OAAO,EAAE,wBAAwB,EAAE,MAAM,wCAAwC,CAAC;
|
|
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,sBAAsB,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAE7H,OAAO,EAAE,wBAAwB,EAAE,MAAM,wCAAwC,CAAC;AAIlF,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAK1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAGrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAI/D,wBAAsB,YAAY,qUAsKjC;AAGD,OAAO,QAAQ,SAAS,CAAC;IACvB,UAAU,eAAe;QACvB,EAAE,EAAE,eAAe,CAAC;QACpB,mBAAmB,EAAE,mBAAmB,CAAC;QACzC,cAAc,EAAE,cAAc,CAAC;QAC/B,SAAS,EAAE,gBAAgB,CAAC;QAC5B,YAAY,EAAE,YAAY,CAAC;QAC3B,sBAAsB,EAAE,sBAAsB,CAAC;QAC/C,eAAe,EAAE,eAAe,CAAC;QACjC,kBAAkB,EAAE,kBAAkB,CAAC;QACvC,iBAAiB,EAAE,iBAAiB,CAAC;QACrC,eAAe,EAAE,eAAe,CAAC;QACjC,YAAY,EAAE,YAAY,CAAC;QAC3B,wBAAwB,EAAE,wBAAwB,CAAC;QACnD,mBAAmB,EAAE,mBAAmB,CAAC;QACzC,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"}
|