@vibgrate/cli 2026.731.3 → 2026.801.1

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 (80) hide show
  1. package/dist/{agent-6XOI7RVW.js → agent-4DAECASW.js} +8 -8
  2. package/dist/{agent-6XOI7RVW.js.map → agent-4DAECASW.js.map} +1 -1
  3. package/dist/{baseline-PY6TETA5.js → baseline-4BDH4F2W.js} +3 -3
  4. package/dist/{baseline-PY6TETA5.js.map → baseline-4BDH4F2W.js.map} +1 -1
  5. package/dist/{chunk-X634FZVG.js → chunk-3LOWJSAF.js} +11 -16
  6. package/dist/{chunk-X634FZVG.js.map → chunk-3LOWJSAF.js.map} +1 -1
  7. package/dist/{chunk-AVCBKQKA.js → chunk-76TDXGGF.js} +3 -3
  8. package/dist/{chunk-AVCBKQKA.js.map → chunk-76TDXGGF.js.map} +1 -1
  9. package/dist/{chunk-RIWLXMMT.js → chunk-7PVCHLR2.js} +4 -4
  10. package/dist/{chunk-RIWLXMMT.js.map → chunk-7PVCHLR2.js.map} +1 -1
  11. package/dist/{chunk-RGEVBSLK.js → chunk-A43I2AJ4.js} +3 -3
  12. package/dist/{chunk-RGEVBSLK.js.map → chunk-A43I2AJ4.js.map} +1 -1
  13. package/dist/{chunk-Z7VH4RPO.js → chunk-B3OMGYZZ.js} +3 -3
  14. package/dist/{chunk-Z7VH4RPO.js.map → chunk-B3OMGYZZ.js.map} +1 -1
  15. package/dist/{chunk-B6S2DSBS.js → chunk-BNEHDLVZ.js} +8 -8
  16. package/dist/{chunk-B6S2DSBS.js.map → chunk-BNEHDLVZ.js.map} +1 -1
  17. package/dist/{chunk-PHGAUWWF.js → chunk-E6H2F2XF.js} +3 -3
  18. package/dist/{chunk-PHGAUWWF.js.map → chunk-E6H2F2XF.js.map} +1 -1
  19. package/dist/{chunk-TRKRRX2S.js → chunk-G25STLE7.js} +7 -5
  20. package/dist/chunk-G25STLE7.js.map +1 -0
  21. package/dist/{chunk-SCTLOFNH.js → chunk-G7W4MFPZ.js} +4 -4
  22. package/dist/{chunk-SCTLOFNH.js.map → chunk-G7W4MFPZ.js.map} +1 -1
  23. package/dist/{chunk-FHJBGPJZ.js → chunk-I6RBAIS3.js} +3 -3
  24. package/dist/{chunk-FHJBGPJZ.js.map → chunk-I6RBAIS3.js.map} +1 -1
  25. package/dist/{chunk-3VSU7G75.js → chunk-IRCYOTRG.js} +7 -7
  26. package/dist/{chunk-3VSU7G75.js.map → chunk-IRCYOTRG.js.map} +1 -1
  27. package/dist/{chunk-EVLS2M5G.js → chunk-JFE7XCAE.js} +3 -3
  28. package/dist/{chunk-EVLS2M5G.js.map → chunk-JFE7XCAE.js.map} +1 -1
  29. package/dist/{chunk-BMUTNUB7.js → chunk-JLWI2JGA.js} +4 -4
  30. package/dist/{chunk-BMUTNUB7.js.map → chunk-JLWI2JGA.js.map} +1 -1
  31. package/dist/{chunk-5IA2TA57.js → chunk-KL65SSR7.js} +7 -7
  32. package/dist/{chunk-5IA2TA57.js.map → chunk-KL65SSR7.js.map} +1 -1
  33. package/dist/{chunk-US2DAKCM.js → chunk-MPP4S4OE.js} +4 -4
  34. package/dist/{chunk-US2DAKCM.js.map → chunk-MPP4S4OE.js.map} +1 -1
  35. package/dist/{chunk-EETK7S43.js → chunk-SDG242R4.js} +399 -23
  36. package/dist/chunk-SDG242R4.js.map +1 -0
  37. package/dist/{chunk-MOLBANFB.js → chunk-T6DRYOMT.js} +3 -3
  38. package/dist/{chunk-MOLBANFB.js.map → chunk-T6DRYOMT.js.map} +1 -1
  39. package/dist/chunk-TGDHOAXX.js +6 -0
  40. package/dist/{chunk-DEKGSQHL.js.map → chunk-TGDHOAXX.js.map} +1 -1
  41. package/dist/{chunk-WK52LWRX.js → chunk-V2QK3IUY.js} +5 -5
  42. package/dist/{chunk-WK52LWRX.js.map → chunk-V2QK3IUY.js.map} +1 -1
  43. package/dist/{chunk-5XIEVZLW.js → chunk-V3X3DBZL.js} +5 -5
  44. package/dist/{chunk-5XIEVZLW.js.map → chunk-V3X3DBZL.js.map} +1 -1
  45. package/dist/{chunk-KLO2XBUX.js → chunk-WIDZ5IE7.js} +4 -4
  46. package/dist/{chunk-KLO2XBUX.js.map → chunk-WIDZ5IE7.js.map} +1 -1
  47. package/dist/{chunk-LTTVCI5C.js → chunk-XEJJGDGX.js} +7 -7
  48. package/dist/{chunk-LTTVCI5C.js.map → chunk-XEJJGDGX.js.map} +1 -1
  49. package/dist/cli.js +41 -41
  50. package/dist/{ensure-map-UQL7SM34.js → ensure-map-SMWHKOUY.js} +11 -11
  51. package/dist/{ensure-map-UQL7SM34.js.map → ensure-map-SMWHKOUY.js.map} +1 -1
  52. package/dist/{graph-backend-G5Y6QQV4.js → graph-backend-I4I72J4W.js} +4 -4
  53. package/dist/{graph-backend-G5Y6QQV4.js.map → graph-backend-I4I72J4W.js.map} +1 -1
  54. package/dist/index.d.ts +11 -4
  55. package/dist/index.js +10 -10
  56. package/dist/{interactive-QWT7ERXJ.js → interactive-TMQR6TXM.js} +22 -22
  57. package/dist/{interactive-QWT7ERXJ.js.map → interactive-TMQR6TXM.js.map} +1 -1
  58. package/dist/{llm-host-DZBD5D36.js → llm-host-XFYFOAAX.js} +4 -4
  59. package/dist/{llm-host-DZBD5D36.js.map → llm-host-XFYFOAAX.js.map} +1 -1
  60. package/dist/load-E3OTM7BS.js +10 -0
  61. package/dist/{load-WA53B3GW.js.map → load-E3OTM7BS.js.map} +1 -1
  62. package/dist/{run-outcome-J2IDIVYI.js → run-outcome-QWLNBASF.js} +5 -5
  63. package/dist/{run-outcome-J2IDIVYI.js.map → run-outcome-QWLNBASF.js.map} +1 -1
  64. package/dist/runtime-session-UQ7UVAPL.js +20 -0
  65. package/dist/{runtime-session-52P2Y5LX.js.map → runtime-session-UQ7UVAPL.js.map} +1 -1
  66. package/dist/{session-L7SJNE55.js → session-MG6BJVAG.js} +6 -6
  67. package/dist/{session-L7SJNE55.js.map → session-MG6BJVAG.js.map} +1 -1
  68. package/dist/{stream-json-TSGYC2MQ.js → stream-json-GM44SP7L.js} +8 -8
  69. package/dist/{stream-json-TSGYC2MQ.js.map → stream-json-GM44SP7L.js.map} +1 -1
  70. package/dist/{vg-mcp-bridge-IFAXEQMZ.js → vg-mcp-bridge-3WFC7LGE.js} +6 -6
  71. package/dist/{vg-mcp-bridge-IFAXEQMZ.js.map → vg-mcp-bridge-3WFC7LGE.js.map} +1 -1
  72. package/dist/{vgd-PNR7UKLL.js → vgd-ZUSBEVUL.js} +8 -8
  73. package/dist/vgd-ZUSBEVUL.js.map +1 -0
  74. package/package.json +4 -2
  75. package/dist/chunk-DEKGSQHL.js +0 -6
  76. package/dist/chunk-EETK7S43.js.map +0 -1
  77. package/dist/chunk-TRKRRX2S.js.map +0 -1
  78. package/dist/load-WA53B3GW.js +0 -10
  79. package/dist/runtime-session-52P2Y5LX.js +0 -20
  80. package/dist/vgd-PNR7UKLL.js.map +0 -1
@@ -436,6 +436,350 @@ function safe(id) {
436
436
  return id.replace(/[^a-z0-9.-]+/gi, "_");
437
437
  }
438
438
 
439
+ // src/engine/concepts.ts
440
+ var WEAK_TERMS = /* @__PURE__ */ new Set([
441
+ "add",
442
+ "adds",
443
+ "added",
444
+ "adding",
445
+ "create",
446
+ "creates",
447
+ "created",
448
+ "creating",
449
+ "make",
450
+ "makes",
451
+ "making",
452
+ "made",
453
+ "new",
454
+ "newly",
455
+ "remove",
456
+ "removes",
457
+ "removed",
458
+ "removing",
459
+ "delete",
460
+ "deletes",
461
+ "deleted",
462
+ "deleting",
463
+ "update",
464
+ "updates",
465
+ "updated",
466
+ "updating",
467
+ "change",
468
+ "changes",
469
+ "changed",
470
+ "changing",
471
+ "set",
472
+ "sets",
473
+ "setting",
474
+ "setup",
475
+ "get",
476
+ "gets",
477
+ "getting",
478
+ "use",
479
+ "uses",
480
+ "used",
481
+ "using",
482
+ "want",
483
+ "wants",
484
+ "wanted",
485
+ "do",
486
+ "does",
487
+ "doing",
488
+ "done",
489
+ "support",
490
+ "supports",
491
+ "supported",
492
+ "supporting",
493
+ "enable",
494
+ "enables",
495
+ "enabled",
496
+ "enabling",
497
+ "disable",
498
+ "disables",
499
+ "disabled",
500
+ "disabling",
501
+ "allow",
502
+ "allows",
503
+ "allowed",
504
+ "implement",
505
+ "implements",
506
+ "implemented",
507
+ "implementing",
508
+ "build",
509
+ "builds",
510
+ "building",
511
+ "built",
512
+ "via",
513
+ "through",
514
+ "into",
515
+ "onto",
516
+ "way",
517
+ "ways",
518
+ "thing",
519
+ "things",
520
+ "stuff",
521
+ "feature",
522
+ "features",
523
+ "functionality",
524
+ "method",
525
+ "methods",
526
+ "option",
527
+ "options",
528
+ "ability",
529
+ "help",
530
+ "start",
531
+ "begin",
532
+ "work",
533
+ "works",
534
+ "working",
535
+ "also",
536
+ "currently",
537
+ "properly",
538
+ "correctly",
539
+ "please",
540
+ "happens",
541
+ "happen",
542
+ "something",
543
+ "somewhere",
544
+ "step",
545
+ "steps",
546
+ "flow",
547
+ "process",
548
+ "you",
549
+ "can"
550
+ ]);
551
+ var CONCEPTS = {
552
+ // ---- payments / billing ----
553
+ payment: ["stripe", "billing", "invoice", "checkout", "charge", "subscription", "refund", "payout", "card", "debit", "mandate"],
554
+ pay: ["payment", "stripe", "charge", "billing", "invoice"],
555
+ paid: ["payment", "invoice", "charge"],
556
+ billing: ["invoice", "payment", "subscription", "stripe", "charge", "renewal"],
557
+ checkout: ["stripe", "payment", "cart", "session"],
558
+ debit: ["mandate", "sepa", "bacs", "ach", "bank", "payment"],
559
+ mandate: ["sepa", "bacs", "debit"],
560
+ sepa: ["mandate", "debit", "iban", "bank"],
561
+ bacs: ["mandate", "debit", "bank"],
562
+ ach: ["mandate", "debit", "bank"],
563
+ stripe: ["payment", "billing", "checkout", "webhook", "charge", "card"],
564
+ refund: ["payment", "invoice", "stripe", "charge"],
565
+ invoice: ["billing", "payment", "refund", "subscription"],
566
+ subscription: ["billing", "renewal", "invoice", "plan", "recurring"],
567
+ recurring: ["subscription", "renewal", "mandate", "debit"],
568
+ renewal: ["subscription", "billing", "renew"],
569
+ card: ["payment", "charge", "stripe"],
570
+ credit: ["card", "payment", "charge"],
571
+ bank: ["debit", "mandate", "sepa", "iban", "account"],
572
+ charge: ["payment", "card", "stripe"],
573
+ webhook: ["event", "handler", "callback"],
574
+ price: ["payment", "billing", "plan"],
575
+ customer: ["billing", "account", "user"],
576
+ // ---- auth ----
577
+ auth: ["login", "session", "token", "oauth", "password", "credential"],
578
+ authentication: ["auth", "login", "session", "token", "password"],
579
+ authenticated: ["auth", "login", "session"],
580
+ login: ["auth", "session", "password", "signin", "oauth"],
581
+ signin: ["login", "auth", "session"],
582
+ signup: ["register", "onboard", "account"],
583
+ logout: ["session", "auth", "signout"],
584
+ password: ["auth", "login", "credential", "hash"],
585
+ session: ["auth", "login", "token"],
586
+ token: ["session", "auth", "jwt"],
587
+ oauth: ["auth", "login", "callback", "provider"],
588
+ google: ["oauth", "login", "auth"],
589
+ github: ["oauth", "login", "auth"],
590
+ sso: ["oauth", "auth", "saml", "login"],
591
+ credential: ["auth", "password", "token", "secret"],
592
+ // ---- dependencies / supply chain ----
593
+ dependency: ["package", "audit", "vulnerability", "advisory", "lockfile", "version"],
594
+ package: ["dependency", "audit", "vulnerability", "advisory", "lockfile"],
595
+ vulnerability: ["advisory", "cve", "osv", "audit", "vulnerable"],
596
+ vulnerable: ["vulnerability", "advisory", "audit", "cve"],
597
+ advisory: ["vulnerability", "cve", "osv", "audit"],
598
+ cve: ["vulnerability", "advisory", "osv"],
599
+ risk: ["vulnerability", "audit", "advisory"],
600
+ security: ["vulnerability", "audit", "advisory"],
601
+ audit: ["dependency", "vulnerability", "advisory"],
602
+ scan: ["audit", "vulnerability", "scanner"],
603
+ // ---- notifications / messaging ----
604
+ email: ["mail", "smtp", "sender", "template", "message"],
605
+ mail: ["email", "smtp", "sender"],
606
+ notification: ["notify", "email", "sms", "push", "alert"],
607
+ notify: ["notification", "email", "alert"],
608
+ sms: ["notification", "message", "twilio"],
609
+ // ---- e-commerce ----
610
+ cart: ["checkout", "order", "shop", "basket", "discount"],
611
+ basket: ["cart", "checkout", "order"],
612
+ order: ["cart", "shipment", "fulfillment", "shop", "checkout"],
613
+ ship: ["order", "fulfillment", "delivery", "shipment"],
614
+ shipment: ["order", "fulfillment", "delivery", "track"],
615
+ shipping: ["order", "fulfillment", "delivery", "shipment"],
616
+ shipped: ["order", "fulfillment", "shipment"],
617
+ inventory: ["stock", "product", "catalog", "restock"],
618
+ stock: ["inventory", "product", "restock"],
619
+ product: ["catalog", "inventory", "shop"],
620
+ discount: ["coupon", "promo", "cart", "price"],
621
+ coupon: ["discount", "promo", "code"],
622
+ // ---- chat / social ----
623
+ chat: ["message", "room", "conversation", "presence"],
624
+ message: ["chat", "sms", "notification", "thread"],
625
+ conversation: ["chat", "message", "thread"],
626
+ presence: ["online", "typing", "status"],
627
+ online: ["presence", "status"],
628
+ typing: ["presence", "indicator", "broadcast"],
629
+ // ---- media / streaming ----
630
+ video: ["media", "transcode", "playback", "stream", "thumbnail"],
631
+ stream: ["video", "playback", "manifest", "media"],
632
+ streaming: ["video", "playback", "manifest", "media"],
633
+ playback: ["video", "stream", "media", "watch"],
634
+ transcode: ["video", "media", "encode"],
635
+ thumbnail: ["video", "image", "media"],
636
+ media: ["video", "stream", "playback", "asset"],
637
+ // ---- analytics ----
638
+ analytics: ["event", "track", "metric", "funnel", "report"],
639
+ event: ["track", "analytics", "webhook"],
640
+ track: ["event", "analytics"],
641
+ funnel: ["conversion", "analytics", "event"],
642
+ conversion: ["funnel", "analytics"],
643
+ report: ["metrics", "export", "analytics"],
644
+ // ---- content / CMS ----
645
+ article: ["publish", "content", "post", "cms"],
646
+ publish: ["article", "release", "post", "content"],
647
+ post: ["article", "publish", "message"],
648
+ blog: ["article", "publish", "post", "cms"],
649
+ content: ["cms", "article", "markdown"],
650
+ markdown: ["render", "article", "content"],
651
+ cms: ["article", "content", "publish"],
652
+ // ---- CI / deployment ----
653
+ deploy: ["release", "rollback", "pipeline", "deployment"],
654
+ deployment: ["deploy", "release", "rollback", "pipeline"],
655
+ release: ["deploy", "version", "rollback"],
656
+ rollback: ["deploy", "release", "deployment"],
657
+ pipeline: ["stage", "deploy", "runner", "ci"],
658
+ canary: ["deploy", "rollout", "release"],
659
+ // ---- mobile ----
660
+ push: ["notification", "device", "token", "mobile"],
661
+ device: ["push", "token", "mobile", "register"],
662
+ deeplink: ["link", "route", "universal"],
663
+ mobile: ["push", "device", "deeplink", "app"],
664
+ ios: ["mobile", "universal", "link", "app"],
665
+ android: ["mobile", "push", "device", "app"],
666
+ // ---- batch / ETL / mainframe ----
667
+ batch: ["settlement", "job", "etl", "reconcile"],
668
+ settlement: ["batch", "reconcile", "ledger", "clearing"],
669
+ reconcile: ["ledger", "settlement", "batch"],
670
+ ledger: ["settlement", "reconcile", "balance", "journal"],
671
+ mainframe: ["batch", "settlement", "ebcdic", "cobol", "fixed"],
672
+ ebcdic: ["mainframe", "record", "convert", "legacy"],
673
+ cobol: ["mainframe", "batch", "ebcdic"],
674
+ etl: ["batch", "pipeline", "extract", "load", "transform"],
675
+ nightly: ["batch", "cron", "schedule", "job"],
676
+ // ---- geo / maps ----
677
+ geocode: ["address", "location", "map", "geo"],
678
+ address: ["geocode", "location"],
679
+ map: ["geo", "route", "location"],
680
+ route: ["distance", "path", "planner", "geo"],
681
+ distance: ["route", "haversine", "geo"],
682
+ location: ["geo", "geocode", "map"],
683
+ arrival: ["route", "eta", "estimate"],
684
+ // ---- i18n ----
685
+ translation: ["locale", "i18n", "language", "translate"],
686
+ translate: ["translation", "locale", "language"],
687
+ locale: ["translation", "i18n", "language", "format"],
688
+ i18n: ["translation", "locale", "language"],
689
+ language: ["locale", "translation", "i18n"],
690
+ localized: ["locale", "translation", "format"],
691
+ // ---- observability ----
692
+ metric: ["counter", "prometheus", "telemetry", "export"],
693
+ prometheus: ["metric", "exporter", "monitoring"],
694
+ trace: ["span", "telemetry", "observability"],
695
+ span: ["trace", "telemetry"],
696
+ monitoring: ["metric", "trace", "alert", "observability"],
697
+ telemetry: ["metric", "trace", "span"],
698
+ counter: ["metric", "increment"],
699
+ // ---- feature flags / experimentation ----
700
+ flag: ["feature", "rollout", "toggle", "experiment"],
701
+ rollout: ["flag", "percentage", "release", "experiment"],
702
+ toggle: ["flag", "feature", "switch"],
703
+ experiment: ["variant", "assign", "flag", "exposure"],
704
+ variant: ["experiment", "assign"],
705
+ // ---- generic infrastructure ----
706
+ database: ["schema", "migration", "sql", "query", "orm"],
707
+ db: ["database", "schema", "migration", "sql"],
708
+ migration: ["database", "schema", "migrate", "sql"],
709
+ cache: ["redis", "ttl", "store"],
710
+ queue: ["job", "worker", "task", "batch"],
711
+ job: ["queue", "worker", "cron"],
712
+ upload: ["file", "storage", "blob", "asset"],
713
+ storage: ["file", "upload", "bucket", "blob"],
714
+ permission: ["role", "rbac", "acl", "access", "grant"],
715
+ role: ["permission", "rbac", "access"],
716
+ error: ["exception", "failure", "handler"],
717
+ config: ["settings", "env", "configuration"]
718
+ };
719
+ var BIGRAM_CONCEPTS = {
720
+ "direct debit": ["debit", "mandate", "sepa", "bacs", "bank"],
721
+ "direct debits": ["debit", "mandate", "sepa", "bacs", "bank"],
722
+ "sign in": ["login", "signin", "auth", "session"],
723
+ "signs in": ["login", "signin", "auth", "session"],
724
+ "log in": ["login", "auth", "session"],
725
+ "logs in": ["login", "auth", "session"],
726
+ "logged in": ["login", "auth", "session"],
727
+ "sign up": ["signup", "register", "account"],
728
+ "credit card": ["card", "payment", "charge", "stripe"],
729
+ "credit cards": ["card", "payment", "charge", "stripe"],
730
+ "bank transfer": ["bank", "payment", "sepa", "transfer"],
731
+ "rate limit": ["ratelimit", "throttle", "quota"],
732
+ "two factor": ["totp", "mfa", "otp", "auth"],
733
+ "payment method": ["payment", "stripe", "card", "debit"],
734
+ "payment methods": ["payment", "stripe", "card", "debit"],
735
+ "push notification": ["push", "device", "token", "notification"],
736
+ "push notifications": ["push", "device", "token", "notification"],
737
+ "deep link": ["deeplink", "link", "route"],
738
+ "deep links": ["deeplink", "link", "route"],
739
+ "universal link": ["deeplink", "link", "universal"],
740
+ "universal links": ["deeplink", "link", "universal"],
741
+ "feature flag": ["flag", "rollout", "toggle", "experiment"],
742
+ "feature flags": ["flag", "rollout", "toggle", "experiment"],
743
+ "shopping cart": ["cart", "checkout", "order"],
744
+ "roll back": ["rollback", "deploy", "release"],
745
+ "rolled back": ["rollback", "deploy", "release"],
746
+ "ab test": ["experiment", "variant"],
747
+ "sign out": ["logout", "session", "auth"],
748
+ "fixed width": ["record", "export", "mainframe", "batch"]
749
+ };
750
+ function lexiconKey(token) {
751
+ if (token in CONCEPTS) return token;
752
+ if (token.endsWith("ies")) {
753
+ const singular = token.slice(0, -3) + "y";
754
+ if (singular in CONCEPTS) return singular;
755
+ }
756
+ if (token.endsWith("s")) {
757
+ const singular = token.slice(0, -1);
758
+ if (singular in CONCEPTS) return singular;
759
+ }
760
+ return null;
761
+ }
762
+ function expandConcepts(orderedTokens) {
763
+ const present = new Set(orderedTokens);
764
+ const out = [];
765
+ const emitted = /* @__PURE__ */ new Set();
766
+ const emit = (term, from) => {
767
+ if (present.has(term) || emitted.has(term)) return;
768
+ emitted.add(term);
769
+ out.push({ term, from });
770
+ };
771
+ for (let i = 0; i + 1 < orderedTokens.length; i++) {
772
+ const bigram = `${orderedTokens[i]} ${orderedTokens[i + 1]}`;
773
+ const terms = BIGRAM_CONCEPTS[bigram];
774
+ if (terms) for (const t of terms) emit(t, bigram);
775
+ }
776
+ for (const token of orderedTokens) {
777
+ const key = lexiconKey(token);
778
+ if (key) for (const t of CONCEPTS[key]) emit(t, token);
779
+ }
780
+ return out;
781
+ }
782
+
439
783
  // src/engine/query.ts
440
784
  var STOPWORDS = /* @__PURE__ */ new Set([
441
785
  "the",
@@ -587,14 +931,14 @@ function queryGraph(graph, question, options = {}) {
587
931
  const limit = options.limit ?? 12;
588
932
  const literals = extractLiteralNeedles(question);
589
933
  const forTokens = literals.length > 0 ? stripLiteralNeedles(question) : question;
590
- const terms = tokenize(forTokens);
591
- const weightOf = termWeights(graph, terms);
934
+ const prep = prepareTerms(forTokens);
935
+ const weightOf = termWeights(graph, prep.terms.map((t) => t.term));
592
936
  const index = indexFor(graph);
593
937
  const scored = [];
594
- if (terms.length > 0) {
938
+ if (prep.hasContent) {
595
939
  for (const node of graph.nodes) {
596
940
  if (node.kind === "file" || node.kind === "external") continue;
597
- const { score, why } = scoreNode(node, terms, weightOf);
941
+ const { score, why } = scoreNode(node, prep.terms, weightOf);
598
942
  if (score > 0) scored.push({ node, score: round(score * (1 + IMPORTANCE_WEIGHT * node.importance)), why });
599
943
  }
600
944
  scored.sort((a, b) => b.score - a.score || a.node.qualifiedName.localeCompare(b.node.qualifiedName));
@@ -608,17 +952,18 @@ async function queryGraphSemantic(graph, question, options) {
608
952
  const limit = options.limit ?? 12;
609
953
  const literals = extractLiteralNeedles(question);
610
954
  const forTokens = literals.length > 0 ? stripLiteralNeedles(question) : question;
611
- const terms = tokenize(forTokens);
955
+ const prep = prepareTerms(forTokens);
956
+ const terms = prep.terms.map((t) => t.term);
612
957
  const weightOf = termWeights(graph, terms);
613
958
  const index = indexFor(graph);
614
959
  const queryVec = await options.embedder.embedQuery(forTokens || question);
615
960
  const lexRaw = /* @__PURE__ */ new Map();
616
961
  let lexMax = 0;
617
962
  const whyById = /* @__PURE__ */ new Map();
618
- if (terms.length > 0) {
963
+ if (prep.hasContent) {
619
964
  for (const node of graph.nodes) {
620
965
  if (node.kind === "file" || node.kind === "external") continue;
621
- const { score, why } = scoreNode(node, terms, weightOf);
966
+ const { score, why } = scoreNode(node, prep.terms, weightOf);
622
967
  lexRaw.set(node.id, score);
623
968
  whyById.set(node.id, why);
624
969
  if (score > lexMax) lexMax = score;
@@ -650,35 +995,66 @@ function tokenize(q) {
650
995
  )
651
996
  ];
652
997
  }
998
+ function tokenizeOrdered(q) {
999
+ return q.toLowerCase().split(/[^\p{L}\p{N}]+/u).filter((t) => t.length >= 1);
1000
+ }
1001
+ var WEAK_TERM_WEIGHT = 0.25;
1002
+ var EXPANSION_WEIGHT = 0.7;
1003
+ var COVERAGE_BONUS = 0.35;
1004
+ function prepareTerms(forTokens) {
1005
+ const base = tokenize(forTokens);
1006
+ const ordered = tokenizeOrdered(forTokens);
1007
+ const baseSet = new Set(base);
1008
+ const terms = base.map((t) => ({ term: t, weak: WEAK_TERMS.has(t) }));
1009
+ for (const e of expandConcepts(ordered)) {
1010
+ if (baseSet.has(e.term)) continue;
1011
+ terms.push({ term: e.term, weak: false, from: e.from });
1012
+ }
1013
+ const hasContent = terms.some((t) => !t.weak);
1014
+ return { terms, hasContent };
1015
+ }
653
1016
  function scoreNode(node, terms, weightOf = () => 1) {
654
1017
  let score = 0;
1018
+ let contentHits = 0;
655
1019
  const hits = [];
656
1020
  const name = node.name.toLowerCase();
657
1021
  const qn = node.qualifiedName.toLowerCase();
658
1022
  const file = node.file.toLowerCase();
1023
+ const dirSegments = new Set(file.split("/").slice(0, -1));
659
1024
  const nameParts = identifierParts(node.name);
660
- for (const t of terms) {
661
- const w = weightOf(t);
1025
+ for (const { term: t, weak, from } of terms) {
1026
+ const w = weightOf(t) * (weak ? WEAK_TERM_WEIGHT : 1) * (from ? EXPANSION_WEIGHT : 1);
1027
+ const label = from ? `${from}\u2192${t}` : t;
1028
+ let contribution = 0;
662
1029
  if (name === t) {
663
- score += 10 * w;
664
- hits.push(t);
1030
+ contribution = 10 * w;
1031
+ hits.push(label);
665
1032
  } else if (nameParts.has(t)) {
666
- score += 6 * w;
667
- hits.push(t);
1033
+ contribution = 6 * w;
1034
+ hits.push(label);
668
1035
  } else if (name.includes(t)) {
669
- score += 4 * w;
670
- hits.push(t);
1036
+ contribution = 4 * w;
1037
+ hits.push(label);
671
1038
  } else if (qn.includes(t)) {
672
- score += 3 * w;
673
- hits.push(t);
1039
+ contribution = 3 * w;
1040
+ hits.push(label);
674
1041
  } else if (fuzzyPartMatch(t, nameParts)) {
675
- score += 2 * w;
676
- hits.push(`~${t}`);
1042
+ contribution = 2 * w;
1043
+ hits.push(from ? `~${from}\u2192${t}` : `~${t}`);
1044
+ } else if (dirSegments.has(t)) {
1045
+ contribution = 2 * w;
1046
+ hits.push(label);
677
1047
  } else if (file.includes(t)) {
678
- score += 1 * w;
679
- hits.push(t);
1048
+ contribution = 1 * w;
1049
+ hits.push(label);
1050
+ }
1051
+ if (contribution > 0) {
1052
+ score += contribution;
1053
+ if (!weak) contentHits += 1;
680
1054
  }
681
1055
  }
1056
+ if (contentHits === 0) return { score: 0, why: "" };
1057
+ score *= 1 + COVERAGE_BONUS * Math.min(contentHits - 1, 4);
682
1058
  return { score, why: hits.length ? `matched: ${hits.join(", ")}` : "" };
683
1059
  }
684
1060
  var IMPORTANCE_WEIGHT = 0.4;
@@ -818,5 +1194,5 @@ function round2(x) {
818
1194
  }
819
1195
 
820
1196
  export { GraphIndex, acquireLock, clearModelCache, cosine, countPending, embeddingsCached, extractLiteralNeedles, getNodeEmbeddings, identifierParts, impactOf, indexFor, isLocateOnlyInstruction, isModelReady, loadEmbedder, modelCacheInfo, nodeEmbedText, queryGraph, queryGraphSemantic, releaseLock, residualForSymbolSearch, resolveEmbedModel, unavailableMessage, withTimeout };
821
- //# sourceMappingURL=chunk-EETK7S43.js.map
822
- //# sourceMappingURL=chunk-EETK7S43.js.map
1197
+ //# sourceMappingURL=chunk-SDG242R4.js.map
1198
+ //# sourceMappingURL=chunk-SDG242R4.js.map