@agentlensai/server 0.8.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.
Files changed (103) hide show
  1. package/dist/db/anonymous-id-manager.d.ts +44 -0
  2. package/dist/db/anonymous-id-manager.d.ts.map +1 -0
  3. package/dist/db/anonymous-id-manager.js +90 -0
  4. package/dist/db/anonymous-id-manager.js.map +1 -0
  5. package/dist/db/capability-store.d.ts +78 -0
  6. package/dist/db/capability-store.d.ts.map +1 -0
  7. package/dist/db/capability-store.js +201 -0
  8. package/dist/db/capability-store.js.map +1 -0
  9. package/dist/db/migrate.d.ts.map +1 -1
  10. package/dist/db/migrate.js +136 -0
  11. package/dist/db/migrate.js.map +1 -1
  12. package/dist/db/schema.sqlite.d.ts +1663 -2
  13. package/dist/db/schema.sqlite.d.ts.map +1 -1
  14. package/dist/db/schema.sqlite.js +135 -1
  15. package/dist/db/schema.sqlite.js.map +1 -1
  16. package/dist/index.d.ts +5 -0
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +32 -0
  19. package/dist/index.js.map +1 -1
  20. package/dist/lib/redaction/human-review-layer.d.ts +37 -0
  21. package/dist/lib/redaction/human-review-layer.d.ts.map +1 -0
  22. package/dist/lib/redaction/human-review-layer.js +62 -0
  23. package/dist/lib/redaction/human-review-layer.js.map +1 -0
  24. package/dist/lib/redaction/index.d.ts +12 -0
  25. package/dist/lib/redaction/index.d.ts.map +1 -0
  26. package/dist/lib/redaction/index.js +12 -0
  27. package/dist/lib/redaction/index.js.map +1 -0
  28. package/dist/lib/redaction/pii-detection-layer.d.ts +30 -0
  29. package/dist/lib/redaction/pii-detection-layer.d.ts.map +1 -0
  30. package/dist/lib/redaction/pii-detection-layer.js +183 -0
  31. package/dist/lib/redaction/pii-detection-layer.js.map +1 -0
  32. package/dist/lib/redaction/pipeline.d.ts +26 -0
  33. package/dist/lib/redaction/pipeline.d.ts.map +1 -0
  34. package/dist/lib/redaction/pipeline.js +91 -0
  35. package/dist/lib/redaction/pipeline.js.map +1 -0
  36. package/dist/lib/redaction/secret-detection-layer.d.ts +10 -0
  37. package/dist/lib/redaction/secret-detection-layer.d.ts.map +1 -0
  38. package/dist/lib/redaction/secret-detection-layer.js +79 -0
  39. package/dist/lib/redaction/secret-detection-layer.js.map +1 -0
  40. package/dist/lib/redaction/secret-patterns.d.ts +29 -0
  41. package/dist/lib/redaction/secret-patterns.d.ts.map +1 -0
  42. package/dist/lib/redaction/secret-patterns.js +133 -0
  43. package/dist/lib/redaction/secret-patterns.js.map +1 -0
  44. package/dist/lib/redaction/semantic-denylist-layer.d.ts +10 -0
  45. package/dist/lib/redaction/semantic-denylist-layer.d.ts.map +1 -0
  46. package/dist/lib/redaction/semantic-denylist-layer.js +64 -0
  47. package/dist/lib/redaction/semantic-denylist-layer.js.map +1 -0
  48. package/dist/lib/redaction/tenant-deidentification-layer.d.ts +10 -0
  49. package/dist/lib/redaction/tenant-deidentification-layer.d.ts.map +1 -0
  50. package/dist/lib/redaction/tenant-deidentification-layer.js +64 -0
  51. package/dist/lib/redaction/tenant-deidentification-layer.js.map +1 -0
  52. package/dist/lib/redaction/url-path-scrubbing-layer.d.ts +14 -0
  53. package/dist/lib/redaction/url-path-scrubbing-layer.d.ts.map +1 -0
  54. package/dist/lib/redaction/url-path-scrubbing-layer.js +156 -0
  55. package/dist/lib/redaction/url-path-scrubbing-layer.js.map +1 -0
  56. package/dist/routes/agents.d.ts.map +1 -1
  57. package/dist/routes/agents.js +3 -9
  58. package/dist/routes/agents.js.map +1 -1
  59. package/dist/routes/audit.d.ts +15 -0
  60. package/dist/routes/audit.d.ts.map +1 -0
  61. package/dist/routes/audit.js +177 -0
  62. package/dist/routes/audit.js.map +1 -0
  63. package/dist/routes/capabilities.d.ts +15 -0
  64. package/dist/routes/capabilities.d.ts.map +1 -0
  65. package/dist/routes/capabilities.js +86 -0
  66. package/dist/routes/capabilities.js.map +1 -0
  67. package/dist/routes/community.d.ts +24 -0
  68. package/dist/routes/community.d.ts.map +1 -0
  69. package/dist/routes/community.js +190 -0
  70. package/dist/routes/community.js.map +1 -0
  71. package/dist/routes/delegation.d.ts +20 -0
  72. package/dist/routes/delegation.d.ts.map +1 -0
  73. package/dist/routes/delegation.js +108 -0
  74. package/dist/routes/delegation.js.map +1 -0
  75. package/dist/routes/discovery.d.ts +19 -0
  76. package/dist/routes/discovery.d.ts.map +1 -0
  77. package/dist/routes/discovery.js +96 -0
  78. package/dist/routes/discovery.js.map +1 -0
  79. package/dist/routes/redaction-test.d.ts +14 -0
  80. package/dist/routes/redaction-test.d.ts.map +1 -0
  81. package/dist/routes/redaction-test.js +33 -0
  82. package/dist/routes/redaction-test.js.map +1 -0
  83. package/dist/routes/trust.d.ts +16 -0
  84. package/dist/routes/trust.d.ts.map +1 -0
  85. package/dist/routes/trust.js +23 -0
  86. package/dist/routes/trust.js.map +1 -0
  87. package/dist/services/community-service.d.ts +277 -0
  88. package/dist/services/community-service.d.ts.map +1 -0
  89. package/dist/services/community-service.js +785 -0
  90. package/dist/services/community-service.js.map +1 -0
  91. package/dist/services/delegation-service.d.ts +149 -0
  92. package/dist/services/delegation-service.d.ts.map +1 -0
  93. package/dist/services/delegation-service.js +605 -0
  94. package/dist/services/delegation-service.js.map +1 -0
  95. package/dist/services/discovery-service.d.ts +39 -0
  96. package/dist/services/discovery-service.d.ts.map +1 -0
  97. package/dist/services/discovery-service.js +186 -0
  98. package/dist/services/discovery-service.js.map +1 -0
  99. package/dist/services/trust-service.d.ts +59 -0
  100. package/dist/services/trust-service.d.ts.map +1 -0
  101. package/dist/services/trust-service.js +139 -0
  102. package/dist/services/trust-service.js.map +1 -0
  103. package/package.json +2 -2
@@ -0,0 +1,605 @@
1
+ /**
2
+ * Delegation Service (Stories 6.1 + 6.2 — Delegation Core & Inbox)
3
+ *
4
+ * Implements the 4-phase delegation protocol: REQUEST → ACCEPT → EXECUTE → RETURN
5
+ * Uses a PoolTransport interface for communication (LocalPoolTransport for testing).
6
+ */
7
+ import { randomUUID } from 'node:crypto';
8
+ import { eq, and } from 'drizzle-orm';
9
+ import { delegationLog, capabilityRegistry } from '../db/schema.sqlite.js';
10
+ import { AnonymousIdManager } from '../db/anonymous-id-manager.js';
11
+ import { DiscoveryService, RateLimiter } from './discovery-service.js';
12
+ import { TrustService } from './trust-service.js';
13
+ import { RedactionPipeline } from '../lib/redaction/pipeline.js';
14
+ import { createRawLessonContent } from '@agentlensai/core';
15
+ // ─── Local Pool Transport (in-memory, for testing) ────────
16
+ export class LocalPoolTransport {
17
+ requests = new Map();
18
+ async sendDelegationRequest(request) {
19
+ this.requests.set(request.requestId, { ...request });
20
+ }
21
+ async pollDelegationInbox(targetAnonymousId) {
22
+ const results = [];
23
+ for (const req of this.requests.values()) {
24
+ if (req.targetAnonymousId === targetAnonymousId && req.status === 'request') {
25
+ results.push({ ...req });
26
+ }
27
+ }
28
+ return results;
29
+ }
30
+ async updateDelegationStatus(requestId, status, output) {
31
+ const req = this.requests.get(requestId);
32
+ if (!req)
33
+ return null;
34
+ req.status = status;
35
+ if (output !== undefined)
36
+ req.output = output;
37
+ if (status === 'completed' || status === 'rejected' || status === 'timeout' || status === 'error') {
38
+ req.completedAt = new Date().toISOString();
39
+ }
40
+ return { ...req };
41
+ }
42
+ async getDelegationRequest(requestId) {
43
+ const req = this.requests.get(requestId);
44
+ return req ? { ...req } : null;
45
+ }
46
+ /** Reset for testing */
47
+ clear() {
48
+ this.requests.clear();
49
+ }
50
+ /** Get all requests (for testing inspection) */
51
+ getAll() {
52
+ return Array.from(this.requests.values());
53
+ }
54
+ }
55
+ // ─── Delegation Service ───────────────────────────────────
56
+ export class DelegationService {
57
+ db;
58
+ transport;
59
+ anonIdManager;
60
+ discoveryService;
61
+ trustService;
62
+ redactionPipeline;
63
+ defaultTimeoutMs;
64
+ acceptTimeoutMs;
65
+ now;
66
+ inboundLimiter = new RateLimiter();
67
+ constructor(db, transport, options) {
68
+ this.db = db;
69
+ this.transport = transport;
70
+ this.anonIdManager = new AnonymousIdManager(db);
71
+ this.discoveryService = new DiscoveryService(db);
72
+ this.trustService = new TrustService(db);
73
+ this.redactionPipeline = new RedactionPipeline(options?.redactionConfig);
74
+ this.defaultTimeoutMs = options?.defaultTimeoutMs ?? 30_000;
75
+ this.acceptTimeoutMs = options?.acceptTimeoutMs ?? 5_000;
76
+ this.now = options?.now ?? (() => new Date());
77
+ }
78
+ // ─── Outbound: delegate() ─────────────────────────────
79
+ /**
80
+ * Send a delegation request to a target agent (outbound).
81
+ * Implements the 4-phase protocol: REQUEST → ACCEPT → EXECUTE → RETURN
82
+ * Supports fallback: on failure/timeout, retries with next-ranked discovery result.
83
+ */
84
+ async delegate(tenantId, agentId, request) {
85
+ const fallbackEnabled = request.fallbackEnabled ?? false;
86
+ const maxRetries = Math.min(request.maxRetries ?? 3, 10);
87
+ // Build list of targets to try: primary target first, then fallback candidates
88
+ const targets = [request.targetAnonymousId];
89
+ if (fallbackEnabled && maxRetries > 0) {
90
+ // Discover alternative targets for fallback
91
+ const alternatives = this.discoveryService.discover(tenantId, {
92
+ taskType: request.taskType,
93
+ scope: 'internal',
94
+ limit: maxRetries + 5,
95
+ });
96
+ for (const alt of alternatives) {
97
+ if (alt.anonymousAgentId !== request.targetAnonymousId && !targets.includes(alt.anonymousAgentId)) {
98
+ targets.push(alt.anonymousAgentId);
99
+ }
100
+ if (targets.length >= maxRetries + 1)
101
+ break; // +1 for original
102
+ }
103
+ }
104
+ let retriesUsed = 0;
105
+ let lastResult;
106
+ for (let attempt = 0; attempt < targets.length; attempt++) {
107
+ const targetAnonId = targets[attempt];
108
+ const result = await this.delegateSingle(tenantId, agentId, {
109
+ ...request,
110
+ targetAnonymousId: targetAnonId,
111
+ requestId: attempt === 0 ? request.requestId : undefined,
112
+ });
113
+ // Update trust after each delegation outcome
114
+ this.updateTrustAfterDelegation(tenantId, agentId);
115
+ lastResult = result;
116
+ if (result.status === 'success') {
117
+ return { ...result, retriesUsed };
118
+ }
119
+ // If fallback not enabled or this was the last attempt, return
120
+ if (!fallbackEnabled || attempt >= targets.length - 1) {
121
+ return { ...result, retriesUsed };
122
+ }
123
+ retriesUsed++;
124
+ }
125
+ return { ...lastResult, retriesUsed };
126
+ }
127
+ /**
128
+ * Execute a single delegation attempt (no fallback).
129
+ */
130
+ async delegateSingle(tenantId, agentId, request) {
131
+ const requestId = request.requestId ?? randomUUID();
132
+ const timeoutMs = request.timeoutMs ?? this.defaultTimeoutMs;
133
+ const startTime = this.now().getTime();
134
+ // 1. Check delegation is enabled at tenant level
135
+ const config = this.discoveryService.getDiscoveryConfig(tenantId);
136
+ if (!config.delegationEnabled) {
137
+ return {
138
+ requestId,
139
+ status: 'rejected',
140
+ output: 'Delegation is disabled for this tenant',
141
+ };
142
+ }
143
+ // 2. Check outbound rate limit
144
+ const agentCaps = this.getAgentCapabilities(tenantId, agentId);
145
+ const outboundLimit = agentCaps?.outboundRateLimit ?? 20;
146
+ if (!this.discoveryService.checkOutboundRateLimit(agentId, outboundLimit)) {
147
+ this.logDelegation(tenantId, {
148
+ id: requestId,
149
+ direction: 'outbound',
150
+ agentId,
151
+ anonymousTargetId: request.targetAnonymousId,
152
+ taskType: request.taskType,
153
+ status: 'error',
154
+ createdAt: this.now().toISOString(),
155
+ completedAt: this.now().toISOString(),
156
+ });
157
+ return {
158
+ requestId,
159
+ status: 'error',
160
+ output: 'Outbound rate limit exceeded',
161
+ };
162
+ }
163
+ // 3. Check trust threshold (H5 FIX: now actually computes trust)
164
+ const trustOk = this.checkTrustThreshold(tenantId, request.targetAnonymousId, agentId);
165
+ if (!trustOk) {
166
+ this.logDelegation(tenantId, {
167
+ id: requestId,
168
+ direction: 'outbound',
169
+ agentId,
170
+ anonymousTargetId: request.targetAnonymousId,
171
+ taskType: request.taskType,
172
+ status: 'rejected',
173
+ createdAt: this.now().toISOString(),
174
+ completedAt: this.now().toISOString(),
175
+ });
176
+ return {
177
+ requestId,
178
+ status: 'rejected',
179
+ output: 'Target does not meet minimum trust threshold',
180
+ };
181
+ }
182
+ // 4. Get anonymous ID for the requesting agent
183
+ const requesterAnonId = this.anonIdManager.getOrRotateAnonymousId(tenantId, agentId);
184
+ // 4b. H2 FIX: Redact delegation input before sending to pool
185
+ let redactedInput = request.input;
186
+ try {
187
+ const inputStr = typeof request.input === 'string' ? request.input : JSON.stringify(request.input);
188
+ const rawContent = createRawLessonContent('delegation-input', inputStr, {});
189
+ const redactionResult = await this.redactionPipeline.process(rawContent, {
190
+ tenantId,
191
+ agentId,
192
+ category: 'delegation',
193
+ denyListPatterns: [],
194
+ knownTenantTerms: [],
195
+ });
196
+ if (redactionResult.status === 'redacted') {
197
+ redactedInput = redactionResult.content.content;
198
+ }
199
+ else if (redactionResult.status === 'blocked') {
200
+ return {
201
+ requestId,
202
+ status: 'rejected',
203
+ output: `Delegation input blocked by redaction: ${redactionResult.reason}`,
204
+ };
205
+ }
206
+ // On error, fall through with original input (fail-open for delegation usability)
207
+ }
208
+ catch {
209
+ // Redaction failure should not block delegation
210
+ }
211
+ // 5. Send request to pool transport
212
+ const poolRequest = {
213
+ requestId,
214
+ requesterAnonymousId: requesterAnonId,
215
+ targetAnonymousId: request.targetAnonymousId,
216
+ taskType: request.taskType,
217
+ input: redactedInput,
218
+ timeoutMs,
219
+ status: 'request',
220
+ createdAt: this.now().toISOString(),
221
+ };
222
+ await this.transport.sendDelegationRequest(poolRequest);
223
+ // Log the outbound delegation
224
+ this.logDelegation(tenantId, {
225
+ id: requestId,
226
+ direction: 'outbound',
227
+ agentId,
228
+ anonymousTargetId: request.targetAnonymousId,
229
+ taskType: request.taskType,
230
+ status: 'request',
231
+ requestSizeBytes: JSON.stringify(request.input).length,
232
+ createdAt: this.now().toISOString(),
233
+ });
234
+ // 6. Wait for result (poll-based with timeout)
235
+ const result = await this.waitForResult(requestId, timeoutMs, startTime);
236
+ // 7. Update delegation log
237
+ const executionTimeMs = this.now().getTime() - startTime;
238
+ this.updateDelegationLog(tenantId, requestId, {
239
+ status: result.status === 'success' ? 'completed' : result.status,
240
+ executionTimeMs,
241
+ responseSizeBytes: result.output ? JSON.stringify(result.output).length : undefined,
242
+ completedAt: this.now().toISOString(),
243
+ });
244
+ return {
245
+ ...result,
246
+ requestId,
247
+ executionTimeMs,
248
+ };
249
+ }
250
+ /**
251
+ * Update trust score after a delegation outcome.
252
+ */
253
+ updateTrustAfterDelegation(tenantId, agentId) {
254
+ try {
255
+ this.trustService.updateAfterDelegation(tenantId, agentId);
256
+ }
257
+ catch {
258
+ // Trust updates should not break delegation
259
+ }
260
+ }
261
+ // ─── Inbound: inbox & acceptance ──────────────────────
262
+ /**
263
+ * Poll the inbox for pending delegation requests targeting this agent.
264
+ */
265
+ async getInbox(tenantId, agentId) {
266
+ const anonId = this.anonIdManager.getOrRotateAnonymousId(tenantId, agentId);
267
+ const pending = await this.transport.pollDelegationInbox(anonId);
268
+ // Filter out expired requests (accept timeout)
269
+ const now = this.now().getTime();
270
+ const valid = [];
271
+ for (const req of pending) {
272
+ const createdAt = new Date(req.createdAt).getTime();
273
+ if (now - createdAt > this.acceptTimeoutMs) {
274
+ // Auto-reject expired requests
275
+ await this.transport.updateDelegationStatus(req.requestId, 'timeout');
276
+ }
277
+ else {
278
+ valid.push(req);
279
+ }
280
+ }
281
+ return valid;
282
+ }
283
+ /**
284
+ * Accept a delegation request.
285
+ */
286
+ async acceptDelegation(tenantId, agentId, requestId) {
287
+ // Check acceptDelegations toggle
288
+ const caps = this.getAgentCapabilities(tenantId, agentId);
289
+ if (!caps?.acceptDelegations) {
290
+ // Reject — acceptDelegations is disabled
291
+ await this.transport.updateDelegationStatus(requestId, 'rejected');
292
+ return { ok: false, error: 'Agent does not accept delegations' };
293
+ }
294
+ // Check inbound rate limit
295
+ const inboundLimit = caps.inboundRateLimit ?? 10;
296
+ if (!this.inboundLimiter.check(`inbound:${agentId}`, inboundLimit)) {
297
+ await this.transport.updateDelegationStatus(requestId, 'rejected');
298
+ return { ok: false, error: 'Inbound rate limit exceeded' };
299
+ }
300
+ // Check the request exists and is in 'request' status
301
+ const req = await this.transport.getDelegationRequest(requestId);
302
+ if (!req) {
303
+ return { ok: false, error: 'Delegation request not found' };
304
+ }
305
+ // Check accept timeout
306
+ const createdAt = new Date(req.createdAt).getTime();
307
+ const now = this.now().getTime();
308
+ if (now - createdAt > this.acceptTimeoutMs) {
309
+ await this.transport.updateDelegationStatus(requestId, 'timeout');
310
+ return { ok: false, error: 'Accept timeout exceeded' };
311
+ }
312
+ if (req.status !== 'request') {
313
+ return { ok: false, error: `Cannot accept delegation in status: ${req.status}` };
314
+ }
315
+ // Verify the target matches this agent's anonymous ID
316
+ const anonId = this.anonIdManager.getOrRotateAnonymousId(tenantId, agentId);
317
+ if (req.targetAnonymousId !== anonId) {
318
+ return { ok: false, error: 'Delegation request is not targeted at this agent' };
319
+ }
320
+ await this.transport.updateDelegationStatus(requestId, 'accepted');
321
+ // Log inbound delegation
322
+ this.logDelegation(tenantId, {
323
+ id: requestId,
324
+ direction: 'inbound',
325
+ agentId,
326
+ anonymousSourceId: req.requesterAnonymousId,
327
+ taskType: req.taskType,
328
+ status: 'accepted',
329
+ requestSizeBytes: JSON.stringify(req.input).length,
330
+ createdAt: req.createdAt,
331
+ });
332
+ return { ok: true };
333
+ }
334
+ /**
335
+ * Reject a delegation request.
336
+ */
337
+ async rejectDelegation(tenantId, agentId, requestId, reason) {
338
+ const req = await this.transport.getDelegationRequest(requestId);
339
+ if (!req) {
340
+ return { ok: false, error: 'Delegation request not found' };
341
+ }
342
+ if (req.status !== 'request' && req.status !== 'accepted') {
343
+ return { ok: false, error: `Cannot reject delegation in status: ${req.status}` };
344
+ }
345
+ // Verify the target matches this agent
346
+ const anonId = this.anonIdManager.getOrRotateAnonymousId(tenantId, agentId);
347
+ if (req.targetAnonymousId !== anonId) {
348
+ return { ok: false, error: 'Delegation request is not targeted at this agent' };
349
+ }
350
+ await this.transport.updateDelegationStatus(requestId, 'rejected');
351
+ // Log
352
+ this.logDelegation(tenantId, {
353
+ id: requestId,
354
+ direction: 'inbound',
355
+ agentId,
356
+ anonymousSourceId: req.requesterAnonymousId,
357
+ taskType: req.taskType,
358
+ status: 'rejected',
359
+ createdAt: req.createdAt,
360
+ completedAt: this.now().toISOString(),
361
+ });
362
+ return { ok: true };
363
+ }
364
+ /**
365
+ * Complete a delegation request with a result.
366
+ */
367
+ async completeDelegation(tenantId, agentId, requestId, output) {
368
+ const req = await this.transport.getDelegationRequest(requestId);
369
+ if (!req) {
370
+ return { ok: false, error: 'Delegation request not found' };
371
+ }
372
+ if (req.status !== 'accepted' && req.status !== 'executing') {
373
+ return { ok: false, error: `Cannot complete delegation in status: ${req.status}` };
374
+ }
375
+ // Verify the target matches this agent
376
+ const anonId = this.anonIdManager.getOrRotateAnonymousId(tenantId, agentId);
377
+ if (req.targetAnonymousId !== anonId) {
378
+ return { ok: false, error: 'Delegation request is not targeted at this agent' };
379
+ }
380
+ await this.transport.updateDelegationStatus(requestId, 'completed', output);
381
+ // Update log
382
+ const completedAt = this.now().toISOString();
383
+ this.updateDelegationLog(tenantId, requestId, {
384
+ status: 'completed',
385
+ responseSizeBytes: JSON.stringify(output).length,
386
+ completedAt,
387
+ });
388
+ return { ok: true };
389
+ }
390
+ // ─── Helpers ──────────────────────────────────────────
391
+ getAgentCapabilities(tenantId, agentId) {
392
+ // Query capability_registry for the agent's permission settings
393
+ const rows = this.db
394
+ .select()
395
+ .from(capabilityRegistry)
396
+ .where(and(eq(capabilityRegistry.tenantId, tenantId), eq(capabilityRegistry.agentId, agentId)))
397
+ .all();
398
+ if (rows.length === 0)
399
+ return null;
400
+ // Use the first capability's settings (all caps for an agent share settings)
401
+ const row = rows[0];
402
+ return {
403
+ outboundRateLimit: row.outboundRateLimit,
404
+ inboundRateLimit: row.inboundRateLimit,
405
+ acceptDelegations: row.acceptDelegations,
406
+ };
407
+ }
408
+ /**
409
+ * H5 FIX: Actually check trust threshold using the TrustService.
410
+ * Computes the requesting agent's trust score on-the-fly and compares
411
+ * against the tenant's minimum trust threshold.
412
+ */
413
+ checkTrustThreshold(tenantId, _targetAnonymousId, agentId) {
414
+ if (!agentId)
415
+ return true; // Can't check without agentId
416
+ try {
417
+ const config = this.discoveryService.getDiscoveryConfig(tenantId);
418
+ const trustScore = this.trustService.getTrustScore(tenantId, agentId);
419
+ return trustScore.percentile >= config.minTrustThreshold;
420
+ }
421
+ catch {
422
+ // If trust computation fails, fail-open to avoid breaking delegation
423
+ return true;
424
+ }
425
+ }
426
+ async waitForResult(requestId, timeoutMs, startTime) {
427
+ // Poll for result with small intervals
428
+ const pollInterval = 50; // ms
429
+ while (true) {
430
+ const elapsed = this.now().getTime() - startTime;
431
+ if (elapsed >= timeoutMs) {
432
+ await this.transport.updateDelegationStatus(requestId, 'timeout');
433
+ return { requestId, status: 'timeout' };
434
+ }
435
+ const req = await this.transport.getDelegationRequest(requestId);
436
+ if (!req) {
437
+ return { requestId, status: 'error', output: 'Request not found' };
438
+ }
439
+ if (req.status === 'completed') {
440
+ return { requestId, status: 'success', output: req.output };
441
+ }
442
+ if (req.status === 'rejected') {
443
+ return { requestId, status: 'rejected' };
444
+ }
445
+ if (req.status === 'timeout') {
446
+ return { requestId, status: 'timeout' };
447
+ }
448
+ if (req.status === 'error') {
449
+ return { requestId, status: 'error', output: req.output };
450
+ }
451
+ // Wait before next poll
452
+ await new Promise((resolve) => setTimeout(resolve, pollInterval));
453
+ }
454
+ }
455
+ logDelegation(tenantId, data) {
456
+ try {
457
+ // Check if entry already exists (upsert logic)
458
+ const existing = this.db
459
+ .select()
460
+ .from(delegationLog)
461
+ .where(eq(delegationLog.id, data.id))
462
+ .get();
463
+ if (existing) {
464
+ // Update existing
465
+ this.updateDelegationLog(tenantId, data.id, {
466
+ status: data.status,
467
+ responseSizeBytes: data.responseSizeBytes,
468
+ executionTimeMs: data.executionTimeMs,
469
+ completedAt: data.completedAt,
470
+ });
471
+ return;
472
+ }
473
+ this.db.insert(delegationLog).values({
474
+ id: data.id,
475
+ tenantId,
476
+ direction: data.direction,
477
+ agentId: data.agentId,
478
+ anonymousTargetId: data.anonymousTargetId ?? null,
479
+ anonymousSourceId: data.anonymousSourceId ?? null,
480
+ taskType: data.taskType,
481
+ status: data.status,
482
+ requestSizeBytes: data.requestSizeBytes ?? null,
483
+ responseSizeBytes: data.responseSizeBytes ?? null,
484
+ executionTimeMs: data.executionTimeMs ?? null,
485
+ costUsd: data.costUsd ?? null,
486
+ createdAt: data.createdAt,
487
+ completedAt: data.completedAt ?? null,
488
+ }).run();
489
+ }
490
+ catch {
491
+ // Log failures should not break delegation
492
+ }
493
+ }
494
+ updateDelegationLog(tenantId, requestId, updates) {
495
+ try {
496
+ const setObj = {};
497
+ if (updates.status !== undefined)
498
+ setObj.status = updates.status;
499
+ if (updates.responseSizeBytes !== undefined)
500
+ setObj.responseSizeBytes = updates.responseSizeBytes;
501
+ if (updates.executionTimeMs !== undefined)
502
+ setObj.executionTimeMs = updates.executionTimeMs;
503
+ if (updates.completedAt !== undefined)
504
+ setObj.completedAt = updates.completedAt;
505
+ if (Object.keys(setObj).length > 0) {
506
+ this.db
507
+ .update(delegationLog)
508
+ .set(setObj)
509
+ .where(and(eq(delegationLog.id, requestId), eq(delegationLog.tenantId, tenantId)))
510
+ .run();
511
+ }
512
+ }
513
+ catch {
514
+ // Log failures should not break delegation
515
+ }
516
+ }
517
+ /**
518
+ * Get delegation logs for a tenant (for auditing/dashboard).
519
+ */
520
+ getDelegationLogs(tenantId, agentId) {
521
+ if (agentId) {
522
+ return this.db
523
+ .select()
524
+ .from(delegationLog)
525
+ .where(and(eq(delegationLog.tenantId, tenantId), eq(delegationLog.agentId, agentId)))
526
+ .all();
527
+ }
528
+ return this.db
529
+ .select()
530
+ .from(delegationLog)
531
+ .where(eq(delegationLog.tenantId, tenantId))
532
+ .all();
533
+ }
534
+ // ─── Story 6.5: Delegation Audit & Logging ────────────
535
+ /**
536
+ * Get delegations for a specific agent with filters.
537
+ */
538
+ getDelegationsForAgent(tenantId, agentId, filters) {
539
+ let rows = this.db
540
+ .select()
541
+ .from(delegationLog)
542
+ .where(and(eq(delegationLog.tenantId, tenantId), eq(delegationLog.agentId, agentId)))
543
+ .all();
544
+ if (filters?.direction) {
545
+ rows = rows.filter((r) => r.direction === filters.direction);
546
+ }
547
+ if (filters?.status) {
548
+ rows = rows.filter((r) => r.status === filters.status);
549
+ }
550
+ if (filters?.dateFrom) {
551
+ rows = rows.filter((r) => r.createdAt >= filters.dateFrom);
552
+ }
553
+ if (filters?.dateTo) {
554
+ rows = rows.filter((r) => r.createdAt <= filters.dateTo);
555
+ }
556
+ return rows;
557
+ }
558
+ /**
559
+ * Export delegation logs as JSON for a tenant.
560
+ */
561
+ exportDelegationLogs(tenantId) {
562
+ const logs = this.getDelegationLogs(tenantId);
563
+ return JSON.stringify(logs, null, 2);
564
+ }
565
+ /**
566
+ * Cleanup delegation logs older than retention period.
567
+ * Default: 90 days. Configurable via retentionDays parameter.
568
+ */
569
+ cleanupOldLogs(tenantId, retentionDays = 90) {
570
+ const cutoff = new Date(this.now().getTime() - retentionDays * 24 * 60 * 60 * 1000);
571
+ const cutoffIso = cutoff.toISOString();
572
+ // Get count before delete
573
+ const oldLogs = this.db
574
+ .select()
575
+ .from(delegationLog)
576
+ .where(eq(delegationLog.tenantId, tenantId))
577
+ .all()
578
+ .filter((r) => r.createdAt < cutoffIso);
579
+ for (const log of oldLogs) {
580
+ this.db
581
+ .delete(delegationLog)
582
+ .where(and(eq(delegationLog.id, log.id), eq(delegationLog.tenantId, tenantId)))
583
+ .run();
584
+ }
585
+ return oldLogs.length;
586
+ }
587
+ /**
588
+ * Detect volume alerts: >100 delegations/hour triggers alert flag.
589
+ * Returns true if alert should fire.
590
+ */
591
+ checkVolumeAlert(tenantId, threshold = 100) {
592
+ const oneHourAgo = new Date(this.now().getTime() - 60 * 60 * 1000).toISOString();
593
+ const recentLogs = this.db
594
+ .select()
595
+ .from(delegationLog)
596
+ .where(eq(delegationLog.tenantId, tenantId))
597
+ .all()
598
+ .filter((r) => r.createdAt >= oneHourAgo);
599
+ return {
600
+ alert: recentLogs.length > threshold,
601
+ count: recentLogs.length,
602
+ };
603
+ }
604
+ }
605
+ //# sourceMappingURL=delegation-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delegation-service.js","sourceRoot":"","sources":["../../src/services/delegation-service.ts"],"names":[],"mappings":"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"}