@kavachos/fastify 0.0.2 → 0.0.4

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.
@@ -0,0 +1,36 @@
1
+ import { FastifyInstance } from 'fastify';
2
+ import { Kavach } from 'kavachos';
3
+ import { McpAuthModule } from 'kavachos/mcp';
4
+
5
+ interface KavachFastifyOptions {
6
+ /**
7
+ * The MCP OAuth 2.1 module. When provided, MCP endpoints are enabled.
8
+ */
9
+ mcp?: McpAuthModule;
10
+ }
11
+ /**
12
+ * Create a Fastify plugin that registers all KavachOS REST API routes.
13
+ *
14
+ * @example
15
+ * ```typescript
16
+ * import Fastify from 'fastify';
17
+ * import { createKavach } from 'kavachos';
18
+ * import { kavachFastify } from '@kavachos/fastify';
19
+ *
20
+ * const app = Fastify();
21
+ * const kavach = createKavach({ database: { provider: 'sqlite', url: 'kavach.db' } });
22
+ *
23
+ * await app.register(kavachFastify(kavach), { prefix: '/api/kavach' });
24
+ * await app.listen({ port: 3000 });
25
+ * ```
26
+ *
27
+ * With MCP OAuth 2.1:
28
+ * ```typescript
29
+ * import { createMcpModule } from 'kavachos/mcp';
30
+ * const mcp = createMcpModule({ ... });
31
+ * await app.register(kavachFastify(kavach, { mcp }), { prefix: '/api/kavach' });
32
+ * ```
33
+ */
34
+ declare function kavachFastify(kavach: Kavach, options?: KavachFastifyOptions): (fastify: FastifyInstance) => Promise<void>;
35
+
36
+ export { type KavachFastifyOptions, kavachFastify };
package/dist/index.js ADDED
@@ -0,0 +1,523 @@
1
+ import { z } from 'zod';
2
+
3
+ // src/adapter.ts
4
+ var PermissionConstraintsSchema = z.object({
5
+ maxCallsPerHour: z.number().int().positive().optional(),
6
+ allowedArgPatterns: z.array(z.string()).optional(),
7
+ requireApproval: z.boolean().optional(),
8
+ timeWindow: z.object({
9
+ start: z.string(),
10
+ end: z.string()
11
+ }).optional(),
12
+ ipAllowlist: z.array(z.string()).optional()
13
+ });
14
+ var PermissionSchema = z.object({
15
+ resource: z.string().min(1),
16
+ actions: z.array(z.string().min(1)).min(1),
17
+ constraints: PermissionConstraintsSchema.optional()
18
+ });
19
+ var CreateAgentSchema = z.object({
20
+ ownerId: z.string().min(1),
21
+ name: z.string().min(1),
22
+ type: z.enum(["autonomous", "delegated", "service"]),
23
+ permissions: z.array(PermissionSchema).min(1),
24
+ expiresAt: z.coerce.date().optional(),
25
+ metadata: z.record(z.unknown()).optional()
26
+ });
27
+ var UpdateAgentSchema = z.object({
28
+ name: z.string().min(1).optional(),
29
+ permissions: z.array(PermissionSchema).optional(),
30
+ expiresAt: z.coerce.date().optional(),
31
+ metadata: z.record(z.unknown()).optional()
32
+ });
33
+ var AuthorizeSchema = z.object({
34
+ agentId: z.string().min(1),
35
+ action: z.string().min(1),
36
+ resource: z.string().min(1),
37
+ arguments: z.record(z.unknown()).optional()
38
+ });
39
+ var AuthorizeByTokenSchema = z.object({
40
+ action: z.string().min(1),
41
+ resource: z.string().min(1),
42
+ arguments: z.record(z.unknown()).optional()
43
+ });
44
+ var DelegateSchema = z.object({
45
+ fromAgent: z.string().min(1),
46
+ toAgent: z.string().min(1),
47
+ permissions: z.array(PermissionSchema).min(1),
48
+ expiresAt: z.coerce.date(),
49
+ maxDepth: z.number().int().positive().optional()
50
+ });
51
+ function sendOk(reply, data, status = 200) {
52
+ return reply.status(status).header("Content-Type", "application/json").send({ data });
53
+ }
54
+ function sendCreated(reply, data) {
55
+ return sendOk(reply, data, 201);
56
+ }
57
+ function sendError(reply, code, message, status) {
58
+ return reply.status(status).header("Content-Type", "application/json").send({ error: { code, message } });
59
+ }
60
+ function sendBadRequest(reply, message) {
61
+ return sendError(reply, "BAD_REQUEST", message, 400);
62
+ }
63
+ function sendUnauthorized(reply, message = "Unauthorized") {
64
+ return sendError(reply, "UNAUTHORIZED", message, 401);
65
+ }
66
+ function sendNotFound(reply, message = "Not found") {
67
+ return sendError(reply, "NOT_FOUND", message, 404);
68
+ }
69
+ function sendInternalError(reply, message = "Internal server error") {
70
+ return sendError(reply, "INTERNAL_ERROR", message, 500);
71
+ }
72
+ function sendValidationError(reply, issues) {
73
+ const message = issues.map((i) => `${i.path.join(".")}: ${i.message}`).join(", ");
74
+ return sendBadRequest(reply, `Validation failed: ${message}`);
75
+ }
76
+ var MCP_CORS_HEADERS = {
77
+ "Access-Control-Allow-Origin": "*",
78
+ "Access-Control-Allow-Methods": "GET, POST, OPTIONS",
79
+ "Access-Control-Allow-Headers": "Content-Type, Authorization",
80
+ "Access-Control-Max-Age": "86400"
81
+ };
82
+ function applyMcpCors(reply) {
83
+ for (const [key, value] of Object.entries(MCP_CORS_HEADERS)) {
84
+ reply.header(key, value);
85
+ }
86
+ return reply;
87
+ }
88
+ function sendMcpOk(reply, data, status = 200) {
89
+ return applyMcpCors(reply).status(status).header("Content-Type", "application/json").send(data);
90
+ }
91
+ function sendMcpError(reply, code, message, status) {
92
+ return applyMcpCors(reply).status(status).header("Content-Type", "application/json").send({ error: code, error_description: message });
93
+ }
94
+ function sendMcpNoStore(reply, data, status = 200) {
95
+ return applyMcpCors(reply).status(status).header("Content-Type", "application/json").header("Cache-Control", "no-store").header("Pragma", "no-cache").send(data);
96
+ }
97
+ function buildAuditFilter(query) {
98
+ const q = query;
99
+ const filter = {};
100
+ if (q.agentId) filter.agentId = q.agentId;
101
+ if (q.userId) filter.userId = q.userId;
102
+ if (q.since) {
103
+ const d = new Date(q.since);
104
+ if (!Number.isNaN(d.getTime())) filter.since = d;
105
+ }
106
+ if (q.until) {
107
+ const d = new Date(q.until);
108
+ if (!Number.isNaN(d.getTime())) filter.until = d;
109
+ }
110
+ if (q.actions) {
111
+ filter.actions = q.actions.split(",").map((a) => a.trim());
112
+ }
113
+ const resultRaw = q.result;
114
+ if (resultRaw === "allowed" || resultRaw === "denied" || resultRaw === "rate_limited") {
115
+ filter.result = resultRaw;
116
+ }
117
+ if (q.limit) {
118
+ const n = Number.parseInt(q.limit, 10);
119
+ if (!Number.isNaN(n) && n > 0) filter.limit = n;
120
+ }
121
+ if (q.offset) {
122
+ const n = Number.parseInt(q.offset, 10);
123
+ if (!Number.isNaN(n) && n >= 0) filter.offset = n;
124
+ }
125
+ return filter;
126
+ }
127
+ function kavachFastify(kavach, options) {
128
+ const mcp = options?.mcp;
129
+ return async function plugin(fastify) {
130
+ fastify.options("/mcp/*", (_request, reply) => {
131
+ return reply.status(204).headers(MCP_CORS_HEADERS).send();
132
+ });
133
+ fastify.options("/.well-known/*", (_request, reply) => {
134
+ return reply.status(204).headers(MCP_CORS_HEADERS).send();
135
+ });
136
+ fastify.post("/agents", async (request, reply) => {
137
+ const parsed = CreateAgentSchema.safeParse(request.body);
138
+ if (!parsed.success) return sendValidationError(reply, parsed.error.issues);
139
+ try {
140
+ const input = {
141
+ ...parsed.data,
142
+ permissions: parsed.data.permissions
143
+ };
144
+ const agent = await kavach.agent.create(input);
145
+ return sendCreated(reply, agent);
146
+ } catch (err) {
147
+ const message = err instanceof Error ? err.message : "Failed to create agent";
148
+ return sendInternalError(reply, message);
149
+ }
150
+ });
151
+ fastify.get("/agents", async (request, reply) => {
152
+ const q = request.query;
153
+ const filter = {};
154
+ if (q.userId) filter.userId = q.userId;
155
+ const statusRaw = q.status;
156
+ if (statusRaw === "active" || statusRaw === "revoked" || statusRaw === "expired") {
157
+ filter.status = statusRaw;
158
+ }
159
+ const typeRaw = q.type;
160
+ if (typeRaw === "autonomous" || typeRaw === "delegated" || typeRaw === "service") {
161
+ filter.type = typeRaw;
162
+ }
163
+ try {
164
+ const agents = await kavach.agent.list(filter);
165
+ return sendOk(reply, agents);
166
+ } catch (err) {
167
+ const message = err instanceof Error ? err.message : "Failed to list agents";
168
+ return sendInternalError(reply, message);
169
+ }
170
+ });
171
+ fastify.get("/agents/:id", async (request, reply) => {
172
+ const { id } = request.params;
173
+ try {
174
+ const agent = await kavach.agent.get(id);
175
+ if (!agent) return sendNotFound(reply, `Agent "${id}" not found`);
176
+ return sendOk(reply, agent);
177
+ } catch (err) {
178
+ const message = err instanceof Error ? err.message : "Failed to get agent";
179
+ return sendInternalError(reply, message);
180
+ }
181
+ });
182
+ fastify.patch("/agents/:id", async (request, reply) => {
183
+ const { id } = request.params;
184
+ const parsed = UpdateAgentSchema.safeParse(request.body);
185
+ if (!parsed.success) return sendValidationError(reply, parsed.error.issues);
186
+ try {
187
+ const input = {
188
+ ...parsed.data,
189
+ permissions: parsed.data.permissions
190
+ };
191
+ const agent = await kavach.agent.update(id, input);
192
+ return sendOk(reply, agent);
193
+ } catch (err) {
194
+ const message = err instanceof Error ? err.message : "Failed to update agent";
195
+ if (message.includes("not found")) return sendNotFound(reply, message);
196
+ return sendInternalError(reply, message);
197
+ }
198
+ });
199
+ fastify.delete("/agents/:id", async (request, reply) => {
200
+ const { id } = request.params;
201
+ try {
202
+ await kavach.agent.revoke(id);
203
+ return reply.status(204).send();
204
+ } catch (err) {
205
+ const message = err instanceof Error ? err.message : "Failed to revoke agent";
206
+ if (message.includes("not found")) return sendNotFound(reply, message);
207
+ return sendInternalError(reply, message);
208
+ }
209
+ });
210
+ fastify.post("/agents/:id/rotate", async (request, reply) => {
211
+ const { id } = request.params;
212
+ try {
213
+ const agent = await kavach.agent.rotate(id);
214
+ return sendOk(reply, agent);
215
+ } catch (err) {
216
+ const message = err instanceof Error ? err.message : "Failed to rotate agent token";
217
+ if (message.includes("not found")) return sendNotFound(reply, message);
218
+ return sendInternalError(reply, message);
219
+ }
220
+ });
221
+ fastify.post("/authorize", async (request, reply) => {
222
+ const parsed = AuthorizeSchema.safeParse(request.body);
223
+ if (!parsed.success) return sendValidationError(reply, parsed.error.issues);
224
+ try {
225
+ const xForwardedFor = request.headers["x-forwarded-for"];
226
+ const ip = (Array.isArray(xForwardedFor) ? xForwardedFor[0] : xForwardedFor?.split(",")[0]?.trim()) ?? request.ip ?? void 0;
227
+ const userAgent = (Array.isArray(request.headers["user-agent"]) ? request.headers["user-agent"][0] : request.headers["user-agent"]) ?? void 0;
228
+ const result = await kavach.authorize(
229
+ parsed.data.agentId,
230
+ {
231
+ action: parsed.data.action,
232
+ resource: parsed.data.resource,
233
+ arguments: parsed.data.arguments
234
+ },
235
+ { ip, userAgent }
236
+ );
237
+ const status = result.allowed ? 200 : 403;
238
+ return reply.status(status).header("Content-Type", "application/json").send({ data: result });
239
+ } catch (err) {
240
+ const message = err instanceof Error ? err.message : "Authorization check failed";
241
+ return sendInternalError(reply, message);
242
+ }
243
+ });
244
+ fastify.post("/authorize/token", async (request, reply) => {
245
+ const authHeader = request.headers.authorization;
246
+ if (!authHeader?.startsWith("Bearer ")) {
247
+ return sendUnauthorized(reply, "Missing or invalid Authorization header");
248
+ }
249
+ const token = authHeader.slice(7);
250
+ const parsed = AuthorizeByTokenSchema.safeParse(request.body);
251
+ if (!parsed.success) return sendValidationError(reply, parsed.error.issues);
252
+ try {
253
+ const xForwardedFor = request.headers["x-forwarded-for"];
254
+ const ip = (Array.isArray(xForwardedFor) ? xForwardedFor[0] : xForwardedFor?.split(",")[0]?.trim()) ?? request.ip ?? void 0;
255
+ const userAgent = (Array.isArray(request.headers["user-agent"]) ? request.headers["user-agent"][0] : request.headers["user-agent"]) ?? void 0;
256
+ const result = await kavach.authorizeByToken(
257
+ token,
258
+ {
259
+ action: parsed.data.action,
260
+ resource: parsed.data.resource,
261
+ arguments: parsed.data.arguments
262
+ },
263
+ { ip, userAgent }
264
+ );
265
+ const status = result.allowed ? 200 : 403;
266
+ return reply.status(status).header("Content-Type", "application/json").send({ data: result });
267
+ } catch (err) {
268
+ const message = err instanceof Error ? err.message : "Authorization check failed";
269
+ return sendInternalError(reply, message);
270
+ }
271
+ });
272
+ fastify.post("/delegations", async (request, reply) => {
273
+ const parsed = DelegateSchema.safeParse(request.body);
274
+ if (!parsed.success) return sendValidationError(reply, parsed.error.issues);
275
+ try {
276
+ const input = {
277
+ ...parsed.data,
278
+ permissions: parsed.data.permissions
279
+ };
280
+ const chain = await kavach.delegate(input);
281
+ return sendCreated(reply, chain);
282
+ } catch (err) {
283
+ const message = err instanceof Error ? err.message : "Failed to create delegation";
284
+ if (message.includes("not found")) return sendNotFound(reply, message);
285
+ if (message.includes("exceeds") || message.includes("depth"))
286
+ return sendBadRequest(reply, message);
287
+ return sendInternalError(reply, message);
288
+ }
289
+ });
290
+ fastify.delete("/delegations/:id", async (request, reply) => {
291
+ const { id } = request.params;
292
+ try {
293
+ await kavach.delegation.revoke(id);
294
+ return reply.status(204).send();
295
+ } catch (err) {
296
+ const message = err instanceof Error ? err.message : "Failed to revoke delegation";
297
+ if (message.includes("not found")) return sendNotFound(reply, message);
298
+ return sendInternalError(reply, message);
299
+ }
300
+ });
301
+ fastify.get(
302
+ "/delegations/:agentId",
303
+ async (request, reply) => {
304
+ const { agentId } = request.params;
305
+ try {
306
+ const chains = await kavach.delegation.listChains(agentId);
307
+ return sendOk(reply, chains);
308
+ } catch (err) {
309
+ const message = err instanceof Error ? err.message : "Failed to list delegation chains";
310
+ return sendInternalError(reply, message);
311
+ }
312
+ }
313
+ );
314
+ fastify.get("/audit/export", async (request, reply) => {
315
+ const q = request.query;
316
+ const format = q.format ?? "json";
317
+ if (format !== "json" && format !== "csv") {
318
+ return sendBadRequest(reply, 'format must be "json" or "csv"');
319
+ }
320
+ const options2 = { format };
321
+ if (q.since) {
322
+ const d = new Date(q.since);
323
+ if (!Number.isNaN(d.getTime())) options2.since = d;
324
+ }
325
+ if (q.until) {
326
+ const d = new Date(q.until);
327
+ if (!Number.isNaN(d.getTime())) options2.until = d;
328
+ }
329
+ try {
330
+ const exported = await kavach.audit.export(options2);
331
+ const contentType = format === "csv" ? "text/csv" : "application/json";
332
+ return reply.status(200).header("Content-Type", contentType).header("Content-Disposition", `attachment; filename="audit-export.${format}"`).send(exported);
333
+ } catch (err) {
334
+ const message = err instanceof Error ? err.message : "Failed to export audit logs";
335
+ return sendInternalError(reply, message);
336
+ }
337
+ });
338
+ fastify.get("/audit", async (request, reply) => {
339
+ const filter = buildAuditFilter(request.query);
340
+ try {
341
+ const entries = await kavach.audit.query(filter);
342
+ return sendOk(reply, entries);
343
+ } catch (err) {
344
+ const message = err instanceof Error ? err.message : "Failed to query audit logs";
345
+ return sendInternalError(reply, message);
346
+ }
347
+ });
348
+ fastify.get("/dashboard/stats", async (_request, reply) => {
349
+ try {
350
+ const [agents, recentAudit] = await Promise.all([
351
+ kavach.agent.list(),
352
+ kavach.audit.query({
353
+ since: new Date(Date.now() - 24 * 60 * 60 * 1e3),
354
+ limit: 1e3
355
+ })
356
+ ]);
357
+ const ownerIds = new Set(agents.map((a) => a.ownerId));
358
+ const activeAgents = agents.filter((a) => a.status === "active");
359
+ const revokedAgents = agents.filter((a) => a.status === "revoked");
360
+ const expiredAgents = agents.filter((a) => a.status === "expired");
361
+ const stats = {
362
+ agents: {
363
+ total: agents.length,
364
+ active: activeAgents.length,
365
+ revoked: revokedAgents.length,
366
+ expired: expiredAgents.length
367
+ },
368
+ users: {
369
+ total: ownerIds.size
370
+ },
371
+ audit: {
372
+ last24h: recentAudit.length,
373
+ allowed: recentAudit.filter((e) => e.result === "allowed").length,
374
+ denied: recentAudit.filter((e) => e.result === "denied").length,
375
+ rateLimited: recentAudit.filter((e) => e.result === "rate_limited").length
376
+ }
377
+ };
378
+ return sendOk(reply, stats);
379
+ } catch (err) {
380
+ const message = err instanceof Error ? err.message : "Failed to fetch dashboard stats";
381
+ return sendInternalError(reply, message);
382
+ }
383
+ });
384
+ fastify.get("/dashboard/agents", async (request, reply) => {
385
+ const q = request.query;
386
+ const filter = {};
387
+ if (q.userId) filter.userId = q.userId;
388
+ const statusRaw = q.status;
389
+ if (statusRaw === "active" || statusRaw === "revoked" || statusRaw === "expired") {
390
+ filter.status = statusRaw;
391
+ }
392
+ const typeRaw = q.type;
393
+ if (typeRaw === "autonomous" || typeRaw === "delegated" || typeRaw === "service") {
394
+ filter.type = typeRaw;
395
+ }
396
+ try {
397
+ const agents = await kavach.agent.list(filter);
398
+ return sendOk(reply, agents);
399
+ } catch (err) {
400
+ const message = err instanceof Error ? err.message : "Failed to list agents";
401
+ return sendInternalError(reply, message);
402
+ }
403
+ });
404
+ fastify.get("/dashboard/audit", async (request, reply) => {
405
+ const filter = buildAuditFilter(request.query);
406
+ try {
407
+ const entries = await kavach.audit.query(filter);
408
+ return sendOk(reply, entries);
409
+ } catch (err) {
410
+ const message = err instanceof Error ? err.message : "Failed to query audit logs";
411
+ return sendInternalError(reply, message);
412
+ }
413
+ });
414
+ fastify.get("/.well-known/oauth-authorization-server", (_request, reply) => {
415
+ if (!mcp) return sendNotFound(reply, "MCP module not configured");
416
+ const metadata = mcp.getMetadata();
417
+ return sendMcpOk(reply, metadata);
418
+ });
419
+ fastify.get("/.well-known/oauth-protected-resource", (_request, reply) => {
420
+ if (!mcp) return sendNotFound(reply, "MCP module not configured");
421
+ const metadata = mcp.getProtectedResourceMetadata();
422
+ return sendMcpOk(reply, metadata);
423
+ });
424
+ fastify.post("/mcp/register", async (request, reply) => {
425
+ if (!mcp) return sendNotFound(reply, "MCP module not configured");
426
+ try {
427
+ const result = await mcp.registerClient(
428
+ request.body
429
+ );
430
+ if (!result.success) {
431
+ return sendMcpError(reply, "invalid_client_metadata", result.error.message, 400);
432
+ }
433
+ return sendMcpNoStore(reply, result.data, 201);
434
+ } catch (err) {
435
+ const message = err instanceof Error ? err.message : "Registration failed";
436
+ return sendMcpError(reply, "server_error", message, 500);
437
+ }
438
+ });
439
+ fastify.get("/mcp/authorize", async (request, reply) => {
440
+ if (!mcp) return sendNotFound(reply, "MCP module not configured");
441
+ try {
442
+ const url = `${request.protocol}://${request.hostname}${request.url}`;
443
+ const webRequest = new Request(url, {
444
+ method: "GET",
445
+ headers: request.headers
446
+ });
447
+ const result = await mcp.authorize(webRequest);
448
+ if (!result.success) {
449
+ if (result.error.code === "LOGIN_REQUIRED") {
450
+ const details = result.error.details;
451
+ if (details?.loginPage) {
452
+ const loginUrl = new URL(details.loginPage);
453
+ if (details.returnTo) {
454
+ loginUrl.searchParams.set("returnTo", details.returnTo);
455
+ }
456
+ return reply.redirect(loginUrl.toString(), 302);
457
+ }
458
+ }
459
+ return sendMcpError(reply, result.error.code.toLowerCase(), result.error.message, 400);
460
+ }
461
+ return reply.redirect(result.data.redirectUri, 302);
462
+ } catch (err) {
463
+ const message = err instanceof Error ? err.message : "Authorization failed";
464
+ return sendMcpError(reply, "server_error", message, 500);
465
+ }
466
+ });
467
+ for (const endpoint of kavach.plugins.getEndpoints()) {
468
+ const method = endpoint.method.toLowerCase();
469
+ fastify[method](endpoint.path, async (request, reply) => {
470
+ const url = `${request.protocol}://${request.hostname}${request.url}`;
471
+ const headers = new Headers(request.headers);
472
+ const hasBody = request.method !== "GET" && request.method !== "HEAD";
473
+ const body = hasBody && request.body !== void 0 ? JSON.stringify(request.body) : void 0;
474
+ const webReq = new Request(url, { method: request.method, headers, body });
475
+ const response = await kavach.plugins.handleRequest(webReq);
476
+ if (!response) {
477
+ return sendNotFound(reply, "Plugin endpoint not found");
478
+ }
479
+ reply.status(response.status);
480
+ response.headers.forEach((value, key) => {
481
+ reply.header(key, value);
482
+ });
483
+ const text = await response.text();
484
+ return reply.send(text);
485
+ });
486
+ }
487
+ fastify.post("/mcp/token", async (request, reply) => {
488
+ if (!mcp) return sendNotFound(reply, "MCP module not configured");
489
+ try {
490
+ const url = `${request.protocol}://${request.hostname}${request.url}`;
491
+ const body = JSON.stringify(request.body);
492
+ const webRequest = new Request(url, {
493
+ method: "POST",
494
+ headers: {
495
+ ...request.headers,
496
+ "Content-Type": "application/json"
497
+ },
498
+ body
499
+ });
500
+ const result = await mcp.token(webRequest);
501
+ if (!result.success) {
502
+ const status = result.error.code === "INVALID_CLIENT" ? 401 : 400;
503
+ return sendMcpNoStore(
504
+ reply,
505
+ {
506
+ error: result.error.code.toLowerCase(),
507
+ error_description: result.error.message
508
+ },
509
+ status
510
+ );
511
+ }
512
+ return sendMcpNoStore(reply, result.data);
513
+ } catch (err) {
514
+ const message = err instanceof Error ? err.message : "Token exchange failed";
515
+ return sendMcpNoStore(reply, { error: "server_error", error_description: message }, 500);
516
+ }
517
+ });
518
+ };
519
+ }
520
+
521
+ export { kavachFastify };
522
+ //# sourceMappingURL=index.js.map
523
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/adapter.ts"],"names":["options"],"mappings":"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","file":"index.js","sourcesContent":["import type { FastifyInstance, FastifyReply, FastifyRequest } from \"fastify\";\nimport type {\n\tAgentFilter,\n\tAuditFilter,\n\tCreateAgentInput,\n\tDelegateInput,\n\tKavach,\n\tPermission,\n\tUpdateAgentInput,\n} from \"kavachos\";\nimport type { McpAuthModule } from \"kavachos/mcp\";\nimport { z } from \"zod\";\n\n// ─── Zod Validation Schemas ──────────────────────────────────────────────────\n\nconst PermissionConstraintsSchema = z.object({\n\tmaxCallsPerHour: z.number().int().positive().optional(),\n\tallowedArgPatterns: z.array(z.string()).optional(),\n\trequireApproval: z.boolean().optional(),\n\ttimeWindow: z\n\t\t.object({\n\t\t\tstart: z.string(),\n\t\t\tend: z.string(),\n\t\t})\n\t\t.optional(),\n\tipAllowlist: z.array(z.string()).optional(),\n});\n\nconst PermissionSchema = z.object({\n\tresource: z.string().min(1),\n\tactions: z.array(z.string().min(1)).min(1),\n\tconstraints: PermissionConstraintsSchema.optional(),\n});\n\nconst CreateAgentSchema = z.object({\n\townerId: z.string().min(1),\n\tname: z.string().min(1),\n\ttype: z.enum([\"autonomous\", \"delegated\", \"service\"]),\n\tpermissions: z.array(PermissionSchema).min(1),\n\texpiresAt: z.coerce.date().optional(),\n\tmetadata: z.record(z.unknown()).optional(),\n});\n\nconst UpdateAgentSchema = z.object({\n\tname: z.string().min(1).optional(),\n\tpermissions: z.array(PermissionSchema).optional(),\n\texpiresAt: z.coerce.date().optional(),\n\tmetadata: z.record(z.unknown()).optional(),\n});\n\nconst AuthorizeSchema = z.object({\n\tagentId: z.string().min(1),\n\taction: z.string().min(1),\n\tresource: z.string().min(1),\n\targuments: z.record(z.unknown()).optional(),\n});\n\nconst AuthorizeByTokenSchema = z.object({\n\taction: z.string().min(1),\n\tresource: z.string().min(1),\n\targuments: z.record(z.unknown()).optional(),\n});\n\nconst DelegateSchema = z.object({\n\tfromAgent: z.string().min(1),\n\ttoAgent: z.string().min(1),\n\tpermissions: z.array(PermissionSchema).min(1),\n\texpiresAt: z.coerce.date(),\n\tmaxDepth: z.number().int().positive().optional(),\n});\n\n// ─── Response Helpers ────────────────────────────────────────────────────────\n\nfunction sendOk<T>(reply: FastifyReply, data: T, status = 200): FastifyReply {\n\treturn reply.status(status).header(\"Content-Type\", \"application/json\").send({ data });\n}\n\nfunction sendCreated<T>(reply: FastifyReply, data: T): FastifyReply {\n\treturn sendOk(reply, data, 201);\n}\n\nfunction sendError(\n\treply: FastifyReply,\n\tcode: string,\n\tmessage: string,\n\tstatus: number,\n): FastifyReply {\n\treturn reply\n\t\t.status(status)\n\t\t.header(\"Content-Type\", \"application/json\")\n\t\t.send({ error: { code, message } });\n}\n\nfunction sendBadRequest(reply: FastifyReply, message: string): FastifyReply {\n\treturn sendError(reply, \"BAD_REQUEST\", message, 400);\n}\n\nfunction sendUnauthorized(reply: FastifyReply, message = \"Unauthorized\"): FastifyReply {\n\treturn sendError(reply, \"UNAUTHORIZED\", message, 401);\n}\n\nfunction sendNotFound(reply: FastifyReply, message = \"Not found\"): FastifyReply {\n\treturn sendError(reply, \"NOT_FOUND\", message, 404);\n}\n\nfunction sendInternalError(reply: FastifyReply, message = \"Internal server error\"): FastifyReply {\n\treturn sendError(reply, \"INTERNAL_ERROR\", message, 500);\n}\n\nfunction sendValidationError(reply: FastifyReply, issues: z.ZodIssue[]): FastifyReply {\n\tconst message = issues.map((i) => `${i.path.join(\".\")}: ${i.message}`).join(\", \");\n\treturn sendBadRequest(reply, `Validation failed: ${message}`);\n}\n\n// ─── MCP CORS Headers ────────────────────────────────────────────────────────\n\nconst MCP_CORS_HEADERS: Record<string, string> = {\n\t\"Access-Control-Allow-Origin\": \"*\",\n\t\"Access-Control-Allow-Methods\": \"GET, POST, OPTIONS\",\n\t\"Access-Control-Allow-Headers\": \"Content-Type, Authorization\",\n\t\"Access-Control-Max-Age\": \"86400\",\n};\n\nfunction applyMcpCors(reply: FastifyReply): FastifyReply {\n\tfor (const [key, value] of Object.entries(MCP_CORS_HEADERS)) {\n\t\treply.header(key, value);\n\t}\n\treturn reply;\n}\n\nfunction sendMcpOk<T>(reply: FastifyReply, data: T, status = 200): FastifyReply {\n\treturn applyMcpCors(reply).status(status).header(\"Content-Type\", \"application/json\").send(data);\n}\n\nfunction sendMcpError(\n\treply: FastifyReply,\n\tcode: string,\n\tmessage: string,\n\tstatus: number,\n): FastifyReply {\n\treturn applyMcpCors(reply)\n\t\t.status(status)\n\t\t.header(\"Content-Type\", \"application/json\")\n\t\t.send({ error: code, error_description: message });\n}\n\nfunction sendMcpNoStore<T>(reply: FastifyReply, data: T, status = 200): FastifyReply {\n\treturn applyMcpCors(reply)\n\t\t.status(status)\n\t\t.header(\"Content-Type\", \"application/json\")\n\t\t.header(\"Cache-Control\", \"no-store\")\n\t\t.header(\"Pragma\", \"no-cache\")\n\t\t.send(data);\n}\n\n// ─── Audit Filter Builder ────────────────────────────────────────────────────\n\nfunction buildAuditFilter(query: FastifyRequest[\"query\"]): AuditFilter {\n\tconst q = query as Record<string, string | undefined>;\n\tconst filter: AuditFilter = {};\n\n\tif (q.agentId) filter.agentId = q.agentId;\n\tif (q.userId) filter.userId = q.userId;\n\n\tif (q.since) {\n\t\tconst d = new Date(q.since);\n\t\tif (!Number.isNaN(d.getTime())) filter.since = d;\n\t}\n\tif (q.until) {\n\t\tconst d = new Date(q.until);\n\t\tif (!Number.isNaN(d.getTime())) filter.until = d;\n\t}\n\tif (q.actions) {\n\t\tfilter.actions = q.actions.split(\",\").map((a) => a.trim());\n\t}\n\tconst resultRaw = q.result;\n\tif (resultRaw === \"allowed\" || resultRaw === \"denied\" || resultRaw === \"rate_limited\") {\n\t\tfilter.result = resultRaw;\n\t}\n\tif (q.limit) {\n\t\tconst n = Number.parseInt(q.limit, 10);\n\t\tif (!Number.isNaN(n) && n > 0) filter.limit = n;\n\t}\n\tif (q.offset) {\n\t\tconst n = Number.parseInt(q.offset, 10);\n\t\tif (!Number.isNaN(n) && n >= 0) filter.offset = n;\n\t}\n\n\treturn filter;\n}\n\n// ─── Adapter Options ─────────────────────────────────────────────────────────\n\nexport interface KavachFastifyOptions {\n\t/**\n\t * The MCP OAuth 2.1 module. When provided, MCP endpoints are enabled.\n\t */\n\tmcp?: McpAuthModule;\n\t/**\n\t * URL prefix to mount all routes under. Defaults to no prefix (routes are\n\t * registered directly on the provided FastifyInstance).\n\t *\n\t * Use Fastify's built-in prefix option when calling `fastify.register` instead:\n\t * `fastify.register(plugin, { prefix: '/api/kavach' })`\n\t */\n}\n\n// ─── Adapter Factory ─────────────────────────────────────────────────────────\n\n/**\n * Create a Fastify plugin that registers all KavachOS REST API routes.\n *\n * @example\n * ```typescript\n * import Fastify from 'fastify';\n * import { createKavach } from 'kavachos';\n * import { kavachFastify } from '@kavachos/fastify';\n *\n * const app = Fastify();\n * const kavach = createKavach({ database: { provider: 'sqlite', url: 'kavach.db' } });\n *\n * await app.register(kavachFastify(kavach), { prefix: '/api/kavach' });\n * await app.listen({ port: 3000 });\n * ```\n *\n * With MCP OAuth 2.1:\n * ```typescript\n * import { createMcpModule } from 'kavachos/mcp';\n * const mcp = createMcpModule({ ... });\n * await app.register(kavachFastify(kavach, { mcp }), { prefix: '/api/kavach' });\n * ```\n */\nexport function kavachFastify(kavach: Kavach, options?: KavachFastifyOptions) {\n\tconst mcp = options?.mcp;\n\n\treturn async function plugin(fastify: FastifyInstance): Promise<void> {\n\t\t// ── MCP OPTIONS preflight ────────────────────────────────────\n\n\t\tfastify.options(\"/mcp/*\", (_request, reply) => {\n\t\t\treturn reply.status(204).headers(MCP_CORS_HEADERS).send();\n\t\t});\n\n\t\tfastify.options(\"/.well-known/*\", (_request, reply) => {\n\t\t\treturn reply.status(204).headers(MCP_CORS_HEADERS).send();\n\t\t});\n\n\t\t// ── Agent REST API ───────────────────────────────────────────\n\n\t\t// POST /agents\n\t\tfastify.post(\"/agents\", async (request, reply) => {\n\t\t\tconst parsed = CreateAgentSchema.safeParse(request.body);\n\t\t\tif (!parsed.success) return sendValidationError(reply, parsed.error.issues);\n\n\t\t\ttry {\n\t\t\t\tconst input: CreateAgentInput = {\n\t\t\t\t\t...parsed.data,\n\t\t\t\t\tpermissions: parsed.data.permissions as Permission[],\n\t\t\t\t};\n\t\t\t\tconst agent = await kavach.agent.create(input);\n\t\t\t\treturn sendCreated(reply, agent);\n\t\t\t} catch (err) {\n\t\t\t\tconst message = err instanceof Error ? err.message : \"Failed to create agent\";\n\t\t\t\treturn sendInternalError(reply, message);\n\t\t\t}\n\t\t});\n\n\t\t// GET /agents\n\t\tfastify.get(\"/agents\", async (request, reply) => {\n\t\t\tconst q = request.query as Record<string, string | undefined>;\n\t\t\tconst filter: AgentFilter = {};\n\n\t\t\tif (q.userId) filter.userId = q.userId;\n\t\t\tconst statusRaw = q.status;\n\t\t\tif (statusRaw === \"active\" || statusRaw === \"revoked\" || statusRaw === \"expired\") {\n\t\t\t\tfilter.status = statusRaw;\n\t\t\t}\n\t\t\tconst typeRaw = q.type;\n\t\t\tif (typeRaw === \"autonomous\" || typeRaw === \"delegated\" || typeRaw === \"service\") {\n\t\t\t\tfilter.type = typeRaw;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst agents = await kavach.agent.list(filter);\n\t\t\t\treturn sendOk(reply, agents);\n\t\t\t} catch (err) {\n\t\t\t\tconst message = err instanceof Error ? err.message : \"Failed to list agents\";\n\t\t\t\treturn sendInternalError(reply, message);\n\t\t\t}\n\t\t});\n\n\t\t// GET /agents/:id\n\t\tfastify.get<{ Params: { id: string } }>(\"/agents/:id\", async (request, reply) => {\n\t\t\tconst { id } = request.params;\n\t\t\ttry {\n\t\t\t\tconst agent = await kavach.agent.get(id);\n\t\t\t\tif (!agent) return sendNotFound(reply, `Agent \"${id}\" not found`);\n\t\t\t\treturn sendOk(reply, agent);\n\t\t\t} catch (err) {\n\t\t\t\tconst message = err instanceof Error ? err.message : \"Failed to get agent\";\n\t\t\t\treturn sendInternalError(reply, message);\n\t\t\t}\n\t\t});\n\n\t\t// PATCH /agents/:id\n\t\tfastify.patch<{ Params: { id: string } }>(\"/agents/:id\", async (request, reply) => {\n\t\t\tconst { id } = request.params;\n\t\t\tconst parsed = UpdateAgentSchema.safeParse(request.body);\n\t\t\tif (!parsed.success) return sendValidationError(reply, parsed.error.issues);\n\n\t\t\ttry {\n\t\t\t\tconst input: UpdateAgentInput = {\n\t\t\t\t\t...parsed.data,\n\t\t\t\t\tpermissions: parsed.data.permissions as Permission[] | undefined,\n\t\t\t\t};\n\t\t\t\tconst agent = await kavach.agent.update(id, input);\n\t\t\t\treturn sendOk(reply, agent);\n\t\t\t} catch (err) {\n\t\t\t\tconst message = err instanceof Error ? err.message : \"Failed to update agent\";\n\t\t\t\tif (message.includes(\"not found\")) return sendNotFound(reply, message);\n\t\t\t\treturn sendInternalError(reply, message);\n\t\t\t}\n\t\t});\n\n\t\t// DELETE /agents/:id\n\t\tfastify.delete<{ Params: { id: string } }>(\"/agents/:id\", async (request, reply) => {\n\t\t\tconst { id } = request.params;\n\t\t\ttry {\n\t\t\t\tawait kavach.agent.revoke(id);\n\t\t\t\treturn reply.status(204).send();\n\t\t\t} catch (err) {\n\t\t\t\tconst message = err instanceof Error ? err.message : \"Failed to revoke agent\";\n\t\t\t\tif (message.includes(\"not found\")) return sendNotFound(reply, message);\n\t\t\t\treturn sendInternalError(reply, message);\n\t\t\t}\n\t\t});\n\n\t\t// POST /agents/:id/rotate\n\t\tfastify.post<{ Params: { id: string } }>(\"/agents/:id/rotate\", async (request, reply) => {\n\t\t\tconst { id } = request.params;\n\t\t\ttry {\n\t\t\t\tconst agent = await kavach.agent.rotate(id);\n\t\t\t\treturn sendOk(reply, agent);\n\t\t\t} catch (err) {\n\t\t\t\tconst message = err instanceof Error ? err.message : \"Failed to rotate agent token\";\n\t\t\t\tif (message.includes(\"not found\")) return sendNotFound(reply, message);\n\t\t\t\treturn sendInternalError(reply, message);\n\t\t\t}\n\t\t});\n\n\t\t// ── Authorization ────────────────────────────────────────────\n\n\t\t// POST /authorize\n\t\tfastify.post(\"/authorize\", async (request, reply) => {\n\t\t\tconst parsed = AuthorizeSchema.safeParse(request.body);\n\t\t\tif (!parsed.success) return sendValidationError(reply, parsed.error.issues);\n\n\t\t\ttry {\n\t\t\t\tconst xForwardedFor = request.headers[\"x-forwarded-for\"];\n\t\t\t\tconst ip =\n\t\t\t\t\t(Array.isArray(xForwardedFor)\n\t\t\t\t\t\t? xForwardedFor[0]\n\t\t\t\t\t\t: xForwardedFor?.split(\",\")[0]?.trim()) ??\n\t\t\t\t\trequest.ip ??\n\t\t\t\t\tundefined;\n\t\t\t\tconst userAgent =\n\t\t\t\t\t(Array.isArray(request.headers[\"user-agent\"])\n\t\t\t\t\t\t? request.headers[\"user-agent\"][0]\n\t\t\t\t\t\t: request.headers[\"user-agent\"]) ?? undefined;\n\t\t\t\tconst result = await kavach.authorize(\n\t\t\t\t\tparsed.data.agentId,\n\t\t\t\t\t{\n\t\t\t\t\t\taction: parsed.data.action,\n\t\t\t\t\t\tresource: parsed.data.resource,\n\t\t\t\t\t\targuments: parsed.data.arguments,\n\t\t\t\t\t},\n\t\t\t\t\t{ ip, userAgent },\n\t\t\t\t);\n\t\t\t\tconst status = result.allowed ? 200 : 403;\n\t\t\t\treturn reply\n\t\t\t\t\t.status(status)\n\t\t\t\t\t.header(\"Content-Type\", \"application/json\")\n\t\t\t\t\t.send({ data: result });\n\t\t\t} catch (err) {\n\t\t\t\tconst message = err instanceof Error ? err.message : \"Authorization check failed\";\n\t\t\t\treturn sendInternalError(reply, message);\n\t\t\t}\n\t\t});\n\n\t\t// POST /authorize/token\n\t\tfastify.post(\"/authorize/token\", async (request, reply) => {\n\t\t\tconst authHeader = request.headers.authorization;\n\t\t\tif (!authHeader?.startsWith(\"Bearer \")) {\n\t\t\t\treturn sendUnauthorized(reply, \"Missing or invalid Authorization header\");\n\t\t\t}\n\t\t\tconst token = authHeader.slice(7);\n\n\t\t\tconst parsed = AuthorizeByTokenSchema.safeParse(request.body);\n\t\t\tif (!parsed.success) return sendValidationError(reply, parsed.error.issues);\n\n\t\t\ttry {\n\t\t\t\tconst xForwardedFor = request.headers[\"x-forwarded-for\"];\n\t\t\t\tconst ip =\n\t\t\t\t\t(Array.isArray(xForwardedFor)\n\t\t\t\t\t\t? xForwardedFor[0]\n\t\t\t\t\t\t: xForwardedFor?.split(\",\")[0]?.trim()) ??\n\t\t\t\t\trequest.ip ??\n\t\t\t\t\tundefined;\n\t\t\t\tconst userAgent =\n\t\t\t\t\t(Array.isArray(request.headers[\"user-agent\"])\n\t\t\t\t\t\t? request.headers[\"user-agent\"][0]\n\t\t\t\t\t\t: request.headers[\"user-agent\"]) ?? undefined;\n\t\t\t\tconst result = await kavach.authorizeByToken(\n\t\t\t\t\ttoken,\n\t\t\t\t\t{\n\t\t\t\t\t\taction: parsed.data.action,\n\t\t\t\t\t\tresource: parsed.data.resource,\n\t\t\t\t\t\targuments: parsed.data.arguments,\n\t\t\t\t\t},\n\t\t\t\t\t{ ip, userAgent },\n\t\t\t\t);\n\t\t\t\tconst status = result.allowed ? 200 : 403;\n\t\t\t\treturn reply\n\t\t\t\t\t.status(status)\n\t\t\t\t\t.header(\"Content-Type\", \"application/json\")\n\t\t\t\t\t.send({ data: result });\n\t\t\t} catch (err) {\n\t\t\t\tconst message = err instanceof Error ? err.message : \"Authorization check failed\";\n\t\t\t\treturn sendInternalError(reply, message);\n\t\t\t}\n\t\t});\n\n\t\t// ── Delegation ───────────────────────────────────────────────\n\n\t\t// POST /delegations\n\t\tfastify.post(\"/delegations\", async (request, reply) => {\n\t\t\tconst parsed = DelegateSchema.safeParse(request.body);\n\t\t\tif (!parsed.success) return sendValidationError(reply, parsed.error.issues);\n\n\t\t\ttry {\n\t\t\t\tconst input: DelegateInput = {\n\t\t\t\t\t...parsed.data,\n\t\t\t\t\tpermissions: parsed.data.permissions as Permission[],\n\t\t\t\t};\n\t\t\t\tconst chain = await kavach.delegate(input);\n\t\t\t\treturn sendCreated(reply, chain);\n\t\t\t} catch (err) {\n\t\t\t\tconst message = err instanceof Error ? err.message : \"Failed to create delegation\";\n\t\t\t\tif (message.includes(\"not found\")) return sendNotFound(reply, message);\n\t\t\t\tif (message.includes(\"exceeds\") || message.includes(\"depth\"))\n\t\t\t\t\treturn sendBadRequest(reply, message);\n\t\t\t\treturn sendInternalError(reply, message);\n\t\t\t}\n\t\t});\n\n\t\t// DELETE /delegations/:id\n\t\tfastify.delete<{ Params: { id: string } }>(\"/delegations/:id\", async (request, reply) => {\n\t\t\tconst { id } = request.params;\n\t\t\ttry {\n\t\t\t\tawait kavach.delegation.revoke(id);\n\t\t\t\treturn reply.status(204).send();\n\t\t\t} catch (err) {\n\t\t\t\tconst message = err instanceof Error ? err.message : \"Failed to revoke delegation\";\n\t\t\t\tif (message.includes(\"not found\")) return sendNotFound(reply, message);\n\t\t\t\treturn sendInternalError(reply, message);\n\t\t\t}\n\t\t});\n\n\t\t// GET /delegations/:agentId\n\t\tfastify.get<{ Params: { agentId: string } }>(\n\t\t\t\"/delegations/:agentId\",\n\t\t\tasync (request, reply) => {\n\t\t\t\tconst { agentId } = request.params;\n\t\t\t\ttry {\n\t\t\t\t\tconst chains = await kavach.delegation.listChains(agentId);\n\t\t\t\t\treturn sendOk(reply, chains);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tconst message = err instanceof Error ? err.message : \"Failed to list delegation chains\";\n\t\t\t\t\treturn sendInternalError(reply, message);\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\n\t\t// ── Audit ─────────────────────────────────────────────────────\n\n\t\t// GET /audit/export — must be registered before /audit to avoid route shadowing\n\t\tfastify.get(\"/audit/export\", async (request, reply) => {\n\t\t\tconst q = request.query as Record<string, string | undefined>;\n\t\t\tconst format = q.format ?? \"json\";\n\t\t\tif (format !== \"json\" && format !== \"csv\") {\n\t\t\t\treturn sendBadRequest(reply, 'format must be \"json\" or \"csv\"');\n\t\t\t}\n\n\t\t\tconst options: { format: \"json\" | \"csv\"; since?: Date; until?: Date } = { format };\n\t\t\tif (q.since) {\n\t\t\t\tconst d = new Date(q.since);\n\t\t\t\tif (!Number.isNaN(d.getTime())) options.since = d;\n\t\t\t}\n\t\t\tif (q.until) {\n\t\t\t\tconst d = new Date(q.until);\n\t\t\t\tif (!Number.isNaN(d.getTime())) options.until = d;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst exported = await kavach.audit.export(options);\n\t\t\t\tconst contentType = format === \"csv\" ? \"text/csv\" : \"application/json\";\n\t\t\t\treturn reply\n\t\t\t\t\t.status(200)\n\t\t\t\t\t.header(\"Content-Type\", contentType)\n\t\t\t\t\t.header(\"Content-Disposition\", `attachment; filename=\"audit-export.${format}\"`)\n\t\t\t\t\t.send(exported);\n\t\t\t} catch (err) {\n\t\t\t\tconst message = err instanceof Error ? err.message : \"Failed to export audit logs\";\n\t\t\t\treturn sendInternalError(reply, message);\n\t\t\t}\n\t\t});\n\n\t\t// GET /audit\n\t\tfastify.get(\"/audit\", async (request, reply) => {\n\t\t\tconst filter = buildAuditFilter(request.query);\n\t\t\ttry {\n\t\t\t\tconst entries = await kavach.audit.query(filter);\n\t\t\t\treturn sendOk(reply, entries);\n\t\t\t} catch (err) {\n\t\t\t\tconst message = err instanceof Error ? err.message : \"Failed to query audit logs\";\n\t\t\t\treturn sendInternalError(reply, message);\n\t\t\t}\n\t\t});\n\n\t\t// ── Dashboard API ────────────────────────────────────────────\n\n\t\t// GET /dashboard/stats\n\t\tfastify.get(\"/dashboard/stats\", async (_request, reply) => {\n\t\t\ttry {\n\t\t\t\tconst [agents, recentAudit] = await Promise.all([\n\t\t\t\t\tkavach.agent.list(),\n\t\t\t\t\tkavach.audit.query({\n\t\t\t\t\t\tsince: new Date(Date.now() - 24 * 60 * 60 * 1000),\n\t\t\t\t\t\tlimit: 1000,\n\t\t\t\t\t}),\n\t\t\t\t]);\n\n\t\t\t\tconst ownerIds = new Set(agents.map((a) => a.ownerId));\n\t\t\t\tconst activeAgents = agents.filter((a) => a.status === \"active\");\n\t\t\t\tconst revokedAgents = agents.filter((a) => a.status === \"revoked\");\n\t\t\t\tconst expiredAgents = agents.filter((a) => a.status === \"expired\");\n\n\t\t\t\tconst stats = {\n\t\t\t\t\tagents: {\n\t\t\t\t\t\ttotal: agents.length,\n\t\t\t\t\t\tactive: activeAgents.length,\n\t\t\t\t\t\trevoked: revokedAgents.length,\n\t\t\t\t\t\texpired: expiredAgents.length,\n\t\t\t\t\t},\n\t\t\t\t\tusers: {\n\t\t\t\t\t\ttotal: ownerIds.size,\n\t\t\t\t\t},\n\t\t\t\t\taudit: {\n\t\t\t\t\t\tlast24h: recentAudit.length,\n\t\t\t\t\t\tallowed: recentAudit.filter((e) => e.result === \"allowed\").length,\n\t\t\t\t\t\tdenied: recentAudit.filter((e) => e.result === \"denied\").length,\n\t\t\t\t\t\trateLimited: recentAudit.filter((e) => e.result === \"rate_limited\").length,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t\treturn sendOk(reply, stats);\n\t\t\t} catch (err) {\n\t\t\t\tconst message = err instanceof Error ? err.message : \"Failed to fetch dashboard stats\";\n\t\t\t\treturn sendInternalError(reply, message);\n\t\t\t}\n\t\t});\n\n\t\t// GET /dashboard/agents\n\t\tfastify.get(\"/dashboard/agents\", async (request, reply) => {\n\t\t\tconst q = request.query as Record<string, string | undefined>;\n\t\t\tconst filter: AgentFilter = {};\n\n\t\t\tif (q.userId) filter.userId = q.userId;\n\t\t\tconst statusRaw = q.status;\n\t\t\tif (statusRaw === \"active\" || statusRaw === \"revoked\" || statusRaw === \"expired\") {\n\t\t\t\tfilter.status = statusRaw;\n\t\t\t}\n\t\t\tconst typeRaw = q.type;\n\t\t\tif (typeRaw === \"autonomous\" || typeRaw === \"delegated\" || typeRaw === \"service\") {\n\t\t\t\tfilter.type = typeRaw;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst agents = await kavach.agent.list(filter);\n\t\t\t\treturn sendOk(reply, agents);\n\t\t\t} catch (err) {\n\t\t\t\tconst message = err instanceof Error ? err.message : \"Failed to list agents\";\n\t\t\t\treturn sendInternalError(reply, message);\n\t\t\t}\n\t\t});\n\n\t\t// GET /dashboard/audit\n\t\tfastify.get(\"/dashboard/audit\", async (request, reply) => {\n\t\t\tconst filter = buildAuditFilter(request.query);\n\t\t\ttry {\n\t\t\t\tconst entries = await kavach.audit.query(filter);\n\t\t\t\treturn sendOk(reply, entries);\n\t\t\t} catch (err) {\n\t\t\t\tconst message = err instanceof Error ? err.message : \"Failed to query audit logs\";\n\t\t\t\treturn sendInternalError(reply, message);\n\t\t\t}\n\t\t});\n\n\t\t// ── MCP OAuth 2.1 Endpoints ──────────────────────────────────\n\n\t\t// GET /.well-known/oauth-authorization-server\n\t\tfastify.get(\"/.well-known/oauth-authorization-server\", (_request, reply) => {\n\t\t\tif (!mcp) return sendNotFound(reply, \"MCP module not configured\");\n\t\t\tconst metadata = mcp.getMetadata();\n\t\t\treturn sendMcpOk(reply, metadata);\n\t\t});\n\n\t\t// GET /.well-known/oauth-protected-resource\n\t\tfastify.get(\"/.well-known/oauth-protected-resource\", (_request, reply) => {\n\t\t\tif (!mcp) return sendNotFound(reply, \"MCP module not configured\");\n\t\t\tconst metadata = mcp.getProtectedResourceMetadata();\n\t\t\treturn sendMcpOk(reply, metadata);\n\t\t});\n\n\t\t// POST /mcp/register\n\t\tfastify.post(\"/mcp/register\", async (request, reply) => {\n\t\t\tif (!mcp) return sendNotFound(reply, \"MCP module not configured\");\n\t\t\ttry {\n\t\t\t\tconst result = await mcp.registerClient(\n\t\t\t\t\trequest.body as Parameters<typeof mcp.registerClient>[0],\n\t\t\t\t);\n\t\t\t\tif (!result.success) {\n\t\t\t\t\treturn sendMcpError(reply, \"invalid_client_metadata\", result.error.message, 400);\n\t\t\t\t}\n\t\t\t\treturn sendMcpNoStore(reply, result.data, 201);\n\t\t\t} catch (err) {\n\t\t\t\tconst message = err instanceof Error ? err.message : \"Registration failed\";\n\t\t\t\treturn sendMcpError(reply, \"server_error\", message, 500);\n\t\t\t}\n\t\t});\n\n\t\t// GET /mcp/authorize\n\t\tfastify.get(\"/mcp/authorize\", async (request, reply) => {\n\t\t\tif (!mcp) return sendNotFound(reply, \"MCP module not configured\");\n\t\t\ttry {\n\t\t\t\t// Build a Web API Request from the Fastify request for MCP module compatibility\n\t\t\t\tconst url = `${request.protocol}://${request.hostname}${request.url}`;\n\t\t\t\tconst webRequest = new Request(url, {\n\t\t\t\t\tmethod: \"GET\",\n\t\t\t\t\theaders: request.headers as HeadersInit,\n\t\t\t\t});\n\t\t\t\tconst result = await mcp.authorize(webRequest);\n\t\t\t\tif (!result.success) {\n\t\t\t\t\tif (result.error.code === \"LOGIN_REQUIRED\") {\n\t\t\t\t\t\tconst details = result.error.details as\n\t\t\t\t\t\t\t| { loginPage?: string; returnTo?: string }\n\t\t\t\t\t\t\t| undefined;\n\t\t\t\t\t\tif (details?.loginPage) {\n\t\t\t\t\t\t\tconst loginUrl = new URL(details.loginPage);\n\t\t\t\t\t\t\tif (details.returnTo) {\n\t\t\t\t\t\t\t\tloginUrl.searchParams.set(\"returnTo\", details.returnTo);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn reply.redirect(loginUrl.toString(), 302);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn sendMcpError(reply, result.error.code.toLowerCase(), result.error.message, 400);\n\t\t\t\t}\n\t\t\t\treturn reply.redirect(result.data.redirectUri, 302);\n\t\t\t} catch (err) {\n\t\t\t\tconst message = err instanceof Error ? err.message : \"Authorization failed\";\n\t\t\t\treturn sendMcpError(reply, \"server_error\", message, 500);\n\t\t\t}\n\t\t});\n\n\t\t// ── Plugin Endpoints ─────────────────────────────────────────\n\n\t\tfor (const endpoint of kavach.plugins.getEndpoints()) {\n\t\t\tconst method = endpoint.method.toLowerCase() as \"get\" | \"post\" | \"put\" | \"patch\" | \"delete\";\n\t\t\tfastify[method](endpoint.path, async (request, reply) => {\n\t\t\t\tconst url = `${request.protocol}://${request.hostname}${request.url}`;\n\t\t\t\tconst headers = new Headers(request.headers as Record<string, string>);\n\t\t\t\tconst hasBody = request.method !== \"GET\" && request.method !== \"HEAD\";\n\t\t\t\tconst body =\n\t\t\t\t\thasBody && request.body !== undefined ? JSON.stringify(request.body) : undefined;\n\t\t\t\tconst webReq = new Request(url, { method: request.method, headers, body });\n\n\t\t\t\tconst response = await kavach.plugins.handleRequest(webReq);\n\t\t\t\tif (!response) {\n\t\t\t\t\treturn sendNotFound(reply, \"Plugin endpoint not found\");\n\t\t\t\t}\n\n\t\t\t\treply.status(response.status);\n\t\t\t\tresponse.headers.forEach((value, key) => {\n\t\t\t\t\treply.header(key, value);\n\t\t\t\t});\n\t\t\t\tconst text = await response.text();\n\t\t\t\treturn reply.send(text);\n\t\t\t});\n\t\t}\n\n\t\t// POST /mcp/token\n\t\tfastify.post(\"/mcp/token\", async (request, reply) => {\n\t\t\tif (!mcp) return sendNotFound(reply, \"MCP module not configured\");\n\t\t\ttry {\n\t\t\t\t// Build a Web API Request from the Fastify request for MCP module compatibility\n\t\t\t\tconst url = `${request.protocol}://${request.hostname}${request.url}`;\n\t\t\t\tconst body = JSON.stringify(request.body);\n\t\t\t\tconst webRequest = new Request(url, {\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t...(request.headers as Record<string, string>),\n\t\t\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\t},\n\t\t\t\t\tbody,\n\t\t\t\t});\n\t\t\t\tconst result = await mcp.token(webRequest);\n\t\t\t\tif (!result.success) {\n\t\t\t\t\tconst status = result.error.code === \"INVALID_CLIENT\" ? 401 : 400;\n\t\t\t\t\treturn sendMcpNoStore(\n\t\t\t\t\t\treply,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\terror: result.error.code.toLowerCase(),\n\t\t\t\t\t\t\terror_description: result.error.message,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tstatus,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn sendMcpNoStore(reply, result.data);\n\t\t\t} catch (err) {\n\t\t\t\tconst message = err instanceof Error ? err.message : \"Token exchange failed\";\n\t\t\t\treturn sendMcpNoStore(reply, { error: \"server_error\", error_description: message }, 500);\n\t\t\t}\n\t\t});\n\t};\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kavachos/fastify",
3
- "version": "0.0.2",
3
+ "version": "0.0.4",
4
4
  "description": "Fastify adapter for KavachOS - exposes agent auth as HTTP REST endpoints",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -31,7 +31,7 @@
31
31
  "peerDependencies": {
32
32
  "fastify": ">=4.0.0",
33
33
  "zod": ">=3.0.0",
34
- "kavachos": "0.0.2"
34
+ "kavachos": "0.0.4"
35
35
  },
36
36
  "devDependencies": {
37
37
  "@types/node": "^22.0.0",
@@ -39,7 +39,7 @@
39
39
  "tsup": "^8.4.0",
40
40
  "typescript": "^5.8.0",
41
41
  "zod": "^3.24.0",
42
- "kavachos": "0.0.2"
42
+ "kavachos": "0.0.4"
43
43
  },
44
44
  "scripts": {
45
45
  "build": "tsup",