diff --git a/bun.lock b/bun.lock index 0bbb869..5b627e0 100644 --- a/bun.lock +++ b/bun.lock @@ -32,8 +32,12 @@ }, "packages/dvmcp-commons": { "name": "@dvmcp/commons", - "version": "0.1.2", + "version": "0.1.3", + "dependencies": { + "debug": "^4.4.0", + }, "peerDependencies": { + "@types/debug": "^4.1.12", "typescript": "^5.0.0", }, }, diff --git a/package.json b/package.json index 1a2652a..d2b148a 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,6 @@ { "name": "dvmcp", "scripts": { - "start:mcp-dvm": "cd packages/mcp-dvm-bridge && bun start", "format": "prettier --write \"packages/**/*.{ts,tsx,js,jsx,json,md}\"", "publish:commons": "cd packages/dvmcp-commons && npm publish --access public", "publish:bridge": "cd packages/dvmcp-bridge && npm publish --access public", diff --git a/packages/dvmcp-bridge/package.json b/packages/dvmcp-bridge/package.json index 540fd6f..eaad232 100644 --- a/packages/dvmcp-bridge/package.json +++ b/packages/dvmcp-bridge/package.json @@ -1,6 +1,6 @@ { "name": "@dvmcp/bridge", - "version": "0.1.19", + "version": "0.1.20", "description": "Bridge connecting MCP servers to Nostr's DVM ecosystem", "module": "index.ts", "type": "module", @@ -35,7 +35,7 @@ "dotenv": "^16.4.7", "nostr-tools": "^2.10.4", "yaml": "^2.7.0", - "@dvmcp/commons": "^0.1.2" + "@dvmcp/commons": "^0.1.3" }, "publishConfig": { "access": "public" diff --git a/packages/dvmcp-bridge/src/announcer.ts b/packages/dvmcp-bridge/src/announcer.ts index 9f10b97..623f143 100644 --- a/packages/dvmcp-bridge/src/announcer.ts +++ b/packages/dvmcp-bridge/src/announcer.ts @@ -8,6 +8,7 @@ import { TOOL_REQUEST_KIND, } from '@dvmcp/commons/constants'; import type { Event } from 'nostr-tools/pure'; +import { loggerBridge } from '@dvmcp/commons/logger'; export const keyManager = createKeyManager(CONFIG.nostr.privateKey); @@ -28,7 +29,7 @@ export class NostrAnnouncer { }); await this.relayHandler.publishEvent(event); - console.log('Announced relay list metadata'); + loggerBridge('Announced relay list metadata'); } async announceService() { @@ -52,7 +53,7 @@ export class NostrAnnouncer { ], }); await this.relayHandler.publishEvent(event); - console.log(`Announced service with ${tools.length} tools`); + loggerBridge(`Announced service with ${tools.length} tools`); } async updateAnnouncement() { @@ -82,7 +83,7 @@ export class NostrAnnouncer { }); await this.relayHandler.publishEvent(deletionEvent); - console.log(`Published deletion event for service announcement`); + loggerBridge(`Published deletion event for service announcement`); return deletionEvent; } diff --git a/packages/dvmcp-bridge/src/dvm-bridge.ts b/packages/dvmcp-bridge/src/dvm-bridge.ts index 30adbc9..ef2b593 100644 --- a/packages/dvmcp-bridge/src/dvm-bridge.ts +++ b/packages/dvmcp-bridge/src/dvm-bridge.ts @@ -9,6 +9,7 @@ import { TOOL_REQUEST_KIND, TOOL_RESPONSE_KIND, } from '@dvmcp/commons/constants'; +import { loggerBridge } from '@dvmcp/commons/logger'; export class DVMBridge { private mcpPool: MCPPool; @@ -17,8 +18,8 @@ export class DVMBridge { private isRunning: boolean = false; constructor() { - console.log('Initializing DVM Bridge...'); - console.log('public key:', keyManager.getPublicKey()); + loggerBridge('Initializing DVM Bridge...'); + loggerBridge('public key:', keyManager.getPublicKey()); this.mcpPool = new MCPPool(CONFIG.mcp.servers); this.relayHandler = relayHandler; this.nostrAnnouncer = new NostrAnnouncer(this.mcpPool); @@ -36,21 +37,21 @@ export class DVMBridge { async start() { if (this.isRunning) { - console.log('Bridge is already running'); + loggerBridge('Bridge is already running'); return; } try { - console.log('Connecting to MCP servers...'); + loggerBridge('Connecting to MCP servers...'); await this.mcpPool.connect(); const tools = await this.mcpPool.listTools(); - console.log(`Available MCP tools across all servers: ${tools.length}`); + loggerBridge(`Available MCP tools across all servers: ${tools.length}`); - console.log('Announcing service to Nostr network...'); + loggerBridge('Announcing service to Nostr network...'); await this.nostrAnnouncer.updateAnnouncement(); - console.log('Setting up request handlers...'); + loggerBridge('Setting up request handlers...'); const publicKey = keyManager.getPublicKey(); this.relayHandler.subscribeToRequests(this.handleRequest.bind(this), { kinds: [TOOL_REQUEST_KIND], @@ -59,7 +60,7 @@ export class DVMBridge { }); this.isRunning = true; - console.log('DVM Bridge is now running and ready to handle requests'); + loggerBridge('DVM Bridge is now running and ready to handle requests'); } catch (error) { console.error('Failed to start DVM Bridge:', error); throw error; @@ -71,12 +72,12 @@ export class DVMBridge { return; } - console.log('Stopping DVM Bridge...'); + loggerBridge('Stopping DVM Bridge...'); try { await this.mcpPool.disconnect(); this.relayHandler.cleanup(); this.isRunning = false; - console.log('DVM Bridge stopped successfully'); + loggerBridge('DVM Bridge stopped successfully'); } catch (error) { console.error('Error stopping DVM Bridge:', error); throw error; @@ -89,11 +90,11 @@ export class DVMBridge { * @returns The deletion event that was published */ async deleteAnnouncement(reason?: string) { - console.log('Deleting service announcement from relays...'); + loggerBridge('Deleting service announcement from relays...'); try { const deletionEvent = await this.nostrAnnouncer.deleteAnnouncement(reason); - console.log('Service announcement deleted successfully'); + loggerBridge('Service announcement deleted successfully'); return deletionEvent; } catch (error) { console.error('Error deleting service announcement:', error); diff --git a/packages/dvmcp-bridge/src/mcp-client.ts b/packages/dvmcp-bridge/src/mcp-client.ts index eabd673..185021b 100644 --- a/packages/dvmcp-bridge/src/mcp-client.ts +++ b/packages/dvmcp-bridge/src/mcp-client.ts @@ -2,6 +2,7 @@ import { Client } from '@modelcontextprotocol/sdk/client/index.js'; import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js'; import { CONFIG } from './config'; import type { MCPServerConfig } from './types'; +import { loggerBridge } from '@dvmcp/commons/logger'; export class MCPClientHandler { private client: Client; @@ -29,7 +30,7 @@ export class MCPClientHandler { async connect() { await this.client.connect(this.transport); - console.log('Connected to MCP server'); + loggerBridge('Connected to MCP server'); } async listTools() { diff --git a/packages/dvmcp-commons/logger.ts b/packages/dvmcp-commons/logger.ts new file mode 100644 index 0000000..2913fd6 --- /dev/null +++ b/packages/dvmcp-commons/logger.ts @@ -0,0 +1,7 @@ +import debug from 'debug'; + +const logger = debug('dvmcp'); +const loggerBridge = debug('dvmcp:bridge'); +const loggerDiscovery = debug('dvmcp:discovery'); + +export { logger, loggerBridge, loggerDiscovery }; diff --git a/packages/dvmcp-commons/package.json b/packages/dvmcp-commons/package.json index 77e9f03..5fbf514 100644 --- a/packages/dvmcp-commons/package.json +++ b/packages/dvmcp-commons/package.json @@ -1,6 +1,6 @@ { "name": "@dvmcp/commons", - "version": "0.1.2", + "version": "0.1.3", "description": "Shared utilities for DVMCP packages", "type": "module", "exports": { @@ -18,7 +18,11 @@ "typecheck": "tsc --noEmit" }, "peerDependencies": { - "typescript": "^5.0.0" + "typescript": "^5.0.0", + "@types/debug": "^4.1.12" + }, + "dependencies": { + "debug": "^4.4.0" }, "publishConfig": { "access": "public" diff --git a/packages/dvmcp-discovery/package.json b/packages/dvmcp-discovery/package.json index 43a12a9..86a75a0 100644 --- a/packages/dvmcp-discovery/package.json +++ b/packages/dvmcp-discovery/package.json @@ -1,6 +1,6 @@ { "name": "@dvmcp/discovery", - "version": "0.1.18", + "version": "0.1.19", "description": "Discovery service for MCP tools in the Nostr DVM ecosystem", "module": "index.ts", "type": "module", @@ -34,8 +34,7 @@ "@modelcontextprotocol/sdk": "^1.5.0", "nostr-tools": "^2.10.4", "yaml": "^2.7.0", - "@dvmcp/commons": "^0.1.2", - "debug": "^4.4.0" + "@dvmcp/commons": "^0.1.3" }, "publishConfig": { "access": "public" diff --git a/packages/dvmcp-discovery/src/direct-discovery.ts b/packages/dvmcp-discovery/src/direct-discovery.ts index bc0c2cf..4f8dfc5 100644 --- a/packages/dvmcp-discovery/src/direct-discovery.ts +++ b/packages/dvmcp-discovery/src/direct-discovery.ts @@ -2,7 +2,7 @@ import type { Event, Filter } from 'nostr-tools'; import { RelayHandler } from '@dvmcp/commons/nostr/relay-handler'; import { DVM_ANNOUNCEMENT_KIND } from '@dvmcp/commons/constants'; import type { NaddrData, NprofileData } from './nip19-utils'; -import logger from './logger'; +import { loggerDiscovery } from '@dvmcp/commons/logger'; export interface DVMAnnouncement { name: string; @@ -20,7 +20,7 @@ async function fetchAnnouncement( try { // Query for the announcement event - logger('Querying for announcement event:', filter); + loggerDiscovery('Querying for announcement event:', filter); const events = await relayHandler.queryEvents(filter); if (events.length === 0) { diff --git a/packages/dvmcp-discovery/src/discovery-server.ts b/packages/dvmcp-discovery/src/discovery-server.ts index ac0a922..861eb71 100644 --- a/packages/dvmcp-discovery/src/discovery-server.ts +++ b/packages/dvmcp-discovery/src/discovery-server.ts @@ -9,7 +9,7 @@ import type { Tool } from '@modelcontextprotocol/sdk/types.js'; import { ToolRegistry } from './tool-registry'; import { ToolExecutor } from './tool-executor'; import type { DVMAnnouncement } from './direct-discovery'; -import logger from './logger'; +import { loggerDiscovery } from '@dvmcp/commons/logger'; export class DiscoveryServer { private mcpServer: McpServer; @@ -64,7 +64,7 @@ export class DiscoveryServer { private async handleDVMAnnouncement(event: Event) { try { if (!this.isAllowedDVM(event.pubkey)) { - logger('DVM not in whitelist:', event.pubkey); + loggerDiscovery('DVM not in whitelist:', event.pubkey); return; } @@ -104,7 +104,7 @@ export class DiscoveryServer { pubkey: string, announcement: DVMAnnouncement ) { - logger('Starting discovery server with direct server tools...'); + loggerDiscovery('Starting discovery server with direct server tools...'); if (!announcement?.tools) { console.error('No tools found in server announcement'); @@ -113,25 +113,27 @@ export class DiscoveryServer { this.registerToolsFromAnnouncement(pubkey, announcement.tools); - logger(`Registered ${announcement.tools.length} tools from direct server`); + loggerDiscovery( + `Registered ${announcement.tools.length} tools from direct server` + ); // Connect the MCP server const transport = new StdioServerTransport(); await this.mcpServer.connect(transport); - logger('DVMCP Discovery Server started'); + loggerDiscovery('DVMCP Discovery Server started'); } public async start() { - logger('Starting discovery server...'); + loggerDiscovery('Starting discovery server...'); await this.startDiscovery(); - logger(`Discovered ${this.toolRegistry.listTools().length} tools`); + loggerDiscovery(`Discovered ${this.toolRegistry.listTools().length} tools`); const transport = new StdioServerTransport(); await this.mcpServer.connect(transport); - logger('DVMCP Discovery Server started'); + loggerDiscovery('DVMCP Discovery Server started'); } public async cleanup(): Promise { diff --git a/packages/dvmcp-discovery/src/nip19-utils.ts b/packages/dvmcp-discovery/src/nip19-utils.ts index ce73977..9aa5ae3 100644 --- a/packages/dvmcp-discovery/src/nip19-utils.ts +++ b/packages/dvmcp-discovery/src/nip19-utils.ts @@ -1,6 +1,6 @@ import { nip19 } from 'nostr-tools'; import { DVM_ANNOUNCEMENT_KIND } from '@dvmcp/commons/constants'; -import logger from './logger'; +import { loggerDiscovery } from '@dvmcp/commons/logger'; // Default fallback relay when no relay hints are provided export const DEFAULT_FALLBACK_RELAY = 'wss://relay.dvmcp.fun'; @@ -33,7 +33,7 @@ export function decodeNprofile(nprofileEntity: string): NprofileData | null { // Ensure we have at least one relay by using the fallback if necessary const profileData = data as NprofileData; if (!profileData.relays || profileData.relays.length === 0) { - logger( + loggerDiscovery( `No relay hints in nprofile, using fallback relay: ${DEFAULT_FALLBACK_RELAY}` ); profileData.relays = [DEFAULT_FALLBACK_RELAY]; @@ -68,7 +68,7 @@ export function decodeNaddr(naddrEntity: string): NaddrData | null { // Ensure we have at least one relay by using the fallback if necessary const addrData = data as NaddrData; if (!addrData.relays || addrData.relays.length === 0) { - logger( + loggerDiscovery( `No relay hints in naddr, using fallback relay: ${DEFAULT_FALLBACK_RELAY}` ); addrData.relays = [DEFAULT_FALLBACK_RELAY]; diff --git a/packages/dvmcp-discovery/src/tool-executor.ts b/packages/dvmcp-discovery/src/tool-executor.ts index 29096eb..61f88ae 100644 --- a/packages/dvmcp-discovery/src/tool-executor.ts +++ b/packages/dvmcp-discovery/src/tool-executor.ts @@ -8,7 +8,7 @@ import { TOOL_RESPONSE_KIND, DVM_NOTICE_KIND, } from '@dvmcp/commons/constants'; -import logger from './logger'; +import { loggerDiscovery } from '@dvmcp/commons/logger'; interface ExecutionContext { timeoutId: ReturnType; @@ -66,7 +66,7 @@ export class ToolExecutor { private createExecutionContext(executionId: string): ExecutionContext { const timeoutId = setTimeout(() => { - logger('Execution timeout for:', executionId); + loggerDiscovery('Execution timeout for:', executionId); this.cleanupExecution(executionId); }, ToolExecutor.EXECUTION_TIMEOUT); diff --git a/packages/dvmcp-discovery/src/tool-registry.ts b/packages/dvmcp-discovery/src/tool-registry.ts index e925e5e..39c3489 100644 --- a/packages/dvmcp-discovery/src/tool-registry.ts +++ b/packages/dvmcp-discovery/src/tool-registry.ts @@ -2,7 +2,7 @@ import { type Tool } from '@modelcontextprotocol/sdk/types.js'; import { ToolSchema } from '@modelcontextprotocol/sdk/types.js'; import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; import { z } from 'zod'; -import logger from './logger'; +import { loggerDiscovery } from '@dvmcp/commons/logger'; export class ToolRegistry { private discoveredTools: Map = @@ -73,7 +73,7 @@ export class ToolRegistry { } } ); - logger('Tool registered successfully:', toolId); + loggerDiscovery('Tool registered successfully:', toolId); } catch (error) { console.error('Error registering tool:', toolId, error); }