Add NexusAI: universal MCP service (TTS/STT/image/video/music/web-search)

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.
This commit is contained in:
OpenCode
2026-08-17 17:06:47 +07:00
parent 82087be1b3
commit 02fc536e85
32 changed files with 3861 additions and 0 deletions
@@ -0,0 +1,46 @@
import {
Journal,
MediaStorage,
ProviderRegistry,
createNordRouterProviders,
loadConfig,
LocalWhisperProvider,
createLogger,
type NexusConfig,
} from '@nexusai/core';
const log = createLogger('context');
export interface AppContext {
config: NexusConfig;
registry: ProviderRegistry;
storage: MediaStorage;
journal: Journal;
}
/**
* Wire up all providers, storage and the journal once at startup.
*/
export function buildContext(): AppContext {
const config = loadConfig();
const storage = new MediaStorage(config.mediaDir);
const journal = new Journal(config.dbPath);
const registry = new ProviderRegistry();
// NordRouter (media + search). Registered even without a key so error messages
// are clear when a tool is actually invoked.
try {
const nr = createNordRouterProviders({ config: config.nordrouter, storage, save: true });
registry.registerMedia(nr.media);
registry.registerSearch(nr.search);
log.info('registered nordrouter provider (media + search)');
} catch (err) {
log.warn('nordrouter not registered', err instanceof Error ? err.message : String(err));
}
// Local STT (faster-whisper sidecar).
registry.registerStt(new LocalWhisperProvider(config.stt));
log.info('registered local STT provider');
return { config, registry, storage, journal };
}