@elizaos/plugin-nostr 2.0.0-alpha.8 → 2.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +200 -0
- package/auto-enable.ts +20 -0
- package/dist/src/accounts.d.ts +15 -0
- package/dist/src/accounts.d.ts.map +1 -0
- package/dist/src/accounts.js +139 -0
- package/dist/src/accounts.js.map +1 -0
- package/dist/src/actions/index.d.ts +7 -0
- package/dist/src/actions/index.d.ts.map +1 -0
- package/dist/src/actions/index.js +7 -0
- package/dist/src/actions/index.js.map +1 -0
- package/dist/src/actions/publishProfile.d.ts +6 -0
- package/dist/src/actions/publishProfile.d.ts.map +1 -0
- package/dist/src/actions/publishProfile.js +157 -0
- package/dist/src/actions/publishProfile.js.map +1 -0
- package/dist/src/connector-account-provider.d.ts +20 -0
- package/dist/src/connector-account-provider.d.ts.map +1 -0
- package/dist/src/connector-account-provider.js +78 -0
- package/dist/src/connector-account-provider.js.map +1 -0
- package/dist/src/index.d.ts +19 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +66 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/providers/identityContext.d.ts +6 -0
- package/dist/src/providers/identityContext.d.ts.map +1 -0
- package/dist/src/providers/identityContext.js +69 -0
- package/dist/src/providers/identityContext.js.map +1 -0
- package/dist/src/providers/index.d.ts +5 -0
- package/dist/src/providers/index.d.ts.map +1 -0
- package/dist/src/providers/index.js +5 -0
- package/dist/src/providers/index.js.map +1 -0
- package/dist/src/providers/senderContext.d.ts +6 -0
- package/dist/src/providers/senderContext.d.ts.map +1 -0
- package/dist/src/providers/senderContext.js +64 -0
- package/dist/src/providers/senderContext.js.map +1 -0
- package/dist/src/service.d.ts +116 -0
- package/dist/src/service.d.ts.map +1 -0
- package/dist/src/service.js +915 -0
- package/dist/src/service.js.map +1 -0
- package/dist/src/toon.d.ts +2 -0
- package/dist/src/toon.d.ts.map +1 -0
- package/dist/src/toon.js +18 -0
- package/dist/src/toon.js.map +1 -0
- package/dist/src/types.d.ts +125 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +192 -0
- package/dist/src/types.js.map +1 -0
- package/package.json +25 -10
- package/dist/index.d.ts +0 -1
- package/dist/index.js +0 -876
- package/dist/index.js.map +0 -16
package/dist/index.js.map
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/index.ts", "../src/actions/publishProfile.ts", "../src/types.ts", "../src/actions/sendDm.ts", "../src/providers/identityContext.ts", "../src/providers/senderContext.ts", "../src/service.ts"],
|
|
4
|
-
"sourcesContent": [
|
|
5
|
-
"/**\n * Nostr Plugin for ElizaOS\n *\n * Provides Nostr decentralized messaging integration for ElizaOS agents,\n * supporting encrypted DMs via NIP-04 and profile management.\n */\n\nimport type { IAgentRuntime, Plugin } from \"@elizaos/core\";\nimport { logger } from \"@elizaos/core\";\nimport { publishProfile, sendDm } from \"./actions/index.js\";\nimport {\n identityContextProvider,\n senderContextProvider,\n} from \"./providers/index.js\";\nimport { NostrService } from \"./service.js\";\nimport { DEFAULT_NOSTR_RELAYS } from \"./types.js\";\n\n// Export types\nexport * from \"./types.js\";\n\n// Export service\nexport { NostrService };\n\n// Export actions\nexport { sendDm, publishProfile };\n\n// Export providers\nexport { identityContextProvider, senderContextProvider };\n\n/**\n * Nostr plugin definition\n */\nconst nostrPlugin: Plugin = {\n name: \"nostr\",\n description: \"Nostr decentralized messaging plugin for ElizaOS agents\",\n\n services: [NostrService],\n\n actions: [sendDm, publishProfile],\n\n providers: [identityContextProvider, senderContextProvider],\n\n tests: [],\n\n /**\n * Plugin initialization hook\n */\n init: async (\n config: Record<string, string>,\n _runtime: IAgentRuntime,\n ): Promise<void> => {\n logger.info(\"Initializing Nostr plugin...\");\n\n // Log configuration status\n const hasPrivateKey = Boolean(\n config.NOSTR_PRIVATE_KEY || process.env.NOSTR_PRIVATE_KEY,\n );\n const relaysRaw = config.NOSTR_RELAYS || process.env.NOSTR_RELAYS || \"\";\n const relays = relaysRaw\n ? relaysRaw.split(\",\").length\n : DEFAULT_NOSTR_RELAYS.length;\n\n logger.info(`Nostr plugin configuration:`);\n logger.info(` - Private key configured: ${hasPrivateKey ? \"Yes\" : \"No\"}`);\n logger.info(` - Relays: ${relays} relay(s)`);\n logger.info(\n ` - DM policy: ${config.NOSTR_DM_POLICY || process.env.NOSTR_DM_POLICY || \"pairing\"}`,\n );\n\n if (!hasPrivateKey) {\n logger.warn(\n \"Nostr private key not configured. Set NOSTR_PRIVATE_KEY (hex or nsec format).\",\n );\n }\n\n logger.info(\"Nostr plugin initialized\");\n },\n};\n\nexport default nostrPlugin;\n",
|
|
6
|
-
"/**\n * Publish profile action for Nostr plugin.\n */\n\nimport {\n type Action,\n type ActionResult,\n composePromptFromState,\n type IAgentRuntime,\n type Memory,\n ModelType,\n parseJSONObjectFromText,\n type State,\n} from \"@elizaos/core\";\nimport type { NostrService } from \"../service.js\";\nimport { NOSTR_SERVICE_NAME, type NostrProfile } from \"../types.js\";\n\nconst PUBLISH_PROFILE_TEMPLATE = `# Task: Extract Nostr profile data\nBased on the conversation, determine what profile information to update.\n\nRecent conversation:\n{{recentMessages}}\n\nExtract any of the following profile fields that should be updated:\n- name: Display name\n- about: Bio/description\n- picture: Profile picture URL\n- banner: Banner image URL\n- nip05: Nostr verification (user@domain.com)\n- lud16: Lightning address (user@domain.com)\n- website: Website URL\n\nRespond with a JSON object containing only the fields to update:\n\\`\\`\\`json\n{\n \"name\": \"optional name\",\n \"about\": \"optional bio\"\n}\n\\`\\`\\``;\n\nexport const publishProfile: Action = {\n name: \"NOSTR_PUBLISH_PROFILE\",\n similes: [\"UPDATE_NOSTR_PROFILE\", \"SET_NOSTR_PROFILE\", \"NOSTR_PROFILE\"],\n description: \"Publish or update the bot's Nostr profile (kind:0 metadata)\",\n\n validate: async (\n _runtime: IAgentRuntime,\n message: Memory,\n _state?: State,\n ): Promise<boolean> => {\n return message.content.source === \"nostr\";\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state?: State,\n _options?: Record<string, unknown>,\n callback?: (response: { text: string; source?: string }) => void,\n ): Promise<ActionResult> => {\n const nostrService = runtime.getService<NostrService>(NOSTR_SERVICE_NAME);\n\n if (!nostrService || !nostrService.isConnected()) {\n if (callback) {\n callback({ text: \"Nostr service is not available.\", source: \"nostr\" });\n }\n return { success: false, error: \"Nostr service not available\" };\n }\n\n // Get or compose state\n const currentState = state ?? (await runtime.composeState(message));\n\n // Compose prompt\n const prompt = await composePromptFromState({\n template: PUBLISH_PROFILE_TEMPLATE,\n state: currentState,\n });\n\n // Extract parameters using LLM\n let profileInfo: NostrProfile | null = null;\n for (let attempt = 0; attempt < 3; attempt++) {\n const response = await runtime.useModel(ModelType.TEXT_SMALL, {\n prompt,\n });\n\n const parsed = parseJSONObjectFromText(String(response));\n if (parsed) {\n profileInfo = {\n name: parsed.name ? String(parsed.name) : undefined,\n displayName: parsed.displayName\n ? String(parsed.displayName)\n : undefined,\n about: parsed.about ? String(parsed.about) : undefined,\n picture: parsed.picture ? String(parsed.picture) : undefined,\n banner: parsed.banner ? String(parsed.banner) : undefined,\n nip05: parsed.nip05 ? String(parsed.nip05) : undefined,\n lud16: parsed.lud16 ? String(parsed.lud16) : undefined,\n website: parsed.website ? String(parsed.website) : undefined,\n };\n break;\n }\n }\n\n if (!profileInfo) {\n if (callback) {\n callback({\n text: \"I couldn't understand the profile information. Please try again.\",\n source: \"nostr\",\n });\n }\n return { success: false, error: \"Could not extract profile parameters\" };\n }\n\n // Publish profile\n const result = await nostrService.publishProfile(profileInfo);\n\n if (!result.success) {\n if (callback) {\n callback({\n text: `Failed to publish profile: ${result.error}`,\n source: \"nostr\",\n });\n }\n return { success: false, error: result.error };\n }\n\n if (callback) {\n callback({\n text: \"Profile published successfully.\",\n source: message.content.source as string,\n });\n }\n\n return {\n success: true,\n data: {\n eventId: result.eventId,\n relays: result.relays,\n profile: profileInfo,\n },\n };\n },\n\n examples: [\n [\n {\n name: \"{{user1}}\",\n content: { text: \"Update your profile name to 'Bot Assistant'\" },\n },\n {\n name: \"{{agent}}\",\n content: {\n text: \"I'll update my Nostr profile.\",\n actions: [\"NOSTR_PUBLISH_PROFILE\"],\n },\n },\n ],\n ],\n};\n",
|
|
7
|
-
"/**\n * Type definitions for the Nostr plugin.\n */\n\nimport type { Service } from \"@elizaos/core\";\nimport { nip19 } from \"nostr-tools\";\n\n/** Maximum message length for Nostr DMs */\nexport const MAX_NOSTR_MESSAGE_LENGTH = 4000;\n\n/** Nostr service name */\nexport const NOSTR_SERVICE_NAME = \"nostr\";\n\n/** Default Nostr relays */\nexport const DEFAULT_NOSTR_RELAYS = [\n \"wss://relay.damus.io\",\n \"wss://nos.lol\",\n \"wss://relay.nostr.band\",\n];\n\n/** Event types emitted by the Nostr plugin */\nexport enum NostrEventTypes {\n MESSAGE_RECEIVED = \"NOSTR_MESSAGE_RECEIVED\",\n MESSAGE_SENT = \"NOSTR_MESSAGE_SENT\",\n RELAY_CONNECTED = \"NOSTR_RELAY_CONNECTED\",\n RELAY_DISCONNECTED = \"NOSTR_RELAY_DISCONNECTED\",\n PROFILE_PUBLISHED = \"NOSTR_PROFILE_PUBLISHED\",\n CONNECTION_READY = \"NOSTR_CONNECTION_READY\",\n}\n\n/** DM policy types */\nexport type NostrDmPolicy = \"open\" | \"pairing\" | \"allowlist\" | \"disabled\";\n\n/** Nostr profile data (kind:0) */\nexport interface NostrProfile {\n name?: string;\n displayName?: string;\n about?: string;\n picture?: string;\n banner?: string;\n nip05?: string;\n lud16?: string;\n website?: string;\n}\n\n/** Configuration settings for the Nostr plugin */\nexport interface NostrSettings {\n /** Private key in hex or nsec format */\n privateKey: string;\n /** Public key (derived from private key) */\n publicKey: string;\n /** List of relay WebSocket URLs */\n relays: string[];\n /** DM policy */\n dmPolicy: NostrDmPolicy;\n /** Allowed pubkeys for DMs */\n allowFrom: string[];\n /** Profile data */\n profile?: NostrProfile;\n /** Whether the plugin is enabled */\n enabled: boolean;\n}\n\n/** Nostr event (kind:4 for DMs) */\nexport interface NostrMessage {\n id: string;\n pubkey: string;\n content: string;\n created_at: number;\n kind: number;\n tags: string[][];\n sig: string;\n}\n\n/** Options for sending a DM */\nexport interface NostrDmSendOptions {\n /** Target pubkey (hex or npub) */\n toPubkey: string;\n /** Message text */\n text: string;\n}\n\n/** Result from sending a DM */\nexport interface NostrSendResult {\n success: boolean;\n eventId?: string;\n relays?: string[];\n error?: string;\n}\n\n/** Nostr service interface */\nexport interface INostrService extends Service {\n /** Check if the service is connected */\n isConnected(): boolean;\n\n /** Get the bot's public key in hex format */\n getPublicKey(): string;\n\n /** Get the bot's public key in npub format */\n getNpub(): string;\n\n /** Get connected relays */\n getRelays(): string[];\n\n /** Send a DM to a pubkey */\n sendDm(options: NostrDmSendOptions): Promise<NostrSendResult>;\n\n /** Publish profile (kind:0) */\n publishProfile(profile: NostrProfile): Promise<NostrSendResult>;\n}\n\n// Custom error classes\n\n/** Base error class for Nostr plugin errors */\nexport class NostrPluginError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly cause?: Error,\n ) {\n super(message);\n this.name = \"NostrPluginError\";\n }\n}\n\n/** Configuration error */\nexport class NostrConfigurationError extends NostrPluginError {\n public readonly setting?: string;\n\n constructor(message: string, setting?: string, cause?: Error) {\n super(message, \"CONFIGURATION_ERROR\", cause);\n this.name = \"NostrConfigurationError\";\n this.setting = setting;\n }\n}\n\n/** Relay error */\nexport class NostrRelayError extends NostrPluginError {\n public readonly relay?: string;\n\n constructor(message: string, relay?: string, cause?: Error) {\n super(message, \"RELAY_ERROR\", cause);\n this.name = \"NostrRelayError\";\n this.relay = relay;\n }\n}\n\n/** Cryptography error */\nexport class NostrCryptoError extends NostrPluginError {\n constructor(message: string, cause?: Error) {\n super(message, \"CRYPTO_ERROR\", cause);\n this.name = \"NostrCryptoError\";\n }\n}\n\n// Utility functions\n\n/** Check if a string is a valid Nostr pubkey (hex or npub) */\nexport function isValidPubkey(input: string): boolean {\n if (typeof input !== \"string\") {\n return false;\n }\n const trimmed = input.trim();\n\n // npub format\n if (trimmed.startsWith(\"npub1\")) {\n try {\n const decoded = nip19.decode(trimmed);\n return decoded.type === \"npub\";\n } catch {\n return false;\n }\n }\n\n // Hex format\n return /^[0-9a-fA-F]{64}$/.test(trimmed);\n}\n\n/** Normalize a pubkey to hex format (accepts npub or hex) */\nexport function normalizePubkey(input: string): string {\n const trimmed = input.trim();\n\n // npub format - decode to hex\n if (trimmed.startsWith(\"npub1\")) {\n const decoded = nip19.decode(trimmed);\n if (decoded.type !== \"npub\") {\n throw new NostrCryptoError(\"Invalid npub key\");\n }\n // Convert Uint8Array to hex string\n const data = decoded.data as unknown as Uint8Array;\n return Array.from(data)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n }\n\n // Already hex - validate and return lowercase\n if (!/^[0-9a-fA-F]{64}$/.test(trimmed)) {\n throw new NostrCryptoError(\n \"Pubkey must be 64 hex characters or npub format\",\n );\n }\n return trimmed.toLowerCase();\n}\n\n/** Convert a hex pubkey to npub format */\nexport function pubkeyToNpub(hexPubkey: string): string {\n const normalized = normalizePubkey(hexPubkey);\n return nip19.npubEncode(normalized);\n}\n\n/** Validate and normalize a private key (accepts hex or nsec format) */\nexport function validatePrivateKey(key: string): Uint8Array {\n const trimmed = key.trim();\n\n // Handle nsec (bech32) format\n if (trimmed.startsWith(\"nsec1\")) {\n const decoded = nip19.decode(trimmed);\n if (decoded.type !== \"nsec\") {\n throw new NostrCryptoError(\"Invalid nsec key: wrong type\");\n }\n return decoded.data as unknown as Uint8Array;\n }\n\n // Handle hex format\n if (!/^[0-9a-fA-F]{64}$/.test(trimmed)) {\n throw new NostrCryptoError(\n \"Private key must be 64 hex characters or nsec bech32 format\",\n );\n }\n\n // Convert hex string to Uint8Array\n const bytes = new Uint8Array(32);\n for (let i = 0; i < 32; i++) {\n bytes[i] = parseInt(trimmed.slice(i * 2, i * 2 + 2), 16);\n }\n return bytes;\n}\n\n/** Get display name for a pubkey */\nexport function getPubkeyDisplayName(pubkey: string): string {\n const normalized = normalizePubkey(pubkey);\n return `${normalized.slice(0, 8)}...${normalized.slice(-8)}`;\n}\n\n/** Split long text into chunks for Nostr */\nexport function splitMessageForNostr(\n text: string,\n maxLength: number = MAX_NOSTR_MESSAGE_LENGTH,\n): string[] {\n if (text.length <= maxLength) {\n return [text];\n }\n\n const chunks: string[] = [];\n let remaining = text;\n\n while (remaining.length > 0) {\n if (remaining.length <= maxLength) {\n chunks.push(remaining);\n break;\n }\n\n // Find a good break point\n let breakPoint = maxLength;\n const newlineIndex = remaining.lastIndexOf(\"\\n\", maxLength);\n if (newlineIndex > maxLength * 0.5) {\n breakPoint = newlineIndex + 1;\n } else {\n const spaceIndex = remaining.lastIndexOf(\" \", maxLength);\n if (spaceIndex > maxLength * 0.5) {\n breakPoint = spaceIndex + 1;\n }\n }\n\n chunks.push(remaining.slice(0, breakPoint).trimEnd());\n remaining = remaining.slice(breakPoint).trimStart();\n }\n\n return chunks;\n}\n",
|
|
8
|
-
"/**\n * Send DM action for Nostr plugin.\n */\n\nimport {\n type Action,\n type ActionResult,\n composePromptFromState,\n type IAgentRuntime,\n logger,\n type Memory,\n ModelType,\n parseJSONObjectFromText,\n type State,\n} from \"@elizaos/core\";\nimport type { NostrService } from \"../service.js\";\nimport {\n isValidPubkey,\n NOSTR_SERVICE_NAME,\n normalizePubkey,\n splitMessageForNostr,\n} from \"../types.js\";\n\ninterface SendDmParams {\n text: string;\n toPubkey: string;\n}\n\nconst SEND_DM_TEMPLATE = `# Task: Extract Nostr DM parameters\nBased on the conversation, determine what message to send and to whom.\n\nRecent conversation:\n{{recentMessages}}\n\nExtract the following:\n- text: The message content to send\n- toPubkey: The target pubkey (npub or hex format, or \"current\" for the current conversation)\n\nRespond with a JSON object:\n\\`\\`\\`json\n{\n \"text\": \"message content here\",\n \"toPubkey\": \"npub1... or hex pubkey or current\"\n}\n\\`\\`\\``;\n\nexport const sendDm: Action = {\n name: \"NOSTR_SEND_DM\",\n similes: [\"SEND_NOSTR_DM\", \"NOSTR_MESSAGE\", \"NOSTR_TEXT\", \"DM_NOSTR\"],\n description: \"Send an encrypted direct message via Nostr (NIP-04)\",\n\n validate: async (\n _runtime: IAgentRuntime,\n message: Memory,\n _state?: State,\n ): Promise<boolean> => {\n return message.content.source === \"nostr\";\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state?: State,\n _options?: Record<string, unknown>,\n callback?: (response: { text: string; source?: string }) => void,\n ): Promise<ActionResult> => {\n const nostrService = runtime.getService<NostrService>(NOSTR_SERVICE_NAME);\n\n if (!nostrService || !nostrService.isConnected()) {\n if (callback) {\n callback({ text: \"Nostr service is not available.\", source: \"nostr\" });\n }\n return { success: false, error: \"Nostr service not available\" };\n }\n\n // Get or compose state\n const currentState = state ?? (await runtime.composeState(message));\n\n // Compose prompt\n const prompt = await composePromptFromState({\n template: SEND_DM_TEMPLATE,\n state: currentState,\n });\n\n // Extract parameters using LLM\n let dmInfo: SendDmParams | null = null;\n for (let attempt = 0; attempt < 3; attempt++) {\n const response = await runtime.useModel(ModelType.TEXT_SMALL, {\n prompt,\n });\n\n const parsed = parseJSONObjectFromText(String(response));\n if (parsed?.text) {\n dmInfo = {\n text: String(parsed.text),\n toPubkey: String(parsed.toPubkey || \"current\"),\n };\n break;\n }\n }\n\n if (!dmInfo || !dmInfo.text) {\n if (callback) {\n callback({\n text: \"I couldn't understand what message you want me to send. Please try again.\",\n source: \"nostr\",\n });\n }\n return { success: false, error: \"Could not extract message parameters\" };\n }\n\n // Determine target pubkey\n let targetPubkey: string | undefined;\n if (dmInfo.toPubkey && dmInfo.toPubkey !== \"current\") {\n if (isValidPubkey(dmInfo.toPubkey)) {\n try {\n targetPubkey = normalizePubkey(dmInfo.toPubkey);\n } catch {\n // Invalid pubkey format\n }\n }\n }\n\n // Get pubkey from state context if available\n if (!targetPubkey && currentState?.data?.senderPubkey) {\n targetPubkey = currentState.data.senderPubkey as string;\n }\n\n if (!targetPubkey) {\n if (callback) {\n callback({\n text: \"I couldn't determine who to send the message to. Please specify a pubkey.\",\n source: \"nostr\",\n });\n }\n return { success: false, error: \"Could not determine target pubkey\" };\n }\n\n // Split message if too long\n const chunks = splitMessageForNostr(dmInfo.text);\n\n // Send message(s)\n let lastResult: { eventId?: string; relays?: string[] } | undefined;\n for (const chunk of chunks) {\n const result = await nostrService.sendDm({\n toPubkey: targetPubkey,\n text: chunk,\n });\n\n if (!result.success) {\n if (callback) {\n callback({\n text: `Failed to send message: ${result.error}`,\n source: \"nostr\",\n });\n }\n return { success: false, error: result.error };\n }\n\n lastResult = { eventId: result.eventId, relays: result.relays };\n logger.debug(`Sent Nostr DM: ${result.eventId}`);\n }\n\n if (callback) {\n callback({\n text: \"Message sent successfully.\",\n source: message.content.source as string,\n });\n }\n\n return {\n success: true,\n data: {\n toPubkey: targetPubkey,\n eventId: lastResult?.eventId,\n relays: lastResult?.relays,\n chunksCount: chunks.length,\n },\n };\n },\n\n examples: [\n [\n {\n name: \"{{user1}}\",\n content: { text: \"Send them a message saying 'Hello!'\" },\n },\n {\n name: \"{{agent}}\",\n content: {\n text: \"I'll send that DM via Nostr.\",\n actions: [\"NOSTR_SEND_DM\"],\n },\n },\n ],\n [\n {\n name: \"{{user1}}\",\n content: { text: \"Message npub1abc... saying 'Thanks for the zap!'\" },\n },\n {\n name: \"{{agent}}\",\n content: {\n text: \"I'll send that message to the specified pubkey.\",\n actions: [\"NOSTR_SEND_DM\"],\n },\n },\n ],\n ],\n};\n",
|
|
9
|
-
"/**\n * Identity context provider for Nostr plugin.\n */\n\nimport type {\n IAgentRuntime,\n Memory,\n Provider,\n ProviderResult,\n State,\n} from \"@elizaos/core\";\nimport type { NostrService } from \"../service.js\";\nimport { NOSTR_SERVICE_NAME } from \"../types.js\";\n\nexport const identityContextProvider: Provider = {\n name: \"nostrIdentityContext\",\n description: \"Provides information about the bot's Nostr identity\",\n\n get: async (\n runtime: IAgentRuntime,\n message: Memory,\n state: State,\n ): Promise<ProviderResult> => {\n // Only provide context for Nostr messages\n if (message.content.source !== \"nostr\") {\n return {\n data: {},\n values: {},\n text: \"\",\n };\n }\n\n const nostrService = runtime.getService<NostrService>(NOSTR_SERVICE_NAME);\n\n if (!nostrService || !nostrService.isConnected()) {\n return {\n data: { connected: false },\n values: { connected: false },\n text: \"\",\n };\n }\n\n const agentName = state?.agentName || \"The agent\";\n const publicKey = nostrService.getPublicKey();\n const npub = nostrService.getNpub();\n const relays = nostrService.getRelays();\n\n const responseText =\n `${agentName} is connected to Nostr with pubkey ${npub}. ` +\n `Connected to ${relays.length} relay(s): ${relays.join(\", \")}. ` +\n `Nostr is a decentralized social protocol using cryptographic keys for identity.`;\n\n return {\n data: {\n publicKey,\n npub,\n relays,\n relayCount: relays.length,\n connected: true,\n },\n values: {\n publicKey,\n npub,\n relayCount: relays.length,\n },\n text: responseText,\n };\n },\n};\n",
|
|
10
|
-
"/**\n * Sender context provider for Nostr plugin.\n */\n\nimport type {\n IAgentRuntime,\n Memory,\n Provider,\n ProviderResult,\n State,\n} from \"@elizaos/core\";\nimport type { NostrService } from \"../service.js\";\nimport {\n getPubkeyDisplayName,\n NOSTR_SERVICE_NAME,\n pubkeyToNpub,\n} from \"../types.js\";\n\nexport const senderContextProvider: Provider = {\n name: \"nostrSenderContext\",\n description:\n \"Provides information about the Nostr user in the current conversation\",\n\n get: async (\n runtime: IAgentRuntime,\n message: Memory,\n state: State,\n ): Promise<ProviderResult> => {\n // Only provide context for Nostr messages\n if (message.content.source !== \"nostr\") {\n return {\n data: {},\n values: {},\n text: \"\",\n };\n }\n\n const nostrService = runtime.getService<NostrService>(NOSTR_SERVICE_NAME);\n\n if (!nostrService || !nostrService.isConnected()) {\n return {\n data: { connected: false },\n values: { connected: false },\n text: \"\",\n };\n }\n\n const agentName = state?.agentName || \"The agent\";\n\n // Get sender pubkey from state if available\n const senderPubkey = state?.data?.senderPubkey as string | undefined;\n\n if (!senderPubkey) {\n return {\n data: { connected: true },\n values: { connected: true },\n text: \"\",\n };\n }\n\n let senderNpub = \"\";\n try {\n senderNpub = pubkeyToNpub(senderPubkey);\n } catch {\n // Use hex if npub conversion fails\n }\n\n const displayName = getPubkeyDisplayName(senderPubkey);\n\n const responseText =\n `${agentName} is talking to ${displayName} on Nostr. ` +\n `Their pubkey is ${senderNpub || senderPubkey}. ` +\n `This is an encrypted direct message conversation using NIP-04.`;\n\n return {\n data: {\n senderPubkey,\n senderNpub,\n displayName,\n isEncrypted: true,\n },\n values: {\n senderPubkey,\n senderNpub,\n displayName,\n },\n text: responseText,\n };\n },\n};\n",
|
|
11
|
-
"/**\n * Nostr service implementation for ElizaOS.\n */\n\nimport {\n type EventPayload,\n type IAgentRuntime,\n logger,\n Service,\n} from \"@elizaos/core\";\nimport {\n type Event,\n finalizeEvent,\n getPublicKey,\n SimplePool,\n verifyEvent,\n} from \"nostr-tools\";\nimport { decrypt, encrypt } from \"nostr-tools/nip04\";\nimport {\n DEFAULT_NOSTR_RELAYS,\n type INostrService,\n NOSTR_SERVICE_NAME,\n NostrConfigurationError,\n type NostrDmPolicy,\n type NostrDmSendOptions,\n NostrEventTypes,\n type NostrProfile,\n type NostrSendResult,\n type NostrSettings,\n normalizePubkey,\n pubkeyToNpub,\n validatePrivateKey,\n} from \"./types.js\";\n\nexport class NostrService extends Service implements INostrService {\n static serviceType = NOSTR_SERVICE_NAME;\n capabilityDescription =\n \"Provides Nostr protocol integration for encrypted direct messages\";\n\n private settings: NostrSettings | null = null;\n private pool: SimplePool | null = null;\n private privateKey: Uint8Array | null = null;\n private connected = false;\n private seenEventIds = new Set<string>();\n\n /**\n * Start the Nostr service.\n */\n static async start(runtime: IAgentRuntime): Promise<NostrService> {\n logger.info(\"Starting Nostr service...\");\n const service = new NostrService(runtime);\n await service.initialize();\n return service;\n }\n\n /**\n * Initialize the service.\n */\n private async initialize(): Promise<void> {\n this.settings = this.loadSettings();\n this.validateSettings();\n\n // Initialize private key\n this.privateKey = validatePrivateKey(this.settings.privateKey);\n\n // Initialize SimplePool\n this.pool = new SimplePool();\n\n // Start subscription\n await this.startSubscription();\n\n this.connected = true;\n logger.info(\n `Nostr service started (pubkey: ${this.settings.publicKey.slice(0, 16)}...)`,\n );\n this.runtime.emitEvent(NostrEventTypes.CONNECTION_READY, {\n runtime: this.runtime,\n service: this,\n } as EventPayload);\n }\n\n /**\n * Stop the Nostr service.\n */\n async stop(): Promise<void> {\n logger.info(\"Stopping Nostr service...\");\n this.connected = false;\n\n if (this.pool) {\n this.pool.close(this.settings?.relays || []);\n this.pool = null;\n }\n\n this.privateKey = null;\n this.seenEventIds.clear();\n logger.info(\"Nostr service stopped\");\n }\n\n /**\n * Load settings from runtime configuration.\n */\n private loadSettings(): NostrSettings {\n const runtime = this.runtime;\n if (!runtime) {\n throw new NostrConfigurationError(\"Runtime not initialized\");\n }\n\n const privateKeySetting = runtime.getSetting(\"NOSTR_PRIVATE_KEY\");\n const privateKey =\n typeof privateKeySetting === \"string\"\n ? privateKeySetting\n : process.env.NOSTR_PRIVATE_KEY || \"\";\n\n const relaysRawSetting = runtime.getSetting(\"NOSTR_RELAYS\");\n const relaysRaw =\n typeof relaysRawSetting === \"string\"\n ? relaysRawSetting\n : process.env.NOSTR_RELAYS || \"\";\n\n const dmPolicySetting = runtime.getSetting(\"NOSTR_DM_POLICY\");\n const dmPolicy = (\n typeof dmPolicySetting === \"string\"\n ? dmPolicySetting\n : process.env.NOSTR_DM_POLICY || \"pairing\"\n ) as NostrDmPolicy;\n\n const allowFromRawSetting = runtime.getSetting(\"NOSTR_ALLOW_FROM\");\n const allowFromRaw =\n typeof allowFromRawSetting === \"string\"\n ? allowFromRawSetting\n : process.env.NOSTR_ALLOW_FROM || \"\";\n\n const enabledSetting = runtime.getSetting(\"NOSTR_ENABLED\");\n const enabled =\n typeof enabledSetting === \"string\"\n ? enabledSetting\n : process.env.NOSTR_ENABLED || \"true\";\n\n // Parse relays\n const relays = relaysRaw\n ? relaysRaw\n .split(\",\")\n .map((r: string) => r.trim())\n .filter(Boolean)\n : DEFAULT_NOSTR_RELAYS;\n\n // Parse allow list\n const allowFrom = allowFromRaw\n ? allowFromRaw\n .split(\",\")\n .map((p: string) => {\n try {\n return normalizePubkey(p.trim());\n } catch {\n return p.trim();\n }\n })\n .filter(Boolean)\n : [];\n\n // Derive public key\n let publicKey = \"\";\n if (privateKey) {\n try {\n const sk = validatePrivateKey(privateKey);\n publicKey = getPublicKey(sk);\n } catch {\n // Will be caught in validation\n }\n }\n\n return {\n privateKey,\n publicKey,\n relays,\n dmPolicy,\n allowFrom,\n enabled: enabled.toLowerCase() !== \"false\",\n };\n }\n\n /**\n * Validate the settings.\n */\n private validateSettings(): void {\n const settings = this.settings;\n if (!settings) {\n throw new NostrConfigurationError(\"Settings not loaded\");\n }\n\n if (!settings.privateKey) {\n throw new NostrConfigurationError(\n \"NOSTR_PRIVATE_KEY is required\",\n \"NOSTR_PRIVATE_KEY\",\n );\n }\n\n if (!settings.publicKey) {\n throw new NostrConfigurationError(\n \"Invalid private key - could not derive public key\",\n \"NOSTR_PRIVATE_KEY\",\n );\n }\n\n if (settings.relays.length === 0) {\n throw new NostrConfigurationError(\n \"At least one relay is required\",\n \"NOSTR_RELAYS\",\n );\n }\n\n // Validate relay URLs\n for (const relay of settings.relays) {\n if (!relay.startsWith(\"wss://\") && !relay.startsWith(\"ws://\")) {\n throw new NostrConfigurationError(\n `Invalid relay URL: ${relay}`,\n \"NOSTR_RELAYS\",\n );\n }\n }\n }\n\n /**\n * Start the DM subscription.\n */\n private async startSubscription(): Promise<void> {\n const settings = this.settings;\n const pool = this.pool;\n const privateKey = this.privateKey;\n\n if (!settings || !pool || !privateKey) {\n throw new NostrConfigurationError(\"Service not properly initialized\");\n }\n\n const pk = settings.publicKey;\n const since = Math.floor(Date.now() / 1000) - 120; // Last 2 minutes\n\n // Subscribe to DMs (kind:4)\n const filter = { kinds: [4], \"#p\": [pk], since };\n pool.subscribeMany(\n settings.relays,\n [filter] as unknown as Parameters<typeof pool.subscribeMany>[1],\n {\n onevent: async (event: Event) => {\n await this.handleEvent(event);\n },\n oneose: () => {\n logger.debug(\"Nostr EOSE received - initial sync complete\");\n },\n },\n );\n\n logger.info(`Subscribed to ${settings.relays.length} relay(s)`);\n }\n\n /**\n * Handle an incoming event.\n */\n private async handleEvent(event: Event): Promise<void> {\n const settings = this.settings;\n const privateKey = this.privateKey;\n\n if (!settings || !privateKey) {\n return;\n }\n\n // Dedupe\n if (this.seenEventIds.has(event.id)) {\n return;\n }\n this.seenEventIds.add(event.id);\n\n // Limit seen set size\n if (this.seenEventIds.size > 10000) {\n const toDelete = Array.from(this.seenEventIds).slice(0, 5000);\n for (const id of toDelete) {\n this.seenEventIds.delete(id);\n }\n }\n\n // Skip self-messages\n if (event.pubkey === settings.publicKey) {\n return;\n }\n\n // Verify signature\n if (!verifyEvent(event)) {\n logger.warn(`Invalid signature on event ${event.id}`);\n return;\n }\n\n // Check if this is addressed to us\n const isToUs = event.tags.some(\n (t) => t[0] === \"p\" && t[1] === settings.publicKey,\n );\n if (!isToUs) {\n return;\n }\n\n // Check DM policy\n if (settings.dmPolicy === \"disabled\") {\n logger.debug(`DM from ${event.pubkey} blocked - DMs disabled`);\n return;\n }\n\n if (settings.dmPolicy === \"allowlist\") {\n const allowed = settings.allowFrom.includes(event.pubkey);\n if (!allowed) {\n logger.debug(`DM from ${event.pubkey} blocked - not in allowlist`);\n return;\n }\n }\n\n // Decrypt the message\n let plaintext: string;\n try {\n plaintext = decrypt(privateKey, event.pubkey, event.content);\n } catch (err) {\n logger.warn(`Failed to decrypt DM from ${event.pubkey}: ${err}`);\n return;\n }\n\n logger.debug(\n `Received DM from ${event.pubkey.slice(0, 8)}...: ${plaintext.slice(0, 50)}...`,\n );\n\n // Emit event\n if (this.runtime) {\n this.runtime.emitEvent(NostrEventTypes.MESSAGE_RECEIVED, {\n runtime: this.runtime,\n from: event.pubkey,\n text: plaintext,\n eventId: event.id,\n createdAt: event.created_at,\n } as EventPayload);\n }\n }\n\n /**\n * Check if the service is connected.\n */\n isConnected(): boolean {\n return this.connected;\n }\n\n /**\n * Get the bot's public key in hex format.\n */\n getPublicKey(): string {\n return this.settings?.publicKey || \"\";\n }\n\n /**\n * Get the bot's public key in npub format.\n */\n getNpub(): string {\n const pk = this.getPublicKey();\n return pk ? pubkeyToNpub(pk) : \"\";\n }\n\n /**\n * Get connected relays.\n */\n getRelays(): string[] {\n return this.settings?.relays || [];\n }\n\n /**\n * Send a DM to a pubkey.\n */\n async sendDm(options: NostrDmSendOptions): Promise<NostrSendResult> {\n const settings = this.settings;\n const pool = this.pool;\n const privateKey = this.privateKey;\n\n if (!settings || !pool || !privateKey) {\n return {\n success: false,\n error: \"Service not initialized\",\n };\n }\n\n // Normalize the target pubkey\n let toPubkey: string;\n try {\n toPubkey = normalizePubkey(options.toPubkey);\n } catch (err) {\n return {\n success: false,\n error: `Invalid target pubkey: ${err}`,\n };\n }\n\n // Encrypt the message\n let ciphertext: string;\n try {\n ciphertext = encrypt(privateKey, toPubkey, options.text);\n } catch (err) {\n return {\n success: false,\n error: `Encryption failed: ${err}`,\n };\n }\n\n // Create the event\n const event = finalizeEvent(\n {\n kind: 4,\n content: ciphertext,\n tags: [[\"p\", toPubkey]],\n created_at: Math.floor(Date.now() / 1000),\n },\n privateKey,\n );\n\n // Publish to relays\n const successRelays: string[] = [];\n const errors: string[] = [];\n\n for (const relay of settings.relays) {\n try {\n await pool.publish([relay], event);\n successRelays.push(relay);\n } catch (err) {\n errors.push(`${relay}: ${err}`);\n }\n }\n\n if (successRelays.length === 0) {\n return {\n success: false,\n error: `Failed to publish to any relay: ${errors.join(\"; \")}`,\n };\n }\n\n logger.debug(\n `DM sent to ${toPubkey.slice(0, 8)}... via ${successRelays.length} relay(s)`,\n );\n\n if (this.runtime) {\n this.runtime.emitEvent(NostrEventTypes.MESSAGE_SENT, {\n runtime: this.runtime,\n to: toPubkey,\n eventId: event.id,\n relays: successRelays,\n } as EventPayload);\n }\n\n return {\n success: true,\n eventId: event.id,\n relays: successRelays,\n };\n }\n\n /**\n * Publish profile (kind:0).\n */\n async publishProfile(profile: NostrProfile): Promise<NostrSendResult> {\n const settings = this.settings;\n const pool = this.pool;\n const privateKey = this.privateKey;\n\n if (!settings || !pool || !privateKey) {\n return {\n success: false,\n error: \"Service not initialized\",\n };\n }\n\n // Build profile content\n const content = JSON.stringify({\n name: profile.name,\n display_name: profile.displayName,\n about: profile.about,\n picture: profile.picture,\n banner: profile.banner,\n nip05: profile.nip05,\n lud16: profile.lud16,\n website: profile.website,\n });\n\n // Create the event\n const event = finalizeEvent(\n {\n kind: 0,\n content,\n tags: [],\n created_at: Math.floor(Date.now() / 1000),\n },\n privateKey,\n );\n\n // Publish to relays\n const successRelays: string[] = [];\n const errors: string[] = [];\n\n for (const relay of settings.relays) {\n try {\n await pool.publish([relay], event);\n successRelays.push(relay);\n } catch (err) {\n errors.push(`${relay}: ${err}`);\n }\n }\n\n if (successRelays.length === 0) {\n return {\n success: false,\n error: `Failed to publish profile to any relay: ${errors.join(\"; \")}`,\n };\n }\n\n logger.info(`Profile published via ${successRelays.length} relay(s)`);\n\n if (this.runtime) {\n this.runtime.emitEvent(NostrEventTypes.PROFILE_PUBLISHED, {\n runtime: this.runtime,\n eventId: event.id,\n relays: successRelays,\n } as EventPayload);\n }\n\n return {\n success: true,\n eventId: event.id,\n relays: successRelays,\n };\n }\n\n /**\n * Get the settings.\n */\n getSettings(): NostrSettings | null {\n return this.settings;\n }\n}\n"
|
|
12
|
-
],
|
|
13
|
-
"mappings": "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",
|
|
14
|
-
"debugId": "210FEFBBF268CA8064756E2164756E21",
|
|
15
|
-
"names": []
|
|
16
|
-
}
|