Commit graph

952 commits

Author SHA1 Message Date
Ahmed Allam
f121ab03fb docs: update the recommended models in the repo markdown 2026-10-26 18:48:14 +03:00
Ahmed Allam
2c9e9f3444 docs: recommend Vercel AI Gateway alongside OpenRouter and update model ids
Quickstart, providers overview and docs index show GLM-5.3 through Vercel AI Gateway and OpenRouter side by side, Vercel first. Model ids across the provider pages move to the current releases, including DeepSeek V4.1 Flash 1017, and the OpenAI, Anthropic and Gemini pages note the Daybreak, CVP and Fairwind access programs. Docs only, README unchanged.

Closes STR-1686
2026-10-26 18:48:14 +03:00
Ahmed Allam
200a501f15 feat(runtime): pass host devices from STRIX_DOCKER_SANDBOX_DEVICES through to the sandbox container
Some checks failed
CI / python (push) Has been cancelled
CI / tui (push) Has been cancelled
CI / viewer (push) Has been cancelled
CI / package (push) Has been cancelled
CI / workflows (push) Has been cancelled
CI / ci-passed (push) Has been cancelled
2026-10-25 01:59:21 +03:00
Ahmed Allam
dc40345e26 test(agents): check the diff skill's own coverage lines, not the word 2026-10-24 21:02:27 +03:00
Ahmed Allam
fa3539cb75 fix(skills): the diff skill drops its coverage ledger instructions when the coverage tools are off 2026-10-24 21:02:27 +03:00
Ahmed Allam
aaf1f8c823 fix(agents): finish_scan drops its coverage reconciliation step when the coverage tools are off 2026-10-24 21:02:27 +03:00
Ian
bac386e509 refactor(skills): put the coverage conditionals on their own lines 2026-10-24 21:02:27 +03:00
Ian
898bbb4741 feat(agents): drop the coverage sections from skills and tool descriptions when the tools are off 2026-10-24 21:02:27 +03:00
Ian
5418c767a2 feat(agents): let callers turn off the coverage ledger tools 2026-10-24 21:02:27 +03:00
Ian
fff22045ae refactor(prompts): put the parallel-tool-calls conditionals on their own lines 2026-10-24 20:32:27 +03:00
Ian
dca9482c82 feat(core): opt-in parallel tool calls via STRIX_PARALLEL_TOOL_CALLS 2026-10-24 20:32:27 +03:00
Ian
f46bed6740 refactor(hooks): name the soft turn-limit warning after the soft limit 2026-10-24 20:19:38 +03:00
Ian
b8d586a39b fix(agents): an agent with several limited skills gets the largest turn limit 2026-10-24 20:19:38 +03:00
Ian
b17c0275a9 feat(agents): soft per-skill turn limits for sub-agents
run_strix_scan(subagent_turn_limits={skill: turns}) gives each sub-agent the
smallest limit among its skills. The agent is warned 10 turns before the limit
and reminded every 5 turns past it, but never stopped.
2026-10-24 20:19:38 +03:00
alex s
14cc948c36
Make the root agent follow up open coverage rows before finishing (#1573)
Some checks are pending
CI / python (push) Waiting to run
CI / tui (push) Waiting to run
CI / viewer (push) Waiting to run
CI / package (push) Waiting to run
CI / workflows (push) Waiting to run
CI / ci-passed (push) Blocked by required conditions
2026-10-23 10:48:00 -04:00
alex s
594398876f
Bump aiohttp, graphql-core, vite and trufflehog past known CVEs (#1569)
Some checks are pending
CI / python (push) Waiting to run
CI / tui (push) Waiting to run
CI / viewer (push) Waiting to run
CI / package (push) Waiting to run
CI / workflows (push) Waiting to run
CI / ci-passed (push) Blocked by required conditions
- aiohttp 3.14.3 -> 3.14.5 and graphql-core 3.2.11 -> 3.2.13 in uv.lock
- viewer frontend: vite 6.4.3 -> 6.4.4
- sandbox image: trufflehog 3.95.9 -> 3.99.2 (updates its embedded go-git,
  go-billy, amqp091-go and mongo-driver)
2026-10-22 23:28:10 -04:00
theo-at-strix
0f81f40765
feat(skills): expand XSS coverage for HTML injection and normalization (#1559)
Some checks are pending
CI / python (push) Waiting to run
CI / tui (push) Waiting to run
CI / viewer (push) Waiting to run
CI / package (push) Waiting to run
CI / workflows (push) Waiting to run
CI / ci-passed (push) Blocked by required conditions
* feat(skills): expand XSS coverage for HTML injection and normalization

* Update xss.md

---------

Co-authored-by: alex s <46074070+bearsyankees@users.noreply.github.com>
2026-10-22 01:09:33 -04:00
alex s
a3c31236bd
build(deps): enforce a 5-day release cooldown for uv and npm resolution (#1556) 2026-10-21 11:30:08 -04:00
alex s
fde37a149f
fix(reporting): keep HTTP exchange evidence when the proxy is slow to verify ids (#1551)
Some checks are pending
CI / python (push) Waiting to run
CI / tui (push) Waiting to run
CI / viewer (push) Waiting to run
CI / package (push) Waiting to run
CI / workflows (push) Waiting to run
CI / ci-passed (push) Blocked by required conditions
Verifying http_exchange_ids fetched every request with its full raw
request and response bodies, serially, and timed out on busy proxy
projects; the ids were then dropped and the finding lost its evidence.

Check existence with an id-only GraphQL query, retry once, and when the
proxy still does not answer keep the ids with a warning instead of
discarding them.
2026-10-20 23:36:38 -04:00
ian-at-strix
3a3855fc4f
feat(agents): let callers choose the report tool (#1550)
* feat(agents): let callers remove base tools from scan agents

* feat(agents): let callers choose the report tool instead of removing tools

* refactor(agents): name the report tool via the prompt template, not string replacement
2026-10-20 20:21:31 -04:00
Ian
aa2036f229 fix(llm): keep request_log.install(); record tool call timings; both only with STRIX_RUN_RECORD_TIMINGS 2026-10-20 18:26:50 +03:00
Ian
f4a7413963 feat(llm): run.json records every provider request's timing, provider and tokens in llm_requests 2026-10-20 18:26:50 +03:00
Ahmed Allam
a0f8ea2cd3 fix(core): a parked agent keeps its pause reason and drains queued messages on resume
Some checks failed
CI / python (push) Has been cancelled
CI / tui (push) Has been cancelled
CI / viewer (push) Has been cancelled
CI / package (push) Has been cancelled
CI / workflows (push) Has been cancelled
CI / ci-passed (push) Has been cancelled
BudgetPausedError carries whether the operator pause caused it, so a resume that lands between the hook's refusal and the loop's handler still parks and continues instead of exiting under the stop policy. After the resume the agent drains its mailbox into the session before retrying the call, so a message queued while it was held is not skipped.
2026-10-18 14:58:16 +03:00
Ahmed Allam
6bd1cead1a fix(core): an operator pause holds under every budget policy and only resume_budget lifts it 2026-10-18 14:58:16 +03:00
Ahmed Allam
ee22e2b8ed fix(agents): the running-process marker is matched only in the result header, never in command output
Some checks are pending
CI / python (push) Waiting to run
CI / workflows (push) Waiting to run
CI / ci-passed (push) Blocked by required conditions
CI / tui (push) Waiting to run
CI / viewer (push) Waiting to run
CI / package (push) Waiting to run
2026-10-18 02:48:44 +03:00
Ahmed Allam
2b98deb3d2 fix(agents): the non-TTY note goes into the Output section so renderers keep stripping the metadata block 2026-10-18 02:48:44 +03:00
Ahmed Allam
5e9e69a07e fix(agents): exec_command states the 30 s yield cap and that a running non-TTY process cannot be polled 2026-10-18 02:48:44 +03:00
Szymon Nastaly
972f5097c2
feat(llm): extra request-body fields via LLM_EXTRA_BODY (#1495)
Some checks failed
CI / python (push) Has been cancelled
CI / tui (push) Has been cancelled
CI / viewer (push) Has been cancelled
CI / package (push) Has been cancelled
CI / workflows (push) Has been cancelled
CI / ci-passed (push) Has been cancelled
* feat(llm): extra request-body fields via LLM_EXTRA_BODY

Some provider parameters, such as OpenAI's service_tier and
safety_identifier, are read only from the request body, so
LLM_EXTRA_HEADERS can't set them. LLM_EXTRA_BODY merges a JSON object
into the body of every request to the configured model, on both routing
paths. A dedicated dedupe model gets its own DEDUPE_LLM_EXTRA_BODY
instead, as with headers.

* fix(config): decode saved JSON-object settings when loading

persist_current() saves env values verbatim, so LLM_EXTRA_HEADERS,
LLM_EXTRA_BODY and their DEDUPE_ variants land in cli-config.json as JSON
text. The loader passed that text unchanged to the dict fields, so a later
launch without the env var failed validation. Decode saved strings for
dict fields, as pydantic-settings does for env vars.

---------

Co-authored-by: Szymon Nastaly <szymon.nastaly@autoform.ch>
2026-10-15 16:37:51 -04:00
alex s
ca20626f84
fix(models): replay malformed tool-call arguments as valid JSON (#1327)
Some checks are pending
CI / python (push) Waiting to run
CI / viewer (push) Waiting to run
CI / package (push) Waiting to run
CI / tui (push) Waiting to run
CI / workflows (push) Waiting to run
CI / ci-passed (push) Blocked by required conditions
* fix(models): replay malformed tool-call arguments as valid JSON

A model that emits a tool call with truncated or otherwise invalid JSON
arguments fails that one call, but the raw string is recorded in the
session. Strict OpenAI-compatible servers (vLLM, SGLang) validate every
assistant tool call in the request, so each later turn is rejected with
"Assistant tool call function.arguments must be valid JSON" and the agent
never recovers. The turn guard now rewrites such arguments on the way out
to a JSON object carrying the original text, alongside the existing
duplicate call-id repair.

* fix(agents): tell the model to re-issue tool calls whose arguments are not valid JSON

A streamed turn that ends mid-tool-call leaves the client with a JSON prefix
as the arguments. Instead of the SDK's generic parse-error result, the tool
wrapper now short-circuits with a clear 'not executed, re-issue with complete
arguments' message so the model recovers in one turn.

* fix(models): treat NaN/Infinity tool-call arguments as malformed

* test(cost): pin model resolution in the provider-prefixed cost test

* fix(models): treat over-nested tool-call arguments as malformed
2026-10-14 18:17:20 -04:00
ian-at-strix
e21f9ce4cc
test(resume-picker): put the pty in cbreak so the key-reader test can't hang on macOS (#1527) 2026-10-14 15:55:22 -04:00
yoni-at-strix
87f2d783d6
fix(reporting): drop the static-analysis disclaimer from dependency evidence (#1520) 2026-10-14 10:59:11 -04:00
Ahmed Allam
956a26715b feat(runtime): accept an awaitable extra_files in create_or_reuse so the sandbox create does not wait for it
Some checks are pending
CI / python (push) Waiting to run
CI / tui (push) Waiting to run
CI / viewer (push) Waiting to run
CI / package (push) Waiting to run
CI / workflows (push) Waiting to run
CI / ci-passed (push) Blocked by required conditions
2026-10-14 03:32:29 +03:00
Ahmed Allam
0f8db1fca8 fix(runtime): keep the default path blocking on the proxy endpoint and discard a sandbox created after a cancelled deferred bring-up 2026-10-14 00:48:53 +03:00
Ahmed Allam
4bf7541599 feat(runtime): defer the sandbox bring-up behind a DeferredSandboxSession when create_or_reuse is called with defer=True 2026-10-14 00:48:53 +03:00
Ian
d8c00a8f4e fix(proxy): log all Caido SDK errors as warnings
Some checks are pending
CI / python (push) Waiting to run
CI / tui (push) Waiting to run
CI / viewer (push) Waiting to run
CI / package (push) Waiting to run
CI / workflows (push) Waiting to run
CI / ci-passed (push) Blocked by required conditions
2026-10-12 22:18:42 +03:00
Ian
c5854e7be2 fix(proxy): log Caido timeouts as warnings 2026-10-12 22:18:42 +03:00
Ian
442b3c3df5 fix(tui): give the targets box only rows the agents panel would get, and always count hidden targets 2026-10-12 20:17:29 +03:00
Ian
710fe7b3b6 feat(tui): move the run's targets into their own sidebar box under the viewer 2026-10-12 20:17:29 +03:00
Ian
b68cdb8edc feat(tui): list the run's targets in the sidebar stats panel 2026-10-12 20:17:29 +03:00
yoni-at-strix
429f6218f5
feat(reporting): accept code_locations on dependency reports (#1366) 2026-10-12 08:54:36 -07:00
yoni-at-strix
f7a32ae62d
docs(readme): add update instructions (#1501)
Some checks failed
CI / python (push) Has been cancelled
CI / tui (push) Has been cancelled
CI / viewer (push) Has been cancelled
CI / package (push) Has been cancelled
CI / workflows (push) Has been cancelled
CI / ci-passed (push) Has been cancelled
2026-10-10 20:31:50 -04:00
ian-at-strix
62b496430d
feat(agents): let callers choose the top-level agent's finish tool (#1496)
Some checks failed
CI / package (push) Has been cancelled
CI / workflows (push) Has been cancelled
CI / python (push) Has been cancelled
CI / tui (push) Has been cancelled
CI / viewer (push) Has been cancelled
CI / ci-passed (push) Has been cancelled
2026-10-08 19:11:50 -04:00
alex s
f5a900416b
fix(mcp): load catalogs before agents discover connections (#1492)
* fix(mcp): load catalogs before agents discover connections

* fix(mcp): bound discovery waits without cancelling catalog loads

* fix(mcp): keep discovery waiters alive across deadlines
2026-10-08 12:42:39 -04:00
ian-at-strix
4695290682
feat(llm): bound the first stream event and the whole stream (#1487)
Some checks are pending
CI / python (push) Waiting to run
CI / tui (push) Waiting to run
CI / viewer (push) Waiting to run
CI / package (push) Waiting to run
CI / workflows (push) Waiting to run
CI / ci-passed (push) Blocked by required conditions
2026-10-07 18:35:45 -07:00
ian-at-strix
928f053610
feat(llm): retry 4xx model errors (#1486)
* feat(llm): log the upstream provider behind OpenRouter

LiteLLM drops OpenRouter's top-level `provider` from stream chunks (including error chunks) and the `metadata.provider_name` of non-2xx replies, so the request log could not say which provider served or failed an attempt. Record both, plus OpenRouter's `metadata.error_type`, per attempt and emit them as `upstream=` / `upstream_error=` on the llm_request line.

* feat(llm): retry 4xx model errors

* test: let the blocked-provider test run out of 4xx retries

* refactor: retry any 4xx or 5xx status

* fix: don't retry 401, 402 or 403

* fix: don't retry 404
2026-10-07 18:35:33 -07:00
ian-at-strix
39792c9d61
feat(llm): log the upstream provider behind OpenRouter (#1459)
LiteLLM drops OpenRouter's top-level `provider` from stream chunks (including error chunks) and the `metadata.provider_name` of non-2xx replies, so the request log could not say which provider served or failed an attempt. Record both, plus OpenRouter's `metadata.error_type`, per attempt and emit them as `upstream=` / `upstream_error=` on the llm_request line.
2026-10-07 18:35:12 -07:00
ian-at-strix
278b6a280b
fix(execution): only strip images on image-rejection errors (#1461)
* fix(execution): only strip images on image-rejection errors

The image-strip recovery fired on any 400/404/422, wiping a session's screenshots and replaying the turn on unrelated errors (e.g. an upstream incomplete-tool-call 400, a context overflow). Require an image-related message too.

* fix(execution): match only replies that mean the model takes no images

* fix(execution): match DeepSeek's image rejection

* fix(execution): guess at Vercel AI Gateway's image rejection
2026-10-07 23:59:43 +03:00
ian-at-strix
5a30961852
feat(llm): scrub images from every request to a text-only model (#1466)
* feat(llm): scrub images from every request to a text-only model

Replace images at the MCP call before any result_transform, give load_skill the
same agent_browser screenshot swap as the system prompt, and add a
call_model_input_filter that turns any image left in the input into a tool error
while chaining any filter already set.

* chore: fix the ruff and bandit failures on main
2026-10-07 23:59:19 +03:00
ian-at-strix
7f1d148778
feat(llm): keep images away from text-only models (#1465)
* feat(llm): keep images away from text-only models

Leave view_image out of the tools, replace MCP image blocks with a text note,
and swap agent_browser's screenshot section for text-only guidance when the
run's model does not accept images.

* refactor(llm): disable view_image via is_enabled and gate skill image guidance by modality

* refactor(skills): render opt-in Jinja skills instead of comment markers

* Tweaked skill
2026-10-07 23:11:58 +03:00
ian-at-strix
acd64e929c
feat(llm): detect whether a model accepts image input (#1460)
* feat(llm): detect whether a model accepts image input

Add model_supports_images(): OpenRouter models are checked against architecture.input_modalities from OpenRouter's public model list (fetched once per process), others against LiteLLM's supports_vision. Unknown models and lookup failures count as image-capable. Not wired in yet.

* refactor(llm): read image support from litellm's catalog, assuming it for unknown models

* style: drop a trailing space in the image-support docstring
2026-10-07 22:58:43 +03:00