dravix-agent 0.1.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/.claude/settings.example.json +30 -0
- package/ARCHITECTURE.md +410 -0
- package/LICENSE +21 -0
- package/README.md +153 -0
- package/ROADMAP.md +117 -0
- package/data/vulnkb.json +666 -0
- package/dist/bin/aegis.d.ts +3 -0
- package/dist/bin/aegis.d.ts.map +1 -0
- package/dist/bin/aegis.js +489 -0
- package/dist/bin/aegis.js.map +1 -0
- package/dist/cache.d.ts +9 -0
- package/dist/cache.d.ts.map +1 -0
- package/dist/cache.js +146 -0
- package/dist/cache.js.map +1 -0
- package/dist/engines/ai-sinks.d.ts +52 -0
- package/dist/engines/ai-sinks.d.ts.map +1 -0
- package/dist/engines/ai-sinks.js +204 -0
- package/dist/engines/ai-sinks.js.map +1 -0
- package/dist/engines/eslint.d.ts +9 -0
- package/dist/engines/eslint.d.ts.map +1 -0
- package/dist/engines/eslint.js +245 -0
- package/dist/engines/eslint.js.map +1 -0
- package/dist/engines/joern.d.ts +3 -0
- package/dist/engines/joern.d.ts.map +1 -0
- package/dist/engines/joern.js +98 -0
- package/dist/engines/joern.js.map +1 -0
- package/dist/engines/js-sinks.d.ts +70 -0
- package/dist/engines/js-sinks.d.ts.map +1 -0
- package/dist/engines/js-sinks.js +370 -0
- package/dist/engines/js-sinks.js.map +1 -0
- package/dist/engines/llm-critic.d.ts +130 -0
- package/dist/engines/llm-critic.d.ts.map +1 -0
- package/dist/engines/llm-critic.js +551 -0
- package/dist/engines/llm-critic.js.map +1 -0
- package/dist/engines/pragma.d.ts +20 -0
- package/dist/engines/pragma.d.ts.map +1 -0
- package/dist/engines/pragma.js +83 -0
- package/dist/engines/pragma.js.map +1 -0
- package/dist/engines/property-test.d.ts +3 -0
- package/dist/engines/property-test.d.ts.map +1 -0
- package/dist/engines/property-test.js +134 -0
- package/dist/engines/property-test.js.map +1 -0
- package/dist/engines/pyright.d.ts +10 -0
- package/dist/engines/pyright.d.ts.map +1 -0
- package/dist/engines/pyright.js +143 -0
- package/dist/engines/pyright.js.map +1 -0
- package/dist/engines/pysa.d.ts +3 -0
- package/dist/engines/pysa.d.ts.map +1 -0
- package/dist/engines/pysa.js +83 -0
- package/dist/engines/pysa.js.map +1 -0
- package/dist/engines/python-sinks.d.ts +82 -0
- package/dist/engines/python-sinks.d.ts.map +1 -0
- package/dist/engines/python-sinks.js +459 -0
- package/dist/engines/python-sinks.js.map +1 -0
- package/dist/engines/registry.d.ts +26 -0
- package/dist/engines/registry.d.ts.map +1 -0
- package/dist/engines/registry.js +70 -0
- package/dist/engines/registry.js.map +1 -0
- package/dist/engines/secret-scan.d.ts +22 -0
- package/dist/engines/secret-scan.d.ts.map +1 -0
- package/dist/engines/secret-scan.js +179 -0
- package/dist/engines/secret-scan.js.map +1 -0
- package/dist/engines/semgrep.d.ts +10 -0
- package/dist/engines/semgrep.d.ts.map +1 -0
- package/dist/engines/semgrep.js +200 -0
- package/dist/engines/semgrep.js.map +1 -0
- package/dist/engines/treesitter.d.ts +18 -0
- package/dist/engines/treesitter.d.ts.map +1 -0
- package/dist/engines/treesitter.js +135 -0
- package/dist/engines/treesitter.js.map +1 -0
- package/dist/engines/tsc.d.ts +10 -0
- package/dist/engines/tsc.d.ts.map +1 -0
- package/dist/engines/tsc.js +142 -0
- package/dist/engines/tsc.js.map +1 -0
- package/dist/engines/types.d.ts +47 -0
- package/dist/engines/types.d.ts.map +1 -0
- package/dist/engines/types.js +27 -0
- package/dist/engines/types.js.map +1 -0
- package/dist/findings.d.ts +121 -0
- package/dist/findings.d.ts.map +1 -0
- package/dist/findings.js +98 -0
- package/dist/findings.js.map +1 -0
- package/dist/hooks/claude-code.d.ts +3 -0
- package/dist/hooks/claude-code.d.ts.map +1 -0
- package/dist/hooks/claude-code.js +187 -0
- package/dist/hooks/claude-code.js.map +1 -0
- package/dist/index/context.d.ts +127 -0
- package/dist/index/context.d.ts.map +1 -0
- package/dist/index/context.js +267 -0
- package/dist/index/context.js.map +1 -0
- package/dist/index/embeddings.d.ts +68 -0
- package/dist/index/embeddings.d.ts.map +1 -0
- package/dist/index/embeddings.js +570 -0
- package/dist/index/embeddings.js.map +1 -0
- package/dist/index/graph_routing.d.ts +36 -0
- package/dist/index/graph_routing.d.ts.map +1 -0
- package/dist/index/graph_routing.js +170 -0
- package/dist/index/graph_routing.js.map +1 -0
- package/dist/index/joern.d.ts +76 -0
- package/dist/index/joern.d.ts.map +1 -0
- package/dist/index/joern.js +782 -0
- package/dist/index/joern.js.map +1 -0
- package/dist/index/property-test.d.ts +88 -0
- package/dist/index/property-test.d.ts.map +1 -0
- package/dist/index/property-test.js +466 -0
- package/dist/index/property-test.js.map +1 -0
- package/dist/index/proto/scip.proto +897 -0
- package/dist/index/pysa.d.ts +91 -0
- package/dist/index/pysa.d.ts.map +1 -0
- package/dist/index/pysa.js +617 -0
- package/dist/index/pysa.js.map +1 -0
- package/dist/index/scip.d.ts +76 -0
- package/dist/index/scip.d.ts.map +1 -0
- package/dist/index/scip.js +541 -0
- package/dist/index/scip.js.map +1 -0
- package/dist/index/vulrag.d.ts +86 -0
- package/dist/index/vulrag.d.ts.map +1 -0
- package/dist/index/vulrag.js +242 -0
- package/dist/index/vulrag.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/install/claude-code.d.ts +31 -0
- package/dist/install/claude-code.d.ts.map +1 -0
- package/dist/install/claude-code.js +447 -0
- package/dist/install/claude-code.js.map +1 -0
- package/dist/lang.d.ts +5 -0
- package/dist/lang.d.ts.map +1 -0
- package/dist/lang.js +52 -0
- package/dist/lang.js.map +1 -0
- package/dist/learning/suppressions.d.ts +70 -0
- package/dist/learning/suppressions.d.ts.map +1 -0
- package/dist/learning/suppressions.js +179 -0
- package/dist/learning/suppressions.js.map +1 -0
- package/dist/mcp/server.d.ts +2 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +187 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools/explain.d.ts +58 -0
- package/dist/mcp/tools/explain.d.ts.map +1 -0
- package/dist/mcp/tools/explain.js +60 -0
- package/dist/mcp/tools/explain.js.map +1 -0
- package/dist/mcp/tools/precheck.d.ts +29 -0
- package/dist/mcp/tools/precheck.d.ts.map +1 -0
- package/dist/mcp/tools/precheck.js +42 -0
- package/dist/mcp/tools/precheck.js.map +1 -0
- package/dist/mcp/tools/validate.d.ts +73 -0
- package/dist/mcp/tools/validate.d.ts.map +1 -0
- package/dist/mcp/tools/validate.js +66 -0
- package/dist/mcp/tools/validate.js.map +1 -0
- package/dist/mcp/warm.d.ts +88 -0
- package/dist/mcp/warm.d.ts.map +1 -0
- package/dist/mcp/warm.js +331 -0
- package/dist/mcp/warm.js.map +1 -0
- package/dist/orchestrator.d.ts +46 -0
- package/dist/orchestrator.d.ts.map +1 -0
- package/dist/orchestrator.js +596 -0
- package/dist/orchestrator.js.map +1 -0
- package/dist/policy.d.ts +51 -0
- package/dist/policy.d.ts.map +1 -0
- package/dist/policy.js +201 -0
- package/dist/policy.js.map +1 -0
- package/dist/risk.d.ts +31 -0
- package/dist/risk.d.ts.map +1 -0
- package/dist/risk.js +92 -0
- package/dist/risk.js.map +1 -0
- package/dist/stats.d.ts +72 -0
- package/dist/stats.d.ts.map +1 -0
- package/dist/stats.js +217 -0
- package/dist/stats.js.map +1 -0
- package/dist/telemetry/collector.d.ts +10 -0
- package/dist/telemetry/collector.d.ts.map +1 -0
- package/dist/telemetry/collector.js +75 -0
- package/dist/telemetry/collector.js.map +1 -0
- package/dist/telemetry/consent.d.ts +9 -0
- package/dist/telemetry/consent.d.ts.map +1 -0
- package/dist/telemetry/consent.js +42 -0
- package/dist/telemetry/consent.js.map +1 -0
- package/dist/telemetry/installation.d.ts +2 -0
- package/dist/telemetry/installation.d.ts.map +1 -0
- package/dist/telemetry/installation.js +32 -0
- package/dist/telemetry/installation.js.map +1 -0
- package/dist/telemetry/sanitizer.d.ts +5 -0
- package/dist/telemetry/sanitizer.d.ts.map +1 -0
- package/dist/telemetry/sanitizer.js +60 -0
- package/dist/telemetry/sanitizer.js.map +1 -0
- package/dist/telemetry/types.d.ts +39 -0
- package/dist/telemetry/types.d.ts.map +1 -0
- package/dist/telemetry/types.js +4 -0
- package/dist/telemetry/types.js.map +1 -0
- package/dist/telemetry/uploader.d.ts +12 -0
- package/dist/telemetry/uploader.d.ts.map +1 -0
- package/dist/telemetry/uploader.js +92 -0
- package/dist/telemetry/uploader.js.map +1 -0
- package/dist/util/logger.d.ts +19 -0
- package/dist/util/logger.d.ts.map +1 -0
- package/dist/util/logger.js +58 -0
- package/dist/util/logger.js.map +1 -0
- package/dist/util/safe-paths.d.ts +8 -0
- package/dist/util/safe-paths.d.ts.map +1 -0
- package/dist/util/safe-paths.js +102 -0
- package/dist/util/safe-paths.js.map +1 -0
- package/dist/util/subprocess.d.ts +32 -0
- package/dist/util/subprocess.d.ts.map +1 -0
- package/dist/util/subprocess.js +137 -0
- package/dist/util/subprocess.js.map +1 -0
- package/package.json +93 -0
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { Embedder } from "./embeddings.js";
|
|
2
|
+
export interface VulRagEntry {
|
|
3
|
+
/** Canonical CWE id, e.g. ``"CWE-89"``. We allow duplicate-suffix ids like
|
|
4
|
+
* ``"CWE-209c"`` in the curated KB so multiple variants of one CWE can each
|
|
5
|
+
* get their own entry — the id is a slug, not an enforced MITRE key. */
|
|
6
|
+
cwe: string;
|
|
7
|
+
/** Short human label, e.g. ``"SQL Injection"``. Used in critic prompts. */
|
|
8
|
+
name: string;
|
|
9
|
+
/** One of: ``api_misuse | logic | resource | concurrency | auth | crypto``.
|
|
10
|
+
* Routing hint for the critic. */
|
|
11
|
+
category: string;
|
|
12
|
+
/** One of: ``critical | high | medium | low``. Default-block rank source. */
|
|
13
|
+
severity: string;
|
|
14
|
+
/** One-line explanation of why this class of bug exists. */
|
|
15
|
+
cause: string;
|
|
16
|
+
/** Languages this pattern applies to (lowercase, e.g. ``["python","javascript"]``).
|
|
17
|
+
* The critic uses this for the optional ``language`` filter on retrieval. */
|
|
18
|
+
languages: string[];
|
|
19
|
+
/** Canonical vulnerable code sample (short, ~5-15 lines). **Embedded** for
|
|
20
|
+
* semantic retrieval. The critic gets this verbatim to ground its reasoning. */
|
|
21
|
+
vulnerable_pattern: string;
|
|
22
|
+
/** Canonical fixed counterpart. Shown to the user in remediation prompts. */
|
|
23
|
+
fix_pattern: string;
|
|
24
|
+
/** Short strings the critic can grep mentally to confirm a match
|
|
25
|
+
* (e.g. ``["f-string in execute(", "innerHTML with user data"]``). */
|
|
26
|
+
detection_hints: string[];
|
|
27
|
+
}
|
|
28
|
+
export interface VulRagHit {
|
|
29
|
+
entry: VulRagEntry;
|
|
30
|
+
/** Cosine similarity in [-1, 1]; higher = more similar. */
|
|
31
|
+
similarity: number;
|
|
32
|
+
}
|
|
33
|
+
/** Resolve the path to the bundled ``vulnkb.json``. Exported for tests and
|
|
34
|
+
* tooling that want to load the KB without instantiating ``VulRag``. */
|
|
35
|
+
export declare function vulRagKbPath(): string;
|
|
36
|
+
export declare class VulRag {
|
|
37
|
+
private readonly kbPath;
|
|
38
|
+
private readonly embedder;
|
|
39
|
+
private entries;
|
|
40
|
+
private vectors;
|
|
41
|
+
private loaded;
|
|
42
|
+
private loadPromise;
|
|
43
|
+
private _sha;
|
|
44
|
+
private _model;
|
|
45
|
+
constructor(kbPath?: string, embedder?: Embedder);
|
|
46
|
+
get path(): string;
|
|
47
|
+
/** Number of indexed entries (0 until ensureLoaded() succeeds). */
|
|
48
|
+
get size(): number;
|
|
49
|
+
/** sha256 prefix of the KB file at load time; null before load. */
|
|
50
|
+
get kbSha(): string | null;
|
|
51
|
+
get model(): string | null;
|
|
52
|
+
/** Load the KB and embed every entry. Lazy + idempotent. Concurrent
|
|
53
|
+
* callers share one in-flight promise — we don't want two callers each
|
|
54
|
+
* spending ~0.6 s embedding the same 60 patterns. Returns false if the
|
|
55
|
+
* embedder can't load (e.g. transformers.js not installed). */
|
|
56
|
+
ensureLoaded(): Promise<boolean>;
|
|
57
|
+
/** Return the top-K semantically similar CWE entries for a snippet.
|
|
58
|
+
*
|
|
59
|
+
* @param snippet Code (or finding message + code) to retrieve against.
|
|
60
|
+
* @param k Max entries to return; clamped to KB size.
|
|
61
|
+
* @param opts.language If set, only consider entries that list this
|
|
62
|
+
* language. Use the lowercase canonical form
|
|
63
|
+
* (``python | javascript | typescript | go``).
|
|
64
|
+
* @param opts.minSimilarity Drop hits with cosine < this. Default 0
|
|
65
|
+
* (return whatever the embedder rates highest).
|
|
66
|
+
*/
|
|
67
|
+
topK(snippet: string, k: number, opts?: {
|
|
68
|
+
language?: string;
|
|
69
|
+
minSimilarity?: number;
|
|
70
|
+
}): Promise<VulRagHit[]>;
|
|
71
|
+
/** Iterate every entry whose CWE matches one of ``cweIds``. Useful for the
|
|
72
|
+
* router-150m → critic path where the router predicts a CWE bucket and
|
|
73
|
+
* we want to ground the critic in the *predicted* CWE rather than (or in
|
|
74
|
+
* addition to) the top semantic neighbours.
|
|
75
|
+
*
|
|
76
|
+
* Match is loose: an entry's ``cwe`` of ``"CWE-89"`` matches any of
|
|
77
|
+
* ``["CWE-89", "89", "cwe-89"]`` in the input list.
|
|
78
|
+
*/
|
|
79
|
+
byCwe(cweIds: ReadonlyArray<string>): VulRagEntry[];
|
|
80
|
+
}
|
|
81
|
+
/** Process-wide singleton. Engines should always use this rather than
|
|
82
|
+
* constructing their own ``VulRag`` — the embedding cost is paid once. */
|
|
83
|
+
export declare function getVulRag(): VulRag;
|
|
84
|
+
/** Reset the singleton — test-only. Production should never call this. */
|
|
85
|
+
export declare function _resetVulRagForTests(): void;
|
|
86
|
+
//# sourceMappingURL=vulrag.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vulrag.d.ts","sourceRoot":"","sources":["../../src/index/vulrag.ts"],"names":[],"mappings":"AA4CA,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAQ3C,MAAM,WAAW,WAAW;IAC1B;;4EAEwE;IACxE,GAAG,EAAE,MAAM,CAAC;IACZ,2EAA2E;IAC3E,IAAI,EAAE,MAAM,CAAC;IACb;sCACkC;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,6EAA6E;IAC7E,QAAQ,EAAE,MAAM,CAAC;IACjB,4DAA4D;IAC5D,KAAK,EAAE,MAAM,CAAC;IACd;iFAC6E;IAC7E,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB;oFACgF;IAChF,kBAAkB,EAAE,MAAM,CAAC;IAC3B,6EAA6E;IAC7E,WAAW,EAAE,MAAM,CAAC;IACpB;0EACsE;IACtE,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,WAAW,CAAC;IACnB,2DAA2D;IAC3D,UAAU,EAAE,MAAM,CAAC;CACpB;AAgBD;wEACwE;AACxE,wBAAgB,YAAY,IAAI,MAAM,CAqBrC;AA2BD,qBAAa,MAAM;IASf,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAT3B,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,WAAW,CAAiC;IACpD,OAAO,CAAC,IAAI,CAAuB;IACnC,OAAO,CAAC,MAAM,CAAuB;gBAGlB,MAAM,GAAE,MAAuB,EAC/B,QAAQ,GAAE,QAAyB;IAGtD,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,mEAAmE;IACnE,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,mEAAmE;IACnE,IAAI,KAAK,IAAI,MAAM,GAAG,IAAI,CAEzB;IAED,IAAI,KAAK,IAAI,MAAM,GAAG,IAAI,CAEzB;IAED;;;mEAG+D;IACzD,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC;IA2CtC;;;;;;;;;OASG;IACG,IAAI,CACR,OAAO,EAAE,MAAM,EACf,CAAC,EAAE,MAAM,EACT,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,GACnD,OAAO,CAAC,SAAS,EAAE,CAAC;IA2BvB;;;;;;;OAOG;IACH,KAAK,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,WAAW,EAAE;CAKpD;AAUD;0EAC0E;AAC1E,wBAAgB,SAAS,IAAI,MAAM,CAGlC;AAED,0EAA0E;AAC1E,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C"}
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vul-RAG — retrieval over a curated CWE knowledge base.
|
|
3
|
+
*
|
|
4
|
+
* Each entry in ``data/vulnkb.json`` is a canonical (cause, vulnerable_pattern,
|
|
5
|
+
* fix_pattern, detection_hints) tuple for one CWE. At first use we embed the
|
|
6
|
+
* vulnerable_pattern of every entry using the same local model the SCIP
|
|
7
|
+
* embedder uses (``Xenova/all-MiniLM-L6-v2`` by default, 384-d, MIT licensed,
|
|
8
|
+
* runs on CPU in transformers.js).
|
|
9
|
+
*
|
|
10
|
+
* The LLM critic (Phase 2, V2-07) calls ``topK(snippet, 3)`` to fetch the
|
|
11
|
+
* three most semantically similar CWE patterns and inlines them in its prompt
|
|
12
|
+
* as evidence — this is the Du 2024 Vul-RAG pattern (arxiv 2406.11147) that
|
|
13
|
+
* the research credits with +16-24 pp accuracy over a pure LLM judge.
|
|
14
|
+
*
|
|
15
|
+
* Storage strategy
|
|
16
|
+
* ----------------
|
|
17
|
+
* For ~60 entries we use **brute-force cosine** over an in-memory
|
|
18
|
+
* ``Float32Array[]``. 60 × 384 × 4 bytes ≈ 92 KB; one query is sub-ms even
|
|
19
|
+
* unrolled. An HNSW (like the SCIP embedder uses) would be theatre at this
|
|
20
|
+
* scale and add a deserialize-on-load cost without measurable speedup.
|
|
21
|
+
*
|
|
22
|
+
* The KB-embedding cost (~10 ms × 60 = 0.6 s cold) happens once per process,
|
|
23
|
+
* lazily on first ``ensureLoaded()``. We do NOT persist embeddings to disk in
|
|
24
|
+
* v1: the cost is tolerable on every cold start, and avoiding the persist
|
|
25
|
+
* step means we can never serve stale vectors after a KB edit.
|
|
26
|
+
*
|
|
27
|
+
* Public surface:
|
|
28
|
+
* - VulRagEntry — strict shape of one KB entry
|
|
29
|
+
* - VulRagHit — { entry, similarity } returned by topK
|
|
30
|
+
* - VulRag — instance class (loads, embeds, queries)
|
|
31
|
+
* - getVulRag() — process-wide singleton (use this in engines)
|
|
32
|
+
* - vulRagKbPath() — resolve the bundled vulnkb.json (test + tooling)
|
|
33
|
+
*
|
|
34
|
+
* The KB file path resolution mirrors how ``embeddings.ts`` finds the bundled
|
|
35
|
+
* ``scip.proto``: try several candidate paths derived from cwd + module URL,
|
|
36
|
+
* pick the first that exists. This lets the package work whether it's
|
|
37
|
+
* installed from npm, linked locally, or run from a checkout.
|
|
38
|
+
*/
|
|
39
|
+
import { createHash } from "node:crypto";
|
|
40
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
41
|
+
import { fileURLToPath } from "node:url";
|
|
42
|
+
import { dirname, resolve } from "node:path";
|
|
43
|
+
import { getLogger } from "../util/logger.js";
|
|
44
|
+
import { Embedder } from "./embeddings.js";
|
|
45
|
+
const log = getLogger("aegis.vulrag");
|
|
46
|
+
const KB_SOURCE_FIELD = "vulnerable_pattern";
|
|
47
|
+
// ── KB-path resolution ───────────────────────────────────────────────────
|
|
48
|
+
function moduleDir() {
|
|
49
|
+
// import.meta.url is e.g. file:///C:/.../dist/index/vulrag.js
|
|
50
|
+
// dirname gives .../dist/index/. Walk up two to reach package root.
|
|
51
|
+
return dirname(fileURLToPath(import.meta.url));
|
|
52
|
+
}
|
|
53
|
+
/** Resolve the path to the bundled ``vulnkb.json``. Exported for tests and
|
|
54
|
+
* tooling that want to load the KB without instantiating ``VulRag``. */
|
|
55
|
+
export function vulRagKbPath() {
|
|
56
|
+
const overrides = process.env.AEGIS_VULNKB_PATH;
|
|
57
|
+
if (overrides && existsSync(overrides))
|
|
58
|
+
return resolve(overrides);
|
|
59
|
+
const mod = moduleDir();
|
|
60
|
+
const candidates = [
|
|
61
|
+
// run from a built install — package root is two levels above dist/index/
|
|
62
|
+
resolve(mod, "..", "..", "data", "vulnkb.json"),
|
|
63
|
+
// run from a source checkout via tsx — module is in src/index/
|
|
64
|
+
resolve(mod, "..", "..", "data", "vulnkb.json"),
|
|
65
|
+
// running from cwd in a dev shell
|
|
66
|
+
resolve(process.cwd(), "data", "vulnkb.json"),
|
|
67
|
+
// monorepo-style cwd one level up
|
|
68
|
+
resolve(process.cwd(), "aegis-v2", "data", "vulnkb.json"),
|
|
69
|
+
];
|
|
70
|
+
for (const c of candidates) {
|
|
71
|
+
if (existsSync(c))
|
|
72
|
+
return c;
|
|
73
|
+
}
|
|
74
|
+
// Default to the most-likely path even if missing — caller decides what
|
|
75
|
+
// to do (loadKb will throw with a clear message).
|
|
76
|
+
return candidates[0];
|
|
77
|
+
}
|
|
78
|
+
function loadKb(path) {
|
|
79
|
+
const raw = readFileSync(path, "utf8");
|
|
80
|
+
const parsed = JSON.parse(raw);
|
|
81
|
+
if (!parsed || !Array.isArray(parsed.entries)) {
|
|
82
|
+
throw new Error(`vulnkb.json at ${path} is malformed: missing entries[]`);
|
|
83
|
+
}
|
|
84
|
+
return parsed;
|
|
85
|
+
}
|
|
86
|
+
function kbSha(path) {
|
|
87
|
+
const buf = readFileSync(path);
|
|
88
|
+
return createHash("sha256").update(buf).digest("hex").slice(0, 16);
|
|
89
|
+
}
|
|
90
|
+
// ── Cosine over L2-normalised vectors = dot product ──────────────────────
|
|
91
|
+
function dot(a, b) {
|
|
92
|
+
let s = 0;
|
|
93
|
+
const n = Math.min(a.length, b.length);
|
|
94
|
+
for (let i = 0; i < n; i++)
|
|
95
|
+
s += a[i] * b[i];
|
|
96
|
+
return s;
|
|
97
|
+
}
|
|
98
|
+
// ── The class ─────────────────────────────────────────────────────────────
|
|
99
|
+
export class VulRag {
|
|
100
|
+
kbPath;
|
|
101
|
+
embedder;
|
|
102
|
+
entries = [];
|
|
103
|
+
vectors = [];
|
|
104
|
+
loaded = false;
|
|
105
|
+
loadPromise = null;
|
|
106
|
+
_sha = null;
|
|
107
|
+
_model = null;
|
|
108
|
+
constructor(kbPath = vulRagKbPath(), embedder = new Embedder()) {
|
|
109
|
+
this.kbPath = kbPath;
|
|
110
|
+
this.embedder = embedder;
|
|
111
|
+
}
|
|
112
|
+
get path() {
|
|
113
|
+
return this.kbPath;
|
|
114
|
+
}
|
|
115
|
+
/** Number of indexed entries (0 until ensureLoaded() succeeds). */
|
|
116
|
+
get size() {
|
|
117
|
+
return this.entries.length;
|
|
118
|
+
}
|
|
119
|
+
/** sha256 prefix of the KB file at load time; null before load. */
|
|
120
|
+
get kbSha() {
|
|
121
|
+
return this._sha;
|
|
122
|
+
}
|
|
123
|
+
get model() {
|
|
124
|
+
return this._model;
|
|
125
|
+
}
|
|
126
|
+
/** Load the KB and embed every entry. Lazy + idempotent. Concurrent
|
|
127
|
+
* callers share one in-flight promise — we don't want two callers each
|
|
128
|
+
* spending ~0.6 s embedding the same 60 patterns. Returns false if the
|
|
129
|
+
* embedder can't load (e.g. transformers.js not installed). */
|
|
130
|
+
async ensureLoaded() {
|
|
131
|
+
if (this.loaded)
|
|
132
|
+
return true;
|
|
133
|
+
if (this.loadPromise)
|
|
134
|
+
return this.loadPromise;
|
|
135
|
+
this.loadPromise = (async () => {
|
|
136
|
+
try {
|
|
137
|
+
const file = loadKb(this.kbPath);
|
|
138
|
+
this.entries = file.entries;
|
|
139
|
+
this._sha = kbSha(this.kbPath);
|
|
140
|
+
const ok = await this.embedder.ensureLoaded();
|
|
141
|
+
if (!ok) {
|
|
142
|
+
log.warn("vul-rag: embedder unavailable; topK will return []");
|
|
143
|
+
// Keep entries set so callers can still iterate the KB shape if
|
|
144
|
+
// they want to (e.g. category breakdown reports).
|
|
145
|
+
return false;
|
|
146
|
+
}
|
|
147
|
+
this._model = this.embedder.model;
|
|
148
|
+
const t0 = Date.now();
|
|
149
|
+
for (const e of this.entries) {
|
|
150
|
+
// Embed "<CWE> <name>\n<vulnerable_pattern>" — concatenating the
|
|
151
|
+
// label gives the embedder a stronger semantic signal than the
|
|
152
|
+
// raw code alone (especially for short snippets where the code
|
|
153
|
+
// shape doesn't uniquely identify the bug class).
|
|
154
|
+
const text = `${e.cwe} ${e.name}\n${e[KB_SOURCE_FIELD]}`;
|
|
155
|
+
const vec = await this.embedder.embed(text);
|
|
156
|
+
this.vectors.push(vec ?? new Float32Array(this.embedder.dim));
|
|
157
|
+
}
|
|
158
|
+
log.info("vul-rag: loaded + embedded", {
|
|
159
|
+
entries: this.entries.length,
|
|
160
|
+
model: this.embedder.model,
|
|
161
|
+
dim: this.embedder.dim,
|
|
162
|
+
durationMs: Date.now() - t0,
|
|
163
|
+
kbSha: this._sha,
|
|
164
|
+
});
|
|
165
|
+
this.loaded = true;
|
|
166
|
+
return true;
|
|
167
|
+
}
|
|
168
|
+
catch (err) {
|
|
169
|
+
log.warn("vul-rag: load failed", { err: String(err), path: this.kbPath });
|
|
170
|
+
return false;
|
|
171
|
+
}
|
|
172
|
+
})();
|
|
173
|
+
return this.loadPromise;
|
|
174
|
+
}
|
|
175
|
+
/** Return the top-K semantically similar CWE entries for a snippet.
|
|
176
|
+
*
|
|
177
|
+
* @param snippet Code (or finding message + code) to retrieve against.
|
|
178
|
+
* @param k Max entries to return; clamped to KB size.
|
|
179
|
+
* @param opts.language If set, only consider entries that list this
|
|
180
|
+
* language. Use the lowercase canonical form
|
|
181
|
+
* (``python | javascript | typescript | go``).
|
|
182
|
+
* @param opts.minSimilarity Drop hits with cosine < this. Default 0
|
|
183
|
+
* (return whatever the embedder rates highest).
|
|
184
|
+
*/
|
|
185
|
+
async topK(snippet, k, opts) {
|
|
186
|
+
if (!(await this.ensureLoaded()))
|
|
187
|
+
return [];
|
|
188
|
+
if (k <= 0 || this.entries.length === 0)
|
|
189
|
+
return [];
|
|
190
|
+
const qv = await this.embedder.embed(snippet);
|
|
191
|
+
if (!qv)
|
|
192
|
+
return [];
|
|
193
|
+
const minSim = opts?.minSimilarity ?? -1;
|
|
194
|
+
const langFilter = opts?.language?.toLowerCase();
|
|
195
|
+
// Score every entry. With 60 entries this is ~60 × 384 = ~23K mults
|
|
196
|
+
// per query — well under 1 ms on a warm V8.
|
|
197
|
+
const scored = [];
|
|
198
|
+
for (let i = 0; i < this.entries.length; i++) {
|
|
199
|
+
const e = this.entries[i];
|
|
200
|
+
if (langFilter && !e.languages.map((l) => l.toLowerCase()).includes(langFilter)) {
|
|
201
|
+
continue;
|
|
202
|
+
}
|
|
203
|
+
const sim = dot(qv, this.vectors[i]);
|
|
204
|
+
if (sim < minSim)
|
|
205
|
+
continue;
|
|
206
|
+
scored.push({ entry: e, similarity: sim });
|
|
207
|
+
}
|
|
208
|
+
scored.sort((a, b) => b.similarity - a.similarity);
|
|
209
|
+
return scored.slice(0, Math.min(k, scored.length));
|
|
210
|
+
}
|
|
211
|
+
/** Iterate every entry whose CWE matches one of ``cweIds``. Useful for the
|
|
212
|
+
* router-150m → critic path where the router predicts a CWE bucket and
|
|
213
|
+
* we want to ground the critic in the *predicted* CWE rather than (or in
|
|
214
|
+
* addition to) the top semantic neighbours.
|
|
215
|
+
*
|
|
216
|
+
* Match is loose: an entry's ``cwe`` of ``"CWE-89"`` matches any of
|
|
217
|
+
* ``["CWE-89", "89", "cwe-89"]`` in the input list.
|
|
218
|
+
*/
|
|
219
|
+
byCwe(cweIds) {
|
|
220
|
+
if (!this.loaded)
|
|
221
|
+
return [];
|
|
222
|
+
const norm = new Set(cweIds.map((c) => normalizeCwe(c)));
|
|
223
|
+
return this.entries.filter((e) => norm.has(normalizeCwe(e.cwe)));
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
function normalizeCwe(s) {
|
|
227
|
+
return s.trim().toUpperCase().replace(/^CWE-/, "");
|
|
228
|
+
}
|
|
229
|
+
// ── Singleton accessor ────────────────────────────────────────────────────
|
|
230
|
+
let _singleton = null;
|
|
231
|
+
/** Process-wide singleton. Engines should always use this rather than
|
|
232
|
+
* constructing their own ``VulRag`` — the embedding cost is paid once. */
|
|
233
|
+
export function getVulRag() {
|
|
234
|
+
if (!_singleton)
|
|
235
|
+
_singleton = new VulRag();
|
|
236
|
+
return _singleton;
|
|
237
|
+
}
|
|
238
|
+
/** Reset the singleton — test-only. Production should never call this. */
|
|
239
|
+
export function _resetVulRagForTests() {
|
|
240
|
+
_singleton = null;
|
|
241
|
+
}
|
|
242
|
+
//# sourceMappingURL=vulrag.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vulrag.js","sourceRoot":"","sources":["../../src/index/vulrag.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** Public API re-exports. */
|
|
2
|
+
export { runGate, type GateInput, type GateReport } from "./orchestrator.js";
|
|
3
|
+
export { decide, scoreOne, exitCodeFor, type Action, type ActionDecision } from "./risk.js";
|
|
4
|
+
export { FindingSchema, type Finding, type Severity, type Engine as EngineName, type SourceKind, makeFindingId, safeValidate, validateFinding, severityRank, SEVERITY_ORDER, } from "./findings.js";
|
|
5
|
+
export { detectLang, isFocusLang, type Lang } from "./lang.js";
|
|
6
|
+
export { ENGINES, engineByName } from "./engines/registry.js";
|
|
7
|
+
export type { Engine, EngineRunInput, EngineRunResult } from "./engines/types.js";
|
|
8
|
+
export { startServer } from "./mcp/server.js";
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,OAAO,EAAE,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC7E,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,MAAM,EAAE,KAAK,cAAc,EAAE,MAAM,WAAW,CAAC;AAC5F,OAAO,EACL,aAAa,EACb,KAAK,OAAO,EACZ,KAAK,QAAQ,EACb,KAAK,MAAM,IAAI,UAAU,EACzB,KAAK,UAAU,EACf,aAAa,EACb,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,cAAc,GACf,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,KAAK,IAAI,EAAE,MAAM,WAAW,CAAC;AAC/D,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC9D,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAClF,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** Public API re-exports. */
|
|
2
|
+
export { runGate } from "./orchestrator.js";
|
|
3
|
+
export { decide, scoreOne, exitCodeFor } from "./risk.js";
|
|
4
|
+
export { FindingSchema, makeFindingId, safeValidate, validateFinding, severityRank, SEVERITY_ORDER, } from "./findings.js";
|
|
5
|
+
export { detectLang, isFocusLang } from "./lang.js";
|
|
6
|
+
export { ENGINES, engineByName } from "./engines/registry.js";
|
|
7
|
+
export { startServer } from "./mcp/server.js";
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,OAAO,EAAE,OAAO,EAAmC,MAAM,mBAAmB,CAAC;AAC7E,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAoC,MAAM,WAAW,CAAC;AAC5F,OAAO,EACL,aAAa,EAKb,aAAa,EACb,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,cAAc,GACf,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,UAAU,EAAE,WAAW,EAAa,MAAM,WAAW,CAAC;AAC/D,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE9D,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export interface InstallOptions {
|
|
2
|
+
dryRun?: boolean;
|
|
3
|
+
/** Skip CLAUDE.md edit (hook + MCP only). */
|
|
4
|
+
skipClaudeMd?: boolean;
|
|
5
|
+
/** Use a custom Claude home (defaults to ~/.claude). For testing. */
|
|
6
|
+
claudeHome?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface ChangeRecord {
|
|
9
|
+
file: string;
|
|
10
|
+
op: "create" | "modify" | "skip";
|
|
11
|
+
reason: string;
|
|
12
|
+
before?: string;
|
|
13
|
+
after?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface InstallReport {
|
|
16
|
+
dryRun: boolean;
|
|
17
|
+
aegisBinPath: string;
|
|
18
|
+
claudeHome: string;
|
|
19
|
+
changes: ChangeRecord[];
|
|
20
|
+
fixmeBlockRemoved: boolean;
|
|
21
|
+
}
|
|
22
|
+
/** Public entry: register aegis in Claude Code. */
|
|
23
|
+
export declare function installClaudeCode(opts?: InstallOptions): InstallReport;
|
|
24
|
+
/** Public entry: remove aegis from Claude Code. Idempotent. */
|
|
25
|
+
export declare function uninstallClaudeCode(opts?: {
|
|
26
|
+
dryRun?: boolean;
|
|
27
|
+
claudeHome?: string;
|
|
28
|
+
}): InstallReport;
|
|
29
|
+
/** Human-readable summary for the CLI. */
|
|
30
|
+
export declare function formatReport(r: InstallReport): string;
|
|
31
|
+
//# sourceMappingURL=claude-code.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-code.d.ts","sourceRoot":"","sources":["../../src/install/claude-code.ts"],"names":[],"mappings":"AA+BA,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,6CAA6C;IAC7C,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,qEAAqE;IACrE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,OAAO,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,iBAAiB,EAAE,OAAO,CAAC;CAC5B;AA0PD,mDAAmD;AACnD,wBAAgB,iBAAiB,CAAC,IAAI,GAAE,cAAmB,GAAG,aAAa,CAgF1E;AAED,+DAA+D;AAC/D,wBAAgB,mBAAmB,CAAC,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,aAAa,CAoGvG;AAED,0CAA0C;AAC1C,wBAAgB,YAAY,CAAC,CAAC,EAAE,aAAa,GAAG,MAAM,CA2BrD"}
|