import type { PluginManifest } from '@@/plugins/manifest'; /** * av-club — sharp, ffmpeg and ffprobe over HTTP, for whoever needs to turn an upload into something a * browser can serve. * * ── No screens, deliberately ── * * This is an API and a body of documentation, not a place to click. Its callers are a commander watching * an upload folder, an agent, or a person with curl. A dock tile would advertise a page that has nothing * to show — the work happens where the files are, which is not here. * * ── One permission, and it is not `personal` ── * * Every other permission's paths act on the caller's own data. These act on assets av-club itself issued * ids for, in its own store, shared by every caller — so it is an ordinary grantable capability rather * than a per-account one, and an account without it cannot reach the encoder at all. */ export const manifest: PluginManifest = { publisher: 'officerdev', version: '2026.08.28.01', platform: '>=1.0.0', label: 'AV Club', summary: 'Convert and treat images, video and audio — sharp, ffmpeg and ffprobe behind one API', tags: ['Development', 'Personal'], icon: 'Clapperboard', color: '#8b5cf6', /* Declared HERE rather than in a package.json, and that is not a style choice. A package.json inside a plugin makes a package boundary, and Bun then stops walking up for the platform's tsconfig — so `@@/sidecar/connect` stops resolving and the sidecar dies on its first import. That is exactly how this plugin failed on the day it was extracted: it arrived carrying its own package.json and bun.lock, and both the router and the sidecar could not find the platform. `npm-deps.ts` collects these across every plugin into `plugins/node_modules/`, so atelier's copy of sharp is the one used here too rather than a second 50 MB of platform binaries. */ npmDependencies: { sharp: '^0.35.3', }, permissions: [ { key: 'av-club', label: 'AV Club', description: 'Convert and inspect media through sharp, ffmpeg and ffprobe', }, ], };