@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,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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"}