@kernlang/review 2.0.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 (47) hide show
  1. package/LICENSE +661 -0
  2. package/dist/differ.d.ts +11 -0
  3. package/dist/differ.js +132 -0
  4. package/dist/differ.js.map +1 -0
  5. package/dist/external-tools.d.ts +32 -0
  6. package/dist/external-tools.js +173 -0
  7. package/dist/external-tools.js.map +1 -0
  8. package/dist/index.d.ts +33 -0
  9. package/dist/index.js +98 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/inferrer.d.ts +15 -0
  12. package/dist/inferrer.js +502 -0
  13. package/dist/inferrer.js.map +1 -0
  14. package/dist/llm-review.d.ts +24 -0
  15. package/dist/llm-review.js +197 -0
  16. package/dist/llm-review.js.map +1 -0
  17. package/dist/quality-rules.d.ts +12 -0
  18. package/dist/quality-rules.js +28 -0
  19. package/dist/quality-rules.js.map +1 -0
  20. package/dist/reporter.d.ts +15 -0
  21. package/dist/reporter.js +217 -0
  22. package/dist/reporter.js.map +1 -0
  23. package/dist/rules/base.d.ts +10 -0
  24. package/dist/rules/base.js +556 -0
  25. package/dist/rules/base.js.map +1 -0
  26. package/dist/rules/express.d.ts +9 -0
  27. package/dist/rules/express.js +107 -0
  28. package/dist/rules/express.js.map +1 -0
  29. package/dist/rules/index.d.ts +16 -0
  30. package/dist/rules/index.js +38 -0
  31. package/dist/rules/index.js.map +1 -0
  32. package/dist/rules/nextjs.d.ts +9 -0
  33. package/dist/rules/nextjs.js +128 -0
  34. package/dist/rules/nextjs.js.map +1 -0
  35. package/dist/rules/react.d.ts +9 -0
  36. package/dist/rules/react.js +252 -0
  37. package/dist/rules/react.js.map +1 -0
  38. package/dist/rules/vue.d.ts +9 -0
  39. package/dist/rules/vue.js +198 -0
  40. package/dist/rules/vue.js.map +1 -0
  41. package/dist/template-detector.d.ts +12 -0
  42. package/dist/template-detector.js +225 -0
  43. package/dist/template-detector.js.map +1 -0
  44. package/dist/types.d.ts +152 -0
  45. package/dist/types.js +17 -0
  46. package/dist/types.js.map +1 -0
  47. package/package.json +23 -0
@@ -0,0 +1,502 @@
1
+ /**
2
+ * TS → .kern Inferrer — scans TypeScript AST and infers KERN IR nodes.
3
+ *
4
+ * Phase 1 (deterministic): type, interface, fn, error, import, const
5
+ * Phase 2 (composite): machine, config, event, module
6
+ *
7
+ * v2: Adds stable nodeId, promptAlias, sourceSpans to InferResult.
8
+ */
9
+ import { Project, SyntaxKind, } from 'ts-morph';
10
+ import { countTokens } from '@kernlang/core';
11
+ // ── Create Project ───────────────────────────────────────────────────────
12
+ export function createProject() {
13
+ return new Project({
14
+ compilerOptions: { strict: true, target: 99 /* Latest */ },
15
+ useInMemoryFileSystem: false,
16
+ skipAddingFilesFromTsConfig: true,
17
+ });
18
+ }
19
+ export function createInMemoryProject() {
20
+ return new Project({
21
+ compilerOptions: { strict: true, target: 99 },
22
+ useInMemoryFileSystem: true,
23
+ skipAddingFilesFromTsConfig: true,
24
+ });
25
+ }
26
+ // ── Main Inference Function ──────────────────────────────────────────────
27
+ export function inferFromSource(source, filePath = 'input.ts') {
28
+ const project = createInMemoryProject();
29
+ const sourceFile = project.createSourceFile(filePath, source);
30
+ return inferFromSourceFile(sourceFile);
31
+ }
32
+ export function inferFromFile(filePath) {
33
+ const project = createProject();
34
+ const sourceFile = project.addSourceFileAtPath(filePath);
35
+ return inferFromSourceFile(sourceFile);
36
+ }
37
+ export function inferFromSourceFile(sourceFile) {
38
+ const results = [];
39
+ // Phase 1: Deterministic matchers
40
+ results.push(...inferTypes(sourceFile));
41
+ results.push(...inferInterfaces(sourceFile));
42
+ results.push(...inferFunctions(sourceFile));
43
+ results.push(...inferErrors(sourceFile));
44
+ results.push(...inferImports(sourceFile));
45
+ results.push(...inferConsts(sourceFile));
46
+ // Phase 2: Composite patterns
47
+ results.push(...inferMachines(sourceFile, results));
48
+ results.push(...inferConfigs(sourceFile, results));
49
+ results.push(...inferEvents(sourceFile, results));
50
+ // Sort by line number
51
+ results.sort((a, b) => a.startLine - b.startLine);
52
+ // Assign sequential prompt aliases after sorting (stable per file)
53
+ for (let i = 0; i < results.length; i++) {
54
+ results[i].promptAlias = `N${i + 1}`;
55
+ }
56
+ return results;
57
+ }
58
+ // ── Helpers ──────────────────────────────────────────────────────────────
59
+ function getSpan(sourceFile, startOffset, endOffset) {
60
+ const filePath = sourceFile.getFilePath() || 'input.ts';
61
+ const startPos = sourceFile.getLineAndColumnAtPos(startOffset);
62
+ const endPos = sourceFile.getLineAndColumnAtPos(endOffset);
63
+ return {
64
+ file: filePath,
65
+ startLine: startPos.line,
66
+ startCol: startPos.column,
67
+ endLine: endPos.line,
68
+ endCol: endPos.column,
69
+ };
70
+ }
71
+ function makeResult(node, sourceFile, startOffset, endOffset, startLine, endLine, summary, confidence, confidencePct, originalText) {
72
+ const filePath = sourceFile.getFilePath() || 'input.ts';
73
+ const name = node.props?.name || 'anon';
74
+ const nodeId = `${filePath}#${node.type}:${name}@${startOffset}`;
75
+ const kernRepr = serializeKernNode(node);
76
+ const kernTokens = countTokens(kernRepr);
77
+ const tsTokens = countTokens(originalText);
78
+ return {
79
+ node,
80
+ nodeId,
81
+ promptAlias: '', // assigned after sort in inferFromSourceFile
82
+ startLine,
83
+ endLine,
84
+ sourceSpans: [getSpan(sourceFile, startOffset, endOffset)],
85
+ summary,
86
+ confidence,
87
+ confidencePct,
88
+ kernTokens,
89
+ tsTokens,
90
+ };
91
+ }
92
+ function serializeKernNode(node) {
93
+ const parts = [node.type];
94
+ if (node.props) {
95
+ for (const [k, v] of Object.entries(node.props)) {
96
+ if (typeof v === 'string')
97
+ parts.push(`${k}=${v}`);
98
+ }
99
+ }
100
+ if (node.children) {
101
+ for (const child of node.children) {
102
+ parts.push(' ' + serializeKernNode(child));
103
+ }
104
+ }
105
+ return parts.join(' ');
106
+ }
107
+ // ── Phase 1: Type Aliases ────────────────────────────────────────────────
108
+ function inferTypes(sourceFile) {
109
+ const results = [];
110
+ for (const decl of sourceFile.getTypeAliases()) {
111
+ const name = decl.getName();
112
+ const typeNode = decl.getTypeNode();
113
+ if (!typeNode)
114
+ continue;
115
+ const text = typeNode.getText();
116
+ const startLine = decl.getStartLineNumber();
117
+ const endLine = decl.getEndLineNumber();
118
+ const originalText = decl.getText();
119
+ const startOffset = decl.getStart();
120
+ const endOffset = decl.getEnd();
121
+ // Union of string literals → type name=X values="a|b|c"
122
+ if (typeNode.getKind() === SyntaxKind.UnionType) {
123
+ const unionMembers = text.split('|').map(s => s.trim());
124
+ const allLiterals = unionMembers.every(m => m.startsWith("'") || m.startsWith('"'));
125
+ if (allLiterals) {
126
+ const values = unionMembers.map(m => m.replace(/['"]/g, '')).join('|');
127
+ const node = { type: 'type', props: { name, values } };
128
+ results.push(makeResult(node, sourceFile, startOffset, endOffset, startLine, endLine, `type ${name} = ${values.split('|').map(v => `'${v}'`).join(' | ')}`, 'high', 98, originalText));
129
+ }
130
+ else {
131
+ // Type alias union (non-literal)
132
+ const node = { type: 'type', props: { name, alias: text } };
133
+ results.push(makeResult(node, sourceFile, startOffset, endOffset, startLine, endLine, `type ${name} = ${text}`, 'high', 95, originalText));
134
+ }
135
+ }
136
+ else {
137
+ // Simple type alias
138
+ const node = { type: 'type', props: { name, alias: text } };
139
+ results.push(makeResult(node, sourceFile, startOffset, endOffset, startLine, endLine, `type ${name} = ${text}`, 'high', 95, originalText));
140
+ }
141
+ }
142
+ return results;
143
+ }
144
+ // ── Phase 1: Interfaces ──────────────────────────────────────────────────
145
+ function inferInterfaces(sourceFile) {
146
+ const results = [];
147
+ for (const decl of sourceFile.getInterfaces()) {
148
+ const name = decl.getName();
149
+ const startLine = decl.getStartLineNumber();
150
+ const endLine = decl.getEndLineNumber();
151
+ const originalText = decl.getText();
152
+ const startOffset = decl.getStart();
153
+ const endOffset = decl.getEnd();
154
+ const extendsClause = decl.getExtends().map(e => e.getText()).join(', ') || undefined;
155
+ const children = [];
156
+ for (const prop of decl.getProperties()) {
157
+ const fieldName = prop.getName();
158
+ const fieldType = prop.getType().getText(prop);
159
+ const optional = prop.hasQuestionToken();
160
+ children.push({
161
+ type: 'field',
162
+ props: {
163
+ name: fieldName,
164
+ type: fieldType,
165
+ ...(optional ? { optional: 'true' } : {}),
166
+ },
167
+ });
168
+ }
169
+ const node = {
170
+ type: 'interface',
171
+ props: {
172
+ name,
173
+ ...(extendsClause ? { extends: extendsClause } : {}),
174
+ },
175
+ children,
176
+ };
177
+ results.push(makeResult(node, sourceFile, startOffset, endOffset, startLine, endLine, `interface ${name} (${children.length} fields)`, 'high', 97, originalText));
178
+ }
179
+ return results;
180
+ }
181
+ // ── Phase 1: Functions ───────────────────────────────────────────────────
182
+ function inferFunctions(sourceFile) {
183
+ const inferResults = [];
184
+ for (const decl of sourceFile.getFunctions()) {
185
+ if (!decl.getName())
186
+ continue;
187
+ const name = decl.getName();
188
+ const startLine = decl.getStartLineNumber();
189
+ const endLine = decl.getEndLineNumber();
190
+ const originalText = decl.getText();
191
+ const startOffset = decl.getStart();
192
+ const endOffset = decl.getEnd();
193
+ const params = decl.getParameters()
194
+ .map(p => `${p.getName()}:${p.getType().getText(p)}`)
195
+ .join(',');
196
+ const returnType = decl.getReturnType().getText(decl);
197
+ const isAsync = decl.isAsync();
198
+ const isExported = decl.isExported();
199
+ const body = decl.getBody()?.getText() || '';
200
+ const node = {
201
+ type: 'fn',
202
+ props: {
203
+ name,
204
+ ...(params ? { params } : {}),
205
+ ...(returnType && returnType !== 'void' ? { returns: returnType } : {}),
206
+ ...(isAsync ? { async: 'true' } : {}),
207
+ ...(isExported ? {} : { export: 'false' }),
208
+ },
209
+ children: body ? [{ type: 'handler', props: { code: body.slice(1, -1).trim() } }] : [],
210
+ };
211
+ inferResults.push(makeResult(node, sourceFile, startOffset, endOffset, startLine, endLine, `fn ${name}(${params}) → ${returnType}`, 'high', 95, originalText));
212
+ }
213
+ return inferResults;
214
+ }
215
+ // ── Phase 1: Error Classes ───────────────────────────────────────────────
216
+ function inferErrors(sourceFile) {
217
+ const results = [];
218
+ for (const decl of sourceFile.getClasses()) {
219
+ const name = decl.getName();
220
+ if (!name)
221
+ continue;
222
+ // Check if extends Error (or any *Error class)
223
+ const extendsExpr = decl.getExtends();
224
+ if (!extendsExpr)
225
+ continue;
226
+ const baseClass = extendsExpr.getText();
227
+ if (!baseClass.includes('Error'))
228
+ continue;
229
+ const startLine = decl.getStartLineNumber();
230
+ const endLine = decl.getEndLineNumber();
231
+ const originalText = decl.getText();
232
+ const startOffset = decl.getStart();
233
+ const endOffset = decl.getEnd();
234
+ // Extract constructor fields
235
+ const children = [];
236
+ const ctor = decl.getConstructors()[0];
237
+ if (ctor) {
238
+ for (const param of ctor.getParameters()) {
239
+ const paramName = param.getName();
240
+ const paramType = param.getType().getText(param);
241
+ if (paramName === 'message' && paramType === 'string') {
242
+ children.push({ type: 'field', props: { name: 'message', type: 'string' } });
243
+ }
244
+ else if (param.isReadonly() || param.hasModifier(SyntaxKind.PublicKeyword)) {
245
+ children.push({ type: 'field', props: { name: paramName, type: paramType } });
246
+ }
247
+ }
248
+ }
249
+ const node = {
250
+ type: 'error',
251
+ props: { name, extends: baseClass },
252
+ children,
253
+ };
254
+ results.push(makeResult(node, sourceFile, startOffset, endOffset, startLine, endLine, `error ${name} extends ${baseClass}`, 'high', 96, originalText));
255
+ }
256
+ return results;
257
+ }
258
+ // ── Phase 1: Imports ─────────────────────────────────────────────────────
259
+ function inferImports(sourceFile) {
260
+ const results = [];
261
+ for (const decl of sourceFile.getImportDeclarations()) {
262
+ const from = decl.getModuleSpecifierValue();
263
+ const startLine = decl.getStartLineNumber();
264
+ const endLine = decl.getEndLineNumber();
265
+ const originalText = decl.getText();
266
+ const startOffset = decl.getStart();
267
+ const endOffset = decl.getEnd();
268
+ const defaultImport = decl.getDefaultImport()?.getText();
269
+ const namedImports = decl.getNamedImports().map(n => n.getName());
270
+ const isTypeOnly = decl.isTypeOnly();
271
+ const props = { from };
272
+ if (defaultImport)
273
+ props.default = defaultImport;
274
+ if (namedImports.length > 0)
275
+ props.names = namedImports.join(',');
276
+ if (isTypeOnly)
277
+ props.types = 'true';
278
+ const node = { type: 'import', props };
279
+ results.push(makeResult(node, sourceFile, startOffset, endOffset, startLine, endLine, `import ${namedImports.length > 0 ? `{ ${namedImports.join(', ')} }` : defaultImport || '*'} from '${from}'`, 'high', 99, originalText));
280
+ }
281
+ return results;
282
+ }
283
+ // ── Phase 1: Const Declarations ──────────────────────────────────────────
284
+ function inferConsts(sourceFile) {
285
+ const results = [];
286
+ for (const stmt of sourceFile.getVariableStatements()) {
287
+ const isExported = stmt.isExported();
288
+ const startOffset = stmt.getStart();
289
+ const endOffset = stmt.getEnd();
290
+ for (const decl of stmt.getDeclarations()) {
291
+ const name = decl.getName();
292
+ const startLine = stmt.getStartLineNumber();
293
+ const endLine = stmt.getEndLineNumber();
294
+ const originalText = stmt.getText();
295
+ const typeNode = decl.getTypeNode();
296
+ const typeName = typeNode?.getText();
297
+ const initializer = decl.getInitializer()?.getText();
298
+ // Skip if it's a function expression or arrow function
299
+ if (initializer && (initializer.startsWith('(') ||
300
+ initializer.startsWith('function') ||
301
+ initializer.startsWith('async') ||
302
+ initializer.includes('=>'))) {
303
+ continue;
304
+ }
305
+ const props = { name };
306
+ if (typeName)
307
+ props.type = typeName;
308
+ if (initializer)
309
+ props.value = initializer;
310
+ if (!isExported)
311
+ props.export = 'false';
312
+ const node = { type: 'const', props };
313
+ results.push(makeResult(node, sourceFile, startOffset, endOffset, startLine, endLine, `const ${name}${typeName ? ': ' + typeName : ''} = ${initializer || '...'}`, 'high', 90, originalText));
314
+ }
315
+ }
316
+ return results;
317
+ }
318
+ // ── Phase 2: Machine Detection ───────────────────────────────────────────
319
+ // Pattern: XState type + XStateError class + transition functions
320
+ function inferMachines(sourceFile, existing) {
321
+ const results = [];
322
+ const filePath = sourceFile.getFilePath() || 'input.ts';
323
+ // Look for *State type aliases that are string literal unions
324
+ const stateTypes = existing.filter(r => r.node.type === 'type' &&
325
+ r.node.props?.name &&
326
+ r.node.props.name.endsWith('State') &&
327
+ r.node.props.values);
328
+ for (const stateResult of stateTypes) {
329
+ const stateName = stateResult.node.props.name;
330
+ const baseName = stateName.replace(/State$/, '');
331
+ const values = stateResult.node.props.values.split('|');
332
+ // Check for matching XStateError class
333
+ const errorResult = existing.find(r => r.node.type === 'error' &&
334
+ r.node.props?.name === `${baseName}StateError`);
335
+ // Check for transition functions matching the pattern: verbBaseName
336
+ const transitionFns = existing.filter(r => r.node.type === 'fn' &&
337
+ r.node.props?.name &&
338
+ r.node.props.name.endsWith(baseName));
339
+ // Need at least the state type + 1 transition OR state type + error
340
+ if (!errorResult && transitionFns.length === 0)
341
+ continue;
342
+ const startLine = stateResult.startLine;
343
+ const endLine = Math.max(errorResult?.endLine || startLine, ...transitionFns.map(f => f.endLine));
344
+ // Build machine node
345
+ const children = [];
346
+ // States
347
+ for (let i = 0; i < values.length; i++) {
348
+ children.push({
349
+ type: 'state',
350
+ props: { name: values[i], ...(i === 0 ? { initial: 'true' } : {}) },
351
+ });
352
+ }
353
+ // Transitions (inferred from function names)
354
+ for (const fn of transitionFns) {
355
+ const fnName = fn.node.props.name;
356
+ const verb = fnName.replace(new RegExp(`${baseName}$`), '');
357
+ if (!verb)
358
+ continue;
359
+ children.push({
360
+ type: 'transition',
361
+ props: { name: verb },
362
+ });
363
+ }
364
+ const allOriginalText = [stateResult, errorResult, ...transitionFns]
365
+ .filter(Boolean)
366
+ .map(r => r.tsTokens)
367
+ .reduce((a, b) => a + b, 0);
368
+ const node = {
369
+ type: 'machine',
370
+ props: { name: baseName },
371
+ children,
372
+ };
373
+ // Collect sourceSpans from all component results
374
+ const componentSpans = [
375
+ ...stateResult.sourceSpans,
376
+ ...(errorResult?.sourceSpans || []),
377
+ ...transitionFns.flatMap(fn => fn.sourceSpans),
378
+ ];
379
+ const confidence = errorResult && transitionFns.length > 0 ? 90 : 75;
380
+ results.push({
381
+ node,
382
+ nodeId: `${filePath}#machine:${baseName}@L${startLine}`,
383
+ promptAlias: '', // assigned after sort
384
+ startLine,
385
+ endLine,
386
+ sourceSpans: componentSpans,
387
+ summary: `machine ${baseName} (${values.length} states, ${transitionFns.length} transitions)`,
388
+ confidence: confidence >= 85 ? 'high' : 'medium',
389
+ confidencePct: confidence,
390
+ kernTokens: countTokens(serializeKernNode(node)),
391
+ tsTokens: allOriginalText,
392
+ });
393
+ }
394
+ return results;
395
+ }
396
+ // ── Phase 2: Config Detection ────────────────────────────────────────────
397
+ // Pattern: XConfig interface + DEFAULT_X_CONFIG const
398
+ function inferConfigs(sourceFile, existing) {
399
+ const results = [];
400
+ const filePath = sourceFile.getFilePath() || 'input.ts';
401
+ const configInterfaces = existing.filter(r => r.node.type === 'interface' &&
402
+ r.node.props?.name &&
403
+ r.node.props.name.endsWith('Config'));
404
+ for (const ifaceResult of configInterfaces) {
405
+ const name = ifaceResult.node.props.name;
406
+ // Look for DEFAULT_X_CONFIG or DEFAULT_XCONFIG or defaultXConfig
407
+ const upperName = name.replace(/([a-z])([A-Z])/g, '$1_$2').toUpperCase();
408
+ const defaultConst = existing.find(r => r.node.type === 'const' &&
409
+ r.node.props?.name &&
410
+ (r.node.props.name === `DEFAULT_${upperName}` ||
411
+ r.node.props.name.toUpperCase().includes(upperName)));
412
+ if (!defaultConst)
413
+ continue;
414
+ const startLine = Math.min(ifaceResult.startLine, defaultConst.startLine);
415
+ const endLine = Math.max(ifaceResult.endLine, defaultConst.endLine);
416
+ // Build config node from interface fields
417
+ const children = (ifaceResult.node.children || []).map(field => {
418
+ return { ...field };
419
+ });
420
+ const node = {
421
+ type: 'config',
422
+ props: { name },
423
+ children,
424
+ };
425
+ const componentSpans = [
426
+ ...ifaceResult.sourceSpans,
427
+ ...defaultConst.sourceSpans,
428
+ ];
429
+ results.push({
430
+ node,
431
+ nodeId: `${filePath}#config:${name}@L${startLine}`,
432
+ promptAlias: '',
433
+ startLine,
434
+ endLine,
435
+ sourceSpans: componentSpans,
436
+ summary: `config ${name} (${children.length} fields + defaults)`,
437
+ confidence: 'medium',
438
+ confidencePct: 85,
439
+ kernTokens: countTokens(serializeKernNode(node)),
440
+ tsTokens: ifaceResult.tsTokens + defaultConst.tsTokens,
441
+ });
442
+ }
443
+ return results;
444
+ }
445
+ // ── Phase 2: Event Detection ─────────────────────────────────────────────
446
+ // Pattern: XEventType union + XEvent interface + XEventMap
447
+ function inferEvents(sourceFile, existing) {
448
+ const results = [];
449
+ const filePath = sourceFile.getFilePath() || 'input.ts';
450
+ // Find *EventType type aliases
451
+ const eventTypes = existing.filter(r => r.node.type === 'type' &&
452
+ r.node.props?.name &&
453
+ r.node.props.name.endsWith('EventType') &&
454
+ r.node.props.values);
455
+ for (const eventTypeResult of eventTypes) {
456
+ const typeName = eventTypeResult.node.props.name;
457
+ const baseName = typeName.replace(/Type$/, '');
458
+ // Look for matching XEvent interface
459
+ const eventInterface = existing.find(r => r.node.type === 'interface' &&
460
+ r.node.props?.name === baseName);
461
+ // Look for matching XEventMap interface
462
+ const eventMap = existing.find(r => r.node.type === 'interface' &&
463
+ r.node.props?.name === `${baseName}Map`);
464
+ if (!eventInterface)
465
+ continue;
466
+ const startLine = Math.min(eventTypeResult.startLine, eventInterface.startLine);
467
+ const endLine = Math.max(eventTypeResult.endLine, eventInterface.endLine, eventMap?.endLine || 0);
468
+ const values = eventTypeResult.node.props.values.split('|');
469
+ const children = values.map(v => ({
470
+ type: 'type',
471
+ props: { name: v, value: v },
472
+ }));
473
+ const node = {
474
+ type: 'event',
475
+ props: { name: baseName },
476
+ children,
477
+ };
478
+ const componentSpans = [
479
+ ...eventTypeResult.sourceSpans,
480
+ ...eventInterface.sourceSpans,
481
+ ...(eventMap?.sourceSpans || []),
482
+ ];
483
+ const totalTokens = eventTypeResult.tsTokens +
484
+ eventInterface.tsTokens +
485
+ (eventMap?.tsTokens || 0);
486
+ results.push({
487
+ node,
488
+ nodeId: `${filePath}#event:${baseName}@L${startLine}`,
489
+ promptAlias: '',
490
+ startLine,
491
+ endLine,
492
+ sourceSpans: componentSpans,
493
+ summary: `event ${baseName} (${values.length} types)`,
494
+ confidence: eventMap ? 'high' : 'medium',
495
+ confidencePct: eventMap ? 88 : 75,
496
+ kernTokens: countTokens(serializeKernNode(node)),
497
+ tsTokens: totalTokens,
498
+ });
499
+ }
500
+ return results;
501
+ }
502
+ //# sourceMappingURL=inferrer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inferrer.js","sourceRoot":"","sources":["../src/inferrer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * LLM Review — structured prompt builder and response parser.
3
+ *
4
+ * Builds a KERN IR prompt with short aliases (N1, N2, ...) for LLM review.
5
+ * Parses strict JSON schema responses, validates nodeIds, rejects unknowns.
6
+ *
7
+ * Phase 4 of the review pipeline.
8
+ */
9
+ import type { InferResult, TemplateMatch, ReviewFinding } from './types.js';
10
+ /**
11
+ * Export KERN IR with prompt aliases for AI review.
12
+ * v2: Includes nodeId aliases and handler bodies.
13
+ */
14
+ export declare function exportKernIR(inferred: InferResult[], templateMatches: TemplateMatch[]): string;
15
+ /**
16
+ * Build a structured prompt with short aliases for LLM code review.
17
+ * Handler bodies are included so the LLM can review actual logic.
18
+ */
19
+ export declare function buildLLMPrompt(inferred: InferResult[], templateMatches: TemplateMatch[]): string;
20
+ /**
21
+ * Parse strict JSON response from LLM, validate nodeIds, reject unknowns.
22
+ * Returns unified ReviewFinding[] mapped back to TS source spans.
23
+ */
24
+ export declare function parseLLMResponse(response: string, inferred: InferResult[]): ReviewFinding[];