@agentlensai/server 0.7.0 → 0.9.0
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/db/anonymous-id-manager.d.ts +44 -0
- package/dist/db/anonymous-id-manager.d.ts.map +1 -0
- package/dist/db/anonymous-id-manager.js +90 -0
- package/dist/db/anonymous-id-manager.js.map +1 -0
- package/dist/db/capability-store.d.ts +78 -0
- package/dist/db/capability-store.d.ts.map +1 -0
- package/dist/db/capability-store.js +201 -0
- package/dist/db/capability-store.js.map +1 -0
- package/dist/db/guardrail-store.d.ts +34 -0
- package/dist/db/guardrail-store.d.ts.map +1 -0
- package/dist/db/guardrail-store.js +221 -0
- package/dist/db/guardrail-store.js.map +1 -0
- package/dist/db/migrate.d.ts.map +1 -1
- package/dist/db/migrate.js +200 -0
- package/dist/db/migrate.js.map +1 -1
- package/dist/db/schema.sqlite.d.ts +1719 -1
- package/dist/db/schema.sqlite.d.ts.map +1 -1
- package/dist/db/schema.sqlite.js +141 -1
- package/dist/db/schema.sqlite.js.map +1 -1
- package/dist/db/sqlite-store.d.ts +12 -0
- package/dist/db/sqlite-store.d.ts.map +1 -1
- package/dist/db/sqlite-store.js +47 -0
- package/dist/db/sqlite-store.js.map +1 -1
- package/dist/db/tenant-scoped-store.d.ts +1 -0
- package/dist/db/tenant-scoped-store.d.ts.map +1 -1
- package/dist/db/tenant-scoped-store.js +3 -0
- package/dist/db/tenant-scoped-store.js.map +1 -1
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +52 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/guardrails/actions.d.ts +28 -0
- package/dist/lib/guardrails/actions.d.ts.map +1 -0
- package/dist/lib/guardrails/actions.js +126 -0
- package/dist/lib/guardrails/actions.js.map +1 -0
- package/dist/lib/guardrails/conditions.d.ts +13 -0
- package/dist/lib/guardrails/conditions.d.ts.map +1 -0
- package/dist/lib/guardrails/conditions.js +188 -0
- package/dist/lib/guardrails/conditions.js.map +1 -0
- package/dist/lib/guardrails/engine.d.ts +24 -0
- package/dist/lib/guardrails/engine.d.ts.map +1 -0
- package/dist/lib/guardrails/engine.js +122 -0
- package/dist/lib/guardrails/engine.js.map +1 -0
- package/dist/lib/redaction/human-review-layer.d.ts +37 -0
- package/dist/lib/redaction/human-review-layer.d.ts.map +1 -0
- package/dist/lib/redaction/human-review-layer.js +62 -0
- package/dist/lib/redaction/human-review-layer.js.map +1 -0
- package/dist/lib/redaction/index.d.ts +12 -0
- package/dist/lib/redaction/index.d.ts.map +1 -0
- package/dist/lib/redaction/index.js +12 -0
- package/dist/lib/redaction/index.js.map +1 -0
- package/dist/lib/redaction/pii-detection-layer.d.ts +30 -0
- package/dist/lib/redaction/pii-detection-layer.d.ts.map +1 -0
- package/dist/lib/redaction/pii-detection-layer.js +183 -0
- package/dist/lib/redaction/pii-detection-layer.js.map +1 -0
- package/dist/lib/redaction/pipeline.d.ts +26 -0
- package/dist/lib/redaction/pipeline.d.ts.map +1 -0
- package/dist/lib/redaction/pipeline.js +91 -0
- package/dist/lib/redaction/pipeline.js.map +1 -0
- package/dist/lib/redaction/secret-detection-layer.d.ts +10 -0
- package/dist/lib/redaction/secret-detection-layer.d.ts.map +1 -0
- package/dist/lib/redaction/secret-detection-layer.js +79 -0
- package/dist/lib/redaction/secret-detection-layer.js.map +1 -0
- package/dist/lib/redaction/secret-patterns.d.ts +29 -0
- package/dist/lib/redaction/secret-patterns.d.ts.map +1 -0
- package/dist/lib/redaction/secret-patterns.js +133 -0
- package/dist/lib/redaction/secret-patterns.js.map +1 -0
- package/dist/lib/redaction/semantic-denylist-layer.d.ts +10 -0
- package/dist/lib/redaction/semantic-denylist-layer.d.ts.map +1 -0
- package/dist/lib/redaction/semantic-denylist-layer.js +64 -0
- package/dist/lib/redaction/semantic-denylist-layer.js.map +1 -0
- package/dist/lib/redaction/tenant-deidentification-layer.d.ts +10 -0
- package/dist/lib/redaction/tenant-deidentification-layer.d.ts.map +1 -0
- package/dist/lib/redaction/tenant-deidentification-layer.js +64 -0
- package/dist/lib/redaction/tenant-deidentification-layer.js.map +1 -0
- package/dist/lib/redaction/url-path-scrubbing-layer.d.ts +14 -0
- package/dist/lib/redaction/url-path-scrubbing-layer.d.ts.map +1 -0
- package/dist/lib/redaction/url-path-scrubbing-layer.js +156 -0
- package/dist/lib/redaction/url-path-scrubbing-layer.js.map +1 -0
- package/dist/routes/agents.d.ts +4 -3
- package/dist/routes/agents.d.ts.map +1 -1
- package/dist/routes/agents.js +31 -12
- package/dist/routes/agents.js.map +1 -1
- package/dist/routes/audit.d.ts +15 -0
- package/dist/routes/audit.d.ts.map +1 -0
- package/dist/routes/audit.js +177 -0
- package/dist/routes/audit.js.map +1 -0
- package/dist/routes/capabilities.d.ts +15 -0
- package/dist/routes/capabilities.d.ts.map +1 -0
- package/dist/routes/capabilities.js +86 -0
- package/dist/routes/capabilities.js.map +1 -0
- package/dist/routes/community.d.ts +24 -0
- package/dist/routes/community.d.ts.map +1 -0
- package/dist/routes/community.js +190 -0
- package/dist/routes/community.js.map +1 -0
- package/dist/routes/delegation.d.ts +20 -0
- package/dist/routes/delegation.d.ts.map +1 -0
- package/dist/routes/delegation.js +108 -0
- package/dist/routes/delegation.js.map +1 -0
- package/dist/routes/discovery.d.ts +19 -0
- package/dist/routes/discovery.d.ts.map +1 -0
- package/dist/routes/discovery.js +96 -0
- package/dist/routes/discovery.js.map +1 -0
- package/dist/routes/guardrails.d.ts +18 -0
- package/dist/routes/guardrails.d.ts.map +1 -0
- package/dist/routes/guardrails.js +184 -0
- package/dist/routes/guardrails.js.map +1 -0
- package/dist/routes/redaction-test.d.ts +14 -0
- package/dist/routes/redaction-test.d.ts.map +1 -0
- package/dist/routes/redaction-test.js +33 -0
- package/dist/routes/redaction-test.js.map +1 -0
- package/dist/routes/trust.d.ts +16 -0
- package/dist/routes/trust.d.ts.map +1 -0
- package/dist/routes/trust.js +23 -0
- package/dist/routes/trust.js.map +1 -0
- package/dist/services/community-service.d.ts +277 -0
- package/dist/services/community-service.d.ts.map +1 -0
- package/dist/services/community-service.js +785 -0
- package/dist/services/community-service.js.map +1 -0
- package/dist/services/delegation-service.d.ts +149 -0
- package/dist/services/delegation-service.d.ts.map +1 -0
- package/dist/services/delegation-service.js +605 -0
- package/dist/services/delegation-service.js.map +1 -0
- package/dist/services/discovery-service.d.ts +39 -0
- package/dist/services/discovery-service.d.ts.map +1 -0
- package/dist/services/discovery-service.js +186 -0
- package/dist/services/discovery-service.js.map +1 -0
- package/dist/services/trust-service.d.ts +59 -0
- package/dist/services/trust-service.d.ts.map +1 -0
- package/dist/services/trust-service.js +139 -0
- package/dist/services/trust-service.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Anonymous ID Manager (Phase 4 — Story 1.4)
|
|
3
|
+
*
|
|
4
|
+
* Manages rotating anonymous agent IDs with 24h rotation.
|
|
5
|
+
* Old IDs are kept for audit trail purposes.
|
|
6
|
+
*/
|
|
7
|
+
import type { SqliteDb } from './index.js';
|
|
8
|
+
export interface AnonymousIdManagerOptions {
|
|
9
|
+
/** Override for current time (useful for testing) */
|
|
10
|
+
now?: () => Date;
|
|
11
|
+
}
|
|
12
|
+
export declare class AnonymousIdManager {
|
|
13
|
+
private readonly db;
|
|
14
|
+
private readonly now;
|
|
15
|
+
constructor(db: SqliteDb, options?: AnonymousIdManagerOptions);
|
|
16
|
+
/**
|
|
17
|
+
* H4 FIX: Hash the agentId before storing in the DB so that if the DB
|
|
18
|
+
* is compromised, agentId → anonymousId mapping is not directly readable.
|
|
19
|
+
*/
|
|
20
|
+
private hashAgentId;
|
|
21
|
+
/**
|
|
22
|
+
* Get the current anonymous ID for a tenant+agent pair,
|
|
23
|
+
* or create/rotate one if needed.
|
|
24
|
+
*
|
|
25
|
+
* - Lazy creation: first call creates the ID
|
|
26
|
+
* - 24h rotation: after expiry, a new ID is created
|
|
27
|
+
* - Old IDs are kept for audit trail
|
|
28
|
+
*/
|
|
29
|
+
getOrRotateAnonymousId(tenantId: string, agentId: string): string;
|
|
30
|
+
/**
|
|
31
|
+
* Get all historical anonymous IDs for a tenant+agent (for audit).
|
|
32
|
+
*/
|
|
33
|
+
getAuditTrail(tenantId: string, agentId: string): Array<{
|
|
34
|
+
anonymousAgentId: string;
|
|
35
|
+
validFrom: string;
|
|
36
|
+
validUntil: string;
|
|
37
|
+
}>;
|
|
38
|
+
/**
|
|
39
|
+
* Get the anonymous contributor ID for a tenant (not agent-specific).
|
|
40
|
+
* Used for lesson sharing where the contributor is the tenant.
|
|
41
|
+
*/
|
|
42
|
+
getOrRotateContributorId(tenantId: string): string;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=anonymous-id-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anonymous-id-manager.d.ts","sourceRoot":"","sources":["../../src/db/anonymous-id-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAS3C,MAAM,WAAW,yBAAyB;IACxC,qDAAqD;IACrD,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AAED,qBAAa,kBAAkB;IAI3B,OAAO,CAAC,QAAQ,CAAC,EAAE;IAHrB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAa;gBAGd,EAAE,EAAE,QAAQ,EAC7B,OAAO,CAAC,EAAE,yBAAyB;IAKrC;;;OAGG;IACH,OAAO,CAAC,WAAW;IAMnB;;;;;;;OAOG;IACH,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM;IA0CjE;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,KAAK,CAAC;QACtD,gBAAgB,EAAE,MAAM,CAAC;QACzB,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IAkBF;;;OAGG;IACH,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;CAGnD"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Anonymous ID Manager (Phase 4 — Story 1.4)
|
|
3
|
+
*
|
|
4
|
+
* Manages rotating anonymous agent IDs with 24h rotation.
|
|
5
|
+
* Old IDs are kept for audit trail purposes.
|
|
6
|
+
*/
|
|
7
|
+
import { eq, and, gte } from 'drizzle-orm';
|
|
8
|
+
import { randomUUID, createHash } from 'crypto';
|
|
9
|
+
import * as schema from './schema.sqlite.js';
|
|
10
|
+
/** Duration of anonymous ID validity (24 hours in milliseconds) */
|
|
11
|
+
const ROTATION_INTERVAL_MS = 24 * 60 * 60 * 1000;
|
|
12
|
+
/** Salt for hashing agent IDs in the anonymous ID map (H4 fix) */
|
|
13
|
+
const ANON_ID_HASH_SALT = 'agentlens-anon-id-salt-v1';
|
|
14
|
+
export class AnonymousIdManager {
|
|
15
|
+
db;
|
|
16
|
+
now;
|
|
17
|
+
constructor(db, options) {
|
|
18
|
+
this.db = db;
|
|
19
|
+
this.now = options?.now ?? (() => new Date());
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* H4 FIX: Hash the agentId before storing in the DB so that if the DB
|
|
23
|
+
* is compromised, agentId → anonymousId mapping is not directly readable.
|
|
24
|
+
*/
|
|
25
|
+
hashAgentId(tenantId, agentId) {
|
|
26
|
+
return createHash('sha256')
|
|
27
|
+
.update(`${ANON_ID_HASH_SALT}:${tenantId}:${agentId}`)
|
|
28
|
+
.digest('hex');
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Get the current anonymous ID for a tenant+agent pair,
|
|
32
|
+
* or create/rotate one if needed.
|
|
33
|
+
*
|
|
34
|
+
* - Lazy creation: first call creates the ID
|
|
35
|
+
* - 24h rotation: after expiry, a new ID is created
|
|
36
|
+
* - Old IDs are kept for audit trail
|
|
37
|
+
*/
|
|
38
|
+
getOrRotateAnonymousId(tenantId, agentId) {
|
|
39
|
+
const now = this.now();
|
|
40
|
+
const nowIso = now.toISOString();
|
|
41
|
+
// H4 FIX: Store hashed agentId to prevent de-anonymization if DB is compromised
|
|
42
|
+
const hashedAgentId = this.hashAgentId(tenantId, agentId);
|
|
43
|
+
// Find a valid (non-expired) anonymous ID
|
|
44
|
+
const existing = this.db
|
|
45
|
+
.select()
|
|
46
|
+
.from(schema.anonymousIdMap)
|
|
47
|
+
.where(and(eq(schema.anonymousIdMap.tenantId, tenantId), eq(schema.anonymousIdMap.agentId, hashedAgentId), gte(schema.anonymousIdMap.validUntil, nowIso)))
|
|
48
|
+
.get();
|
|
49
|
+
if (existing) {
|
|
50
|
+
return existing.anonymousAgentId;
|
|
51
|
+
}
|
|
52
|
+
// Create a new anonymous ID with 24h validity
|
|
53
|
+
const newId = randomUUID();
|
|
54
|
+
const validUntil = new Date(now.getTime() + ROTATION_INTERVAL_MS);
|
|
55
|
+
this.db
|
|
56
|
+
.insert(schema.anonymousIdMap)
|
|
57
|
+
.values({
|
|
58
|
+
tenantId,
|
|
59
|
+
agentId: hashedAgentId,
|
|
60
|
+
anonymousAgentId: newId,
|
|
61
|
+
validFrom: nowIso,
|
|
62
|
+
validUntil: validUntil.toISOString(),
|
|
63
|
+
})
|
|
64
|
+
.run();
|
|
65
|
+
return newId;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Get all historical anonymous IDs for a tenant+agent (for audit).
|
|
69
|
+
*/
|
|
70
|
+
getAuditTrail(tenantId, agentId) {
|
|
71
|
+
const hashedAgentId = this.hashAgentId(tenantId, agentId);
|
|
72
|
+
return this.db
|
|
73
|
+
.select({
|
|
74
|
+
anonymousAgentId: schema.anonymousIdMap.anonymousAgentId,
|
|
75
|
+
validFrom: schema.anonymousIdMap.validFrom,
|
|
76
|
+
validUntil: schema.anonymousIdMap.validUntil,
|
|
77
|
+
})
|
|
78
|
+
.from(schema.anonymousIdMap)
|
|
79
|
+
.where(and(eq(schema.anonymousIdMap.tenantId, tenantId), eq(schema.anonymousIdMap.agentId, hashedAgentId)))
|
|
80
|
+
.all();
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Get the anonymous contributor ID for a tenant (not agent-specific).
|
|
84
|
+
* Used for lesson sharing where the contributor is the tenant.
|
|
85
|
+
*/
|
|
86
|
+
getOrRotateContributorId(tenantId) {
|
|
87
|
+
return this.getOrRotateAnonymousId(tenantId, '__contributor__');
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=anonymous-id-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anonymous-id-manager.js","sourceRoot":"","sources":["../../src/db/anonymous-id-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Capability Registry Store (Story 5.1)
|
|
3
|
+
*
|
|
4
|
+
* CRUD operations for the capability_registry table with tenant isolation.
|
|
5
|
+
*/
|
|
6
|
+
import type { SqliteDb } from './index.js';
|
|
7
|
+
import { type TaskType } from '@agentlensai/core';
|
|
8
|
+
/** Input for creating/updating a capability */
|
|
9
|
+
export interface CapabilityInput {
|
|
10
|
+
taskType: string;
|
|
11
|
+
customType?: string;
|
|
12
|
+
inputSchema: Record<string, unknown>;
|
|
13
|
+
outputSchema: Record<string, unknown>;
|
|
14
|
+
inputMimeTypes?: string[];
|
|
15
|
+
outputMimeTypes?: string[];
|
|
16
|
+
qualityMetrics?: Record<string, unknown>;
|
|
17
|
+
estimatedLatencyMs?: number;
|
|
18
|
+
estimatedCostUsd?: number;
|
|
19
|
+
maxInputBytes?: number;
|
|
20
|
+
scope?: 'internal' | 'public';
|
|
21
|
+
}
|
|
22
|
+
/** Parsed capability returned from store */
|
|
23
|
+
export interface Capability {
|
|
24
|
+
id: string;
|
|
25
|
+
tenantId: string;
|
|
26
|
+
agentId: string;
|
|
27
|
+
taskType: TaskType;
|
|
28
|
+
customType?: string;
|
|
29
|
+
inputSchema: Record<string, unknown>;
|
|
30
|
+
outputSchema: Record<string, unknown>;
|
|
31
|
+
qualityMetrics: Record<string, unknown>;
|
|
32
|
+
estimatedLatencyMs?: number;
|
|
33
|
+
estimatedCostUsd?: number;
|
|
34
|
+
maxInputBytes?: number;
|
|
35
|
+
scope: 'internal' | 'public';
|
|
36
|
+
enabled: boolean;
|
|
37
|
+
acceptDelegations: boolean;
|
|
38
|
+
inboundRateLimit: number;
|
|
39
|
+
outboundRateLimit: number;
|
|
40
|
+
createdAt: string;
|
|
41
|
+
updatedAt: string;
|
|
42
|
+
}
|
|
43
|
+
export declare class ValidationError extends Error {
|
|
44
|
+
constructor(message: string);
|
|
45
|
+
}
|
|
46
|
+
export declare class CapabilityStore {
|
|
47
|
+
private readonly db;
|
|
48
|
+
constructor(db: SqliteDb);
|
|
49
|
+
/**
|
|
50
|
+
* Validate capability input and throw ValidationError on problems.
|
|
51
|
+
*/
|
|
52
|
+
private validate;
|
|
53
|
+
/**
|
|
54
|
+
* Create a new capability registration.
|
|
55
|
+
*/
|
|
56
|
+
create(tenantId: string, agentId: string, input: CapabilityInput): Capability;
|
|
57
|
+
/**
|
|
58
|
+
* Get a capability by ID (tenant-scoped).
|
|
59
|
+
*/
|
|
60
|
+
getById(tenantId: string, id: string): Capability | null;
|
|
61
|
+
/**
|
|
62
|
+
* List all capabilities for an agent (tenant-scoped).
|
|
63
|
+
*/
|
|
64
|
+
listByAgent(tenantId: string, agentId: string): Capability[];
|
|
65
|
+
/**
|
|
66
|
+
* Update a capability by ID (tenant-scoped).
|
|
67
|
+
*/
|
|
68
|
+
update(tenantId: string, id: string, input: Partial<CapabilityInput>): Capability;
|
|
69
|
+
/**
|
|
70
|
+
* Delete a capability by ID (tenant-scoped).
|
|
71
|
+
*/
|
|
72
|
+
delete(tenantId: string, id: string): boolean;
|
|
73
|
+
/**
|
|
74
|
+
* Delete all capabilities for an agent (tenant-scoped).
|
|
75
|
+
*/
|
|
76
|
+
deleteByAgent(tenantId: string, agentId: string): number;
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=capability-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capability-store.d.ts","sourceRoot":"","sources":["../../src/db/capability-store.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,OAAO,EAAc,KAAK,QAAQ,EAA+B,MAAM,mBAAmB,CAAC;AAY3F,+CAA+C;AAC/C,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,UAAU,GAAG,QAAQ,CAAC;CAC/B;AAED,4CAA4C;AAC5C,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,QAAQ,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,UAAU,GAAG,QAAQ,CAAC;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAuCD,qBAAa,eAAgB,SAAQ,KAAK;gBAC5B,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,eAAe;IACd,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ;IAEzC;;OAEG;IACH,OAAO,CAAC,QAAQ;IAgChB;;OAEG;IACH,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,GAAG,UAAU;IA6B7E;;OAEG;IACH,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IASxD;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,UAAU,EAAE;IAc5D;;OAEG;IACH,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU;IAoCjF;;OAEG;IACH,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO;IAQ7C;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM;CAYzD"}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Capability Registry Store (Story 5.1)
|
|
3
|
+
*
|
|
4
|
+
* CRUD operations for the capability_registry table with tenant isolation.
|
|
5
|
+
*/
|
|
6
|
+
import { randomUUID } from 'node:crypto';
|
|
7
|
+
import { eq, and } from 'drizzle-orm';
|
|
8
|
+
import { capabilityRegistry } from './schema.sqlite.js';
|
|
9
|
+
import { TASK_TYPES } from '@agentlensai/core';
|
|
10
|
+
import { NotFoundError } from './errors.js';
|
|
11
|
+
/** Valid task types as a Set for fast lookup */
|
|
12
|
+
const VALID_TASK_TYPES = new Set(TASK_TYPES);
|
|
13
|
+
/** Regex for customType validation: alphanumeric + hyphens, max 64 chars */
|
|
14
|
+
const CUSTOM_TYPE_REGEX = /^[a-zA-Z0-9-]{1,64}$/;
|
|
15
|
+
function rowToCapability(row) {
|
|
16
|
+
return {
|
|
17
|
+
id: row.id,
|
|
18
|
+
tenantId: row.tenantId,
|
|
19
|
+
agentId: row.agentId,
|
|
20
|
+
taskType: row.taskType,
|
|
21
|
+
customType: row.customType ?? undefined,
|
|
22
|
+
inputSchema: JSON.parse(row.inputSchema),
|
|
23
|
+
outputSchema: JSON.parse(row.outputSchema),
|
|
24
|
+
qualityMetrics: JSON.parse(row.qualityMetrics),
|
|
25
|
+
estimatedLatencyMs: row.estimatedLatencyMs ?? undefined,
|
|
26
|
+
estimatedCostUsd: row.estimatedCostUsd ?? undefined,
|
|
27
|
+
maxInputBytes: row.maxInputBytes ?? undefined,
|
|
28
|
+
scope: row.scope,
|
|
29
|
+
enabled: row.enabled,
|
|
30
|
+
acceptDelegations: row.acceptDelegations,
|
|
31
|
+
inboundRateLimit: row.inboundRateLimit,
|
|
32
|
+
outboundRateLimit: row.outboundRateLimit,
|
|
33
|
+
createdAt: row.createdAt,
|
|
34
|
+
updatedAt: row.updatedAt,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Validate a JSON Schema object (basic validation).
|
|
39
|
+
* Must be a non-null object with a "type" property.
|
|
40
|
+
*/
|
|
41
|
+
function validateJsonSchema(schema, label) {
|
|
42
|
+
if (schema === null || schema === undefined || typeof schema !== 'object' || Array.isArray(schema)) {
|
|
43
|
+
throw new ValidationError(`${label} must be a JSON Schema object`);
|
|
44
|
+
}
|
|
45
|
+
const s = schema;
|
|
46
|
+
if (!s.type && !s.$ref && !s.oneOf && !s.anyOf && !s.allOf && !s.properties && !s.enum) {
|
|
47
|
+
throw new ValidationError(`${label} must be a valid JSON Schema (missing type or schema keyword)`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
export class ValidationError extends Error {
|
|
51
|
+
constructor(message) {
|
|
52
|
+
super(message);
|
|
53
|
+
this.name = 'ValidationError';
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
export class CapabilityStore {
|
|
57
|
+
db;
|
|
58
|
+
constructor(db) {
|
|
59
|
+
this.db = db;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Validate capability input and throw ValidationError on problems.
|
|
63
|
+
*/
|
|
64
|
+
validate(input) {
|
|
65
|
+
// Validate taskType
|
|
66
|
+
if (!VALID_TASK_TYPES.has(input.taskType)) {
|
|
67
|
+
throw new ValidationError(`Invalid taskType "${input.taskType}". Must be one of: ${TASK_TYPES.join(', ')}`);
|
|
68
|
+
}
|
|
69
|
+
// Validate customType format if provided
|
|
70
|
+
if (input.customType !== undefined && input.customType !== null) {
|
|
71
|
+
if (!CUSTOM_TYPE_REGEX.test(input.customType)) {
|
|
72
|
+
throw new ValidationError('customType must be 1-64 characters, alphanumeric and hyphens only');
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// customType is required when taskType is 'custom'
|
|
76
|
+
if (input.taskType === 'custom' && !input.customType) {
|
|
77
|
+
throw new ValidationError('customType is required when taskType is "custom"');
|
|
78
|
+
}
|
|
79
|
+
// Validate input/output schemas
|
|
80
|
+
validateJsonSchema(input.inputSchema, 'inputSchema');
|
|
81
|
+
validateJsonSchema(input.outputSchema, 'outputSchema');
|
|
82
|
+
// Validate scope if provided
|
|
83
|
+
if (input.scope !== undefined && input.scope !== 'internal' && input.scope !== 'public') {
|
|
84
|
+
throw new ValidationError('scope must be "internal" or "public"');
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Create a new capability registration.
|
|
89
|
+
*/
|
|
90
|
+
create(tenantId, agentId, input) {
|
|
91
|
+
this.validate(input);
|
|
92
|
+
const now = new Date().toISOString();
|
|
93
|
+
const id = randomUUID();
|
|
94
|
+
this.db
|
|
95
|
+
.insert(capabilityRegistry)
|
|
96
|
+
.values({
|
|
97
|
+
id,
|
|
98
|
+
tenantId,
|
|
99
|
+
agentId,
|
|
100
|
+
taskType: input.taskType,
|
|
101
|
+
customType: input.customType ?? null,
|
|
102
|
+
inputSchema: JSON.stringify(input.inputSchema),
|
|
103
|
+
outputSchema: JSON.stringify(input.outputSchema),
|
|
104
|
+
qualityMetrics: JSON.stringify(input.qualityMetrics ?? {}),
|
|
105
|
+
estimatedLatencyMs: input.estimatedLatencyMs ?? null,
|
|
106
|
+
estimatedCostUsd: input.estimatedCostUsd ?? null,
|
|
107
|
+
maxInputBytes: input.maxInputBytes ?? null,
|
|
108
|
+
scope: input.scope ?? 'internal',
|
|
109
|
+
createdAt: now,
|
|
110
|
+
updatedAt: now,
|
|
111
|
+
})
|
|
112
|
+
.run();
|
|
113
|
+
return this.getById(tenantId, id);
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Get a capability by ID (tenant-scoped).
|
|
117
|
+
*/
|
|
118
|
+
getById(tenantId, id) {
|
|
119
|
+
const row = this.db
|
|
120
|
+
.select()
|
|
121
|
+
.from(capabilityRegistry)
|
|
122
|
+
.where(and(eq(capabilityRegistry.id, id), eq(capabilityRegistry.tenantId, tenantId)))
|
|
123
|
+
.get();
|
|
124
|
+
return row ? rowToCapability(row) : null;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* List all capabilities for an agent (tenant-scoped).
|
|
128
|
+
*/
|
|
129
|
+
listByAgent(tenantId, agentId) {
|
|
130
|
+
const rows = this.db
|
|
131
|
+
.select()
|
|
132
|
+
.from(capabilityRegistry)
|
|
133
|
+
.where(and(eq(capabilityRegistry.tenantId, tenantId), eq(capabilityRegistry.agentId, agentId)))
|
|
134
|
+
.all();
|
|
135
|
+
return rows.map(rowToCapability);
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Update a capability by ID (tenant-scoped).
|
|
139
|
+
*/
|
|
140
|
+
update(tenantId, id, input) {
|
|
141
|
+
const existing = this.getById(tenantId, id);
|
|
142
|
+
if (!existing) {
|
|
143
|
+
throw new NotFoundError(`Capability ${id} not found`);
|
|
144
|
+
}
|
|
145
|
+
// Merge with existing for validation
|
|
146
|
+
const merged = {
|
|
147
|
+
taskType: input.taskType ?? existing.taskType,
|
|
148
|
+
customType: input.customType !== undefined ? input.customType : existing.customType,
|
|
149
|
+
inputSchema: input.inputSchema ?? existing.inputSchema,
|
|
150
|
+
outputSchema: input.outputSchema ?? existing.outputSchema,
|
|
151
|
+
scope: input.scope ?? existing.scope,
|
|
152
|
+
};
|
|
153
|
+
this.validate(merged);
|
|
154
|
+
const updates = { updatedAt: new Date().toISOString() };
|
|
155
|
+
if (input.taskType !== undefined)
|
|
156
|
+
updates.taskType = input.taskType;
|
|
157
|
+
if (input.customType !== undefined)
|
|
158
|
+
updates.customType = input.customType;
|
|
159
|
+
if (input.inputSchema !== undefined)
|
|
160
|
+
updates.inputSchema = JSON.stringify(input.inputSchema);
|
|
161
|
+
if (input.outputSchema !== undefined)
|
|
162
|
+
updates.outputSchema = JSON.stringify(input.outputSchema);
|
|
163
|
+
if (input.qualityMetrics !== undefined)
|
|
164
|
+
updates.qualityMetrics = JSON.stringify(input.qualityMetrics);
|
|
165
|
+
if (input.estimatedLatencyMs !== undefined)
|
|
166
|
+
updates.estimatedLatencyMs = input.estimatedLatencyMs;
|
|
167
|
+
if (input.estimatedCostUsd !== undefined)
|
|
168
|
+
updates.estimatedCostUsd = input.estimatedCostUsd;
|
|
169
|
+
if (input.maxInputBytes !== undefined)
|
|
170
|
+
updates.maxInputBytes = input.maxInputBytes;
|
|
171
|
+
if (input.scope !== undefined)
|
|
172
|
+
updates.scope = input.scope;
|
|
173
|
+
this.db
|
|
174
|
+
.update(capabilityRegistry)
|
|
175
|
+
.set(updates)
|
|
176
|
+
.where(and(eq(capabilityRegistry.id, id), eq(capabilityRegistry.tenantId, tenantId)))
|
|
177
|
+
.run();
|
|
178
|
+
return this.getById(tenantId, id);
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Delete a capability by ID (tenant-scoped).
|
|
182
|
+
*/
|
|
183
|
+
delete(tenantId, id) {
|
|
184
|
+
const result = this.db
|
|
185
|
+
.delete(capabilityRegistry)
|
|
186
|
+
.where(and(eq(capabilityRegistry.id, id), eq(capabilityRegistry.tenantId, tenantId)))
|
|
187
|
+
.run();
|
|
188
|
+
return result.changes > 0;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Delete all capabilities for an agent (tenant-scoped).
|
|
192
|
+
*/
|
|
193
|
+
deleteByAgent(tenantId, agentId) {
|
|
194
|
+
const result = this.db
|
|
195
|
+
.delete(capabilityRegistry)
|
|
196
|
+
.where(and(eq(capabilityRegistry.tenantId, tenantId), eq(capabilityRegistry.agentId, agentId)))
|
|
197
|
+
.run();
|
|
198
|
+
return result.changes;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=capability-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capability-store.js","sourceRoot":"","sources":["../../src/db/capability-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Guardrail Store (v0.8.0 — Story 1.2)
|
|
3
|
+
*
|
|
4
|
+
* CRUD operations for guardrail rules, runtime state, and trigger history.
|
|
5
|
+
* All operations are tenant-scoped.
|
|
6
|
+
*/
|
|
7
|
+
import type { SqliteDb } from './index.js';
|
|
8
|
+
import type { GuardrailRule, GuardrailState, GuardrailTriggerHistory } from '@agentlensai/core';
|
|
9
|
+
export declare class GuardrailStore {
|
|
10
|
+
private readonly db;
|
|
11
|
+
constructor(db: SqliteDb);
|
|
12
|
+
createRule(rule: GuardrailRule): void;
|
|
13
|
+
getRule(tenantId: string, ruleId: string): GuardrailRule | null;
|
|
14
|
+
listRules(tenantId: string, agentId?: string): GuardrailRule[];
|
|
15
|
+
listEnabledRules(tenantId: string, agentId?: string): GuardrailRule[];
|
|
16
|
+
updateRule(tenantId: string, ruleId: string, updates: Partial<GuardrailRule>): boolean;
|
|
17
|
+
deleteRule(tenantId: string, ruleId: string): boolean;
|
|
18
|
+
getState(tenantId: string, ruleId: string): GuardrailState | null;
|
|
19
|
+
upsertState(state: GuardrailState): void;
|
|
20
|
+
insertTrigger(trigger: GuardrailTriggerHistory): void;
|
|
21
|
+
listTriggerHistory(tenantId: string, opts?: {
|
|
22
|
+
ruleId?: string;
|
|
23
|
+
limit?: number;
|
|
24
|
+
offset?: number;
|
|
25
|
+
}): {
|
|
26
|
+
triggers: GuardrailTriggerHistory[];
|
|
27
|
+
total: number;
|
|
28
|
+
};
|
|
29
|
+
getRecentTriggers(tenantId: string, ruleId: string, limit?: number): GuardrailTriggerHistory[];
|
|
30
|
+
private _mapRule;
|
|
31
|
+
private _mapState;
|
|
32
|
+
private _mapTrigger;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=guardrail-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guardrail-store.d.ts","sourceRoot":"","sources":["../../src/db/guardrail-store.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EACV,aAAa,EACb,cAAc,EACd,uBAAuB,EACxB,MAAM,mBAAmB,CAAC;AAE3B,qBAAa,cAAc;IACb,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ;IAIzC,UAAU,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAkBrC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI;IAO/D,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,aAAa,EAAE;IAa9D,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,aAAa,EAAE;IAkBrE,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,OAAO;IAuBtF,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO;IAarD,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IAOjE,WAAW,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;IAexC,aAAa,CAAC,OAAO,EAAE,uBAAuB,GAAG,IAAI;IAcrD,kBAAkB,CAChB,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAC1D;QAAE,QAAQ,EAAE,uBAAuB,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE;IA0CzD,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,GAAE,MAAU,GAAG,uBAAuB,EAAE;IAajG,OAAO,CAAC,QAAQ;IAmBhB,OAAO,CAAC,SAAS;IAWjB,OAAO,CAAC,WAAW;CAapB"}
|