@agentix-e/nl2spel 0.0.0 → 1.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 (130) hide show
  1. package/README.md +69 -39
  2. package/dist/__tests__/auto-fixer.test.d.ts +2 -0
  3. package/dist/__tests__/auto-fixer.test.d.ts.map +1 -0
  4. package/dist/__tests__/auto-fixer.test.js +285 -0
  5. package/dist/__tests__/auto-fixer.test.js.map +1 -0
  6. package/dist/__tests__/chinese-number-parser.test.d.ts +2 -0
  7. package/dist/__tests__/chinese-number-parser.test.d.ts.map +1 -0
  8. package/dist/__tests__/chinese-number-parser.test.js +106 -0
  9. package/dist/__tests__/chinese-number-parser.test.js.map +1 -0
  10. package/dist/__tests__/context-extractor.test.d.ts +2 -0
  11. package/dist/__tests__/context-extractor.test.d.ts.map +1 -0
  12. package/dist/__tests__/context-extractor.test.js +347 -0
  13. package/dist/__tests__/context-extractor.test.js.map +1 -0
  14. package/dist/__tests__/coverage-gaps.test.d.ts +2 -0
  15. package/dist/__tests__/coverage-gaps.test.d.ts.map +1 -0
  16. package/dist/__tests__/coverage-gaps.test.js +578 -0
  17. package/dist/__tests__/coverage-gaps.test.js.map +1 -0
  18. package/dist/__tests__/intent-classifier.test.d.ts +2 -0
  19. package/dist/__tests__/intent-classifier.test.d.ts.map +1 -0
  20. package/dist/__tests__/intent-classifier.test.js +384 -0
  21. package/dist/__tests__/intent-classifier.test.js.map +1 -0
  22. package/dist/__tests__/nl2spel-engine.test.d.ts +2 -0
  23. package/dist/__tests__/nl2spel-engine.test.d.ts.map +1 -0
  24. package/dist/__tests__/nl2spel-engine.test.js +344 -0
  25. package/dist/__tests__/nl2spel-engine.test.js.map +1 -0
  26. package/dist/__tests__/pattern-matcher.test.d.ts +2 -0
  27. package/dist/__tests__/pattern-matcher.test.d.ts.map +1 -0
  28. package/dist/__tests__/pattern-matcher.test.js +754 -0
  29. package/dist/__tests__/pattern-matcher.test.js.map +1 -0
  30. package/dist/__tests__/prompt-builder.test.d.ts +2 -0
  31. package/dist/__tests__/prompt-builder.test.d.ts.map +1 -0
  32. package/dist/__tests__/prompt-builder.test.js +99 -0
  33. package/dist/__tests__/prompt-builder.test.js.map +1 -0
  34. package/dist/__tests__/provider-registry.test.d.ts +2 -0
  35. package/dist/__tests__/provider-registry.test.d.ts.map +1 -0
  36. package/dist/__tests__/provider-registry.test.js +240 -0
  37. package/dist/__tests__/provider-registry.test.js.map +1 -0
  38. package/dist/__tests__/schema-formatter.test.d.ts +2 -0
  39. package/dist/__tests__/schema-formatter.test.d.ts.map +1 -0
  40. package/dist/__tests__/schema-formatter.test.js +298 -0
  41. package/dist/__tests__/schema-formatter.test.js.map +1 -0
  42. package/dist/__tests__/self-correction-loop.test.d.ts +2 -0
  43. package/dist/__tests__/self-correction-loop.test.d.ts.map +1 -0
  44. package/dist/__tests__/self-correction-loop.test.js +253 -0
  45. package/dist/__tests__/self-correction-loop.test.js.map +1 -0
  46. package/dist/__tests__/strategy-router.test.d.ts +2 -0
  47. package/dist/__tests__/strategy-router.test.d.ts.map +1 -0
  48. package/dist/__tests__/strategy-router.test.js +493 -0
  49. package/dist/__tests__/strategy-router.test.js.map +1 -0
  50. package/dist/__tests__/template-engine.test.d.ts +2 -0
  51. package/dist/__tests__/template-engine.test.d.ts.map +1 -0
  52. package/dist/__tests__/template-engine.test.js +367 -0
  53. package/dist/__tests__/template-engine.test.js.map +1 -0
  54. package/dist/__tests__/validation-pipeline.test.d.ts +2 -0
  55. package/dist/__tests__/validation-pipeline.test.d.ts.map +1 -0
  56. package/dist/__tests__/validation-pipeline.test.js +262 -0
  57. package/dist/__tests__/validation-pipeline.test.js.map +1 -0
  58. package/dist/context/context-extractor.d.ts +82 -0
  59. package/dist/context/context-extractor.d.ts.map +1 -0
  60. package/dist/context/context-extractor.js +166 -0
  61. package/dist/context/context-extractor.js.map +1 -0
  62. package/dist/context/schema-formatter.d.ts +20 -0
  63. package/dist/context/schema-formatter.d.ts.map +1 -0
  64. package/dist/context/schema-formatter.js +104 -0
  65. package/dist/context/schema-formatter.js.map +1 -0
  66. package/dist/engine/nl2spel-engine.d.ts +145 -0
  67. package/dist/engine/nl2spel-engine.d.ts.map +1 -0
  68. package/dist/engine/nl2spel-engine.js +132 -0
  69. package/dist/engine/nl2spel-engine.js.map +1 -0
  70. package/dist/index.d.ts +28 -0
  71. package/dist/index.d.ts.map +1 -0
  72. package/dist/index.js +24 -0
  73. package/dist/index.js.map +1 -0
  74. package/dist/pattern/builtin-patterns.d.ts +12 -0
  75. package/dist/pattern/builtin-patterns.d.ts.map +1 -0
  76. package/dist/pattern/builtin-patterns.js +812 -0
  77. package/dist/pattern/builtin-patterns.js.map +1 -0
  78. package/dist/pattern/pattern-definition.d.ts +49 -0
  79. package/dist/pattern/pattern-definition.d.ts.map +1 -0
  80. package/dist/pattern/pattern-definition.js +2 -0
  81. package/dist/pattern/pattern-definition.js.map +1 -0
  82. package/dist/pattern/pattern-matcher.d.ts +55 -0
  83. package/dist/pattern/pattern-matcher.d.ts.map +1 -0
  84. package/dist/pattern/pattern-matcher.js +216 -0
  85. package/dist/pattern/pattern-matcher.js.map +1 -0
  86. package/dist/provider/llm-provider.d.ts +146 -0
  87. package/dist/provider/llm-provider.d.ts.map +1 -0
  88. package/dist/provider/llm-provider.js +2 -0
  89. package/dist/provider/llm-provider.js.map +1 -0
  90. package/dist/provider/provider-registry.d.ts +28 -0
  91. package/dist/provider/provider-registry.d.ts.map +1 -0
  92. package/dist/provider/provider-registry.js +65 -0
  93. package/dist/provider/provider-registry.js.map +1 -0
  94. package/dist/strategy/strategy-router.d.ts +79 -0
  95. package/dist/strategy/strategy-router.d.ts.map +1 -0
  96. package/dist/strategy/strategy-router.js +182 -0
  97. package/dist/strategy/strategy-router.js.map +1 -0
  98. package/dist/template/intent-classifier.d.ts +56 -0
  99. package/dist/template/intent-classifier.d.ts.map +1 -0
  100. package/dist/template/intent-classifier.js +251 -0
  101. package/dist/template/intent-classifier.js.map +1 -0
  102. package/dist/template/nl-intent.d.ts +38 -0
  103. package/dist/template/nl-intent.d.ts.map +1 -0
  104. package/dist/template/nl-intent.js +39 -0
  105. package/dist/template/nl-intent.js.map +1 -0
  106. package/dist/template/prompts/prompt-builder.d.ts +20 -0
  107. package/dist/template/prompts/prompt-builder.d.ts.map +1 -0
  108. package/dist/template/prompts/prompt-builder.js +243 -0
  109. package/dist/template/prompts/prompt-builder.js.map +1 -0
  110. package/dist/template/template-engine.d.ts +27 -0
  111. package/dist/template/template-engine.d.ts.map +1 -0
  112. package/dist/template/template-engine.js +378 -0
  113. package/dist/template/template-engine.js.map +1 -0
  114. package/dist/utils/chinese-number-parser.d.ts +30 -0
  115. package/dist/utils/chinese-number-parser.d.ts.map +1 -0
  116. package/dist/utils/chinese-number-parser.js +92 -0
  117. package/dist/utils/chinese-number-parser.js.map +1 -0
  118. package/dist/validation/auto-fixer.d.ts +14 -0
  119. package/dist/validation/auto-fixer.d.ts.map +1 -0
  120. package/dist/validation/auto-fixer.js +111 -0
  121. package/dist/validation/auto-fixer.js.map +1 -0
  122. package/dist/validation/self-correction-loop.d.ts +46 -0
  123. package/dist/validation/self-correction-loop.d.ts.map +1 -0
  124. package/dist/validation/self-correction-loop.js +141 -0
  125. package/dist/validation/self-correction-loop.js.map +1 -0
  126. package/dist/validation/validation-pipeline.d.ts +81 -0
  127. package/dist/validation/validation-pipeline.d.ts.map +1 -0
  128. package/dist/validation/validation-pipeline.js +306 -0
  129. package/dist/validation/validation-pipeline.js.map +1 -0
  130. package/package.json +45 -7
@@ -0,0 +1,378 @@
1
+ import { NLIntent } from './nl-intent.js';
2
+ /**
3
+ * SpEL template library — each Intent maps to a set of templates.
4
+ */
5
+ const TEMPLATE_LIBRARY = {
6
+ [NLIntent.COMPARISON]: [
7
+ {
8
+ name: 'COMPARISON-SIMPLE',
9
+ template: '#{root}.{field} {operator} {value}',
10
+ conditions: { hasComparison: true, entityCount: { min: 1 } },
11
+ confidence: 0.9,
12
+ },
13
+ {
14
+ name: 'COMPARISON-DUAL',
15
+ template: '(#{root}.{field1} {operator1} {value1}) {logic} (#{root}.{field2} {operator2} {value2})',
16
+ conditions: { hasComparison: true, hasLogical: true, entityCount: { min: 2 } },
17
+ confidence: 0.8,
18
+ },
19
+ ],
20
+ [NLIntent.NULL_CHECK]: [
21
+ {
22
+ name: 'NULL-IS_NULL',
23
+ template: '#{root}.{field} == null',
24
+ conditions: { hasNull: true },
25
+ confidence: 0.95,
26
+ },
27
+ {
28
+ name: 'NULL-IS_NOT_NULL',
29
+ template: '#{root}.{field} != null',
30
+ conditions: { hasNull: true },
31
+ confidence: 0.95,
32
+ },
33
+ ],
34
+ [NLIntent.PERMISSION_CHECK]: [
35
+ {
36
+ name: 'PERM-HAS_ROLE',
37
+ template: "hasRole('{role}')",
38
+ conditions: {},
39
+ confidence: 0.9,
40
+ },
41
+ {
42
+ name: 'PERM-HAS_PERMISSION',
43
+ template: "hasPermission('{permission}')",
44
+ conditions: {},
45
+ confidence: 0.9,
46
+ },
47
+ ],
48
+ [NLIntent.LOGICAL]: [
49
+ {
50
+ name: 'LOGICAL-AND',
51
+ template: '({left}) and ({right})',
52
+ conditions: { hasLogical: true },
53
+ confidence: 0.75,
54
+ },
55
+ {
56
+ name: 'LOGICAL-OR',
57
+ template: '({left}) or ({right})',
58
+ conditions: { hasLogical: true },
59
+ confidence: 0.75,
60
+ },
61
+ {
62
+ name: 'LOGICAL-NOT',
63
+ template: '!({expr})',
64
+ conditions: { hasLogical: true },
65
+ confidence: 0.85,
66
+ },
67
+ ],
68
+ [NLIntent.STRING_MATCH]: [
69
+ {
70
+ name: 'STR-CONTAINS',
71
+ template: "#{root}.{field}.contains('{substring}')",
72
+ conditions: { hasString: true },
73
+ confidence: 0.9,
74
+ },
75
+ {
76
+ name: 'STR-STARTS_WITH',
77
+ template: "#{root}.{field}.startsWith('{prefix}')",
78
+ conditions: { hasString: true },
79
+ confidence: 0.9,
80
+ },
81
+ {
82
+ name: 'STR-ENDS_WITH',
83
+ template: "#{root}.{field}.endsWith('{suffix}')",
84
+ conditions: { hasString: true },
85
+ confidence: 0.9,
86
+ },
87
+ {
88
+ name: 'STR-MATCHES',
89
+ template: "#{root}.{field} matches '{pattern}'",
90
+ conditions: { hasString: true },
91
+ confidence: 0.8,
92
+ },
93
+ ],
94
+ [NLIntent.COLLECTION]: [
95
+ {
96
+ name: 'COLL-IS_EMPTY',
97
+ template: '#{root}.{list}.isEmpty()',
98
+ conditions: { hasCollection: true },
99
+ confidence: 0.95,
100
+ },
101
+ {
102
+ name: 'COLL-IS_NOT_EMPTY',
103
+ template: '!#{root}.{list}.isEmpty()',
104
+ conditions: { hasCollection: true },
105
+ confidence: 0.9,
106
+ },
107
+ {
108
+ name: 'COLL-SIZE',
109
+ template: '#{root}.{list}.size() {operator} {value}',
110
+ conditions: { hasCollection: true, hasComparison: true },
111
+ confidence: 0.85,
112
+ },
113
+ {
114
+ name: 'COLL-CONTAINS',
115
+ template: "#{root}.{list}.contains('{element}')",
116
+ conditions: { hasCollection: true },
117
+ confidence: 0.9,
118
+ },
119
+ ],
120
+ [NLIntent.RANGE]: [
121
+ {
122
+ name: 'RANGE-BETWEEN',
123
+ template: '#{root}.{field} between {{{min}, {max}}}',
124
+ conditions: { entityCount: { min: 1 } },
125
+ confidence: 0.9,
126
+ },
127
+ ],
128
+ [NLIntent.SELECTION]: [
129
+ {
130
+ name: 'SELECT-ALL',
131
+ template: '#{root}.{list}.?[#{this}.{conditionField} {conditionOp} {conditionValue}]',
132
+ conditions: {},
133
+ confidence: 0.75,
134
+ },
135
+ {
136
+ name: 'SELECT-FIRST',
137
+ template: '#{root}.{list}.^[#{this}.{conditionField} {conditionOp} {conditionValue}]',
138
+ conditions: {},
139
+ confidence: 0.75,
140
+ },
141
+ ],
142
+ [NLIntent.PROJECTION]: [
143
+ {
144
+ name: 'PROJ-FIELD',
145
+ template: '#{root}.{list}.![#{this}.{field}]',
146
+ conditions: {},
147
+ confidence: 0.75,
148
+ },
149
+ ],
150
+ [NLIntent.TYPE_CHECK]: [
151
+ {
152
+ name: 'TYPE-INSTANCEOF',
153
+ template: '#{root}.{field} instanceof T({typeName})',
154
+ conditions: {},
155
+ confidence: 0.85,
156
+ },
157
+ ],
158
+ [NLIntent.BOOLEAN]: [
159
+ {
160
+ name: 'BOOL-IS_TRUE',
161
+ template: '#{root}.{field} == true',
162
+ conditions: {},
163
+ confidence: 0.9,
164
+ },
165
+ {
166
+ name: 'BOOL-IS_FALSE',
167
+ template: '#{root}.{field} == false',
168
+ conditions: {},
169
+ confidence: 0.9,
170
+ },
171
+ {
172
+ name: 'BOOL-FIELD',
173
+ template: '#{root}.{field}',
174
+ conditions: {},
175
+ confidence: 0.85,
176
+ },
177
+ ],
178
+ [NLIntent.DATE]: [
179
+ {
180
+ name: 'DATE-AFTER',
181
+ template: "#{root}.{field}.after(T(java.util.Date).valueOf('{date}'))",
182
+ conditions: {},
183
+ confidence: 0.85,
184
+ },
185
+ {
186
+ name: 'DATE-BEFORE',
187
+ template: "#{root}.{field}.before(T(java.util.Date).valueOf('{date}'))",
188
+ conditions: {},
189
+ confidence: 0.85,
190
+ },
191
+ ],
192
+ [NLIntent.ELVIS]: [
193
+ {
194
+ name: 'ELVIS-DEFAULT',
195
+ template: "#{root}.{field} ?: '{defaultValue}'",
196
+ conditions: {},
197
+ confidence: 0.8,
198
+ },
199
+ ],
200
+ [NLIntent.ASSIGNMENT]: [
201
+ {
202
+ name: 'ASSIGN-SIMPLE',
203
+ template: '#{root}.{field} = {value}',
204
+ conditions: {},
205
+ confidence: 0.8,
206
+ },
207
+ ],
208
+ [NLIntent.ARITHMETIC]: [
209
+ {
210
+ name: 'ARITH-OP',
211
+ template: '#{root}.{field1} {operator} #{root}.{field2}',
212
+ conditions: {},
213
+ confidence: 0.75,
214
+ },
215
+ ],
216
+ };
217
+ export class TemplateEngine {
218
+ contextSchema;
219
+ constructor(contextSchema) {
220
+ this.contextSchema = contextSchema;
221
+ }
222
+ setContext(schema) {
223
+ this.contextSchema = schema;
224
+ }
225
+ /**
226
+ * Generate a SpEL expression based on intent classification results
227
+ */
228
+ generate(input, intentResult) {
229
+ const templates = TEMPLATE_LIBRARY[intentResult.primaryIntent];
230
+ if (!templates || templates.length === 0)
231
+ return null;
232
+ const bestTemplate = this.selectBestTemplate(templates, intentResult, input);
233
+ if (!bestTemplate)
234
+ return null;
235
+ const { expression, unfilledSlots } = this.fillTemplate(bestTemplate.template, input, intentResult);
236
+ return {
237
+ expression,
238
+ intent: intentResult.primaryIntent,
239
+ templateName: bestTemplate.name,
240
+ confidence: bestTemplate.confidence * (intentResult.intents[0]?.confidence ?? 0.5),
241
+ unfilledSlots,
242
+ };
243
+ }
244
+ selectBestTemplate(templates, intentResult, input) {
245
+ let bestScore = -1;
246
+ let bestTemplate = null;
247
+ // Input-specific heuristics
248
+ const hasEmptyKeyword = /为空|empty|null/i.test(input);
249
+ const hasNotEmptyKeyword = /不为空|not empty|not null/i.test(input);
250
+ for (const template of templates) {
251
+ const conditions = template.conditions;
252
+ let score = 0;
253
+ if (conditions.hasComparison && intentResult.operators.length > 0)
254
+ score += 1;
255
+ if (conditions.hasLogical && intentResult.logicalConnectors.length > 0)
256
+ score += 1;
257
+ if (conditions.hasCollection)
258
+ score += 0.5;
259
+ if (conditions.hasNull)
260
+ score += 0.5;
261
+ if (conditions.hasString)
262
+ score += 1;
263
+ // Boost isEmpty template when input has empty keywords
264
+ if (template.name.includes('IS_EMPTY') && hasEmptyKeyword)
265
+ score += 2;
266
+ if (template.name.includes('IS_NOT_EMPTY') && hasNotEmptyKeyword)
267
+ score += 2;
268
+ if (conditions.entityCount) {
269
+ if (conditions.entityCount.min &&
270
+ intentResult.entities.length < conditions.entityCount.min) {
271
+ continue;
272
+ }
273
+ }
274
+ if (score > bestScore) {
275
+ bestScore = score;
276
+ bestTemplate = template;
277
+ }
278
+ }
279
+ return bestTemplate;
280
+ }
281
+ fillTemplate(template, input, intentResult) {
282
+ let expression = template;
283
+ const unfilledSlots = [];
284
+ // Extract root name from contextSchema
285
+ let rootName = 'order';
286
+ let fieldName = 'field';
287
+ if (this.contextSchema?.root) {
288
+ rootName = this.contextSchema.root.name;
289
+ const fields = Object.keys(this.contextSchema.root.fields ?? {});
290
+ for (const f of fields) {
291
+ if (input.includes(f)) {
292
+ fieldName = f;
293
+ break;
294
+ }
295
+ }
296
+ }
297
+ else {
298
+ // Heuristic root name extraction
299
+ const rootMap = {
300
+ 订单: 'order',
301
+ order: 'order',
302
+ 用户: 'user',
303
+ user: 'user',
304
+ 文件: 'file',
305
+ file: 'file',
306
+ 账号: 'account',
307
+ account: 'account',
308
+ 商品: 'item',
309
+ product: 'item',
310
+ };
311
+ for (const [key, val] of Object.entries(rootMap)) {
312
+ if (input.includes(key)) {
313
+ rootName = val;
314
+ break;
315
+ }
316
+ }
317
+ }
318
+ // Fill root
319
+ expression = expression.replace(/\{root\}/g, rootName);
320
+ expression = expression.replace(/\{field\}/g, fieldName);
321
+ // Extract field entities for dual-field templates
322
+ const fieldEntities = intentResult.entities.filter(e => e.type === 'field');
323
+ const field1Name = fieldEntities[0]?.text ?? fieldName;
324
+ const field2Name = fieldEntities[1]?.text ?? fieldName;
325
+ expression = expression.replace(/\{field1\}/g, field1Name);
326
+ expression = expression.replace(/\{field2\}/g, field2Name);
327
+ expression = expression.replace(/\{conditionField\}/g, 'condition');
328
+ expression = expression.replace(/\{list\}/g, 'items');
329
+ // Extract numeric entities
330
+ const numberEntities = intentResult.entities.filter(e => e.type === 'value' && !isNaN(Number(e.text)));
331
+ const stringEntities = intentResult.entities.filter(e => e.type === 'value' && isNaN(Number(e.text)));
332
+ // Fill numeric values
333
+ if (numberEntities.length > 0) {
334
+ expression = expression.replace(/\{value\}/, numberEntities[0].text);
335
+ expression = expression.replace(/\{value1\}/, numberEntities[0].text);
336
+ expression = expression.replace(/\{value2\}/, (numberEntities[1] ?? numberEntities[0]).text);
337
+ expression = expression.replace(/\{min\}/, numberEntities[0].text);
338
+ expression = expression.replace(/\{max\}/, (numberEntities[1] ?? numberEntities[0]).text);
339
+ expression = expression.replace(/\{conditionValue\}/, numberEntities[0].text);
340
+ }
341
+ // Fill string values
342
+ if (stringEntities.length > 0) {
343
+ expression = expression.replace(/\{substring\}/, stringEntities[0].text);
344
+ expression = expression.replace(/\{element\}/, stringEntities[0].text);
345
+ expression = expression.replace(/\{role\}/, stringEntities[0].text);
346
+ expression = expression.replace(/\{permission\}/, stringEntities[0].text);
347
+ expression = expression.replace(/\{prefix\}/, stringEntities[0].text);
348
+ expression = expression.replace(/\{suffix\}/, stringEntities[0].text);
349
+ expression = expression.replace(/\{pattern\}/, stringEntities[0].text);
350
+ expression = expression.replace(/\{defaultValue\}/, stringEntities[0].text);
351
+ expression = expression.replace(/\{date\}/, stringEntities[0].text);
352
+ expression = expression.replace(/\{typeName\}/, stringEntities[0].text);
353
+ }
354
+ // Operator filling
355
+ if (intentResult.operators.length > 0) {
356
+ expression = expression.replace(/\{operator\}/g, intentResult.operators[0]);
357
+ expression = expression.replace(/\{operator1\}/g, intentResult.operators[0]);
358
+ expression = expression.replace(/\{operator2\}/g, intentResult.operators[1] ?? intentResult.operators[0]);
359
+ expression = expression.replace(/\{conditionOp\}/g, intentResult.operators[0]);
360
+ }
361
+ // Logical connectors
362
+ if (intentResult.logicalConnectors.length > 0) {
363
+ expression = expression.replace(/\{logic\}/g, intentResult.logicalConnectors[0]);
364
+ }
365
+ else {
366
+ expression = expression.replace(/\{logic\}/g, 'and');
367
+ }
368
+ // Detect unfilled slots
369
+ const unfilledMatches = expression.matchAll(/\{(\w+)\}/g);
370
+ for (const m of unfilledMatches) {
371
+ const slot = m[1];
372
+ unfilledSlots.push(slot);
373
+ expression = expression.replace(new RegExp(`\\{${slot}\\}`, 'g'), `\${${slot}}`);
374
+ }
375
+ return { expression, unfilledSlots };
376
+ }
377
+ }
378
+ //# sourceMappingURL=template-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-engine.js","sourceRoot":"","sources":["../../src/template/template-engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Chinese number parser — converts Chinese number strings to Arabic numerals.
3
+ *
4
+ * Supports:
5
+ * - Basic digits: 零一二三四五六七八九十百千万亿
6
+ * - Leading "十": "十五" → 15
7
+ * - Thousands/hundred-millions grouping: "一万二千三百四十五" → 12345
8
+ * - Zero padding: "一千零一" → 1001
9
+ */
10
+ export declare class ChineseNumberParser {
11
+ private static readonly DIGITS;
12
+ private static readonly UNITS;
13
+ private static readonly CHINESE_NUM_PATTERN;
14
+ /**
15
+ * Check if a string is pure Chinese numbers
16
+ */
17
+ static isChineseNumber(text: string): boolean;
18
+ /**
19
+ * Parse Chinese numbers → Arabic numerals
20
+ *
21
+ * @param text Chinese number string
22
+ * @returns Parsed number, returns NaN on failure
23
+ */
24
+ static parse(text: string): number;
25
+ /**
26
+ * Safe parse: returns null if parsing fails
27
+ */
28
+ static parseSafe(text: string): number | null;
29
+ }
30
+ //# sourceMappingURL=chinese-number-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chinese-number-parser.d.ts","sourceRoot":"","sources":["../../src/utils/chinese-number-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAY5B;IAEF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAM3B;IAEF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAA2B;IAEtE;;OAEG;WACW,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIpD;;;;;OAKG;WACW,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IA2CzC;;OAEG;WACW,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;CAIrD"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Chinese number parser — converts Chinese number strings to Arabic numerals.
3
+ *
4
+ * Supports:
5
+ * - Basic digits: 零一二三四五六七八九十百千万亿
6
+ * - Leading "十": "十五" → 15
7
+ * - Thousands/hundred-millions grouping: "一万二千三百四十五" → 12345
8
+ * - Zero padding: "一千零一" → 1001
9
+ */
10
+ export class ChineseNumberParser {
11
+ static DIGITS = {
12
+ 零: 0,
13
+ 一: 1,
14
+ 二: 2,
15
+ 三: 3,
16
+ 四: 4,
17
+ 五: 5,
18
+ 六: 6,
19
+ 七: 7,
20
+ 八: 8,
21
+ 九: 9,
22
+ 两: 2,
23
+ };
24
+ static UNITS = {
25
+ 十: 10,
26
+ 百: 100,
27
+ 千: 1000,
28
+ 万: 10000,
29
+ 亿: 100000000,
30
+ };
31
+ static CHINESE_NUM_PATTERN = /^[零一二三四五六七八九十百千万亿两]+$/;
32
+ /**
33
+ * Check if a string is pure Chinese numbers
34
+ */
35
+ static isChineseNumber(text) {
36
+ return this.CHINESE_NUM_PATTERN.test(text);
37
+ }
38
+ /**
39
+ * Parse Chinese numbers → Arabic numerals
40
+ *
41
+ * @param text Chinese number string
42
+ * @returns Parsed number, returns NaN on failure
43
+ */
44
+ static parse(text) {
45
+ if (!this.isChineseNumber(text)) {
46
+ return NaN;
47
+ }
48
+ // Handle leading "十" → "一十"
49
+ let s = text;
50
+ if (s.startsWith('十')) {
51
+ s = '一' + s;
52
+ }
53
+ let result = 0; // Accumulated result for hundreds-millions and above
54
+ let section = 0; // Ten-thousands segment
55
+ let current = 0; // Current digit (thousands and below)
56
+ for (const ch of s) {
57
+ const digit = this.DIGITS[ch];
58
+ if (digit !== undefined) {
59
+ // Digit character
60
+ current = digit;
61
+ }
62
+ else {
63
+ const unit = this.UNITS[ch];
64
+ if (unit === undefined)
65
+ continue;
66
+ if (unit >= 10000) {
67
+ // Hundreds-millions/ten-thousands segment: section has accumulated values below
68
+ // plus current digit, multiply by unit
69
+ // e.g. "十万" → section=10, current=0 → result += 10 * 10000 = 100000
70
+ // e.g. "十二万" → section=10, current=2 → result += 12 * 10000 = 120000
71
+ result += (section + current || 1) * unit;
72
+ section = 0;
73
+ current = 0;
74
+ }
75
+ else {
76
+ // Tens/hundreds/thousands
77
+ section += (current || 1) * unit;
78
+ current = 0;
79
+ }
80
+ }
81
+ }
82
+ return result + section + current;
83
+ }
84
+ /**
85
+ * Safe parse: returns null if parsing fails
86
+ */
87
+ static parseSafe(text) {
88
+ const value = this.parse(text);
89
+ return Number.isNaN(value) ? null : value;
90
+ }
91
+ }
92
+ //# sourceMappingURL=chinese-number-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chinese-number-parser.js","sourceRoot":"","sources":["../../src/utils/chinese-number-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,OAAO,mBAAmB;IACtB,MAAM,CAAU,MAAM,GAA2B;QACvD,CAAC,EAAE,CAAC;QACJ,CAAC,EAAE,CAAC;QACJ,CAAC,EAAE,CAAC;QACJ,CAAC,EAAE,CAAC;QACJ,CAAC,EAAE,CAAC;QACJ,CAAC,EAAE,CAAC;QACJ,CAAC,EAAE,CAAC;QACJ,CAAC,EAAE,CAAC;QACJ,CAAC,EAAE,CAAC;QACJ,CAAC,EAAE,CAAC;QACJ,CAAC,EAAE,CAAC;KACL,CAAC;IAEM,MAAM,CAAU,KAAK,GAA2B;QACtD,CAAC,EAAE,EAAE;QACL,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,IAAI;QACP,CAAC,EAAE,KAAK;QACR,CAAC,EAAE,SAAS;KACb,CAAC;IAEM,MAAM,CAAU,mBAAmB,GAAG,uBAAuB,CAAC;IAEtE;;OAEG;IACI,MAAM,CAAC,eAAe,CAAC,IAAY;QACxC,OAAO,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7C,CAAC;IAED;;;;;OAKG;IACI,MAAM,CAAC,KAAK,CAAC,IAAY;QAC9B,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;YAChC,OAAO,GAAG,CAAC;QACb,CAAC;QAED,4BAA4B;QAC5B,IAAI,CAAC,GAAG,IAAI,CAAC;QACb,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACtB,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;QACd,CAAC;QAED,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,qDAAqD;QACrE,IAAI,OAAO,GAAG,CAAC,CAAC,CAAC,wBAAwB;QACzC,IAAI,OAAO,GAAG,CAAC,CAAC,CAAC,sCAAsC;QAEvD,KAAK,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC;YACnB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC9B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,kBAAkB;gBAClB,OAAO,GAAG,KAAK,CAAC;YAClB,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBAC5B,IAAI,IAAI,KAAK,SAAS;oBAAE,SAAS;gBAEjC,IAAI,IAAI,IAAI,KAAK,EAAE,CAAC;oBAClB,gFAAgF;oBAChF,uCAAuC;oBACvC,oEAAoE;oBACpE,qEAAqE;oBACrE,MAAM,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;oBAC1C,OAAO,GAAG,CAAC,CAAC;oBACZ,OAAO,GAAG,CAAC,CAAC;gBACd,CAAC;qBAAM,CAAC;oBACN,0BAA0B;oBAC1B,OAAO,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;oBACjC,OAAO,GAAG,CAAC,CAAC;gBACd,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;IACpC,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,SAAS,CAAC,IAAY;QAClC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC/B,OAAO,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;IAC5C,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * AutoFixer — automatically fixes common SpEL syntax errors from LLM output.
3
+ */
4
+ export declare class AutoFixer {
5
+ fix(expression: string): AutoFixResult;
6
+ private fixAllBrackets;
7
+ }
8
+ export interface AutoFixResult {
9
+ expression: string;
10
+ wasFixed: boolean;
11
+ fixed: string;
12
+ changes: string[];
13
+ }
14
+ //# sourceMappingURL=auto-fixer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-fixer.d.ts","sourceRoot":"","sources":["../../src/validation/auto-fixer.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,qBAAa,SAAS;IACb,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,aAAa;IAgG7C,OAAO,CAAC,cAAc;CAyBvB;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * AutoFixer — automatically fixes common SpEL syntax errors from LLM output.
3
+ */
4
+ export class AutoFixer {
5
+ fix(expression) {
6
+ let fixed = expression;
7
+ const changes = [];
8
+ // Order matters: check specific patterns before generic replacements
9
+ // 1. undefined/null checks (BEFORE === → ==)
10
+ if (fixed.includes('=== undefined')) {
11
+ fixed = fixed.replace(/=== undefined/g, '== null');
12
+ changes.push('Replaced === undefined with == null');
13
+ }
14
+ if (fixed.includes('!== undefined')) {
15
+ fixed = fixed.replace(/!== undefined/g, '!= null');
16
+ changes.push('Replaced !== undefined with != null');
17
+ }
18
+ // 2. !== → != (BEFORE === → == to avoid double-processing)
19
+ if (fixed.includes('!==')) {
20
+ // `includes` check guarantees match is non-null
21
+ const count = fixed.match(/!==/g).length;
22
+ fixed = fixed.replace(/!==/g, '!=');
23
+ changes.push(`Replaced ${count}x !== with !=`);
24
+ }
25
+ // 3. === → ==
26
+ if (fixed.includes('===')) {
27
+ const count = fixed.match(/===/g).length;
28
+ fixed = fixed.replace(/===/g, '==');
29
+ changes.push(`Replaced ${count}x === with ==`);
30
+ }
31
+ // 4. && → and
32
+ if (fixed.includes('&&')) {
33
+ const count = fixed.match(/&&/g).length;
34
+ fixed = fixed.replace(/&&/g, 'and');
35
+ changes.push(`Replaced ${count}x && with and`);
36
+ }
37
+ // 5. || → or
38
+ if (fixed.includes('||')) {
39
+ const count = fixed.match(/\|\|/g).length;
40
+ fixed = fixed.replace(/\|\|/g, 'or');
41
+ changes.push(`Replaced ${count}x || with or`);
42
+ }
43
+ // 6. Unmatched single quotes
44
+ const singleQuoteCount = (fixed.match(/'/g) ?? []).length;
45
+ if (singleQuoteCount % 2 !== 0) {
46
+ // If last char is not already a quote, append one
47
+ if (!fixed.endsWith("'")) {
48
+ fixed = fixed + "'";
49
+ changes.push('Added missing closing single quote');
50
+ }
51
+ }
52
+ // 7. Unmatched double quotes
53
+ const doubleQuoteCount = (fixed.match(/"/g) ?? []).length;
54
+ if (doubleQuoteCount % 2 !== 0) {
55
+ if (!fixed.endsWith('"')) {
56
+ fixed = fixed + '"';
57
+ changes.push('Added missing closing double quote');
58
+ }
59
+ }
60
+ // 8. Unbalanced parentheses (all bracket types)
61
+ const parenFix = this.fixAllBrackets(fixed);
62
+ if (parenFix !== fixed) {
63
+ changes.push('Fixed unbalanced brackets');
64
+ fixed = parenFix;
65
+ }
66
+ // 9. > == → >=
67
+ if (fixed.includes('> ==')) {
68
+ fixed = fixed.replace(/> ==/g, '>=');
69
+ changes.push('Replaced > == with >=');
70
+ }
71
+ if (fixed.includes('< ==')) {
72
+ fixed = fixed.replace(/< ==/g, '<=');
73
+ changes.push('Replaced < == with <=');
74
+ }
75
+ // 10. ? : → ?:
76
+ if (fixed.includes('? :')) {
77
+ fixed = fixed.replace(/\?\s*:\s*/g, ' ?: ');
78
+ changes.push('Fixed Elvis operator spacing');
79
+ }
80
+ const wasFixed = changes.length > 0;
81
+ return {
82
+ fixed: wasFixed ? fixed : expression,
83
+ wasFixed,
84
+ expression: wasFixed ? fixed : expression,
85
+ changes,
86
+ };
87
+ }
88
+ fixAllBrackets(expr) {
89
+ let result = expr;
90
+ // Fix parentheses: ( )
91
+ const openParen = (result.match(/\(/g) ?? []).length;
92
+ const closeParen = (result.match(/\)/g) ?? []).length;
93
+ if (openParen > closeParen) {
94
+ result += ')'.repeat(openParen - closeParen);
95
+ }
96
+ // Fix square brackets: [ ]
97
+ const openBracket = (result.match(/\[/g) ?? []).length;
98
+ const closeBracket = (result.match(/\]/g) ?? []).length;
99
+ if (openBracket > closeBracket) {
100
+ result += ']'.repeat(openBracket - closeBracket);
101
+ }
102
+ // Fix curly braces: { }
103
+ const openBrace = (result.match(/\{/g) ?? []).length;
104
+ const closeBrace = (result.match(/\}/g) ?? []).length;
105
+ if (openBrace > closeBrace) {
106
+ result += '}'.repeat(openBrace - closeBrace);
107
+ }
108
+ return result;
109
+ }
110
+ }
111
+ //# sourceMappingURL=auto-fixer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-fixer.js","sourceRoot":"","sources":["../../src/validation/auto-fixer.ts"],"names":[],"mappings":"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"}