kavachos 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,153 @@
1
+ import { __export } from './chunk-PZ5AY32C.js';
2
+ import { sqliteTable, integer, text } from 'drizzle-orm/sqlite-core';
3
+
4
+ // src/db/schema.ts
5
+ var schema_exports = {};
6
+ __export(schema_exports, {
7
+ agents: () => agents,
8
+ auditLogs: () => auditLogs,
9
+ delegationChains: () => delegationChains,
10
+ mcpServers: () => mcpServers,
11
+ oauthAccessTokens: () => oauthAccessTokens,
12
+ oauthAuthorizationCodes: () => oauthAuthorizationCodes,
13
+ oauthClients: () => oauthClients,
14
+ permissions: () => permissions,
15
+ rateLimits: () => rateLimits,
16
+ users: () => users
17
+ });
18
+ var users = sqliteTable("kavach_users", {
19
+ id: text("id").primaryKey(),
20
+ email: text("email").notNull().unique(),
21
+ name: text("name"),
22
+ externalId: text("external_id"),
23
+ // ID from external auth (better-auth, Auth.js, etc.)
24
+ externalProvider: text("external_provider"),
25
+ // "better-auth", "authjs", "clerk", etc.
26
+ metadata: text("metadata", { mode: "json" }).$type(),
27
+ createdAt: integer("created_at", { mode: "timestamp" }).notNull(),
28
+ updatedAt: integer("updated_at", { mode: "timestamp" }).notNull()
29
+ });
30
+ var agents = sqliteTable("kavach_agents", {
31
+ id: text("id").primaryKey(),
32
+ ownerId: text("owner_id").notNull().references(() => users.id),
33
+ name: text("name").notNull(),
34
+ type: text("type", { enum: ["autonomous", "delegated", "service"] }).notNull(),
35
+ status: text("status", { enum: ["active", "revoked", "expired"] }).notNull().default("active"),
36
+ tokenHash: text("token_hash").notNull(),
37
+ // hashed agent token
38
+ tokenPrefix: text("token_prefix").notNull(),
39
+ // first 8 chars for identification
40
+ expiresAt: integer("expires_at", { mode: "timestamp" }),
41
+ lastActiveAt: integer("last_active_at", { mode: "timestamp" }),
42
+ metadata: text("metadata", { mode: "json" }).$type(),
43
+ createdAt: integer("created_at", { mode: "timestamp" }).notNull(),
44
+ updatedAt: integer("updated_at", { mode: "timestamp" }).notNull()
45
+ });
46
+ var permissions = sqliteTable("kavach_permissions", {
47
+ id: text("id").primaryKey(),
48
+ agentId: text("agent_id").notNull().references(() => agents.id, { onDelete: "cascade" }),
49
+ resource: text("resource").notNull(),
50
+ // e.g. "mcp:github:*", "tool:file_read"
51
+ actions: text("actions", { mode: "json" }).notNull().$type(),
52
+ // ["read", "write", "execute"]
53
+ constraints: text("constraints", { mode: "json" }).$type(),
54
+ createdAt: integer("created_at", { mode: "timestamp" }).notNull()
55
+ });
56
+ var delegationChains = sqliteTable("kavach_delegation_chains", {
57
+ id: text("id").primaryKey(),
58
+ fromAgentId: text("from_agent_id").notNull().references(() => agents.id),
59
+ toAgentId: text("to_agent_id").notNull().references(() => agents.id),
60
+ permissions: text("permissions", { mode: "json" }).notNull().$type(),
61
+ depth: integer("depth").notNull().default(1),
62
+ maxDepth: integer("max_depth").notNull().default(3),
63
+ status: text("status", { enum: ["active", "revoked", "expired"] }).notNull().default("active"),
64
+ expiresAt: integer("expires_at", { mode: "timestamp" }).notNull(),
65
+ createdAt: integer("created_at", { mode: "timestamp" }).notNull()
66
+ });
67
+ var auditLogs = sqliteTable("kavach_audit_logs", {
68
+ id: text("id").primaryKey(),
69
+ agentId: text("agent_id").notNull().references(() => agents.id),
70
+ userId: text("user_id").notNull().references(() => users.id),
71
+ action: text("action").notNull(),
72
+ // "execute", "read", "write", "delete"
73
+ resource: text("resource").notNull(),
74
+ // "mcp:github:create_issue"
75
+ parameters: text("parameters", { mode: "json" }).$type(),
76
+ result: text("result", { enum: ["allowed", "denied", "rate_limited"] }).notNull(),
77
+ reason: text("reason"),
78
+ // why denied/rate_limited
79
+ durationMs: integer("duration_ms").notNull(),
80
+ tokensCost: integer("tokens_cost"),
81
+ ip: text("ip"),
82
+ userAgent: text("user_agent"),
83
+ timestamp: integer("timestamp", { mode: "timestamp" }).notNull()
84
+ });
85
+ var rateLimits = sqliteTable("kavach_rate_limits", {
86
+ id: text("id").primaryKey(),
87
+ agentId: text("agent_id").notNull().references(() => agents.id, { onDelete: "cascade" }),
88
+ resource: text("resource").notNull(),
89
+ windowStart: integer("window_start", { mode: "timestamp" }).notNull(),
90
+ count: integer("count").notNull().default(0)
91
+ });
92
+ var mcpServers = sqliteTable("kavach_mcp_servers", {
93
+ id: text("id").primaryKey(),
94
+ name: text("name").notNull(),
95
+ endpoint: text("endpoint").notNull().unique(),
96
+ tools: text("tools", { mode: "json" }).notNull().$type(),
97
+ authRequired: integer("auth_required", { mode: "boolean" }).notNull().default(true),
98
+ rateLimitRpm: integer("rate_limit_rpm"),
99
+ status: text("status", { enum: ["active", "inactive"] }).notNull().default("active"),
100
+ createdAt: integer("created_at", { mode: "timestamp" }).notNull(),
101
+ updatedAt: integer("updated_at", { mode: "timestamp" }).notNull()
102
+ });
103
+ var oauthClients = sqliteTable("kavach_oauth_clients", {
104
+ id: text("id").primaryKey(),
105
+ clientId: text("client_id").notNull().unique(),
106
+ clientSecret: text("client_secret"),
107
+ // null for public clients
108
+ clientName: text("client_name"),
109
+ clientUri: text("client_uri"),
110
+ redirectUris: text("redirect_uris", { mode: "json" }).notNull().$type(),
111
+ grantTypes: text("grant_types", { mode: "json" }).notNull().$type().default(["authorization_code"]),
112
+ responseTypes: text("response_types", { mode: "json" }).notNull().$type().default(["code"]),
113
+ tokenEndpointAuthMethod: text("token_endpoint_auth_method").notNull().default("client_secret_basic"),
114
+ type: text("type", { enum: ["public", "confidential"] }).notNull().default("confidential"),
115
+ disabled: integer("disabled", { mode: "boolean" }).notNull().default(false),
116
+ metadata: text("metadata", { mode: "json" }).$type(),
117
+ createdAt: integer("created_at", { mode: "timestamp" }).notNull(),
118
+ updatedAt: integer("updated_at", { mode: "timestamp" }).notNull()
119
+ });
120
+ var oauthAccessTokens = sqliteTable("kavach_oauth_access_tokens", {
121
+ id: text("id").primaryKey(),
122
+ accessToken: text("access_token").notNull().unique(),
123
+ refreshToken: text("refresh_token").unique(),
124
+ clientId: text("client_id").notNull().references(() => oauthClients.clientId),
125
+ userId: text("user_id").notNull().references(() => users.id),
126
+ scopes: text("scopes").notNull(),
127
+ // space-separated
128
+ resource: text("resource"),
129
+ // RFC 8707 - audience binding
130
+ accessTokenExpiresAt: integer("access_token_expires_at", { mode: "timestamp" }).notNull(),
131
+ refreshTokenExpiresAt: integer("refresh_token_expires_at", { mode: "timestamp" }),
132
+ createdAt: integer("created_at", { mode: "timestamp" }).notNull()
133
+ });
134
+ var oauthAuthorizationCodes = sqliteTable("kavach_oauth_authorization_codes", {
135
+ id: text("id").primaryKey(),
136
+ code: text("code").notNull().unique(),
137
+ clientId: text("client_id").notNull().references(() => oauthClients.clientId),
138
+ userId: text("user_id").notNull().references(() => users.id),
139
+ redirectUri: text("redirect_uri").notNull(),
140
+ scopes: text("scopes").notNull(),
141
+ codeChallenge: text("code_challenge"),
142
+ // PKCE
143
+ codeChallengeMethod: text("code_challenge_method"),
144
+ // "S256"
145
+ resource: text("resource"),
146
+ // RFC 8707
147
+ expiresAt: integer("expires_at", { mode: "timestamp" }).notNull(),
148
+ createdAt: integer("created_at", { mode: "timestamp" }).notNull()
149
+ });
150
+
151
+ export { agents, auditLogs, delegationChains, mcpServers, oauthAccessTokens, oauthAuthorizationCodes, oauthClients, permissions, rateLimits, schema_exports, users };
152
+ //# sourceMappingURL=chunk-XSYYQH75.js.map
153
+ //# sourceMappingURL=chunk-XSYYQH75.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/db/schema.ts"],"names":[],"mappings":"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","file":"chunk-XSYYQH75.js","sourcesContent":["import { integer, sqliteTable, text } from \"drizzle-orm/sqlite-core\";\n\n// ============================================================\n// Users (basic human identity - integrates with external auth)\n// ============================================================\nexport const users = sqliteTable(\"kavach_users\", {\n\tid: text(\"id\").primaryKey(),\n\temail: text(\"email\").notNull().unique(),\n\tname: text(\"name\"),\n\texternalId: text(\"external_id\"), // ID from external auth (better-auth, Auth.js, etc.)\n\texternalProvider: text(\"external_provider\"), // \"better-auth\", \"authjs\", \"clerk\", etc.\n\tmetadata: text(\"metadata\", { mode: \"json\" }).$type<Record<string, unknown>>(),\n\tcreatedAt: integer(\"created_at\", { mode: \"timestamp\" }).notNull(),\n\tupdatedAt: integer(\"updated_at\", { mode: \"timestamp\" }).notNull(),\n});\n\n// ============================================================\n// Agents (the core differentiator - AI agent identities)\n// ============================================================\nexport const agents = sqliteTable(\"kavach_agents\", {\n\tid: text(\"id\").primaryKey(),\n\townerId: text(\"owner_id\")\n\t\t.notNull()\n\t\t.references(() => users.id),\n\tname: text(\"name\").notNull(),\n\ttype: text(\"type\", { enum: [\"autonomous\", \"delegated\", \"service\"] }).notNull(),\n\tstatus: text(\"status\", { enum: [\"active\", \"revoked\", \"expired\"] })\n\t\t.notNull()\n\t\t.default(\"active\"),\n\ttokenHash: text(\"token_hash\").notNull(), // hashed agent token\n\ttokenPrefix: text(\"token_prefix\").notNull(), // first 8 chars for identification\n\texpiresAt: integer(\"expires_at\", { mode: \"timestamp\" }),\n\tlastActiveAt: integer(\"last_active_at\", { mode: \"timestamp\" }),\n\tmetadata: text(\"metadata\", { mode: \"json\" }).$type<Record<string, unknown>>(),\n\tcreatedAt: integer(\"created_at\", { mode: \"timestamp\" }).notNull(),\n\tupdatedAt: integer(\"updated_at\", { mode: \"timestamp\" }).notNull(),\n});\n\n// ============================================================\n// Permissions (scoped access control per agent)\n// ============================================================\nexport const permissions = sqliteTable(\"kavach_permissions\", {\n\tid: text(\"id\").primaryKey(),\n\tagentId: text(\"agent_id\")\n\t\t.notNull()\n\t\t.references(() => agents.id, { onDelete: \"cascade\" }),\n\tresource: text(\"resource\").notNull(), // e.g. \"mcp:github:*\", \"tool:file_read\"\n\tactions: text(\"actions\", { mode: \"json\" }).notNull().$type<string[]>(), // [\"read\", \"write\", \"execute\"]\n\tconstraints: text(\"constraints\", { mode: \"json\" }).$type<PermissionConstraintsRow>(),\n\tcreatedAt: integer(\"created_at\", { mode: \"timestamp\" }).notNull(),\n});\n\ninterface PermissionConstraintsRow {\n\tmaxCallsPerHour?: number;\n\tallowedArgPatterns?: string[];\n\trequireApproval?: boolean;\n\ttimeWindow?: { start: string; end: string };\n\tipAllowlist?: string[];\n}\n\n// ============================================================\n// Delegation Chains (agent-to-agent permission delegation)\n// ============================================================\nexport const delegationChains = sqliteTable(\"kavach_delegation_chains\", {\n\tid: text(\"id\").primaryKey(),\n\tfromAgentId: text(\"from_agent_id\")\n\t\t.notNull()\n\t\t.references(() => agents.id),\n\ttoAgentId: text(\"to_agent_id\")\n\t\t.notNull()\n\t\t.references(() => agents.id),\n\tpermissions: text(\"permissions\", { mode: \"json\" }).notNull().$type<DelegationPermissionRow[]>(),\n\tdepth: integer(\"depth\").notNull().default(1),\n\tmaxDepth: integer(\"max_depth\").notNull().default(3),\n\tstatus: text(\"status\", { enum: [\"active\", \"revoked\", \"expired\"] })\n\t\t.notNull()\n\t\t.default(\"active\"),\n\texpiresAt: integer(\"expires_at\", { mode: \"timestamp\" }).notNull(),\n\tcreatedAt: integer(\"created_at\", { mode: \"timestamp\" }).notNull(),\n});\n\ninterface DelegationPermissionRow {\n\tresource: string;\n\tactions: string[];\n}\n\n// ============================================================\n// Audit Logs (immutable record of every agent action)\n// ============================================================\nexport const auditLogs = sqliteTable(\"kavach_audit_logs\", {\n\tid: text(\"id\").primaryKey(),\n\tagentId: text(\"agent_id\")\n\t\t.notNull()\n\t\t.references(() => agents.id),\n\tuserId: text(\"user_id\")\n\t\t.notNull()\n\t\t.references(() => users.id),\n\taction: text(\"action\").notNull(), // \"execute\", \"read\", \"write\", \"delete\"\n\tresource: text(\"resource\").notNull(), // \"mcp:github:create_issue\"\n\tparameters: text(\"parameters\", { mode: \"json\" }).$type<Record<string, unknown>>(),\n\tresult: text(\"result\", { enum: [\"allowed\", \"denied\", \"rate_limited\"] }).notNull(),\n\treason: text(\"reason\"), // why denied/rate_limited\n\tdurationMs: integer(\"duration_ms\").notNull(),\n\ttokensCost: integer(\"tokens_cost\"),\n\tip: text(\"ip\"),\n\tuserAgent: text(\"user_agent\"),\n\ttimestamp: integer(\"timestamp\", { mode: \"timestamp\" }).notNull(),\n});\n\n// ============================================================\n// Rate Limit Counters (track per-agent call rates)\n// ============================================================\nexport const rateLimits = sqliteTable(\"kavach_rate_limits\", {\n\tid: text(\"id\").primaryKey(),\n\tagentId: text(\"agent_id\")\n\t\t.notNull()\n\t\t.references(() => agents.id, { onDelete: \"cascade\" }),\n\tresource: text(\"resource\").notNull(),\n\twindowStart: integer(\"window_start\", { mode: \"timestamp\" }).notNull(),\n\tcount: integer(\"count\").notNull().default(0),\n});\n\n// ============================================================\n// MCP Servers (registered MCP servers)\n// ============================================================\nexport const mcpServers = sqliteTable(\"kavach_mcp_servers\", {\n\tid: text(\"id\").primaryKey(),\n\tname: text(\"name\").notNull(),\n\tendpoint: text(\"endpoint\").notNull().unique(),\n\ttools: text(\"tools\", { mode: \"json\" }).notNull().$type<string[]>(),\n\tauthRequired: integer(\"auth_required\", { mode: \"boolean\" }).notNull().default(true),\n\trateLimitRpm: integer(\"rate_limit_rpm\"),\n\tstatus: text(\"status\", { enum: [\"active\", \"inactive\"] })\n\t\t.notNull()\n\t\t.default(\"active\"),\n\tcreatedAt: integer(\"created_at\", { mode: \"timestamp\" }).notNull(),\n\tupdatedAt: integer(\"updated_at\", { mode: \"timestamp\" }).notNull(),\n});\n\n// ============================================================\n// OAuth Clients (for MCP OAuth 2.1 - dynamic client registration)\n// ============================================================\nexport const oauthClients = sqliteTable(\"kavach_oauth_clients\", {\n\tid: text(\"id\").primaryKey(),\n\tclientId: text(\"client_id\").notNull().unique(),\n\tclientSecret: text(\"client_secret\"), // null for public clients\n\tclientName: text(\"client_name\"),\n\tclientUri: text(\"client_uri\"),\n\tredirectUris: text(\"redirect_uris\", { mode: \"json\" }).notNull().$type<string[]>(),\n\tgrantTypes: text(\"grant_types\", { mode: \"json\" })\n\t\t.notNull()\n\t\t.$type<string[]>()\n\t\t.default([\"authorization_code\"]),\n\tresponseTypes: text(\"response_types\", { mode: \"json\" })\n\t\t.notNull()\n\t\t.$type<string[]>()\n\t\t.default([\"code\"]),\n\ttokenEndpointAuthMethod: text(\"token_endpoint_auth_method\")\n\t\t.notNull()\n\t\t.default(\"client_secret_basic\"),\n\ttype: text(\"type\", { enum: [\"public\", \"confidential\"] })\n\t\t.notNull()\n\t\t.default(\"confidential\"),\n\tdisabled: integer(\"disabled\", { mode: \"boolean\" }).notNull().default(false),\n\tmetadata: text(\"metadata\", { mode: \"json\" }).$type<Record<string, unknown>>(),\n\tcreatedAt: integer(\"created_at\", { mode: \"timestamp\" }).notNull(),\n\tupdatedAt: integer(\"updated_at\", { mode: \"timestamp\" }).notNull(),\n});\n\n// ============================================================\n// OAuth Access Tokens (issued tokens for MCP auth)\n// ============================================================\nexport const oauthAccessTokens = sqliteTable(\"kavach_oauth_access_tokens\", {\n\tid: text(\"id\").primaryKey(),\n\taccessToken: text(\"access_token\").notNull().unique(),\n\trefreshToken: text(\"refresh_token\").unique(),\n\tclientId: text(\"client_id\")\n\t\t.notNull()\n\t\t.references(() => oauthClients.clientId),\n\tuserId: text(\"user_id\")\n\t\t.notNull()\n\t\t.references(() => users.id),\n\tscopes: text(\"scopes\").notNull(), // space-separated\n\tresource: text(\"resource\"), // RFC 8707 - audience binding\n\taccessTokenExpiresAt: integer(\"access_token_expires_at\", { mode: \"timestamp\" }).notNull(),\n\trefreshTokenExpiresAt: integer(\"refresh_token_expires_at\", { mode: \"timestamp\" }),\n\tcreatedAt: integer(\"created_at\", { mode: \"timestamp\" }).notNull(),\n});\n\n// ============================================================\n// OAuth Authorization Codes (temporary codes for code exchange)\n// ============================================================\nexport const oauthAuthorizationCodes = sqliteTable(\"kavach_oauth_authorization_codes\", {\n\tid: text(\"id\").primaryKey(),\n\tcode: text(\"code\").notNull().unique(),\n\tclientId: text(\"client_id\")\n\t\t.notNull()\n\t\t.references(() => oauthClients.clientId),\n\tuserId: text(\"user_id\")\n\t\t.notNull()\n\t\t.references(() => users.id),\n\tredirectUri: text(\"redirect_uri\").notNull(),\n\tscopes: text(\"scopes\").notNull(),\n\tcodeChallenge: text(\"code_challenge\"), // PKCE\n\tcodeChallengeMethod: text(\"code_challenge_method\"), // \"S256\"\n\tresource: text(\"resource\"), // RFC 8707\n\texpiresAt: integer(\"expires_at\", { mode: \"timestamp\" }).notNull(),\n\tcreatedAt: integer(\"created_at\", { mode: \"timestamp\" }).notNull(),\n});\n"]}
@@ -0,0 +1,92 @@
1
+ import { auditLogs } from './chunk-XSYYQH75.js';
2
+ import { eq, gte, lte, desc, and } from 'drizzle-orm';
3
+
4
+ function createAuditModule(config) {
5
+ const { db } = config;
6
+ async function query(filter) {
7
+ const conditions = [];
8
+ if (filter.agentId) conditions.push(eq(auditLogs.agentId, filter.agentId));
9
+ if (filter.userId) conditions.push(eq(auditLogs.userId, filter.userId));
10
+ if (filter.since) conditions.push(gte(auditLogs.timestamp, filter.since));
11
+ if (filter.until) conditions.push(lte(auditLogs.timestamp, filter.until));
12
+ if (filter.result) conditions.push(eq(auditLogs.result, filter.result));
13
+ let q = db.select().from(auditLogs).orderBy(desc(auditLogs.timestamp)).$dynamic();
14
+ if (conditions.length > 0) {
15
+ q = q.where(and(...conditions));
16
+ }
17
+ if (filter.limit) {
18
+ q = q.limit(filter.limit);
19
+ }
20
+ if (filter.offset) {
21
+ q = q.offset(filter.offset);
22
+ }
23
+ const rows = await q;
24
+ return rows.filter((row) => {
25
+ if (filter.actions && filter.actions.length > 0) {
26
+ return filter.actions.includes(row.action);
27
+ }
28
+ return true;
29
+ }).map(toAuditEntry);
30
+ }
31
+ async function exportLogs(options) {
32
+ const entries = await query({
33
+ since: options.since,
34
+ until: options.until,
35
+ limit: 1e4
36
+ // cap exports
37
+ });
38
+ if (options.format === "json") {
39
+ return JSON.stringify(entries, null, 2);
40
+ }
41
+ const headers = [
42
+ "id",
43
+ "agentId",
44
+ "userId",
45
+ "action",
46
+ "resource",
47
+ "result",
48
+ "reason",
49
+ "durationMs",
50
+ "tokensCost",
51
+ "timestamp"
52
+ ];
53
+ const csvRows = [headers.join(",")];
54
+ for (const entry of entries) {
55
+ csvRows.push(
56
+ [
57
+ entry.id,
58
+ entry.agentId,
59
+ entry.userId,
60
+ entry.action,
61
+ entry.resource,
62
+ entry.result,
63
+ `"${entry.reason ?? ""}"`,
64
+ entry.durationMs,
65
+ entry.tokensCost ?? "",
66
+ entry.timestamp.toISOString()
67
+ ].join(",")
68
+ );
69
+ }
70
+ return csvRows.join("\n");
71
+ }
72
+ return { query, export: exportLogs };
73
+ }
74
+ function toAuditEntry(row) {
75
+ return {
76
+ id: row.id,
77
+ agentId: row.agentId,
78
+ userId: row.userId,
79
+ action: row.action,
80
+ resource: row.resource,
81
+ parameters: row.parameters ?? {},
82
+ result: row.result,
83
+ reason: row.reason ?? void 0,
84
+ durationMs: row.durationMs,
85
+ tokensCost: row.tokensCost ?? void 0,
86
+ timestamp: row.timestamp
87
+ };
88
+ }
89
+
90
+ export { createAuditModule };
91
+ //# sourceMappingURL=chunk-XW2X3O53.js.map
92
+ //# sourceMappingURL=chunk-XW2X3O53.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/audit/audit.ts"],"names":[],"mappings":"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","file":"chunk-XW2X3O53.js","sourcesContent":["import { and, desc, eq, gte, lte } from \"drizzle-orm\";\nimport type { Database } from \"../db/database.js\";\nimport { auditLogs } from \"../db/schema.js\";\nimport type { AuditEntry, AuditExportOptions, AuditFilter } from \"../types.js\";\n\ninterface AuditModuleConfig {\n\tdb: Database;\n}\n\n/**\n * Create the audit log module.\n * Provides query and export capabilities for the immutable audit trail.\n */\nexport function createAuditModule(config: AuditModuleConfig) {\n\tconst { db } = config;\n\n\tasync function query(filter: AuditFilter): Promise<AuditEntry[]> {\n\t\tconst conditions = [];\n\n\t\tif (filter.agentId) conditions.push(eq(auditLogs.agentId, filter.agentId));\n\t\tif (filter.userId) conditions.push(eq(auditLogs.userId, filter.userId));\n\t\tif (filter.since) conditions.push(gte(auditLogs.timestamp, filter.since));\n\t\tif (filter.until) conditions.push(lte(auditLogs.timestamp, filter.until));\n\t\tif (filter.result) conditions.push(eq(auditLogs.result, filter.result));\n\n\t\tlet q = db.select().from(auditLogs).orderBy(desc(auditLogs.timestamp)).$dynamic();\n\n\t\tif (conditions.length > 0) {\n\t\t\tq = q.where(and(...conditions));\n\t\t}\n\n\t\tif (filter.limit) {\n\t\t\tq = q.limit(filter.limit);\n\t\t}\n\t\tif (filter.offset) {\n\t\t\tq = q.offset(filter.offset);\n\t\t}\n\n\t\tconst rows = await q;\n\n\t\treturn rows\n\t\t\t.filter((row) => {\n\t\t\t\t// Filter by actions if specified\n\t\t\t\tif (filter.actions && filter.actions.length > 0) {\n\t\t\t\t\treturn filter.actions.includes(row.action);\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t})\n\t\t\t.map(toAuditEntry);\n\t}\n\n\tasync function exportLogs(options: AuditExportOptions): Promise<string> {\n\t\tconst entries = await query({\n\t\t\tsince: options.since,\n\t\t\tuntil: options.until,\n\t\t\tlimit: 10000, // cap exports\n\t\t});\n\n\t\tif (options.format === \"json\") {\n\t\t\treturn JSON.stringify(entries, null, 2);\n\t\t}\n\n\t\t// CSV format\n\t\tconst headers = [\n\t\t\t\"id\",\n\t\t\t\"agentId\",\n\t\t\t\"userId\",\n\t\t\t\"action\",\n\t\t\t\"resource\",\n\t\t\t\"result\",\n\t\t\t\"reason\",\n\t\t\t\"durationMs\",\n\t\t\t\"tokensCost\",\n\t\t\t\"timestamp\",\n\t\t];\n\t\tconst csvRows = [headers.join(\",\")];\n\n\t\tfor (const entry of entries) {\n\t\t\tcsvRows.push(\n\t\t\t\t[\n\t\t\t\t\tentry.id,\n\t\t\t\t\tentry.agentId,\n\t\t\t\t\tentry.userId,\n\t\t\t\t\tentry.action,\n\t\t\t\t\tentry.resource,\n\t\t\t\t\tentry.result,\n\t\t\t\t\t`\"${(entry as AuditEntry & { reason?: string }).reason ?? \"\"}\"`,\n\t\t\t\t\tentry.durationMs,\n\t\t\t\t\tentry.tokensCost ?? \"\",\n\t\t\t\t\tentry.timestamp.toISOString(),\n\t\t\t\t].join(\",\"),\n\t\t\t);\n\t\t}\n\n\t\treturn csvRows.join(\"\\n\");\n\t}\n\n\treturn { query, export: exportLogs };\n}\n\nfunction toAuditEntry(row: typeof auditLogs.$inferSelect): AuditEntry {\n\treturn {\n\t\tid: row.id,\n\t\tagentId: row.agentId,\n\t\tuserId: row.userId,\n\t\taction: row.action,\n\t\tresource: row.resource,\n\t\tparameters: (row.parameters as Record<string, unknown>) ?? {},\n\t\tresult: row.result as AuditEntry[\"result\"],\n\t\treason: row.reason ?? undefined,\n\t\tdurationMs: row.durationMs,\n\t\ttokensCost: row.tokensCost ?? undefined,\n\t\ttimestamp: row.timestamp,\n\t};\n}\n"]}
@@ -0,0 +1,181 @@
1
+ export { createAgentModule } from './agent/index.js';
2
+ import { D as Database, a as DatabaseConfig, b as DelegateInput, P as Permission, c as DelegationChain, K as KavachConfig, C as CreateAgentInput, A as AgentIdentity, d as AgentFilter, U as UpdateAgentInput, e as AuthorizeRequest, f as AuthorizeResult, g as AuditFilter, h as AuditEntry, i as AuditExportOptions } from './types-fHHAt3tt.js';
3
+ export { j as AgentConfig, k as DatabaseConfig, l as KavachInstance, M as McpMiddleware, m as McpServer, n as McpServerInput, o as PermissionConstraints, T as TokenValidationResult, p as agents, q as auditLogs, r as createDatabase, s as createDatabaseSync, t as delegationChains, u as mcpServers, v as oauthAccessTokens, w as oauthAuthorizationCodes, x as oauthClients, y as permissions, z as rateLimits, B as users } from './types-fHHAt3tt.js';
4
+ export { createAuditModule } from './audit/index.js';
5
+ export { PermissionTemplateName, createPermissionEngine, getPermissionTemplate, permissionTemplates } from './permission/index.js';
6
+ import 'drizzle-orm/better-sqlite3';
7
+ import 'drizzle-orm/sqlite-core';
8
+ import './types-C5htunW6.js';
9
+ import 'zod';
10
+
11
+ /**
12
+ * Create all KavachOS tables if they do not already exist.
13
+ *
14
+ * Uses `CREATE TABLE IF NOT EXISTS` so it is safe to call on every startup.
15
+ * Tables are created in dependency order (no forward-reference FK issues).
16
+ *
17
+ * @param db Drizzle database instance returned by `createDatabase()`.
18
+ * @param provider The database provider used to build the correct DDL syntax.
19
+ *
20
+ * @example
21
+ * ```typescript
22
+ * const db = await createDatabase({ provider: 'postgres', url: process.env.DATABASE_URL });
23
+ * await createTables(db, 'postgres');
24
+ * ```
25
+ */
26
+ declare function createTables(db: Database, provider: DatabaseConfig["provider"]): Promise<void>;
27
+
28
+ interface DelegationModuleConfig {
29
+ db: Database;
30
+ }
31
+ /**
32
+ * Create the delegation module.
33
+ * Handles agent-to-agent permission delegation with chain tracking.
34
+ */
35
+ declare function createDelegationModule(config: DelegationModuleConfig): {
36
+ delegate: (input: DelegateInput, parentPermissions: Permission[]) => Promise<DelegationChain>;
37
+ revokeDelegation: (chainId: string) => Promise<void>;
38
+ getEffectivePermissions: (agentId: string) => Promise<Permission[]>;
39
+ listChains: (agentId: string) => Promise<DelegationChain[]>;
40
+ };
41
+
42
+ /**
43
+ * Create a KavachOS instance.
44
+ *
45
+ * The factory is **async** so it can open database connections for Postgres
46
+ * and MySQL (which require async driver initialisation) and optionally run
47
+ * `CREATE TABLE IF NOT EXISTS` for all schema tables.
48
+ *
49
+ * @example SQLite (simplest)
50
+ * ```typescript
51
+ * import { createKavach } from 'kavachos';
52
+ *
53
+ * const kavach = await createKavach({
54
+ * database: { provider: 'sqlite', url: 'kavach.db' },
55
+ * });
56
+ * ```
57
+ *
58
+ * @example Postgres
59
+ * ```typescript
60
+ * const kavach = await createKavach({
61
+ * database: { provider: 'postgres', url: process.env.DATABASE_URL },
62
+ * });
63
+ * ```
64
+ *
65
+ * @example MySQL – skip auto-migration (tables managed externally)
66
+ * ```typescript
67
+ * const kavach = await createKavach({
68
+ * database: {
69
+ * provider: 'mysql',
70
+ * url: process.env.DATABASE_URL,
71
+ * skipMigrations: true,
72
+ * },
73
+ * });
74
+ * ```
75
+ */
76
+ declare function createKavach(config: KavachConfig): Promise<{
77
+ agent: {
78
+ create: (input: CreateAgentInput) => Promise<AgentIdentity & {
79
+ token: string;
80
+ }>;
81
+ get: (agentId: string) => Promise<AgentIdentity | null>;
82
+ list: (filter?: AgentFilter) => Promise<AgentIdentity[]>;
83
+ update: (agentId: string, input: UpdateAgentInput) => Promise<AgentIdentity>;
84
+ revoke: (agentId: string) => Promise<void>;
85
+ rotate: (agentId: string) => Promise<AgentIdentity & {
86
+ token: string;
87
+ }>;
88
+ validateToken: (token: string) => Promise<AgentIdentity | null>;
89
+ };
90
+ authorize: (agentId: string, request: AuthorizeRequest) => Promise<AuthorizeResult>;
91
+ authorizeByToken: (token: string, request: AuthorizeRequest) => Promise<AuthorizeResult>;
92
+ delegate: (input: DelegateInput) => Promise<DelegationChain>;
93
+ delegation: {
94
+ revoke: (chainId: string) => Promise<void>;
95
+ getEffectivePermissions: (agentId: string) => Promise<Permission[]>;
96
+ listChains: (agentId: string) => Promise<DelegationChain[]>;
97
+ };
98
+ audit: {
99
+ query: (filter: AuditFilter) => Promise<AuditEntry[]>;
100
+ export: (options: AuditExportOptions) => Promise<string>;
101
+ };
102
+ /** Direct database access for advanced usage */
103
+ db: Database;
104
+ }>;
105
+ type Kavach = Awaited<ReturnType<typeof createKavach>>;
106
+
107
+ /**
108
+ * OpenAPI 3.1 specification generator for KavachOS REST API.
109
+ *
110
+ * This generates the spec that enables auto-generated SDKs
111
+ * for Python, Go, Java, Rust, etc. via OpenAPI codegen tools.
112
+ */
113
+ interface OpenAPISpec {
114
+ openapi: string;
115
+ info: {
116
+ title: string;
117
+ version: string;
118
+ description: string;
119
+ };
120
+ servers: Array<{
121
+ url: string;
122
+ description: string;
123
+ }>;
124
+ paths: Record<string, Record<string, PathOperation>>;
125
+ components: {
126
+ schemas: Record<string, SchemaObject>;
127
+ securitySchemes: Record<string, SecurityScheme>;
128
+ };
129
+ }
130
+ interface PathOperation {
131
+ summary: string;
132
+ operationId: string;
133
+ tags: string[];
134
+ security?: Array<Record<string, string[]>>;
135
+ parameters?: ParameterObject[];
136
+ requestBody?: {
137
+ required: boolean;
138
+ content: Record<string, {
139
+ schema: SchemaRef;
140
+ }>;
141
+ };
142
+ responses: Record<string, {
143
+ description: string;
144
+ content?: Record<string, {
145
+ schema: SchemaRef;
146
+ }>;
147
+ }>;
148
+ }
149
+ interface ParameterObject {
150
+ name: string;
151
+ in: "query" | "path" | "header";
152
+ required: boolean;
153
+ schema: SchemaRef;
154
+ }
155
+ interface SecurityScheme {
156
+ type: string;
157
+ scheme?: string;
158
+ bearerFormat?: string;
159
+ }
160
+ type SchemaRef = {
161
+ $ref: string;
162
+ } | SchemaObject;
163
+ interface SchemaObject {
164
+ type?: string;
165
+ properties?: Record<string, SchemaRef>;
166
+ required?: string[];
167
+ items?: SchemaRef;
168
+ enum?: string[];
169
+ description?: string;
170
+ format?: string;
171
+ nullable?: boolean;
172
+ }
173
+ /**
174
+ * Generate the full OpenAPI 3.1 specification for the KavachOS REST API.
175
+ */
176
+ declare function generateOpenAPISpec(options?: {
177
+ baseUrl?: string;
178
+ version?: string;
179
+ }): OpenAPISpec;
180
+
181
+ export { AgentFilter, AgentIdentity, AuditEntry, AuditExportOptions, AuditFilter, AuthorizeRequest, AuthorizeResult, CreateAgentInput, Database, DelegateInput, DelegationChain, type Kavach, KavachConfig, Permission, UpdateAgentInput, createDelegationModule, createKavach, createTables, generateOpenAPISpec };