strix-agent 0.1.5__py3-none-any.whl → 0.1.7__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/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., 'anthropic/claude-sonnet-4-20250514')\n",
77
+ " - Model name to use with litellm (e.g., 'anthropic/claude-opus-4-1-20250805')\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
- "export STRIX_LLM='anthropic/claude-sonnet-4-20250514'\n", style="dim white"
95
+ "export STRIX_LLM='anthropic/claude-opus-4-1-20250805'\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", "anthropic/claude-sonnet-4-20250514")
147
+ model_name = os.getenv("STRIX_LLM", "anthropic/claude-opus-4-1-20250805")
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
- summary_display = (
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[:3]]
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
- content_display = content[:600] + "..." if len(content) > 600 else content
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
- content_preview = content[:100] + "..." if len(content) > 100 else content
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
- display_task = task[:80] + "..." if len(task) > 80 else task
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/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", "anthropic/claude-sonnet-4-20250514")
12
+ self.model_name = model_name or os.getenv("STRIX_LLM", "anthropic/claude-opus-4-1-20250805")
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
@@ -248,7 +248,6 @@ class LLM:
248
248
  "model": self.config.model_name,
249
249
  "messages": messages,
250
250
  "temperature": self.config.temperature,
251
- "stop": ["</function>"],
252
251
  }
253
252
 
254
253
  queue = get_global_queue()
@@ -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", "anthropic/claude-sonnet-4-20250514")
148
+ self.model_name = model_name or os.getenv("STRIX_LLM", "anthropic/claude-opus-4-1-20250805")
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.5
3
+ Version: 0.1.7
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.72.1,<2.0.0)
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="anthropic/claude-sonnet-4-20250514"
71
+ export STRIX_LLM="anthropic/claude-opus-4-1-20250805"
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="anthropic/claude-sonnet-4-20250514"
134
+ export STRIX_LLM="anthropic/claude-opus-4-1-20250805"
145
135
  export LLM_API_KEY="your-api-key"
146
136
 
147
137
  # Recommended
@@ -8,28 +8,28 @@ strix/agents/state.py,sha256=ORN2VyLOcQrppiuGcelD0C-1-uhxc6TS4AEqdbK7LZg,4858
8
8
  strix/cli/__init__.py,sha256=ww23sFOQhICEIrIo0MtwWv2qHW5qUprvPj8QVjv3SM0,44
9
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=58Lj6qSJY-dXHQ0DGwQq2c5iie29OlE0Hxss4Qf5jzM,18050
11
+ strix/cli/main.py,sha256=WITQC-_NWXQMGpgJIRK6JrHdHr-mFkIysd9cEjhTQ64,18854
12
12
  strix/cli/tool_components/__init__.py,sha256=Dz5ci3VMzvhlPOwQ2x9Nd11cmFzx1OP7sdlpZPMTT4k,935
13
- strix/cli/tool_components/agents_graph_renderer.py,sha256=PLXAxOuejCr6oYhe_Kms5A3dd9Ga3FYxKJdlyMOr9vI,4652
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=4_KTYQYVeIFNrKn38eL-Hk4x0Drf9_hyh9Xnz0b-RIg,1079
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=Sa5vDKrXVICdwaExSMb5JYuOsuG3Yw8X_KDoVzji3r0,1818
23
- strix/cli/tool_components/scan_info_renderer.py,sha256=qHB5l8wycJxfjttUAZ1EzsGbqmRVE0TUvLqvY1NFE0Q,2062
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
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=z1up_3UqJZmBJwtgXA_4XgtwjDTG_-_a_1YjmLk2G14,625
31
- strix/llm/llm.py,sha256=fJLmx0tLaUUVIqf1hdcrqHeZ2_-CUcFM8RXH1G9XqTs,11034
32
- strix/llm/memory_compressor.py,sha256=OVTXfO_oQ8WzlY9YGucqH7OcVfX9DM3E22BzWpH-p0Y,6878
30
+ strix/llm/config.py,sha256=UkHAhbaUV0WcE-TC6WnT0ZSf0qGlseFV_OPx4bUv-tY,625
31
+ strix/llm/llm.py,sha256=wFeDI6vQfZt1bDLVoL5tpGZ9zIUDnMhPwkgIyhP4dGc,10997
32
+ strix/llm/memory_compressor.py,sha256=HBG2V2YEkM_fP7D-_rQ6QFE42ZojdlYoDOivzKhpopU,6878
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.5.dist-info/LICENSE,sha256=fblpcTQlHjFL2NOSV_4XDJiz4q2bLtZ-l6yvlhPnueM,11345
96
- strix_agent-0.1.5.dist-info/METADATA,sha256=1ynA-k0FOtLQKUVpXAmcdpBAhp8sBN2FvuR7EAtJ3DQ,7090
97
- strix_agent-0.1.5.dist-info/WHEEL,sha256=RaoafKOydTQ7I_I3JTrPCg6kUmTgtm4BornzOqyEfJ8,88
98
- strix_agent-0.1.5.dist-info/entry_points.txt,sha256=sswIgnkzSVSzQ3Rd046g7mhIPQaj_7RYlXgU_bQelF0,45
99
- strix_agent-0.1.5.dist-info/RECORD,,
95
+ strix_agent-0.1.7.dist-info/LICENSE,sha256=fblpcTQlHjFL2NOSV_4XDJiz4q2bLtZ-l6yvlhPnueM,11345
96
+ strix_agent-0.1.7.dist-info/METADATA,sha256=CDAMhMXGnexXpvgySfSFAkRahZ8PBmTuZSs_Z6c-ptY,6571
97
+ strix_agent-0.1.7.dist-info/WHEEL,sha256=RaoafKOydTQ7I_I3JTrPCg6kUmTgtm4BornzOqyEfJ8,88
98
+ strix_agent-0.1.7.dist-info/entry_points.txt,sha256=sswIgnkzSVSzQ3Rd046g7mhIPQaj_7RYlXgU_bQelF0,45
99
+ strix_agent-0.1.7.dist-info/RECORD,,