@atlascrew/apparatus 0.9.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 (291) hide show
  1. package/bin/apparatus.mjs +2 -0
  2. package/certs/server.crt +17 -0
  3. package/certs/server.key +28 -0
  4. package/dist/ai/client.js +104 -0
  5. package/dist/ai/client.js.map +1 -0
  6. package/dist/ai/personas.js +104 -0
  7. package/dist/ai/personas.js.map +1 -0
  8. package/dist/ai/redteam.js +1404 -0
  9. package/dist/ai/redteam.js.map +1 -0
  10. package/dist/ai/report-store.js +309 -0
  11. package/dist/ai/report-store.js.map +1 -0
  12. package/dist/app.js +525 -0
  13. package/dist/app.js.map +1 -0
  14. package/dist/attack-sim.js +69 -0
  15. package/dist/attack-sim.js.map +1 -0
  16. package/dist/attacker-tracker.js +276 -0
  17. package/dist/attacker-tracker.js.map +1 -0
  18. package/dist/blackhole.js +95 -0
  19. package/dist/blackhole.js.map +1 -0
  20. package/dist/chaos.js +88 -0
  21. package/dist/chaos.js.map +1 -0
  22. package/dist/cluster.js +462 -0
  23. package/dist/cluster.js.map +1 -0
  24. package/dist/config.js +61 -0
  25. package/dist/config.js.map +1 -0
  26. package/dist/deception.js +205 -0
  27. package/dist/deception.js.map +1 -0
  28. package/dist/demo-mode.js +109 -0
  29. package/dist/demo-mode.js.map +1 -0
  30. package/dist/dist-dashboard/assets/index-BsMhEnGu.js +648 -0
  31. package/dist/dist-dashboard/assets/index-CNOkYC_Q.css +10 -0
  32. package/dist/dist-dashboard/assets/index-CW2grvPC.js +648 -0
  33. package/dist/dist-dashboard/assets/logo/apparatus-favicon.svg +15 -0
  34. package/dist/dist-dashboard/assets/logo/apparatus-icon-dark.svg +24 -0
  35. package/dist/dist-dashboard/assets/logo/apparatus-icon-light.svg +24 -0
  36. package/dist/dist-dashboard/assets/logo/apparatus-logo-512.png +0 -0
  37. package/dist/dist-dashboard/assets/logo/apparatus-logo-dark.svg +18 -0
  38. package/dist/dist-dashboard/assets/logo/apparatus-logo.svg +17 -0
  39. package/dist/dist-dashboard/assets/logo/apple-touch-icon.png +0 -0
  40. package/dist/dist-dashboard/assets/logo/favicon-192.png +0 -0
  41. package/dist/dist-dashboard/assets/logo/favicon-32.png +0 -0
  42. package/dist/dist-dashboard/assets/logo/favicon.ico +0 -0
  43. package/dist/dist-dashboard/assets/logo/icon-192.png +0 -0
  44. package/dist/dist-dashboard/assets/logo/icon-512.png +0 -0
  45. package/dist/dist-dashboard/assets/logo/icon-light-512.png +0 -0
  46. package/dist/dist-dashboard/assets/react-vendor-DpRMSntD.js +1 -0
  47. package/dist/dist-dashboard/assets/router-DSc5pRwN.js +59 -0
  48. package/dist/dist-dashboard/docs-index.json +1577 -0
  49. package/dist/dist-dashboard/index.html +21 -0
  50. package/dist/dlp.js +40 -0
  51. package/dist/dlp.js.map +1 -0
  52. package/dist/drills.js +770 -0
  53. package/dist/drills.js.map +1 -0
  54. package/dist/echoHandler.js +113 -0
  55. package/dist/echoHandler.js.map +1 -0
  56. package/dist/escape/index.js +225 -0
  57. package/dist/escape/index.js.map +1 -0
  58. package/dist/escape/methods/dns.js +74 -0
  59. package/dist/escape/methods/dns.js.map +1 -0
  60. package/dist/escape/methods/http.js +81 -0
  61. package/dist/escape/methods/http.js.map +1 -0
  62. package/dist/escape/methods/icmp.js +36 -0
  63. package/dist/escape/methods/icmp.js.map +1 -0
  64. package/dist/escape/methods/tcp.js +38 -0
  65. package/dist/escape/methods/tcp.js.map +1 -0
  66. package/dist/escape/methods/udp.js +27 -0
  67. package/dist/escape/methods/udp.js.map +1 -0
  68. package/dist/escape/methods/websocket.js +37 -0
  69. package/dist/escape/methods/websocket.js.map +1 -0
  70. package/dist/forensics.js +111 -0
  71. package/dist/forensics.js.map +1 -0
  72. package/dist/generator.js +67 -0
  73. package/dist/generator.js.map +1 -0
  74. package/dist/ghosting.js +414 -0
  75. package/dist/ghosting.js.map +1 -0
  76. package/dist/graphql.js +44 -0
  77. package/dist/graphql.js.map +1 -0
  78. package/dist/history.js +40 -0
  79. package/dist/history.js.map +1 -0
  80. package/dist/imposter/creds.js +16 -0
  81. package/dist/imposter/creds.js.map +1 -0
  82. package/dist/imposter/index.js +44 -0
  83. package/dist/imposter/index.js.map +1 -0
  84. package/dist/imposter/providers/aws.js +103 -0
  85. package/dist/imposter/providers/aws.js.map +1 -0
  86. package/dist/imposter/providers/gcp.js +26 -0
  87. package/dist/imposter/providers/gcp.js.map +1 -0
  88. package/dist/index.js +53 -0
  89. package/dist/index.js.map +1 -0
  90. package/dist/infra-debug.js +68 -0
  91. package/dist/infra-debug.js.map +1 -0
  92. package/dist/jwt-debug.js +272 -0
  93. package/dist/jwt-debug.js.map +1 -0
  94. package/dist/kv.js +22 -0
  95. package/dist/kv.js.map +1 -0
  96. package/dist/lib/generators.js +43 -0
  97. package/dist/lib/generators.js.map +1 -0
  98. package/dist/lib/json.js +26 -0
  99. package/dist/lib/json.js.map +1 -0
  100. package/dist/logger.js +9 -0
  101. package/dist/logger.js.map +1 -0
  102. package/dist/metrics.js +20 -0
  103. package/dist/metrics.js.map +1 -0
  104. package/dist/mtd.js +30 -0
  105. package/dist/mtd.js.map +1 -0
  106. package/dist/oidc.js +69 -0
  107. package/dist/oidc.js.map +1 -0
  108. package/dist/persistence/cluster-state.js +47 -0
  109. package/dist/persistence/cluster-state.js.map +1 -0
  110. package/dist/persistence/deception-history.js +65 -0
  111. package/dist/persistence/deception-history.js.map +1 -0
  112. package/dist/persistence/drill-runs.js +138 -0
  113. package/dist/persistence/drill-runs.js.map +1 -0
  114. package/dist/persistence/request-history.js +41 -0
  115. package/dist/persistence/request-history.js.map +1 -0
  116. package/dist/persistence/scenario-catalog.js +73 -0
  117. package/dist/persistence/scenario-catalog.js.map +1 -0
  118. package/dist/persistence/status.js +51 -0
  119. package/dist/persistence/status.js.map +1 -0
  120. package/dist/persistence/tarpit-state.js +47 -0
  121. package/dist/persistence/tarpit-state.js.map +1 -0
  122. package/dist/persistence/webhook-store.js +69 -0
  123. package/dist/persistence/webhook-store.js.map +1 -0
  124. package/dist/proxy.js +28 -0
  125. package/dist/proxy.js.map +1 -0
  126. package/dist/ratelimit.js +32 -0
  127. package/dist/ratelimit.js.map +1 -0
  128. package/dist/redteam.js +442 -0
  129. package/dist/redteam.js.map +1 -0
  130. package/dist/scenarios.js +229 -0
  131. package/dist/scenarios.js.map +1 -0
  132. package/dist/scripting.js +30 -0
  133. package/dist/scripting.js.map +1 -0
  134. package/dist/self-healing.js +42 -0
  135. package/dist/self-healing.js.map +1 -0
  136. package/dist/sentinel.js +50 -0
  137. package/dist/sentinel.js.map +1 -0
  138. package/dist/server-bad-ssl.js +47 -0
  139. package/dist/server-bad-ssl.js.map +1 -0
  140. package/dist/server-grpc.js +66 -0
  141. package/dist/server-grpc.js.map +1 -0
  142. package/dist/server-http1.js +5 -0
  143. package/dist/server-http1.js.map +1 -0
  144. package/dist/server-http2.js +27 -0
  145. package/dist/server-http2.js.map +1 -0
  146. package/dist/server-icap.js +46 -0
  147. package/dist/server-icap.js.map +1 -0
  148. package/dist/server-l4.js +30 -0
  149. package/dist/server-l4.js.map +1 -0
  150. package/dist/server-mqtt.js +29 -0
  151. package/dist/server-mqtt.js.map +1 -0
  152. package/dist/server-protocols.js +18 -0
  153. package/dist/server-protocols.js.map +1 -0
  154. package/dist/server-redis.js +112 -0
  155. package/dist/server-redis.js.map +1 -0
  156. package/dist/server-smtp.js +66 -0
  157. package/dist/server-smtp.js.map +1 -0
  158. package/dist/server-syslog.js +23 -0
  159. package/dist/server-syslog.js.map +1 -0
  160. package/dist/server-ws.js +18 -0
  161. package/dist/server-ws.js.map +1 -0
  162. package/dist/sidecar/chaos/engine.js +41 -0
  163. package/dist/sidecar/chaos/engine.js.map +1 -0
  164. package/dist/sidecar/index.js +98 -0
  165. package/dist/sidecar/index.js.map +1 -0
  166. package/dist/simulator/dependency-graph.js +102 -0
  167. package/dist/simulator/dependency-graph.js.map +1 -0
  168. package/dist/simulator/supply-chain.js +67 -0
  169. package/dist/simulator/supply-chain.js.map +1 -0
  170. package/dist/sink.js +24 -0
  171. package/dist/sink.js.map +1 -0
  172. package/dist/sse-broadcast.js +105 -0
  173. package/dist/sse-broadcast.js.map +1 -0
  174. package/dist/swagger.js +309 -0
  175. package/dist/swagger.js.map +1 -0
  176. package/dist/sysinfo.js +36 -0
  177. package/dist/sysinfo.js.map +1 -0
  178. package/dist/tarpit.js +126 -0
  179. package/dist/tarpit.js.map +1 -0
  180. package/dist/tool-executor.js +315 -0
  181. package/dist/tool-executor.js.map +1 -0
  182. package/dist/tui/api-client.js +341 -0
  183. package/dist/tui/api-client.js.map +1 -0
  184. package/dist/tui/core/action-handler.js +302 -0
  185. package/dist/tui/core/action-handler.js.map +1 -0
  186. package/dist/tui/core/index.js +18 -0
  187. package/dist/tui/core/index.js.map +1 -0
  188. package/dist/tui/core/keyboard.js +329 -0
  189. package/dist/tui/core/keyboard.js.map +1 -0
  190. package/dist/tui/core/modal.js +397 -0
  191. package/dist/tui/core/modal.js.map +1 -0
  192. package/dist/tui/core/screen-manager.js +262 -0
  193. package/dist/tui/core/screen-manager.js.map +1 -0
  194. package/dist/tui/core/store.js +254 -0
  195. package/dist/tui/core/store.js.map +1 -0
  196. package/dist/tui/core/widget.js +167 -0
  197. package/dist/tui/core/widget.js.map +1 -0
  198. package/dist/tui/dashboard.js +649 -0
  199. package/dist/tui/dashboard.js.map +1 -0
  200. package/dist/tui/index.js +118 -0
  201. package/dist/tui/index.js.map +1 -0
  202. package/dist/tui/modals/add-rule-modal.js +190 -0
  203. package/dist/tui/modals/add-rule-modal.js.map +1 -0
  204. package/dist/tui/modals/dlp-output-modal.js +102 -0
  205. package/dist/tui/modals/dlp-output-modal.js.map +1 -0
  206. package/dist/tui/modals/dns-form-modal.js +26 -0
  207. package/dist/tui/modals/dns-form-modal.js.map +1 -0
  208. package/dist/tui/modals/ghost-config-modal.js +35 -0
  209. package/dist/tui/modals/ghost-config-modal.js.map +1 -0
  210. package/dist/tui/modals/har-results-modal.js +41 -0
  211. package/dist/tui/modals/har-results-modal.js.map +1 -0
  212. package/dist/tui/modals/index.js +15 -0
  213. package/dist/tui/modals/index.js.map +1 -0
  214. package/dist/tui/modals/jwt-decode-modal.js +45 -0
  215. package/dist/tui/modals/jwt-decode-modal.js.map +1 -0
  216. package/dist/tui/modals/jwt-mint-modal.js +70 -0
  217. package/dist/tui/modals/jwt-mint-modal.js.map +1 -0
  218. package/dist/tui/modals/ping-form-modal.js +19 -0
  219. package/dist/tui/modals/ping-form-modal.js.map +1 -0
  220. package/dist/tui/modals/redteam-results-modal.js +43 -0
  221. package/dist/tui/modals/redteam-results-modal.js.map +1 -0
  222. package/dist/tui/modals/scan-form-modal.js +26 -0
  223. package/dist/tui/modals/scan-form-modal.js.map +1 -0
  224. package/dist/tui/screens/defense-screen.js +281 -0
  225. package/dist/tui/screens/defense-screen.js.map +1 -0
  226. package/dist/tui/screens/forensics-screen.js +81 -0
  227. package/dist/tui/screens/forensics-screen.js.map +1 -0
  228. package/dist/tui/screens/index.js +140 -0
  229. package/dist/tui/screens/index.js.map +1 -0
  230. package/dist/tui/screens/system-screen.js +81 -0
  231. package/dist/tui/screens/system-screen.js.map +1 -0
  232. package/dist/tui/screens/testing-screen.js +429 -0
  233. package/dist/tui/screens/testing-screen.js.map +1 -0
  234. package/dist/tui/screens/traffic-screen.js +76 -0
  235. package/dist/tui/screens/traffic-screen.js.map +1 -0
  236. package/dist/tui/sse-client.js +130 -0
  237. package/dist/tui/sse-client.js.map +1 -0
  238. package/dist/tui/state/metrics-buffer.js +195 -0
  239. package/dist/tui/state/metrics-buffer.js.map +1 -0
  240. package/dist/tui/state/metrics-buffer.test.js +102 -0
  241. package/dist/tui/state/metrics-buffer.test.js.map +1 -0
  242. package/dist/tui/theme.js +136 -0
  243. package/dist/tui/theme.js.map +1 -0
  244. package/dist/tui/types.js +6 -0
  245. package/dist/tui/types.js.map +1 -0
  246. package/dist/tui/widgets/chaos-widget.js +152 -0
  247. package/dist/tui/widgets/chaos-widget.js.map +1 -0
  248. package/dist/tui/widgets/cluster-widget.js +156 -0
  249. package/dist/tui/widgets/cluster-widget.js.map +1 -0
  250. package/dist/tui/widgets/dlp-widget.js +161 -0
  251. package/dist/tui/widgets/dlp-widget.js.map +1 -0
  252. package/dist/tui/widgets/ghost-widget.js +169 -0
  253. package/dist/tui/widgets/ghost-widget.js.map +1 -0
  254. package/dist/tui/widgets/har-widget.js +173 -0
  255. package/dist/tui/widgets/har-widget.js.map +1 -0
  256. package/dist/tui/widgets/index.js +122 -0
  257. package/dist/tui/widgets/index.js.map +1 -0
  258. package/dist/tui/widgets/jwt-widget.js +177 -0
  259. package/dist/tui/widgets/jwt-widget.js.map +1 -0
  260. package/dist/tui/widgets/kv-widget.js +261 -0
  261. package/dist/tui/widgets/kv-widget.js.map +1 -0
  262. package/dist/tui/widgets/mtd-widget.js +181 -0
  263. package/dist/tui/widgets/mtd-widget.js.map +1 -0
  264. package/dist/tui/widgets/netdiag-widget.js +155 -0
  265. package/dist/tui/widgets/netdiag-widget.js.map +1 -0
  266. package/dist/tui/widgets/oidc-widget.js +162 -0
  267. package/dist/tui/widgets/oidc-widget.js.map +1 -0
  268. package/dist/tui/widgets/pcap-widget.js +239 -0
  269. package/dist/tui/widgets/pcap-widget.js.map +1 -0
  270. package/dist/tui/widgets/redteam-widget.js +155 -0
  271. package/dist/tui/widgets/redteam-widget.js.map +1 -0
  272. package/dist/tui/widgets/rps-gauge-widget.js +124 -0
  273. package/dist/tui/widgets/rps-gauge-widget.js.map +1 -0
  274. package/dist/tui/widgets/sentinel-widget.js +171 -0
  275. package/dist/tui/widgets/sentinel-widget.js.map +1 -0
  276. package/dist/tui/widgets/sparklines-widget.js +127 -0
  277. package/dist/tui/widgets/sparklines-widget.js.map +1 -0
  278. package/dist/tui/widgets/sysinfo-widget.js +197 -0
  279. package/dist/tui/widgets/sysinfo-widget.js.map +1 -0
  280. package/dist/tui/widgets/traffic-chart-widget.js +170 -0
  281. package/dist/tui/widgets/traffic-chart-widget.js.map +1 -0
  282. package/dist/tui/widgets/webhook-widget.js +259 -0
  283. package/dist/tui/widgets/webhook-widget.js.map +1 -0
  284. package/dist/utils/ip.js +18 -0
  285. package/dist/utils/ip.js.map +1 -0
  286. package/dist/victim/index.js +71 -0
  287. package/dist/victim/index.js.map +1 -0
  288. package/dist/webhook.js +88 -0
  289. package/dist/webhook.js.map +1 -0
  290. package/package.json +90 -0
  291. package/proto/echo.proto +19 -0
package/dist/app.js ADDED
@@ -0,0 +1,525 @@
1
+ import express from "express";
2
+ import pinoHttp from "pino-http";
3
+ import swaggerUi from "swagger-ui-express";
4
+ import compression from "compression";
5
+ import multer from "multer";
6
+ import path from "path";
7
+ import { existsSync } from "fs";
8
+ import { fileURLToPath } from "url";
9
+ import { cfg } from "./config.js";
10
+ import { logger } from "./logger.js";
11
+ import { echoHandler, sseHandler } from "./echoHandler.js";
12
+ import { broadcastRequest } from "./sse-broadcast.js";
13
+ import { register, httpRequestDurationMicroseconds, httpRequestsTotal } from "./metrics.js";
14
+ import { swaggerDocument } from "./swagger.js";
15
+ import { getHistory, clearHistory } from "./history.js";
16
+ import { proxyHandler } from "./proxy.js";
17
+ import { authForgeHandler, authVerifyHandler, jwtDebugHandler, jwtDebugPostHandler } from "./jwt-debug.js";
18
+ import { rateLimitHandler } from "./ratelimit.js";
19
+ import { graphqlHandler } from "./graphql.js";
20
+ import { jwksHandler, tokenMintHandler, oidcDiscoveryHandler } from "./oidc.js";
21
+ import { sinkHandler } from "./sink.js";
22
+ import { dlpHandler } from "./dlp.js";
23
+ import { generatorHandler } from "./generator.js";
24
+ import { sysInfoHandler } from "./sysinfo.js";
25
+ import { dnsHandler, pingHandler } from "./infra-debug.js";
26
+ import { webhookReceiveHandler, webhookListHandler } from "./webhook.js";
27
+ import { eicarHandler, crashHandler, cpuSpikeHandler, getChaosStatus, memorySpikeHandler } from "./chaos.js";
28
+ import { kvHandler } from "./kv.js";
29
+ import { scriptHandler } from "./scripting.js";
30
+ import { pcapHandler, harReplayHandler, livePacketHandler } from "./forensics.js";
31
+ import { clusterAttackHandler, clusterAttackStopHandler, getClusterMembers } from "./cluster.js";
32
+ import { tarpitMiddleware, tarpitListHandler, tarpitReleaseHandler, tarpitTrapHandler } from "./tarpit.js";
33
+ import { blackholeAddHandler, blackholeListHandler, blackholeMiddleware, blackholeReleaseHandler } from "./blackhole.js";
34
+ import { selfHealingMiddleware, getHealthStatus } from "./self-healing.js";
35
+ import { deceptionHandler, deceptionHistoryHandler, deceptionClearHandler } from "./deception.js";
36
+ import { redTeamFuzzerRunHandler, redTeamValidateHandler } from "./redteam.js";
37
+ import { activeShieldMiddleware, sentinelHandler } from "./sentinel.js";
38
+ import { ghostCreateHandler, ghostDeleteHandler, ghostHandler, ghostMockMiddleware, ghostStartHandler, ghostStopHandler, } from "./ghosting.js";
39
+ import { polymorphicRouteMiddleware, mtdHandler } from "./mtd.js";
40
+ import { victimRouter } from "./victim/index.js";
41
+ import { chat } from "./ai/client.js";
42
+ import { autopilotConfigHandler, autopilotKillHandler, autopilotReportsHandler, autopilotStartHandler, autopilotStatusHandler, autopilotStopHandler, } from "./ai/redteam.js";
43
+ import { runEscapeScan } from "./escape/index.js";
44
+ import { triggerSupplyChainAttack } from "./simulator/supply-chain.js";
45
+ import { getGraphHandler, injectMalwareHandler, resetGraphHandler } from "./simulator/dependency-graph.js";
46
+ import { scenarioListHandler, scenarioSaveHandler, scenarioRunHandler, scenarioRunStatusHandler } from "./scenarios.js";
47
+ import { getPersistenceHealth } from "./persistence/status.js";
48
+ import { drillCancelHandler, drillDebriefHandler, drillListHandler, drillMarkDetectedHandler, drillRunHandler, drillStatusHandler, } from "./drills.js";
49
+ import { startDemoLoop, stopDemoLoop, getDemoConfig, updateDemoConfig } from "./demo-mode.js";
50
+ import { startAttackSimulation, stopAttackSimulation, isSimulationRunning } from "./attack-sim.js";
51
+ import { attackerProfileHandler, attackerRegistryHandler } from "./attacker-tracker.js";
52
+ import { readdir } from "fs/promises";
53
+ import { request } from "undici";
54
+ const __filename = fileURLToPath(import.meta.url);
55
+ const __dirname = path.dirname(__filename);
56
+ const upload = multer({ storage: multer.memoryStorage(), limits: { fileSize: 50 * 1024 * 1024 } }); // 50MB limit
57
+ export function createApp() {
58
+ const app = express();
59
+ app.set("trust proxy", false);
60
+ const isTrafficPattern = (value) => {
61
+ return value === "steady" || value === "sine" || value === "spiky";
62
+ };
63
+ const clampNumber = (value, min, max) => Math.max(min, Math.min(max, value));
64
+ if (cfg.demoMode) {
65
+ logger.warn("Demo mode enabled: CORS allows all origins. Do not expose this instance to untrusted networks.");
66
+ }
67
+ const runningInContainer = Boolean(process.env.KUBERNETES_SERVICE_HOST) || existsSync("/.dockerenv");
68
+ if (cfg.host === "127.0.0.1" && runningInContainer) {
69
+ logger.warn("HOST is set to 127.0.0.1 in a containerized environment. Set HOST=0.0.0.0 for external/container networking.");
70
+ }
71
+ const safeOrigins = new Set([
72
+ "http://localhost:8080",
73
+ "http://localhost:8090",
74
+ "http://localhost:4173",
75
+ "http://localhost:5173",
76
+ "http://localhost:5174",
77
+ "http://localhost:5175",
78
+ "http://127.0.0.1:8080",
79
+ "http://127.0.0.1:8090",
80
+ "http://127.0.0.1:4173",
81
+ "http://127.0.0.1:5173",
82
+ "http://127.0.0.1:5174",
83
+ "http://127.0.0.1:5175",
84
+ ]);
85
+ // 0. CORS (safe localhost defaults, permissive only in demo mode)
86
+ app.use((req, res, next) => {
87
+ const origin = req.headers.origin;
88
+ if (typeof origin === 'string') {
89
+ // Strict: only allow if origin is present AND matches (or demo mode is on)
90
+ const isAllowed = cfg.demoMode || safeOrigins.has(origin);
91
+ if (isAllowed) {
92
+ res.setHeader("Access-Control-Allow-Origin", origin);
93
+ res.setHeader("Vary", "Origin");
94
+ res.setHeader("Access-Control-Allow-Headers", "*");
95
+ res.setHeader("Access-Control-Allow-Methods", "GET,POST,PUT,PATCH,DELETE,OPTIONS");
96
+ }
97
+ }
98
+ if (req.method === "OPTIONS") {
99
+ // Always return 204. If not allowed, headers are missing -> browser blocks.
100
+ return res.sendStatus(204);
101
+ }
102
+ next();
103
+ });
104
+ // 0.1 Critical Infrastructure (Always accessible)
105
+ app.get("/healthz", (_req, res) => res.status(200).json({ status: "ok" }));
106
+ app.get("/health/pro", (_req, res) => res.json(getHealthStatus()));
107
+ app.get("/sse", sseHandler);
108
+ app.get("/metrics", async (_req, res) => {
109
+ try {
110
+ res.set("Content-Type", register.contentType);
111
+ res.end(await register.metrics());
112
+ }
113
+ catch {
114
+ res.status(500).json({ error: "Failed to collect metrics" });
115
+ }
116
+ });
117
+ // 0.2 Dashboard Documentation API (Always accessible for help system)
118
+ app.get("/api/docs-index", (_req, res) => {
119
+ const docsIndexPath = path.join(__dirname, "dist-dashboard", "docs-index.json");
120
+ res.sendFile(docsIndexPath, (error) => {
121
+ if (error && !res.headersSent) {
122
+ res.status(404).json({ error: "Documentation index not found" });
123
+ }
124
+ });
125
+ });
126
+ // 0.3 Global Mitigation (Blackhole)
127
+ // Hard-drop layer intentionally placed before adaptive defenses so blocked
128
+ // actors cannot consume additional resources deeper in the stack.
129
+ app.use(blackholeMiddleware);
130
+ // 1. Moving Target Defense (Hide everything if active)
131
+ app.use(polymorphicRouteMiddleware);
132
+ // 2. Self-Healing & QoS
133
+ app.use(selfHealingMiddleware);
134
+ // 2. Deception Engine (Misinformation wins)
135
+ app.use(async (req, res, next) => {
136
+ try {
137
+ const trapped = await deceptionHandler(req, res);
138
+ if (trapped || res.headersSent)
139
+ return;
140
+ next();
141
+ }
142
+ catch (error) {
143
+ next(error); // Pass to Express error handler
144
+ }
145
+ });
146
+ // 3. Tarpit Defense (Honeypot)
147
+ app.use(tarpitMiddleware);
148
+ app.use((req, res, next) => {
149
+ req._startAt = Date.now();
150
+ // Metrics: end timer on response finish
151
+ const end = httpRequestDurationMicroseconds.startTimer();
152
+ res.on("finish", () => {
153
+ const route = req.route ? req.route.path : req.path;
154
+ const status = res.statusCode;
155
+ httpRequestsTotal.inc({
156
+ method: req.method,
157
+ route: route,
158
+ status_code: status,
159
+ });
160
+ end({
161
+ method: req.method,
162
+ route: route,
163
+ status_code: status,
164
+ });
165
+ // Global Traffic Broadcast for Dashboard
166
+ // We only broadcast if it's NOT the SSE stream itself to avoid loops
167
+ if (route !== "/sse") {
168
+ broadcastRequest({
169
+ method: req.method,
170
+ path: req.path,
171
+ status: res.statusCode,
172
+ ip: req.ip,
173
+ timestamp: new Date().toISOString(),
174
+ latencyMs: Date.now() - (req._startAt || Date.now())
175
+ });
176
+ }
177
+ });
178
+ next();
179
+ });
180
+ if (cfg.enableCompression) {
181
+ app.use(compression());
182
+ }
183
+ app.use(pinoHttp({ logger }));
184
+ app.use(express.json({ limit: cfg.bodyLimit, strict: false }));
185
+ app.use(express.urlencoded({ extended: true, limit: cfg.bodyLimit }));
186
+ app.use(express.raw({ type: "application/octet-stream", limit: cfg.bodyLimit }));
187
+ app.use(express.text({ type: "*/*", limit: cfg.bodyLimit }));
188
+ // 1.5 Active Shield (Virtual Patching) - Moved here to access parsed body
189
+ app.use(activeShieldMiddleware);
190
+ // Security Gate for Dangerous Endpoints
191
+ const securityGate = (req, res, next) => {
192
+ const directIp = req.socket.remoteAddress;
193
+ if (!directIp) {
194
+ return res.status(403).json({ error: "Access denied: Unknown source." });
195
+ }
196
+ const isLocal = directIp === "127.0.0.1" ||
197
+ directIp === "::1" ||
198
+ directIp === "::ffff:127.0.0.1" ||
199
+ directIp.startsWith("::ffff:127.");
200
+ if (!cfg.demoMode && !isLocal) {
201
+ return res.status(403).json({ error: "Access denied. Enable demo mode or use localhost." });
202
+ }
203
+ next();
204
+ };
205
+ // Protect dangerous endpoints
206
+ app.use("/api/simulator", securityGate);
207
+ app.use("/api/redteam/autopilot", securityGate);
208
+ app.use("/_sensor", securityGate);
209
+ app.use("/proxy", securityGate);
210
+ // Virtual Ghost endpoints should be resolved before route handlers.
211
+ app.use(ghostMockMiddleware);
212
+ // Scenario Engine
213
+ app.get("/scenarios", securityGate, scenarioListHandler);
214
+ app.post("/scenarios", securityGate, scenarioSaveHandler);
215
+ app.post("/scenarios/:id/run", securityGate, scenarioRunHandler);
216
+ app.get("/scenarios/:id/status", securityGate, scenarioRunStatusHandler);
217
+ // Breach Protocol Drill Engine
218
+ app.get("/drills", securityGate, drillListHandler);
219
+ app.post("/drills/:id/run", securityGate, drillRunHandler);
220
+ app.get("/drills/:id/status", securityGate, drillStatusHandler);
221
+ app.post("/drills/:id/mark-detected", securityGate, drillMarkDetectedHandler);
222
+ app.post("/drills/:id/cancel", securityGate, drillCancelHandler);
223
+ app.get("/drills/:id/debrief", securityGate, drillDebriefHandler);
224
+ // Attacker Fingerprinting
225
+ app.get("/api/attackers", securityGate, attackerRegistryHandler);
226
+ app.get("/api/attackers/:ip", securityGate, attackerProfileHandler);
227
+ // Swagger Documentation
228
+ app.use("/docs", swaggerUi.serve, swaggerUi.setup(swaggerDocument));
229
+ // Demo Mode & Integrations Control (Dashboard parity)
230
+ app.get("/_sensor/demo", (_req, res) => {
231
+ res.json({ success: true, ...getDemoConfig(), attack_sim: isSimulationRunning() });
232
+ });
233
+ app.all("/_sensor/demo/toggle", (_req, res) => {
234
+ const config = getDemoConfig();
235
+ if (config.enabled) {
236
+ stopDemoLoop();
237
+ }
238
+ else {
239
+ startDemoLoop();
240
+ }
241
+ res.json({ success: true, ...getDemoConfig(), attack_sim: isSimulationRunning() });
242
+ });
243
+ app.post("/_sensor/demo/attack-sim/toggle", securityGate, (req, res) => {
244
+ if (isSimulationRunning()) {
245
+ stopAttackSimulation();
246
+ }
247
+ else {
248
+ const rawInterval = Number(req.body.intervalMs);
249
+ const intervalMs = Math.max(500, Math.min(30000, Number.isFinite(rawInterval) ? rawInterval : 2000));
250
+ // Determine base URL dynamically (respecting the host header for container setups)
251
+ const protocol = req.protocol;
252
+ const host = req.get("host") || `localhost:${cfg.portHttp1}`;
253
+ const baseUrl = `${protocol}://${host}`;
254
+ startAttackSimulation(baseUrl, intervalMs);
255
+ }
256
+ res.json({ success: true, attack_sim: isSimulationRunning() });
257
+ });
258
+ app.put("/_sensor/demo/config", (req, res) => {
259
+ const body = req.body;
260
+ if (!body || typeof body !== 'object') {
261
+ return res.status(400).json({ error: "Invalid payload" });
262
+ }
263
+ const updates = {};
264
+ const { intensity, errorRate, latencyBase, attackFrequency, pattern, targetPath } = body;
265
+ if (Number.isFinite(intensity))
266
+ updates.intensity = clampNumber(Number(intensity), 0, 100);
267
+ if (Number.isFinite(errorRate))
268
+ updates.errorRate = clampNumber(Number(errorRate), 0, 100);
269
+ if (Number.isFinite(latencyBase))
270
+ updates.latencyBase = clampNumber(Number(latencyBase), 0, 30000);
271
+ if (Number.isFinite(attackFrequency))
272
+ updates.attackFrequency = clampNumber(Number(attackFrequency), 0, 100);
273
+ if (isTrafficPattern(pattern))
274
+ updates.pattern = pattern;
275
+ if (typeof targetPath === 'string' && targetPath.startsWith('/'))
276
+ updates.targetPath = targetPath;
277
+ if (targetPath === null)
278
+ updates.targetPath = targetPath;
279
+ updateDemoConfig(updates);
280
+ res.json({ success: true, ...getDemoConfig() });
281
+ });
282
+ app.get("/_sensor/config/integrations", (_req, res) => {
283
+ res.json({
284
+ success: true,
285
+ data: {
286
+ tunnel_url: cfg.tunnelUrl,
287
+ tunnel_api_key: cfg.tunnelApiKey,
288
+ apparatus_url: `http://localhost:${cfg.portHttp1}`
289
+ }
290
+ });
291
+ });
292
+ app.put("/_sensor/config/integrations", (req, res) => {
293
+ const { tunnel_url, tunnel_api_key } = req.body;
294
+ if (tunnel_url !== undefined)
295
+ cfg.tunnelUrl = tunnel_url;
296
+ if (tunnel_api_key !== undefined)
297
+ cfg.tunnelApiKey = tunnel_api_key;
298
+ logger.info("Apparatus Integrations configuration updated from dashboard");
299
+ res.json({ success: true, message: "Integrations configuration updated" });
300
+ });
301
+ // Request History
302
+ app.get("/history", (_req, res) => res.json(getHistory()));
303
+ app.delete("/history", (_req, res) => {
304
+ clearHistory();
305
+ res.sendStatus(204);
306
+ });
307
+ // Visual Dashboard - React App
308
+ const dashboardPath = path.join(__dirname, "dist-dashboard");
309
+ // Serve static files with SVG MIME type support
310
+ app.use("/dashboard", express.static(dashboardPath, {
311
+ setHeaders: (res, path) => {
312
+ if (path.endsWith('.svg')) {
313
+ res.setHeader('Content-Type', 'image/svg+xml');
314
+ }
315
+ }
316
+ }));
317
+ app.get("/autopilot", (_req, res) => res.redirect("/dashboard/autopilot"));
318
+ // SPA Fallback for Dashboard
319
+ app.get("/dashboard/*", (_req, res) => {
320
+ res.sendFile(path.join(dashboardPath, "index.html"));
321
+ });
322
+ // Serve Static Assets
323
+ app.use("/assets", express.static(path.join(process.cwd(), "assets"), {
324
+ setHeaders: (res, path) => {
325
+ if (path.endsWith('.svg')) {
326
+ res.setHeader('Content-Type', 'image/svg+xml');
327
+ }
328
+ }
329
+ }));
330
+ // Debugging Tools
331
+ app.get("/debug/jwt", jwtDebugHandler);
332
+ app.post("/debug/jwt", jwtDebugPostHandler);
333
+ app.get("/ratelimit", rateLimitHandler);
334
+ app.get("/sysinfo", sysInfoHandler);
335
+ app.get("/dns", dnsHandler);
336
+ app.get("/ping", pingHandler);
337
+ app.all("/hooks/:id", webhookReceiveHandler);
338
+ app.get("/hooks/:id/inspect", webhookListHandler);
339
+ // Modern API Features (GraphQL & OIDC)
340
+ app.all("/graphql", graphqlHandler);
341
+ app.get("/.well-known/jwks.json", jwksHandler);
342
+ app.get("/.well-known/openid-configuration", oidcDiscoveryHandler);
343
+ app.all("/auth/token", tokenMintHandler);
344
+ app.post("/auth/forge", securityGate, authForgeHandler);
345
+ app.post("/auth/verify", securityGate, authVerifyHandler);
346
+ // Bandwidth Tests
347
+ app.post("/sink", sinkHandler);
348
+ app.get("/generate", generatorHandler);
349
+ app.get("/dlp", dlpHandler);
350
+ // Security & Chaos
351
+ app.get("/malicious", eicarHandler);
352
+ app.post("/chaos/crash", crashHandler);
353
+ app.all("/chaos/cpu", cpuSpikeHandler); // Allow GET (old) and POST (new)
354
+ app.all("/chaos/memory", memorySpikeHandler); // Allow GET (old) and POST (new)
355
+ app.get("/chaos/status", securityGate, (_req, res) => {
356
+ res.json(getChaosStatus());
357
+ });
358
+ // Advanced Logic
359
+ app.all("/kv/:key", kvHandler);
360
+ app.post("/script", scriptHandler);
361
+ // Network Forensics
362
+ app.get("/capture.pcap", pcapHandler);
363
+ app.get("/api/forensics/live", securityGate, livePacketHandler);
364
+ app.post("/replay", harReplayHandler);
365
+ // Distributed Cluster
366
+ app.post("/cluster/attack", securityGate, clusterAttackHandler);
367
+ app.post("/cluster/attack/stop", securityGate, clusterAttackStopHandler);
368
+ app.get("/cluster/members", (_req, res) => res.json(getClusterMembers()));
369
+ // Advanced Defense & Offense
370
+ app.get("/redteam/validate", securityGate, redTeamValidateHandler);
371
+ app.post("/api/redteam/fuzzer/run", securityGate, redTeamFuzzerRunHandler);
372
+ app.get("/api/redteam/autopilot/config", securityGate, autopilotConfigHandler);
373
+ app.post("/api/redteam/autopilot/start", securityGate, autopilotStartHandler);
374
+ app.post("/api/redteam/autopilot/stop", securityGate, autopilotStopHandler);
375
+ app.post("/api/redteam/autopilot/kill", securityGate, autopilotKillHandler);
376
+ app.get("/api/redteam/autopilot/status", securityGate, autopilotStatusHandler);
377
+ app.get("/api/redteam/autopilot/reports", securityGate, autopilotReportsHandler);
378
+ app.all("/sentinel/rules", sentinelHandler);
379
+ app.get("/ghosts", securityGate, ghostHandler);
380
+ app.post("/ghosts", securityGate, ghostCreateHandler);
381
+ app.delete("/ghosts/:id", securityGate, ghostDeleteHandler);
382
+ app.post("/ghosts/start", securityGate, ghostStartHandler);
383
+ app.post("/ghosts/stop", securityGate, ghostStopHandler);
384
+ app.all("/mtd", mtdHandler);
385
+ // Tarpit Monitor API
386
+ app.get("/blackhole", securityGate, blackholeListHandler);
387
+ app.post("/blackhole", securityGate, blackholeAddHandler);
388
+ app.post("/blackhole/release", securityGate, blackholeReleaseHandler);
389
+ app.get("/tarpit", securityGate, tarpitListHandler);
390
+ app.post("/tarpit/trap", securityGate, tarpitTrapHandler);
391
+ app.post("/tarpit/release", securityGate, tarpitReleaseHandler);
392
+ app.get("/admin/persistence/health", securityGate, (_req, res) => {
393
+ res.json(getPersistenceHealth());
394
+ });
395
+ // Deception History API
396
+ app.get("/deception/history", deceptionHistoryHandler);
397
+ app.delete("/deception/history", deceptionClearHandler);
398
+ // The Victim (Vulnerable App)
399
+ app.use("/victim", victimRouter);
400
+ // Proxy / SSRF Test
401
+ app.all("/proxy", proxyHandler);
402
+ // AI Chat API
403
+ app.post("/api/ai/chat", async (req, res) => {
404
+ try {
405
+ const { sessionId, system, message } = req.body;
406
+ const response = await chat(sessionId || "default", system || "You are a helpful assistant.", message);
407
+ res.json({ response });
408
+ }
409
+ catch (err) {
410
+ logger.error({ error: err.message }, "AI Chat Error");
411
+ res.status(500).json({ error: err.message });
412
+ }
413
+ });
414
+ // Lab Integration Endpoints
415
+ app.get("/api/lab/k6/scenarios", securityGate, async (_req, res) => {
416
+ try {
417
+ if (!cfg.k6ScenariosPath)
418
+ return res.json({ success: true, scenarios: [] });
419
+ const files = (await readdir(cfg.k6ScenariosPath))
420
+ .filter(f => f.endsWith('.js'))
421
+ .map(f => ({ name: f, path: f }));
422
+ res.json({ success: true, scenarios: files });
423
+ }
424
+ catch (e) {
425
+ logger.error({ error: e }, "Failed to list k6 scenarios");
426
+ res.status(500).json({ error: "Failed to list k6 scenarios" });
427
+ }
428
+ });
429
+ app.get("/api/lab/nuclei/templates", securityGate, async (_req, res) => {
430
+ try {
431
+ if (!cfg.nucleiTemplatesPath)
432
+ return res.json({ success: true, templates: [] });
433
+ const files = (await readdir(cfg.nucleiTemplatesPath))
434
+ .filter(f => f.endsWith('.yaml') || f.endsWith('.yml'))
435
+ .map(f => ({ name: f, path: f }));
436
+ res.json({ success: true, templates: files });
437
+ }
438
+ catch (e) {
439
+ logger.error({ error: e }, "Failed to list nuclei templates");
440
+ res.status(500).json({ error: "Failed to list nuclei templates" });
441
+ }
442
+ });
443
+ // Infrastructure Status Proxies
444
+ app.get("/api/infra/status", securityGate, (_req, res) => {
445
+ // Status checks are primarily configuration-based manifests
446
+ // In a real implementation, these would query the running server instances
447
+ res.json({
448
+ success: true,
449
+ servers: [
450
+ { name: "HTTP/1.1", protocol: "tcp", port: cfg.portHttp1, status: "active" },
451
+ { name: "HTTP/2 TLS", protocol: "tcp", port: cfg.portHttp2, status: "active" },
452
+ { name: "HTTP/2 Cleartext (h2c)", protocol: "tcp", port: cfg.portHttp1 + 1, status: cfg.enableH2C ? "active" : "disabled" },
453
+ { name: "gRPC", protocol: "tcp", port: cfg.portGrpc, status: "active" },
454
+ { name: "WebSocket", protocol: "ws", port: cfg.portHttp1, path: "/ws", status: "active" },
455
+ { name: "Redis Mock", protocol: "tcp", port: cfg.portRedis, status: "active" },
456
+ { name: "MQTT Broker", protocol: "tcp", port: cfg.portMqtt, status: "active" },
457
+ { name: "SMTP Receiver", protocol: "tcp", port: cfg.portSmtp, status: "active" },
458
+ { name: "Syslog Receiver", protocol: "udp", port: cfg.portSyslog, status: "active" },
459
+ { name: "Syslog Alt", protocol: "udp", port: cfg.portSyslogAlt, status: "active" },
460
+ { name: "ICAP Server", protocol: "tcp", port: cfg.portIcap, status: "active" },
461
+ { name: "TCP Echo", protocol: "tcp", port: cfg.portTcp, status: "active" },
462
+ { name: "UDP Echo", protocol: "udp", port: cfg.portUdp, status: "active" },
463
+ { name: "Bad SSL", protocol: "tcp", port: cfg.portBadSsl, status: "active" },
464
+ ]
465
+ });
466
+ });
467
+ app.get("/api/infra/imposter", async (_req, res) => {
468
+ try {
469
+ const { statusCode, body } = await request("http://127.0.0.1:16925/health");
470
+ if (statusCode === 200) {
471
+ const data = await body.json();
472
+ res.json(data);
473
+ }
474
+ else {
475
+ res.status(502).json({ status: "error", code: statusCode });
476
+ }
477
+ }
478
+ catch (e) {
479
+ res.status(502).json({ status: "down", error: e.message });
480
+ }
481
+ });
482
+ app.get("/api/infra/sidecar", async (_req, res) => {
483
+ try {
484
+ // Check sidecar by hitting its healthz which proxies to us
485
+ const { statusCode } = await request("http://127.0.0.1:8081/healthz");
486
+ if (statusCode === 200) {
487
+ res.json({ status: "ok", role: "Toxic Sidecar" });
488
+ }
489
+ else {
490
+ res.status(502).json({ status: "error", code: statusCode });
491
+ }
492
+ }
493
+ catch (e) {
494
+ res.status(502).json({ status: "down", error: e.message });
495
+ }
496
+ });
497
+ // Supply Chain Simulator
498
+ app.post("/api/simulator/supply-chain", async (req, res) => {
499
+ try {
500
+ const logs = await triggerSupplyChainAttack(req.body.target);
501
+ res.json({ logs });
502
+ }
503
+ catch (e) {
504
+ res.status(500).json({ error: e.message });
505
+ }
506
+ });
507
+ app.get("/api/simulator/dependencies", securityGate, getGraphHandler);
508
+ app.post("/api/simulator/dependencies/infect", securityGate, injectMalwareHandler);
509
+ app.post("/api/simulator/dependencies/reset", securityGate, resetGraphHandler);
510
+ // Escape Artist API
511
+ app.post("/api/escape/scan", async (req, res) => {
512
+ try {
513
+ const results = await runEscapeScan(req.body);
514
+ res.json(results);
515
+ }
516
+ catch (err) {
517
+ logger.error({ error: err.message }, "Escape Scan Error");
518
+ res.status(500).json({ error: err.message });
519
+ }
520
+ });
521
+ // Handle multipart uploads on any route
522
+ app.all("*", upload.any(), echoHandler);
523
+ return app;
524
+ }
525
+ //# sourceMappingURL=app.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ import { broadcastRequest } from "./sse-broadcast.js";
2
+ import { logger } from "./logger.js";
3
+ import { request } from "undici";
4
+ let simInterval = null;
5
+ const IPS = [
6
+ "192.168.1.10", "10.0.0.5", "172.16.0.23", "203.0.113.42", "198.51.100.12",
7
+ "45.33.1.1", "185.220.1.1", "103.253.1.1"
8
+ ];
9
+ // Ported from demo-targets attack-simulator.sh
10
+ const ATTACKS = [
11
+ { name: "sqli_classic", path: "/api/v1/users?id=1' OR '1'='1", method: "GET" },
12
+ { name: "sqli_union", path: "/api/v1/users?id=1 UNION SELECT NULL,username,password FROM users--", method: "GET" },
13
+ { name: "xss_reflected", path: "/search?q=<script>alert('XSS')</script>", method: "GET" },
14
+ { name: "xss_img", path: "/search?q=<img src=x onerror=alert(document.cookie)>", method: "GET" },
15
+ { name: "traversal_basic", path: "/files?file=../../../../etc/passwd", method: "GET" },
16
+ { name: "cmdi_shell", path: "/ping?host=127.0.0.1;cat /etc/passwd", method: "GET" },
17
+ { name: "auth_nosql", path: "/api/login", method: "POST", body: { "username": { "$ne": null }, "password": { "$ne": null } } },
18
+ { name: "biz_price_negative", path: "/api/cart/add", method: "POST", body: { "item_id": 123, "quantity": -5 } },
19
+ { name: "api_ssrf", path: "/api/fetch?url=http://169.254.169.254/latest/meta-data/", method: "GET" },
20
+ { name: "path_env", path: "/.env", method: "GET" }
21
+ ];
22
+ export function startAttackSimulation(baseUrl, intervalMs = 2000) {
23
+ if (simInterval)
24
+ return;
25
+ logger.info({ baseUrl, intervalMs }, "Starting Attack Simulation");
26
+ simInterval = setInterval(async () => {
27
+ const attack = ATTACKS[Math.floor(Math.random() * ATTACKS.length)];
28
+ const ip = IPS[Math.floor(Math.random() * IPS.length)];
29
+ const targetUrl = `${baseUrl}${attack.path}`;
30
+ try {
31
+ const start = Date.now();
32
+ const res = await request(targetUrl, {
33
+ method: attack.method,
34
+ headers: {
35
+ "X-Real-IP": ip,
36
+ "X-Forwarded-For": ip,
37
+ "User-Agent": "Mozilla/5.0 (Apparatus Attack Simulator)"
38
+ },
39
+ body: attack.body ? JSON.stringify(attack.body) : undefined
40
+ });
41
+ const duration = Date.now() - start;
42
+ // Broadcast to dashboard
43
+ broadcastRequest({
44
+ method: attack.method,
45
+ path: attack.path,
46
+ status: res.statusCode,
47
+ ip: ip,
48
+ timestamp: new Date().toISOString(),
49
+ latencyMs: duration,
50
+ attackName: attack.name
51
+ });
52
+ logger.debug({ attack: attack.name, status: res.statusCode }, "Attack Simulation: Request sent");
53
+ }
54
+ catch (error) {
55
+ logger.error({ error: error.message }, "Attack Simulation: Error");
56
+ }
57
+ }, intervalMs);
58
+ }
59
+ export function stopAttackSimulation() {
60
+ if (simInterval) {
61
+ clearInterval(simInterval);
62
+ simInterval = null;
63
+ logger.info("Attack Simulation stopped");
64
+ }
65
+ }
66
+ export function isSimulationRunning() {
67
+ return simInterval !== null;
68
+ }
69
+ //# sourceMappingURL=attack-sim.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attack-sim.js","sourceRoot":"","sources":["../src/attack-sim.ts"],"names":[],"mappings":"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"}