@vorionsys/atsf-core 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.
- package/README.md +308 -0
- package/dist/api/index.d.ts +5 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +5 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/server.d.ts +17 -0
- package/dist/api/server.d.ts.map +1 -0
- package/dist/api/server.js +124 -0
- package/dist/api/server.js.map +1 -0
- package/dist/arbitration/index.d.ts +124 -0
- package/dist/arbitration/index.d.ts.map +1 -0
- package/dist/arbitration/index.js +696 -0
- package/dist/arbitration/index.js.map +1 -0
- package/dist/arbitration/types.d.ts +260 -0
- package/dist/arbitration/types.d.ts.map +1 -0
- package/dist/arbitration/types.js +10 -0
- package/dist/arbitration/types.js.map +1 -0
- package/dist/basis/evaluator.d.ts +57 -0
- package/dist/basis/evaluator.d.ts.map +1 -0
- package/dist/basis/evaluator.js +244 -0
- package/dist/basis/evaluator.js.map +1 -0
- package/dist/basis/index.d.ts +12 -0
- package/dist/basis/index.d.ts.map +1 -0
- package/dist/basis/index.js +12 -0
- package/dist/basis/index.js.map +1 -0
- package/dist/basis/parser.d.ts +376 -0
- package/dist/basis/parser.d.ts.map +1 -0
- package/dist/basis/parser.js +150 -0
- package/dist/basis/parser.js.map +1 -0
- package/dist/basis/types.d.ts +115 -0
- package/dist/basis/types.d.ts.map +1 -0
- package/dist/basis/types.js +5 -0
- package/dist/basis/types.js.map +1 -0
- package/dist/cognigate/index.d.ts +85 -0
- package/dist/cognigate/index.d.ts.map +1 -0
- package/dist/cognigate/index.js +139 -0
- package/dist/cognigate/index.js.map +1 -0
- package/dist/common/config.d.ts +252 -0
- package/dist/common/config.d.ts.map +1 -0
- package/dist/common/config.js +128 -0
- package/dist/common/config.js.map +1 -0
- package/dist/common/index.d.ts +7 -0
- package/dist/common/index.d.ts.map +1 -0
- package/dist/common/index.js +7 -0
- package/dist/common/index.js.map +1 -0
- package/dist/common/logger.d.ts +11 -0
- package/dist/common/logger.d.ts.map +1 -0
- package/dist/common/logger.js +29 -0
- package/dist/common/logger.js.map +1 -0
- package/dist/common/types.d.ts +196 -0
- package/dist/common/types.d.ts.map +1 -0
- package/dist/common/types.js +41 -0
- package/dist/common/types.js.map +1 -0
- package/dist/containment/index.d.ts +120 -0
- package/dist/containment/index.d.ts.map +1 -0
- package/dist/containment/index.js +717 -0
- package/dist/containment/index.js.map +1 -0
- package/dist/containment/types.d.ts +260 -0
- package/dist/containment/types.d.ts.map +1 -0
- package/dist/containment/types.js +21 -0
- package/dist/containment/types.js.map +1 -0
- package/dist/contracts/index.d.ts +237 -0
- package/dist/contracts/index.d.ts.map +1 -0
- package/dist/contracts/index.js +594 -0
- package/dist/contracts/index.js.map +1 -0
- package/dist/contracts/types.d.ts +374 -0
- package/dist/contracts/types.d.ts.map +1 -0
- package/dist/contracts/types.js +10 -0
- package/dist/contracts/types.js.map +1 -0
- package/dist/enforce/index.d.ts +58 -0
- package/dist/enforce/index.d.ts.map +1 -0
- package/dist/enforce/index.js +77 -0
- package/dist/enforce/index.js.map +1 -0
- package/dist/governance/index.d.ts +133 -0
- package/dist/governance/index.d.ts.map +1 -0
- package/dist/governance/index.js +630 -0
- package/dist/governance/index.js.map +1 -0
- package/dist/governance/types.d.ts +362 -0
- package/dist/governance/types.d.ts.map +1 -0
- package/dist/governance/types.js +21 -0
- package/dist/governance/types.js.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +43 -0
- package/dist/index.js.map +1 -0
- package/dist/intent/index.d.ts +44 -0
- package/dist/intent/index.d.ts.map +1 -0
- package/dist/intent/index.js +64 -0
- package/dist/intent/index.js.map +1 -0
- package/dist/langchain/callback.d.ts +115 -0
- package/dist/langchain/callback.d.ts.map +1 -0
- package/dist/langchain/callback.js +264 -0
- package/dist/langchain/callback.js.map +1 -0
- package/dist/langchain/executor.d.ts +63 -0
- package/dist/langchain/executor.d.ts.map +1 -0
- package/dist/langchain/executor.js +169 -0
- package/dist/langchain/executor.js.map +1 -0
- package/dist/langchain/index.d.ts +12 -0
- package/dist/langchain/index.d.ts.map +1 -0
- package/dist/langchain/index.js +12 -0
- package/dist/langchain/index.js.map +1 -0
- package/dist/langchain/tools.d.ts +25 -0
- package/dist/langchain/tools.d.ts.map +1 -0
- package/dist/langchain/tools.js +167 -0
- package/dist/langchain/tools.js.map +1 -0
- package/dist/langchain/types.d.ts +72 -0
- package/dist/langchain/types.d.ts.map +1 -0
- package/dist/langchain/types.js +9 -0
- package/dist/langchain/types.js.map +1 -0
- package/dist/layers/index.d.ts +147 -0
- package/dist/layers/index.d.ts.map +1 -0
- package/dist/layers/index.js +565 -0
- package/dist/layers/index.js.map +1 -0
- package/dist/layers/types.d.ts +336 -0
- package/dist/layers/types.d.ts.map +1 -0
- package/dist/layers/types.js +10 -0
- package/dist/layers/types.js.map +1 -0
- package/dist/persistence/file.d.ts +55 -0
- package/dist/persistence/file.d.ts.map +1 -0
- package/dist/persistence/file.js +176 -0
- package/dist/persistence/file.js.map +1 -0
- package/dist/persistence/index.d.ts +16 -0
- package/dist/persistence/index.d.ts.map +1 -0
- package/dist/persistence/index.js +34 -0
- package/dist/persistence/index.js.map +1 -0
- package/dist/persistence/memory.d.ts +32 -0
- package/dist/persistence/memory.d.ts.map +1 -0
- package/dist/persistence/memory.js +91 -0
- package/dist/persistence/memory.js.map +1 -0
- package/dist/persistence/types.d.ts +89 -0
- package/dist/persistence/types.d.ts.map +1 -0
- package/dist/persistence/types.js +9 -0
- package/dist/persistence/types.js.map +1 -0
- package/dist/proof/index.d.ts +87 -0
- package/dist/proof/index.d.ts.map +1 -0
- package/dist/proof/index.js +179 -0
- package/dist/proof/index.js.map +1 -0
- package/dist/provenance/index.d.ts +135 -0
- package/dist/provenance/index.d.ts.map +1 -0
- package/dist/provenance/index.js +356 -0
- package/dist/provenance/index.js.map +1 -0
- package/dist/provenance/types.d.ts +217 -0
- package/dist/provenance/types.d.ts.map +1 -0
- package/dist/provenance/types.js +10 -0
- package/dist/provenance/types.js.map +1 -0
- package/dist/trust-engine/index.d.ts +273 -0
- package/dist/trust-engine/index.d.ts.map +1 -0
- package/dist/trust-engine/index.js +515 -0
- package/dist/trust-engine/index.js.map +1 -0
- package/package.json +100 -0
package/README.md
ADDED
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
# @vorion/atsf-core
|
|
2
|
+
|
|
3
|
+
Agentic Trust Scoring Framework - Core runtime for AI agent governance, trust scoring, and policy enforcement.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @vorion/atsf-core
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Quick Start
|
|
12
|
+
|
|
13
|
+
```typescript
|
|
14
|
+
import {
|
|
15
|
+
TrustEngine,
|
|
16
|
+
createTrustEngine,
|
|
17
|
+
IntentService,
|
|
18
|
+
createIntentService,
|
|
19
|
+
EnforcementService,
|
|
20
|
+
createEnforcementService,
|
|
21
|
+
} from '@vorion/atsf-core';
|
|
22
|
+
|
|
23
|
+
// Create a trust engine
|
|
24
|
+
const trustEngine = createTrustEngine();
|
|
25
|
+
|
|
26
|
+
// Initialize an agent with trust
|
|
27
|
+
const agent = await trustEngine.initializeEntity('agent-001', 1);
|
|
28
|
+
console.log(agent.score); // 200 (L1 minimum)
|
|
29
|
+
|
|
30
|
+
// Record behavioral signals
|
|
31
|
+
await trustEngine.recordSignal({
|
|
32
|
+
id: crypto.randomUUID(),
|
|
33
|
+
entityId: 'agent-001',
|
|
34
|
+
type: 'behavioral.task_completed',
|
|
35
|
+
value: 0.9,
|
|
36
|
+
source: 'system',
|
|
37
|
+
timestamp: new Date().toISOString(),
|
|
38
|
+
metadata: {},
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
// Get updated score
|
|
42
|
+
const record = await trustEngine.getScore('agent-001');
|
|
43
|
+
console.log(record?.score, record?.level);
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Modules
|
|
47
|
+
|
|
48
|
+
### Trust Engine
|
|
49
|
+
|
|
50
|
+
0-1000 trust scoring with 6 tiers, time-based decay, and accelerated decay on failure.
|
|
51
|
+
|
|
52
|
+
```typescript
|
|
53
|
+
import { TrustEngine, createTrustEngine } from '@vorion/atsf-core';
|
|
54
|
+
|
|
55
|
+
// Basic usage
|
|
56
|
+
const engine = createTrustEngine();
|
|
57
|
+
|
|
58
|
+
// With full configuration
|
|
59
|
+
const configuredEngine = createTrustEngine({
|
|
60
|
+
decayRate: 0.01, // 1% decay per interval
|
|
61
|
+
decayIntervalMs: 60000, // 1 minute intervals
|
|
62
|
+
failureThreshold: 0.3, // Signals below 0.3 = failure
|
|
63
|
+
acceleratedDecayMultiplier: 3.0, // 3x decay on failure
|
|
64
|
+
failureWindowMs: 3600000, // 1 hour failure window
|
|
65
|
+
minFailuresForAcceleration: 2,// 2+ failures = accelerated
|
|
66
|
+
});
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### BASIS Rule Engine
|
|
70
|
+
|
|
71
|
+
Constraint evaluation for governance policies.
|
|
72
|
+
|
|
73
|
+
```typescript
|
|
74
|
+
import { createEvaluator, parseNamespace } from '@vorion/atsf-core';
|
|
75
|
+
|
|
76
|
+
const evaluator = createEvaluator();
|
|
77
|
+
evaluator.registerNamespace(parseNamespace(ruleDefinition));
|
|
78
|
+
const result = await evaluator.evaluate(context);
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### Intent Service
|
|
82
|
+
|
|
83
|
+
Submit and track agent intents through the governance pipeline.
|
|
84
|
+
|
|
85
|
+
```typescript
|
|
86
|
+
import { createIntentService } from '@vorion/atsf-core';
|
|
87
|
+
|
|
88
|
+
const intentService = createIntentService();
|
|
89
|
+
const intent = await intentService.submit({
|
|
90
|
+
entityId: 'agent-001',
|
|
91
|
+
goal: 'Send email to user',
|
|
92
|
+
context: { recipient: 'user@example.com' },
|
|
93
|
+
});
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### Enforcement Service
|
|
97
|
+
|
|
98
|
+
Policy decision point for allow/deny/escalate decisions.
|
|
99
|
+
|
|
100
|
+
```typescript
|
|
101
|
+
import { createEnforcementService } from '@vorion/atsf-core';
|
|
102
|
+
|
|
103
|
+
const enforcer = createEnforcementService({
|
|
104
|
+
defaultAction: 'deny',
|
|
105
|
+
requireMinTrustLevel: 2,
|
|
106
|
+
});
|
|
107
|
+
const decision = await enforcer.decide(context);
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### Proof Service
|
|
111
|
+
|
|
112
|
+
Immutable audit chain with SHA-256 hashing.
|
|
113
|
+
|
|
114
|
+
```typescript
|
|
115
|
+
import { createProofService } from '@vorion/atsf-core';
|
|
116
|
+
|
|
117
|
+
const proofService = createProofService();
|
|
118
|
+
const proof = await proofService.create({ intent, decision, inputs, outputs });
|
|
119
|
+
const verification = await proofService.verify(proof.id);
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### Cognigate Runtime
|
|
123
|
+
|
|
124
|
+
Constrained execution with resource limits.
|
|
125
|
+
|
|
126
|
+
```typescript
|
|
127
|
+
import { createGateway } from '@vorion/atsf-core';
|
|
128
|
+
|
|
129
|
+
const gateway = createGateway({
|
|
130
|
+
maxMemoryMb: 256,
|
|
131
|
+
timeoutMs: 30000,
|
|
132
|
+
});
|
|
133
|
+
gateway.registerHandler('email', emailHandler);
|
|
134
|
+
const result = await gateway.execute(context);
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
## Trust Levels (6 Tiers)
|
|
138
|
+
|
|
139
|
+
| Level | Name | Score Range |
|
|
140
|
+
|-------|------|-------------|
|
|
141
|
+
| 0 | Untrusted | 0-166 |
|
|
142
|
+
| 1 | Observed | 167-332 |
|
|
143
|
+
| 2 | Limited | 333-499 |
|
|
144
|
+
| 3 | Standard | 500-665 |
|
|
145
|
+
| 4 | Trusted | 666-832 |
|
|
146
|
+
| 5 | Certified | 833-1000 |
|
|
147
|
+
|
|
148
|
+
## Events
|
|
149
|
+
|
|
150
|
+
The Trust Engine extends `EventEmitter` and emits the following events:
|
|
151
|
+
|
|
152
|
+
```typescript
|
|
153
|
+
import { TrustEngine } from '@vorion/atsf-core';
|
|
154
|
+
|
|
155
|
+
const engine = new TrustEngine();
|
|
156
|
+
|
|
157
|
+
// Listen for all trust events
|
|
158
|
+
engine.on('trust:*', (event) => {
|
|
159
|
+
console.log('Trust event:', event);
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
// Listen for specific events
|
|
163
|
+
engine.on('trust:initialized', (event) => {
|
|
164
|
+
console.log(`Entity ${event.entityId} initialized at L${event.initialLevel}`);
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
engine.on('trust:tier_changed', (event) => {
|
|
168
|
+
console.log(`${event.entityId} ${event.direction}: ${event.previousLevelName} → ${event.newLevelName}`);
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
engine.on('trust:decay_applied', (event) => {
|
|
172
|
+
console.log(`Decay: ${event.entityId} lost ${event.decayAmount} points`);
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
engine.on('trust:score_changed', (event) => {
|
|
176
|
+
console.log(`Score: ${event.entityId} changed by ${event.delta}`);
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
engine.on('trust:signal_recorded', (event) => {
|
|
180
|
+
console.log(`Signal: ${event.signal.type} for ${event.entityId}`);
|
|
181
|
+
});
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
### Event Types
|
|
185
|
+
|
|
186
|
+
| Event | Description |
|
|
187
|
+
|-------|-------------|
|
|
188
|
+
| `trust:initialized` | New entity registered |
|
|
189
|
+
| `trust:signal_recorded` | Behavioral signal recorded |
|
|
190
|
+
| `trust:score_changed` | Score changed by ≥5 points |
|
|
191
|
+
| `trust:tier_changed` | Entity promoted or demoted |
|
|
192
|
+
| `trust:decay_applied` | Trust decayed due to staleness (includes `accelerated` flag) |
|
|
193
|
+
| `trust:failure_detected` | Low-value signal detected as failure |
|
|
194
|
+
| `trust:*` | Wildcard - all events |
|
|
195
|
+
|
|
196
|
+
### Accelerated Decay
|
|
197
|
+
|
|
198
|
+
When an entity accumulates failures (signals with value < 0.3), the decay rate increases:
|
|
199
|
+
|
|
200
|
+
```typescript
|
|
201
|
+
engine.on('trust:failure_detected', (event) => {
|
|
202
|
+
console.log(`Failure #${event.failureCount} for ${event.entityId}`);
|
|
203
|
+
if (event.acceleratedDecayActive) {
|
|
204
|
+
console.log('Accelerated decay is now active (3x normal rate)');
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
engine.on('trust:decay_applied', (event) => {
|
|
209
|
+
if (event.accelerated) {
|
|
210
|
+
console.log(`Accelerated decay: -${event.decayAmount} points`);
|
|
211
|
+
}
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
// Check status
|
|
215
|
+
const isAccelerated = engine.isAcceleratedDecayActive('agent-001');
|
|
216
|
+
const failureCount = engine.getFailureCount('agent-001');
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
## Persistence
|
|
220
|
+
|
|
221
|
+
Trust records can be persisted using pluggable storage backends:
|
|
222
|
+
|
|
223
|
+
```typescript
|
|
224
|
+
import {
|
|
225
|
+
createTrustEngine,
|
|
226
|
+
createFileProvider,
|
|
227
|
+
createMemoryProvider,
|
|
228
|
+
} from '@vorion/atsf-core';
|
|
229
|
+
|
|
230
|
+
// File-based persistence
|
|
231
|
+
const fileProvider = createFileProvider({
|
|
232
|
+
path: './trust-records.json',
|
|
233
|
+
autoSaveIntervalMs: 5000, // Auto-save every 5 seconds
|
|
234
|
+
});
|
|
235
|
+
await fileProvider.initialize();
|
|
236
|
+
|
|
237
|
+
const engine = createTrustEngine({
|
|
238
|
+
persistence: fileProvider,
|
|
239
|
+
autoPersist: true, // Auto-save on changes
|
|
240
|
+
});
|
|
241
|
+
|
|
242
|
+
// Load existing records
|
|
243
|
+
await engine.loadFromPersistence();
|
|
244
|
+
|
|
245
|
+
// Records are automatically saved on changes
|
|
246
|
+
await engine.initializeEntity('agent-001', 2);
|
|
247
|
+
|
|
248
|
+
// Manual save/close
|
|
249
|
+
await engine.saveToPersistence();
|
|
250
|
+
await engine.close();
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
Available providers:
|
|
254
|
+
- `MemoryPersistenceProvider` - Fast, non-persistent (default)
|
|
255
|
+
- `FilePersistenceProvider` - JSON file storage
|
|
256
|
+
|
|
257
|
+
## LangChain Integration
|
|
258
|
+
|
|
259
|
+
Integrate trust scoring with LangChain agents:
|
|
260
|
+
|
|
261
|
+
```typescript
|
|
262
|
+
import {
|
|
263
|
+
createTrustEngine,
|
|
264
|
+
createTrustAwareExecutor,
|
|
265
|
+
createTrustTools,
|
|
266
|
+
} from '@vorion/atsf-core';
|
|
267
|
+
|
|
268
|
+
// Create trust-aware executor
|
|
269
|
+
const engine = createTrustEngine();
|
|
270
|
+
const executor = createTrustAwareExecutor(engine, {
|
|
271
|
+
agentId: 'my-agent',
|
|
272
|
+
initialTrustLevel: 2,
|
|
273
|
+
minTrustLevel: 2,
|
|
274
|
+
recordToolUsage: true,
|
|
275
|
+
recordLlmCalls: true,
|
|
276
|
+
recordErrors: true,
|
|
277
|
+
});
|
|
278
|
+
await executor.initialize();
|
|
279
|
+
|
|
280
|
+
// Use callback handler with LangChain
|
|
281
|
+
const callbacks = [executor.callbackHandler];
|
|
282
|
+
|
|
283
|
+
// Execute with trust gating
|
|
284
|
+
const result = await executor.execute(async () => {
|
|
285
|
+
// Your agent execution here
|
|
286
|
+
return await agent.invoke({ input: 'Hello' }, { callbacks });
|
|
287
|
+
});
|
|
288
|
+
|
|
289
|
+
console.log(result.trustCheck.allowed);
|
|
290
|
+
console.log(result.finalScore);
|
|
291
|
+
|
|
292
|
+
// Add trust tools to your agent
|
|
293
|
+
const trustTools = createTrustTools(engine, 'my-agent');
|
|
294
|
+
// Tools: check_my_trust, check_trust_requirements, get_trust_levels,
|
|
295
|
+
// report_task_success, report_task_failure
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
### Trust-Aware Execution Flow
|
|
299
|
+
|
|
300
|
+
1. **Check Trust** - Verify agent has sufficient trust level
|
|
301
|
+
2. **Execute** - Run the agent with callback tracking
|
|
302
|
+
3. **Record Signals** - Tool/LLM success/failure recorded automatically
|
|
303
|
+
4. **Update Score** - Trust score updates based on behavior
|
|
304
|
+
5. **Return Context** - Execution result includes trust state
|
|
305
|
+
|
|
306
|
+
## License
|
|
307
|
+
|
|
308
|
+
MIT
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API Server
|
|
3
|
+
*
|
|
4
|
+
* Fastify server providing REST API for Vorion platform.
|
|
5
|
+
*
|
|
6
|
+
* @packageDocumentation
|
|
7
|
+
*/
|
|
8
|
+
import { FastifyInstance } from 'fastify';
|
|
9
|
+
/**
|
|
10
|
+
* Create and configure the API server
|
|
11
|
+
*/
|
|
12
|
+
export declare function createServer(): Promise<FastifyInstance>;
|
|
13
|
+
/**
|
|
14
|
+
* Start the API server
|
|
15
|
+
*/
|
|
16
|
+
export declare function startServer(): Promise<void>;
|
|
17
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/api/server.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAgB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AASnD;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,eAAe,CAAC,CAyG7D;AAED;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAsBjD"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API Server
|
|
3
|
+
*
|
|
4
|
+
* Fastify server providing REST API for Vorion platform.
|
|
5
|
+
*
|
|
6
|
+
* @packageDocumentation
|
|
7
|
+
*/
|
|
8
|
+
import Fastify from 'fastify';
|
|
9
|
+
import cors from '@fastify/cors';
|
|
10
|
+
import helmet from '@fastify/helmet';
|
|
11
|
+
import rateLimit from '@fastify/rate-limit';
|
|
12
|
+
import { createLogger, logger } from '../common/logger.js';
|
|
13
|
+
import { getConfig } from '../common/config.js';
|
|
14
|
+
const apiLogger = createLogger({ component: 'api' });
|
|
15
|
+
/**
|
|
16
|
+
* Create and configure the API server
|
|
17
|
+
*/
|
|
18
|
+
export async function createServer() {
|
|
19
|
+
const config = getConfig();
|
|
20
|
+
const server = Fastify({
|
|
21
|
+
logger: logger,
|
|
22
|
+
requestIdHeader: 'x-request-id',
|
|
23
|
+
requestIdLogLabel: 'requestId',
|
|
24
|
+
});
|
|
25
|
+
// Register plugins
|
|
26
|
+
await server.register(cors, {
|
|
27
|
+
origin: config.env === 'production' ? false : true,
|
|
28
|
+
credentials: true,
|
|
29
|
+
});
|
|
30
|
+
await server.register(helmet, {
|
|
31
|
+
contentSecurityPolicy: config.env === 'production',
|
|
32
|
+
});
|
|
33
|
+
await server.register(rateLimit, {
|
|
34
|
+
max: config.api.rateLimit,
|
|
35
|
+
timeWindow: '1 minute',
|
|
36
|
+
});
|
|
37
|
+
// Health check endpoint
|
|
38
|
+
server.get('/health', async () => ({
|
|
39
|
+
status: 'healthy',
|
|
40
|
+
version: process.env['npm_package_version'],
|
|
41
|
+
environment: config.env,
|
|
42
|
+
timestamp: new Date().toISOString(),
|
|
43
|
+
}));
|
|
44
|
+
// Ready check endpoint
|
|
45
|
+
server.get('/ready', async () => ({
|
|
46
|
+
status: 'ready',
|
|
47
|
+
checks: {
|
|
48
|
+
database: 'ok', // TODO: Implement actual checks
|
|
49
|
+
redis: 'ok',
|
|
50
|
+
proof: 'ok',
|
|
51
|
+
},
|
|
52
|
+
}));
|
|
53
|
+
// API routes
|
|
54
|
+
server.register(async (api) => {
|
|
55
|
+
// Intent routes
|
|
56
|
+
api.post('/intents', async (_request, _reply) => {
|
|
57
|
+
// TODO: Implement intent submission
|
|
58
|
+
return { message: 'Intent submission - not implemented' };
|
|
59
|
+
});
|
|
60
|
+
api.get('/intents/:id', async (_request, _reply) => {
|
|
61
|
+
// TODO: Implement intent retrieval
|
|
62
|
+
return { message: 'Intent retrieval - not implemented' };
|
|
63
|
+
});
|
|
64
|
+
// Proof routes
|
|
65
|
+
api.get('/proofs/:id', async (_request, _reply) => {
|
|
66
|
+
// TODO: Implement proof retrieval
|
|
67
|
+
return { message: 'Proof retrieval - not implemented' };
|
|
68
|
+
});
|
|
69
|
+
api.post('/proofs/:id/verify', async (_request, _reply) => {
|
|
70
|
+
// TODO: Implement proof verification
|
|
71
|
+
return { message: 'Proof verification - not implemented' };
|
|
72
|
+
});
|
|
73
|
+
// Trust routes
|
|
74
|
+
api.get('/trust/:entityId', async (_request, _reply) => {
|
|
75
|
+
// TODO: Implement trust retrieval
|
|
76
|
+
return { message: 'Trust retrieval - not implemented' };
|
|
77
|
+
});
|
|
78
|
+
// Constraint routes
|
|
79
|
+
api.post('/constraints/validate', async (_request, _reply) => {
|
|
80
|
+
// TODO: Implement constraint validation
|
|
81
|
+
return { message: 'Constraint validation - not implemented' };
|
|
82
|
+
});
|
|
83
|
+
}, { prefix: config.api.basePath });
|
|
84
|
+
// Error handler
|
|
85
|
+
server.setErrorHandler((error, request, reply) => {
|
|
86
|
+
apiLogger.error({
|
|
87
|
+
error: error.message,
|
|
88
|
+
stack: error.stack,
|
|
89
|
+
requestId: request.id,
|
|
90
|
+
}, 'Request error');
|
|
91
|
+
reply.status(error.statusCode ?? 500).send({
|
|
92
|
+
error: {
|
|
93
|
+
code: error.code ?? 'INTERNAL_ERROR',
|
|
94
|
+
message: config.env === 'production'
|
|
95
|
+
? 'An error occurred'
|
|
96
|
+
: error.message,
|
|
97
|
+
},
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
return server;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Start the API server
|
|
104
|
+
*/
|
|
105
|
+
export async function startServer() {
|
|
106
|
+
const config = getConfig();
|
|
107
|
+
const server = await createServer();
|
|
108
|
+
try {
|
|
109
|
+
await server.listen({
|
|
110
|
+
port: config.api.port,
|
|
111
|
+
host: config.api.host,
|
|
112
|
+
});
|
|
113
|
+
apiLogger.info({
|
|
114
|
+
port: config.api.port,
|
|
115
|
+
host: config.api.host,
|
|
116
|
+
environment: config.env,
|
|
117
|
+
}, 'Server started');
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
apiLogger.error({ error }, 'Failed to start server');
|
|
121
|
+
process.exit(1);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/api/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Multi-Agent Trust Arbitration Engine
|
|
3
|
+
*
|
|
4
|
+
* Resolves trust conflicts between agents using weighted voting,
|
|
5
|
+
* consensus building, and cross-agent confidence decay.
|
|
6
|
+
*
|
|
7
|
+
* @packageDocumentation
|
|
8
|
+
*/
|
|
9
|
+
import type { ID, TrustLevel } from '../common/types.js';
|
|
10
|
+
import type { ArbitrationAgent, ArbitrationVote, TrustConflict, ArbitrationResult, ArbitrationMethod, ArbitrationConfig, ArbitrationRequest, ArbitrationQuery, AgentRole } from './types.js';
|
|
11
|
+
export * from './types.js';
|
|
12
|
+
/**
|
|
13
|
+
* Trust Arbitration Engine
|
|
14
|
+
*/
|
|
15
|
+
export declare class TrustArbitrationEngine {
|
|
16
|
+
private config;
|
|
17
|
+
private history;
|
|
18
|
+
private agents;
|
|
19
|
+
constructor(config?: Partial<ArbitrationConfig>);
|
|
20
|
+
/**
|
|
21
|
+
* Register an agent for arbitration
|
|
22
|
+
*/
|
|
23
|
+
registerAgent(agent: ArbitrationAgent): void;
|
|
24
|
+
/**
|
|
25
|
+
* Unregister an agent
|
|
26
|
+
*/
|
|
27
|
+
unregisterAgent(agentId: ID): void;
|
|
28
|
+
/**
|
|
29
|
+
* Get a registered agent
|
|
30
|
+
*/
|
|
31
|
+
getAgent(agentId: ID): ArbitrationAgent | undefined;
|
|
32
|
+
/**
|
|
33
|
+
* Arbitrate a trust conflict
|
|
34
|
+
*/
|
|
35
|
+
arbitrate(request: ArbitrationRequest): Promise<ArbitrationResult>;
|
|
36
|
+
/**
|
|
37
|
+
* Weighted majority voting
|
|
38
|
+
*/
|
|
39
|
+
private arbitrateWeightedMajority;
|
|
40
|
+
/**
|
|
41
|
+
* Unanimous voting (all must agree)
|
|
42
|
+
*/
|
|
43
|
+
private arbitrateUnanimous;
|
|
44
|
+
/**
|
|
45
|
+
* Supervisor override - supervisor agent makes final call
|
|
46
|
+
*/
|
|
47
|
+
private arbitrateSupervisorOverride;
|
|
48
|
+
/**
|
|
49
|
+
* Consensus building - iterative discussion
|
|
50
|
+
*/
|
|
51
|
+
private arbitrateConsensusBuilding;
|
|
52
|
+
/**
|
|
53
|
+
* Escalate to human decision-maker
|
|
54
|
+
*/
|
|
55
|
+
private arbitrateEscalateHuman;
|
|
56
|
+
/**
|
|
57
|
+
* Default to deny (most restrictive)
|
|
58
|
+
*/
|
|
59
|
+
private arbitrateDefaultDeny;
|
|
60
|
+
/**
|
|
61
|
+
* Collect votes from initial positions
|
|
62
|
+
*/
|
|
63
|
+
private collectVotes;
|
|
64
|
+
/**
|
|
65
|
+
* Apply confidence decay based on disagreement
|
|
66
|
+
*/
|
|
67
|
+
private applyConfidenceDecay;
|
|
68
|
+
/**
|
|
69
|
+
* Create the final decision
|
|
70
|
+
*/
|
|
71
|
+
private createDecision;
|
|
72
|
+
/**
|
|
73
|
+
* Generate explanation for decision
|
|
74
|
+
*/
|
|
75
|
+
private generateExplanation;
|
|
76
|
+
/**
|
|
77
|
+
* Generate conditions that would invalidate the decision
|
|
78
|
+
*/
|
|
79
|
+
private generateInvalidityConditions;
|
|
80
|
+
/**
|
|
81
|
+
* Calculate consensus metrics
|
|
82
|
+
*/
|
|
83
|
+
private calculateConsensusMetrics;
|
|
84
|
+
/**
|
|
85
|
+
* Simulate vote adjustment in consensus building
|
|
86
|
+
*/
|
|
87
|
+
private simulateVoteAdjustment;
|
|
88
|
+
/**
|
|
89
|
+
* Update agent accuracy based on arbitration result
|
|
90
|
+
*/
|
|
91
|
+
private updateAgentAccuracy;
|
|
92
|
+
/**
|
|
93
|
+
* Query arbitration history
|
|
94
|
+
*/
|
|
95
|
+
query(query: ArbitrationQuery): Promise<ArbitrationResult[]>;
|
|
96
|
+
/**
|
|
97
|
+
* Get arbitration statistics
|
|
98
|
+
*/
|
|
99
|
+
getStats(): {
|
|
100
|
+
totalArbitrations: number;
|
|
101
|
+
byMethod: Record<ArbitrationMethod, number>;
|
|
102
|
+
consensusRate: number;
|
|
103
|
+
averageDurationMs: number;
|
|
104
|
+
agentCount: number;
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Create a new trust arbitration engine
|
|
109
|
+
*/
|
|
110
|
+
export declare function createTrustArbitrationEngine(config?: Partial<ArbitrationConfig>): TrustArbitrationEngine;
|
|
111
|
+
/**
|
|
112
|
+
* Helper to create an arbitration agent
|
|
113
|
+
*/
|
|
114
|
+
export declare function createArbitrationAgent(agentId: ID, name: string, options: {
|
|
115
|
+
trustScore: number;
|
|
116
|
+
trustLevel: TrustLevel;
|
|
117
|
+
role: AgentRole;
|
|
118
|
+
historicalAccuracy?: number;
|
|
119
|
+
}): ArbitrationAgent;
|
|
120
|
+
/**
|
|
121
|
+
* Helper to create a trust conflict
|
|
122
|
+
*/
|
|
123
|
+
export declare function createTrustConflict(conflictType: TrustConflict['conflictType'], subject: TrustConflict['subject'], agents: ArbitrationAgent[], initialPositions: ArbitrationVote[]): TrustConflict;
|
|
124
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/arbitration/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,EAAE,EAAE,UAAU,EAAiB,MAAM,oBAAoB,CAAC;AACxE,OAAO,KAAK,EACV,gBAAgB,EAChB,eAAe,EACf,aAAa,EACb,iBAAiB,EAGjB,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAIhB,SAAS,EACV,MAAM,YAAY,CAAC;AAEpB,cAAc,YAAY,CAAC;AAiC3B;;GAEG;AACH,qBAAa,sBAAsB;IACjC,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,OAAO,CAAyC;IACxD,OAAO,CAAC,MAAM,CAAwC;gBAE1C,MAAM,GAAE,OAAO,CAAC,iBAAiB,CAAM;IAInD;;OAEG;IACH,aAAa,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI;IAY5C;;OAEG;IACH,eAAe,CAAC,OAAO,EAAE,EAAE,GAAG,IAAI;IAIlC;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,EAAE,GAAG,gBAAgB,GAAG,SAAS;IAInD;;OAEG;IACG,SAAS,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAgExE;;OAEG;YACW,yBAAyB;IAoEvC;;OAEG;YACW,kBAAkB;IAiDhC;;OAEG;YACW,2BAA2B;IAgDzC;;OAEG;YACW,0BAA0B;IAoExC;;OAEG;YACW,sBAAsB;IAgCpC;;OAEG;YACW,oBAAoB;IAgClC;;OAEG;IACH,OAAO,CAAC,YAAY;IAIpB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAsF5B;;OAEG;IACH,OAAO,CAAC,cAAc;IA8BtB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAgB3B;;OAEG;IACH,OAAO,CAAC,4BAA4B;IAmBpC;;OAEG;IACH,OAAO,CAAC,yBAAyB;IA2CjC;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAkB9B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAqB3B;;OAEG;IACG,KAAK,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAsClE;;OAEG;IACH,QAAQ,IAAI;QACV,iBAAiB,EAAE,MAAM,CAAC;QAC1B,QAAQ,EAAE,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;QAC5C,aAAa,EAAE,MAAM,CAAC;QACtB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,UAAU,EAAE,MAAM,CAAC;KACpB;CA6BF;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAC1C,MAAM,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAClC,sBAAsB,CAExB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,EAAE,EACX,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;IACP,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,UAAU,CAAC;IACvB,IAAI,EAAE,SAAS,CAAC;IAChB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,GACA,gBAAgB,CAWlB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,aAAa,CAAC,cAAc,CAAC,EAC3C,OAAO,EAAE,aAAa,CAAC,SAAS,CAAC,EACjC,MAAM,EAAE,gBAAgB,EAAE,EAC1B,gBAAgB,EAAE,eAAe,EAAE,GAClC,aAAa,CAef"}
|