strix-agent 0.1.12__py3-none-any.whl → 0.1.14__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.
@@ -24,6 +24,8 @@ USER INTERACTION:
24
24
  - NEVER be redundant or repeat information - say it once and move on
25
25
  - If you need user input, IMMEDIATELY call wait_for_message tool
26
26
  - Never ask questions without calling wait_for_message in the same response
27
+ - Minimize user messaging: avoid redundancy and repetition; consolidate updates into a single concise message
28
+ - If there is nothing to execute and no user query to answer any more: do NOT send filler/repetitive text — either call wait_for_message or finish your work (subagents: agent_finish; root: finish_scan)
27
29
  </communication_rules>
28
30
 
29
31
  <execution_guidelines>
@@ -114,6 +116,8 @@ VALIDATION REQUIREMENTS:
114
116
  - Independent verification through subagent
115
117
  - Document complete attack chain
116
118
  - Keep going until you find something that matters
119
+ - A vulnerability is ONLY considered reported when a reporting agent uses create_vulnerability_report with full details. Mentions in agent_finish, finish_scan, or messages to the user are NOT sufficient
120
+ - Do NOT patch/fix before reporting: first create the vulnerability report via create_vulnerability_report (by the reporting agent). Only after reporting is completed should fixing/patching proceed
117
121
  </execution_guidelines>
118
122
 
119
123
  <vulnerability_focus>
@@ -193,6 +197,10 @@ SIMPLE WORKFLOW RULES:
193
197
  4. **MULTIPLE VULNS = MULTIPLE CHAINS** - Each vulnerability finding gets its own validation chain
194
198
  5. **CREATE AGENTS AS YOU GO** - Don't create all agents at start, create them when you discover new attack surfaces
195
199
  6. **ONE JOB PER AGENT** - Each agent has ONE specific task only
200
+ 7. **VIEW THE AGENT GRAPH BEFORE ACTING** - Always call view_agent_graph before creating or messaging agents to avoid duplicates and to target correctly
201
+ 8. **SCALE AGENT COUNT TO SCOPE** - Number of agents should correlate with target size and difficulty; avoid both agent sprawl and under-staffing
202
+ 9. **CHILDREN ARE MEANINGFUL SUBTASKS** - Child agents must be focused subtasks that directly support their parent's task; do NOT create unrelated children
203
+ 10. **UNIQUENESS** - Do not create two agents with the same task; ensure clear, non-overlapping responsibilities for every agent
196
204
 
197
205
  WHEN TO CREATE NEW AGENTS:
198
206
 
@@ -13,7 +13,7 @@ from jinja2 import (
13
13
  select_autoescape,
14
14
  )
15
15
 
16
- from strix.llm import LLM, LLMConfig
16
+ from strix.llm import LLM, LLMConfig, LLMRequestFailedError
17
17
  from strix.llm.utils import clean_content
18
18
  from strix.tools import process_tool_invocations
19
19
 
@@ -164,6 +164,10 @@ class BaseAgent(metaclass=AgentMeta):
164
164
  await self._enter_waiting_state(tracer)
165
165
  continue
166
166
 
167
+ if self.state.llm_failed:
168
+ await self._wait_for_input()
169
+ continue
170
+
167
171
  self.state.increment_iteration()
168
172
 
169
173
  try:
@@ -176,6 +180,13 @@ class BaseAgent(metaclass=AgentMeta):
176
180
  await self._enter_waiting_state(tracer, error_occurred=False, was_cancelled=True)
177
181
  continue
178
182
 
183
+ except LLMRequestFailedError as e:
184
+ self.state.add_error(f"LLM request failed: {e}")
185
+ self.state.enter_waiting_state(llm_failed=True)
186
+ if tracer:
187
+ tracer.update_agent_status(self.state.agent_id, "llm_failed")
188
+ continue
189
+
179
190
  except (RuntimeError, ValueError, TypeError) as e:
180
191
  if not await self._handle_iteration_error(e, tracer):
181
192
  await self._enter_waiting_state(tracer, error_occurred=True)
@@ -327,7 +338,7 @@ class BaseAgent(metaclass=AgentMeta):
327
338
  tracer.update_agent_status(self.state.agent_id, "error")
328
339
  return True
329
340
 
330
- def _check_agent_messages(self, state: AgentState) -> None:
341
+ def _check_agent_messages(self, state: AgentState) -> None: # noqa: PLR0912
331
342
  try:
332
343
  from strix.tools.agents_graph.agents_graph_actions import _agent_graph, _agent_messages
333
344
 
@@ -340,12 +351,28 @@ class BaseAgent(metaclass=AgentMeta):
340
351
  has_new_messages = False
341
352
  for message in messages:
342
353
  if not message.get("read", False):
354
+ sender_id = message.get("from")
355
+
343
356
  if state.is_waiting_for_input():
344
- state.resume_from_waiting()
345
- has_new_messages = True
357
+ if state.llm_failed:
358
+ if sender_id == "user":
359
+ state.resume_from_waiting()
360
+ has_new_messages = True
346
361
 
347
- sender_name = "Unknown Agent"
348
- sender_id = message.get("from")
362
+ from strix.cli.tracer import get_global_tracer
363
+
364
+ tracer = get_global_tracer()
365
+ if tracer:
366
+ tracer.update_agent_status(state.agent_id, "running")
367
+ else:
368
+ state.resume_from_waiting()
369
+ has_new_messages = True
370
+
371
+ from strix.cli.tracer import get_global_tracer
372
+
373
+ tracer = get_global_tracer()
374
+ if tracer:
375
+ tracer.update_agent_status(state.agent_id, "running")
349
376
 
350
377
  if sender_id == "user":
351
378
  sender_name = "User"
strix/agents/state.py CHANGED
@@ -23,6 +23,7 @@ class AgentState(BaseModel):
23
23
  completed: bool = False
24
24
  stop_requested: bool = False
25
25
  waiting_for_input: bool = False
26
+ llm_failed: bool = False
26
27
  final_result: dict[str, Any] | None = None
27
28
 
28
29
  messages: list[dict[str, Any]] = Field(default_factory=list)
@@ -85,15 +86,17 @@ class AgentState(BaseModel):
85
86
  def is_waiting_for_input(self) -> bool:
86
87
  return self.waiting_for_input
87
88
 
88
- def enter_waiting_state(self) -> None:
89
+ def enter_waiting_state(self, llm_failed: bool = False) -> None:
89
90
  self.waiting_for_input = True
90
91
  self.stop_requested = False
92
+ self.llm_failed = llm_failed
91
93
  self.last_updated = datetime.now(UTC).isoformat()
92
94
 
93
95
  def resume_from_waiting(self, new_task: str | None = None) -> None:
94
96
  self.waiting_for_input = False
95
97
  self.stop_requested = False
96
98
  self.completed = False
99
+ self.llm_failed = False
97
100
  if new_task:
98
101
  self.task = new_task
99
102
  self.last_updated = datetime.now(UTC).isoformat()
strix/cli/app.py CHANGED
@@ -420,6 +420,7 @@ class StrixCLIApp(App): # type: ignore[misc]
420
420
  "failed": "❌",
421
421
  "stopped": "⏹️",
422
422
  "stopping": "⏸️",
423
+ "llm_failed": "🔴",
423
424
  }
424
425
 
425
426
  status_icon = status_indicators.get(status, "🔵")
@@ -544,6 +545,12 @@ class StrixCLIApp(App): # type: ignore[misc]
544
545
  self._safe_widget_operation(status_text.update, "Agent completed")
545
546
  self._safe_widget_operation(keymap_indicator.update, "")
546
547
  self._safe_widget_operation(status_display.remove_class, "hidden")
548
+ elif status == "llm_failed":
549
+ self._safe_widget_operation(status_text.update, "[red]LLM request failed[/red]")
550
+ self._safe_widget_operation(
551
+ keymap_indicator.update, "[dim]Send message to retry[/dim]"
552
+ )
553
+ self._safe_widget_operation(status_display.remove_class, "hidden")
547
554
  elif status == "waiting":
548
555
  animated_text = self._get_animated_waiting_text(self.selected_agent_id)
549
556
  self._safe_widget_operation(status_text.update, animated_text)
@@ -626,7 +633,7 @@ class StrixCLIApp(App): # type: ignore[misc]
626
633
 
627
634
  for agent_id, agent_data in self.tracer.agents.items():
628
635
  status = agent_data.get("status", "running")
629
- if status in ["running", "waiting"]:
636
+ if status in ["running", "waiting", "llm_failed"]:
630
637
  has_active_agents = True
631
638
  current_dots = self._agent_dot_states.get(agent_id, 0)
632
639
  self._agent_dot_states[agent_id] = (current_dots + 1) % 4
@@ -637,7 +644,7 @@ class StrixCLIApp(App): # type: ignore[misc]
637
644
  and self.selected_agent_id in self.tracer.agents
638
645
  ):
639
646
  selected_status = self.tracer.agents[self.selected_agent_id].get("status", "running")
640
- if selected_status in ["running", "waiting"]:
647
+ if selected_status in ["running", "waiting", "llm_failed"]:
641
648
  self._update_agent_status_display()
642
649
 
643
650
  if not has_active_agents:
@@ -645,7 +652,7 @@ class StrixCLIApp(App): # type: ignore[misc]
645
652
  for agent_id in list(self._agent_dot_states.keys()):
646
653
  if agent_id not in self.tracer.agents or self.tracer.agents[agent_id].get(
647
654
  "status"
648
- ) not in ["running", "waiting"]:
655
+ ) not in ["running", "waiting", "llm_failed"]:
649
656
  del self._agent_dot_states[agent_id]
650
657
 
651
658
  def _gather_agent_events(self, agent_id: str) -> list[dict[str, Any]]:
@@ -30,6 +30,8 @@ class BrowserRenderer(BaseToolRenderer):
30
30
  url = args.get("url")
31
31
  text = args.get("text")
32
32
  js_code = args.get("js_code")
33
+ key = args.get("key")
34
+ file_path = args.get("file_path")
33
35
 
34
36
  if action in [
35
37
  "launch",
@@ -40,6 +42,8 @@ class BrowserRenderer(BaseToolRenderer):
40
42
  "click",
41
43
  "double_click",
42
44
  "hover",
45
+ "press_key",
46
+ "save_pdf",
43
47
  ]:
44
48
  if action == "launch":
45
49
  display_url = cls._format_url(url) if url else None
@@ -60,6 +64,12 @@ class BrowserRenderer(BaseToolRenderer):
60
64
  message = (
61
65
  f"executing javascript\n{display_js}" if display_js else "executing javascript"
62
66
  )
67
+ elif action == "press_key":
68
+ display_key = cls.escape_markup(key) if key else None
69
+ message = f"pressing key {display_key}" if display_key else "pressing key"
70
+ elif action == "save_pdf":
71
+ display_path = cls.escape_markup(file_path) if file_path else None
72
+ message = f"saving PDF to {display_path}" if display_path else "saving PDF"
63
73
  else:
64
74
  action_words = {
65
75
  "click": "clicking",
@@ -73,11 +83,14 @@ class BrowserRenderer(BaseToolRenderer):
73
83
  simple_actions = {
74
84
  "back": "going back in browser history",
75
85
  "forward": "going forward in browser history",
86
+ "scroll_down": "scrolling down",
87
+ "scroll_up": "scrolling up",
76
88
  "refresh": "refreshing browser tab",
77
89
  "close_tab": "closing browser tab",
78
90
  "switch_tab": "switching browser tab",
79
91
  "list_tabs": "listing browser tabs",
80
92
  "view_source": "viewing page source",
93
+ "get_console_logs": "getting console logs",
81
94
  "screenshot": "taking screenshot of browser tab",
82
95
  "wait": "waiting...",
83
96
  "close": "closing browser",
@@ -25,6 +25,10 @@ class StrReplaceEditorRenderer(BaseToolRenderer):
25
25
  header = "✏️ [bold #10b981]Editing file[/]"
26
26
  elif command == "create":
27
27
  header = "📝 [bold #10b981]Creating file[/]"
28
+ elif command == "insert":
29
+ header = "✏️ [bold #10b981]Inserting text[/]"
30
+ elif command == "undo_edit":
31
+ header = "↩️ [bold #10b981]Undoing edit[/]"
28
32
  else:
29
33
  header = "📄 [bold #10b981]File operation[/]"
30
34
 
strix/llm/__init__.py CHANGED
@@ -1,12 +1,15 @@
1
1
  import litellm
2
2
 
3
3
  from .config import LLMConfig
4
- from .llm import LLM
4
+ from .llm import LLM, LLMRequestFailedError
5
5
 
6
6
 
7
7
  __all__ = [
8
8
  "LLM",
9
9
  "LLMConfig",
10
+ "LLMRequestFailedError",
10
11
  ]
11
12
 
13
+ litellm._logging._disable_debugging()
14
+
12
15
  litellm.drop_params = True
strix/llm/llm.py CHANGED
@@ -28,6 +28,11 @@ api_key = os.getenv("LLM_API_KEY")
28
28
  if api_key:
29
29
  litellm.api_key = api_key
30
30
 
31
+
32
+ class LLMRequestFailedError(Exception):
33
+ """Raised when LLM request fails after all retry attempts."""
34
+
35
+
31
36
  MODELS_WITHOUT_STOP_WORDS = [
32
37
  "gpt-5",
33
38
  "gpt-5-mini",
@@ -250,15 +255,8 @@ class LLM:
250
255
  tool_invocations=tool_invocations if tool_invocations else None,
251
256
  )
252
257
 
253
- except (ValueError, TypeError, RuntimeError):
254
- logger.exception("Error in LLM generation")
255
- return LLMResponse(
256
- scan_id=scan_id,
257
- step_number=step_number,
258
- role=StepRole.AGENT,
259
- content="An error occurred while generating the response",
260
- tool_invocations=None,
261
- )
258
+ except Exception as e:
259
+ raise LLMRequestFailedError("LLM request failed after all retry attempts") from e
262
260
 
263
261
  @property
264
262
  def usage_stats(self) -> dict[str, dict[str, int | float]]:
@@ -307,6 +305,7 @@ class LLM:
307
305
  "model": self.config.model_name,
308
306
  "messages": messages,
309
307
  "temperature": self.config.temperature,
308
+ "timeout": 180,
310
309
  }
311
310
 
312
311
  if self._should_include_stop_param():
@@ -106,10 +106,13 @@ def _summarize_messages(
106
106
  completion_args = {
107
107
  "model": model,
108
108
  "messages": [{"role": "user", "content": prompt}],
109
+ "timeout": 180,
109
110
  }
110
111
 
111
112
  response = litellm.completion(**completion_args)
112
- summary = response.choices[0].message.content
113
+ summary = response.choices[0].message.content or ""
114
+ if not summary.strip():
115
+ return messages[0]
113
116
  summary_msg = "<context_summary message_count='{count}'>{text}</context_summary>"
114
117
  return {
115
118
  "role": "assistant",
@@ -38,8 +38,8 @@ class LLMRequestQueue:
38
38
  self._semaphore.release()
39
39
 
40
40
  @retry( # type: ignore[misc]
41
- stop=stop_after_attempt(15),
42
- wait=wait_exponential(multiplier=1.2, min=1, max=300),
41
+ stop=stop_after_attempt(5),
42
+ wait=wait_exponential(multiplier=2, min=1, max=30),
43
43
  reraise=True,
44
44
  )
45
45
  async def _reliable_request(self, completion_args: dict[str, Any]) -> ModelResponse:
@@ -53,6 +53,9 @@ def _run_agent_in_thread(
53
53
  <instructions>
54
54
  - You have {context_status}
55
55
  - Inherited context is for BACKGROUND ONLY - don't continue parent's work
56
+ - Maintain strict self-identity: never speak as or for your parent
57
+ - Do not merge your conversation with the parent's;
58
+ - Do not claim parent's actions or messages as your own
56
59
  - Focus EXCLUSIVELY on your delegated task above
57
60
  - Work independently with your own approach
58
61
  - Use agent_finish when complete to report back to parent
@@ -25,7 +25,7 @@
25
25
  Use is_input=true for regular text input to running processes.</description>
26
26
  </parameter>
27
27
  <parameter name="timeout" type="number" required="false">
28
- <description>Optional timeout in seconds for command execution. If not provided, uses default timeout behavior. Set to higher values for long-running commands like installations or tests. Default is 10 seconds.</description>
28
+ <description>Optional timeout in seconds for command execution. CAPPED AT 60 SECONDS. If not provided, uses default wait (30s). On timeout, the command keeps running and the tool returns with status 'running'. For truly long-running tasks, prefer backgrounding with '&'.</description>
29
29
  </parameter>
30
30
  <parameter name="terminal_id" type="string" required="false">
31
31
  <description>Identifier for the terminal session. Defaults to "default". Use different IDs to manage multiple concurrent terminal sessions.</description>
@@ -63,14 +63,15 @@
63
63
  3. LONG-RUNNING COMMANDS:
64
64
  - Commands never get killed automatically - they keep running in background
65
65
  - Set timeout to control how long to wait for output before returning
66
+ - For daemons/servers or very long jobs, append '&' to run in background
66
67
  - Use empty command "" to check progress (waits for timeout period to collect output)
67
68
  - Use C-c, C-d, C-z to interrupt processes (works automatically, no is_input needed)
68
69
 
69
70
  4. TIMEOUT HANDLING:
70
- - Timeout controls how long to wait before returning current output
71
+ - Timeout controls how long to wait before returning current output (max 60s cap)
71
72
  - Commands are NEVER killed on timeout - they keep running
72
73
  - After timeout, you can run new commands or check progress with empty command
73
- - All commands return status "completed" - you have full control
74
+ - On timeout, status is 'running'; on completion, status is 'completed'
74
75
 
75
76
  5. MULTIPLE TERMINALS: Use different terminal_id values to run multiple concurrent sessions.
76
77
 
@@ -97,7 +98,7 @@
97
98
  # Run a command with custom timeout
98
99
  <function=terminal_execute>
99
100
  <parameter=command>npm install</parameter>
100
- <parameter=timeout>120</parameter>
101
+ <parameter=timeout>60</parameter>
101
102
  </function>
102
103
 
103
104
  # Check progress of running command (waits for timeout to collect output)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: strix-agent
3
- Version: 0.1.12
3
+ Version: 0.1.14
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
@@ -1,19 +1,19 @@
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=T0B2rcPe_YUE6Fv-B9Hl9C-xHTuvDL5whGEArqFRXVk,2676
4
- strix/agents/StrixAgent/system_prompt.jinja,sha256=5u4pRcLbhATDs43OJ_6JFKZ99V1CDcK0U6Vl5tuHcAs,17618
4
+ strix/agents/StrixAgent/system_prompt.jinja,sha256=unDXkVFE3He8T6L5CKud_hM-uHisckrTPK3CDThSLrQ,18917
5
5
  strix/agents/__init__.py,sha256=F64zhlv4XZIvYJSL9eSSuKUsIVGPLG3ycpQBhZwvE6A,168
6
- strix/agents/base_agent.py,sha256=YMluoaFLbUnYDm0pOrDJ3zckZOSzvpzXhBDOGGU_YVg,14452
7
- strix/agents/state.py,sha256=ORN2VyLOcQrppiuGcelD0C-1-uhxc6TS4AEqdbK7LZg,4858
6
+ strix/agents/base_agent.py,sha256=hF_4qmhZ9QN-2i8GKbNxFwiP9yQTcsBPEscqqV6kZzI,15695
7
+ strix/agents/state.py,sha256=O5tuAsABlCOCYt-itoK7S30XtH44WD3JjEflkZP3y6E,4982
8
8
  strix/cli/__init__.py,sha256=ww23sFOQhICEIrIo0MtwWv2qHW5qUprvPj8QVjv3SM0,44
9
- strix/cli/app.py,sha256=uJehEq1qBj8laPS1AdIe2Z9BQRG3YZ7ogA-ZQBQM70U,39342
9
+ strix/cli/app.py,sha256=ksBLYQ3t6FgyBCnODfDdLKVBx8OQXKX7HHlbkOq7oUk,39786
10
10
  strix/cli/assets/cli.tcss,sha256=y7N_l8sJhDeflwqjmGz_Zm6xhVzpKUPJ6zcci-3qesE,11914
11
11
  strix/cli/main.py,sha256=QVi10gEooDqovHzCXmb5rFg-YJFb9nQJJDYbxdMwdw0,21498
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
15
- strix/cli/tool_components/browser_renderer.py,sha256=cpdoHnqDQiNgoNBWSOXrBsNFQS2NYW1dB9B0WVey04Q,3791
16
- strix/cli/tool_components/file_edit_renderer.py,sha256=ZYIC6-HHxgBDikpR4MHV24O0PQAheZfRfiV_v8T5mGA,3419
15
+ strix/cli/tool_components/browser_renderer.py,sha256=s3WmJ5qDq0QQQgzx0SyxKZfhHx1w4jP7UFXKO5TjrD8,4469
16
+ strix/cli/tool_components/file_edit_renderer.py,sha256=DfV8l4o3ssipXO_-uIrTS674h_9kALFLkuCb3ry0T0s,3612
17
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
@@ -26,11 +26,11 @@ strix/cli/tool_components/thinking_renderer.py,sha256=-MQLkKCgOJksrustULFf2jhAjJ
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
- strix/llm/__init__.py,sha256=tzsJlDGGQE_Hw917dyzBWtwXsajZsIS-qdlPuS6EmSY,139
29
+ strix/llm/__init__.py,sha256=WqYE3Xc2e1D3z4QyjwN_jZPTdqsSDX6ODYsu-dcufSk,230
30
30
  strix/llm/config.py,sha256=iBv1tuUOUDcP2gVQWhjtN8wtO5lWOipsER7Rnc3p6k4,603
31
- strix/llm/llm.py,sha256=775w8IJ7ovTujfxy1x4euZGLBftIpgqC6TFf39ZE0zM,12691
32
- strix/llm/memory_compressor.py,sha256=U2eD90SmVOxjZJTiNwVmf4G6g3lnhfwqIPtwhLztoag,6856
33
- strix/llm/request_queue.py,sha256=hBjj8c_6_D30-j1FCz-fm2eHJA7XGE7rk52j_8QR_4s,2090
31
+ strix/llm/llm.py,sha256=JcfqSp5Ahwt73kUFJtCnKg3DLHvepeAA25hVxRFJCso,12572
32
+ strix/llm/memory_compressor.py,sha256=RFJWirlK39ZkoDc42eNicJUR8nMVbxSsviWvfJ4kRgs,6953
33
+ strix/llm/request_queue.py,sha256=EeESEHFSUk2N1x0NTwnxZg3y5O_492S1JLskI8l0G-Y,2086
34
34
  strix/llm/utils.py,sha256=0Z0r6qo9IfUSOJt5FJsq3X-veXrA8A09frc2VIy-aS4,2540
35
35
  strix/prompts/__init__.py,sha256=ocFjc9d-QolphPKr2cMVMHS52piJSSubBJdrwEFEBTI,3490
36
36
  strix/prompts/coordination/root_agent.jinja,sha256=Z34uffB-lIt6Oei307dtD7oyXSmX2DSApeoRcA3LcnM,1902
@@ -50,7 +50,7 @@ strix/runtime/runtime.py,sha256=yUVLl9BTQChQgaba2jJCrEmHeJFDE9N0sF9M_XjqEbg,692
50
50
  strix/runtime/tool_server.py,sha256=pKI_cL1aSEFC8b6Dqaz9bRfh0LvcCKwb6ZCN-v6OYls,6618
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=7D4MWAumYolgYpg2fbzYQkFL69Pkk6RtPZkt2gb3hyM,20374
53
+ strix/tools/agents_graph/agents_graph_actions.py,sha256=7YSUQq7UIyVcV1GCKlYvNvfD0eiLQ5B9BKd67sRfKcY,20573
54
54
  strix/tools/agents_graph/agents_graph_actions_schema.xml,sha256=KbDu8Ds2RWyy6b4iF0WY83T7wL9lU9mJ16midNiT_uI,12645
55
55
  strix/tools/argument_parser.py,sha256=FA9LY0UBtMqDRJ9yHHUzQCbGmpTQvo4xTtLiNRYG2FU,3861
56
56
  strix/tools/browser/__init__.py,sha256=7azA1td3CfwCVqMYIIzT0vGM0-JUNq3sZBYB0QnwFDk,75
@@ -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=xvflcrbLQ31o_K3cWFsIhTm7gxY5JF0nVnhOIadwFV0,80
85
85
  strix/tools/terminal/terminal_actions.py,sha256=9BGsK7Io7PyW8YGpJfXHeJTP3AVqBAgaKZl-1YziF8Y,888
86
- strix/tools/terminal/terminal_actions_schema.xml,sha256=O7B3cua238hkSwvHA5pPxkSFc6eSvttiDlW7xO8KkjU,7099
86
+ strix/tools/terminal/terminal_actions_schema.xml,sha256=L7dzjvKNZpJA0qDGp1gCBuwXiY4mtjOq7T2tNDmUPA4,7257
87
87
  strix/tools/terminal/terminal_manager.py,sha256=cTWosczkMoSRSjQ-xPR56D5cIYcylA3NAZb4FSi32Ko,4838
88
88
  strix/tools/terminal/terminal_session.py,sha256=peHQrYCty-KHYECbT8jOww06ayGUK_rAcnTlYIfQe00,16008
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.12.dist-info/LICENSE,sha256=fblpcTQlHjFL2NOSV_4XDJiz4q2bLtZ-l6yvlhPnueM,11345
96
- strix_agent-0.1.12.dist-info/METADATA,sha256=kHjS55m-bu0JVCPd8n1crjOQJ6rJEz-s6tKddV3NJcs,6139
97
- strix_agent-0.1.12.dist-info/WHEEL,sha256=RaoafKOydTQ7I_I3JTrPCg6kUmTgtm4BornzOqyEfJ8,88
98
- strix_agent-0.1.12.dist-info/entry_points.txt,sha256=sswIgnkzSVSzQ3Rd046g7mhIPQaj_7RYlXgU_bQelF0,45
99
- strix_agent-0.1.12.dist-info/RECORD,,
95
+ strix_agent-0.1.14.dist-info/LICENSE,sha256=fblpcTQlHjFL2NOSV_4XDJiz4q2bLtZ-l6yvlhPnueM,11345
96
+ strix_agent-0.1.14.dist-info/METADATA,sha256=GGgCJg59cRXdTZN7R7122AxtvJtSuATPjkDP2Gz7BbQ,6139
97
+ strix_agent-0.1.14.dist-info/WHEEL,sha256=RaoafKOydTQ7I_I3JTrPCg6kUmTgtm4BornzOqyEfJ8,88
98
+ strix_agent-0.1.14.dist-info/entry_points.txt,sha256=sswIgnkzSVSzQ3Rd046g7mhIPQaj_7RYlXgU_bQelF0,45
99
+ strix_agent-0.1.14.dist-info/RECORD,,