strix-agent 0.4.0__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/__init__.py +0 -0
- strix/agents/StrixAgent/__init__.py +4 -0
- strix/agents/StrixAgent/strix_agent.py +89 -0
- strix/agents/StrixAgent/system_prompt.jinja +404 -0
- strix/agents/__init__.py +10 -0
- strix/agents/base_agent.py +518 -0
- strix/agents/state.py +163 -0
- strix/interface/__init__.py +4 -0
- strix/interface/assets/tui_styles.tcss +694 -0
- strix/interface/cli.py +230 -0
- strix/interface/main.py +500 -0
- strix/interface/tool_components/__init__.py +39 -0
- strix/interface/tool_components/agents_graph_renderer.py +123 -0
- strix/interface/tool_components/base_renderer.py +62 -0
- strix/interface/tool_components/browser_renderer.py +120 -0
- strix/interface/tool_components/file_edit_renderer.py +99 -0
- strix/interface/tool_components/finish_renderer.py +31 -0
- strix/interface/tool_components/notes_renderer.py +108 -0
- strix/interface/tool_components/proxy_renderer.py +255 -0
- strix/interface/tool_components/python_renderer.py +34 -0
- strix/interface/tool_components/registry.py +72 -0
- strix/interface/tool_components/reporting_renderer.py +53 -0
- strix/interface/tool_components/scan_info_renderer.py +64 -0
- strix/interface/tool_components/terminal_renderer.py +131 -0
- strix/interface/tool_components/thinking_renderer.py +29 -0
- strix/interface/tool_components/user_message_renderer.py +43 -0
- strix/interface/tool_components/web_search_renderer.py +28 -0
- strix/interface/tui.py +1274 -0
- strix/interface/utils.py +559 -0
- strix/llm/__init__.py +15 -0
- strix/llm/config.py +20 -0
- strix/llm/llm.py +465 -0
- strix/llm/memory_compressor.py +212 -0
- strix/llm/request_queue.py +87 -0
- strix/llm/utils.py +87 -0
- strix/prompts/README.md +64 -0
- strix/prompts/__init__.py +109 -0
- strix/prompts/cloud/.gitkeep +0 -0
- strix/prompts/coordination/root_agent.jinja +41 -0
- strix/prompts/custom/.gitkeep +0 -0
- strix/prompts/frameworks/fastapi.jinja +142 -0
- strix/prompts/frameworks/nextjs.jinja +126 -0
- strix/prompts/protocols/graphql.jinja +215 -0
- strix/prompts/reconnaissance/.gitkeep +0 -0
- strix/prompts/technologies/firebase_firestore.jinja +177 -0
- strix/prompts/technologies/supabase.jinja +189 -0
- strix/prompts/vulnerabilities/authentication_jwt.jinja +147 -0
- strix/prompts/vulnerabilities/broken_function_level_authorization.jinja +146 -0
- strix/prompts/vulnerabilities/business_logic.jinja +171 -0
- strix/prompts/vulnerabilities/csrf.jinja +174 -0
- strix/prompts/vulnerabilities/idor.jinja +195 -0
- strix/prompts/vulnerabilities/information_disclosure.jinja +222 -0
- strix/prompts/vulnerabilities/insecure_file_uploads.jinja +188 -0
- strix/prompts/vulnerabilities/mass_assignment.jinja +141 -0
- strix/prompts/vulnerabilities/open_redirect.jinja +177 -0
- strix/prompts/vulnerabilities/path_traversal_lfi_rfi.jinja +142 -0
- strix/prompts/vulnerabilities/race_conditions.jinja +164 -0
- strix/prompts/vulnerabilities/rce.jinja +154 -0
- strix/prompts/vulnerabilities/sql_injection.jinja +151 -0
- strix/prompts/vulnerabilities/ssrf.jinja +135 -0
- strix/prompts/vulnerabilities/subdomain_takeover.jinja +155 -0
- strix/prompts/vulnerabilities/xss.jinja +169 -0
- strix/prompts/vulnerabilities/xxe.jinja +184 -0
- strix/runtime/__init__.py +19 -0
- strix/runtime/docker_runtime.py +399 -0
- strix/runtime/runtime.py +29 -0
- strix/runtime/tool_server.py +205 -0
- strix/telemetry/__init__.py +4 -0
- strix/telemetry/tracer.py +337 -0
- strix/tools/__init__.py +64 -0
- strix/tools/agents_graph/__init__.py +16 -0
- strix/tools/agents_graph/agents_graph_actions.py +621 -0
- strix/tools/agents_graph/agents_graph_actions_schema.xml +226 -0
- strix/tools/argument_parser.py +121 -0
- strix/tools/browser/__init__.py +4 -0
- strix/tools/browser/browser_actions.py +236 -0
- strix/tools/browser/browser_actions_schema.xml +183 -0
- strix/tools/browser/browser_instance.py +533 -0
- strix/tools/browser/tab_manager.py +342 -0
- strix/tools/executor.py +305 -0
- strix/tools/file_edit/__init__.py +4 -0
- strix/tools/file_edit/file_edit_actions.py +141 -0
- strix/tools/file_edit/file_edit_actions_schema.xml +128 -0
- strix/tools/finish/__init__.py +4 -0
- strix/tools/finish/finish_actions.py +174 -0
- strix/tools/finish/finish_actions_schema.xml +45 -0
- strix/tools/notes/__init__.py +14 -0
- strix/tools/notes/notes_actions.py +191 -0
- strix/tools/notes/notes_actions_schema.xml +150 -0
- strix/tools/proxy/__init__.py +20 -0
- strix/tools/proxy/proxy_actions.py +101 -0
- strix/tools/proxy/proxy_actions_schema.xml +267 -0
- strix/tools/proxy/proxy_manager.py +785 -0
- strix/tools/python/__init__.py +4 -0
- strix/tools/python/python_actions.py +47 -0
- strix/tools/python/python_actions_schema.xml +131 -0
- strix/tools/python/python_instance.py +172 -0
- strix/tools/python/python_manager.py +131 -0
- strix/tools/registry.py +196 -0
- strix/tools/reporting/__init__.py +6 -0
- strix/tools/reporting/reporting_actions.py +63 -0
- strix/tools/reporting/reporting_actions_schema.xml +30 -0
- strix/tools/terminal/__init__.py +4 -0
- strix/tools/terminal/terminal_actions.py +35 -0
- strix/tools/terminal/terminal_actions_schema.xml +146 -0
- strix/tools/terminal/terminal_manager.py +151 -0
- strix/tools/terminal/terminal_session.py +447 -0
- strix/tools/thinking/__init__.py +4 -0
- strix/tools/thinking/thinking_actions.py +18 -0
- strix/tools/thinking/thinking_actions_schema.xml +52 -0
- strix/tools/web_search/__init__.py +4 -0
- strix/tools/web_search/web_search_actions.py +80 -0
- strix/tools/web_search/web_search_actions_schema.xml +83 -0
- strix_agent-0.4.0.dist-info/LICENSE +201 -0
- strix_agent-0.4.0.dist-info/METADATA +282 -0
- strix_agent-0.4.0.dist-info/RECORD +118 -0
- strix_agent-0.4.0.dist-info/WHEEL +4 -0
- strix_agent-0.4.0.dist-info/entry_points.txt +3 -0
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
<?xml version="1.0" ?>
|
|
2
|
+
<tools>
|
|
3
|
+
<tool name="list_requests">
|
|
4
|
+
<description>List and filter proxy requests using HTTPQL with pagination.</description>
|
|
5
|
+
<parameters>
|
|
6
|
+
<parameter name="httpql_filter" type="string" required="false">
|
|
7
|
+
<description>HTTPQL filter using Caido's syntax:
|
|
8
|
+
|
|
9
|
+
Integer fields (port, code, roundtrip, id) - eq, gt, gte, lt, lte, ne:
|
|
10
|
+
- resp.code.eq:200, resp.code.gte:400, req.port.eq:443
|
|
11
|
+
|
|
12
|
+
Text/byte fields (ext, host, method, path, query, raw) - regex:
|
|
13
|
+
- req.method.regex:"POST", req.path.regex:"/api/.*", req.host.regex:".*.com"
|
|
14
|
+
|
|
15
|
+
Date fields (created_at) - gt, lt with ISO formats:
|
|
16
|
+
- req.created_at.gt:"2024-01-01T00:00:00Z"
|
|
17
|
+
|
|
18
|
+
Special: source:intercept, preset:"name"</description>
|
|
19
|
+
</parameter>
|
|
20
|
+
<parameter name="start_page" type="integer" required="false">
|
|
21
|
+
<description>Starting page (1-based)</description>
|
|
22
|
+
</parameter>
|
|
23
|
+
<parameter name="end_page" type="integer" required="false">
|
|
24
|
+
<description>Ending page (1-based, inclusive)</description>
|
|
25
|
+
</parameter>
|
|
26
|
+
<parameter name="page_size" type="integer" required="false">
|
|
27
|
+
<description>Requests per page</description>
|
|
28
|
+
</parameter>
|
|
29
|
+
<parameter name="sort_by" type="string" required="false">
|
|
30
|
+
<description>Sort field from: "timestamp", "host", "status_code", "response_time", "response_size"</description>
|
|
31
|
+
</parameter>
|
|
32
|
+
<parameter name="sort_order" type="string" required="false">
|
|
33
|
+
<description>Sort direction ("asc" or "desc")</description>
|
|
34
|
+
</parameter>
|
|
35
|
+
<parameter name="scope_id" type="string" required="false">
|
|
36
|
+
<description>Scope ID to filter requests (use scope_rules to manage scopes)</description>
|
|
37
|
+
</parameter>
|
|
38
|
+
</parameters>
|
|
39
|
+
<returns type="Dict[str, Any]">
|
|
40
|
+
<description>Response containing:
|
|
41
|
+
- 'requests': Request objects for page range
|
|
42
|
+
- 'total_count': Total matching requests
|
|
43
|
+
- 'start_page', 'end_page', 'page_size': Query parameters
|
|
44
|
+
- 'returned_count': Requests in response</description>
|
|
45
|
+
</returns>
|
|
46
|
+
<examples>
|
|
47
|
+
# POST requests to API with 200 responses
|
|
48
|
+
<function=list_requests>
|
|
49
|
+
<parameter=httpql_filter>req.method.eq:"POST" AND req.path.cont:"/api/"</parameter>
|
|
50
|
+
<parameter=sort_by>response_time</parameter>
|
|
51
|
+
<parameter=scope_id>scope123</parameter>
|
|
52
|
+
</function>
|
|
53
|
+
|
|
54
|
+
# Requests within specific scope
|
|
55
|
+
<function=list_requests>
|
|
56
|
+
<parameter=scope_id>scope123</parameter>
|
|
57
|
+
<parameter=sort_by>timestamp</parameter>
|
|
58
|
+
</function>
|
|
59
|
+
</examples>
|
|
60
|
+
</tool>
|
|
61
|
+
|
|
62
|
+
<tool name="view_request">
|
|
63
|
+
<description>View request/response data with search and pagination.</description>
|
|
64
|
+
<parameters>
|
|
65
|
+
<parameter name="request_id" type="string" required="true">
|
|
66
|
+
<description>Request ID</description>
|
|
67
|
+
</parameter>
|
|
68
|
+
<parameter name="part" type="string" required="false">
|
|
69
|
+
<description>Which part to return ("request" or "response")</description>
|
|
70
|
+
</parameter>
|
|
71
|
+
<parameter name="search_pattern" type="string" required="false">
|
|
72
|
+
<description>Regex pattern to search content. Common patterns:
|
|
73
|
+
- API endpoints: r"/api/[a-zA-Z0-9._/-]+"
|
|
74
|
+
- URLs: r"https?://[^\\s<>"\']+"
|
|
75
|
+
- Parameters: r'[?&][a-zA-Z0-9_]+=([^&\\s<>"\']+)'
|
|
76
|
+
- Reflections: input_value in content</description>
|
|
77
|
+
</parameter>
|
|
78
|
+
<parameter name="page" type="integer" required="false">
|
|
79
|
+
<description>Page number for pagination</description>
|
|
80
|
+
</parameter>
|
|
81
|
+
<parameter name="page_size" type="integer" required="false">
|
|
82
|
+
<description>Lines per page</description>
|
|
83
|
+
</parameter>
|
|
84
|
+
</parameters>
|
|
85
|
+
<returns type="Dict[str, Any]">
|
|
86
|
+
<description>With search_pattern (COMPACT):
|
|
87
|
+
- 'matches': [{match, before, after, position}] - max 20
|
|
88
|
+
- 'total_matches': Total found
|
|
89
|
+
- 'truncated': If limited to 20
|
|
90
|
+
|
|
91
|
+
Without search_pattern (PAGINATION):
|
|
92
|
+
- 'content': Page content
|
|
93
|
+
- 'page': Current page
|
|
94
|
+
- 'showing_lines': Range display
|
|
95
|
+
- 'has_more': More pages available</description>
|
|
96
|
+
</returns>
|
|
97
|
+
<examples>
|
|
98
|
+
# Find API endpoints in response
|
|
99
|
+
<function=view_request>
|
|
100
|
+
<parameter=request_id>123</parameter>
|
|
101
|
+
<parameter=part>response</parameter>
|
|
102
|
+
<parameter=search_pattern>/api/[a-zA-Z0-9._/-]+</parameter>
|
|
103
|
+
</function>
|
|
104
|
+
</examples>
|
|
105
|
+
</tool>
|
|
106
|
+
|
|
107
|
+
<tool name="send_request">
|
|
108
|
+
<description>Send a simple HTTP request through proxy.</description>
|
|
109
|
+
<parameters>
|
|
110
|
+
<parameter name="method" type="string" required="true">
|
|
111
|
+
<description>HTTP method (GET, POST, etc.)</description>
|
|
112
|
+
</parameter>
|
|
113
|
+
<parameter name="url" type="string" required="true">
|
|
114
|
+
<description>Target URL</description>
|
|
115
|
+
</parameter>
|
|
116
|
+
<parameter name="headers" type="dict" required="false">
|
|
117
|
+
<description>Headers as {"key": "value"}</description>
|
|
118
|
+
</parameter>
|
|
119
|
+
<parameter name="body" type="string" required="false">
|
|
120
|
+
<description>Request body</description>
|
|
121
|
+
</parameter>
|
|
122
|
+
<parameter name="timeout" type="integer" required="false">
|
|
123
|
+
<description>Request timeout</description>
|
|
124
|
+
</parameter>
|
|
125
|
+
</parameters>
|
|
126
|
+
</tool>
|
|
127
|
+
|
|
128
|
+
<tool name="repeat_request">
|
|
129
|
+
<description>Repeat an existing proxy request with modifications for pentesting.
|
|
130
|
+
|
|
131
|
+
PROPER WORKFLOW:
|
|
132
|
+
1. Use browser_action to browse the target application
|
|
133
|
+
2. Use list_requests() to see captured proxy traffic
|
|
134
|
+
3. Use repeat_request() to modify and test specific requests
|
|
135
|
+
|
|
136
|
+
This mirrors real pentesting: browse → capture → modify → test</description>
|
|
137
|
+
<parameters>
|
|
138
|
+
<parameter name="request_id" type="string" required="true">
|
|
139
|
+
<description>ID of the original request to repeat (from list_requests)</description>
|
|
140
|
+
</parameter>
|
|
141
|
+
<parameter name="modifications" type="dict" required="false">
|
|
142
|
+
<description>Changes to apply to the original request:
|
|
143
|
+
- "url": New URL or modify existing one
|
|
144
|
+
- "params": Dict to update query parameters
|
|
145
|
+
- "headers": Dict to add/update headers
|
|
146
|
+
- "body": New request body (replaces original)
|
|
147
|
+
- "cookies": Dict to add/update cookies</description>
|
|
148
|
+
</parameter>
|
|
149
|
+
</parameters>
|
|
150
|
+
<returns type="Dict[str, Any]">
|
|
151
|
+
<description>Response data with status, headers, body, timing, and request details</description>
|
|
152
|
+
</returns>
|
|
153
|
+
<examples>
|
|
154
|
+
# Modify POST body payload
|
|
155
|
+
<function=repeat_request>
|
|
156
|
+
<parameter=request_id>req_789</parameter>
|
|
157
|
+
<parameter=modifications>{"body": "{\"username\":\"admin\",\"password\":\"admin\"}"}</parameter>
|
|
158
|
+
</function>
|
|
159
|
+
</examples>
|
|
160
|
+
</tool>
|
|
161
|
+
|
|
162
|
+
<tool name="scope_rules">
|
|
163
|
+
<description>Manage proxy scope patterns for domain/file filtering using Caido's scope system.</description>
|
|
164
|
+
<parameters>
|
|
165
|
+
<parameter name="action" type="string" required="true">
|
|
166
|
+
<description>Scope action:
|
|
167
|
+
- get: Get specific scope by ID or list all if no ID
|
|
168
|
+
- update: Update existing scope (requires scope_id and scope_name)
|
|
169
|
+
- list: List all available scopes
|
|
170
|
+
- create: Create new scope (requires scope_name)
|
|
171
|
+
- delete: Delete scope (requires scope_id)</description>
|
|
172
|
+
</parameter>
|
|
173
|
+
<parameter name="allowlist" type="list" required="false">
|
|
174
|
+
<description>Domain patterns to include. Examples: ["*.example.com", "api.test.com"]</description>
|
|
175
|
+
</parameter>
|
|
176
|
+
<parameter name="denylist" type="list" required="false">
|
|
177
|
+
<description>Patterns to exclude. Some common extensions:
|
|
178
|
+
["*.gif", "*.jpg", "*.png", "*.css", "*.js", "*.ico", "*.svg", "*woff*", "*.ttf"]</description>
|
|
179
|
+
</parameter>
|
|
180
|
+
<parameter name="scope_id" type="string" required="false">
|
|
181
|
+
<description>Specific scope ID to operate on (required for get, update, delete)</description>
|
|
182
|
+
</parameter>
|
|
183
|
+
<parameter name="scope_name" type="string" required="false">
|
|
184
|
+
<description>Name for scope (required for create, update)</description>
|
|
185
|
+
</parameter>
|
|
186
|
+
</parameters>
|
|
187
|
+
<returns type="Dict[str, Any]">
|
|
188
|
+
<description>Depending on action:
|
|
189
|
+
- get: Single scope object or error
|
|
190
|
+
- list: {"scopes": [...], "count": N}
|
|
191
|
+
- create/update: {"scope": {...}, "message": "..."}
|
|
192
|
+
- delete: {"message": "...", "deletedId": "..."}</description>
|
|
193
|
+
</returns>
|
|
194
|
+
<notes>
|
|
195
|
+
- Empty allowlist = allow all domains
|
|
196
|
+
- Denylist overrides allowlist
|
|
197
|
+
- Glob patterns: * (any), ? (single), [abc] (one of), [a-z] (range), [^abc] (none of)
|
|
198
|
+
- Each scope has unique ID and can be used with list_requests(scopeId=...)
|
|
199
|
+
</notes>
|
|
200
|
+
<examples>
|
|
201
|
+
# Create API-only scope
|
|
202
|
+
<function=scope_rules>
|
|
203
|
+
<parameter=action>create</parameter>
|
|
204
|
+
<parameter=scope_name>API Testing</parameter>
|
|
205
|
+
<parameter=allowlist>["api.example.com", "*.api.com"]</parameter>
|
|
206
|
+
<parameter=denylist>["*.gif", "*.jpg", "*.png", "*.css", "*.js"]</parameter>
|
|
207
|
+
</function>
|
|
208
|
+
</examples>
|
|
209
|
+
</tool>
|
|
210
|
+
|
|
211
|
+
<tool name="list_sitemap">
|
|
212
|
+
<description>View hierarchical sitemap of discovered attack surface from proxied traffic.
|
|
213
|
+
|
|
214
|
+
Perfect for bug hunters to understand the application structure and identify
|
|
215
|
+
interesting endpoints, directories, and entry points discovered during testing.</description>
|
|
216
|
+
<parameters>
|
|
217
|
+
<parameter name="scope_id" type="string" required="false">
|
|
218
|
+
<description>Scope ID to filter sitemap entries (use scope_rules to get/create scope IDs)</description>
|
|
219
|
+
</parameter>
|
|
220
|
+
<parameter name="parent_id" type="string" required="false">
|
|
221
|
+
<description>ID of parent entry to expand. If None, returns root domains.</description>
|
|
222
|
+
</parameter>
|
|
223
|
+
<parameter name="depth" type="string" required="false">
|
|
224
|
+
<description>DIRECT: Only immediate children. ALL: All descendants recursively.</description>
|
|
225
|
+
</parameter>
|
|
226
|
+
<parameter name="page" type="integer" required="false">
|
|
227
|
+
<description>Page number for pagination (30 entries per page)</description>
|
|
228
|
+
</parameter>
|
|
229
|
+
</parameters>
|
|
230
|
+
<returns type="Dict[str, Any]">
|
|
231
|
+
<description>Response containing:
|
|
232
|
+
- 'entries': List of cleaned sitemap entries
|
|
233
|
+
- 'page', 'total_pages', 'total_count': Pagination info
|
|
234
|
+
- 'has_more': Whether more pages available
|
|
235
|
+
- Each entry: id, kind, label, hasDescendants, request (method/path/status only)</description>
|
|
236
|
+
</returns>
|
|
237
|
+
<notes>
|
|
238
|
+
Entry kinds:
|
|
239
|
+
- DOMAIN: Root domains (example.com)
|
|
240
|
+
- DIRECTORY: Path directories (/api/, /admin/)
|
|
241
|
+
- REQUEST: Individual endpoints
|
|
242
|
+
- REQUEST_BODY: POST/PUT body variations
|
|
243
|
+
- REQUEST_QUERY: GET parameter variations
|
|
244
|
+
|
|
245
|
+
Check hasDescendants=true to identify entries worth expanding.
|
|
246
|
+
Use parent_id from any entry to drill down into subdirectories.
|
|
247
|
+
</notes>
|
|
248
|
+
</tool>
|
|
249
|
+
|
|
250
|
+
<tool name="view_sitemap_entry">
|
|
251
|
+
<description>Get detailed information about a specific sitemap entry and related requests.
|
|
252
|
+
|
|
253
|
+
Perfect for understanding what's been discovered under a specific directory
|
|
254
|
+
or endpoint, including all related requests and response codes.</description>
|
|
255
|
+
<parameters>
|
|
256
|
+
<parameter name="entry_id" type="string" required="true">
|
|
257
|
+
<description>ID of the sitemap entry to examine</description>
|
|
258
|
+
</parameter>
|
|
259
|
+
</parameters>
|
|
260
|
+
<returns type="Dict[str, Any]">
|
|
261
|
+
<description>Response containing:
|
|
262
|
+
- 'entry': Complete entry details including metadata
|
|
263
|
+
- Entry contains 'requests' with all related HTTP requests
|
|
264
|
+
- Shows request methods, paths, response codes, timing</description>
|
|
265
|
+
</returns>
|
|
266
|
+
</tool>
|
|
267
|
+
</tools>
|