spora-ai / spora-plugin-media-archive
Admin UI for browsing, filtering, and downloading media archived by Spora agents.
Package info
github.com/spora-ai/spora-plugin-media-archive
Type:spora-plugin
pkg:composer/spora-ai/spora-plugin-media-archive
Requires
- php: ^8.4.1
- spora-ai/spora-core: >=0.23.0 <2.0.0
- spora-ai/spora-plugin-media-archive-frontend: >=0.1.0 <2.0.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.94
- mockery/mockery: ^1.6
- pestphp/pest: ^4.0
- phpstan/phpstan: ^2.1
- phpstan/phpstan-mockery: ^2.0
Suggests
- spora-ai/spora-plugin-email: Email send/receive with attachment handling — outbound attachments surface as archived documents.
- spora-ai/spora-plugin-minimax: Image, speech, music, and video generation — rows produced by these tools show up here.
Provides
None
Conflicts
None
Replaces
None
README
Admin UI for browsing, filtering, and downloading media archived by Spora agents.
This plugin contributes the Media Archive app to the host's Apps dropdown. The panel is a pre-built Vue SPA delivered as a separate Composer package (spora-ai/spora-plugin-media-archive-frontend, type spora-plugin-frontend). The two-package split lets the frontend evolve on its own release cadence and lets backend-only operators skip the bundle entirely.
Install
composer require spora-ai/spora-plugin-media-archive composer require spora-ai/spora-plugin-media-archive-frontend
Both packages are required: the PHP package contributes the admin-panel metadata (MediaArchiveApp → VueAppInterface), and the frontend package ships the Vue IIFE bundle that the host SPA lazy-loads at runtime.
Requires spora-ai/spora-core ≥ 0.20.0 (ships MediaDerivativeService and the two-arg MediaAssetSerializer used to surface persisted derivatives on the detail page; versions prior to 0.20.0 leave the VersionsStrip empty on reload).
What it does
- Surfaces rows from the
media_assetstable (indexed byMediaArchiveService) as a filterable grid in the admin UI. - Filters by media type, plugin, tool, agent, and date range.
- Scope chip row (mirrors the dashboard's ALL / My Media / Group pattern) so a user with multiple groups can isolate each group's media. The chip row reads
/principals/me+/groupsto populate the labels; the controller intersects?principal_id=with the caller'svisiblePrincipalIds()so an out-of-scope principal id is silently dropped. - Click-through detail drawer with metadata (dimensions, duration, mime type, source URL).
- A
derivativesstrip below the asset row (format chip + producer + asset URL). Populated from themedia_derivativesjoin table; the controller reads it viaMediaDerivativeService::listFor()so chips survive a hard reload, not just the in-memory splice on derivative production. - One-click download via the existing
AssetController::show()route.
The plugin itself adds no tools, drivers, recipes, or migrations — it is purely presentational.
Companion plugins
Listed in composer.json under suggest:
spora-ai/spora-plugin-minimax— image, speech, music, and video generation. Rows produced by these tools show up here.spora-ai/spora-plugin-email— email send/receive. Outbound attachments surface as archived documents.
Reference
The canonical reference (REST contract, ingestion API, retention guidance, configuration flags) lives on the docs site:
docs.spora-ai.com/develop/plugins/reference/media-archive
License
MIT — see LICENSE.