@kavachos/sveltekit 0.0.2 → 0.0.3

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,54 @@
1
+ import { RequestHandler } from '@sveltejs/kit';
2
+ import { Kavach } from 'kavachos';
3
+ import { McpAuthModule } from 'kavachos/mcp';
4
+
5
+ interface KavachSvelteKitOptions {
6
+ /**
7
+ * The MCP OAuth 2.1 module. When provided, MCP endpoints are enabled.
8
+ */
9
+ mcp?: McpAuthModule;
10
+ /**
11
+ * The URL path prefix before the `[...path]` catch-all segment.
12
+ * Defaults to `/api/kavach`.
13
+ *
14
+ * @example `/api/auth/kavach`
15
+ */
16
+ basePath?: string;
17
+ }
18
+ interface KavachSvelteKitHandlers {
19
+ GET: RequestHandler;
20
+ POST: RequestHandler;
21
+ PATCH: RequestHandler;
22
+ DELETE: RequestHandler;
23
+ OPTIONS: RequestHandler;
24
+ }
25
+ /**
26
+ * Create SvelteKit route handlers for all KavachOS REST API routes.
27
+ *
28
+ * Mount in `src/routes/api/kavach/[...path]/+server.ts`:
29
+ *
30
+ * @example
31
+ * ```typescript
32
+ * import { createKavach } from 'kavachos';
33
+ * import { kavachSvelteKit } from '@kavachos/sveltekit';
34
+ *
35
+ * const kavach = createKavach({ database: { provider: 'sqlite', url: 'kavach.db' } });
36
+ * const handlers = kavachSvelteKit(kavach);
37
+ *
38
+ * export const GET = handlers.GET;
39
+ * export const POST = handlers.POST;
40
+ * export const PATCH = handlers.PATCH;
41
+ * export const DELETE = handlers.DELETE;
42
+ * export const OPTIONS = handlers.OPTIONS;
43
+ * ```
44
+ *
45
+ * With MCP OAuth 2.1:
46
+ * ```typescript
47
+ * import { createMcpModule } from 'kavachos/mcp';
48
+ * const mcp = createMcpModule({ ... });
49
+ * const handlers = kavachSvelteKit(kavach, { mcp });
50
+ * ```
51
+ */
52
+ declare function kavachSvelteKit(kavach: Kavach, options?: KavachSvelteKitOptions): KavachSvelteKitHandlers;
53
+
54
+ export { type KavachSvelteKitHandlers, type KavachSvelteKitOptions, kavachSvelteKit };
package/dist/index.js ADDED
@@ -0,0 +1,570 @@
1
+ import { z } from 'zod';
2
+
3
+ // src/dispatch.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 ok(data, status = 200) {
52
+ return new Response(JSON.stringify({ data }), {
53
+ status,
54
+ headers: { "Content-Type": "application/json" }
55
+ });
56
+ }
57
+ function created(data) {
58
+ return ok(data, 201);
59
+ }
60
+ function errorResponse(code, message, status) {
61
+ return new Response(JSON.stringify({ error: { code, message } }), {
62
+ status,
63
+ headers: { "Content-Type": "application/json" }
64
+ });
65
+ }
66
+ function badRequest(message) {
67
+ return errorResponse("BAD_REQUEST", message, 400);
68
+ }
69
+ function unauthorized(message = "Unauthorized") {
70
+ return errorResponse("UNAUTHORIZED", message, 401);
71
+ }
72
+ function notFound(message = "Not found") {
73
+ return errorResponse("NOT_FOUND", message, 404);
74
+ }
75
+ function methodNotAllowed() {
76
+ return errorResponse("METHOD_NOT_ALLOWED", "Method not allowed", 405);
77
+ }
78
+ function internalError(message = "Internal server error") {
79
+ return errorResponse("INTERNAL_ERROR", message, 500);
80
+ }
81
+ function validationError(issues) {
82
+ const message = issues.map((i) => `${i.path.join(".")}: ${i.message}`).join(", ");
83
+ return badRequest(`Validation failed: ${message}`);
84
+ }
85
+ var MCP_CORS_HEADERS = {
86
+ "Access-Control-Allow-Origin": "*",
87
+ "Access-Control-Allow-Methods": "GET, POST, OPTIONS",
88
+ "Access-Control-Allow-Headers": "Content-Type, Authorization",
89
+ "Access-Control-Max-Age": "86400"
90
+ };
91
+ function mcpOk(data, status = 200) {
92
+ return new Response(JSON.stringify(data), {
93
+ status,
94
+ headers: { "Content-Type": "application/json", ...MCP_CORS_HEADERS }
95
+ });
96
+ }
97
+ function mcpError(code, message, status) {
98
+ return new Response(JSON.stringify({ error: code, error_description: message }), {
99
+ status,
100
+ headers: { "Content-Type": "application/json", ...MCP_CORS_HEADERS }
101
+ });
102
+ }
103
+ function mcpNoStore(data, status = 200) {
104
+ return new Response(JSON.stringify(data), {
105
+ status,
106
+ headers: {
107
+ "Content-Type": "application/json",
108
+ "Cache-Control": "no-store",
109
+ Pragma: "no-cache",
110
+ ...MCP_CORS_HEADERS
111
+ }
112
+ });
113
+ }
114
+ function getSearchParam(url, key) {
115
+ return url.searchParams.get(key);
116
+ }
117
+ async function parseJsonBody(request) {
118
+ try {
119
+ const data = await request.json();
120
+ return { success: true, data };
121
+ } catch {
122
+ return { success: false, response: badRequest("Invalid JSON body") };
123
+ }
124
+ }
125
+ async function handleAgentList(request, kavach) {
126
+ const url = new URL(request.url);
127
+ const userId = getSearchParam(url, "userId");
128
+ const statusRaw = getSearchParam(url, "status");
129
+ const typeRaw = getSearchParam(url, "type");
130
+ const filter = {};
131
+ if (userId) filter.userId = userId;
132
+ if (statusRaw === "active" || statusRaw === "revoked" || statusRaw === "expired") {
133
+ filter.status = statusRaw;
134
+ }
135
+ if (typeRaw === "autonomous" || typeRaw === "delegated" || typeRaw === "service") {
136
+ filter.type = typeRaw;
137
+ }
138
+ try {
139
+ const agents = await kavach.agent.list(filter);
140
+ return ok(agents);
141
+ } catch (err) {
142
+ const message = err instanceof Error ? err.message : "Failed to list agents";
143
+ return internalError(message);
144
+ }
145
+ }
146
+ async function handleAgentCreate(request, kavach) {
147
+ const bodyResult = await parseJsonBody(request);
148
+ if (!bodyResult.success) return bodyResult.response;
149
+ const parsed = CreateAgentSchema.safeParse(bodyResult.data);
150
+ if (!parsed.success) return validationError(parsed.error.issues);
151
+ try {
152
+ const input = {
153
+ ...parsed.data,
154
+ permissions: parsed.data.permissions
155
+ };
156
+ const agent = await kavach.agent.create(input);
157
+ return created(agent);
158
+ } catch (err) {
159
+ const message = err instanceof Error ? err.message : "Failed to create agent";
160
+ return internalError(message);
161
+ }
162
+ }
163
+ async function handleAgentGet(id, kavach) {
164
+ try {
165
+ const agent = await kavach.agent.get(id);
166
+ if (!agent) return notFound(`Agent "${id}" not found`);
167
+ return ok(agent);
168
+ } catch (err) {
169
+ const message = err instanceof Error ? err.message : "Failed to get agent";
170
+ return internalError(message);
171
+ }
172
+ }
173
+ async function handleAgentUpdate(id, request, kavach) {
174
+ const bodyResult = await parseJsonBody(request);
175
+ if (!bodyResult.success) return bodyResult.response;
176
+ const parsed = UpdateAgentSchema.safeParse(bodyResult.data);
177
+ if (!parsed.success) return validationError(parsed.error.issues);
178
+ try {
179
+ const input = {
180
+ ...parsed.data,
181
+ permissions: parsed.data.permissions
182
+ };
183
+ const agent = await kavach.agent.update(id, input);
184
+ return ok(agent);
185
+ } catch (err) {
186
+ const message = err instanceof Error ? err.message : "Failed to update agent";
187
+ if (message.includes("not found")) return notFound(message);
188
+ return internalError(message);
189
+ }
190
+ }
191
+ async function handleAgentRevoke(id, kavach) {
192
+ try {
193
+ await kavach.agent.revoke(id);
194
+ return new Response(null, { status: 204 });
195
+ } catch (err) {
196
+ const message = err instanceof Error ? err.message : "Failed to revoke agent";
197
+ if (message.includes("not found")) return notFound(message);
198
+ return internalError(message);
199
+ }
200
+ }
201
+ async function handleAgentRotate(id, kavach) {
202
+ try {
203
+ const agent = await kavach.agent.rotate(id);
204
+ return ok(agent);
205
+ } catch (err) {
206
+ const message = err instanceof Error ? err.message : "Failed to rotate agent token";
207
+ if (message.includes("not found")) return notFound(message);
208
+ return internalError(message);
209
+ }
210
+ }
211
+ async function handleAuthorize(request, kavach) {
212
+ const bodyResult = await parseJsonBody(request);
213
+ if (!bodyResult.success) return bodyResult.response;
214
+ const parsed = AuthorizeSchema.safeParse(bodyResult.data);
215
+ if (!parsed.success) return validationError(parsed.error.issues);
216
+ try {
217
+ const result = await kavach.authorize(parsed.data.agentId, {
218
+ action: parsed.data.action,
219
+ resource: parsed.data.resource,
220
+ arguments: parsed.data.arguments
221
+ });
222
+ const status = result.allowed ? 200 : 403;
223
+ return new Response(JSON.stringify({ data: result }), {
224
+ status,
225
+ headers: { "Content-Type": "application/json" }
226
+ });
227
+ } catch (err) {
228
+ const message = err instanceof Error ? err.message : "Authorization check failed";
229
+ return internalError(message);
230
+ }
231
+ }
232
+ async function handleAuthorizeByToken(request, kavach) {
233
+ const authHeader = request.headers.get("Authorization");
234
+ if (!authHeader?.startsWith("Bearer ")) {
235
+ return unauthorized("Missing or invalid Authorization header");
236
+ }
237
+ const token = authHeader.slice(7);
238
+ const bodyResult = await parseJsonBody(request);
239
+ if (!bodyResult.success) return bodyResult.response;
240
+ const parsed = AuthorizeByTokenSchema.safeParse(bodyResult.data);
241
+ if (!parsed.success) return validationError(parsed.error.issues);
242
+ try {
243
+ const result = await kavach.authorizeByToken(token, {
244
+ action: parsed.data.action,
245
+ resource: parsed.data.resource,
246
+ arguments: parsed.data.arguments
247
+ });
248
+ const status = result.allowed ? 200 : 403;
249
+ return new Response(JSON.stringify({ data: result }), {
250
+ status,
251
+ headers: { "Content-Type": "application/json" }
252
+ });
253
+ } catch (err) {
254
+ const message = err instanceof Error ? err.message : "Authorization check failed";
255
+ return internalError(message);
256
+ }
257
+ }
258
+ async function handleDelegationCreate(request, kavach) {
259
+ const bodyResult = await parseJsonBody(request);
260
+ if (!bodyResult.success) return bodyResult.response;
261
+ const parsed = DelegateSchema.safeParse(bodyResult.data);
262
+ if (!parsed.success) return validationError(parsed.error.issues);
263
+ try {
264
+ const input = {
265
+ ...parsed.data,
266
+ permissions: parsed.data.permissions
267
+ };
268
+ const chain = await kavach.delegate(input);
269
+ return created(chain);
270
+ } catch (err) {
271
+ const message = err instanceof Error ? err.message : "Failed to create delegation";
272
+ if (message.includes("not found")) return notFound(message);
273
+ if (message.includes("exceeds") || message.includes("depth")) return badRequest(message);
274
+ return internalError(message);
275
+ }
276
+ }
277
+ async function handleDelegationRevoke(id, kavach) {
278
+ try {
279
+ await kavach.delegation.revoke(id);
280
+ return new Response(null, { status: 204 });
281
+ } catch (err) {
282
+ const message = err instanceof Error ? err.message : "Failed to revoke delegation";
283
+ if (message.includes("not found")) return notFound(message);
284
+ return internalError(message);
285
+ }
286
+ }
287
+ async function handleDelegationList(agentId, kavach) {
288
+ try {
289
+ const chains = await kavach.delegation.listChains(agentId);
290
+ return ok(chains);
291
+ } catch (err) {
292
+ const message = err instanceof Error ? err.message : "Failed to list delegation chains";
293
+ return internalError(message);
294
+ }
295
+ }
296
+ function buildAuditFilter(url) {
297
+ const filter = {};
298
+ const agentId = getSearchParam(url, "agentId");
299
+ const userId = getSearchParam(url, "userId");
300
+ const since = getSearchParam(url, "since");
301
+ const until = getSearchParam(url, "until");
302
+ const actions = getSearchParam(url, "actions");
303
+ const resultRaw = getSearchParam(url, "result");
304
+ const limit = getSearchParam(url, "limit");
305
+ const offset = getSearchParam(url, "offset");
306
+ if (agentId) filter.agentId = agentId;
307
+ if (userId) filter.userId = userId;
308
+ if (since) {
309
+ const d = new Date(since);
310
+ if (!Number.isNaN(d.getTime())) filter.since = d;
311
+ }
312
+ if (until) {
313
+ const d = new Date(until);
314
+ if (!Number.isNaN(d.getTime())) filter.until = d;
315
+ }
316
+ if (actions) filter.actions = actions.split(",").map((a) => a.trim());
317
+ if (resultRaw === "allowed" || resultRaw === "denied" || resultRaw === "rate_limited") {
318
+ filter.result = resultRaw;
319
+ }
320
+ if (limit) {
321
+ const n = Number.parseInt(limit, 10);
322
+ if (!Number.isNaN(n) && n > 0) filter.limit = n;
323
+ }
324
+ if (offset) {
325
+ const n = Number.parseInt(offset, 10);
326
+ if (!Number.isNaN(n) && n >= 0) filter.offset = n;
327
+ }
328
+ return filter;
329
+ }
330
+ async function handleAuditQuery(request, kavach) {
331
+ const url = new URL(request.url);
332
+ const filter = buildAuditFilter(url);
333
+ try {
334
+ const entries = await kavach.audit.query(filter);
335
+ return ok(entries);
336
+ } catch (err) {
337
+ const message = err instanceof Error ? err.message : "Failed to query audit logs";
338
+ return internalError(message);
339
+ }
340
+ }
341
+ async function handleAuditExport(request, kavach) {
342
+ const url = new URL(request.url);
343
+ const format = getSearchParam(url, "format") ?? "json";
344
+ if (format !== "json" && format !== "csv") {
345
+ return badRequest('format must be "json" or "csv"');
346
+ }
347
+ const since = getSearchParam(url, "since");
348
+ const until = getSearchParam(url, "until");
349
+ const options = { format };
350
+ if (since) {
351
+ const d = new Date(since);
352
+ if (!Number.isNaN(d.getTime())) options.since = d;
353
+ }
354
+ if (until) {
355
+ const d = new Date(until);
356
+ if (!Number.isNaN(d.getTime())) options.until = d;
357
+ }
358
+ try {
359
+ const exported = await kavach.audit.export(options);
360
+ const contentType = format === "csv" ? "text/csv" : "application/json";
361
+ return new Response(exported, {
362
+ status: 200,
363
+ headers: {
364
+ "Content-Type": contentType,
365
+ "Content-Disposition": `attachment; filename="audit-export.${format}"`
366
+ }
367
+ });
368
+ } catch (err) {
369
+ const message = err instanceof Error ? err.message : "Failed to export audit logs";
370
+ return internalError(message);
371
+ }
372
+ }
373
+ async function handleDashboardStats(kavach) {
374
+ try {
375
+ const [agents, recentAudit] = await Promise.all([
376
+ kavach.agent.list(),
377
+ kavach.audit.query({
378
+ since: new Date(Date.now() - 24 * 60 * 60 * 1e3),
379
+ limit: 1e3
380
+ })
381
+ ]);
382
+ const ownerIds = new Set(agents.map((a) => a.ownerId));
383
+ const activeAgents = agents.filter((a) => a.status === "active");
384
+ const revokedAgents = agents.filter((a) => a.status === "revoked");
385
+ const expiredAgents = agents.filter((a) => a.status === "expired");
386
+ const stats = {
387
+ agents: {
388
+ total: agents.length,
389
+ active: activeAgents.length,
390
+ revoked: revokedAgents.length,
391
+ expired: expiredAgents.length
392
+ },
393
+ users: {
394
+ total: ownerIds.size
395
+ },
396
+ audit: {
397
+ last24h: recentAudit.length,
398
+ allowed: recentAudit.filter((e) => e.result === "allowed").length,
399
+ denied: recentAudit.filter((e) => e.result === "denied").length,
400
+ rateLimited: recentAudit.filter((e) => e.result === "rate_limited").length
401
+ }
402
+ };
403
+ return ok(stats);
404
+ } catch (err) {
405
+ const message = err instanceof Error ? err.message : "Failed to fetch dashboard stats";
406
+ return internalError(message);
407
+ }
408
+ }
409
+ async function dispatch(request, kavach, mcp, basePath) {
410
+ const url = new URL(request.url);
411
+ const raw = url.pathname;
412
+ const relative = raw.startsWith(basePath) ? raw.slice(basePath.length) : raw;
413
+ const pathname = relative.startsWith("/") ? relative : `/${relative}`;
414
+ const method = request.method.toUpperCase();
415
+ if (method === "OPTIONS") {
416
+ if (pathname.startsWith("/mcp/") || pathname.startsWith("/.well-known/")) {
417
+ return new Response(null, { status: 204, headers: MCP_CORS_HEADERS });
418
+ }
419
+ }
420
+ if (pathname === "/.well-known/oauth-authorization-server" && method === "GET") {
421
+ if (!mcp) return notFound("MCP module not configured");
422
+ return mcpOk(mcp.getMetadata());
423
+ }
424
+ if (pathname === "/.well-known/oauth-protected-resource" && method === "GET") {
425
+ if (!mcp) return notFound("MCP module not configured");
426
+ return mcpOk(mcp.getProtectedResourceMetadata());
427
+ }
428
+ if (pathname === "/mcp/register" && method === "POST") {
429
+ if (!mcp) return notFound("MCP module not configured");
430
+ let body;
431
+ try {
432
+ body = await request.json();
433
+ } catch {
434
+ return mcpError("invalid_request", "Invalid JSON body", 400);
435
+ }
436
+ try {
437
+ const result = await mcp.registerClient(body);
438
+ if (!result.success) {
439
+ return mcpError("invalid_client_metadata", result.error.message, 400);
440
+ }
441
+ return mcpNoStore(result.data, 201);
442
+ } catch (err) {
443
+ const message = err instanceof Error ? err.message : "Registration failed";
444
+ return mcpError("server_error", message, 500);
445
+ }
446
+ }
447
+ if (pathname === "/mcp/authorize" && method === "GET") {
448
+ if (!mcp) return notFound("MCP module not configured");
449
+ try {
450
+ const result = await mcp.authorize(request);
451
+ if (!result.success) {
452
+ if (result.error.code === "LOGIN_REQUIRED") {
453
+ const details = result.error.details;
454
+ if (details?.loginPage) {
455
+ const loginUrl = new URL(details.loginPage);
456
+ if (details.returnTo) {
457
+ loginUrl.searchParams.set("returnTo", details.returnTo);
458
+ }
459
+ return Response.redirect(loginUrl.toString(), 302);
460
+ }
461
+ }
462
+ return mcpError(result.error.code.toLowerCase(), result.error.message, 400);
463
+ }
464
+ return Response.redirect(result.data.redirectUri, 302);
465
+ } catch (err) {
466
+ const message = err instanceof Error ? err.message : "Authorization failed";
467
+ return mcpError("server_error", message, 500);
468
+ }
469
+ }
470
+ if (pathname === "/mcp/token" && method === "POST") {
471
+ if (!mcp) return notFound("MCP module not configured");
472
+ try {
473
+ const result = await mcp.token(request);
474
+ if (!result.success) {
475
+ const status = result.error.code === "INVALID_CLIENT" ? 401 : 400;
476
+ return mcpNoStore(
477
+ {
478
+ error: result.error.code.toLowerCase(),
479
+ error_description: result.error.message
480
+ },
481
+ status
482
+ );
483
+ }
484
+ return mcpNoStore(result.data);
485
+ } catch (err) {
486
+ const message = err instanceof Error ? err.message : "Token exchange failed";
487
+ return mcpNoStore({ error: "server_error", error_description: message }, 500);
488
+ }
489
+ }
490
+ if (pathname === "/agents") {
491
+ if (method === "GET") return handleAgentList(request, kavach);
492
+ if (method === "POST") return handleAgentCreate(request, kavach);
493
+ return methodNotAllowed();
494
+ }
495
+ const rotateMatch = /^\/agents\/([^/]+)\/rotate$/.exec(pathname);
496
+ if (rotateMatch) {
497
+ const id = rotateMatch[1];
498
+ if (!id) return badRequest("Missing agent id");
499
+ if (method === "POST") return handleAgentRotate(id, kavach);
500
+ return methodNotAllowed();
501
+ }
502
+ const agentMatch = /^\/agents\/([^/]+)$/.exec(pathname);
503
+ if (agentMatch) {
504
+ const id = agentMatch[1];
505
+ if (!id) return badRequest("Missing agent id");
506
+ if (method === "GET") return handleAgentGet(id, kavach);
507
+ if (method === "PATCH") return handleAgentUpdate(id, request, kavach);
508
+ if (method === "DELETE") return handleAgentRevoke(id, kavach);
509
+ return methodNotAllowed();
510
+ }
511
+ if (pathname === "/authorize") {
512
+ if (method === "POST") return handleAuthorize(request, kavach);
513
+ return methodNotAllowed();
514
+ }
515
+ if (pathname === "/authorize/token") {
516
+ if (method === "POST") return handleAuthorizeByToken(request, kavach);
517
+ return methodNotAllowed();
518
+ }
519
+ if (pathname === "/delegations") {
520
+ if (method === "POST") return handleDelegationCreate(request, kavach);
521
+ return methodNotAllowed();
522
+ }
523
+ const delegationMatch = /^\/delegations\/([^/]+)$/.exec(pathname);
524
+ if (delegationMatch) {
525
+ const id = delegationMatch[1];
526
+ if (!id) return badRequest("Missing delegation id");
527
+ if (method === "DELETE") return handleDelegationRevoke(id, kavach);
528
+ if (method === "GET") return handleDelegationList(id, kavach);
529
+ return methodNotAllowed();
530
+ }
531
+ if (pathname === "/audit/export") {
532
+ if (method === "GET") return handleAuditExport(request, kavach);
533
+ return methodNotAllowed();
534
+ }
535
+ if (pathname === "/audit") {
536
+ if (method === "GET") return handleAuditQuery(request, kavach);
537
+ return methodNotAllowed();
538
+ }
539
+ if (pathname === "/dashboard/stats") {
540
+ if (method === "GET") return handleDashboardStats(kavach);
541
+ return methodNotAllowed();
542
+ }
543
+ if (pathname === "/dashboard/agents") {
544
+ if (method === "GET") return handleAgentList(request, kavach);
545
+ return methodNotAllowed();
546
+ }
547
+ if (pathname === "/dashboard/audit") {
548
+ if (method === "GET") return handleAuditQuery(request, kavach);
549
+ return methodNotAllowed();
550
+ }
551
+ return notFound("Route not found");
552
+ }
553
+
554
+ // src/adapter.ts
555
+ function kavachSvelteKit(kavach, options) {
556
+ const mcp = options?.mcp;
557
+ const basePath = options?.basePath ?? "/api/kavach";
558
+ const handler = ({ request }) => dispatch(request, kavach, mcp, basePath);
559
+ return {
560
+ GET: handler,
561
+ POST: handler,
562
+ PATCH: handler,
563
+ DELETE: handler,
564
+ OPTIONS: handler
565
+ };
566
+ }
567
+
568
+ export { kavachSvelteKit };
569
+ //# sourceMappingURL=index.js.map
570
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/dispatch.ts","../src/adapter.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import 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 ok<T>(data: T, status = 200): Response {\n\treturn new Response(JSON.stringify({ data }), {\n\t\tstatus,\n\t\theaders: { \"Content-Type\": \"application/json\" },\n\t});\n}\n\nfunction created<T>(data: T): Response {\n\treturn ok(data, 201);\n}\n\nfunction errorResponse(code: string, message: string, status: number): Response {\n\treturn new Response(JSON.stringify({ error: { code, message } }), {\n\t\tstatus,\n\t\theaders: { \"Content-Type\": \"application/json\" },\n\t});\n}\n\nfunction badRequest(message: string): Response {\n\treturn errorResponse(\"BAD_REQUEST\", message, 400);\n}\n\nfunction unauthorized(message = \"Unauthorized\"): Response {\n\treturn errorResponse(\"UNAUTHORIZED\", message, 401);\n}\n\nfunction notFound(message = \"Not found\"): Response {\n\treturn errorResponse(\"NOT_FOUND\", message, 404);\n}\n\nfunction methodNotAllowed(): Response {\n\treturn errorResponse(\"METHOD_NOT_ALLOWED\", \"Method not allowed\", 405);\n}\n\nfunction internalError(message = \"Internal server error\"): Response {\n\treturn errorResponse(\"INTERNAL_ERROR\", message, 500);\n}\n\nfunction validationError(issues: z.ZodIssue[]): Response {\n\tconst message = issues.map((i) => `${i.path.join(\".\")}: ${i.message}`).join(\", \");\n\treturn badRequest(`Validation failed: ${message}`);\n}\n\n// ─── MCP CORS Headers ────────────────────────────────────────────────────────\n\nconst MCP_CORS_HEADERS = {\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 mcpOk<T>(data: T, status = 200): Response {\n\treturn new Response(JSON.stringify(data), {\n\t\tstatus,\n\t\theaders: { \"Content-Type\": \"application/json\", ...MCP_CORS_HEADERS },\n\t});\n}\n\nfunction mcpError(code: string, message: string, status: number): Response {\n\treturn new Response(JSON.stringify({ error: code, error_description: message }), {\n\t\tstatus,\n\t\theaders: { \"Content-Type\": \"application/json\", ...MCP_CORS_HEADERS },\n\t});\n}\n\nfunction mcpNoStore<T>(data: T, status = 200): Response {\n\treturn new Response(JSON.stringify(data), {\n\t\tstatus,\n\t\theaders: {\n\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\"Cache-Control\": \"no-store\",\n\t\t\tPragma: \"no-cache\",\n\t\t\t...MCP_CORS_HEADERS,\n\t\t},\n\t});\n}\n\n// ─── URL Parsing Helpers ─────────────────────────────────────────────────────\n\nfunction getSearchParam(url: URL, key: string): string | null {\n\treturn url.searchParams.get(key);\n}\n\nasync function parseJsonBody(\n\trequest: Request,\n): Promise<{ success: true; data: unknown } | { success: false; response: Response }> {\n\ttry {\n\t\tconst data = (await request.json()) as unknown;\n\t\treturn { success: true, data };\n\t} catch {\n\t\treturn { success: false, response: badRequest(\"Invalid JSON body\") };\n\t}\n}\n\n// ─── Route Handlers ──────────────────────────────────────────────────────────\n\nasync function handleAgentList(request: Request, kavach: Kavach): Promise<Response> {\n\tconst url = new URL(request.url);\n\tconst userId = getSearchParam(url, \"userId\");\n\tconst statusRaw = getSearchParam(url, \"status\");\n\tconst typeRaw = getSearchParam(url, \"type\");\n\n\tconst filter: AgentFilter = {};\n\tif (userId) filter.userId = userId;\n\tif (statusRaw === \"active\" || statusRaw === \"revoked\" || statusRaw === \"expired\") {\n\t\tfilter.status = statusRaw;\n\t}\n\tif (typeRaw === \"autonomous\" || typeRaw === \"delegated\" || typeRaw === \"service\") {\n\t\tfilter.type = typeRaw;\n\t}\n\n\ttry {\n\t\tconst agents = await kavach.agent.list(filter);\n\t\treturn ok(agents);\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : \"Failed to list agents\";\n\t\treturn internalError(message);\n\t}\n}\n\nasync function handleAgentCreate(request: Request, kavach: Kavach): Promise<Response> {\n\tconst bodyResult = await parseJsonBody(request);\n\tif (!bodyResult.success) return bodyResult.response;\n\n\tconst parsed = CreateAgentSchema.safeParse(bodyResult.data);\n\tif (!parsed.success) return validationError(parsed.error.issues);\n\n\ttry {\n\t\tconst input: CreateAgentInput = {\n\t\t\t...parsed.data,\n\t\t\tpermissions: parsed.data.permissions as Permission[],\n\t\t};\n\t\tconst agent = await kavach.agent.create(input);\n\t\treturn created(agent);\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : \"Failed to create agent\";\n\t\treturn internalError(message);\n\t}\n}\n\nasync function handleAgentGet(id: string, kavach: Kavach): Promise<Response> {\n\ttry {\n\t\tconst agent = await kavach.agent.get(id);\n\t\tif (!agent) return notFound(`Agent \"${id}\" not found`);\n\t\treturn ok(agent);\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : \"Failed to get agent\";\n\t\treturn internalError(message);\n\t}\n}\n\nasync function handleAgentUpdate(id: string, request: Request, kavach: Kavach): Promise<Response> {\n\tconst bodyResult = await parseJsonBody(request);\n\tif (!bodyResult.success) return bodyResult.response;\n\n\tconst parsed = UpdateAgentSchema.safeParse(bodyResult.data);\n\tif (!parsed.success) return validationError(parsed.error.issues);\n\n\ttry {\n\t\tconst input: UpdateAgentInput = {\n\t\t\t...parsed.data,\n\t\t\tpermissions: parsed.data.permissions as Permission[] | undefined,\n\t\t};\n\t\tconst agent = await kavach.agent.update(id, input);\n\t\treturn ok(agent);\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : \"Failed to update agent\";\n\t\tif (message.includes(\"not found\")) return notFound(message);\n\t\treturn internalError(message);\n\t}\n}\n\nasync function handleAgentRevoke(id: string, kavach: Kavach): Promise<Response> {\n\ttry {\n\t\tawait kavach.agent.revoke(id);\n\t\treturn new Response(null, { status: 204 });\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : \"Failed to revoke agent\";\n\t\tif (message.includes(\"not found\")) return notFound(message);\n\t\treturn internalError(message);\n\t}\n}\n\nasync function handleAgentRotate(id: string, kavach: Kavach): Promise<Response> {\n\ttry {\n\t\tconst agent = await kavach.agent.rotate(id);\n\t\treturn ok(agent);\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : \"Failed to rotate agent token\";\n\t\tif (message.includes(\"not found\")) return notFound(message);\n\t\treturn internalError(message);\n\t}\n}\n\nasync function handleAuthorize(request: Request, kavach: Kavach): Promise<Response> {\n\tconst bodyResult = await parseJsonBody(request);\n\tif (!bodyResult.success) return bodyResult.response;\n\n\tconst parsed = AuthorizeSchema.safeParse(bodyResult.data);\n\tif (!parsed.success) return validationError(parsed.error.issues);\n\n\ttry {\n\t\tconst result = await kavach.authorize(parsed.data.agentId, {\n\t\t\taction: parsed.data.action,\n\t\t\tresource: parsed.data.resource,\n\t\t\targuments: parsed.data.arguments,\n\t\t});\n\t\tconst status = result.allowed ? 200 : 403;\n\t\treturn new Response(JSON.stringify({ data: result }), {\n\t\t\tstatus,\n\t\t\theaders: { \"Content-Type\": \"application/json\" },\n\t\t});\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : \"Authorization check failed\";\n\t\treturn internalError(message);\n\t}\n}\n\nasync function handleAuthorizeByToken(request: Request, kavach: Kavach): Promise<Response> {\n\tconst authHeader = request.headers.get(\"Authorization\");\n\tif (!authHeader?.startsWith(\"Bearer \")) {\n\t\treturn unauthorized(\"Missing or invalid Authorization header\");\n\t}\n\tconst token = authHeader.slice(7);\n\n\tconst bodyResult = await parseJsonBody(request);\n\tif (!bodyResult.success) return bodyResult.response;\n\n\tconst parsed = AuthorizeByTokenSchema.safeParse(bodyResult.data);\n\tif (!parsed.success) return validationError(parsed.error.issues);\n\n\ttry {\n\t\tconst result = await kavach.authorizeByToken(token, {\n\t\t\taction: parsed.data.action,\n\t\t\tresource: parsed.data.resource,\n\t\t\targuments: parsed.data.arguments,\n\t\t});\n\t\tconst status = result.allowed ? 200 : 403;\n\t\treturn new Response(JSON.stringify({ data: result }), {\n\t\t\tstatus,\n\t\t\theaders: { \"Content-Type\": \"application/json\" },\n\t\t});\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : \"Authorization check failed\";\n\t\treturn internalError(message);\n\t}\n}\n\nasync function handleDelegationCreate(request: Request, kavach: Kavach): Promise<Response> {\n\tconst bodyResult = await parseJsonBody(request);\n\tif (!bodyResult.success) return bodyResult.response;\n\n\tconst parsed = DelegateSchema.safeParse(bodyResult.data);\n\tif (!parsed.success) return validationError(parsed.error.issues);\n\n\ttry {\n\t\tconst input: DelegateInput = {\n\t\t\t...parsed.data,\n\t\t\tpermissions: parsed.data.permissions as Permission[],\n\t\t};\n\t\tconst chain = await kavach.delegate(input);\n\t\treturn created(chain);\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : \"Failed to create delegation\";\n\t\tif (message.includes(\"not found\")) return notFound(message);\n\t\tif (message.includes(\"exceeds\") || message.includes(\"depth\")) return badRequest(message);\n\t\treturn internalError(message);\n\t}\n}\n\nasync function handleDelegationRevoke(id: string, kavach: Kavach): Promise<Response> {\n\ttry {\n\t\tawait kavach.delegation.revoke(id);\n\t\treturn new Response(null, { status: 204 });\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : \"Failed to revoke delegation\";\n\t\tif (message.includes(\"not found\")) return notFound(message);\n\t\treturn internalError(message);\n\t}\n}\n\nasync function handleDelegationList(agentId: string, kavach: Kavach): Promise<Response> {\n\ttry {\n\t\tconst chains = await kavach.delegation.listChains(agentId);\n\t\treturn ok(chains);\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : \"Failed to list delegation chains\";\n\t\treturn internalError(message);\n\t}\n}\n\nfunction buildAuditFilter(url: URL): AuditFilter {\n\tconst filter: AuditFilter = {};\n\n\tconst agentId = getSearchParam(url, \"agentId\");\n\tconst userId = getSearchParam(url, \"userId\");\n\tconst since = getSearchParam(url, \"since\");\n\tconst until = getSearchParam(url, \"until\");\n\tconst actions = getSearchParam(url, \"actions\");\n\tconst resultRaw = getSearchParam(url, \"result\");\n\tconst limit = getSearchParam(url, \"limit\");\n\tconst offset = getSearchParam(url, \"offset\");\n\n\tif (agentId) filter.agentId = agentId;\n\tif (userId) filter.userId = userId;\n\tif (since) {\n\t\tconst d = new Date(since);\n\t\tif (!Number.isNaN(d.getTime())) filter.since = d;\n\t}\n\tif (until) {\n\t\tconst d = new Date(until);\n\t\tif (!Number.isNaN(d.getTime())) filter.until = d;\n\t}\n\tif (actions) filter.actions = actions.split(\",\").map((a) => a.trim());\n\tif (resultRaw === \"allowed\" || resultRaw === \"denied\" || resultRaw === \"rate_limited\") {\n\t\tfilter.result = resultRaw;\n\t}\n\tif (limit) {\n\t\tconst n = Number.parseInt(limit, 10);\n\t\tif (!Number.isNaN(n) && n > 0) filter.limit = n;\n\t}\n\tif (offset) {\n\t\tconst n = Number.parseInt(offset, 10);\n\t\tif (!Number.isNaN(n) && n >= 0) filter.offset = n;\n\t}\n\n\treturn filter;\n}\n\nasync function handleAuditQuery(request: Request, kavach: Kavach): Promise<Response> {\n\tconst url = new URL(request.url);\n\tconst filter = buildAuditFilter(url);\n\n\ttry {\n\t\tconst entries = await kavach.audit.query(filter);\n\t\treturn ok(entries);\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : \"Failed to query audit logs\";\n\t\treturn internalError(message);\n\t}\n}\n\nasync function handleAuditExport(request: Request, kavach: Kavach): Promise<Response> {\n\tconst url = new URL(request.url);\n\tconst format = getSearchParam(url, \"format\") ?? \"json\";\n\tif (format !== \"json\" && format !== \"csv\") {\n\t\treturn badRequest('format must be \"json\" or \"csv\"');\n\t}\n\n\tconst since = getSearchParam(url, \"since\");\n\tconst until = getSearchParam(url, \"until\");\n\n\tconst options: { format: \"json\" | \"csv\"; since?: Date; until?: Date } = { format };\n\tif (since) {\n\t\tconst d = new Date(since);\n\t\tif (!Number.isNaN(d.getTime())) options.since = d;\n\t}\n\tif (until) {\n\t\tconst d = new Date(until);\n\t\tif (!Number.isNaN(d.getTime())) options.until = d;\n\t}\n\n\ttry {\n\t\tconst exported = await kavach.audit.export(options);\n\t\tconst contentType = format === \"csv\" ? \"text/csv\" : \"application/json\";\n\t\treturn new Response(exported, {\n\t\t\tstatus: 200,\n\t\t\theaders: {\n\t\t\t\t\"Content-Type\": contentType,\n\t\t\t\t\"Content-Disposition\": `attachment; filename=\"audit-export.${format}\"`,\n\t\t\t},\n\t\t});\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : \"Failed to export audit logs\";\n\t\treturn internalError(message);\n\t}\n}\n\nasync function handleDashboardStats(kavach: Kavach): Promise<Response> {\n\ttry {\n\t\tconst [agents, recentAudit] = await Promise.all([\n\t\t\tkavach.agent.list(),\n\t\t\tkavach.audit.query({\n\t\t\t\tsince: new Date(Date.now() - 24 * 60 * 60 * 1000),\n\t\t\t\tlimit: 1000,\n\t\t\t}),\n\t\t]);\n\n\t\tconst ownerIds = new Set(agents.map((a) => a.ownerId));\n\t\tconst activeAgents = agents.filter((a) => a.status === \"active\");\n\t\tconst revokedAgents = agents.filter((a) => a.status === \"revoked\");\n\t\tconst expiredAgents = agents.filter((a) => a.status === \"expired\");\n\n\t\tconst stats = {\n\t\t\tagents: {\n\t\t\t\ttotal: agents.length,\n\t\t\t\tactive: activeAgents.length,\n\t\t\t\trevoked: revokedAgents.length,\n\t\t\t\texpired: expiredAgents.length,\n\t\t\t},\n\t\t\tusers: {\n\t\t\t\ttotal: ownerIds.size,\n\t\t\t},\n\t\t\taudit: {\n\t\t\t\tlast24h: recentAudit.length,\n\t\t\t\tallowed: recentAudit.filter((e) => e.result === \"allowed\").length,\n\t\t\t\tdenied: recentAudit.filter((e) => e.result === \"denied\").length,\n\t\t\t\trateLimited: recentAudit.filter((e) => e.result === \"rate_limited\").length,\n\t\t\t},\n\t\t};\n\t\treturn ok(stats);\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : \"Failed to fetch dashboard stats\";\n\t\treturn internalError(message);\n\t}\n}\n\n// ─── Route Dispatcher ────────────────────────────────────────────────────────\n\n/**\n * Dispatches an incoming Web API Request to the correct KavachOS handler based\n * on the request's pathname (relative to the catch-all segment base).\n *\n * The `basePath` is the URL prefix before the catch-all segment, e.g.\n * `/api/kavach`. Segments after that prefix are used to match routes.\n */\nexport async function dispatch(\n\trequest: Request,\n\tkavach: Kavach,\n\tmcp: McpAuthModule | undefined,\n\tbasePath: string,\n): Promise<Response> {\n\tconst url = new URL(request.url);\n\tconst raw = url.pathname;\n\tconst relative = raw.startsWith(basePath) ? raw.slice(basePath.length) : raw;\n\tconst pathname = relative.startsWith(\"/\") ? relative : `/${relative}`;\n\tconst method = request.method.toUpperCase();\n\n\t// MCP OPTIONS preflight\n\tif (method === \"OPTIONS\") {\n\t\tif (pathname.startsWith(\"/mcp/\") || pathname.startsWith(\"/.well-known/\")) {\n\t\t\treturn new Response(null, { status: 204, headers: MCP_CORS_HEADERS });\n\t\t}\n\t}\n\n\t// ── MCP / well-known ────────────────────────────────────────────\n\n\tif (pathname === \"/.well-known/oauth-authorization-server\" && method === \"GET\") {\n\t\tif (!mcp) return notFound(\"MCP module not configured\");\n\t\treturn mcpOk(mcp.getMetadata());\n\t}\n\n\tif (pathname === \"/.well-known/oauth-protected-resource\" && method === \"GET\") {\n\t\tif (!mcp) return notFound(\"MCP module not configured\");\n\t\treturn mcpOk(mcp.getProtectedResourceMetadata());\n\t}\n\n\tif (pathname === \"/mcp/register\" && method === \"POST\") {\n\t\tif (!mcp) return notFound(\"MCP module not configured\");\n\t\tlet body: unknown;\n\t\ttry {\n\t\t\tbody = (await request.json()) as unknown;\n\t\t} catch {\n\t\t\treturn mcpError(\"invalid_request\", \"Invalid JSON body\", 400);\n\t\t}\n\t\ttry {\n\t\t\tconst result = await mcp.registerClient(body as Parameters<typeof mcp.registerClient>[0]);\n\t\t\tif (!result.success) {\n\t\t\t\treturn mcpError(\"invalid_client_metadata\", result.error.message, 400);\n\t\t\t}\n\t\t\treturn mcpNoStore(result.data, 201);\n\t\t} catch (err) {\n\t\t\tconst message = err instanceof Error ? err.message : \"Registration failed\";\n\t\t\treturn mcpError(\"server_error\", message, 500);\n\t\t}\n\t}\n\n\tif (pathname === \"/mcp/authorize\" && method === \"GET\") {\n\t\tif (!mcp) return notFound(\"MCP module not configured\");\n\t\ttry {\n\t\t\tconst result = await mcp.authorize(request);\n\t\t\tif (!result.success) {\n\t\t\t\tif (result.error.code === \"LOGIN_REQUIRED\") {\n\t\t\t\t\tconst details = result.error.details as\n\t\t\t\t\t\t| { loginPage?: string; returnTo?: string }\n\t\t\t\t\t\t| undefined;\n\t\t\t\t\tif (details?.loginPage) {\n\t\t\t\t\t\tconst loginUrl = new URL(details.loginPage);\n\t\t\t\t\t\tif (details.returnTo) {\n\t\t\t\t\t\t\tloginUrl.searchParams.set(\"returnTo\", details.returnTo);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn Response.redirect(loginUrl.toString(), 302);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn mcpError(result.error.code.toLowerCase(), result.error.message, 400);\n\t\t\t}\n\t\t\treturn Response.redirect(result.data.redirectUri, 302);\n\t\t} catch (err) {\n\t\t\tconst message = err instanceof Error ? err.message : \"Authorization failed\";\n\t\t\treturn mcpError(\"server_error\", message, 500);\n\t\t}\n\t}\n\n\tif (pathname === \"/mcp/token\" && method === \"POST\") {\n\t\tif (!mcp) return notFound(\"MCP module not configured\");\n\t\ttry {\n\t\t\tconst result = await mcp.token(request);\n\t\t\tif (!result.success) {\n\t\t\t\tconst status = result.error.code === \"INVALID_CLIENT\" ? 401 : 400;\n\t\t\t\treturn mcpNoStore(\n\t\t\t\t\t{\n\t\t\t\t\t\terror: result.error.code.toLowerCase(),\n\t\t\t\t\t\terror_description: result.error.message,\n\t\t\t\t\t},\n\t\t\t\t\tstatus,\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn mcpNoStore(result.data);\n\t\t} catch (err) {\n\t\t\tconst message = err instanceof Error ? err.message : \"Token exchange failed\";\n\t\t\treturn mcpNoStore({ error: \"server_error\", error_description: message }, 500);\n\t\t}\n\t}\n\n\t// ── Agents ──────────────────────────────────────────────────────\n\n\tif (pathname === \"/agents\") {\n\t\tif (method === \"GET\") return handleAgentList(request, kavach);\n\t\tif (method === \"POST\") return handleAgentCreate(request, kavach);\n\t\treturn methodNotAllowed();\n\t}\n\n\t// /agents/:id/rotate\n\tconst rotateMatch = /^\\/agents\\/([^/]+)\\/rotate$/.exec(pathname);\n\tif (rotateMatch) {\n\t\tconst id = rotateMatch[1];\n\t\tif (!id) return badRequest(\"Missing agent id\");\n\t\tif (method === \"POST\") return handleAgentRotate(id, kavach);\n\t\treturn methodNotAllowed();\n\t}\n\n\t// /agents/:id\n\tconst agentMatch = /^\\/agents\\/([^/]+)$/.exec(pathname);\n\tif (agentMatch) {\n\t\tconst id = agentMatch[1];\n\t\tif (!id) return badRequest(\"Missing agent id\");\n\t\tif (method === \"GET\") return handleAgentGet(id, kavach);\n\t\tif (method === \"PATCH\") return handleAgentUpdate(id, request, kavach);\n\t\tif (method === \"DELETE\") return handleAgentRevoke(id, kavach);\n\t\treturn methodNotAllowed();\n\t}\n\n\t// ── Authorization ───────────────────────────────────────────────\n\n\tif (pathname === \"/authorize\") {\n\t\tif (method === \"POST\") return handleAuthorize(request, kavach);\n\t\treturn methodNotAllowed();\n\t}\n\n\tif (pathname === \"/authorize/token\") {\n\t\tif (method === \"POST\") return handleAuthorizeByToken(request, kavach);\n\t\treturn methodNotAllowed();\n\t}\n\n\t// ── Delegations ─────────────────────────────────────────────────\n\n\tif (pathname === \"/delegations\") {\n\t\tif (method === \"POST\") return handleDelegationCreate(request, kavach);\n\t\treturn methodNotAllowed();\n\t}\n\n\t// /delegations/:id\n\tconst delegationMatch = /^\\/delegations\\/([^/]+)$/.exec(pathname);\n\tif (delegationMatch) {\n\t\tconst id = delegationMatch[1];\n\t\tif (!id) return badRequest(\"Missing delegation id\");\n\t\tif (method === \"DELETE\") return handleDelegationRevoke(id, kavach);\n\t\tif (method === \"GET\") return handleDelegationList(id, kavach);\n\t\treturn methodNotAllowed();\n\t}\n\n\t// ── Audit ───────────────────────────────────────────────────────\n\n\tif (pathname === \"/audit/export\") {\n\t\tif (method === \"GET\") return handleAuditExport(request, kavach);\n\t\treturn methodNotAllowed();\n\t}\n\n\tif (pathname === \"/audit\") {\n\t\tif (method === \"GET\") return handleAuditQuery(request, kavach);\n\t\treturn methodNotAllowed();\n\t}\n\n\t// ── Dashboard ───────────────────────────────────────────────────\n\n\tif (pathname === \"/dashboard/stats\") {\n\t\tif (method === \"GET\") return handleDashboardStats(kavach);\n\t\treturn methodNotAllowed();\n\t}\n\n\tif (pathname === \"/dashboard/agents\") {\n\t\tif (method === \"GET\") return handleAgentList(request, kavach);\n\t\treturn methodNotAllowed();\n\t}\n\n\tif (pathname === \"/dashboard/audit\") {\n\t\tif (method === \"GET\") return handleAuditQuery(request, kavach);\n\t\treturn methodNotAllowed();\n\t}\n\n\treturn notFound(\"Route not found\");\n}\n","import type { RequestHandler } from \"@sveltejs/kit\";\nimport type { Kavach } from \"kavachos\";\nimport type { McpAuthModule } from \"kavachos/mcp\";\nimport { dispatch } from \"./dispatch.js\";\n\nexport interface KavachSvelteKitOptions {\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 * The URL path prefix before the `[...path]` catch-all segment.\n\t * Defaults to `/api/kavach`.\n\t *\n\t * @example `/api/auth/kavach`\n\t */\n\tbasePath?: string;\n}\n\nexport interface KavachSvelteKitHandlers {\n\tGET: RequestHandler;\n\tPOST: RequestHandler;\n\tPATCH: RequestHandler;\n\tDELETE: RequestHandler;\n\tOPTIONS: RequestHandler;\n}\n\n/**\n * Create SvelteKit route handlers for all KavachOS REST API routes.\n *\n * Mount in `src/routes/api/kavach/[...path]/+server.ts`:\n *\n * @example\n * ```typescript\n * import { createKavach } from 'kavachos';\n * import { kavachSvelteKit } from '@kavachos/sveltekit';\n *\n * const kavach = createKavach({ database: { provider: 'sqlite', url: 'kavach.db' } });\n * const handlers = kavachSvelteKit(kavach);\n *\n * export const GET = handlers.GET;\n * export const POST = handlers.POST;\n * export const PATCH = handlers.PATCH;\n * export const DELETE = handlers.DELETE;\n * export const OPTIONS = handlers.OPTIONS;\n * ```\n *\n * With MCP OAuth 2.1:\n * ```typescript\n * import { createMcpModule } from 'kavachos/mcp';\n * const mcp = createMcpModule({ ... });\n * const handlers = kavachSvelteKit(kavach, { mcp });\n * ```\n */\nexport function kavachSvelteKit(\n\tkavach: Kavach,\n\toptions?: KavachSvelteKitOptions,\n): KavachSvelteKitHandlers {\n\tconst mcp = options?.mcp;\n\tconst basePath = options?.basePath ?? \"/api/kavach\";\n\n\t// SvelteKit RequestHandler receives an event whose `request` property is a\n\t// standard Web API Request, so we can pass it directly to dispatch.\n\tconst handler: RequestHandler = ({ request }) => dispatch(request, kavach, mcp, basePath);\n\n\treturn {\n\t\tGET: handler,\n\t\tPOST: handler,\n\t\tPATCH: handler,\n\t\tDELETE: handler,\n\t\tOPTIONS: handler,\n\t};\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kavachos/sveltekit",
3
- "version": "0.0.2",
3
+ "version": "0.0.3",
4
4
  "description": "SvelteKit adapter for KavachOS - exposes agent auth as HTTP REST endpoints",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -31,14 +31,14 @@
31
31
  "peerDependencies": {
32
32
  "@sveltejs/kit": ">=2.0.0",
33
33
  "zod": ">=3.0.0",
34
- "kavachos": "0.0.2"
34
+ "kavachos": "0.0.3"
35
35
  },
36
36
  "devDependencies": {
37
37
  "@sveltejs/kit": "^2.16.0",
38
38
  "tsup": "^8.4.0",
39
39
  "typescript": "^5.8.0",
40
40
  "zod": "^3.24.0",
41
- "kavachos": "0.0.2"
41
+ "kavachos": "0.0.3"
42
42
  },
43
43
  "scripts": {
44
44
  "build": "tsup",