2026-03-31 17:20:41 -07:00
|
|
|
[project]
|
2025-08-08 20:36:44 -07:00
|
|
|
name = "strix-agent"
|
2026-03-22 22:09:39 -07:00
|
|
|
version = "0.8.3"
|
2025-08-08 20:36:44 -07:00
|
|
|
description = "Open-source AI Hackers for your apps"
|
|
|
|
|
readme = "README.md"
|
|
|
|
|
license = "Apache-2.0"
|
2026-03-31 17:20:41 -07:00
|
|
|
requires-python = ">=3.12"
|
|
|
|
|
authors = [
|
|
|
|
|
{ name = "Strix", email = "hi@usestrix.com" },
|
|
|
|
|
]
|
2025-08-08 20:36:44 -07:00
|
|
|
keywords = [
|
|
|
|
|
"cybersecurity",
|
|
|
|
|
"security",
|
|
|
|
|
"vulnerability",
|
|
|
|
|
"scanner",
|
|
|
|
|
"pentest",
|
|
|
|
|
"agent",
|
|
|
|
|
"ai",
|
|
|
|
|
"cli",
|
|
|
|
|
]
|
|
|
|
|
classifiers = [
|
|
|
|
|
"Development Status :: 3 - Alpha",
|
|
|
|
|
"Intended Audience :: Information Technology",
|
|
|
|
|
"Intended Audience :: System Administrators",
|
|
|
|
|
"Topic :: Security",
|
|
|
|
|
"License :: OSI Approved :: Apache Software License",
|
|
|
|
|
"Environment :: Console",
|
|
|
|
|
"Programming Language :: Python",
|
|
|
|
|
"Programming Language :: Python :: 3",
|
|
|
|
|
"Programming Language :: Python :: 3 :: Only",
|
|
|
|
|
"Programming Language :: Python :: 3.12",
|
2025-12-13 11:19:59 -08:00
|
|
|
"Programming Language :: Python :: 3.13",
|
|
|
|
|
"Programming Language :: Python :: 3.14",
|
2025-08-08 20:36:44 -07:00
|
|
|
]
|
2026-03-31 17:20:41 -07:00
|
|
|
dependencies = [
|
2026-04-24 23:43:56 -07:00
|
|
|
"openai-agents[litellm]==0.14.6",
|
2026-04-25 13:07:02 -07:00
|
|
|
"pydantic>=2.11.3",
|
2026-04-25 16:05:40 -07:00
|
|
|
"pydantic-settings>=2.13.0",
|
2026-03-31 17:20:41 -07:00
|
|
|
"rich",
|
|
|
|
|
"docker>=7.1.0",
|
|
|
|
|
"textual>=6.0.0",
|
|
|
|
|
"requests>=2.32.0",
|
|
|
|
|
"cvss>=3.2",
|
2026-04-25 14:23:56 -07:00
|
|
|
"caido-sdk-client>=0.2.0",
|
2025-08-08 20:36:44 -07:00
|
|
|
]
|
|
|
|
|
|
2026-03-31 17:20:41 -07:00
|
|
|
[project.scripts]
|
2025-10-29 06:14:08 +03:00
|
|
|
strix = "strix.interface.main:main"
|
2025-08-08 20:36:44 -07:00
|
|
|
|
2026-03-31 17:20:41 -07:00
|
|
|
[dependency-groups]
|
|
|
|
|
dev = [
|
|
|
|
|
"mypy>=1.16.0",
|
|
|
|
|
"ruff>=0.11.13",
|
|
|
|
|
"pyright>=1.1.401",
|
|
|
|
|
"bandit>=1.8.3",
|
|
|
|
|
"pre-commit>=4.2.0",
|
|
|
|
|
"pyinstaller>=6.17.0; python_version >= '3.12' and python_version < '3.15'",
|
|
|
|
|
]
|
2025-12-07 14:35:08 +02:00
|
|
|
|
2025-08-08 20:36:44 -07:00
|
|
|
[build-system]
|
2026-03-31 17:20:41 -07:00
|
|
|
requires = ["hatchling"]
|
|
|
|
|
build-backend = "hatchling.build"
|
|
|
|
|
|
|
|
|
|
[tool.hatch.build.targets.wheel]
|
|
|
|
|
packages = ["strix"]
|
2025-08-08 20:36:44 -07:00
|
|
|
|
|
|
|
|
# ============================================================================
|
|
|
|
|
# Type Checking Configuration
|
|
|
|
|
# ============================================================================
|
|
|
|
|
|
|
|
|
|
[tool.mypy]
|
|
|
|
|
python_version = "3.12"
|
|
|
|
|
strict = true
|
|
|
|
|
strict_optional = true
|
|
|
|
|
warn_redundant_casts = true
|
|
|
|
|
warn_unused_ignores = true
|
|
|
|
|
warn_return_any = true
|
|
|
|
|
warn_unreachable = true
|
|
|
|
|
disallow_untyped_defs = true
|
|
|
|
|
disallow_any_generics = true
|
|
|
|
|
disallow_subclassing_any = true
|
|
|
|
|
disallow_untyped_calls = true
|
|
|
|
|
disallow_incomplete_defs = true
|
|
|
|
|
check_untyped_defs = true
|
|
|
|
|
disallow_untyped_decorators = true
|
|
|
|
|
no_implicit_optional = true
|
|
|
|
|
warn_unused_configs = true
|
|
|
|
|
show_error_codes = true
|
|
|
|
|
show_column_numbers = true
|
|
|
|
|
pretty = true
|
|
|
|
|
|
|
|
|
|
# Allow some flexibility for third-party libraries
|
|
|
|
|
[[tool.mypy.overrides]]
|
|
|
|
|
module = [
|
|
|
|
|
"litellm.*",
|
|
|
|
|
"rich.*",
|
|
|
|
|
"jinja2.*",
|
|
|
|
|
"textual.*",
|
2026-01-07 16:33:16 -08:00
|
|
|
"cvss.*",
|
2026-04-25 00:49:26 -07:00
|
|
|
"docker.*",
|
2026-04-25 14:23:56 -07:00
|
|
|
"caido_sdk_client.*",
|
2026-04-25 16:05:40 -07:00
|
|
|
"pydantic_settings.*",
|
2025-08-08 20:36:44 -07:00
|
|
|
]
|
|
|
|
|
ignore_missing_imports = true
|
2026-04-25 14:23:56 -07:00
|
|
|
disable_error_code = ["import-untyped"]
|
2025-08-08 20:36:44 -07:00
|
|
|
|
|
|
|
|
# ============================================================================
|
|
|
|
|
# Ruff Configuration (Fast Python Linter & Formatter)
|
|
|
|
|
# ============================================================================
|
|
|
|
|
|
|
|
|
|
[tool.ruff]
|
|
|
|
|
target-version = "py312"
|
|
|
|
|
line-length = 100
|
|
|
|
|
extend-exclude = [
|
|
|
|
|
".git",
|
|
|
|
|
".mypy_cache",
|
|
|
|
|
".ruff_cache",
|
|
|
|
|
"__pycache__",
|
|
|
|
|
"build",
|
|
|
|
|
"dist",
|
|
|
|
|
"migrations",
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
[tool.ruff.lint]
|
|
|
|
|
# Enable comprehensive rule sets
|
|
|
|
|
select = [
|
|
|
|
|
"E", # pycodestyle errors
|
|
|
|
|
"W", # pycodestyle warnings
|
|
|
|
|
"F", # Pyflakes
|
|
|
|
|
"I", # isort
|
|
|
|
|
"N", # pep8-naming
|
|
|
|
|
"UP", # pyupgrade
|
|
|
|
|
"YTT", # flake8-2020
|
|
|
|
|
"S", # flake8-bandit
|
|
|
|
|
"BLE", # flake8-blind-except
|
|
|
|
|
"FBT", # flake8-boolean-trap
|
|
|
|
|
"B", # flake8-bugbear
|
|
|
|
|
"A", # flake8-builtins
|
|
|
|
|
"COM", # flake8-commas
|
|
|
|
|
"C4", # flake8-comprehensions
|
|
|
|
|
"DTZ", # flake8-datetimez
|
|
|
|
|
"T10", # flake8-debugger
|
|
|
|
|
"EM", # flake8-errmsg
|
|
|
|
|
"FA", # flake8-future-annotations
|
|
|
|
|
"ISC", # flake8-implicit-str-concat
|
|
|
|
|
"ICN", # flake8-import-conventions
|
|
|
|
|
"G", # flake8-logging-format
|
|
|
|
|
"INP", # flake8-no-pep420
|
|
|
|
|
"PIE", # flake8-pie
|
|
|
|
|
"T20", # flake8-print
|
|
|
|
|
"PYI", # flake8-pyi
|
|
|
|
|
"Q", # flake8-quotes
|
|
|
|
|
"RSE", # flake8-raise
|
|
|
|
|
"RET", # flake8-return
|
|
|
|
|
"SLF", # flake8-self
|
|
|
|
|
"SIM", # flake8-simplify
|
|
|
|
|
"TID", # flake8-tidy-imports
|
|
|
|
|
"TCH", # flake8-type-checking
|
|
|
|
|
"ARG", # flake8-unused-arguments
|
|
|
|
|
"PTH", # flake8-use-pathlib
|
|
|
|
|
"ERA", # eradicate
|
|
|
|
|
"PD", # pandas-vet
|
|
|
|
|
"PGH", # pygrep-hooks
|
|
|
|
|
"PL", # Pylint
|
|
|
|
|
"TRY", # tryceratops
|
|
|
|
|
"FLY", # flynt
|
|
|
|
|
"PERF", # Perflint
|
|
|
|
|
"RUF", # Ruff-specific rules
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
ignore = [
|
|
|
|
|
"S101", # Use of assert
|
|
|
|
|
"S104", # Possible binding to all interfaces
|
|
|
|
|
"S301", # Use of pickle
|
|
|
|
|
"COM812", # Missing trailing comma (handled by formatter)
|
|
|
|
|
"ISC001", # Single line implicit string concatenation (handled by formatter)
|
|
|
|
|
"PLR0913", # Too many arguments to function call
|
|
|
|
|
"TRY003", # Avoid specifying long messages outside the exception class
|
|
|
|
|
"EM101", # Exception must not use a string literal
|
|
|
|
|
"EM102", # Exception must not use an f-string literal
|
|
|
|
|
"FBT001", # Boolean positional arg in function definition
|
|
|
|
|
"FBT002", # Boolean default positional argument in function definition
|
|
|
|
|
"G004", # Logging statement uses f-string
|
|
|
|
|
"PLR2004", # Magic value used in comparison
|
|
|
|
|
"SLF001", # Private member accessed
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
[tool.ruff.lint.per-file-ignores]
|
2026-04-25 11:28:58 -07:00
|
|
|
# Lazy imports inside functions to avoid circular dependency with
|
|
|
|
|
# strix.telemetry / strix.llm.dedupe / cvss.
|
|
|
|
|
"strix/tools/notes/tools.py" = ["PLC0415", "TC002"]
|
|
|
|
|
"strix/tools/finish/tool.py" = ["PLC0415", "TC002"]
|
|
|
|
|
"strix/tools/reporting/tool.py" = ["PLC0415", "TC002"]
|
2025-08-08 20:36:44 -07:00
|
|
|
"strix/tools/**/*.py" = [
|
|
|
|
|
"ARG001", # Unused function argument (tools may have unused args for interface consistency)
|
|
|
|
|
]
|
2026-04-24 23:43:56 -07:00
|
|
|
# SDK lifecycle hooks have a fixed signature — unused args are part of the contract.
|
|
|
|
|
"strix/orchestration/hooks.py" = [
|
|
|
|
|
"ARG002", # Unused method argument (RunHooks signature is set by SDK)
|
|
|
|
|
"TC002", # ModelResponse, RunContextWrapper, AgentHookContext are annotation-only
|
|
|
|
|
]
|
|
|
|
|
# Anthropic cache wrapper inherits from LitellmModel; signature shadows builtin `input`.
|
|
|
|
|
"strix/llm/anthropic_cache_wrapper.py" = [
|
|
|
|
|
"A002", # Argument shadows builtin (parent signature uses `input`)
|
|
|
|
|
"TC002", # Many SDK types are imports-for-annotations only
|
|
|
|
|
"TC003", # collections.abc.AsyncIterator imported for return type
|
|
|
|
|
]
|
|
|
|
|
# Custom Docker subclass duplicates parent body; some imports are for annotations.
|
2026-04-25 15:02:51 -07:00
|
|
|
# Backend factories import their backend's deps lazily so deployments
|
|
|
|
|
# that pick a different backend don't need every backend's libs installed.
|
|
|
|
|
"strix/runtime/backends.py" = ["PLC0415"]
|
2026-04-25 16:28:07 -07:00
|
|
|
# The vulnerability MD renderer is a long monolithic format function;
|
|
|
|
|
# splitting per-section would obscure the structure without simplifying.
|
|
|
|
|
"strix/io/scan_artifacts.py" = ["PLR0912", "PLR0915", "PERF401"]
|
2026-04-25 14:59:00 -07:00
|
|
|
"strix/runtime/docker_client.py" = [
|
2026-04-24 23:43:56 -07:00
|
|
|
"TC002", # Manifest, Container imported for annotations
|
|
|
|
|
"TC003", # uuid imported for annotation
|
|
|
|
|
]
|
|
|
|
|
"strix/llm/multi_provider_setup.py" = [
|
|
|
|
|
"TC002", # Model, ModelProvider imported for annotations
|
|
|
|
|
]
|
2026-04-25 00:13:34 -07:00
|
|
|
# SDK function-tool wrappers: the SDK calls get_type_hints() at registration
|
|
|
|
|
# time to derive the JSON schema, which evaluates annotations at runtime —
|
2026-04-25 09:30:23 -07:00
|
|
|
# so RunContextWrapper / Tool / TResponseInputItem must be imported eagerly,
|
|
|
|
|
# not under TYPE_CHECKING.
|
|
|
|
|
"strix/tools/todo/tools.py" = ["TC002"]
|
|
|
|
|
"strix/tools/thinking/tool.py" = ["TC002"]
|
|
|
|
|
"strix/tools/web_search/tool.py" = ["TC002"]
|
2026-04-25 14:23:56 -07:00
|
|
|
"strix/tools/proxy/tools.py" = ["TC002", "PLR0911"]
|
2026-04-25 09:30:23 -07:00
|
|
|
"strix/tools/agents_graph/tools.py" = ["TC002"]
|
|
|
|
|
"strix/agents/factory.py" = ["TC002"]
|
2026-04-25 00:58:32 -07:00
|
|
|
# Entry point: ``Path`` is used at runtime by the typing of the
|
|
|
|
|
# session_manager call; importing under TYPE_CHECKING would defer
|
|
|
|
|
# resolution past where mypy needs it. ``_build_root_task`` legitimately
|
|
|
|
|
# walks every supported target type — splitting it into per-type
|
|
|
|
|
# helpers would add indirection without simplifying anything.
|
2026-04-25 09:30:23 -07:00
|
|
|
"strix/entry.py" = ["TC003", "PLR0912"]
|
2026-04-25 12:05:24 -07:00
|
|
|
# Tracer carries a long event surface and a runtime ``Callable``
|
2026-04-25 09:30:23 -07:00
|
|
|
# annotation on ``vulnerability_found_callback``.
|
|
|
|
|
"strix/telemetry/tracer.py" = ["TC003", "PLR0912", "PLR0915", "E501"]
|
2026-04-25 12:05:24 -07:00
|
|
|
# Interface utility branches per scope-mode / target-type combination;
|
|
|
|
|
# splitting would obscure the decision tree without simplifying it.
|
2026-04-25 09:30:23 -07:00
|
|
|
"strix/interface/utils.py" = ["PLR0912", "BLE001", "PLC0415"]
|
2026-04-25 12:05:24 -07:00
|
|
|
# CLI / TUI / main keep extensive lazy imports + broad exception
|
|
|
|
|
# swallows for resilience around terminal-rendering errors.
|
2026-04-25 09:30:23 -07:00
|
|
|
"strix/interface/cli.py" = ["BLE001", "PLC0415"]
|
|
|
|
|
"strix/interface/tui.py" = ["BLE001", "PLC0415", "PLR0912", "PLR0915", "SIM105"]
|
|
|
|
|
"strix/interface/main.py" = ["BLE001", "PLC0415", "PLR0912", "PLR0915"]
|
|
|
|
|
"strix/interface/streaming_parser.py" = ["PLC0415"]
|
|
|
|
|
"strix/interface/tool_components/agent_message_renderer.py" = ["PLC0415"]
|
2025-08-08 20:36:44 -07:00
|
|
|
|
|
|
|
|
[tool.ruff.lint.isort]
|
|
|
|
|
force-single-line = false
|
|
|
|
|
lines-after-imports = 2
|
|
|
|
|
known-first-party = ["strix"]
|
2026-04-25 14:46:33 -07:00
|
|
|
known-third-party = ["pydantic"]
|
2025-08-08 20:36:44 -07:00
|
|
|
|
|
|
|
|
[tool.ruff.lint.pylint]
|
|
|
|
|
max-args = 8
|
|
|
|
|
|
|
|
|
|
[tool.ruff.format]
|
|
|
|
|
quote-style = "double"
|
|
|
|
|
indent-style = "space"
|
|
|
|
|
skip-magic-trailing-comma = false
|
|
|
|
|
line-ending = "auto"
|
|
|
|
|
|
|
|
|
|
# ============================================================================
|
|
|
|
|
# PyRight Configuration (Alternative type checker)
|
|
|
|
|
# ============================================================================
|
|
|
|
|
|
|
|
|
|
[tool.pyright]
|
|
|
|
|
include = ["strix"]
|
|
|
|
|
exclude = ["**/__pycache__", "build", "dist"]
|
|
|
|
|
pythonVersion = "3.12"
|
|
|
|
|
pythonPlatform = "Linux"
|
|
|
|
|
|
|
|
|
|
typeCheckingMode = "strict"
|
|
|
|
|
reportMissingImports = true
|
|
|
|
|
reportMissingTypeStubs = false
|
|
|
|
|
reportGeneralTypeIssues = true
|
|
|
|
|
reportPropertyTypeMismatch = true
|
|
|
|
|
reportFunctionMemberAccess = true
|
|
|
|
|
reportMissingParameterType = true
|
|
|
|
|
reportMissingTypeArgument = true
|
|
|
|
|
reportIncompatibleMethodOverride = true
|
|
|
|
|
reportIncompatibleVariableOverride = true
|
|
|
|
|
reportInconsistentConstructor = true
|
|
|
|
|
reportOverlappingOverload = true
|
|
|
|
|
reportConstantRedefinition = true
|
|
|
|
|
reportImportCycles = true
|
|
|
|
|
reportUnusedImport = true
|
|
|
|
|
reportUnusedClass = true
|
|
|
|
|
reportUnusedFunction = true
|
|
|
|
|
reportUnusedVariable = true
|
|
|
|
|
reportDuplicateImport = true
|
|
|
|
|
|
|
|
|
|
# ============================================================================
|
|
|
|
|
# Black Configuration (Code Formatter)
|
|
|
|
|
# ============================================================================
|
|
|
|
|
|
|
|
|
|
[tool.black]
|
|
|
|
|
line-length = 100
|
|
|
|
|
target-version = ['py312']
|
|
|
|
|
include = '\\.pyi?$'
|
|
|
|
|
extend-exclude = '''
|
|
|
|
|
/(
|
|
|
|
|
# directories
|
|
|
|
|
\.eggs
|
|
|
|
|
| \.git
|
|
|
|
|
| \.hg
|
|
|
|
|
| \.mypy_cache
|
|
|
|
|
| \.tox
|
|
|
|
|
| \.venv
|
|
|
|
|
| build
|
|
|
|
|
| dist
|
|
|
|
|
)/
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
# ============================================================================
|
|
|
|
|
# isort Configuration (Import Sorting)
|
|
|
|
|
# ============================================================================
|
|
|
|
|
|
|
|
|
|
[tool.isort]
|
|
|
|
|
profile = "black"
|
|
|
|
|
line_length = 100
|
|
|
|
|
multi_line_output = 3
|
|
|
|
|
include_trailing_comma = true
|
|
|
|
|
force_grid_wrap = 0
|
|
|
|
|
use_parentheses = true
|
|
|
|
|
ensure_newline_before_comments = true
|
|
|
|
|
known_first_party = ["strix"]
|
2026-04-25 14:46:33 -07:00
|
|
|
known_third_party = ["pydantic", "litellm"]
|
2025-08-08 20:36:44 -07:00
|
|
|
|
|
|
|
|
# ============================================================================
|
|
|
|
|
# Bandit Configuration (Security Linting)
|
|
|
|
|
# ============================================================================
|
|
|
|
|
|
|
|
|
|
[tool.bandit]
|
2026-04-25 13:01:20 -07:00
|
|
|
exclude_dirs = ["docs", "build", "dist"]
|
2025-08-08 20:36:44 -07:00
|
|
|
skips = ["B101", "B601", "B404", "B603", "B607"] # Skip assert, shell injection, subprocess import and partial path checks
|
|
|
|
|
severity = "medium"
|