strix-agent 0.1.1__py3-none-any.whl → 0.1.3__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.
@@ -480,7 +480,7 @@ PROXY & INTERCEPTION:
480
480
  PROGRAMMING:
481
481
  - Python 3, Poetry, Go, Node.js/npm
482
482
  - Full development environment
483
- - Docker is available in your sandbox.
483
+ - Docker is NOT available inside the sandbox. Do not run docker; rely on provided tools to run locally.
484
484
  - You can install any additional tools/packages needed based on the task/context using package managers (apt, pip, npm, go install, etc.)
485
485
 
486
486
  Directories:
strix/cli/app.py CHANGED
@@ -54,21 +54,19 @@ class SplashScreen(Static): # type: ignore[misc]
54
54
  def compose(self) -> ComposeResult:
55
55
  ascii_art = r"""
56
56
  [bright_green]
57
- ⠰⢿⣿⡶⢤⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡤⢶⣿⡿⠆
58
- ⠀⠀⢻⣿⠀⠈⠓⠤⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠠⠚⠁⠀⣿⡟⠀⠀
59
- ⠀⠀⠠⣻⡆⠀⠀⠀⠠⣄⡀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣠⠄⠀⠀⠀⢰⣟⠄⠀⠀
60
- ███████╗████████╗██████╗ ██╗██╗ ██╗ ⠀⠀⠀⢼⣷⠀⠀⠀⠀⠀⠙⠛⠶⣶⣶⣶⣶⠶⠛⠋⠀⠀⠀⠀⠀⣾⡧⠀⠀⠀
61
- ██╔════╝╚══██╔══╝██╔══██╗██║╚██╗██╔╝ ⠀⠀⢀⣾⠃⢳⣧⡀⠀⠠⡀⢀⠀⠀⠉⠉⠀⠀⡀⢀⠄⠀⢀⣼⡞⠘⣷⡀⠀⠀
62
- ███████╗ ██║ ██████╔╝██║ ╚███╔╝ ⠀⠀⡾⠃⠀⠲⡾⢿⣓⣢⡀⠻⢷⣄⡀⢀⣠⡾⠟⢀⣔⣚⡿⢷⠖⠀⠘⢷⠀⠀
63
- ╚════██║ ██║ ██╔══██╗██║ ██╔██╗ ⠀⢠⠃⣰⠁⠀⠐⣿⢫⣿⣿⣆⠀⢈⡻⢟⣉⠀⣰⣿⣿⡝⣿⠂⠀⠈⣆⠘⡄⠀
64
- ███████║ ██║ ██║ ██║██║██╔╝ ██╗ ⠀⠀⠀⣽⠀⠀⠀⠘⣄⠙⣋⣼⠆⠈⢛⡛⠁⠰⣧⣙⠋⣠⠃⠀⠀⠀⣿⠀⠀⠀
65
- ╚══════╝ ╚═╝ ╚═╝ ╚═╝╚═╝╚═╝ ╚═╝ ⠀⠀⠀⢻⡀⠀⠀⠀⠀⠀⠉⠀⠀⠀⣾⢱⠀⠀⠀⠉⠀⠀⠀⠀⠀⢀⡟⠀⠀⠀
66
- ⠀⠀⠀⠈⠻⣆⡀⠀⠀⠀⢀⡀⠀⠀⢿⡸⠀⠀⢀⡀⠀⠀⠀⢀⣰⠟⠃⠀⠀⠀
67
- ⠀⠀⠀⠀⠀⠉⠉⠂⠀⠀⠉⠛⢦⡀⠸⠇⢀⡴⠛⠉⠀⠀⠐⠉⠉⠀⠀⠀⠀⠀
68
- ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⠶⠶⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
57
+
58
+
59
+ ███████╗████████╗██████╗ ██╗██╗ ██╗
60
+ ██╔════╝╚══██╔══╝██╔══██╗██║╚██╗██╔╝
61
+ ███████╗ ██║ ██████╔╝██║ ╚███╔╝
62
+ ╚════██║ ██║ ██╔══██╗██║ ██╔██╗
63
+ ███████║ ██║ ██║ ██║██║██╔╝ ██╗
64
+ ╚══════╝ ╚═╝ ╚═╝ ╚═╝╚═╝╚═╝ ╚═╝
65
+
66
+
69
67
  [/bright_green]
70
68
 
71
- [bright_green]Starting Strix Cybersecurity Agent...[/bright_green]
69
+ [bright_green]Starting Strix Cybersecurity Agent...[/bright_green]
72
70
  """
73
71
  yield Static(ascii_art, id="splash_content")
74
72
 
strix/llm/__init__.py CHANGED
@@ -10,5 +10,3 @@ __all__ = [
10
10
  ]
11
11
 
12
12
  litellm.drop_params = True
13
- litellm.suppress_debug_info = True
14
- litellm.set_verbose = False
@@ -15,7 +15,7 @@ from .runtime import AbstractRuntime, SandboxInfo
15
15
 
16
16
  STRIX_AGENT_LABEL = "StrixAgent_ID"
17
17
  STRIX_SCAN_LABEL = "StrixScan_ID"
18
- STRIX_IMAGE = os.getenv("STRIX_IMAGE", "ghcr.io/usestrix/strix-sandbox:0.1.1")
18
+ STRIX_IMAGE = os.getenv("STRIX_IMAGE", "ghcr.io/usestrix/strix-sandbox:0.1.3")
19
19
  logger = logging.getLogger(__name__)
20
20
 
21
21
  _initialized_volumes: set[str] = set()
@@ -29,24 +29,6 @@ class DockerRuntime(AbstractRuntime):
29
29
  logger.exception("Failed to connect to Docker daemon")
30
30
  raise RuntimeError("Docker is not available or not configured correctly.") from e
31
31
 
32
- def _get_docker_socket_path(self) -> str | None:
33
- standard_socket = "/var/run/docker.sock"
34
- if Path(standard_socket).exists():
35
- return standard_socket
36
-
37
- if os.name == "nt":
38
- windows_socket = "//./pipe/docker_engine"
39
- if Path(windows_socket).exists():
40
- return windows_socket
41
-
42
- docker_host = os.environ.get("DOCKER_HOST", "")
43
- if docker_host.startswith("unix://"):
44
- socket_path = docker_host.replace("unix://", "")
45
- if Path(socket_path).exists():
46
- return socket_path
47
-
48
- return None
49
-
50
32
  def _generate_sandbox_token(self) -> str:
51
33
  return secrets.token_urlsafe(32)
52
34
 
@@ -150,22 +132,18 @@ class DockerRuntime(AbstractRuntime):
150
132
  caido_port = self._find_available_port()
151
133
 
152
134
  volumes_config = {volume_name: {"bind": "/shared_workspace", "mode": "rw"}}
153
-
154
- docker_socket_path = self._get_docker_socket_path()
155
- if docker_socket_path and Path(docker_socket_path).exists():
156
- volumes_config[docker_socket_path] = {
157
- "bind": "/var/run/docker.sock",
158
- "mode": "rw",
159
- }
160
- logger.info(f"Mounting Docker socket from {docker_socket_path}")
161
- else:
162
- logger.warning("Docker socket not found or not accessible")
135
+ container_name = f"strix-{agent_id}"
163
136
 
164
137
  sandbox = self.client.containers.run(
165
138
  STRIX_IMAGE,
166
139
  command="sleep infinity",
167
140
  detach=True,
168
- network_mode="host",
141
+ name=container_name,
142
+ hostname=container_name,
143
+ ports={
144
+ f"{tool_server_port}/tcp": tool_server_port,
145
+ f"{caido_port}/tcp": caido_port,
146
+ },
169
147
  cap_add=["NET_ADMIN", "NET_RAW"],
170
148
  labels={
171
149
  STRIX_AGENT_LABEL: agent_id,
@@ -177,11 +155,6 @@ class DockerRuntime(AbstractRuntime):
177
155
  "STRIX_SANDBOX_TOKEN": auth_token,
178
156
  "STRIX_TOOL_SERVER_PORT": str(tool_server_port),
179
157
  "CAIDO_PORT": str(caido_port),
180
- **(
181
- {"DOCKER_HOST": os.environ["DOCKER_HOST"]}
182
- if "DOCKER_HOST" in os.environ
183
- else {}
184
- ),
185
158
  },
186
159
  volumes=volumes_config,
187
160
  tty=True,
@@ -261,14 +234,14 @@ class DockerRuntime(AbstractRuntime):
261
234
  logger.info("Successfully destroyed sandbox %s", sandbox_id)
262
235
 
263
236
  if scan_id:
264
- await self._cleanup_scan_workspace_if_empty(scan_id)
237
+ await self._cleanup_workspace_if_empty(scan_id)
265
238
 
266
239
  except NotFound:
267
240
  logger.warning("Sandbox %s not found for destruction.", sandbox_id)
268
241
  except DockerException as e:
269
242
  logger.warning("Failed to destroy sandbox %s: %s", sandbox_id, e)
270
243
 
271
- async def _cleanup_scan_workspace_if_empty(self, scan_id: str) -> None:
244
+ async def _cleanup_workspace_if_empty(self, scan_id: str) -> None:
272
245
  try:
273
246
  volume_name = self._get_workspace_volume_name(scan_id)
274
247
 
@@ -295,4 +268,4 @@ class DockerRuntime(AbstractRuntime):
295
268
  logger.warning("Error during workspace cleanup for scan %s: %s", scan_id, e)
296
269
 
297
270
  async def cleanup_scan_workspace(self, scan_id: str) -> None:
298
- await self._cleanup_scan_workspace_if_empty(scan_id)
271
+ await self._cleanup_workspace_if_empty(scan_id)
@@ -25,14 +25,21 @@ def _validate_content(content: str) -> dict[str, Any] | None:
25
25
  return None
26
26
 
27
27
 
28
- def _check_active_agents() -> dict[str, Any] | None:
28
+ def _check_active_agents(agent_state: Any = None) -> dict[str, Any] | None:
29
29
  try:
30
30
  from strix.tools.agents_graph.agents_graph_actions import _agent_graph
31
31
 
32
+ current_agent_id = None
33
+ if agent_state and hasattr(agent_state, "agent_id"):
34
+ current_agent_id = agent_state.agent_id
35
+
32
36
  running_agents = []
33
37
  stopping_agents = []
34
38
 
35
39
  for agent_id, node in _agent_graph.get("nodes", {}).items():
40
+ if agent_id == current_agent_id:
41
+ continue
42
+
36
43
  status = node.get("status", "")
37
44
  if status == "running":
38
45
  running_agents.append(
@@ -51,7 +58,7 @@ def _check_active_agents() -> dict[str, Any] | None:
51
58
  )
52
59
 
53
60
  if running_agents or stopping_agents:
54
- message_parts = ["Cannot finish scan while agents are still active:"]
61
+ message_parts = ["Cannot finish scan while other agents are still active:"]
55
62
 
56
63
  if running_agents:
57
64
  message_parts.append("\n\nRunning agents:")
@@ -157,7 +164,7 @@ def finish_scan(
157
164
  if validation_error:
158
165
  return validation_error
159
166
 
160
- active_agents_error = _check_active_agents()
167
+ active_agents_error = _check_active_agents(agent_state)
161
168
  if active_agents_error:
162
169
  return active_agents_error
163
170
 
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: strix-agent
3
- Version: 0.1.1
4
- Summary: Strix: Open-source AI Hackers for your apps
3
+ Version: 0.1.3
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
7
7
  Author: Strix
@@ -86,7 +86,7 @@ export STRIX_LLM="anthropic/claude-sonnet-4-20250514"
86
86
  export LLM_API_KEY="your-api-key"
87
87
 
88
88
  # Run security assessment
89
- strix --target https://your-app.com
89
+ strix --target ./app-directory
90
90
  ```
91
91
 
92
92
  ## Why Use Strix
@@ -1,12 +1,12 @@
1
1
  strix/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
2
  strix/agents/StrixAgent/__init__.py,sha256=VORJn9aPTJyNn2-QAv6DbTxO1P9wBQoSZlAw-YuTJhQ,63
3
3
  strix/agents/StrixAgent/strix_agent.py,sha256=CZNhwr1jao6Y64_PS5or83KZJrM2RoZjfj7IgBy0ph0,2117
4
- strix/agents/StrixAgent/system_prompt.jinja,sha256=9rGAL2cW_sdCXD2IdJZQJ5Q2bOXHqR2j0Y1XIDqGmCQ,25587
4
+ strix/agents/StrixAgent/system_prompt.jinja,sha256=zQaz6k7HjY2ZbKw5fcO1HaYnqr1nwkry5IDtuYmhJ8w,25652
5
5
  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=us-fYBf-_JKgZInWsG3n9wAj1rfUWXD4361kD-0PreQ,40501
9
+ strix/cli/app.py,sha256=vu642k3Jl3AOMkYXg0WIf0uwZGeKfhl6SXtETm0Ot9E,39116
10
10
  strix/cli/assets/cli.tcss,sha256=y7N_l8sJhDeflwqjmGz_Zm6xhVzpKUPJ6zcci-3qesE,11914
11
11
  strix/cli/main.py,sha256=58Lj6qSJY-dXHQ0DGwQq2c5iie29OlE0Hxss4Qf5jzM,18050
12
12
  strix/cli/tool_components/__init__.py,sha256=Dz5ci3VMzvhlPOwQ2x9Nd11cmFzx1OP7sdlpZPMTT4k,935
@@ -26,7 +26,7 @@ strix/cli/tool_components/thinking_renderer.py,sha256=s8Y1V8lvDYv9sottCZPOWQmKLy
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=HwSLb5dB6OpudpELxZq1AXaRSdBVdW1XipWamcNA0Ms,11127
29
- strix/llm/__init__.py,sha256=7Amh0SeU5A49-t5Mhv0_tgWstGSpup7-G_n5vYquRfc,202
29
+ strix/llm/__init__.py,sha256=tzsJlDGGQE_Hw917dyzBWtwXsajZsIS-qdlPuS6EmSY,139
30
30
  strix/llm/config.py,sha256=z1up_3UqJZmBJwtgXA_4XgtwjDTG_-_a_1YjmLk2G14,625
31
31
  strix/llm/llm.py,sha256=fJLmx0tLaUUVIqf1hdcrqHeZ2_-CUcFM8RXH1G9XqTs,11034
32
32
  strix/llm/memory_compressor.py,sha256=OVTXfO_oQ8WzlY9YGucqH7OcVfX9DM3E22BzWpH-p0Y,6878
@@ -45,7 +45,7 @@ strix/prompts/vulnerabilities/ssrf.jinja,sha256=MfRs3MtvgAEauaOrCHpKIoRnS0YCZKyC
45
45
  strix/prompts/vulnerabilities/xss.jinja,sha256=ozaEuV1X4QPRLYiUAfpQplzbovQU6QmtVF115-8_xrk,6139
46
46
  strix/prompts/vulnerabilities/xxe.jinja,sha256=E8QUtIMQoEft7FRQzz7a2SgvrpqNecRVYvhaIWOco0w,7081
47
47
  strix/runtime/__init__.py,sha256=v2oQ1JnfZXOTU8N3NOEI_MbxNp8BfNj8hTgvjCsNGvY,445
48
- strix/runtime/docker_runtime.py,sha256=0lQo410s5RbXNTluKPqvx4lAUVS2bFBTj1uCa3F2lsM,11359
48
+ strix/runtime/docker_runtime.py,sha256=T6IUZjvcc5Mn0pA8-n9WtQ0vCVRLQXyWVanow1lZ-X8,10279
49
49
  strix/runtime/runtime.py,sha256=cHn_LnK7yLZLncVdIflz97oqNvvvhc8cWG4zsqgaF70,670
50
50
  strix/runtime/tool_server.py,sha256=7Swr4dgl6gEvDGzhSXsZk9__NEtmrwqg6Gnx-Ai8I5E,3466
51
51
  strix/tools/__init__.py,sha256=_uTsOImNlJ-q5FFuQBTIYpIAgTETNI7Pm2hkaLE-Z5Y,1743
@@ -63,7 +63,7 @@ strix/tools/file_edit/__init__.py,sha256=8f6VlEoGP627hGtcdLkr63vdrTmdb8uyPIqB0qV
63
63
  strix/tools/file_edit/file_edit_actions.py,sha256=Aq-LwzmmfUJrBZWy5TeP9Pxz9TlmeqOSqemD4jBkt2s,3951
64
64
  strix/tools/file_edit/file_edit_actions_schema.xml,sha256=tt0_QgSjOtTEy8ordsXUcEiVTePiybgn4aisZJ_qnbc,5477
65
65
  strix/tools/finish/__init__.py,sha256=QIMaHYusly8YaFR3zjYsy_CFawwgtTZvOU7gsEumFrw,68
66
- strix/tools/finish/finish_actions.py,sha256=c5QdHI-Kau_rKuVTHpanP0TtEBqurHeR8tp6sdhc_5s,5439
66
+ strix/tools/finish/finish_actions.py,sha256=EX3swXMIKMWcdmnKgQIVrzq1APFS07iqY86mJBTOiEY,5696
67
67
  strix/tools/finish/finish_actions_schema.xml,sha256=CS6Vq3ByyNxv2spRWS4oJcmUzWQRB7jvUAOS8aiWd8o,2294
68
68
  strix/tools/notes/__init__.py,sha256=DUpkZUWN21tb9AXCWfJLrKrgLz9YEBVU8KQy1J6cyxU,189
69
69
  strix/tools/notes/notes_actions.py,sha256=Y4b7DYJzh7XwwlMTdwThOLuIuuj46m6KiMrMKekTMCE,5771
@@ -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.1.dist-info/LICENSE,sha256=fblpcTQlHjFL2NOSV_4XDJiz4q2bLtZ-l6yvlhPnueM,11345
96
- strix_agent-0.1.1.dist-info/METADATA,sha256=YZqX_hi3lF2NW2KiQBb02047jpWE8VnWratWDZ8Oq7Y,7325
97
- strix_agent-0.1.1.dist-info/WHEEL,sha256=RaoafKOydTQ7I_I3JTrPCg6kUmTgtm4BornzOqyEfJ8,88
98
- strix_agent-0.1.1.dist-info/entry_points.txt,sha256=sswIgnkzSVSzQ3Rd046g7mhIPQaj_7RYlXgU_bQelF0,45
99
- strix_agent-0.1.1.dist-info/RECORD,,
95
+ strix_agent-0.1.3.dist-info/LICENSE,sha256=fblpcTQlHjFL2NOSV_4XDJiz4q2bLtZ-l6yvlhPnueM,11345
96
+ strix_agent-0.1.3.dist-info/METADATA,sha256=ZZ92rwfftIoAvAOvv97wDTfTSPfxvgSqNXJPELi-rd4,7313
97
+ strix_agent-0.1.3.dist-info/WHEEL,sha256=RaoafKOydTQ7I_I3JTrPCg6kUmTgtm4BornzOqyEfJ8,88
98
+ strix_agent-0.1.3.dist-info/entry_points.txt,sha256=sswIgnkzSVSzQ3Rd046g7mhIPQaj_7RYlXgU_bQelF0,45
99
+ strix_agent-0.1.3.dist-info/RECORD,,