@kavachos/nuxt 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.
- package/dist/index.d.ts +41 -0
- package/dist/index.js +593 -0
- package/dist/index.js.map +1 -0
- package/package.json +3 -3
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { EventHandler } from 'h3';
|
|
2
|
+
import { Kavach } from 'kavachos';
|
|
3
|
+
import { McpAuthModule } from 'kavachos/mcp';
|
|
4
|
+
|
|
5
|
+
interface KavachNuxtOptions {
|
|
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 catch-all segment.
|
|
12
|
+
* Defaults to `/api/kavach`.
|
|
13
|
+
*
|
|
14
|
+
* @example `/api/auth/kavach`
|
|
15
|
+
*/
|
|
16
|
+
basePath?: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Create a Nuxt/H3 event handler for all KavachOS REST API routes.
|
|
20
|
+
*
|
|
21
|
+
* Mount in `server/api/kavach/[...].ts`:
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```typescript
|
|
25
|
+
* import { createKavach } from 'kavachos';
|
|
26
|
+
* import { kavachNuxt } from '@kavachos/nuxt';
|
|
27
|
+
*
|
|
28
|
+
* const kavach = createKavach({ database: { provider: 'sqlite', url: 'kavach.db' } });
|
|
29
|
+
* export default kavachNuxt(kavach);
|
|
30
|
+
* ```
|
|
31
|
+
*
|
|
32
|
+
* With MCP OAuth 2.1:
|
|
33
|
+
* ```typescript
|
|
34
|
+
* import { createMcpModule } from 'kavachos/mcp';
|
|
35
|
+
* const mcp = createMcpModule({ ... });
|
|
36
|
+
* export default kavachNuxt(kavach, { mcp });
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
declare function kavachNuxt(kavach: Kavach, options?: KavachNuxtOptions): EventHandler;
|
|
40
|
+
|
|
41
|
+
export { type KavachNuxtOptions, kavachNuxt };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,593 @@
|
|
|
1
|
+
import { defineEventHandler, getRequestURL, readBody, setResponseStatus, setHeader } from 'h3';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
|
|
4
|
+
// src/adapter.ts
|
|
5
|
+
var PermissionConstraintsSchema = z.object({
|
|
6
|
+
maxCallsPerHour: z.number().int().positive().optional(),
|
|
7
|
+
allowedArgPatterns: z.array(z.string()).optional(),
|
|
8
|
+
requireApproval: z.boolean().optional(),
|
|
9
|
+
timeWindow: z.object({
|
|
10
|
+
start: z.string(),
|
|
11
|
+
end: z.string()
|
|
12
|
+
}).optional(),
|
|
13
|
+
ipAllowlist: z.array(z.string()).optional()
|
|
14
|
+
});
|
|
15
|
+
var PermissionSchema = z.object({
|
|
16
|
+
resource: z.string().min(1),
|
|
17
|
+
actions: z.array(z.string().min(1)).min(1),
|
|
18
|
+
constraints: PermissionConstraintsSchema.optional()
|
|
19
|
+
});
|
|
20
|
+
var CreateAgentSchema = z.object({
|
|
21
|
+
ownerId: z.string().min(1),
|
|
22
|
+
name: z.string().min(1),
|
|
23
|
+
type: z.enum(["autonomous", "delegated", "service"]),
|
|
24
|
+
permissions: z.array(PermissionSchema).min(1),
|
|
25
|
+
expiresAt: z.coerce.date().optional(),
|
|
26
|
+
metadata: z.record(z.unknown()).optional()
|
|
27
|
+
});
|
|
28
|
+
var UpdateAgentSchema = z.object({
|
|
29
|
+
name: z.string().min(1).optional(),
|
|
30
|
+
permissions: z.array(PermissionSchema).optional(),
|
|
31
|
+
expiresAt: z.coerce.date().optional(),
|
|
32
|
+
metadata: z.record(z.unknown()).optional()
|
|
33
|
+
});
|
|
34
|
+
var AuthorizeSchema = z.object({
|
|
35
|
+
agentId: z.string().min(1),
|
|
36
|
+
action: z.string().min(1),
|
|
37
|
+
resource: z.string().min(1),
|
|
38
|
+
arguments: z.record(z.unknown()).optional()
|
|
39
|
+
});
|
|
40
|
+
var AuthorizeByTokenSchema = z.object({
|
|
41
|
+
action: z.string().min(1),
|
|
42
|
+
resource: z.string().min(1),
|
|
43
|
+
arguments: z.record(z.unknown()).optional()
|
|
44
|
+
});
|
|
45
|
+
var DelegateSchema = z.object({
|
|
46
|
+
fromAgent: z.string().min(1),
|
|
47
|
+
toAgent: z.string().min(1),
|
|
48
|
+
permissions: z.array(PermissionSchema).min(1),
|
|
49
|
+
expiresAt: z.coerce.date(),
|
|
50
|
+
maxDepth: z.number().int().positive().optional()
|
|
51
|
+
});
|
|
52
|
+
function ok(data, status = 200) {
|
|
53
|
+
return new Response(JSON.stringify({ data }), {
|
|
54
|
+
status,
|
|
55
|
+
headers: { "Content-Type": "application/json" }
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
function created(data) {
|
|
59
|
+
return ok(data, 201);
|
|
60
|
+
}
|
|
61
|
+
function errorResponse(code, message, status) {
|
|
62
|
+
return new Response(JSON.stringify({ error: { code, message } }), {
|
|
63
|
+
status,
|
|
64
|
+
headers: { "Content-Type": "application/json" }
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
function badRequest(message) {
|
|
68
|
+
return errorResponse("BAD_REQUEST", message, 400);
|
|
69
|
+
}
|
|
70
|
+
function unauthorized(message = "Unauthorized") {
|
|
71
|
+
return errorResponse("UNAUTHORIZED", message, 401);
|
|
72
|
+
}
|
|
73
|
+
function notFound(message = "Not found") {
|
|
74
|
+
return errorResponse("NOT_FOUND", message, 404);
|
|
75
|
+
}
|
|
76
|
+
function methodNotAllowed() {
|
|
77
|
+
return errorResponse("METHOD_NOT_ALLOWED", "Method not allowed", 405);
|
|
78
|
+
}
|
|
79
|
+
function internalError(message = "Internal server error") {
|
|
80
|
+
return errorResponse("INTERNAL_ERROR", message, 500);
|
|
81
|
+
}
|
|
82
|
+
function validationError(issues) {
|
|
83
|
+
const message = issues.map((i) => `${i.path.join(".")}: ${i.message}`).join(", ");
|
|
84
|
+
return badRequest(`Validation failed: ${message}`);
|
|
85
|
+
}
|
|
86
|
+
var MCP_CORS_HEADERS = {
|
|
87
|
+
"Access-Control-Allow-Origin": "*",
|
|
88
|
+
"Access-Control-Allow-Methods": "GET, POST, OPTIONS",
|
|
89
|
+
"Access-Control-Allow-Headers": "Content-Type, Authorization",
|
|
90
|
+
"Access-Control-Max-Age": "86400"
|
|
91
|
+
};
|
|
92
|
+
function mcpOk(data, status = 200) {
|
|
93
|
+
return new Response(JSON.stringify(data), {
|
|
94
|
+
status,
|
|
95
|
+
headers: { "Content-Type": "application/json", ...MCP_CORS_HEADERS }
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
function mcpError(code, message, status) {
|
|
99
|
+
return new Response(JSON.stringify({ error: code, error_description: message }), {
|
|
100
|
+
status,
|
|
101
|
+
headers: { "Content-Type": "application/json", ...MCP_CORS_HEADERS }
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
function mcpNoStore(data, status = 200) {
|
|
105
|
+
return new Response(JSON.stringify(data), {
|
|
106
|
+
status,
|
|
107
|
+
headers: {
|
|
108
|
+
"Content-Type": "application/json",
|
|
109
|
+
"Cache-Control": "no-store",
|
|
110
|
+
Pragma: "no-cache",
|
|
111
|
+
...MCP_CORS_HEADERS
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
function getSearchParam(url, key) {
|
|
116
|
+
return url.searchParams.get(key);
|
|
117
|
+
}
|
|
118
|
+
async function parseJsonBody(request) {
|
|
119
|
+
try {
|
|
120
|
+
const data = await request.json();
|
|
121
|
+
return { success: true, data };
|
|
122
|
+
} catch {
|
|
123
|
+
return { success: false, response: badRequest("Invalid JSON body") };
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
async function handleAgentList(request, kavach) {
|
|
127
|
+
const url = new URL(request.url);
|
|
128
|
+
const userId = getSearchParam(url, "userId");
|
|
129
|
+
const statusRaw = getSearchParam(url, "status");
|
|
130
|
+
const typeRaw = getSearchParam(url, "type");
|
|
131
|
+
const filter = {};
|
|
132
|
+
if (userId) filter.userId = userId;
|
|
133
|
+
if (statusRaw === "active" || statusRaw === "revoked" || statusRaw === "expired") {
|
|
134
|
+
filter.status = statusRaw;
|
|
135
|
+
}
|
|
136
|
+
if (typeRaw === "autonomous" || typeRaw === "delegated" || typeRaw === "service") {
|
|
137
|
+
filter.type = typeRaw;
|
|
138
|
+
}
|
|
139
|
+
try {
|
|
140
|
+
const agents = await kavach.agent.list(filter);
|
|
141
|
+
return ok(agents);
|
|
142
|
+
} catch (err) {
|
|
143
|
+
const message = err instanceof Error ? err.message : "Failed to list agents";
|
|
144
|
+
return internalError(message);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
async function handleAgentCreate(request, kavach) {
|
|
148
|
+
const bodyResult = await parseJsonBody(request);
|
|
149
|
+
if (!bodyResult.success) return bodyResult.response;
|
|
150
|
+
const parsed = CreateAgentSchema.safeParse(bodyResult.data);
|
|
151
|
+
if (!parsed.success) return validationError(parsed.error.issues);
|
|
152
|
+
try {
|
|
153
|
+
const input = {
|
|
154
|
+
...parsed.data,
|
|
155
|
+
permissions: parsed.data.permissions
|
|
156
|
+
};
|
|
157
|
+
const agent = await kavach.agent.create(input);
|
|
158
|
+
return created(agent);
|
|
159
|
+
} catch (err) {
|
|
160
|
+
const message = err instanceof Error ? err.message : "Failed to create agent";
|
|
161
|
+
return internalError(message);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
async function handleAgentGet(id, kavach) {
|
|
165
|
+
try {
|
|
166
|
+
const agent = await kavach.agent.get(id);
|
|
167
|
+
if (!agent) return notFound(`Agent "${id}" not found`);
|
|
168
|
+
return ok(agent);
|
|
169
|
+
} catch (err) {
|
|
170
|
+
const message = err instanceof Error ? err.message : "Failed to get agent";
|
|
171
|
+
return internalError(message);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
async function handleAgentUpdate(id, request, kavach) {
|
|
175
|
+
const bodyResult = await parseJsonBody(request);
|
|
176
|
+
if (!bodyResult.success) return bodyResult.response;
|
|
177
|
+
const parsed = UpdateAgentSchema.safeParse(bodyResult.data);
|
|
178
|
+
if (!parsed.success) return validationError(parsed.error.issues);
|
|
179
|
+
try {
|
|
180
|
+
const input = {
|
|
181
|
+
...parsed.data,
|
|
182
|
+
permissions: parsed.data.permissions
|
|
183
|
+
};
|
|
184
|
+
const agent = await kavach.agent.update(id, input);
|
|
185
|
+
return ok(agent);
|
|
186
|
+
} catch (err) {
|
|
187
|
+
const message = err instanceof Error ? err.message : "Failed to update agent";
|
|
188
|
+
if (message.includes("not found")) return notFound(message);
|
|
189
|
+
return internalError(message);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
async function handleAgentRevoke(id, kavach) {
|
|
193
|
+
try {
|
|
194
|
+
await kavach.agent.revoke(id);
|
|
195
|
+
return new Response(null, { status: 204 });
|
|
196
|
+
} catch (err) {
|
|
197
|
+
const message = err instanceof Error ? err.message : "Failed to revoke agent";
|
|
198
|
+
if (message.includes("not found")) return notFound(message);
|
|
199
|
+
return internalError(message);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
async function handleAgentRotate(id, kavach) {
|
|
203
|
+
try {
|
|
204
|
+
const agent = await kavach.agent.rotate(id);
|
|
205
|
+
return ok(agent);
|
|
206
|
+
} catch (err) {
|
|
207
|
+
const message = err instanceof Error ? err.message : "Failed to rotate agent token";
|
|
208
|
+
if (message.includes("not found")) return notFound(message);
|
|
209
|
+
return internalError(message);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
async function handleAuthorize(request, kavach) {
|
|
213
|
+
const bodyResult = await parseJsonBody(request);
|
|
214
|
+
if (!bodyResult.success) return bodyResult.response;
|
|
215
|
+
const parsed = AuthorizeSchema.safeParse(bodyResult.data);
|
|
216
|
+
if (!parsed.success) return validationError(parsed.error.issues);
|
|
217
|
+
try {
|
|
218
|
+
const result = await kavach.authorize(parsed.data.agentId, {
|
|
219
|
+
action: parsed.data.action,
|
|
220
|
+
resource: parsed.data.resource,
|
|
221
|
+
arguments: parsed.data.arguments
|
|
222
|
+
});
|
|
223
|
+
const status = result.allowed ? 200 : 403;
|
|
224
|
+
return new Response(JSON.stringify({ data: result }), {
|
|
225
|
+
status,
|
|
226
|
+
headers: { "Content-Type": "application/json" }
|
|
227
|
+
});
|
|
228
|
+
} catch (err) {
|
|
229
|
+
const message = err instanceof Error ? err.message : "Authorization check failed";
|
|
230
|
+
return internalError(message);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
async function handleAuthorizeByToken(request, kavach) {
|
|
234
|
+
const authHeader = request.headers.get("Authorization");
|
|
235
|
+
if (!authHeader?.startsWith("Bearer ")) {
|
|
236
|
+
return unauthorized("Missing or invalid Authorization header");
|
|
237
|
+
}
|
|
238
|
+
const token = authHeader.slice(7);
|
|
239
|
+
const bodyResult = await parseJsonBody(request);
|
|
240
|
+
if (!bodyResult.success) return bodyResult.response;
|
|
241
|
+
const parsed = AuthorizeByTokenSchema.safeParse(bodyResult.data);
|
|
242
|
+
if (!parsed.success) return validationError(parsed.error.issues);
|
|
243
|
+
try {
|
|
244
|
+
const result = await kavach.authorizeByToken(token, {
|
|
245
|
+
action: parsed.data.action,
|
|
246
|
+
resource: parsed.data.resource,
|
|
247
|
+
arguments: parsed.data.arguments
|
|
248
|
+
});
|
|
249
|
+
const status = result.allowed ? 200 : 403;
|
|
250
|
+
return new Response(JSON.stringify({ data: result }), {
|
|
251
|
+
status,
|
|
252
|
+
headers: { "Content-Type": "application/json" }
|
|
253
|
+
});
|
|
254
|
+
} catch (err) {
|
|
255
|
+
const message = err instanceof Error ? err.message : "Authorization check failed";
|
|
256
|
+
return internalError(message);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
async function handleDelegationCreate(request, kavach) {
|
|
260
|
+
const bodyResult = await parseJsonBody(request);
|
|
261
|
+
if (!bodyResult.success) return bodyResult.response;
|
|
262
|
+
const parsed = DelegateSchema.safeParse(bodyResult.data);
|
|
263
|
+
if (!parsed.success) return validationError(parsed.error.issues);
|
|
264
|
+
try {
|
|
265
|
+
const input = {
|
|
266
|
+
...parsed.data,
|
|
267
|
+
permissions: parsed.data.permissions
|
|
268
|
+
};
|
|
269
|
+
const chain = await kavach.delegate(input);
|
|
270
|
+
return created(chain);
|
|
271
|
+
} catch (err) {
|
|
272
|
+
const message = err instanceof Error ? err.message : "Failed to create delegation";
|
|
273
|
+
if (message.includes("not found")) return notFound(message);
|
|
274
|
+
if (message.includes("exceeds") || message.includes("depth")) return badRequest(message);
|
|
275
|
+
return internalError(message);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
async function handleDelegationRevoke(id, kavach) {
|
|
279
|
+
try {
|
|
280
|
+
await kavach.delegation.revoke(id);
|
|
281
|
+
return new Response(null, { status: 204 });
|
|
282
|
+
} catch (err) {
|
|
283
|
+
const message = err instanceof Error ? err.message : "Failed to revoke delegation";
|
|
284
|
+
if (message.includes("not found")) return notFound(message);
|
|
285
|
+
return internalError(message);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
async function handleDelegationList(agentId, kavach) {
|
|
289
|
+
try {
|
|
290
|
+
const chains = await kavach.delegation.listChains(agentId);
|
|
291
|
+
return ok(chains);
|
|
292
|
+
} catch (err) {
|
|
293
|
+
const message = err instanceof Error ? err.message : "Failed to list delegation chains";
|
|
294
|
+
return internalError(message);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
function buildAuditFilter(url) {
|
|
298
|
+
const filter = {};
|
|
299
|
+
const agentId = getSearchParam(url, "agentId");
|
|
300
|
+
const userId = getSearchParam(url, "userId");
|
|
301
|
+
const since = getSearchParam(url, "since");
|
|
302
|
+
const until = getSearchParam(url, "until");
|
|
303
|
+
const actions = getSearchParam(url, "actions");
|
|
304
|
+
const resultRaw = getSearchParam(url, "result");
|
|
305
|
+
const limit = getSearchParam(url, "limit");
|
|
306
|
+
const offset = getSearchParam(url, "offset");
|
|
307
|
+
if (agentId) filter.agentId = agentId;
|
|
308
|
+
if (userId) filter.userId = userId;
|
|
309
|
+
if (since) {
|
|
310
|
+
const d = new Date(since);
|
|
311
|
+
if (!Number.isNaN(d.getTime())) filter.since = d;
|
|
312
|
+
}
|
|
313
|
+
if (until) {
|
|
314
|
+
const d = new Date(until);
|
|
315
|
+
if (!Number.isNaN(d.getTime())) filter.until = d;
|
|
316
|
+
}
|
|
317
|
+
if (actions) filter.actions = actions.split(",").map((a) => a.trim());
|
|
318
|
+
if (resultRaw === "allowed" || resultRaw === "denied" || resultRaw === "rate_limited") {
|
|
319
|
+
filter.result = resultRaw;
|
|
320
|
+
}
|
|
321
|
+
if (limit) {
|
|
322
|
+
const n = Number.parseInt(limit, 10);
|
|
323
|
+
if (!Number.isNaN(n) && n > 0) filter.limit = n;
|
|
324
|
+
}
|
|
325
|
+
if (offset) {
|
|
326
|
+
const n = Number.parseInt(offset, 10);
|
|
327
|
+
if (!Number.isNaN(n) && n >= 0) filter.offset = n;
|
|
328
|
+
}
|
|
329
|
+
return filter;
|
|
330
|
+
}
|
|
331
|
+
async function handleAuditQuery(request, kavach) {
|
|
332
|
+
const url = new URL(request.url);
|
|
333
|
+
const filter = buildAuditFilter(url);
|
|
334
|
+
try {
|
|
335
|
+
const entries = await kavach.audit.query(filter);
|
|
336
|
+
return ok(entries);
|
|
337
|
+
} catch (err) {
|
|
338
|
+
const message = err instanceof Error ? err.message : "Failed to query audit logs";
|
|
339
|
+
return internalError(message);
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
async function handleAuditExport(request, kavach) {
|
|
343
|
+
const url = new URL(request.url);
|
|
344
|
+
const format = getSearchParam(url, "format") ?? "json";
|
|
345
|
+
if (format !== "json" && format !== "csv") {
|
|
346
|
+
return badRequest('format must be "json" or "csv"');
|
|
347
|
+
}
|
|
348
|
+
const since = getSearchParam(url, "since");
|
|
349
|
+
const until = getSearchParam(url, "until");
|
|
350
|
+
const options = { format };
|
|
351
|
+
if (since) {
|
|
352
|
+
const d = new Date(since);
|
|
353
|
+
if (!Number.isNaN(d.getTime())) options.since = d;
|
|
354
|
+
}
|
|
355
|
+
if (until) {
|
|
356
|
+
const d = new Date(until);
|
|
357
|
+
if (!Number.isNaN(d.getTime())) options.until = d;
|
|
358
|
+
}
|
|
359
|
+
try {
|
|
360
|
+
const exported = await kavach.audit.export(options);
|
|
361
|
+
const contentType = format === "csv" ? "text/csv" : "application/json";
|
|
362
|
+
return new Response(exported, {
|
|
363
|
+
status: 200,
|
|
364
|
+
headers: {
|
|
365
|
+
"Content-Type": contentType,
|
|
366
|
+
"Content-Disposition": `attachment; filename="audit-export.${format}"`
|
|
367
|
+
}
|
|
368
|
+
});
|
|
369
|
+
} catch (err) {
|
|
370
|
+
const message = err instanceof Error ? err.message : "Failed to export audit logs";
|
|
371
|
+
return internalError(message);
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
async function handleDashboardStats(kavach) {
|
|
375
|
+
try {
|
|
376
|
+
const [agents, recentAudit] = await Promise.all([
|
|
377
|
+
kavach.agent.list(),
|
|
378
|
+
kavach.audit.query({
|
|
379
|
+
since: new Date(Date.now() - 24 * 60 * 60 * 1e3),
|
|
380
|
+
limit: 1e3
|
|
381
|
+
})
|
|
382
|
+
]);
|
|
383
|
+
const ownerIds = new Set(agents.map((a) => a.ownerId));
|
|
384
|
+
const activeAgents = agents.filter((a) => a.status === "active");
|
|
385
|
+
const revokedAgents = agents.filter((a) => a.status === "revoked");
|
|
386
|
+
const expiredAgents = agents.filter((a) => a.status === "expired");
|
|
387
|
+
const stats = {
|
|
388
|
+
agents: {
|
|
389
|
+
total: agents.length,
|
|
390
|
+
active: activeAgents.length,
|
|
391
|
+
revoked: revokedAgents.length,
|
|
392
|
+
expired: expiredAgents.length
|
|
393
|
+
},
|
|
394
|
+
users: {
|
|
395
|
+
total: ownerIds.size
|
|
396
|
+
},
|
|
397
|
+
audit: {
|
|
398
|
+
last24h: recentAudit.length,
|
|
399
|
+
allowed: recentAudit.filter((e) => e.result === "allowed").length,
|
|
400
|
+
denied: recentAudit.filter((e) => e.result === "denied").length,
|
|
401
|
+
rateLimited: recentAudit.filter((e) => e.result === "rate_limited").length
|
|
402
|
+
}
|
|
403
|
+
};
|
|
404
|
+
return ok(stats);
|
|
405
|
+
} catch (err) {
|
|
406
|
+
const message = err instanceof Error ? err.message : "Failed to fetch dashboard stats";
|
|
407
|
+
return internalError(message);
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
async function dispatch(request, kavach, mcp, basePath) {
|
|
411
|
+
const url = new URL(request.url);
|
|
412
|
+
const raw = url.pathname;
|
|
413
|
+
const relative = raw.startsWith(basePath) ? raw.slice(basePath.length) : raw;
|
|
414
|
+
const pathname = relative.startsWith("/") ? relative : `/${relative}`;
|
|
415
|
+
const method = request.method.toUpperCase();
|
|
416
|
+
if (method === "OPTIONS") {
|
|
417
|
+
if (pathname.startsWith("/mcp/") || pathname.startsWith("/.well-known/")) {
|
|
418
|
+
return new Response(null, { status: 204, headers: MCP_CORS_HEADERS });
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
if (pathname === "/.well-known/oauth-authorization-server" && method === "GET") {
|
|
422
|
+
if (!mcp) return notFound("MCP module not configured");
|
|
423
|
+
return mcpOk(mcp.getMetadata());
|
|
424
|
+
}
|
|
425
|
+
if (pathname === "/.well-known/oauth-protected-resource" && method === "GET") {
|
|
426
|
+
if (!mcp) return notFound("MCP module not configured");
|
|
427
|
+
return mcpOk(mcp.getProtectedResourceMetadata());
|
|
428
|
+
}
|
|
429
|
+
if (pathname === "/mcp/register" && method === "POST") {
|
|
430
|
+
if (!mcp) return notFound("MCP module not configured");
|
|
431
|
+
let body;
|
|
432
|
+
try {
|
|
433
|
+
body = await request.json();
|
|
434
|
+
} catch {
|
|
435
|
+
return mcpError("invalid_request", "Invalid JSON body", 400);
|
|
436
|
+
}
|
|
437
|
+
try {
|
|
438
|
+
const result = await mcp.registerClient(body);
|
|
439
|
+
if (!result.success) {
|
|
440
|
+
return mcpError("invalid_client_metadata", result.error.message, 400);
|
|
441
|
+
}
|
|
442
|
+
return mcpNoStore(result.data, 201);
|
|
443
|
+
} catch (err) {
|
|
444
|
+
const message = err instanceof Error ? err.message : "Registration failed";
|
|
445
|
+
return mcpError("server_error", message, 500);
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
if (pathname === "/mcp/authorize" && method === "GET") {
|
|
449
|
+
if (!mcp) return notFound("MCP module not configured");
|
|
450
|
+
try {
|
|
451
|
+
const result = await mcp.authorize(request);
|
|
452
|
+
if (!result.success) {
|
|
453
|
+
if (result.error.code === "LOGIN_REQUIRED") {
|
|
454
|
+
const details = result.error.details;
|
|
455
|
+
if (details?.loginPage) {
|
|
456
|
+
const loginUrl = new URL(details.loginPage);
|
|
457
|
+
if (details.returnTo) {
|
|
458
|
+
loginUrl.searchParams.set("returnTo", details.returnTo);
|
|
459
|
+
}
|
|
460
|
+
return Response.redirect(loginUrl.toString(), 302);
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
return mcpError(result.error.code.toLowerCase(), result.error.message, 400);
|
|
464
|
+
}
|
|
465
|
+
return Response.redirect(result.data.redirectUri, 302);
|
|
466
|
+
} catch (err) {
|
|
467
|
+
const message = err instanceof Error ? err.message : "Authorization failed";
|
|
468
|
+
return mcpError("server_error", message, 500);
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
if (pathname === "/mcp/token" && method === "POST") {
|
|
472
|
+
if (!mcp) return notFound("MCP module not configured");
|
|
473
|
+
try {
|
|
474
|
+
const result = await mcp.token(request);
|
|
475
|
+
if (!result.success) {
|
|
476
|
+
const status = result.error.code === "INVALID_CLIENT" ? 401 : 400;
|
|
477
|
+
return mcpNoStore(
|
|
478
|
+
{
|
|
479
|
+
error: result.error.code.toLowerCase(),
|
|
480
|
+
error_description: result.error.message
|
|
481
|
+
},
|
|
482
|
+
status
|
|
483
|
+
);
|
|
484
|
+
}
|
|
485
|
+
return mcpNoStore(result.data);
|
|
486
|
+
} catch (err) {
|
|
487
|
+
const message = err instanceof Error ? err.message : "Token exchange failed";
|
|
488
|
+
return mcpNoStore({ error: "server_error", error_description: message }, 500);
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
if (pathname === "/agents") {
|
|
492
|
+
if (method === "GET") return handleAgentList(request, kavach);
|
|
493
|
+
if (method === "POST") return handleAgentCreate(request, kavach);
|
|
494
|
+
return methodNotAllowed();
|
|
495
|
+
}
|
|
496
|
+
const rotateMatch = /^\/agents\/([^/]+)\/rotate$/.exec(pathname);
|
|
497
|
+
if (rotateMatch) {
|
|
498
|
+
const id = rotateMatch[1];
|
|
499
|
+
if (!id) return badRequest("Missing agent id");
|
|
500
|
+
if (method === "POST") return handleAgentRotate(id, kavach);
|
|
501
|
+
return methodNotAllowed();
|
|
502
|
+
}
|
|
503
|
+
const agentMatch = /^\/agents\/([^/]+)$/.exec(pathname);
|
|
504
|
+
if (agentMatch) {
|
|
505
|
+
const id = agentMatch[1];
|
|
506
|
+
if (!id) return badRequest("Missing agent id");
|
|
507
|
+
if (method === "GET") return handleAgentGet(id, kavach);
|
|
508
|
+
if (method === "PATCH") return handleAgentUpdate(id, request, kavach);
|
|
509
|
+
if (method === "DELETE") return handleAgentRevoke(id, kavach);
|
|
510
|
+
return methodNotAllowed();
|
|
511
|
+
}
|
|
512
|
+
if (pathname === "/authorize") {
|
|
513
|
+
if (method === "POST") return handleAuthorize(request, kavach);
|
|
514
|
+
return methodNotAllowed();
|
|
515
|
+
}
|
|
516
|
+
if (pathname === "/authorize/token") {
|
|
517
|
+
if (method === "POST") return handleAuthorizeByToken(request, kavach);
|
|
518
|
+
return methodNotAllowed();
|
|
519
|
+
}
|
|
520
|
+
if (pathname === "/delegations") {
|
|
521
|
+
if (method === "POST") return handleDelegationCreate(request, kavach);
|
|
522
|
+
return methodNotAllowed();
|
|
523
|
+
}
|
|
524
|
+
const delegationMatch = /^\/delegations\/([^/]+)$/.exec(pathname);
|
|
525
|
+
if (delegationMatch) {
|
|
526
|
+
const id = delegationMatch[1];
|
|
527
|
+
if (!id) return badRequest("Missing delegation id");
|
|
528
|
+
if (method === "DELETE") return handleDelegationRevoke(id, kavach);
|
|
529
|
+
if (method === "GET") return handleDelegationList(id, kavach);
|
|
530
|
+
return methodNotAllowed();
|
|
531
|
+
}
|
|
532
|
+
if (pathname === "/audit/export") {
|
|
533
|
+
if (method === "GET") return handleAuditExport(request, kavach);
|
|
534
|
+
return methodNotAllowed();
|
|
535
|
+
}
|
|
536
|
+
if (pathname === "/audit") {
|
|
537
|
+
if (method === "GET") return handleAuditQuery(request, kavach);
|
|
538
|
+
return methodNotAllowed();
|
|
539
|
+
}
|
|
540
|
+
if (pathname === "/dashboard/stats") {
|
|
541
|
+
if (method === "GET") return handleDashboardStats(kavach);
|
|
542
|
+
return methodNotAllowed();
|
|
543
|
+
}
|
|
544
|
+
if (pathname === "/dashboard/agents") {
|
|
545
|
+
if (method === "GET") return handleAgentList(request, kavach);
|
|
546
|
+
return methodNotAllowed();
|
|
547
|
+
}
|
|
548
|
+
if (pathname === "/dashboard/audit") {
|
|
549
|
+
if (method === "GET") return handleAuditQuery(request, kavach);
|
|
550
|
+
return methodNotAllowed();
|
|
551
|
+
}
|
|
552
|
+
return notFound("Route not found");
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
// src/adapter.ts
|
|
556
|
+
function kavachNuxt(kavach, options) {
|
|
557
|
+
const mcp = options?.mcp;
|
|
558
|
+
const basePath = options?.basePath ?? "/api/kavach";
|
|
559
|
+
return defineEventHandler(async (event) => {
|
|
560
|
+
const url = getRequestURL(event);
|
|
561
|
+
const method = event.method ?? "GET";
|
|
562
|
+
const headers = new Headers();
|
|
563
|
+
const rawHeaders = event.headers;
|
|
564
|
+
rawHeaders.forEach((value, key) => {
|
|
565
|
+
headers.set(key, value);
|
|
566
|
+
});
|
|
567
|
+
let body = null;
|
|
568
|
+
if (method !== "GET" && method !== "HEAD" && method !== "OPTIONS") {
|
|
569
|
+
try {
|
|
570
|
+
const raw = await readBody(event);
|
|
571
|
+
if (raw !== void 0 && raw !== null) {
|
|
572
|
+
body = JSON.stringify(raw);
|
|
573
|
+
headers.set("Content-Type", "application/json");
|
|
574
|
+
}
|
|
575
|
+
} catch {
|
|
576
|
+
}
|
|
577
|
+
}
|
|
578
|
+
const request = new Request(url.toString(), { method, headers, body });
|
|
579
|
+
const response = await dispatch(request, kavach, mcp, basePath);
|
|
580
|
+
setResponseStatus(event, response.status);
|
|
581
|
+
response.headers.forEach((value, key) => {
|
|
582
|
+
setHeader(event, key, value);
|
|
583
|
+
});
|
|
584
|
+
if (response.status === 204 || response.body === null) {
|
|
585
|
+
return null;
|
|
586
|
+
}
|
|
587
|
+
return response.text();
|
|
588
|
+
});
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
export { kavachNuxt };
|
|
592
|
+
//# sourceMappingURL=index.js.map
|
|
593
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/dispatch.ts","../src/adapter.ts"],"names":[],"mappings":";;;;AAcA,IAAM,2BAAA,GAA8B,EAAE,MAAA,CAAO;AAAA,EAC5C,eAAA,EAAiB,EAAE,MAAA,EAAO,CAAE,KAAI,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EACtD,oBAAoB,CAAA,CAAE,KAAA,CAAM,EAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,EACjD,eAAA,EAAiB,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA,EACtC,UAAA,EAAY,EACV,MAAA,CAAO;AAAA,IACP,KAAA,EAAO,EAAE,MAAA,EAAO;AAAA,IAChB,GAAA,EAAK,EAAE,MAAA;AAAO,GACd,EACA,QAAA,EAAS;AAAA,EACX,aAAa,CAAA,CAAE,KAAA,CAAM,EAAE,MAAA,EAAQ,EAAE,QAAA;AAClC,CAAC,CAAA;AAED,IAAM,gBAAA,GAAmB,EAAE,MAAA,CAAO;AAAA,EACjC,QAAA,EAAU,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EAC1B,OAAA,EAAS,CAAA,CAAE,KAAA,CAAM,CAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,CAAC,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA;AAAA,EACzC,WAAA,EAAa,4BAA4B,QAAA;AAC1C,CAAC,CAAA;AAED,IAAM,iBAAA,GAAoB,EAAE,MAAA,CAAO;AAAA,EAClC,OAAA,EAAS,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACzB,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACtB,MAAM,CAAA,CAAE,IAAA,CAAK,CAAC,YAAA,EAAc,WAAA,EAAa,SAAS,CAAC,CAAA;AAAA,EACnD,aAAa,CAAA,CAAE,KAAA,CAAM,gBAAgB,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA,EAC5C,SAAA,EAAW,CAAA,CAAE,MAAA,CAAO,IAAA,GAAO,QAAA,EAAS;AAAA,EACpC,UAAU,CAAA,CAAE,MAAA,CAAO,EAAE,OAAA,EAAS,EAAE,QAAA;AACjC,CAAC,CAAA;AAED,IAAM,iBAAA,GAAoB,EAAE,MAAA,CAAO;AAAA,EAClC,MAAM,CAAA,CAAE,MAAA,GAAS,GAAA,CAAI,CAAC,EAAE,QAAA,EAAS;AAAA,EACjC,WAAA,EAAa,CAAA,CAAE,KAAA,CAAM,gBAAgB,EAAE,QAAA,EAAS;AAAA,EAChD,SAAA,EAAW,CAAA,CAAE,MAAA,CAAO,IAAA,GAAO,QAAA,EAAS;AAAA,EACpC,UAAU,CAAA,CAAE,MAAA,CAAO,EAAE,OAAA,EAAS,EAAE,QAAA;AACjC,CAAC,CAAA;AAED,IAAM,eAAA,GAAkB,EAAE,MAAA,CAAO;AAAA,EAChC,OAAA,EAAS,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACzB,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACxB,QAAA,EAAU,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EAC1B,WAAW,CAAA,CAAE,MAAA,CAAO,EAAE,OAAA,EAAS,EAAE,QAAA;AAClC,CAAC,CAAA;AAED,IAAM,sBAAA,GAAyB,EAAE,MAAA,CAAO;AAAA,EACvC,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACxB,QAAA,EAAU,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EAC1B,WAAW,CAAA,CAAE,MAAA,CAAO,EAAE,OAAA,EAAS,EAAE,QAAA;AAClC,CAAC,CAAA;AAED,IAAM,cAAA,GAAiB,EAAE,MAAA,CAAO;AAAA,EAC/B,SAAA,EAAW,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EAC3B,OAAA,EAAS,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACzB,aAAa,CAAA,CAAE,KAAA,CAAM,gBAAgB,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA,EAC5C,SAAA,EAAW,CAAA,CAAE,MAAA,CAAO,IAAA,EAAK;AAAA,EACzB,QAAA,EAAU,EAAE,MAAA,EAAO,CAAE,KAAI,CAAE,QAAA,GAAW,QAAA;AACvC,CAAC,CAAA;AAID,SAAS,EAAA,CAAM,IAAA,EAAS,MAAA,GAAS,GAAA,EAAe;AAC/C,EAAA,OAAO,IAAI,QAAA,CAAS,IAAA,CAAK,UAAU,EAAE,IAAA,EAAM,CAAA,EAAG;AAAA,IAC7C,MAAA;AAAA,IACA,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA;AAAmB,GAC9C,CAAA;AACF;AAEA,SAAS,QAAW,IAAA,EAAmB;AACtC,EAAA,OAAO,EAAA,CAAG,MAAM,GAAG,CAAA;AACpB;AAEA,SAAS,aAAA,CAAc,IAAA,EAAc,OAAA,EAAiB,MAAA,EAA0B;AAC/E,EAAA,OAAO,IAAI,QAAA,CAAS,IAAA,CAAK,SAAA,CAAU,EAAE,KAAA,EAAO,EAAE,IAAA,EAAM,OAAA,EAAQ,EAAG,CAAA,EAAG;AAAA,IACjE,MAAA;AAAA,IACA,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA;AAAmB,GAC9C,CAAA;AACF;AAEA,SAAS,WAAW,OAAA,EAA2B;AAC9C,EAAA,OAAO,aAAA,CAAc,aAAA,EAAe,OAAA,EAAS,GAAG,CAAA;AACjD;AAEA,SAAS,YAAA,CAAa,UAAU,cAAA,EAA0B;AACzD,EAAA,OAAO,aAAA,CAAc,cAAA,EAAgB,OAAA,EAAS,GAAG,CAAA;AAClD;AAEA,SAAS,QAAA,CAAS,UAAU,WAAA,EAAuB;AAClD,EAAA,OAAO,aAAA,CAAc,WAAA,EAAa,OAAA,EAAS,GAAG,CAAA;AAC/C;AAEA,SAAS,gBAAA,GAA6B;AACrC,EAAA,OAAO,aAAA,CAAc,oBAAA,EAAsB,oBAAA,EAAsB,GAAG,CAAA;AACrE;AAEA,SAAS,aAAA,CAAc,UAAU,uBAAA,EAAmC;AACnE,EAAA,OAAO,aAAA,CAAc,gBAAA,EAAkB,OAAA,EAAS,GAAG,CAAA;AACpD;AAEA,SAAS,gBAAgB,MAAA,EAAgC;AACxD,EAAA,MAAM,UAAU,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,GAAG,CAAA,CAAE,IAAA,CAAK,IAAA,CAAK,GAAG,CAAC,CAAA,EAAA,EAAK,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA,CAAE,KAAK,IAAI,CAAA;AAChF,EAAA,OAAO,UAAA,CAAW,CAAA,mBAAA,EAAsB,OAAO,CAAA,CAAE,CAAA;AAClD;AAIA,IAAM,gBAAA,GAAmB;AAAA,EACxB,6BAAA,EAA+B,GAAA;AAAA,EAC/B,8BAAA,EAAgC,oBAAA;AAAA,EAChC,8BAAA,EAAgC,6BAAA;AAAA,EAChC,wBAAA,EAA0B;AAC3B,CAAA;AAEA,SAAS,KAAA,CAAS,IAAA,EAAS,MAAA,GAAS,GAAA,EAAe;AAClD,EAAA,OAAO,IAAI,QAAA,CAAS,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,EAAG;AAAA,IACzC,MAAA;AAAA,IACA,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAoB,GAAG,gBAAA;AAAiB,GACnE,CAAA;AACF;AAEA,SAAS,QAAA,CAAS,IAAA,EAAc,OAAA,EAAiB,MAAA,EAA0B;AAC1E,EAAA,OAAO,IAAI,QAAA,CAAS,IAAA,CAAK,SAAA,CAAU,EAAE,OAAO,IAAA,EAAM,iBAAA,EAAmB,OAAA,EAAS,CAAA,EAAG;AAAA,IAChF,MAAA;AAAA,IACA,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAoB,GAAG,gBAAA;AAAiB,GACnE,CAAA;AACF;AAEA,SAAS,UAAA,CAAc,IAAA,EAAS,MAAA,GAAS,GAAA,EAAe;AACvD,EAAA,OAAO,IAAI,QAAA,CAAS,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,EAAG;AAAA,IACzC,MAAA;AAAA,IACA,OAAA,EAAS;AAAA,MACR,cAAA,EAAgB,kBAAA;AAAA,MAChB,eAAA,EAAiB,UAAA;AAAA,MACjB,MAAA,EAAQ,UAAA;AAAA,MACR,GAAG;AAAA;AACJ,GACA,CAAA;AACF;AAIA,SAAS,cAAA,CAAe,KAAU,GAAA,EAA4B;AAC7D,EAAA,OAAO,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,GAAG,CAAA;AAChC;AAEA,eAAe,cACd,OAAA,EACqF;AACrF,EAAA,IAAI;AACH,IAAA,MAAM,IAAA,GAAQ,MAAM,OAAA,CAAQ,IAAA,EAAK;AACjC,IAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAK;AAAA,EAC9B,CAAA,CAAA,MAAQ;AACP,IAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,QAAA,EAAU,UAAA,CAAW,mBAAmB,CAAA,EAAE;AAAA,EACpE;AACD;AAIA,eAAe,eAAA,CAAgB,SAAkB,MAAA,EAAmC;AACnF,EAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,OAAA,CAAQ,GAAG,CAAA;AAC/B,EAAA,MAAM,MAAA,GAAS,cAAA,CAAe,GAAA,EAAK,QAAQ,CAAA;AAC3C,EAAA,MAAM,SAAA,GAAY,cAAA,CAAe,GAAA,EAAK,QAAQ,CAAA;AAC9C,EAAA,MAAM,OAAA,GAAU,cAAA,CAAe,GAAA,EAAK,MAAM,CAAA;AAE1C,EAAA,MAAM,SAAsB,EAAC;AAC7B,EAAA,IAAI,MAAA,SAAe,MAAA,GAAS,MAAA;AAC5B,EAAA,IAAI,SAAA,KAAc,QAAA,IAAY,SAAA,KAAc,SAAA,IAAa,cAAc,SAAA,EAAW;AACjF,IAAA,MAAA,CAAO,MAAA,GAAS,SAAA;AAAA,EACjB;AACA,EAAA,IAAI,OAAA,KAAY,YAAA,IAAgB,OAAA,KAAY,WAAA,IAAe,YAAY,SAAA,EAAW;AACjF,IAAA,MAAA,CAAO,IAAA,GAAO,OAAA;AAAA,EACf;AAEA,EAAA,IAAI;AACH,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,KAAA,CAAM,KAAK,MAAM,CAAA;AAC7C,IAAA,OAAO,GAAG,MAAM,CAAA;AAAA,EACjB,SAAS,GAAA,EAAK;AACb,IAAA,MAAM,OAAA,GAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,uBAAA;AACrD,IAAA,OAAO,cAAc,OAAO,CAAA;AAAA,EAC7B;AACD;AAEA,eAAe,iBAAA,CAAkB,SAAkB,MAAA,EAAmC;AACrF,EAAA,MAAM,UAAA,GAAa,MAAM,aAAA,CAAc,OAAO,CAAA;AAC9C,EAAA,IAAI,CAAC,UAAA,CAAW,OAAA,EAAS,OAAO,UAAA,CAAW,QAAA;AAE3C,EAAA,MAAM,MAAA,GAAS,iBAAA,CAAkB,SAAA,CAAU,UAAA,CAAW,IAAI,CAAA;AAC1D,EAAA,IAAI,CAAC,MAAA,CAAO,OAAA,SAAgB,eAAA,CAAgB,MAAA,CAAO,MAAM,MAAM,CAAA;AAE/D,EAAA,IAAI;AACH,IAAA,MAAM,KAAA,GAA0B;AAAA,MAC/B,GAAG,MAAA,CAAO,IAAA;AAAA,MACV,WAAA,EAAa,OAAO,IAAA,CAAK;AAAA,KAC1B;AACA,IAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,CAAO,KAAA,CAAM,OAAO,KAAK,CAAA;AAC7C,IAAA,OAAO,QAAQ,KAAK,CAAA;AAAA,EACrB,SAAS,GAAA,EAAK;AACb,IAAA,MAAM,OAAA,GAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,wBAAA;AACrD,IAAA,OAAO,cAAc,OAAO,CAAA;AAAA,EAC7B;AACD;AAEA,eAAe,cAAA,CAAe,IAAY,MAAA,EAAmC;AAC5E,EAAA,IAAI;AACH,IAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,CAAO,KAAA,CAAM,IAAI,EAAE,CAAA;AACvC,IAAA,IAAI,CAAC,KAAA,EAAO,OAAO,QAAA,CAAS,CAAA,OAAA,EAAU,EAAE,CAAA,WAAA,CAAa,CAAA;AACrD,IAAA,OAAO,GAAG,KAAK,CAAA;AAAA,EAChB,SAAS,GAAA,EAAK;AACb,IAAA,MAAM,OAAA,GAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,qBAAA;AACrD,IAAA,OAAO,cAAc,OAAO,CAAA;AAAA,EAC7B;AACD;AAEA,eAAe,iBAAA,CAAkB,EAAA,EAAY,OAAA,EAAkB,MAAA,EAAmC;AACjG,EAAA,MAAM,UAAA,GAAa,MAAM,aAAA,CAAc,OAAO,CAAA;AAC9C,EAAA,IAAI,CAAC,UAAA,CAAW,OAAA,EAAS,OAAO,UAAA,CAAW,QAAA;AAE3C,EAAA,MAAM,MAAA,GAAS,iBAAA,CAAkB,SAAA,CAAU,UAAA,CAAW,IAAI,CAAA;AAC1D,EAAA,IAAI,CAAC,MAAA,CAAO,OAAA,SAAgB,eAAA,CAAgB,MAAA,CAAO,MAAM,MAAM,CAAA;AAE/D,EAAA,IAAI;AACH,IAAA,MAAM,KAAA,GAA0B;AAAA,MAC/B,GAAG,MAAA,CAAO,IAAA;AAAA,MACV,WAAA,EAAa,OAAO,IAAA,CAAK;AAAA,KAC1B;AACA,IAAA,MAAM,QAAQ,MAAM,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,IAAI,KAAK,CAAA;AACjD,IAAA,OAAO,GAAG,KAAK,CAAA;AAAA,EAChB,SAAS,GAAA,EAAK;AACb,IAAA,MAAM,OAAA,GAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,wBAAA;AACrD,IAAA,IAAI,QAAQ,QAAA,CAAS,WAAW,CAAA,EAAG,OAAO,SAAS,OAAO,CAAA;AAC1D,IAAA,OAAO,cAAc,OAAO,CAAA;AAAA,EAC7B;AACD;AAEA,eAAe,iBAAA,CAAkB,IAAY,MAAA,EAAmC;AAC/E,EAAA,IAAI;AACH,IAAA,MAAM,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,EAAE,CAAA;AAC5B,IAAA,OAAO,IAAI,QAAA,CAAS,IAAA,EAAM,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA,EAC1C,SAAS,GAAA,EAAK;AACb,IAAA,MAAM,OAAA,GAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,wBAAA;AACrD,IAAA,IAAI,QAAQ,QAAA,CAAS,WAAW,CAAA,EAAG,OAAO,SAAS,OAAO,CAAA;AAC1D,IAAA,OAAO,cAAc,OAAO,CAAA;AAAA,EAC7B;AACD;AAEA,eAAe,iBAAA,CAAkB,IAAY,MAAA,EAAmC;AAC/E,EAAA,IAAI;AACH,IAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,CAAO,KAAA,CAAM,OAAO,EAAE,CAAA;AAC1C,IAAA,OAAO,GAAG,KAAK,CAAA;AAAA,EAChB,SAAS,GAAA,EAAK;AACb,IAAA,MAAM,OAAA,GAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,8BAAA;AACrD,IAAA,IAAI,QAAQ,QAAA,CAAS,WAAW,CAAA,EAAG,OAAO,SAAS,OAAO,CAAA;AAC1D,IAAA,OAAO,cAAc,OAAO,CAAA;AAAA,EAC7B;AACD;AAEA,eAAe,eAAA,CAAgB,SAAkB,MAAA,EAAmC;AACnF,EAAA,MAAM,UAAA,GAAa,MAAM,aAAA,CAAc,OAAO,CAAA;AAC9C,EAAA,IAAI,CAAC,UAAA,CAAW,OAAA,EAAS,OAAO,UAAA,CAAW,QAAA;AAE3C,EAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,SAAA,CAAU,UAAA,CAAW,IAAI,CAAA;AACxD,EAAA,IAAI,CAAC,MAAA,CAAO,OAAA,SAAgB,eAAA,CAAgB,MAAA,CAAO,MAAM,MAAM,CAAA;AAE/D,EAAA,IAAI;AACH,IAAA,MAAM,SAAS,MAAM,MAAA,CAAO,SAAA,CAAU,MAAA,CAAO,KAAK,OAAA,EAAS;AAAA,MAC1D,MAAA,EAAQ,OAAO,IAAA,CAAK,MAAA;AAAA,MACpB,QAAA,EAAU,OAAO,IAAA,CAAK,QAAA;AAAA,MACtB,SAAA,EAAW,OAAO,IAAA,CAAK;AAAA,KACvB,CAAA;AACD,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,OAAA,GAAU,GAAA,GAAM,GAAA;AACtC,IAAA,OAAO,IAAI,SAAS,IAAA,CAAK,SAAA,CAAU,EAAE,IAAA,EAAM,MAAA,EAAQ,CAAA,EAAG;AAAA,MACrD,MAAA;AAAA,MACA,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA;AAAmB,KAC9C,CAAA;AAAA,EACF,SAAS,GAAA,EAAK;AACb,IAAA,MAAM,OAAA,GAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,4BAAA;AACrD,IAAA,OAAO,cAAc,OAAO,CAAA;AAAA,EAC7B;AACD;AAEA,eAAe,sBAAA,CAAuB,SAAkB,MAAA,EAAmC;AAC1F,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,eAAe,CAAA;AACtD,EAAA,IAAI,CAAC,UAAA,EAAY,UAAA,CAAW,SAAS,CAAA,EAAG;AACvC,IAAA,OAAO,aAAa,yCAAyC,CAAA;AAAA,EAC9D;AACA,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,KAAA,CAAM,CAAC,CAAA;AAEhC,EAAA,MAAM,UAAA,GAAa,MAAM,aAAA,CAAc,OAAO,CAAA;AAC9C,EAAA,IAAI,CAAC,UAAA,CAAW,OAAA,EAAS,OAAO,UAAA,CAAW,QAAA;AAE3C,EAAA,MAAM,MAAA,GAAS,sBAAA,CAAuB,SAAA,CAAU,UAAA,CAAW,IAAI,CAAA;AAC/D,EAAA,IAAI,CAAC,MAAA,CAAO,OAAA,SAAgB,eAAA,CAAgB,MAAA,CAAO,MAAM,MAAM,CAAA;AAE/D,EAAA,IAAI;AACH,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,gBAAA,CAAiB,KAAA,EAAO;AAAA,MACnD,MAAA,EAAQ,OAAO,IAAA,CAAK,MAAA;AAAA,MACpB,QAAA,EAAU,OAAO,IAAA,CAAK,QAAA;AAAA,MACtB,SAAA,EAAW,OAAO,IAAA,CAAK;AAAA,KACvB,CAAA;AACD,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,OAAA,GAAU,GAAA,GAAM,GAAA;AACtC,IAAA,OAAO,IAAI,SAAS,IAAA,CAAK,SAAA,CAAU,EAAE,IAAA,EAAM,MAAA,EAAQ,CAAA,EAAG;AAAA,MACrD,MAAA;AAAA,MACA,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA;AAAmB,KAC9C,CAAA;AAAA,EACF,SAAS,GAAA,EAAK;AACb,IAAA,MAAM,OAAA,GAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,4BAAA;AACrD,IAAA,OAAO,cAAc,OAAO,CAAA;AAAA,EAC7B;AACD;AAEA,eAAe,sBAAA,CAAuB,SAAkB,MAAA,EAAmC;AAC1F,EAAA,MAAM,UAAA,GAAa,MAAM,aAAA,CAAc,OAAO,CAAA;AAC9C,EAAA,IAAI,CAAC,UAAA,CAAW,OAAA,EAAS,OAAO,UAAA,CAAW,QAAA;AAE3C,EAAA,MAAM,MAAA,GAAS,cAAA,CAAe,SAAA,CAAU,UAAA,CAAW,IAAI,CAAA;AACvD,EAAA,IAAI,CAAC,MAAA,CAAO,OAAA,SAAgB,eAAA,CAAgB,MAAA,CAAO,MAAM,MAAM,CAAA;AAE/D,EAAA,IAAI;AACH,IAAA,MAAM,KAAA,GAAuB;AAAA,MAC5B,GAAG,MAAA,CAAO,IAAA;AAAA,MACV,WAAA,EAAa,OAAO,IAAA,CAAK;AAAA,KAC1B;AACA,IAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA;AACzC,IAAA,OAAO,QAAQ,KAAK,CAAA;AAAA,EACrB,SAAS,GAAA,EAAK;AACb,IAAA,MAAM,OAAA,GAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,6BAAA;AACrD,IAAA,IAAI,QAAQ,QAAA,CAAS,WAAW,CAAA,EAAG,OAAO,SAAS,OAAO,CAAA;AAC1D,IAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,SAAS,CAAA,IAAK,OAAA,CAAQ,SAAS,OAAO,CAAA,EAAG,OAAO,UAAA,CAAW,OAAO,CAAA;AACvF,IAAA,OAAO,cAAc,OAAO,CAAA;AAAA,EAC7B;AACD;AAEA,eAAe,sBAAA,CAAuB,IAAY,MAAA,EAAmC;AACpF,EAAA,IAAI;AACH,IAAA,MAAM,MAAA,CAAO,UAAA,CAAW,MAAA,CAAO,EAAE,CAAA;AACjC,IAAA,OAAO,IAAI,QAAA,CAAS,IAAA,EAAM,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA,EAC1C,SAAS,GAAA,EAAK;AACb,IAAA,MAAM,OAAA,GAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,6BAAA;AACrD,IAAA,IAAI,QAAQ,QAAA,CAAS,WAAW,CAAA,EAAG,OAAO,SAAS,OAAO,CAAA;AAC1D,IAAA,OAAO,cAAc,OAAO,CAAA;AAAA,EAC7B;AACD;AAEA,eAAe,oBAAA,CAAqB,SAAiB,MAAA,EAAmC;AACvF,EAAA,IAAI;AACH,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,UAAA,CAAW,WAAW,OAAO,CAAA;AACzD,IAAA,OAAO,GAAG,MAAM,CAAA;AAAA,EACjB,SAAS,GAAA,EAAK;AACb,IAAA,MAAM,OAAA,GAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,kCAAA;AACrD,IAAA,OAAO,cAAc,OAAO,CAAA;AAAA,EAC7B;AACD;AAEA,SAAS,iBAAiB,GAAA,EAAuB;AAChD,EAAA,MAAM,SAAsB,EAAC;AAE7B,EAAA,MAAM,OAAA,GAAU,cAAA,CAAe,GAAA,EAAK,SAAS,CAAA;AAC7C,EAAA,MAAM,MAAA,GAAS,cAAA,CAAe,GAAA,EAAK,QAAQ,CAAA;AAC3C,EAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,GAAA,EAAK,OAAO,CAAA;AACzC,EAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,GAAA,EAAK,OAAO,CAAA;AACzC,EAAA,MAAM,OAAA,GAAU,cAAA,CAAe,GAAA,EAAK,SAAS,CAAA;AAC7C,EAAA,MAAM,SAAA,GAAY,cAAA,CAAe,GAAA,EAAK,QAAQ,CAAA;AAC9C,EAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,GAAA,EAAK,OAAO,CAAA;AACzC,EAAA,MAAM,MAAA,GAAS,cAAA,CAAe,GAAA,EAAK,QAAQ,CAAA;AAE3C,EAAA,IAAI,OAAA,SAAgB,OAAA,GAAU,OAAA;AAC9B,EAAA,IAAI,MAAA,SAAe,MAAA,GAAS,MAAA;AAC5B,EAAA,IAAI,KAAA,EAAO;AACV,IAAA,MAAM,CAAA,GAAI,IAAI,IAAA,CAAK,KAAK,CAAA;AACxB,IAAA,IAAI,CAAC,OAAO,KAAA,CAAM,CAAA,CAAE,SAAS,CAAA,SAAU,KAAA,GAAQ,CAAA;AAAA,EAChD;AACA,EAAA,IAAI,KAAA,EAAO;AACV,IAAA,MAAM,CAAA,GAAI,IAAI,IAAA,CAAK,KAAK,CAAA;AACxB,IAAA,IAAI,CAAC,OAAO,KAAA,CAAM,CAAA,CAAE,SAAS,CAAA,SAAU,KAAA,GAAQ,CAAA;AAAA,EAChD;AACA,EAAA,IAAI,OAAA,EAAS,MAAA,CAAO,OAAA,GAAU,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA;AACpE,EAAA,IAAI,SAAA,KAAc,SAAA,IAAa,SAAA,KAAc,QAAA,IAAY,cAAc,cAAA,EAAgB;AACtF,IAAA,MAAA,CAAO,MAAA,GAAS,SAAA;AAAA,EACjB;AACA,EAAA,IAAI,KAAA,EAAO;AACV,IAAA,MAAM,CAAA,GAAI,MAAA,CAAO,QAAA,CAAS,KAAA,EAAO,EAAE,CAAA;AACnC,IAAA,IAAI,CAAC,OAAO,KAAA,CAAM,CAAC,KAAK,CAAA,GAAI,CAAA,SAAU,KAAA,GAAQ,CAAA;AAAA,EAC/C;AACA,EAAA,IAAI,MAAA,EAAQ;AACX,IAAA,MAAM,CAAA,GAAI,MAAA,CAAO,QAAA,CAAS,MAAA,EAAQ,EAAE,CAAA;AACpC,IAAA,IAAI,CAAC,OAAO,KAAA,CAAM,CAAC,KAAK,CAAA,IAAK,CAAA,SAAU,MAAA,GAAS,CAAA;AAAA,EACjD;AAEA,EAAA,OAAO,MAAA;AACR;AAEA,eAAe,gBAAA,CAAiB,SAAkB,MAAA,EAAmC;AACpF,EAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,OAAA,CAAQ,GAAG,CAAA;AAC/B,EAAA,MAAM,MAAA,GAAS,iBAAiB,GAAG,CAAA;AAEnC,EAAA,IAAI;AACH,IAAA,MAAM,OAAA,GAAU,MAAM,MAAA,CAAO,KAAA,CAAM,MAAM,MAAM,CAAA;AAC/C,IAAA,OAAO,GAAG,OAAO,CAAA;AAAA,EAClB,SAAS,GAAA,EAAK;AACb,IAAA,MAAM,OAAA,GAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,4BAAA;AACrD,IAAA,OAAO,cAAc,OAAO,CAAA;AAAA,EAC7B;AACD;AAEA,eAAe,iBAAA,CAAkB,SAAkB,MAAA,EAAmC;AACrF,EAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,OAAA,CAAQ,GAAG,CAAA;AAC/B,EAAA,MAAM,MAAA,GAAS,cAAA,CAAe,GAAA,EAAK,QAAQ,CAAA,IAAK,MAAA;AAChD,EAAA,IAAI,MAAA,KAAW,MAAA,IAAU,MAAA,KAAW,KAAA,EAAO;AAC1C,IAAA,OAAO,WAAW,gCAAgC,CAAA;AAAA,EACnD;AAEA,EAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,GAAA,EAAK,OAAO,CAAA;AACzC,EAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,GAAA,EAAK,OAAO,CAAA;AAEzC,EAAA,MAAM,OAAA,GAAkE,EAAE,MAAA,EAAO;AACjF,EAAA,IAAI,KAAA,EAAO;AACV,IAAA,MAAM,CAAA,GAAI,IAAI,IAAA,CAAK,KAAK,CAAA;AACxB,IAAA,IAAI,CAAC,OAAO,KAAA,CAAM,CAAA,CAAE,SAAS,CAAA,UAAW,KAAA,GAAQ,CAAA;AAAA,EACjD;AACA,EAAA,IAAI,KAAA,EAAO;AACV,IAAA,MAAM,CAAA,GAAI,IAAI,IAAA,CAAK,KAAK,CAAA;AACxB,IAAA,IAAI,CAAC,OAAO,KAAA,CAAM,CAAA,CAAE,SAAS,CAAA,UAAW,KAAA,GAAQ,CAAA;AAAA,EACjD;AAEA,EAAA,IAAI;AACH,IAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,KAAA,CAAM,OAAO,OAAO,CAAA;AAClD,IAAA,MAAM,WAAA,GAAc,MAAA,KAAW,KAAA,GAAQ,UAAA,GAAa,kBAAA;AACpD,IAAA,OAAO,IAAI,SAAS,QAAA,EAAU;AAAA,MAC7B,MAAA,EAAQ,GAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACR,cAAA,EAAgB,WAAA;AAAA,QAChB,qBAAA,EAAuB,sCAAsC,MAAM,CAAA,CAAA;AAAA;AACpE,KACA,CAAA;AAAA,EACF,SAAS,GAAA,EAAK;AACb,IAAA,MAAM,OAAA,GAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,6BAAA;AACrD,IAAA,OAAO,cAAc,OAAO,CAAA;AAAA,EAC7B;AACD;AAEA,eAAe,qBAAqB,MAAA,EAAmC;AACtE,EAAA,IAAI;AACH,IAAA,MAAM,CAAC,MAAA,EAAQ,WAAW,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,MAC/C,MAAA,CAAO,MAAM,IAAA,EAAK;AAAA,MAClB,MAAA,CAAO,MAAM,KAAA,CAAM;AAAA,QAClB,KAAA,EAAO,IAAI,IAAA,CAAK,IAAA,CAAK,KAAI,GAAI,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAI,CAAA;AAAA,QAChD,KAAA,EAAO;AAAA,OACP;AAAA,KACD,CAAA;AAED,IAAA,MAAM,QAAA,GAAW,IAAI,GAAA,CAAI,MAAA,CAAO,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,CAAC,CAAA;AACrD,IAAA,MAAM,eAAe,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,WAAW,QAAQ,CAAA;AAC/D,IAAA,MAAM,gBAAgB,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,WAAW,SAAS,CAAA;AACjE,IAAA,MAAM,gBAAgB,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,WAAW,SAAS,CAAA;AAEjE,IAAA,MAAM,KAAA,GAAQ;AAAA,MACb,MAAA,EAAQ;AAAA,QACP,OAAO,MAAA,CAAO,MAAA;AAAA,QACd,QAAQ,YAAA,CAAa,MAAA;AAAA,QACrB,SAAS,aAAA,CAAc,MAAA;AAAA,QACvB,SAAS,aAAA,CAAc;AAAA,OACxB;AAAA,MACA,KAAA,EAAO;AAAA,QACN,OAAO,QAAA,CAAS;AAAA,OACjB;AAAA,MACA,KAAA,EAAO;AAAA,QACN,SAAS,WAAA,CAAY,MAAA;AAAA,QACrB,OAAA,EAAS,YAAY,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,MAAA,KAAW,SAAS,CAAA,CAAE,MAAA;AAAA,QAC3D,MAAA,EAAQ,YAAY,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,MAAA,KAAW,QAAQ,CAAA,CAAE,MAAA;AAAA,QACzD,WAAA,EAAa,YAAY,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,MAAA,KAAW,cAAc,CAAA,CAAE;AAAA;AACrE,KACD;AACA,IAAA,OAAO,GAAG,KAAK,CAAA;AAAA,EAChB,SAAS,GAAA,EAAK;AACb,IAAA,MAAM,OAAA,GAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,iCAAA;AACrD,IAAA,OAAO,cAAc,OAAO,CAAA;AAAA,EAC7B;AACD;AAWA,eAAsB,QAAA,CACrB,OAAA,EACA,MAAA,EACA,GAAA,EACA,QAAA,EACoB;AACpB,EAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,OAAA,CAAQ,GAAG,CAAA;AAC/B,EAAA,MAAM,MAAM,GAAA,CAAI,QAAA;AAChB,EAAA,MAAM,QAAA,GAAW,IAAI,UAAA,CAAW,QAAQ,IAAI,GAAA,CAAI,KAAA,CAAM,QAAA,CAAS,MAAM,CAAA,GAAI,GAAA;AACzE,EAAA,MAAM,WAAW,QAAA,CAAS,UAAA,CAAW,GAAG,CAAA,GAAI,QAAA,GAAW,IAAI,QAAQ,CAAA,CAAA;AACnE,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,CAAO,WAAA,EAAY;AAG1C,EAAA,IAAI,WAAW,SAAA,EAAW;AACzB,IAAA,IAAI,SAAS,UAAA,CAAW,OAAO,KAAK,QAAA,CAAS,UAAA,CAAW,eAAe,CAAA,EAAG;AACzE,MAAA,OAAO,IAAI,SAAS,IAAA,EAAM,EAAE,QAAQ,GAAA,EAAK,OAAA,EAAS,kBAAkB,CAAA;AAAA,IACrE;AAAA,EACD;AAIA,EAAA,IAAI,QAAA,KAAa,yCAAA,IAA6C,MAAA,KAAW,KAAA,EAAO;AAC/E,IAAA,IAAI,CAAC,GAAA,EAAK,OAAO,QAAA,CAAS,2BAA2B,CAAA;AACrD,IAAA,OAAO,KAAA,CAAM,GAAA,CAAI,WAAA,EAAa,CAAA;AAAA,EAC/B;AAEA,EAAA,IAAI,QAAA,KAAa,uCAAA,IAA2C,MAAA,KAAW,KAAA,EAAO;AAC7E,IAAA,IAAI,CAAC,GAAA,EAAK,OAAO,QAAA,CAAS,2BAA2B,CAAA;AACrD,IAAA,OAAO,KAAA,CAAM,GAAA,CAAI,4BAAA,EAA8B,CAAA;AAAA,EAChD;AAEA,EAAA,IAAI,QAAA,KAAa,eAAA,IAAmB,MAAA,KAAW,MAAA,EAAQ;AACtD,IAAA,IAAI,CAAC,GAAA,EAAK,OAAO,QAAA,CAAS,2BAA2B,CAAA;AACrD,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI;AACH,MAAA,IAAA,GAAQ,MAAM,QAAQ,IAAA,EAAK;AAAA,IAC5B,CAAA,CAAA,MAAQ;AACP,MAAA,OAAO,QAAA,CAAS,iBAAA,EAAmB,mBAAA,EAAqB,GAAG,CAAA;AAAA,IAC5D;AACA,IAAA,IAAI;AACH,MAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,cAAA,CAAe,IAAgD,CAAA;AACxF,MAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACpB,QAAA,OAAO,QAAA,CAAS,yBAAA,EAA2B,MAAA,CAAO,KAAA,CAAM,SAAS,GAAG,CAAA;AAAA,MACrE;AACA,MAAA,OAAO,UAAA,CAAW,MAAA,CAAO,IAAA,EAAM,GAAG,CAAA;AAAA,IACnC,SAAS,GAAA,EAAK;AACb,MAAA,MAAM,OAAA,GAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,qBAAA;AACrD,MAAA,OAAO,QAAA,CAAS,cAAA,EAAgB,OAAA,EAAS,GAAG,CAAA;AAAA,IAC7C;AAAA,EACD;AAEA,EAAA,IAAI,QAAA,KAAa,gBAAA,IAAoB,MAAA,KAAW,KAAA,EAAO;AACtD,IAAA,IAAI,CAAC,GAAA,EAAK,OAAO,QAAA,CAAS,2BAA2B,CAAA;AACrD,IAAA,IAAI;AACH,MAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,SAAA,CAAU,OAAO,CAAA;AAC1C,MAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACpB,QAAA,IAAI,MAAA,CAAO,KAAA,CAAM,IAAA,KAAS,gBAAA,EAAkB;AAC3C,UAAA,MAAM,OAAA,GAAU,OAAO,KAAA,CAAM,OAAA;AAG7B,UAAA,IAAI,SAAS,SAAA,EAAW;AACvB,YAAA,MAAM,QAAA,GAAW,IAAI,GAAA,CAAI,OAAA,CAAQ,SAAS,CAAA;AAC1C,YAAA,IAAI,QAAQ,QAAA,EAAU;AACrB,cAAA,QAAA,CAAS,YAAA,CAAa,GAAA,CAAI,UAAA,EAAY,OAAA,CAAQ,QAAQ,CAAA;AAAA,YACvD;AACA,YAAA,OAAO,QAAA,CAAS,QAAA,CAAS,QAAA,CAAS,QAAA,IAAY,GAAG,CAAA;AAAA,UAClD;AAAA,QACD;AACA,QAAA,OAAO,QAAA,CAAS,OAAO,KAAA,CAAM,IAAA,CAAK,aAAY,EAAG,MAAA,CAAO,KAAA,CAAM,OAAA,EAAS,GAAG,CAAA;AAAA,MAC3E;AACA,MAAA,OAAO,QAAA,CAAS,QAAA,CAAS,MAAA,CAAO,IAAA,CAAK,aAAa,GAAG,CAAA;AAAA,IACtD,SAAS,GAAA,EAAK;AACb,MAAA,MAAM,OAAA,GAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,sBAAA;AACrD,MAAA,OAAO,QAAA,CAAS,cAAA,EAAgB,OAAA,EAAS,GAAG,CAAA;AAAA,IAC7C;AAAA,EACD;AAEA,EAAA,IAAI,QAAA,KAAa,YAAA,IAAgB,MAAA,KAAW,MAAA,EAAQ;AACnD,IAAA,IAAI,CAAC,GAAA,EAAK,OAAO,QAAA,CAAS,2BAA2B,CAAA;AACrD,IAAA,IAAI;AACH,MAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA;AACtC,MAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACpB,QAAA,MAAM,MAAA,GAAS,MAAA,CAAO,KAAA,CAAM,IAAA,KAAS,mBAAmB,GAAA,GAAM,GAAA;AAC9D,QAAA,OAAO,UAAA;AAAA,UACN;AAAA,YACC,KAAA,EAAO,MAAA,CAAO,KAAA,CAAM,IAAA,CAAK,WAAA,EAAY;AAAA,YACrC,iBAAA,EAAmB,OAAO,KAAA,CAAM;AAAA,WACjC;AAAA,UACA;AAAA,SACD;AAAA,MACD;AACA,MAAA,OAAO,UAAA,CAAW,OAAO,IAAI,CAAA;AAAA,IAC9B,SAAS,GAAA,EAAK;AACb,MAAA,MAAM,OAAA,GAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,uBAAA;AACrD,MAAA,OAAO,WAAW,EAAE,KAAA,EAAO,gBAAgB,iBAAA,EAAmB,OAAA,IAAW,GAAG,CAAA;AAAA,IAC7E;AAAA,EACD;AAIA,EAAA,IAAI,aAAa,SAAA,EAAW;AAC3B,IAAA,IAAI,MAAA,KAAW,KAAA,EAAO,OAAO,eAAA,CAAgB,SAAS,MAAM,CAAA;AAC5D,IAAA,IAAI,MAAA,KAAW,MAAA,EAAQ,OAAO,iBAAA,CAAkB,SAAS,MAAM,CAAA;AAC/D,IAAA,OAAO,gBAAA,EAAiB;AAAA,EACzB;AAGA,EAAA,MAAM,WAAA,GAAc,6BAAA,CAA8B,IAAA,CAAK,QAAQ,CAAA;AAC/D,EAAA,IAAI,WAAA,EAAa;AAChB,IAAA,MAAM,EAAA,GAAK,YAAY,CAAC,CAAA;AACxB,IAAA,IAAI,CAAC,EAAA,EAAI,OAAO,UAAA,CAAW,kBAAkB,CAAA;AAC7C,IAAA,IAAI,MAAA,KAAW,MAAA,EAAQ,OAAO,iBAAA,CAAkB,IAAI,MAAM,CAAA;AAC1D,IAAA,OAAO,gBAAA,EAAiB;AAAA,EACzB;AAGA,EAAA,MAAM,UAAA,GAAa,qBAAA,CAAsB,IAAA,CAAK,QAAQ,CAAA;AACtD,EAAA,IAAI,UAAA,EAAY;AACf,IAAA,MAAM,EAAA,GAAK,WAAW,CAAC,CAAA;AACvB,IAAA,IAAI,CAAC,EAAA,EAAI,OAAO,UAAA,CAAW,kBAAkB,CAAA;AAC7C,IAAA,IAAI,MAAA,KAAW,KAAA,EAAO,OAAO,cAAA,CAAe,IAAI,MAAM,CAAA;AACtD,IAAA,IAAI,WAAW,OAAA,EAAS,OAAO,iBAAA,CAAkB,EAAA,EAAI,SAAS,MAAM,CAAA;AACpE,IAAA,IAAI,MAAA,KAAW,QAAA,EAAU,OAAO,iBAAA,CAAkB,IAAI,MAAM,CAAA;AAC5D,IAAA,OAAO,gBAAA,EAAiB;AAAA,EACzB;AAIA,EAAA,IAAI,aAAa,YAAA,EAAc;AAC9B,IAAA,IAAI,MAAA,KAAW,MAAA,EAAQ,OAAO,eAAA,CAAgB,SAAS,MAAM,CAAA;AAC7D,IAAA,OAAO,gBAAA,EAAiB;AAAA,EACzB;AAEA,EAAA,IAAI,aAAa,kBAAA,EAAoB;AACpC,IAAA,IAAI,MAAA,KAAW,MAAA,EAAQ,OAAO,sBAAA,CAAuB,SAAS,MAAM,CAAA;AACpE,IAAA,OAAO,gBAAA,EAAiB;AAAA,EACzB;AAIA,EAAA,IAAI,aAAa,cAAA,EAAgB;AAChC,IAAA,IAAI,MAAA,KAAW,MAAA,EAAQ,OAAO,sBAAA,CAAuB,SAAS,MAAM,CAAA;AACpE,IAAA,OAAO,gBAAA,EAAiB;AAAA,EACzB;AAGA,EAAA,MAAM,eAAA,GAAkB,0BAAA,CAA2B,IAAA,CAAK,QAAQ,CAAA;AAChE,EAAA,IAAI,eAAA,EAAiB;AACpB,IAAA,MAAM,EAAA,GAAK,gBAAgB,CAAC,CAAA;AAC5B,IAAA,IAAI,CAAC,EAAA,EAAI,OAAO,UAAA,CAAW,uBAAuB,CAAA;AAClD,IAAA,IAAI,MAAA,KAAW,QAAA,EAAU,OAAO,sBAAA,CAAuB,IAAI,MAAM,CAAA;AACjE,IAAA,IAAI,MAAA,KAAW,KAAA,EAAO,OAAO,oBAAA,CAAqB,IAAI,MAAM,CAAA;AAC5D,IAAA,OAAO,gBAAA,EAAiB;AAAA,EACzB;AAIA,EAAA,IAAI,aAAa,eAAA,EAAiB;AACjC,IAAA,IAAI,MAAA,KAAW,KAAA,EAAO,OAAO,iBAAA,CAAkB,SAAS,MAAM,CAAA;AAC9D,IAAA,OAAO,gBAAA,EAAiB;AAAA,EACzB;AAEA,EAAA,IAAI,aAAa,QAAA,EAAU;AAC1B,IAAA,IAAI,MAAA,KAAW,KAAA,EAAO,OAAO,gBAAA,CAAiB,SAAS,MAAM,CAAA;AAC7D,IAAA,OAAO,gBAAA,EAAiB;AAAA,EACzB;AAIA,EAAA,IAAI,aAAa,kBAAA,EAAoB;AACpC,IAAA,IAAI,MAAA,KAAW,KAAA,EAAO,OAAO,oBAAA,CAAqB,MAAM,CAAA;AACxD,IAAA,OAAO,gBAAA,EAAiB;AAAA,EACzB;AAEA,EAAA,IAAI,aAAa,mBAAA,EAAqB;AACrC,IAAA,IAAI,MAAA,KAAW,KAAA,EAAO,OAAO,eAAA,CAAgB,SAAS,MAAM,CAAA;AAC5D,IAAA,OAAO,gBAAA,EAAiB;AAAA,EACzB;AAEA,EAAA,IAAI,aAAa,kBAAA,EAAoB;AACpC,IAAA,IAAI,MAAA,KAAW,KAAA,EAAO,OAAO,gBAAA,CAAiB,SAAS,MAAM,CAAA;AAC7D,IAAA,OAAO,gBAAA,EAAiB;AAAA,EACzB;AAEA,EAAA,OAAO,SAAS,iBAAiB,CAAA;AAClC;;;ACnoBO,SAAS,UAAA,CAAW,QAAgB,OAAA,EAA2C;AACrF,EAAA,MAAM,MAAM,OAAA,EAAS,GAAA;AACrB,EAAA,MAAM,QAAA,GAAW,SAAS,QAAA,IAAY,aAAA;AAEtC,EAAA,OAAO,kBAAA,CAAmB,OAAO,KAAA,KAAmB;AAGnD,IAAA,MAAM,GAAA,GAAM,cAAc,KAAK,CAAA;AAC/B,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,IAAU,KAAA;AAG/B,IAAA,MAAM,OAAA,GAAU,IAAI,OAAA,EAAQ;AAC5B,IAAA,MAAM,aAAa,KAAA,CAAM,OAAA;AACzB,IAAA,UAAA,CAAW,OAAA,CAAQ,CAAC,KAAA,EAAO,GAAA,KAAQ;AAClC,MAAA,OAAA,CAAQ,GAAA,CAAI,KAAK,KAAK,CAAA;AAAA,IACvB,CAAC,CAAA;AAID,IAAA,IAAI,IAAA,GAAwB,IAAA;AAC5B,IAAA,IAAI,MAAA,KAAW,KAAA,IAAS,MAAA,KAAW,MAAA,IAAU,WAAW,SAAA,EAAW;AAClE,MAAA,IAAI;AACH,QAAA,MAAM,GAAA,GAAM,MAAM,QAAA,CAAS,KAAK,CAAA;AAChC,QAAA,IAAI,GAAA,KAAQ,KAAA,CAAA,IAAa,GAAA,KAAQ,IAAA,EAAM;AACtC,UAAA,IAAA,GAAO,IAAA,CAAK,UAAU,GAAG,CAAA;AACzB,UAAA,OAAA,CAAQ,GAAA,CAAI,gBAAgB,kBAAkB,CAAA;AAAA,QAC/C;AAAA,MACD,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACD;AAEA,IAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAQ,GAAA,CAAI,QAAA,IAAY,EAAE,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAM,CAAA;AACrE,IAAA,MAAM,WAAW,MAAM,QAAA,CAAS,OAAA,EAAS,MAAA,EAAQ,KAAK,QAAQ,CAAA;AAG9D,IAAA,iBAAA,CAAkB,KAAA,EAAO,SAAS,MAAM,CAAA;AACxC,IAAA,QAAA,CAAS,OAAA,CAAQ,OAAA,CAAQ,CAAC,KAAA,EAAO,GAAA,KAAQ;AACxC,MAAA,SAAA,CAAU,KAAA,EAAO,KAAK,KAAK,CAAA;AAAA,IAC5B,CAAC,CAAA;AAID,IAAA,IAAI,QAAA,CAAS,MAAA,KAAW,GAAA,IAAO,QAAA,CAAS,SAAS,IAAA,EAAM;AACtD,MAAA,OAAO,IAAA;AAAA,IACR;AACA,IAAA,OAAO,SAAS,IAAA,EAAK;AAAA,EACtB,CAAC,CAAA;AACF","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 { EventHandler, H3Event } from \"h3\";\nimport { defineEventHandler, getRequestURL, readBody, setHeader, setResponseStatus } from \"h3\";\nimport type { Kavach } from \"kavachos\";\nimport type { McpAuthModule } from \"kavachos/mcp\";\nimport { dispatch } from \"./dispatch.js\";\n\nexport interface KavachNuxtOptions {\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 catch-all segment.\n\t * Defaults to `/api/kavach`.\n\t *\n\t * @example `/api/auth/kavach`\n\t */\n\tbasePath?: string;\n}\n\n/**\n * Create a Nuxt/H3 event handler for all KavachOS REST API routes.\n *\n * Mount in `server/api/kavach/[...].ts`:\n *\n * @example\n * ```typescript\n * import { createKavach } from 'kavachos';\n * import { kavachNuxt } from '@kavachos/nuxt';\n *\n * const kavach = createKavach({ database: { provider: 'sqlite', url: 'kavach.db' } });\n * export default kavachNuxt(kavach);\n * ```\n *\n * With MCP OAuth 2.1:\n * ```typescript\n * import { createMcpModule } from 'kavachos/mcp';\n * const mcp = createMcpModule({ ... });\n * export default kavachNuxt(kavach, { mcp });\n * ```\n */\nexport function kavachNuxt(kavach: Kavach, options?: KavachNuxtOptions): EventHandler {\n\tconst mcp = options?.mcp;\n\tconst basePath = options?.basePath ?? \"/api/kavach\";\n\n\treturn defineEventHandler(async (event: H3Event) => {\n\t\t// Build a standard Request from the H3 event so we can delegate to the\n\t\t// shared dispatcher without duplicating any routing logic.\n\t\tconst url = getRequestURL(event);\n\t\tconst method = event.method ?? \"GET\";\n\n\t\t// Collect headers from the H3 event\n\t\tconst headers = new Headers();\n\t\tconst rawHeaders = event.headers;\n\t\trawHeaders.forEach((value, key) => {\n\t\t\theaders.set(key, value);\n\t\t});\n\n\t\t// For methods that carry a body, read it from H3 and re-serialise as JSON\n\t\t// so the standard Request.json() call in dispatch works correctly.\n\t\tlet body: BodyInit | null = null;\n\t\tif (method !== \"GET\" && method !== \"HEAD\" && method !== \"OPTIONS\") {\n\t\t\ttry {\n\t\t\t\tconst raw = await readBody(event);\n\t\t\t\tif (raw !== undefined && raw !== null) {\n\t\t\t\t\tbody = JSON.stringify(raw);\n\t\t\t\t\theaders.set(\"Content-Type\", \"application/json\");\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// body stays null — dispatch will handle the parse error\n\t\t\t}\n\t\t}\n\n\t\tconst request = new Request(url.toString(), { method, headers, body });\n\t\tconst response = await dispatch(request, kavach, mcp, basePath);\n\n\t\t// Write the Response back through H3\n\t\tsetResponseStatus(event, response.status);\n\t\tresponse.headers.forEach((value, key) => {\n\t\t\tsetHeader(event, key, value);\n\t\t});\n\n\t\t// H3 route handlers can return a string, Buffer, or null; return the\n\t\t// body text directly so H3 sends it as-is.\n\t\tif (response.status === 204 || response.body === null) {\n\t\t\treturn null;\n\t\t}\n\t\treturn response.text();\n\t});\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kavachos/nuxt",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.3",
|
|
4
4
|
"description": "Nuxt adapter for KavachOS - exposes agent auth as HTTP REST endpoints via H3",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
"peerDependencies": {
|
|
33
33
|
"nuxt": ">=3.0.0",
|
|
34
34
|
"zod": ">=3.0.0",
|
|
35
|
-
"kavachos": "0.0.
|
|
35
|
+
"kavachos": "0.0.3"
|
|
36
36
|
},
|
|
37
37
|
"devDependencies": {
|
|
38
38
|
"h3": "^1.13.0",
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
"tsup": "^8.4.0",
|
|
41
41
|
"typescript": "^5.8.0",
|
|
42
42
|
"zod": "^3.24.0",
|
|
43
|
-
"kavachos": "0.0.
|
|
43
|
+
"kavachos": "0.0.3"
|
|
44
44
|
},
|
|
45
45
|
"scripts": {
|
|
46
46
|
"build": "tsup",
|