strix-agent 0.4.0__py3-none-any.whl → 0.6.2__py3-none-any.whl

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 (117) hide show
  1. strix/agents/StrixAgent/strix_agent.py +3 -3
  2. strix/agents/StrixAgent/system_prompt.jinja +30 -26
  3. strix/agents/base_agent.py +159 -75
  4. strix/agents/state.py +5 -2
  5. strix/config/__init__.py +12 -0
  6. strix/config/config.py +172 -0
  7. strix/interface/assets/tui_styles.tcss +195 -230
  8. strix/interface/cli.py +16 -41
  9. strix/interface/main.py +151 -74
  10. strix/interface/streaming_parser.py +119 -0
  11. strix/interface/tool_components/__init__.py +4 -0
  12. strix/interface/tool_components/agent_message_renderer.py +190 -0
  13. strix/interface/tool_components/agents_graph_renderer.py +54 -38
  14. strix/interface/tool_components/base_renderer.py +68 -36
  15. strix/interface/tool_components/browser_renderer.py +106 -91
  16. strix/interface/tool_components/file_edit_renderer.py +117 -36
  17. strix/interface/tool_components/finish_renderer.py +43 -10
  18. strix/interface/tool_components/notes_renderer.py +63 -38
  19. strix/interface/tool_components/proxy_renderer.py +133 -92
  20. strix/interface/tool_components/python_renderer.py +121 -8
  21. strix/interface/tool_components/registry.py +19 -12
  22. strix/interface/tool_components/reporting_renderer.py +196 -28
  23. strix/interface/tool_components/scan_info_renderer.py +22 -19
  24. strix/interface/tool_components/terminal_renderer.py +270 -90
  25. strix/interface/tool_components/thinking_renderer.py +8 -6
  26. strix/interface/tool_components/todo_renderer.py +225 -0
  27. strix/interface/tool_components/user_message_renderer.py +26 -19
  28. strix/interface/tool_components/web_search_renderer.py +7 -6
  29. strix/interface/tui.py +907 -262
  30. strix/interface/utils.py +236 -4
  31. strix/llm/__init__.py +6 -2
  32. strix/llm/config.py +8 -5
  33. strix/llm/dedupe.py +217 -0
  34. strix/llm/llm.py +209 -356
  35. strix/llm/memory_compressor.py +6 -5
  36. strix/llm/utils.py +17 -8
  37. strix/runtime/__init__.py +12 -3
  38. strix/runtime/docker_runtime.py +121 -202
  39. strix/runtime/tool_server.py +55 -95
  40. strix/skills/README.md +64 -0
  41. strix/skills/__init__.py +110 -0
  42. strix/{prompts → skills}/frameworks/nextjs.jinja +26 -0
  43. strix/skills/scan_modes/deep.jinja +145 -0
  44. strix/skills/scan_modes/quick.jinja +63 -0
  45. strix/skills/scan_modes/standard.jinja +91 -0
  46. strix/telemetry/README.md +38 -0
  47. strix/telemetry/__init__.py +7 -1
  48. strix/telemetry/posthog.py +137 -0
  49. strix/telemetry/tracer.py +194 -54
  50. strix/tools/__init__.py +11 -4
  51. strix/tools/agents_graph/agents_graph_actions.py +20 -21
  52. strix/tools/agents_graph/agents_graph_actions_schema.xml +8 -8
  53. strix/tools/browser/browser_actions.py +10 -6
  54. strix/tools/browser/browser_actions_schema.xml +6 -1
  55. strix/tools/browser/browser_instance.py +96 -48
  56. strix/tools/browser/tab_manager.py +121 -102
  57. strix/tools/context.py +12 -0
  58. strix/tools/executor.py +63 -4
  59. strix/tools/file_edit/file_edit_actions.py +6 -3
  60. strix/tools/file_edit/file_edit_actions_schema.xml +45 -3
  61. strix/tools/finish/finish_actions.py +80 -105
  62. strix/tools/finish/finish_actions_schema.xml +121 -14
  63. strix/tools/notes/notes_actions.py +6 -33
  64. strix/tools/notes/notes_actions_schema.xml +50 -46
  65. strix/tools/proxy/proxy_actions.py +14 -2
  66. strix/tools/proxy/proxy_actions_schema.xml +0 -1
  67. strix/tools/proxy/proxy_manager.py +28 -16
  68. strix/tools/python/python_actions.py +2 -2
  69. strix/tools/python/python_actions_schema.xml +9 -1
  70. strix/tools/python/python_instance.py +39 -37
  71. strix/tools/python/python_manager.py +43 -31
  72. strix/tools/registry.py +73 -12
  73. strix/tools/reporting/reporting_actions.py +218 -31
  74. strix/tools/reporting/reporting_actions_schema.xml +256 -8
  75. strix/tools/terminal/terminal_actions.py +2 -2
  76. strix/tools/terminal/terminal_actions_schema.xml +6 -0
  77. strix/tools/terminal/terminal_manager.py +41 -30
  78. strix/tools/thinking/thinking_actions_schema.xml +27 -25
  79. strix/tools/todo/__init__.py +18 -0
  80. strix/tools/todo/todo_actions.py +568 -0
  81. strix/tools/todo/todo_actions_schema.xml +225 -0
  82. strix/utils/__init__.py +0 -0
  83. strix/utils/resource_paths.py +13 -0
  84. {strix_agent-0.4.0.dist-info → strix_agent-0.6.2.dist-info}/METADATA +90 -65
  85. strix_agent-0.6.2.dist-info/RECORD +134 -0
  86. {strix_agent-0.4.0.dist-info → strix_agent-0.6.2.dist-info}/WHEEL +1 -1
  87. strix/llm/request_queue.py +0 -87
  88. strix/prompts/README.md +0 -64
  89. strix/prompts/__init__.py +0 -109
  90. strix_agent-0.4.0.dist-info/RECORD +0 -118
  91. /strix/{prompts → skills}/cloud/.gitkeep +0 -0
  92. /strix/{prompts → skills}/coordination/root_agent.jinja +0 -0
  93. /strix/{prompts → skills}/custom/.gitkeep +0 -0
  94. /strix/{prompts → skills}/frameworks/fastapi.jinja +0 -0
  95. /strix/{prompts → skills}/protocols/graphql.jinja +0 -0
  96. /strix/{prompts → skills}/reconnaissance/.gitkeep +0 -0
  97. /strix/{prompts → skills}/technologies/firebase_firestore.jinja +0 -0
  98. /strix/{prompts → skills}/technologies/supabase.jinja +0 -0
  99. /strix/{prompts → skills}/vulnerabilities/authentication_jwt.jinja +0 -0
  100. /strix/{prompts → skills}/vulnerabilities/broken_function_level_authorization.jinja +0 -0
  101. /strix/{prompts → skills}/vulnerabilities/business_logic.jinja +0 -0
  102. /strix/{prompts → skills}/vulnerabilities/csrf.jinja +0 -0
  103. /strix/{prompts → skills}/vulnerabilities/idor.jinja +0 -0
  104. /strix/{prompts → skills}/vulnerabilities/information_disclosure.jinja +0 -0
  105. /strix/{prompts → skills}/vulnerabilities/insecure_file_uploads.jinja +0 -0
  106. /strix/{prompts → skills}/vulnerabilities/mass_assignment.jinja +0 -0
  107. /strix/{prompts → skills}/vulnerabilities/open_redirect.jinja +0 -0
  108. /strix/{prompts → skills}/vulnerabilities/path_traversal_lfi_rfi.jinja +0 -0
  109. /strix/{prompts → skills}/vulnerabilities/race_conditions.jinja +0 -0
  110. /strix/{prompts → skills}/vulnerabilities/rce.jinja +0 -0
  111. /strix/{prompts → skills}/vulnerabilities/sql_injection.jinja +0 -0
  112. /strix/{prompts → skills}/vulnerabilities/ssrf.jinja +0 -0
  113. /strix/{prompts → skills}/vulnerabilities/subdomain_takeover.jinja +0 -0
  114. /strix/{prompts → skills}/vulnerabilities/xss.jinja +0 -0
  115. /strix/{prompts → skills}/vulnerabilities/xxe.jinja +0 -0
  116. {strix_agent-0.4.0.dist-info → strix_agent-0.6.2.dist-info}/entry_points.txt +0 -0
  117. {strix_agent-0.4.0.dist-info → strix_agent-0.6.2.dist-info/licenses}/LICENSE +0 -0
@@ -1,13 +1,14 @@
1
1
  Screen {
2
- background: #1a1a1a;
2
+ background: #000000;
3
3
  color: #d4d4d4;
4
4
  }
5
5
 
6
6
  #splash_screen {
7
7
  height: 100%;
8
8
  width: 100%;
9
- background: #1a1a1a;
9
+ background: #000000;
10
10
  color: #22c55e;
11
+ align: center middle;
11
12
  content-align: center middle;
12
13
  text-align: center;
13
14
  }
@@ -17,6 +18,7 @@ Screen {
17
18
  height: auto;
18
19
  background: transparent;
19
20
  text-align: center;
21
+ content-align: center middle;
20
22
  padding: 2;
21
23
  }
22
24
 
@@ -24,7 +26,7 @@ Screen {
24
26
  height: 100%;
25
27
  padding: 0;
26
28
  margin: 0;
27
- background: #1a1a1a;
29
+ background: #000000;
28
30
  }
29
31
 
30
32
  #content_container {
@@ -39,10 +41,14 @@ Screen {
39
41
  margin-left: 1;
40
42
  }
41
43
 
44
+ #sidebar.-hidden {
45
+ display: none;
46
+ }
47
+
42
48
  #agents_tree {
43
49
  height: 1fr;
44
50
  background: transparent;
45
- border: round #262626;
51
+ border: round #333333;
46
52
  border-title-color: #a8a29e;
47
53
  border-title-style: bold;
48
54
  padding: 1;
@@ -57,21 +63,135 @@ Screen {
57
63
  margin: 0;
58
64
  }
59
65
 
66
+ #vulnerabilities_panel {
67
+ height: auto;
68
+ max-height: 12;
69
+ background: transparent;
70
+ padding: 0;
71
+ margin: 0;
72
+ border: round #333333;
73
+ overflow-y: auto;
74
+ scrollbar-background: #000000;
75
+ scrollbar-color: #333333;
76
+ scrollbar-corner-color: #000000;
77
+ scrollbar-size-vertical: 1;
78
+ }
79
+
80
+ #vulnerabilities_panel.hidden {
81
+ display: none;
82
+ }
83
+
84
+ .vuln-item {
85
+ height: auto;
86
+ width: 100%;
87
+ padding: 0 1;
88
+ background: transparent;
89
+ color: #d4d4d4;
90
+ }
91
+
92
+ .vuln-item:hover {
93
+ background: #1a1a1a;
94
+ color: #fafaf9;
95
+ }
96
+
97
+ VulnerabilityDetailScreen {
98
+ align: center middle;
99
+ background: #000000 80%;
100
+ }
101
+
102
+ #vuln_detail_dialog {
103
+ grid-size: 1;
104
+ grid-gutter: 1;
105
+ grid-rows: 1fr auto;
106
+ padding: 2 3;
107
+ width: 85%;
108
+ max-width: 110;
109
+ height: 85%;
110
+ max-height: 45;
111
+ border: solid #262626;
112
+ background: #0a0a0a;
113
+ }
114
+
115
+ #vuln_detail_scroll {
116
+ height: 1fr;
117
+ background: transparent;
118
+ scrollbar-background: #0a0a0a;
119
+ scrollbar-color: #404040;
120
+ scrollbar-corner-color: #0a0a0a;
121
+ scrollbar-size: 1 1;
122
+ padding-right: 1;
123
+ }
124
+
125
+ #vuln_detail_content {
126
+ width: 100%;
127
+ background: transparent;
128
+ padding: 0;
129
+ }
130
+
131
+ #vuln_detail_buttons {
132
+ width: 100%;
133
+ height: auto;
134
+ align: right middle;
135
+ padding-top: 1;
136
+ margin: 0;
137
+ border-top: solid #1a1a1a;
138
+ }
139
+
140
+ #copy_vuln_detail {
141
+ width: auto;
142
+ min-width: 12;
143
+ height: auto;
144
+ background: transparent;
145
+ color: #525252;
146
+ border: none;
147
+ text-style: none;
148
+ margin: 0 1;
149
+ padding: 0 2;
150
+ }
151
+
152
+ #close_vuln_detail {
153
+ width: auto;
154
+ min-width: 10;
155
+ height: auto;
156
+ background: transparent;
157
+ color: #a3a3a3;
158
+ border: none;
159
+ text-style: none;
160
+ margin: 0;
161
+ padding: 0 2;
162
+ }
163
+
164
+ #copy_vuln_detail:hover, #copy_vuln_detail:focus {
165
+ background: transparent;
166
+ color: #22c55e;
167
+ border: none;
168
+ }
169
+
170
+ #close_vuln_detail:hover, #close_vuln_detail:focus {
171
+ background: transparent;
172
+ color: #ffffff;
173
+ border: none;
174
+ }
175
+
60
176
  #chat_area_container {
61
177
  width: 75%;
62
178
  background: transparent;
63
179
  }
64
180
 
181
+ #chat_area_container.-full-width {
182
+ width: 100%;
183
+ }
184
+
65
185
  #chat_history {
66
186
  height: 1fr;
67
187
  background: transparent;
68
- border: round #1a1a1a;
188
+ border: round #0a0a0a;
69
189
  padding: 0;
70
190
  margin-bottom: 0;
71
191
  margin-right: 0;
72
- scrollbar-background: #0f0f0f;
73
- scrollbar-color: #262626;
74
- scrollbar-corner-color: #0f0f0f;
192
+ scrollbar-background: #000000;
193
+ scrollbar-color: #1a1a1a;
194
+ scrollbar-corner-color: #000000;
75
195
  scrollbar-size: 1 1;
76
196
  }
77
197
 
@@ -93,7 +213,7 @@ Screen {
93
213
  color: #a3a3a3;
94
214
  text-align: left;
95
215
  content-align: left middle;
96
- text-style: italic;
216
+ text-style: none;
97
217
  margin: 0;
98
218
  padding: 0;
99
219
  }
@@ -113,11 +233,11 @@ Screen {
113
233
  #chat_input_container {
114
234
  height: 3;
115
235
  background: transparent;
116
- border: round #525252;
236
+ border: round #333333;
117
237
  margin-right: 0;
118
238
  padding: 0;
119
239
  layout: horizontal;
120
- align-vertical: middle;
240
+ align-vertical: top;
121
241
  }
122
242
 
123
243
  #chat_input_container:focus-within {
@@ -134,7 +254,7 @@ Screen {
134
254
  height: 100%;
135
255
  padding: 0 0 0 1;
136
256
  color: #737373;
137
- content-align-vertical: middle;
257
+ content-align-vertical: top;
138
258
  }
139
259
 
140
260
  #chat_history:focus {
@@ -144,7 +264,7 @@ Screen {
144
264
  #chat_input {
145
265
  width: 1fr;
146
266
  height: 100%;
147
- background: #121212;
267
+ background: transparent;
148
268
  border: none;
149
269
  color: #d4d4d4;
150
270
  padding: 0;
@@ -155,6 +275,14 @@ Screen {
155
275
  border: none;
156
276
  }
157
277
 
278
+ #chat_input .text-area--cursor-line {
279
+ background: transparent;
280
+ }
281
+
282
+ #chat_input:focus .text-area--cursor-line {
283
+ background: transparent;
284
+ }
285
+
158
286
  #chat_input > .text-area--placeholder {
159
287
  color: #525252;
160
288
  text-style: italic;
@@ -198,39 +326,31 @@ Screen {
198
326
  }
199
327
 
200
328
  .tool-call {
201
- margin: 0 !important;
202
- margin-top: 0 !important;
203
- margin-bottom: 0 !important;
329
+ margin-top: 1;
330
+ margin-bottom: 0;
204
331
  padding: 0 1;
205
- background: #0a0a0a;
206
- border: round #1a1a1a;
207
- border-left: thick #f59e0b;
332
+ background: transparent;
333
+ border: none;
208
334
  width: 100%;
209
335
  }
210
336
 
211
337
  .tool-call.status-completed {
212
- border-left: thick #22c55e;
213
- background: #0d1f12;
214
- margin: 0 !important;
215
- margin-top: 0 !important;
216
- margin-bottom: 0 !important;
338
+ background: transparent;
339
+ margin-top: 1;
340
+ margin-bottom: 0;
217
341
  }
218
342
 
219
343
  .tool-call.status-running {
220
- border-left: thick #f59e0b;
221
- background: #1f1611;
222
- margin: 0 !important;
223
- margin-top: 0 !important;
224
- margin-bottom: 0 !important;
344
+ background: transparent;
345
+ margin-top: 1;
346
+ margin-bottom: 0;
225
347
  }
226
348
 
227
349
  .tool-call.status-failed,
228
350
  .tool-call.status-error {
229
- border-left: thick #ef4444;
230
- background: #1f0d0d;
231
- margin: 0 !important;
232
- margin-top: 0 !important;
233
- margin-bottom: 0 !important;
351
+ background: transparent;
352
+ margin-top: 1;
353
+ margin-bottom: 0;
234
354
  }
235
355
 
236
356
  .browser-tool,
@@ -242,209 +362,54 @@ Screen {
242
362
  .notes-tool,
243
363
  .thinking-tool,
244
364
  .web-search-tool,
245
- .finish-tool,
246
- .reporting-tool,
247
365
  .scan-info-tool,
248
366
  .subagent-info-tool {
249
- margin: 0 !important;
250
- margin-top: 0 !important;
251
- margin-bottom: 0 !important;
252
- }
253
-
254
- .browser-tool {
255
- border-left: thick #06b6d4;
256
- }
257
-
258
- .browser-tool.status-completed {
259
- border-left: thick #06b6d4;
260
- background: transparent;
261
- margin: 0 !important;
262
- margin-top: 0 !important;
263
- margin-bottom: 0 !important;
264
- }
265
-
266
- .browser-tool.status-running {
267
- border-left: thick #0891b2;
268
- background: transparent;
269
- margin: 0 !important;
270
- margin-top: 0 !important;
271
- margin-bottom: 0 !important;
272
- }
273
-
274
- .terminal-tool {
275
- border-left: thick #22c55e;
276
- }
277
-
278
- .terminal-tool.status-completed {
279
- border-left: thick #22c55e;
280
- background: transparent;
281
- }
282
-
283
- .terminal-tool.status-running {
284
- border-left: thick #16a34a;
285
- background: transparent;
286
- }
287
-
288
- .python-tool {
289
- border-left: thick #3b82f6;
290
- }
291
-
292
- .python-tool.status-completed {
293
- border-left: thick #3b82f6;
294
- background: transparent;
295
- }
296
-
297
- .python-tool.status-running {
298
- border-left: thick #2563eb;
299
- background: transparent;
300
- }
301
-
302
- .agents-graph-tool {
303
- border-left: thick #fbbf24;
304
- }
305
-
306
- .agents-graph-tool.status-completed {
307
- border-left: thick #fbbf24;
308
- background: transparent;
309
- }
310
-
311
- .agents-graph-tool.status-running {
312
- border-left: thick #f59e0b;
313
- background: transparent;
314
- }
315
-
316
- .file-edit-tool {
317
- border-left: thick #10b981;
318
- }
319
-
320
- .file-edit-tool.status-completed {
321
- border-left: thick #10b981;
322
- background: transparent;
323
- }
324
-
325
- .file-edit-tool.status-running {
326
- border-left: thick #059669;
327
- background: transparent;
328
- }
329
-
330
- .proxy-tool {
331
- border-left: thick #06b6d4;
332
- }
333
-
334
- .proxy-tool.status-completed {
335
- border-left: thick #06b6d4;
336
- background: transparent;
337
- }
338
-
339
- .proxy-tool.status-running {
340
- border-left: thick #0891b2;
341
- background: transparent;
342
- }
343
-
344
- .notes-tool {
345
- border-left: thick #fbbf24;
346
- }
347
-
348
- .notes-tool.status-completed {
349
- border-left: thick #fbbf24;
350
- background: transparent;
351
- }
352
-
353
- .notes-tool.status-running {
354
- border-left: thick #f59e0b;
355
- background: transparent;
356
- }
357
-
358
- .thinking-tool {
359
- border-left: thick #a855f7;
360
- }
361
-
362
- .thinking-tool.status-completed {
363
- border-left: thick #a855f7;
364
- background: transparent;
365
- }
366
-
367
- .thinking-tool.status-running {
368
- border-left: thick #9333ea;
369
- background: transparent;
370
- }
371
-
372
- .web-search-tool {
373
- border-left: thick #22c55e;
374
- }
375
-
376
- .web-search-tool.status-completed {
377
- border-left: thick #22c55e;
378
- background: transparent;
379
- }
380
-
381
- .web-search-tool.status-running {
382
- border-left: thick #16a34a;
383
- background: transparent;
384
- }
385
-
386
- .finish-tool {
387
- border-left: thick #dc2626;
388
- }
389
-
390
- .finish-tool.status-completed {
391
- border-left: thick #dc2626;
392
- background: transparent;
393
- }
394
-
395
- .finish-tool.status-running {
396
- border-left: thick #b91c1c;
367
+ margin-top: 1;
368
+ margin-bottom: 0;
397
369
  background: transparent;
398
370
  }
399
371
 
372
+ .finish-tool,
400
373
  .reporting-tool {
401
- border-left: thick #ea580c;
402
- }
403
-
404
- .reporting-tool.status-completed {
405
- border-left: thick #ea580c;
406
- background: transparent;
407
- }
408
-
409
- .reporting-tool.status-running {
410
- border-left: thick #c2410c;
411
- background: transparent;
412
- }
413
-
414
- .scan-info-tool {
415
- border-left: thick #22c55e;
416
- background: transparent;
417
- margin: 0 !important;
418
- margin-top: 0 !important;
419
- margin-bottom: 0 !important;
420
- }
421
-
422
- .scan-info-tool.status-completed {
423
- border-left: thick #22c55e;
424
- background: transparent;
425
- }
426
-
427
- .scan-info-tool.status-running {
428
- border-left: thick #16a34a;
374
+ margin-top: 1;
375
+ margin-bottom: 0;
429
376
  background: transparent;
430
377
  }
431
378
 
432
- .subagent-info-tool {
433
- border-left: thick #22c55e;
434
- background: transparent;
435
- margin: 0 !important;
436
- margin-top: 0 !important;
437
- margin-bottom: 0 !important;
438
- }
439
-
440
- .subagent-info-tool.status-completed {
441
- border-left: thick #22c55e;
379
+ .browser-tool.status-completed,
380
+ .browser-tool.status-running,
381
+ .terminal-tool.status-completed,
382
+ .terminal-tool.status-running,
383
+ .python-tool.status-completed,
384
+ .python-tool.status-running,
385
+ .agents-graph-tool.status-completed,
386
+ .agents-graph-tool.status-running,
387
+ .file-edit-tool.status-completed,
388
+ .file-edit-tool.status-running,
389
+ .proxy-tool.status-completed,
390
+ .proxy-tool.status-running,
391
+ .notes-tool.status-completed,
392
+ .notes-tool.status-running,
393
+ .thinking-tool.status-completed,
394
+ .thinking-tool.status-running,
395
+ .web-search-tool.status-completed,
396
+ .web-search-tool.status-running,
397
+ .scan-info-tool.status-completed,
398
+ .scan-info-tool.status-running,
399
+ .subagent-info-tool.status-completed,
400
+ .subagent-info-tool.status-running {
442
401
  background: transparent;
402
+ margin-top: 1;
403
+ margin-bottom: 0;
443
404
  }
444
405
 
445
- .subagent-info-tool.status-running {
446
- border-left: thick #16a34a;
406
+ .finish-tool.status-completed,
407
+ .finish-tool.status-running,
408
+ .reporting-tool.status-completed,
409
+ .reporting-tool.status-running {
447
410
  background: transparent;
411
+ margin-top: 1;
412
+ margin-bottom: 0;
448
413
  }
449
414
 
450
415
  Tree {
@@ -462,7 +427,7 @@ Tree > .tree--label {
462
427
  background: transparent;
463
428
  padding: 0 1;
464
429
  margin-bottom: 1;
465
- border-bottom: solid #262626;
430
+ border-bottom: solid #1a1a1a;
466
431
  text-align: center;
467
432
  }
468
433
 
@@ -502,7 +467,7 @@ Tree > .tree--label {
502
467
  }
503
468
 
504
469
  Tree:focus {
505
- border: round #262626;
470
+ border: round #1a1a1a;
506
471
  }
507
472
 
508
473
  Tree:focus > .tree--label {
@@ -546,7 +511,7 @@ StopAgentScreen {
546
511
  width: 30;
547
512
  height: auto;
548
513
  border: round #a3a3a3;
549
- background: #1a1a1a 98%;
514
+ background: #000000 98%;
550
515
  }
551
516
 
552
517
  #stop_agent_title {
@@ -608,8 +573,8 @@ QuitScreen {
608
573
  padding: 1;
609
574
  width: 24;
610
575
  height: auto;
611
- border: round #525252;
612
- background: #1a1a1a 98%;
576
+ border: round #333333;
577
+ background: #000000 98%;
613
578
  }
614
579
 
615
580
  #quit_title {
@@ -672,7 +637,7 @@ HelpScreen {
672
637
  width: 40;
673
638
  height: auto;
674
639
  border: round #22c55e;
675
- background: #1a1a1a 98%;
640
+ background: #000000 98%;
676
641
  }
677
642
 
678
643
  #help_title {
strix/interface/cli.py CHANGED
@@ -14,7 +14,10 @@ from strix.agents.StrixAgent import StrixAgent
14
14
  from strix.llm.config import LLMConfig
15
15
  from strix.telemetry.tracer import Tracer, set_global_tracer
16
16
 
17
- from .utils import build_final_stats_text, build_live_stats_text, get_severity_color
17
+ from .utils import (
18
+ build_live_stats_text,
19
+ format_vulnerability_report,
20
+ )
18
21
 
19
22
 
20
23
  async def run_cli(args: Any) -> None: # noqa: PLR0915
@@ -66,6 +69,8 @@ async def run_cli(args: Any) -> None: # noqa: PLR0915
66
69
  console.print(startup_panel)
67
70
  console.print()
68
71
 
72
+ scan_mode = getattr(args, "scan_mode", "deep")
73
+
69
74
  scan_config = {
70
75
  "scan_id": args.run_name,
71
76
  "targets": args.targets_info,
@@ -73,7 +78,7 @@ async def run_cli(args: Any) -> None: # noqa: PLR0915
73
78
  "run_name": args.run_name,
74
79
  }
75
80
 
76
- llm_config = LLMConfig()
81
+ llm_config = LLMConfig(scan_mode=scan_mode)
77
82
  agent_config = {
78
83
  "llm_config": llm_config,
79
84
  "max_iterations": 300,
@@ -86,28 +91,14 @@ async def run_cli(args: Any) -> None: # noqa: PLR0915
86
91
  tracer = Tracer(args.run_name)
87
92
  tracer.set_scan_config(scan_config)
88
93
 
89
- def display_vulnerability(report_id: str, title: str, content: str, severity: str) -> None:
90
- severity_color = get_severity_color(severity.lower())
91
-
92
- vuln_text = Text()
93
- vuln_text.append("🐞 ", style="bold red")
94
- vuln_text.append("VULNERABILITY FOUND", style="bold red")
95
- vuln_text.append(" • ", style="dim white")
96
- vuln_text.append(title, style="bold white")
94
+ def display_vulnerability(report: dict[str, Any]) -> None:
95
+ report_id = report.get("id", "unknown")
97
96
 
98
- severity_text = Text()
99
- severity_text.append("Severity: ", style="dim white")
100
- severity_text.append(severity.upper(), style=f"bold {severity_color}")
97
+ vuln_text = format_vulnerability_report(report)
101
98
 
102
99
  vuln_panel = Panel(
103
- Text.assemble(
104
- vuln_text,
105
- "\n\n",
106
- severity_text,
107
- "\n\n",
108
- content,
109
- ),
110
- title=f"[bold red]🔍 {report_id.upper()}",
100
+ vuln_text,
101
+ title=f"[bold red]{report_id.upper()}",
111
102
  title_align="left",
112
103
  border_style="red",
113
104
  padding=(1, 2),
@@ -139,7 +130,7 @@ async def run_cli(args: Any) -> None: # noqa: PLR0915
139
130
  status_text.append("Running penetration test...", style="bold #22c55e")
140
131
  status_text.append("\n\n")
141
132
 
142
- stats_text = build_live_stats_text(tracer)
133
+ stats_text = build_live_stats_text(tracer, agent_config)
143
134
  if stats_text:
144
135
  status_text.append(stats_text)
145
136
 
@@ -176,8 +167,11 @@ async def run_cli(args: Any) -> None: # noqa: PLR0915
176
167
 
177
168
  if isinstance(result, dict) and not result.get("success", True):
178
169
  error_msg = result.get("error", "Unknown error")
170
+ error_details = result.get("details")
179
171
  console.print()
180
172
  console.print(f"[bold red]❌ Penetration test failed:[/] {error_msg}")
173
+ if error_details:
174
+ console.print(f"[dim]{error_details}[/]")
181
175
  console.print()
182
176
  sys.exit(1)
183
177
  finally:
@@ -188,25 +182,6 @@ async def run_cli(args: Any) -> None: # noqa: PLR0915
188
182
  console.print(f"[bold red]Error during penetration test:[/] {e}")
189
183
  raise
190
184
 
191
- console.print()
192
- final_stats_text = Text()
193
- final_stats_text.append("📊 ", style="bold cyan")
194
- final_stats_text.append("PENETRATION TEST COMPLETED", style="bold green")
195
- final_stats_text.append("\n\n")
196
-
197
- stats_text = build_final_stats_text(tracer)
198
- if stats_text:
199
- final_stats_text.append(stats_text)
200
-
201
- final_stats_panel = Panel(
202
- final_stats_text,
203
- title="[bold green]✅ Final Statistics",
204
- title_align="center",
205
- border_style="green",
206
- padding=(1, 2),
207
- )
208
- console.print(final_stats_panel)
209
-
210
185
  if tracer.final_scan_result:
211
186
  console.print()
212
187