strix-agent 0.1.4__py3-none-any.whl → 0.1.6__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.
- strix/cli/app.py +2 -2
- strix/cli/main.py +26 -4
- strix/cli/tool_components/agents_graph_renderer.py +2 -8
- strix/cli/tool_components/finish_renderer.py +1 -2
- strix/cli/tool_components/reporting_renderer.py +1 -2
- strix/cli/tool_components/scan_info_renderer.py +1 -2
- strix/cli/tracer.py +1 -2
- strix/llm/config.py +1 -1
- strix/llm/llm.py +0 -1
- strix/llm/memory_compressor.py +1 -1
- {strix_agent-0.1.4.dist-info → strix_agent-0.1.6.dist-info}/METADATA +4 -14
- {strix_agent-0.1.4.dist-info → strix_agent-0.1.6.dist-info}/RECORD +15 -15
- {strix_agent-0.1.4.dist-info → strix_agent-0.1.6.dist-info}/LICENSE +0 -0
- {strix_agent-0.1.4.dist-info → strix_agent-0.1.6.dist-info}/WHEEL +0 -0
- {strix_agent-0.1.4.dist-info → strix_agent-0.1.6.dist-info}/entry_points.txt +0 -0
strix/cli/app.py
CHANGED
@@ -58,8 +58,8 @@ class SplashScreen(Static): # type: ignore[misc]
|
|
58
58
|
|
59
59
|
███████╗████████╗██████╗ ██╗██╗ ██╗
|
60
60
|
██╔════╝╚══██╔══╝██╔══██╗██║╚██╗██╔╝
|
61
|
-
███████╗ ██║ ██████╔╝██║ ╚███╔╝
|
62
|
-
╚════██║ ██║ ██╔══██╗██║ ██╔██╗
|
61
|
+
███████╗ ██║ ██████╔╝██║ ╚███╔╝
|
62
|
+
╚════██║ ██║ ██╔══██╗██║ ██╔██╗
|
63
63
|
███████║ ██║ ██║ ██║██║██╔╝ ██╗
|
64
64
|
╚══════╝ ╚═╝ ╚═╝ ╚═╝╚═╝╚═╝ ╚═╝
|
65
65
|
|
strix/cli/main.py
CHANGED
@@ -12,6 +12,7 @@ import sys
|
|
12
12
|
from pathlib import Path
|
13
13
|
from typing import Any
|
14
14
|
from urllib.parse import urlparse
|
15
|
+
import shutil
|
15
16
|
|
16
17
|
import docker
|
17
18
|
import litellm
|
@@ -73,7 +74,7 @@ def validate_environment() -> None:
|
|
73
74
|
error_text.append("• ", style="white")
|
74
75
|
error_text.append("STRIX_LLM", style="bold cyan")
|
75
76
|
error_text.append(
|
76
|
-
" - Model name to use with litellm (e.g., '
|
77
|
+
" - Model name to use with litellm (e.g., 'openai/gpt-5')\n",
|
77
78
|
style="white",
|
78
79
|
)
|
79
80
|
error_text.append("• ", style="white")
|
@@ -91,7 +92,7 @@ def validate_environment() -> None:
|
|
91
92
|
|
92
93
|
error_text.append("\nExample setup:\n", style="white")
|
93
94
|
error_text.append(
|
94
|
-
|
95
|
+
"export STRIX_LLM='openai/gpt-5'\n", style="dim white"
|
95
96
|
)
|
96
97
|
error_text.append("export LLM_API_KEY='your-api-key-here'\n", style="dim white")
|
97
98
|
if missing_optional_vars:
|
@@ -118,11 +119,32 @@ def _validate_llm_response(response: Any) -> None:
|
|
118
119
|
raise RuntimeError("Invalid response from LLM")
|
119
120
|
|
120
121
|
|
122
|
+
def check_docker_installed() -> None:
|
123
|
+
if shutil.which("docker") is None:
|
124
|
+
console = Console()
|
125
|
+
error_text = Text()
|
126
|
+
error_text.append("❌ ", style="bold red")
|
127
|
+
error_text.append("DOCKER NOT INSTALLED", style="bold red")
|
128
|
+
error_text.append("\n\n", style="white")
|
129
|
+
error_text.append("The 'docker' CLI was not found in your PATH.\n", style="white")
|
130
|
+
error_text.append("Please install Docker and ensure the 'docker' command is available.\n\n", style="white")
|
131
|
+
|
132
|
+
panel = Panel(
|
133
|
+
error_text,
|
134
|
+
title="[bold red]🛡️ STRIX STARTUP ERROR",
|
135
|
+
title_align="center",
|
136
|
+
border_style="red",
|
137
|
+
padding=(1, 2),
|
138
|
+
)
|
139
|
+
console.print("\n", panel, "\n")
|
140
|
+
sys.exit(1)
|
141
|
+
|
142
|
+
|
121
143
|
async def warm_up_llm() -> None:
|
122
144
|
console = Console()
|
123
145
|
|
124
146
|
try:
|
125
|
-
model_name = os.getenv("STRIX_LLM", "
|
147
|
+
model_name = os.getenv("STRIX_LLM", "openai/gpt-5")
|
126
148
|
api_key = os.getenv("LLM_API_KEY")
|
127
149
|
|
128
150
|
if api_key:
|
@@ -136,7 +158,6 @@ async def warm_up_llm() -> None:
|
|
136
158
|
response = litellm.completion(
|
137
159
|
model=model_name,
|
138
160
|
messages=test_messages,
|
139
|
-
max_tokens=10,
|
140
161
|
)
|
141
162
|
|
142
163
|
_validate_llm_response(response)
|
@@ -523,6 +544,7 @@ def main() -> None:
|
|
523
544
|
if sys.platform == "win32":
|
524
545
|
asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
|
525
546
|
|
547
|
+
check_docker_installed()
|
526
548
|
pull_docker_image()
|
527
549
|
|
528
550
|
validate_environment()
|
@@ -84,16 +84,10 @@ class AgentFinishRenderer(BaseToolRenderer):
|
|
84
84
|
)
|
85
85
|
|
86
86
|
if result_summary:
|
87
|
-
|
88
|
-
result_summary[:400] + "..." if len(result_summary) > 400 else result_summary
|
89
|
-
)
|
90
|
-
content_parts = [f"{header}\n [bold]{cls.escape_markup(summary_display)}[/]"]
|
87
|
+
content_parts = [f"{header}\n [bold]{cls.escape_markup(result_summary)}[/]"]
|
91
88
|
|
92
89
|
if findings and isinstance(findings, list):
|
93
|
-
finding_lines = [f"• {finding}" for finding in findings
|
94
|
-
if len(findings) > 3:
|
95
|
-
finding_lines.append(f"• ... +{len(findings) - 3} more findings")
|
96
|
-
|
90
|
+
finding_lines = [f"• {finding}" for finding in findings]
|
97
91
|
content_parts.append(
|
98
92
|
f" [dim]{chr(10).join([cls.escape_markup(line) for line in finding_lines])}[/]"
|
99
93
|
)
|
@@ -23,8 +23,7 @@ class FinishScanRenderer(BaseToolRenderer):
|
|
23
23
|
)
|
24
24
|
|
25
25
|
if content:
|
26
|
-
|
27
|
-
content_text = f"{header}\n [bold]{cls.escape_markup(content_display)}[/]"
|
26
|
+
content_text = f"{header}\n [bold]{cls.escape_markup(content)}[/]"
|
28
27
|
else:
|
29
28
|
content_text = f"{header}\n [dim]Generating final report...[/]"
|
30
29
|
|
@@ -31,8 +31,7 @@ class CreateVulnerabilityReportRenderer(BaseToolRenderer):
|
|
31
31
|
)
|
32
32
|
|
33
33
|
if content:
|
34
|
-
|
35
|
-
content_parts.append(f" [dim]{cls.escape_markup(content_preview)}[/]")
|
34
|
+
content_parts.append(f" [dim]{cls.escape_markup(content)}[/]")
|
36
35
|
|
37
36
|
content_text = "\n".join(content_parts)
|
38
37
|
else:
|
@@ -51,8 +51,7 @@ class SubagentStartInfoRenderer(BaseToolRenderer):
|
|
51
51
|
|
52
52
|
content = f"🤖 Spawned subagent [bold #22c55e]{name}[/bold #22c55e]"
|
53
53
|
if task:
|
54
|
-
|
55
|
-
content += f"\n Task: [dim]{display_task}[/dim]"
|
54
|
+
content += f"\n Task: [dim]{task}[/dim]"
|
56
55
|
|
57
56
|
css_classes = cls.get_css_classes(status)
|
58
57
|
return Static(content, classes=css_classes)
|
strix/cli/tracer.py
CHANGED
@@ -54,8 +54,7 @@ class Tracer:
|
|
54
54
|
|
55
55
|
def get_run_dir(self) -> Path:
|
56
56
|
if self._run_dir is None:
|
57
|
-
|
58
|
-
runs_dir = workspace_root / "agent_runs"
|
57
|
+
runs_dir = Path.cwd() / "agent_runs"
|
59
58
|
runs_dir.mkdir(exist_ok=True)
|
60
59
|
|
61
60
|
run_dir_name = self.run_name if self.run_name else self.run_id
|
strix/llm/config.py
CHANGED
@@ -9,7 +9,7 @@ class LLMConfig:
|
|
9
9
|
enable_prompt_caching: bool = True,
|
10
10
|
prompt_modules: list[str] | None = None,
|
11
11
|
):
|
12
|
-
self.model_name = model_name or os.getenv("STRIX_LLM", "
|
12
|
+
self.model_name = model_name or os.getenv("STRIX_LLM", "openai/gpt-5")
|
13
13
|
|
14
14
|
if not self.model_name:
|
15
15
|
raise ValueError("STRIX_LLM environment variable must be set and not empty")
|
strix/llm/llm.py
CHANGED
strix/llm/memory_compressor.py
CHANGED
@@ -145,7 +145,7 @@ class MemoryCompressor:
|
|
145
145
|
model_name: str | None = None,
|
146
146
|
):
|
147
147
|
self.max_images = max_images
|
148
|
-
self.model_name = model_name or os.getenv("STRIX_LLM", "
|
148
|
+
self.model_name = model_name or os.getenv("STRIX_LLM", "openai/gpt-5")
|
149
149
|
|
150
150
|
if not self.model_name:
|
151
151
|
raise ValueError("STRIX_LLM environment variable must be set and not empty")
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.3
|
2
2
|
Name: strix-agent
|
3
|
-
Version: 0.1.
|
3
|
+
Version: 0.1.6
|
4
4
|
Summary: Open-source AI Hackers for your apps
|
5
5
|
License: Apache-2.0
|
6
6
|
Keywords: cybersecurity,security,vulnerability,scanner,pentest,agent,ai,cli
|
@@ -22,7 +22,7 @@ Requires-Dist: docker (>=7.1.0,<8.0.0)
|
|
22
22
|
Requires-Dist: fastapi
|
23
23
|
Requires-Dist: gql[requests] (>=3.5.3,<4.0.0)
|
24
24
|
Requires-Dist: ipython (>=9.3.0,<10.0.0)
|
25
|
-
Requires-Dist: litellm[proxy] (>=1.
|
25
|
+
Requires-Dist: litellm[proxy] (>=1.75.5.post1,<2.0.0)
|
26
26
|
Requires-Dist: numpydoc (>=1.8.0,<2.0.0)
|
27
27
|
Requires-Dist: openhands-aci (>=0.3.0,<0.4.0)
|
28
28
|
Requires-Dist: playwright (>=1.48.0,<2.0.0)
|
@@ -57,16 +57,6 @@ Description-Content-Type: text/markdown
|
|
57
57
|
|
58
58
|
---
|
59
59
|
|
60
|
-
## 🚨 The AI Security Crisis
|
61
|
-
|
62
|
-
Everyone's shipping code faster than ever. Cursor, Windsurf, and Claude made coding easy - but QA and security testing are now the real bottlenecks.
|
63
|
-
|
64
|
-
> **Number of security vulnerabilities doubled post-AI.**
|
65
|
-
|
66
|
-
Traditional security tools weren't designed for this. SAST was a temporary fix when manual pentesting cost $10k+ and took weeks. Now, Strix delivers real security testing rapidly.
|
67
|
-
|
68
|
-
**The solution:** Enable developers to use AI coding at full speed, without compromising on security.
|
69
|
-
|
70
60
|
## 🦉 Strix Overview
|
71
61
|
|
72
62
|
Strix are autonomous AI agents that act just like real hackers - they run your code dynamically, find vulnerabilities, and validate them through actual exploitation. Built for developers and security teams who need fast, accurate security testing without the overhead of manual pentesting or the false positives of static analysis tools.
|
@@ -78,7 +68,7 @@ Strix are autonomous AI agents that act just like real hackers - they run your c
|
|
78
68
|
pipx install strix-agent
|
79
69
|
|
80
70
|
# Configure AI provider
|
81
|
-
export STRIX_LLM="
|
71
|
+
export STRIX_LLM="openai/gpt-5"
|
82
72
|
export LLM_API_KEY="your-api-key"
|
83
73
|
|
84
74
|
# Run security assessment
|
@@ -141,7 +131,7 @@ strix --target api.your-app.com --instruction "Prioritize authentication and aut
|
|
141
131
|
|
142
132
|
```bash
|
143
133
|
# Required
|
144
|
-
export STRIX_LLM="
|
134
|
+
export STRIX_LLM="openai/gpt-5"
|
145
135
|
export LLM_API_KEY="your-api-key"
|
146
136
|
|
147
137
|
# Recommended
|
@@ -6,30 +6,30 @@ strix/agents/__init__.py,sha256=F64zhlv4XZIvYJSL9eSSuKUsIVGPLG3ycpQBhZwvE6A,168
|
|
6
6
|
strix/agents/base_agent.py,sha256=SnpVGft0SFKcUBYzsKyC0WCxYBS9232msw6yQJhK2tk,14329
|
7
7
|
strix/agents/state.py,sha256=ORN2VyLOcQrppiuGcelD0C-1-uhxc6TS4AEqdbK7LZg,4858
|
8
8
|
strix/cli/__init__.py,sha256=ww23sFOQhICEIrIo0MtwWv2qHW5qUprvPj8QVjv3SM0,44
|
9
|
-
strix/cli/app.py,sha256=
|
9
|
+
strix/cli/app.py,sha256=5p-jnS628Ax_HzH7juUuuf605ItSCDzKzzJtuvrhwk0,39114
|
10
10
|
strix/cli/assets/cli.tcss,sha256=y7N_l8sJhDeflwqjmGz_Zm6xhVzpKUPJ6zcci-3qesE,11914
|
11
|
-
strix/cli/main.py,sha256=
|
11
|
+
strix/cli/main.py,sha256=SqaCnBux6uS_Kl85EXKPpqvEXURNKlCaOkf9rKhu_Sg,18788
|
12
12
|
strix/cli/tool_components/__init__.py,sha256=Dz5ci3VMzvhlPOwQ2x9Nd11cmFzx1OP7sdlpZPMTT4k,935
|
13
|
-
strix/cli/tool_components/agents_graph_renderer.py,sha256=
|
13
|
+
strix/cli/tool_components/agents_graph_renderer.py,sha256=e470Fj47WI9DDrOKLM-8YqpToXPohwnzHQuA4Kp7qGs,4380
|
14
14
|
strix/cli/tool_components/base_renderer.py,sha256=e-xD2I3N8EDN-94tfMKAvVt0NGYC-5m2USNRGFMrEQc,1867
|
15
15
|
strix/cli/tool_components/browser_renderer.py,sha256=cpdoHnqDQiNgoNBWSOXrBsNFQS2NYW1dB9B0WVey04Q,3791
|
16
16
|
strix/cli/tool_components/file_edit_renderer.py,sha256=ZYIC6-HHxgBDikpR4MHV24O0PQAheZfRfiV_v8T5mGA,3419
|
17
|
-
strix/cli/tool_components/finish_renderer.py,sha256=
|
17
|
+
strix/cli/tool_components/finish_renderer.py,sha256=Q5Jp-irOqh0rfdoG_wzEiNhDqLDkdP-NwhYoag4N_Kw,984
|
18
18
|
strix/cli/tool_components/notes_renderer.py,sha256=ZykNe589yXR9D9mm5rSHfdppZs65STVr356EDh7GaT0,3736
|
19
19
|
strix/cli/tool_components/proxy_renderer.py,sha256=9qk1tnebZWiOpjcDIeCeuQxOBxvIuyXSvhNhMk7fBd8,10186
|
20
20
|
strix/cli/tool_components/python_renderer.py,sha256=uddPvUVpeCU3ihHfn3zpM-IaWC883A8lEsmDNJ4j6WQ,1208
|
21
21
|
strix/cli/tool_components/registry.py,sha256=faTEi5upl3Z9okx-PCHqHSsN9DBGnTh3IaWvBFm6LOg,2338
|
22
|
-
strix/cli/tool_components/reporting_renderer.py,sha256=
|
23
|
-
strix/cli/tool_components/scan_info_renderer.py,sha256=
|
22
|
+
strix/cli/tool_components/reporting_renderer.py,sha256=C_q7a548mu9U9IYD0YiDeN3ShTDEiGdCmKnyzFCUWGE,1719
|
23
|
+
strix/cli/tool_components/scan_info_renderer.py,sha256=9gcwJIzp9R9pOn8DtYv8WtRF1QL-sWXihGiA3JMbZmw,1981
|
24
24
|
strix/cli/tool_components/terminal_renderer.py,sha256=fvicmKAZXU6_pefoewQe0y7CuKXjxLnLeVpElL32AEc,3036
|
25
25
|
strix/cli/tool_components/thinking_renderer.py,sha256=s8Y1V8lvDYv9sottCZPOWQmKLyvDP1wpHO22x7XMc_U,927
|
26
26
|
strix/cli/tool_components/user_message_renderer.py,sha256=6gHJ1hG-pwcTsxLM7JuYZuaDu8cZ2MeOuUDF3LGy-4I,1432
|
27
27
|
strix/cli/tool_components/web_search_renderer.py,sha256=JnJa22ACIcRksfxxdenesUo8Th9cHSxo-fej9YcuYHs,911
|
28
|
-
strix/cli/tracer.py,sha256=
|
28
|
+
strix/cli/tracer.py,sha256=Dhr-0GCrRWxQ7mij0wosqC5hH-4_79_3p11ZqYF1iw0,11058
|
29
29
|
strix/llm/__init__.py,sha256=tzsJlDGGQE_Hw917dyzBWtwXsajZsIS-qdlPuS6EmSY,139
|
30
|
-
strix/llm/config.py,sha256=
|
31
|
-
strix/llm/llm.py,sha256=
|
32
|
-
strix/llm/memory_compressor.py,sha256=
|
30
|
+
strix/llm/config.py,sha256=iBv1tuUOUDcP2gVQWhjtN8wtO5lWOipsER7Rnc3p6k4,603
|
31
|
+
strix/llm/llm.py,sha256=wFeDI6vQfZt1bDLVoL5tpGZ9zIUDnMhPwkgIyhP4dGc,10997
|
32
|
+
strix/llm/memory_compressor.py,sha256=U2eD90SmVOxjZJTiNwVmf4G6g3lnhfwqIPtwhLztoag,6856
|
33
33
|
strix/llm/request_queue.py,sha256=hBjj8c_6_D30-j1FCz-fm2eHJA7XGE7rk52j_8QR_4s,2090
|
34
34
|
strix/llm/utils.py,sha256=M84mVstjWY3-fwc2KyVAcfpF3IMHWnbkjRpGUUQ1TcM,2474
|
35
35
|
strix/prompts/__init__.py,sha256=JGzGxp0J86mpmCcWurtikKh_xcd8PvVfjtFDOOh0NaQ,3621
|
@@ -92,8 +92,8 @@ strix/tools/thinking/thinking_actions_schema.xml,sha256=otD4dOhQx4uyudLnjA_HIP6E
|
|
92
92
|
strix/tools/web_search/__init__.py,sha256=m5PCHXqeNVraLRLNIbh54Z2N4Y_75d-ftqwyq3dbCd0,70
|
93
93
|
strix/tools/web_search/web_search_actions.py,sha256=LRS3AjGO4JLIyu_B6-ogfWOsnENwqrrCa8Rz0vxuuGQ,3107
|
94
94
|
strix/tools/web_search/web_search_actions_schema.xml,sha256=Ihc3Gv4LaPI_MzBbwZOt3y4pwg9xmtl8KfPNvFihEP4,4805
|
95
|
-
strix_agent-0.1.
|
96
|
-
strix_agent-0.1.
|
97
|
-
strix_agent-0.1.
|
98
|
-
strix_agent-0.1.
|
99
|
-
strix_agent-0.1.
|
95
|
+
strix_agent-0.1.6.dist-info/LICENSE,sha256=fblpcTQlHjFL2NOSV_4XDJiz4q2bLtZ-l6yvlhPnueM,11345
|
96
|
+
strix_agent-0.1.6.dist-info/METADATA,sha256=JyoaX2vtxSSqf3_eoXDsK0FeY8woAFLaClknZoZbDr0,6527
|
97
|
+
strix_agent-0.1.6.dist-info/WHEEL,sha256=RaoafKOydTQ7I_I3JTrPCg6kUmTgtm4BornzOqyEfJ8,88
|
98
|
+
strix_agent-0.1.6.dist-info/entry_points.txt,sha256=sswIgnkzSVSzQ3Rd046g7mhIPQaj_7RYlXgU_bQelF0,45
|
99
|
+
strix_agent-0.1.6.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|