@vibgrate/cli 2026.801.1 → 2026.803.3

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 (110) hide show
  1. package/dist/agent-JTA4YWMQ.js +24 -0
  2. package/dist/{agent-4DAECASW.js.map → agent-JTA4YWMQ.js.map} +1 -1
  3. package/dist/baseline-2V7PKA7Q.js +9 -0
  4. package/dist/{baseline-4BDH4F2W.js.map → baseline-2V7PKA7Q.js.map} +1 -1
  5. package/dist/{chunk-76TDXGGF.js → chunk-3Q3ZXJZP.js} +218 -51
  6. package/dist/chunk-3Q3ZXJZP.js.map +1 -0
  7. package/dist/{chunk-G7W4MFPZ.js → chunk-4ACXDVON.js} +4 -4
  8. package/dist/{chunk-G7W4MFPZ.js.map → chunk-4ACXDVON.js.map} +1 -1
  9. package/dist/{chunk-E6H2F2XF.js → chunk-6DFV4WCQ.js} +3 -3
  10. package/dist/{chunk-E6H2F2XF.js.map → chunk-6DFV4WCQ.js.map} +1 -1
  11. package/dist/{chunk-FF5ZQ6KI.js → chunk-6JP7HGIF.js} +4 -4
  12. package/dist/{chunk-FF5ZQ6KI.js.map → chunk-6JP7HGIF.js.map} +1 -1
  13. package/dist/chunk-7KNFG44U.js +6 -0
  14. package/dist/{chunk-TGDHOAXX.js.map → chunk-7KNFG44U.js.map} +1 -1
  15. package/dist/{chunk-T6DRYOMT.js → chunk-CPLG4GFB.js} +4 -4
  16. package/dist/{chunk-T6DRYOMT.js.map → chunk-CPLG4GFB.js.map} +1 -1
  17. package/dist/{chunk-SDG242R4.js → chunk-HC44772H.js} +132 -365
  18. package/dist/chunk-HC44772H.js.map +1 -0
  19. package/dist/{chunk-MPP4S4OE.js → chunk-K6Q6HTFD.js} +32 -11
  20. package/dist/chunk-K6Q6HTFD.js.map +1 -0
  21. package/dist/{chunk-7G5S5KZN.js → chunk-KUZLILN3.js} +16 -3
  22. package/dist/chunk-KUZLILN3.js.map +1 -0
  23. package/dist/{chunk-XEJJGDGX.js → chunk-KYX2YCXT.js} +134 -9
  24. package/dist/chunk-KYX2YCXT.js.map +1 -0
  25. package/dist/{chunk-V2QK3IUY.js → chunk-L5PUNO3T.js} +4 -4
  26. package/dist/{chunk-V2QK3IUY.js.map → chunk-L5PUNO3T.js.map} +1 -1
  27. package/dist/{chunk-7PVCHLR2.js → chunk-M452MRWI.js} +109 -10
  28. package/dist/chunk-M452MRWI.js.map +1 -0
  29. package/dist/{chunk-WIDZ5IE7.js → chunk-M7773OUN.js} +14 -7
  30. package/dist/chunk-M7773OUN.js.map +1 -0
  31. package/dist/{chunk-XRN7DQGR.js → chunk-NJFQCDGA.js} +3 -3
  32. package/dist/{chunk-XRN7DQGR.js.map → chunk-NJFQCDGA.js.map} +1 -1
  33. package/dist/{chunk-BNEHDLVZ.js → chunk-NSWEJPLV.js} +129 -20
  34. package/dist/chunk-NSWEJPLV.js.map +1 -0
  35. package/dist/{chunk-JLWI2JGA.js → chunk-NUZM7UOR.js} +117 -6
  36. package/dist/chunk-NUZM7UOR.js.map +1 -0
  37. package/dist/{chunk-B3OMGYZZ.js → chunk-PXM3VZYR.js} +4 -4
  38. package/dist/{chunk-B3OMGYZZ.js.map → chunk-PXM3VZYR.js.map} +1 -1
  39. package/dist/chunk-QMME6TB4.js +457 -0
  40. package/dist/chunk-QMME6TB4.js.map +1 -0
  41. package/dist/{chunk-G25STLE7.js → chunk-SJFBXCII.js} +30 -3
  42. package/dist/chunk-SJFBXCII.js.map +1 -0
  43. package/dist/{chunk-A43I2AJ4.js → chunk-TM5XQY3L.js} +3 -3
  44. package/dist/{chunk-A43I2AJ4.js.map → chunk-TM5XQY3L.js.map} +1 -1
  45. package/dist/{chunk-KL65SSR7.js → chunk-TNADGCOX.js} +323 -152
  46. package/dist/chunk-TNADGCOX.js.map +1 -0
  47. package/dist/{chunk-V3X3DBZL.js → chunk-UXR7FBE3.js} +6 -6
  48. package/dist/{chunk-V3X3DBZL.js.map → chunk-UXR7FBE3.js.map} +1 -1
  49. package/dist/{chunk-IPICO2RV.js → chunk-VIWZ4QT7.js} +14 -3
  50. package/dist/chunk-VIWZ4QT7.js.map +1 -0
  51. package/dist/{chunk-IRCYOTRG.js → chunk-WGPS3NZQ.js} +240 -13
  52. package/dist/chunk-WGPS3NZQ.js.map +1 -0
  53. package/dist/{chunk-I6RBAIS3.js → chunk-XK5LKOBF.js} +4 -4
  54. package/dist/{chunk-I6RBAIS3.js.map → chunk-XK5LKOBF.js.map} +1 -1
  55. package/dist/cli.js +796 -359
  56. package/dist/cli.js.map +1 -1
  57. package/dist/ensure-map-TAVYMPEG.js +29 -0
  58. package/dist/{ensure-map-SMWHKOUY.js.map → ensure-map-TAVYMPEG.js.map} +1 -1
  59. package/dist/{graph-backend-I4I72J4W.js → graph-backend-WF4LGBGD.js} +5 -5
  60. package/dist/{graph-backend-I4I72J4W.js.map → graph-backend-WF4LGBGD.js.map} +1 -1
  61. package/dist/index.d.ts +143 -7
  62. package/dist/index.js +17 -16
  63. package/dist/index.js.map +1 -1
  64. package/dist/{interactive-TMQR6TXM.js → interactive-6PN237LX.js} +49 -32
  65. package/dist/interactive-6PN237LX.js.map +1 -0
  66. package/dist/load-T2FOJUPI.js +10 -0
  67. package/dist/{load-E3OTM7BS.js.map → load-T2FOJUPI.js.map} +1 -1
  68. package/dist/model-manager-GJ2YSTSK.js +1 -1
  69. package/dist/{run-outcome-QWLNBASF.js → run-outcome-AMIKAASL.js} +6 -6
  70. package/dist/{run-outcome-QWLNBASF.js.map → run-outcome-AMIKAASL.js.map} +1 -1
  71. package/dist/runtime-session-QAVOPSSH.js +20 -0
  72. package/dist/{runtime-session-UQ7UVAPL.js.map → runtime-session-QAVOPSSH.js.map} +1 -1
  73. package/dist/session-SCHQQTHN.js +15 -0
  74. package/dist/{session-MG6BJVAG.js.map → session-SCHQQTHN.js.map} +1 -1
  75. package/dist/session-store-F7NX7SZN.js +4 -0
  76. package/dist/{session-store-SQECEXUU.js.map → session-store-F7NX7SZN.js.map} +1 -1
  77. package/dist/{stream-json-GM44SP7L.js → stream-json-A6K2MONY.js} +48 -16
  78. package/dist/stream-json-A6K2MONY.js.map +1 -0
  79. package/dist/{vg-mcp-bridge-3WFC7LGE.js → vg-mcp-bridge-3TSFOL4V.js} +13 -11
  80. package/dist/vg-mcp-bridge-3TSFOL4V.js.map +1 -0
  81. package/dist/{vgd-ZUSBEVUL.js → vgd-B67JCNJP.js} +9 -9
  82. package/dist/vgd-B67JCNJP.js.map +1 -0
  83. package/package.json +1 -1
  84. package/dist/agent-4DAECASW.js +0 -22
  85. package/dist/baseline-4BDH4F2W.js +0 -9
  86. package/dist/chunk-76TDXGGF.js.map +0 -1
  87. package/dist/chunk-7G5S5KZN.js.map +0 -1
  88. package/dist/chunk-7PVCHLR2.js.map +0 -1
  89. package/dist/chunk-BNEHDLVZ.js.map +0 -1
  90. package/dist/chunk-G25STLE7.js.map +0 -1
  91. package/dist/chunk-IPICO2RV.js.map +0 -1
  92. package/dist/chunk-IRCYOTRG.js.map +0 -1
  93. package/dist/chunk-JLWI2JGA.js.map +0 -1
  94. package/dist/chunk-KL65SSR7.js.map +0 -1
  95. package/dist/chunk-MPP4S4OE.js.map +0 -1
  96. package/dist/chunk-SDG242R4.js.map +0 -1
  97. package/dist/chunk-TGDHOAXX.js +0 -6
  98. package/dist/chunk-WIDZ5IE7.js.map +0 -1
  99. package/dist/chunk-XEJJGDGX.js.map +0 -1
  100. package/dist/chunk-ZKNB4YH4.js +0 -102
  101. package/dist/chunk-ZKNB4YH4.js.map +0 -1
  102. package/dist/ensure-map-SMWHKOUY.js +0 -28
  103. package/dist/interactive-TMQR6TXM.js.map +0 -1
  104. package/dist/load-E3OTM7BS.js +0 -10
  105. package/dist/runtime-session-UQ7UVAPL.js +0 -20
  106. package/dist/session-MG6BJVAG.js +0 -13
  107. package/dist/session-store-SQECEXUU.js +0 -4
  108. package/dist/stream-json-GM44SP7L.js.map +0 -1
  109. package/dist/vg-mcp-bridge-3WFC7LGE.js.map +0 -1
  110. package/dist/vgd-ZUSBEVUL.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import { cacheDir } from './chunk-ZKNB4YH4.js';
1
+ import { cacheDir, bigramConsumedTokens, WEAK_TERMS, expandConcepts } from './chunk-QMME6TB4.js';
2
2
  import { hashString } from './chunk-JFGYT6BI.js';
3
3
  import * as fs2 from 'fs';
4
4
  import { createRequire } from 'module';
@@ -436,350 +436,6 @@ 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
-
783
439
  // src/engine/query.ts
784
440
  var STOPWORDS = /* @__PURE__ */ new Set([
785
441
  "the",
@@ -931,7 +587,7 @@ function queryGraph(graph, question, options = {}) {
931
587
  const limit = options.limit ?? 12;
932
588
  const literals = extractLiteralNeedles(question);
933
589
  const forTokens = literals.length > 0 ? stripLiteralNeedles(question) : question;
934
- const prep = prepareTerms(forTokens);
590
+ const prep = prepareTerms(forTokens, options.relevance, priorResidual(options.priorQuestion));
935
591
  const weightOf = termWeights(graph, prep.terms.map((t) => t.term));
936
592
  const index = indexFor(graph);
937
593
  const scored = [];
@@ -939,7 +595,14 @@ function queryGraph(graph, question, options = {}) {
939
595
  for (const node of graph.nodes) {
940
596
  if (node.kind === "file" || node.kind === "external") continue;
941
597
  const { score, why } = scoreNode(node, prep.terms, weightOf);
942
- if (score > 0) scored.push({ node, score: round(score * (1 + IMPORTANCE_WEIGHT * node.importance)), why });
598
+ if (score > 0) {
599
+ const affinity = topicAffinity(node.id, options.relevance, options.topicTags);
600
+ scored.push({
601
+ node,
602
+ score: round(score * affinity.boost * (1 + IMPORTANCE_WEIGHT * node.importance)),
603
+ why: why + affinity.label
604
+ });
605
+ }
943
606
  }
944
607
  scored.sort((a, b) => b.score - a.score || a.node.qualifiedName.localeCompare(b.node.qualifiedName));
945
608
  }
@@ -947,18 +610,22 @@ function queryGraph(graph, question, options = {}) {
947
610
  const { context, tokensEstimate } = buildContext(graph, index, question, seeds, budget, literals);
948
611
  return { question, matches: seeds, context, tokensEstimate };
949
612
  }
613
+ var RRF_K = 60;
614
+ function ranksOf(scores, nameOf) {
615
+ const ids = [...scores.entries()].filter(([, s]) => s > 0).sort((a, b) => b[1] - a[1] || nameOf(a[0]).localeCompare(nameOf(b[0]))).map(([id]) => id);
616
+ return new Map(ids.map((id, i) => [id, i + 1]));
617
+ }
950
618
  async function queryGraphSemantic(graph, question, options) {
951
619
  const budget = options.budget ?? 2e3;
952
620
  const limit = options.limit ?? 12;
953
621
  const literals = extractLiteralNeedles(question);
954
622
  const forTokens = literals.length > 0 ? stripLiteralNeedles(question) : question;
955
- const prep = prepareTerms(forTokens);
623
+ const prep = prepareTerms(forTokens, options.relevance, priorResidual(options.priorQuestion));
956
624
  const terms = prep.terms.map((t) => t.term);
957
625
  const weightOf = termWeights(graph, terms);
958
626
  const index = indexFor(graph);
959
627
  const queryVec = await options.embedder.embedQuery(forTokens || question);
960
628
  const lexRaw = /* @__PURE__ */ new Map();
961
- let lexMax = 0;
962
629
  const whyById = /* @__PURE__ */ new Map();
963
630
  if (prep.hasContent) {
964
631
  for (const node of graph.nodes) {
@@ -966,21 +633,32 @@ async function queryGraphSemantic(graph, question, options) {
966
633
  const { score, why } = scoreNode(node, prep.terms, weightOf);
967
634
  lexRaw.set(node.id, score);
968
635
  whyById.set(node.id, why);
969
- if (score > lexMax) lexMax = score;
970
636
  }
971
637
  }
972
638
  const scored = [];
973
639
  if (terms.length > 0 || literals.length === 0) {
640
+ const semRaw = /* @__PURE__ */ new Map();
641
+ const nodeById = /* @__PURE__ */ new Map();
974
642
  for (const node of graph.nodes) {
975
643
  if (node.kind === "file" || node.kind === "external") continue;
976
- const lexNorm = lexMax > 0 ? (lexRaw.get(node.id) ?? 0) / lexMax : 0;
644
+ nodeById.set(node.id, node);
977
645
  const vec = options.nodeVectors.get(node.id);
978
646
  const sem = vec && terms.length > 0 ? Math.max(0, cosine(queryVec, vec)) : 0;
979
- const hybrid = 0.5 * lexNorm + 0.5 * sem;
980
- if (hybrid <= 0) continue;
981
- const lexWhy = whyById.get(node.id);
982
- const why = lexWhy || (sem > 0.3 ? `semantic match (${sem.toFixed(2)})` : "weak match");
983
- scored.push({ node, score: round(hybrid * (1 + IMPORTANCE_WEIGHT * node.importance)), why });
647
+ if (sem > 0) semRaw.set(node.id, sem);
648
+ }
649
+ const nameOf = (id) => nodeById.get(id)?.qualifiedName ?? id;
650
+ const lexRanks = ranksOf(lexRaw, nameOf);
651
+ const semRanks = ranksOf(semRaw, nameOf);
652
+ for (const [id, node] of nodeById) {
653
+ const lr = lexRanks.get(id);
654
+ const sr = semRanks.get(id);
655
+ if (lr === void 0 && sr === void 0) continue;
656
+ const fused = (lr !== void 0 ? 1 / (RRF_K + lr) : 0) + (sr !== void 0 ? 1 / (RRF_K + sr) : 0);
657
+ const sem = semRaw.get(id) ?? 0;
658
+ const lexWhy = whyById.get(id);
659
+ const affinity = topicAffinity(id, options.relevance, options.topicTags);
660
+ const why = (lexWhy || (sem > 0.3 ? `semantic match (${sem.toFixed(2)})` : "weak match")) + affinity.label;
661
+ scored.push({ node, score: round(fused * affinity.boost * (1 + IMPORTANCE_WEIGHT * node.importance)), why });
984
662
  }
985
663
  scored.sort((a, b) => b.score - a.score || a.node.qualifiedName.localeCompare(b.node.qualifiedName));
986
664
  }
@@ -1001,18 +679,90 @@ function tokenizeOrdered(q) {
1001
679
  var WEAK_TERM_WEIGHT = 0.25;
1002
680
  var EXPANSION_WEIGHT = 0.7;
1003
681
  var COVERAGE_BONUS = 0.35;
1004
- function prepareTerms(forTokens) {
682
+ var CARRY_WEIGHT = 0.5;
683
+ function prepareTerms(forTokens, relevance, prior) {
1005
684
  const base = tokenize(forTokens);
1006
685
  const ordered = tokenizeOrdered(forTokens);
1007
686
  const baseSet = new Set(base);
1008
- const terms = base.map((t) => ({ term: t, weak: WEAK_TERMS.has(t) }));
687
+ const consumed = bigramConsumedTokens(ordered);
688
+ const terms = base.map((t) => ({ term: t, weak: WEAK_TERMS.has(t) || consumed.has(t) }));
689
+ const have = new Set(base);
1009
690
  for (const e of expandConcepts(ordered)) {
1010
691
  if (baseSet.has(e.term)) continue;
1011
692
  terms.push({ term: e.term, weak: false, from: e.from });
693
+ have.add(e.term);
694
+ }
695
+ for (const e of relevance?.expansions ?? []) {
696
+ if (have.has(e.term)) continue;
697
+ terms.push({ term: e.term, weak: false, from: e.from, providerWeight: e.weight });
698
+ have.add(e.term);
699
+ }
700
+ if (prior?.trim()) {
701
+ const priorOrdered = tokenizeOrdered(prior);
702
+ const priorConsumed = bigramConsumedTokens(priorOrdered);
703
+ for (const t of tokenize(prior)) {
704
+ if (have.has(t) || WEAK_TERMS.has(t) || priorConsumed.has(t)) continue;
705
+ terms.push({ term: t, weak: false, carried: true });
706
+ have.add(t);
707
+ }
708
+ for (const e of expandConcepts(priorOrdered)) {
709
+ if (have.has(e.term)) continue;
710
+ terms.push({ term: e.term, weak: false, from: e.from, carried: true });
711
+ have.add(e.term);
712
+ }
1012
713
  }
1013
714
  const hasContent = terms.some((t) => !t.weak);
1014
715
  return { terms, hasContent };
1015
716
  }
717
+ function priorResidual(prior) {
718
+ const raw = prior?.trim();
719
+ if (!raw) return null;
720
+ return extractLiteralNeedles(raw).length > 0 ? stripLiteralNeedles(raw) : raw;
721
+ }
722
+ function conceptMapLines(question, relevance, priorQuestion) {
723
+ const cap = (xs) => [...new Set(xs)].slice(0, 8).join(", ");
724
+ const literals = extractLiteralNeedles(question);
725
+ const residual = literals.length > 0 ? stripLiteralNeedles(question) : question;
726
+ const lines = [];
727
+ const byFrom = /* @__PURE__ */ new Map();
728
+ for (const e of expandConcepts(tokenizeOrdered(residual))) {
729
+ const list = byFrom.get(e.from) ?? [];
730
+ list.push(e.term);
731
+ byFrom.set(e.from, list);
732
+ }
733
+ for (const [from, terms] of byFrom) {
734
+ lines.push(`- "${from}" in the ask implies these codebase identifiers: ${cap(terms)}.`);
735
+ }
736
+ if (relevance?.topics?.length) {
737
+ const topicVocab = /* @__PURE__ */ new Map();
738
+ for (const e of relevance.expansions ?? []) {
739
+ const list = topicVocab.get(e.from) ?? [];
740
+ list.push(e.term);
741
+ topicVocab.set(e.from, list);
742
+ }
743
+ for (const t of relevance.topics.slice(0, 3)) {
744
+ const vocab = topicVocab.get(t.id);
745
+ lines.push(
746
+ vocab?.length ? `- The ask is about the "${t.id}" domain; code for it typically uses: ${cap(vocab)}.` : `- The ask is about the "${t.id}" domain.`
747
+ );
748
+ }
749
+ }
750
+ const priorText = priorResidual(priorQuestion);
751
+ if (priorText) {
752
+ const current = new Set(tokenize(residual));
753
+ const consumed = bigramConsumedTokens(tokenizeOrdered(priorText));
754
+ const carried = tokenize(priorText).filter((t) => !current.has(t) && !WEAK_TERMS.has(t) && !consumed.has(t));
755
+ if (carried.length) {
756
+ lines.push(`- This is a follow-up; topic words carried from the previous ask: ${cap(carried)}.`);
757
+ }
758
+ }
759
+ if (lines.length) {
760
+ lines.push(
761
+ '- Seed notation below: `a\u2192b` = ask term "a" implied identifier "b"; `~t` = word-form match; `\u21A9t` = carried from the previous ask.'
762
+ );
763
+ }
764
+ return lines;
765
+ }
1016
766
  function scoreNode(node, terms, weightOf = () => 1) {
1017
767
  let score = 0;
1018
768
  let contentHits = 0;
@@ -1022,9 +772,10 @@ function scoreNode(node, terms, weightOf = () => 1) {
1022
772
  const file = node.file.toLowerCase();
1023
773
  const dirSegments = new Set(file.split("/").slice(0, -1));
1024
774
  const nameParts = identifierParts(node.name);
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;
775
+ for (const { term: t, weak, from, providerWeight, carried } of terms) {
776
+ const expansionW = providerWeight !== void 0 ? Math.min(providerWeight, EXPANSION_WEIGHT) : from ? EXPANSION_WEIGHT : 1;
777
+ const w = weightOf(t) * (weak ? WEAK_TERM_WEIGHT : 1) * expansionW * (carried ? CARRY_WEIGHT : 1);
778
+ const label = (carried ? "\u21A9" : "") + (from ? `${from}\u2192${t}` : t);
1028
779
  let contribution = 0;
1029
780
  if (name === t) {
1030
781
  contribution = 10 * w;
@@ -1040,7 +791,7 @@ function scoreNode(node, terms, weightOf = () => 1) {
1040
791
  hits.push(label);
1041
792
  } else if (fuzzyPartMatch(t, nameParts)) {
1042
793
  contribution = 2 * w;
1043
- hits.push(from ? `~${from}\u2192${t}` : `~${t}`);
794
+ hits.push((carried ? "\u21A9" : "") + (from ? `~${from}\u2192${t}` : `~${t}`));
1044
795
  } else if (dirSegments.has(t)) {
1045
796
  contribution = 2 * w;
1046
797
  hits.push(label);
@@ -1058,6 +809,22 @@ function scoreNode(node, terms, weightOf = () => 1) {
1058
809
  return { score, why: hits.length ? `matched: ${hits.join(", ")}` : "" };
1059
810
  }
1060
811
  var IMPORTANCE_WEIGHT = 0.4;
812
+ var TOPIC_AFFINITY_WEIGHT = 0.3;
813
+ function topicAffinity(nodeId, relevance, topicTags) {
814
+ if (!relevance?.topics?.length || !topicTags) return { boost: 1, label: "" };
815
+ const tags = topicTags.get(nodeId);
816
+ if (!tags?.length) return { boost: 1, label: "" };
817
+ let affinity = 0;
818
+ const matched = [];
819
+ for (const t of relevance.topics) {
820
+ if (tags.includes(t.id)) {
821
+ affinity += t.score;
822
+ matched.push(t.id);
823
+ }
824
+ }
825
+ if (affinity <= 0) return { boost: 1, label: "" };
826
+ return { boost: 1 + TOPIC_AFFINITY_WEIGHT * Math.min(affinity, 1), label: `, topic:${matched.sort().join("+")}` };
827
+ }
1061
828
  function termWeights(graph, terms) {
1062
829
  if (terms.length === 0) return () => 1;
1063
830
  const df = /* @__PURE__ */ new Map();
@@ -1193,6 +960,6 @@ function round2(x) {
1193
960
  return Math.round(x * 1e6) / 1e6;
1194
961
  }
1195
962
 
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 };
1197
- //# sourceMappingURL=chunk-SDG242R4.js.map
1198
- //# sourceMappingURL=chunk-SDG242R4.js.map
963
+ export { GraphIndex, acquireLock, clearModelCache, conceptMapLines, cosine, countPending, embeddingsCached, extractLiteralNeedles, getNodeEmbeddings, identifierParts, impactOf, indexFor, isLocateOnlyInstruction, isModelReady, loadEmbedder, modelCacheInfo, nodeEmbedText, queryGraph, queryGraphSemantic, releaseLock, residualForSymbolSearch, resolveEmbedModel, unavailableMessage, withTimeout };
964
+ //# sourceMappingURL=chunk-HC44772H.js.map
965
+ //# sourceMappingURL=chunk-HC44772H.js.map