Monorepo-lite with shared @nexusai/core and @nexusai/mcp-server (stdio). Provider-agnostic tools with explicit provider selection; NordRouter adapter (media generate/poll/download, estimate, upload, models) and search via perplexity/sonar. Local STT via faster-whisper uv sidecar. SQLite journal of every generation for usage stats and future admin. 10 MCP tools.
73 lines
2.1 KiB
TypeScript
73 lines
2.1 KiB
TypeScript
import { NexusError } from '../shared/errors.js';
|
|
import type { Capability, MediaProvider, SearchProvider, SttProvider } from './types.js';
|
|
|
|
/**
|
|
* Registry maps a provider name + capability to the concrete adapter.
|
|
* Adding RouterAI / GPTunnel / OpenRouter / cloud STT means registering a new
|
|
* adapter here — no changes needed in the MCP tool layer.
|
|
*/
|
|
export class ProviderRegistry {
|
|
private media = new Map<string, MediaProvider>();
|
|
private search = new Map<string, SearchProvider>();
|
|
private stt = new Map<string, SttProvider>();
|
|
|
|
registerMedia(provider: MediaProvider): void {
|
|
this.media.set(provider.name, provider);
|
|
}
|
|
registerSearch(provider: SearchProvider): void {
|
|
this.search.set(provider.name, provider);
|
|
}
|
|
registerStt(provider: SttProvider): void {
|
|
this.stt.set(provider.name, provider);
|
|
}
|
|
|
|
getMedia(name: string, capability: Capability): MediaProvider {
|
|
const p = this.media.get(name);
|
|
if (!p) {
|
|
throw new NexusError(
|
|
'UNSUPPORTED',
|
|
`Unknown media provider "${name}". Available: ${[...this.media.keys()].join(', ') || 'none'}`
|
|
);
|
|
}
|
|
if (!p.capabilities.includes(capability)) {
|
|
throw new NexusError(
|
|
'UNSUPPORTED',
|
|
`Provider "${name}" does not support capability "${capability}"`
|
|
);
|
|
}
|
|
return p;
|
|
}
|
|
|
|
getSearch(name: string): SearchProvider {
|
|
const p = this.search.get(name);
|
|
if (!p) {
|
|
throw new NexusError(
|
|
'UNSUPPORTED',
|
|
`Unknown search provider "${name}". Available: ${[...this.search.keys()].join(', ') || 'none'}`
|
|
);
|
|
}
|
|
return p;
|
|
}
|
|
|
|
getStt(name: string): SttProvider {
|
|
const p = this.stt.get(name);
|
|
if (!p) {
|
|
throw new NexusError(
|
|
'UNSUPPORTED',
|
|
`Unknown STT provider "${name}". Available: ${[...this.stt.keys()].join(', ') || 'none'}`
|
|
);
|
|
}
|
|
return p;
|
|
}
|
|
|
|
listMediaProviders(): string[] {
|
|
return [...this.media.keys()];
|
|
}
|
|
listSearchProviders(): string[] {
|
|
return [...this.search.keys()];
|
|
}
|
|
listSttProviders(): string[] {
|
|
return [...this.stt.keys()];
|
|
}
|
|
}
|