@vorionsys/a3i 0.1.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 (166) hide show
  1. package/LICENSE +190 -0
  2. package/dist/api/handlers.d.ts +231 -0
  3. package/dist/api/handlers.d.ts.map +1 -0
  4. package/dist/api/handlers.js +279 -0
  5. package/dist/api/handlers.js.map +1 -0
  6. package/dist/api/index.d.ts +24 -0
  7. package/dist/api/index.d.ts.map +1 -0
  8. package/dist/api/index.js +27 -0
  9. package/dist/api/index.js.map +1 -0
  10. package/dist/api/middleware.d.ts +106 -0
  11. package/dist/api/middleware.d.ts.map +1 -0
  12. package/dist/api/middleware.js +186 -0
  13. package/dist/api/middleware.js.map +1 -0
  14. package/dist/api/routes.d.ts +41 -0
  15. package/dist/api/routes.d.ts.map +1 -0
  16. package/dist/api/routes.js +91 -0
  17. package/dist/api/routes.js.map +1 -0
  18. package/dist/authorization/constraints.d.ts +75 -0
  19. package/dist/authorization/constraints.d.ts.map +1 -0
  20. package/dist/authorization/constraints.js +302 -0
  21. package/dist/authorization/constraints.js.map +1 -0
  22. package/dist/authorization/decision.d.ts +98 -0
  23. package/dist/authorization/decision.d.ts.map +1 -0
  24. package/dist/authorization/decision.js +202 -0
  25. package/dist/authorization/decision.js.map +1 -0
  26. package/dist/authorization/engine.d.ts +141 -0
  27. package/dist/authorization/engine.d.ts.map +1 -0
  28. package/dist/authorization/engine.js +339 -0
  29. package/dist/authorization/engine.js.map +1 -0
  30. package/dist/authorization/index.d.ts +10 -0
  31. package/dist/authorization/index.d.ts.map +1 -0
  32. package/dist/authorization/index.js +13 -0
  33. package/dist/authorization/index.js.map +1 -0
  34. package/dist/banding/band-calculator.d.ts +137 -0
  35. package/dist/banding/band-calculator.d.ts.map +1 -0
  36. package/dist/banding/band-calculator.js +252 -0
  37. package/dist/banding/band-calculator.js.map +1 -0
  38. package/dist/banding/bands.d.ts +56 -0
  39. package/dist/banding/bands.d.ts.map +1 -0
  40. package/dist/banding/bands.js +200 -0
  41. package/dist/banding/bands.js.map +1 -0
  42. package/dist/banding/hysteresis.d.ts +64 -0
  43. package/dist/banding/hysteresis.d.ts.map +1 -0
  44. package/dist/banding/hysteresis.js +143 -0
  45. package/dist/banding/hysteresis.js.map +1 -0
  46. package/dist/banding/index.d.ts +10 -0
  47. package/dist/banding/index.d.ts.map +1 -0
  48. package/dist/banding/index.js +10 -0
  49. package/dist/banding/index.js.map +1 -0
  50. package/dist/canary/canary-service.d.ts +123 -0
  51. package/dist/canary/canary-service.d.ts.map +1 -0
  52. package/dist/canary/canary-service.js +353 -0
  53. package/dist/canary/canary-service.js.map +1 -0
  54. package/dist/canary/index.d.ts +12 -0
  55. package/dist/canary/index.d.ts.map +1 -0
  56. package/dist/canary/index.js +14 -0
  57. package/dist/canary/index.js.map +1 -0
  58. package/dist/canary/probe-library.d.ts +43 -0
  59. package/dist/canary/probe-library.d.ts.map +1 -0
  60. package/dist/canary/probe-library.js +655 -0
  61. package/dist/canary/probe-library.js.map +1 -0
  62. package/dist/execution/engine.d.ts +120 -0
  63. package/dist/execution/engine.d.ts.map +1 -0
  64. package/dist/execution/engine.js +220 -0
  65. package/dist/execution/engine.js.map +1 -0
  66. package/dist/execution/index.d.ts +7 -0
  67. package/dist/execution/index.d.ts.map +1 -0
  68. package/dist/execution/index.js +7 -0
  69. package/dist/execution/index.js.map +1 -0
  70. package/dist/gate/index.d.ts +12 -0
  71. package/dist/gate/index.d.ts.map +1 -0
  72. package/dist/gate/index.js +14 -0
  73. package/dist/gate/index.js.map +1 -0
  74. package/dist/gate/pre-action-gate.d.ts +87 -0
  75. package/dist/gate/pre-action-gate.d.ts.map +1 -0
  76. package/dist/gate/pre-action-gate.js +286 -0
  77. package/dist/gate/pre-action-gate.js.map +1 -0
  78. package/dist/gate/risk-classifier.d.ts +43 -0
  79. package/dist/gate/risk-classifier.d.ts.map +1 -0
  80. package/dist/gate/risk-classifier.js +157 -0
  81. package/dist/gate/risk-classifier.js.map +1 -0
  82. package/dist/hooks/executor.d.ts +56 -0
  83. package/dist/hooks/executor.d.ts.map +1 -0
  84. package/dist/hooks/executor.js +217 -0
  85. package/dist/hooks/executor.js.map +1 -0
  86. package/dist/hooks/index.d.ts +45 -0
  87. package/dist/hooks/index.d.ts.map +1 -0
  88. package/dist/hooks/index.js +49 -0
  89. package/dist/hooks/index.js.map +1 -0
  90. package/dist/hooks/manager.d.ts +156 -0
  91. package/dist/hooks/manager.d.ts.map +1 -0
  92. package/dist/hooks/manager.js +267 -0
  93. package/dist/hooks/manager.js.map +1 -0
  94. package/dist/hooks/registry.d.ts +130 -0
  95. package/dist/hooks/registry.d.ts.map +1 -0
  96. package/dist/hooks/registry.js +238 -0
  97. package/dist/hooks/registry.js.map +1 -0
  98. package/dist/hooks/types.d.ts +226 -0
  99. package/dist/hooks/types.d.ts.map +1 -0
  100. package/dist/hooks/types.js +41 -0
  101. package/dist/hooks/types.js.map +1 -0
  102. package/dist/index.d.ts +20 -0
  103. package/dist/index.d.ts.map +1 -0
  104. package/dist/index.js +31 -0
  105. package/dist/index.js.map +1 -0
  106. package/dist/observation/attestation.d.ts +102 -0
  107. package/dist/observation/attestation.d.ts.map +1 -0
  108. package/dist/observation/attestation.js +127 -0
  109. package/dist/observation/attestation.js.map +1 -0
  110. package/dist/observation/ceilings.d.ts +60 -0
  111. package/dist/observation/ceilings.d.ts.map +1 -0
  112. package/dist/observation/ceilings.js +110 -0
  113. package/dist/observation/ceilings.js.map +1 -0
  114. package/dist/observation/index.d.ts +11 -0
  115. package/dist/observation/index.d.ts.map +1 -0
  116. package/dist/observation/index.js +14 -0
  117. package/dist/observation/index.js.map +1 -0
  118. package/dist/observation/tiers.d.ts +96 -0
  119. package/dist/observation/tiers.d.ts.map +1 -0
  120. package/dist/observation/tiers.js +225 -0
  121. package/dist/observation/tiers.js.map +1 -0
  122. package/dist/orchestrator/index.d.ts +8 -0
  123. package/dist/orchestrator/index.d.ts.map +1 -0
  124. package/dist/orchestrator/index.js +8 -0
  125. package/dist/orchestrator/index.js.map +1 -0
  126. package/dist/orchestrator/orchestrator.d.ts +225 -0
  127. package/dist/orchestrator/orchestrator.d.ts.map +1 -0
  128. package/dist/orchestrator/orchestrator.js +302 -0
  129. package/dist/orchestrator/orchestrator.js.map +1 -0
  130. package/dist/orchestrator/proof-plane-adapter.d.ts +80 -0
  131. package/dist/orchestrator/proof-plane-adapter.d.ts.map +1 -0
  132. package/dist/orchestrator/proof-plane-adapter.js +78 -0
  133. package/dist/orchestrator/proof-plane-adapter.js.map +1 -0
  134. package/dist/trust/calculator.d.ts +60 -0
  135. package/dist/trust/calculator.d.ts.map +1 -0
  136. package/dist/trust/calculator.js +163 -0
  137. package/dist/trust/calculator.js.map +1 -0
  138. package/dist/trust/dimensions.d.ts +133 -0
  139. package/dist/trust/dimensions.d.ts.map +1 -0
  140. package/dist/trust/dimensions.js +257 -0
  141. package/dist/trust/dimensions.js.map +1 -0
  142. package/dist/trust/index.d.ts +14 -0
  143. package/dist/trust/index.d.ts.map +1 -0
  144. package/dist/trust/index.js +25 -0
  145. package/dist/trust/index.js.map +1 -0
  146. package/dist/trust/profile-service.d.ts +179 -0
  147. package/dist/trust/profile-service.d.ts.map +1 -0
  148. package/dist/trust/profile-service.js +378 -0
  149. package/dist/trust/profile-service.js.map +1 -0
  150. package/dist/trust/profile-store.d.ts +122 -0
  151. package/dist/trust/profile-store.d.ts.map +1 -0
  152. package/dist/trust/profile-store.js +132 -0
  153. package/dist/trust/profile-store.js.map +1 -0
  154. package/dist/trust/trust-calculator.d.ts +111 -0
  155. package/dist/trust/trust-calculator.d.ts.map +1 -0
  156. package/dist/trust/trust-calculator.js +271 -0
  157. package/dist/trust/trust-calculator.js.map +1 -0
  158. package/dist/trust/trust-dynamics.d.ts +152 -0
  159. package/dist/trust/trust-dynamics.d.ts.map +1 -0
  160. package/dist/trust/trust-dynamics.js +302 -0
  161. package/dist/trust/trust-dynamics.js.map +1 -0
  162. package/dist/trust/weights.d.ts +57 -0
  163. package/dist/trust/weights.d.ts.map +1 -0
  164. package/dist/trust/weights.js +75 -0
  165. package/dist/trust/weights.js.map +1 -0
  166. package/package.json +81 -0
@@ -0,0 +1,378 @@
1
+ /**
2
+ * Trust Profile Service - High-level profile management
3
+ *
4
+ * Provides business logic for trust profile operations:
5
+ * - Create, read, update profiles
6
+ * - Calculate new profiles from evidence
7
+ * - Recalculate existing profiles
8
+ * - Profile history and snapshots
9
+ *
10
+ * Hook integration:
11
+ * - TRUST_CHANGE: Fired when a profile is created, updated, or refreshed
12
+ * - TRUST_VIOLATION: Fired when significant trust drops or anomalies detected
13
+ */
14
+ import { v4 as uuidv4 } from 'uuid';
15
+ import { ObservationTier, TrustBand, } from '@vorionsys/contracts';
16
+ import { TrustCalculator } from './trust-calculator.js';
17
+ import { createInMemoryStore, } from './profile-store.js';
18
+ /**
19
+ * TrustProfileService - Manages trust profiles for agents
20
+ */
21
+ export class TrustProfileService {
22
+ store;
23
+ calculator;
24
+ hookManager;
25
+ config;
26
+ constructor(config = {}) {
27
+ this.store = config.store ?? createInMemoryStore();
28
+ this.calculator = new TrustCalculator(config.calculatorConfig);
29
+ this.hookManager = config.hookManager;
30
+ this.config = {
31
+ store: this.store,
32
+ calculatorConfig: config.calculatorConfig ?? {},
33
+ autoRecalculateAfterMs: config.autoRecalculateAfterMs ?? 24 * 60 * 60 * 1000, // 24h
34
+ enableCaching: config.enableCaching ?? false,
35
+ enableHooks: config.enableHooks ?? (config.hookManager !== undefined),
36
+ bandDropViolationThreshold: config.bandDropViolationThreshold ?? 1,
37
+ scoreDropViolationThreshold: config.scoreDropViolationThreshold ?? 20,
38
+ };
39
+ }
40
+ /**
41
+ * Create a new trust profile for an agent
42
+ */
43
+ async create(agentId, observationTier, evidence, options = {}) {
44
+ try {
45
+ // Check if profile already exists
46
+ const existing = await this.store.get(agentId);
47
+ if (existing) {
48
+ return {
49
+ success: false,
50
+ error: `Profile already exists for agent ${agentId}. Use update() instead.`,
51
+ };
52
+ }
53
+ // Calculate the profile
54
+ const profile = this.calculator.calculate(agentId, observationTier, evidence, {
55
+ now: options.now,
56
+ });
57
+ // Override profile ID if provided
58
+ if (options.profileId) {
59
+ profile.profileId = options.profileId;
60
+ }
61
+ // Save to store
62
+ const saved = await this.store.save(profile);
63
+ // Fire trust change hook for new profile
64
+ await this.fireTrustChangeHook(null, saved, 'Profile created');
65
+ return {
66
+ success: true,
67
+ profile: saved,
68
+ isNew: true,
69
+ };
70
+ }
71
+ catch (error) {
72
+ return {
73
+ success: false,
74
+ error: error instanceof Error ? error.message : 'Unknown error',
75
+ };
76
+ }
77
+ }
78
+ /**
79
+ * Get a trust profile by agent ID
80
+ */
81
+ async get(agentId) {
82
+ return this.store.get(agentId);
83
+ }
84
+ /**
85
+ * Get a profile by its unique profile ID
86
+ */
87
+ async getByProfileId(profileId) {
88
+ return this.store.getByProfileId(profileId);
89
+ }
90
+ /**
91
+ * Get or create a profile for an agent
92
+ */
93
+ async getOrCreate(agentId, observationTier, initialEvidence = [], options = {}) {
94
+ const existing = await this.store.get(agentId);
95
+ if (existing) {
96
+ return {
97
+ success: true,
98
+ profile: existing,
99
+ isNew: false,
100
+ };
101
+ }
102
+ return this.create(agentId, observationTier, initialEvidence, options);
103
+ }
104
+ /**
105
+ * Update an existing profile with new evidence
106
+ */
107
+ async update(agentId, newEvidence, options = {}) {
108
+ try {
109
+ const existing = await this.store.get(agentId);
110
+ if (!existing) {
111
+ return {
112
+ success: false,
113
+ error: `No profile found for agent ${agentId}. Use create() first.`,
114
+ };
115
+ }
116
+ // Recalculate with new evidence
117
+ const updated = this.calculator.recalculate(existing, newEvidence, {
118
+ now: options.now,
119
+ });
120
+ // Save updated profile
121
+ const saved = await this.store.save(updated);
122
+ // Fire trust change hook
123
+ await this.fireTrustChangeHook(existing, saved, 'Evidence updated');
124
+ // Check for trust violations
125
+ await this.checkForViolations(existing, saved);
126
+ return {
127
+ success: true,
128
+ profile: saved,
129
+ isNew: false,
130
+ previousVersion: existing.version,
131
+ };
132
+ }
133
+ catch (error) {
134
+ return {
135
+ success: false,
136
+ error: error instanceof Error ? error.message : 'Unknown error',
137
+ };
138
+ }
139
+ }
140
+ /**
141
+ * Recalculate a profile with decay applied (no new evidence)
142
+ */
143
+ async refresh(agentId, options = {}) {
144
+ try {
145
+ const existing = await this.store.get(agentId);
146
+ if (!existing) {
147
+ return {
148
+ success: false,
149
+ error: `No profile found for agent ${agentId}`,
150
+ };
151
+ }
152
+ const now = options.now ?? new Date();
153
+ const age = now.getTime() - existing.calculatedAt.getTime();
154
+ // Skip if not old enough (unless forced)
155
+ if (!options.force && age < this.config.autoRecalculateAfterMs) {
156
+ return {
157
+ success: true,
158
+ profile: existing,
159
+ isNew: false,
160
+ };
161
+ }
162
+ // Apply decay
163
+ const refreshed = this.calculator.applyDecay(existing, { now });
164
+ // Save updated profile
165
+ const saved = await this.store.save(refreshed);
166
+ // Fire trust change hook if there was a change
167
+ if (existing.band !== saved.band || existing.adjustedScore !== saved.adjustedScore) {
168
+ await this.fireTrustChangeHook(existing, saved, 'Decay applied');
169
+ await this.checkForViolations(existing, saved);
170
+ }
171
+ return {
172
+ success: true,
173
+ profile: saved,
174
+ isNew: false,
175
+ previousVersion: existing.version,
176
+ };
177
+ }
178
+ catch (error) {
179
+ return {
180
+ success: false,
181
+ error: error instanceof Error ? error.message : 'Unknown error',
182
+ };
183
+ }
184
+ }
185
+ /**
186
+ * Delete a profile
187
+ */
188
+ async delete(agentId) {
189
+ return this.store.delete(agentId);
190
+ }
191
+ /**
192
+ * Check if a profile exists
193
+ */
194
+ async exists(agentId) {
195
+ return this.store.exists(agentId);
196
+ }
197
+ /**
198
+ * Query profiles with filters
199
+ */
200
+ async query(filter, options) {
201
+ return this.store.query(filter, options);
202
+ }
203
+ /**
204
+ * Get profile history for an agent
205
+ */
206
+ async getHistory(agentId, limit) {
207
+ return this.store.getHistory(agentId, limit);
208
+ }
209
+ /**
210
+ * Get summaries for multiple agents
211
+ */
212
+ async getSummaries(agentIds) {
213
+ return this.store.getSummaries(agentIds);
214
+ }
215
+ /**
216
+ * Get all agent IDs with profiles
217
+ */
218
+ async listAgentIds(options) {
219
+ const result = await this.store.query({}, options);
220
+ return result.profiles.map((p) => p.agentId);
221
+ }
222
+ /**
223
+ * Bulk create or update profiles
224
+ */
225
+ async bulkUpsert(profiles, options = {}) {
226
+ const results = [];
227
+ for (const item of profiles) {
228
+ const existing = await this.store.get(item.agentId);
229
+ if (existing) {
230
+ const result = await this.update(item.agentId, item.evidence, options);
231
+ results.push(result);
232
+ }
233
+ else {
234
+ const result = await this.create(item.agentId, item.observationTier, item.evidence, options);
235
+ results.push(result);
236
+ }
237
+ }
238
+ return results;
239
+ }
240
+ /**
241
+ * Get profiles that need recalculation
242
+ */
243
+ async getStaleProfiles(maxAge = this.config.autoRecalculateAfterMs) {
244
+ const cutoff = new Date(Date.now() - maxAge);
245
+ const result = await this.store.query({ calculatedBefore: cutoff });
246
+ return result.profiles;
247
+ }
248
+ /**
249
+ * Refresh all stale profiles
250
+ */
251
+ async refreshStaleProfiles(maxAge, options) {
252
+ const stale = await this.getStaleProfiles(maxAge);
253
+ const results = [];
254
+ for (const profile of stale) {
255
+ const result = await this.refresh(profile.agentId, { ...options, force: true });
256
+ results.push(result);
257
+ }
258
+ return results;
259
+ }
260
+ /**
261
+ * Get the underlying calculator
262
+ */
263
+ getCalculator() {
264
+ return this.calculator;
265
+ }
266
+ /**
267
+ * Get the underlying store
268
+ */
269
+ getStore() {
270
+ return this.store;
271
+ }
272
+ /**
273
+ * Clear all profiles (for testing)
274
+ */
275
+ async clear() {
276
+ await this.store.clear();
277
+ }
278
+ /**
279
+ * Get the hook manager
280
+ */
281
+ getHookManager() {
282
+ return this.hookManager;
283
+ }
284
+ // ============================================================
285
+ // Private Hook Methods
286
+ // ============================================================
287
+ /**
288
+ * Fire trust change hook
289
+ */
290
+ async fireTrustChangeHook(previousProfile, newProfile, reason) {
291
+ if (!this.config.enableHooks || !this.hookManager) {
292
+ return;
293
+ }
294
+ // For new profiles, create a "zero" previous profile for comparison
295
+ const previous = previousProfile ?? this.createZeroProfile(newProfile.agentId);
296
+ await this.hookManager.executeTrustChange({
297
+ correlationId: uuidv4(),
298
+ agentId: newProfile.agentId,
299
+ previousProfile: previous,
300
+ newProfile,
301
+ reason,
302
+ });
303
+ }
304
+ /**
305
+ * Check for trust violations and fire hooks
306
+ */
307
+ async checkForViolations(previousProfile, newProfile) {
308
+ if (!this.config.enableHooks || !this.hookManager) {
309
+ return;
310
+ }
311
+ const violations = [];
312
+ // Check for band drop
313
+ const bandDrop = previousProfile.band - newProfile.band;
314
+ if (bandDrop >= this.config.bandDropViolationThreshold) {
315
+ const severity = bandDrop >= 2 ? 'critical' : 'high';
316
+ violations.push({
317
+ type: 'band_drop',
318
+ severity,
319
+ details: {
320
+ previousBand: previousProfile.band,
321
+ newBand: newProfile.band,
322
+ bandDrop,
323
+ },
324
+ });
325
+ }
326
+ // Check for significant score drop
327
+ const scoreDrop = previousProfile.adjustedScore - newProfile.adjustedScore;
328
+ const scoreDropPercent = (scoreDrop / previousProfile.adjustedScore) * 100;
329
+ if (scoreDropPercent >= this.config.scoreDropViolationThreshold) {
330
+ const severity = scoreDropPercent >= 40 ? 'critical' : scoreDropPercent >= 30 ? 'high' : 'medium';
331
+ violations.push({
332
+ type: 'score_drop',
333
+ severity,
334
+ details: {
335
+ previousScore: previousProfile.adjustedScore,
336
+ newScore: newProfile.adjustedScore,
337
+ scoreDrop,
338
+ scoreDropPercent,
339
+ },
340
+ });
341
+ }
342
+ // Fire violation hooks
343
+ for (const violation of violations) {
344
+ await this.hookManager.executeTrustViolation({
345
+ correlationId: uuidv4(),
346
+ agentId: newProfile.agentId,
347
+ profile: newProfile,
348
+ violationType: violation.type,
349
+ details: violation.details,
350
+ severity: violation.severity,
351
+ });
352
+ }
353
+ }
354
+ /**
355
+ * Create a zero profile for comparison (used for new profile creation)
356
+ */
357
+ createZeroProfile(agentId) {
358
+ return {
359
+ profileId: 'zero',
360
+ agentId,
361
+ factorScores: {},
362
+ compositeScore: 0,
363
+ observationTier: ObservationTier.BLACK_BOX,
364
+ adjustedScore: 0,
365
+ band: TrustBand.T0_SANDBOX,
366
+ calculatedAt: new Date(0),
367
+ evidence: [],
368
+ version: 0,
369
+ };
370
+ }
371
+ }
372
+ /**
373
+ * Create a TrustProfileService with default configuration
374
+ */
375
+ export function createProfileService(config) {
376
+ return new TrustProfileService(config);
377
+ }
378
+ //# sourceMappingURL=profile-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile-service.js","sourceRoot":"","sources":["../../src/trust/profile-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,122 @@
1
+ /**
2
+ * Trust Profile Store - Abstract storage interface and implementations
3
+ *
4
+ * Provides pluggable storage backends for trust profiles:
5
+ * - In-memory (for testing and development)
6
+ * - Future: Supabase (for production)
7
+ */
8
+ import type { TrustProfile, TrustProfileSummary } from '@vorionsys/contracts';
9
+ /**
10
+ * Profile query options
11
+ */
12
+ export interface ProfileQueryOptions {
13
+ /** Maximum number of results */
14
+ limit?: number;
15
+ /** Offset for pagination */
16
+ offset?: number;
17
+ /** Order by field */
18
+ orderBy?: 'calculatedAt' | 'adjustedScore' | 'agentId';
19
+ /** Order direction */
20
+ orderDir?: 'asc' | 'desc';
21
+ }
22
+ /**
23
+ * Profile query filter
24
+ */
25
+ export interface ProfileQueryFilter {
26
+ /** Filter by agent IDs */
27
+ agentIds?: string[];
28
+ /** Minimum adjusted score */
29
+ minScore?: number;
30
+ /** Maximum adjusted score */
31
+ maxScore?: number;
32
+ /** Filter by trust bands */
33
+ bands?: number[];
34
+ /** Calculated after this date */
35
+ calculatedAfter?: Date;
36
+ /** Calculated before this date */
37
+ calculatedBefore?: Date;
38
+ }
39
+ /**
40
+ * Profile query result
41
+ */
42
+ export interface ProfileQueryResult {
43
+ profiles: TrustProfile[];
44
+ total: number;
45
+ offset: number;
46
+ limit: number;
47
+ }
48
+ /**
49
+ * Profile history entry
50
+ */
51
+ export interface ProfileHistoryEntry {
52
+ profile: TrustProfile;
53
+ timestamp: Date;
54
+ reason?: string;
55
+ }
56
+ /**
57
+ * Abstract interface for trust profile storage
58
+ */
59
+ export interface TrustProfileStore {
60
+ /**
61
+ * Get a profile by agent ID
62
+ */
63
+ get(agentId: string): Promise<TrustProfile | null>;
64
+ /**
65
+ * Get a specific profile version by profile ID
66
+ */
67
+ getByProfileId(profileId: string): Promise<TrustProfile | null>;
68
+ /**
69
+ * Save a profile (creates or updates)
70
+ */
71
+ save(profile: TrustProfile): Promise<TrustProfile>;
72
+ /**
73
+ * Delete a profile by agent ID
74
+ */
75
+ delete(agentId: string): Promise<boolean>;
76
+ /**
77
+ * Query profiles with filters
78
+ */
79
+ query(filter?: ProfileQueryFilter, options?: ProfileQueryOptions): Promise<ProfileQueryResult>;
80
+ /**
81
+ * Get profile history for an agent
82
+ */
83
+ getHistory(agentId: string, limit?: number): Promise<ProfileHistoryEntry[]>;
84
+ /**
85
+ * Check if a profile exists for an agent
86
+ */
87
+ exists(agentId: string): Promise<boolean>;
88
+ /**
89
+ * Get profile summaries for multiple agents
90
+ */
91
+ getSummaries(agentIds: string[]): Promise<TrustProfileSummary[]>;
92
+ /**
93
+ * Clear all profiles (for testing)
94
+ */
95
+ clear(): Promise<void>;
96
+ }
97
+ /**
98
+ * In-memory implementation of TrustProfileStore
99
+ * Suitable for testing and development
100
+ */
101
+ export declare class InMemoryProfileStore implements TrustProfileStore {
102
+ private readonly profiles;
103
+ private readonly history;
104
+ get(agentId: string): Promise<TrustProfile | null>;
105
+ getByProfileId(profileId: string): Promise<TrustProfile | null>;
106
+ save(profile: TrustProfile): Promise<TrustProfile>;
107
+ delete(agentId: string): Promise<boolean>;
108
+ query(filter?: ProfileQueryFilter, options?: ProfileQueryOptions): Promise<ProfileQueryResult>;
109
+ getHistory(agentId: string, limit?: number): Promise<ProfileHistoryEntry[]>;
110
+ exists(agentId: string): Promise<boolean>;
111
+ getSummaries(agentIds: string[]): Promise<TrustProfileSummary[]>;
112
+ clear(): Promise<void>;
113
+ /**
114
+ * Get count of stored profiles (for testing)
115
+ */
116
+ get size(): number;
117
+ }
118
+ /**
119
+ * Create a new in-memory profile store
120
+ */
121
+ export declare function createInMemoryStore(): TrustProfileStore;
122
+ //# sourceMappingURL=profile-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile-store.d.ts","sourceRoot":"","sources":["../../src/trust/profile-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,132 @@
1
+ /**
2
+ * Trust Profile Store - Abstract storage interface and implementations
3
+ *
4
+ * Provides pluggable storage backends for trust profiles:
5
+ * - In-memory (for testing and development)
6
+ * - Future: Supabase (for production)
7
+ */
8
+ /**
9
+ * In-memory implementation of TrustProfileStore
10
+ * Suitable for testing and development
11
+ */
12
+ export class InMemoryProfileStore {
13
+ profiles = new Map();
14
+ history = new Map();
15
+ async get(agentId) {
16
+ return this.profiles.get(agentId) ?? null;
17
+ }
18
+ async getByProfileId(profileId) {
19
+ for (const profile of this.profiles.values()) {
20
+ if (profile.profileId === profileId) {
21
+ return profile;
22
+ }
23
+ }
24
+ return null;
25
+ }
26
+ async save(profile) {
27
+ const existing = this.profiles.get(profile.agentId);
28
+ // Store current as history before updating
29
+ if (existing) {
30
+ const agentHistory = this.history.get(profile.agentId) ?? [];
31
+ agentHistory.push({
32
+ profile: { ...existing },
33
+ timestamp: new Date(),
34
+ reason: 'profile_updated',
35
+ });
36
+ this.history.set(profile.agentId, agentHistory);
37
+ }
38
+ this.profiles.set(profile.agentId, profile);
39
+ return profile;
40
+ }
41
+ async delete(agentId) {
42
+ const existed = this.profiles.has(agentId);
43
+ this.profiles.delete(agentId);
44
+ this.history.delete(agentId);
45
+ return existed;
46
+ }
47
+ async query(filter = {}, options = {}) {
48
+ let profiles = Array.from(this.profiles.values());
49
+ // Apply filters
50
+ if (filter.agentIds && filter.agentIds.length > 0) {
51
+ profiles = profiles.filter((p) => filter.agentIds.includes(p.agentId));
52
+ }
53
+ if (filter.minScore !== undefined) {
54
+ profiles = profiles.filter((p) => p.adjustedScore >= filter.minScore);
55
+ }
56
+ if (filter.maxScore !== undefined) {
57
+ profiles = profiles.filter((p) => p.adjustedScore <= filter.maxScore);
58
+ }
59
+ if (filter.bands && filter.bands.length > 0) {
60
+ profiles = profiles.filter((p) => filter.bands.includes(p.band));
61
+ }
62
+ if (filter.calculatedAfter) {
63
+ profiles = profiles.filter((p) => p.calculatedAt >= filter.calculatedAfter);
64
+ }
65
+ if (filter.calculatedBefore) {
66
+ profiles = profiles.filter((p) => p.calculatedAt <= filter.calculatedBefore);
67
+ }
68
+ const total = profiles.length;
69
+ // Apply sorting
70
+ const orderBy = options.orderBy ?? 'calculatedAt';
71
+ const orderDir = options.orderDir ?? 'desc';
72
+ profiles.sort((a, b) => {
73
+ let comparison = 0;
74
+ if (orderBy === 'calculatedAt') {
75
+ comparison = a.calculatedAt.getTime() - b.calculatedAt.getTime();
76
+ }
77
+ else if (orderBy === 'adjustedScore') {
78
+ comparison = a.adjustedScore - b.adjustedScore;
79
+ }
80
+ else if (orderBy === 'agentId') {
81
+ comparison = a.agentId.localeCompare(b.agentId);
82
+ }
83
+ return orderDir === 'asc' ? comparison : -comparison;
84
+ });
85
+ // Apply pagination
86
+ const offset = options.offset ?? 0;
87
+ const limit = options.limit ?? 100;
88
+ profiles = profiles.slice(offset, offset + limit);
89
+ return { profiles, total, offset, limit };
90
+ }
91
+ async getHistory(agentId, limit = 50) {
92
+ const history = this.history.get(agentId) ?? [];
93
+ return history.slice(-limit).reverse(); // Most recent first
94
+ }
95
+ async exists(agentId) {
96
+ return this.profiles.has(agentId);
97
+ }
98
+ async getSummaries(agentIds) {
99
+ const summaries = [];
100
+ for (const agentId of agentIds) {
101
+ const profile = this.profiles.get(agentId);
102
+ if (profile) {
103
+ summaries.push({
104
+ agentId: profile.agentId,
105
+ compositeScore: profile.compositeScore,
106
+ adjustedScore: profile.adjustedScore,
107
+ band: profile.band,
108
+ observationTier: profile.observationTier,
109
+ calculatedAt: profile.calculatedAt,
110
+ });
111
+ }
112
+ }
113
+ return summaries;
114
+ }
115
+ async clear() {
116
+ this.profiles.clear();
117
+ this.history.clear();
118
+ }
119
+ /**
120
+ * Get count of stored profiles (for testing)
121
+ */
122
+ get size() {
123
+ return this.profiles.size;
124
+ }
125
+ }
126
+ /**
127
+ * Create a new in-memory profile store
128
+ */
129
+ export function createInMemoryStore() {
130
+ return new InMemoryProfileStore();
131
+ }
132
+ //# sourceMappingURL=profile-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile-store.js","sourceRoot":"","sources":["../../src/trust/profile-store.ts"],"names":[],"mappings":"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"}