strix-agent 0.1.1__tar.gz → 0.1.2__tar.gz

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 (98) hide show
  1. {strix_agent-0.1.1 → strix_agent-0.1.2}/PKG-INFO +3 -3
  2. {strix_agent-0.1.1 → strix_agent-0.1.2}/README.md +1 -1
  3. {strix_agent-0.1.1 → strix_agent-0.1.2}/pyproject.toml +2 -2
  4. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/agents/StrixAgent/system_prompt.jinja +1 -1
  5. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/cli/app.py +10 -12
  6. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/runtime/docker_runtime.py +11 -38
  7. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/tools/finish/finish_actions.py +10 -3
  8. {strix_agent-0.1.1 → strix_agent-0.1.2}/LICENSE +0 -0
  9. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/__init__.py +0 -0
  10. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/agents/StrixAgent/__init__.py +0 -0
  11. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/agents/StrixAgent/strix_agent.py +0 -0
  12. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/agents/__init__.py +0 -0
  13. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/agents/base_agent.py +0 -0
  14. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/agents/state.py +0 -0
  15. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/cli/__init__.py +0 -0
  16. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/cli/assets/cli.tcss +0 -0
  17. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/cli/main.py +0 -0
  18. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/cli/tool_components/__init__.py +0 -0
  19. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/cli/tool_components/agents_graph_renderer.py +0 -0
  20. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/cli/tool_components/base_renderer.py +0 -0
  21. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/cli/tool_components/browser_renderer.py +0 -0
  22. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/cli/tool_components/file_edit_renderer.py +0 -0
  23. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/cli/tool_components/finish_renderer.py +0 -0
  24. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/cli/tool_components/notes_renderer.py +0 -0
  25. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/cli/tool_components/proxy_renderer.py +0 -0
  26. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/cli/tool_components/python_renderer.py +0 -0
  27. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/cli/tool_components/registry.py +0 -0
  28. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/cli/tool_components/reporting_renderer.py +0 -0
  29. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/cli/tool_components/scan_info_renderer.py +0 -0
  30. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/cli/tool_components/terminal_renderer.py +0 -0
  31. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/cli/tool_components/thinking_renderer.py +0 -0
  32. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/cli/tool_components/user_message_renderer.py +0 -0
  33. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/cli/tool_components/web_search_renderer.py +0 -0
  34. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/cli/tracer.py +0 -0
  35. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/llm/__init__.py +0 -0
  36. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/llm/config.py +0 -0
  37. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/llm/llm.py +0 -0
  38. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/llm/memory_compressor.py +0 -0
  39. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/llm/request_queue.py +0 -0
  40. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/llm/utils.py +0 -0
  41. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/prompts/__init__.py +0 -0
  42. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/prompts/coordination/root_agent.jinja +0 -0
  43. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/prompts/vulnerabilities/authentication_jwt.jinja +0 -0
  44. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/prompts/vulnerabilities/business_logic.jinja +0 -0
  45. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/prompts/vulnerabilities/csrf.jinja +0 -0
  46. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/prompts/vulnerabilities/idor.jinja +0 -0
  47. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/prompts/vulnerabilities/race_conditions.jinja +0 -0
  48. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/prompts/vulnerabilities/rce.jinja +0 -0
  49. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/prompts/vulnerabilities/sql_injection.jinja +0 -0
  50. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/prompts/vulnerabilities/ssrf.jinja +0 -0
  51. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/prompts/vulnerabilities/xss.jinja +0 -0
  52. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/prompts/vulnerabilities/xxe.jinja +0 -0
  53. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/runtime/__init__.py +0 -0
  54. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/runtime/runtime.py +0 -0
  55. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/runtime/tool_server.py +0 -0
  56. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/tools/__init__.py +0 -0
  57. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/tools/agents_graph/__init__.py +0 -0
  58. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/tools/agents_graph/agents_graph_actions.py +0 -0
  59. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/tools/agents_graph/agents_graph_actions_schema.xml +0 -0
  60. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/tools/argument_parser.py +0 -0
  61. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/tools/browser/__init__.py +0 -0
  62. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/tools/browser/browser_actions.py +0 -0
  63. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/tools/browser/browser_actions_schema.xml +0 -0
  64. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/tools/browser/browser_instance.py +0 -0
  65. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/tools/browser/tab_manager.py +0 -0
  66. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/tools/executor.py +0 -0
  67. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/tools/file_edit/__init__.py +0 -0
  68. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/tools/file_edit/file_edit_actions.py +0 -0
  69. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/tools/file_edit/file_edit_actions_schema.xml +0 -0
  70. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/tools/finish/__init__.py +0 -0
  71. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/tools/finish/finish_actions_schema.xml +0 -0
  72. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/tools/notes/__init__.py +0 -0
  73. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/tools/notes/notes_actions.py +0 -0
  74. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/tools/notes/notes_actions_schema.xml +0 -0
  75. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/tools/proxy/__init__.py +0 -0
  76. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/tools/proxy/proxy_actions.py +0 -0
  77. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/tools/proxy/proxy_actions_schema.xml +0 -0
  78. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/tools/proxy/proxy_manager.py +0 -0
  79. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/tools/python/__init__.py +0 -0
  80. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/tools/python/python_actions.py +0 -0
  81. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/tools/python/python_actions_schema.xml +0 -0
  82. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/tools/python/python_instance.py +0 -0
  83. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/tools/python/python_manager.py +0 -0
  84. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/tools/registry.py +0 -0
  85. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/tools/reporting/__init__.py +0 -0
  86. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/tools/reporting/reporting_actions.py +0 -0
  87. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/tools/reporting/reporting_actions_schema.xml +0 -0
  88. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/tools/terminal/__init__.py +0 -0
  89. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/tools/terminal/terminal_actions.py +0 -0
  90. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/tools/terminal/terminal_actions_schema.xml +0 -0
  91. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/tools/terminal/terminal_instance.py +0 -0
  92. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/tools/terminal/terminal_manager.py +0 -0
  93. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/tools/thinking/__init__.py +0 -0
  94. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/tools/thinking/thinking_actions.py +0 -0
  95. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/tools/thinking/thinking_actions_schema.xml +0 -0
  96. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/tools/web_search/__init__.py +0 -0
  97. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/tools/web_search/web_search_actions.py +0 -0
  98. {strix_agent-0.1.1 → strix_agent-0.1.2}/strix/tools/web_search/web_search_actions_schema.xml +0 -0
@@ -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.2
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
@@ -44,7 +44,7 @@ export STRIX_LLM="anthropic/claude-sonnet-4-20250514"
44
44
  export LLM_API_KEY="your-api-key"
45
45
 
46
46
  # Run security assessment
47
- strix --target https://your-app.com
47
+ strix --target ./app-directory
48
48
  ```
49
49
 
50
50
  ## Why Use Strix
@@ -1,7 +1,7 @@
1
1
  [tool.poetry]
2
2
  name = "strix-agent"
3
- version = "0.1.1"
4
- description = "Strix: Open-source AI Hackers for your apps"
3
+ version = "0.1.2"
4
+ description = "Open-source AI Hackers for your apps"
5
5
  authors = ["Strix <hi@usestrix.com>"]
6
6
  readme = "README.md"
7
7
  license = "Apache-2.0"
@@ -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:
@@ -54,18 +54,16 @@ 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
69
  [bright_green]Starting Strix Cybersecurity Agent...[/bright_green]
@@ -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.2")
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
 
File without changes