* Stop initializing Git repositories for OpenCode sessions
* Isolate optional AI failures behind a lazy plugin adapter
* Keep explicit plugin enable flags boolean after config resolution
* Use Django login redirect encoding at the optional agent boundary
* Cover cold-start failures and real browser storage isolation
* Verify persisted dismissal and native storage denial variants
* Keep headless browser interaction independent of display timing
* Install optional OpenCode clients through the plugin extra
* Authenticate and route optional OpenCode WebSockets with real browser coverage
* Apply control-plane policy and proxy authentication to agent sockets
* Require immediate delivery of the first real OpenCode event
* Exercise browser same-origin headers in event regression
* Exercise OpenCode terminal tickets in proxy and browser regressions
* Preserve primary terminal failure while verifying cleanup
Supersedes #1818.
This keeps yt-dlp-specific player rendering out of ArchiveBox core. Core
now:
- exposes media type metadata to plugin card templates: `is_video`,
`is_audio`, `is_browser_playable`
- sorts yt-dlp media with browser-playable video/audio first
- prefers browser-playable yt-dlp outputs before thumbnails and
non-browser containers when choosing the primary card output
- avoids pinning resumed snapshots to stale selected hook maps, fixing a
pause/resume runner regression surfaced by CI
- makes `update --index-only` discover the configured search backend
even when `PLUGINS` is restricted for test/runtime isolation
- stabilizes CI-only recursive/takeover/public-UI tests that were
failing due external/heavy plugin coverage, hard-kill recovery races,
and transient full-server `/add/` startup responses
The actual click-to-load player UI lives in the companion plugin PR:
ArchiveBox/abx-plugins#34.
Verification:
```text
pytest archivebox/tests/test_ui_admin_snapshot.py -q
48 passed
pytest archivebox/tests/test_cli_update_reindex_snapshots.py -q
9 passed
pytest -xvs archivebox/tests/test_api_v1_crawls_crawl_crawl_id.py --basetemp=tests/out --ignore=archivebox/pkgs
7 passed
pytest -xvs archivebox/tests/test_takeover_util.py --basetemp=tests/out --ignore=archivebox/pkgs
19 passed
pytest -xvs archivebox/tests/test_takeover_util.py::test_live_add_update_jobs_survive_server_and_cli_owner_exits --basetemp=tests/out --ignore=archivebox/pkgs
1 passed
pytest -xvs archivebox/tests/test_ui_public_snapshot.py --basetemp=tests/out --ignore=archivebox/pkgs
6 passed
pytest -q archivebox/tests/test_recursive_crawl.py::test_recursive_crawl_depth_two_all_plugins_runs_snapshots_in_parallel --basetemp=tests/out --ignore=archivebox/pkgs
1 passed
```