@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.
- package/LICENSE +190 -0
- package/dist/api/handlers.d.ts +231 -0
- package/dist/api/handlers.d.ts.map +1 -0
- package/dist/api/handlers.js +279 -0
- package/dist/api/handlers.js.map +1 -0
- package/dist/api/index.d.ts +24 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +27 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/middleware.d.ts +106 -0
- package/dist/api/middleware.d.ts.map +1 -0
- package/dist/api/middleware.js +186 -0
- package/dist/api/middleware.js.map +1 -0
- package/dist/api/routes.d.ts +41 -0
- package/dist/api/routes.d.ts.map +1 -0
- package/dist/api/routes.js +91 -0
- package/dist/api/routes.js.map +1 -0
- package/dist/authorization/constraints.d.ts +75 -0
- package/dist/authorization/constraints.d.ts.map +1 -0
- package/dist/authorization/constraints.js +302 -0
- package/dist/authorization/constraints.js.map +1 -0
- package/dist/authorization/decision.d.ts +98 -0
- package/dist/authorization/decision.d.ts.map +1 -0
- package/dist/authorization/decision.js +202 -0
- package/dist/authorization/decision.js.map +1 -0
- package/dist/authorization/engine.d.ts +141 -0
- package/dist/authorization/engine.d.ts.map +1 -0
- package/dist/authorization/engine.js +339 -0
- package/dist/authorization/engine.js.map +1 -0
- package/dist/authorization/index.d.ts +10 -0
- package/dist/authorization/index.d.ts.map +1 -0
- package/dist/authorization/index.js +13 -0
- package/dist/authorization/index.js.map +1 -0
- package/dist/banding/band-calculator.d.ts +137 -0
- package/dist/banding/band-calculator.d.ts.map +1 -0
- package/dist/banding/band-calculator.js +252 -0
- package/dist/banding/band-calculator.js.map +1 -0
- package/dist/banding/bands.d.ts +56 -0
- package/dist/banding/bands.d.ts.map +1 -0
- package/dist/banding/bands.js +200 -0
- package/dist/banding/bands.js.map +1 -0
- package/dist/banding/hysteresis.d.ts +64 -0
- package/dist/banding/hysteresis.d.ts.map +1 -0
- package/dist/banding/hysteresis.js +143 -0
- package/dist/banding/hysteresis.js.map +1 -0
- package/dist/banding/index.d.ts +10 -0
- package/dist/banding/index.d.ts.map +1 -0
- package/dist/banding/index.js +10 -0
- package/dist/banding/index.js.map +1 -0
- package/dist/canary/canary-service.d.ts +123 -0
- package/dist/canary/canary-service.d.ts.map +1 -0
- package/dist/canary/canary-service.js +353 -0
- package/dist/canary/canary-service.js.map +1 -0
- package/dist/canary/index.d.ts +12 -0
- package/dist/canary/index.d.ts.map +1 -0
- package/dist/canary/index.js +14 -0
- package/dist/canary/index.js.map +1 -0
- package/dist/canary/probe-library.d.ts +43 -0
- package/dist/canary/probe-library.d.ts.map +1 -0
- package/dist/canary/probe-library.js +655 -0
- package/dist/canary/probe-library.js.map +1 -0
- package/dist/execution/engine.d.ts +120 -0
- package/dist/execution/engine.d.ts.map +1 -0
- package/dist/execution/engine.js +220 -0
- package/dist/execution/engine.js.map +1 -0
- package/dist/execution/index.d.ts +7 -0
- package/dist/execution/index.d.ts.map +1 -0
- package/dist/execution/index.js +7 -0
- package/dist/execution/index.js.map +1 -0
- package/dist/gate/index.d.ts +12 -0
- package/dist/gate/index.d.ts.map +1 -0
- package/dist/gate/index.js +14 -0
- package/dist/gate/index.js.map +1 -0
- package/dist/gate/pre-action-gate.d.ts +87 -0
- package/dist/gate/pre-action-gate.d.ts.map +1 -0
- package/dist/gate/pre-action-gate.js +286 -0
- package/dist/gate/pre-action-gate.js.map +1 -0
- package/dist/gate/risk-classifier.d.ts +43 -0
- package/dist/gate/risk-classifier.d.ts.map +1 -0
- package/dist/gate/risk-classifier.js +157 -0
- package/dist/gate/risk-classifier.js.map +1 -0
- package/dist/hooks/executor.d.ts +56 -0
- package/dist/hooks/executor.d.ts.map +1 -0
- package/dist/hooks/executor.js +217 -0
- package/dist/hooks/executor.js.map +1 -0
- package/dist/hooks/index.d.ts +45 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +49 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/manager.d.ts +156 -0
- package/dist/hooks/manager.d.ts.map +1 -0
- package/dist/hooks/manager.js +267 -0
- package/dist/hooks/manager.js.map +1 -0
- package/dist/hooks/registry.d.ts +130 -0
- package/dist/hooks/registry.d.ts.map +1 -0
- package/dist/hooks/registry.js +238 -0
- package/dist/hooks/registry.js.map +1 -0
- package/dist/hooks/types.d.ts +226 -0
- package/dist/hooks/types.d.ts.map +1 -0
- package/dist/hooks/types.js +41 -0
- package/dist/hooks/types.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +31 -0
- package/dist/index.js.map +1 -0
- package/dist/observation/attestation.d.ts +102 -0
- package/dist/observation/attestation.d.ts.map +1 -0
- package/dist/observation/attestation.js +127 -0
- package/dist/observation/attestation.js.map +1 -0
- package/dist/observation/ceilings.d.ts +60 -0
- package/dist/observation/ceilings.d.ts.map +1 -0
- package/dist/observation/ceilings.js +110 -0
- package/dist/observation/ceilings.js.map +1 -0
- package/dist/observation/index.d.ts +11 -0
- package/dist/observation/index.d.ts.map +1 -0
- package/dist/observation/index.js +14 -0
- package/dist/observation/index.js.map +1 -0
- package/dist/observation/tiers.d.ts +96 -0
- package/dist/observation/tiers.d.ts.map +1 -0
- package/dist/observation/tiers.js +225 -0
- package/dist/observation/tiers.js.map +1 -0
- package/dist/orchestrator/index.d.ts +8 -0
- package/dist/orchestrator/index.d.ts.map +1 -0
- package/dist/orchestrator/index.js +8 -0
- package/dist/orchestrator/index.js.map +1 -0
- package/dist/orchestrator/orchestrator.d.ts +225 -0
- package/dist/orchestrator/orchestrator.d.ts.map +1 -0
- package/dist/orchestrator/orchestrator.js +302 -0
- package/dist/orchestrator/orchestrator.js.map +1 -0
- package/dist/orchestrator/proof-plane-adapter.d.ts +80 -0
- package/dist/orchestrator/proof-plane-adapter.d.ts.map +1 -0
- package/dist/orchestrator/proof-plane-adapter.js +78 -0
- package/dist/orchestrator/proof-plane-adapter.js.map +1 -0
- package/dist/trust/calculator.d.ts +60 -0
- package/dist/trust/calculator.d.ts.map +1 -0
- package/dist/trust/calculator.js +163 -0
- package/dist/trust/calculator.js.map +1 -0
- package/dist/trust/dimensions.d.ts +133 -0
- package/dist/trust/dimensions.d.ts.map +1 -0
- package/dist/trust/dimensions.js +257 -0
- package/dist/trust/dimensions.js.map +1 -0
- package/dist/trust/index.d.ts +14 -0
- package/dist/trust/index.d.ts.map +1 -0
- package/dist/trust/index.js +25 -0
- package/dist/trust/index.js.map +1 -0
- package/dist/trust/profile-service.d.ts +179 -0
- package/dist/trust/profile-service.d.ts.map +1 -0
- package/dist/trust/profile-service.js +378 -0
- package/dist/trust/profile-service.js.map +1 -0
- package/dist/trust/profile-store.d.ts +122 -0
- package/dist/trust/profile-store.d.ts.map +1 -0
- package/dist/trust/profile-store.js +132 -0
- package/dist/trust/profile-store.js.map +1 -0
- package/dist/trust/trust-calculator.d.ts +111 -0
- package/dist/trust/trust-calculator.d.ts.map +1 -0
- package/dist/trust/trust-calculator.js +271 -0
- package/dist/trust/trust-calculator.js.map +1 -0
- package/dist/trust/trust-dynamics.d.ts +152 -0
- package/dist/trust/trust-dynamics.d.ts.map +1 -0
- package/dist/trust/trust-dynamics.js +302 -0
- package/dist/trust/trust-dynamics.js.map +1 -0
- package/dist/trust/weights.d.ts +57 -0
- package/dist/trust/weights.d.ts.map +1 -0
- package/dist/trust/weights.js +75 -0
- package/dist/trust/weights.js.map +1 -0
- package/package.json +81 -0
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API Handlers - Request handlers for A3I endpoints
|
|
3
|
+
*/
|
|
4
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
5
|
+
import { TrustBand, } from '@vorionsys/contracts';
|
|
6
|
+
import { intentSchema, trustCalculationRequestSchema, } from '@vorionsys/contracts/validators';
|
|
7
|
+
import { DEFAULT_BANDING_CONFIG } from '@vorionsys/contracts';
|
|
8
|
+
import { ValidationError } from './middleware.js';
|
|
9
|
+
/**
|
|
10
|
+
* Create handlers with injected services
|
|
11
|
+
*/
|
|
12
|
+
export function createHandlers(context) {
|
|
13
|
+
const { profileService, authEngine } = context;
|
|
14
|
+
return {
|
|
15
|
+
/**
|
|
16
|
+
* POST /api/v1/authorize
|
|
17
|
+
* Authorize an intent
|
|
18
|
+
*/
|
|
19
|
+
async authorize(c) {
|
|
20
|
+
const body = await c.req.json();
|
|
21
|
+
// Validate intent structure
|
|
22
|
+
const parseResult = intentSchema.safeParse(body.intent);
|
|
23
|
+
if (!parseResult.success) {
|
|
24
|
+
throw new ValidationError('Invalid intent', parseResult.error.issues.map((i) => ({
|
|
25
|
+
path: i.path.join('.'),
|
|
26
|
+
message: i.message,
|
|
27
|
+
})));
|
|
28
|
+
}
|
|
29
|
+
const intent = {
|
|
30
|
+
...parseResult.data,
|
|
31
|
+
intentId: parseResult.data.intentId || uuidv4(),
|
|
32
|
+
correlationId: parseResult.data.correlationId || c.get('requestId') || uuidv4(),
|
|
33
|
+
createdAt: parseResult.data.createdAt || new Date(),
|
|
34
|
+
};
|
|
35
|
+
const request = {
|
|
36
|
+
intent,
|
|
37
|
+
policySetId: body.policySetId,
|
|
38
|
+
constraintOptions: body.constraintOptions,
|
|
39
|
+
};
|
|
40
|
+
const response = await authEngine.authorize(request);
|
|
41
|
+
return c.json({
|
|
42
|
+
decision: {
|
|
43
|
+
...response.decision,
|
|
44
|
+
decidedAt: response.decision.decidedAt.toISOString(),
|
|
45
|
+
expiresAt: response.decision.expiresAt.toISOString(),
|
|
46
|
+
},
|
|
47
|
+
remediations: response.remediations,
|
|
48
|
+
});
|
|
49
|
+
},
|
|
50
|
+
/**
|
|
51
|
+
* GET /api/v1/trust/:agentId
|
|
52
|
+
* Get trust profile for an agent
|
|
53
|
+
*/
|
|
54
|
+
async getTrustProfile(c) {
|
|
55
|
+
const agentId = c.req.param('agentId');
|
|
56
|
+
if (!agentId) {
|
|
57
|
+
throw new ValidationError('Missing agentId', [
|
|
58
|
+
{ path: 'agentId', message: 'Agent ID is required' },
|
|
59
|
+
]);
|
|
60
|
+
}
|
|
61
|
+
const profile = await profileService.get(agentId);
|
|
62
|
+
if (!profile) {
|
|
63
|
+
return c.json({ error: { code: 'NOT_FOUND', message: `No profile found for agent ${agentId}` } }, 404);
|
|
64
|
+
}
|
|
65
|
+
return c.json({
|
|
66
|
+
profile: {
|
|
67
|
+
...profile,
|
|
68
|
+
calculatedAt: profile.calculatedAt.toISOString(),
|
|
69
|
+
validUntil: profile.validUntil?.toISOString(),
|
|
70
|
+
evidence: profile.evidence.map((e) => ({
|
|
71
|
+
...e,
|
|
72
|
+
collectedAt: e.collectedAt.toISOString(),
|
|
73
|
+
expiresAt: e.expiresAt?.toISOString(),
|
|
74
|
+
})),
|
|
75
|
+
},
|
|
76
|
+
});
|
|
77
|
+
},
|
|
78
|
+
/**
|
|
79
|
+
* GET /api/v1/trust
|
|
80
|
+
* List trust profiles with filters
|
|
81
|
+
*/
|
|
82
|
+
async listTrustProfiles(c) {
|
|
83
|
+
const query = c.req.query();
|
|
84
|
+
const filter = {};
|
|
85
|
+
const options = {};
|
|
86
|
+
// Parse query parameters
|
|
87
|
+
if (query.agentIds) {
|
|
88
|
+
filter.agentIds = query.agentIds.split(',');
|
|
89
|
+
}
|
|
90
|
+
if (query.minScore) {
|
|
91
|
+
filter.minScore = parseFloat(query.minScore);
|
|
92
|
+
}
|
|
93
|
+
if (query.maxScore) {
|
|
94
|
+
filter.maxScore = parseFloat(query.maxScore);
|
|
95
|
+
}
|
|
96
|
+
if (query.bands) {
|
|
97
|
+
filter.bands = query.bands.split(',').map(Number);
|
|
98
|
+
}
|
|
99
|
+
if (query.limit) {
|
|
100
|
+
options.limit = parseInt(query.limit, 10);
|
|
101
|
+
}
|
|
102
|
+
if (query.offset) {
|
|
103
|
+
options.offset = parseInt(query.offset, 10);
|
|
104
|
+
}
|
|
105
|
+
if (query.orderBy) {
|
|
106
|
+
options.orderBy = query.orderBy;
|
|
107
|
+
}
|
|
108
|
+
if (query.orderDir) {
|
|
109
|
+
options.orderDir = query.orderDir;
|
|
110
|
+
}
|
|
111
|
+
const result = await profileService.query(filter, options);
|
|
112
|
+
return c.json({
|
|
113
|
+
profiles: result.profiles.map((p) => ({
|
|
114
|
+
agentId: p.agentId,
|
|
115
|
+
compositeScore: p.compositeScore,
|
|
116
|
+
adjustedScore: p.adjustedScore,
|
|
117
|
+
band: p.band,
|
|
118
|
+
bandName: TrustBand[p.band],
|
|
119
|
+
observationTier: p.observationTier,
|
|
120
|
+
calculatedAt: p.calculatedAt.toISOString(),
|
|
121
|
+
})),
|
|
122
|
+
pagination: {
|
|
123
|
+
total: result.total,
|
|
124
|
+
limit: result.limit,
|
|
125
|
+
offset: result.offset,
|
|
126
|
+
},
|
|
127
|
+
});
|
|
128
|
+
},
|
|
129
|
+
/**
|
|
130
|
+
* POST /api/v1/trust/calculate
|
|
131
|
+
* Calculate trust for an agent
|
|
132
|
+
*/
|
|
133
|
+
async calculateTrust(c) {
|
|
134
|
+
const body = await c.req.json();
|
|
135
|
+
// Validate request
|
|
136
|
+
const parseResult = trustCalculationRequestSchema.safeParse(body);
|
|
137
|
+
if (!parseResult.success) {
|
|
138
|
+
throw new ValidationError('Invalid calculation request', parseResult.error.issues.map((i) => ({
|
|
139
|
+
path: i.path.join('.'),
|
|
140
|
+
message: i.message,
|
|
141
|
+
})));
|
|
142
|
+
}
|
|
143
|
+
const { agentId, observationTier, evidence } = parseResult.data;
|
|
144
|
+
// Check if profile exists
|
|
145
|
+
const existing = await profileService.get(agentId);
|
|
146
|
+
let result;
|
|
147
|
+
if (existing) {
|
|
148
|
+
// Recalculate existing profile
|
|
149
|
+
result = await profileService.update(agentId, evidence, {});
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
// Create new profile
|
|
153
|
+
result = await profileService.create(agentId, observationTier, evidence, {});
|
|
154
|
+
}
|
|
155
|
+
if (!result.success) {
|
|
156
|
+
return c.json({ error: { code: 'CALCULATION_FAILED', message: result.error } }, 400);
|
|
157
|
+
}
|
|
158
|
+
return c.json({
|
|
159
|
+
profile: {
|
|
160
|
+
...result.profile,
|
|
161
|
+
calculatedAt: result.profile.calculatedAt.toISOString(),
|
|
162
|
+
validUntil: result.profile.validUntil?.toISOString(),
|
|
163
|
+
evidence: result.profile.evidence.map((e) => ({
|
|
164
|
+
...e,
|
|
165
|
+
collectedAt: e.collectedAt instanceof Date ? e.collectedAt.toISOString() : e.collectedAt,
|
|
166
|
+
expiresAt: e.expiresAt instanceof Date ? e.expiresAt.toISOString() : e.expiresAt,
|
|
167
|
+
})),
|
|
168
|
+
},
|
|
169
|
+
isNew: result.isNew,
|
|
170
|
+
previousVersion: result.previousVersion,
|
|
171
|
+
});
|
|
172
|
+
},
|
|
173
|
+
/**
|
|
174
|
+
* DELETE /api/v1/trust/:agentId
|
|
175
|
+
* Delete a trust profile
|
|
176
|
+
*/
|
|
177
|
+
async deleteTrustProfile(c) {
|
|
178
|
+
const agentId = c.req.param('agentId');
|
|
179
|
+
if (!agentId) {
|
|
180
|
+
throw new ValidationError('Missing agentId', [
|
|
181
|
+
{ path: 'agentId', message: 'Agent ID is required' },
|
|
182
|
+
]);
|
|
183
|
+
}
|
|
184
|
+
const deleted = await profileService.delete(agentId);
|
|
185
|
+
if (!deleted) {
|
|
186
|
+
return c.json({ error: { code: 'NOT_FOUND', message: `No profile found for agent ${agentId}` } }, 404);
|
|
187
|
+
}
|
|
188
|
+
return c.json({ success: true, agentId });
|
|
189
|
+
},
|
|
190
|
+
/**
|
|
191
|
+
* GET /api/v1/trust/:agentId/history
|
|
192
|
+
* Get trust profile history
|
|
193
|
+
*/
|
|
194
|
+
async getTrustHistory(c) {
|
|
195
|
+
const agentId = c.req.param('agentId');
|
|
196
|
+
const limit = parseInt(c.req.query('limit') ?? '50', 10);
|
|
197
|
+
if (!agentId) {
|
|
198
|
+
throw new ValidationError('Missing agentId', [
|
|
199
|
+
{ path: 'agentId', message: 'Agent ID is required' },
|
|
200
|
+
]);
|
|
201
|
+
}
|
|
202
|
+
const history = await profileService.getHistory(agentId, limit);
|
|
203
|
+
return c.json({
|
|
204
|
+
agentId,
|
|
205
|
+
history: history.map((entry) => ({
|
|
206
|
+
profile: {
|
|
207
|
+
profileId: entry.profile.profileId,
|
|
208
|
+
compositeScore: entry.profile.compositeScore,
|
|
209
|
+
adjustedScore: entry.profile.adjustedScore,
|
|
210
|
+
band: entry.profile.band,
|
|
211
|
+
bandName: TrustBand[entry.profile.band],
|
|
212
|
+
version: entry.profile.version,
|
|
213
|
+
},
|
|
214
|
+
timestamp: entry.timestamp.toISOString(),
|
|
215
|
+
reason: entry.reason,
|
|
216
|
+
})),
|
|
217
|
+
});
|
|
218
|
+
},
|
|
219
|
+
/**
|
|
220
|
+
* GET /api/v1/bands
|
|
221
|
+
* Get band configuration
|
|
222
|
+
*/
|
|
223
|
+
async getBands(c) {
|
|
224
|
+
const thresholds = DEFAULT_BANDING_CONFIG.thresholds;
|
|
225
|
+
const bands = Object.entries(TrustBand)
|
|
226
|
+
.filter(([key]) => !isNaN(Number(key)))
|
|
227
|
+
.map(([value, name]) => {
|
|
228
|
+
const bandKey = `T${value}`;
|
|
229
|
+
const threshold = thresholds[bandKey];
|
|
230
|
+
return {
|
|
231
|
+
band: parseInt(value, 10),
|
|
232
|
+
name: name,
|
|
233
|
+
minScore: threshold?.min ?? 0,
|
|
234
|
+
maxScore: threshold?.max ?? 100,
|
|
235
|
+
};
|
|
236
|
+
});
|
|
237
|
+
return c.json({
|
|
238
|
+
bands,
|
|
239
|
+
config: {
|
|
240
|
+
hysteresis: DEFAULT_BANDING_CONFIG.hysteresis,
|
|
241
|
+
decayRate: DEFAULT_BANDING_CONFIG.decayRate,
|
|
242
|
+
promotionDelay: DEFAULT_BANDING_CONFIG.promotionDelay,
|
|
243
|
+
},
|
|
244
|
+
});
|
|
245
|
+
},
|
|
246
|
+
/**
|
|
247
|
+
* GET /api/v1/health
|
|
248
|
+
* Health check endpoint
|
|
249
|
+
*/
|
|
250
|
+
async health(c) {
|
|
251
|
+
return c.json({
|
|
252
|
+
status: 'healthy',
|
|
253
|
+
service: 'a3i',
|
|
254
|
+
timestamp: new Date().toISOString(),
|
|
255
|
+
});
|
|
256
|
+
},
|
|
257
|
+
/**
|
|
258
|
+
* GET /api/v1/info
|
|
259
|
+
* Service information
|
|
260
|
+
*/
|
|
261
|
+
async info(c) {
|
|
262
|
+
return c.json({
|
|
263
|
+
service: 'A3I - Agent Anchor AI Trust Engine',
|
|
264
|
+
version: '0.1.0',
|
|
265
|
+
endpoints: [
|
|
266
|
+
{ method: 'POST', path: '/api/v1/authorize', description: 'Authorize an intent' },
|
|
267
|
+
{ method: 'GET', path: '/api/v1/trust/:agentId', description: 'Get trust profile' },
|
|
268
|
+
{ method: 'GET', path: '/api/v1/trust', description: 'List trust profiles' },
|
|
269
|
+
{ method: 'POST', path: '/api/v1/trust/calculate', description: 'Calculate trust' },
|
|
270
|
+
{ method: 'DELETE', path: '/api/v1/trust/:agentId', description: 'Delete trust profile' },
|
|
271
|
+
{ method: 'GET', path: '/api/v1/trust/:agentId/history', description: 'Get trust history' },
|
|
272
|
+
{ method: 'GET', path: '/api/v1/bands', description: 'Get band configuration' },
|
|
273
|
+
{ method: 'GET', path: '/api/v1/health', description: 'Health check' },
|
|
274
|
+
],
|
|
275
|
+
});
|
|
276
|
+
},
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
//# sourceMappingURL=handlers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handlers.js","sourceRoot":"","sources":["../../src/api/handlers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A3I API Module
|
|
3
|
+
*
|
|
4
|
+
* HTTP API for the A3I Trust Engine using Hono framework.
|
|
5
|
+
*
|
|
6
|
+
* Example usage:
|
|
7
|
+
* ```typescript
|
|
8
|
+
* import { createApi } from '@vorion/a3i/api';
|
|
9
|
+
*
|
|
10
|
+
* const app = createApi({
|
|
11
|
+
* apiKey: {
|
|
12
|
+
* validKeys: new Set(['my-api-key']),
|
|
13
|
+
* allowUnauthenticated: false,
|
|
14
|
+
* },
|
|
15
|
+
* });
|
|
16
|
+
*
|
|
17
|
+
* // Serve with Bun, Node, Deno, etc.
|
|
18
|
+
* export default app;
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export { createApi, createApiWithContext, DEFAULT_API_CONFIG, type ApiConfig, } from './routes.js';
|
|
22
|
+
export { createHandlers, type HandlerContext, type Handlers, } from './handlers.js';
|
|
23
|
+
export { apiKeyAuth, timing, requestId, errorHandler, rateLimit, cors, bodyLimit, ValidationError, DEFAULT_API_KEY_CONFIG, type ApiKeyConfig, type RateLimitConfig, type CorsConfig, type ErrorResponse, } from './middleware.js';
|
|
24
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAGH,OAAO,EACL,SAAS,EACT,oBAAoB,EACpB,kBAAkB,EAClB,KAAK,SAAS,GACf,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,cAAc,EACd,KAAK,cAAc,EACnB,KAAK,QAAQ,GACd,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,UAAU,EACV,MAAM,EACN,SAAS,EACT,YAAY,EACZ,SAAS,EACT,IAAI,EACJ,SAAS,EACT,eAAe,EACf,sBAAsB,EACtB,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,UAAU,EACf,KAAK,aAAa,GACnB,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A3I API Module
|
|
3
|
+
*
|
|
4
|
+
* HTTP API for the A3I Trust Engine using Hono framework.
|
|
5
|
+
*
|
|
6
|
+
* Example usage:
|
|
7
|
+
* ```typescript
|
|
8
|
+
* import { createApi } from '@vorion/a3i/api';
|
|
9
|
+
*
|
|
10
|
+
* const app = createApi({
|
|
11
|
+
* apiKey: {
|
|
12
|
+
* validKeys: new Set(['my-api-key']),
|
|
13
|
+
* allowUnauthenticated: false,
|
|
14
|
+
* },
|
|
15
|
+
* });
|
|
16
|
+
*
|
|
17
|
+
* // Serve with Bun, Node, Deno, etc.
|
|
18
|
+
* export default app;
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
// Routes and API factory
|
|
22
|
+
export { createApi, createApiWithContext, DEFAULT_API_CONFIG, } from './routes.js';
|
|
23
|
+
// Handlers
|
|
24
|
+
export { createHandlers, } from './handlers.js';
|
|
25
|
+
// Middleware
|
|
26
|
+
export { apiKeyAuth, timing, requestId, errorHandler, rateLimit, cors, bodyLimit, ValidationError, DEFAULT_API_KEY_CONFIG, } from './middleware.js';
|
|
27
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,yBAAyB;AACzB,OAAO,EACL,SAAS,EACT,oBAAoB,EACpB,kBAAkB,GAEnB,MAAM,aAAa,CAAC;AAErB,WAAW;AACX,OAAO,EACL,cAAc,GAGf,MAAM,eAAe,CAAC;AAEvB,aAAa;AACb,OAAO,EACL,UAAU,EACV,MAAM,EACN,SAAS,EACT,YAAY,EACZ,SAAS,EACT,IAAI,EACJ,SAAS,EACT,eAAe,EACf,sBAAsB,GAKvB,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API Middleware - Authentication, error handling, and request processing
|
|
3
|
+
*/
|
|
4
|
+
import type { Context, Next } from 'hono';
|
|
5
|
+
/**
|
|
6
|
+
* API key configuration
|
|
7
|
+
*/
|
|
8
|
+
export interface ApiKeyConfig {
|
|
9
|
+
/** Header name for API key */
|
|
10
|
+
headerName: string;
|
|
11
|
+
/** Valid API keys (in production, use secure storage) */
|
|
12
|
+
validKeys: Set<string>;
|
|
13
|
+
/** Allow requests without authentication (for development) */
|
|
14
|
+
allowUnauthenticated?: boolean;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Default API key configuration
|
|
18
|
+
*/
|
|
19
|
+
export declare const DEFAULT_API_KEY_CONFIG: ApiKeyConfig;
|
|
20
|
+
/**
|
|
21
|
+
* API authentication middleware
|
|
22
|
+
* Validates API key from request header
|
|
23
|
+
*/
|
|
24
|
+
export declare function apiKeyAuth(config?: ApiKeyConfig): (c: Context, next: Next) => Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* Request timing middleware
|
|
27
|
+
* Adds X-Response-Time header
|
|
28
|
+
*/
|
|
29
|
+
export declare function timing(c: Context, next: Next): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Request ID middleware
|
|
32
|
+
* Adds X-Request-ID header for tracing
|
|
33
|
+
*/
|
|
34
|
+
export declare function requestId(c: Context, next: Next): Promise<void>;
|
|
35
|
+
/**
|
|
36
|
+
* Error response shape
|
|
37
|
+
*/
|
|
38
|
+
export interface ErrorResponse {
|
|
39
|
+
error: {
|
|
40
|
+
code: string;
|
|
41
|
+
message: string;
|
|
42
|
+
details?: Record<string, unknown>;
|
|
43
|
+
requestId?: string;
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Error handling middleware
|
|
48
|
+
* Converts exceptions to structured error responses
|
|
49
|
+
*/
|
|
50
|
+
export declare function errorHandler(c: Context, next: Next): Promise<(Response & import("hono").TypedResponse<{
|
|
51
|
+
error: {
|
|
52
|
+
code: string;
|
|
53
|
+
message: string;
|
|
54
|
+
details?: {
|
|
55
|
+
[x: string]: import("hono/utils/types").JSONValue;
|
|
56
|
+
} | undefined;
|
|
57
|
+
requestId?: string | undefined;
|
|
58
|
+
};
|
|
59
|
+
}, 100 | 500 | 200 | -1 | 102 | 103 | 201 | 202 | 203 | 206 | 207 | 208 | 226 | 300 | 301 | 302 | 303 | 305 | 306 | 307 | 308 | 400 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 421 | 422 | 423 | 424 | 425 | 426 | 428 | 429 | 431 | 451 | 501 | 502 | 503 | 504 | 505 | 506 | 507 | 508 | 510 | 511, "json">) | undefined>;
|
|
60
|
+
/**
|
|
61
|
+
* Custom validation error
|
|
62
|
+
*/
|
|
63
|
+
export declare class ValidationError extends Error {
|
|
64
|
+
issues: Array<{
|
|
65
|
+
path: string;
|
|
66
|
+
message: string;
|
|
67
|
+
}>;
|
|
68
|
+
constructor(message: string, issues: Array<{
|
|
69
|
+
path: string;
|
|
70
|
+
message: string;
|
|
71
|
+
}>);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Rate limiting configuration
|
|
75
|
+
*/
|
|
76
|
+
export interface RateLimitConfig {
|
|
77
|
+
/** Maximum requests per window */
|
|
78
|
+
limit: number;
|
|
79
|
+
/** Window size in milliseconds */
|
|
80
|
+
windowMs: number;
|
|
81
|
+
/** Key generator function */
|
|
82
|
+
keyGenerator?: (c: Context) => string;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Simple in-memory rate limiter
|
|
86
|
+
* (In production, use Redis or similar)
|
|
87
|
+
*/
|
|
88
|
+
export declare function rateLimit(config: RateLimitConfig): (c: Context, next: Next) => Promise<void>;
|
|
89
|
+
/**
|
|
90
|
+
* CORS configuration
|
|
91
|
+
*/
|
|
92
|
+
export interface CorsConfig {
|
|
93
|
+
origin: string | string[];
|
|
94
|
+
methods?: string[];
|
|
95
|
+
headers?: string[];
|
|
96
|
+
credentials?: boolean;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* CORS middleware
|
|
100
|
+
*/
|
|
101
|
+
export declare function cors(config: CorsConfig): (c: Context, next: Next) => Promise<import("undici-types").Response | undefined>;
|
|
102
|
+
/**
|
|
103
|
+
* Request body size limit
|
|
104
|
+
*/
|
|
105
|
+
export declare function bodyLimit(maxSize: number): (c: Context, next: Next) => Promise<void>;
|
|
106
|
+
//# sourceMappingURL=middleware.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../src/api/middleware.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAG1C;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,8BAA8B;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,yDAAyD;IACzD,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACvB,8DAA8D;IAC9D,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED;;GAEG;AACH,eAAO,MAAM,sBAAsB,EAAE,YAIpC,CAAC;AAEF;;;GAGG;AACH,wBAAgB,UAAU,CAAC,MAAM,GAAE,YAAqC,IACxD,GAAG,OAAO,EAAE,MAAM,IAAI,mBAyBrC;AAED;;;GAGG;AACH,wBAAsB,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,iBAKlD;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,iBAMrD;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAClC,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;CACH;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI;;cAX/C,MAAM;iBACH,MAAM;;;;oBAEH,MAAM;;+XAsDrB;AAED;;GAEG;AACH,qBAAa,eAAgB,SAAQ,KAAK;IAG/B,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;gBADvD,OAAO,EAAE,MAAM,EACR,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAK1D;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,kCAAkC;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,6BAA6B;IAC7B,YAAY,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,MAAM,CAAC;CACvC;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,eAAe,IAGjC,GAAG,OAAO,EAAE,MAAM,IAAI,mBAwBrC;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,MAAM,EAAE,UAAU,IAKvB,GAAG,OAAO,EAAE,MAAM,IAAI,0DAqBrC;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,IACzB,GAAG,OAAO,EAAE,MAAM,IAAI,mBASrC"}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API Middleware - Authentication, error handling, and request processing
|
|
3
|
+
*/
|
|
4
|
+
import { HTTPException } from 'hono/http-exception';
|
|
5
|
+
/**
|
|
6
|
+
* Default API key configuration
|
|
7
|
+
*/
|
|
8
|
+
export const DEFAULT_API_KEY_CONFIG = {
|
|
9
|
+
headerName: 'X-API-Key',
|
|
10
|
+
validKeys: new Set(['development-key']),
|
|
11
|
+
allowUnauthenticated: true, // For development only
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* API authentication middleware
|
|
15
|
+
* Validates API key from request header
|
|
16
|
+
*/
|
|
17
|
+
export function apiKeyAuth(config = DEFAULT_API_KEY_CONFIG) {
|
|
18
|
+
return async (c, next) => {
|
|
19
|
+
const apiKey = c.req.header(config.headerName);
|
|
20
|
+
if (!apiKey) {
|
|
21
|
+
if (config.allowUnauthenticated) {
|
|
22
|
+
// Allow unauthenticated in dev mode
|
|
23
|
+
c.set('authenticated', false);
|
|
24
|
+
await next();
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
throw new HTTPException(401, {
|
|
28
|
+
message: `Missing ${config.headerName} header`,
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
if (!config.validKeys.has(apiKey)) {
|
|
32
|
+
throw new HTTPException(401, {
|
|
33
|
+
message: 'Invalid API key',
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
c.set('authenticated', true);
|
|
37
|
+
c.set('apiKey', apiKey);
|
|
38
|
+
await next();
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Request timing middleware
|
|
43
|
+
* Adds X-Response-Time header
|
|
44
|
+
*/
|
|
45
|
+
export async function timing(c, next) {
|
|
46
|
+
const start = Date.now();
|
|
47
|
+
await next();
|
|
48
|
+
const ms = Date.now() - start;
|
|
49
|
+
c.res.headers.set('X-Response-Time', `${ms}ms`);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Request ID middleware
|
|
53
|
+
* Adds X-Request-ID header for tracing
|
|
54
|
+
*/
|
|
55
|
+
export async function requestId(c, next) {
|
|
56
|
+
const existingId = c.req.header('X-Request-ID');
|
|
57
|
+
const id = existingId || crypto.randomUUID();
|
|
58
|
+
c.set('requestId', id);
|
|
59
|
+
await next();
|
|
60
|
+
c.res.headers.set('X-Request-ID', id);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Error handling middleware
|
|
64
|
+
* Converts exceptions to structured error responses
|
|
65
|
+
*/
|
|
66
|
+
export async function errorHandler(c, next) {
|
|
67
|
+
try {
|
|
68
|
+
await next();
|
|
69
|
+
}
|
|
70
|
+
catch (err) {
|
|
71
|
+
const requestId = c.get('requestId');
|
|
72
|
+
if (err instanceof HTTPException) {
|
|
73
|
+
const response = {
|
|
74
|
+
error: {
|
|
75
|
+
code: `HTTP_${err.status}`,
|
|
76
|
+
message: err.message,
|
|
77
|
+
requestId,
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
return c.json(response, err.status);
|
|
81
|
+
}
|
|
82
|
+
// Check for ValidationError - cast to any to access issues property
|
|
83
|
+
if (err instanceof Error) {
|
|
84
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
85
|
+
const errAny = err;
|
|
86
|
+
if (errAny.issues !== undefined) {
|
|
87
|
+
const issues = Array.isArray(errAny.issues) ? errAny.issues : [];
|
|
88
|
+
const response = {
|
|
89
|
+
error: {
|
|
90
|
+
code: 'VALIDATION_ERROR',
|
|
91
|
+
message: err.message,
|
|
92
|
+
details: { issues },
|
|
93
|
+
requestId,
|
|
94
|
+
},
|
|
95
|
+
};
|
|
96
|
+
return c.json(response, 400);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
// Unknown error
|
|
100
|
+
console.error('Unhandled error:', err);
|
|
101
|
+
const response = {
|
|
102
|
+
error: {
|
|
103
|
+
code: 'INTERNAL_ERROR',
|
|
104
|
+
message: 'An internal error occurred',
|
|
105
|
+
requestId,
|
|
106
|
+
},
|
|
107
|
+
};
|
|
108
|
+
return c.json(response, 500);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Custom validation error
|
|
113
|
+
*/
|
|
114
|
+
export class ValidationError extends Error {
|
|
115
|
+
issues;
|
|
116
|
+
constructor(message, issues) {
|
|
117
|
+
super(message);
|
|
118
|
+
this.issues = issues;
|
|
119
|
+
this.name = 'ValidationError';
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Simple in-memory rate limiter
|
|
124
|
+
* (In production, use Redis or similar)
|
|
125
|
+
*/
|
|
126
|
+
export function rateLimit(config) {
|
|
127
|
+
const requests = new Map();
|
|
128
|
+
return async (c, next) => {
|
|
129
|
+
const key = config.keyGenerator?.(c) ?? c.req.header('X-API-Key') ?? 'anonymous';
|
|
130
|
+
const now = Date.now();
|
|
131
|
+
let entry = requests.get(key);
|
|
132
|
+
if (!entry || now > entry.resetAt) {
|
|
133
|
+
entry = { count: 0, resetAt: now + config.windowMs };
|
|
134
|
+
requests.set(key, entry);
|
|
135
|
+
}
|
|
136
|
+
entry.count++;
|
|
137
|
+
c.res.headers.set('X-RateLimit-Limit', String(config.limit));
|
|
138
|
+
c.res.headers.set('X-RateLimit-Remaining', String(Math.max(0, config.limit - entry.count)));
|
|
139
|
+
c.res.headers.set('X-RateLimit-Reset', String(Math.ceil(entry.resetAt / 1000)));
|
|
140
|
+
if (entry.count > config.limit) {
|
|
141
|
+
throw new HTTPException(429, {
|
|
142
|
+
message: 'Rate limit exceeded',
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
await next();
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* CORS middleware
|
|
150
|
+
*/
|
|
151
|
+
export function cors(config) {
|
|
152
|
+
const allowedOrigins = Array.isArray(config.origin) ? config.origin : [config.origin];
|
|
153
|
+
const methods = config.methods ?? ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'];
|
|
154
|
+
const headers = config.headers ?? ['Content-Type', 'Authorization', 'X-API-Key', 'X-Request-ID'];
|
|
155
|
+
return async (c, next) => {
|
|
156
|
+
const origin = c.req.header('Origin');
|
|
157
|
+
if (origin && (allowedOrigins.includes('*') || allowedOrigins.includes(origin))) {
|
|
158
|
+
c.res.headers.set('Access-Control-Allow-Origin', origin);
|
|
159
|
+
}
|
|
160
|
+
c.res.headers.set('Access-Control-Allow-Methods', methods.join(', '));
|
|
161
|
+
c.res.headers.set('Access-Control-Allow-Headers', headers.join(', '));
|
|
162
|
+
if (config.credentials) {
|
|
163
|
+
c.res.headers.set('Access-Control-Allow-Credentials', 'true');
|
|
164
|
+
}
|
|
165
|
+
// Handle preflight
|
|
166
|
+
if (c.req.method === 'OPTIONS') {
|
|
167
|
+
return new Response(null, { status: 204 });
|
|
168
|
+
}
|
|
169
|
+
await next();
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Request body size limit
|
|
174
|
+
*/
|
|
175
|
+
export function bodyLimit(maxSize) {
|
|
176
|
+
return async (c, next) => {
|
|
177
|
+
const contentLength = c.req.header('Content-Length');
|
|
178
|
+
if (contentLength && parseInt(contentLength, 10) > maxSize) {
|
|
179
|
+
throw new HTTPException(413, {
|
|
180
|
+
message: `Request body too large (max ${maxSize} bytes)`,
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
await next();
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../src/api/middleware.ts"],"names":[],"mappings":"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"}
|