Plugins & Custom Virtuosos
The orchestra is extensible on two axes: build your own Virtuoso in Agent Studio, or install third-party ones from the Plugin Marketplace.
Custom Virtuosos (Agent Studio)
The Custom Virtuoso Builder (src/components/virtuosos/CustomVirtuosoBuilder.tsx,
src/hooks/useCustomVirtuosos.ts) lets you define a new agent: name, constitution (system
instruction), model, capabilities, and color. Custom profiles join the
registry at runtime and can be commissioned like any built-in specialist.
Plugin Marketplace
src/lib/plugin-marketplace.ts implements the full pipeline:
MarketplaceClient → fetch catalog
PluginInstaller → fetch, validate, sandbox, register
PluginSandbox → isolated execution environmentInstallation steps:
- Fetch the plugin manifest and handler code
- Verify the SHA-256 hash of the handler code (integrity check — hash mismatch aborts)
- Create a sandboxed handler in an isolated function scope
- Register the plugin as a Virtuoso
Plugins run sandboxed, but treat third-party Virtuosos like any dependency: review what a plugin declares in its manifest before installing.
The Plugin API
export interface PluginManifest {
name: string
version: string
description: string
capabilities: string[]
inputs: Array<{ name: string; type: string; required: boolean; description: string }>
outputs: Array<{ name: string; type: string; description: string }>
author?: string
homepage?: string
}
export function registerPlugin(plugin: VirtuosoPlugin): void
export function unregisterPlugin(pluginId: string): boolean
export function getPlugin(pluginId: string): VirtuosoPlugin | undefined
export function listPlugins(): VirtuosoPlugin[]A VirtuosoPlugin receives PluginTasks (the commission payload) and returns PluginResults,
which flow through the same Symphony Bus lifecycle — including
the Critic gate — as built-in agents.