Seventh plugin out, and the first that was already dead. Soulseek had been switched off since 2026-08-13: hono.ts had the router import and its mount commented out, so createSidecarProxy never ran, registerProxiedPrefix was never called, the slskd:server announcement fired into a void, and officer-slskd was not in the ecosystem at all. The permission entry had been reduced to api: [], which is why assertPermissionTotality was satisfied and the server booted clean. The UI rendered perfectly and every request 404'd. So this is a resurrection as well as a move. The mount is now /api/soulseek, derived via mountPrefix from the appName — all 47 frontend call sites repointed from /slskd/. The credential key in service_connections stays 'slskd': it names the daemon, not the route. Those two strings differ on purpose and conflating them reads the wrong row. The connection stays in core service_connections, as transmission does, so 'slskd' remains in a platform union this plugin cannot extend. Recorded in PLUGIN.md. Unlike transmission this plugin does own a schema: favourites and the two halves of the cached browse tree, which slskd has no concept of. Those three tables had been dropped from the drizzle barrel, so bun db:push would have deleted them on any server holding data. 313 palette classes converted to the semantic tone set, including a shared PHASE_TONE the three transfer views previously each copied.
15 lines
836 B
TypeScript
15 lines
836 B
TypeScript
import type { AppRegistryMeta } from 'officerdev';
|
|
import { PanelLeft, LayoutGrid } from 'lucide-react';
|
|
import { SoulseekNav } from './SoulseekNav';
|
|
import { SoulseekView } from './SoulseekView';
|
|
|
|
// `panels.ts`, not `.tsx` — discovery checks for that exact name. A section nav on the left and the view
|
|
// on the right, both reading `:section` from the URL rather than being told by each other.
|
|
//
|
|
// `availableOnPanel: false` because the screen renders the workspace `locked`: these are not swappable,
|
|
// and offering them in a picker would be a lie.
|
|
export const appRegistryMetas: AppRegistryMeta[] = [
|
|
{ key: 'soulseek-nav', name: 'Soulseek', icon: PanelLeft, component: SoulseekNav, availableOnPanel: false },
|
|
{ key: 'soulseek-view', name: 'Soulseek', icon: LayoutGrid, component: SoulseekView, availableOnPanel: false },
|
|
];
|