Use debug package for debug logging (#8)

Co-authored-by: gzuuus <gzuuus@protonmail.com>
This commit is contained in:
hzrd149
2025-03-26 19:16:17 +00:00
committed by GitHub
parent c6c38e3c39
commit 07e60bb4ba
12 changed files with 76 additions and 43 deletions

View File

@@ -3,13 +3,16 @@
"workspaces": {
"": {
"name": "dvmcp",
"dependencies": {
"@types/debug": "^4.1.12",
},
"devDependencies": {
"prettier": "^3.5.1",
},
},
"packages/dvmcp-bridge": {
"name": "@dvmcp/bridge",
"version": "0.1.3",
"version": "0.1.19",
"bin": {
"dvmcp-bridge": "./cli.ts",
},
@@ -29,20 +32,21 @@
},
"packages/dvmcp-commons": {
"name": "@dvmcp/commons",
"version": "0.1.0",
"version": "0.1.2",
"peerDependencies": {
"typescript": "^5.0.0",
},
},
"packages/dvmcp-discovery": {
"name": "@dvmcp/discovery",
"version": "0.1.3",
"version": "0.1.18",
"bin": {
"dvmcp-discovery": "./cli.ts",
},
"dependencies": {
"@dvmcp/commons": "^0.1.0",
"@dvmcp/commons": "^0.1.2",
"@modelcontextprotocol/sdk": "^1.5.0",
"debug": "^4.4.0",
"nostr-tools": "^2.10.4",
"yaml": "^2.7.0",
},
@@ -50,6 +54,7 @@
"@types/bun": "latest",
},
"peerDependencies": {
"@types/debug": "^4.1.12",
"typescript": "^5.0.0",
},
},
@@ -77,6 +82,10 @@
"@types/bun": ["@types/bun@1.2.4", "", { "dependencies": { "bun-types": "1.2.4" } }, "sha512-QtuV5OMR8/rdKJs213iwXDpfVvnskPXY/S0ZiFbsTjQZycuqPbMW8Gf/XhLfwE5njW8sxI2WjISURXPlHypMFA=="],
"@types/debug": ["@types/debug@4.1.12", "", { "dependencies": { "@types/ms": "*" } }, "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ=="],
"@types/ms": ["@types/ms@2.1.0", "", {}, "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="],
"@types/node": ["@types/node@22.13.5", "", { "dependencies": { "undici-types": "~6.20.0" } }, "sha512-+lTU0PxZXn0Dr1NBtC7Y8cR21AJr87dLLU953CWA6pMxxv/UDc7jYAY90upcrie1nRcD6XNG5HOYEDtgW5TxAg=="],
"@types/ws": ["@types/ws@8.5.14", "", { "dependencies": { "@types/node": "*" } }, "sha512-bd/YFLW+URhBzMXurx7lWByOu+xzU9+kb3RboOteXYDfW+tr+JZa99OyNmPINEGB/ahzKrEuc8rcv4gnpJmxTw=="],
@@ -103,7 +112,7 @@
"cors": ["cors@2.8.5", "", { "dependencies": { "object-assign": "^4", "vary": "^1" } }, "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g=="],
"debug": ["debug@4.3.6", "", { "dependencies": { "ms": "2.1.2" } }, "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg=="],
"debug": ["debug@4.4.0", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA=="],
"depd": ["depd@2.0.0", "", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="],
@@ -175,7 +184,7 @@
"mime-types": ["mime-types@3.0.0", "", { "dependencies": { "mime-db": "^1.53.0" } }, "sha512-XqoSHeCGjVClAmoGFG3lVFqQFRIrTVw2OH3axRqAcfaw+gHWIfnASS92AV+Rl/mk0MupgZTRHQOjxY6YVnzK5w=="],
"ms": ["ms@2.1.2", "", {}, "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="],
"ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
"negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="],
@@ -251,34 +260,40 @@
"zod-to-json-schema": ["zod-to-json-schema@3.24.3", "", { "peerDependencies": { "zod": "^3.24.1" } }, "sha512-HIAfWdYIt1sssHfYZFCXp4rU1w2r8hVVXYIlmoa0r0gABLs5di3RCqPU5DDROogVz1pAdYBaz7HK5n9pSUNs3A=="],
"@dvmcp/discovery/@types/bun": ["@types/bun@1.2.6", "", { "dependencies": { "bun-types": "1.2.6" } }, "sha512-fY9CAmTdJH1Llx7rugB0FpgWK2RKuHCs3g2cFDYXUutIy1QGiPQxKkGY8owhfZ4MXWNfxwIbQLChgH5gDsY7vw=="],
"@noble/curves/@noble/hashes": ["@noble/hashes@1.3.2", "", {}, "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ=="],
"@scure/bip32/@noble/curves": ["@noble/curves@1.1.0", "", { "dependencies": { "@noble/hashes": "1.3.1" } }, "sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA=="],
"@scure/bip32/@noble/hashes": ["@noble/hashes@1.3.2", "", {}, "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ=="],
"body-parser/debug": ["debug@4.4.0", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA=="],
"body-parser/iconv-lite": ["iconv-lite@0.5.2", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-kERHXvpSaB4aU3eANwidg79K8FlrN77m8G9V+0vOR3HYaRifrlwMEpT7ZBJqLSEIHnEgJTHcWK82wwLwwKwtag=="],
"body-parser/qs": ["qs@6.14.0", "", { "dependencies": { "side-channel": "^1.1.0" } }, "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w=="],
"express/debug": ["debug@4.3.6", "", { "dependencies": { "ms": "2.1.2" } }, "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg=="],
"finalhandler/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="],
"finalhandler/encodeurl": ["encodeurl@1.0.2", "", {}, "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="],
"send/debug": ["debug@4.3.6", "", { "dependencies": { "ms": "2.1.2" } }, "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg=="],
"send/fresh": ["fresh@0.5.2", "", {}, "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="],
"send/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="],
"send/ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
"@dvmcp/discovery/@types/bun/bun-types": ["bun-types@1.2.6", "", { "dependencies": { "@types/node": "*", "@types/ws": "~8.5.10" } }, "sha512-FbCKyr5KDiPULUzN/nm5oqQs9nXCHD8dVc64BArxJadCvbNzAI6lUWGh9fSJZWeDIRD38ikceBU8Kj/Uh+53oQ=="],
"@scure/bip32/@noble/curves/@noble/hashes": ["@noble/hashes@1.3.1", "", {}, "sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA=="],
"body-parser/debug/ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
"express/debug/ms": ["ms@2.1.2", "", {}, "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="],
"finalhandler/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="],
"send/debug/ms": ["ms@2.1.2", "", {}, "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="],
"send/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="],
}
}

View File

@@ -13,5 +13,8 @@
],
"devDependencies": {
"prettier": "^3.5.1"
},
"dependencies": {
"@types/debug": "^4.1.12"
}
}

View File

@@ -69,6 +69,14 @@ bun run start --server naddr1...
This is useful when you want to work with a specific subset of tools rather than discovering all tools from a provider.
## Debug
You can enable debug mode by setting the `DEBUG` environment variable to `*`:
```bash
DEBUG=* npx @dvmcp/discovery
```
## Testing
Run the test suite:

View File

@@ -21,9 +21,9 @@ import {
fetchProviderAnnouncement,
fetchServerAnnouncement,
parseAnnouncement,
type DVMAnnouncement,
} from './src/direct-discovery.js';
import type { DirectServerInfo } from './index.js';
import logger from './src/logger';
const defaultConfigPath = join(process.cwd(), 'config.dvmcp.yml');
let configPath = defaultConfigPath;
@@ -47,7 +47,7 @@ if (
argv[configPathArgIndex + 1]
) {
configPath = resolve(argv[configPathArgIndex + 1]);
console.log(`Using config path: ${configPath}`);
logger(`Using config path: ${configPath}`);
setConfigPath(configPath);
}
@@ -110,7 +110,7 @@ const configFields: Record<string, FieldConfig> = {
};
const configure = async () => {
console.log(
logger(
`${CONFIG_EMOJIS.SETUP} DVMCP Discovery Configuration Setup ${CONFIG_EMOJIS.SETUP}`
);
const generator = new ConfigGenerator<Config>(configPath, configFields);
@@ -119,7 +119,7 @@ const configure = async () => {
const runApp = async (directServerInfo?: DirectServerInfo) => {
const main = await import('./index.js');
console.log(`${CONFIG_EMOJIS.INFO} Running main application...`);
logger(`${CONFIG_EMOJIS.INFO} Running main application...`);
await main.default(directServerInfo);
};
@@ -134,9 +134,7 @@ const setupInMemoryConfig = (relays: string[], pubkey: string) => {
};
const setupFromProvider = async (nprofileEntity: string) => {
console.log(
`${CONFIG_EMOJIS.INFO} Setting up from provider: ${nprofileEntity}`
);
logger(`${CONFIG_EMOJIS.INFO} Setting up from provider: ${nprofileEntity}`);
const providerData = decodeNprofile(nprofileEntity);
if (!providerData) {
@@ -152,7 +150,7 @@ const setupFromProvider = async (nprofileEntity: string) => {
}
setupInMemoryConfig(providerData.relays, providerData.pubkey);
console.log(`${CONFIG_EMOJIS.SUCCESS} Successfully set up from provider`);
logger(`${CONFIG_EMOJIS.SUCCESS} Successfully set up from provider`);
} catch (error) {
console.error(`Error: ${error}`);
process.exit(1);
@@ -160,7 +158,7 @@ const setupFromProvider = async (nprofileEntity: string) => {
};
const setupFromServer = async (naddrEntity: string) => {
console.log(`${CONFIG_EMOJIS.INFO} Setting up from server: ${naddrEntity}`);
logger(`${CONFIG_EMOJIS.INFO} Setting up from server: ${naddrEntity}`);
const addrData = decodeNaddr(naddrEntity);
if (!addrData) {
@@ -182,7 +180,7 @@ const setupFromServer = async (naddrEntity: string) => {
}
setupInMemoryConfig(addrData.relays, addrData.pubkey);
console.log(`${CONFIG_EMOJIS.SUCCESS} Successfully set up from server`);
logger(`${CONFIG_EMOJIS.SUCCESS} Successfully set up from server`);
return {
pubkey: addrData.pubkey,
@@ -213,7 +211,7 @@ const cliMain = async () => {
}
// Handle normal config file mode
else if (!existsSync(configPath)) {
console.log(
logger(
`${CONFIG_EMOJIS.INFO} No configuration file found. Starting setup...`
);
await configure();

View File

@@ -1,6 +1,7 @@
import { getConfig } from './src/config';
import { DiscoveryServer } from './src/discovery-server';
import type { DVMAnnouncement } from './src/direct-discovery';
import logger from './src/logger';
export interface DirectServerInfo {
pubkey: string;
@@ -14,9 +15,7 @@ async function main(directServerInfo?: DirectServerInfo | null) {
if (directServerInfo) {
// If we have direct server info, register tools from that server only
console.log(
`Using direct server with pubkey: ${directServerInfo.pubkey}`
);
logger(`Using direct server with pubkey: ${directServerInfo.pubkey}`);
await server.registerDirectServerTools(
directServerInfo.pubkey,
directServerInfo.announcement
@@ -26,8 +25,8 @@ async function main(directServerInfo?: DirectServerInfo | null) {
await server.start();
}
console.log(`DVMCP Discovery Server (${config.mcp.version}) started`);
console.log(`Connected to ${config.nostr.relayUrls.length} relays`);
logger(`DVMCP Discovery Server (${config.mcp.version}) started`);
logger(`Connected to ${config.nostr.relayUrls.length} relays`);
// Handle shutdown
const cleanup = () => {

View File

@@ -1,6 +1,6 @@
{
"name": "@dvmcp/discovery",
"version": "0.1.17",
"version": "0.1.18",
"description": "Discovery service for MCP tools in the Nostr DVM ecosystem",
"module": "index.ts",
"type": "module",
@@ -27,13 +27,15 @@
"@types/bun": "latest"
},
"peerDependencies": {
"typescript": "^5.0.0"
"typescript": "^5.0.0",
"@types/debug": "^4.1.12"
},
"dependencies": {
"@modelcontextprotocol/sdk": "^1.5.0",
"nostr-tools": "^2.10.4",
"yaml": "^2.7.0",
"@dvmcp/commons": "^0.1.2"
"@dvmcp/commons": "^0.1.2",
"debug": "^4.4.0"
},
"publishConfig": {
"access": "public"

View File

@@ -2,6 +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';
export interface DVMAnnouncement {
name: string;
@@ -19,7 +20,7 @@ async function fetchAnnouncement(
try {
// Query for the announcement event
console.log('Querying for announcement event:', filter);
logger('Querying for announcement event:', filter);
const events = await relayHandler.queryEvents(filter);
if (events.length === 0) {

View File

@@ -9,6 +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';
export class DiscoveryServer {
private mcpServer: McpServer;
@@ -63,7 +64,7 @@ export class DiscoveryServer {
private async handleDVMAnnouncement(event: Event) {
try {
if (!this.isAllowedDVM(event.pubkey)) {
console.log('DVM not in whitelist:', event.pubkey);
logger('DVM not in whitelist:', event.pubkey);
return;
}
@@ -103,7 +104,7 @@ export class DiscoveryServer {
pubkey: string,
announcement: DVMAnnouncement
) {
console.log('Starting discovery server with direct server tools...');
logger('Starting discovery server with direct server tools...');
if (!announcement?.tools) {
console.error('No tools found in server announcement');
@@ -112,27 +113,25 @@ export class DiscoveryServer {
this.registerToolsFromAnnouncement(pubkey, announcement.tools);
console.log(
`Registered ${announcement.tools.length} tools from direct server`
);
logger(`Registered ${announcement.tools.length} tools from direct server`);
// Connect the MCP server
const transport = new StdioServerTransport();
await this.mcpServer.connect(transport);
console.log('DVMCP Discovery Server started');
logger('DVMCP Discovery Server started');
}
public async start() {
console.log('Starting discovery server...');
logger('Starting discovery server...');
await this.startDiscovery();
console.log(`Discovered ${this.toolRegistry.listTools().length} tools`);
logger(`Discovered ${this.toolRegistry.listTools().length} tools`);
const transport = new StdioServerTransport();
await this.mcpServer.connect(transport);
console.log('DVMCP Discovery Server started');
logger('DVMCP Discovery Server started');
}
public async cleanup(): Promise<void> {

View File

@@ -0,0 +1,5 @@
import debug from 'debug';
const logger = debug('dvmcp-discovery');
export default logger;

View File

@@ -1,5 +1,6 @@
import { nip19 } from 'nostr-tools';
import { DVM_ANNOUNCEMENT_KIND } from '@dvmcp/commons/constants';
import logger from './logger';
// Default fallback relay when no relay hints are provided
export const DEFAULT_FALLBACK_RELAY = 'wss://relay.dvmcp.fun';
@@ -32,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) {
console.log(
logger(
`No relay hints in nprofile, using fallback relay: ${DEFAULT_FALLBACK_RELAY}`
);
profileData.relays = [DEFAULT_FALLBACK_RELAY];
@@ -67,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) {
console.log(
logger(
`No relay hints in naddr, using fallback relay: ${DEFAULT_FALLBACK_RELAY}`
);
addrData.relays = [DEFAULT_FALLBACK_RELAY];

View File

@@ -8,6 +8,7 @@ import {
TOOL_RESPONSE_KIND,
DVM_NOTICE_KIND,
} from '@dvmcp/commons/constants';
import logger from './logger';
interface ExecutionContext {
timeoutId: ReturnType<typeof setTimeout>;
@@ -65,7 +66,7 @@ export class ToolExecutor {
private createExecutionContext(executionId: string): ExecutionContext {
const timeoutId = setTimeout(() => {
console.log('Execution timeout for:', executionId);
logger('Execution timeout for:', executionId);
this.cleanupExecution(executionId);
}, ToolExecutor.EXECUTION_TIMEOUT);

View File

@@ -2,6 +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';
export class ToolRegistry {
private discoveredTools: Map<string, { tool: Tool; providerPubkey: string }> =
@@ -72,7 +73,7 @@ export class ToolRegistry {
}
}
);
console.log('Tool registered successfully:', toolId);
logger('Tool registered successfully:', toolId);
} catch (error) {
console.error('Error registering tool:', toolId, error);
}