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
package/ROADMAP.md ADDED
@@ -0,0 +1,117 @@
1
+ # Aegis-v2 Roadmap
2
+
3
+ Phase 0 ships in this session. Phase 1-3 ship in their own sessions, each
4
+ phase fully production-ready — no stubs left behind.
5
+
6
+ ---
7
+
8
+ ## Phase 0 — Real-time Phase-0 gate (SHIPPED)
9
+
10
+ **Status:** Done.
11
+
12
+ **What ships:**
13
+ - `aegis` CLI: `mcp`, `hook`, `scan`, `doctor`, `--version`.
14
+ - MCP server (stdio) exposing `precheck_change`, `validate_edit`, `explain_risk`.
15
+ - Engines: `secret-scan` (built-in), `treesitter`, `eslint`, `pyright`, `tsc`, `semgrep`.
16
+ - Orchestrator: parallel run, per-engine + total timeout, LMDB cache.
17
+ - Risk scoring: confidence × severity → ALLOW / WARN / BLOCK; exit 0 / 2.
18
+ - Path safety: deny home-secret + system paths; reject outside-root.
19
+ - Audit log: append-only `.aegis/audit.jsonl`.
20
+ - Claude Code hook config (`.claude/settings.example.json`).
21
+ - Tests: findings schema, lang, risk, secret-scan, tree-sitter, eslint, orchestrator.
22
+
23
+ **Exit criteria (met):**
24
+ - `npm install && npm run build && npm test` passes on this machine.
25
+ - `aegis doctor` prints engine availability.
26
+ - `aegis scan tests/fixtures/with_secret.ts` blocks (exit 2).
27
+ - `aegis scan tests/fixtures/clean.py` allows (exit 0).
28
+ - Hook config attaches to Claude Code and blocks a `Write` with secrets.
29
+
30
+ ---
31
+
32
+ ## Phase 1 — Project-aware context (NEXT)
33
+
34
+ **Goal:** raise recall on cross-file bugs by giving every engine the
35
+ project graph + symbol resolution + similar-code retrieval.
36
+
37
+ **Deliverables:**
38
+ - `src/index/scip.ts` — wrapper around `scip-typescript` and `scip-python`;
39
+ builds an incremental SCIP index of the project; LMDB-backed lookup
40
+ for `defOf(sym)` / `refsOf(sym)` / `callersOf(fn)` in O(log n).
41
+ - `src/index/joern.ts` — Joern CPG: invoke `joern-parse` once per project,
42
+ store CPG in OverflowDB; query API for `dataFlow(src, sink)` and
43
+ `cpg.method.name("X").caller`. Incremental update on file save.
44
+ - `src/index/embeddings.ts` — local `CodeT5p-110M` (ONNX) embedder via
45
+ `@xenova/transformers` (no Python dep); FAISS-style brute-force top-K
46
+ on small projects, `hnswlib-node` on larger ones.
47
+ - `src/engines/context.ts` — uses the three indexes to enrich the
48
+ Tier-1 prompt with focused, per-symbol context (not generic dump).
49
+ - Updated `validate_edit` returns a `project_context` block alongside
50
+ the findings list — the LLM critic in Phase 2 will consume it.
51
+
52
+ **Exit criteria:**
53
+ - Indexing fixme/argus (~100 files) completes in < 5 s cold, < 200 ms incremental.
54
+ - Cross-file lookup (`callers_of("require_admin")`) returns the right call site.
55
+ - Latency budget: p50 ≤ 600 ms (Phase 0 + Phase 1 combined).
56
+ - New tests: SCIP index, Joern query, embedding round-trip, focused-context block.
57
+
58
+ **Cite-tools:** RepoGraph (ICLR 2025), SCIP (Sourcegraph), Joern, CodeT5+.
59
+
60
+ ---
61
+
62
+ ## Phase 2 — Deep semantic + critic
63
+
64
+ **Goal:** catch the bugs no static analyzer alone can — taint reachability,
65
+ race conditions, deep logic — by combining best-of-class OSS analyzers
66
+ with an LLM critic that reasons over a *retrieved evidence trail*
67
+ (Vul-RAG pattern; +16-24% over pure-LLM per Du 2024).
68
+
69
+ **Deliverables:**
70
+ - `src/engines/pysa.ts` — Pyre/Pysa taint analysis for Python; pre-warmed
71
+ function summaries cached per commit; sub-second per-file query.
72
+ - `src/engines/racerd.ts` — Joern-CPGQL race queries for Python/TS/JS
73
+ modeled on RacerD's `NoThread` / `AnyThread` lattice; static candidates
74
+ + post-filter.
75
+ - `src/engines/vulrag.ts` — local vector store of CVE knowledge (cause +
76
+ vuln-pattern + fix-pattern + CWE), populated from the existing 313K-row
77
+ argus corpus; retrieval by `(cwe, semantic)`.
78
+ - `src/engines/router-150m.ts` — local 150M classifier (ONNX, INT8) that
79
+ routes each edit to `pass` / `lint` / `deep_review`.
80
+ - `src/engines/llm-critic.ts` — calls Claude/GPT with structured evidence
81
+ (diff + Joern path + Vul-RAG knowledge + callers); returns
82
+ `{verdict, cwe, evidence, fix, confidence}`. Ensemble vote with a
83
+ second-vendor model.
84
+
85
+ **Exit criteria:**
86
+ - Catches 4/6 planted bugs in the argus smoke test (vs. 1/6 today).
87
+ - p50 ≤ 1.0 s for non-critic path; p95 ≤ 4 s with critic.
88
+ - LLM critic budget cap: 10% of edits / $0.05 max per call.
89
+
90
+ **Cite-tools:** Pysa, Infer/RacerD, Vul-RAG (arxiv 2406.11147), IRIS (ICLR 2025).
91
+
92
+ ---
93
+
94
+ ## Phase 3 — Production hardening
95
+
96
+ **Goal:** suppression learning + telemetry + property-based testing gate +
97
+ policy-as-code — what turns a working prototype into something a team can rely on.
98
+
99
+ **Deliverables:**
100
+ - `src/learning/suppressions.ts` — every `accepted` / `rejected` /
101
+ `edited-then-saved` outcome appended; weekly re-tunes the router and
102
+ per-rule confidence priors.
103
+ - `src/learning/telemetry.ts` — local p50/p95/p99 dashboard via a small
104
+ CLI command (`aegis stats`).
105
+ - `src/engines/property-tests.ts` — for high-suspicion functions
106
+ (money/auth/perm), LLM emits a Hypothesis (Python) or fast-check (JS/TS)
107
+ property; runner executes in subprocess sandbox; counterexample = proven bug.
108
+ - `src/policy.ts` — YAML-driven policy: `CWE-89 → BLOCK`,
109
+ `CWE-704 → WARN`, etc.; per-project override.
110
+
111
+ **Exit criteria:**
112
+ - Suppression-aware re-training reduces FP rate by ≥ 20% over baseline.
113
+ - Property-test gate catches at least one of: tax-before-discount,
114
+ cache stampede, off-by-one in argus smoke test.
115
+ - `aegis stats` shows true p50/p95 from real audit log.
116
+
117
+ **Cite-tools:** Hypothesis ghostwriter, fast-check, Fuzz4All (arxiv 2308.04748).