@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
@@ -0,0 +1,205 @@
1
+ import { logger } from "./logger.js";
2
+ import path from "path";
3
+ import { fileURLToPath } from 'url';
4
+ import { chat } from "./ai/client.js";
5
+ import { PERSONAS } from "./ai/personas.js";
6
+ import { broadcastDeception } from "./sse-broadcast.js";
7
+ import { cfg } from "./config.js";
8
+ import { loadDeceptionHistory, writeDeceptionHistory } from "./persistence/deception-history.js";
9
+ import { markPersistenceHydrated, markPersistenceWrite, registerPersistenceStore } from "./persistence/status.js";
10
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
11
+ const deceptionHistory = [];
12
+ const MAX_HISTORY = 100;
13
+ let deceptionHistoryHydrationPromise = null;
14
+ let deceptionHistoryPersistQueue = Promise.resolve(true);
15
+ const DECEPTION_STORE_KEY = "deceptionHistory";
16
+ registerPersistenceStore(DECEPTION_STORE_KEY, cfg.deceptionHistoryPath);
17
+ function normalizeDeceptionEvent(event) {
18
+ if (typeof event.timestamp !== "string")
19
+ return null;
20
+ if (typeof event.ip !== "string")
21
+ return null;
22
+ if (event.type !== "honeypot_hit" && event.type !== "shell_command" && event.type !== "sqli_probe")
23
+ return null;
24
+ if (typeof event.route !== "string")
25
+ return null;
26
+ if (typeof event.sessionId !== "undefined" && typeof event.sessionId !== "string")
27
+ return null;
28
+ return event;
29
+ }
30
+ async function hydrateDeceptionHistory() {
31
+ const persistedEvents = await loadDeceptionHistory(cfg.deceptionHistoryPath);
32
+ const normalizedEvents = persistedEvents
33
+ .map((event) => normalizeDeceptionEvent(event))
34
+ .filter((event) => event !== null)
35
+ .slice(0, MAX_HISTORY);
36
+ if (normalizedEvents.length > 0) {
37
+ deceptionHistory.splice(0, deceptionHistory.length, ...normalizedEvents);
38
+ }
39
+ markPersistenceHydrated(DECEPTION_STORE_KEY);
40
+ }
41
+ async function ensureDeceptionHistoryHydrated() {
42
+ if (!deceptionHistoryHydrationPromise) {
43
+ deceptionHistoryHydrationPromise = hydrateDeceptionHistory();
44
+ }
45
+ await deceptionHistoryHydrationPromise;
46
+ }
47
+ async function persistDeceptionHistoryQueued() {
48
+ deceptionHistoryPersistQueue = deceptionHistoryPersistQueue.then(() => writeDeceptionHistory(cfg.deceptionHistoryPath, deceptionHistory.slice(0, MAX_HISTORY)), () => writeDeceptionHistory(cfg.deceptionHistoryPath, deceptionHistory.slice(0, MAX_HISTORY)));
49
+ const persisted = await deceptionHistoryPersistQueue;
50
+ markPersistenceWrite(DECEPTION_STORE_KEY, persisted);
51
+ return persisted;
52
+ }
53
+ function recordDeception(event) {
54
+ deceptionHistory.unshift(event);
55
+ if (deceptionHistory.length > MAX_HISTORY) {
56
+ deceptionHistory.length = MAX_HISTORY;
57
+ }
58
+ // Broadcast to SSE clients
59
+ broadcastDeception(event);
60
+ void persistDeceptionHistoryQueued().then((persisted) => {
61
+ if (!persisted) {
62
+ logger.warn({ route: event.route, type: event.type }, "Deception event stored in memory but persistence write failed");
63
+ }
64
+ });
65
+ }
66
+ export async function deceptionHistoryHandler(_req, res) {
67
+ await ensureDeceptionHistoryHydrated();
68
+ res.json({
69
+ count: deceptionHistory.length,
70
+ events: deceptionHistory
71
+ });
72
+ }
73
+ export async function deceptionClearHandler(_req, res) {
74
+ await ensureDeceptionHistoryHydrated();
75
+ const count = deceptionHistory.length;
76
+ deceptionHistory.length = 0;
77
+ const persisted = await persistDeceptionHistoryQueued();
78
+ if (!persisted) {
79
+ logger.warn("Deception history cleared in memory but persistence write failed");
80
+ }
81
+ res.json({ status: "cleared", count });
82
+ }
83
+ const DECEPTION_ROUTES = {
84
+ "/admin": (req, res) => {
85
+ const ip = req.ip || "unknown";
86
+ recordDeception({
87
+ timestamp: new Date().toISOString(),
88
+ ip,
89
+ type: 'honeypot_hit',
90
+ route: '/admin',
91
+ details: { method: req.method }
92
+ });
93
+ res.setHeader("Content-Type", "text/html");
94
+ res.send(`
95
+ <html>
96
+ <head><title>Admin Login</title></head>
97
+ <body style="font-family: sans-serif; padding: 50px;">
98
+ <h2>System Management Console</h2>
99
+ <form method="POST" action="/console/login">
100
+ <label>Username:</label><br><input type="text" name="user"><br>
101
+ <label>Password:</label><br><input type="password" name="pass"><br><br>
102
+ <button type="submit">Login</button>
103
+ </form>
104
+ </body>
105
+ </html>
106
+ `);
107
+ },
108
+ "/console/login": (req, res) => {
109
+ // Always allow login to trap them in the shell
110
+ res.redirect("/console");
111
+ },
112
+ "/console": (req, res) => {
113
+ res.sendFile(path.join(__dirname, "terminal.html"));
114
+ },
115
+ "/phpmyadmin": (req, res) => {
116
+ const ip = req.ip || "unknown";
117
+ recordDeception({
118
+ timestamp: new Date().toISOString(),
119
+ ip,
120
+ type: 'honeypot_hit',
121
+ route: '/phpmyadmin',
122
+ details: { method: req.method }
123
+ });
124
+ res.status(200).send("phpMyAdmin - Error: Authentication required.");
125
+ },
126
+ "/.env": (req, res) => {
127
+ const ip = req.ip || "unknown";
128
+ recordDeception({
129
+ timestamp: new Date().toISOString(),
130
+ ip,
131
+ type: 'honeypot_hit',
132
+ route: '/.env',
133
+ details: { method: req.method, severity: 'critical' }
134
+ });
135
+ res.send("APP_ENV=production\nDB_HOST=10.0.0.5\nDB_USER=root\nDB_PASS=REDACTED_BY_SEC_POLICY\nJWT_SECRET=super-secret-key-123");
136
+ },
137
+ "/etc/passwd": (req, res) => {
138
+ const ip = req.ip || "unknown";
139
+ recordDeception({
140
+ timestamp: new Date().toISOString(),
141
+ ip,
142
+ type: 'honeypot_hit',
143
+ route: '/etc/passwd',
144
+ details: { method: req.method, severity: 'critical' }
145
+ });
146
+ res.send("root:x:0:0:root:/root:/bin/bash\nbin:x:1:1:bin:/bin:/sbin/nologin\ndaemon:x:2:2:daemon:/sbin:/sbin/nologin\nadm:x:3:4:adm:/var/adm:/sbin/nologin\nlp:x:4:7:lp:/var/spool/lpd:/sbin/nologin");
147
+ }
148
+ };
149
+ const DECEPTION_BYPASS_PREFIXES = ["/admin/persistence/"];
150
+ export async function deceptionHandler(req, res) {
151
+ await ensureDeceptionHistoryHydrated();
152
+ const requestPath = req.path;
153
+ if (DECEPTION_BYPASS_PREFIXES.some((prefix) => requestPath.startsWith(prefix))) {
154
+ return false;
155
+ }
156
+ // AI Console API
157
+ if (requestPath === "/console/api" && req.method === "POST") {
158
+ const { command, sessionId } = req.body;
159
+ const ip = req.ip || "unknown";
160
+ logger.info({ ip, command, sessionId }, "AI Honeypot: Executing command");
161
+ // Record shell command
162
+ recordDeception({
163
+ timestamp: new Date().toISOString(),
164
+ ip,
165
+ type: 'shell_command',
166
+ route: '/console/api',
167
+ details: { command },
168
+ sessionId
169
+ });
170
+ const output = await chat(sessionId, PERSONAS.linux_terminal, command);
171
+ res.json({ output });
172
+ return true;
173
+ }
174
+ // Check for exact matches or prefix matches for deception
175
+ for (const [route, handler] of Object.entries(DECEPTION_ROUTES)) {
176
+ if (requestPath === route || requestPath.startsWith(route + "/")) {
177
+ logger.info({ path: requestPath, ip: req.ip }, "Deception active: serving fake response");
178
+ handler(req, res);
179
+ return true;
180
+ }
181
+ }
182
+ // Generic deception for SQLi-like probes in query
183
+ if (JSON.stringify(req.query).match(/UNION|SELECT|DROP|--/i)) {
184
+ const ip = req.ip || "unknown";
185
+ logger.info({ ip }, "SQLi detected: serving fake DB schema");
186
+ recordDeception({
187
+ timestamp: new Date().toISOString(),
188
+ ip,
189
+ type: 'sqli_probe',
190
+ route: req.path,
191
+ details: { query: req.query }
192
+ });
193
+ res.json({
194
+ status: "success",
195
+ data: [
196
+ { id: 1, username: "admin", role: "superuser" },
197
+ { id: 2, username: "guest", role: "read-only" }
198
+ ],
199
+ db_version: "MySQL 8.0.32-debug"
200
+ });
201
+ return true;
202
+ }
203
+ return false;
204
+ }
205
+ //# sourceMappingURL=deception.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deception.js","sourceRoot":"","sources":["../src/deception.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AACjG,OAAO,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AAElH,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAY/D,MAAM,gBAAgB,GAAqB,EAAE,CAAC;AAC9C,MAAM,WAAW,GAAG,GAAG,CAAC;AACxB,IAAI,gCAAgC,GAAyB,IAAI,CAAC;AAClE,IAAI,4BAA4B,GAAqB,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAC3E,MAAM,mBAAmB,GAAG,kBAAkB,CAAC;AAE/C,wBAAwB,CAAC,mBAAmB,EAAE,GAAG,CAAC,oBAAoB,CAAC,CAAC;AAExE,SAAS,uBAAuB,CAAC,KAAqB;IAClD,IAAI,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACrD,IAAI,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC9C,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY;QAAE,OAAO,IAAI,CAAC;IAChH,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACjD,IAAI,OAAO,KAAK,CAAC,SAAS,KAAK,WAAW,IAAI,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC/F,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,KAAK,UAAU,uBAAuB;IAClC,MAAM,eAAe,GAAG,MAAM,oBAAoB,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IAC7E,MAAM,gBAAgB,GAAG,eAAe;SACnC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,uBAAuB,CAAC,KAAuB,CAAC,CAAC;SAChE,MAAM,CAAC,CAAC,KAAK,EAA2B,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC;SAC1D,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;IAE3B,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,gBAAgB,CAAC,MAAM,CAAC,CAAC,EAAE,gBAAgB,CAAC,MAAM,EAAE,GAAG,gBAAgB,CAAC,CAAC;IAC7E,CAAC;IACD,uBAAuB,CAAC,mBAAmB,CAAC,CAAC;AACjD,CAAC;AAED,KAAK,UAAU,8BAA8B;IACzC,IAAI,CAAC,gCAAgC,EAAE,CAAC;QACpC,gCAAgC,GAAG,uBAAuB,EAAE,CAAC;IACjE,CAAC;IACD,MAAM,gCAAgC,CAAC;AAC3C,CAAC;AAED,KAAK,UAAU,6BAA6B;IACxC,4BAA4B,GAAG,4BAA4B,CAAC,IAAI,CAC5D,GAAG,EAAE,CAAC,qBAAqB,CAAC,GAAG,CAAC,oBAAoB,EAAE,gBAAgB,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,EAC7F,GAAG,EAAE,CAAC,qBAAqB,CAAC,GAAG,CAAC,oBAAoB,EAAE,gBAAgB,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAChG,CAAC;IACF,MAAM,SAAS,GAAG,MAAM,4BAA4B,CAAC;IACrD,oBAAoB,CAAC,mBAAmB,EAAE,SAAS,CAAC,CAAC;IACrD,OAAO,SAAS,CAAC;AACrB,CAAC;AAED,SAAS,eAAe,CAAC,KAAqB;IAC1C,gBAAgB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAChC,IAAI,gBAAgB,CAAC,MAAM,GAAG,WAAW,EAAE,CAAC;QACxC,gBAAgB,CAAC,MAAM,GAAG,WAAW,CAAC;IAC1C,CAAC;IACD,2BAA2B;IAC3B,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAC1B,KAAK,6BAA6B,EAAE,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE;QACpD,IAAI,CAAC,SAAS,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,+DAA+D,CAAC,CAAC;QAC3H,CAAC;IACL,CAAC,CAAC,CAAC;AACP,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,IAAa,EAAE,GAAa;IACtE,MAAM,8BAA8B,EAAE,CAAC;IACvC,GAAG,CAAC,IAAI,CAAC;QACL,KAAK,EAAE,gBAAgB,CAAC,MAAM;QAC9B,MAAM,EAAE,gBAAgB;KAC3B,CAAC,CAAC;AACP,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,IAAa,EAAE,GAAa;IACpE,MAAM,8BAA8B,EAAE,CAAC;IACvC,MAAM,KAAK,GAAG,gBAAgB,CAAC,MAAM,CAAC;IACtC,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC;IAC5B,MAAM,SAAS,GAAG,MAAM,6BAA6B,EAAE,CAAC;IACxD,IAAI,CAAC,SAAS,EAAE,CAAC;QACb,MAAM,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAC;IACpF,CAAC;IACD,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,gBAAgB,GAA0D;IAC5E,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QACnB,MAAM,EAAE,GAAG,GAAG,CAAC,EAAE,IAAI,SAAS,CAAC;QAC/B,eAAe,CAAC;YACZ,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,EAAE;YACF,IAAI,EAAE,cAAc;YACpB,KAAK,EAAE,QAAQ;YACf,OAAO,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE;SAClC,CAAC,CAAC;QACH,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;QAC3C,GAAG,CAAC,IAAI,CAAC;;;;;;;;;;;;SAYR,CAAC,CAAC;IACP,CAAC;IACD,gBAAgB,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QAC3B,+CAA+C;QAC/C,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC7B,CAAC;IACD,UAAU,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QACrB,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC,CAAC;IACxD,CAAC;IACD,aAAa,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QACxB,MAAM,EAAE,GAAG,GAAG,CAAC,EAAE,IAAI,SAAS,CAAC;QAC/B,eAAe,CAAC;YACZ,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,EAAE;YACF,IAAI,EAAE,cAAc;YACpB,KAAK,EAAE,aAAa;YACpB,OAAO,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE;SAClC,CAAC,CAAC;QACH,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QAClB,MAAM,EAAE,GAAG,GAAG,CAAC,EAAE,IAAI,SAAS,CAAC;QAC/B,eAAe,CAAC;YACZ,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,EAAE;YACF,IAAI,EAAE,cAAc;YACpB,KAAK,EAAE,OAAO;YACd,OAAO,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE;SACxD,CAAC,CAAC;QACH,GAAG,CAAC,IAAI,CAAC,qHAAqH,CAAC,CAAC;IACpI,CAAC;IACD,aAAa,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QACxB,MAAM,EAAE,GAAG,GAAG,CAAC,EAAE,IAAI,SAAS,CAAC;QAC/B,eAAe,CAAC;YACZ,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,EAAE;YACF,IAAI,EAAE,cAAc;YACpB,KAAK,EAAE,aAAa;YACpB,OAAO,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE;SACxD,CAAC,CAAC;QACH,GAAG,CAAC,IAAI,CAAC,4LAA4L,CAAC,CAAC;IAC3M,CAAC;CACJ,CAAC;AACF,MAAM,yBAAyB,GAAG,CAAC,qBAAqB,CAAC,CAAC;AAE1D,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,GAAY,EAAE,GAAa;IAC9D,MAAM,8BAA8B,EAAE,CAAC;IACvC,MAAM,WAAW,GAAG,GAAG,CAAC,IAAI,CAAC;IAE7B,IAAI,yBAAyB,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;QAC7E,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,iBAAiB;IACjB,IAAI,WAAW,KAAK,cAAc,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAC1D,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC;QACxC,MAAM,EAAE,GAAG,GAAG,CAAC,EAAE,IAAI,SAAS,CAAC;QAC/B,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,gCAAgC,CAAC,CAAC;QAE1E,uBAAuB;QACvB,eAAe,CAAC;YACZ,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,EAAE;YACF,IAAI,EAAE,eAAe;YACrB,KAAK,EAAE,cAAc;YACrB,OAAO,EAAE,EAAE,OAAO,EAAE;YACpB,SAAS;SACZ,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;QACvE,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,0DAA0D;IAC1D,KAAK,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAC9D,IAAI,WAAW,KAAK,KAAK,IAAI,WAAW,CAAC,UAAU,CAAC,KAAK,GAAG,GAAG,CAAC,EAAE,CAAC;YAC/D,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,yCAAyC,CAAC,CAAC;YAC1F,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YAClB,OAAO,IAAI,CAAC;QAChB,CAAC;IACL,CAAC;IAED,kDAAkD;IAClD,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,uBAAuB,CAAC,EAAE,CAAC;QAC3D,MAAM,EAAE,GAAG,GAAG,CAAC,EAAE,IAAI,SAAS,CAAC;QAC/B,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,uCAAuC,CAAC,CAAC;QAC7D,eAAe,CAAC;YACZ,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,EAAE;YACF,IAAI,EAAE,YAAY;YAClB,KAAK,EAAE,GAAG,CAAC,IAAI;YACf,OAAO,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE;SAChC,CAAC,CAAC;QACH,GAAG,CAAC,IAAI,CAAC;YACL,MAAM,EAAE,SAAS;YACjB,IAAI,EAAE;gBACF,EAAE,EAAE,EAAE,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE;gBAC/C,EAAE,EAAE,EAAE,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE;aAClD;YACD,UAAU,EAAE,oBAAoB;SACnC,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,OAAO,KAAK,CAAC;AACjB,CAAC"}
@@ -0,0 +1,109 @@
1
+ import { broadcastRequest, broadcastDeception } from "./sse-broadcast.js";
2
+ import { logger } from "./logger.js";
3
+ import { cfg } from "./config.js";
4
+ let demoTimeout = null;
5
+ let currentConfig = {
6
+ intensity: 10,
7
+ errorRate: 5,
8
+ latencyBase: 50,
9
+ attackFrequency: 5,
10
+ pattern: 'steady',
11
+ targetPath: null
12
+ };
13
+ const METHODS = ["GET", "POST", "PUT", "DELETE", "PATCH"];
14
+ const PATHS = [
15
+ "/api/v1/auth", "/api/v1/users", "/dashboard/stats", "/health",
16
+ "/api/orders", "/api/payment", "/api/products", "/ws/notifications",
17
+ "/admin/login", "/.env", "/wp-login.php"
18
+ ];
19
+ const SUCCESS_STATUSES = [200, 200, 201, 204, 302];
20
+ const ERROR_STATUSES = [400, 401, 403, 404, 500, 503];
21
+ const IPS = [
22
+ "192.168.1.10", "10.0.0.5", "172.16.0.23", "203.0.113.42", "198.51.100.12",
23
+ "8.8.8.8", "1.1.1.1", "127.0.0.1"
24
+ ];
25
+ let startTime = Date.now();
26
+ function generateRandomRequest() {
27
+ const method = METHODS[Math.floor(Math.random() * METHODS.length)];
28
+ const path = currentConfig.targetPath || PATHS[Math.floor(Math.random() * PATHS.length)];
29
+ const isError = Math.random() * 100 < currentConfig.errorRate;
30
+ const status = isError
31
+ ? ERROR_STATUSES[Math.floor(Math.random() * ERROR_STATUSES.length)]
32
+ : SUCCESS_STATUSES[Math.floor(Math.random() * SUCCESS_STATUSES.length)];
33
+ const ip = IPS[Math.floor(Math.random() * IPS.length)];
34
+ const latency = currentConfig.latencyBase + Math.floor(Math.random() * 200);
35
+ return {
36
+ method,
37
+ path,
38
+ status,
39
+ ip,
40
+ timestamp: new Date().toISOString(),
41
+ latencyMs: latency,
42
+ headers: {
43
+ "user-agent": "Mozilla/5.0 (Synthetic/2.1)",
44
+ "content-type": "application/json"
45
+ }
46
+ };
47
+ }
48
+ function generateRandomDeception() {
49
+ return {
50
+ timestamp: new Date().toISOString(),
51
+ ip: IPS[Math.floor(Math.random() * IPS.length)],
52
+ type: Math.random() > 0.5 ? 'honeypot_hit' : (Math.random() > 0.5 ? 'sqli_probe' : 'shell_command'),
53
+ route: currentConfig.targetPath || PATHS[Math.floor(Math.random() * PATHS.length)],
54
+ details: {
55
+ command: "cat /etc/passwd",
56
+ query: "' OR 1=1 --",
57
+ source: "Synthetic Generator"
58
+ }
59
+ };
60
+ }
61
+ export function updateDemoConfig(config) {
62
+ currentConfig = { ...currentConfig, ...config };
63
+ logger.info({ config: currentConfig }, "Demo Mode: Configuration updated");
64
+ }
65
+ export function getDemoConfig() {
66
+ return { ...currentConfig, enabled: !!demoTimeout };
67
+ }
68
+ export function startDemoLoop() {
69
+ if (demoTimeout)
70
+ return;
71
+ startTime = Date.now();
72
+ logger.info("Demo Mode: Starting synthetic traffic generator");
73
+ const run = () => {
74
+ const req = generateRandomRequest();
75
+ broadcastRequest(req);
76
+ if (Math.random() * 100 < currentConfig.attackFrequency) {
77
+ broadcastDeception(generateRandomDeception());
78
+ }
79
+ // Calculate dynamic intensity based on pattern
80
+ let effectiveIntensity = currentConfig.intensity;
81
+ const elapsed = (Date.now() - startTime) / 1000;
82
+ if (currentConfig.pattern === 'sine') {
83
+ // Sine wave with 30s period, oscillating between 20% and 100% of set intensity
84
+ const wave = (Math.sin(elapsed * (Math.PI * 2 / 30)) + 1) / 2;
85
+ effectiveIntensity = Math.max(1, currentConfig.intensity * (0.2 + 0.8 * wave));
86
+ }
87
+ else if (currentConfig.pattern === 'spiky') {
88
+ // Occasional spikes (10% chance) that 5x the intensity
89
+ if (Math.random() < 0.1) {
90
+ effectiveIntensity = Math.min(100, currentConfig.intensity * 5);
91
+ }
92
+ }
93
+ const baseDelay = 1000 / Math.max(1, effectiveIntensity);
94
+ const nextDelay = baseDelay + (Math.random() * (baseDelay * 0.4) - (baseDelay * 0.2));
95
+ demoTimeout = setTimeout(run, Math.max(5, nextDelay));
96
+ };
97
+ run();
98
+ }
99
+ export function stopDemoLoop() {
100
+ if (demoTimeout) {
101
+ clearTimeout(demoTimeout);
102
+ demoTimeout = null;
103
+ logger.info("Demo Mode: Stopped synthetic traffic");
104
+ }
105
+ }
106
+ if (cfg.demoMode) {
107
+ startDemoLoop();
108
+ }
109
+ //# sourceMappingURL=demo-mode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"demo-mode.js","sourceRoot":"","sources":["../src/demo-mode.ts"],"names":[],"mappings":"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"}