@kernlang/evolve 3.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 (104) hide show
  1. package/LICENSE +661 -0
  2. package/dist/concept-gap-adapter.d.ts +17 -0
  3. package/dist/concept-gap-adapter.js +43 -0
  4. package/dist/concept-gap-adapter.js.map +1 -0
  5. package/dist/detector-registry.d.ts +31 -0
  6. package/dist/detector-registry.js +89 -0
  7. package/dist/detector-registry.js.map +1 -0
  8. package/dist/detectors/animation.d.ts +5 -0
  9. package/dist/detectors/animation.js +67 -0
  10. package/dist/detectors/animation.js.map +1 -0
  11. package/dist/detectors/data-fetching.d.ts +5 -0
  12. package/dist/detectors/data-fetching.js +117 -0
  13. package/dist/detectors/data-fetching.js.map +1 -0
  14. package/dist/detectors/express-middleware.d.ts +5 -0
  15. package/dist/detectors/express-middleware.js +52 -0
  16. package/dist/detectors/express-middleware.js.map +1 -0
  17. package/dist/detectors/react-forms.d.ts +5 -0
  18. package/dist/detectors/react-forms.js +89 -0
  19. package/dist/detectors/react-forms.js.map +1 -0
  20. package/dist/detectors/schema-validation.d.ts +5 -0
  21. package/dist/detectors/schema-validation.js +92 -0
  22. package/dist/detectors/schema-validation.js.map +1 -0
  23. package/dist/detectors/state-mgmt.d.ts +5 -0
  24. package/dist/detectors/state-mgmt.js +102 -0
  25. package/dist/detectors/state-mgmt.js.map +1 -0
  26. package/dist/detectors/structural.d.ts +10 -0
  27. package/dist/detectors/structural.js +271 -0
  28. package/dist/detectors/structural.js.map +1 -0
  29. package/dist/detectors/testing.d.ts +5 -0
  30. package/dist/detectors/testing.js +56 -0
  31. package/dist/detectors/testing.js.map +1 -0
  32. package/dist/detectors/vue-composables.d.ts +5 -0
  33. package/dist/detectors/vue-composables.js +57 -0
  34. package/dist/detectors/vue-composables.js.map +1 -0
  35. package/dist/evolve-dedup.d.ts +12 -0
  36. package/dist/evolve-dedup.js +50 -0
  37. package/dist/evolve-dedup.js.map +1 -0
  38. package/dist/evolve-rollback.d.ts +58 -0
  39. package/dist/evolve-rollback.js +242 -0
  40. package/dist/evolve-rollback.js.map +1 -0
  41. package/dist/evolve-runner.d.ts +22 -0
  42. package/dist/evolve-runner.js +183 -0
  43. package/dist/evolve-runner.js.map +1 -0
  44. package/dist/evolve-validator-v4.d.ts +11 -0
  45. package/dist/evolve-validator-v4.js +253 -0
  46. package/dist/evolve-validator-v4.js.map +1 -0
  47. package/dist/evolved-node-loader.d.ts +61 -0
  48. package/dist/evolved-node-loader.js +228 -0
  49. package/dist/evolved-node-loader.js.map +1 -0
  50. package/dist/evolved-types.d.ts +110 -0
  51. package/dist/evolved-types.js +8 -0
  52. package/dist/evolved-types.js.map +1 -0
  53. package/dist/expressibility-scorer.d.ts +19 -0
  54. package/dist/expressibility-scorer.js +78 -0
  55. package/dist/expressibility-scorer.js.map +1 -0
  56. package/dist/gap-detector.d.ts +26 -0
  57. package/dist/gap-detector.js +141 -0
  58. package/dist/gap-detector.js.map +1 -0
  59. package/dist/golden-test-runner.d.ts +27 -0
  60. package/dist/golden-test-runner.js +120 -0
  61. package/dist/golden-test-runner.js.map +1 -0
  62. package/dist/graduation.d.ts +36 -0
  63. package/dist/graduation.js +175 -0
  64. package/dist/graduation.js.map +1 -0
  65. package/dist/index.d.ts +40 -0
  66. package/dist/index.js +58 -0
  67. package/dist/index.js.map +1 -0
  68. package/dist/llm-discovery.d.ts +55 -0
  69. package/dist/llm-discovery.js +352 -0
  70. package/dist/llm-discovery.js.map +1 -0
  71. package/dist/llm-provider.d.ts +35 -0
  72. package/dist/llm-provider.js +143 -0
  73. package/dist/llm-provider.js.map +1 -0
  74. package/dist/node-governance.d.ts +23 -0
  75. package/dist/node-governance.js +45 -0
  76. package/dist/node-governance.js.map +1 -0
  77. package/dist/node-proposer.d.ts +27 -0
  78. package/dist/node-proposer.js +127 -0
  79. package/dist/node-proposer.js.map +1 -0
  80. package/dist/node-validator.d.ts +16 -0
  81. package/dist/node-validator.js +74 -0
  82. package/dist/node-validator.js.map +1 -0
  83. package/dist/pattern-analyzer.d.ts +28 -0
  84. package/dist/pattern-analyzer.js +181 -0
  85. package/dist/pattern-analyzer.js.map +1 -0
  86. package/dist/quality-scorer.d.ts +16 -0
  87. package/dist/quality-scorer.js +79 -0
  88. package/dist/quality-scorer.js.map +1 -0
  89. package/dist/sandboxed-generator.d.ts +26 -0
  90. package/dist/sandboxed-generator.js +133 -0
  91. package/dist/sandboxed-generator.js.map +1 -0
  92. package/dist/staging.d.ts +81 -0
  93. package/dist/staging.js +414 -0
  94. package/dist/staging.js.map +1 -0
  95. package/dist/template-proposer.d.ts +24 -0
  96. package/dist/template-proposer.js +103 -0
  97. package/dist/template-proposer.js.map +1 -0
  98. package/dist/template-validator.d.ts +18 -0
  99. package/dist/template-validator.js +174 -0
  100. package/dist/template-validator.js.map +1 -0
  101. package/dist/types.d.ts +169 -0
  102. package/dist/types.js +7 -0
  103. package/dist/types.js.map +1 -0
  104. package/package.json +27 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graduation.js","sourceRoot":"","sources":["../src/graduation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * @kernlang/evolve — Self-extending template system for KERN.
3
+ *
4
+ * Scans TypeScript projects, detects patterns KERN can't yet express,
5
+ * proposes new templates, validates them, and stages for human approval.
6
+ *
7
+ * Public API:
8
+ * evolve(inputPath, options?) — full pipeline: scan → detect → propose → stage
9
+ * evolveSource(source, options?) — single-source analysis
10
+ * registerDetector(pack) — register custom detector
11
+ * loadBuiltinDetectors() — load all built-in detectors
12
+ */
13
+ export type { PatternKind, DetectorPack, DetectionResult, ExtractedParam, PatternGap, ImportDecl, GoldenExample, QualityScore, QualityThresholds, AnalyzedPattern, TemplateProposal, ValidationResult, ProposalStatus, StagedProposal, EvolveConfig, EvolveResult, ConceptGapSummary, ExpressibilityScore, NodeProposal, NodeValidationResult, NodeProposalStatus, StagedNodeProposal, } from './types.js';
14
+ export { registerDetector, unregisterDetector, getDetector, getAllDetectors, getDetectorsForImport, getUniversalDetectors, clearDetectors, detectorCount, loadBuiltinDetectors, registerDetectors, } from './detector-registry.js';
15
+ export { detectGaps, detectGapsInFiles, detectGapsFromSource, resetGapIds } from './gap-detector.js';
16
+ export { detectConceptualGaps, resetConceptGapIds } from './concept-gap-adapter.js';
17
+ export { scorePattern, passesThresholds, DEFAULT_THRESHOLDS } from './quality-scorer.js';
18
+ export { analyzePatterns, analyzeStructuralPatterns, computeStructuralHash, deriveTemplateName } from './pattern-analyzer.js';
19
+ export { proposeTemplates, generateKernSource } from './template-proposer.js';
20
+ export { validateProposal } from './template-validator.js';
21
+ export { stageProposal, listStaged, getStaged, updateStagedStatus, promoteLocal, cleanRejected, formatSplitView, stageNodeProposal, listStagedNodes, updateStagedNodeStatus, formatNodeSplitView, stageEvolveV4Proposal, listStagedEvolveV4, getStagedEvolveV4, updateStagedEvolveV4Status, cleanRejectedEvolveV4, cleanApprovedEvolveV4, formatEvolveV4SplitView, } from './staging.js';
22
+ export { scoreExpressibility, isNodeCandidate, EXPRESSIBILITY_NODE_THRESHOLD, } from './expressibility-scorer.js';
23
+ export { proposeNodes, deriveNodeName as deriveNodeProposalName, resetNodeProposalIds } from './node-proposer.js';
24
+ export { governanceGate, getGovernanceThresholds } from './node-governance.js';
25
+ export { validateNodeProposal } from './node-validator.js';
26
+ export { evolve, evolveSource } from './evolve-runner.js';
27
+ export type { EvolveOptions } from './evolve-runner.js';
28
+ export type { ParserHints, EvolvedNodeDefinition, EvolvedNodeProp, EvolvedNodeReason, EvolvedManifest, EvolvedManifestEntry, EvolveNodeProposal, EvolveV4ValidationResult, EvolveV4ProposalStatus, StagedEvolveProposal, CodegenHelpers, } from './evolved-types.js';
29
+ export { loadEvolvedNodes, clearEvolvedNodes, getEvolvedGenerator, getParserHints as getEvolvedParserHints, hasEvolvedNodes, evolvedNodeCount, getEvolvedKeywords, readManifest as readEvolvedManifest, readNodeDefinition, rebuildManifest as rebuildEvolvedManifest, } from './evolved-node-loader.js';
30
+ export type { RebuildResult } from './evolved-node-loader.js';
31
+ export { loadSandboxedGenerator, compileSandboxedGenerator, getCodegenHelpers } from './sandboxed-generator.js';
32
+ export { validateEvolveProposal } from './evolve-validator-v4.js';
33
+ export { checkDedup } from './evolve-dedup.js';
34
+ export { compareGoldenOutput, runGoldenTests, formatGoldenTestResults } from './golden-test-runner.js';
35
+ export { graduateNode, compileCodegenToJS, promoteNode } from './graduation.js';
36
+ export { rollbackNode, restoreNode, findUsages, pruneNodes, detectCollisions, renameEvolvedNode } from './evolve-rollback.js';
37
+ export type { PruneResult, CollisionInfo } from './evolve-rollback.js';
38
+ export { buildDiscoveryPrompt, parseDiscoveryResponse, selectRepresentativeFiles, collectTsFiles, estimateTokens, buildBackfillPrompt, buildRetryPrompt } from './llm-discovery.js';
39
+ export { createLLMProvider, TokenBudget } from './llm-provider.js';
40
+ export type { LLMProvider, LLMProviderOptions } from './llm-provider.js';
package/dist/index.js ADDED
@@ -0,0 +1,58 @@
1
+ /**
2
+ * @kernlang/evolve — Self-extending template system for KERN.
3
+ *
4
+ * Scans TypeScript projects, detects patterns KERN can't yet express,
5
+ * proposes new templates, validates them, and stages for human approval.
6
+ *
7
+ * Public API:
8
+ * evolve(inputPath, options?) — full pipeline: scan → detect → propose → stage
9
+ * evolveSource(source, options?) — single-source analysis
10
+ * registerDetector(pack) — register custom detector
11
+ * loadBuiltinDetectors() — load all built-in detectors
12
+ */
13
+ // Detector Registry
14
+ export { registerDetector, unregisterDetector, getDetector, getAllDetectors, getDetectorsForImport, getUniversalDetectors, clearDetectors, detectorCount, loadBuiltinDetectors, registerDetectors, } from './detector-registry.js';
15
+ // Gap Detector
16
+ export { detectGaps, detectGapsInFiles, detectGapsFromSource, resetGapIds } from './gap-detector.js';
17
+ // Concept Gap Adapter
18
+ export { detectConceptualGaps, resetConceptGapIds } from './concept-gap-adapter.js';
19
+ // Quality Scorer
20
+ export { scorePattern, passesThresholds, DEFAULT_THRESHOLDS } from './quality-scorer.js';
21
+ // Pattern Analyzer
22
+ export { analyzePatterns, analyzeStructuralPatterns, computeStructuralHash, deriveTemplateName } from './pattern-analyzer.js';
23
+ // Template Proposer
24
+ export { proposeTemplates, generateKernSource } from './template-proposer.js';
25
+ // Template Validator
26
+ export { validateProposal } from './template-validator.js';
27
+ // Staging
28
+ export { stageProposal, listStaged, getStaged, updateStagedStatus, promoteLocal, cleanRejected, formatSplitView,
29
+ // v3 node staging
30
+ stageNodeProposal, listStagedNodes, updateStagedNodeStatus, formatNodeSplitView,
31
+ // v4 evolve staging
32
+ stageEvolveV4Proposal, listStagedEvolveV4, getStagedEvolveV4, updateStagedEvolveV4Status, cleanRejectedEvolveV4, cleanApprovedEvolveV4, formatEvolveV4SplitView, } from './staging.js';
33
+ // Expressibility Scorer (v3)
34
+ export { scoreExpressibility, isNodeCandidate, EXPRESSIBILITY_NODE_THRESHOLD, } from './expressibility-scorer.js';
35
+ // Node Proposer (v3)
36
+ export { proposeNodes, deriveNodeName as deriveNodeProposalName, resetNodeProposalIds } from './node-proposer.js';
37
+ // Node Governance (v3)
38
+ export { governanceGate, getGovernanceThresholds } from './node-governance.js';
39
+ // Node Validator (v3)
40
+ export { validateNodeProposal } from './node-validator.js';
41
+ // Evolve Runner (main entry points)
42
+ export { evolve, evolveSource } from './evolve-runner.js';
43
+ // Evolved Node Loader
44
+ export { loadEvolvedNodes, clearEvolvedNodes, getEvolvedGenerator, getParserHints as getEvolvedParserHints, hasEvolvedNodes, evolvedNodeCount, getEvolvedKeywords, readManifest as readEvolvedManifest, readNodeDefinition, rebuildManifest as rebuildEvolvedManifest, } from './evolved-node-loader.js';
45
+ // Sandboxed Generator
46
+ export { loadSandboxedGenerator, compileSandboxedGenerator, getCodegenHelpers } from './sandboxed-generator.js';
47
+ // v4 Validation
48
+ export { validateEvolveProposal } from './evolve-validator-v4.js';
49
+ export { checkDedup } from './evolve-dedup.js';
50
+ export { compareGoldenOutput, runGoldenTests, formatGoldenTestResults } from './golden-test-runner.js';
51
+ // Graduation
52
+ export { graduateNode, compileCodegenToJS, promoteNode } from './graduation.js';
53
+ // Rollback + Prune + Migrate
54
+ export { rollbackNode, restoreNode, findUsages, pruneNodes, detectCollisions, renameEvolvedNode } from './evolve-rollback.js';
55
+ // LLM Discovery
56
+ export { buildDiscoveryPrompt, parseDiscoveryResponse, selectRepresentativeFiles, collectTsFiles, estimateTokens, buildBackfillPrompt, buildRetryPrompt } from './llm-discovery.js';
57
+ export { createLLMProvider, TokenBudget } from './llm-provider.js';
58
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * LLM Discovery — universal pattern recognition for KERN Evolve v4.
3
+ *
4
+ * No hardcoded detectors. The LLM reads TypeScript source files and
5
+ * identifies repeating patterns that KERN can't yet express.
6
+ *
7
+ * Offline-safe: this module only constructs prompts and parses responses.
8
+ * The actual LLM call is handled by llm-provider.ts.
9
+ */
10
+ import type { EvolveNodeProposal, EvolvedNodeProp } from './evolved-types.js';
11
+ /**
12
+ * Select representative TypeScript files, clustered by directory.
13
+ * Returns batches of 3-5 files suitable for LLM context.
14
+ *
15
+ * @param filePaths — all .ts/.tsx files in the project
16
+ * @param maxPerCluster — max files to sample per directory (default: 3)
17
+ * @param maxBatchSize — max files per LLM batch (default: 5)
18
+ */
19
+ export declare function selectRepresentativeFiles(filePaths: string[], maxPerCluster?: number, maxBatchSize?: number): string[][];
20
+ /**
21
+ * Collect all TypeScript files from a directory (recursive).
22
+ * Skips node_modules, dist, .files, test files, and .d.ts files.
23
+ */
24
+ export declare function collectTsFiles(dir: string, recursive?: boolean): string[];
25
+ /**
26
+ * Build the LLM discovery prompt for a batch of files.
27
+ */
28
+ export declare function buildDiscoveryPrompt(files: Array<{
29
+ path: string;
30
+ content: string;
31
+ }>, nodeTypes: readonly string[], evolvedKeywords?: string[]): string;
32
+ /**
33
+ * Parse the LLM response into EvolveNodeProposal[].
34
+ * Handles common LLM quirks: markdown fences, preamble, trailing text.
35
+ */
36
+ export declare function parseDiscoveryResponse(response: string, evolveRunId?: string): EvolveNodeProposal[];
37
+ /**
38
+ * Estimate token count for a string (rough: 1 token ≈ 4 chars).
39
+ */
40
+ export declare function estimateTokens(text: string): number;
41
+ /**
42
+ * Build a prompt asking the LLM to fix a failed proposal.
43
+ * Feeds back the validation errors so the LLM can correct its output.
44
+ */
45
+ export declare function buildRetryPrompt(proposal: EvolveNodeProposal, errors: string[]): string;
46
+ /**
47
+ * Build a prompt for LLM to generate a target-specific codegen for an evolved node.
48
+ */
49
+ export declare function buildBackfillPrompt(keyword: string, definition: {
50
+ props: EvolvedNodeProp[];
51
+ childTypes: string[];
52
+ kernExample: string;
53
+ codegenSource: string;
54
+ expectedOutput: string;
55
+ }, target: string): string;
@@ -0,0 +1,352 @@
1
+ /**
2
+ * LLM Discovery — universal pattern recognition for KERN Evolve v4.
3
+ *
4
+ * No hardcoded detectors. The LLM reads TypeScript source files and
5
+ * identifies repeating patterns that KERN can't yet express.
6
+ *
7
+ * Offline-safe: this module only constructs prompts and parses responses.
8
+ * The actual LLM call is handled by llm-provider.ts.
9
+ */
10
+ import { readdirSync, statSync } from 'fs';
11
+ import { resolve, join, dirname } from 'path';
12
+ // ── File Selection ───────────────────────────────────────────────────────
13
+ /**
14
+ * Select representative TypeScript files, clustered by directory.
15
+ * Returns batches of 3-5 files suitable for LLM context.
16
+ *
17
+ * @param filePaths — all .ts/.tsx files in the project
18
+ * @param maxPerCluster — max files to sample per directory (default: 3)
19
+ * @param maxBatchSize — max files per LLM batch (default: 5)
20
+ */
21
+ export function selectRepresentativeFiles(filePaths, maxPerCluster = 3, maxBatchSize = 5) {
22
+ // Cluster by parent directory
23
+ const clusters = new Map();
24
+ for (const fp of filePaths) {
25
+ const dir = dirname(fp);
26
+ const cluster = clusters.get(dir) || [];
27
+ cluster.push(fp);
28
+ clusters.set(dir, cluster);
29
+ }
30
+ // Sample from each cluster: pick diverse files (by size variance)
31
+ const sampled = [];
32
+ for (const [dir, files] of clusters) {
33
+ // Sort by file size (descending) to get diverse samples
34
+ const sorted = [...files].sort((a, b) => {
35
+ try {
36
+ return statSync(b).size - statSync(a).size;
37
+ }
38
+ catch {
39
+ return 0;
40
+ }
41
+ });
42
+ // Take up to maxPerCluster, spread across the size range
43
+ const take = Math.min(sorted.length, maxPerCluster);
44
+ if (take <= 2) {
45
+ sampled.push(...sorted.slice(0, take));
46
+ }
47
+ else {
48
+ // First, middle, last for diversity
49
+ const step = Math.floor((sorted.length - 1) / (take - 1));
50
+ for (let i = 0; i < take; i++) {
51
+ const idx = Math.min(i * step, sorted.length - 1);
52
+ sampled.push(sorted[idx]);
53
+ }
54
+ }
55
+ }
56
+ // Group into batches
57
+ const batches = [];
58
+ for (let i = 0; i < sampled.length; i += maxBatchSize) {
59
+ batches.push(sampled.slice(i, i + maxBatchSize));
60
+ }
61
+ return batches;
62
+ }
63
+ /**
64
+ * Collect all TypeScript files from a directory (recursive).
65
+ * Skips node_modules, dist, .files, test files, and .d.ts files.
66
+ */
67
+ export function collectTsFiles(dir, recursive = true) {
68
+ const files = [];
69
+ function walk(d) {
70
+ try {
71
+ for (const entry of readdirSync(d, { withFileTypes: true })) {
72
+ if (entry.name.startsWith('.') || entry.name === 'node_modules' || entry.name === 'dist')
73
+ continue;
74
+ const full = join(d, entry.name);
75
+ if (entry.isDirectory() && recursive) {
76
+ walk(full);
77
+ }
78
+ else if ((entry.name.endsWith('.ts') || entry.name.endsWith('.tsx')) &&
79
+ !entry.name.endsWith('.d.ts') &&
80
+ !entry.name.endsWith('.test.ts') &&
81
+ !entry.name.endsWith('.test.tsx') &&
82
+ !entry.name.endsWith('.spec.ts')) {
83
+ files.push(full);
84
+ }
85
+ }
86
+ }
87
+ catch { // file may not exist
88
+ }
89
+ }
90
+ walk(resolve(dir));
91
+ return files;
92
+ }
93
+ // ── Prompt Construction ──────────────────────────────────────────────────
94
+ /**
95
+ * Build the LLM discovery prompt for a batch of files.
96
+ */
97
+ export function buildDiscoveryPrompt(files, nodeTypes, evolvedKeywords = []) {
98
+ const fileBlocks = files.map(f => `### ${f.path}\n\`\`\`typescript\n${truncate(f.content, 3000)}\n\`\`\``).join('\n\n');
99
+ const existingNodes = [...nodeTypes, ...evolvedKeywords].join(', ');
100
+ return `You are analyzing TypeScript source files to find repeating structural patterns that a language called KERN cannot yet express.
101
+
102
+ KERN is an indent-based IR language that compiles to TypeScript. It has these existing node types:
103
+ ${existingNodes}
104
+
105
+ ## Source Files to Analyze
106
+
107
+ ${fileBlocks}
108
+
109
+ ## Your Task
110
+
111
+ Identify **repeating structural patterns** in these files that:
112
+ 1. Appear 2+ times (across these files or clearly would across a larger codebase)
113
+ 2. Cannot be expressed by any existing KERN node type listed above
114
+ 3. Have a clear structural template (not just random code)
115
+ 4. Would benefit from a first-class language construct (saves boilerplate, enforces consistency)
116
+
117
+ ## Response Format
118
+
119
+ Respond with a JSON array. Each element represents one proposed node:
120
+
121
+ \`\`\`json
122
+ [
123
+ {
124
+ "keyword": "lowercase-with-hyphens",
125
+ "displayName": "Human Readable Name",
126
+ "description": "What this node represents",
127
+ "props": [
128
+ { "name": "propName", "type": "string", "required": true, "description": "What this prop does" }
129
+ ],
130
+ "childTypes": ["child-type-if-any"],
131
+ "kernExample": "keyword prop1=value1 prop2=value2\\n child-type prop=value",
132
+ "expectedOutput": "export const example = { /* generated TS */ };",
133
+ "codegenSource": "module.exports = function(node, helpers) {\\n var name = helpers.p(node).name;\\n return ['export const ' + name + ' = {};'];\\n};",
134
+ "reason": {
135
+ "observation": "Found N instances of this pattern in the analyzed files",
136
+ "inefficiency": "Each instance requires M lines of boilerplate",
137
+ "kernBenefit": "Reduces to K lines of KERN, ensures consistency"
138
+ }
139
+ }
140
+ ]
141
+ \`\`\`
142
+
143
+ ## Critical Rules
144
+
145
+ 1. **codegenSource MUST be valid CommonJS JavaScript** (not TypeScript). Use \`module.exports = function(node, helpers) { ... }\`. The function receives an AST node and helpers object.
146
+ 2. **Available helpers:** \`helpers.p(node)\` returns props, \`helpers.kids(node, 'type')\` returns children of type, \`helpers.firstChild(node, 'type')\`, \`helpers.capitalize(str)\`, \`helpers.parseParamList(str)\`, \`helpers.dedent(str)\`, \`helpers.handlerCode(node)\`, \`helpers.exportPrefix(node)\`.
147
+ 3. **The function must return string[]** — an array of lines of TypeScript code.
148
+ 4. **kernExample must parse** with KERN's indent-based parser (2-space indents, key=value props, no special syntax).
149
+ 5. **expectedOutput must be the TypeScript** that codegenSource would produce for kernExample.
150
+ 6. **keyword must be lowercase with hyphens**, not colliding with existing node types.
151
+ 7. **Return an empty array []** if no valid patterns are found. Do not hallucinate patterns.
152
+ 8. **Only return the JSON array.** No markdown, no explanation, no preamble.`;
153
+ }
154
+ // ── Response Parsing ─────────────────────────────────────────────────────
155
+ /**
156
+ * Parse the LLM response into EvolveNodeProposal[].
157
+ * Handles common LLM quirks: markdown fences, preamble, trailing text.
158
+ */
159
+ export function parseDiscoveryResponse(response, evolveRunId = `run-${Date.now()}`) {
160
+ // Strip markdown fences
161
+ let json = response.trim();
162
+ const fenceMatch = json.match(/```(?:json)?\s*\n?([\s\S]*?)```/);
163
+ if (fenceMatch) {
164
+ json = fenceMatch[1].trim();
165
+ }
166
+ // Try to find JSON array boundaries
167
+ const arrayStart = json.indexOf('[');
168
+ const arrayEnd = json.lastIndexOf(']');
169
+ if (arrayStart === -1 || arrayEnd === -1 || arrayEnd <= arrayStart) {
170
+ return [];
171
+ }
172
+ json = json.slice(arrayStart, arrayEnd + 1);
173
+ let parsed;
174
+ try {
175
+ parsed = JSON.parse(json);
176
+ }
177
+ catch {
178
+ return [];
179
+ }
180
+ if (!Array.isArray(parsed))
181
+ return [];
182
+ const proposals = [];
183
+ for (const item of parsed) {
184
+ try {
185
+ const p = normalizeProposal(item, evolveRunId);
186
+ if (p)
187
+ proposals.push(p);
188
+ }
189
+ catch (err) {
190
+ // Malformed LLM response entry — log and continue
191
+ if (process.env.KERN_DEBUG)
192
+ console.warn('Skipping malformed proposal entry:', err.message);
193
+ }
194
+ }
195
+ return proposals;
196
+ }
197
+ function normalizeProposal(raw, evolveRunId) {
198
+ const keyword = raw.keyword;
199
+ if (!keyword || typeof keyword !== 'string')
200
+ return null;
201
+ // Normalize keyword to lowercase with hyphens
202
+ const normalizedKeyword = keyword.toLowerCase().replace(/[^a-z0-9-]/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');
203
+ if (!normalizedKeyword)
204
+ return null;
205
+ const reason = raw.reason || {};
206
+ return {
207
+ id: `proposal-${normalizedKeyword}-${Date.now()}`,
208
+ keyword: normalizedKeyword,
209
+ displayName: raw.displayName || normalizedKeyword,
210
+ description: raw.description || '',
211
+ props: normalizeProps(raw.props),
212
+ childTypes: Array.isArray(raw.childTypes) ? raw.childTypes.filter((c) => typeof c === 'string') : [],
213
+ kernExample: raw.kernExample || '',
214
+ expectedOutput: raw.expectedOutput || '',
215
+ codegenSource: raw.codegenSource || '',
216
+ parserHints: undefined,
217
+ targetOverrides: undefined,
218
+ reason: {
219
+ observation: reason.observation || '',
220
+ inefficiency: reason.inefficiency || '',
221
+ kernBenefit: reason.kernBenefit || '',
222
+ frequency: reason.frequency || 0,
223
+ avgLines: reason.avgLines || 0,
224
+ instances: Array.isArray(reason.instances) ? reason.instances : [],
225
+ },
226
+ codegenTier: 1,
227
+ proposedAt: new Date().toISOString(),
228
+ evolveRunId,
229
+ };
230
+ }
231
+ function normalizeProps(raw) {
232
+ if (!Array.isArray(raw))
233
+ return [];
234
+ return raw
235
+ .filter((p) => p !== null && typeof p === 'object')
236
+ .map(p => ({
237
+ name: p.name || 'unknown',
238
+ type: (['string', 'boolean', 'number', 'expression'].includes(p.type) ? p.type : 'string'),
239
+ required: p.required === true,
240
+ description: p.description || '',
241
+ }));
242
+ }
243
+ // ── Utility ──────────────────────────────────────────────────────────────
244
+ function truncate(content, maxChars) {
245
+ if (content.length <= maxChars)
246
+ return content;
247
+ return content.slice(0, maxChars) + '\n// ... truncated ...';
248
+ }
249
+ /**
250
+ * Estimate token count for a string (rough: 1 token ≈ 4 chars).
251
+ */
252
+ export function estimateTokens(text) {
253
+ return Math.ceil(text.length / 4);
254
+ }
255
+ // ── Retry Prompt ──────────────────────────────────────────────────────────
256
+ /**
257
+ * Build a prompt asking the LLM to fix a failed proposal.
258
+ * Feeds back the validation errors so the LLM can correct its output.
259
+ */
260
+ export function buildRetryPrompt(proposal, errors) {
261
+ return `Your previous KERN node proposal "${proposal.keyword}" failed validation. Fix the issues and return the corrected proposal.
262
+
263
+ ## Previous Proposal
264
+
265
+ keyword: ${proposal.keyword}
266
+ kernExample: ${proposal.kernExample}
267
+ expectedOutput: ${proposal.expectedOutput}
268
+ codegenSource:
269
+ ${proposal.codegenSource}
270
+
271
+ ## Validation Errors
272
+
273
+ ${errors.map((e, i) => `${i + 1}. ${e}`).join('\n')}
274
+
275
+ ## Rules
276
+
277
+ 1. **codegenSource MUST be valid CommonJS JavaScript** (not TypeScript). Use \`module.exports = function(node, helpers) { ... }\`.
278
+ 2. **Available helpers:** \`helpers.p(node)\` returns props, \`helpers.kids(node, 'type')\`, \`helpers.firstChild(node, 'type')\`, \`helpers.capitalize(str)\`, \`helpers.parseParamList(str)\`, \`helpers.dedent(str)\`, \`helpers.handlerCode(node)\`, \`helpers.exportPrefix(node)\`.
279
+ 3. **The function must return string[]** — an array of lines of TypeScript code.
280
+ 4. **kernExample must parse** with KERN's indent-based parser (2-space indents, key=value props).
281
+ 5. **expectedOutput must match** what codegenSource produces for kernExample.
282
+
283
+ ## Response Format
284
+
285
+ Return ONLY the corrected JSON object (same schema as before):
286
+
287
+ \`\`\`json
288
+ {
289
+ "keyword": "${proposal.keyword}",
290
+ "displayName": "${proposal.displayName}",
291
+ "description": "${proposal.description}",
292
+ "props": ${JSON.stringify(proposal.props)},
293
+ "childTypes": ${JSON.stringify(proposal.childTypes)},
294
+ "kernExample": "...",
295
+ "expectedOutput": "...",
296
+ "codegenSource": "module.exports = function(node, helpers) { ... }",
297
+ "reason": ${JSON.stringify(proposal.reason)}
298
+ }
299
+ \`\`\`
300
+
301
+ No markdown outside the JSON block. No explanation.`;
302
+ }
303
+ // ── Backfill Prompt ───────────────────────────────────────────────────────
304
+ /**
305
+ * Build a prompt for LLM to generate a target-specific codegen for an evolved node.
306
+ */
307
+ export function buildBackfillPrompt(keyword, definition, target) {
308
+ return `You are generating a target-specific code generator for a KERN evolved node.
309
+
310
+ ## Node: ${keyword}
311
+ Target: ${target}
312
+
313
+ ## Props
314
+ ${definition.props.map(p => `- ${p.name} (${p.type}${p.required ? ', required' : ''}): ${p.description}`).join('\n')}
315
+
316
+ ## Child Types
317
+ ${definition.childTypes.join(', ') || '(none)'}
318
+
319
+ ## KERN Example Input
320
+ \`\`\`kern
321
+ ${definition.kernExample}
322
+ \`\`\`
323
+
324
+ ## Default Codegen (TypeScript target)
325
+ \`\`\`javascript
326
+ ${definition.codegenSource}
327
+ \`\`\`
328
+
329
+ ## Default Output (TypeScript)
330
+ \`\`\`typescript
331
+ ${definition.expectedOutput}
332
+ \`\`\`
333
+
334
+ ## Your Task
335
+
336
+ Write a **CommonJS JavaScript** function that generates **${target}**-specific output for this node. The function receives \`(node, helpers)\` and must return \`string[]\` (lines of code).
337
+
338
+ Available helpers: \`helpers.p(node)\` (props), \`helpers.kids(node, 'type')\` (children), \`helpers.firstChild(node, 'type')\`, \`helpers.capitalize(str)\`, \`helpers.parseParamList(str)\`, \`helpers.dedent(str)\`, \`helpers.handlerCode(node)\`, \`helpers.exportPrefix(node)\`.
339
+
340
+ ## Response Format
341
+
342
+ Return ONLY a JSON object:
343
+ \`\`\`json
344
+ {
345
+ "codegenSource": "module.exports = function(node, helpers) { ... }",
346
+ "expectedOutput": "// expected output for the kern example above"
347
+ }
348
+ \`\`\`
349
+
350
+ No markdown, no explanation, just the JSON object.`;
351
+ }
352
+ //# sourceMappingURL=llm-discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-discovery.js","sourceRoot":"","sources":["../src/llm-discovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * LLM Provider — abstraction over OpenAI, Anthropic, and local models.
3
+ *
4
+ * Used only by `kern evolve discover` and `kern evolve backfill`.
5
+ * Never called during compilation.
6
+ */
7
+ export interface LLMProvider {
8
+ name: string;
9
+ complete(prompt: string): Promise<string>;
10
+ }
11
+ export interface LLMProviderOptions {
12
+ provider?: 'openai' | 'anthropic' | 'ollama';
13
+ model?: string;
14
+ maxTokens?: number;
15
+ apiKey?: string;
16
+ baseUrl?: string;
17
+ }
18
+ /**
19
+ * Create an LLM provider based on configuration.
20
+ * Checks environment variables for API keys.
21
+ */
22
+ export declare function createLLMProvider(options?: LLMProviderOptions): LLMProvider;
23
+ /**
24
+ * Track token usage for cost estimation.
25
+ */
26
+ export declare class TokenBudget {
27
+ readonly limit: number;
28
+ private used;
29
+ constructor(limit: number);
30
+ add(tokens: number): void;
31
+ get remaining(): number;
32
+ get exhausted(): boolean;
33
+ get totalUsed(): number;
34
+ toString(): string;
35
+ }