@llm-dev-ops/agentics-cli 1.3.1 → 1.3.3
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/dist/adapters/base-adapter.js +10 -10
- package/dist/adapters/base-adapter.js.map +1 -1
- package/dist/audit/audit-trail.js +1 -1
- package/dist/cli/index.js +6 -5
- package/dist/cli/index.js.map +1 -1
- package/dist/commands/deploy.d.ts +14 -5
- package/dist/commands/deploy.d.ts.map +1 -1
- package/dist/commands/deploy.js +58 -16
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/diligence.d.ts +12 -4
- package/dist/commands/diligence.d.ts.map +1 -1
- package/dist/commands/diligence.js +54 -14
- package/dist/commands/diligence.js.map +1 -1
- package/dist/commands/export.d.ts +10 -3
- package/dist/commands/export.d.ts.map +1 -1
- package/dist/commands/export.js +56 -16
- package/dist/commands/export.js.map +1 -1
- package/dist/commands/inspect.d.ts +13 -7
- package/dist/commands/inspect.d.ts.map +1 -1
- package/dist/commands/inspect.js +57 -19
- package/dist/commands/inspect.js.map +1 -1
- package/dist/commands/login.js +1 -1
- package/dist/commands/plan.d.ts +11 -4
- package/dist/commands/plan.d.ts.map +1 -1
- package/dist/commands/plan.js +39 -12
- package/dist/commands/plan.js.map +1 -1
- package/dist/commands/quantify.d.ts +12 -6
- package/dist/commands/quantify.d.ts.map +1 -1
- package/dist/commands/quantify.js +56 -17
- package/dist/commands/quantify.js.map +1 -1
- package/dist/commands/simulate.d.ts +10 -3
- package/dist/commands/simulate.d.ts.map +1 -1
- package/dist/commands/simulate.js +69 -18
- package/dist/commands/simulate.js.map +1 -1
- package/dist/config/endpoints.d.ts.map +1 -1
- package/dist/config/endpoints.js +10 -8
- package/dist/config/endpoints.js.map +1 -1
- package/dist/contracts/index.d.ts +21 -0
- package/dist/contracts/index.d.ts.map +1 -0
- package/dist/contracts/index.js +20 -0
- package/dist/contracts/index.js.map +1 -0
- package/dist/contracts/validator.d.ts +62 -0
- package/dist/contracts/validator.d.ts.map +1 -0
- package/dist/contracts/validator.js +397 -0
- package/dist/contracts/validator.js.map +1 -0
- package/dist/server/index.d.ts +26 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +144 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/routes/auth.d.ts +12 -0
- package/dist/server/routes/auth.d.ts.map +1 -0
- package/dist/server/routes/auth.js +111 -0
- package/dist/server/routes/auth.js.map +1 -0
- package/dist/server/routes/diligence.d.ts +12 -0
- package/dist/server/routes/diligence.d.ts.map +1 -0
- package/dist/server/routes/diligence.js +48 -0
- package/dist/server/routes/diligence.js.map +1 -0
- package/dist/server/routes/erpsurface.d.ts +11 -0
- package/dist/server/routes/erpsurface.d.ts.map +1 -0
- package/dist/server/routes/erpsurface.js +59 -0
- package/dist/server/routes/erpsurface.js.map +1 -0
- package/dist/server/routes/exporters.d.ts +12 -0
- package/dist/server/routes/exporters.d.ts.map +1 -0
- package/dist/server/routes/exporters.js +47 -0
- package/dist/server/routes/exporters.js.map +1 -0
- package/dist/server/routes/health.d.ts +11 -0
- package/dist/server/routes/health.d.ts.map +1 -0
- package/dist/server/routes/health.js +33 -0
- package/dist/server/routes/health.js.map +1 -0
- package/dist/server/routes/index.d.ts +17 -0
- package/dist/server/routes/index.d.ts.map +1 -0
- package/dist/server/routes/index.js +17 -0
- package/dist/server/routes/index.js.map +1 -0
- package/dist/server/routes/intent.d.ts +12 -0
- package/dist/server/routes/intent.d.ts.map +1 -0
- package/dist/server/routes/intent.js +50 -0
- package/dist/server/routes/intent.js.map +1 -0
- package/dist/server/routes/manifests.d.ts +12 -0
- package/dist/server/routes/manifests.d.ts.map +1 -0
- package/dist/server/routes/manifests.js +46 -0
- package/dist/server/routes/manifests.js.map +1 -0
- package/dist/server/routes/plans.d.ts +12 -0
- package/dist/server/routes/plans.d.ts.map +1 -0
- package/dist/server/routes/plans.js +47 -0
- package/dist/server/routes/plans.js.map +1 -0
- package/dist/server/routes/roi.d.ts +12 -0
- package/dist/server/routes/roi.d.ts.map +1 -0
- package/dist/server/routes/roi.js +48 -0
- package/dist/server/routes/roi.js.map +1 -0
- package/dist/server/routes/runner.d.ts +12 -0
- package/dist/server/routes/runner.d.ts.map +1 -0
- package/dist/server/routes/runner.js +50 -0
- package/dist/server/routes/runner.js.map +1 -0
- package/dist/server/routes/simulate.d.ts +13 -0
- package/dist/server/routes/simulate.d.ts.map +1 -0
- package/dist/server/routes/simulate.js +58 -0
- package/dist/server/routes/simulate.js.map +1 -0
- package/dist/server/utils/id-generator.d.ts +32 -0
- package/dist/server/utils/id-generator.d.ts.map +1 -0
- package/dist/server/utils/id-generator.js +51 -0
- package/dist/server/utils/id-generator.js.map +1 -0
- package/dist/server/utils/index.d.ts +8 -0
- package/dist/server/utils/index.d.ts.map +1 -0
- package/dist/server/utils/index.js +8 -0
- package/dist/server/utils/index.js.map +1 -0
- package/dist/server/utils/response-builder.d.ts +56 -0
- package/dist/server/utils/response-builder.d.ts.map +1 -0
- package/dist/server/utils/response-builder.js +388 -0
- package/dist/server/utils/response-builder.js.map +1 -0
- package/dist/types/index.d.ts +3 -3
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/package.json +10 -3
|
@@ -0,0 +1,397 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Contract Validator
|
|
3
|
+
*
|
|
4
|
+
* PURPOSE: Single validation boundary for all CLI commands.
|
|
5
|
+
* Uses Ajv in STRICT mode - no coercion, no defaults, no bypass.
|
|
6
|
+
*
|
|
7
|
+
* RULES:
|
|
8
|
+
* - Invalid requests FAIL LOCALLY (no network call)
|
|
9
|
+
* - Invalid responses FAIL HARD (missing execution proof = reject)
|
|
10
|
+
* - Responses MUST have execution_metadata AND multi-layer proof
|
|
11
|
+
* - Multi-layer proof: layers_executed array AND/OR execution_graph
|
|
12
|
+
* - No soft-fail behavior
|
|
13
|
+
* - No bypass flags
|
|
14
|
+
*
|
|
15
|
+
* IMPORTS: All schemas from @agentics/contracts (the canonical source)
|
|
16
|
+
*/
|
|
17
|
+
import { Ajv } from 'ajv';
|
|
18
|
+
import ajvFormatsModule from 'ajv-formats';
|
|
19
|
+
import { CLIError } from '../errors/index.js';
|
|
20
|
+
// Import canonical schemas from @agentics/contracts
|
|
21
|
+
import {
|
|
22
|
+
// Request schemas
|
|
23
|
+
planRequestSchema, simulateRequestSchema, inspectRequestSchema, quantifyRequestSchema, deployRequestSchema, exportRequestSchema, diligenceRequestSchema, manifestsRequestSchema, plansRequestSchema,
|
|
24
|
+
// Response schemas
|
|
25
|
+
baseResponseSchema, manifestResponseSchema, planResponseSchema, simulationResponseSchema, simulationOutputResponseSchema, roiReportResponseSchema, intentResponseSchema, exportResponseSchema, diligencePackageResponseSchema,
|
|
26
|
+
// Execution proof schemas
|
|
27
|
+
platformLayers,
|
|
28
|
+
// Schema registry constants
|
|
29
|
+
RequestSchemas, ResponseSchemas, } from '@agentics/contracts';
|
|
30
|
+
// Re-export schema registry constants
|
|
31
|
+
export { RequestSchemas, ResponseSchemas };
|
|
32
|
+
// Get the formats plugin (handle ESM/CJS default export)
|
|
33
|
+
const formatsPlugin = ajvFormatsModule;
|
|
34
|
+
// ============================================================================
|
|
35
|
+
// Ajv Instance Configuration (STRICT MODE)
|
|
36
|
+
// ============================================================================
|
|
37
|
+
const ajv = new Ajv({
|
|
38
|
+
strict: true,
|
|
39
|
+
strictSchema: true,
|
|
40
|
+
strictNumbers: true,
|
|
41
|
+
strictTypes: true,
|
|
42
|
+
strictTuples: true,
|
|
43
|
+
strictRequired: false, // Allow anyOf/oneOf with different required sets
|
|
44
|
+
allowUnionTypes: true,
|
|
45
|
+
validateFormats: true,
|
|
46
|
+
allErrors: true, // Report all errors, not just the first
|
|
47
|
+
verbose: true, // Include schema and data in errors
|
|
48
|
+
coerceTypes: false, // NO type coercion
|
|
49
|
+
useDefaults: false, // NO default values
|
|
50
|
+
removeAdditional: false, // Do not silently remove extra properties
|
|
51
|
+
});
|
|
52
|
+
// Add format validators (date-time, uri, email, etc.)
|
|
53
|
+
formatsPlugin(ajv);
|
|
54
|
+
const requestSchemas = {
|
|
55
|
+
plan: planRequestSchema,
|
|
56
|
+
simulate: simulateRequestSchema,
|
|
57
|
+
inspect: inspectRequestSchema,
|
|
58
|
+
quantify: quantifyRequestSchema,
|
|
59
|
+
deploy: deployRequestSchema,
|
|
60
|
+
export: exportRequestSchema,
|
|
61
|
+
diligence: diligenceRequestSchema,
|
|
62
|
+
manifests: manifestsRequestSchema,
|
|
63
|
+
plans: plansRequestSchema,
|
|
64
|
+
};
|
|
65
|
+
const responseSchemas = {
|
|
66
|
+
base: baseResponseSchema,
|
|
67
|
+
manifest: manifestResponseSchema,
|
|
68
|
+
plan: planResponseSchema,
|
|
69
|
+
simulation: simulationResponseSchema,
|
|
70
|
+
simulationOutput: simulationOutputResponseSchema,
|
|
71
|
+
roiReport: roiReportResponseSchema,
|
|
72
|
+
intent: intentResponseSchema,
|
|
73
|
+
export: exportResponseSchema,
|
|
74
|
+
diligencePackage: diligencePackageResponseSchema,
|
|
75
|
+
};
|
|
76
|
+
// ============================================================================
|
|
77
|
+
// Compiled Validators (cached for performance)
|
|
78
|
+
// ============================================================================
|
|
79
|
+
const compiledRequestValidators = new Map();
|
|
80
|
+
const compiledResponseValidators = new Map();
|
|
81
|
+
function getRequestValidator(schemaName) {
|
|
82
|
+
let validator = compiledRequestValidators.get(schemaName);
|
|
83
|
+
if (!validator) {
|
|
84
|
+
validator = ajv.compile(requestSchemas[schemaName]);
|
|
85
|
+
compiledRequestValidators.set(schemaName, validator);
|
|
86
|
+
}
|
|
87
|
+
return validator;
|
|
88
|
+
}
|
|
89
|
+
function getResponseValidator(schemaName) {
|
|
90
|
+
let validator = compiledResponseValidators.get(schemaName);
|
|
91
|
+
if (!validator) {
|
|
92
|
+
validator = ajv.compile(responseSchemas[schemaName]);
|
|
93
|
+
compiledResponseValidators.set(schemaName, validator);
|
|
94
|
+
}
|
|
95
|
+
return validator;
|
|
96
|
+
}
|
|
97
|
+
// ============================================================================
|
|
98
|
+
// Validation Error Class
|
|
99
|
+
// ============================================================================
|
|
100
|
+
export class ContractValidationError extends CLIError {
|
|
101
|
+
validationErrors;
|
|
102
|
+
constructor(options) {
|
|
103
|
+
const errorSummary = options.errors
|
|
104
|
+
.slice(0, 3)
|
|
105
|
+
.map((e) => `${e.instancePath || '/'}: ${e.message}`)
|
|
106
|
+
.join('; ');
|
|
107
|
+
super({
|
|
108
|
+
code: options.type === 'request' ? 'ECLI-CONTRACT-REQ-001' : 'ECLI-CONTRACT-RES-001',
|
|
109
|
+
category: options.type === 'request' ? 'INPUT_ERROR' : 'DOWNSTREAM_ERROR',
|
|
110
|
+
message: options.type === 'request'
|
|
111
|
+
? `Request validation failed against contract '${options.schemaName}': ${errorSummary}`
|
|
112
|
+
: `Response missing required execution proof or violates contract '${options.schemaName}': ${errorSummary}`,
|
|
113
|
+
details: {
|
|
114
|
+
schema: options.schemaName,
|
|
115
|
+
validation_errors: options.errors,
|
|
116
|
+
data_preview: options.data ? JSON.stringify(options.data).slice(0, 200) : undefined,
|
|
117
|
+
},
|
|
118
|
+
module: 'contracts',
|
|
119
|
+
correlationId: options.correlationId,
|
|
120
|
+
recoverable: false,
|
|
121
|
+
exitCode: options.type === 'request' ? 100 : 140,
|
|
122
|
+
});
|
|
123
|
+
this.name = 'ContractValidationError';
|
|
124
|
+
this.validationErrors = options.errors;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
// ============================================================================
|
|
128
|
+
// Request Validation Functions
|
|
129
|
+
// ============================================================================
|
|
130
|
+
/**
|
|
131
|
+
* Validate a request payload against its contract schema.
|
|
132
|
+
* MUST be called BEFORE any network request.
|
|
133
|
+
*
|
|
134
|
+
* @throws ContractValidationError if validation fails
|
|
135
|
+
*/
|
|
136
|
+
export function validateRequest(schemaName, data, correlationId) {
|
|
137
|
+
const validator = getRequestValidator(schemaName);
|
|
138
|
+
const valid = validator(data);
|
|
139
|
+
if (!valid) {
|
|
140
|
+
throw new ContractValidationError({
|
|
141
|
+
type: 'request',
|
|
142
|
+
schemaName,
|
|
143
|
+
errors: validator.errors ?? [],
|
|
144
|
+
data,
|
|
145
|
+
correlationId,
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
return data;
|
|
149
|
+
}
|
|
150
|
+
// ============================================================================
|
|
151
|
+
// Response Validation Functions
|
|
152
|
+
// ============================================================================
|
|
153
|
+
/**
|
|
154
|
+
* Validate a response payload against its contract schema.
|
|
155
|
+
* CRITICAL: This enforces:
|
|
156
|
+
* 1. execution_metadata REQUIRED
|
|
157
|
+
* 2. Multi-layer execution proof (layers_executed AND/OR execution_graph)
|
|
158
|
+
*
|
|
159
|
+
* @throws ContractValidationError if validation fails or execution proof missing
|
|
160
|
+
*/
|
|
161
|
+
export function validateResponse(schemaName, data, correlationId) {
|
|
162
|
+
// ========================================================================
|
|
163
|
+
// STEP 1: Verify execution_metadata exists (hard requirement)
|
|
164
|
+
// ========================================================================
|
|
165
|
+
if (!hasExecutionMetadata(data)) {
|
|
166
|
+
throw new ContractValidationError({
|
|
167
|
+
type: 'response',
|
|
168
|
+
schemaName,
|
|
169
|
+
errors: [{
|
|
170
|
+
instancePath: '/execution_metadata',
|
|
171
|
+
message: 'Response missing required execution_metadata - cannot prove execution graph participation',
|
|
172
|
+
keyword: 'required',
|
|
173
|
+
params: { missingProperty: 'execution_metadata' },
|
|
174
|
+
}],
|
|
175
|
+
data,
|
|
176
|
+
correlationId,
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
// ========================================================================
|
|
180
|
+
// STEP 2: Verify multi-layer execution proof exists
|
|
181
|
+
// Responses MUST have either:
|
|
182
|
+
// - layers_executed array with layer execution records
|
|
183
|
+
// - execution_graph with node participation evidence
|
|
184
|
+
// ========================================================================
|
|
185
|
+
const proofResult = validateMultiLayerExecutionProof(data);
|
|
186
|
+
if (!proofResult.valid) {
|
|
187
|
+
throw new ContractValidationError({
|
|
188
|
+
type: 'response',
|
|
189
|
+
schemaName,
|
|
190
|
+
errors: proofResult.errors,
|
|
191
|
+
data,
|
|
192
|
+
correlationId,
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
// ========================================================================
|
|
196
|
+
// STEP 3: Validate full response schema
|
|
197
|
+
// ========================================================================
|
|
198
|
+
const validator = getResponseValidator(schemaName);
|
|
199
|
+
const valid = validator(data);
|
|
200
|
+
if (!valid) {
|
|
201
|
+
throw new ContractValidationError({
|
|
202
|
+
type: 'response',
|
|
203
|
+
schemaName,
|
|
204
|
+
errors: validator.errors ?? [],
|
|
205
|
+
data,
|
|
206
|
+
correlationId,
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
return data;
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Validate that execution_metadata exists and has required fields.
|
|
213
|
+
* This is a hard requirement - responses without it are REJECTED.
|
|
214
|
+
*/
|
|
215
|
+
function hasExecutionMetadata(data) {
|
|
216
|
+
if (!data || typeof data !== 'object') {
|
|
217
|
+
return false;
|
|
218
|
+
}
|
|
219
|
+
const obj = data;
|
|
220
|
+
const meta = obj['execution_metadata'];
|
|
221
|
+
if (!meta || typeof meta !== 'object') {
|
|
222
|
+
return false;
|
|
223
|
+
}
|
|
224
|
+
const metadata = meta;
|
|
225
|
+
// All required fields must be present
|
|
226
|
+
return (typeof metadata['execution_id'] === 'string' &&
|
|
227
|
+
typeof metadata['layer'] === 'string' &&
|
|
228
|
+
typeof metadata['timestamp'] === 'string' &&
|
|
229
|
+
typeof metadata['checksum'] === 'string');
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Validate multi-layer execution proof.
|
|
233
|
+
* Responses MUST have at least one of:
|
|
234
|
+
* - layers_executed: array of layer execution records
|
|
235
|
+
* - execution_graph: DAG showing node participation
|
|
236
|
+
*
|
|
237
|
+
* This proves the response traversed the execution graph.
|
|
238
|
+
*/
|
|
239
|
+
function validateMultiLayerExecutionProof(data) {
|
|
240
|
+
if (!data || typeof data !== 'object') {
|
|
241
|
+
return {
|
|
242
|
+
valid: false,
|
|
243
|
+
errors: [{
|
|
244
|
+
instancePath: '/',
|
|
245
|
+
message: 'Response must be an object',
|
|
246
|
+
keyword: 'type',
|
|
247
|
+
params: { type: 'object' },
|
|
248
|
+
}],
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
const obj = data;
|
|
252
|
+
const hasLayersExecuted = Array.isArray(obj['layers_executed']) && obj['layers_executed'].length > 0;
|
|
253
|
+
const hasExecutionGraph = obj['execution_graph'] && typeof obj['execution_graph'] === 'object';
|
|
254
|
+
// At least one form of multi-layer proof is required
|
|
255
|
+
if (!hasLayersExecuted && !hasExecutionGraph) {
|
|
256
|
+
return {
|
|
257
|
+
valid: false,
|
|
258
|
+
errors: [{
|
|
259
|
+
instancePath: '/',
|
|
260
|
+
message: 'Response missing multi-layer execution proof - must include layers_executed array OR execution_graph',
|
|
261
|
+
keyword: 'anyOf',
|
|
262
|
+
params: { missingProperty: 'layers_executed OR execution_graph' },
|
|
263
|
+
}],
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
// If layers_executed is present, validate it has required structure
|
|
267
|
+
if (hasLayersExecuted) {
|
|
268
|
+
const layersExecuted = obj['layers_executed'];
|
|
269
|
+
const layerErrors = [];
|
|
270
|
+
for (let i = 0; i < layersExecuted.length; i++) {
|
|
271
|
+
const record = layersExecuted[i];
|
|
272
|
+
if (!record || typeof record !== 'object') {
|
|
273
|
+
layerErrors.push({
|
|
274
|
+
instancePath: `/layers_executed/${i}`,
|
|
275
|
+
message: 'Layer execution record must be an object',
|
|
276
|
+
keyword: 'type',
|
|
277
|
+
params: { type: 'object' },
|
|
278
|
+
});
|
|
279
|
+
continue;
|
|
280
|
+
}
|
|
281
|
+
// Validate required fields
|
|
282
|
+
if (typeof record['layer'] !== 'string') {
|
|
283
|
+
layerErrors.push({
|
|
284
|
+
instancePath: `/layers_executed/${i}/layer`,
|
|
285
|
+
message: 'Layer execution record missing layer identifier',
|
|
286
|
+
keyword: 'required',
|
|
287
|
+
params: { missingProperty: 'layer' },
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
else if (!platformLayers.includes(record['layer'])) {
|
|
291
|
+
layerErrors.push({
|
|
292
|
+
instancePath: `/layers_executed/${i}/layer`,
|
|
293
|
+
message: `Invalid layer '${record['layer']}' - must be one of: ${platformLayers.join(', ')}`,
|
|
294
|
+
keyword: 'enum',
|
|
295
|
+
params: { allowedValues: platformLayers },
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
if (typeof record['execution_id'] !== 'string') {
|
|
299
|
+
layerErrors.push({
|
|
300
|
+
instancePath: `/layers_executed/${i}/execution_id`,
|
|
301
|
+
message: 'Layer execution record missing execution_id',
|
|
302
|
+
keyword: 'required',
|
|
303
|
+
params: { missingProperty: 'execution_id' },
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
if (typeof record['timestamp'] !== 'string') {
|
|
307
|
+
layerErrors.push({
|
|
308
|
+
instancePath: `/layers_executed/${i}/timestamp`,
|
|
309
|
+
message: 'Layer execution record missing timestamp',
|
|
310
|
+
keyword: 'required',
|
|
311
|
+
params: { missingProperty: 'timestamp' },
|
|
312
|
+
});
|
|
313
|
+
}
|
|
314
|
+
if (typeof record['status'] !== 'string') {
|
|
315
|
+
layerErrors.push({
|
|
316
|
+
instancePath: `/layers_executed/${i}/status`,
|
|
317
|
+
message: 'Layer execution record missing status',
|
|
318
|
+
keyword: 'required',
|
|
319
|
+
params: { missingProperty: 'status' },
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
if (layerErrors.length > 0) {
|
|
324
|
+
return { valid: false, errors: layerErrors };
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
// If execution_graph is present, validate it has required structure
|
|
328
|
+
if (hasExecutionGraph) {
|
|
329
|
+
const graph = obj['execution_graph'];
|
|
330
|
+
const graphErrors = [];
|
|
331
|
+
if (typeof graph['graph_id'] !== 'string') {
|
|
332
|
+
graphErrors.push({
|
|
333
|
+
instancePath: '/execution_graph/graph_id',
|
|
334
|
+
message: 'Execution graph missing graph_id',
|
|
335
|
+
keyword: 'required',
|
|
336
|
+
params: { missingProperty: 'graph_id' },
|
|
337
|
+
});
|
|
338
|
+
}
|
|
339
|
+
if (typeof graph['root_node'] !== 'string') {
|
|
340
|
+
graphErrors.push({
|
|
341
|
+
instancePath: '/execution_graph/root_node',
|
|
342
|
+
message: 'Execution graph missing root_node',
|
|
343
|
+
keyword: 'required',
|
|
344
|
+
params: { missingProperty: 'root_node' },
|
|
345
|
+
});
|
|
346
|
+
}
|
|
347
|
+
if (!Array.isArray(graph['nodes']) || graph['nodes'].length === 0) {
|
|
348
|
+
graphErrors.push({
|
|
349
|
+
instancePath: '/execution_graph/nodes',
|
|
350
|
+
message: 'Execution graph must have at least one node',
|
|
351
|
+
keyword: 'minItems',
|
|
352
|
+
params: { limit: 1 },
|
|
353
|
+
});
|
|
354
|
+
}
|
|
355
|
+
if (typeof graph['created_at'] !== 'string') {
|
|
356
|
+
graphErrors.push({
|
|
357
|
+
instancePath: '/execution_graph/created_at',
|
|
358
|
+
message: 'Execution graph missing created_at timestamp',
|
|
359
|
+
keyword: 'required',
|
|
360
|
+
params: { missingProperty: 'created_at' },
|
|
361
|
+
});
|
|
362
|
+
}
|
|
363
|
+
if (graphErrors.length > 0) {
|
|
364
|
+
return { valid: false, errors: graphErrors };
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
return { valid: true, errors: [] };
|
|
368
|
+
}
|
|
369
|
+
/**
|
|
370
|
+
* Safe validation that returns a result object instead of throwing.
|
|
371
|
+
* Useful for conditional handling in some scenarios.
|
|
372
|
+
*/
|
|
373
|
+
export function safeValidateRequest(schemaName, data, correlationId) {
|
|
374
|
+
try {
|
|
375
|
+
const validated = validateRequest(schemaName, data, correlationId);
|
|
376
|
+
return { valid: true, data: validated };
|
|
377
|
+
}
|
|
378
|
+
catch (error) {
|
|
379
|
+
if (error instanceof ContractValidationError) {
|
|
380
|
+
return { valid: false, error };
|
|
381
|
+
}
|
|
382
|
+
throw error;
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
export function safeValidateResponse(schemaName, data, correlationId) {
|
|
386
|
+
try {
|
|
387
|
+
const validated = validateResponse(schemaName, data, correlationId);
|
|
388
|
+
return { valid: true, data: validated };
|
|
389
|
+
}
|
|
390
|
+
catch (error) {
|
|
391
|
+
if (error instanceof ContractValidationError) {
|
|
392
|
+
return { valid: false, error };
|
|
393
|
+
}
|
|
394
|
+
throw error;
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
//# sourceMappingURL=validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/contracts/validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agentics Platform API Server
|
|
3
|
+
*
|
|
4
|
+
* Hono-based backend API server providing stub implementations
|
|
5
|
+
* for all agentics platform services.
|
|
6
|
+
*
|
|
7
|
+
* Routes:
|
|
8
|
+
* - GET /health - Health check
|
|
9
|
+
* - GET /ready - Readiness check
|
|
10
|
+
* - POST /v1/cli/auth/sessions - OAuth device flow session creation
|
|
11
|
+
* - GET /v1/cli/auth/sessions/:code - Poll auth status
|
|
12
|
+
* - POST /v1/simulate - Simulation engine (inspect command)
|
|
13
|
+
* - POST /v1/manifests - Manifests service (plan command)
|
|
14
|
+
* - POST /v1/plans - Planner service (plan command)
|
|
15
|
+
* - POST /v1/runner - Runner service (simulate command)
|
|
16
|
+
* - POST /v1/roi - ROI engine (quantify command)
|
|
17
|
+
* - POST /v1/intent - Intent service (deploy command)
|
|
18
|
+
* - POST /v1/exporters - Exporters service (export command)
|
|
19
|
+
* - POST /v1/diligence - Diligence service (diligence command)
|
|
20
|
+
* - POST /v1/erpsurface - ERP Surface service (ERP integration)
|
|
21
|
+
*/
|
|
22
|
+
import { Hono } from 'hono';
|
|
23
|
+
declare const app: Hono<import("hono/types").BlankEnv, import("hono/types").BlankSchema, "/">;
|
|
24
|
+
export { app };
|
|
25
|
+
export default app;
|
|
26
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAGH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAsB5B,QAAA,MAAM,GAAG,4EAAa,CAAC;AAsIvB,OAAO,EAAE,GAAG,EAAE,CAAC;AACf,eAAe,GAAG,CAAC"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agentics Platform API Server
|
|
3
|
+
*
|
|
4
|
+
* Hono-based backend API server providing stub implementations
|
|
5
|
+
* for all agentics platform services.
|
|
6
|
+
*
|
|
7
|
+
* Routes:
|
|
8
|
+
* - GET /health - Health check
|
|
9
|
+
* - GET /ready - Readiness check
|
|
10
|
+
* - POST /v1/cli/auth/sessions - OAuth device flow session creation
|
|
11
|
+
* - GET /v1/cli/auth/sessions/:code - Poll auth status
|
|
12
|
+
* - POST /v1/simulate - Simulation engine (inspect command)
|
|
13
|
+
* - POST /v1/manifests - Manifests service (plan command)
|
|
14
|
+
* - POST /v1/plans - Planner service (plan command)
|
|
15
|
+
* - POST /v1/runner - Runner service (simulate command)
|
|
16
|
+
* - POST /v1/roi - ROI engine (quantify command)
|
|
17
|
+
* - POST /v1/intent - Intent service (deploy command)
|
|
18
|
+
* - POST /v1/exporters - Exporters service (export command)
|
|
19
|
+
* - POST /v1/diligence - Diligence service (diligence command)
|
|
20
|
+
* - POST /v1/erpsurface - ERP Surface service (ERP integration)
|
|
21
|
+
*/
|
|
22
|
+
import { serve } from '@hono/node-server';
|
|
23
|
+
import { Hono } from 'hono';
|
|
24
|
+
import { cors } from 'hono/cors';
|
|
25
|
+
import { logger } from 'hono/logger';
|
|
26
|
+
import { simulate, manifests, plans, runner, roi, intent, exporters, diligence, health, auth, erpsurface, } from './routes/index.js';
|
|
27
|
+
// ============================================================================
|
|
28
|
+
// App Configuration
|
|
29
|
+
// ============================================================================
|
|
30
|
+
const app = new Hono();
|
|
31
|
+
// Middleware
|
|
32
|
+
app.use('*', logger());
|
|
33
|
+
app.use('*', cors({
|
|
34
|
+
origin: '*',
|
|
35
|
+
allowMethods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],
|
|
36
|
+
allowHeaders: ['Content-Type', 'Authorization', 'X-Correlation-ID', 'X-Trace-ID'],
|
|
37
|
+
credentials: true,
|
|
38
|
+
}));
|
|
39
|
+
// ============================================================================
|
|
40
|
+
// Route Registration
|
|
41
|
+
// ============================================================================
|
|
42
|
+
// Health check (root level)
|
|
43
|
+
app.route('/health', health);
|
|
44
|
+
// Readiness check
|
|
45
|
+
app.get('/ready', (c) => {
|
|
46
|
+
return c.json({
|
|
47
|
+
ready: true,
|
|
48
|
+
timestamp: new Date().toISOString(),
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
// Root endpoint
|
|
52
|
+
app.get('/', (c) => {
|
|
53
|
+
return c.json({
|
|
54
|
+
name: 'Agentics Platform API',
|
|
55
|
+
version: process.env['npm_package_version'] ?? '1.0.0',
|
|
56
|
+
documentation: 'https://platform.agentics.dev/docs',
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
// Legacy status endpoint
|
|
60
|
+
app.get('/api/v1/status', (c) => {
|
|
61
|
+
return c.json({
|
|
62
|
+
operational: true,
|
|
63
|
+
timestamp: new Date().toISOString(),
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
// Auth routes
|
|
67
|
+
app.route('/v1/cli/auth', auth);
|
|
68
|
+
// API v1 routes
|
|
69
|
+
app.route('/v1/simulate', simulate);
|
|
70
|
+
app.route('/v1/manifests', manifests);
|
|
71
|
+
app.route('/v1/plans', plans);
|
|
72
|
+
app.route('/v1/runner', runner);
|
|
73
|
+
app.route('/v1/roi', roi);
|
|
74
|
+
app.route('/v1/intent', intent);
|
|
75
|
+
app.route('/v1/exporters', exporters);
|
|
76
|
+
app.route('/v1/diligence', diligence);
|
|
77
|
+
app.route('/v1/erpsurface', erpsurface);
|
|
78
|
+
// ============================================================================
|
|
79
|
+
// Error Handling
|
|
80
|
+
// ============================================================================
|
|
81
|
+
app.notFound((c) => {
|
|
82
|
+
return c.json({
|
|
83
|
+
error: {
|
|
84
|
+
code: 'NOT_FOUND',
|
|
85
|
+
message: `Route ${c.req.method} ${c.req.path} not found`,
|
|
86
|
+
available_routes: [
|
|
87
|
+
'GET /health',
|
|
88
|
+
'GET /ready',
|
|
89
|
+
'POST /v1/cli/auth/sessions',
|
|
90
|
+
'GET /v1/cli/auth/sessions/:device_code',
|
|
91
|
+
'POST /v1/simulate',
|
|
92
|
+
'POST /v1/manifests',
|
|
93
|
+
'POST /v1/plans',
|
|
94
|
+
'POST /v1/runner',
|
|
95
|
+
'POST /v1/roi',
|
|
96
|
+
'POST /v1/intent',
|
|
97
|
+
'POST /v1/exporters',
|
|
98
|
+
'POST /v1/diligence',
|
|
99
|
+
'POST /v1/erpsurface',
|
|
100
|
+
],
|
|
101
|
+
},
|
|
102
|
+
}, 404);
|
|
103
|
+
});
|
|
104
|
+
app.onError((err, c) => {
|
|
105
|
+
console.error('Unhandled error:', err);
|
|
106
|
+
return c.json({
|
|
107
|
+
error: {
|
|
108
|
+
code: 'INTERNAL_ERROR',
|
|
109
|
+
message: process.env['NODE_ENV'] === 'production'
|
|
110
|
+
? 'An error occurred'
|
|
111
|
+
: (err.message ?? 'An unexpected error occurred'),
|
|
112
|
+
},
|
|
113
|
+
}, 500);
|
|
114
|
+
});
|
|
115
|
+
// ============================================================================
|
|
116
|
+
// Server Startup
|
|
117
|
+
// ============================================================================
|
|
118
|
+
const PORT = parseInt(process.env['PORT'] ?? '8080', 10);
|
|
119
|
+
console.log(`Starting Agentics Platform API Server...`);
|
|
120
|
+
console.log(`Environment: ${process.env['NODE_ENV'] ?? 'development'}`);
|
|
121
|
+
serve({
|
|
122
|
+
fetch: app.fetch,
|
|
123
|
+
port: PORT,
|
|
124
|
+
}, (info) => {
|
|
125
|
+
console.log(`Server running at http://localhost:${info.port}`);
|
|
126
|
+
console.log(`\nAvailable endpoints:`);
|
|
127
|
+
console.log(` GET http://localhost:${info.port}/health`);
|
|
128
|
+
console.log(` GET http://localhost:${info.port}/ready`);
|
|
129
|
+
console.log(` POST http://localhost:${info.port}/v1/cli/auth/sessions`);
|
|
130
|
+
console.log(` GET http://localhost:${info.port}/v1/cli/auth/sessions/:device_code`);
|
|
131
|
+
console.log(` POST http://localhost:${info.port}/v1/simulate`);
|
|
132
|
+
console.log(` POST http://localhost:${info.port}/v1/manifests`);
|
|
133
|
+
console.log(` POST http://localhost:${info.port}/v1/plans`);
|
|
134
|
+
console.log(` POST http://localhost:${info.port}/v1/runner`);
|
|
135
|
+
console.log(` POST http://localhost:${info.port}/v1/roi`);
|
|
136
|
+
console.log(` POST http://localhost:${info.port}/v1/intent`);
|
|
137
|
+
console.log(` POST http://localhost:${info.port}/v1/exporters`);
|
|
138
|
+
console.log(` POST http://localhost:${info.port}/v1/diligence`);
|
|
139
|
+
console.log(` POST http://localhost:${info.port}/v1/erpsurface`);
|
|
140
|
+
});
|
|
141
|
+
// Export for testing and programmatic use
|
|
142
|
+
export { app };
|
|
143
|
+
export default app;
|
|
144
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auth Route Handler
|
|
3
|
+
*
|
|
4
|
+
* POST /v1/cli/auth/sessions - Create OAuth device flow session
|
|
5
|
+
* GET /v1/cli/auth/sessions/:device_code - Poll for auth completion
|
|
6
|
+
*
|
|
7
|
+
* OAuth device flow authentication endpoints for CLI login.
|
|
8
|
+
*/
|
|
9
|
+
import { Hono } from 'hono';
|
|
10
|
+
declare const auth: Hono<import("hono/types").BlankEnv, import("hono/types").BlankSchema, "/">;
|
|
11
|
+
export { auth };
|
|
12
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/server/routes/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,QAAA,MAAM,IAAI,4EAAa,CAAC;AAiIxB,OAAO,EAAE,IAAI,EAAE,CAAC"}
|