raggrep 0.7.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli/main.js CHANGED
@@ -433,11 +433,28 @@ var init_config = __esm(() => {
433
433
  // src/domain/entities/literal.ts
434
434
  var init_literal = () => {};
435
435
 
436
+ // src/domain/entities/lexicon.ts
437
+ var DEFAULT_EXPANSION_OPTIONS, EXPANSION_WEIGHTS;
438
+ var init_lexicon = __esm(() => {
439
+ DEFAULT_EXPANSION_OPTIONS = {
440
+ maxDepth: 1,
441
+ includeWeak: true,
442
+ maxTerms: 20,
443
+ minTermLength: 2
444
+ };
445
+ EXPANSION_WEIGHTS = {
446
+ strong: 0.9,
447
+ moderate: 0.6,
448
+ weak: 0.3
449
+ };
450
+ });
451
+
436
452
  // src/domain/entities/index.ts
437
453
  var init_entities = __esm(() => {
438
454
  init_searchResult();
439
455
  init_config();
440
456
  init_literal();
457
+ init_lexicon();
441
458
  });
442
459
 
443
460
  // src/infrastructure/config/configLoader.ts
@@ -2950,6 +2967,586 @@ var init_literalScorer = __esm(() => {
2950
2967
  };
2951
2968
  });
2952
2969
 
2970
+ // src/domain/services/lexicon.ts
2971
+ function buildLookupMap(lexicon) {
2972
+ const map = new Map;
2973
+ for (const entry of lexicon.entries) {
2974
+ map.set(entry.term.toLowerCase(), entry);
2975
+ }
2976
+ return map;
2977
+ }
2978
+ function getSynonyms(term, lexicon = DEFAULT_LEXICON) {
2979
+ const lookupMap = lexicon === DEFAULT_LEXICON ? defaultLookupMap : buildLookupMap(lexicon);
2980
+ const entry = lookupMap.get(term.toLowerCase());
2981
+ return entry ? entry.synonyms : [];
2982
+ }
2983
+ function tokenizeQuery(query) {
2984
+ const stopWords = new Set([
2985
+ "the",
2986
+ "a",
2987
+ "an",
2988
+ "is",
2989
+ "are",
2990
+ "was",
2991
+ "were",
2992
+ "be",
2993
+ "been",
2994
+ "being",
2995
+ "have",
2996
+ "has",
2997
+ "had",
2998
+ "do",
2999
+ "does",
3000
+ "did",
3001
+ "will",
3002
+ "would",
3003
+ "could",
3004
+ "should",
3005
+ "may",
3006
+ "might",
3007
+ "must",
3008
+ "shall",
3009
+ "can",
3010
+ "need",
3011
+ "dare",
3012
+ "ought",
3013
+ "used",
3014
+ "to",
3015
+ "of",
3016
+ "in",
3017
+ "for",
3018
+ "on",
3019
+ "with",
3020
+ "at",
3021
+ "by",
3022
+ "from",
3023
+ "as",
3024
+ "into",
3025
+ "through",
3026
+ "during",
3027
+ "before",
3028
+ "after",
3029
+ "above",
3030
+ "below",
3031
+ "between",
3032
+ "under",
3033
+ "again",
3034
+ "further",
3035
+ "then",
3036
+ "once",
3037
+ "here",
3038
+ "there",
3039
+ "when",
3040
+ "where",
3041
+ "why",
3042
+ "how",
3043
+ "all",
3044
+ "each",
3045
+ "few",
3046
+ "more",
3047
+ "most",
3048
+ "other",
3049
+ "some",
3050
+ "such",
3051
+ "no",
3052
+ "nor",
3053
+ "not",
3054
+ "only",
3055
+ "own",
3056
+ "same",
3057
+ "so",
3058
+ "than",
3059
+ "too",
3060
+ "very",
3061
+ "just",
3062
+ "and",
3063
+ "but",
3064
+ "if",
3065
+ "or",
3066
+ "because",
3067
+ "until",
3068
+ "while",
3069
+ "this",
3070
+ "that",
3071
+ "these",
3072
+ "those",
3073
+ "what",
3074
+ "which",
3075
+ "who",
3076
+ "whom",
3077
+ "i",
3078
+ "me",
3079
+ "my",
3080
+ "we",
3081
+ "our",
3082
+ "you",
3083
+ "your",
3084
+ "he",
3085
+ "him",
3086
+ "his",
3087
+ "she",
3088
+ "her",
3089
+ "it",
3090
+ "its",
3091
+ "they",
3092
+ "them",
3093
+ "their"
3094
+ ]);
3095
+ return query.toLowerCase().split(/\s+/).filter((term) => term.length > 0 && !stopWords.has(term));
3096
+ }
3097
+ function expandQuery(query, lexicon = DEFAULT_LEXICON, options = {}) {
3098
+ const opts = { ...DEFAULT_EXPANSION_OPTIONS, ...options };
3099
+ const originalTerms = tokenizeQuery(query);
3100
+ const expandedTerms = [];
3101
+ const seenTerms = new Set;
3102
+ for (const term of originalTerms) {
3103
+ if (term.length >= opts.minTermLength && !seenTerms.has(term)) {
3104
+ expandedTerms.push({
3105
+ term,
3106
+ weight: 1,
3107
+ source: "original"
3108
+ });
3109
+ seenTerms.add(term);
3110
+ }
3111
+ }
3112
+ if (opts.maxDepth >= 1) {
3113
+ for (const term of originalTerms) {
3114
+ if (term.length < opts.minTermLength)
3115
+ continue;
3116
+ const synonyms = getSynonyms(term, lexicon);
3117
+ for (const syn of synonyms) {
3118
+ if (syn.grade === "weak" && !opts.includeWeak)
3119
+ continue;
3120
+ const synLower = syn.term.toLowerCase();
3121
+ if (seenTerms.has(synLower))
3122
+ continue;
3123
+ if (expandedTerms.length >= opts.maxTerms)
3124
+ break;
3125
+ expandedTerms.push({
3126
+ term: syn.term,
3127
+ weight: EXPANSION_WEIGHTS[syn.grade],
3128
+ source: syn.grade,
3129
+ expandedFrom: term
3130
+ });
3131
+ seenTerms.add(synLower);
3132
+ }
3133
+ if (expandedTerms.length >= opts.maxTerms)
3134
+ break;
3135
+ }
3136
+ }
3137
+ const originalPart = originalTerms.join(" ");
3138
+ const synonymPart = expandedTerms.filter((t) => t.source !== "original").map((t) => t.term).join(" ");
3139
+ const expandedQueryString = synonymPart ? `${originalPart} ${synonymPart}` : originalPart;
3140
+ return {
3141
+ originalQuery: query,
3142
+ originalTerms,
3143
+ expandedTerms,
3144
+ expandedQueryString,
3145
+ wasExpanded: expandedTerms.some((t) => t.source !== "original")
3146
+ };
3147
+ }
3148
+ var DEFAULT_LEXICON, defaultLookupMap;
3149
+ var init_lexicon2 = __esm(() => {
3150
+ init_lexicon();
3151
+ DEFAULT_LEXICON = {
3152
+ version: "1.0.0",
3153
+ entries: [
3154
+ {
3155
+ term: "function",
3156
+ synonyms: [
3157
+ { term: "method", grade: "strong" },
3158
+ { term: "func", grade: "strong" },
3159
+ { term: "handler", grade: "moderate" },
3160
+ { term: "callback", grade: "moderate" },
3161
+ { term: "procedure", grade: "weak" },
3162
+ { term: "routine", grade: "weak" }
3163
+ ]
3164
+ },
3165
+ {
3166
+ term: "method",
3167
+ synonyms: [
3168
+ { term: "function", grade: "strong" },
3169
+ { term: "func", grade: "strong" },
3170
+ { term: "handler", grade: "moderate" }
3171
+ ]
3172
+ },
3173
+ {
3174
+ term: "class",
3175
+ synonyms: [
3176
+ { term: "type", grade: "moderate" },
3177
+ { term: "interface", grade: "moderate" },
3178
+ { term: "struct", grade: "moderate" },
3179
+ { term: "model", grade: "weak" },
3180
+ { term: "entity", grade: "weak" }
3181
+ ]
3182
+ },
3183
+ {
3184
+ term: "interface",
3185
+ synonyms: [
3186
+ { term: "type", grade: "strong" },
3187
+ { term: "contract", grade: "moderate" },
3188
+ { term: "protocol", grade: "weak" }
3189
+ ]
3190
+ },
3191
+ {
3192
+ term: "type",
3193
+ synonyms: [
3194
+ { term: "interface", grade: "strong" },
3195
+ { term: "typedef", grade: "strong" },
3196
+ { term: "schema", grade: "moderate" }
3197
+ ]
3198
+ },
3199
+ {
3200
+ term: "variable",
3201
+ synonyms: [
3202
+ { term: "var", grade: "strong" },
3203
+ { term: "const", grade: "strong" },
3204
+ { term: "constant", grade: "strong" },
3205
+ { term: "property", grade: "moderate" },
3206
+ { term: "field", grade: "moderate" }
3207
+ ]
3208
+ },
3209
+ {
3210
+ term: "constant",
3211
+ synonyms: [
3212
+ { term: "const", grade: "strong" },
3213
+ { term: "variable", grade: "moderate" },
3214
+ { term: "config", grade: "weak" }
3215
+ ]
3216
+ },
3217
+ {
3218
+ term: "auth",
3219
+ synonyms: [
3220
+ { term: "authentication", grade: "strong" },
3221
+ { term: "authorization", grade: "strong" },
3222
+ { term: "login", grade: "moderate" },
3223
+ { term: "signin", grade: "moderate" },
3224
+ { term: "session", grade: "weak" },
3225
+ { term: "security", grade: "weak" }
3226
+ ]
3227
+ },
3228
+ {
3229
+ term: "authentication",
3230
+ synonyms: [
3231
+ { term: "auth", grade: "strong" },
3232
+ { term: "login", grade: "moderate" },
3233
+ { term: "signin", grade: "moderate" },
3234
+ { term: "identity", grade: "weak" }
3235
+ ]
3236
+ },
3237
+ {
3238
+ term: "authorization",
3239
+ synonyms: [
3240
+ { term: "auth", grade: "strong" },
3241
+ { term: "permission", grade: "moderate" },
3242
+ { term: "access", grade: "moderate" },
3243
+ { term: "role", grade: "weak" }
3244
+ ]
3245
+ },
3246
+ {
3247
+ term: "login",
3248
+ synonyms: [
3249
+ { term: "signin", grade: "strong" },
3250
+ { term: "auth", grade: "moderate" },
3251
+ { term: "authenticate", grade: "moderate" }
3252
+ ]
3253
+ },
3254
+ {
3255
+ term: "logout",
3256
+ synonyms: [
3257
+ { term: "signout", grade: "strong" },
3258
+ { term: "logoff", grade: "strong" }
3259
+ ]
3260
+ },
3261
+ {
3262
+ term: "password",
3263
+ synonyms: [
3264
+ { term: "pwd", grade: "strong" },
3265
+ { term: "pass", grade: "strong" },
3266
+ { term: "credential", grade: "moderate" },
3267
+ { term: "secret", grade: "weak" }
3268
+ ]
3269
+ },
3270
+ {
3271
+ term: "token",
3272
+ synonyms: [
3273
+ { term: "jwt", grade: "strong" },
3274
+ { term: "bearer", grade: "moderate" },
3275
+ { term: "credential", grade: "weak" }
3276
+ ]
3277
+ },
3278
+ {
3279
+ term: "database",
3280
+ synonyms: [
3281
+ { term: "db", grade: "strong" },
3282
+ { term: "datastore", grade: "strong" },
3283
+ { term: "storage", grade: "moderate" },
3284
+ { term: "repository", grade: "weak" }
3285
+ ]
3286
+ },
3287
+ {
3288
+ term: "query",
3289
+ synonyms: [
3290
+ { term: "select", grade: "moderate" },
3291
+ { term: "find", grade: "moderate" },
3292
+ { term: "fetch", grade: "moderate" },
3293
+ { term: "search", grade: "weak" }
3294
+ ]
3295
+ },
3296
+ {
3297
+ term: "insert",
3298
+ synonyms: [
3299
+ { term: "create", grade: "strong" },
3300
+ { term: "add", grade: "strong" },
3301
+ { term: "save", grade: "moderate" },
3302
+ { term: "store", grade: "moderate" }
3303
+ ]
3304
+ },
3305
+ {
3306
+ term: "update",
3307
+ synonyms: [
3308
+ { term: "modify", grade: "strong" },
3309
+ { term: "edit", grade: "strong" },
3310
+ { term: "patch", grade: "moderate" },
3311
+ { term: "change", grade: "moderate" }
3312
+ ]
3313
+ },
3314
+ {
3315
+ term: "delete",
3316
+ synonyms: [
3317
+ { term: "remove", grade: "strong" },
3318
+ { term: "destroy", grade: "strong" },
3319
+ { term: "drop", grade: "moderate" },
3320
+ { term: "erase", grade: "weak" }
3321
+ ]
3322
+ },
3323
+ {
3324
+ term: "cache",
3325
+ synonyms: [
3326
+ { term: "redis", grade: "moderate" },
3327
+ { term: "memcache", grade: "moderate" },
3328
+ { term: "store", grade: "weak" },
3329
+ { term: "buffer", grade: "weak" }
3330
+ ]
3331
+ },
3332
+ {
3333
+ term: "api",
3334
+ synonyms: [
3335
+ { term: "endpoint", grade: "strong" },
3336
+ { term: "route", grade: "moderate" },
3337
+ { term: "rest", grade: "moderate" },
3338
+ { term: "service", grade: "weak" }
3339
+ ]
3340
+ },
3341
+ {
3342
+ term: "endpoint",
3343
+ synonyms: [
3344
+ { term: "api", grade: "strong" },
3345
+ { term: "route", grade: "strong" },
3346
+ { term: "path", grade: "moderate" }
3347
+ ]
3348
+ },
3349
+ {
3350
+ term: "request",
3351
+ synonyms: [
3352
+ { term: "req", grade: "strong" },
3353
+ { term: "call", grade: "moderate" },
3354
+ { term: "fetch", grade: "moderate" }
3355
+ ]
3356
+ },
3357
+ {
3358
+ term: "response",
3359
+ synonyms: [
3360
+ { term: "res", grade: "strong" },
3361
+ { term: "reply", grade: "moderate" },
3362
+ { term: "result", grade: "weak" }
3363
+ ]
3364
+ },
3365
+ {
3366
+ term: "middleware",
3367
+ synonyms: [
3368
+ { term: "interceptor", grade: "moderate" },
3369
+ { term: "filter", grade: "moderate" },
3370
+ { term: "handler", grade: "weak" }
3371
+ ]
3372
+ },
3373
+ {
3374
+ term: "error",
3375
+ synonyms: [
3376
+ { term: "exception", grade: "strong" },
3377
+ { term: "err", grade: "strong" },
3378
+ { term: "failure", grade: "moderate" },
3379
+ { term: "fault", grade: "weak" }
3380
+ ]
3381
+ },
3382
+ {
3383
+ term: "exception",
3384
+ synonyms: [
3385
+ { term: "error", grade: "strong" },
3386
+ { term: "throw", grade: "moderate" },
3387
+ { term: "catch", grade: "moderate" }
3388
+ ]
3389
+ },
3390
+ {
3391
+ term: "validate",
3392
+ synonyms: [
3393
+ { term: "verify", grade: "strong" },
3394
+ { term: "check", grade: "strong" },
3395
+ { term: "assert", grade: "moderate" },
3396
+ { term: "ensure", grade: "moderate" }
3397
+ ]
3398
+ },
3399
+ {
3400
+ term: "config",
3401
+ synonyms: [
3402
+ { term: "configuration", grade: "strong" },
3403
+ { term: "settings", grade: "strong" },
3404
+ { term: "options", grade: "moderate" },
3405
+ { term: "env", grade: "weak" },
3406
+ { term: "environment", grade: "weak" }
3407
+ ]
3408
+ },
3409
+ {
3410
+ term: "environment",
3411
+ synonyms: [
3412
+ { term: "env", grade: "strong" },
3413
+ { term: "config", grade: "moderate" },
3414
+ { term: "settings", grade: "weak" }
3415
+ ]
3416
+ },
3417
+ {
3418
+ term: "test",
3419
+ synonyms: [
3420
+ { term: "spec", grade: "strong" },
3421
+ { term: "unittest", grade: "strong" },
3422
+ { term: "check", grade: "moderate" },
3423
+ { term: "verify", grade: "weak" }
3424
+ ]
3425
+ },
3426
+ {
3427
+ term: "mock",
3428
+ synonyms: [
3429
+ { term: "stub", grade: "strong" },
3430
+ { term: "fake", grade: "strong" },
3431
+ { term: "spy", grade: "moderate" },
3432
+ { term: "double", grade: "weak" }
3433
+ ]
3434
+ },
3435
+ {
3436
+ term: "async",
3437
+ synonyms: [
3438
+ { term: "asynchronous", grade: "strong" },
3439
+ { term: "await", grade: "moderate" },
3440
+ { term: "promise", grade: "moderate" }
3441
+ ]
3442
+ },
3443
+ {
3444
+ term: "callback",
3445
+ synonyms: [
3446
+ { term: "handler", grade: "strong" },
3447
+ { term: "listener", grade: "moderate" },
3448
+ { term: "hook", grade: "moderate" }
3449
+ ]
3450
+ },
3451
+ {
3452
+ term: "event",
3453
+ synonyms: [
3454
+ { term: "emit", grade: "moderate" },
3455
+ { term: "trigger", grade: "moderate" },
3456
+ { term: "signal", grade: "weak" },
3457
+ { term: "message", grade: "weak" }
3458
+ ]
3459
+ },
3460
+ {
3461
+ term: "util",
3462
+ synonyms: [
3463
+ { term: "utility", grade: "strong" },
3464
+ { term: "utils", grade: "strong" },
3465
+ { term: "helper", grade: "strong" },
3466
+ { term: "common", grade: "weak" }
3467
+ ]
3468
+ },
3469
+ {
3470
+ term: "helper",
3471
+ synonyms: [
3472
+ { term: "util", grade: "strong" },
3473
+ { term: "utility", grade: "strong" },
3474
+ { term: "support", grade: "weak" }
3475
+ ]
3476
+ },
3477
+ {
3478
+ term: "parse",
3479
+ synonyms: [
3480
+ { term: "decode", grade: "moderate" },
3481
+ { term: "deserialize", grade: "moderate" },
3482
+ { term: "extract", grade: "weak" }
3483
+ ]
3484
+ },
3485
+ {
3486
+ term: "serialize",
3487
+ synonyms: [
3488
+ { term: "encode", grade: "moderate" },
3489
+ { term: "stringify", grade: "moderate" },
3490
+ { term: "convert", grade: "weak" }
3491
+ ]
3492
+ },
3493
+ {
3494
+ term: "get",
3495
+ synonyms: [
3496
+ { term: "fetch", grade: "strong" },
3497
+ { term: "retrieve", grade: "strong" },
3498
+ { term: "find", grade: "moderate" },
3499
+ { term: "load", grade: "moderate" }
3500
+ ]
3501
+ },
3502
+ {
3503
+ term: "set",
3504
+ synonyms: [
3505
+ { term: "assign", grade: "strong" },
3506
+ { term: "store", grade: "moderate" },
3507
+ { term: "save", grade: "moderate" }
3508
+ ]
3509
+ },
3510
+ {
3511
+ term: "find",
3512
+ synonyms: [
3513
+ { term: "search", grade: "strong" },
3514
+ { term: "locate", grade: "strong" },
3515
+ { term: "lookup", grade: "moderate" },
3516
+ { term: "get", grade: "moderate" }
3517
+ ]
3518
+ },
3519
+ {
3520
+ term: "create",
3521
+ synonyms: [
3522
+ { term: "make", grade: "strong" },
3523
+ { term: "build", grade: "strong" },
3524
+ { term: "new", grade: "moderate" },
3525
+ { term: "generate", grade: "moderate" }
3526
+ ]
3527
+ },
3528
+ {
3529
+ term: "send",
3530
+ synonyms: [
3531
+ { term: "emit", grade: "moderate" },
3532
+ { term: "dispatch", grade: "moderate" },
3533
+ { term: "post", grade: "moderate" },
3534
+ { term: "transmit", grade: "weak" }
3535
+ ]
3536
+ },
3537
+ {
3538
+ term: "receive",
3539
+ synonyms: [
3540
+ { term: "accept", grade: "moderate" },
3541
+ { term: "handle", grade: "moderate" },
3542
+ { term: "process", grade: "weak" }
3543
+ ]
3544
+ }
3545
+ ]
3546
+ };
3547
+ defaultLookupMap = buildLookupMap(DEFAULT_LEXICON);
3548
+ });
3549
+
2953
3550
  // src/domain/services/index.ts
2954
3551
  var init_services = __esm(() => {
2955
3552
  init_keywords();
@@ -2957,6 +3554,7 @@ var init_services = __esm(() => {
2957
3554
  init_queryLiteralParser();
2958
3555
  init_literalExtractor();
2959
3556
  init_literalScorer();
3557
+ init_lexicon2();
2960
3558
  });
2961
3559
 
2962
3560
  // src/modules/language/typescript/parseCode.ts
@@ -3277,6 +3875,11 @@ var init_symbolicIndex = __esm(() => {
3277
3875
  });
3278
3876
 
3279
3877
  // src/infrastructure/storage/literalIndex.ts
3878
+ var exports_literalIndex = {};
3879
+ __export(exports_literalIndex, {
3880
+ getLiteralIndexPath: () => getLiteralIndexPath,
3881
+ LiteralIndex: () => LiteralIndex
3882
+ });
3280
3883
  import * as fs4 from "fs/promises";
3281
3884
  import * as path9 from "path";
3282
3885
 
@@ -3329,6 +3932,22 @@ class LiteralIndex {
3329
3932
  }
3330
3933
  }
3331
3934
  }
3935
+ removeFile(filepath) {
3936
+ let removed = 0;
3937
+ for (const [key, entries] of this.entries) {
3938
+ const filtered = entries.filter((e) => e.filepath !== filepath);
3939
+ const removedCount = entries.length - filtered.length;
3940
+ if (removedCount > 0) {
3941
+ removed += removedCount;
3942
+ if (filtered.length === 0) {
3943
+ this.entries.delete(key);
3944
+ } else {
3945
+ this.entries.set(key, filtered);
3946
+ }
3947
+ }
3948
+ }
3949
+ return removed;
3950
+ }
3332
3951
  findMatches(queryLiterals) {
3333
3952
  const matches = [];
3334
3953
  for (const queryLiteral of queryLiterals) {
@@ -3421,6 +4040,9 @@ function shouldReplaceMatchType(existing, incoming) {
3421
4040
  };
3422
4041
  return priority[incoming] > priority[existing];
3423
4042
  }
4043
+ function getLiteralIndexPath(rootDir, moduleId, indexDir = ".raggrep") {
4044
+ return path9.join(rootDir, indexDir, "index", moduleId, "literals");
4045
+ }
3424
4046
  var init_literalIndex = () => {};
3425
4047
 
3426
4048
  // src/infrastructure/storage/index.ts
@@ -3583,6 +4205,16 @@ class TypeScriptModule {
3583
4205
  await this.symbolicIndex.save();
3584
4206
  this.literalIndex = new LiteralIndex(indexDir, this.id);
3585
4207
  await this.literalIndex.initialize();
4208
+ const indexedFilepaths = new Set;
4209
+ for (const filepath of this.pendingSummaries.keys()) {
4210
+ indexedFilepaths.add(filepath);
4211
+ }
4212
+ for (const { filepath } of this.pendingLiterals.values()) {
4213
+ indexedFilepaths.add(filepath);
4214
+ }
4215
+ for (const filepath of indexedFilepaths) {
4216
+ this.literalIndex.removeFile(filepath);
4217
+ }
3586
4218
  for (const [chunkId, { filepath, literals }] of this.pendingLiterals) {
3587
4219
  this.literalIndex.addLiterals(chunkId, filepath, literals);
3588
4220
  }
@@ -3625,7 +4257,12 @@ class TypeScriptModule {
3625
4257
  });
3626
4258
  }
3627
4259
  const semanticQuery = remainingQuery.trim() || query;
3628
- const queryEmbedding = await getEmbedding(semanticQuery);
4260
+ const expandedQuery = expandQuery(semanticQuery, undefined, {
4261
+ maxDepth: 1,
4262
+ includeWeak: false,
4263
+ maxTerms: 10
4264
+ });
4265
+ const queryEmbedding = await getEmbedding(expandedQuery.expandedQueryString);
3629
4266
  const bm25Index = new BM25Index;
3630
4267
  const allChunksData = [];
3631
4268
  for (const filepath of filesToSearch) {
@@ -3705,7 +4342,8 @@ class TypeScriptModule {
3705
4342
  literalMultiplier: literalContribution.multiplier,
3706
4343
  literalMatchType: literalContribution.bestMatchType,
3707
4344
  literalConfidence: literalContribution.bestConfidence,
3708
- literalMatchCount: literalContribution.matchCount
4345
+ literalMatchCount: literalContribution.matchCount,
4346
+ synonymsUsed: expandedQuery.wasExpanded ? expandedQuery.expandedTerms.filter((t) => t.source !== "original").map((t) => t.term) : undefined
3709
4347
  }
3710
4348
  });
3711
4349
  }
@@ -5039,6 +5677,7 @@ async function ensureIndexFresh(rootDir, options = {}) {
5039
5677
  filesToRemove.push(filepath);
5040
5678
  }
5041
5679
  }
5680
+ const removedFilepaths = [];
5042
5681
  for (const filepath of filesToRemove) {
5043
5682
  logger.debug(` Removing stale: ${filepath}`);
5044
5683
  const indexFilePath = path16.join(indexPath, filepath.replace(/\.[^.]+$/, ".json"));
@@ -5050,8 +5689,21 @@ async function ensureIndexFresh(rootDir, options = {}) {
5050
5689
  await fs7.unlink(symbolicFilePath);
5051
5690
  } catch {}
5052
5691
  delete manifest.files[filepath];
5692
+ removedFilepaths.push(filepath);
5053
5693
  totalRemoved++;
5054
5694
  }
5695
+ if (removedFilepaths.length > 0) {
5696
+ try {
5697
+ const { LiteralIndex: LiteralIndex2 } = await Promise.resolve().then(() => (init_literalIndex(), exports_literalIndex));
5698
+ const raggrepDir = getRaggrepDir(rootDir, config);
5699
+ const literalIndex = new LiteralIndex2(raggrepDir, module.id);
5700
+ await literalIndex.initialize();
5701
+ for (const filepath of removedFilepaths) {
5702
+ literalIndex.removeFile(filepath);
5703
+ }
5704
+ await literalIndex.save();
5705
+ } catch {}
5706
+ }
5055
5707
  const ctx = {
5056
5708
  rootDir,
5057
5709
  config,
@@ -5588,7 +6240,7 @@ init_logger();
5588
6240
  // package.json
5589
6241
  var package_default = {
5590
6242
  name: "raggrep",
5591
- version: "0.7.0",
6243
+ version: "0.8.0",
5592
6244
  description: "Local filesystem-based RAG system for codebases - semantic search using local embeddings",
5593
6245
  type: "module",
5594
6246
  main: "./dist/index.js",
@@ -6049,4 +6701,4 @@ Run 'raggrep <command> --help' for more information.
6049
6701
  }
6050
6702
  main();
6051
6703
 
6052
- //# debugId=4DE86C1D7DC4E21964756E2164756E21
6704
+ //# debugId=400EC2685467A28B64756E2164756E21