Skip to content

feat(web): Rogue web UI - #175

Open
drorIvry wants to merge 18 commits into
mainfrom
feature/web-ui
Open

feat(web): Rogue web UI#175
drorIvry wants to merge 18 commits into
mainfrom
feature/web-ui

Conversation

@drorIvry

@drorIvry drorIvry commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Summary

  • New React web UI (packages/web): Vite + TanStack Router/Query, shadcn/radix components, served alongside the Rogue server
  • Red-team configure flow, scenario runs over websocket, reporting integration
  • CI/build fixes: route-tree generation before tsc, prettier/pnpm-lock ignore, conditional web/dist force-include, ruff/ty cleanups
  • Fix: don't send the reporting URL (app.rogue.security) as the attack-generation base URL — the attack-gen endpoint lives on the Deckard API host and 307s otherwise

Test plan

  • uv run python -m rogue server + pnpm dev in packages/web, exercise red-team configure/run flows
  • CI: web-codestyle, ruff, ty, tests green on branch

drorIvry and others added 17 commits April 28, 2026 20:05
# Conflicts:
#	rogue/server/websocket/manager.py
CI installs (test, codestyle, rogue, import-time workflows) ran
`uv pip install -e .` without first building the web SPA, which caused
hatchling to abort with `FileNotFoundError: Forced include not found:
packages/web/dist`. The static `[tool.hatch.build.targets.*.force-include]`
tables ran independently of the build hook's pnpm-missing fallback, so the
graceful warning never had a chance to take effect.

Move the force-include into `hatch_build.py` so it's only set when the dist
actually exists. The Build workflow still gets the bundled UI (it runs the
web build first); the lighter workflows install successfully without pnpm.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
After the build-hook fix unblocked the install step, three real failures
surfaced on the PR:

- ruff format: examples/tshirt_store_agent/test_client.py used double-quoted
  f-string with double-quoted inner string; reformat to inner single-quotes.
- ruff lint:
  - I001 in two examples/tshirt_store_langgraph_agent/* files (auto-fixed
    import order).
  - S104 in rogue/__main__.py: bandit-style `# nosec B104` is invisible to
    ruff; switch to ruff-native `# noqa: S104`.
- pytest: test_deckard_service.test_payload_includes_conversations_array
  expected `metadata == {"expected_outcome": ...}` but the deckard payload
  now also carries `attempt_index` / `attempts_total` (added so the platform
  can render "attempt N of M"). Update the assertion to match the current
  payload shape.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Lockfile is generated by pnpm and should never be reformatted; CI's
`prettier --check .` was flagging it, breaking the Web codestyle job.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
`packages/web/src/routeTree.gen.ts` is produced by `tsr generate` and is
gitignored, so a fresh CI checkout doesn't have it. The codestyle action
ran `tsc --noEmit` directly, which fails to resolve `./routeTree.gen` and
collapses every `createFileRoute(...)` into a `(arg: undefined)` signature
— hence the avalanche of TS2345 errors on the route files.

The web-build action sidesteps this because `pnpm build` is `pnpm routes
&& tsc --noEmit && vite build`. Use `pnpm typecheck` (which is
`pnpm routes && tsc --noEmit`) here for the same effect, matching what a
developer would run locally.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The rogue_security_base_url field holds the reporting host
(app.rogue.security), but attack generation runs against the Deckard
API host. Sending the reporting URL caused a 307 on the attack-gen
endpoint, so omit it and let the server use its default.
@drorIvry
drorIvry requested a review from yuval-qf as a code owner August 3, 2026 13:51
@coderabbitai

coderabbitai Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Important

Review skipped

Too many files!

This PR contains 189 files, which is 39 over the limit of 150.

To get a review, reduce the PR to 150 files or fewer by splitting it into smaller PRs or changing its base branch.

Upgrade to Pro+ to raise the limit.

This review couldn't start because sufficient usage credits or metered capacity aren't available. Add credits or update usage-based reviews in the billing tab, then retry.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 293bc603-4c6f-4e43-a5a6-3a2ab693586a

📥 Commits

Reviewing files that changed from the base of the PR and between e1c5b56 and 68a14d7.

⛔ Files ignored due to path filters (20)
  • packages/web/pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
  • packages/web/public/assets/empty-state/alerts-dark.svg is excluded by !**/*.svg
  • packages/web/public/assets/empty-state/alerts-light.svg is excluded by !**/*.svg
  • packages/web/public/assets/empty-state/api-keys-dark.svg is excluded by !**/*.svg
  • packages/web/public/assets/empty-state/api-keys-light.svg is excluded by !**/*.svg
  • packages/web/public/assets/empty-state/exposures-dark.svg is excluded by !**/*.svg
  • packages/web/public/assets/empty-state/exposures-light.svg is excluded by !**/*.svg
  • packages/web/public/assets/empty-state/integrations-dark.svg is excluded by !**/*.svg
  • packages/web/public/assets/empty-state/integrations-light.svg is excluded by !**/*.svg
  • packages/web/public/assets/empty-state/inventory-dark.svg is excluded by !**/*.svg
  • packages/web/public/assets/empty-state/inventory-light.svg is excluded by !**/*.svg
  • packages/web/public/assets/empty-state/logs-dark.svg is excluded by !**/*.svg
  • packages/web/public/assets/empty-state/logs-light.svg is excluded by !**/*.svg
  • packages/web/public/assets/empty-state/red-team-dark.svg is excluded by !**/*.svg
  • packages/web/public/assets/empty-state/red-team-light.svg is excluded by !**/*.svg
  • packages/web/public/assets/empty-state/risks-dark.svg is excluded by !**/*.svg
  • packages/web/public/assets/empty-state/risks-light.svg is excluded by !**/*.svg
  • packages/web/public/assets/rogue_logo.svg is excluded by !**/*.svg
  • packages/web/public/assets/wolf-favicon.svg is excluded by !**/*.svg
  • uv.lock is excluded by !**/*.lock
📒 Files selected for processing (189)
  • .bandit.yaml
  • .github/actions/codestyle/action.yml
  • .github/actions/web-build/action.yml
  • .github/actions/web-codestyle/action.yml
  • .github/pull_request_template.md
  • .github/workflows/build.yml
  • .github/workflows/pr.yml
  • .github/workflows/release.yml
  • .gitignore
  • .mypy.ini
  • examples/mcp/tshirt_store_langgraph_mcp/__main__.py
  • examples/tshirt_store_agent/test_client.py
  • examples/tshirt_store_langgraph_agent/__init__.py
  • examples/tshirt_store_langgraph_agent/shirtify_langgraph_agent.py
  • hatch_build.py
  • lefthook.yaml
  • packages/tui/internal/screens/scenarios/edit.go
  • packages/tui/internal/screens/scenarios/editor.go
  • packages/tui/internal/screens/scenarios/list.go
  • packages/tui/internal/screens/scenarios/scenario_types.go
  • packages/web/.npmrc
  • packages/web/.prettierignore
  • packages/web/.prettierrc
  • packages/web/components.json
  • packages/web/eslint.config.js
  • packages/web/index.html
  • packages/web/package.json
  • packages/web/src/api/client.ts
  • packages/web/src/api/config-sync.ts
  • packages/web/src/api/queries.ts
  • packages/web/src/api/types.ts
  • packages/web/src/api/ws.ts
  • packages/web/src/components/app-sidebar.tsx
  • packages/web/src/components/business-context-card.tsx
  • packages/web/src/components/confirm-dialog.tsx
  • packages/web/src/components/empty-state.tsx
  • packages/web/src/components/live-conversation.tsx
  • packages/web/src/components/model-picker/catalog.ts
  • packages/web/src/components/model-picker/dialog.tsx
  • packages/web/src/components/nav-main.tsx
  • packages/web/src/components/nav-secondary.tsx
  • packages/web/src/components/nav-user.tsx
  • packages/web/src/components/red-team/catalog-pane.tsx
  • packages/web/src/components/red-team/frameworks-dialog.tsx
  • packages/web/src/components/rogue-logo.tsx
  • packages/web/src/components/rogue-security-suggestion.tsx
  • packages/web/src/components/settings/settings-nav.tsx
  • packages/web/src/components/site-header.tsx
  • packages/web/src/components/target-agent-form.tsx
  • packages/web/src/components/theme-provider.tsx
  • packages/web/src/components/theme-toggle.tsx
  • packages/web/src/components/ui/badge.tsx
  • packages/web/src/components/ui/button.tsx
  • packages/web/src/components/ui/card.tsx
  • packages/web/src/components/ui/collapsible.tsx
  • packages/web/src/components/ui/dialog.tsx
  • packages/web/src/components/ui/dropdown-menu.tsx
  • packages/web/src/components/ui/input.tsx
  • packages/web/src/components/ui/label.tsx
  • packages/web/src/components/ui/scroll-area.tsx
  • packages/web/src/components/ui/select.tsx
  • packages/web/src/components/ui/separator.tsx
  • packages/web/src/components/ui/sheet.tsx
  • packages/web/src/components/ui/sidebar.tsx
  • packages/web/src/components/ui/sonner.tsx
  • packages/web/src/components/ui/switch.tsx
  • packages/web/src/components/ui/tabs.tsx
  • packages/web/src/components/ui/textarea.tsx
  • packages/web/src/components/ui/tooltip.tsx
  • packages/web/src/hooks/use-mobile.ts
  • packages/web/src/lib/models-dev.ts
  • packages/web/src/lib/protocols.ts
  • packages/web/src/lib/red-team-catalog.ts
  • packages/web/src/lib/utils.ts
  • packages/web/src/main.tsx
  • packages/web/src/routes/__root.tsx
  • packages/web/src/routes/evaluations/$jobId.index.tsx
  • packages/web/src/routes/evaluations/$jobId.report.tsx
  • packages/web/src/routes/evaluations/$jobId.tsx
  • packages/web/src/routes/evaluations/index.tsx
  • packages/web/src/routes/evaluations/new.tsx
  • packages/web/src/routes/help.tsx
  • packages/web/src/routes/index.tsx
  • packages/web/src/routes/red-team/$jobId.index.tsx
  • packages/web/src/routes/red-team/$jobId.report.tsx
  • packages/web/src/routes/red-team/$jobId.tsx
  • packages/web/src/routes/red-team/configure.tsx
  • packages/web/src/routes/red-team/index.tsx
  • packages/web/src/routes/red-team/new.tsx
  • packages/web/src/routes/scenarios/index.tsx
  • packages/web/src/routes/scenarios/interview.tsx
  • packages/web/src/routes/settings.tsx
  • packages/web/src/routes/settings/api-keys.tsx
  • packages/web/src/routes/settings/backup.tsx
  • packages/web/src/routes/settings/general.tsx
  • packages/web/src/routes/settings/index.tsx
  • packages/web/src/routes/settings/models.tsx
  • packages/web/src/routes/settings/rogue-security.tsx
  • packages/web/src/stores/config.ts
  • packages/web/src/stores/red-team.ts
  • packages/web/src/stores/scenarios.ts
  • packages/web/src/styles/globals.css
  • packages/web/tsconfig.json
  • packages/web/vite.config.ts
  • pyproject.toml
  • rogue/__init__.py
  • rogue/__main__.py
  • rogue/common/generic_agent_executor.py
  • rogue/common/generic_task_callback.py
  • rogue/common/litellm_config.py
  • rogue/common/logging/config.py
  • rogue/common/logging/intercept_handler.py
  • rogue/common/logging/safe_format.py
  • rogue/common/remote_agent_connection.py
  • rogue/common/tui_installer.py
  • rogue/common/update_checker.py
  • rogue/common/version.py
  • rogue/common/workdir_utils.py
  • rogue/evaluator_agent/a2a/a2a_evaluator_agent.py
  • rogue/evaluator_agent/base_evaluator_agent.py
  • rogue/evaluator_agent/mcp/mcp_evaluator_agent.py
  • rogue/evaluator_agent/mcp_utils.py
  • rogue/evaluator_agent/multi_turn/driver.py
  • rogue/evaluator_agent/multi_turn/goal_checker.py
  • rogue/evaluator_agent/multi_turn/run_multi_turn.py
  • rogue/evaluator_agent/openai_api/openai_api_evaluator_agent.py
  • rogue/evaluator_agent/policy_evaluation.py
  • rogue/evaluator_agent/python/python_evaluator_agent.py
  • rogue/evaluator_agent/red_team/a2a_red_team_attacker_agent.py
  • rogue/evaluator_agent/red_team/base_red_team_attacker_agent.py
  • rogue/evaluator_agent/red_team/factory.py
  • rogue/evaluator_agent/red_team/mcp_red_team_attacker_agent.py
  • rogue/evaluator_agent/red_team/openai_api_red_team_attacker_agent.py
  • rogue/evaluator_agent/red_team/python_red_team_attacker_agent.py
  • rogue/evaluator_agent/run_evaluator_agent.py
  • rogue/models/cli_input.py
  • rogue/models/prompt_injection.py
  • rogue/prompt_injection_evaluator/run_prompt_injection_evaluator.py
  • rogue/run_cli.py
  • rogue/run_server.py
  • rogue/run_tui.py
  • rogue/run_web.py
  • rogue/server/api/config.py
  • rogue/server/api/evaluation.py
  • rogue/server/api/fs.py
  • rogue/server/api/interview.py
  • rogue/server/api/llm.py
  • rogue/server/api/red_team.py
  • rogue/server/core/red_team_orchestrator.py
  • rogue/server/main.py
  • rogue/server/models/api_format.py
  • rogue/server/red_teaming/attacks/single_turn/context_poisoning.py
  • rogue/server/red_teaming/attacks/single_turn/goal_redirection.py
  • rogue/server/red_teaming/attacks/single_turn/gray_box.py
  • rogue/server/red_teaming/attacks/single_turn/input_bypass.py
  • rogue/server/red_teaming/attacks/single_turn/permission_escalation.py
  • rogue/server/red_teaming/catalog/vulnerabilities.py
  • rogue/server/red_teaming/models.py
  • rogue/server/red_teaming/orchestrator.py
  • rogue/server/red_teaming/report/generator.py
  • rogue/server/red_teaming/report/key_findings.py
  • rogue/server/red_teaming/report/tui_formatter.py
  • rogue/server/red_teaming/utils/dataset_loader.py
  • rogue/server/red_teaming/vulnerabilities/access_control.py
  • rogue/server/red_teaming/vulnerabilities/base_vulnerability.py
  • rogue/server/red_teaming/vulnerabilities/competitors.py
  • rogue/server/red_teaming/vulnerabilities/content_safety.py
  • rogue/server/red_teaming/vulnerabilities/intellectual_property.py
  • rogue/server/red_teaming/vulnerabilities/pii_leakage.py
  • rogue/server/red_teaming/vulnerabilities/technical_vulnerabilities.py
  • rogue/server/red_teaming/vulnerabilities/unbounded_consumption.py
  • rogue/server/services/deckard_service.py
  • rogue/server/services/evaluation_library.py
  • rogue/server/services/evaluation_service.py
  • rogue/server/services/job_store.py
  • rogue/server/services/llm_service.py
  • rogue/server/services/red_team_service.py
  • rogue/server/services/scenario_evaluation_service.py
  • rogue/server/websocket/manager.py
  • rogue/tests/models/test_cli_input.py
  • rogue/tests/models/test_evaluation_result.py
  • rogue/tests/test_deckard_service.py
  • rogue/tests/test_multi_turn.py
  • rogue/tests/test_python_evaluator_kwargs.py
  • rogue/tests/test_run_cli.py
  • sdks/python/rogue_sdk/client.py
  • sdks/python/rogue_sdk/tests/test_types.py
  • sdks/python/rogue_sdk/types.py
  • sdks/python/rogue_sdk/websocket.py

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.


Comment @coderabbitai help to get the list of available commands.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants