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.
Files changed (208) hide show
  1. package/.claude/settings.example.json +30 -0
  2. package/ARCHITECTURE.md +410 -0
  3. package/LICENSE +21 -0
  4. package/README.md +153 -0
  5. package/ROADMAP.md +117 -0
  6. package/data/vulnkb.json +666 -0
  7. package/dist/bin/aegis.d.ts +3 -0
  8. package/dist/bin/aegis.d.ts.map +1 -0
  9. package/dist/bin/aegis.js +489 -0
  10. package/dist/bin/aegis.js.map +1 -0
  11. package/dist/cache.d.ts +9 -0
  12. package/dist/cache.d.ts.map +1 -0
  13. package/dist/cache.js +146 -0
  14. package/dist/cache.js.map +1 -0
  15. package/dist/engines/ai-sinks.d.ts +52 -0
  16. package/dist/engines/ai-sinks.d.ts.map +1 -0
  17. package/dist/engines/ai-sinks.js +204 -0
  18. package/dist/engines/ai-sinks.js.map +1 -0
  19. package/dist/engines/eslint.d.ts +9 -0
  20. package/dist/engines/eslint.d.ts.map +1 -0
  21. package/dist/engines/eslint.js +245 -0
  22. package/dist/engines/eslint.js.map +1 -0
  23. package/dist/engines/joern.d.ts +3 -0
  24. package/dist/engines/joern.d.ts.map +1 -0
  25. package/dist/engines/joern.js +98 -0
  26. package/dist/engines/joern.js.map +1 -0
  27. package/dist/engines/js-sinks.d.ts +70 -0
  28. package/dist/engines/js-sinks.d.ts.map +1 -0
  29. package/dist/engines/js-sinks.js +370 -0
  30. package/dist/engines/js-sinks.js.map +1 -0
  31. package/dist/engines/llm-critic.d.ts +130 -0
  32. package/dist/engines/llm-critic.d.ts.map +1 -0
  33. package/dist/engines/llm-critic.js +551 -0
  34. package/dist/engines/llm-critic.js.map +1 -0
  35. package/dist/engines/pragma.d.ts +20 -0
  36. package/dist/engines/pragma.d.ts.map +1 -0
  37. package/dist/engines/pragma.js +83 -0
  38. package/dist/engines/pragma.js.map +1 -0
  39. package/dist/engines/property-test.d.ts +3 -0
  40. package/dist/engines/property-test.d.ts.map +1 -0
  41. package/dist/engines/property-test.js +134 -0
  42. package/dist/engines/property-test.js.map +1 -0
  43. package/dist/engines/pyright.d.ts +10 -0
  44. package/dist/engines/pyright.d.ts.map +1 -0
  45. package/dist/engines/pyright.js +143 -0
  46. package/dist/engines/pyright.js.map +1 -0
  47. package/dist/engines/pysa.d.ts +3 -0
  48. package/dist/engines/pysa.d.ts.map +1 -0
  49. package/dist/engines/pysa.js +83 -0
  50. package/dist/engines/pysa.js.map +1 -0
  51. package/dist/engines/python-sinks.d.ts +82 -0
  52. package/dist/engines/python-sinks.d.ts.map +1 -0
  53. package/dist/engines/python-sinks.js +459 -0
  54. package/dist/engines/python-sinks.js.map +1 -0
  55. package/dist/engines/registry.d.ts +26 -0
  56. package/dist/engines/registry.d.ts.map +1 -0
  57. package/dist/engines/registry.js +70 -0
  58. package/dist/engines/registry.js.map +1 -0
  59. package/dist/engines/secret-scan.d.ts +22 -0
  60. package/dist/engines/secret-scan.d.ts.map +1 -0
  61. package/dist/engines/secret-scan.js +179 -0
  62. package/dist/engines/secret-scan.js.map +1 -0
  63. package/dist/engines/semgrep.d.ts +10 -0
  64. package/dist/engines/semgrep.d.ts.map +1 -0
  65. package/dist/engines/semgrep.js +200 -0
  66. package/dist/engines/semgrep.js.map +1 -0
  67. package/dist/engines/treesitter.d.ts +18 -0
  68. package/dist/engines/treesitter.d.ts.map +1 -0
  69. package/dist/engines/treesitter.js +135 -0
  70. package/dist/engines/treesitter.js.map +1 -0
  71. package/dist/engines/tsc.d.ts +10 -0
  72. package/dist/engines/tsc.d.ts.map +1 -0
  73. package/dist/engines/tsc.js +142 -0
  74. package/dist/engines/tsc.js.map +1 -0
  75. package/dist/engines/types.d.ts +47 -0
  76. package/dist/engines/types.d.ts.map +1 -0
  77. package/dist/engines/types.js +27 -0
  78. package/dist/engines/types.js.map +1 -0
  79. package/dist/findings.d.ts +121 -0
  80. package/dist/findings.d.ts.map +1 -0
  81. package/dist/findings.js +98 -0
  82. package/dist/findings.js.map +1 -0
  83. package/dist/hooks/claude-code.d.ts +3 -0
  84. package/dist/hooks/claude-code.d.ts.map +1 -0
  85. package/dist/hooks/claude-code.js +187 -0
  86. package/dist/hooks/claude-code.js.map +1 -0
  87. package/dist/index/context.d.ts +127 -0
  88. package/dist/index/context.d.ts.map +1 -0
  89. package/dist/index/context.js +267 -0
  90. package/dist/index/context.js.map +1 -0
  91. package/dist/index/embeddings.d.ts +68 -0
  92. package/dist/index/embeddings.d.ts.map +1 -0
  93. package/dist/index/embeddings.js +570 -0
  94. package/dist/index/embeddings.js.map +1 -0
  95. package/dist/index/graph_routing.d.ts +36 -0
  96. package/dist/index/graph_routing.d.ts.map +1 -0
  97. package/dist/index/graph_routing.js +170 -0
  98. package/dist/index/graph_routing.js.map +1 -0
  99. package/dist/index/joern.d.ts +76 -0
  100. package/dist/index/joern.d.ts.map +1 -0
  101. package/dist/index/joern.js +782 -0
  102. package/dist/index/joern.js.map +1 -0
  103. package/dist/index/property-test.d.ts +88 -0
  104. package/dist/index/property-test.d.ts.map +1 -0
  105. package/dist/index/property-test.js +466 -0
  106. package/dist/index/property-test.js.map +1 -0
  107. package/dist/index/proto/scip.proto +897 -0
  108. package/dist/index/pysa.d.ts +91 -0
  109. package/dist/index/pysa.d.ts.map +1 -0
  110. package/dist/index/pysa.js +617 -0
  111. package/dist/index/pysa.js.map +1 -0
  112. package/dist/index/scip.d.ts +76 -0
  113. package/dist/index/scip.d.ts.map +1 -0
  114. package/dist/index/scip.js +541 -0
  115. package/dist/index/scip.js.map +1 -0
  116. package/dist/index/vulrag.d.ts +86 -0
  117. package/dist/index/vulrag.d.ts.map +1 -0
  118. package/dist/index/vulrag.js +242 -0
  119. package/dist/index/vulrag.js.map +1 -0
  120. package/dist/index.d.ts +9 -0
  121. package/dist/index.d.ts.map +1 -0
  122. package/dist/index.js +8 -0
  123. package/dist/index.js.map +1 -0
  124. package/dist/install/claude-code.d.ts +31 -0
  125. package/dist/install/claude-code.d.ts.map +1 -0
  126. package/dist/install/claude-code.js +447 -0
  127. package/dist/install/claude-code.js.map +1 -0
  128. package/dist/lang.d.ts +5 -0
  129. package/dist/lang.d.ts.map +1 -0
  130. package/dist/lang.js +52 -0
  131. package/dist/lang.js.map +1 -0
  132. package/dist/learning/suppressions.d.ts +70 -0
  133. package/dist/learning/suppressions.d.ts.map +1 -0
  134. package/dist/learning/suppressions.js +179 -0
  135. package/dist/learning/suppressions.js.map +1 -0
  136. package/dist/mcp/server.d.ts +2 -0
  137. package/dist/mcp/server.d.ts.map +1 -0
  138. package/dist/mcp/server.js +187 -0
  139. package/dist/mcp/server.js.map +1 -0
  140. package/dist/mcp/tools/explain.d.ts +58 -0
  141. package/dist/mcp/tools/explain.d.ts.map +1 -0
  142. package/dist/mcp/tools/explain.js +60 -0
  143. package/dist/mcp/tools/explain.js.map +1 -0
  144. package/dist/mcp/tools/precheck.d.ts +29 -0
  145. package/dist/mcp/tools/precheck.d.ts.map +1 -0
  146. package/dist/mcp/tools/precheck.js +42 -0
  147. package/dist/mcp/tools/precheck.js.map +1 -0
  148. package/dist/mcp/tools/validate.d.ts +73 -0
  149. package/dist/mcp/tools/validate.d.ts.map +1 -0
  150. package/dist/mcp/tools/validate.js +66 -0
  151. package/dist/mcp/tools/validate.js.map +1 -0
  152. package/dist/mcp/warm.d.ts +88 -0
  153. package/dist/mcp/warm.d.ts.map +1 -0
  154. package/dist/mcp/warm.js +331 -0
  155. package/dist/mcp/warm.js.map +1 -0
  156. package/dist/orchestrator.d.ts +46 -0
  157. package/dist/orchestrator.d.ts.map +1 -0
  158. package/dist/orchestrator.js +596 -0
  159. package/dist/orchestrator.js.map +1 -0
  160. package/dist/policy.d.ts +51 -0
  161. package/dist/policy.d.ts.map +1 -0
  162. package/dist/policy.js +201 -0
  163. package/dist/policy.js.map +1 -0
  164. package/dist/risk.d.ts +31 -0
  165. package/dist/risk.d.ts.map +1 -0
  166. package/dist/risk.js +92 -0
  167. package/dist/risk.js.map +1 -0
  168. package/dist/stats.d.ts +72 -0
  169. package/dist/stats.d.ts.map +1 -0
  170. package/dist/stats.js +217 -0
  171. package/dist/stats.js.map +1 -0
  172. package/dist/telemetry/collector.d.ts +10 -0
  173. package/dist/telemetry/collector.d.ts.map +1 -0
  174. package/dist/telemetry/collector.js +75 -0
  175. package/dist/telemetry/collector.js.map +1 -0
  176. package/dist/telemetry/consent.d.ts +9 -0
  177. package/dist/telemetry/consent.d.ts.map +1 -0
  178. package/dist/telemetry/consent.js +42 -0
  179. package/dist/telemetry/consent.js.map +1 -0
  180. package/dist/telemetry/installation.d.ts +2 -0
  181. package/dist/telemetry/installation.d.ts.map +1 -0
  182. package/dist/telemetry/installation.js +32 -0
  183. package/dist/telemetry/installation.js.map +1 -0
  184. package/dist/telemetry/sanitizer.d.ts +5 -0
  185. package/dist/telemetry/sanitizer.d.ts.map +1 -0
  186. package/dist/telemetry/sanitizer.js +60 -0
  187. package/dist/telemetry/sanitizer.js.map +1 -0
  188. package/dist/telemetry/types.d.ts +39 -0
  189. package/dist/telemetry/types.d.ts.map +1 -0
  190. package/dist/telemetry/types.js +4 -0
  191. package/dist/telemetry/types.js.map +1 -0
  192. package/dist/telemetry/uploader.d.ts +12 -0
  193. package/dist/telemetry/uploader.d.ts.map +1 -0
  194. package/dist/telemetry/uploader.js +92 -0
  195. package/dist/telemetry/uploader.js.map +1 -0
  196. package/dist/util/logger.d.ts +19 -0
  197. package/dist/util/logger.d.ts.map +1 -0
  198. package/dist/util/logger.js +58 -0
  199. package/dist/util/logger.js.map +1 -0
  200. package/dist/util/safe-paths.d.ts +8 -0
  201. package/dist/util/safe-paths.d.ts.map +1 -0
  202. package/dist/util/safe-paths.js +102 -0
  203. package/dist/util/safe-paths.js.map +1 -0
  204. package/dist/util/subprocess.d.ts +32 -0
  205. package/dist/util/subprocess.d.ts.map +1 -0
  206. package/dist/util/subprocess.js +137 -0
  207. package/dist/util/subprocess.js.map +1 -0
  208. 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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"}
@@ -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"}