kirograph 0.20.0 → 0.22.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/README.md +4 -3
- package/dist/bin/commands/data.js +52 -0
- package/dist/bin/commands/data.js.map +2 -2
- package/dist/bin/commands/docs.js +2 -1
- package/dist/bin/commands/docs.js.map +2 -2
- package/dist/bin/commands/gain.js +21 -1
- package/dist/bin/commands/gain.js.map +2 -2
- package/dist/bin/commands/status.js +23 -1
- package/dist/bin/commands/status.js.map +2 -2
- package/dist/bin/installer/config-prompt.js +30 -1
- package/dist/bin/installer/config-prompt.js.map +2 -2
- package/dist/bin/installer/index.js +137 -0
- package/dist/bin/installer/index.js.map +2 -2
- package/dist/bin/kirograph.js +1 -1
- package/dist/config.js +19 -2
- package/dist/config.js.map +2 -2
- package/dist/core/pipeline.js +3 -1
- package/dist/core/pipeline.js.map +2 -2
- package/dist/data/indexer.js +4 -4
- package/dist/data/indexer.js.map +2 -2
- package/dist/data/linker.js +9 -5
- package/dist/data/linker.js.map +2 -2
- package/dist/data/linker.test.js +60 -0
- package/dist/data/linker.test.js.map +7 -0
- package/dist/data/parsers/__fixtures__/pdf-inspector-stub.js +41 -0
- package/dist/data/parsers/__fixtures__/pdf-inspector-stub.js.map +7 -0
- package/dist/data/parsers/index.js +3 -1
- package/dist/data/parsers/index.js.map +2 -2
- package/dist/data/parsers/pdf.js +95 -0
- package/dist/data/parsers/pdf.js.map +7 -0
- package/dist/data/parsers/pdf.test.js +125 -0
- package/dist/data/parsers/pdf.test.js.map +7 -0
- package/dist/data/queries.js +39 -2
- package/dist/data/queries.js.map +2 -2
- package/dist/data/types.js.map +1 -1
- package/dist/db/data-schema.sql +2 -1
- package/dist/db/database.js +7 -0
- package/dist/db/database.js.map +2 -2
- package/dist/docs/indexer.js +2 -1
- package/dist/docs/indexer.js.map +2 -2
- package/dist/docs/queries.js +2 -1
- package/dist/docs/queries.js.map +2 -2
- package/dist/docs/vectors.js +46 -5
- package/dist/docs/vectors.js.map +2 -2
- package/dist/extraction/extractor.js +26 -3
- package/dist/extraction/extractor.js.map +2 -2
- package/dist/extraction/grammars.js +1 -0
- package/dist/extraction/grammars.js.map +2 -2
- package/dist/extraction/languages.js +5 -1
- package/dist/extraction/languages.js.map +2 -2
- package/dist/index.js +1 -0
- package/dist/index.js.map +2 -2
- package/dist/mcp/tools.js +1 -1
- package/dist/mcp/tools.js.map +2 -2
- package/dist/memory/index.js +2 -1
- package/dist/memory/index.js.map +2 -2
- package/dist/memory/vectors.js +52 -8
- package/dist/memory/vectors.js.map +3 -3
- package/dist/patterns/library/code-eval-elixir.yaml +11 -0
- package/dist/patterns/library/command-injection-c.yaml +11 -0
- package/dist/patterns/library/command-injection-go.yaml +21 -3
- package/dist/patterns/library/command-injection-kotlin.yaml +10 -0
- package/dist/patterns/library/command-injection-php.yaml +11 -0
- package/dist/patterns/library/command-injection-ruby.yaml +11 -0
- package/dist/patterns/library/command-injection-rust.yaml +11 -0
- package/dist/patterns/library/dangerous-eval-bash.yaml +11 -0
- package/dist/patterns/library/dangerous-eval-php.yaml +11 -0
- package/dist/patterns/library/dangerous-eval-ruby.yaml +11 -0
- package/dist/patterns/library/dynamic-load-lua.yaml +10 -0
- package/dist/patterns/library/os-cmd-elixir.yaml +16 -0
- package/dist/patterns/library/os-execute-lua.yaml +10 -0
- package/dist/patterns/library/path-traversal-go.yaml +4 -4
- package/dist/patterns/library/process-launch-swift.yaml +11 -0
- package/dist/patterns/library/process-run-dart.yaml +15 -0
- package/dist/patterns/library/source-injection-bash.yaml +11 -0
- package/dist/patterns/library/sql-injection-dart.yaml +9 -0
- package/dist/patterns/library/sql-injection-kotlin.yaml +11 -0
- package/dist/patterns/library/sql-injection-php.yaml +9 -0
- package/dist/patterns/library/sql-injection-swift.yaml +11 -0
- package/dist/patterns/library/subshell-injection-ruby.yaml +8 -0
- package/dist/patterns/library/unsafe-block-rust.yaml +8 -0
- package/dist/patterns/library/unsafe-string-c.yaml +11 -0
- package/dist/patterns/runner.js +45 -27
- package/dist/patterns/runner.js.map +2 -2
- package/dist/security/integrator.js +8 -8
- package/dist/security/integrator.js.map +2 -2
- package/dist/types.js.map +2 -2
- package/dist/vectors/index.js +66 -3
- package/dist/vectors/index.js.map +2 -2
- package/dist/vectors/turboquant-index.js +261 -0
- package/dist/vectors/turboquant-index.js.map +7 -0
- package/dist/vectors/turbovec-index.js +189 -0
- package/dist/vectors/turbovec-index.js.map +7 -0
- package/package.json +26 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/extraction/grammars.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Grammar Module \u2014 lazy WASM grammar loading for tree-sitter.\n * Centralises all grammar management previously inline in extractor.ts.\n * Sequential loading via grammarLoadChain prevents WASM race condition on Node 20+.\n */\n\nimport * as path from 'path';\nimport type { Language } from '../types';\n\n// \u2500\u2500 Module-level singletons \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nlet parserLib: any = null;\nlet parserInitPromise: Promise<void> | null = null;\nconst loadedGrammars = new Map<Language, any>();\nlet grammarLoadChain = Promise.resolve();\n\n// \u2500\u2500 GRAMMAR_FILE_MAP \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Maps each Language to its WASM file name (without .wasm extension).\n * Empty string means no WASM is available for that language.\n * Pascal is bundled separately; all others come from tree-sitter-wasms.\n */\nexport const GRAMMAR_FILE_MAP: Record<Language, string> = {\n typescript: 'tree-sitter-typescript',\n tsx: 'tree-sitter-tsx',\n javascript: 'tree-sitter-javascript',\n jsx: 'tree-sitter-javascript',\n python: 'tree-sitter-python',\n go: 'tree-sitter-go',\n rust: 'tree-sitter-rust',\n java: 'tree-sitter-java',\n c: 'tree-sitter-c',\n cpp: 'tree-sitter-cpp',\n csharp: 'tree-sitter-c_sharp',\n php: 'tree-sitter-php',\n ruby: 'tree-sitter-ruby',\n swift: 'tree-sitter-swift',\n kotlin: 'tree-sitter-kotlin',\n dart: 'tree-sitter-dart',\n svelte: 'tree-sitter-svelte',\n elixir: 'tree-sitter-elixir',\n scala: 'tree-sitter-scala',\n lua: 'tree-sitter-lua',\n zig: 'tree-sitter-zig',\n bash: 'tree-sitter-bash',\n ocaml: 'tree-sitter-ocaml',\n elm: 'tree-sitter-elm',\n solidity: 'tree-sitter-solidity',\n vue: 'tree-sitter-vue',\n objc: 'tree-sitter-objc',\n yaml: 'tree-sitter-yaml',\n // HCL (Terraform) is bundled in src/extraction/wasm/ (not in tree-sitter-wasms)\n hcl: 'tree-sitter-hcl',\n // CSS is in tree-sitter-wasms; SCSS is bundled in src/extraction/wasm/\n css: 'tree-sitter-css',\n scss: 'tree-sitter-scss',\n html: 'tree-sitter-html',\n // Pascal is bundled in src/extraction/wasm/ (not in tree-sitter-wasms)\n pascal: 'tree-sitter-pascal',\n // No WASM available\n liquid: '',\n // Jupyter notebooks are parsed via the notebook extractor (Python grammar on extracted code cells)\n jupyter: '',\n // ReScript: WASM available in tree-sitter-wasms\n rescript: 'tree-sitter-rescript',\n // Bundled WASMs \u2014 compiled from grammar sources, stored in src/extraction/wasm/\n // resolveWasmPath handles these via BUNDLED_WASM_LANGS set (no entry needed here)\n sql: '', r: '', julia: '', powershell: '', perl: '',\n astro: '', gdscript: '', nix: '', verilog: '',\n unknown: '',\n};\n\n// \u2500\u2500 initGrammars \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Initialises the tree-sitter Parser runtime without loading any language grammars.\n * Safe to call multiple times \u2014 idempotent.\n */\nexport async function initGrammars(): Promise<void> {\n if (parserLib) return;\n if (parserInitPromise) return parserInitPromise;\n parserInitPromise = (async () => {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const TreeSitter = require('web-tree-sitter');\n await TreeSitter.Parser.init();\n parserLib = TreeSitter;\n })();\n return parserInitPromise;\n}\n\n// \u2500\u2500 resolveWasmPath \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Languages whose WASM is bundled in src/extraction/wasm/ (not from tree-sitter-wasms). */\nconst BUNDLED_WASM_LANGS = new Set<Language>([\n 'pascal', 'hcl', 'scss',\n // Compiled and bundled locally \u2014 no npm package with pre-built WASM available\n 'sql', 'r', 'julia', 'powershell', 'perl', 'gdscript', 'nix', 'verilog', 'astro',\n]);\n\n/**\n * Resolves the filesystem path to the WASM file for a given language.\n * Languages in BUNDLED_WASM_LANGS use bundled wasm files in src/extraction/wasm/.\n * All others are resolved from the tree-sitter-wasms npm package.\n * Returns null if the file cannot be located.\n */\nfunction resolveWasmPath(lang: Language): string | null {\n if (BUNDLED_WASM_LANGS.has(lang)) {\n return path.join(__dirname, 'wasm', `tree-sitter-${lang}.wasm`);\n }\n const grammarFile = GRAMMAR_FILE_MAP[lang];\n if (!grammarFile) return null;\n try {\n return require.resolve(`tree-sitter-wasms/out/${grammarFile}.wasm`);\n } catch {\n return null;\n }\n}\n\n// \u2500\u2500 loadGrammarsForLanguages \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Loads WASM grammars for the given languages sequentially.\n * Already-loaded grammars are skipped.\n * WASM load failures are swallowed silently \u2014 no throw.\n */\nexport async function loadGrammarsForLanguages(languages: Language[]): Promise<void> {\n for (const lang of languages) {\n if (loadedGrammars.has(lang)) continue;\n\n await new Promise<void>((resolve) => {\n grammarLoadChain = grammarLoadChain.then(async () => {\n if (loadedGrammars.has(lang)) { resolve(); return; }\n const wasmPath = resolveWasmPath(lang);\n if (!wasmPath) { resolve(); return; }\n try {\n await initGrammars();\n const langObj = await parserLib.Language.load(wasmPath);\n loadedGrammars.set(lang, langObj);\n } catch {\n // Silently skip \u2014 no WASM or load failure\n }\n resolve();\n });\n });\n }\n}\n\n// \u2500\u2500 getParser \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Returns a configured Parser instance for the given language.\n * Loads the grammar on demand if not yet cached.\n * Returns null if no grammar is available (unsupported/unknown language).\n */\nexport async function getParser(language: Language): Promise<any | null> {\n // Fast path \u2014 already loaded\n if (loadedGrammars.has(language)) {\n await initGrammars();\n const parser = new parserLib.Parser();\n parser.setLanguage(loadedGrammars.get(language));\n return parser;\n }\n\n // No WASM available for this language\n if (!resolveWasmPath(language)) return null;\n\n // Load on demand\n await loadGrammarsForLanguages([language]);\n\n if (!loadedGrammars.has(language)) return null;\n\n await initGrammars();\n const parser = new parserLib.Parser();\n parser.setLanguage(loadedGrammars.get(language));\n return parser;\n}\n\n// \u2500\u2500 Remaining exports \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Returns true when the grammar for the given language is already in the cache.\n */\nexport function isGrammarLoaded(language: Language): boolean {\n return loadedGrammars.has(language);\n}\n\n/**\n * Returns true if a WASM grammar file exists for the given language,\n * regardless of whether it has been loaded yet.\n * Use this to distinguish \"language has no grammar\" from \"grammar failed to load\".\n */\nexport function hasWasmGrammar(language: Language): boolean {\n return resolveWasmPath(language) !== null;\n}\n\n/**\n * Returns the list of languages for which a WASM grammar file is known.\n * Languages with an empty GRAMMAR_FILE_MAP entry are excluded.\n */\nexport function getSupportedLanguages(): Language[] {\n return (Object.keys(GRAMMAR_FILE_MAP) as Language[]).filter(\n (lang) => GRAMMAR_FILE_MAP[lang] !== ''\n );\n}\n\n/**\n * Removes all cached grammars and resets the module to uninitialised state.\n * Primarily for testing.\n */\nexport function clearParserCache(): void {\n parserLib = null;\n parserInitPromise = null;\n loadedGrammars.clear();\n grammarLoadChain = Promise.resolve();\n}\n\n/**\n * Convenience wrapper \u2014 loads all known supported language grammars.\n */\nexport async function loadAllGrammars(): Promise<void> {\n return loadGrammarsForLanguages(getSupportedLanguages());\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,WAAsB;AAKtB,IAAI,YAAiB;AACrB,IAAI,oBAA0C;AAC9C,MAAM,iBAAiB,oBAAI,IAAmB;AAC9C,IAAI,mBAAmB,QAAQ,QAAQ;AAShC,MAAM,mBAA6C;AAAA,EACxD,YAAY;AAAA,EACZ,KAAK;AAAA,EACL,YAAY;AAAA,EACZ,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,MAAM;AAAA,EACN,GAAG;AAAA,EACH,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,KAAK;AAAA,EACL,KAAK;AAAA,EACL,MAAM;AAAA,EACN,OAAO;AAAA,EACP,KAAK;AAAA,EACL,UAAU;AAAA,EACV,KAAK;AAAA,EACL,MAAM;AAAA,EACN,MAAM;AAAA;AAAA,EAEN,KAAK;AAAA;AAAA,EAEL,KAAK;AAAA,EACL,MAAM;AAAA,EACN,MAAM;AAAA;AAAA,EAEN,QAAQ;AAAA;AAAA,EAER,QAAQ;AAAA;AAAA,EAER,SAAS;AAAA;AAAA,EAET,UAAU;AAAA;AAAA;AAAA,EAGV,KAAK;AAAA,EAAI,GAAG;AAAA,EAAI,OAAO;AAAA,EAAI,YAAY;AAAA,EAAI,MAAM;AAAA,EACjD,OAAO;AAAA,EAAI,UAAU;AAAA,EAAI,KAAK;AAAA,EAAI,SAAS;AAAA,
|
|
4
|
+
"sourcesContent": ["/**\n * Grammar Module \u2014 lazy WASM grammar loading for tree-sitter.\n * Centralises all grammar management previously inline in extractor.ts.\n * Sequential loading via grammarLoadChain prevents WASM race condition on Node 20+.\n */\n\nimport * as path from 'path';\nimport type { Language } from '../types';\n\n// \u2500\u2500 Module-level singletons \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nlet parserLib: any = null;\nlet parserInitPromise: Promise<void> | null = null;\nconst loadedGrammars = new Map<Language, any>();\nlet grammarLoadChain = Promise.resolve();\n\n// \u2500\u2500 GRAMMAR_FILE_MAP \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Maps each Language to its WASM file name (without .wasm extension).\n * Empty string means no WASM is available for that language.\n * Pascal is bundled separately; all others come from tree-sitter-wasms.\n */\nexport const GRAMMAR_FILE_MAP: Record<Language, string> = {\n typescript: 'tree-sitter-typescript',\n tsx: 'tree-sitter-tsx',\n javascript: 'tree-sitter-javascript',\n jsx: 'tree-sitter-javascript',\n python: 'tree-sitter-python',\n go: 'tree-sitter-go',\n rust: 'tree-sitter-rust',\n java: 'tree-sitter-java',\n c: 'tree-sitter-c',\n cpp: 'tree-sitter-cpp',\n csharp: 'tree-sitter-c_sharp',\n php: 'tree-sitter-php',\n ruby: 'tree-sitter-ruby',\n swift: 'tree-sitter-swift',\n kotlin: 'tree-sitter-kotlin',\n dart: 'tree-sitter-dart',\n svelte: 'tree-sitter-svelte',\n elixir: 'tree-sitter-elixir',\n scala: 'tree-sitter-scala',\n lua: 'tree-sitter-lua',\n zig: 'tree-sitter-zig',\n bash: 'tree-sitter-bash',\n ocaml: 'tree-sitter-ocaml',\n elm: 'tree-sitter-elm',\n solidity: 'tree-sitter-solidity',\n vue: 'tree-sitter-vue',\n objc: 'tree-sitter-objc',\n yaml: 'tree-sitter-yaml',\n // HCL (Terraform) is bundled in src/extraction/wasm/ (not in tree-sitter-wasms)\n hcl: 'tree-sitter-hcl',\n // CSS is in tree-sitter-wasms; SCSS is bundled in src/extraction/wasm/\n css: 'tree-sitter-css',\n scss: 'tree-sitter-scss',\n html: 'tree-sitter-html',\n // Pascal is bundled in src/extraction/wasm/ (not in tree-sitter-wasms)\n pascal: 'tree-sitter-pascal',\n // No WASM available\n liquid: '',\n // Jupyter notebooks are parsed via the notebook extractor (Python grammar on extracted code cells)\n jupyter: '',\n // ReScript: WASM available in tree-sitter-wasms\n rescript: 'tree-sitter-rescript',\n // Bundled WASMs \u2014 compiled from grammar sources, stored in src/extraction/wasm/\n // resolveWasmPath handles these via BUNDLED_WASM_LANGS set (no entry needed here)\n sql: '', r: '', julia: '', powershell: '', perl: '',\n astro: '', gdscript: '', nix: '', verilog: '', haskell: '',\n unknown: '',\n};\n\n// \u2500\u2500 initGrammars \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Initialises the tree-sitter Parser runtime without loading any language grammars.\n * Safe to call multiple times \u2014 idempotent.\n */\nexport async function initGrammars(): Promise<void> {\n if (parserLib) return;\n if (parserInitPromise) return parserInitPromise;\n parserInitPromise = (async () => {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const TreeSitter = require('web-tree-sitter');\n await TreeSitter.Parser.init();\n parserLib = TreeSitter;\n })();\n return parserInitPromise;\n}\n\n// \u2500\u2500 resolveWasmPath \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Languages whose WASM is bundled in src/extraction/wasm/ (not from tree-sitter-wasms). */\nconst BUNDLED_WASM_LANGS = new Set<Language>([\n 'pascal', 'hcl', 'scss',\n // Compiled and bundled locally \u2014 no npm package with pre-built WASM available\n 'sql', 'r', 'julia', 'powershell', 'perl', 'gdscript', 'nix', 'verilog', 'astro',\n]);\n\n/**\n * Resolves the filesystem path to the WASM file for a given language.\n * Languages in BUNDLED_WASM_LANGS use bundled wasm files in src/extraction/wasm/.\n * All others are resolved from the tree-sitter-wasms npm package.\n * Returns null if the file cannot be located.\n */\nfunction resolveWasmPath(lang: Language): string | null {\n if (BUNDLED_WASM_LANGS.has(lang)) {\n return path.join(__dirname, 'wasm', `tree-sitter-${lang}.wasm`);\n }\n const grammarFile = GRAMMAR_FILE_MAP[lang];\n if (!grammarFile) return null;\n try {\n return require.resolve(`tree-sitter-wasms/out/${grammarFile}.wasm`);\n } catch {\n return null;\n }\n}\n\n// \u2500\u2500 loadGrammarsForLanguages \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Loads WASM grammars for the given languages sequentially.\n * Already-loaded grammars are skipped.\n * WASM load failures are swallowed silently \u2014 no throw.\n */\nexport async function loadGrammarsForLanguages(languages: Language[]): Promise<void> {\n for (const lang of languages) {\n if (loadedGrammars.has(lang)) continue;\n\n await new Promise<void>((resolve) => {\n grammarLoadChain = grammarLoadChain.then(async () => {\n if (loadedGrammars.has(lang)) { resolve(); return; }\n const wasmPath = resolveWasmPath(lang);\n if (!wasmPath) { resolve(); return; }\n try {\n await initGrammars();\n const langObj = await parserLib.Language.load(wasmPath);\n loadedGrammars.set(lang, langObj);\n } catch {\n // Silently skip \u2014 no WASM or load failure\n }\n resolve();\n });\n });\n }\n}\n\n// \u2500\u2500 getParser \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Returns a configured Parser instance for the given language.\n * Loads the grammar on demand if not yet cached.\n * Returns null if no grammar is available (unsupported/unknown language).\n */\nexport async function getParser(language: Language): Promise<any | null> {\n // Fast path \u2014 already loaded\n if (loadedGrammars.has(language)) {\n await initGrammars();\n const parser = new parserLib.Parser();\n parser.setLanguage(loadedGrammars.get(language));\n return parser;\n }\n\n // No WASM available for this language\n if (!resolveWasmPath(language)) return null;\n\n // Load on demand\n await loadGrammarsForLanguages([language]);\n\n if (!loadedGrammars.has(language)) return null;\n\n await initGrammars();\n const parser = new parserLib.Parser();\n parser.setLanguage(loadedGrammars.get(language));\n return parser;\n}\n\n// \u2500\u2500 Remaining exports \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Returns true when the grammar for the given language is already in the cache.\n */\nexport function isGrammarLoaded(language: Language): boolean {\n return loadedGrammars.has(language);\n}\n\n/**\n * Returns true if a WASM grammar file exists for the given language,\n * regardless of whether it has been loaded yet.\n * Use this to distinguish \"language has no grammar\" from \"grammar failed to load\".\n */\nexport function hasWasmGrammar(language: Language): boolean {\n return resolveWasmPath(language) !== null;\n}\n\n/**\n * Returns the list of languages for which a WASM grammar file is known.\n * Languages with an empty GRAMMAR_FILE_MAP entry are excluded.\n */\nexport function getSupportedLanguages(): Language[] {\n return (Object.keys(GRAMMAR_FILE_MAP) as Language[]).filter(\n (lang) => GRAMMAR_FILE_MAP[lang] !== ''\n );\n}\n\n/**\n * Removes all cached grammars and resets the module to uninitialised state.\n * Primarily for testing.\n */\nexport function clearParserCache(): void {\n parserLib = null;\n parserInitPromise = null;\n loadedGrammars.clear();\n grammarLoadChain = Promise.resolve();\n}\n\n/**\n * Convenience wrapper \u2014 loads all known supported language grammars.\n */\nexport async function loadAllGrammars(): Promise<void> {\n return loadGrammarsForLanguages(getSupportedLanguages());\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["parser"]
|
|
7
7
|
}
|
|
@@ -112,7 +112,10 @@ const EXTENSION_MAP = {
|
|
|
112
112
|
// Verilog / SystemVerilog (.v is Verilog, not Vim script)
|
|
113
113
|
".v": "verilog",
|
|
114
114
|
".sv": "verilog",
|
|
115
|
-
".svh": "verilog"
|
|
115
|
+
".svh": "verilog",
|
|
116
|
+
// Haskell
|
|
117
|
+
".hs": "haskell",
|
|
118
|
+
".lhs": "haskell"
|
|
116
119
|
};
|
|
117
120
|
const GRAMMAR_MAP = {
|
|
118
121
|
typescript: "tree-sitter-typescript",
|
|
@@ -164,6 +167,7 @@ const GRAMMAR_MAP = {
|
|
|
164
167
|
gdscript: "tree-sitter-gdscript",
|
|
165
168
|
nix: "tree-sitter-nix",
|
|
166
169
|
verilog: "tree-sitter-verilog",
|
|
170
|
+
haskell: "tree-sitter-haskell",
|
|
167
171
|
unknown: ""
|
|
168
172
|
};
|
|
169
173
|
function detectLanguage(filePath) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/extraction/languages.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Language detection and tree-sitter grammar mapping\n */\n\nimport type { Language } from '../types';\n\nexport const EXTENSION_MAP: Record<string, Language> = {\n '.ts': 'typescript',\n '.tsx': 'tsx',\n '.js': 'javascript',\n '.jsx': 'jsx',\n '.mjs': 'javascript',\n '.cjs': 'javascript',\n '.py': 'python',\n '.pyw': 'python',\n '.go': 'go',\n '.rs': 'rust',\n '.java': 'java',\n '.c': 'c',\n '.h': 'c',\n '.cpp': 'cpp',\n '.cc': 'cpp',\n '.cxx': 'cpp',\n '.hxx': 'cpp',\n '.hpp': 'cpp',\n '.cs': 'csharp',\n '.php': 'php',\n '.rb': 'ruby',\n '.rake': 'ruby',\n '.swift': 'swift',\n '.kt': 'kotlin',\n '.kts': 'kotlin',\n '.dart': 'dart',\n '.svelte': 'svelte',\n '.pas': 'pascal',\n '.dpr': 'pascal',\n '.dpk': 'pascal',\n '.lpr': 'pascal',\n '.dfm': 'pascal',\n '.fmx': 'pascal',\n '.liquid': 'liquid',\n '.ex': 'elixir',\n '.exs': 'elixir',\n '.scala': 'scala',\n '.sc': 'scala',\n '.sbt': 'scala',\n '.lua': 'lua',\n '.zig': 'zig',\n '.zon': 'zig',\n '.sh': 'bash',\n '.bash': 'bash',\n '.zsh': 'bash',\n '.ml': 'ocaml',\n '.mli': 'ocaml',\n '.elm': 'elm',\n '.sol': 'solidity',\n '.vue': 'vue',\n '.m': 'objc',\n '.yaml': 'yaml',\n '.yml': 'yaml',\n '.tf': 'hcl',\n '.tfvars': 'hcl',\n '.css': 'css',\n '.scss': 'scss',\n '.sass': 'scss',\n '.html': 'html',\n '.htm': 'html',\n '.ipynb': 'jupyter',\n // ReScript\n '.res': 'rescript',\n '.resi': 'rescript',\n // SQL\n '.sql': 'sql',\n // R\n '.r': 'r',\n '.R': 'r',\n // Julia\n '.jl': 'julia',\n // PowerShell\n '.ps1': 'powershell',\n '.psm1': 'powershell',\n '.psd1': 'powershell',\n // Perl\n '.pl': 'perl',\n '.pm': 'perl',\n // Astro\n '.astro': 'astro',\n // GDScript (Godot)\n '.gd': 'gdscript',\n // Nix\n '.nix': 'nix',\n // Verilog / SystemVerilog (.v is Verilog, not Vim script)\n '.v': 'verilog',\n '.sv': 'verilog',\n '.svh': 'verilog',\n};\n\nexport const GRAMMAR_MAP: Record<Language, string> = {\n typescript: 'tree-sitter-typescript',\n tsx: 'tree-sitter-tsx',\n javascript: 'tree-sitter-javascript',\n jsx: 'tree-sitter-javascript',\n python: 'tree-sitter-python',\n go: 'tree-sitter-go',\n rust: 'tree-sitter-rust',\n java: 'tree-sitter-java',\n c: 'tree-sitter-c',\n cpp: 'tree-sitter-cpp',\n csharp: 'tree-sitter-c-sharp',\n php: 'tree-sitter-php',\n ruby: 'tree-sitter-ruby',\n swift: 'tree-sitter-swift',\n kotlin: 'tree-sitter-kotlin',\n dart: 'tree-sitter-dart',\n svelte: 'tree-sitter-svelte',\n elixir: 'tree-sitter-elixir',\n scala: 'tree-sitter-scala',\n lua: 'tree-sitter-lua',\n zig: 'tree-sitter-zig',\n bash: 'tree-sitter-bash',\n ocaml: 'tree-sitter-ocaml',\n elm: 'tree-sitter-elm',\n solidity: 'tree-sitter-solidity',\n vue: 'tree-sitter-vue',\n objc: 'tree-sitter-objc',\n yaml: 'tree-sitter-yaml',\n hcl: 'tree-sitter-hcl',\n css: 'tree-sitter-css',\n scss: 'tree-sitter-scss',\n html: 'tree-sitter-html',\n // Pascal and Liquid require custom WASM not bundled in tree-sitter-wasms\n pascal: '',\n liquid: '',\n // Jupyter notebooks are parsed via the notebook extractor (Python grammar on extracted code cells)\n jupyter: '',\n // ReScript: WASM available in tree-sitter-wasms\n rescript: 'tree-sitter-rescript',\n // Languages with WASMs TBD \u2014 files tracked, symbol extraction pending WASM compilation\n sql: 'tree-sitter-sql',\n r: 'tree-sitter-r',\n julia: 'tree-sitter-julia',\n powershell: 'tree-sitter-powershell',\n perl: 'tree-sitter-perl',\n astro: 'tree-sitter-astro',\n gdscript: 'tree-sitter-gdscript',\n nix: 'tree-sitter-nix',\n verilog: 'tree-sitter-verilog',\n unknown: '',\n};\n\nexport function detectLanguage(filePath: string): Language {\n const ext = filePath.slice(filePath.lastIndexOf('.')).toLowerCase();\n return EXTENSION_MAP[ext] ?? 'unknown';\n}\n\nexport function isSupportedLanguage(lang: Language): boolean {\n // All known languages are \"supported\" for indexing purposes.\n // Pascal and Liquid don't have a grammar WASM, so they'll be indexed\n // with empty symbol lists (file tracked but no AST extraction).\n return lang !== 'unknown';\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["/**\n * Language detection and tree-sitter grammar mapping\n */\n\nimport type { Language } from '../types';\n\nexport const EXTENSION_MAP: Record<string, Language> = {\n '.ts': 'typescript',\n '.tsx': 'tsx',\n '.js': 'javascript',\n '.jsx': 'jsx',\n '.mjs': 'javascript',\n '.cjs': 'javascript',\n '.py': 'python',\n '.pyw': 'python',\n '.go': 'go',\n '.rs': 'rust',\n '.java': 'java',\n '.c': 'c',\n '.h': 'c',\n '.cpp': 'cpp',\n '.cc': 'cpp',\n '.cxx': 'cpp',\n '.hxx': 'cpp',\n '.hpp': 'cpp',\n '.cs': 'csharp',\n '.php': 'php',\n '.rb': 'ruby',\n '.rake': 'ruby',\n '.swift': 'swift',\n '.kt': 'kotlin',\n '.kts': 'kotlin',\n '.dart': 'dart',\n '.svelte': 'svelte',\n '.pas': 'pascal',\n '.dpr': 'pascal',\n '.dpk': 'pascal',\n '.lpr': 'pascal',\n '.dfm': 'pascal',\n '.fmx': 'pascal',\n '.liquid': 'liquid',\n '.ex': 'elixir',\n '.exs': 'elixir',\n '.scala': 'scala',\n '.sc': 'scala',\n '.sbt': 'scala',\n '.lua': 'lua',\n '.zig': 'zig',\n '.zon': 'zig',\n '.sh': 'bash',\n '.bash': 'bash',\n '.zsh': 'bash',\n '.ml': 'ocaml',\n '.mli': 'ocaml',\n '.elm': 'elm',\n '.sol': 'solidity',\n '.vue': 'vue',\n '.m': 'objc',\n '.yaml': 'yaml',\n '.yml': 'yaml',\n '.tf': 'hcl',\n '.tfvars': 'hcl',\n '.css': 'css',\n '.scss': 'scss',\n '.sass': 'scss',\n '.html': 'html',\n '.htm': 'html',\n '.ipynb': 'jupyter',\n // ReScript\n '.res': 'rescript',\n '.resi': 'rescript',\n // SQL\n '.sql': 'sql',\n // R\n '.r': 'r',\n '.R': 'r',\n // Julia\n '.jl': 'julia',\n // PowerShell\n '.ps1': 'powershell',\n '.psm1': 'powershell',\n '.psd1': 'powershell',\n // Perl\n '.pl': 'perl',\n '.pm': 'perl',\n // Astro\n '.astro': 'astro',\n // GDScript (Godot)\n '.gd': 'gdscript',\n // Nix\n '.nix': 'nix',\n // Verilog / SystemVerilog (.v is Verilog, not Vim script)\n '.v': 'verilog',\n '.sv': 'verilog',\n '.svh': 'verilog',\n // Haskell\n '.hs': 'haskell',\n '.lhs': 'haskell',\n};\n\nexport const GRAMMAR_MAP: Record<Language, string> = {\n typescript: 'tree-sitter-typescript',\n tsx: 'tree-sitter-tsx',\n javascript: 'tree-sitter-javascript',\n jsx: 'tree-sitter-javascript',\n python: 'tree-sitter-python',\n go: 'tree-sitter-go',\n rust: 'tree-sitter-rust',\n java: 'tree-sitter-java',\n c: 'tree-sitter-c',\n cpp: 'tree-sitter-cpp',\n csharp: 'tree-sitter-c-sharp',\n php: 'tree-sitter-php',\n ruby: 'tree-sitter-ruby',\n swift: 'tree-sitter-swift',\n kotlin: 'tree-sitter-kotlin',\n dart: 'tree-sitter-dart',\n svelte: 'tree-sitter-svelte',\n elixir: 'tree-sitter-elixir',\n scala: 'tree-sitter-scala',\n lua: 'tree-sitter-lua',\n zig: 'tree-sitter-zig',\n bash: 'tree-sitter-bash',\n ocaml: 'tree-sitter-ocaml',\n elm: 'tree-sitter-elm',\n solidity: 'tree-sitter-solidity',\n vue: 'tree-sitter-vue',\n objc: 'tree-sitter-objc',\n yaml: 'tree-sitter-yaml',\n hcl: 'tree-sitter-hcl',\n css: 'tree-sitter-css',\n scss: 'tree-sitter-scss',\n html: 'tree-sitter-html',\n // Pascal and Liquid require custom WASM not bundled in tree-sitter-wasms\n pascal: '',\n liquid: '',\n // Jupyter notebooks are parsed via the notebook extractor (Python grammar on extracted code cells)\n jupyter: '',\n // ReScript: WASM available in tree-sitter-wasms\n rescript: 'tree-sitter-rescript',\n // Languages with WASMs TBD \u2014 files tracked, symbol extraction pending WASM compilation\n sql: 'tree-sitter-sql',\n r: 'tree-sitter-r',\n julia: 'tree-sitter-julia',\n powershell: 'tree-sitter-powershell',\n perl: 'tree-sitter-perl',\n astro: 'tree-sitter-astro',\n gdscript: 'tree-sitter-gdscript',\n nix: 'tree-sitter-nix',\n verilog: 'tree-sitter-verilog',\n haskell: 'tree-sitter-haskell',\n unknown: '',\n};\n\nexport function detectLanguage(filePath: string): Language {\n const ext = filePath.slice(filePath.lastIndexOf('.')).toLowerCase();\n return EXTENSION_MAP[ext] ?? 'unknown';\n}\n\nexport function isSupportedLanguage(lang: Language): boolean {\n // All known languages are \"supported\" for indexing purposes.\n // Pascal and Liquid don't have a grammar WASM, so they'll be indexed\n // with empty symbol lists (file tracked but no AST extraction).\n return lang !== 'unknown';\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/index.js
CHANGED
|
@@ -246,6 +246,7 @@ class KiroGraph {
|
|
|
246
246
|
embeddingModel: this.config.embeddingModel,
|
|
247
247
|
useVecIndex: this.config.useVecIndex ?? false,
|
|
248
248
|
semanticEngine: this.config.semanticEngine ?? "cosine",
|
|
249
|
+
turbovecBits: this.config.turbovecBits,
|
|
249
250
|
vecIndexCount,
|
|
250
251
|
engineFallback: this.vectors.getEngineFallback(),
|
|
251
252
|
frameworks: this.config.frameworkHints ?? [],
|
package/dist/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/index.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * KiroGraph \u2014 Semantic code knowledge graph for Kiro\n *\n * Pure facade. Every method delegates to a focused sub-system.\n * No business logic lives here.\n */\n\nimport * as path from 'path';\nimport * as fs from 'fs';\nimport { GraphDatabase } from './db/database';\nimport { validatePathWithinRoot, validateProjectPath } from './utils';\nimport { loadConfig, createDefaultConfig, saveConfig } from './config';\nimport type { KiroGraphConfig } from './config';\nimport { GraphQueryManager } from './graph/queries';\nimport { ReferenceResolver } from './resolution/index';\nimport { VectorManager } from './vectors/index';\nimport { ContextBuilder } from './context/index';\nimport { ArchitectureAnalyzer } from './architecture/index';\nimport { LockManager } from './core/lock-manager';\nimport { IndexPipeline } from './core/pipeline';\nimport { buildFileTree } from './core/file-tree';\nimport { SnapshotManager } from './core/snapshot';\nimport { Searcher } from './search/searcher';\nimport type { FileTreeNode, FileTree } from './core/file-tree';\nimport type { GraphSnapshot, GraphDiff } from './core/snapshot';\n\nexport type { GraphSnapshot, GraphDiff };\nimport type {\n Node, Edge, NodeKind, IndexResult, IndexProgress, SyncResult, TaskContext,\n SearchResult, SearchOptions, NodeContext, NodeMetrics,\n} from './types';\nimport type { ArchitectureResult } from './architecture/types';\n\nexport type { FileTreeNode, FileTree };\n\nconst KIROGRAPH_DIR = '.kirograph';\n\nexport default class KiroGraph {\n private readonly db: GraphDatabase;\n private readonly config: KiroGraphConfig;\n private readonly projectRoot: string;\n private readonly queryManager: GraphQueryManager;\n private readonly resolver: ReferenceResolver;\n private readonly vectors: VectorManager;\n private readonly contextBuilder: ContextBuilder;\n private readonly arch: ArchitectureAnalyzer;\n private readonly lock: LockManager;\n private readonly pipeline: IndexPipeline;\n private readonly searcher: Searcher;\n\n private constructor(projectRoot: string, db: GraphDatabase, config: KiroGraphConfig) {\n this.projectRoot = projectRoot;\n this.db = db;\n this.config = config;\n this.queryManager = new GraphQueryManager(db);\n this.resolver = new ReferenceResolver(db, config, projectRoot);\n this.vectors = new VectorManager(db, config, projectRoot);\n this.contextBuilder = new ContextBuilder(db, this.resolver, this.vectors, projectRoot);\n this.arch = new ArchitectureAnalyzer(db, config, projectRoot);\n this.lock = new LockManager(projectRoot);\n this.pipeline = new IndexPipeline(db, this.vectors, this.resolver, this.arch, this.lock, config, projectRoot);\n this.searcher = new Searcher(db);\n }\n\n // \u2500\u2500 Factory \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n static async init(\n projectRoot: string,\n config?: Partial<KiroGraphConfig>,\n onModelProgress?: (file: string, loaded: number, total: number, done: boolean) => void,\n ): Promise<KiroGraph> {\n const resolved = path.resolve(projectRoot);\n validateProjectPath(resolved);\n fs.mkdirSync(path.join(resolved, KIROGRAPH_DIR), { recursive: true });\n const cfg = { ...createDefaultConfig(resolved), ...config };\n await saveConfig(resolved, cfg);\n const db = new GraphDatabase(resolved);\n const kg = new KiroGraph(resolved, db, cfg);\n await kg.vectors.initialize(onModelProgress);\n return kg;\n }\n\n static async open(\n projectRoot: string,\n onModelProgress?: (file: string, loaded: number, total: number, done: boolean) => void,\n ): Promise<KiroGraph> {\n const resolved = path.resolve(projectRoot);\n validateProjectPath(resolved);\n if (!fs.existsSync(path.join(resolved, KIROGRAPH_DIR))) {\n throw new Error(`KiroGraph not initialized at ${resolved}. Run: kirograph init`);\n }\n const cfg = await loadConfig(resolved);\n const db = new GraphDatabase(resolved);\n const kg = new KiroGraph(resolved, db, cfg);\n await kg.vectors.initialize(onModelProgress);\n return kg;\n }\n\n static isInitialized(projectRoot: string): boolean {\n return fs.existsSync(path.join(path.resolve(projectRoot), KIROGRAPH_DIR));\n }\n\n // \u2500\u2500 Lock / dirty marker \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n unlockForce(): void { this.lock.forceRelease(); }\n markDirty(): void { this.lock.markDirty(); }\n clearDirty(): void { this.lock.clearDirty(); }\n isDirty(): boolean { return this.lock.isDirty(); }\n isIndexLocked(): boolean { return this.lock.isLocked(); }\n\n async syncIfDirty(): Promise<SyncResult | null> {\n if (!this.isDirty()) return null;\n return this.sync();\n }\n\n /**\n * Returns the number of files that have changed on disk but are not yet\n * reflected in the index. Used by the MCP status tool to warn the agent\n * when the index may be stale.\n */\n async getPendingSyncCount(): Promise<number> {\n try {\n const { getChangedFiles, scanDirectory } = await Promise.resolve().then(() => require('./sync/index.js'));\n const gitChanged = await getChangedFiles(this.projectRoot, this.config);\n const hasGitChanges =\n gitChanged.added.length > 0 ||\n gitChanged.modified.length > 0 ||\n gitChanged.removed.length > 0;\n\n if (hasGitChanges) {\n return gitChanged.added.length + gitChanged.modified.length + gitChanged.removed.length;\n }\n\n // Fallback: compare indexed set vs current filesystem set\n const indexed = new Set(this.db.getAllFiles().map((f: { path: string }) => f.path));\n const current = new Set(\n (await scanDirectory(this.projectRoot, this.config))\n .map(f => require('path').relative(this.projectRoot, f).replace(/\\\\/g, '/'))\n );\n let pending = 0;\n for (const p of indexed) { if (!current.has(p)) pending++; }\n for (const p of current) { if (!indexed.has(p)) pending++; }\n return pending;\n } catch {\n return 0;\n }\n }\n\n // \u2500\u2500 Indexing \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n async indexAll(opts?: { onProgress?: (p: IndexProgress) => void; force?: boolean; signal?: AbortSignal }): Promise<IndexResult> {\n return this.pipeline.indexAll(opts);\n }\n\n async sync(changedFilesOrOpts?: string[] | { files?: string[]; onProgress?: (p: IndexProgress) => void }): Promise<SyncResult> {\n if (Array.isArray(changedFilesOrOpts)) {\n return this.pipeline.sync({ changedFiles: changedFilesOrOpts });\n }\n return this.pipeline.sync({\n changedFiles: changedFilesOrOpts?.files,\n onProgress: changedFilesOrOpts?.onProgress,\n });\n }\n\n // \u2500\u2500 Symbol search \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n searchNodes(query: string, kindOrOpts?: NodeKind | SearchOptions, limit = 20): SearchResult[] {\n return this.searcher.search(query, kindOrOpts, limit);\n }\n\n // \u2500\u2500 Graph queries \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n async getCallers(nodeId: string, limit = 30): Promise<Node[]> { return this.queryManager.getCallers(nodeId, limit); }\n async getCallees(nodeId: string, limit = 30): Promise<Node[]> { return this.queryManager.getCallees(nodeId, limit); }\n async getImpactRadius(nodeId: string, depth = 2): Promise<Node[]> { return this.queryManager.getImpactRadius(nodeId, depth); }\n getAllNodes(): Node[] { return this.db.getAllNodes(); }\n getAllEdges(): Edge[] { return this.db.getAllEdges(); }\n findDeadCode(limit = 50): Node[] { return this.db.findDeadCode(limit); }\n findCircularDependencies(): string[][] { return this.db.findCircularDependencies(); }\n async findPath(fromId: string, toId: string, maxDepth = 10): Promise<Node[]> { return this.queryManager.findPath(fromId, toId, maxDepth); }\n getTypeHierarchy(nodeId: string, direction: 'up' | 'down' | 'both' = 'both'): Node[] { return this.db.getTypeHierarchy(nodeId, direction); }\n getNode(id: string): Node | null { return this.db.getNode(id); }\n getNodeContext(nodeId: string): NodeContext | null { return this.db.getNodeContext(nodeId); }\n getNodeMetrics(nodeId: string): NodeMetrics { return this.db.getNodeMetrics(nodeId); }\n\n getNodeSource(node: Node): string | null {\n const absPath = validatePathWithinRoot(path.join(this.projectRoot, node.filePath), this.projectRoot);\n if (!absPath) return null;\n try {\n return fs.readFileSync(absPath, 'utf8').split('\\n').slice(node.startLine - 1, node.endLine).join('\\n');\n } catch { return null; }\n }\n\n // \u2500\u2500 Context building \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n async buildContext(task: string, opts?: { maxNodes?: number; includeCode?: boolean }): Promise<TaskContext> {\n return this.contextBuilder.buildTaskContext(task, opts);\n }\n\n // \u2500\u2500 File browsing \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n getFiles(opts?: { filterPath?: string; pattern?: string; maxDepth?: number }): FileTree {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const picomatch = opts?.pattern ? require('picomatch')(opts.pattern) : null;\n const filtered = this.db.getAllFiles().filter(f => {\n if (opts?.filterPath && !f.path.startsWith(opts.filterPath)) return false;\n if (picomatch && !picomatch(f.path)) return false;\n return true;\n });\n return buildFileTree(filtered, opts?.maxDepth);\n }\n\n getAffectedTests(changedFiles: string[], opts?: { depth?: number; testPattern?: string }): string[] {\n return this.queryManager.getAffectedTests(changedFiles, opts);\n }\n\n // \u2500\u2500 Graph insights \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n findHotspots(limit = 20): Array<Node & { degree: number; inDegree: number; outDegree: number }> {\n return this.db.findHotspots(limit);\n }\n\n findSurprisingConnections(limit = 20): Array<{ source: Node; target: Node; kind: string; score: number }> {\n return this.db.findSurprisingConnections(limit);\n }\n\n // \u2500\u2500 Snapshots \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n createSnapshotManager(): SnapshotManager {\n return new SnapshotManager(this.db, this.projectRoot);\n }\n\n // \u2500\u2500 Stats \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n async getStats() {\n const stats = this.db.getStats();\n const vecIndexCount = await this.vectors.vecIndexCount();\n const embeddingCount = vecIndexCount > 0 ? vecIndexCount : stats.embeddingCount;\n const EMBEDDABLE = ['function', 'method', 'class', 'interface', 'type_alias', 'component', 'module'];\n const embeddableNodeCount = EMBEDDABLE.reduce((sum, k) => sum + (stats.nodesByKind[k] ?? 0), 0);\n const pendingFiles = await this.getPendingSyncCount();\n const syncRunning = this.isIndexLocked();\n return {\n ...stats,\n embeddingCount,\n embeddableNodeCount,\n embeddingsEnabled: this.config.enableEmbeddings ?? false,\n embeddingModel: this.config.embeddingModel,\n useVecIndex: this.config.useVecIndex ?? false,\n semanticEngine: this.config.semanticEngine ?? 'cosine',\n vecIndexCount,\n engineFallback: this.vectors.getEngineFallback(),\n frameworks: this.config.frameworkHints ?? [],\n architectureEnabled: this.config.enableArchitecture ?? false,\n ...(this.config.enableArchitecture ? { architectureStats: this.db.getArchStats() } : {}),\n pendingFiles,\n syncRunning,\n syncWarningThreshold: this.config.syncWarningThreshold ?? 10,\n };\n }\n\n getEngineFallback(): string | null { return this.vectors.getEngineFallback(); }\n\n // \u2500\u2500 Architecture API \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n getArchitecture(): ArchitectureResult & {\n filePackages: Record<string, string[]>;\n fileLayers: Record<string, Array<{ layerId: string; confidence: number; matchedPattern: string }>>;\n } {\n const base = this.db.getArchitectureResult();\n\n const filePackages: Record<string, string[]> = {};\n for (const { filePath, packageId } of this.db.getArchFilePackages()) {\n if (!filePackages[filePath]) filePackages[filePath] = [];\n filePackages[filePath].push(packageId);\n }\n\n const fileLayers: Record<string, Array<{ layerId: string; confidence: number; matchedPattern: string }>> = {};\n for (const row of this.db.getArchFileLayers()) {\n if (!fileLayers[row.filePath]) fileLayers[row.filePath] = [];\n fileLayers[row.filePath].push({ layerId: row.layerId, confidence: row.confidence, matchedPattern: row.matchedPattern });\n }\n\n return { ...base, filePackages, fileLayers };\n }\n\n isArchitectureEnabled(): boolean { return this.config.enableArchitecture ?? false; }\n\n // \u2500\u2500 Misc \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n getProjectRoot(): string { return this.projectRoot; }\n\n getDatabase(): GraphDatabase { return this.db; }\n\n close(): void {\n this.vectors.close();\n this.lock.release();\n this.db.close();\n }\n}\n\n// \u2500\u2500 Module-level helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Walk up directories to find the nearest .kirograph/ folder. */\nexport function findNearestKiroGraphRoot(startPath: string): string | null {\n let current = path.resolve(startPath);\n while (true) {\n if (fs.existsSync(path.join(current, KIROGRAPH_DIR))) return current;\n const parent = path.dirname(current);\n if (parent === current) return null;\n current = parent;\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["/**\n * KiroGraph \u2014 Semantic code knowledge graph for Kiro\n *\n * Pure facade. Every method delegates to a focused sub-system.\n * No business logic lives here.\n */\n\nimport * as path from 'path';\nimport * as fs from 'fs';\nimport { GraphDatabase } from './db/database';\nimport { validatePathWithinRoot, validateProjectPath } from './utils';\nimport { loadConfig, createDefaultConfig, saveConfig } from './config';\nimport type { KiroGraphConfig } from './config';\nimport { GraphQueryManager } from './graph/queries';\nimport { ReferenceResolver } from './resolution/index';\nimport { VectorManager } from './vectors/index';\nimport { ContextBuilder } from './context/index';\nimport { ArchitectureAnalyzer } from './architecture/index';\nimport { LockManager } from './core/lock-manager';\nimport { IndexPipeline } from './core/pipeline';\nimport { buildFileTree } from './core/file-tree';\nimport { SnapshotManager } from './core/snapshot';\nimport { Searcher } from './search/searcher';\nimport type { FileTreeNode, FileTree } from './core/file-tree';\nimport type { GraphSnapshot, GraphDiff } from './core/snapshot';\n\nexport type { GraphSnapshot, GraphDiff };\nimport type {\n Node, Edge, NodeKind, IndexResult, IndexProgress, SyncResult, TaskContext,\n SearchResult, SearchOptions, NodeContext, NodeMetrics,\n} from './types';\nimport type { ArchitectureResult } from './architecture/types';\n\nexport type { FileTreeNode, FileTree };\n\nconst KIROGRAPH_DIR = '.kirograph';\n\nexport default class KiroGraph {\n private readonly db: GraphDatabase;\n private readonly config: KiroGraphConfig;\n private readonly projectRoot: string;\n private readonly queryManager: GraphQueryManager;\n private readonly resolver: ReferenceResolver;\n private readonly vectors: VectorManager;\n private readonly contextBuilder: ContextBuilder;\n private readonly arch: ArchitectureAnalyzer;\n private readonly lock: LockManager;\n private readonly pipeline: IndexPipeline;\n private readonly searcher: Searcher;\n\n private constructor(projectRoot: string, db: GraphDatabase, config: KiroGraphConfig) {\n this.projectRoot = projectRoot;\n this.db = db;\n this.config = config;\n this.queryManager = new GraphQueryManager(db);\n this.resolver = new ReferenceResolver(db, config, projectRoot);\n this.vectors = new VectorManager(db, config, projectRoot);\n this.contextBuilder = new ContextBuilder(db, this.resolver, this.vectors, projectRoot);\n this.arch = new ArchitectureAnalyzer(db, config, projectRoot);\n this.lock = new LockManager(projectRoot);\n this.pipeline = new IndexPipeline(db, this.vectors, this.resolver, this.arch, this.lock, config, projectRoot);\n this.searcher = new Searcher(db);\n }\n\n // \u2500\u2500 Factory \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n static async init(\n projectRoot: string,\n config?: Partial<KiroGraphConfig>,\n onModelProgress?: (file: string, loaded: number, total: number, done: boolean) => void,\n ): Promise<KiroGraph> {\n const resolved = path.resolve(projectRoot);\n validateProjectPath(resolved);\n fs.mkdirSync(path.join(resolved, KIROGRAPH_DIR), { recursive: true });\n const cfg = { ...createDefaultConfig(resolved), ...config };\n await saveConfig(resolved, cfg);\n const db = new GraphDatabase(resolved);\n const kg = new KiroGraph(resolved, db, cfg);\n await kg.vectors.initialize(onModelProgress);\n return kg;\n }\n\n static async open(\n projectRoot: string,\n onModelProgress?: (file: string, loaded: number, total: number, done: boolean) => void,\n ): Promise<KiroGraph> {\n const resolved = path.resolve(projectRoot);\n validateProjectPath(resolved);\n if (!fs.existsSync(path.join(resolved, KIROGRAPH_DIR))) {\n throw new Error(`KiroGraph not initialized at ${resolved}. Run: kirograph init`);\n }\n const cfg = await loadConfig(resolved);\n const db = new GraphDatabase(resolved);\n const kg = new KiroGraph(resolved, db, cfg);\n await kg.vectors.initialize(onModelProgress);\n return kg;\n }\n\n static isInitialized(projectRoot: string): boolean {\n return fs.existsSync(path.join(path.resolve(projectRoot), KIROGRAPH_DIR));\n }\n\n // \u2500\u2500 Lock / dirty marker \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n unlockForce(): void { this.lock.forceRelease(); }\n markDirty(): void { this.lock.markDirty(); }\n clearDirty(): void { this.lock.clearDirty(); }\n isDirty(): boolean { return this.lock.isDirty(); }\n isIndexLocked(): boolean { return this.lock.isLocked(); }\n\n async syncIfDirty(): Promise<SyncResult | null> {\n if (!this.isDirty()) return null;\n return this.sync();\n }\n\n /**\n * Returns the number of files that have changed on disk but are not yet\n * reflected in the index. Used by the MCP status tool to warn the agent\n * when the index may be stale.\n */\n async getPendingSyncCount(): Promise<number> {\n try {\n const { getChangedFiles, scanDirectory } = await Promise.resolve().then(() => require('./sync/index.js'));\n const gitChanged = await getChangedFiles(this.projectRoot, this.config);\n const hasGitChanges =\n gitChanged.added.length > 0 ||\n gitChanged.modified.length > 0 ||\n gitChanged.removed.length > 0;\n\n if (hasGitChanges) {\n return gitChanged.added.length + gitChanged.modified.length + gitChanged.removed.length;\n }\n\n // Fallback: compare indexed set vs current filesystem set\n const indexed = new Set(this.db.getAllFiles().map((f: { path: string }) => f.path));\n const current = new Set(\n (await scanDirectory(this.projectRoot, this.config))\n .map(f => require('path').relative(this.projectRoot, f).replace(/\\\\/g, '/'))\n );\n let pending = 0;\n for (const p of indexed) { if (!current.has(p)) pending++; }\n for (const p of current) { if (!indexed.has(p)) pending++; }\n return pending;\n } catch {\n return 0;\n }\n }\n\n // \u2500\u2500 Indexing \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n async indexAll(opts?: { onProgress?: (p: IndexProgress) => void; force?: boolean; signal?: AbortSignal }): Promise<IndexResult> {\n return this.pipeline.indexAll(opts);\n }\n\n async sync(changedFilesOrOpts?: string[] | { files?: string[]; onProgress?: (p: IndexProgress) => void }): Promise<SyncResult> {\n if (Array.isArray(changedFilesOrOpts)) {\n return this.pipeline.sync({ changedFiles: changedFilesOrOpts });\n }\n return this.pipeline.sync({\n changedFiles: changedFilesOrOpts?.files,\n onProgress: changedFilesOrOpts?.onProgress,\n });\n }\n\n // \u2500\u2500 Symbol search \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n searchNodes(query: string, kindOrOpts?: NodeKind | SearchOptions, limit = 20): SearchResult[] {\n return this.searcher.search(query, kindOrOpts, limit);\n }\n\n // \u2500\u2500 Graph queries \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n async getCallers(nodeId: string, limit = 30): Promise<Node[]> { return this.queryManager.getCallers(nodeId, limit); }\n async getCallees(nodeId: string, limit = 30): Promise<Node[]> { return this.queryManager.getCallees(nodeId, limit); }\n async getImpactRadius(nodeId: string, depth = 2): Promise<Node[]> { return this.queryManager.getImpactRadius(nodeId, depth); }\n getAllNodes(): Node[] { return this.db.getAllNodes(); }\n getAllEdges(): Edge[] { return this.db.getAllEdges(); }\n findDeadCode(limit = 50): Node[] { return this.db.findDeadCode(limit); }\n findCircularDependencies(): string[][] { return this.db.findCircularDependencies(); }\n async findPath(fromId: string, toId: string, maxDepth = 10): Promise<Node[]> { return this.queryManager.findPath(fromId, toId, maxDepth); }\n getTypeHierarchy(nodeId: string, direction: 'up' | 'down' | 'both' = 'both'): Node[] { return this.db.getTypeHierarchy(nodeId, direction); }\n getNode(id: string): Node | null { return this.db.getNode(id); }\n getNodeContext(nodeId: string): NodeContext | null { return this.db.getNodeContext(nodeId); }\n getNodeMetrics(nodeId: string): NodeMetrics { return this.db.getNodeMetrics(nodeId); }\n\n getNodeSource(node: Node): string | null {\n const absPath = validatePathWithinRoot(path.join(this.projectRoot, node.filePath), this.projectRoot);\n if (!absPath) return null;\n try {\n return fs.readFileSync(absPath, 'utf8').split('\\n').slice(node.startLine - 1, node.endLine).join('\\n');\n } catch { return null; }\n }\n\n // \u2500\u2500 Context building \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n async buildContext(task: string, opts?: { maxNodes?: number; includeCode?: boolean }): Promise<TaskContext> {\n return this.contextBuilder.buildTaskContext(task, opts);\n }\n\n // \u2500\u2500 File browsing \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n getFiles(opts?: { filterPath?: string; pattern?: string; maxDepth?: number }): FileTree {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const picomatch = opts?.pattern ? require('picomatch')(opts.pattern) : null;\n const filtered = this.db.getAllFiles().filter(f => {\n if (opts?.filterPath && !f.path.startsWith(opts.filterPath)) return false;\n if (picomatch && !picomatch(f.path)) return false;\n return true;\n });\n return buildFileTree(filtered, opts?.maxDepth);\n }\n\n getAffectedTests(changedFiles: string[], opts?: { depth?: number; testPattern?: string }): string[] {\n return this.queryManager.getAffectedTests(changedFiles, opts);\n }\n\n // \u2500\u2500 Graph insights \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n findHotspots(limit = 20): Array<Node & { degree: number; inDegree: number; outDegree: number }> {\n return this.db.findHotspots(limit);\n }\n\n findSurprisingConnections(limit = 20): Array<{ source: Node; target: Node; kind: string; score: number }> {\n return this.db.findSurprisingConnections(limit);\n }\n\n // \u2500\u2500 Snapshots \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n createSnapshotManager(): SnapshotManager {\n return new SnapshotManager(this.db, this.projectRoot);\n }\n\n // \u2500\u2500 Stats \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n async getStats() {\n const stats = this.db.getStats();\n const vecIndexCount = await this.vectors.vecIndexCount();\n const embeddingCount = vecIndexCount > 0 ? vecIndexCount : stats.embeddingCount;\n const EMBEDDABLE = ['function', 'method', 'class', 'interface', 'type_alias', 'component', 'module'];\n const embeddableNodeCount = EMBEDDABLE.reduce((sum, k) => sum + (stats.nodesByKind[k] ?? 0), 0);\n const pendingFiles = await this.getPendingSyncCount();\n const syncRunning = this.isIndexLocked();\n return {\n ...stats,\n embeddingCount,\n embeddableNodeCount,\n embeddingsEnabled: this.config.enableEmbeddings ?? false,\n embeddingModel: this.config.embeddingModel,\n useVecIndex: this.config.useVecIndex ?? false,\n semanticEngine: this.config.semanticEngine ?? 'cosine',\n turbovecBits: this.config.turbovecBits,\n vecIndexCount,\n engineFallback: this.vectors.getEngineFallback(),\n frameworks: this.config.frameworkHints ?? [],\n architectureEnabled: this.config.enableArchitecture ?? false,\n ...(this.config.enableArchitecture ? { architectureStats: this.db.getArchStats() } : {}),\n pendingFiles,\n syncRunning,\n syncWarningThreshold: this.config.syncWarningThreshold ?? 10,\n };\n }\n\n getEngineFallback(): string | null { return this.vectors.getEngineFallback(); }\n\n // \u2500\u2500 Architecture API \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n getArchitecture(): ArchitectureResult & {\n filePackages: Record<string, string[]>;\n fileLayers: Record<string, Array<{ layerId: string; confidence: number; matchedPattern: string }>>;\n } {\n const base = this.db.getArchitectureResult();\n\n const filePackages: Record<string, string[]> = {};\n for (const { filePath, packageId } of this.db.getArchFilePackages()) {\n if (!filePackages[filePath]) filePackages[filePath] = [];\n filePackages[filePath].push(packageId);\n }\n\n const fileLayers: Record<string, Array<{ layerId: string; confidence: number; matchedPattern: string }>> = {};\n for (const row of this.db.getArchFileLayers()) {\n if (!fileLayers[row.filePath]) fileLayers[row.filePath] = [];\n fileLayers[row.filePath].push({ layerId: row.layerId, confidence: row.confidence, matchedPattern: row.matchedPattern });\n }\n\n return { ...base, filePackages, fileLayers };\n }\n\n isArchitectureEnabled(): boolean { return this.config.enableArchitecture ?? false; }\n\n // \u2500\u2500 Misc \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n getProjectRoot(): string { return this.projectRoot; }\n\n getDatabase(): GraphDatabase { return this.db; }\n\n close(): void {\n this.vectors.close();\n this.lock.release();\n this.db.close();\n }\n}\n\n// \u2500\u2500 Module-level helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Walk up directories to find the nearest .kirograph/ folder. */\nexport function findNearestKiroGraphRoot(startPath: string): string | null {\n let current = path.resolve(startPath);\n while (true) {\n if (fs.existsSync(path.join(current, KIROGRAPH_DIR))) return current;\n const parent = path.dirname(current);\n if (parent === current) return null;\n current = parent;\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/mcp/tools.js
CHANGED
|
@@ -1466,7 +1466,7 @@ ${result.content}`;
|
|
|
1466
1466
|
const semanticLines = stats.embeddingsEnabled ? [
|
|
1467
1467
|
` Semantic search: enabled`,
|
|
1468
1468
|
` Semantic model: ${stats.embeddingModel}`,
|
|
1469
|
-
` Semantic engine: ${stats.semanticEngine === "sqlite-vec" ? `sqlite-vec (${stats.vecIndexCount} entries in ANN index)` : stats.semanticEngine === "orama" ? `orama hybrid (${stats.vecIndexCount} docs in index)` : stats.semanticEngine === "pglite" ? `pglite+pgvector (${stats.vecIndexCount} rows in DB)` : stats.semanticEngine === "lancedb" ? `lancedb (${stats.vecIndexCount} entries in ANN index)` : stats.semanticEngine === "qdrant" ? `qdrant (${stats.vecIndexCount} points in collection)` : stats.semanticEngine === "typesense" ? `typesense (${stats.vecIndexCount} documents in collection)` : "in-process cosine"}`,
|
|
1469
|
+
` Semantic engine: ${stats.semanticEngine === "turboquant" ? `turboquant (${stats.vecIndexCount} entries \xB7 ANN)` : stats.semanticEngine === "turbovec" ? `turbovec (${stats.vecIndexCount} entries \xB7 ${stats.turbovecBits ?? 4} bits \xB7 Rust/SIMD)` : stats.semanticEngine === "sqlite-vec" ? `sqlite-vec (${stats.vecIndexCount} entries in ANN index)` : stats.semanticEngine === "orama" ? `orama hybrid (${stats.vecIndexCount} docs in index)` : stats.semanticEngine === "pglite" ? `pglite+pgvector (${stats.vecIndexCount} rows in DB)` : stats.semanticEngine === "lancedb" ? `lancedb (${stats.vecIndexCount} entries in ANN index)` : stats.semanticEngine === "qdrant" ? `qdrant (${stats.vecIndexCount} points in collection)` : stats.semanticEngine === "typesense" ? `typesense (${stats.vecIndexCount} documents in collection)` : "in-process cosine"}`,
|
|
1470
1470
|
` Embeddings: ${stats.embeddingCount} / ${stats.embeddableNodeCount || stats.nodes} embeddable symbols`,
|
|
1471
1471
|
...stats.engineFallback ? [` \u26A0 Engine fallback: ${stats.engineFallback}`] : []
|
|
1472
1472
|
] : [` Semantic search: disabled`];
|