@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,341 @@
1
+ /**
2
+ * API Client for TUI Dashboard
3
+ * Handles polling for non-SSE endpoints
4
+ */
5
+ export class ApiClient {
6
+ baseUrl;
7
+ timeout;
8
+ constructor(options) {
9
+ this.baseUrl = options.baseUrl.replace(/\/$/, '');
10
+ this.timeout = options.timeout ?? 5000;
11
+ }
12
+ /**
13
+ * Fetch with timeout
14
+ */
15
+ async fetchWithTimeout(path) {
16
+ const controller = new AbortController();
17
+ const timeoutId = setTimeout(() => controller.abort(), this.timeout);
18
+ try {
19
+ const response = await fetch(`${this.baseUrl}${path}`, {
20
+ headers: { 'Accept': 'application/json' },
21
+ signal: controller.signal,
22
+ });
23
+ if (!response.ok) {
24
+ throw new Error(`${response.status} ${response.statusText}`);
25
+ }
26
+ return response.json();
27
+ }
28
+ finally {
29
+ clearTimeout(timeoutId);
30
+ }
31
+ }
32
+ /**
33
+ * Get health status
34
+ */
35
+ async getHealth() {
36
+ return this.fetchWithTimeout('/health/pro');
37
+ }
38
+ /**
39
+ * Get tarpit status
40
+ */
41
+ async getTarpitStatus() {
42
+ return this.fetchWithTimeout('/tarpit');
43
+ }
44
+ /**
45
+ * Get deception history
46
+ */
47
+ async getDeceptionHistory() {
48
+ return this.fetchWithTimeout('/deception/history');
49
+ }
50
+ /**
51
+ * Get request history
52
+ */
53
+ async getRequestHistory() {
54
+ return this.fetchWithTimeout('/history');
55
+ }
56
+ /**
57
+ * Release a specific IP from tarpit
58
+ */
59
+ async releaseTarpitIp(ip) {
60
+ const controller = new AbortController();
61
+ const timeoutId = setTimeout(() => controller.abort(), this.timeout);
62
+ try {
63
+ const response = await fetch(`${this.baseUrl}/tarpit/release`, {
64
+ method: 'POST',
65
+ headers: {
66
+ 'Content-Type': 'application/json',
67
+ 'Accept': 'application/json',
68
+ },
69
+ body: JSON.stringify({ ip }),
70
+ signal: controller.signal,
71
+ });
72
+ if (!response.ok) {
73
+ throw new Error(`${response.status} ${response.statusText}`);
74
+ }
75
+ return response.json();
76
+ }
77
+ finally {
78
+ clearTimeout(timeoutId);
79
+ }
80
+ }
81
+ /**
82
+ * Release all IPs from tarpit
83
+ */
84
+ async releaseAllTarpit() {
85
+ const controller = new AbortController();
86
+ const timeoutId = setTimeout(() => controller.abort(), this.timeout);
87
+ try {
88
+ const response = await fetch(`${this.baseUrl}/tarpit/release`, {
89
+ method: 'POST',
90
+ headers: {
91
+ 'Content-Type': 'application/json',
92
+ 'Accept': 'application/json',
93
+ },
94
+ body: JSON.stringify({}),
95
+ signal: controller.signal,
96
+ });
97
+ if (!response.ok) {
98
+ throw new Error(`${response.status} ${response.statusText}`);
99
+ }
100
+ return response.json();
101
+ }
102
+ finally {
103
+ clearTimeout(timeoutId);
104
+ }
105
+ }
106
+ /**
107
+ * Ping the server (basic health check)
108
+ */
109
+ async ping() {
110
+ try {
111
+ const response = await fetch(`${this.baseUrl}/healthz`, {
112
+ signal: AbortSignal.timeout(2000),
113
+ });
114
+ return response.ok;
115
+ }
116
+ catch {
117
+ return false;
118
+ }
119
+ }
120
+ // ============================================
121
+ // Sentinel (Active Shield) endpoints
122
+ // ============================================
123
+ /**
124
+ * Get all Sentinel rules
125
+ */
126
+ async getSentinelRules() {
127
+ return this.fetchWithTimeout('/sentinel/rules');
128
+ }
129
+ /**
130
+ * Add a new Sentinel rule
131
+ */
132
+ async addSentinelRule(pattern, action) {
133
+ return this.postJson('/sentinel/rules', { pattern, action });
134
+ }
135
+ /**
136
+ * Delete a Sentinel rule
137
+ */
138
+ async deleteSentinelRule(id) {
139
+ return this.deleteResource(`/sentinel/rules/${id}`);
140
+ }
141
+ // ============================================
142
+ // MTD (Moving Target Defense) endpoints
143
+ // ============================================
144
+ /**
145
+ * Get MTD status
146
+ */
147
+ async getMtdStatus() {
148
+ return this.fetchWithTimeout('/mtd/status');
149
+ }
150
+ /**
151
+ * Rotate MTD prefix
152
+ */
153
+ async rotateMtdPrefix(prefix) {
154
+ return this.postJson('/mtd/rotate', prefix ? { prefix } : {});
155
+ }
156
+ // ============================================
157
+ // DLP (Data Loss Prevention) endpoints
158
+ // ============================================
159
+ /**
160
+ * Generate DLP test data
161
+ */
162
+ async generateDlpData(type) {
163
+ const path = type ? `/dlp?type=${type}` : '/dlp';
164
+ return this.fetchWithTimeout(path);
165
+ }
166
+ // ============================================
167
+ // Red Team / WAF Validation endpoints
168
+ // ============================================
169
+ /**
170
+ * Run a red team scan against a target
171
+ */
172
+ async runRedTeamScan(target, path) {
173
+ return this.postJson('/redteam/scan', { target, path });
174
+ }
175
+ // ============================================
176
+ // Chaos Engineering endpoints
177
+ // ============================================
178
+ /**
179
+ * Trigger CPU spike
180
+ */
181
+ async triggerCpuSpike(duration) {
182
+ return this.postJson('/chaos/cpu', { duration: duration ?? 5000 });
183
+ }
184
+ /**
185
+ * Trigger memory spike
186
+ */
187
+ async triggerMemorySpike(mb) {
188
+ return this.postJson('/chaos/memory', { mb: mb ?? 100 });
189
+ }
190
+ /**
191
+ * Trigger server crash
192
+ */
193
+ async triggerCrash() {
194
+ return this.postJson('/chaos/crash', {});
195
+ }
196
+ /**
197
+ * Clear allocated memory
198
+ */
199
+ async clearMemory() {
200
+ return this.postJson('/chaos/clear', {});
201
+ }
202
+ // ============================================
203
+ // Ghost Traffic endpoints
204
+ // ============================================
205
+ /**
206
+ * Start ghost traffic generation
207
+ */
208
+ async startGhostTraffic(target, delay) {
209
+ return this.postJson('/ghost/start', { target, delay: delay ?? 1000 });
210
+ }
211
+ /**
212
+ * Stop ghost traffic generation
213
+ */
214
+ async stopGhostTraffic() {
215
+ return this.postJson('/ghost/stop', {});
216
+ }
217
+ // ============================================
218
+ // Network Diagnostics endpoints
219
+ // ============================================
220
+ /**
221
+ * Perform DNS lookup
222
+ */
223
+ async dnsLookup(target, type) {
224
+ const path = `/dns?target=${encodeURIComponent(target)}${type ? `&type=${type}` : ''}`;
225
+ return this.fetchWithTimeout(path);
226
+ }
227
+ /**
228
+ * Perform TCP ping
229
+ */
230
+ async tcpPing(target) {
231
+ return this.fetchWithTimeout(`/ping?target=${encodeURIComponent(target)}`);
232
+ }
233
+ // ============================================
234
+ // Helper methods for POST/DELETE
235
+ // ============================================
236
+ /**
237
+ * POST JSON data
238
+ */
239
+ async postJson(path, data) {
240
+ const controller = new AbortController();
241
+ const timeoutId = setTimeout(() => controller.abort(), this.timeout);
242
+ try {
243
+ const response = await fetch(`${this.baseUrl}${path}`, {
244
+ method: 'POST',
245
+ headers: {
246
+ 'Content-Type': 'application/json',
247
+ 'Accept': 'application/json',
248
+ },
249
+ body: JSON.stringify(data),
250
+ signal: controller.signal,
251
+ });
252
+ if (!response.ok) {
253
+ throw new Error(`${response.status} ${response.statusText}`);
254
+ }
255
+ return response.json();
256
+ }
257
+ finally {
258
+ clearTimeout(timeoutId);
259
+ }
260
+ }
261
+ /**
262
+ * DELETE a resource
263
+ */
264
+ async deleteResource(path) {
265
+ const controller = new AbortController();
266
+ const timeoutId = setTimeout(() => controller.abort(), this.timeout);
267
+ try {
268
+ const response = await fetch(`${this.baseUrl}${path}`, {
269
+ method: 'DELETE',
270
+ headers: {
271
+ 'Accept': 'application/json',
272
+ },
273
+ signal: controller.signal,
274
+ });
275
+ if (!response.ok) {
276
+ throw new Error(`${response.status} ${response.statusText}`);
277
+ }
278
+ return response.json();
279
+ }
280
+ finally {
281
+ clearTimeout(timeoutId);
282
+ }
283
+ }
284
+ }
285
+ /**
286
+ * Poller class for periodic API calls
287
+ */
288
+ export class ApiPoller {
289
+ timers = new Map();
290
+ client;
291
+ constructor(client) {
292
+ this.client = client;
293
+ }
294
+ /**
295
+ * Start polling an endpoint
296
+ */
297
+ start(name, fetcher, interval, onData, onError) {
298
+ // Stop existing timer if any
299
+ this.stop(name);
300
+ const poll = async () => {
301
+ try {
302
+ const data = await fetcher();
303
+ onData(data);
304
+ }
305
+ catch (err) {
306
+ onError(err instanceof Error ? err : new Error(String(err)));
307
+ }
308
+ };
309
+ // Initial fetch
310
+ poll();
311
+ // Schedule periodic fetches
312
+ const timer = setInterval(poll, interval);
313
+ this.timers.set(name, timer);
314
+ }
315
+ /**
316
+ * Stop polling an endpoint
317
+ */
318
+ stop(name) {
319
+ const timer = this.timers.get(name);
320
+ if (timer) {
321
+ clearInterval(timer);
322
+ this.timers.delete(name);
323
+ }
324
+ }
325
+ /**
326
+ * Stop all polling
327
+ */
328
+ stopAll() {
329
+ this.timers.forEach((timer) => {
330
+ clearInterval(timer);
331
+ });
332
+ this.timers.clear();
333
+ }
334
+ /**
335
+ * Get the API client
336
+ */
337
+ getClient() {
338
+ return this.client;
339
+ }
340
+ }
341
+ //# sourceMappingURL=api-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/tui/api-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,302 @@
1
+ /**
2
+ * Action Handler for TUI Dashboard
3
+ *
4
+ * Executes API mutations with loading states, error handling,
5
+ * and result notifications.
6
+ */
7
+ /**
8
+ * Action Handler manages API mutations
9
+ */
10
+ export class ActionHandler {
11
+ client;
12
+ store;
13
+ modal;
14
+ actions = new Map();
15
+ refreshCallback = null;
16
+ constructor(client, store, modal) {
17
+ this.client = client;
18
+ this.store = store;
19
+ this.modal = modal;
20
+ }
21
+ /**
22
+ * Set the refresh callback
23
+ */
24
+ setRefreshCallback(callback) {
25
+ this.refreshCallback = callback;
26
+ }
27
+ /**
28
+ * Register an action
29
+ */
30
+ register(action) {
31
+ this.actions.set(action.name, action);
32
+ }
33
+ /**
34
+ * Register multiple actions
35
+ */
36
+ registerAll(actions) {
37
+ for (const action of actions) {
38
+ this.register(action);
39
+ }
40
+ }
41
+ /**
42
+ * Execute an action by name
43
+ */
44
+ async execute(name, params) {
45
+ const action = this.actions.get(name);
46
+ if (!action) {
47
+ return { success: false, error: `Unknown action: ${name}` };
48
+ }
49
+ const context = {
50
+ client: this.client,
51
+ store: this.store,
52
+ modal: this.modal,
53
+ refreshData: async () => {
54
+ if (this.refreshCallback) {
55
+ await this.refreshCallback();
56
+ }
57
+ },
58
+ };
59
+ // Show confirmation if required
60
+ if (action.confirmMessage) {
61
+ return new Promise((resolve) => {
62
+ this.modal.showConfirm({
63
+ title: action.dangerConfirm ? 'Warning' : 'Confirm',
64
+ message: action.confirmMessage,
65
+ danger: action.dangerConfirm,
66
+ }, async () => {
67
+ const result = await this.executeAction(action, params, context);
68
+ resolve(result);
69
+ }, () => {
70
+ resolve({ success: false, error: 'Cancelled by user' });
71
+ });
72
+ });
73
+ }
74
+ return this.executeAction(action, params, context);
75
+ }
76
+ /**
77
+ * Execute action with loading state
78
+ */
79
+ async executeAction(action, params, context) {
80
+ // Show loading if configured
81
+ if (action.showLoading) {
82
+ this.modal.showLoading(action.loadingMessage ?? `Executing ${action.name}...`);
83
+ }
84
+ try {
85
+ const result = await action.execute(params, context);
86
+ // Close loading
87
+ if (action.showLoading) {
88
+ this.modal.close();
89
+ }
90
+ // Call success handler
91
+ if (action.onSuccess) {
92
+ action.onSuccess(result, context);
93
+ }
94
+ return { success: true, data: result };
95
+ }
96
+ catch (error) {
97
+ // Close loading
98
+ if (action.showLoading) {
99
+ this.modal.close();
100
+ }
101
+ const errorMessage = error instanceof Error ? error.message : String(error);
102
+ // Call error handler or show default error
103
+ if (action.onError) {
104
+ action.onError(error, context);
105
+ }
106
+ else {
107
+ this.modal.showResult({
108
+ title: 'Error',
109
+ content: `Failed to execute ${action.name}:\n\n${errorMessage}`,
110
+ type: 'error',
111
+ });
112
+ }
113
+ return { success: false, error: errorMessage };
114
+ }
115
+ }
116
+ /**
117
+ * Get all registered action names
118
+ */
119
+ getActionNames() {
120
+ return Array.from(this.actions.keys());
121
+ }
122
+ }
123
+ /**
124
+ * Create common tarpit actions
125
+ */
126
+ export function createTarpitActions() {
127
+ return [
128
+ {
129
+ name: 'tarpit:release',
130
+ execute: async (params, ctx) => {
131
+ const { ip } = params;
132
+ return ctx.client.releaseTarpitIp(ip);
133
+ },
134
+ onSuccess: async (_result, ctx) => {
135
+ await ctx.refreshData();
136
+ ctx.modal.showResult({
137
+ title: 'Success',
138
+ content: 'IP released from tarpit',
139
+ type: 'success',
140
+ });
141
+ },
142
+ showLoading: true,
143
+ loadingMessage: 'Releasing IP...',
144
+ },
145
+ {
146
+ name: 'tarpit:releaseAll',
147
+ execute: async (_params, ctx) => {
148
+ return ctx.client.releaseAllTarpit();
149
+ },
150
+ onSuccess: async (result, ctx) => {
151
+ const { count } = result;
152
+ await ctx.refreshData();
153
+ ctx.modal.showResult({
154
+ title: 'Success',
155
+ content: `Released ${count} IPs from tarpit`,
156
+ type: 'success',
157
+ });
158
+ },
159
+ showLoading: true,
160
+ loadingMessage: 'Releasing all IPs...',
161
+ confirmMessage: 'Release all IPs from tarpit?',
162
+ dangerConfirm: true,
163
+ },
164
+ ];
165
+ }
166
+ /**
167
+ * Create data refresh actions
168
+ */
169
+ export function createRefreshActions() {
170
+ return [
171
+ {
172
+ name: 'refresh:health',
173
+ execute: async (_, ctx) => {
174
+ const health = await ctx.client.getHealth();
175
+ ctx.store.set('health', health);
176
+ ctx.store.set('lastUpdated', new Date());
177
+ return health;
178
+ },
179
+ },
180
+ {
181
+ name: 'refresh:tarpit',
182
+ execute: async (_, ctx) => {
183
+ const tarpit = await ctx.client.getTarpitStatus();
184
+ ctx.store.set('tarpit', tarpit);
185
+ return tarpit;
186
+ },
187
+ },
188
+ {
189
+ name: 'refresh:deception',
190
+ execute: async (_, ctx) => {
191
+ const deception = await ctx.client.getDeceptionHistory();
192
+ ctx.store.set('deception', deception);
193
+ return deception;
194
+ },
195
+ },
196
+ {
197
+ name: 'refresh:all',
198
+ execute: async (_, ctx) => {
199
+ const results = await Promise.allSettled([
200
+ ctx.client.getHealth(),
201
+ ctx.client.getTarpitStatus(),
202
+ ctx.client.getDeceptionHistory(),
203
+ ]);
204
+ if (results[0].status === 'fulfilled') {
205
+ ctx.store.set('health', results[0].value);
206
+ }
207
+ if (results[1].status === 'fulfilled') {
208
+ ctx.store.set('tarpit', results[1].value);
209
+ }
210
+ if (results[2].status === 'fulfilled') {
211
+ ctx.store.set('deception', results[2].value);
212
+ }
213
+ ctx.store.set('lastUpdated', new Date());
214
+ ctx.store.clearError();
215
+ return { refreshed: true };
216
+ },
217
+ },
218
+ ];
219
+ }
220
+ /**
221
+ * Create defense configuration actions
222
+ */
223
+ export function createDefenseActions() {
224
+ return [
225
+ {
226
+ name: 'sentinel:add',
227
+ execute: async (params, ctx) => {
228
+ const p = params;
229
+ return ctx.client.addSentinelRule(p.pattern, p.action);
230
+ },
231
+ onSuccess: async (result, ctx) => {
232
+ const r = result;
233
+ await ctx.refreshData();
234
+ ctx.modal.showResult({
235
+ title: 'Success',
236
+ content: `Rule added successfully!\n\nID: ${r.id}\nPattern: ${r.pattern}`,
237
+ type: 'success',
238
+ });
239
+ },
240
+ showLoading: true,
241
+ loadingMessage: 'Adding rule...',
242
+ },
243
+ {
244
+ name: 'sentinel:delete',
245
+ execute: async (params, ctx) => {
246
+ const p = params;
247
+ return ctx.client.deleteSentinelRule(p.id);
248
+ },
249
+ onSuccess: async (_, ctx) => {
250
+ await ctx.refreshData();
251
+ ctx.modal.showResult({
252
+ title: 'Success',
253
+ content: 'Rule deleted successfully!',
254
+ type: 'success',
255
+ });
256
+ },
257
+ showLoading: true,
258
+ loadingMessage: 'Deleting rule...',
259
+ confirmMessage: 'Are you sure you want to delete this rule?',
260
+ dangerConfirm: true,
261
+ },
262
+ {
263
+ name: 'mtd:rotate',
264
+ execute: async (params, ctx) => {
265
+ const p = params;
266
+ return ctx.client.rotateMtdPrefix(p.prefix);
267
+ },
268
+ onSuccess: async (result, ctx) => {
269
+ const r = result;
270
+ await ctx.refreshData();
271
+ ctx.modal.showResult({
272
+ title: 'Success',
273
+ content: `MTD prefix rotated!\n\nNew prefix: ${r.currentPrefix}`,
274
+ type: 'success',
275
+ });
276
+ },
277
+ showLoading: true,
278
+ loadingMessage: 'Rotating MTD prefix...',
279
+ },
280
+ {
281
+ name: 'dlp:generate',
282
+ execute: async (params, ctx) => {
283
+ const p = params;
284
+ return ctx.client.generateDlpData(p.type);
285
+ },
286
+ showLoading: true,
287
+ loadingMessage: 'Generating test data...',
288
+ },
289
+ ];
290
+ }
291
+ /**
292
+ * Create an action handler with common actions registered
293
+ */
294
+ export function createActionHandler(client, store, modal) {
295
+ const handler = new ActionHandler(client, store, modal);
296
+ // Register common actions
297
+ handler.registerAll(createTarpitActions());
298
+ handler.registerAll(createRefreshActions());
299
+ handler.registerAll(createDefenseActions());
300
+ return handler;
301
+ }
302
+ //# sourceMappingURL=action-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action-handler.js","sourceRoot":"","sources":["../../../src/tui/core/action-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Core TUI Infrastructure
3
+ *
4
+ * Exports all core abstractions for the modular TUI dashboard.
5
+ */
6
+ // State Management
7
+ export { Store, createStore, createInitialState, } from './store.js';
8
+ // Widget System
9
+ export { BaseWidget, WidgetRegistry, widgetRegistry, createBoxOptions, } from './widget.js';
10
+ // Screen Management
11
+ export { ScreenManager, ScreenBuilder, createScreen, screen, } from './screen-manager.js';
12
+ // Keyboard Management
13
+ export { KeyboardManager, BindingBuilder, binding, createNavigationBindings, createSystemBindings, createScreenBindings, CATEGORIES, } from './keyboard.js';
14
+ // Modal System
15
+ export { ModalManager, createModalManager, } from './modal.js';
16
+ // Action Handler
17
+ export { ActionHandler, createActionHandler, createTarpitActions, createRefreshActions, } from './action-handler.js';
18
+ //# sourceMappingURL=index.js.map