import type { ClawdbotPluginApi, ClawdbotConfig } from "clawdbot/plugin-sdk"; import { emptyPluginConfigSchema } from "clawdbot/plugin-sdk"; import { nostrPlugin } from "./src/channel.js"; import { setNostrRuntime, getNostrRuntime } from "./src/runtime.js"; import { createNostrProfileHttpHandler } from "./src/nostr-profile-http.js"; import { resolveNostrAccount } from "./src/types.js"; import type { NostrProfile } from "./src/config-schema.js"; const plugin = { id: "nostr", name: "Nostr", description: "Nostr DM channel plugin via NIP-04", configSchema: emptyPluginConfigSchema(), register(api: ClawdbotPluginApi) { setNostrRuntime(api.runtime); api.registerChannel({ plugin: nostrPlugin }); // Register HTTP handler for profile management const httpHandler = createNostrProfileHttpHandler({ getConfigProfile: (accountId: string) => { const runtime = getNostrRuntime(); const cfg = runtime.config.loadConfig() as ClawdbotConfig; const account = resolveNostrAccount({ cfg, accountId }); return account.profile; }, updateConfigProfile: async (accountId: string, profile: NostrProfile) => { const runtime = getNostrRuntime(); const cfg = runtime.config.loadConfig() as ClawdbotConfig; // Build the config patch for channels.nostr.profile const channels = (cfg.channels ?? {}) as Record; const nostrConfig = (channels.nostr ?? {}) as Record; const updatedNostrConfig = { ...nostrConfig, profile, }; const updatedChannels = { ...channels, nostr: updatedNostrConfig, }; await runtime.config.writeConfigFile({ ...cfg, channels: updatedChannels, }); }, getAccountInfo: (accountId: string) => { const runtime = getNostrRuntime(); const cfg = runtime.config.loadConfig() as ClawdbotConfig; const account = resolveNostrAccount({ cfg, accountId }); if (!account.configured || !account.publicKey) { return null; } return { pubkey: account.publicKey, relays: account.relays, }; }, log: api.logger, }); api.registerHttpHandler(httpHandler); }, }; export default plugin;