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.
Files changed (72) hide show
  1. package/dist/engine/nucleus-engine.d.ts +1 -0
  2. package/dist/engine/nucleus-engine.d.ts.map +1 -1
  3. package/dist/engine/nucleus-engine.js +41 -14
  4. package/dist/engine/nucleus-engine.js.map +1 -1
  5. package/dist/fsm/rlm-states.d.ts.map +1 -1
  6. package/dist/fsm/rlm-states.js +36 -6
  7. package/dist/fsm/rlm-states.js.map +1 -1
  8. package/dist/graph/relationship-analyzer.d.ts.map +1 -1
  9. package/dist/graph/relationship-analyzer.js +44 -16
  10. package/dist/graph/relationship-analyzer.js.map +1 -1
  11. package/dist/llm/glm.d.ts +3 -0
  12. package/dist/llm/glm.d.ts.map +1 -0
  13. package/dist/llm/glm.js +52 -0
  14. package/dist/llm/glm.js.map +1 -0
  15. package/dist/llm/index.d.ts +1 -0
  16. package/dist/llm/index.d.ts.map +1 -1
  17. package/dist/llm/index.js +3 -0
  18. package/dist/llm/index.js.map +1 -1
  19. package/dist/logic/bm25.d.ts.map +1 -1
  20. package/dist/logic/bm25.js +2 -1
  21. package/dist/logic/bm25.js.map +1 -1
  22. package/dist/logic/lc-parser.d.ts.map +1 -1
  23. package/dist/logic/lc-parser.js +77 -98
  24. package/dist/logic/lc-parser.js.map +1 -1
  25. package/dist/logic/lc-solver.d.ts.map +1 -1
  26. package/dist/logic/lc-solver.js +34 -26
  27. package/dist/logic/lc-solver.js.map +1 -1
  28. package/dist/logic/qvalue.d.ts +3 -0
  29. package/dist/logic/qvalue.d.ts.map +1 -1
  30. package/dist/logic/qvalue.js +13 -0
  31. package/dist/logic/qvalue.js.map +1 -1
  32. package/dist/logic/semantic.d.ts +1 -0
  33. package/dist/logic/semantic.d.ts.map +1 -1
  34. package/dist/logic/semantic.js +10 -4
  35. package/dist/logic/semantic.js.map +1 -1
  36. package/dist/logic/type-inference.d.ts.map +1 -1
  37. package/dist/logic/type-inference.js +43 -1
  38. package/dist/logic/type-inference.js.map +1 -1
  39. package/dist/persistence/fts5-search.d.ts +1 -0
  40. package/dist/persistence/fts5-search.d.ts.map +1 -1
  41. package/dist/persistence/fts5-search.js +3 -24
  42. package/dist/persistence/fts5-search.js.map +1 -1
  43. package/dist/persistence/handle-ops.d.ts +2 -2
  44. package/dist/persistence/handle-ops.d.ts.map +1 -1
  45. package/dist/persistence/handle-ops.js +65 -38
  46. package/dist/persistence/handle-ops.js.map +1 -1
  47. package/dist/persistence/handle-registry.d.ts +2 -1
  48. package/dist/persistence/handle-registry.d.ts.map +1 -1
  49. package/dist/persistence/handle-registry.js +31 -27
  50. package/dist/persistence/handle-registry.js.map +1 -1
  51. package/dist/persistence/session-db.d.ts +12 -0
  52. package/dist/persistence/session-db.d.ts.map +1 -1
  53. package/dist/persistence/session-db.js +45 -0
  54. package/dist/persistence/session-db.js.map +1 -1
  55. package/dist/rag/similarity.d.ts.map +1 -1
  56. package/dist/rag/similarity.js +15 -4
  57. package/dist/rag/similarity.js.map +1 -1
  58. package/dist/rlm.d.ts.map +1 -1
  59. package/dist/rlm.js +20 -7
  60. package/dist/rlm.js.map +1 -1
  61. package/dist/scripts/setup-claude-code.js +0 -0
  62. package/dist/session.d.ts.map +1 -1
  63. package/dist/session.js +31 -15
  64. package/dist/session.js.map +1 -1
  65. package/dist/synthesis/coordinator.d.ts.map +1 -1
  66. package/dist/synthesis/coordinator.js +15 -1
  67. package/dist/synthesis/coordinator.js.map +1 -1
  68. package/dist/treesitter/parser-registry.d.ts +1 -0
  69. package/dist/treesitter/parser-registry.d.ts.map +1 -1
  70. package/dist/treesitter/parser-registry.js +8 -4
  71. package/dist/treesitter/parser-registry.js.map +1 -1
  72. package/package.json +1 -1
@@ -43,7 +43,8 @@ export function buildBM25Index(lines) {
43
43
  lineMap.set(lineNum, count);
44
44
  }
45
45
  }
46
- const totalLength = Array.from(docLengths.values()).reduce((a, b) => a + b, 0);
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,
@@ -1 +1 @@
1
- {"version":3,"file":"bm25.js","sourceRoot":"","sources":["../../src/logic/bm25.ts"],"names":[],"mappings":"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"}
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;AA01BpB;;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"}
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"}
@@ -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); // :type
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); // :constraints
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); // ( or [
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); // skip "example" keyword
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); // ) or ]
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
- // Also support flat pairs: "input1" output1 "input2" output2
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
- // (define-fn "name" :examples [...])
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
- // (apply-fn "name" arg)
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
- // (predicate term :examples [...])
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
- // (get_symbol_body <symbol>)
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
- // (find_references "name")
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
- // (callers "name"), (callees "name"), etc.
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
- // (dependents "name" [depth])
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
- // (symbol_graph "name" [depth])
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);