Commit Graph
83 Commits
Author SHA1 Message Date
Ahmed AllamandGitHub 06b158d1fa fix(runner): settle child agents before closing sessions at wind-down (#1025) 2026-08-08 18:17:58 -07:00
Ahmed AllamandGitHub c29eb73c7f fix(tools): coerce an empty-string list/dict argument to an empty container (#1024) 2026-08-08 16:58:30 -07:00
Ahmed AllamandGitHub 72833b8e43 fix(runner): resume after a user interrupt instead of failing (#1023) 2026-08-08 16:44:12 -07:00
Ahmed AllamandGitHub 1117ba6d4a fix(sessions): open a sqlite connection per operation, not per thread (#1022) 2026-08-08 16:20:01 -07:00
Ahmed AllamandGitHub 53e4658d88 fix(todo): stop a todo plan failing on priority or duplicates (#1021) 2026-08-08 15:18:48 -07:00
58df71d3db fix(agents): let an agent wait on what it already said (#1020)
* let an agent wait on what it already said

An agent that answers in plain text is nudged to call a tool, and the only tool
that hands control back takes a required message. So it says the same thing
twice: once as text the user has already read, once as the argument it had to
supply to stop. Seen on a run whose whole instruction was "hi" - a greeting, then
the same greeting again through respond_to_user.

message is optional now. The nudge arms the tool with the text that was
delivered and says not to repeat it, so an agent that has said its piece can park
on it with an empty call. Anything it does want to add it passes normally.

Parking still cannot leave the user on silence: an empty call is refused unless
something was actually said, and the arming is single use - execution clears it
as soon as a turn ends any other way.

The interactive prompt now also says to answer and stop in one respond_to_user
call, which is what avoids the nudge in the first place.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* drop the worked example from the interactive prompt

"the user greeted you, asked something you can answer outright, or you need a
decision" was the run I had been reading, written into a rule that holds
whatever the reason. The rule is that replying and stopping is one call; listing
occasions only invites the model to check whether this is one of them.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* drop the arming flag; an empty message just waits

Passing the delivered text from execution into the tool, and refusing an empty
call without it, was machinery guarding against an agent parking having said
nothing. That leaves the user looking at "waiting for your reply" with a cursor
in front of them - they type. It does not need a mechanism.

What is left is the default on message, and the nudge saying the text already
landed.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* only offer waiting on words that were written

The nudge told every agent its text had already been delivered, but it fires
whenever a turn leaves the agent running, and a turn can end with no tool call
and no text at all - _final_output_preview has carried <none> and <empty>
branches all along. An agent that said nothing was being invited to wait on an
answer the user never received, leaving them at a bare prompt.

It now reads the turn: waiting on what was said is offered only when something
was, and otherwise the agent is told plainly that the user has read nothing and
to send its message.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* leave the continuation nudge alone

Rewording it meant asserting from the outside whether the agent had spoken, and
the nudge fires whenever a turn leaves the agent running - text or no text. The
agent knows which it did without being told, so the guidance belongs in its
prompt, where the condition is its own to read.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* say it in the nudge, where the agent is reading

An agent stranded by the nudge reasons off the nudge. Told only to call
respond_to_user, it supplies a message, and since it has just answered in plain
text that message is the same answer again. The system prompt saying otherwise
sits thousands of tokens earlier and loses.

The clause goes on the line the agent acts on: call respond_to_user, with no
message if it has already said it. That reads true whatever the turn did,
including one that produced no text, because the agent is the one who knows
which — nothing here has to work it out from the outside.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-09 00:57:16 +03:00
0b9e029a5d test(tui): correct the nudge the internal-turn test asserts (#1016)
* correct the nudge the internal-turn test asserts

The test expected "ended the autonomous Strix run", which strix.core.execution
does not inject; it says "ended the autonomous run". The classifier was right and
the test was not, so the suite failed on main while the behaviour it guards was
fine.

The sentence is written inline in another module and copied by hand into the
classifier and again into the test, which is how it drifted. A second test now
reads it back out of that module's source, joining the adjacent string literals
its line wrapping leaves behind, and fails if either nudge is no longer injected
verbatim. Reworded one and it reports which nudge went missing and what a resumed
scan would do about it.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* read the nudges out of what the module can inject, not out of its text

Searching the source accepted the sentence anywhere in the file, so a stale copy
left behind in a comment would have kept the guard passing after the message it
guards had changed - the drift it exists to catch.

Parsing the module instead limits it to strings the code can actually inject.
Comments never reach the tree, docstrings are dropped as description rather than
behaviour, and adjacent literals are joined during parsing, which the line
wrapping needed and the regex was only approximating.

Checked by rewording the message and leaving the old wording in a comment: the
guard fails, where searching the text passed.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-08 22:34:45 +03:00
b260a4ee38 fix(tui): make the mount prompt clickable, and skip the mount instead of abandoning the scan (#1015)
* make the working-directory prompt answer the mouse

Its Confirm and Cancel were drawn as buttons and did nothing when clicked: the
modal mouse handler had a case for every dialog except this one, so a click fell
through and the scan sat waiting on an answer the user believed they had given.
Only the keyboard could answer it.

The prompt is docked in a corner rather than centered, so it also needs its own
bounds; the centered ones every other dialog uses would have put the buttons in
the wrong place. Those bounds now come from the same placement cornerOverlay
draws with.

Two returns that hand back the model alongside a call that mutates it are now
sequenced explicitly. They work, but only because the compiler happens to
evaluate the call first, and one of them is what puts the prompt back in the
composer when the mount is declined.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* skip the mount instead of abandoning the scan

Declining the working-directory prompt threw the whole launch away and dropped
back to the start screen, which is a lot to lose for answering one question
about one directory. The two answers are now about the directory alone: mount it,
or run without it. The prompt is the whole of the input either way.

The buttons say which is which - Mount and Skip rather than Confirm and Cancel -
and the prompt says what skipping costs.

A run with neither target nor directory is a real run, so two things follow it.
It can be resumed: its instruction is what drives it, and that is in the run
record. And it tells the agent plainly that it has neither, because an agent
given no scope goes looking for the one it assumes it was meant to have.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-08 22:34:02 +03:00
Ahmed AllamandGitHub 0607abf9e5 fix(tui): scrollbar visibility, findings scrolling, and report navigation (#1006) 2026-08-07 06:14:22 -07:00
Ahmed AllamandGitHub 82dcd31357 fix(tui): keep a long error inside the status row (#970) 2026-08-04 07:26:22 -07:00
Ahmed Allam ea6d53f4e9 build: add types-requests to dev deps
The old openai-agents pin pulled types-requests in transitively; 0.19.0 does
not, so mypy lost the requests stubs. Depend on them directly.
2026-08-04 06:14:54 +03:00
Ahmed Allam 3bcf3778f0 fix(core): settle a non-interactive agent's status before its exception unwinds
An exception escaping a non-interactive cycle re-raised before the status
handling, so a dying child stayed 'running' and its parent waited out the
timeout on a completion report the child could no longer send. Set the
terminal status and wake the parent on the way out too.
2026-08-04 06:14:54 +03:00
Ahmed Allam 4a455b1e62 fix(core): recover from hallucinated tool names instead of ending the scan
A tool call for a name Strix does not register raised ModelBehaviorError
from the SDK turn resolver, which nothing retries: the root agent's raise
tore down the whole scan and a sub-agent died before its status was set.
Opt into the SDK's tool_not_found_behavior="return_error_to_model" so the
unknown call comes back as a tool result and the agent self-corrects.

The setting landed in openai-agents 0.19.0, which requires openai>=2.45,
so both pins move.
2026-08-04 06:14:54 +03:00
Ahmed AllamandGitHub 8ec54d9e2b chore: release v1.3.0 (#849) 2026-07-22 09:21:24 -07:00
Ahmed AllamandGitHub 1f7373714b Local viewer: prominent scan switcher + rename to "pentest" terminology (#848) 2026-07-22 09:17:52 -07:00
Ahmed AllamandGitHub ef07bad945 Local viewer: UI polish and a Feedback & support tab (#847) 2026-07-22 08:34:52 -07:00
Ahmed AllamandGitHub af65796ec0 fix(runtime): close the docker client on session cleanup (#787) 2026-07-16 11:06:18 -07:00
Ahmed AllamandGitHub e2eb39a02e fix(runtime): cap sandbox container logs to prevent host disk exhaustion (#785) 2026-07-16 09:17:46 -07:00
Ahmed AllamandGitHub 81a8b2139b Update README 2026-07-13 17:57:40 -07:00
Ahmed AllamandGitHub f28ebe3668 Update README (#705) 2026-07-06 07:38:52 -07:00
Ahmed AllamandGitHub 69e82f0258 chore(deps): refresh uv.lock to latest compatible versions (#606) 2026-06-29 19:10:18 -07:00
Ahmed AllamandGitHub 52ca641679 Update readme (#607) 2026-06-29 19:09:58 -07:00
Ahmed AllamandGitHub 60d68d85f3 Readme update 2026-06-29 19:00:46 -07:00
Ahmed AllamandGitHub cc23eeb65d Bump 1.0.3 -> 1.0.4 (#557) 2026-06-09 09:41:44 -07:00
Ahmed AllamandGitHub 7217abfe23 Strip ANSI escapes and control bytes from terminal tool output (#554) 2026-06-09 09:22:50 -07:00
Ahmed AllamandGitHub f7e3af49bd Strip all images from session on vision-rejection, not just the latest (#553) 2026-06-09 02:48:30 -07:00
Ahmed AllamandGitHub 6202131028 Swallow sandbox container races in the stream consumer (#552) 2026-06-09 01:46:23 -07:00
Ahmed AllamandGitHub 45409cef0d Make TUI quit instant by SIGKILL-ing the sandbox container (#548) 2026-06-08 23:40:45 -07:00
Ahmed AllamandGitHub 250fe2cf3e Bump 1.0.2 -> 1.0.3 (#537) 2026-06-08 18:05:02 -07:00
Ahmed AllamandGitHub 6c99829325 Simplify cost ledger to one bucket (#531) 2026-06-08 15:56:28 -07:00
Ahmed AllamandGitHub 1c9ab993bb Use observed LiteLLM cost for LiteLLM-routed calls (#529)
Register a litellm.success_callback that captures kwargs['response_cost']
into a new observed-cost bucket on LLMUsageLedger. record() skips the
tokens-times-registry estimate for LiteLLM-routed models so we do not
double-count with the callback; OpenAI direct routes keep estimating
since LiteLLM is not invoked for them. Per-agent attribution for
LiteLLM-routed calls is apportioned by token share at to_record() time.
2026-06-08 15:01:48 -07:00
Ahmed AllamandGitHub 04eb03febe Gate Reasoning(effort=...) on registry support (#528)
OpenAI's Responses API rejects reasoning.effort on non-reasoning
models like gpt-4o with `unsupported_parameter`, so any scan with
the default STRIX_REASONING_EFFORT=high against gpt-4o crashed at
the first model call. drop_params=True absorbs the rejected param
on LiteLLM-routed models but the SDK's native OpenAI path has no
equivalent.

Lift model_supports_reasoning to a public helper that strips
litellm/, any-llm/, openai/ prefixes and falls back to last-segment
lookup so prefixed forms like anthropic/claude-opus-4-7 resolve
through the bare model_cost entry. make_model_settings regains
model_name and skips Reasoning() when the registry doesn't confirm
support. uses_chat_completions_tool_schema reuses the same helper
(was duplicating the lookup under a misleading name).
2026-06-08 13:18:07 -07:00
Ahmed AllamandGitHub ac0fef2ed7 Show "Send message to resume" on the left of the status bar (#525) 2026-06-07 17:41:06 -07:00
13046cc74a fix: gate reasoning_effort by LiteLLM model registry (closes #517) (#523)
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-07 12:24:48 -07:00
1aad460f6e fix: SDK tracing leak + orphan docker on TUI quit (closes #512) (#522)
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-07 11:28:06 -07:00
d0321510d2 fix: reasoning models reject tool_choice=required; bump to 1.0.2 (closes #503, #505) (#508)
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-28 11:55:10 -07:00
Ahmed AllamandGitHub 3bd9d56814 fix: PyInstaller bundle is broken (missing agents SDK data + wrongly excluded gql); bump to 1.0.1 (#502) 2026-05-26 20:04:01 -07:00
Ahmed AllamandGitHub 63faecd3b5 Strix v1.0.0 release
Strix v1.0.0 — Native tool calling, save & resume, multi-agent control
2026-05-26 14:42:13 -07:00
Ahmed AllamandGitHub 62e9af36d2 Add Strix GitHub Actions integration tip 2026-04-12 12:43:41 -07:00
Ahmed Allam b6a0a949a3 Simplify tool file copying in Dockerfile
Removed specific tool files from Dockerfile and added a directory copy instead.
2026-03-22 16:01:39 -07:00
Ahmed AllamandGitHub 31d8a09c95 Guard TUI chat rendering against invalid Rich spans (#375) 2026-03-19 22:28:42 -07:00
Ahmed AllamandGitHub 9a0bc5e491 fix: prevent ScreenStackError when stopping agent from modal (#374) 2026-03-19 20:39:05 -07:00
Ahmed Allam f0f8f3d4cc Add tip about Strix integration with GitHub Actions 2026-03-17 22:14:11 -07:00
Ahmed Allam f71e34dd0f Update web search model name to 'sonar-reasoning-pro' 2026-03-11 14:20:04 -07:00
Ahmed AllamandGitHub 72c3e0dd90 Update README 2026-03-03 03:33:46 +04:00
Ahmed AllamandGitHub d30e1d2f66 Update models.mdx 2026-03-03 03:33:14 +04:00
Ahmed AllamandGitHub 551b780f52 Update installation instructions
Removed pipx installation instructions for strix-agent.
2026-02-22 00:10:06 +04:00
Ahmed AllamandGitHub 6166be841b Resolve LLM API Base and Models (#317) 2026-02-20 07:14:10 -08:00
Ahmed AllamandGitHub b8cabdde97 Update README 2026-02-01 05:13:59 +04:00
Ahmed AllamandGitHub 83ce9ed960 Update README.md 2026-02-01 05:11:44 +04:00
Ahmed AllamandGitHub 655ddb4d7f Update README with full details section 2026-01-23 23:05:26 +04:00
Ahmed AllamandGitHub 6bacc796e2 Update README 2026-01-23 06:56:10 +04:00
Ahmed AllamandGitHub c50c79084b Update README 2026-01-23 06:55:35 +04:00
Ahmed AllamandGitHub ceeec8faa8 Update README 2026-01-16 02:34:30 +04:00
Ahmed AllamandGitHub d16bdb277a Update README 2026-01-14 05:00:16 +04:00
Ahmed Allamandgreptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> d932602a6b Update args in strix/interface/main.py
Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
2026-01-09 20:00:01 -08:00
Ahmed AllamandGitHub 49421f50d5 Remove title from README 2026-01-10 02:35:20 +04:00
Ahmed AllamandGitHub 8b0bb521ba Update link in README 2026-01-03 08:28:03 +04:00
Ahmed AllamandGitHub f25cf9b23d Remove PyPI Downloads badge from readme 2026-01-01 23:27:00 +04:00
Ahmed AllamandGitHub 0fcd5c46b2 Fix badge in README.md 2025-12-15 19:39:47 +04:00
Ahmed AllamandGitHub 624f1ed77f feat(tui): add markdown rendering for agent messages (#197)
Add AgentMessageRenderer to render agent messages with basic markdown support:
- Headers (#, ##, ###, ####)
- Bold (**text**) and italic (*text*)
- Inline code and fenced code blocks
- Links [text](url) and strikethrough

Update system prompt to allow agents to use simple markdown formatting.
2025-12-14 22:53:07 +04:00
Ahmed AllamandGitHub 2b926c733b feat(tools): add dedicated todo tool for agent task tracking (#196)
- Add new todo tool with create, list, update, mark_done, mark_pending, delete actions
- Each subagent has isolated todo storage keyed by agent_id
- Support bulk todo creation via JSON array or bullet list
- Add TUI renderers for all todo actions with status markers
- Update notes tool to remove priority and todo-related functionality
- Add task tracking guidance to StrixAgent system prompt
- Fix instruction file error handling in CLI
2025-12-14 22:16:02 +04:00
Ahmed AllamandGitHub a075ea1a0a feat(tui): add syntax highlighting for tool renderers (#195)
Add Pygments-based syntax highlighting with native hacker theme:
- Python renderer: Python code highlighting
- Browser renderer: JavaScript code highlighting
- Terminal renderer: Bash command highlighting
- File edit renderer: Auto-detect language from file extension, diff-style display
2025-12-14 04:39:28 +04:00
Ahmed AllamandGitHub e57b7238f6 Update README to remove duplicate demo image 2025-12-12 21:59:16 +04:00
Ahmed AllamandGitHub 13fe87d428 Add DeepWiki docs for Strix 2025-12-12 21:58:28 +04:00
Ahmed AllamandGitHub b74132b2dc Update README.md 2025-12-03 20:09:22 +00:00
Ahmed AllamandGitHub 62f804b8b5 Update link in README 2025-12-01 16:04:46 +04:00
Ahmed AllamandGitHub 5ff10e9d20 Add acknowledgements in README 2025-11-29 19:27:30 +04:00
Ahmed AllamandGitHub 2ae1b3ddd1 Update README 2025-11-23 22:29:44 +04:00
Ahmed AllamandGitHub 6a2a62c121 chore: Fix formatting in README.md 2025-11-14 16:07:54 +00:00
Ahmed AllamandGitHub f1d2961779 Update README 2025-11-12 19:29:01 +04:00
Ahmed AllamandGitHub b6d9d941cf Update README 2025-11-08 15:07:53 +04:00
Ahmed AllamandGitHub 85209bfc20 chore: replaced Discord invite link with open invite
(remove the unneeded join application)
2025-10-31 15:19:46 +02:00
Ahmed AllamandGitHub 7de9c4efe1 feat: Add prompt module collections and contributing.md (#40) 2025-10-10 10:41:42 +01:00
Ahmed AllamandGitHub 7979b84cc3 Update issue templates 2025-09-29 02:19:04 +01:00
Ahmed AllamandGitHub c8b23720df Fix tool server http requests issues (#37) 2025-09-24 04:41:23 +01:00
Ahmed AllamandGitHub 7d8ffe1e32 Fix escape issues causing tui to crash (#36) 2025-09-24 04:14:08 +01:00
Ahmed AllamandGitHub aabf97af0a Adding more verbose logging for llm failed requests (#30) 2025-09-14 15:56:07 -07:00
Ahmed AllamandAhmed Allam d43fb5be03 Update README 2025-09-08 10:31:16 -07:00
Ahmed AllamandGitHub cb57426cc6 Running all agents under same container (#12) 2025-08-18 21:58:38 +01:00
Ahmed AllamandGitHub 198a5e4a61 Redesigning the terminal tool (#11) 2025-08-17 07:43:29 +01:00
Ahmed AllamandGitHub ccab853c0f Clone git repositories internally (#10) 2025-08-16 23:47:36 +01:00
Ahmed AllamandGitHub 337d64d362 Adding full support for gpt-5 models (#5) 2025-08-15 21:02:39 +01:00