driftdetect-core 0.4.1 → 0.4.2

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 (237) hide show
  1. package/dist/boundaries/boundary-scanner.d.ts +76 -0
  2. package/dist/boundaries/boundary-scanner.d.ts.map +1 -0
  3. package/dist/boundaries/boundary-scanner.js +801 -0
  4. package/dist/boundaries/boundary-scanner.js.map +1 -0
  5. package/dist/boundaries/data-access-learner.d.ts +126 -0
  6. package/dist/boundaries/data-access-learner.d.ts.map +1 -0
  7. package/dist/boundaries/data-access-learner.js +486 -0
  8. package/dist/boundaries/data-access-learner.js.map +1 -0
  9. package/dist/boundaries/index.d.ts +6 -0
  10. package/dist/boundaries/index.d.ts.map +1 -1
  11. package/dist/boundaries/index.js +6 -0
  12. package/dist/boundaries/index.js.map +1 -1
  13. package/dist/boundaries/security-prioritizer.d.ts +118 -0
  14. package/dist/boundaries/security-prioritizer.d.ts.map +1 -0
  15. package/dist/boundaries/security-prioritizer.js +316 -0
  16. package/dist/boundaries/security-prioritizer.js.map +1 -0
  17. package/dist/call-graph/analysis/coverage-analyzer.d.ts +201 -0
  18. package/dist/call-graph/analysis/coverage-analyzer.d.ts.map +1 -0
  19. package/dist/call-graph/analysis/coverage-analyzer.js +553 -0
  20. package/dist/call-graph/analysis/coverage-analyzer.js.map +1 -0
  21. package/dist/call-graph/analysis/dead-code-detector.d.ts +145 -0
  22. package/dist/call-graph/analysis/dead-code-detector.d.ts.map +1 -0
  23. package/dist/call-graph/analysis/dead-code-detector.js +391 -0
  24. package/dist/call-graph/analysis/dead-code-detector.js.map +1 -0
  25. package/dist/call-graph/analysis/graph-builder.d.ts +142 -0
  26. package/dist/call-graph/analysis/graph-builder.d.ts.map +1 -0
  27. package/dist/call-graph/analysis/graph-builder.js +624 -0
  28. package/dist/call-graph/analysis/graph-builder.js.map +1 -0
  29. package/dist/call-graph/analysis/impact-analyzer.d.ts +150 -0
  30. package/dist/call-graph/analysis/impact-analyzer.d.ts.map +1 -0
  31. package/dist/call-graph/analysis/impact-analyzer.js +329 -0
  32. package/dist/call-graph/analysis/impact-analyzer.js.map +1 -0
  33. package/dist/call-graph/analysis/index.d.ts +11 -0
  34. package/dist/call-graph/analysis/index.d.ts.map +1 -0
  35. package/dist/call-graph/analysis/index.js +9 -0
  36. package/dist/call-graph/analysis/index.js.map +1 -0
  37. package/dist/call-graph/analysis/path-finder.d.ts +117 -0
  38. package/dist/call-graph/analysis/path-finder.d.ts.map +1 -0
  39. package/dist/call-graph/analysis/path-finder.js +360 -0
  40. package/dist/call-graph/analysis/path-finder.js.map +1 -0
  41. package/dist/call-graph/analysis/reachability.d.ts +56 -0
  42. package/dist/call-graph/analysis/reachability.d.ts.map +1 -0
  43. package/dist/call-graph/analysis/reachability.js +357 -0
  44. package/dist/call-graph/analysis/reachability.js.map +1 -0
  45. package/dist/call-graph/demo.d.ts +11 -0
  46. package/dist/call-graph/demo.d.ts.map +1 -0
  47. package/dist/call-graph/demo.js +339 -0
  48. package/dist/call-graph/demo.js.map +1 -0
  49. package/dist/call-graph/enrichment/enrichment-engine.d.ts +126 -0
  50. package/dist/call-graph/enrichment/enrichment-engine.d.ts.map +1 -0
  51. package/dist/call-graph/enrichment/enrichment-engine.js +760 -0
  52. package/dist/call-graph/enrichment/enrichment-engine.js.map +1 -0
  53. package/dist/call-graph/enrichment/impact-scorer.d.ts +59 -0
  54. package/dist/call-graph/enrichment/impact-scorer.d.ts.map +1 -0
  55. package/dist/call-graph/enrichment/impact-scorer.js +328 -0
  56. package/dist/call-graph/enrichment/impact-scorer.js.map +1 -0
  57. package/dist/call-graph/enrichment/index.d.ts +12 -0
  58. package/dist/call-graph/enrichment/index.d.ts.map +1 -0
  59. package/dist/call-graph/enrichment/index.js +15 -0
  60. package/dist/call-graph/enrichment/index.js.map +1 -0
  61. package/dist/call-graph/enrichment/remediation-generator.d.ts +41 -0
  62. package/dist/call-graph/enrichment/remediation-generator.d.ts.map +1 -0
  63. package/dist/call-graph/enrichment/remediation-generator.js +609 -0
  64. package/dist/call-graph/enrichment/remediation-generator.js.map +1 -0
  65. package/dist/call-graph/enrichment/sensitivity-classifier.d.ts +71 -0
  66. package/dist/call-graph/enrichment/sensitivity-classifier.d.ts.map +1 -0
  67. package/dist/call-graph/enrichment/sensitivity-classifier.js +454 -0
  68. package/dist/call-graph/enrichment/sensitivity-classifier.js.map +1 -0
  69. package/dist/call-graph/enrichment/types.d.ts +402 -0
  70. package/dist/call-graph/enrichment/types.d.ts.map +1 -0
  71. package/dist/call-graph/enrichment/types.js +9 -0
  72. package/dist/call-graph/enrichment/types.js.map +1 -0
  73. package/dist/call-graph/extractors/base-extractor.d.ts +112 -0
  74. package/dist/call-graph/extractors/base-extractor.d.ts.map +1 -0
  75. package/dist/call-graph/extractors/base-extractor.js +140 -0
  76. package/dist/call-graph/extractors/base-extractor.js.map +1 -0
  77. package/dist/call-graph/extractors/csharp-data-access-extractor.d.ts +76 -0
  78. package/dist/call-graph/extractors/csharp-data-access-extractor.d.ts.map +1 -0
  79. package/dist/call-graph/extractors/csharp-data-access-extractor.js +387 -0
  80. package/dist/call-graph/extractors/csharp-data-access-extractor.js.map +1 -0
  81. package/dist/call-graph/extractors/csharp-extractor.d.ts +87 -0
  82. package/dist/call-graph/extractors/csharp-extractor.d.ts.map +1 -0
  83. package/dist/call-graph/extractors/csharp-extractor.js +470 -0
  84. package/dist/call-graph/extractors/csharp-extractor.js.map +1 -0
  85. package/dist/call-graph/extractors/data-access-extractor.d.ts +76 -0
  86. package/dist/call-graph/extractors/data-access-extractor.d.ts.map +1 -0
  87. package/dist/call-graph/extractors/data-access-extractor.js +234 -0
  88. package/dist/call-graph/extractors/data-access-extractor.js.map +1 -0
  89. package/dist/call-graph/extractors/index.d.ts +26 -0
  90. package/dist/call-graph/extractors/index.d.ts.map +1 -0
  91. package/dist/call-graph/extractors/index.js +36 -0
  92. package/dist/call-graph/extractors/index.js.map +1 -0
  93. package/dist/call-graph/extractors/java-data-access-extractor.d.ts +101 -0
  94. package/dist/call-graph/extractors/java-data-access-extractor.d.ts.map +1 -0
  95. package/dist/call-graph/extractors/java-data-access-extractor.js +611 -0
  96. package/dist/call-graph/extractors/java-data-access-extractor.js.map +1 -0
  97. package/dist/call-graph/extractors/java-extractor.d.ts +87 -0
  98. package/dist/call-graph/extractors/java-extractor.d.ts.map +1 -0
  99. package/dist/call-graph/extractors/java-extractor.js +510 -0
  100. package/dist/call-graph/extractors/java-extractor.js.map +1 -0
  101. package/dist/call-graph/extractors/php-data-access-extractor.d.ts +93 -0
  102. package/dist/call-graph/extractors/php-data-access-extractor.d.ts.map +1 -0
  103. package/dist/call-graph/extractors/php-data-access-extractor.js +589 -0
  104. package/dist/call-graph/extractors/php-data-access-extractor.js.map +1 -0
  105. package/dist/call-graph/extractors/php-extractor.d.ts +104 -0
  106. package/dist/call-graph/extractors/php-extractor.d.ts.map +1 -0
  107. package/dist/call-graph/extractors/php-extractor.js +619 -0
  108. package/dist/call-graph/extractors/php-extractor.js.map +1 -0
  109. package/dist/call-graph/extractors/python-data-access-extractor.d.ts +90 -0
  110. package/dist/call-graph/extractors/python-data-access-extractor.d.ts.map +1 -0
  111. package/dist/call-graph/extractors/python-data-access-extractor.js +537 -0
  112. package/dist/call-graph/extractors/python-data-access-extractor.js.map +1 -0
  113. package/dist/call-graph/extractors/python-extractor.d.ts +98 -0
  114. package/dist/call-graph/extractors/python-extractor.d.ts.map +1 -0
  115. package/dist/call-graph/extractors/python-extractor.js +681 -0
  116. package/dist/call-graph/extractors/python-extractor.js.map +1 -0
  117. package/dist/call-graph/extractors/semantic-data-access-scanner.d.ts +91 -0
  118. package/dist/call-graph/extractors/semantic-data-access-scanner.d.ts.map +1 -0
  119. package/dist/call-graph/extractors/semantic-data-access-scanner.js +498 -0
  120. package/dist/call-graph/extractors/semantic-data-access-scanner.js.map +1 -0
  121. package/dist/call-graph/extractors/typescript-data-access-extractor.d.ts +122 -0
  122. package/dist/call-graph/extractors/typescript-data-access-extractor.d.ts.map +1 -0
  123. package/dist/call-graph/extractors/typescript-data-access-extractor.js +788 -0
  124. package/dist/call-graph/extractors/typescript-data-access-extractor.js.map +1 -0
  125. package/dist/call-graph/extractors/typescript-extractor.d.ts +145 -0
  126. package/dist/call-graph/extractors/typescript-extractor.d.ts.map +1 -0
  127. package/dist/call-graph/extractors/typescript-extractor.js +904 -0
  128. package/dist/call-graph/extractors/typescript-extractor.js.map +1 -0
  129. package/dist/call-graph/index.d.ts +127 -0
  130. package/dist/call-graph/index.d.ts.map +1 -0
  131. package/dist/call-graph/index.js +247 -0
  132. package/dist/call-graph/index.js.map +1 -0
  133. package/dist/call-graph/store/call-graph-store.d.ts +70 -0
  134. package/dist/call-graph/store/call-graph-store.d.ts.map +1 -0
  135. package/dist/call-graph/store/call-graph-store.js +210 -0
  136. package/dist/call-graph/store/call-graph-store.js.map +1 -0
  137. package/dist/call-graph/store/index.d.ts +7 -0
  138. package/dist/call-graph/store/index.d.ts.map +1 -0
  139. package/dist/call-graph/store/index.js +7 -0
  140. package/dist/call-graph/store/index.js.map +1 -0
  141. package/dist/call-graph/types.d.ts +376 -0
  142. package/dist/call-graph/types.d.ts.map +1 -0
  143. package/dist/call-graph/types.js +8 -0
  144. package/dist/call-graph/types.js.map +1 -0
  145. package/dist/index.d.ts +8 -0
  146. package/dist/index.d.ts.map +1 -1
  147. package/dist/index.js +12 -0
  148. package/dist/index.js.map +1 -1
  149. package/dist/lake/callgraph-shard-store.d.ts +168 -0
  150. package/dist/lake/callgraph-shard-store.d.ts.map +1 -0
  151. package/dist/lake/callgraph-shard-store.js +466 -0
  152. package/dist/lake/callgraph-shard-store.js.map +1 -0
  153. package/dist/lake/examples-store.d.ts +127 -0
  154. package/dist/lake/examples-store.d.ts.map +1 -0
  155. package/dist/lake/examples-store.js +389 -0
  156. package/dist/lake/examples-store.js.map +1 -0
  157. package/dist/lake/index-store.d.ts +82 -0
  158. package/dist/lake/index-store.d.ts.map +1 -0
  159. package/dist/lake/index-store.js +359 -0
  160. package/dist/lake/index-store.js.map +1 -0
  161. package/dist/lake/index.d.ts +93 -0
  162. package/dist/lake/index.d.ts.map +1 -0
  163. package/dist/lake/index.js +138 -0
  164. package/dist/lake/index.js.map +1 -0
  165. package/dist/lake/lake.bak/index-store.d.ts +82 -0
  166. package/dist/lake/lake.bak/index-store.d.ts.map +1 -0
  167. package/dist/lake/lake.bak/index-store.js +357 -0
  168. package/dist/lake/lake.bak/index-store.js.map +1 -0
  169. package/dist/lake/lake.bak/index.d.ts +81 -0
  170. package/dist/lake/lake.bak/index.d.ts.map +1 -0
  171. package/dist/lake/lake.bak/index.js +114 -0
  172. package/dist/lake/lake.bak/index.js.map +1 -0
  173. package/dist/lake/lake.bak/manifest-store.d.ts +51 -0
  174. package/dist/lake/lake.bak/manifest-store.d.ts.map +1 -0
  175. package/dist/lake/lake.bak/manifest-store.js +347 -0
  176. package/dist/lake/lake.bak/manifest-store.js.map +1 -0
  177. package/dist/lake/lake.bak/query-engine.d.ts +112 -0
  178. package/dist/lake/lake.bak/query-engine.d.ts.map +1 -0
  179. package/dist/lake/lake.bak/query-engine.js +370 -0
  180. package/dist/lake/lake.bak/query-engine.js.map +1 -0
  181. package/dist/lake/lake.bak/types.d.ts +428 -0
  182. package/dist/lake/lake.bak/types.d.ts.map +1 -0
  183. package/dist/lake/lake.bak/types.js +46 -0
  184. package/dist/lake/lake.bak/types.js.map +1 -0
  185. package/dist/lake/lake.bak/view-materializer.d.ts +70 -0
  186. package/dist/lake/lake.bak/view-materializer.d.ts.map +1 -0
  187. package/dist/lake/lake.bak/view-materializer.js +314 -0
  188. package/dist/lake/lake.bak/view-materializer.js.map +1 -0
  189. package/dist/lake/lake.bak/view-store.d.ts +57 -0
  190. package/dist/lake/lake.bak/view-store.d.ts.map +1 -0
  191. package/dist/lake/lake.bak/view-store.js +348 -0
  192. package/dist/lake/lake.bak/view-store.js.map +1 -0
  193. package/dist/lake/manifest-store.d.ts +51 -0
  194. package/dist/lake/manifest-store.d.ts.map +1 -0
  195. package/dist/lake/manifest-store.js +348 -0
  196. package/dist/lake/manifest-store.js.map +1 -0
  197. package/dist/lake/pattern-shard-store.d.ts +87 -0
  198. package/dist/lake/pattern-shard-store.d.ts.map +1 -0
  199. package/dist/lake/pattern-shard-store.js +347 -0
  200. package/dist/lake/pattern-shard-store.js.map +1 -0
  201. package/dist/lake/query-engine.d.ts +124 -0
  202. package/dist/lake/query-engine.d.ts.map +1 -0
  203. package/dist/lake/query-engine.js +453 -0
  204. package/dist/lake/query-engine.js.map +1 -0
  205. package/dist/lake/security-shard-store.d.ts +156 -0
  206. package/dist/lake/security-shard-store.d.ts.map +1 -0
  207. package/dist/lake/security-shard-store.js +498 -0
  208. package/dist/lake/security-shard-store.js.map +1 -0
  209. package/dist/lake/types.d.ts +428 -0
  210. package/dist/lake/types.d.ts.map +1 -0
  211. package/dist/lake/types.js +46 -0
  212. package/dist/lake/types.js.map +1 -0
  213. package/dist/lake/view-materializer.d.ts +70 -0
  214. package/dist/lake/view-materializer.d.ts.map +1 -0
  215. package/dist/lake/view-materializer.js +314 -0
  216. package/dist/lake/view-materializer.js.map +1 -0
  217. package/dist/lake/view-store.d.ts +57 -0
  218. package/dist/lake/view-store.d.ts.map +1 -0
  219. package/dist/lake/view-store.js +348 -0
  220. package/dist/lake/view-store.js.map +1 -0
  221. package/dist/parsers/tree-sitter/index.d.ts +1 -0
  222. package/dist/parsers/tree-sitter/index.d.ts.map +1 -1
  223. package/dist/parsers/tree-sitter/index.js +4 -0
  224. package/dist/parsers/tree-sitter/index.js.map +1 -1
  225. package/dist/parsers/tree-sitter/typescript-loader.d.ts +58 -0
  226. package/dist/parsers/tree-sitter/typescript-loader.d.ts.map +1 -0
  227. package/dist/parsers/tree-sitter/typescript-loader.js +250 -0
  228. package/dist/parsers/tree-sitter/typescript-loader.js.map +1 -0
  229. package/dist/store/project-config.d.ts +154 -0
  230. package/dist/store/project-config.d.ts.map +1 -0
  231. package/dist/store/project-config.js +235 -0
  232. package/dist/store/project-config.js.map +1 -0
  233. package/dist/store/project-registry.d.ts +241 -0
  234. package/dist/store/project-registry.d.ts.map +1 -0
  235. package/dist/store/project-registry.js +557 -0
  236. package/dist/store/project-registry.js.map +1 -0
  237. package/package.json +4 -2
@@ -0,0 +1,339 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Call Graph Demo Script
4
+ *
5
+ * Demonstrates the call-graph system's capabilities on a real Python codebase.
6
+ * Shows: extraction, graph building, reachability analysis, and data flow mapping.
7
+ *
8
+ * Run: node drift/packages/core/dist/call-graph/demo.js
9
+ */
10
+ import { PythonCallGraphExtractor } from './extractors/python-extractor.js';
11
+ import { GraphBuilder } from './analysis/graph-builder.js';
12
+ import { ReachabilityEngine } from './analysis/reachability.js';
13
+ // ANSI colors for pretty output
14
+ const colors = {
15
+ reset: '\x1b[0m',
16
+ bright: '\x1b[1m',
17
+ dim: '\x1b[2m',
18
+ green: '\x1b[32m',
19
+ yellow: '\x1b[33m',
20
+ blue: '\x1b[34m',
21
+ magenta: '\x1b[35m',
22
+ cyan: '\x1b[36m',
23
+ red: '\x1b[31m',
24
+ };
25
+ function log(msg, color = colors.reset) {
26
+ console.log(`${color}${msg}${colors.reset}`);
27
+ }
28
+ function header(title) {
29
+ console.log('\n' + '═'.repeat(70));
30
+ log(` ${title}`, colors.bright + colors.cyan);
31
+ console.log('═'.repeat(70));
32
+ }
33
+ function subheader(title) {
34
+ console.log('\n' + '─'.repeat(50));
35
+ log(` ${title}`, colors.yellow);
36
+ console.log('─'.repeat(50));
37
+ }
38
+ // ============================================================================
39
+ // Demo Data - Simulating what the Python extractor finds
40
+ // ============================================================================
41
+ /**
42
+ * Demo: Extract from real Python files
43
+ */
44
+ function demoExtraction() {
45
+ header('🔍 STEP 1: EXTRACTION - What the system discovers');
46
+ const extractor = new PythonCallGraphExtractor();
47
+ // Sample Python code from account_service.py
48
+ const accountServiceCode = `
49
+ class AccountService:
50
+ """Helper for account and membership lookups."""
51
+
52
+ def __init__(self):
53
+ self.client = get_supabase_service_client()
54
+
55
+ def get_primary_account_id(self, user_id: str) -> str:
56
+ result = self.client.table("users").select("primary_account_id").eq("id", user_id).execute()
57
+ if not result.data:
58
+ raise ValueError(f"User {user_id} has no profile record")
59
+ return result.data[0].get("primary_account_id")
60
+
61
+ def ensure_active_member(self, account_id: str, user_id: str) -> bool:
62
+ membership = self.client.table("account_members").select("role").eq("account_id", account_id).execute()
63
+ return bool(membership.data)
64
+
65
+ def set_clock_pin(self, user_id: str, pin: str) -> str:
66
+ pin_hash, salt_hex = self._derive_pin_hash(pin)
67
+ self.client.table("users").update({"clock_pin_hash": pin_hash}).eq("id", user_id).execute()
68
+ return timestamp
69
+
70
+ def lookup_user_by_pin(self, pin: str):
71
+ result = self.client.table("users").select("id, clock_pin_hash, clock_pin_salt").eq("clock_pin_lookup", lookup_hash).execute()
72
+ return result.data[0] if result.data else None
73
+ `;
74
+ const authRoutesCode = `
75
+ from fastapi import APIRouter, Depends
76
+ from services.account_service import AccountService
77
+
78
+ router = APIRouter()
79
+
80
+ @router.post("/register")
81
+ async def register_user(user_data: UserRegister, response: Response):
82
+ auth_response = supabase.auth.sign_up({"email": user_data.email, "password": user_data.password})
83
+ account_service = AccountService()
84
+ account_id, account_role = account_service.activate_invitation_by_token(invite_token, user_id=user_id, email=user.email)
85
+ jwt_token = create_jwt_token(user_id, account_id, account_role)
86
+ return {"user": {"id": user.id, "email": user.email}}
87
+
88
+ @router.post("/login")
89
+ async def login_user(credentials: UserLogin, response: Response):
90
+ auth_response = supabase.auth.sign_in_with_password({"email": credentials.email, "password": credentials.password})
91
+ account_service = AccountService()
92
+ account_id = account_service.get_primary_account_id(user_id)
93
+ return {"user": {"id": user.id}}
94
+
95
+ @router.get("/me")
96
+ async def get_current_user_profile(user_id: str = Depends(get_current_user)):
97
+ user_profile = service_client.table("users").select("subscription_tier").eq("id", user_id).execute()
98
+ return UserResponse(id=user.id, email=user.email)
99
+ `;
100
+ // Extract from account_service.py
101
+ subheader('Extracting: services/account_service.py');
102
+ const accountResult = extractor.extract(accountServiceCode, 'services/account_service.py');
103
+ log(`\n📦 Classes found: ${accountResult.classes.length}`, colors.green);
104
+ for (const cls of accountResult.classes) {
105
+ log(` • ${cls.name} (lines ${cls.startLine}-${cls.endLine})`, colors.dim);
106
+ log(` Methods: ${cls.methods.join(', ')}`, colors.dim);
107
+ }
108
+ log(`\n📋 Functions/Methods found: ${accountResult.functions.length}`, colors.green);
109
+ for (const func of accountResult.functions) {
110
+ const type = func.isConstructor ? '🔧 constructor' : func.isMethod ? '📎 method' : '📌 function';
111
+ log(` ${type} ${func.qualifiedName}`, colors.dim);
112
+ log(` Line ${func.startLine}, params: [${func.parameters.map(p => p.name).join(', ')}]`, colors.dim);
113
+ }
114
+ log(`\n📞 Calls discovered: ${accountResult.calls.length}`, colors.green);
115
+ const uniqueCalls = [...new Set(accountResult.calls.map(c => c.fullExpression))];
116
+ for (const call of uniqueCalls.slice(0, 10)) {
117
+ log(` • ${call}`, colors.dim);
118
+ }
119
+ if (uniqueCalls.length > 10) {
120
+ log(` ... and ${uniqueCalls.length - 10} more`, colors.dim);
121
+ }
122
+ // Extract from auth.py
123
+ subheader('Extracting: api/routes/auth.py');
124
+ const authResult = extractor.extract(authRoutesCode, 'api/routes/auth.py');
125
+ log(`\n📋 Functions found: ${authResult.functions.length}`, colors.green);
126
+ for (const func of authResult.functions) {
127
+ const decorators = func.decorators.length > 0 ? ` ${func.decorators[0]}` : '';
128
+ log(` 📌 ${func.name}${decorators}`, colors.dim);
129
+ }
130
+ log(`\n📥 Imports found: ${authResult.imports.length}`, colors.green);
131
+ for (const imp of authResult.imports) {
132
+ const names = imp.names.map(n => n.imported).join(', ');
133
+ log(` • from ${imp.source} import ${names}`, colors.dim);
134
+ }
135
+ return { accountResult, authResult };
136
+ }
137
+ /**
138
+ * Demo: Build the call graph
139
+ */
140
+ function demoBuildGraph(extractions) {
141
+ header('🏗️ STEP 2: GRAPH BUILDING - Connecting the dots');
142
+ const builder = new GraphBuilder({
143
+ projectRoot: '/project',
144
+ includeUnresolved: true,
145
+ minConfidence: 0.5,
146
+ });
147
+ // Add extractions
148
+ builder.addFile(extractions.accountResult);
149
+ builder.addFile(extractions.authResult);
150
+ // Simulate data access points (what the boundaries module would provide)
151
+ const dataAccessPoints = [
152
+ { id: 'dap-1', file: 'services/account_service.py', line: 10, column: 0, table: 'users', fields: ['primary_account_id'], operation: 'read', confidence: 0.95, context: 'self.client.table("users").select(...)', isRawSql: false },
153
+ { id: 'dap-2', file: 'services/account_service.py', line: 15, column: 0, table: 'account_members', fields: ['role'], operation: 'read', confidence: 0.95, context: 'self.client.table("account_members").select(...)', isRawSql: false },
154
+ { id: 'dap-3', file: 'services/account_service.py', line: 20, column: 0, table: 'users', fields: ['clock_pin_hash'], operation: 'write', confidence: 0.95, context: 'self.client.table("users").update(...)', isRawSql: false },
155
+ { id: 'dap-4', file: 'services/account_service.py', line: 25, column: 0, table: 'users', fields: ['id', 'clock_pin_hash', 'clock_pin_salt'], operation: 'read', confidence: 0.95, context: 'self.client.table("users").select(...)', isRawSql: false },
156
+ { id: 'dap-5', file: 'api/routes/auth.py', line: 15, column: 0, table: 'users', fields: ['subscription_tier'], operation: 'read', confidence: 0.9, context: 'service_client.table("users").select(...)', isRawSql: false },
157
+ ];
158
+ builder.addDataAccess('services/account_service.py', dataAccessPoints.filter(d => d.file.includes('account_service')));
159
+ builder.addDataAccess('api/routes/auth.py', dataAccessPoints.filter(d => d.file.includes('auth')));
160
+ const graph = builder.build();
161
+ subheader('Graph Statistics');
162
+ log(`\n📊 Total functions: ${graph.stats.totalFunctions}`, colors.green);
163
+ log(`📊 Total call sites: ${graph.stats.totalCallSites}`, colors.green);
164
+ log(`📊 Resolved calls: ${graph.stats.resolvedCallSites} (${Math.round(graph.stats.resolvedCallSites / graph.stats.totalCallSites * 100)}%)`, colors.green);
165
+ log(`📊 Data accessors: ${graph.stats.totalDataAccessors}`, colors.green);
166
+ subheader('Entry Points (API Routes)');
167
+ for (const entryId of graph.entryPoints) {
168
+ const func = graph.functions.get(entryId);
169
+ if (func) {
170
+ log(` 🚪 ${func.qualifiedName} @ ${func.file}:${func.startLine}`, colors.magenta);
171
+ }
172
+ }
173
+ subheader('Data Accessors (Functions that touch the database)');
174
+ for (const accessorId of graph.dataAccessors) {
175
+ const func = graph.functions.get(accessorId);
176
+ if (func) {
177
+ const tables = [...new Set(func.dataAccess.map(d => d.table))];
178
+ log(` 💾 ${func.qualifiedName} → [${tables.join(', ')}]`, colors.blue);
179
+ }
180
+ }
181
+ subheader('Call Graph Edges (Who calls whom)');
182
+ let edgeCount = 0;
183
+ for (const [, func] of graph.functions) {
184
+ for (const call of func.calls) {
185
+ if (call.resolved && call.calleeId) {
186
+ const callee = graph.functions.get(call.calleeId);
187
+ if (callee) {
188
+ log(` ${func.name} ──→ ${callee.name}`, colors.dim);
189
+ edgeCount++;
190
+ }
191
+ }
192
+ }
193
+ }
194
+ log(`\n Total edges: ${edgeCount}`, colors.green);
195
+ return graph;
196
+ }
197
+ /**
198
+ * Demo: Reachability analysis
199
+ */
200
+ function demoReachability(graph) {
201
+ header('🔎 STEP 3: REACHABILITY ANALYSIS - What data can code access?');
202
+ const engine = new ReachabilityEngine(graph);
203
+ subheader('Query: What data can the /login endpoint access?');
204
+ // Find the login function
205
+ let loginFunc;
206
+ for (const [, func] of graph.functions) {
207
+ if (func.name === 'login_user') {
208
+ loginFunc = func;
209
+ break;
210
+ }
211
+ }
212
+ if (loginFunc) {
213
+ const result = engine.getReachableDataFromFunction(loginFunc.id);
214
+ log(`\n🎯 Starting from: ${loginFunc.qualifiedName}`, colors.cyan);
215
+ log(`📍 Location: ${loginFunc.file}:${loginFunc.startLine}`, colors.dim);
216
+ log(`\n📊 Reachability Results:`, colors.green);
217
+ log(` Tables reachable: [${result.tables.join(', ')}]`, colors.yellow);
218
+ log(` Functions traversed: ${result.functionsTraversed}`, colors.dim);
219
+ log(` Max call depth: ${result.maxDepth}`, colors.dim);
220
+ if (result.sensitiveFields.length > 0) {
221
+ log(`\n⚠️ Sensitive Fields Accessible:`, colors.red);
222
+ for (const sf of result.sensitiveFields) {
223
+ log(` 🔐 ${sf.field.table}.${sf.field.field} (${sf.field.sensitivityType})`, colors.red);
224
+ log(` Access count: ${sf.accessCount}, via ${sf.paths.length} path(s)`, colors.dim);
225
+ }
226
+ }
227
+ if (result.reachableAccess.length > 0) {
228
+ log(`\n📝 Data Access Points:`, colors.green);
229
+ for (const access of result.reachableAccess) {
230
+ const pathStr = access.path.map(p => p.functionName).join(' → ');
231
+ log(` ${access.access.table}.${access.access.fields.join(',')} (${access.access.operation})`, colors.blue);
232
+ log(` Path: ${pathStr}`, colors.dim);
233
+ }
234
+ }
235
+ }
236
+ subheader('Inverse Query: Who can access users.clock_pin_hash?');
237
+ const inverseResult = engine.getCodePathsToData({
238
+ table: 'users',
239
+ field: 'clock_pin_hash',
240
+ });
241
+ log(`\n🎯 Target: users.clock_pin_hash`, colors.cyan);
242
+ log(`📊 Results:`, colors.green);
243
+ log(` Direct accessors: ${inverseResult.totalAccessors}`, colors.yellow);
244
+ log(` Entry points that can reach it: ${inverseResult.entryPoints.length}`, colors.yellow);
245
+ for (const path of inverseResult.accessPaths) {
246
+ const entryFunc = graph.functions.get(path.entryPoint);
247
+ if (entryFunc) {
248
+ log(`\n 🚪 Entry: ${entryFunc.qualifiedName}`, colors.magenta);
249
+ const pathStr = path.path.map(p => p.functionName).join(' → ');
250
+ log(` Path: ${pathStr}`, colors.dim);
251
+ }
252
+ }
253
+ }
254
+ /**
255
+ * Demo: Security implications
256
+ */
257
+ function demoSecurityInsights(graph) {
258
+ header('🛡️ STEP 4: SECURITY INSIGHTS - What the system reveals');
259
+ // Engine available for additional queries if needed
260
+ const _engine = new ReachabilityEngine(graph);
261
+ void _engine; // Suppress unused warning
262
+ subheader('Sensitive Data Flow Analysis');
263
+ log(`\nThe call graph reveals:`, colors.green);
264
+ log(``, colors.reset);
265
+ log(`1. 🔐 PIN Authentication Flow:`, colors.yellow);
266
+ log(` /login → AccountService.get_primary_account_id → users table`, colors.dim);
267
+ log(` /register → AccountService.activate_invitation_by_token → account_members`, colors.dim);
268
+ log(``, colors.reset);
269
+ log(`2. 💾 Data Access Boundaries:`, colors.yellow);
270
+ log(` • AccountService can access: users, account_members`, colors.dim);
271
+ log(` • Auth routes can access: users (via AccountService)`, colors.dim);
272
+ log(``, colors.reset);
273
+ log(`3. ⚠️ Potential Security Concerns:`, colors.yellow);
274
+ log(` • clock_pin_hash accessible from public API endpoints`, colors.dim);
275
+ log(` • Multiple paths to sensitive user data`, colors.dim);
276
+ log(``, colors.reset);
277
+ log(`4. 📈 Blast Radius:`, colors.yellow);
278
+ log(` • A bug in AccountService affects: /login, /register, /me`, colors.dim);
279
+ log(` • users table is accessed by ${graph.dataAccessors.length} functions`, colors.dim);
280
+ subheader('What This Enables');
281
+ log(`\n✅ Security Finding Enrichment:`, colors.green);
282
+ log(` "Found SQL injection in account_service.py:25"`, colors.dim);
283
+ log(` → System adds: "Reachable from /login, /register endpoints"`, colors.cyan);
284
+ log(` → System adds: "Can access users.clock_pin_hash (credentials)"`, colors.cyan);
285
+ log(` → System adds: "Blast radius: 3 API endpoints, 2 tables"`, colors.cyan);
286
+ log(``, colors.reset);
287
+ log(`✅ Impact Scoring:`, colors.green);
288
+ log(` → Data sensitivity: HIGH (credentials)`, colors.cyan);
289
+ log(` → Exposure: PUBLIC (API endpoints)`, colors.cyan);
290
+ log(` → Priority: CRITICAL`, colors.cyan);
291
+ log(``, colors.reset);
292
+ log(`✅ Remediation Guidance:`, colors.green);
293
+ log(` → "Parameterize query in get_primary_account_id()"`, colors.cyan);
294
+ log(` → "Add input validation for user_id parameter"`, colors.cyan);
295
+ log(` → "Consider rate limiting on /login endpoint"`, colors.cyan);
296
+ }
297
+ // ============================================================================
298
+ // Main
299
+ // ============================================================================
300
+ function main() {
301
+ console.log('\n');
302
+ log('╔══════════════════════════════════════════════════════════════════════╗', colors.bright);
303
+ log('║ ║', colors.bright);
304
+ log('║ DRIFT CALL GRAPH SYSTEM - LIVE DEMONSTRATION ║', colors.bright);
305
+ log('║ ║', colors.bright);
306
+ log('║ Showing: Python code analysis, graph building, reachability ║', colors.bright);
307
+ log('║ ║', colors.bright);
308
+ log('╚══════════════════════════════════════════════════════════════════════╝', colors.bright);
309
+ try {
310
+ // Step 1: Extract
311
+ const extractions = demoExtraction();
312
+ // Step 2: Build graph
313
+ const graph = demoBuildGraph(extractions);
314
+ // Step 3: Reachability
315
+ demoReachability(graph);
316
+ // Step 4: Security insights
317
+ demoSecurityInsights(graph);
318
+ header('✨ SUMMARY');
319
+ log(`\nThe call-graph system provides:`, colors.green);
320
+ log(``, colors.reset);
321
+ log(` 1. 🔍 Automatic extraction of functions, calls, and imports`, colors.cyan);
322
+ log(` 2. 🏗️ Graph construction with call resolution`, colors.cyan);
323
+ log(` 3. 🔎 Forward reachability: "What data can this code access?"`, colors.cyan);
324
+ log(` 4. 🔄 Inverse reachability: "Who can access this data?"`, colors.cyan);
325
+ log(` 5. 🛡️ Security enrichment: blast radius, sensitivity, priority`, colors.cyan);
326
+ log(``, colors.reset);
327
+ log(`This enables AI agents to understand the IMPACT of security findings,`, colors.yellow);
328
+ log(`not just their location. A finding in a utility function that's called`, colors.yellow);
329
+ log(`by 50 API endpoints is very different from one in dead code.`, colors.yellow);
330
+ console.log('\n');
331
+ }
332
+ catch (error) {
333
+ log(`\n❌ Error: ${error}`, colors.red);
334
+ console.error(error);
335
+ }
336
+ }
337
+ // Run if executed directly
338
+ main();
339
+ //# sourceMappingURL=demo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"demo.js","sourceRoot":"","sources":["../../src/call-graph/demo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,126 @@
1
+ /**
2
+ * Enrichment Engine
3
+ *
4
+ * Enterprise-grade security finding enrichment.
5
+ * Transforms raw vulnerability findings into actionable intelligence
6
+ * by connecting them to their actual data impact through call graph analysis.
7
+ *
8
+ * @example
9
+ * ```typescript
10
+ * const engine = new EnrichmentEngine(callGraph, boundaryStore);
11
+ *
12
+ * // Enrich a single finding
13
+ * const enriched = await engine.enrich(finding);
14
+ * console.log(enriched.dataImpact.sensitiveFields);
15
+ * console.log(enriched.priority.tier); // 'P0' | 'P1' | 'P2' | 'P3' | 'P4'
16
+ *
17
+ * // Batch enrich with summary
18
+ * const result = await engine.enrichBatch(findings);
19
+ * console.log(result.summary.byPriority);
20
+ * ```
21
+ */
22
+ import type { CallGraph } from '../types.js';
23
+ import type { DataAccessPoint, SensitiveField } from '../../boundaries/types.js';
24
+ import type { SecurityFinding, EnrichedFinding, EnrichmentOptions, EnrichmentResult } from './types.js';
25
+ /**
26
+ * Enterprise-grade security finding enrichment engine
27
+ */
28
+ export declare class EnrichmentEngine {
29
+ private readonly graph;
30
+ private readonly reachability;
31
+ private readonly classifier;
32
+ private readonly scorer;
33
+ private readonly remediator;
34
+ private readonly dataAccessByFile;
35
+ private readonly sensitiveFields;
36
+ constructor(graph: CallGraph, dataAccessPoints?: DataAccessPoint[], sensitiveFields?: SensitiveField[]);
37
+ /**
38
+ * Enrich a single security finding
39
+ */
40
+ enrich(finding: SecurityFinding, options?: EnrichmentOptions): Promise<EnrichedFinding>;
41
+ /**
42
+ * Enrich multiple findings with summary statistics
43
+ */
44
+ enrichBatch(findings: SecurityFinding[], options?: EnrichmentOptions): Promise<EnrichmentResult>;
45
+ /**
46
+ * Analyze data impact for a finding
47
+ */
48
+ private analyzeDataImpact;
49
+ /**
50
+ * Analyze blast radius for a finding
51
+ */
52
+ private analyzeBlastRadius;
53
+ /**
54
+ * Find entry points that can reach a function
55
+ */
56
+ private findEntryPointsToFunction;
57
+ /**
58
+ * Find path between two functions using BFS
59
+ */
60
+ private findPath;
61
+ /**
62
+ * Find functions affected by a vulnerability
63
+ */
64
+ private findAffectedFunctions;
65
+ /**
66
+ * Find the function containing a location
67
+ */
68
+ private findContainingFunction;
69
+ /**
70
+ * Classify entry point type based on decorators and patterns
71
+ */
72
+ private classifyEntryPointType;
73
+ /**
74
+ * Check if entry point is publicly accessible
75
+ */
76
+ private isPublicEntryPoint;
77
+ /**
78
+ * Check if entry point requires authentication
79
+ */
80
+ private requiresAuthentication;
81
+ /**
82
+ * Calculate lines of code in affected functions
83
+ */
84
+ private calculateLinesOfCode;
85
+ /**
86
+ * Calculate impact score for a single data access
87
+ */
88
+ private calculateAccessImpactScore;
89
+ /**
90
+ * Build impact rationale string
91
+ */
92
+ private buildImpactRationale;
93
+ /**
94
+ * Calculate overall confidence in enrichment
95
+ */
96
+ private calculateConfidence;
97
+ /**
98
+ * Build summary statistics for batch enrichment
99
+ */
100
+ private buildSummary;
101
+ /**
102
+ * Get base severity score
103
+ */
104
+ private getBaseSeverityScore;
105
+ /**
106
+ * Get base priority tier from severity
107
+ */
108
+ private getBaseTier;
109
+ /**
110
+ * Create empty data impact
111
+ */
112
+ private createEmptyDataImpact;
113
+ /**
114
+ * Create empty blast radius
115
+ */
116
+ private createEmptyBlastRadius;
117
+ /**
118
+ * Create empty remediation
119
+ */
120
+ private createEmptyRemediation;
121
+ }
122
+ /**
123
+ * Create a new enrichment engine
124
+ */
125
+ export declare function createEnrichmentEngine(graph: CallGraph, dataAccessPoints?: DataAccessPoint[], sensitiveFields?: SensitiveField[]): EnrichmentEngine;
126
+ //# sourceMappingURL=enrichment-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enrichment-engine.d.ts","sourceRoot":"","sources":["../../../src/call-graph/enrichment/enrichment-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,SAAS,EAA8B,MAAM,aAAa,CAAC;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAKjF,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EAQf,iBAAiB,EACjB,gBAAgB,EASjB,MAAM,YAAY,CAAC;AAoCpB;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAY;IAClC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqB;IAClD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAwB;IACnD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;IACtC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAuB;IAClD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAiC;IAClE,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA8B;gBAG5D,KAAK,EAAE,SAAS,EAChB,gBAAgB,CAAC,EAAE,eAAe,EAAE,EACpC,eAAe,CAAC,EAAE,cAAc,EAAE;IA4BpC;;OAEG;IACG,MAAM,CACV,OAAO,EAAE,eAAe,EACxB,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,eAAe,CAAC;IA4E3B;;OAEG;IACG,WAAW,CACf,QAAQ,EAAE,eAAe,EAAE,EAC3B,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,gBAAgB,CAAC;IAqD5B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAmHzB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAyC1B;;OAEG;IACH,OAAO,CAAC,yBAAyB;IA0BjC;;OAEG;IACH,OAAO,CAAC,QAAQ;IA+EhB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAgG7B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAiB9B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAoB9B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAkB1B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAY9B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAa5B;;OAEG;IACH,OAAO,CAAC,0BAA0B;IAuBlC;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAY5B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAqB3B;;OAEG;IACH,OAAO,CAAC,YAAY;IAmDpB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAK5B;;OAEG;IACH,OAAO,CAAC,WAAW;IAOnB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAa7B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAW9B;;OAEG;IACH,OAAO,CAAC,sBAAsB;CAa/B;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,SAAS,EAChB,gBAAgB,CAAC,EAAE,eAAe,EAAE,EACpC,eAAe,CAAC,EAAE,cAAc,EAAE,GACjC,gBAAgB,CAElB"}