Move the Vite frontend source into strix/viewer/frontend and rename the
built bundle to strix/viewer/static, so all the viewer's pieces live under
one directory. Updated the server bundle path, vite outDir, packaging
(pyproject exclude, PyInstaller spec), Makefile, gitignore, and docs to
match. Avoided naming the bundle dir 'dist' since gitignore matches that
unanchored and would drop the shipped bundle.
`strix view` opens a run in the browser, served locally from the run files
(nothing is uploaded). There's also a quick link to it from the TUI and the
end-of-run summary.
The SDK ships its own tracing pipeline (``agents.tracing``) plus
``SQLiteSession`` for native conversation persistence. Strix's custom
OTEL bootstrap + Traceloop integration was dead weight — the SDK does
not bridge to OpenTelemetry, so all of our adapter code was solving a
problem we didn't actually need solved.
Telemetry purge:
- Drop the ``traceloop-sdk`` and
``opentelemetry-exporter-otlp-proto-http`` runtime deps. ``uv sync``
uninstalls ~30 transitive packages (the OTEL family,
``traceloop-sdk``, ``protobuf``, ``opentelemetry-exporter-otlp-*``,
``deprecated``, ``wrapt``, ``backoff``, etc.) — about 1000 lines off
``uv.lock``.
- Delete ``bootstrap_otel`` and ``JsonlSpanExporter`` from
``telemetry/utils.py``; strip the OTEL pruning helpers,
``parse_traceloop_headers``, ``default_resource_attributes``,
``format_trace_id`` / ``format_span_id`` / ``iso_from_unix_ns``.
Keep only the sanitizer + JSONL writer + write-lock registry.
- Strip ``Tracer._setup_telemetry``, ``_otel_tracer``,
``_remote_export_enabled``, ``_active_events_file_path``,
``_active_run_metadata``, ``_get_events_write_lock``,
``_set_association_properties``. ``_emit_event`` now generates
trace/span ids from ``uuid4`` directly.
- Drop the ``traceloop_base_url`` / ``traceloop_api_key`` /
``traceloop_headers`` / ``strix_otel_telemetry`` config knobs.
- Rename ``is_otel_enabled`` → ``is_telemetry_enabled`` (the gate now
controls JSONL emission only).
Native session resume:
- ``entry.py`` now constructs an ``agents.memory.SQLiteSession`` keyed
by ``scan_id`` and persists conversation history at
``strix_runs/<scan_id>/session.db``. A second call to
``run_strix_scan`` with the same ``scan_id`` resumes from where the
prior run left off — no manual state plumbing needed.
Tracer.agents fix (TUI agent tree was silently empty):
- ``StrixOrchestrationHooks.on_agent_start`` now mirrors bus state
into ``tracer.agents`` (id / name / parent_id / status), and
``on_agent_end`` flips the entry to ``completed`` / ``crashed``.
The TUI now actually shows the agent tree during scans.
Tooling:
- Drop ``pylint`` from dev deps; ``ruff`` covers everything we used
it for. Strip the ``make lint`` pylint step.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The test suite was carrying migration scars and a long tail of
low-density assertions over SDK-derived behavior. Drop it wholesale.
- Delete ``tests/`` (42 files, ~4900 LoC).
- Drop ``pytest`` / ``pytest-asyncio`` / ``pytest-cov`` /
``pytest-mock`` from the dev dependency group; ``uv sync``
uninstalls the matching wheels.
- Strip the pytest + coverage config blocks, the
``flake8-pytest-style`` ruff selector, the ``tests/**`` per-file
ignores, the ``[tool.mypy.overrides] tests.*`` block, and the
``"tests"`` entry from bandit's ``exclude_dirs``.
- Drop the ``test`` / ``test-cov`` Makefile targets; ``dev`` no
longer depends on tests.
- Strip the ``# Testing`` block from ``.gitignore`` (``.coverage``,
``.pytest_cache/``, ``htmlcov/``, ``coverage.xml``, ``nosetests.xml``,
``.tox/``, ``.hypothesis/``).
ruff (27) and mypy (82) baselines unchanged.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>