@agentix-e/nl2spel 1.1.1 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -3
- package/dist/context/context-extractor.d.ts.map +1 -1
- package/dist/context/context-extractor.js +14 -4
- package/dist/context/context-extractor.js.map +1 -1
- package/dist/context/schema-formatter.js +1 -1
- package/dist/context/schema-formatter.js.map +1 -1
- package/dist/engine/nl2spel-engine.d.ts.map +1 -1
- package/dist/engine/nl2spel-engine.js +2 -4
- package/dist/engine/nl2spel-engine.js.map +1 -1
- package/dist/pattern/builtin-patterns.d.ts +1 -1
- package/dist/pattern/builtin-patterns.js +1 -1
- package/dist/pattern/pattern-matcher.d.ts.map +1 -1
- package/dist/pattern/pattern-matcher.js +1 -1
- package/dist/pattern/pattern-matcher.js.map +1 -1
- package/dist/provider/provider-registry.js +3 -3
- package/dist/provider/provider-registry.js.map +1 -1
- package/dist/strategy/strategy-router.d.ts.map +1 -1
- package/dist/strategy/strategy-router.js +3 -3
- package/dist/strategy/strategy-router.js.map +1 -1
- package/dist/template/intent-classifier.js +1 -1
- package/dist/template/intent-classifier.js.map +1 -1
- package/dist/template/prompts/prompt-builder.js +1 -1
- package/dist/template/prompts/prompt-builder.js.map +1 -1
- package/dist/template/template-engine.js +3 -3
- package/dist/template/template-engine.js.map +1 -1
- package/dist/validation/self-correction-loop.d.ts.map +1 -1
- package/dist/validation/self-correction-loop.js +2 -2
- package/dist/validation/self-correction-loop.js.map +1 -1
- package/package.json +2 -2
- package/dist/__tests__/auto-fixer.test.d.ts +0 -2
- package/dist/__tests__/auto-fixer.test.d.ts.map +0 -1
- package/dist/__tests__/auto-fixer.test.js +0 -285
- package/dist/__tests__/auto-fixer.test.js.map +0 -1
- package/dist/__tests__/chinese-number-parser.test.d.ts +0 -2
- package/dist/__tests__/chinese-number-parser.test.d.ts.map +0 -1
- package/dist/__tests__/chinese-number-parser.test.js +0 -106
- package/dist/__tests__/chinese-number-parser.test.js.map +0 -1
- package/dist/__tests__/context-extractor.test.d.ts +0 -2
- package/dist/__tests__/context-extractor.test.d.ts.map +0 -1
- package/dist/__tests__/context-extractor.test.js +0 -347
- package/dist/__tests__/context-extractor.test.js.map +0 -1
- package/dist/__tests__/coverage-gaps.test.d.ts +0 -2
- package/dist/__tests__/coverage-gaps.test.d.ts.map +0 -1
- package/dist/__tests__/coverage-gaps.test.js +0 -578
- package/dist/__tests__/coverage-gaps.test.js.map +0 -1
- package/dist/__tests__/intent-classifier.test.d.ts +0 -2
- package/dist/__tests__/intent-classifier.test.d.ts.map +0 -1
- package/dist/__tests__/intent-classifier.test.js +0 -384
- package/dist/__tests__/intent-classifier.test.js.map +0 -1
- package/dist/__tests__/nl2spel-engine.test.d.ts +0 -2
- package/dist/__tests__/nl2spel-engine.test.d.ts.map +0 -1
- package/dist/__tests__/nl2spel-engine.test.js +0 -344
- package/dist/__tests__/nl2spel-engine.test.js.map +0 -1
- package/dist/__tests__/pattern-matcher.test.d.ts +0 -2
- package/dist/__tests__/pattern-matcher.test.d.ts.map +0 -1
- package/dist/__tests__/pattern-matcher.test.js +0 -754
- package/dist/__tests__/pattern-matcher.test.js.map +0 -1
- package/dist/__tests__/prompt-builder.test.d.ts +0 -2
- package/dist/__tests__/prompt-builder.test.d.ts.map +0 -1
- package/dist/__tests__/prompt-builder.test.js +0 -99
- package/dist/__tests__/prompt-builder.test.js.map +0 -1
- package/dist/__tests__/provider-registry.test.d.ts +0 -2
- package/dist/__tests__/provider-registry.test.d.ts.map +0 -1
- package/dist/__tests__/provider-registry.test.js +0 -240
- package/dist/__tests__/provider-registry.test.js.map +0 -1
- package/dist/__tests__/schema-formatter.test.d.ts +0 -2
- package/dist/__tests__/schema-formatter.test.d.ts.map +0 -1
- package/dist/__tests__/schema-formatter.test.js +0 -298
- package/dist/__tests__/schema-formatter.test.js.map +0 -1
- package/dist/__tests__/self-correction-loop.test.d.ts +0 -2
- package/dist/__tests__/self-correction-loop.test.d.ts.map +0 -1
- package/dist/__tests__/self-correction-loop.test.js +0 -253
- package/dist/__tests__/self-correction-loop.test.js.map +0 -1
- package/dist/__tests__/strategy-router.test.d.ts +0 -2
- package/dist/__tests__/strategy-router.test.d.ts.map +0 -1
- package/dist/__tests__/strategy-router.test.js +0 -493
- package/dist/__tests__/strategy-router.test.js.map +0 -1
- package/dist/__tests__/template-engine.test.d.ts +0 -2
- package/dist/__tests__/template-engine.test.d.ts.map +0 -1
- package/dist/__tests__/template-engine.test.js +0 -367
- package/dist/__tests__/template-engine.test.js.map +0 -1
- package/dist/__tests__/validation-pipeline.test.d.ts +0 -2
- package/dist/__tests__/validation-pipeline.test.d.ts.map +0 -1
- package/dist/__tests__/validation-pipeline.test.js +0 -262
- package/dist/__tests__/validation-pipeline.test.js.map +0 -1
|
@@ -1,262 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import { ValidationPipeline } from '../validation/validation-pipeline.js';
|
|
3
|
-
function createSchema() {
|
|
4
|
-
return {
|
|
5
|
-
root: {
|
|
6
|
-
name: 'order',
|
|
7
|
-
type: 'Order',
|
|
8
|
-
fields: {
|
|
9
|
-
amount: { type: 'number', description: '订单金额' },
|
|
10
|
-
status: { type: 'string', description: '订单状态' },
|
|
11
|
-
remark: { type: 'string', description: '备注' },
|
|
12
|
-
paid: { type: 'boolean', description: '是否支付' },
|
|
13
|
-
items: { type: 'array', isCollection: true, elementType: 'object' },
|
|
14
|
-
tags: { type: 'array', isCollection: true, elementType: 'string' },
|
|
15
|
-
},
|
|
16
|
-
methods: {},
|
|
17
|
-
},
|
|
18
|
-
variables: { user: { type: 'object' } },
|
|
19
|
-
beans: { discountService: { type: 'DiscountService' } },
|
|
20
|
-
types: { Admin: { className: 'com.example.Admin' } },
|
|
21
|
-
functions: {},
|
|
22
|
-
};
|
|
23
|
-
}
|
|
24
|
-
class MockEvaluator {
|
|
25
|
-
validExpressions;
|
|
26
|
-
constructor(validExpressions = []) {
|
|
27
|
-
this.validExpressions = new Set(validExpressions);
|
|
28
|
-
}
|
|
29
|
-
async parse(expression) {
|
|
30
|
-
if (this.validExpressions.has(expression)) {
|
|
31
|
-
return { valid: true, errors: [] };
|
|
32
|
-
}
|
|
33
|
-
return {
|
|
34
|
-
valid: false,
|
|
35
|
-
errors: [
|
|
36
|
-
{
|
|
37
|
-
message: `Syntax error in: ${expression}`,
|
|
38
|
-
position: 0,
|
|
39
|
-
code: 'SYNTAX',
|
|
40
|
-
},
|
|
41
|
-
],
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
|
-
getContextSchema() {
|
|
45
|
-
return createSchema();
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
describe('ValidationPipeline', () => {
|
|
49
|
-
const pipeline = new ValidationPipeline();
|
|
50
|
-
const schema = createSchema();
|
|
51
|
-
// ===== VL-G07: Parse Check =====
|
|
52
|
-
describe('VL-G07: Parse Check', () => {
|
|
53
|
-
it('should pass valid expressions', async () => {
|
|
54
|
-
const result = await pipeline.validate('#order.amount > 1000', schema);
|
|
55
|
-
expect(result.stages.parse.passed).toBe(true);
|
|
56
|
-
});
|
|
57
|
-
it('should fail empty expression', async () => {
|
|
58
|
-
const result = await pipeline.validate('', schema);
|
|
59
|
-
expect(result.stages.parse.passed).toBe(false);
|
|
60
|
-
expect(result.errors.some(e => e.code === 'PARSE-EMPTY')).toBe(true);
|
|
61
|
-
});
|
|
62
|
-
it('should detect JS === operator', async () => {
|
|
63
|
-
const result = await pipeline.validate('#order.amount === 1000', schema);
|
|
64
|
-
expect(result.errors.some(e => e.code === 'PARSE-JS_OPERATOR')).toBe(true);
|
|
65
|
-
});
|
|
66
|
-
it('should detect JS !== operator', async () => {
|
|
67
|
-
const result = await pipeline.validate("#order.status !== 'done'", schema);
|
|
68
|
-
expect(result.errors.some(e => e.code === 'PARSE-JS_OPERATOR')).toBe(true);
|
|
69
|
-
});
|
|
70
|
-
it('should detect JS && operator', async () => {
|
|
71
|
-
const result = await pipeline.validate('#order.amount > 100 && #order.paid', schema);
|
|
72
|
-
expect(result.errors.some(e => e.code === 'PARSE-JS_LOGIC')).toBe(true);
|
|
73
|
-
});
|
|
74
|
-
it('should detect JS || operator', async () => {
|
|
75
|
-
const result = await pipeline.validate('#order.vip || #order.admin', schema);
|
|
76
|
-
expect(result.errors.some(e => e.code === 'PARSE-JS_LOGIC')).toBe(true);
|
|
77
|
-
});
|
|
78
|
-
it('should detect unbalanced parentheses', async () => {
|
|
79
|
-
const result = await pipeline.validate('(#order.amount > 100', schema);
|
|
80
|
-
expect(result.errors.some(e => e.code === 'PARSE-UNBALANCED_PARENS')).toBe(true);
|
|
81
|
-
});
|
|
82
|
-
it('should pass balanced complex expressions', async () => {
|
|
83
|
-
const result = await pipeline.validate("(#order.amount > 100) and (#order.status == 'done')", schema);
|
|
84
|
-
expect(result.stages.parse.passed).toBe(true);
|
|
85
|
-
});
|
|
86
|
-
it('should pass balanced brackets', async () => {
|
|
87
|
-
const result = await pipeline.validate('#order.items.?[#this.amount > 100]', schema);
|
|
88
|
-
expect(result.stages.parse.passed).toBe(true);
|
|
89
|
-
});
|
|
90
|
-
});
|
|
91
|
-
// ===== VL-G08: Type Check =====
|
|
92
|
-
describe('VL-G08: Type Check', () => {
|
|
93
|
-
it('should pass valid type operations', async () => {
|
|
94
|
-
const result = await pipeline.validate('#order.amount > 100', schema);
|
|
95
|
-
expect(result.stages.type.passed).toBe(true);
|
|
96
|
-
});
|
|
97
|
-
it('should warn on string-number comparison', async () => {
|
|
98
|
-
const result = await pipeline.validate("'hello' > 100", schema);
|
|
99
|
-
expect(result.stages.type.warnings.length).toBeGreaterThan(0);
|
|
100
|
-
});
|
|
101
|
-
it('should warn on boolean-number comparison', async () => {
|
|
102
|
-
const result = await pipeline.validate('#order.paid > 5', schema);
|
|
103
|
-
expect(result.stages.type.warnings.length).toBeGreaterThan(0);
|
|
104
|
-
});
|
|
105
|
-
});
|
|
106
|
-
// ===== VL-G09: Semantic Check =====
|
|
107
|
-
describe('VL-G09: Semantic Check', () => {
|
|
108
|
-
it('should pass semantically valid expressions', async () => {
|
|
109
|
-
const result = await pipeline.validate('#order.amount > 100', schema);
|
|
110
|
-
expect(result.stages.semantic.passed).toBe(true);
|
|
111
|
-
});
|
|
112
|
-
it('should warn on self-comparison', async () => {
|
|
113
|
-
const result = await pipeline.validate('#order.amount == #order.amount', schema);
|
|
114
|
-
expect(result.stages.semantic.warnings.length).toBeGreaterThan(0);
|
|
115
|
-
});
|
|
116
|
-
it('should warn on double negation', async () => {
|
|
117
|
-
const result = await pipeline.validate('!!#order.paid', schema);
|
|
118
|
-
expect(result.stages.semantic.warnings.length).toBeGreaterThan(0);
|
|
119
|
-
});
|
|
120
|
-
it('should pass valid negation', async () => {
|
|
121
|
-
const result = await pipeline.validate('!#order.paid', schema);
|
|
122
|
-
expect(result.stages.semantic.passed).toBe(true);
|
|
123
|
-
});
|
|
124
|
-
});
|
|
125
|
-
// ===== VL-G10: Context Check =====
|
|
126
|
-
describe('VL-G10: Context Check', () => {
|
|
127
|
-
it('should pass context-valid expressions', async () => {
|
|
128
|
-
const result = await pipeline.validate('#order.amount > 100', schema);
|
|
129
|
-
expect(result.stages.context.passed).toBe(true);
|
|
130
|
-
});
|
|
131
|
-
it('should warn on unknown field', async () => {
|
|
132
|
-
const result = await pipeline.validate('#order.unknown > 100', schema);
|
|
133
|
-
expect(result.stages.context.warnings.length).toBeGreaterThan(0);
|
|
134
|
-
});
|
|
135
|
-
it('should warn on unknown bean reference', async () => {
|
|
136
|
-
const result = await pipeline.validate('@unknownService', schema);
|
|
137
|
-
expect(result.stages.context.warnings.length).toBeGreaterThan(0);
|
|
138
|
-
});
|
|
139
|
-
it('should warn without ContextSchema', async () => {
|
|
140
|
-
const result = await pipeline.validate('#order.amount > 100');
|
|
141
|
-
expect(result.stages.context.warnings.some(w => w.code === 'CTX-NO_SCHEMA')).toBe(true);
|
|
142
|
-
});
|
|
143
|
-
it('should pass known bean reference', async () => {
|
|
144
|
-
// @discountService is in the schema
|
|
145
|
-
const result = await pipeline.validate('@discountService', schema);
|
|
146
|
-
expect(result.valid).toBe(true);
|
|
147
|
-
});
|
|
148
|
-
it('should detect unknown variable', async () => {
|
|
149
|
-
const result = await pipeline.validate('#unknown > 100', schema);
|
|
150
|
-
expect(result.stages.context.warnings.length).toBeGreaterThan(0);
|
|
151
|
-
});
|
|
152
|
-
});
|
|
153
|
-
// ===== VL-G11: Full Validation Flow =====
|
|
154
|
-
describe('VL-G11: Full Validation Flow', () => {
|
|
155
|
-
it('should validate a correct expression fully', async () => {
|
|
156
|
-
const result = await pipeline.validate("#order.amount > 1000 and #order.tags.contains('VIP')", schema);
|
|
157
|
-
expect(result.valid).toBe(true);
|
|
158
|
-
expect(result.errors).toHaveLength(0);
|
|
159
|
-
});
|
|
160
|
-
it('should collect all errors from all stages', async () => {
|
|
161
|
-
const result = await pipeline.validate('#order.amount === 1000 && #order.unknown > 100', schema);
|
|
162
|
-
expect(result.errors.length).toBeGreaterThan(1);
|
|
163
|
-
expect(result.valid).toBe(false);
|
|
164
|
-
});
|
|
165
|
-
it('should mark errors as requiring LLM re-generation', async () => {
|
|
166
|
-
const result = await pipeline.validate('#order.amount === 1000', schema);
|
|
167
|
-
const parseErrors = result.errors.filter(e => e.stage === 'parse');
|
|
168
|
-
expect(parseErrors.some(e => e.requiresLLM)).toBe(true);
|
|
169
|
-
});
|
|
170
|
-
});
|
|
171
|
-
// ===== VL-G12: Custom Evaluator =====
|
|
172
|
-
describe('VL-G12: Custom SpelEvaluator', () => {
|
|
173
|
-
it('should use provided evaluator for parse validation', async () => {
|
|
174
|
-
const evaluator = new MockEvaluator(['#order.amount > 1000']);
|
|
175
|
-
const pipeline = new ValidationPipeline(evaluator);
|
|
176
|
-
const result = await pipeline.validate('#order.amount > 1000', schema);
|
|
177
|
-
expect(result.stages.parse.passed).toBe(true);
|
|
178
|
-
});
|
|
179
|
-
it('should report parse errors from evaluator', async () => {
|
|
180
|
-
const evaluator = new MockEvaluator();
|
|
181
|
-
const pipeline = new ValidationPipeline(evaluator);
|
|
182
|
-
const result = await pipeline.validate('#invalid expression!', schema);
|
|
183
|
-
expect(result.stages.parse.passed).toBe(false);
|
|
184
|
-
expect(result.stages.parse.errors.length).toBeGreaterThan(0);
|
|
185
|
-
});
|
|
186
|
-
it('should set evaluator after construction', async () => {
|
|
187
|
-
const pipeline = new ValidationPipeline();
|
|
188
|
-
pipeline.setEvaluator(new MockEvaluator(['#order.amount > 1000']));
|
|
189
|
-
const result = await pipeline.validate('#order.amount > 1000', schema);
|
|
190
|
-
expect(result.stages.parse.passed).toBe(true);
|
|
191
|
-
});
|
|
192
|
-
});
|
|
193
|
-
// ===== Edge Cases & Integration =====
|
|
194
|
-
describe('edge cases', () => {
|
|
195
|
-
it('should fail expression that is whitespace only after trim', async () => {
|
|
196
|
-
const result = await pipeline.validate(' ', schema);
|
|
197
|
-
expect(result.stages.parse.passed).toBe(false);
|
|
198
|
-
expect(result.errors.some(e => e.code === 'PARSE-EMPTY')).toBe(true);
|
|
199
|
-
});
|
|
200
|
-
it('should detect unbalanced curly braces', async () => {
|
|
201
|
-
const result = await pipeline.validate('#order.amount > 100}', schema);
|
|
202
|
-
expect(result.stages.parse.passed).toBe(false);
|
|
203
|
-
expect(result.errors.some(e => e.code === 'PARSE-UNBALANCED_PARENS')).toBe(true);
|
|
204
|
-
});
|
|
205
|
-
it('should handle instanceof with unknown type in ContextSchema', async () => {
|
|
206
|
-
// T() type validation is not part of the context check, so it should pass
|
|
207
|
-
const result = await pipeline.validate('#order instanceof T(com.example.Unknown)', schema);
|
|
208
|
-
expect(result.stages.parse.passed).toBe(true);
|
|
209
|
-
});
|
|
210
|
-
it('should recognize declared function reference in expression', async () => {
|
|
211
|
-
const schemaWithFunc = {
|
|
212
|
-
...schema,
|
|
213
|
-
functions: {
|
|
214
|
-
calculateDiscount: {
|
|
215
|
-
returnType: 'number',
|
|
216
|
-
params: [{ name: 'price', type: 'number' }],
|
|
217
|
-
},
|
|
218
|
-
},
|
|
219
|
-
};
|
|
220
|
-
const result = await pipeline.validate('#calculateDiscount(100)', schemaWithFunc);
|
|
221
|
-
// The context check recognizes #calculateDiscount, which is in functions
|
|
222
|
-
expect(result.stages.context.passed).toBe(true);
|
|
223
|
-
});
|
|
224
|
-
it('should pass all four stages simultaneously', async () => {
|
|
225
|
-
const result = await pipeline.validate("#order.amount > 100 and #order.status == 'active'", schema);
|
|
226
|
-
expect(result.stages.parse.passed).toBe(true);
|
|
227
|
-
expect(result.stages.type.passed).toBe(true);
|
|
228
|
-
expect(result.stages.semantic.passed).toBe(true);
|
|
229
|
-
expect(result.stages.context.passed).toBe(true);
|
|
230
|
-
expect(result.valid).toBe(true);
|
|
231
|
-
expect(result.errors).toHaveLength(0);
|
|
232
|
-
expect(result.warnings).toHaveLength(0);
|
|
233
|
-
});
|
|
234
|
-
it('should collect multiple warnings from different stages', async () => {
|
|
235
|
-
const result = await pipeline.validate("'hello' > 100 and #order.paid == #order.paid", schema);
|
|
236
|
-
// Type stage: string-number comparison
|
|
237
|
-
expect(result.stages.type.warnings.some(w => w.code === 'TYPE-STR_NUM_CMP')).toBe(true);
|
|
238
|
-
// Semantic stage: self-comparison
|
|
239
|
-
expect(result.stages.semantic.warnings.some(w => w.code === 'SEM-SELF_COMPARE')).toBe(true);
|
|
240
|
-
// Total warnings should be at least 2
|
|
241
|
-
expect(result.warnings.length).toBeGreaterThanOrEqual(2);
|
|
242
|
-
});
|
|
243
|
-
it('should handle evaluator that throws an error during parse', async () => {
|
|
244
|
-
class ThrowingEvaluator {
|
|
245
|
-
async parse(_expression) {
|
|
246
|
-
throw new Error('Parser engine failure');
|
|
247
|
-
}
|
|
248
|
-
getContextSchema() {
|
|
249
|
-
return null;
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
const evaluator = new ThrowingEvaluator();
|
|
253
|
-
const pipeline = new ValidationPipeline(evaluator);
|
|
254
|
-
const result = await pipeline.validate('#anything', createSchema());
|
|
255
|
-
expect(result.stages.parse.passed).toBe(false);
|
|
256
|
-
expect(result.stages.parse.errors.length).toBeGreaterThan(0);
|
|
257
|
-
expect(result.errors.some(e => e.code === 'PARSE-EXCEPTION')).toBe(true);
|
|
258
|
-
expect(result.errors.some(e => e.message.includes('Parser engine failure'))).toBe(true);
|
|
259
|
-
});
|
|
260
|
-
});
|
|
261
|
-
});
|
|
262
|
-
//# sourceMappingURL=validation-pipeline.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validation-pipeline.test.js","sourceRoot":"","sources":["../../src/__tests__/validation-pipeline.test.ts"],"names":[],"mappings":"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"}
|