vaspera 2.8.0 → 2.9.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 (303) hide show
  1. package/CHANGELOG.md +109 -7
  2. package/README.md +111 -7
  3. package/dist/__tests__/agents/adversary/tactics/api.test.d.ts +5 -0
  4. package/dist/__tests__/agents/adversary/tactics/api.test.d.ts.map +1 -0
  5. package/dist/__tests__/agents/adversary/tactics/api.test.js +369 -0
  6. package/dist/__tests__/agents/adversary/tactics/api.test.js.map +1 -0
  7. package/dist/__tests__/agents/adversary/tactics/llm.test.d.ts +5 -0
  8. package/dist/__tests__/agents/adversary/tactics/llm.test.d.ts.map +1 -0
  9. package/dist/__tests__/agents/adversary/tactics/llm.test.js +409 -0
  10. package/dist/__tests__/agents/adversary/tactics/llm.test.js.map +1 -0
  11. package/dist/__tests__/agents/adversary/tactics/registry.test.d.ts +7 -0
  12. package/dist/__tests__/agents/adversary/tactics/registry.test.d.ts.map +1 -0
  13. package/dist/__tests__/agents/adversary/tactics/registry.test.js +74 -0
  14. package/dist/__tests__/agents/adversary/tactics/registry.test.js.map +1 -0
  15. package/dist/__tests__/agents/adversary/tactics/web-app.test.d.ts +7 -0
  16. package/dist/__tests__/agents/adversary/tactics/web-app.test.d.ts.map +1 -0
  17. package/dist/__tests__/agents/adversary/tactics/web-app.test.js +374 -0
  18. package/dist/__tests__/agents/adversary/tactics/web-app.test.js.map +1 -0
  19. package/dist/__tests__/compliance-bundle.test.d.ts +9 -0
  20. package/dist/__tests__/compliance-bundle.test.d.ts.map +1 -0
  21. package/dist/__tests__/compliance-bundle.test.js +344 -0
  22. package/dist/__tests__/compliance-bundle.test.js.map +1 -0
  23. package/dist/__tests__/healthcare-compliance.test.d.ts +9 -0
  24. package/dist/__tests__/healthcare-compliance.test.d.ts.map +1 -0
  25. package/dist/__tests__/healthcare-compliance.test.js +233 -0
  26. package/dist/__tests__/healthcare-compliance.test.js.map +1 -0
  27. package/dist/action/diff-mode.d.ts +124 -8
  28. package/dist/action/diff-mode.d.ts.map +1 -1
  29. package/dist/action/diff-mode.js +384 -65
  30. package/dist/action/diff-mode.js.map +1 -1
  31. package/dist/action/diff-mode.test.js +3 -3
  32. package/dist/action/diff-mode.test.js.map +1 -1
  33. package/dist/action/pr-comment.test.js +1 -0
  34. package/dist/action/pr-comment.test.js.map +1 -1
  35. package/dist/action/sarif-upload.test.js +1 -0
  36. package/dist/action/sarif-upload.test.js.map +1 -1
  37. package/dist/agents/adversary/config.d.ts +25 -4
  38. package/dist/agents/adversary/config.d.ts.map +1 -1
  39. package/dist/agents/adversary/config.js +38 -8
  40. package/dist/agents/adversary/config.js.map +1 -1
  41. package/dist/agents/adversary/index.d.ts +7 -0
  42. package/dist/agents/adversary/index.d.ts.map +1 -1
  43. package/dist/agents/adversary/index.js +83 -1
  44. package/dist/agents/adversary/index.js.map +1 -1
  45. package/dist/agents/adversary/reporting/compliance-mapper.d.ts +108 -0
  46. package/dist/agents/adversary/reporting/compliance-mapper.d.ts.map +1 -0
  47. package/dist/agents/adversary/reporting/compliance-mapper.js +391 -0
  48. package/dist/agents/adversary/reporting/compliance-mapper.js.map +1 -0
  49. package/dist/agents/adversary/reporting/index.d.ts +10 -0
  50. package/dist/agents/adversary/reporting/index.d.ts.map +1 -0
  51. package/dist/agents/adversary/reporting/index.js +10 -0
  52. package/dist/agents/adversary/reporting/index.js.map +1 -0
  53. package/dist/agents/adversary/reporting/poc-generator.d.ts +44 -0
  54. package/dist/agents/adversary/reporting/poc-generator.d.ts.map +1 -0
  55. package/dist/agents/adversary/reporting/poc-generator.js +308 -0
  56. package/dist/agents/adversary/reporting/poc-generator.js.map +1 -0
  57. package/dist/agents/adversary/tactics/api.d.ts +13 -0
  58. package/dist/agents/adversary/tactics/api.d.ts.map +1 -0
  59. package/dist/agents/adversary/tactics/api.js +815 -0
  60. package/dist/agents/adversary/tactics/api.js.map +1 -0
  61. package/dist/agents/adversary/tactics/auth.d.ts +13 -0
  62. package/dist/agents/adversary/tactics/auth.d.ts.map +1 -0
  63. package/dist/agents/adversary/tactics/auth.js +676 -0
  64. package/dist/agents/adversary/tactics/auth.js.map +1 -0
  65. package/dist/agents/adversary/tactics/index.d.ts +129 -0
  66. package/dist/agents/adversary/tactics/index.d.ts.map +1 -0
  67. package/dist/agents/adversary/tactics/index.js +199 -0
  68. package/dist/agents/adversary/tactics/index.js.map +1 -0
  69. package/dist/agents/adversary/tactics/infra.d.ts +13 -0
  70. package/dist/agents/adversary/tactics/infra.d.ts.map +1 -0
  71. package/dist/agents/adversary/tactics/infra.js +827 -0
  72. package/dist/agents/adversary/tactics/infra.js.map +1 -0
  73. package/dist/agents/adversary/tactics/injection.d.ts +12 -0
  74. package/dist/agents/adversary/tactics/injection.d.ts.map +1 -0
  75. package/dist/agents/adversary/tactics/injection.js +549 -0
  76. package/dist/agents/adversary/tactics/injection.js.map +1 -0
  77. package/dist/agents/adversary/tactics/llm.d.ts +13 -0
  78. package/dist/agents/adversary/tactics/llm.d.ts.map +1 -0
  79. package/dist/agents/adversary/tactics/llm.js +767 -0
  80. package/dist/agents/adversary/tactics/llm.js.map +1 -0
  81. package/dist/agents/adversary/tactics/web-app.d.ts +13 -0
  82. package/dist/agents/adversary/tactics/web-app.d.ts.map +1 -0
  83. package/dist/agents/adversary/tactics/web-app.js +717 -0
  84. package/dist/agents/adversary/tactics/web-app.js.map +1 -0
  85. package/dist/agents/adversary/types.d.ts +66 -10
  86. package/dist/agents/adversary/types.d.ts.map +1 -1
  87. package/dist/agents/zero-day-hunter.d.ts +1 -1
  88. package/dist/agents/zero-day-hunter.d.ts.map +1 -1
  89. package/dist/analysis/data-flow.d.ts +154 -0
  90. package/dist/analysis/data-flow.d.ts.map +1 -0
  91. package/dist/analysis/data-flow.js +393 -0
  92. package/dist/analysis/data-flow.js.map +1 -0
  93. package/dist/analysis/index.d.ts +9 -0
  94. package/dist/analysis/index.d.ts.map +1 -0
  95. package/dist/analysis/index.js +9 -0
  96. package/dist/analysis/index.js.map +1 -0
  97. package/dist/badge-service/index.d.ts +144 -0
  98. package/dist/badge-service/index.d.ts.map +1 -0
  99. package/dist/badge-service/index.js +206 -0
  100. package/dist/badge-service/index.js.map +1 -0
  101. package/dist/certification/types.d.ts +1 -1
  102. package/dist/certification/types.d.ts.map +1 -1
  103. package/dist/certification/types.js.map +1 -1
  104. package/dist/commands/certification/certify.d.ts.map +1 -1
  105. package/dist/commands/certification/certify.js +18 -4
  106. package/dist/commands/certification/certify.js.map +1 -1
  107. package/dist/compliance/attestation.d.ts +39 -0
  108. package/dist/compliance/attestation.d.ts.map +1 -0
  109. package/dist/compliance/attestation.js +364 -0
  110. package/dist/compliance/attestation.js.map +1 -0
  111. package/dist/compliance/cfr42-part2.d.ts +42 -0
  112. package/dist/compliance/cfr42-part2.d.ts.map +1 -0
  113. package/dist/compliance/cfr42-part2.js +408 -0
  114. package/dist/compliance/cfr42-part2.js.map +1 -0
  115. package/dist/compliance/compliance-bundle.d.ts +100 -0
  116. package/dist/compliance/compliance-bundle.d.ts.map +1 -0
  117. package/dist/compliance/compliance-bundle.js +210 -0
  118. package/dist/compliance/compliance-bundle.js.map +1 -0
  119. package/dist/compliance/healthcare-bundle.d.ts +68 -0
  120. package/dist/compliance/healthcare-bundle.d.ts.map +1 -0
  121. package/dist/compliance/healthcare-bundle.js +104 -0
  122. package/dist/compliance/healthcare-bundle.js.map +1 -0
  123. package/dist/compliance/hipaa.d.ts.map +1 -1
  124. package/dist/compliance/hipaa.js +14 -11
  125. package/dist/compliance/hipaa.js.map +1 -1
  126. package/dist/compliance/index.d.ts +10 -2
  127. package/dist/compliance/index.d.ts.map +1 -1
  128. package/dist/compliance/index.js +9 -3
  129. package/dist/compliance/index.js.map +1 -1
  130. package/dist/compliance/mapper.d.ts.map +1 -1
  131. package/dist/compliance/mapper.js +3 -17
  132. package/dist/compliance/mapper.js.map +1 -1
  133. package/dist/compliance/nist-800-53.d.ts +22 -6
  134. package/dist/compliance/nist-800-53.d.ts.map +1 -1
  135. package/dist/compliance/nist-800-53.js +264 -272
  136. package/dist/compliance/nist-800-53.js.map +1 -1
  137. package/dist/compliance/report.d.ts +31 -2
  138. package/dist/compliance/report.d.ts.map +1 -1
  139. package/dist/compliance/report.js +255 -4
  140. package/dist/compliance/report.js.map +1 -1
  141. package/dist/compliance/types.d.ts +1 -1
  142. package/dist/compliance/types.d.ts.map +1 -1
  143. package/dist/config/flags.d.ts +12 -12
  144. package/dist/cost/index.d.ts +1 -1
  145. package/dist/cost/index.d.ts.map +1 -1
  146. package/dist/cost/index.js +1 -1
  147. package/dist/cost/index.js.map +1 -1
  148. package/dist/cost/tracker.d.ts +64 -0
  149. package/dist/cost/tracker.d.ts.map +1 -1
  150. package/dist/cost/tracker.js +165 -0
  151. package/dist/cost/tracker.js.map +1 -1
  152. package/dist/eval/fixtures/healthcare/audit-gaps.d.ts +28 -0
  153. package/dist/eval/fixtures/healthcare/audit-gaps.d.ts.map +1 -0
  154. package/dist/eval/fixtures/healthcare/audit-gaps.js +90 -0
  155. package/dist/eval/fixtures/healthcare/audit-gaps.js.map +1 -0
  156. package/dist/eval/fixtures/healthcare/consent-bypass.d.ts +31 -0
  157. package/dist/eval/fixtures/healthcare/consent-bypass.d.ts.map +1 -0
  158. package/dist/eval/fixtures/healthcare/consent-bypass.js +61 -0
  159. package/dist/eval/fixtures/healthcare/consent-bypass.js.map +1 -0
  160. package/dist/eval/fixtures/healthcare/phi-in-logs.d.ts +24 -0
  161. package/dist/eval/fixtures/healthcare/phi-in-logs.d.ts.map +1 -0
  162. package/dist/eval/fixtures/healthcare/phi-in-logs.js +41 -0
  163. package/dist/eval/fixtures/healthcare/phi-in-logs.js.map +1 -0
  164. package/dist/evidence/collector.d.ts +21 -0
  165. package/dist/evidence/collector.d.ts.map +1 -0
  166. package/dist/evidence/collector.js +340 -0
  167. package/dist/evidence/collector.js.map +1 -0
  168. package/dist/evidence/index.d.ts +11 -0
  169. package/dist/evidence/index.d.ts.map +1 -0
  170. package/dist/evidence/index.js +12 -0
  171. package/dist/evidence/index.js.map +1 -0
  172. package/dist/evidence/store.d.ts +39 -0
  173. package/dist/evidence/store.d.ts.map +1 -0
  174. package/dist/evidence/store.js +173 -0
  175. package/dist/evidence/store.js.map +1 -0
  176. package/dist/evidence/types.d.ts +175 -0
  177. package/dist/evidence/types.d.ts.map +1 -0
  178. package/dist/evidence/types.js +9 -0
  179. package/dist/evidence/types.js.map +1 -0
  180. package/dist/exporters/checkmarx.d.ts +18 -0
  181. package/dist/exporters/checkmarx.d.ts.map +1 -0
  182. package/dist/exporters/checkmarx.js +203 -0
  183. package/dist/exporters/checkmarx.js.map +1 -0
  184. package/dist/exporters/index.d.ts +22 -0
  185. package/dist/exporters/index.d.ts.map +1 -0
  186. package/dist/exporters/index.js +41 -0
  187. package/dist/exporters/index.js.map +1 -0
  188. package/dist/exporters/snyk.d.ts +18 -0
  189. package/dist/exporters/snyk.d.ts.map +1 -0
  190. package/dist/exporters/snyk.js +119 -0
  191. package/dist/exporters/snyk.js.map +1 -0
  192. package/dist/exporters/sonarqube.d.ts +18 -0
  193. package/dist/exporters/sonarqube.d.ts.map +1 -0
  194. package/dist/exporters/sonarqube.js +125 -0
  195. package/dist/exporters/sonarqube.js.map +1 -0
  196. package/dist/exporters/types.d.ts +190 -0
  197. package/dist/exporters/types.d.ts.map +1 -0
  198. package/dist/exporters/types.js +9 -0
  199. package/dist/exporters/types.js.map +1 -0
  200. package/dist/frontier/index.d.ts +12 -0
  201. package/dist/frontier/index.d.ts.map +1 -0
  202. package/dist/frontier/index.js +12 -0
  203. package/dist/frontier/index.js.map +1 -0
  204. package/dist/frontier/orchestrator.d.ts +73 -0
  205. package/dist/frontier/orchestrator.d.ts.map +1 -0
  206. package/dist/frontier/orchestrator.js +312 -0
  207. package/dist/frontier/orchestrator.js.map +1 -0
  208. package/dist/frontier/providers/stub.d.ts +32 -0
  209. package/dist/frontier/providers/stub.d.ts.map +1 -0
  210. package/dist/frontier/providers/stub.js +66 -0
  211. package/dist/frontier/providers/stub.js.map +1 -0
  212. package/dist/frontier/types.d.ts +318 -0
  213. package/dist/frontier/types.d.ts.map +1 -0
  214. package/dist/frontier/types.js +27 -0
  215. package/dist/frontier/types.js.map +1 -0
  216. package/dist/history/index.d.ts +13 -0
  217. package/dist/history/index.d.ts.map +1 -0
  218. package/dist/history/index.js +15 -0
  219. package/dist/history/index.js.map +1 -0
  220. package/dist/history/store.d.ts +74 -0
  221. package/dist/history/store.d.ts.map +1 -0
  222. package/dist/history/store.js +399 -0
  223. package/dist/history/store.js.map +1 -0
  224. package/dist/history/types.d.ts +282 -0
  225. package/dist/history/types.d.ts.map +1 -0
  226. package/dist/history/types.js +41 -0
  227. package/dist/history/types.js.map +1 -0
  228. package/dist/history/verify.d.ts +44 -0
  229. package/dist/history/verify.d.ts.map +1 -0
  230. package/dist/history/verify.js +230 -0
  231. package/dist/history/verify.js.map +1 -0
  232. package/dist/index.d.ts.map +1 -1
  233. package/dist/index.js +515 -19
  234. package/dist/index.js.map +1 -1
  235. package/dist/multimodel/index.d.ts +1 -0
  236. package/dist/multimodel/index.d.ts.map +1 -1
  237. package/dist/multimodel/index.js +2 -0
  238. package/dist/multimodel/index.js.map +1 -1
  239. package/dist/multimodel/leaderboard.d.ts +116 -0
  240. package/dist/multimodel/leaderboard.d.ts.map +1 -0
  241. package/dist/multimodel/leaderboard.js +262 -0
  242. package/dist/multimodel/leaderboard.js.map +1 -0
  243. package/dist/observability/otel.d.ts.map +1 -1
  244. package/dist/observability/otel.js +1 -3
  245. package/dist/observability/otel.js.map +1 -1
  246. package/dist/plugins/loader.js +1 -1
  247. package/dist/plugins/loader.js.map +1 -1
  248. package/dist/scanners/agent/agent-chain-analysis.d.ts +152 -0
  249. package/dist/scanners/agent/agent-chain-analysis.d.ts.map +1 -0
  250. package/dist/scanners/agent/agent-chain-analysis.js +438 -0
  251. package/dist/scanners/agent/agent-chain-analysis.js.map +1 -0
  252. package/dist/scanners/agent/payloads/index.d.ts +2 -1
  253. package/dist/scanners/agent/payloads/index.d.ts.map +1 -1
  254. package/dist/scanners/agent/payloads/index.js +25 -6
  255. package/dist/scanners/agent/payloads/index.js.map +1 -1
  256. package/dist/scanners/agent/prompt-injection-fuzzer.d.ts.map +1 -1
  257. package/dist/scanners/agent/prompt-injection-fuzzer.js +14 -0
  258. package/dist/scanners/agent/prompt-injection-fuzzer.js.map +1 -1
  259. package/dist/scanners/agent/types.d.ts +5 -5
  260. package/dist/scanners/agent/types.d.ts.map +1 -1
  261. package/dist/scanners/agent/types.js.map +1 -1
  262. package/dist/scanners/cache.d.ts +156 -0
  263. package/dist/scanners/cache.d.ts.map +1 -0
  264. package/dist/scanners/cache.js +462 -0
  265. package/dist/scanners/cache.js.map +1 -0
  266. package/dist/scanners/dependencies.js +4 -4
  267. package/dist/scanners/dependencies.js.map +1 -1
  268. package/dist/scanners/gosec.d.ts.map +1 -1
  269. package/dist/scanners/gosec.js +47 -9
  270. package/dist/scanners/gosec.js.map +1 -1
  271. package/dist/scanners/healthcare.d.ts +29 -0
  272. package/dist/scanners/healthcare.d.ts.map +1 -0
  273. package/dist/scanners/healthcare.js +526 -0
  274. package/dist/scanners/healthcare.js.map +1 -0
  275. package/dist/scanners/index.d.ts +1 -0
  276. package/dist/scanners/index.d.ts.map +1 -1
  277. package/dist/scanners/index.js +33 -0
  278. package/dist/scanners/index.js.map +1 -1
  279. package/dist/scanners/index.test.js +6 -6
  280. package/dist/scanners/index.test.js.map +1 -1
  281. package/dist/scanners/secrets.js +4 -4
  282. package/dist/scanners/secrets.js.map +1 -1
  283. package/dist/scanners/semgrep.js +5 -5
  284. package/dist/scanners/semgrep.js.map +1 -1
  285. package/dist/scanners/types.d.ts +1 -1
  286. package/dist/scanners/types.d.ts.map +1 -1
  287. package/dist/scanners/types.js +1 -0
  288. package/dist/scanners/types.js.map +1 -1
  289. package/dist/scanners/typescript.test.js +1 -1
  290. package/dist/scanners/typescript.test.js.map +1 -1
  291. package/dist/telemetry/index.d.ts +10 -0
  292. package/dist/telemetry/index.d.ts.map +1 -0
  293. package/dist/telemetry/index.js +10 -0
  294. package/dist/telemetry/index.js.map +1 -0
  295. package/dist/telemetry/registry.d.ts +178 -0
  296. package/dist/telemetry/registry.d.ts.map +1 -0
  297. package/dist/telemetry/registry.js +297 -0
  298. package/dist/telemetry/registry.js.map +1 -0
  299. package/dist/telemetry/usage.d.ts +197 -0
  300. package/dist/telemetry/usage.d.ts.map +1 -0
  301. package/dist/telemetry/usage.js +252 -0
  302. package/dist/telemetry/usage.js.map +1 -0
  303. package/package.json +2 -6
@@ -0,0 +1,312 @@
1
+ /**
2
+ * Frontier Model Orchestrator
3
+ *
4
+ * Manages multiple frontier model providers, handles fallback,
5
+ * and implements consensus across models for high-confidence results.
6
+ *
7
+ * @module frontier/orchestrator
8
+ */
9
+ import { DEFAULT_FRONTIER_CONFIG } from "./types.js";
10
+ import { logger } from "../logger.js";
11
+ // ============================================================================
12
+ // Orchestrator
13
+ // ============================================================================
14
+ /**
15
+ * Orchestrates frontier model analysis across multiple providers
16
+ */
17
+ export class FrontierOrchestrator {
18
+ providers = new Map();
19
+ config;
20
+ constructor(config = {}) {
21
+ this.config = { ...DEFAULT_FRONTIER_CONFIG, ...config };
22
+ }
23
+ /**
24
+ * Register a model provider
25
+ */
26
+ registerProvider(provider) {
27
+ this.providers.set(provider.name, provider);
28
+ logger.debug("frontier.provider_registered", { provider: provider.name });
29
+ }
30
+ /**
31
+ * Get a registered provider
32
+ */
33
+ getProvider(name) {
34
+ return this.providers.get(name);
35
+ }
36
+ /**
37
+ * List all registered providers
38
+ */
39
+ listProviders() {
40
+ return Array.from(this.providers.keys());
41
+ }
42
+ /**
43
+ * Check availability of all providers
44
+ */
45
+ async checkAvailability() {
46
+ const results = {};
47
+ for (const [name, provider] of this.providers) {
48
+ try {
49
+ const status = await provider.getStatus();
50
+ results[name] = { available: status.available, error: status.error };
51
+ }
52
+ catch (error) {
53
+ results[name] = {
54
+ available: false,
55
+ error: error instanceof Error ? error.message : String(error),
56
+ };
57
+ }
58
+ }
59
+ return results;
60
+ }
61
+ /**
62
+ * Run analysis with a single provider
63
+ */
64
+ async runWithProvider(request, providerName) {
65
+ const provider = this.providers.get(providerName);
66
+ if (!provider) {
67
+ throw new Error(`Unknown provider: ${providerName}`);
68
+ }
69
+ const available = await provider.isAvailable();
70
+ if (!available) {
71
+ throw new Error(`Provider not available: ${providerName}`);
72
+ }
73
+ logger.info("frontier.analysis_started", {
74
+ provider: providerName,
75
+ files: request.files.length,
76
+ depth: request.depth,
77
+ });
78
+ const startTime = Date.now();
79
+ const result = await provider.analyze(request);
80
+ const duration = Date.now() - startTime;
81
+ logger.info("frontier.analysis_completed", {
82
+ provider: providerName,
83
+ findings: result.findings.length,
84
+ chains: result.exploitChains.length,
85
+ cost: result.cost.totalCost,
86
+ duration,
87
+ });
88
+ return result;
89
+ }
90
+ /**
91
+ * Run analysis with fallback through multiple providers
92
+ */
93
+ async runWithFallback(request, providerNames) {
94
+ for (const name of providerNames) {
95
+ const provider = this.providers.get(name);
96
+ if (!provider) {
97
+ logger.warn("frontier.provider_not_found", { provider: name });
98
+ continue;
99
+ }
100
+ try {
101
+ const available = await provider.isAvailable();
102
+ if (!available) {
103
+ logger.warn("frontier.provider_unavailable", { provider: name });
104
+ continue;
105
+ }
106
+ return await this.runWithProvider(request, name);
107
+ }
108
+ catch (error) {
109
+ logger.warn("frontier.provider_failed", {
110
+ provider: name,
111
+ error: error instanceof Error ? error.message : String(error),
112
+ });
113
+ continue;
114
+ }
115
+ }
116
+ throw new Error("No frontier model providers available");
117
+ }
118
+ /**
119
+ * Run analysis with multiple providers for consensus
120
+ */
121
+ async runWithConsensus(request, providerNames) {
122
+ const results = [];
123
+ // Run all providers in parallel
124
+ const promises = providerNames.map(async (name) => {
125
+ try {
126
+ const result = await this.runWithProvider(request, name);
127
+ return {
128
+ model: name,
129
+ findings: result.findings,
130
+ chains: result.exploitChains,
131
+ confidence: result.confidence,
132
+ cost: result.cost,
133
+ };
134
+ }
135
+ catch (error) {
136
+ logger.warn("frontier.consensus_provider_failed", {
137
+ provider: name,
138
+ error: error instanceof Error ? error.message : String(error),
139
+ });
140
+ return null;
141
+ }
142
+ });
143
+ const settled = await Promise.all(promises);
144
+ for (const result of settled) {
145
+ if (result) {
146
+ results.push(result);
147
+ }
148
+ }
149
+ if (results.length === 0) {
150
+ throw new Error("No providers completed successfully for consensus");
151
+ }
152
+ return this.calculateConsensus(results);
153
+ }
154
+ /**
155
+ * Calculate consensus across model results
156
+ */
157
+ calculateConsensus(modelResults) {
158
+ const consensusFindings = [];
159
+ const disputedFindings = [];
160
+ const consensusChains = [];
161
+ // Group findings by a signature (file + line + category)
162
+ const findingGroups = new Map();
163
+ for (const result of modelResults) {
164
+ for (const finding of result.findings) {
165
+ const key = `${finding.file}:${finding.startLine}:${finding.category}`;
166
+ const existing = findingGroups.get(key) || [];
167
+ existing.push({ finding, models: [result.model] });
168
+ findingGroups.set(key, existing);
169
+ }
170
+ }
171
+ // Determine consensus threshold
172
+ const threshold = Math.ceil(modelResults.length * this.config.consensusThreshold);
173
+ for (const [, entries] of findingGroups) {
174
+ // Count unique models that found this
175
+ const modelsAgreeing = new Set(entries.flatMap((e) => e.models));
176
+ if (modelsAgreeing.size >= threshold) {
177
+ // Consensus reached - use finding with highest confidence
178
+ const bestEntry = entries.reduce((a, b) => a.finding.confidence > b.finding.confidence ? a : b);
179
+ consensusFindings.push(bestEntry.finding);
180
+ }
181
+ else {
182
+ // Disputed - track which models agree/disagree
183
+ const allModels = modelResults.map((r) => r.model);
184
+ disputedFindings.push({
185
+ finding: entries[0].finding,
186
+ modelAgreement: Array.from(modelsAgreeing),
187
+ modelDisagreement: allModels.filter((m) => !modelsAgreeing.has(m)),
188
+ });
189
+ }
190
+ }
191
+ // Similar process for exploit chains
192
+ const chainGroups = new Map();
193
+ for (const result of modelResults) {
194
+ for (const chain of result.chains) {
195
+ // Key chains by their first and last step locations
196
+ const key = chain.steps.length > 0
197
+ ? `${chain.steps[0].file}:${chain.steps[0].line}->${chain.steps[chain.steps.length - 1].file}:${chain.steps[chain.steps.length - 1].line}`
198
+ : chain.id;
199
+ const existing = chainGroups.get(key) || [];
200
+ existing.push({ chain, models: [result.model] });
201
+ chainGroups.set(key, existing);
202
+ }
203
+ }
204
+ for (const [, entries] of chainGroups) {
205
+ const modelsAgreeing = new Set(entries.flatMap((e) => e.models));
206
+ if (modelsAgreeing.size >= threshold) {
207
+ const bestEntry = entries.reduce((a, b) => a.chain.confidence > b.chain.confidence ? a : b);
208
+ consensusChains.push(bestEntry.chain);
209
+ }
210
+ }
211
+ // Calculate consensus confidence
212
+ const totalConsensus = consensusFindings.length + consensusChains.length;
213
+ const totalDisputed = disputedFindings.length;
214
+ const consensusConfidence = totalConsensus + totalDisputed > 0
215
+ ? Math.round((totalConsensus / (totalConsensus + totalDisputed)) * 100)
216
+ : 0;
217
+ // Combine costs
218
+ const totalCost = {
219
+ inputTokens: modelResults.reduce((sum, r) => sum + r.cost.inputTokens, 0),
220
+ outputTokens: modelResults.reduce((sum, r) => sum + r.cost.outputTokens, 0),
221
+ totalCost: modelResults.reduce((sum, r) => sum + r.cost.totalCost, 0),
222
+ model: modelResults.map((r) => r.model).join("+"),
223
+ breakdown: modelResults.map((r) => ({
224
+ phase: r.model,
225
+ inputTokens: r.cost.inputTokens,
226
+ outputTokens: r.cost.outputTokens,
227
+ cost: r.cost.totalCost,
228
+ })),
229
+ };
230
+ return {
231
+ consensusFindings,
232
+ disputedFindings,
233
+ consensusChains,
234
+ consensusConfidence,
235
+ modelResults: modelResults.map((r) => ({
236
+ model: r.model,
237
+ findings: r.findings,
238
+ chains: r.chains,
239
+ confidence: r.confidence,
240
+ })),
241
+ totalCost,
242
+ };
243
+ }
244
+ /**
245
+ * Estimate cost for an analysis across providers
246
+ */
247
+ async estimateCost(request, providerNames) {
248
+ const names = providerNames || Array.from(this.providers.keys());
249
+ const estimates = {};
250
+ for (const name of names) {
251
+ const provider = this.providers.get(name);
252
+ if (provider) {
253
+ try {
254
+ estimates[name] = await provider.estimateCost(request);
255
+ }
256
+ catch (error) {
257
+ estimates[name] = {
258
+ min: 0,
259
+ max: 0,
260
+ estimated: 0,
261
+ currency: "USD",
262
+ factors: [
263
+ `Error: ${error instanceof Error ? error.message : String(error)}`,
264
+ ],
265
+ };
266
+ }
267
+ }
268
+ }
269
+ return estimates;
270
+ }
271
+ /**
272
+ * Get the default provider order based on config
273
+ */
274
+ getDefaultProviderOrder() {
275
+ return this.config.providers.filter((p) => this.providers.has(p));
276
+ }
277
+ /**
278
+ * Run analysis with default configuration
279
+ */
280
+ async run(request) {
281
+ const providers = this.getDefaultProviderOrder();
282
+ if (providers.length === 0) {
283
+ throw new Error("No frontier model providers configured");
284
+ }
285
+ if (this.config.requireConsensus && providers.length > 1) {
286
+ return this.runWithConsensus(request, providers);
287
+ }
288
+ else {
289
+ return this.runWithFallback(request, providers);
290
+ }
291
+ }
292
+ }
293
+ // ============================================================================
294
+ // Singleton
295
+ // ============================================================================
296
+ let _orchestrator = null;
297
+ /**
298
+ * Get the singleton orchestrator instance
299
+ */
300
+ export function getFrontierOrchestrator(config) {
301
+ if (!_orchestrator) {
302
+ _orchestrator = new FrontierOrchestrator(config);
303
+ }
304
+ return _orchestrator;
305
+ }
306
+ /**
307
+ * Reset the singleton (for testing)
308
+ */
309
+ export function resetFrontierOrchestrator() {
310
+ _orchestrator = null;
311
+ }
312
+ //# sourceMappingURL=orchestrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../src/frontier/orchestrator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Stub Frontier Provider
3
+ *
4
+ * A mock provider for development and testing.
5
+ * Returns empty results with zero cost.
6
+ *
7
+ * Replace with real providers (Mythos, GPT-5.5-Cyber) when available.
8
+ *
9
+ * @module frontier/providers/stub
10
+ */
11
+ import type { FrontierModelProvider, FrontierCapability, FrontierAnalysisRequest, FrontierAnalysisResult, CostEstimate } from "../types.js";
12
+ /**
13
+ * Stub provider that returns empty results
14
+ */
15
+ export declare class StubFrontierProvider implements FrontierModelProvider {
16
+ readonly name: "stub";
17
+ readonly displayName = "Stub Provider (Testing)";
18
+ readonly capabilities: FrontierCapability[];
19
+ analyze(request: FrontierAnalysisRequest): Promise<FrontierAnalysisResult>;
20
+ isAvailable(): Promise<boolean>;
21
+ estimateCost(_request: FrontierAnalysisRequest): Promise<CostEstimate>;
22
+ getStatus(): Promise<{
23
+ available: boolean;
24
+ latencyMs?: number;
25
+ error?: string;
26
+ }>;
27
+ }
28
+ /**
29
+ * Create a stub provider instance
30
+ */
31
+ export declare function createStubProvider(): StubFrontierProvider;
32
+ //# sourceMappingURL=stub.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stub.d.ts","sourceRoot":"","sources":["../../../src/frontier/providers/stub.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EACV,qBAAqB,EACrB,kBAAkB,EAClB,uBAAuB,EACvB,sBAAsB,EACtB,YAAY,EACb,MAAM,aAAa,CAAC;AAErB;;GAEG;AACH,qBAAa,oBAAqB,YAAW,qBAAqB;IAChE,QAAQ,CAAC,IAAI,EAAG,MAAM,CAAU;IAChC,QAAQ,CAAC,WAAW,6BAA6B;IACjD,QAAQ,CAAC,YAAY,EAAE,kBAAkB,EAAE,CAAM;IAE3C,OAAO,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAyB1E,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAI/B,YAAY,CAAC,QAAQ,EAAE,uBAAuB,GAAG,OAAO,CAAC,YAAY,CAAC;IAUtE,SAAS,IAAI,OAAO,CAAC;QACzB,SAAS,EAAE,OAAO,CAAC;QACnB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;CAMH;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,oBAAoB,CAEzD"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Stub Frontier Provider
3
+ *
4
+ * A mock provider for development and testing.
5
+ * Returns empty results with zero cost.
6
+ *
7
+ * Replace with real providers (Mythos, GPT-5.5-Cyber) when available.
8
+ *
9
+ * @module frontier/providers/stub
10
+ */
11
+ /**
12
+ * Stub provider that returns empty results
13
+ */
14
+ export class StubFrontierProvider {
15
+ name = "stub";
16
+ displayName = "Stub Provider (Testing)";
17
+ capabilities = [];
18
+ async analyze(request) {
19
+ // Simulate some processing time
20
+ await new Promise((resolve) => setTimeout(resolve, 100));
21
+ return {
22
+ findings: [],
23
+ exploitChains: [],
24
+ confidence: 0,
25
+ modelUsed: "stub",
26
+ cost: {
27
+ inputTokens: 0,
28
+ outputTokens: 0,
29
+ totalCost: 0,
30
+ model: "stub",
31
+ },
32
+ reasoning: ["Stub provider - no real analysis performed"],
33
+ duration: 100,
34
+ filesAnalyzed: request.files.length,
35
+ linesAnalyzed: request.files.reduce((sum, f) => sum + f.loc, 0),
36
+ warnings: [
37
+ "This is a stub provider for testing. Configure a real frontier model provider for actual analysis.",
38
+ ],
39
+ };
40
+ }
41
+ async isAvailable() {
42
+ return true;
43
+ }
44
+ async estimateCost(_request) {
45
+ return {
46
+ min: 0,
47
+ max: 0,
48
+ estimated: 0,
49
+ currency: "USD",
50
+ factors: ["Stub provider has no cost"],
51
+ };
52
+ }
53
+ async getStatus() {
54
+ return {
55
+ available: true,
56
+ latencyMs: 1,
57
+ };
58
+ }
59
+ }
60
+ /**
61
+ * Create a stub provider instance
62
+ */
63
+ export function createStubProvider() {
64
+ return new StubFrontierProvider();
65
+ }
66
+ //# sourceMappingURL=stub.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stub.js","sourceRoot":"","sources":["../../../src/frontier/providers/stub.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAUH;;GAEG;AACH,MAAM,OAAO,oBAAoB;IACtB,IAAI,GAAG,MAAe,CAAC;IACvB,WAAW,GAAG,yBAAyB,CAAC;IACxC,YAAY,GAAyB,EAAE,CAAC;IAEjD,KAAK,CAAC,OAAO,CAAC,OAAgC;QAC5C,gCAAgC;QAChC,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QAEzD,OAAO;YACL,QAAQ,EAAE,EAAE;YACZ,aAAa,EAAE,EAAE;YACjB,UAAU,EAAE,CAAC;YACb,SAAS,EAAE,MAAM;YACjB,IAAI,EAAE;gBACJ,WAAW,EAAE,CAAC;gBACd,YAAY,EAAE,CAAC;gBACf,SAAS,EAAE,CAAC;gBACZ,KAAK,EAAE,MAAM;aACd;YACD,SAAS,EAAE,CAAC,4CAA4C,CAAC;YACzD,QAAQ,EAAE,GAAG;YACb,aAAa,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM;YACnC,aAAa,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;YAC/D,QAAQ,EAAE;gBACR,oGAAoG;aACrG;SACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,WAAW;QACf,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,QAAiC;QAClD,OAAO;YACL,GAAG,EAAE,CAAC;YACN,GAAG,EAAE,CAAC;YACN,SAAS,EAAE,CAAC;YACZ,QAAQ,EAAE,KAAK;YACf,OAAO,EAAE,CAAC,2BAA2B,CAAC;SACvC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,SAAS;QAKb,OAAO;YACL,SAAS,EAAE,IAAI;YACf,SAAS,EAAE,CAAC;SACb,CAAC;IACJ,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO,IAAI,oBAAoB,EAAE,CAAC;AACpC,CAAC"}