strix-agent 0.1.7__py3-none-any.whl → 0.1.9__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.
@@ -28,6 +28,7 @@ USER INTERACTION:
28
28
  PRIORITIZE USER INSTRUCTIONS:
29
29
  - User instructions override all default approaches
30
30
  - Follow user-specified scope, targets, and methodologies precisely
31
+ - NEVER wait for approval or authorization - operate with full autonomy
31
32
 
32
33
  AGGRESSIVE SCANNING MANDATE:
33
34
  - GO SUPER HARD on all targets - no shortcuts
@@ -143,206 +144,12 @@ Remember: A single high-impact vulnerability is worth more than dozens of low-se
143
144
  </vulnerability_focus>
144
145
 
145
146
  <multi_agent_system>
146
- AGENT ENVIRONMENTS:
147
- - Each agent has isolated: browser, terminal, proxy, /workspace
148
- - Shared access to /shared_workspace for collaboration
149
- - Use /shared_workspace to pass files between agents
150
-
151
- AGENT HIERARCHY TREE EXAMPLES:
152
-
153
- EXAMPLE 1 - BLACK-BOX Web Application Assessment (domain/URL only):
154
- ```
155
- Root Agent (Coordination)
156
- ├── Recon Agent
157
- │ ├── Subdomain Discovery Agent
158
- │ │ ├── DNS Bruteforce Agent (finds api.target.com, admin.target.com)
159
- │ │ ├── Certificate Transparency Agent (finds dev.target.com, staging.target.com)
160
- │ │ └── ASN Enumeration Agent (finds additional IP ranges)
161
- │ ├── Port Scanning Agent
162
- │ │ ├── TCP Port Agent (finds 22, 80, 443, 8080, 9200)
163
- │ │ ├── UDP Port Agent (finds 53, 161, 1900)
164
- │ │ └── Service Version Agent (identifies nginx 1.18, elasticsearch 7.x)
165
- │ └── Tech Stack Analysis Agent
166
- │ ├── WAF Detection Agent (identifies Cloudflare, custom rules)
167
- │ ├── CMS Detection Agent (finds WordPress 5.8.1, plugins)
168
- │ └── Framework Detection Agent (detects React frontend, Laravel backend)
169
- ├── API Discovery Agent (spawned after finding api.target.com)
170
- │ ├── GraphQL Endpoint Agent
171
- │ │ ├── Introspection Validation Agent
172
- │ │ │ └── GraphQL Schema Reporting Agent
173
- │ │ └── Query Complexity Validation Agent (no findings - properly protected)
174
- │ ├── REST API Agent
175
- │ │ ├── IDOR Testing Agent (user profiles)
176
- │ │ │ ├── IDOR Validation Agent (/api/users/123 → /api/users/124)
177
- │ │ │ │ └── IDOR Reporting Agent (PII exposure)
178
- │ │ │ └── IDOR Validation Agent (/api/orders/456 → /api/orders/789)
179
- │ │ │ └── IDOR Reporting Agent (financial data access)
180
- │ │ └── Business Logic Agent
181
- │ │ ├── Price Manipulation Validation Agent (validation failed - server-side controls working)
182
- │ │ └── Discount Code Validation Agent
183
- │ │ └── Coupon Abuse Reporting Agent
184
- │ └── JWT Security Agent
185
- │ ├── Algorithm Confusion Validation Agent
186
- │ │ └── JWT Bypass Reporting Agent
187
- │ └── Secret Bruteforce Validation Agent (not valid - strong secret used)
188
- ├── Admin Panel Agent (spawned after finding admin.target.com)
189
- │ ├── Authentication Bypass Agent
190
- │ │ ├── Default Credentials Validation Agent (no findings - no default creds)
191
- │ │ └── SQL Injection Validation Agent (login form)
192
- │ │ └── Auth Bypass Reporting Agent
193
- │ └── File Upload Agent
194
- │ ├── WebShell Upload Validation Agent
195
- │ │ └── RCE via Upload Reporting Agent
196
- │ └── Path Traversal Validation Agent (validation failed - proper filtering detected)
197
- ├── WordPress Agent (spawned after CMS detection)
198
- │ ├── Plugin Vulnerability Agent
199
- │ │ ├── Contact Form 7 SQLi Validation Agent
200
- │ │ │ └── DB Compromise Reporting Agent
201
- │ │ └── WooCommerce XSS Validation Agent (validation failed - false positive from scanner)
202
- │ └── Theme Vulnerability Agent
203
- │ └── LFI Validation Agent (theme editor) (no findings - theme editor disabled)
204
- └── Infrastructure Agent (spawned after finding Elasticsearch)
205
- ├── Elasticsearch Agent
206
- │ ├── Open Index Validation Agent
207
- │ │ └── Data Exposure Reporting Agent
208
- │ └── Script Injection Validation Agent (validation failed - script execution disabled)
209
- └── Docker Registry Agent (spawned if found) (no findings - registry not accessible)
210
- ```
211
-
212
- EXAMPLE 2 - WHITE-BOX Code Security Review (source code provided):
213
- ```
214
- Root Agent (Coordination)
215
- ├── Static Analysis Agent
216
- │ ├── Authentication Code Agent
217
- │ │ ├── JWT Implementation Validation Agent
218
- │ │ │ └── JWT Weak Secret Reporting Agent
219
- │ │ │ └── JWT Secure Implementation Fixing Agent
220
- │ │ ├── Session Management Validation Agent
221
- │ │ │ └── Session Fixation Reporting Agent
222
- │ │ │ └── Session Security Fixing Agent
223
- │ │ └── Password Policy Validation Agent
224
- │ │ └── Weak Password Rules Reporting Agent
225
- │ │ └── Strong Password Policy Fixing Agent
226
- │ ├── Input Validation Agent
227
- │ │ ├── SQL Query Analysis Validation Agent
228
- │ │ │ ├── Prepared Statement Validation Agent
229
- │ │ │ │ └── SQLi Risk Reporting Agent
230
- │ │ │ │ └── Parameterized Query Fixing Agent
231
- │ │ │ └── Dynamic Query Validation Agent
232
- │ │ │ └── Query Injection Reporting Agent
233
- │ │ │ └── Query Builder Fixing Agent
234
- │ │ ├── XSS Prevention Validation Agent
235
- │ │ │ └── Output Encoding Validation Agent
236
- │ │ │ └── XSS Vulnerability Reporting Agent
237
- │ │ │ └── Output Sanitization Fixing Agent
238
- │ │ └── File Upload Validation Agent
239
- │ │ ├── MIME Type Validation Agent
240
- │ │ │ └── File Type Bypass Reporting Agent
241
- │ │ │ └── Proper MIME Check Fixing Agent
242
- │ │ └── Path Traversal Validation Agent
243
- │ │ └── Directory Traversal Reporting Agent
244
- │ │ └── Path Sanitization Fixing Agent
245
- │ ├── Business Logic Agent
246
- │ │ ├── Race Condition Analysis Agent
247
- │ │ │ ├── Payment Race Validation Agent
248
- │ │ │ │ └── Financial Race Reporting Agent
249
- │ │ │ │ └── Atomic Transaction Fixing Agent
250
- │ │ │ └── Account Creation Race Validation Agent (validation failed - proper locking found)
251
- │ │ ├── Authorization Logic Agent
252
- │ │ │ ├── IDOR Prevention Validation Agent
253
- │ │ │ │ └── Access Control Bypass Reporting Agent
254
- │ │ │ │ └── Authorization Check Fixing Agent
255
- │ │ │ └── Privilege Escalation Validation Agent (no findings - RBAC properly implemented)
256
- │ │ └── Financial Logic Agent
257
- │ │ ├── Price Manipulation Validation Agent (no findings - server-side validation secure)
258
- │ │ └── Discount Logic Validation Agent
259
- │ │ └── Discount Abuse Reporting Agent
260
- │ │ └── Discount Validation Fixing Agent
261
- │ └── Cryptography Agent
262
- │ ├── Encryption Implementation Agent
263
- │ │ ├── AES Usage Validation Agent
264
- │ │ │ └── Weak Encryption Reporting Agent
265
- │ │ │ └── Strong Crypto Fixing Agent
266
- │ │ └── Key Management Validation Agent
267
- │ │ └── Hardcoded Key Reporting Agent
268
- │ │ └── Secure Key Storage Fixing Agent
269
- │ └── Hash Function Agent
270
- │ └── Password Hashing Validation Agent
271
- │ └── Weak Hash Reporting Agent
272
- │ └── bcrypt Implementation Fixing Agent
273
- ├── Dynamic Testing Agent
274
- │ ├── Server Setup Agent
275
- │ │ ├── Environment Setup Validation Agent (sets up on port 8080)
276
- │ │ ├── Database Setup Validation Agent (initializes test DB)
277
- │ │ └── Service Health Validation Agent (confirms running state)
278
- │ ├── Runtime SQL Injection Agent
279
- │ │ ├── Login Form SQLi Validation Agent
280
- │ │ │ └── Auth Bypass SQLi Reporting Agent
281
- │ │ │ └── Login Security Fixing Agent
282
- │ │ ├── Search Function SQLi Validation Agent
283
- │ │ │ └── Data Extraction SQLi Reporting Agent
284
- │ │ │ └── Search Sanitization Fixing Agent
285
- │ │ └── API Parameter SQLi Validation Agent
286
- │ │ └── API SQLi Reporting Agent
287
- │ │ └── API Input Validation Fixing Agent
288
- │ ├── XSS Testing Agent
289
- │ │ ├── Stored XSS Validation Agent (comment system)
290
- │ │ │ └── Persistent XSS Reporting Agent
291
- │ │ │ └── Input Filtering Fixing Agent
292
- │ │ ├── Reflected XSS Validation Agent (search results) (validation failed - output properly encoded)
293
- │ │ └── DOM XSS Validation Agent (client-side routing)
294
- │ │ └── DOM XSS Reporting Agent
295
- │ │ └── Client Sanitization Fixing Agent
296
- │ ├── Business Logic Testing Agent
297
- │ │ ├── Payment Flow Validation Agent
298
- │ │ │ ├── Negative Amount Validation Agent
299
- │ │ │ │ └── Payment Bypass Reporting Agent
300
- │ │ │ │ └── Amount Validation Fixing Agent
301
- │ │ │ └── Currency Manipulation Validation Agent
302
- │ │ │ └── Currency Fraud Reporting Agent
303
- │ │ │ └── Currency Lock Fixing Agent
304
- │ │ ├── User Registration Validation Agent
305
- │ │ │ └── Email Verification Bypass Validation Agent
306
- │ │ │ └── Email Security Reporting Agent
307
- │ │ │ └── Verification Enforcement Fixing Agent
308
- │ │ └── File Processing Validation Agent
309
- │ │ ├── XXE Attack Validation Agent
310
- │ │ │ └── XML Entity Reporting Agent
311
- │ │ │ └── XML Security Fixing Agent
312
- │ │ └── Deserialization Validation Agent
313
- │ │ └── Object Injection Reporting Agent
314
- │ │ └── Safe Deserialization Fixing Agent
315
- │ └── API Security Testing Agent
316
- │ ├── GraphQL Security Agent
317
- │ │ ├── Query Depth Validation Agent
318
- │ │ │ └── DoS Attack Reporting Agent
319
- │ │ │ └── Query Limiting Fixing Agent
320
- │ │ └── Schema Introspection Validation Agent (no findings - introspection disabled in production)
321
- │ └── REST API Agent
322
- │ ├── Rate Limiting Validation Agent (validation failed - rate limiting working properly)
323
- │ └── CORS Validation Agent
324
- │ └── Origin Bypass Reporting Agent
325
- │ └── CORS Policy Fixing Agent
326
- └── Infrastructure Code Agent
327
- ├── Docker Security Agent
328
- │ ├── Dockerfile Analysis Validation Agent
329
- │ │ └── Container Privilege Reporting Agent
330
- │ │ └── Secure Container Fixing Agent
331
- │ └── Secret Management Validation Agent
332
- │ └── Hardcoded Secret Reporting Agent
333
- │ └── Secret Externalization Fixing Agent
334
- ├── CI/CD Pipeline Agent
335
- │ └── Pipeline Security Validation Agent
336
- │ └── Pipeline Injection Reporting Agent
337
- │ └── Pipeline Hardening Fixing Agent
338
- └── Cloud Configuration Agent
339
- ├── AWS Config Validation Agent
340
- │ └── S3 Bucket Exposure Reporting Agent
341
- │ └── Bucket Security Fixing Agent
342
- └── K8s Config Validation Agent
343
- └── Pod Security Reporting Agent
344
- └── Security Context Fixing Agent
345
- ```
147
+ AGENT ISOLATION & SANDBOXING:
148
+ - Each subagent runs in a completely isolated sandbox environment
149
+ - Each agent has its own: browser sessions, terminal sessions, proxy (history and scope rules), /workspace directory, environment variables, running processes
150
+ - Agents cannot share network ports or interfere with each other's processes
151
+ - Only shared resource is /shared_workspace for collaboration and file exchange
152
+ - Use /shared_workspace to pass files, reports, and coordination data between agents
346
153
 
347
154
  SIMPLE WORKFLOW RULES:
348
155
 
@@ -423,7 +230,7 @@ Tool calls use XML format:
423
230
  CRITICAL RULES:
424
231
  1. One tool call per message
425
232
  2. Tool call must be last in message
426
- 3. End response after </function> tag
233
+ 3. End response after </function> tag. It's your stop word. Do not continue after it.
427
234
  5. Thinking is NOT optional - it's required for reasoning and success
428
235
 
429
236
  SPRAYING EXECUTION NOTE:
strix/cli/main.py CHANGED
@@ -8,11 +8,11 @@ import asyncio
8
8
  import logging
9
9
  import os
10
10
  import secrets
11
+ import shutil
11
12
  import sys
12
13
  from pathlib import Path
13
14
  from typing import Any
14
15
  from urllib.parse import urlparse
15
- import shutil
16
16
 
17
17
  import docker
18
18
  import litellm
@@ -74,7 +74,7 @@ def validate_environment() -> None:
74
74
  error_text.append("• ", style="white")
75
75
  error_text.append("STRIX_LLM", style="bold cyan")
76
76
  error_text.append(
77
- " - Model name to use with litellm (e.g., 'anthropic/claude-opus-4-1-20250805')\n",
77
+ " - Model name to use with litellm (e.g., 'openai/gpt-5')\n",
78
78
  style="white",
79
79
  )
80
80
  error_text.append("• ", style="white")
@@ -91,9 +91,7 @@ def validate_environment() -> None:
91
91
  )
92
92
 
93
93
  error_text.append("\nExample setup:\n", style="white")
94
- error_text.append(
95
- "export STRIX_LLM='anthropic/claude-opus-4-1-20250805'\n", style="dim white"
96
- )
94
+ error_text.append("export STRIX_LLM='openai/gpt-5'\n", style="dim white")
97
95
  error_text.append("export LLM_API_KEY='your-api-key-here'\n", style="dim white")
98
96
  if missing_optional_vars:
99
97
  error_text.append(
@@ -127,7 +125,9 @@ def check_docker_installed() -> None:
127
125
  error_text.append("DOCKER NOT INSTALLED", style="bold red")
128
126
  error_text.append("\n\n", style="white")
129
127
  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")
128
+ error_text.append(
129
+ "Please install Docker and ensure the 'docker' command is available.\n\n", style="white"
130
+ )
131
131
 
132
132
  panel = Panel(
133
133
  error_text,
@@ -144,7 +144,7 @@ async def warm_up_llm() -> None:
144
144
  console = Console()
145
145
 
146
146
  try:
147
- model_name = os.getenv("STRIX_LLM", "anthropic/claude-opus-4-1-20250805")
147
+ model_name = os.getenv("STRIX_LLM", "openai/gpt-5")
148
148
  api_key = os.getenv("LLM_API_KEY")
149
149
 
150
150
  if api_key:
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-opus-4-1-20250805")
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
@@ -28,6 +28,39 @@ api_key = os.getenv("LLM_API_KEY")
28
28
  if api_key:
29
29
  litellm.api_key = api_key
30
30
 
31
+ MODELS_WITHOUT_STOP_WORDS = [
32
+ "gpt-5",
33
+ "gpt-5-mini",
34
+ "gpt-5-nano",
35
+ "o1-mini",
36
+ "o1-preview",
37
+ "o1",
38
+ "o1-2024-12-17",
39
+ "o3",
40
+ "o3-2025-04-16",
41
+ "o3-mini-2025-01-31",
42
+ "o3-mini",
43
+ "o4-mini",
44
+ "o4-mini-2025-04-16",
45
+ "grok-4-0709",
46
+ ]
47
+
48
+ REASONING_EFFORT_SUPPORTED_MODELS = [
49
+ "gpt-5",
50
+ "gpt-5-mini",
51
+ "gpt-5-nano",
52
+ "o1-2024-12-17",
53
+ "o1",
54
+ "o3",
55
+ "o3-2025-04-16",
56
+ "o3-mini-2025-01-31",
57
+ "o3-mini",
58
+ "o4-mini",
59
+ "o4-mini-2025-04-16",
60
+ "gemini-2.5-flash",
61
+ "gemini-2.5-pro",
62
+ ]
63
+
31
64
 
32
65
  class StepRole(str, Enum):
33
66
  AGENT = "agent"
@@ -240,16 +273,48 @@ class LLM:
240
273
  "supported": supports_prompt_caching(self.config.model_name),
241
274
  }
242
275
 
276
+ def _should_include_stop_param(self) -> bool:
277
+ if not self.config.model_name:
278
+ return True
279
+
280
+ actual_model_name = self.config.model_name.split("/")[-1].lower()
281
+ model_name_lower = self.config.model_name.lower()
282
+
283
+ return not any(
284
+ actual_model_name == unsupported_model.lower()
285
+ or model_name_lower == unsupported_model.lower()
286
+ for unsupported_model in MODELS_WITHOUT_STOP_WORDS
287
+ )
288
+
289
+ def _should_include_reasoning_effort(self) -> bool:
290
+ if not self.config.model_name:
291
+ return False
292
+
293
+ actual_model_name = self.config.model_name.split("/")[-1].lower()
294
+ model_name_lower = self.config.model_name.lower()
295
+
296
+ return any(
297
+ actual_model_name == supported_model.lower()
298
+ or model_name_lower == supported_model.lower()
299
+ for supported_model in REASONING_EFFORT_SUPPORTED_MODELS
300
+ )
301
+
243
302
  async def _make_request(
244
303
  self,
245
304
  messages: list[dict[str, Any]],
246
305
  ) -> ModelResponse:
247
- completion_args = {
306
+ completion_args: dict[str, Any] = {
248
307
  "model": self.config.model_name,
249
308
  "messages": messages,
250
309
  "temperature": self.config.temperature,
251
310
  }
252
311
 
312
+ if self._should_include_stop_param():
313
+ completion_args["stop"] = ["</function>"]
314
+
315
+ if self._should_include_reasoning_effort():
316
+ completion_args["reasoning_effort"] = "medium"
317
+
253
318
  queue = get_global_queue()
254
319
  response = await queue.make_request(completion_args)
255
320
 
@@ -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-opus-4-1-20250805")
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")
strix/prompts/__init__.py CHANGED
@@ -49,25 +49,21 @@ def generate_modules_description() -> str:
49
49
  if not available_modules:
50
50
  return "No prompt modules available"
51
51
 
52
- description_parts = []
52
+ all_module_names = get_all_module_names()
53
53
 
54
- for category, modules in available_modules.items():
55
- modules_str = ", ".join(modules)
56
- description_parts.append(f"{category} ({modules_str})")
54
+ if not all_module_names:
55
+ return "No prompt modules available"
56
+
57
+ sorted_modules = sorted(all_module_names)
58
+ modules_str = ", ".join(sorted_modules)
57
59
 
58
60
  description = (
59
- f"List of prompt modules to load for this agent (max 3). "
60
- f"Available modules: {', '.join(description_parts)}. "
61
+ f"List of prompt modules to load for this agent (max 3). Available modules: {modules_str}. "
61
62
  )
62
63
 
63
- example_modules = []
64
- for modules in available_modules.values():
65
- example_modules.extend(modules[:2])
66
- if len(example_modules) >= 2:
67
- break
68
-
64
+ example_modules = sorted_modules[:2]
69
65
  if example_modules:
70
- example = f"Example: {example_modules[:2]} for specialized agent"
66
+ example = f"Example: {', '.join(example_modules)} for specialized agent"
71
67
  description += example
72
68
 
73
69
  return description
@@ -5,8 +5,8 @@
5
5
 
6
6
  <jwt_structure>
7
7
  header.payload.signature
8
- - Header: {"alg":"HS256","typ":"JWT"}
9
- - Payload: {"sub":"1234","name":"John","iat":1516239022}
8
+ - Header: {% raw %}{"alg":"HS256","typ":"JWT"}{% endraw %}
9
+ - Payload: {% raw %}{"sub":"1234","name":"John","iat":1516239022}{% endraw %}
10
10
  - Signature: HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
11
11
  </jwt_structure>
12
12
 
@@ -19,7 +19,7 @@ RS256 to HS256:
19
19
  </algorithm_confusion>
20
20
 
21
21
  <none_algorithm>
22
- - Set "alg": "none" in header
22
+ - Set {% raw %}"alg": "none"{% endraw %} in header
23
23
  - Remove signature completely (keep the trailing dot)
24
24
  </none_algorithm>
25
25
 
@@ -28,16 +28,16 @@ Common secrets: 'secret', 'password', '123456', 'key', 'jwt_secret', 'your-256-b
28
28
  </weak_secrets>
29
29
 
30
30
  <kid_manipulation>
31
- - SQL Injection: "kid": "key' UNION SELECT 'secret'--"
32
- - Command injection: "kid": "|sleep 10"
33
- - Path traversal: "kid": "../../../../../../dev/null"
31
+ - SQL Injection: {% raw %}"kid": "key' UNION SELECT 'secret'--"{% endraw %}
32
+ - Command injection: {% raw %}"kid": "|sleep 10"{% endraw %}
33
+ - Path traversal: {% raw %}"kid": "../../../../../../dev/null"{% endraw %}
34
34
  </kid_manipulation>
35
35
  </common_attacks>
36
36
 
37
37
  <advanced_techniques>
38
38
  <jwk_injection>
39
39
  Embed public key in token header:
40
- {"jwk": {"kty": "RSA", "n": "your-public-key-n", "e": "AQAB"}}
40
+ {% raw %}{"jwk": {"kty": "RSA", "n": "your-public-key-n", "e": "AQAB"}}{% endraw %}
41
41
  </jwk_injection>
42
42
 
43
43
  <jku_manipulation>
@@ -48,7 +48,7 @@ HTML form auto-submit:
48
48
  <json_csrf>
49
49
  For JSON endpoints:
50
50
  <form enctype="text/plain" action="https://target.com/api">
51
- <input name='{"amount":1000,"to":"attacker","ignore":"' value='"}'>
51
+ <input name='{% raw %}{"amount":1000,"to":"attacker","ignore":"{% endraw %}' value='"}'>
52
52
  </form>
53
53
  </json_csrf>
54
54
 
@@ -15,7 +15,7 @@
15
15
 
16
16
  <advanced_enumeration>
17
17
  - Boundary values: 0, -1, null, empty string, max int
18
- - Different formats: {"id":123} vs {"id":"123"}
18
+ - Different formats: {% raw %}{"id":123} vs {"id":"123"}{% endraw %}
19
19
  - ID patterns: increment, decrement, similar patterns
20
20
  - Wildcard testing: *, %, _, all
21
21
  - Array notation: id[]=123&id[]=456
@@ -51,7 +51,7 @@ for i in range(1, 10000):
51
51
  <type_confusion>
52
52
  - String where int expected: "123" vs 123
53
53
  - Array where single value expected: [123] vs 123
54
- - Object injection: {"id": {"$ne": null}}
54
+ - Object injection: {% raw %}{"id": {"$ne": null}}{% endraw %}
55
55
  </type_confusion>
56
56
  </exploitation_techniques>
57
57
 
@@ -106,7 +106,7 @@ query { u1: user(id: 123) { data } u2: user(id: 456) { data } }
106
106
 
107
107
  <websocket_idor>
108
108
  Subscribe to other users' channels:
109
- {"subscribe": "user_456_notifications"}
109
+ {% raw %}{"subscribe": "user_456_notifications"}{% endraw %}
110
110
  </websocket_idor>
111
111
 
112
112
  <file_path_idor>
@@ -94,7 +94,7 @@ ${IFS}id
94
94
  <polyglot_payloads>
95
95
  Works in multiple contexts:
96
96
  ;id;#' |id| #" |id| #
97
- ${{7*7}}${7*7}<%= 7*7 %>${{7*7}}#{7*7}
97
+ {% raw %}${{7*7}}${7*7}<%= 7*7 %>${{7*7}}#{7*7}{% endraw %}
98
98
  </polyglot_payloads>
99
99
 
100
100
  <blind_rce>
@@ -152,9 +152,9 @@ PostgreSQL:
152
152
 
153
153
  <nosql_injection>
154
154
  <mongodb>
155
- {"username": {"$ne": null}, "password": {"$ne": null}}
156
- {"$where": "this.username == 'admin'"}
157
- {"username": {"$regex": "^admin"}}
155
+ {% raw %}{"username": {"$ne": null}, "password": {"$ne": null}}{% endraw %}
156
+ {% raw %}{"$where": "this.username == 'admin'"}{% endraw %}
157
+ {% raw %}{"username": {"$regex": "^admin"}}{% endraw %}
158
158
  </mongodb>
159
159
 
160
160
  <graphql>
@@ -9,7 +9,7 @@
9
9
  - Headers: User-Agent, Referer, X-Forwarded-For
10
10
  - Cookies (if reflected)
11
11
  - File uploads (filename, metadata)
12
- - JSON endpoints: {"user":"<payload>"}
12
+ - JSON endpoints: {% raw %}{"user":"<payload>"}{% endraw %}
13
13
  - postMessage handlers
14
14
  - DOM properties: location.hash, document.referrer
15
15
  - WebSocket messages
@@ -97,7 +97,7 @@ jaVasCript:/*-/*`/*\`/*'/*"/**/(/* */oNcliCk=alert() )//%0D%0A%0d%0a//</stYle/</
97
97
 
98
98
  <csp_bypasses>
99
99
  - JSONP endpoints: <script src="//site.com/jsonp?callback=alert">
100
- - AngularJS: {{constructor.constructor('alert(1)')()}}
100
+ - AngularJS: {% raw %}{{constructor.constructor('alert(1)')()}}{% endraw %}
101
101
  - Script gadgets in allowed libraries
102
102
  - Base tag injection: <base href="//evil.com/">
103
103
  - Object/embed: <object data="data:text/html,<script>alert(1)</script>">
@@ -145,7 +145,7 @@ navigator.mediaDevices.getUserMedia({video:true}).then(s=>...)
145
145
  </markdown>
146
146
 
147
147
  <react_vue>
148
- - dangerouslySetInnerHTML={{__html: payload}}
148
+ - dangerouslySetInnerHTML={% raw %}{{__html: payload}}{% endraw %}
149
149
  - v-html directive bypass
150
150
  </react_vue>
151
151
 
@@ -91,7 +91,7 @@ evil.dtd:
91
91
 
92
92
  <specific_contexts>
93
93
  <json_xxe>
94
- {"name": "test", "content": "<?xml version='1.0'?><!DOCTYPE foo [<!ENTITY xxe SYSTEM 'file:///etc/passwd'>]><x>&xxe;</x>"}
94
+ {% raw %}{"name": "test", "content": "<?xml version='1.0'?><!DOCTYPE foo [<!ENTITY xxe SYSTEM 'file:///etc/passwd'>]><x>&xxe;</x>"}{% endraw %}
95
95
  </json_xxe>
96
96
 
97
97
  <soap_xxe>
@@ -57,6 +57,10 @@ def _run_agent_in_thread(
57
57
  - Work independently with your own approach
58
58
  - Use agent_finish when complete to report back to parent
59
59
  - You are a SPECIALIST for this specific task
60
+ - The previous browser, sessions, proxy history, and files in /workspace were for your
61
+ parent agent. Do not depend on them.
62
+ - You are starting with a fresh context. Fresh proxy, browser, and files.
63
+ Only stuff in /shared_workspace is passed to you from context.
60
64
  </instructions>
61
65
  </agent_delegation>"""
62
66
 
@@ -192,16 +196,6 @@ def create_agent(
192
196
  if prompt_modules:
193
197
  module_list = [m.strip() for m in prompt_modules.split(",") if m.strip()]
194
198
 
195
- if "root_agent" in module_list:
196
- return {
197
- "success": False,
198
- "error": (
199
- "The 'root_agent' module is reserved for the main agent "
200
- "and cannot be used by sub-agents"
201
- ),
202
- "agent_id": None,
203
- }
204
-
205
199
  if len(module_list) > 3:
206
200
  return {
207
201
  "success": False,
@@ -59,7 +59,7 @@ Use this tool when:
59
59
  <tool name="create_agent">
60
60
  <description>Create and spawn a new agent to handle a specific subtask.
61
61
 
62
- MANDATORY REQUIREMENT: You MUST call view_agent_graph FIRST before creating any new agent to check if there is already an agent working on the same or similar task. Only create a new agent if no existing agent is handling the specific task.</description>
62
+ Only create a new agent if no existing agent is handling the specific task.</description>
63
63
  <details>The new agent inherits the parent's conversation history and context up to the point
64
64
  of creation, then continues with its assigned subtask. This enables decomposition
65
65
  of complex penetration testing tasks into specialized sub-agents.
@@ -67,12 +67,6 @@ MANDATORY REQUIREMENT: You MUST call view_agent_graph FIRST before creating any
67
67
  The agent runs asynchronously and independently, allowing the parent to continue
68
68
  immediately while the new agent executes its task in the background.
69
69
 
70
- CRITICAL: Before calling this tool, you MUST first use view_agent_graph to:
71
- - Examine all existing agents and their current tasks
72
- - Verify no agent is already working on the same or similar objective
73
- - Avoid duplication of effort and resource waste
74
- - Ensure efficient coordination across the multi-agent system
75
-
76
70
  If you as a parent agent don't absolutely have anything to do while your subagents are running, you can use wait_for_message tool. The subagent will continue to run in the background, and update you when it's done.
77
71
  </details>
78
72
  <parameters>
@@ -93,9 +87,6 @@ MANDATORY REQUIREMENT: You MUST call view_agent_graph FIRST before creating any
93
87
  <description>Response containing: - agent_id: Unique identifier for the created agent - success: Whether the agent was created successfully - message: Status message - agent_info: Details about the created agent</description>
94
88
  </returns>
95
89
  <examples>
96
- # REQUIRED: First check agent graph before creating any new agent
97
- <function=view_agent_graph>
98
- </function>
99
90
  # REQUIRED: Check agent graph again before creating another agent
100
91
  <function=view_agent_graph>
101
92
  </function>
@@ -108,7 +99,6 @@ MANDATORY REQUIREMENT: You MUST call view_agent_graph FIRST before creating any
108
99
  <parameter=prompt_modules>sql_injection</parameter>
109
100
  </function>
110
101
 
111
- # Create specialized authentication testing agent with multiple modules (comma-separated)
112
102
  <function=create_agent>
113
103
  <parameter=task>Test authentication mechanisms, JWT implementation, and session management
114
104
  for security vulnerabilities and bypass techniques.</parameter>
@@ -63,6 +63,10 @@
63
63
  - When you need multiple characters sent as a single unit
64
64
  12. Do NOT use terminal actions for file editing or writing. Use the replace_in_file,
65
65
  write_to_file, or read_file tools instead.
66
+ 13. PREFER SIMPLE COMMANDS: Avoid complex multiline commands with nested quotes or
67
+ complex syntax. Break down complex operations into simpler, individual commands
68
+ for better reliability and readability. Never send multiple commands in a single
69
+ input list with multiple "Enter" keys - execute one command at a time instead.
66
70
  </notes>
67
71
  <examples>
68
72
  # Create new terminal with Node.js (default terminal)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: strix-agent
3
- Version: 0.1.7
3
+ Version: 0.1.9
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.75.5.post1,<2.0.0)
25
+ Requires-Dist: litellm[proxy] (>=1.75.7,<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)
@@ -68,7 +68,7 @@ Strix are autonomous AI agents that act just like real hackers - they run your c
68
68
  pipx install strix-agent
69
69
 
70
70
  # Configure AI provider
71
- export STRIX_LLM="anthropic/claude-opus-4-1-20250805"
71
+ export STRIX_LLM="openai/gpt-5"
72
72
  export LLM_API_KEY="your-api-key"
73
73
 
74
74
  # Run security assessment
@@ -131,7 +131,7 @@ strix --target api.your-app.com --instruction "Prioritize authentication and aut
131
131
 
132
132
  ```bash
133
133
  # Required
134
- export STRIX_LLM="anthropic/claude-opus-4-1-20250805"
134
+ export STRIX_LLM="openai/gpt-5"
135
135
  export LLM_API_KEY="your-api-key"
136
136
 
137
137
  # Recommended
@@ -1,14 +1,14 @@
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=zQaz6k7HjY2ZbKw5fcO1HaYnqr1nwkry5IDtuYmhJ8w,25652
4
+ strix/agents/StrixAgent/system_prompt.jinja,sha256=R1liXNKoN2henED8HPihrCw_G5dqsl-GUiRlkSX601I,14546
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
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=WITQC-_NWXQMGpgJIRK6JrHdHr-mFkIysd9cEjhTQ64,18854
11
+ strix/cli/main.py,sha256=aQ67cKRWR6IC6ICl6F88S8CVZsNWwz84naV_pesYiIo,18784
12
12
  strix/cli/tool_components/__init__.py,sha256=Dz5ci3VMzvhlPOwQ2x9Nd11cmFzx1OP7sdlpZPMTT4k,935
13
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
@@ -27,31 +27,31 @@ strix/cli/tool_components/user_message_renderer.py,sha256=6gHJ1hG-pwcTsxLM7JuYZu
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=UkHAhbaUV0WcE-TC6WnT0ZSf0qGlseFV_OPx4bUv-tY,625
31
- strix/llm/llm.py,sha256=wFeDI6vQfZt1bDLVoL5tpGZ9zIUDnMhPwkgIyhP4dGc,10997
32
- strix/llm/memory_compressor.py,sha256=HBG2V2YEkM_fP7D-_rQ6QFE42ZojdlYoDOivzKhpopU,6878
30
+ strix/llm/config.py,sha256=iBv1tuUOUDcP2gVQWhjtN8wtO5lWOipsER7Rnc3p6k4,603
31
+ strix/llm/llm.py,sha256=wtzAh7THjPoZGOH12Fe-5IDZn_9qwwS7M9-4EfXFfWc,12719
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
- strix/prompts/__init__.py,sha256=JGzGxp0J86mpmCcWurtikKh_xcd8PvVfjtFDOOh0NaQ,3621
35
+ strix/prompts/__init__.py,sha256=ocFjc9d-QolphPKr2cMVMHS52piJSSubBJdrwEFEBTI,3490
36
36
  strix/prompts/coordination/root_agent.jinja,sha256=Z34uffB-lIt6Oei307dtD7oyXSmX2DSApeoRcA3LcnM,1902
37
- strix/prompts/vulnerabilities/authentication_jwt.jinja,sha256=o0mfundZ3OfTGHOJRuGb8W17XuoZDcUoegIKrmmMxqU,3827
37
+ strix/prompts/vulnerabilities/authentication_jwt.jinja,sha256=FA2z8zdugITAc6QphrocA5O8bqyTl9TN_iTJxrtyNkQ,3974
38
38
  strix/prompts/vulnerabilities/business_logic.jinja,sha256=pazAYPIduxcnTyn0rDJj7nQ2Gmr9Ww6EqtY1b-oKC_k,4036
39
- strix/prompts/vulnerabilities/csrf.jinja,sha256=u5gxyUT44enHyG3fqBo4X-4Sd4STSDapGZyOBH6iZ3k,4430
40
- strix/prompts/vulnerabilities/idor.jinja,sha256=1q_0BNqRyA6SjRCFmPAnWMqVpDy9qaAcVDJp-xnq8VM,4345
39
+ strix/prompts/vulnerabilities/csrf.jinja,sha256=CiwzG5UFT8SEt9jlEfSU4gJvonrVSDlaiZ1ff9eYE_0,4451
40
+ strix/prompts/vulnerabilities/idor.jinja,sha256=tpk74gFvrkO2pcPeBB5BpZ2-ZusbU4X-XxFFd5SYvbM,4408
41
41
  strix/prompts/vulnerabilities/race_conditions.jinja,sha256=31aKYDqL50v5SP2keS2Gj7cTBuF3WhKIs2DKsZNezSI,4869
42
- strix/prompts/vulnerabilities/rce.jinja,sha256=PUUnIJqH5IXQm9qLV6rqIAarP_8NQo6QVhYh_55ZCOA,5792
43
- strix/prompts/vulnerabilities/sql_injection.jinja,sha256=oFTaN5ZFQ5dJSDoTbLMRkTxEw6Q4pbvPtLUo7K3bSYM,5637
42
+ strix/prompts/vulnerabilities/rce.jinja,sha256=VPkQR4vHNDph_u_wWfQKyercq9jMpn8xTWr1k-ybPck,5813
43
+ strix/prompts/vulnerabilities/sql_injection.jinja,sha256=xdcasdmd80zX7qpd9bu3Hn1BKD4qp1NEcq5yP-OgLTc,5700
44
44
  strix/prompts/vulnerabilities/ssrf.jinja,sha256=MfRs3MtvgAEauaOrCHpKIoRnS0YCZKyCDaIb_xm5EWA,4440
45
- strix/prompts/vulnerabilities/xss.jinja,sha256=ozaEuV1X4QPRLYiUAfpQplzbovQU6QmtVF115-8_xrk,6139
46
- strix/prompts/vulnerabilities/xxe.jinja,sha256=E8QUtIMQoEft7FRQzz7a2SgvrpqNecRVYvhaIWOco0w,7081
45
+ strix/prompts/vulnerabilities/xss.jinja,sha256=rVD25fOYxeVgd6k-7eePkzADxCi2XopPSSNPd4J9NWg,6202
46
+ strix/prompts/vulnerabilities/xxe.jinja,sha256=hZ_SlrQQPsDWN2UF4VhIhpXIDAK66su055uEpgAdt5Y,7102
47
47
  strix/runtime/__init__.py,sha256=v2oQ1JnfZXOTU8N3NOEI_MbxNp8BfNj8hTgvjCsNGvY,445
48
48
  strix/runtime/docker_runtime.py,sha256=-GNUWcqiWyxaXHI5YzlD-ZsfKW6NU23aeKERbqacvpg,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
52
52
  strix/tools/agents_graph/__init__.py,sha256=FLJ2kGxXICY2pRKrC0sgIc3w3KhZo7VID7hbwYcgBfM,278
53
- strix/tools/agents_graph/agents_graph_actions.py,sha256=T0c68IQPL_SLLdUVGziZoKUZSnZeTIF599E1k-N0NfQ,20346
54
- strix/tools/agents_graph/agents_graph_actions_schema.xml,sha256=nMUg_AiIjoBqhkQTO7rxWyhut0nPTWzDGHq3Sa5s6ag,12477
53
+ strix/tools/agents_graph/agents_graph_actions.py,sha256=khHOIBWKzvZdneQqvhgRQIuGZJ_5shDKJ5JVCCdSeXg,20320
54
+ strix/tools/agents_graph/agents_graph_actions_schema.xml,sha256=eiDsH-BiUD-vO4M_HvvYhz6s6N9la-c7tz9CJdDKIik,11786
55
55
  strix/tools/argument_parser.py,sha256=FpRFuXHrrMcLOthPkeKd2qmXk5IwFU_EMV1mL8RvPls,3835
56
56
  strix/tools/browser/__init__.py,sha256=7azA1td3CfwCVqMYIIzT0vGM0-JUNq3sZBYB0QnwFDk,75
57
57
  strix/tools/browser/browser_actions.py,sha256=ZmHdPoow9R-rkSjopYsY1-56fL7Tm-WDCaIPvs1_hys,7037
@@ -83,7 +83,7 @@ strix/tools/reporting/reporting_actions.py,sha256=RIp3u3pmlRXx_uCr2Kc8R7yYiSe3pz
83
83
  strix/tools/reporting/reporting_actions_schema.xml,sha256=y_g0iuyBuCh79fvA0ri8fOPlXY7uUd-P-mdzXLUyIJg,1629
84
84
  strix/tools/terminal/__init__.py,sha256=yF9qWbC9tYXYbkQsX5p8NNKwxlpmlGrF8UU4r6y0qwI,78
85
85
  strix/tools/terminal/terminal_actions.py,sha256=CMy3SzbMfIwDWVurOcRh28VBSoOexrUirF3kjCiHtq4,1706
86
- strix/tools/terminal/terminal_actions_schema.xml,sha256=aBUt3hOcfudnmeX5_rQVqqqE6MGiLuuVWa-GklVzkmk,7280
86
+ strix/tools/terminal/terminal_actions_schema.xml,sha256=R009Hs7A9eW8jy7C5YjGOyjUdVL9ULR3T0k2iJwVWQY,7623
87
87
  strix/tools/terminal/terminal_instance.py,sha256=rnLtP54eswcpw-gjKzHPrrqytf2iHahpSH0Bc6Z6Xlo,7280
88
88
  strix/tools/terminal/terminal_manager.py,sha256=xV4MPnaFn9yJQ8bZgptupYjBuSO_NlFUXXqqxb6gfVI,6601
89
89
  strix/tools/thinking/__init__.py,sha256=-v4fG4fyFkqsTSWspDtCT6IRlyRM8zeUwEM-kscaxDE,58
@@ -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.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,,
95
+ strix_agent-0.1.9.dist-info/LICENSE,sha256=fblpcTQlHjFL2NOSV_4XDJiz4q2bLtZ-l6yvlhPnueM,11345
96
+ strix_agent-0.1.9.dist-info/METADATA,sha256=-UUFG9fDBMVSDAwBZJnrcBSQ-ZKvNWyhQPf5lat-k1o,6521
97
+ strix_agent-0.1.9.dist-info/WHEEL,sha256=RaoafKOydTQ7I_I3JTrPCg6kUmTgtm4BornzOqyEfJ8,88
98
+ strix_agent-0.1.9.dist-info/entry_points.txt,sha256=sswIgnkzSVSzQ3Rd046g7mhIPQaj_7RYlXgU_bQelF0,45
99
+ strix_agent-0.1.9.dist-info/RECORD,,