matryoshka-rlm 0.2.21 → 0.2.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/engine/nucleus-engine.d.ts +1 -0
- package/dist/engine/nucleus-engine.d.ts.map +1 -1
- package/dist/engine/nucleus-engine.js +41 -14
- package/dist/engine/nucleus-engine.js.map +1 -1
- package/dist/fsm/rlm-states.d.ts.map +1 -1
- package/dist/fsm/rlm-states.js +36 -6
- package/dist/fsm/rlm-states.js.map +1 -1
- package/dist/graph/relationship-analyzer.d.ts.map +1 -1
- package/dist/graph/relationship-analyzer.js +44 -16
- package/dist/graph/relationship-analyzer.js.map +1 -1
- package/dist/llm/glm.d.ts +3 -0
- package/dist/llm/glm.d.ts.map +1 -0
- package/dist/llm/glm.js +52 -0
- package/dist/llm/glm.js.map +1 -0
- package/dist/llm/index.d.ts +1 -0
- package/dist/llm/index.d.ts.map +1 -1
- package/dist/llm/index.js +3 -0
- package/dist/llm/index.js.map +1 -1
- package/dist/logic/bm25.d.ts.map +1 -1
- package/dist/logic/bm25.js +2 -1
- package/dist/logic/bm25.js.map +1 -1
- package/dist/logic/lc-parser.d.ts.map +1 -1
- package/dist/logic/lc-parser.js +77 -98
- package/dist/logic/lc-parser.js.map +1 -1
- package/dist/logic/lc-solver.d.ts.map +1 -1
- package/dist/logic/lc-solver.js +34 -26
- package/dist/logic/lc-solver.js.map +1 -1
- package/dist/logic/qvalue.d.ts +3 -0
- package/dist/logic/qvalue.d.ts.map +1 -1
- package/dist/logic/qvalue.js +13 -0
- package/dist/logic/qvalue.js.map +1 -1
- package/dist/logic/semantic.d.ts +1 -0
- package/dist/logic/semantic.d.ts.map +1 -1
- package/dist/logic/semantic.js +10 -4
- package/dist/logic/semantic.js.map +1 -1
- package/dist/logic/type-inference.d.ts.map +1 -1
- package/dist/logic/type-inference.js +43 -1
- package/dist/logic/type-inference.js.map +1 -1
- package/dist/persistence/fts5-search.d.ts +1 -0
- package/dist/persistence/fts5-search.d.ts.map +1 -1
- package/dist/persistence/fts5-search.js +3 -24
- package/dist/persistence/fts5-search.js.map +1 -1
- package/dist/persistence/handle-ops.d.ts +2 -2
- package/dist/persistence/handle-ops.d.ts.map +1 -1
- package/dist/persistence/handle-ops.js +65 -38
- package/dist/persistence/handle-ops.js.map +1 -1
- package/dist/persistence/handle-registry.d.ts +2 -1
- package/dist/persistence/handle-registry.d.ts.map +1 -1
- package/dist/persistence/handle-registry.js +31 -27
- package/dist/persistence/handle-registry.js.map +1 -1
- package/dist/persistence/session-db.d.ts +12 -0
- package/dist/persistence/session-db.d.ts.map +1 -1
- package/dist/persistence/session-db.js +45 -0
- package/dist/persistence/session-db.js.map +1 -1
- package/dist/rag/similarity.d.ts.map +1 -1
- package/dist/rag/similarity.js +15 -4
- package/dist/rag/similarity.js.map +1 -1
- package/dist/rlm.d.ts.map +1 -1
- package/dist/rlm.js +20 -7
- package/dist/rlm.js.map +1 -1
- package/dist/scripts/setup-claude-code.js +0 -0
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +31 -15
- package/dist/session.js.map +1 -1
- package/dist/synthesis/coordinator.d.ts.map +1 -1
- package/dist/synthesis/coordinator.js +15 -1
- package/dist/synthesis/coordinator.js.map +1 -1
- package/dist/treesitter/parser-registry.d.ts +1 -0
- package/dist/treesitter/parser-registry.d.ts.map +1 -1
- package/dist/treesitter/parser-registry.js +8 -4
- package/dist/treesitter/parser-registry.js.map +1 -1
- package/package.json +1 -1
package/dist/logic/bm25.js
CHANGED
|
@@ -43,7 +43,8 @@ export function buildBM25Index(lines) {
|
|
|
43
43
|
lineMap.set(lineNum, count);
|
|
44
44
|
}
|
|
45
45
|
}
|
|
46
|
-
|
|
46
|
+
let totalLength = 0;
|
|
47
|
+
docLengths.forEach(v => { totalLength += v; });
|
|
47
48
|
const avgDocLength = lines.length > 0 ? totalLength / lines.length : 0;
|
|
48
49
|
return {
|
|
49
50
|
termFreqs,
|
package/dist/logic/bm25.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bm25.js","sourceRoot":"","sources":["../../src/logic/bm25.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAqB3C,uEAAuE;AACvE,MAAM,YAAY,GAAe;IAC/B,EAAE,EAAE,GAAG;IACP,CAAC,EAAE,IAAI;CACR,CAAC;AAEF,uEAAuE;AACvE,MAAM,UAAU,QAAQ,CAAC,IAAY;IACnC,OAAO,IAAI;SACR,WAAW,EAAE;SACb,KAAK,CAAC,YAAY,CAAC;SACnB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,cAAc,CAC5B,KAAe;IAEf,MAAM,SAAS,GAAG,IAAI,GAAG,EAA+B,CAAC;IACzD,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE7C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY;QACnC,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAElC,uCAAuC;QACvC,MAAM,GAAG,GAAG,IAAI,GAAG,EAAkB,CAAC;QACtC,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACvB,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACpC,CAAC;QAED,UAAU,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAEvC,0BAA0B;QAC1B,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,GAAG,EAAE,CAAC;YAChC,IAAI,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAClC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;gBACpC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC/B,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,
|
|
1
|
+
{"version":3,"file":"bm25.js","sourceRoot":"","sources":["../../src/logic/bm25.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lc-parser.d.ts","sourceRoot":"","sources":["../../src/logic/lc-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EACV,MAAM,EAqBN,WAAW,EAEZ,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"lc-parser.d.ts","sourceRoot":"","sources":["../../src/logic/lc-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EACV,MAAM,EAqBN,WAAW,EAEZ,MAAM,YAAY,CAAC;AAi0BpB;;GAEG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAmDhD;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,EAAE,CAmDrD;AAUD,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAoEhD"}
|
package/dist/logic/lc-parser.js
CHANGED
|
@@ -305,7 +305,7 @@ function parseTerm(state, depth = 0) {
|
|
|
305
305
|
if (!tensor || tensor.type !== "tensor") {
|
|
306
306
|
return null;
|
|
307
307
|
}
|
|
308
|
-
const term = parseTerm(state);
|
|
308
|
+
const term = parseTerm(state, depth + 1);
|
|
309
309
|
if (!term)
|
|
310
310
|
return null;
|
|
311
311
|
return { tag: "constrained", constraint, term };
|
|
@@ -313,7 +313,7 @@ function parseTerm(state, depth = 0) {
|
|
|
313
313
|
// List: (op args...)
|
|
314
314
|
if (token.type === "lparen") {
|
|
315
315
|
consume(state); // (
|
|
316
|
-
const list = parseList(state);
|
|
316
|
+
const list = parseList(state, depth + 1);
|
|
317
317
|
const rparen = consume(state);
|
|
318
318
|
if (!rparen || rparen.type !== "rparen") {
|
|
319
319
|
return null;
|
|
@@ -346,7 +346,9 @@ function parseTerm(state, depth = 0) {
|
|
|
346
346
|
/**
|
|
347
347
|
* Parse list contents after opening paren
|
|
348
348
|
*/
|
|
349
|
-
function parseList(state) {
|
|
349
|
+
function parseList(state, depth = 0) {
|
|
350
|
+
if (depth > MAX_PARSE_DEPTH)
|
|
351
|
+
return null;
|
|
350
352
|
const first = peek(state);
|
|
351
353
|
if (!first)
|
|
352
354
|
return null;
|
|
@@ -356,26 +358,26 @@ function parseList(state) {
|
|
|
356
358
|
}
|
|
357
359
|
consume(state);
|
|
358
360
|
const op = first.value;
|
|
361
|
+
const d = depth + 1;
|
|
359
362
|
switch (op) {
|
|
360
363
|
case "input":
|
|
361
364
|
return { tag: "input" };
|
|
362
365
|
case "lit": {
|
|
363
|
-
const val = parseTerm(state);
|
|
366
|
+
const val = parseTerm(state, d);
|
|
364
367
|
if (!val || val.tag !== "lit")
|
|
365
368
|
return null;
|
|
366
369
|
return val;
|
|
367
370
|
}
|
|
368
371
|
case "grep": {
|
|
369
|
-
const pattern = parseTerm(state);
|
|
372
|
+
const pattern = parseTerm(state, d);
|
|
370
373
|
if (!pattern || pattern.tag !== "lit" || typeof pattern.value !== "string")
|
|
371
374
|
return null;
|
|
372
375
|
return { tag: "grep", pattern: pattern.value };
|
|
373
376
|
}
|
|
374
377
|
case "fuzzy_search": {
|
|
375
|
-
const query = parseTerm(state);
|
|
378
|
+
const query = parseTerm(state, d);
|
|
376
379
|
if (!query || query.tag !== "lit" || typeof query.value !== "string")
|
|
377
380
|
return null;
|
|
378
|
-
// Optional limit
|
|
379
381
|
const limitTerm = peek(state);
|
|
380
382
|
let limit;
|
|
381
383
|
if (limitTerm && limitTerm.type === "number") {
|
|
@@ -385,10 +387,9 @@ function parseList(state) {
|
|
|
385
387
|
return { tag: "fuzzy_search", query: query.value, limit };
|
|
386
388
|
}
|
|
387
389
|
case "bm25": {
|
|
388
|
-
const query = parseTerm(state);
|
|
390
|
+
const query = parseTerm(state, d);
|
|
389
391
|
if (!query || query.tag !== "lit" || typeof query.value !== "string")
|
|
390
392
|
return null;
|
|
391
|
-
// Optional limit
|
|
392
393
|
const limitTerm = peek(state);
|
|
393
394
|
let limit;
|
|
394
395
|
if (limitTerm && limitTerm.type === "number") {
|
|
@@ -398,11 +399,10 @@ function parseList(state) {
|
|
|
398
399
|
return { tag: "bm25", query: query.value, limit };
|
|
399
400
|
}
|
|
400
401
|
case "fuse": {
|
|
401
|
-
// (fuse <coll1> <coll2> [<coll3> ...]) — requires at least 2
|
|
402
402
|
const MAX_FUSE_ARGS = 10;
|
|
403
403
|
const collections = [];
|
|
404
404
|
while (peek(state) && peek(state)?.type !== "rparen" && collections.length < MAX_FUSE_ARGS) {
|
|
405
|
-
const coll = parseTerm(state);
|
|
405
|
+
const coll = parseTerm(state, d);
|
|
406
406
|
if (!coll)
|
|
407
407
|
break;
|
|
408
408
|
collections.push(coll);
|
|
@@ -412,22 +412,22 @@ function parseList(state) {
|
|
|
412
412
|
return { tag: "fuse", collections };
|
|
413
413
|
}
|
|
414
414
|
case "dampen": {
|
|
415
|
-
const collection = parseTerm(state);
|
|
415
|
+
const collection = parseTerm(state, d);
|
|
416
416
|
if (!collection)
|
|
417
417
|
return null;
|
|
418
|
-
const query = parseTerm(state);
|
|
418
|
+
const query = parseTerm(state, d);
|
|
419
419
|
if (!query || query.tag !== "lit" || typeof query.value !== "string")
|
|
420
420
|
return null;
|
|
421
421
|
return { tag: "dampen", collection, query: query.value };
|
|
422
422
|
}
|
|
423
423
|
case "rerank": {
|
|
424
|
-
const collection = parseTerm(state);
|
|
424
|
+
const collection = parseTerm(state, d);
|
|
425
425
|
if (!collection)
|
|
426
426
|
return null;
|
|
427
427
|
return { tag: "rerank", collection };
|
|
428
428
|
}
|
|
429
429
|
case "semantic": {
|
|
430
|
-
const query = parseTerm(state);
|
|
430
|
+
const query = parseTerm(state, d);
|
|
431
431
|
if (!query || query.tag !== "lit" || typeof query.value !== "string")
|
|
432
432
|
return null;
|
|
433
433
|
const limitTerm = peek(state);
|
|
@@ -442,75 +442,75 @@ function parseList(state) {
|
|
|
442
442
|
return { tag: "text_stats" };
|
|
443
443
|
}
|
|
444
444
|
case "lines": {
|
|
445
|
-
const startTerm = parseTerm(state);
|
|
445
|
+
const startTerm = parseTerm(state, d);
|
|
446
446
|
if (!startTerm || startTerm.tag !== "lit" || typeof startTerm.value !== "number") {
|
|
447
447
|
return null;
|
|
448
448
|
}
|
|
449
|
-
const endTerm = parseTerm(state);
|
|
449
|
+
const endTerm = parseTerm(state, d);
|
|
450
450
|
if (!endTerm || endTerm.tag !== "lit" || typeof endTerm.value !== "number") {
|
|
451
451
|
return null;
|
|
452
452
|
}
|
|
453
453
|
return { tag: "lines", start: startTerm.value, end: endTerm.value };
|
|
454
454
|
}
|
|
455
455
|
case "filter": {
|
|
456
|
-
const collection = parseTerm(state);
|
|
456
|
+
const collection = parseTerm(state, d);
|
|
457
457
|
if (!collection)
|
|
458
458
|
return null;
|
|
459
|
-
const predicate = parseTerm(state);
|
|
459
|
+
const predicate = parseTerm(state, d);
|
|
460
460
|
if (!predicate)
|
|
461
461
|
return null;
|
|
462
462
|
return { tag: "filter", collection, predicate };
|
|
463
463
|
}
|
|
464
464
|
case "map": {
|
|
465
|
-
const collection = parseTerm(state);
|
|
465
|
+
const collection = parseTerm(state, d);
|
|
466
466
|
if (!collection)
|
|
467
467
|
return null;
|
|
468
|
-
const transform = parseTerm(state);
|
|
468
|
+
const transform = parseTerm(state, d);
|
|
469
469
|
if (!transform)
|
|
470
470
|
return null;
|
|
471
471
|
return { tag: "map", collection, transform };
|
|
472
472
|
}
|
|
473
473
|
case "reduce": {
|
|
474
|
-
const collection = parseTerm(state);
|
|
474
|
+
const collection = parseTerm(state, d);
|
|
475
475
|
if (!collection)
|
|
476
476
|
return null;
|
|
477
|
-
const init = parseTerm(state);
|
|
477
|
+
const init = parseTerm(state, d);
|
|
478
478
|
if (!init)
|
|
479
479
|
return null;
|
|
480
|
-
const fn = parseTerm(state);
|
|
480
|
+
const fn = parseTerm(state, d);
|
|
481
481
|
if (!fn)
|
|
482
482
|
return null;
|
|
483
483
|
return { tag: "reduce", collection, init, fn };
|
|
484
484
|
}
|
|
485
485
|
case "sum": {
|
|
486
|
-
const collection = parseTerm(state);
|
|
486
|
+
const collection = parseTerm(state, d);
|
|
487
487
|
if (!collection)
|
|
488
488
|
return null;
|
|
489
489
|
return { tag: "sum", collection };
|
|
490
490
|
}
|
|
491
491
|
case "count": {
|
|
492
|
-
const collection = parseTerm(state);
|
|
492
|
+
const collection = parseTerm(state, d);
|
|
493
493
|
if (!collection)
|
|
494
494
|
return null;
|
|
495
495
|
return { tag: "count", collection };
|
|
496
496
|
}
|
|
497
497
|
case "add": {
|
|
498
|
-
const left = parseTerm(state);
|
|
498
|
+
const left = parseTerm(state, d);
|
|
499
499
|
if (!left)
|
|
500
500
|
return null;
|
|
501
|
-
const right = parseTerm(state);
|
|
501
|
+
const right = parseTerm(state, d);
|
|
502
502
|
if (!right)
|
|
503
503
|
return null;
|
|
504
504
|
return { tag: "add", left, right };
|
|
505
505
|
}
|
|
506
506
|
case "match": {
|
|
507
|
-
const str = parseTerm(state);
|
|
507
|
+
const str = parseTerm(state, d);
|
|
508
508
|
if (!str)
|
|
509
509
|
return null;
|
|
510
|
-
const pattern = parseTerm(state);
|
|
510
|
+
const pattern = parseTerm(state, d);
|
|
511
511
|
if (!pattern || pattern.tag !== "lit" || typeof pattern.value !== "string")
|
|
512
512
|
return null;
|
|
513
|
-
const group = parseTerm(state);
|
|
513
|
+
const group = parseTerm(state, d);
|
|
514
514
|
if (!group || group.tag !== "lit" || typeof group.value !== "number")
|
|
515
515
|
return null;
|
|
516
516
|
if (!Number.isSafeInteger(group.value) || group.value < 0 || group.value > 99)
|
|
@@ -518,46 +518,45 @@ function parseList(state) {
|
|
|
518
518
|
return { tag: "match", str, pattern: pattern.value, group: group.value };
|
|
519
519
|
}
|
|
520
520
|
case "replace": {
|
|
521
|
-
const str = parseTerm(state);
|
|
521
|
+
const str = parseTerm(state, d);
|
|
522
522
|
if (!str)
|
|
523
523
|
return null;
|
|
524
|
-
const from = parseTerm(state);
|
|
524
|
+
const from = parseTerm(state, d);
|
|
525
525
|
if (!from || from.tag !== "lit" || typeof from.value !== "string")
|
|
526
526
|
return null;
|
|
527
|
-
const to = parseTerm(state);
|
|
527
|
+
const to = parseTerm(state, d);
|
|
528
528
|
if (!to || to.tag !== "lit" || typeof to.value !== "string")
|
|
529
529
|
return null;
|
|
530
530
|
return { tag: "replace", str, from: from.value, to: to.value };
|
|
531
531
|
}
|
|
532
532
|
case "split": {
|
|
533
|
-
const str = parseTerm(state);
|
|
533
|
+
const str = parseTerm(state, d);
|
|
534
534
|
if (!str)
|
|
535
535
|
return null;
|
|
536
|
-
const delim = parseTerm(state);
|
|
536
|
+
const delim = parseTerm(state, d);
|
|
537
537
|
if (!delim || delim.tag !== "lit" || typeof delim.value !== "string")
|
|
538
538
|
return null;
|
|
539
|
-
const index = parseTerm(state);
|
|
539
|
+
const index = parseTerm(state, d);
|
|
540
540
|
if (!index || index.tag !== "lit" || typeof index.value !== "number" || !Number.isSafeInteger(index.value))
|
|
541
541
|
return null;
|
|
542
542
|
return { tag: "split", str, delim: delim.value, index: index.value };
|
|
543
543
|
}
|
|
544
544
|
case "parseInt": {
|
|
545
|
-
const str = parseTerm(state);
|
|
545
|
+
const str = parseTerm(state, d);
|
|
546
546
|
if (!str)
|
|
547
547
|
return null;
|
|
548
548
|
return { tag: "parseInt", str };
|
|
549
549
|
}
|
|
550
550
|
case "parseFloat": {
|
|
551
|
-
const str = parseTerm(state);
|
|
551
|
+
const str = parseTerm(state, d);
|
|
552
552
|
if (!str)
|
|
553
553
|
return null;
|
|
554
554
|
return { tag: "parseFloat", str };
|
|
555
555
|
}
|
|
556
556
|
case "parseDate": {
|
|
557
|
-
const str = parseTerm(state);
|
|
557
|
+
const str = parseTerm(state, d);
|
|
558
558
|
if (!str)
|
|
559
559
|
return null;
|
|
560
|
-
// Optional format hint
|
|
561
560
|
const formatTerm = peek(state);
|
|
562
561
|
let format;
|
|
563
562
|
if (formatTerm && formatTerm.type === "string") {
|
|
@@ -568,14 +567,14 @@ function parseList(state) {
|
|
|
568
567
|
return { tag: "parseDate", str, format, examples };
|
|
569
568
|
}
|
|
570
569
|
case "parseCurrency": {
|
|
571
|
-
const str = parseTerm(state);
|
|
570
|
+
const str = parseTerm(state, d);
|
|
572
571
|
if (!str)
|
|
573
572
|
return null;
|
|
574
573
|
const examples = parseExamplesKeyword(state);
|
|
575
574
|
return { tag: "parseCurrency", str, examples };
|
|
576
575
|
}
|
|
577
576
|
case "parseNumber": {
|
|
578
|
-
const str = parseTerm(state);
|
|
577
|
+
const str = parseTerm(state, d);
|
|
579
578
|
if (!str)
|
|
580
579
|
return null;
|
|
581
580
|
const examples = parseExamplesKeyword(state);
|
|
@@ -583,26 +582,25 @@ function parseList(state) {
|
|
|
583
582
|
}
|
|
584
583
|
case "coerce":
|
|
585
584
|
case "as": {
|
|
586
|
-
const term = parseTerm(state);
|
|
585
|
+
const term = parseTerm(state, d);
|
|
587
586
|
if (!term)
|
|
588
587
|
return null;
|
|
589
|
-
const typeTerm = parseTerm(state);
|
|
588
|
+
const typeTerm = parseTerm(state, d);
|
|
590
589
|
if (!typeTerm || typeTerm.tag !== "lit" || typeof typeTerm.value !== "string")
|
|
591
590
|
return null;
|
|
592
591
|
const targetType = typeTerm.value;
|
|
593
592
|
return { tag: "coerce", term, targetType };
|
|
594
593
|
}
|
|
595
594
|
case "extract": {
|
|
596
|
-
const str = parseTerm(state);
|
|
595
|
+
const str = parseTerm(state, d);
|
|
597
596
|
if (!str)
|
|
598
597
|
return null;
|
|
599
|
-
const pattern = parseTerm(state);
|
|
598
|
+
const pattern = parseTerm(state, d);
|
|
600
599
|
if (!pattern || pattern.tag !== "lit" || typeof pattern.value !== "string")
|
|
601
600
|
return null;
|
|
602
|
-
const group = parseTerm(state);
|
|
601
|
+
const group = parseTerm(state, d);
|
|
603
602
|
if (!group || group.tag !== "lit" || typeof group.value !== "number")
|
|
604
603
|
return null;
|
|
605
|
-
// Optional type hint (string or :type keyword)
|
|
606
604
|
let targetType;
|
|
607
605
|
const nextToken = peek(state);
|
|
608
606
|
if (nextToken && nextToken.type === "string") {
|
|
@@ -610,55 +608,48 @@ function parseList(state) {
|
|
|
610
608
|
targetType = nextToken.value;
|
|
611
609
|
}
|
|
612
610
|
else if (nextToken?.type === "keyword" && nextToken.value === "type") {
|
|
613
|
-
consume(state);
|
|
614
|
-
const typeVal = parseTerm(state);
|
|
611
|
+
consume(state);
|
|
612
|
+
const typeVal = parseTerm(state, d);
|
|
615
613
|
if (typeVal?.tag === "lit" && typeof typeVal.value === "string") {
|
|
616
614
|
targetType = typeVal.value;
|
|
617
615
|
}
|
|
618
616
|
}
|
|
619
|
-
// Optional :examples
|
|
620
617
|
const examples = parseExamplesKeyword(state);
|
|
621
|
-
// Optional :constraints
|
|
622
618
|
let constraints;
|
|
623
619
|
const constraintKw = peek(state);
|
|
624
620
|
if (constraintKw?.type === "keyword" && constraintKw.value === "constraints") {
|
|
625
|
-
consume(state);
|
|
621
|
+
consume(state);
|
|
626
622
|
constraints = parseConstraintObject(state) ?? undefined;
|
|
627
623
|
}
|
|
628
624
|
return { tag: "extract", str, pattern: pattern.value, group: group.value, targetType, examples, constraints };
|
|
629
625
|
}
|
|
630
626
|
case "synthesize": {
|
|
631
|
-
// Parse list of [input output] pairs
|
|
632
|
-
// Supports: (synthesize ("in" out) ...) or (synthesize (example "in" out) ...)
|
|
633
627
|
const MAX_SYNTH_EXAMPLES = 1000;
|
|
634
628
|
const examples = [];
|
|
635
629
|
while (peek(state) && peek(state)?.type !== "rparen" && examples.length < MAX_SYNTH_EXAMPLES) {
|
|
636
|
-
// Expect (input output) pair or [input output] or (example input output)
|
|
637
630
|
const pairStart = peek(state);
|
|
638
631
|
if (pairStart?.type === "lparen" || pairStart?.type === "lbracket") {
|
|
639
|
-
consume(state);
|
|
640
|
-
// Check for optional "example" keyword
|
|
632
|
+
consume(state);
|
|
641
633
|
const maybeExample = peek(state);
|
|
642
634
|
if (maybeExample?.type === "symbol" && maybeExample.value === "example") {
|
|
643
|
-
consume(state);
|
|
635
|
+
consume(state);
|
|
644
636
|
}
|
|
645
|
-
const input = parseTerm(state);
|
|
637
|
+
const input = parseTerm(state, d);
|
|
646
638
|
if (!input || input.tag !== "lit" || typeof input.value !== "string")
|
|
647
639
|
break;
|
|
648
|
-
const output = parseTerm(state);
|
|
640
|
+
const output = parseTerm(state, d);
|
|
649
641
|
if (!output || output.tag !== "lit")
|
|
650
642
|
break;
|
|
651
|
-
const pairEnd = consume(state);
|
|
643
|
+
const pairEnd = consume(state);
|
|
652
644
|
if (!pairEnd || (pairEnd.type !== "rparen" && pairEnd.type !== "rbracket"))
|
|
653
645
|
break;
|
|
654
646
|
examples.push({ input: input.value, output: output.value });
|
|
655
647
|
}
|
|
656
648
|
else {
|
|
657
|
-
|
|
658
|
-
const input = parseTerm(state);
|
|
649
|
+
const input = parseTerm(state, d);
|
|
659
650
|
if (!input || input.tag !== "lit" || typeof input.value !== "string")
|
|
660
651
|
break;
|
|
661
|
-
const output = parseTerm(state);
|
|
652
|
+
const output = parseTerm(state, d);
|
|
662
653
|
if (!output || output.tag !== "lit")
|
|
663
654
|
break;
|
|
664
655
|
examples.push({ input: input.value, output: output.value });
|
|
@@ -669,21 +660,19 @@ function parseList(state) {
|
|
|
669
660
|
return { tag: "synthesize", examples };
|
|
670
661
|
}
|
|
671
662
|
case "if": {
|
|
672
|
-
const cond = parseTerm(state);
|
|
663
|
+
const cond = parseTerm(state, d);
|
|
673
664
|
if (!cond)
|
|
674
665
|
return null;
|
|
675
|
-
const thenBranch = parseTerm(state);
|
|
666
|
+
const thenBranch = parseTerm(state, d);
|
|
676
667
|
if (!thenBranch)
|
|
677
668
|
return null;
|
|
678
|
-
const elseBranch = parseTerm(state);
|
|
669
|
+
const elseBranch = parseTerm(state, d);
|
|
679
670
|
if (!elseBranch)
|
|
680
671
|
return null;
|
|
681
672
|
return { tag: "if", cond, then: thenBranch, else: elseBranch };
|
|
682
673
|
}
|
|
683
674
|
case "classify": {
|
|
684
|
-
// Parse :examples keyword or pairs of (input output)
|
|
685
675
|
const examples = [];
|
|
686
|
-
// Check for :examples keyword
|
|
687
676
|
const maybeKeywordExamples = parseExamplesKeyword(state);
|
|
688
677
|
if (maybeKeywordExamples) {
|
|
689
678
|
for (const ex of maybeKeywordExamples) {
|
|
@@ -691,13 +680,12 @@ function parseList(state) {
|
|
|
691
680
|
}
|
|
692
681
|
}
|
|
693
682
|
else {
|
|
694
|
-
// Fallback to inline pairs
|
|
695
683
|
const MAX_CLASSIFY_EXAMPLES = 1000;
|
|
696
684
|
while (peek(state) && peek(state)?.type !== "rparen" && examples.length < MAX_CLASSIFY_EXAMPLES) {
|
|
697
|
-
const input = parseTerm(state);
|
|
685
|
+
const input = parseTerm(state, d);
|
|
698
686
|
if (!input || input.tag !== "lit" || typeof input.value !== "string")
|
|
699
687
|
break;
|
|
700
|
-
const output = parseTerm(state);
|
|
688
|
+
const output = parseTerm(state, d);
|
|
701
689
|
if (!output || output.tag !== "lit" || output.value === null)
|
|
702
690
|
break;
|
|
703
691
|
examples.push({ input: input.value, output: output.value });
|
|
@@ -713,14 +701,13 @@ function parseList(state) {
|
|
|
713
701
|
if (!param || param.type !== "symbol")
|
|
714
702
|
return null;
|
|
715
703
|
consume(state);
|
|
716
|
-
const body = parseTerm(state);
|
|
704
|
+
const body = parseTerm(state, d);
|
|
717
705
|
if (!body)
|
|
718
706
|
return null;
|
|
719
707
|
return { tag: "lambda", param: param.value, body };
|
|
720
708
|
}
|
|
721
709
|
case "define-fn": {
|
|
722
|
-
|
|
723
|
-
const nameTerm = parseTerm(state);
|
|
710
|
+
const nameTerm = parseTerm(state, d);
|
|
724
711
|
if (!nameTerm || nameTerm.tag !== "lit" || typeof nameTerm.value !== "string")
|
|
725
712
|
return null;
|
|
726
713
|
const examples = parseExamplesKeyword(state);
|
|
@@ -729,25 +716,22 @@ function parseList(state) {
|
|
|
729
716
|
return { tag: "define-fn", name: nameTerm.value, examples };
|
|
730
717
|
}
|
|
731
718
|
case "apply-fn": {
|
|
732
|
-
|
|
733
|
-
const nameTerm = parseTerm(state);
|
|
719
|
+
const nameTerm = parseTerm(state, d);
|
|
734
720
|
if (!nameTerm || nameTerm.tag !== "lit" || typeof nameTerm.value !== "string")
|
|
735
721
|
return null;
|
|
736
|
-
const arg = parseTerm(state);
|
|
722
|
+
const arg = parseTerm(state, d);
|
|
737
723
|
if (!arg)
|
|
738
724
|
return null;
|
|
739
725
|
return { tag: "apply-fn", name: nameTerm.value, arg };
|
|
740
726
|
}
|
|
741
727
|
case "predicate": {
|
|
742
|
-
|
|
743
|
-
const str = parseTerm(state);
|
|
728
|
+
const str = parseTerm(state, d);
|
|
744
729
|
if (!str)
|
|
745
730
|
return null;
|
|
746
731
|
const examples = parseExamplesKeyword(state);
|
|
747
732
|
return { tag: "predicate", str, examples };
|
|
748
733
|
}
|
|
749
734
|
case "list_symbols": {
|
|
750
|
-
// (list_symbols) or (list_symbols "kind")
|
|
751
735
|
const kindTerm = peek(state);
|
|
752
736
|
if (kindTerm && kindTerm.type === "string") {
|
|
753
737
|
consume(state);
|
|
@@ -756,15 +740,13 @@ function parseList(state) {
|
|
|
756
740
|
return { tag: "list_symbols" };
|
|
757
741
|
}
|
|
758
742
|
case "get_symbol_body": {
|
|
759
|
-
|
|
760
|
-
const symbol = parseTerm(state);
|
|
743
|
+
const symbol = parseTerm(state, d);
|
|
761
744
|
if (!symbol)
|
|
762
745
|
return null;
|
|
763
746
|
return { tag: "get_symbol_body", symbol };
|
|
764
747
|
}
|
|
765
748
|
case "find_references": {
|
|
766
|
-
|
|
767
|
-
const nameTerm = parseTerm(state);
|
|
749
|
+
const nameTerm = parseTerm(state, d);
|
|
768
750
|
if (!nameTerm || nameTerm.tag !== "lit" || typeof nameTerm.value !== "string") {
|
|
769
751
|
return null;
|
|
770
752
|
}
|
|
@@ -775,16 +757,14 @@ function parseList(state) {
|
|
|
775
757
|
case "ancestors":
|
|
776
758
|
case "descendants":
|
|
777
759
|
case "implementations": {
|
|
778
|
-
|
|
779
|
-
const graphNameTerm = parseTerm(state);
|
|
760
|
+
const graphNameTerm = parseTerm(state, d);
|
|
780
761
|
if (!graphNameTerm || graphNameTerm.tag !== "lit" || typeof graphNameTerm.value !== "string") {
|
|
781
762
|
return null;
|
|
782
763
|
}
|
|
783
764
|
return { tag: op, name: graphNameTerm.value };
|
|
784
765
|
}
|
|
785
766
|
case "dependents": {
|
|
786
|
-
|
|
787
|
-
const depNameTerm = parseTerm(state);
|
|
767
|
+
const depNameTerm = parseTerm(state, d);
|
|
788
768
|
if (!depNameTerm || depNameTerm.tag !== "lit" || typeof depNameTerm.value !== "string") {
|
|
789
769
|
return null;
|
|
790
770
|
}
|
|
@@ -796,8 +776,7 @@ function parseList(state) {
|
|
|
796
776
|
return { tag: "dependents", name: depNameTerm.value };
|
|
797
777
|
}
|
|
798
778
|
case "symbol_graph": {
|
|
799
|
-
|
|
800
|
-
const sgNameTerm = parseTerm(state);
|
|
779
|
+
const sgNameTerm = parseTerm(state, d);
|
|
801
780
|
if (!sgNameTerm || sgNameTerm.tag !== "lit" || typeof sgNameTerm.value !== "string") {
|
|
802
781
|
return null;
|
|
803
782
|
}
|
|
@@ -808,14 +787,14 @@ function parseList(state) {
|
|
|
808
787
|
}
|
|
809
788
|
return { tag: "symbol_graph", name: sgNameTerm.value };
|
|
810
789
|
}
|
|
811
|
-
default:
|
|
812
|
-
// Function application or variable
|
|
790
|
+
default: {
|
|
813
791
|
const fn = { tag: "var", name: op };
|
|
814
|
-
const arg = parseTerm(state);
|
|
792
|
+
const arg = parseTerm(state, d);
|
|
815
793
|
if (arg) {
|
|
816
794
|
return { tag: "app", fn, arg };
|
|
817
795
|
}
|
|
818
796
|
return fn;
|
|
797
|
+
}
|
|
819
798
|
}
|
|
820
799
|
}
|
|
821
800
|
/**
|
|
@@ -902,12 +881,12 @@ export function parseAll(input) {
|
|
|
902
881
|
}
|
|
903
882
|
if (inString)
|
|
904
883
|
continue;
|
|
905
|
-
if (ch === "(") {
|
|
884
|
+
if (ch === "(" || ch === "[" || ch === "{") {
|
|
906
885
|
if (depth === 0)
|
|
907
886
|
start = i;
|
|
908
887
|
depth++;
|
|
909
888
|
}
|
|
910
|
-
else if (ch === ")") {
|
|
889
|
+
else if (ch === ")" || ch === "]" || ch === "}") {
|
|
911
890
|
depth--;
|
|
912
891
|
if (depth === 0 && start >= 0) {
|
|
913
892
|
const expr = trimmed.slice(start, i + 1);
|