sweet-search 2.6.5 → 2.6.7

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.
@@ -1394,7 +1394,11 @@ export class GraphExtractor {
1394
1394
 
1395
1395
  const groupEnd = j - 1;
1396
1396
  const groupContent = source.slice(start, groupEnd);
1397
- const isOptional = source[groupEnd + 1] === '?';
1397
+ // A group quantified by `?` OR `*` can match zero times, so the tokens
1398
+ // AFTER it (e.g. the real keyword) may start the line. Treating a `(?:…)*`
1399
+ // modifier prefix as mandatory wrongly rejected lines like `class Foo`
1400
+ // (QL/Vala/Haxe leading-modifier patterns), dropping all their entities.
1401
+ const isOptional = source[groupEnd + 1] === '?' || source[groupEnd + 1] === '*';
1398
1402
  if (!isOptional) {
1399
1403
  const alternatives = groupContent.split('|').map((alt) => alt.trim()).filter(Boolean);
1400
1404
  const altTokens = [];
@@ -1409,7 +1413,14 @@ export class GraphExtractor {
1409
1413
  const optionalAlternatives = groupContent.split('|').map((alt) => alt.trim()).filter(Boolean);
1410
1414
  for (const alt of optionalAlternatives) {
1411
1415
  const token = this.extractLiteralPrefix(alt);
1412
- if (token) tokens.push(token);
1416
+ // A nested group / non-literal alternative (e.g. `(?:(?:public|…)\s+)*`)
1417
+ // means we cannot enumerate every literal this optional prefix could
1418
+ // start with. Adding only the literals we *can* see would
1419
+ // false-negative lines that begin with an un-enumerated one (Vala/Haxe
1420
+ // `public class Foo`). Disabling the prefilter is the only
1421
+ // correctness-preserving choice; the full regex still runs per line.
1422
+ if (!token) return [];
1423
+ tokens.push(token);
1413
1424
  }
1414
1425
  i = groupEnd + 2;
1415
1426
  while (skipLeadingWhitespace()) {}
@@ -235,6 +235,503 @@ export const TOOLING_LANGUAGES = {
235
235
  skipCallObjects: [],
236
236
  },
237
237
  },
238
+ // ─── Julia (graph-only spike) ────────────────────────────────────────────────
239
+ // No `chunker` key → getLanguageByExtension returns chunker:null → ast-chunker
240
+ // keeps Julia on generic windowing. The `graph` patterns alone enable
241
+ // regex-based entity extraction so ss-trace/code-graph works.
242
+ julia: {
243
+ indentBased: false,
244
+ endKeyword: null,
245
+ comment: { line: "#", block: ["#=", "=#"] },
246
+ graph: {
247
+ entities: {
248
+ function: /^\s*function\s+([A-Za-z_]\w*)/,
249
+ shortFunction: /^\s*([A-Za-z_]\w*)\((?:[^()]*)\)\s*(?:::[\w.<>{} ]+)?\s*=(?!=)/,
250
+ struct: /^\s*(?:mutable\s+)?struct\s+([A-Za-z_]\w*)/,
251
+ module: /^\s*module\s+([A-Za-z_]\w*)/,
252
+ },
253
+ relationships: {
254
+ import: /^\s*(?:using|import)\s+([\w.]+)/,
255
+ },
256
+ skipCallObjects: [],
257
+ },
258
+ },
259
+ // ════════════════════════════════════════════════════════════════════════════
260
+ // GRAPH-ONLY language entries (no `chunker` key → chunking stays generic via
261
+ // parseGenericFile; the `graph` regexes enable ss-trace / code-graph symbol
262
+ // extraction). Authored 2026-06 from each language's tree-sitter tags.scm /
263
+ // universal-ctags conventions. Entity-type keys are free-form (the regex graph
264
+ // path accepts any label, like Rust's existing const/static/type).
265
+ // ════════════════════════════════════════════════════════════════════════════
266
+ clojure: {
267
+ indentBased: false, endKeyword: null,
268
+ comment: { line: ";", block: null },
269
+ graph: {
270
+ entities: {
271
+ function: /^\s*\(def(?:n-?|multi|method)\s+(?:\^(?:\{[^}]*\}|\S+)\s+)*([A-Za-z0-9*+!?<>=.\/'-]+)/,
272
+ macro: /^\s*\(defmacro\s+(?:\^(?:\{[^}]*\}|\S+)\s+)*([A-Za-z0-9*+!?<>=.\/'-]+)/,
273
+ struct: /^\s*\(def(?:record|type)\s+(?:\^(?:\{[^}]*\}|\S+)\s+)*([A-Za-z0-9*+!?<>=.\/'-]+)/,
274
+ interface: /^\s*\(defprotocol\s+(?:\^(?:\{[^}]*\}|\S+)\s+)*([A-Za-z0-9*+!?<>=.\/'-]+)/,
275
+ constant: /^\s*\(def\s+(?:\^(?:\{[^}]*\}|\S+)\s+)*([A-Za-z0-9*+!?<>=.\/'-]+)/,
276
+ module: /^\s*\(ns\s+([A-Za-z0-9*+!?<>=.\/'-]+)/,
277
+ },
278
+ relationships: { import: /^\s*\(:?(?:require|use)\s+'?\[?([A-Za-z0-9.*_-]+)/ },
279
+ skipCallObjects: ["let", "let*", "if", "when", "do", "fn", "map", "filter", "reduce"],
280
+ },
281
+ },
282
+ elisp: {
283
+ indentBased: false, endKeyword: null,
284
+ comment: { line: ";", block: null },
285
+ graph: {
286
+ entities: {
287
+ function: /^\s*\((?:cl-)?def(?:un|subst)\s+([A-Za-z0-9*+!?<>=\/_-]+)/,
288
+ macro: /^\s*\((?:cl-)?defmacro\s+([A-Za-z0-9*+!?<>=\/_-]+)/,
289
+ variable: /^\s*\(def(?:var|custom)\s+([A-Za-z0-9*+!?<>=\/_-]+)/,
290
+ constant: /^\s*\(defconst\s+([A-Za-z0-9*+!?<>=\/_-]+)/,
291
+ module: /^\s*\(defgroup\s+([A-Za-z0-9*+!?<>=\/_-]+)/,
292
+ },
293
+ relationships: { import: /^\s*\(require\s+'([A-Za-z0-9*+!?<>=\/_-]+)/ },
294
+ skipCallObjects: ["let", "let*", "if", "when", "unless", "cond", "setq", "lambda", "progn"],
295
+ },
296
+ },
297
+ haskell: {
298
+ indentBased: false, endKeyword: null,
299
+ comment: { line: "--", block: ["{-", "-}"] },
300
+ graph: {
301
+ entities: {
302
+ function: /^\s*([a-z_][\w']*)\s*::/,
303
+ type: /^\s*(?:data|newtype|type)\s+([A-Z]\w*)/,
304
+ class: /^\s*class\s+(?:.*?=>\s*)?([A-Z]\w*)/,
305
+ instance: /^\s*instance\s+(?:.*?=>\s*)?([A-Z]\w*)/,
306
+ module: /^\s*module\s+([A-Z][\w.]*)/,
307
+ },
308
+ relationships: { import: /^\s*import\s+(?:qualified\s+)?([A-Z][\w.]*)/ },
309
+ skipCallObjects: ["map", "filter", "foldr", "foldl", "return", "pure", "print", "putStrLn", "fmap", "show"],
310
+ },
311
+ },
312
+ erlang: {
313
+ indentBased: false, endKeyword: null,
314
+ comment: { line: "%", block: null },
315
+ graph: {
316
+ entities: {
317
+ module: /^\s*-module\(\s*([a-z]\w*)/,
318
+ function: /^\s*(?!fun\b)([a-z]\w*)\s*\((?:(?!fun\b).)*\)\s*(?:when\b.*)?->/,
319
+ struct: /^\s*-record\(\s*([a-z]\w*)/,
320
+ macro: /^\s*-define\(\s*([A-Za-z_]\w*)/,
321
+ },
322
+ relationships: {
323
+ import: /^\s*-import\(\s*([a-z]\w*)/,
324
+ include: /^\s*-include(?:_lib)?\(\s*"([^"]+)"/,
325
+ inherit: /^\s*-behaviou?r\(\s*([a-z]\w*)/,
326
+ },
327
+ skipCallObjects: ["lists", "io", "erlang", "maps", "string", "proplists", "gen_server"],
328
+ },
329
+ },
330
+ elm: {
331
+ indentBased: false, endKeyword: null,
332
+ comment: { line: "--", block: ["{-", "-}"] },
333
+ graph: {
334
+ entities: {
335
+ function: /^\s*([a-z]\w*)\s*:/,
336
+ type: /^\s*type\s+alias\s+([A-Z]\w*)/,
337
+ enum: /^\s*type\s+([A-Z]\w*)/,
338
+ port: /^\s*port\s+([a-z]\w*)\s*:/,
339
+ module: /^\s*(?:port\s+|effect\s+)?module\s+([A-Z][\w.]*)/,
340
+ },
341
+ relationships: { import: /^\s*import\s+([A-Z][\w.]*)/ },
342
+ skipCallObjects: ["List", "Maybe", "Result", "Html", "String", "Debug"],
343
+ },
344
+ },
345
+ r: {
346
+ indentBased: false, endKeyword: null,
347
+ comment: { line: "#", block: null },
348
+ graph: {
349
+ entities: {
350
+ function: /^\s*([A-Za-z.][\w.]*)\s*(?:<<?-|=)\s*function\b/,
351
+ class: /^\s*set(?:Ref)?Class\s*\(\s*["']([A-Za-z.][\w.]*)["']/,
352
+ method: /^\s*setMethod\s*\(\s*["']([A-Za-z.][\w.]*)["']/,
353
+ },
354
+ relationships: {
355
+ import: /^\s*(?:library|require)\s*\(\s*["']?([A-Za-z.][\w.]*)["']?/,
356
+ source: /^\s*source\s*\(\s*["']([^"']+)["']/,
357
+ },
358
+ skipCallObjects: ["c", "list", "print", "cat", "paste", "paste0", "return", "stop", "warning"],
359
+ },
360
+ },
361
+ perl: {
362
+ indentBased: false, endKeyword: null,
363
+ comment: { line: "#", block: null },
364
+ graph: {
365
+ entities: {
366
+ function: /^\s*sub\s+([A-Za-z_]\w*)/,
367
+ module: /^\s*package\s+([\w:]+)/,
368
+ constant: /^\s*use\s+constant\s+([A-Za-z_]\w*)/,
369
+ },
370
+ relationships: {
371
+ import: /^\s*(?:use|require)\s+([A-Z][\w:]*)/,
372
+ inherit: /^\s*use\s+(?:parent|base)\s+(?:-norequire\s*,?\s*)?(?:qw[(\/{[|]\s*)?["']?([\w:]+)["']?/,
373
+ },
374
+ skipCallObjects: ["print", "say", "shift", "push", "pop", "return", "my", "scalar", "keys", "values"],
375
+ },
376
+ },
377
+ tcl: {
378
+ indentBased: false, endKeyword: null,
379
+ comment: { line: "#", block: null },
380
+ graph: {
381
+ entities: {
382
+ function: /^\s*proc\s+([^\s{]+)/,
383
+ module: /^\s*namespace\s+eval\s+([^\s{]+)/,
384
+ },
385
+ relationships: {
386
+ import: /^\s*package\s+require\s+([\w:]+)/,
387
+ source: /^\s*source\s+(\S+)/,
388
+ },
389
+ skipCallObjects: ["set", "puts", "expr", "return", "string", "list", "lappend", "incr", "if", "foreach"],
390
+ },
391
+ },
392
+ vim: {
393
+ indentBased: false, endKeyword: null,
394
+ comment: { line: '"', block: null },
395
+ graph: {
396
+ entities: {
397
+ function: /^\s*func(?:tion)?!?\s+([A-Za-z_<][\w#:.>]*)/,
398
+ command: /^\s*command!?\s+(?:-\S+\s+)*([A-Z]\w*)/,
399
+ constant: /^\s*let\s+([gsb]:[A-Za-z_]\w*)/,
400
+ },
401
+ relationships: { import: /^\s*(?:source|runtime)!?\s+(\S+)/ },
402
+ skipCallObjects: ["echo", "echom", "call", "let", "set", "execute", "normal"],
403
+ },
404
+ },
405
+ crystal: {
406
+ indentBased: false, endKeyword: "end",
407
+ comment: { line: "#", block: null },
408
+ graph: {
409
+ entities: {
410
+ method: /^\s*def\s+(?:self\.)?([A-Za-z_]\w*[!?=]?)/,
411
+ class: /^\s*(?:abstract\s+)?class\s+([A-Z]\w*)/,
412
+ module: /^\s*module\s+([A-Z]\w*)/,
413
+ struct: /^\s*(?:abstract\s+)?struct\s+([A-Z]\w*)/,
414
+ enum: /^\s*enum\s+([A-Z]\w*)/,
415
+ macro: /^\s*macro\s+([A-Za-z_]\w*)/,
416
+ },
417
+ relationships: {
418
+ import: /^\s*require\s+"([^"]+)"/,
419
+ inherit: /^\s*(?:abstract\s+)?(?:class|struct)\s+[A-Z]\w*\s*<\s*([A-Z][\w:]*)/,
420
+ include: /^\s*(?:include|extend)\s+([A-Z][\w:]*)/,
421
+ },
422
+ skipCallObjects: ["puts", "print", "p", "pp", "raise", "self"],
423
+ },
424
+ },
425
+ fortran: {
426
+ indentBased: false, endKeyword: null,
427
+ comment: { line: "!", block: null },
428
+ graph: {
429
+ entities: {
430
+ module: /^\s*(?:module(?!\s+(?:procedure|subroutine|function)\b)|program)\s+([a-z_]\w*)/i,
431
+ function: /^\s*(?!end\b)(?:[\w()*,:=.]+\s+)*?(?:subroutine|function)\s+([a-z_]\w*)/i,
432
+ struct: /^\s*type\b\s*(?:,[^:]*)?(?:::\s*)?(?!is\b)([a-z_]\w*)/i,
433
+ interface: /^\s*interface\s+([a-z_]\w*)/i,
434
+ },
435
+ relationships: { use: /^\s*use\b\s*(?:,[^:]*::\s*)?([a-z_]\w*)/i },
436
+ skipCallObjects: [],
437
+ },
438
+ },
439
+ cobol: {
440
+ indentBased: false, endKeyword: null,
441
+ comment: { line: "*>", block: null },
442
+ graph: {
443
+ entities: {
444
+ module: /^\s*program-id\s*\.\s*([a-z0-9][a-z0-9-]*)/i,
445
+ class: /^\s*([a-z0-9][a-z0-9-]*)\s+section\s*\./i,
446
+ function: /^\s*(?!(?:end-[a-z]+|exit|goback|continue|stop)\b)([a-z0-9][a-z0-9-]*)\s*\.\s*$/i,
447
+ },
448
+ relationships: {
449
+ copyFrom: /^\s*copy\s+([a-z0-9][a-z0-9-]*)/i,
450
+ // CALL "subprog" → dependency edge (`call` is not a mapped relationship
451
+ // type; `dep` is the canonical generic-dependency key).
452
+ dep: /^\s*call\s+["']([a-z0-9][a-z0-9-]*)/i,
453
+ },
454
+ skipCallObjects: [],
455
+ },
456
+ },
457
+ assembly: {
458
+ indentBased: false, endKeyword: null,
459
+ comment: { line: ";", block: ["/*", "*/"] },
460
+ graph: {
461
+ entities: {
462
+ function: /^([a-zA-Z_][\w$.]*)\s*:/,
463
+ macro: /^\s*(?:\.macro\s+|%macro\s+|%define\s+)([a-zA-Z_][\w$.]*)/i,
464
+ constant: /^\s*([a-zA-Z_][\w$.]*)\s+equ\b/i,
465
+ },
466
+ relationships: {
467
+ import: /^\s*(?:\.extern|extern)\s+([a-zA-Z_][\w$.]*)/i,
468
+ include: /^\s*(?:%include|\.include)\s+["']?([^"'\s,]+)/i,
469
+ },
470
+ skipCallObjects: [],
471
+ },
472
+ },
473
+ pascal: {
474
+ indentBased: false, endKeyword: null,
475
+ comment: { line: "//", block: ["{", "}"] },
476
+ graph: {
477
+ entities: {
478
+ module: /^\s*(?:unit|program|library)\s+([a-z_]\w*)/i,
479
+ function: /^\s*(?:procedure|function)\s+([a-z_][\w.]*)/i,
480
+ class: /^\s*([a-z_]\w*)\s*=\s*class\b/i,
481
+ struct: /^\s*([a-z_]\w*)\s*=\s*(?:packed\s+)?(?:record|object)\b/i,
482
+ interface: /^\s*([a-z_]\w*)\s*=\s*interface\b/i,
483
+ enum: /^\s*([a-z_]\w*)\s*=\s*\(\s*[a-z_]\w*(?:\s*,\s*[a-z_]\w*)*\s*\)\s*;?/i,
484
+ },
485
+ relationships: { plainImport: /^\s*uses\s+([a-z_][\w.,\s]*)/i },
486
+ skipCallObjects: [],
487
+ },
488
+ },
489
+ vala: {
490
+ indentBased: false, endKeyword: null,
491
+ comment: { line: "//", block: ["/*", "*/"] },
492
+ graph: {
493
+ entities: {
494
+ module: /^\s*(?:public\s+)?namespace\s+([A-Za-z_][\w.]*)/,
495
+ class: /^\s*(?:(?:public|private|protected|internal|abstract|sealed|static)\s+)*class\s+([A-Za-z_]\w*)/,
496
+ interface: /^\s*(?:(?:public|private|protected|internal)\s+)*interface\s+([A-Za-z_]\w*)/,
497
+ struct: /^\s*(?:(?:public|private|protected|internal)\s+)*struct\s+([A-Za-z_]\w*)/,
498
+ enum: /^\s*(?:(?:public|private|protected|internal)\s+)*enum\s+([A-Za-z_]\w*)/,
499
+ method: /^\s*(?!return\b|if\b|else\b|while\b|for\b|foreach\b|switch\b|case\b|do\b|new\b|throw\b|yield\b)(?:(?:public|private|protected|internal|static|virtual|override|abstract|async|extern|inline|sealed|weak|unowned|owned|const|signal|delegate)\s+)*[\w.<>?\[\]*]+\s+([a-z_]\w*)\s*\(/,
500
+ },
501
+ relationships: { using: /^\s*using\s+([A-Za-z_][\w.]*)/ },
502
+ skipCallObjects: [],
503
+ },
504
+ },
505
+ haxe: {
506
+ indentBased: false, endKeyword: null,
507
+ comment: { line: "//", block: ["/*", "*/"] },
508
+ graph: {
509
+ entities: {
510
+ module: /^\s*package\s+([\w.]+)/,
511
+ class: /^\s*(?:(?:public|private|extern|final)\s+)*class\s+([A-Za-z_]\w*)/,
512
+ interface: /^\s*(?:(?:public|private|extern)\s+)*interface\s+([A-Za-z_]\w*)/,
513
+ enum: /^\s*(?:(?:public|private|extern)\s+)*enum\s+(?!abstract\b)([A-Za-z_]\w*)/,
514
+ type: /^\s*(?:(?:public|private)\s+)*typedef\s+([A-Za-z_]\w*)/,
515
+ struct: /^\s*(?:(?:public|private|extern)\s+)*(?:enum\s+)?abstract\s+([A-Za-z_]\w*)/,
516
+ method: /^\s*(?:[\w@:.]+\s+)*function\s+([A-Za-z_]\w*)/,
517
+ },
518
+ relationships: {
519
+ import: /^\s*import\s+([\w.*]+)/,
520
+ using: /^\s*using\s+([\w.]+)/,
521
+ },
522
+ skipCallObjects: [],
523
+ },
524
+ },
525
+ nix: {
526
+ indentBased: false, endKeyword: null,
527
+ comment: { line: "#", block: ["/*", "*/"] },
528
+ graph: {
529
+ // Require BOTH a space before `=` (rejects shell `VAR=val` in build-script
530
+ // strings) AND a trailing `;`/`{` (real Nix attrs always terminate with
531
+ // `;`, or open a nested attrset with `{`) — this drops the actively-harmful
532
+ // false positives from spaced `key = value` config embedded in `''…''`
533
+ // string literals (INI/systemd/gitconfig content), at the cost of missing
534
+ // multi-line string attrs (`x = ''`). Conservative by design.
535
+ entities: { constant: /^\s*([\w'.-]+)\s+=\s*(?!=).*?[;{]\s*$/ },
536
+ relationships: {},
537
+ skipCallObjects: [],
538
+ },
539
+ },
540
+ glsl: {
541
+ indentBased: false, endKeyword: null,
542
+ comment: { line: "//", block: ["/*", "*/"] },
543
+ graph: {
544
+ entities: {
545
+ function: /^\s*(?!(?:if|for|while|switch|else|return|do|case|default)\b)(?:[A-Za-z_]\w*[\s*&]+){1,8}([A-Za-z_]\w*)\s*\(/,
546
+ struct: /^\s*struct\s+([A-Za-z_]\w*)/,
547
+ constant: /^\s*#\s*define\s+([A-Za-z_]\w*)/,
548
+ type: /^\s*layout\s*\([^)]*\)\s*(?:uniform|buffer)\s+([A-Za-z_]\w*)\s*\{/,
549
+ },
550
+ relationships: { import: /^\s*#\s*include\s+[<"]([^>"]+)[>"]/ },
551
+ skipCallObjects: ["gl_Position", "gl_FragCoord", "gl_FragColor", "gl_FragDepth", "gl_VertexID", "gl_InstanceID"],
552
+ },
553
+ },
554
+ hlsl: {
555
+ indentBased: false, endKeyword: null,
556
+ comment: { line: "//", block: ["/*", "*/"] },
557
+ graph: {
558
+ entities: {
559
+ function: /^\s*(?!(?:if|for|while|switch|else|return|do|case|default)\b)(?:[A-Za-z_]\w*[\s*&]+){1,8}([A-Za-z_]\w*)\s*\(/,
560
+ struct: /^\s*struct\s+([A-Za-z_]\w*)/,
561
+ constant: /^\s*#\s*define\s+([A-Za-z_]\w*)/,
562
+ type: /^\s*(?:cbuffer|tbuffer|ConstantBuffer)\s+([A-Za-z_]\w*)/,
563
+ },
564
+ relationships: { import: /^\s*#\s*include\s+[<"]([^>"]+)[>"]/ },
565
+ skipCallObjects: ["input", "output", "SV_Target", "SV_Position", "SV_Depth"],
566
+ },
567
+ },
568
+ metal: {
569
+ indentBased: false, endKeyword: null,
570
+ comment: { line: "//", block: ["/*", "*/"] },
571
+ graph: {
572
+ entities: {
573
+ function: /^\s*(?!(?:if|for|while|switch|else|return|do|case|default)\b)(?:[A-Za-z_]\w*[\s*&]+){1,8}([A-Za-z_]\w*)\s*\(/,
574
+ struct: /^\s*struct\s+([A-Za-z_]\w*)/,
575
+ constant: /^\s*#\s*define\s+([A-Za-z_]\w*)/,
576
+ },
577
+ relationships: { import: /^\s*#\s*(?:include|import)\s+[<"]([^>"]+)[>"]/ },
578
+ skipCallObjects: ["metal", "simd", "threadgroup", "device", "constant"],
579
+ },
580
+ },
581
+ wgsl: {
582
+ indentBased: false, endKeyword: null,
583
+ comment: { line: "//", block: ["/*", "*/"] },
584
+ graph: {
585
+ entities: {
586
+ function: /^\s*fn\s+([A-Za-z_]\w*)/,
587
+ struct: /^\s*struct\s+([A-Za-z_]\w*)/,
588
+ constant: /^\s*(?:@\w+\([^)]*\)\s*)*(?:const|override|var(?:<[^>]*>)?)\s+([A-Za-z_]\w*)/,
589
+ },
590
+ relationships: {},
591
+ skipCallObjects: [],
592
+ },
593
+ },
594
+ shaderlab: {
595
+ indentBased: false, endKeyword: null,
596
+ comment: { line: "//", block: ["/*", "*/"] },
597
+ graph: {
598
+ entities: {
599
+ type: /^\s*Shader\s+"([^"]+)"/,
600
+ function: /^\s*(?!(?:if|for|while|switch|else|return|do|case|default)\b)(?:[A-Za-z_]\w*[\s*&]+){1,8}([A-Za-z_]\w*)\s*\(/,
601
+ struct: /^\s*struct\s+([A-Za-z_]\w*)/,
602
+ constant: /^\s*(_[A-Za-z]\w*)\s*\(\s*"/,
603
+ },
604
+ relationships: { import: /^\s*#\s*include\s+[<"]([^>"]+)[>"]/ },
605
+ skipCallObjects: ["UNITY_MATRIX_MVP", "_Time", "_WorldSpaceCameraPos", "unity_ObjectToWorld"],
606
+ },
607
+ },
608
+ cg: {
609
+ indentBased: false, endKeyword: null,
610
+ comment: { line: "//", block: ["/*", "*/"] },
611
+ graph: {
612
+ entities: {
613
+ function: /^\s*(?!(?:if|for|while|switch|else|return|do|case|default)\b)(?:[A-Za-z_]\w*[\s*&]+){1,8}([A-Za-z_]\w*)\s*\(/,
614
+ struct: /^\s*struct\s+([A-Za-z_]\w*)/,
615
+ constant: /^\s*#\s*define\s+([A-Za-z_]\w*)/,
616
+ },
617
+ relationships: { import: /^\s*#\s*include\s+[<"]([^>"]+)[>"]/ },
618
+ skipCallObjects: ["UNITY_MATRIX_MVP", "_Time", "_WorldSpaceCameraPos"],
619
+ },
620
+ },
621
+ hcl: {
622
+ indentBased: false, endKeyword: null,
623
+ comment: { line: "#", block: ["/*", "*/"] },
624
+ graph: {
625
+ entities: {
626
+ resource: /^\s*resource\s+"[^"]+"\s+"([^"]+)"/,
627
+ data: /^\s*data\s+"[^"]+"\s+"([^"]+)"/,
628
+ variable: /^\s*variable\s+"([^"]+)"/,
629
+ module: /^\s*module\s+"([^"]+)"/,
630
+ output: /^\s*output\s+"([^"]+)"/,
631
+ provider: /^\s*provider\s+"([^"]+)"/,
632
+ },
633
+ relationships: { import: /^\s*source\s*=\s*"([^"]+)"/ },
634
+ skipCallObjects: [],
635
+ },
636
+ },
637
+ cmake: {
638
+ indentBased: false, endKeyword: null,
639
+ comment: { line: "#", block: null },
640
+ graph: {
641
+ entities: {
642
+ function: /^\s*function\s*\(\s*([A-Za-z_]\w*)/i,
643
+ macro: /^\s*macro\s*\(\s*([A-Za-z_]\w*)/i,
644
+ constant: /^\s*set\s*\(\s*([A-Za-z_]\w*)/i,
645
+ },
646
+ relationships: { import: /^\s*(?:include|add_subdirectory|find_package)\s*\(\s*([A-Za-z_0-9./${}-]+)/i },
647
+ skipCallObjects: [],
648
+ },
649
+ },
650
+ gradle: {
651
+ indentBased: false, endKeyword: null,
652
+ comment: { line: "//", block: ["/*", "*/"] },
653
+ graph: {
654
+ entities: {
655
+ task: /^\s*task\s+([A-Za-z_]\w*)/,
656
+ def: /^\s*def\s+([A-Za-z_]\w*)/,
657
+ },
658
+ relationships: { import: /^\s*import\s+([\w.]+)/ },
659
+ skipCallObjects: [],
660
+ },
661
+ },
662
+ starlark: {
663
+ indentBased: true, endKeyword: null,
664
+ comment: { line: "#", block: null },
665
+ graph: {
666
+ entities: {
667
+ function: /^\s*def\s+([A-Za-z_]\w*)/,
668
+ rule: /^\s*([A-Za-z_]\w*)\s*=\s*(?:rule|provider|aspect|repository_rule|tag_class|module_extension)\s*\(/,
669
+ },
670
+ relationships: { import: /^\s*load\s*\(\s*["']([^"']+)["']/ },
671
+ skipCallObjects: [],
672
+ },
673
+ },
674
+ ql: {
675
+ indentBased: false, endKeyword: null,
676
+ comment: { line: "//", block: ["/*", "*/"] },
677
+ graph: {
678
+ entities: {
679
+ class: /^\s*(?:abstract\s+|final\s+|private\s+|library\s+|deprecated\s+|additional\s+|external\s+|extensible\s+)*class\s+([A-Za-z_]\w*)/,
680
+ function: /^\s*(?:abstract\s+|cached\s+|private\s+|final\s+|override\s+|additional\s+|deprecated\s+|library\s+|external\s+|extensible\s+|pragma\s*\[[^\]]*\]\s+|bindingset\s*\[[^\]]*\]\s+)*(?!(?:and|or|not|if|then|else|in|exists|forall|forex|count|sum|strictsum|strictcount|any|none|select|where|from|instanceof)\b)(?:[A-Za-z_][\w.]*)\s+([a-z_]\w*)\s*\(/,
681
+ module: /^\s*(?:private\s+|library\s+)*module\s+([A-Za-z_]\w*)/,
682
+ type: /^\s*newtype\s+([A-Za-z_]\w*)/,
683
+ },
684
+ relationships: {
685
+ import: /^\s*(?:private\s+)?import\s+([\w.]+)/,
686
+ extends: /\bclass\s+\w+\s+extends\s+([\w.]+)/,
687
+ },
688
+ skipCallObjects: [],
689
+ },
690
+ },
691
+ systemrdl: {
692
+ indentBased: false, endKeyword: null,
693
+ comment: { line: "//", block: ["/*", "*/"] },
694
+ graph: {
695
+ entities: {
696
+ addrmap: /^\s*addrmap\s+([A-Za-z_]\w*)/,
697
+ regfile: /^\s*regfile\s+([A-Za-z_]\w*)/,
698
+ reg: /^\s*reg\s+([A-Za-z_]\w*)/,
699
+ field: /^\s*field\s+([A-Za-z_]\w*)/,
700
+ mem: /^\s*mem\s+([A-Za-z_]\w*)/,
701
+ signal: /^\s*signal\s+([A-Za-z_]\w*)/,
702
+ enum: /^\s*enum\s+([A-Za-z_]\w*)/,
703
+ struct: /^\s*struct\s+([A-Za-z_]\w*)/,
704
+ },
705
+ relationships: {},
706
+ skipCallObjects: [],
707
+ },
708
+ },
709
+ zeek: {
710
+ indentBased: false, endKeyword: null,
711
+ comment: { line: "#", block: null },
712
+ graph: {
713
+ entities: {
714
+ function: /^\s*function\s+([A-Za-z_][\w:]*)/,
715
+ event: /^\s*event\s+([A-Za-z_][\w:]*)/,
716
+ hook: /^\s*hook\s+([A-Za-z_][\w:]*)/,
717
+ global: /^\s*global\s+(?!function\b|event\b|hook\b)([A-Za-z_]\w*)/,
718
+ constant: /^\s*const\s+([A-Za-z_]\w*)/,
719
+ type: /^\s*type\s+([A-Za-z_]\w*)/,
720
+ module: /^\s*module\s+([A-Za-z_]\w*)/,
721
+ },
722
+ relationships: { import: /^\s*@load\s+([\w./-]+)/ },
723
+ skipCallObjects: [],
724
+ },
725
+ },
726
+ embedded_template: {
727
+ indentBased: false, endKeyword: null,
728
+ comment: { line: null, block: ["<%#", "%>"] },
729
+ graph: {
730
+ entities: {},
731
+ relationships: { include: /<%[-=]?\s*include\s*\(\s*['"`]([^'"`]+)['"`]/ },
732
+ skipCallObjects: [],
733
+ },
734
+ },
238
735
  // ─── Solidity ────────────────────────────────────────────────────────────────
239
736
  // Real chunking is done by tree-sitter-solidity (GRAMMAR_MAP); these regex
240
737
  // patterns are the fallback used only when tree-sitter is unavailable.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sweet-search",
3
- "version": "2.6.5",
3
+ "version": "2.6.7",
4
4
  "description": "Sweet Search - SOTA Hybrid Code Search Engine with WASM CatBoost Query Router, Semantic/Lexical/Structural Search, and Multilingual Support",
5
5
  "type": "module",
6
6
  "main": "core/search/sweet-search.js",
@@ -167,13 +167,13 @@
167
167
  "vitest": "^4.0.16"
168
168
  },
169
169
  "optionalDependencies": {
170
- "@sweet-search/native-darwin-arm64": "2.6.5",
171
- "@sweet-search/native-darwin-x64": "2.6.5",
172
- "@sweet-search/native-linux-arm64-gnu": "2.6.5",
173
- "@sweet-search/native-linux-arm64-gnu-cuda": "2.6.5",
174
- "@sweet-search/native-linux-x64-gnu": "2.6.5",
175
- "@sweet-search/native-linux-x64-gnu-cuda": "2.6.5",
176
- "@sweet-search/bg-priority": "2.6.5"
170
+ "@sweet-search/native-darwin-arm64": "2.6.7",
171
+ "@sweet-search/native-darwin-x64": "2.6.7",
172
+ "@sweet-search/native-linux-arm64-gnu": "2.6.7",
173
+ "@sweet-search/native-linux-arm64-gnu-cuda": "2.6.7",
174
+ "@sweet-search/native-linux-x64-gnu": "2.6.7",
175
+ "@sweet-search/native-linux-x64-gnu-cuda": "2.6.7",
176
+ "@sweet-search/bg-priority": "2.6.7"
177
177
  },
178
178
  "engines": {
179
179
  "node": ">=18.0.0"