Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
111 commits
Select commit Hold shift + click to select a range
0d10970
Add run_initializers_async, Entra auth, and config-file support
romanlutz Feb 28, 2026
a9993ab
Expand memory interface and models for attack results
romanlutz Feb 28, 2026
792dc8c
Merge branch 'romanlutz/memory-models-expansion' into romanlutz/backe…
romanlutz Feb 28, 2026
3cfc605
Add attack-centric backend API with conversations and streaming
romanlutz Feb 28, 2026
65a4182
Frontend attack view with conversations, history, labels, and config
romanlutz Feb 28, 2026
f6db5bf
Merge remote-tracking branch 'origin/main' into romanlutz/frontend_at…
romanlutz Mar 2, 2026
0aff59d
fix: auto-fixed ruff format issues
romanlutz Mar 2, 2026
c27f2be
fix: address ruff and mypy lint issues
romanlutz Mar 2, 2026
c16196d
fix: remove unused type: ignore comments, ruff format
romanlutz Mar 2, 2026
c08b76f
Merge remote-tracking branch 'origin/main' into romanlutz/backend-att…
romanlutz Mar 2, 2026
0a4280d
fix: auto ruff format fixes
romanlutz Mar 2, 2026
96d5839
fix: address ruff and mypy lint issues
romanlutz Mar 2, 2026
14fb53f
fix: ruff format
romanlutz Mar 2, 2026
ad31d5b
fix: resolve merge conflicts, align service->memory naming
romanlutz Mar 3, 2026
f8950ff
fix: E731 lambda, E501 line length, service->memory naming
romanlutz Mar 3, 2026
4e4c247
Merge remote-tracking branch 'origin/main' into romanlutz/frontend_at…
romanlutz Mar 3, 2026
84f2c9d
Merge remote-tracking branch 'origin/main' into romanlutz/backend-att…
romanlutz Mar 3, 2026
14168cc
Merge remote-tracking branch 'origin/main' into romanlutz/frontend_at…
romanlutz Mar 3, 2026
4440cfd
Merge remote-tracking branch 'origin/main' into romanlutz/backend-att…
romanlutz Mar 3, 2026
484fcb9
fix: address copilot comments - imports, API contract, security, acce…
romanlutz Mar 3, 2026
b48e23f
fix: address copilot comments - security, cleanup, API contract
romanlutz Mar 3, 2026
8c8d4aa
Merge remote-tracking branch 'origin/main' into romanlutz/frontend_at…
romanlutz Mar 3, 2026
6bd4737
Merge remote-tracking branch 'origin/main' into romanlutz/backend-att…
romanlutz Mar 3, 2026
fe500fc
Fix mypy: pass datetime directly instead of isoformat string
romanlutz Mar 3, 2026
2e5d4c3
Merge remote-tracking branch 'origin/main' into romanlutz/backend-att…
romanlutz Mar 4, 2026
7770b52
Merge remote-tracking branch 'romanlutz/romanlutz/backend-attack-api'…
romanlutz Mar 4, 2026
421d4a9
Use TargetCapabilities for supports_multi_turn in backend API
romanlutz Mar 4, 2026
2949d05
Revert run_initializers_async extraction, use double initialize_pyrit…
romanlutz Mar 4, 2026
8324f50
Address PR review comments: quick fixes
romanlutz Mar 4, 2026
b3670dc
Move video remix injection logic from AttackService to OpenAIVideoTarget
romanlutz Mar 4, 2026
dd8d719
Address remaining review comments: UTC datetimes, persist guard, docs
romanlutz Mar 5, 2026
8bcbda8
Fix change_main_conversation to move old main to PRUNED not ADVERSARIAL
romanlutz Mar 5, 2026
2e15aef
Validate target_conversation_id belongs to attack in add_message_async
romanlutz Mar 5, 2026
f2c40c3
Persist updated_at in change_main_conversation_async
romanlutz Mar 5, 2026
7155dd0
Add comment explaining HTTPS-only check for Azure Blob URLs
romanlutz Mar 5, 2026
2c646a0
Add score_type and score_category to Score DTO, support true_false sc…
romanlutz Mar 5, 2026
838c34d
Replace 'stamp on' wording with 'attach to' for labels
romanlutz Mar 5, 2026
635ac23
Clarify converter_types filter description: omit = no restriction
romanlutz Mar 5, 2026
05cc65a
Clarify pagination cursor description in list_attacks route
romanlutz Mar 5, 2026
c5e25d9
Add explicit parens for attack_specific_params ternary clarity
romanlutz Mar 5, 2026
5adeb07
Validate source_conversation_id in create_related_conversation_async
romanlutz Mar 5, 2026
f373cb8
Rename _persist_base64_pieces to _persist_base64_pieces_async
romanlutz Mar 5, 2026
d17f407
Only query lineage when original_prompt_id differs from piece id
romanlutz Mar 5, 2026
2c5ddab
Fix SAS cache TTL to derive from token expiry instead of fixed value
romanlutz Mar 5, 2026
89481b4
Rename _send_and_store_message and _store_message_only with _async su…
romanlutz Mar 5, 2026
8aecad6
Redesign video remix: prompt_metadata DTO, validate_video_remix_piece…
romanlutz Mar 5, 2026
168e552
Add --config-file to pyrit_backend, use FrontendCore for initialization
romanlutz Mar 5, 2026
7c665e3
Strip data URI prefix in _persist_base64_pieces_async
romanlutz Mar 5, 2026
cb668c9
Serve media via URL instead of inline base64 encoding
romanlutz Mar 5, 2026
1a7a796
Re-export PrependedMessageRequest from backend models __init__
romanlutz Mar 5, 2026
d7430b0
Consolidate backend models __init__ exports
romanlutz Mar 5, 2026
edd567f
Fix outdated Phase 2 comment in list_attacks_async
romanlutz Mar 5, 2026
c41d033
Enforce video_id presence on video_path pieces in remix validation
romanlutz Mar 5, 2026
656b642
Deduplicate conversation IDs before querying stats
romanlutz Mar 5, 2026
0770510
Merge remote-tracking branch 'origin/main' into romanlutz/backend-att…
romanlutz Mar 5, 2026
2b92eed
Remove dead code and improve test coverage to 99%
romanlutz Mar 5, 2026
893ed06
Fix test_init_with_defaults: assert None when no config file exists
romanlutz Mar 5, 2026
c47b360
Merge romanlutz/backend-attack-api into romanlutz/frontend_attack_view
romanlutz Mar 5, 2026
cf65c3a
Update frontend types and tests for backend API changes
romanlutz Mar 5, 2026
7dcef74
Merge remote-tracking branch 'romanlutz/romanlutz/frontend_attack_vie…
romanlutz Mar 5, 2026
1513745
Merge remote-tracking branch 'origin/main' into romanlutz/backend-att…
romanlutz Mar 6, 2026
3c7d56f
fix: address PR review comments from hannahwestra25 and copilot
romanlutz Mar 6, 2026
f3617f2
fix: add type ignore for ContainerSasPermissions across mypy versions
romanlutz Mar 6, 2026
4744fb2
Merge remote-tracking branch 'romanlutz/romanlutz/backend-attack-api'…
romanlutz Mar 6, 2026
ab10716
fix: mock DEFAULT_CONFIG_PATH in test_init_with_defaults for CI
romanlutz Mar 6, 2026
b48a084
feat: add centralized ApiError type and toApiError() helper
romanlutz Mar 6, 2026
70c6e2c
feat: add Axios interceptors for request-ID and error logging
romanlutz Mar 6, 2026
e78e551
feat: add X-Request-ID middleware for frontend-backend log correlation
romanlutz Mar 6, 2026
4614a87
feat: add useConnectionHealth hook + ConnectionHealthProvider
romanlutz Mar 6, 2026
33dc890
feat: add ConnectionBanner for global connection status display
romanlutz Mar 6, 2026
4330229
feat: add ErrorBoundary with try-again and reload fallback
romanlutz Mar 6, 2026
214930e
feat: add error state + retry to AttackHistory
romanlutz Mar 6, 2026
de62e7d
feat: add error state + retry to ConversationPanel
romanlutz Mar 6, 2026
612fde8
feat: refactor ChatWindow to use toApiError + preserve failed text
romanlutz Mar 6, 2026
e222f78
refactor: use toApiError() in TargetConfig for consistent error messages
romanlutz Mar 6, 2026
c4afd65
fix: restrict media endpoint to allowed subdirectories and block sens…
romanlutz Mar 6, 2026
fb22c3a
feat: add onError fallback for video/audio media elements
romanlutz Mar 6, 2026
0f6548b
feat: wire ErrorBoundary, ConnectionHealthProvider, ConnectionBanner …
romanlutz Mar 6, 2026
658199b
docs: document health endpoint contract for frontend polling
romanlutz Mar 6, 2026
4bd4e5a
Merge remote-tracking branch 'romanlutz/romanlutz/backend-attack-api'…
romanlutz Mar 6, 2026
696fba2
test: improve coverage and simplify ConnectionBanner
romanlutz Mar 6, 2026
b3556c4
fix: address hannahwestra25 review comments (round 2)
romanlutz Mar 7, 2026
f4a83c8
refactor: generate attack_result_id in AttackResult constructor
romanlutz Mar 7, 2026
2532c26
fix: rename label key operator_name -> operator for consistency
romanlutz Mar 7, 2026
74b7be2
refactor: standardize label keys to 'operator' and 'operation'
romanlutz Mar 7, 2026
05502d1
fix: address ValbuenaVC review comments
romanlutz Mar 7, 2026
0c78518
Merge remote-tracking branch 'origin/main' into romanlutz/backend-att…
romanlutz Mar 7, 2026
16d6d5c
docs: use consistent label examples across notebooks
romanlutz Mar 9, 2026
6b7949e
Merge remote-tracking branch 'origin/main' into romanlutz/frontend_at…
romanlutz Mar 9, 2026
5bf2853
Merge remote-tracking branch 'romanlutz/romanlutz/backend-attack-api'…
romanlutz Mar 9, 2026
84d6808
fix: address PR review comments (2-6)
romanlutz Mar 9, 2026
36ab1c2
fix: address older PR review comments (D, E)
romanlutz Mar 9, 2026
578ef67
fix: align api.test.ts mocks with backend contract
romanlutz Mar 9, 2026
6ddea53
Merge remote-tracking branch 'origin/main' into romanlutz/frontend_at…
romanlutz Mar 9, 2026
e31e583
feat: support operator/operation labels from config file
romanlutz Mar 9, 2026
a7e9c22
fix: detect actual Vite port in dev.py status message
romanlutz Mar 10, 2026
acee8b9
fix: wait for backend health before declaring servers running
romanlutz Mar 10, 2026
44f1bb5
fix: pipe backend output so status banner appears after init
romanlutz Mar 10, 2026
b799195
fix: kill stale processes on ports 8000/3000 during stop
romanlutz Mar 10, 2026
a2cecd9
fix: --database default no longer overrides config file
romanlutz Mar 10, 2026
be5c9cc
feat: add E2E error scenario tests
romanlutz Mar 10, 2026
7fc3269
Merge remote-tracking branch 'origin/main' into romanlutz/frontend_at…
romanlutz Mar 10, 2026
ba3e0f7
feat: persist history view filters across navigation with reset button
romanlutz Mar 10, 2026
2aeb18f
fix: resolve all frontend lint errors and warnings
romanlutz Mar 10, 2026
7062730
fix: show all target params (e.g. reasoning_effort) in target config …
romanlutz Mar 10, 2026
f017454
test: add comprehensive tests for target_specific_params display
romanlutz Mar 10, 2026
0c55662
fix: auto-open conversations panel on branch/copy actions
romanlutz Mar 10, 2026
c5ae445
fix: prevent continuing conversation after switching targets
romanlutz Mar 10, 2026
50d8713
fix: auto-resolve video_id metadata for video remix in GUI
romanlutz Mar 10, 2026
07ef599
feat: propagate video metadata through frontend for seamless remix
romanlutz Mar 10, 2026
2a484df
fix: preserve video_path pieces in request so they appear in chat UI
romanlutz Mar 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion .devcontainer/devcontainer_setup.sh
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ if [ -f "package.json" ]; then
npm install

# Install Playwright browsers and system dependencies for E2E testing
# This may fail if apt repos have signature issues - don't block setup
echo "📦 Installing Playwright browsers..."

# Remove third-party repos with SHA1 signature issues (rejected since 2026-02-01)
Expand All @@ -78,7 +79,11 @@ if [ -f "package.json" ]; then
/etc/apt/sources.list.d/nodesource.list \
/etc/apt/sources.list.d/microsoft.list 2>/dev/null || true

npx playwright install --with-deps chromium
if npx playwright install --with-deps chromium; then
echo "✅ Playwright browsers installed."
else
echo "⚠️ Playwright installation failed (apt signature issues). Run 'npx playwright install chromium' manually if needed for E2E tests."
fi

echo "✅ Frontend dependencies installed."
fi
Expand Down
5 changes: 5 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -1 +1,6 @@
* text=auto eol=lf
# Squad: union merge for append-only team state files
.squad/decisions.md merge=union
.squad/agents/*/history.md merge=union
.squad/log/** merge=union
.squad/orchestration-log/** merge=union
4 changes: 2 additions & 2 deletions .github/workflows/frontend_tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -106,8 +106,8 @@ jobs:
- name: Install Playwright browsers
run: npx playwright install --with-deps chromium

- name: Run E2E tests
run: npm run test:e2e
- name: Run E2E tests (seeded mode)
run: npm run test:e2e:seeded
env:
CI: true

Expand Down
21 changes: 21 additions & 0 deletions frontend/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,27 @@ npm run test:e2e:headed # Run with visible browser windows (requires display)
npm run test:e2e:ui # Interactive UI mode (requires display)
```

### E2E Test Modes

E2E flow tests run in two modes controlled by Playwright projects and an environment variable:

- **Seeded** (`--project seeded`, default for CI): Messages are stored directly in the database with `send: false` using dummy credentials. No real API keys needed. Tests cover the full UI flow (display, branching, conversation switching, promoting) without calling any external service.

- **Live** (`--project live`, requires `E2E_LIVE_MODE=true`): Messages are sent to real OpenAI endpoints with `send: true`. Each target variant requires its own set of environment variables (e.g., `OPENAI_CHAT_ENDPOINT`, `OPENAI_CHAT_KEY`, `OPENAI_CHAT_MODEL`). Variants whose env vars are missing are automatically skipped. Tests verify that real target responses render correctly.

```bash
# CI (seeded only — no credentials needed)
npx playwright test --project seeded

# Live integration (requires real API keys)
E2E_LIVE_MODE=true npx playwright test --project live

# Run both
E2E_LIVE_MODE=true npx playwright test
```

The seeded project runs in the **GitHub Actions** workflow. The live project is intended for an **Azure DevOps pipeline** that has the required secret API keys.

E2E tests use `dev.py` to automatically start both frontend and backend servers. If servers are already running, they will be reused.

> **Note**: `test:e2e:ui` and `test:e2e:headed` require a graphical display and won't work in headless environments like devcontainers. Use `npm run test:e2e` for CI/headless testing.
Expand Down
Loading
Loading