kirograph 0.20.0 → 0.20.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin/installer/index.js +29 -0
- package/dist/bin/installer/index.js.map +2 -2
- package/dist/bin/kirograph.js +1 -1
- 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/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/turboquant-index.js +261 -0
- package/dist/vectors/turboquant-index.js.map +7 -0
- package/package.json +20 -1
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/vectors/turboquant-index.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * KiroGraph TurboQuant ANN Index\n *\n * Wraps turboquant-js (Google TurboQuant algorithm) as a drop-in ANN index.\n * Compresses embeddings at index time via Walsh-Hadamard rotation + Lloyd-Max\n * scalar quantization \u2014 zero native dependencies.\n *\n * Optional dep: npm install turboquant-js\n *\n * Algorithm: https://research.google/blog/turboquant-redefining-ai-efficiency-with-extreme-compression/\n * Implementation: https://github.com/danilodevhub/turboquant-js (by Danilo Dev)\n *\n * Falls back silently to cosine if turboquant-js is not installed.\n *\n * Compression at 3 bits (default):\n * 768-dim Float32 (3,072 bytes) \u2192 ~120 bytes (\u224825\u00D7 smaller)\n * 10K vectors: ~30 MB raw \u2192 ~1.2 MB compressed\n */\n\nimport * as path from 'path';\nimport * as fs from 'fs';\nimport { logDebug, logWarn, logError } from '../errors';\n\n// \u2500\u2500 TurboQuantStats \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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\nexport interface TurboQuantStats {\n count: number;\n dim: number;\n bits: number;\n compressionRatio: number;\n actualBytes: number;\n rawBytes: number;\n savedBytes: number;\n memEnabled: boolean;\n memCount: number;\n memActualBytes: number;\n memRawBytes: number;\n docsEnabled: boolean;\n docsCount: number;\n docsActualBytes: number;\n docsRawBytes: number;\n updatedAt: number;\n}\n\nconst STATS_FILE = 'turboquant-stats.json';\n\nexport function readTurboQuantStats(kirographDir: string): TurboQuantStats | null {\n try {\n const p = path.join(kirographDir, STATS_FILE);\n if (!fs.existsSync(p)) return null;\n return JSON.parse(fs.readFileSync(p, 'utf8')) as TurboQuantStats;\n } catch {\n return null;\n }\n}\n\nexport function writeTurboQuantStats(kirographDir: string, patch: Partial<TurboQuantStats>): void {\n const p = path.join(kirographDir, STATS_FILE);\n const tmp = p + '.tmp';\n try {\n const existing = readTurboQuantStats(kirographDir) ?? {\n count: 0, dim: 768, bits: 3,\n compressionRatio: 1, actualBytes: 0, rawBytes: 0, savedBytes: 0,\n memEnabled: false, memCount: 0, memActualBytes: 0, memRawBytes: 0,\n docsEnabled: false, docsCount: 0, docsActualBytes: 0, docsRawBytes: 0,\n updatedAt: 0,\n };\n const updated: TurboQuantStats = { ...existing, ...patch, updatedAt: Math.floor(Date.now() / 1000) };\n fs.writeFileSync(tmp, JSON.stringify(updated, null, 2));\n fs.renameSync(tmp, p);\n } catch (err) {\n logWarn('TurboQuantIndex: failed to write stats file', { error: String(err) });\n try { fs.unlinkSync(tmp); } catch { /* ignore */ }\n }\n}\n\n// \u2500\u2500 TurboQuantIndex \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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\nexport class TurboQuantIndex {\n private index: any = null;\n private _available = false;\n\n constructor(\n private readonly kirographDir: string,\n private readonly binName: string, // 'turboquant.bin' | 'turboquant-mem.bin' | 'turboquant-doc.bin'\n private readonly dim: number,\n private readonly bits: number = 3,\n ) {}\n\n isAvailable(): boolean {\n return this._available;\n }\n\n /**\n * Load turboquant-js and restore index from disk if the .bin file exists.\n * Silent no-op when the optional dependency is missing.\n */\n async initialize(): Promise<void> {\n if (this._available) return;\n\n let TQModule: any;\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n TQModule = require('turboquant-js');\n } catch {\n logDebug('TurboQuantIndex: turboquant-js not installed \u2014 turboquant engine unavailable');\n return;\n }\n\n // Handle various export shapes (default export, named export, CJS wrapper)\n const VectorIndex =\n TQModule?.VectorIndex ??\n TQModule?.default?.VectorIndex ??\n (typeof TQModule === 'function' ? TQModule : null);\n\n if (!VectorIndex || typeof VectorIndex !== 'function') {\n logWarn('TurboQuantIndex: unrecognised turboquant-js module shape \u2014 turboquant engine unavailable');\n return;\n }\n\n const binPath = path.join(this.kirographDir, this.binName);\n\n try {\n if (fs.existsSync(binPath) && typeof VectorIndex.fromBuffer === 'function') {\n const nodeBuf = fs.readFileSync(binPath);\n // fromBuffer() requires a pure ArrayBuffer, not a Node Buffer/Uint8Array\n const ab = nodeBuf.buffer.slice(nodeBuf.byteOffset, nodeBuf.byteOffset + nodeBuf.byteLength);\n this.index = VectorIndex.fromBuffer(ab, { dimension: this.dim, bits: this.bits });\n logDebug('TurboQuantIndex: restored from disk', { binPath });\n } else {\n this.index = new VectorIndex({ dimension: this.dim, bits: this.bits });\n logDebug('TurboQuantIndex: new index', { dim: this.dim, bits: this.bits });\n }\n this._available = true;\n } catch (err) {\n logError('TurboQuantIndex: initialization failed', { error: String(err) });\n this._available = false;\n this.index = null;\n }\n }\n\n /** Add or update an embedding (turboquant-js compresses at index time). */\n upsert(id: string, vec: Float32Array): void {\n if (!this._available || !this.index) return;\n try {\n this.index.add(id, vec);\n } catch (err) {\n logWarn('TurboQuantIndex: upsert failed', { id, error: String(err) });\n }\n }\n\n /** Remove an entry from the index (permanent via turboquant-js remove()). */\n delete(id: string): void {\n if (!this._available || !this.index) return;\n try {\n this.index.remove(id);\n } catch (err) {\n logWarn('TurboQuantIndex: delete failed', { id, error: String(err) });\n }\n }\n\n /** ANN search: returns IDs sorted by descending similarity. */\n search(queryVec: Float32Array, topN = 10): string[] {\n return this.searchWithScores(queryVec, topN).map(r => r.id);\n }\n\n /**\n * ANN search: returns [{id, score}] sorted by descending similarity.\n * Used by MemoryVectorManager and DocsVectorManager to preserve scores for\n * hybrid merge.\n */\n searchWithScores(queryVec: Float32Array, topN = 10): Array<{ id: string; score: number }> {\n if (!this._available || !this.index) return [];\n try {\n const raw: unknown = this.index.search(queryVec, topN);\n return this._normaliseSearchResults(raw).slice(0, topN);\n } catch (err) {\n logWarn('TurboQuantIndex: search failed', { error: String(err) });\n return [];\n }\n }\n\n /**\n * Persist the compressed index to disk atomically.\n * Called once at the end of `kirograph index` \u2014 not on every upsert.\n */\n async save(): Promise<void> {\n if (!this._available || !this.index) return;\n if (typeof this.index.toBuffer !== 'function') {\n logDebug('TurboQuantIndex: toBuffer() not available \u2014 index not persisted');\n return;\n }\n\n const binPath = path.join(this.kirographDir, this.binName);\n const tmp = binPath + '.tmp';\n try {\n const raw = this.index.toBuffer();\n // toBuffer() may return ArrayBuffer \u2014 Node fs requires Buffer/TypedArray\n const buf = raw instanceof ArrayBuffer ? Buffer.from(raw) : (raw as Buffer);\n fs.writeFileSync(tmp, buf);\n fs.renameSync(tmp, binPath);\n logDebug('TurboQuantIndex: saved', { binPath, bytes: buf.length });\n } catch (err) {\n logWarn('TurboQuantIndex: save failed', { error: String(err) });\n try { fs.unlinkSync(tmp); } catch { /* ignore */ }\n }\n }\n\n /**\n * Memory usage stats from the compressed index.\n * Falls back to a formula-based estimate when memoryUsage is unavailable.\n */\n memoryStats(): { totalBits: number; bitsPerVector: number; compressionRatio: number; actualBytes: number } {\n if (this._available && this.index?.memoryUsage) {\n return this.index.memoryUsage as { totalBits: number; bitsPerVector: number; compressionRatio: number; actualBytes: number };\n }\n const n = this.count();\n const rawBytes = n * this.dim * 4;\n const actualBytes = Math.ceil(n * this.dim * this.bits / 8);\n return {\n totalBits: actualBytes * 8,\n bitsPerVector: this.bits * this.dim,\n compressionRatio: actualBytes > 0 ? rawBytes / actualBytes : 1,\n actualBytes,\n };\n }\n\n count(): number {\n if (!this._available || !this.index) return 0;\n try {\n // idToIndex is an internal Map \u2014 reliable count that survives remove()\n if (this.index.idToIndex instanceof Map) return this.index.idToIndex.size;\n if (typeof this.index.size === 'number') return this.index.size;\n } catch { /* ignore */ }\n return 0;\n }\n\n /** All IDs currently in the index. */\n getEmbeddedIds(): string[] {\n if (!this._available || !this.index) return [];\n try {\n if (this.index.idToIndex instanceof Map) {\n return [...this.index.idToIndex.keys()];\n }\n } catch { /* ignore */ }\n return [];\n }\n\n close(): void {\n this.index = null;\n this._available = false;\n }\n\n // \u2500\u2500 Private \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 private _normaliseSearchResults(raw: unknown): Array<{ id: string; score: number }> {\n if (!Array.isArray(raw)) return [];\n\n return raw\n .map((item: unknown, rank: number) => {\n if (item && typeof item === 'object' && !Array.isArray(item)) {\n const obj = item as Record<string, unknown>;\n const id = (obj['id'] ?? obj['key'] ?? '') as string;\n const score = (obj['score'] ?? obj['similarity'] ?? obj['distance'] ?? (1 - rank / raw.length)) as number;\n return { id, score: typeof score === 'number' ? score : 1 - rank / raw.length };\n }\n if (Array.isArray(item) && item.length >= 2) {\n return { id: String(item[0]), score: typeof item[1] === 'number' ? item[1] : 1 - rank / raw.length };\n }\n if (typeof item === 'string') {\n return { id: item, score: 1 - rank / raw.length };\n }\n return null;\n })\n .filter((r): r is { id: string; score: number } => r !== null && r.id.length > 0);\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "kirograph",
|
|
3
|
-
"version": "0.20.
|
|
3
|
+
"version": "0.20.1",
|
|
4
4
|
"description": "Semantic code knowledge graph for Kiro: fewer tool calls, instant symbol lookups, 100% local.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -19,6 +19,8 @@
|
|
|
19
19
|
"test": "vitest --run",
|
|
20
20
|
"test:watchmen": "bash scripts/watchmen/test.sh",
|
|
21
21
|
"test:watchmen:skip-llm": "bash scripts/watchmen/test.sh --skip-llm",
|
|
22
|
+
"test:patterns": "bash scripts/patterns/test.sh",
|
|
23
|
+
"test:sec": "bash scripts/sec/test.sh",
|
|
22
24
|
"clean": "node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\"",
|
|
23
25
|
"release": "./scripts/release.sh",
|
|
24
26
|
"docs": "npx serve docs"
|
|
@@ -43,6 +45,23 @@
|
|
|
43
45
|
"xlsx": "^0.18.5"
|
|
44
46
|
},
|
|
45
47
|
"optionalDependencies": {
|
|
48
|
+
"@ast-grep/lang-bash": "^0.0.8",
|
|
49
|
+
"@ast-grep/lang-c": "^0.0.6",
|
|
50
|
+
"@ast-grep/lang-cpp": "^0.0.6",
|
|
51
|
+
"@ast-grep/lang-csharp": "^0.0.6",
|
|
52
|
+
"@ast-grep/lang-dart": "^0.0.7",
|
|
53
|
+
"@ast-grep/lang-elixir": "^0.0.7",
|
|
54
|
+
"@ast-grep/lang-go": "^0.0.6",
|
|
55
|
+
"@ast-grep/lang-haskell": "^0.0.7",
|
|
56
|
+
"@ast-grep/lang-java": "^0.0.7",
|
|
57
|
+
"@ast-grep/lang-kotlin": "^0.0.7",
|
|
58
|
+
"@ast-grep/lang-lua": "^0.0.7",
|
|
59
|
+
"@ast-grep/lang-php": "^0.0.7",
|
|
60
|
+
"@ast-grep/lang-python": "^0.0.6",
|
|
61
|
+
"@ast-grep/lang-ruby": "^0.0.7",
|
|
62
|
+
"@ast-grep/lang-rust": "^0.0.7",
|
|
63
|
+
"@ast-grep/lang-scala": "^0.0.7",
|
|
64
|
+
"@ast-grep/lang-swift": "^0.0.8",
|
|
46
65
|
"@ast-grep/napi": "^0.43.0",
|
|
47
66
|
"@electric-sql/pglite": "^0.2.17",
|
|
48
67
|
"@lancedb/lancedb": "^0.27.2",
|