Commit graph

794 commits

Author SHA1 Message Date
Ahmed Allam
bb7e82b6ea chore(telemetry): drop per-load skill_loaded beacons, send anonymous events
Report the distinct set of skills used once on scan_ended instead of one
skill_loaded event per skill per prompt render. Mark PostHog events with
$process_person_profile=false (distinct_id is a throwaway session id, so
person profiles were never useful) and tag them with $lib/$lib_version.
2026-09-05 03:26:12 +03:00
Ahmed Allam
9cc9de8cdc fix(warmup): drop docker from WARMUP_MODULES
The Docker checks import the Docker SDK on the main thread before the
warm-up join, so warming it saves nothing and leaves one module shared
between the two threads during the startup window.
2026-09-05 02:45:34 +03:00
Ahmed Allam
a3bf864e1e test(warmup): assert wait_for_import_warmup blocks until the thread finishes 2026-09-05 02:45:34 +03:00
Ahmed Allam
e60fd83931 refactor(warmup): drop the orphan purge and join the warm-up once before the engine imports 2026-09-05 02:45:34 +03:00
Ahmed Allam
7f46dd17d3 fix(cli): wait for the import warm-up before importing the agents SDK on the main thread
The warm-up thread imports strix.core.runner while warm_up_llm and
preflight_model_connection import agents.models.interface. Both walk the
agents SDK graph from different entry points, CPython fails one side to
break the import-lock cycle, and the orphan purge then removes agents.*
from sys.modules while the main thread is still importing it, crashing
strix -n with KeyError: 'agents.models'.
2026-09-05 02:45:34 +03:00
devin-ai-integration[bot]
afa7c4a77f
feat(web_search): add Exa as a web search provider alongside Perplexity (#1270) 2026-09-04 10:34:28 -07:00
oyasumi
f6d9790ecb fix(viewer): show stopped run status 2026-09-04 01:10:10 +03:00
alex s
5d015df6b1
fix(cloud): print top-up instructions on 402 and guide oversize or archive --source (#1242)
- Every payment-required error now ends with a "Next step" line: the
  platform hint when one is sent, else the topup command and the billing
  URL for the configured platform. JSON output gets the same text as
  next_step. The platform hint is no longer repeated inside the error.
- An archive file passed to --source is rejected with guidance to pass
  the directory instead, which packs and excludes deps/build output.
- An oversize archive names its largest files and points to --exclude
  and --dry-run --show-files.
- uploads request help points to scans start --source for local code.
2026-09-02 15:26:37 -04:00
Ahmed Allam
1edafd3e80 fix(agents): stop parents waiting on finished non-interactive children
A non-interactive agent's loop returns after its terminal state, yet
send_message_to_agent kept reporting messages to it as delivered and the
parent then waited out wait_for_agents on a reply that could never come.

- AgentRuntime.resumable records whether the loop parks for wake-ups after a
  terminal state; run_agent_loop / _start_child_runner set it from interactive.
- AgentCoordinator.send returns False (nothing queued) for a terminal agent
  that is not resumable; send_message_to_agent surfaces target_status and
  delivery_status=not_delivered with a pointer to list_reports / get_report.
- wait_for_agents returns wait_outcome=no_active_agents at once when no other
  agent is running or waiting in a non-interactive run.
- agent_finish reads the reports the finishing agent filed from the report
  state and puts their ids in the completion report, the parent message
  (filed_report_ids) and its own return payload, so parents no longer have to
  infer what was filed from prose.
2026-09-02 22:11:12 +03:00
Ahmed Allam
f1e24fe3f2 chore: release v1.6.1 2026-09-02 19:05:46 +03:00
Ahmed Allam
e644f4a02c docs(readme): shorten the coding-agent skills paragraph 2026-09-02 18:46:33 +03:00
Ahmed Allam
1ebe1007e8 docs: keep the existing recommended model rows in the README 2026-09-02 18:35:45 +03:00
Ahmed Allam
53d2e5cfeb docs: note viewer steering, history, and report prerequisites 2026-09-02 18:35:45 +03:00
Ahmed Allam
7708f717d5 docs: trim crammed README sections and add cloud CLI and viewer docs pages 2026-09-02 18:35:45 +03:00
devin-ai-integration[bot]
a8642de76c
docs(readme): trim the strix cloud section to the essentials (#1237) 2026-09-02 07:19:56 -07:00
Ahmed Allam
75b89018d3 docs: use openrouter/z-ai/glm-5.3 as the default model in setup examples 2026-09-02 16:52:53 +03:00
Ahmed Allam
129f938094 fix(models): keep aggregator routes out of RECOMMENDED_MODEL_NAMES, family matching already accepts them 2026-09-02 16:52:53 +03:00
Ahmed Allam
b438632e12 fix(models): keep list additions-only, restore gpt-5.4 examples, make openrouter/z-ai/glm-5.3 the top pick 2026-09-02 16:52:53 +03:00
Ahmed Allam
0ab7244807 feat(models): refresh the recommended model list and docs examples
Add Claude Fable 5.1, Gemini 3.7 Flash, and Z.ai GLM-5.3 / GLM-5.3-Flash
to RECOMMENDED_MODEL_NAMES, add a Z.ai GLM frontier family so GLM-5.x is
accepted through OpenRouter and Novita routes, and drop the superseded
GPT-5.4, GPT-5.3-codex, Opus 4.8, Sonnet 4.6, Gemini 3.6 Flash, and
Qwen3.7 entries. Update the README, docs provider pages, quickstart, and
CLI hint strings to the same current models, including DeepSeek V4,
Kimi K3, and GLM-5.3.
2026-09-02 16:52:53 +03:00
Ahmed Allam
c514f712f4 fix(config): persist only the alias the runtime settings read
pydantic-settings takes the first alias present in the environment, even
when it is empty. persist_current() must save that same alias, so an empty
LLM_API_KEY does not let a non-empty OPENAI_API_KEY sibling land in the
file and restore a credential the run did not use.
2026-09-02 16:10:52 +03:00
Ahmed Allam
3e88e498b9 fix(config): drop the stored LLM connection when a linked env var changes
A new STRIX_LLM, LLM_API_KEY, or LLM_API_BASE exported in the shell must not
be combined with the key, base, or model still stored in cli-config.json.
Restore the pre-refactor rule: when any linked LLM connection var differs
from the stored value, discard the whole stored connection before loading
and before persisting. Unrelated stored settings are kept.
2026-09-02 16:10:52 +03:00
Ahmed Allam
ce0db30252 fix(config): merge env into cli-config.json instead of overwriting it
persist_current rewrote the config file with only the env vars set in the
shell, so a run whose STRIX_LLM or LLM_API_KEY came from the file erased
them and the next launch failed with MISSING REQUIRED ENVIRONMENT
VARIABLES. Start from the stored env block, let a set env var override or
replace the aliases of its field, and let an empty env var clear it.
2026-09-02 16:10:52 +03:00
Ahmed Allam
941c960650 fix(ci): make the pre-commit mypy hook and the test suite pass on a fresh checkout 2026-09-02 15:15:51 +03:00
Ahmed Allam
46b4e6cb64 fix(tui): run environment and model checks on the no-target start screen
The interactive start screen skipped validate_environment() entirely, and
a bare prompt sent verify=false so the model preflight never ran. Both
kinds of setup launch now verify the model before leaving the start
screen, environment validation runs for every mode, and quitting setup
without a scan still shows the update notice.
2026-09-02 15:03:19 +03:00
yoni-at-strix
b5c3807fef
fix(mcp): keep the session on tool-call protocol errors and report quarantine truthfully (#1228) 2026-09-01 22:43:54 -04:00
alex s
42baa7c09e
skills: point to the strix cloud CLI in every skill (#1227) 2026-09-01 18:12:29 -04:00
Ahmed Allam
8fdf6a5c09 chore: release v1.6.0 2026-09-01 23:29:06 +03:00
alex s
46cf2f52f3
report: add update_vulnerability_report so an agent can revise a filed finding (#1210)
Co-authored-by: Ahmed Allam <ahmed39652003@gmail.com>
2026-09-01 13:07:17 -07:00
alex s
3de9471431 Link CLI wallet (#1222) 2026-09-01 16:00:32 -04:00
alex s
a071022182
Forward the workspace header through the wallet payment bridge (#1221) 2026-09-01 14:57:00 -04:00
alex s
d26b1ab0de
pentest skill cloud cli (#1220)
* Reference the strix cloud CLI in the penetration-testing skill

* Note scope selection and default billing scopes in the cloud login example

* Shorten the scopes note in the cloud login example
2026-09-01 14:50:02 -04:00
alex s
de730119f0
feat(cli): strix cloud — managed platform CLI (login, scans, billing, and the rest of the API) (#1177)
* feat(cli): add strix login for managed platform sign-in (device flow)

* feat(cli): add --scopes flag to strix login

* docs: document strix login and managed billing in README, AGENTS, docs, and managed skill

* fix(cli): handle malformed login responses and credential file failures

* fix(cli): reject sign-in responses without an API token

* feat(login): interactive workspace and scope selection with presets

* fix(login): reject malformed API token values in sign-in responses

* fix(login): skip the scope prompt when stdin is not a terminal

* fix(login): tolerate malformed selection containers and remove unreadable credential files on logout

* fix(login): treat overflowing timing values as invalid

* fix(login): show the configured platform host in the sign-in banner

* fix(login): bound device flow timing values and clean up unreplaced secret temp files

* feat(cli): add the strix cloud command surface for the managed platform

* feat(cli): manage workspaces and hosted onboarding links from strix cloud

* fix(cli): report a leftover temporary secret file instead of hiding it

* feat(cli): pass a Stripe payment method to the top-up wallet client

* docs(cloud): recommend the Stripe agent wallet as the default payment path

* fix(cloud): preserve API auth during MPP payment

* fix(cloud): drop knowledge query and settings commands removed from the API

* fix(cloud): align agent commands with API contracts

* fix(cloud): send required PR review integration fields

* fix(cloud): preserve scopes when switching workspaces

* fix(cloud): make session command help non-destructive

* feat(cloud): improve human navigation and output

* feat(cli): add native shell completions

* feat(cloud): tailor human list and detail views

* feat(cloud): upload local source for managed scans

* fix(cloud): infer scan type from local targets

* Add agent-friendly managed cloud CLI

* Harden cloud CLI type boundaries

* Clarify cloud test user MFA options

* Correct cloud vulnerability status guidance

* Clarify chat file path handling

* Allow signed storage upload URLs

* Fix provider token request handling

* Improve cloud CLI human list views

* Make cloud CLI workflows actionable and safe

* Make cloud workspace switching session-safe

* Preserve CLI session metadata in JSON output

* Remove preview protection bypass plumbing from cloud CLI
2026-09-01 14:39:34 -04:00
devin-ai-integration[bot]
608ef4a37b
Make MCP connections survive transient transport failures (#1184) 2026-09-01 08:11:43 -07:00
Ahmed Allam
f901d2a8bf fix(runtime): drop staged extra files on any failure before the bundle is cached 2026-09-01 16:54:20 +03:00
Ahmed Allam
944274e12f fix(runtime): remove the extra-file staging dir on cleanup and failed bring-up 2026-09-01 16:54:20 +03:00
Ahmed Allam
eeca404716 fix(runtime): stage extra-file bind mounts under the temp dir so remote docker daemons can resolve them 2026-09-01 16:54:20 +03:00
oyasumi
1df67c52e2
fix(viewer): harden PDF report rendering (#1192)
* fix(viewer): harden PDF report rendering

* test(viewer): cover crossed markdown emphasis

---------

Co-authored-by: oyasumi <oyasumi@kantilabs.xyz>
2026-08-31 20:22:33 -04:00
alex s
3c767cdd47
csv injection hardening (#1203)
* fix(report): neutralize CSV formula injection in vulnerabilities.csv

write_vulnerabilities() wrote finding titles straight into vulnerabilities.csv.
The csv module escapes CSV syntax but has no notion of spreadsheet formula
triggers, so a title beginning with =, +, -, @, tab or CR reached the cell
intact and was evaluated when a human opened the file (CWE-1236).

That input is attacker-influenced by design: Strix scans untrusted targets and
the agent quotes target content verbatim into finding titles, so a scanned page
can dictate a cell's literal contents. _validate_required_text only checks the
title is non-blank.

Add csv_safe() and apply it to every cell written. A value starting with a
formula trigger is prefixed with an apostrophe, the standard mitigation:
spreadsheets render the rest as literal text and hide the apostrophe.

This follows the module's existing safe_fence() precedent, which already guards
the markdown path against the same class of attacker-influenced content.

Adds regression tests covering the six trigger characters, that the payload
survives intact behind the guard, and that benign titles are untouched.

* report: single-line titles, exact CSV bytes, accurate csv_safe docstring

Strip control characters from finding titles at the ReportState choke point so
the guard in the CSV writer is defense-in-depth rather than the only layer, and
write artifacts with newline="" so the CSV's own \r\n terminators are not
rewritten to \r\r\n on Windows.

* report: normalize hydrated titles on resume

* report: rewrite finding markdown when resume cleans its title

---------

Co-authored-by: itzzdev09 <devved90@gmail.com>
2026-08-30 23:36:16 -04:00
0xallam
0a6e8b01bf Fix user message retry lifecycle and TUI sync 2026-08-28 23:46:49 +03:00
Ahmed Allam
1f3f9b31ae fix(report): keep strix.report import-light so it never races the warm-up thread into the agents SDK graph 2026-08-28 20:02:33 +03:00
devin-ai-integration[bot]
cf179d564e
fix(llm): bind dedupe credentials to a provider; send reasoning=max via extra_body (#1187)
Co-authored-by: Ahmed Allam <ahmed39652003@gmail.com>
2026-08-28 09:27:57 -07:00
devin-ai-integration[bot]
583af23d9a
fix(llm): only attach prompt-cache points on routes LiteLLM serves (#1186)
Co-authored-by: Ahmed Allam <ahmed39652003@gmail.com>
2026-08-28 09:26:57 -07:00
yoni-at-strix
717ffc8f4c
Isolate MCP connections per task and surface connection status in the UIs (#1181) 2026-08-27 14:10:44 -07:00
yoni-at-strix
cbb0f57058
Reach MCP tools on demand instead of registering every one (#1175) 2026-08-26 16:31:08 -07:00
Ahmed Allam
8b655de615 Mirror the run's threat models into its state dir so resume keeps them 2026-08-27 01:36:47 +03:00
Ahmed Allam
7d8d71beea Scope threat models to the current run instead of caching them on disk 2026-08-27 01:36:47 +03:00
alex s
a5856108a7
fix(tui): restore base foreground after ANSI resets (#1169) 2026-08-26 14:11:51 -04:00
devin-ai-integration[bot]
bfaaa904f2
fix(update): re-exec runs the new binary after self-update (endless update-prompt loop) (#1168)
Co-authored-by: Ahmed Allam <ahmed39652003@gmail.com>
2026-08-25 15:13:35 -07:00
alex s
187f41f36f
Treat literal 'null'/'none' strings as absent for optional tool args (#1164)
* Treat literal 'null'/'none' strings as absent for optional tool args

Models routinely pass the literal string "null" or "none" instead of
omitting an optional argument. Taken at face value it becomes a filter
that matches nothing, so tools like list_notes / list_reports /
list_requests silently return no results.

Coerce such values to None in the central argument-coercion layer, but
only for parameters the schema allows to be null (or that are absent from
a declared "required" list), so required strings keep the literal value.
The list/filter helpers normalize the same values too, so a direct call
can't regress.

* Limit nullish coercion to query tools and keep literal tags

A literal "null"/"none" is only a mistake where the argument is a filter, so
gate the coercion on read-only query tools; a tool that writes keeps the value,
which stops update_note(content="none") from being read as "leave unchanged".

Stop dropping nullish entries from a notes tag filter too: tags are free-form,
so a literal "none" tag stays filterable and mixed tag queries keep every
branch.
2026-08-25 13:21:12 -04:00
yoni-at-strix
f4ef8867f6
Add MCP server support (#1137)
* add a generic MCP client and a config for connecting MCP servers

* Add MCP docs and CLI polish: docs page, startup connect summary, --mcp-config flag, compact tool output

* Add MCP connection notes and per-run selection; clean up on cancel and dedupe names

* Show errored MCP tool calls as failed in the TUI

* Sanitize namespaced tool names so model APIs accept them

* Show MCP tool calls distinctly in the terminal and the run viewer

* Say what MCP servers are worth connecting for

* Correct the notes docstring to match how notes reach the agent

* keep the mcp tests from reading your shell's STRIX_MCP_* vars
2026-08-24 14:00:16 -04:00