@elizaos/plugin-farcaster 1.7.2 → 2.0.0-alpha.2

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.
Files changed (75) hide show
  1. package/LICENSE +1 -1
  2. package/dist/browser/index.browser.js +16 -0
  3. package/dist/browser/index.browser.js.map +10 -0
  4. package/dist/browser/index.d.ts +2 -0
  5. package/dist/cjs/index.d.ts +2 -0
  6. package/dist/cjs/index.node.cjs +2351 -0
  7. package/dist/cjs/index.node.js.map +34 -0
  8. package/dist/index.d.ts +2 -15
  9. package/dist/node/index.d.ts +2 -0
  10. package/dist/{index.js → node/index.node.js} +1056 -1609
  11. package/dist/node/index.node.js.map +34 -0
  12. package/package.json +67 -46
  13. package/README.md +0 -310
  14. package/dist/__tests__/e2e/scenarios.d.ts +0 -4
  15. package/dist/__tests__/e2e/scenarios.d.ts.map +0 -1
  16. package/dist/__tests__/suite.d.ts +0 -130
  17. package/dist/__tests__/suite.d.ts.map +0 -1
  18. package/dist/__tests__/test-utils.d.ts +0 -29
  19. package/dist/__tests__/test-utils.d.ts.map +0 -1
  20. package/dist/__tests__/types.d.ts +0 -88
  21. package/dist/__tests__/types.d.ts.map +0 -1
  22. package/dist/actions/index.d.ts +0 -4
  23. package/dist/actions/index.d.ts.map +0 -1
  24. package/dist/actions/replyCast.d.ts +0 -3
  25. package/dist/actions/replyCast.d.ts.map +0 -1
  26. package/dist/actions/sendCast.d.ts +0 -3
  27. package/dist/actions/sendCast.d.ts.map +0 -1
  28. package/dist/client.d.ts +0 -26
  29. package/dist/client.d.ts.map +0 -1
  30. package/dist/common/asyncqueue.d.ts +0 -13
  31. package/dist/common/asyncqueue.d.ts.map +0 -1
  32. package/dist/common/callbacks.d.ts +0 -14
  33. package/dist/common/callbacks.d.ts.map +0 -1
  34. package/dist/common/config.d.ts +0 -24
  35. package/dist/common/config.d.ts.map +0 -1
  36. package/dist/common/constants.d.ts +0 -9
  37. package/dist/common/constants.d.ts.map +0 -1
  38. package/dist/common/prompts.d.ts +0 -5
  39. package/dist/common/prompts.d.ts.map +0 -1
  40. package/dist/common/types.d.ts +0 -106
  41. package/dist/common/types.d.ts.map +0 -1
  42. package/dist/common/utils.d.ts +0 -28
  43. package/dist/common/utils.d.ts.map +0 -1
  44. package/dist/events/messageHandler.d.ts +0 -29
  45. package/dist/events/messageHandler.d.ts.map +0 -1
  46. package/dist/index.d.ts.map +0 -1
  47. package/dist/index.js.map +0 -36
  48. package/dist/managers/agent.d.ts +0 -21
  49. package/dist/managers/agent.d.ts.map +0 -1
  50. package/dist/managers/embedManager.d.ts +0 -89
  51. package/dist/managers/embedManager.d.ts.map +0 -1
  52. package/dist/managers/interaction-processor.d.ts +0 -12
  53. package/dist/managers/interaction-processor.d.ts.map +0 -1
  54. package/dist/managers/interaction-source.d.ts +0 -50
  55. package/dist/managers/interaction-source.d.ts.map +0 -1
  56. package/dist/managers/interactions.d.ts +0 -50
  57. package/dist/managers/interactions.d.ts.map +0 -1
  58. package/dist/managers/post.d.ts +0 -24
  59. package/dist/managers/post.d.ts.map +0 -1
  60. package/dist/providers/index.d.ts +0 -5
  61. package/dist/providers/index.d.ts.map +0 -1
  62. package/dist/providers/profileProvider.d.ts +0 -3
  63. package/dist/providers/profileProvider.d.ts.map +0 -1
  64. package/dist/providers/threadProvider.d.ts +0 -3
  65. package/dist/providers/threadProvider.d.ts.map +0 -1
  66. package/dist/providers/timelineProvider.d.ts +0 -3
  67. package/dist/providers/timelineProvider.d.ts.map +0 -1
  68. package/dist/routes/webhook.d.ts +0 -3
  69. package/dist/routes/webhook.d.ts.map +0 -1
  70. package/dist/service.d.ts +0 -31
  71. package/dist/service.d.ts.map +0 -1
  72. package/dist/services/CastService.d.ts +0 -142
  73. package/dist/services/CastService.d.ts.map +0 -1
  74. package/dist/services/MessageService.d.ts +0 -50
  75. package/dist/services/MessageService.d.ts.map +0 -1
package/dist/index.js.map DELETED
@@ -1,36 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/common/constants.ts", "../src/common/types.ts", "../src/common/config.ts", "../src/actions/sendCast.ts", "../src/providers/profileProvider.ts", "../src/providers/timelineProvider.ts", "../src/service.ts", "../src/managers/agent.ts", "../src/client.ts", "../src/common/utils.ts", "../src/managers/post.ts", "../src/common/callbacks.ts", "../src/managers/interactions.ts", "../src/common/asyncqueue.ts", "../src/managers/interaction-source.ts", "../src/managers/embedManager.ts", "../src/services/MessageService.ts", "../src/services/CastService.ts", "../src/__tests__/suite.ts", "../src/__tests__/test-utils.ts", "../src/__tests__/e2e/scenarios.ts", "../src/actions/index.ts", "../src/actions/replyCast.ts", "../src/providers/index.ts", "../src/providers/threadProvider.ts", "../src/routes/webhook.ts", "../src/index.ts"],
4
- "sourcesContent": [
5
- "export const FARCASTER_SERVICE_NAME = 'farcaster';\nexport const FARCASTER_SOURCE = 'farcaster';\nexport const DEFAULT_MAX_CAST_LENGTH = 320;\nexport const DEFAULT_POLL_INTERVAL = 120; // 2 minutes\nexport const DEFAULT_CAST_INTERVAL_MIN = 90; // 1.5 hours\nexport const DEFAULT_CAST_INTERVAL_MAX = 180; // 3 hours\nexport const DEFAULT_CAST_CACHE_TTL = 1000 * 30 * 60; // 30 minutes\nexport const DEFAULT_CAST_CACHE_SIZE = 9000;\n",
6
- "import { type Media, Memory, MessagePayload } from '@elizaos/core';\nimport { DEFAULT_MAX_CAST_LENGTH, DEFAULT_POLL_INTERVAL } from './constants';\n\nimport { Cast as NeynarCast, Embed as NeynarEmbed } from '@neynar/nodejs-sdk/build/api';\nimport { z } from 'zod';\n\nexport type Profile = {\n fid: number;\n name: string;\n username: string;\n pfp?: string;\n bio?: string;\n url?: string;\n};\n\n/**\n * Embed types that can be attached to a cast\n */\nexport type CastEmbed = {\n /** Type of embed: image, video, url, cast (quote), frame */\n type: 'image' | 'video' | 'audio' | 'url' | 'cast' | 'frame' | 'unknown';\n /** URL of the embedded content */\n url: string;\n /** For embedded casts, the cast hash */\n castHash?: string;\n /** Metadata about the embed from Neynar */\n metadata?: {\n contentType?: string;\n width?: number;\n height?: number;\n duration?: number;\n title?: string;\n description?: string;\n authorFid?: number;\n authorUsername?: string;\n };\n};\n\nexport type Cast = {\n hash: string;\n authorFid: number;\n text: string;\n profile: Profile;\n threadId?: string;\n inReplyTo?: {\n hash: string;\n fid: number;\n };\n timestamp: Date;\n stats?: {\n recasts: number;\n replies: number;\n likes: number;\n };\n /** Raw embeds from Neynar API */\n embeds?: NeynarEmbed[];\n /** Processed media attachments ready for elizaos Memory */\n media?: Media[];\n};\n\nexport type CastId = {\n hash: string;\n fid: number;\n};\n\nexport type FidRequest = {\n fid: number;\n pageSize: number;\n};\n\nexport interface LastCast {\n hash: string;\n timestamp: number;\n}\n\n/**\n * This schema defines all required/optional environment settings for Farcaster client\n */\nexport const FarcasterConfigSchema = z.object({\n FARCASTER_DRY_RUN: z\n .union([z.boolean(), z.string()])\n .transform((val) => (typeof val === 'string' ? val.toLowerCase() === 'true' : val)),\n FARCASTER_FID: z.number().int().min(1, 'Farcaster fid is required'),\n MAX_CAST_LENGTH: z.number().int().default(DEFAULT_MAX_CAST_LENGTH),\n FARCASTER_POLL_INTERVAL: z.number().int().default(DEFAULT_POLL_INTERVAL),\n \n // Webhook configuration\n FARCASTER_MODE: z.enum(['polling', 'webhook']).default('polling'),\n ENABLE_CAST: z\n .union([z.boolean(), z.string()])\n .transform((val) => (typeof val === 'string' ? val.toLowerCase() === 'true' : val)),\n CAST_INTERVAL_MIN: z.number().int(),\n CAST_INTERVAL_MAX: z.number().int(),\n ENABLE_ACTION_PROCESSING: z\n .union([z.boolean(), z.string()])\n .transform((val) => (typeof val === 'string' ? val.toLowerCase() === 'true' : val)),\n ACTION_INTERVAL: z.number().int(),\n CAST_IMMEDIATELY: z\n .union([z.boolean(), z.string()])\n .transform((val) => (typeof val === 'string' ? val.toLowerCase() === 'true' : val)),\n MAX_ACTIONS_PROCESSING: z.number().int(),\n FARCASTER_SIGNER_UUID: z.string().min(1, 'FARCASTER_SIGNER_UUID is not set'),\n FARCASTER_NEYNAR_API_KEY: z.string().min(1, 'FARCASTER_NEYNAR_API_KEY is not set'),\n FARCASTER_HUB_URL: z.string().min(1, 'FARCASTER_HUB_URL is not set'),\n});\n\nexport type FarcasterConfig = z.infer<typeof FarcasterConfigSchema>;\n\nexport enum FarcasterEventTypes {\n CAST_GENERATED = 'FARCASTER_CAST_GENERATED',\n MENTION_RECEIVED = 'FARCASTER_MENTION_RECEIVED',\n THREAD_CAST_CREATED = 'FARCASTER_THREAD_CAST_CREATED',\n}\n\nexport enum FarcasterMessageType {\n CAST = 'CAST',\n REPLY = 'REPLY',\n}\n\nexport interface FarcasterGenericCastPayload extends Omit<MessagePayload, 'message'> {\n memory: Memory;\n cast: NeynarCast;\n}\n\n/**\n * Neynar webhook data structure for cast events\n */\nexport interface NeynarWebhookData {\n type: string;\n data?: {\n hash: string;\n text?: string;\n author: {\n fid: number;\n username?: string;\n };\n mentioned_profiles?: Array<{ fid: number }>;\n parent_hash?: string;\n parent_author?: { fid: number };\n };\n}\n",
7
- "import { parseBooleanFromText, type IAgentRuntime } from '@elizaos/core';\nimport { ZodError } from 'zod';\nimport {\n DEFAULT_MAX_CAST_LENGTH,\n DEFAULT_POLL_INTERVAL,\n DEFAULT_CAST_INTERVAL_MAX,\n DEFAULT_CAST_INTERVAL_MIN,\n} from './constants';\nimport { FarcasterConfig, FarcasterConfigSchema } from './types';\n\nfunction safeParseInt(value: string | undefined | null, defaultValue: number): number {\n if (!value) return defaultValue;\n const parsed = Number.parseInt(value, 10);\n return Number.isNaN(parsed) ? defaultValue : Math.max(1, parsed);\n}\n\n/**\n * Gets the Farcaster FID from runtime settings.\n * Uses getSetting which already prioritizes: character.secrets -> character.settings -> env vars\n */\nexport function getFarcasterFid(runtime: IAgentRuntime): number | null {\n const fidStr = runtime.getSetting('FARCASTER_FID');\n if (!fidStr) return null;\n const fid = Number.parseInt(fidStr as string, 10);\n return Number.isNaN(fid) ? null : fid;\n}\n\n/**\n * Checks if Farcaster is properly configured for this runtime.\n * getSetting already handles priority: character.secrets -> character.settings -> env vars\n */\nexport function hasFarcasterEnabled(runtime: IAgentRuntime): boolean {\n const fid = runtime.getSetting('FARCASTER_FID');\n const signerUuid = runtime.getSetting('FARCASTER_SIGNER_UUID');\n const apiKey = runtime.getSetting('FARCASTER_NEYNAR_API_KEY');\n\n runtime.logger.debug(`[hasFarcasterEnabled] FID: ${fid ? 'Found' : 'Missing'}`);\n runtime.logger.debug(`[hasFarcasterEnabled] Signer UUID: ${signerUuid ? 'Found' : 'Missing'}`);\n runtime.logger.debug(`[hasFarcasterEnabled] API Key: ${apiKey ? 'Found' : 'Missing'}`);\n\n return !!(fid && signerUuid && apiKey);\n}\n\n/**\n * Constructs and validates a Farcaster configuration object using runtime settings and environment variables.\n *\n * Retrieves configuration values for the Farcaster client, applying defaults where necessary, and validates them against the {@link FarcasterConfigSchema}. Throws a detailed error if validation fails.\n *\n * @param runtime - The runtime environment providing configuration settings.\n * @returns The validated {@link FarcasterConfig} object.\n *\n * @throws {Error} If configuration validation fails, with details about each invalid field.\n */\nexport function validateFarcasterConfig(runtime: IAgentRuntime): FarcasterConfig {\n const fid = getFarcasterFid(runtime);\n\n try {\n const farcasterConfig = {\n FARCASTER_DRY_RUN:\n runtime.getSetting('FARCASTER_DRY_RUN') ||\n parseBooleanFromText(process.env.FARCASTER_DRY_RUN || 'false'),\n\n FARCASTER_FID: fid ?? undefined,\n\n MAX_CAST_LENGTH: safeParseInt(\n runtime.getSetting('MAX_CAST_LENGTH') as string,\n DEFAULT_MAX_CAST_LENGTH\n ),\n\n FARCASTER_POLL_INTERVAL: safeParseInt(\n runtime.getSetting('FARCASTER_POLL_INTERVAL') as string,\n DEFAULT_POLL_INTERVAL\n ),\n\n ENABLE_CAST:\n runtime.getSetting('ENABLE_CAST') ||\n parseBooleanFromText(process.env.ENABLE_CAST || 'true'),\n\n CAST_INTERVAL_MIN: safeParseInt(\n runtime.getSetting('CAST_INTERVAL_MIN') as string,\n DEFAULT_CAST_INTERVAL_MIN\n ),\n\n CAST_INTERVAL_MAX: safeParseInt(\n runtime.getSetting('CAST_INTERVAL_MAX') as string,\n DEFAULT_CAST_INTERVAL_MAX\n ),\n\n ENABLE_ACTION_PROCESSING:\n runtime.getSetting('ENABLE_ACTION_PROCESSING') ||\n parseBooleanFromText(process.env.ENABLE_ACTION_PROCESSING || 'false'),\n\n ACTION_INTERVAL: safeParseInt(\n runtime.getSetting('ACTION_INTERVAL') as string,\n 5\n ), // 5 minutes\n\n CAST_IMMEDIATELY:\n runtime.getSetting('CAST_IMMEDIATELY') ||\n parseBooleanFromText(process.env.CAST_IMMEDIATELY || 'false'),\n\n MAX_ACTIONS_PROCESSING: safeParseInt(\n runtime.getSetting('MAX_ACTIONS_PROCESSING') as string,\n 1\n ),\n\n FARCASTER_SIGNER_UUID: runtime.getSetting('FARCASTER_SIGNER_UUID'),\n\n FARCASTER_NEYNAR_API_KEY: runtime.getSetting('FARCASTER_NEYNAR_API_KEY'),\n\n FARCASTER_HUB_URL:\n runtime.getSetting('FARCASTER_HUB_URL') || 'hub.pinata.cloud',\n \n // Webhook configuration\n FARCASTER_MODE: runtime.getSetting('FARCASTER_MODE') || 'polling',\n };\n\n runtime.logger.debug(`[validateFarcasterConfig] Resolved FID: ${farcasterConfig.FARCASTER_FID}`);\n runtime.logger.debug(`[validateFarcasterConfig] Resolved Signer UUID: ${farcasterConfig.FARCASTER_SIGNER_UUID ? 'Found' : 'Missing'}`);\n runtime.logger.debug(`[validateFarcasterConfig] Resolved API Key: ${farcasterConfig.FARCASTER_NEYNAR_API_KEY ? 'Found' : 'Missing'}`);\n\n const config = FarcasterConfigSchema.parse(farcasterConfig);\n\n const isDryRun = config.FARCASTER_DRY_RUN;\n\n // Log configuration on initialization\n\n runtime.logger.info('Farcaster Client Configuration:');\n runtime.logger.info(`- FID: ${config.FARCASTER_FID}`);\n runtime.logger.info(`- Dry Run Mode: ${isDryRun ? 'enabled' : 'disabled'}`);\n runtime.logger.info(`- Enable Cast: ${config.ENABLE_CAST ? 'enabled' : 'disabled'}`);\n\n if (config.ENABLE_CAST) {\n runtime.logger.info(\n `- Cast Interval: ${config.CAST_INTERVAL_MIN}-${config.CAST_INTERVAL_MAX} minutes`\n );\n runtime.logger.info(`- Cast Immediately: ${config.CAST_IMMEDIATELY ? 'enabled' : 'disabled'}`);\n }\n runtime.logger.info(`- Action Processing: ${config.ENABLE_ACTION_PROCESSING ? 'enabled' : 'disabled'}`);\n runtime.logger.info(`- Action Interval: ${config.ACTION_INTERVAL} minutes`);\n\n if (isDryRun) {\n runtime.logger.info('Farcaster client initialized in dry run mode - no actual casts should be posted');\n }\n\n return config;\n } catch (error) {\n if (error instanceof ZodError) {\n const errorMessages = error.issues\n .map((err) => `${err.path.join('.')}: ${err.message}`)\n .join('\\n');\n throw new Error(`Farcaster configuration validation failed:\\n${errorMessages}`);\n }\n throw error;\n }\n}\n",
8
- "import {\n type Action,\n type IAgentRuntime,\n type Memory,\n type State,\n createUniqueUuid,\n} from '@elizaos/core';\nimport { FARCASTER_SERVICE_NAME } from '../common/constants';\nimport type { FarcasterService } from '../service';\n\nexport const sendCastAction: Action = {\n name: 'SEND_CAST',\n description: 'Posts a cast (message) on Farcaster',\n examples: [\n [\n {\n name: 'user',\n content: { text: 'Can you post about the new ElizaOS features on Farcaster?' },\n },\n {\n name: 'assistant',\n content: {\n text: \"I'll post about the new ElizaOS features on Farcaster now.\",\n actions: ['SEND_CAST'],\n },\n },\n ],\n [\n {\n name: 'user',\n content: { text: 'Share on Farcaster that we just launched version 2.0!' },\n },\n {\n name: 'assistant',\n content: {\n text: \"I'll share the version 2.0 launch announcement on Farcaster.\",\n actions: ['SEND_CAST'],\n },\n },\n ],\n ],\n\n validate: async (runtime: IAgentRuntime, message: Memory): Promise<boolean> => {\n const text = message.content.text?.toLowerCase() || '';\n const keywords = ['post', 'cast', 'share', 'announce', 'farcaster', 'tweet'];\n\n // Check if the message contains relevant keywords\n const hasKeyword = keywords.some((keyword) => text.includes(keyword));\n\n // Check if Farcaster service is available\n const service = runtime.getService(FARCASTER_SERVICE_NAME) as FarcasterService;\n const isServiceAvailable = !!service?.getCastService(runtime.agentId);\n\n return hasKeyword && isServiceAvailable;\n },\n\n handler: async (runtime: IAgentRuntime, message: Memory, state?: State): Promise<void> => {\n try {\n const service = runtime.getService(FARCASTER_SERVICE_NAME) as FarcasterService;\n const postService = service?.getCastService(runtime.agentId);\n\n if (!postService) {\n runtime.logger.error('[SEND_CAST] PostService not available');\n return;\n }\n\n // Extract the content to post from the message or generate it\n let castContent = '';\n\n if (state?.castContent) {\n // Use provided cast content from state\n castContent = state.castContent as string;\n } else {\n // Generate content based on the conversation context\n const prompt = `Based on this request: \"${message.content.text}\", generate a concise Farcaster cast (max 320 characters). Be engaging and use appropriate hashtags if relevant.`;\n\n const response = await runtime.useModel('text_large', { prompt });\n castContent = typeof response === 'string' ? response : response.text || '';\n }\n\n // Ensure content fits Farcaster's character limit\n if (castContent.length > 320) {\n castContent = castContent.substring(0, 317) + '...';\n }\n\n // Create the cast\n const cast = await postService.createCast({\n agentId: runtime.agentId,\n roomId: createUniqueUuid(runtime, 'farcaster-timeline'),\n text: castContent,\n });\n\n runtime.logger.info(`[SEND_CAST] Successfully posted cast: ${cast.id}`);\n\n // Store the cast in memory\n await runtime.createMemory(\n {\n agentId: runtime.agentId,\n roomId: cast.roomId,\n // userId removed - not part of Memory type\n entityId: runtime.agentId,\n content: {\n text: castContent,\n source: 'farcaster',\n metadata: {\n castHash: cast.metadata?.castHash,\n action: 'SEND_CAST',\n },\n },\n createdAt: cast.timestamp,\n },\n 'messages'\n );\n } catch (error) {\n runtime.logger.error('[SEND_CAST] Error posting cast:', typeof error === 'string' ? error : (error as Error).message);\n throw error;\n }\n },\n};\n",
9
- "import {\n type Provider,\n type IAgentRuntime,\n type Memory,\n type State,\n type ProviderResult,\n logger,\n} from '@elizaos/core';\nimport { getFarcasterFid } from '../common/config';\nimport { FARCASTER_SERVICE_NAME } from '../common/constants';\nimport type { FarcasterService } from '../service';\n\nexport const farcasterProfileProvider: Provider = {\n name: 'farcasterProfile',\n description: \"Provides information about the agent's Farcaster profile\",\n\n get: async (runtime: IAgentRuntime, message: Memory, state: State): Promise<ProviderResult> => {\n try {\n const service = runtime.getService(FARCASTER_SERVICE_NAME) as FarcasterService;\n const managers = service?.getActiveManagers();\n\n if (!managers || managers.size === 0) {\n runtime.logger.debug('[FarcasterProfileProvider] No managers available');\n return {\n text: 'Farcaster profile not available.',\n data: { available: false },\n };\n }\n\n const manager = managers.get(runtime.agentId);\n if (!manager) {\n runtime.logger.debug('[FarcasterProfileProvider] No manager for this agent');\n return {\n text: 'Farcaster profile not available for this agent.',\n data: { available: false },\n };\n }\n\n const fid = getFarcasterFid(runtime);\n if (!fid) {\n runtime.logger.warn('[FarcasterProfileProvider] Invalid or missing FARCASTER_FID');\n return {\n text: 'Invalid Farcaster FID configured.',\n data: { available: false, error: 'Invalid FID' },\n };\n }\n\n try {\n const profile = await manager.client.getProfile(fid);\n\n return {\n text: `Your Farcaster profile: @${profile.username} (FID: ${profile.fid}). ${profile.name ? `Display name: ${profile.name}` : ''}`,\n data: {\n available: true,\n fid: profile.fid,\n username: profile.username,\n name: profile.name,\n pfp: profile.pfp,\n },\n values: {\n fid: profile.fid,\n username: profile.username,\n },\n };\n } catch (error) {\n runtime.logger.error('[FarcasterProfileProvider] Error fetching profile:', typeof error === 'string' ? error : (error as Error).message);\n return {\n text: 'Unable to fetch Farcaster profile at this time.',\n data: { available: false, error: 'Fetch failed' },\n };\n }\n } catch (error) {\n runtime.logger.error('[FarcasterProfileProvider] Error:', typeof error === 'string' ? error : (error as Error).message);\n return {\n text: 'Farcaster service is not available.',\n data: { available: false },\n };\n }\n },\n};\n",
10
- "import {\n type Provider,\n type IAgentRuntime,\n type Memory,\n type State,\n type ProviderResult,\n logger,\n} from '@elizaos/core';\nimport { FARCASTER_SERVICE_NAME } from '../common/constants';\nimport type { FarcasterService } from '../service';\n\nexport const farcasterTimelineProvider: Provider = {\n name: 'farcasterTimeline',\n description: \"Provides recent casts from the agent's Farcaster timeline\",\n\n get: async (runtime: IAgentRuntime, message: Memory, state: State): Promise<ProviderResult> => {\n try {\n const service = runtime.getService(FARCASTER_SERVICE_NAME) as FarcasterService;\n const castService = service?.getCastService(runtime.agentId);\n\n if (!castService) {\n return {\n text: 'Farcaster timeline not available.',\n data: { available: false },\n };\n }\n\n // Get recent casts from timeline\n const casts = await castService.getCasts({\n agentId: runtime.agentId,\n limit: 5,\n });\n\n if (!casts || casts.length === 0) {\n return {\n text: 'No recent casts in your timeline.',\n data: {\n available: true,\n casts: [],\n count: 0,\n },\n };\n }\n\n // Format casts for context\n const formattedCasts = casts\n .map((cast, index) => {\n const timeAgo = getTimeAgo(new Date(cast.timestamp));\n return `${index + 1}. @${cast.username} (${timeAgo}): ${cast.text}`;\n })\n .join('\\n');\n\n return {\n text: `Recent casts from your timeline:\\n${formattedCasts}`,\n data: {\n available: true,\n casts: casts.map((c) => ({\n id: c.id,\n username: c.username,\n text: c.text,\n timestamp: c.timestamp,\n castHash: c.metadata?.castHash,\n })),\n count: casts.length,\n },\n values: {\n latestCastHash: casts[0]?.metadata?.castHash,\n latestCastText: casts[0]?.text,\n },\n };\n } catch (error) {\n runtime.logger.error('[FarcasterTimelineProvider] Error:', typeof error === 'string' ? error : (error as Error).message);\n return {\n text: 'Unable to fetch Farcaster timeline.',\n data: { available: false, error: error instanceof Error ? error.message : 'Unknown error' },\n };\n }\n },\n};\n\n// Helper function to format time ago\nfunction getTimeAgo(date: Date): string {\n const seconds = Math.floor((new Date().getTime() - date.getTime()) / 1000);\n\n if (seconds < 60) return 'just now';\n if (seconds < 3600) return `${Math.floor(seconds / 60)}m ago`;\n if (seconds < 86400) return `${Math.floor(seconds / 3600)}h ago`;\n return `${Math.floor(seconds / 86400)}d ago`;\n}\n",
11
- "import { Service, UUID, type IAgentRuntime } from '@elizaos/core';\nimport { FARCASTER_SERVICE_NAME } from './common/constants';\nimport { FarcasterAgentManager } from './managers/agent';\nimport { getFarcasterFid, hasFarcasterEnabled, validateFarcasterConfig } from './common/config';\nimport { FarcasterMessageService } from './services/MessageService';\nimport { FarcasterCastService } from './services/CastService';\n\nexport class FarcasterService extends Service {\n private static instance?: FarcasterService;\n private managers = new Map<UUID, FarcasterAgentManager>();\n private messageServices = new Map<UUID, FarcasterMessageService>();\n private castServices = new Map<UUID, FarcasterCastService>();\n\n // Properly implement serviceType for discoverability\n static serviceType = FARCASTER_SERVICE_NAME;\n\n // Add service description\n readonly description = 'Farcaster integration service for sending and receiving casts';\n readonly capabilityDescription = 'The agent is able to send and receive messages on farcaster';\n\n private static getInstance(): FarcasterService {\n if (!FarcasterService.instance) {\n FarcasterService.instance = new FarcasterService();\n }\n return FarcasterService.instance;\n }\n\n // Required by ElizaOS Service base class\n async initialize(runtime: IAgentRuntime): Promise<void> {\n await FarcasterService.start(runtime);\n }\n\n // Called to start a single Farcaster service\n static async start(runtime: IAgentRuntime): Promise<Service> {\n const service = FarcasterService.getInstance();\n let manager = service.managers.get(runtime.agentId);\n\n if (manager) {\n runtime.logger.warn({ agentId: runtime.agentId }, 'Farcaster service already started');\n return service;\n }\n\n if (!hasFarcasterEnabled(runtime)) {\n runtime.logger.debug({ agentId: runtime.agentId }, 'Farcaster service not enabled');\n return service;\n }\n\n const farcasterConfig = validateFarcasterConfig(runtime);\n manager = new FarcasterAgentManager(runtime, farcasterConfig);\n service.managers.set(runtime.agentId, manager);\n\n // Create and store MessageService and CastService instances\n const messageService = new FarcasterMessageService(manager.client, runtime);\n const castService = new FarcasterCastService(manager.client, runtime);\n\n service.messageServices.set(runtime.agentId, messageService);\n service.castServices.set(runtime.agentId, castService);\n\n await manager.start();\n\n runtime.logger.success({ agentId: runtime.agentId },'Farcaster client started');\n return service;\n }\n\n // Called to stop a single Farcaster service\n static async stop(runtime: IAgentRuntime): Promise<void> {\n const service = FarcasterService.getInstance();\n let manager = service.managers.get(runtime.agentId);\n if (manager) {\n await manager.stop();\n service.managers.delete(runtime.agentId);\n service.messageServices.delete(runtime.agentId);\n service.castServices.delete(runtime.agentId);\n runtime.logger.info({ agentId: runtime.agentId }, 'Farcaster client stopped');\n } else {\n runtime.logger.debug({ agentId: runtime.agentId },'Farcaster service not running');\n }\n }\n\n // Called to stop all Farcaster services\n async stop(): Promise<void> {\n for (const manager of Array.from(this.managers.values())) {\n const agentId = manager.runtime.agentId;\n manager.runtime.logger.debug('Stopping Farcaster service');\n try {\n await FarcasterService.stop(manager.runtime);\n } catch (error) {\n manager.runtime.logger.error({ agentId, error }, 'Error stopping Farcaster service');\n }\n }\n }\n\n // Get the MessageService for a specific agent\n getMessageService(agentId: UUID): FarcasterMessageService | undefined {\n return this.messageServices.get(agentId);\n }\n\n /**\n * Get the PostService for a specific agent (for compatibility)\n * @deprecated Use getCastService() instead. Will be removed in a future major release.\n */\n getPostService(agentId: UUID): FarcasterCastService | undefined {\n return this.castServices.get(agentId);\n }\n\n // Get the CastService for a specific agent\n getCastService(agentId: UUID): FarcasterCastService | undefined {\n return this.castServices.get(agentId);\n }\n\n // Add health check method\n async healthCheck(): Promise<{ healthy: boolean; details: Record<string, any> }> {\n const managerStatuses: Record<string, any> = {};\n let overallHealthy = true;\n\n for (const [agentId, manager] of Array.from(this.managers.entries())) {\n try {\n // Check if manager client is responsive\n const fid = getFarcasterFid(manager.runtime);\n if (!fid) {\n throw new Error('FARCASTER_FID not configured');\n }\n const profile = await manager.client.getProfile(fid);\n managerStatuses[agentId] = {\n status: 'healthy',\n fid: profile.fid,\n username: profile.username,\n };\n } catch (error) {\n managerStatuses[agentId] = {\n status: 'unhealthy',\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n overallHealthy = false;\n }\n }\n\n return {\n healthy: overallHealthy,\n details: {\n activeManagers: this.managers.size,\n managerStatuses,\n },\n };\n }\n\n // Get all active managers (for monitoring)\n getActiveManagers(): Map<UUID, FarcasterAgentManager> {\n return new Map(this.managers);\n }\n}\n",
12
- "import { type IAgentRuntime } from '@elizaos/core';\nimport { Configuration, NeynarAPIClient } from '@neynar/nodejs-sdk';\nimport { FarcasterClient } from '../client';\nimport { type FarcasterConfig } from '../common/types';\nimport { FarcasterCastManager } from './post';\nimport { FarcasterInteractionManager } from './interactions';\n\n/**\n * A manager that orchestrates all Farcaster operations:\n * - client: base operations (Neynar client, hub connection, etc.)\n * - posts: autonomous posting logic\n * - interactions: handling mentions, replies, likes, etc.\n */\nexport class FarcasterAgentManager {\n readonly runtime: IAgentRuntime;\n readonly client: FarcasterClient;\n readonly casts: FarcasterCastManager;\n readonly interactions: FarcasterInteractionManager;\n\n constructor(runtime: IAgentRuntime, config: FarcasterConfig) {\n this.runtime = runtime;\n const signerUuid = config.FARCASTER_SIGNER_UUID;\n\n const neynarConfig = new Configuration({ apiKey: config.FARCASTER_NEYNAR_API_KEY });\n const neynar = new NeynarAPIClient(neynarConfig);\n const client = new FarcasterClient({ neynar, signerUuid });\n\n this.client = client;\n\n runtime.logger.success('Farcaster Neynar client initialized.');\n\n // Initialize managers\n this.interactions = new FarcasterInteractionManager({ client, runtime, config });\n this.casts = new FarcasterCastManager({ client, runtime, config });\n }\n\n async start() {\n await Promise.all([this.casts.start(), this.interactions.start()]);\n }\n\n async stop() {\n await Promise.all([this.casts.stop(), this.interactions.stop()]);\n }\n}\n",
13
- "import { Content, elizaLogger } from '@elizaos/core';\nimport { type NeynarAPIClient, isApiErrorResponse } from '@neynar/nodejs-sdk';\nimport { Cast as NeynarCast } from '@neynar/nodejs-sdk/build/api';\n// @ts-ignore\nimport { LRUCache } from 'lru-cache';\nimport { DEFAULT_CAST_CACHE_SIZE, DEFAULT_CAST_CACHE_TTL } from './common/constants';\nimport type { Cast, CastId, FidRequest, Profile } from './common/types';\nimport { neynarCastToCast, splitPostContent } from './common/utils';\n\n// add global cast cache\nconst castCache: LRUCache<string, NeynarCast> = new LRUCache({\n max: DEFAULT_CAST_CACHE_SIZE,\n ttl: DEFAULT_CAST_CACHE_TTL,\n});\n\n// add global profile cache\nconst profileCache: LRUCache<number, Profile> = new LRUCache({\n max: 1000,\n ttl: 1000 * 60 * 15, // 15 minutes\n});\n\nexport class FarcasterClient {\n private neynar: NeynarAPIClient;\n private signerUuid: string;\n constructor(opts: { neynar: NeynarAPIClient; signerUuid: string }) {\n this.neynar = opts.neynar;\n this.signerUuid = opts.signerUuid;\n }\n\n async sendCast({\n content,\n inReplyTo,\n }: {\n content: Content;\n inReplyTo?: CastId;\n }): Promise<NeynarCast[]> {\n const text = (content.text ?? '').trim();\n if (text.length === 0) {\n return [];\n }\n\n const chunks = splitPostContent(text);\n const sent: NeynarCast[] = [];\n\n for (const chunk of chunks) {\n const result = await this.publishCast(chunk, inReplyTo);\n sent.push(result);\n }\n return sent;\n }\n\n private async publishCast(cast: string, parentCastId?: CastId): Promise<NeynarCast> {\n try {\n const result = await this.neynar.publishCast({\n signerUuid: this.signerUuid,\n text: cast,\n parent: parentCastId?.hash,\n });\n if (result.success) {\n return this.getCast(result.cast.hash);\n }\n throw new Error(`[Farcaster] Error publishing [${cast}] parentCastId: [${parentCastId}]`);\n } catch (err) {\n if (isApiErrorResponse(err)) {\n elizaLogger.error(`Neynar error: ${JSON.stringify(err.response.data)}`);\n throw err.response.data;\n } else {\n elizaLogger.error(`Error: ${JSON.stringify(err)}`);\n throw err;\n }\n }\n }\n\n async getCast(castHash: string): Promise<NeynarCast> {\n const cachedCast = castCache.get(castHash);\n if (cachedCast) {\n return cachedCast;\n }\n\n const response = await this.neynar.lookupCastByHashOrUrl({ identifier: castHash, type: 'hash' });\n\n castCache.set(castHash, response.cast);\n\n return response.cast;\n }\n async getMentions(request: FidRequest): Promise<NeynarCast[]> {\n const neynarMentionsResponse = await this.neynar.fetchAllNotifications({\n fid: request.fid,\n type: ['mentions', 'replies'],\n limit: request.pageSize,\n });\n const mentions: NeynarCast[] = [];\n\n for (const notification of neynarMentionsResponse.notifications) {\n const neynarCast = notification.cast;\n if (neynarCast) {\n mentions.push(neynarCast);\n }\n }\n\n return mentions;\n }\n\n async getProfile(fid: number): Promise<Profile> {\n if (profileCache.has(fid)) {\n return profileCache.get(fid) as Profile;\n }\n\n try {\n const result = await this.neynar.fetchBulkUsers({ fids: [fid] });\n if (!result.users || result.users.length < 1) {\n elizaLogger.error('Error fetching user by fid');\n throw new Error('Profile fetch failed');\n }\n\n const neynarUserProfile = result.users[0];\n\n const profile: Profile = {\n fid,\n name: '',\n username: '',\n };\n\n profile.name = neynarUserProfile.display_name!;\n profile.username = neynarUserProfile.username;\n profile.bio = neynarUserProfile.profile.bio.text;\n profile.pfp = neynarUserProfile.pfp_url;\n\n profileCache.set(fid, profile);\n\n return profile;\n } catch (error) {\n elizaLogger.error(`Error fetching profile: ${JSON.stringify(error)}`);\n throw error;\n }\n }\n\n async getTimeline(request: FidRequest): Promise<{\n timeline: Cast[];\n cursor?: string;\n }> {\n const timeline: Cast[] = [];\n\n const response = await this.neynar.fetchCastsForUser({\n fid: request.fid,\n limit: request.pageSize,\n });\n\n for (const cast of response.casts) {\n castCache.set(cast.hash, cast);\n timeline.push(neynarCastToCast(cast));\n }\n\n const nextCursor = response.next?.cursor ?? undefined;\n\n return {\n timeline,\n cursor: nextCursor,\n };\n }\n\n clearCache(): void {\n profileCache.clear();\n castCache.clear();\n }\n}\n",
14
- "import { IAgentRuntime, Memory, stringToUuid, UUID } from '@elizaos/core';\nimport { Cast as NeynarCast } from '@neynar/nodejs-sdk/build/api';\nimport { FARCASTER_SOURCE } from './constants';\nimport { Cast } from './types';\n\nexport const MAX_CAST_LENGTH = 1024; // Farcaster cast character limit\n\nexport function castId({ hash, agentId }: { hash: string; agentId: string }) {\n return `${hash}-${agentId}`;\n}\n\nexport function castUuid(props: { hash: string; agentId: string }) {\n return stringToUuid(castId(props));\n}\n\nexport function splitPostContent(content: string, maxLength: number = MAX_CAST_LENGTH): string[] {\n const paragraphs = content.split('\\n\\n').map((p) => p.trim());\n const posts: string[] = [];\n let currentCast = '';\n\n for (const paragraph of paragraphs) {\n if (!paragraph) continue;\n\n if ((currentCast + '\\n\\n' + paragraph).trim().length <= maxLength) {\n if (currentCast) {\n currentCast += '\\n\\n' + paragraph;\n } else {\n currentCast = paragraph;\n }\n } else {\n if (currentCast) {\n posts.push(currentCast.trim());\n }\n if (paragraph.length <= maxLength) {\n currentCast = paragraph;\n } else {\n // Split long paragraph into smaller chunks\n const chunks = splitParagraph(paragraph, maxLength);\n posts.push(...chunks.slice(0, -1));\n currentCast = chunks[chunks.length - 1];\n }\n }\n }\n\n if (currentCast) {\n posts.push(currentCast.trim());\n }\n\n return posts;\n}\n\nexport function splitParagraph(paragraph: string, maxLength: number): string[] {\n const sentences = paragraph.match(/[^.!?]+[.!?]+|[^.!?]+$/g) || [paragraph];\n const chunks: string[] = [];\n let currentChunk = '';\n\n for (const sentence of sentences) {\n if ((currentChunk + ' ' + sentence).trim().length <= maxLength) {\n if (currentChunk) {\n currentChunk += ' ' + sentence;\n } else {\n currentChunk = sentence;\n }\n } else {\n if (currentChunk) {\n chunks.push(currentChunk.trim());\n }\n if (sentence.length <= maxLength) {\n currentChunk = sentence;\n } else {\n // Split long sentence into smaller pieces\n const words = sentence.split(' ');\n currentChunk = '';\n for (const word of words) {\n if ((currentChunk + ' ' + word).trim().length <= maxLength) {\n if (currentChunk) {\n currentChunk += ' ' + word;\n } else {\n currentChunk = word;\n }\n } else {\n if (currentChunk) {\n chunks.push(currentChunk.trim());\n }\n currentChunk = word;\n }\n }\n }\n }\n }\n\n if (currentChunk) {\n chunks.push(currentChunk.trim());\n }\n\n return chunks;\n}\n\nexport function lastCastCacheKey(fid: number) {\n return `farcaster/${fid}/lastCast`;\n}\n\n/**\n * Convert a Neynar Cast to our internal Cast type\n * Now includes embeds from the original cast for media processing\n */\nexport function neynarCastToCast(neynarCast: NeynarCast): Cast {\n return {\n hash: neynarCast.hash,\n authorFid: neynarCast.author.fid,\n text: neynarCast.text,\n threadId: neynarCast.thread_hash ?? undefined,\n profile: {\n fid: neynarCast.author.fid,\n name: neynarCast.author.display_name || 'anon',\n username: neynarCast.author.username,\n },\n ...(neynarCast.parent_hash && neynarCast.parent_author?.fid\n ? {\n inReplyTo: {\n hash: neynarCast.parent_hash,\n fid: neynarCast.parent_author.fid,\n },\n }\n : {}),\n timestamp: new Date(neynarCast.timestamp),\n // Include raw embeds for later processing\n embeds: neynarCast.embeds && neynarCast.embeds.length > 0 \n ? neynarCast.embeds \n : undefined,\n };\n}\n\nexport function createCastMemory({\n roomId,\n senderId,\n runtime,\n cast,\n}: {\n roomId: UUID;\n senderId: UUID;\n runtime: IAgentRuntime;\n cast: Cast;\n}): Memory {\n const inReplyTo = cast.inReplyTo\n ? castUuid({\n hash: cast.inReplyTo.hash,\n agentId: runtime.agentId,\n })\n : undefined;\n\n return {\n id: castUuid({\n hash: cast.hash,\n agentId: runtime.agentId,\n }),\n agentId: runtime.agentId,\n entityId: senderId,\n content: {\n text: cast.text,\n source: FARCASTER_SOURCE,\n url: '',\n inReplyTo,\n hash: cast.hash,\n threadId: cast.threadId,\n // Include processed media attachments if available\n attachments: cast.media && cast.media.length > 0 ? cast.media : undefined,\n },\n roomId,\n };\n}\n\nexport function formatCastTimestamp(timestamp: Date): string {\n return timestamp.toLocaleString('en-US', {\n hour: '2-digit',\n minute: '2-digit',\n month: 'short',\n day: 'numeric',\n });\n}\n",
15
- "import { createUniqueUuid, EventType, type IAgentRuntime } from '@elizaos/core';\nimport type { FarcasterClient } from '../client';\nimport { standardCastHandlerCallback } from '../common/callbacks';\nimport { FARCASTER_SOURCE } from '../common/constants';\nimport { FarcasterConfig, FarcasterEventTypes, LastCast } from '../common/types';\nimport { lastCastCacheKey } from '../common/utils';\n\ninterface FarcasterCastParams {\n client: FarcasterClient;\n runtime: IAgentRuntime;\n config: FarcasterConfig;\n}\n\nexport class FarcasterCastManager {\n client: FarcasterClient;\n runtime: IAgentRuntime;\n fid: number;\n private timeout: ReturnType<typeof setTimeout> | undefined;\n private config: FarcasterConfig;\n private isRunning: boolean = false;\n\n constructor(opts: FarcasterCastParams) {\n this.client = opts.client;\n this.runtime = opts.runtime;\n this.config = opts.config;\n this.fid = this.config.FARCASTER_FID;\n }\n\n public async start() {\n if (this.isRunning || !this.config.ENABLE_CAST) {\n return;\n }\n\n this.isRunning = true;\n\n // never await this, it will block forever\n void this.runPeriodically();\n }\n\n public async stop() {\n if (this.timeout) clearTimeout(this.timeout);\n this.isRunning = false;\n }\n\n private calculateDelay(): { delay: number; randomMinutes: number } {\n const minMinutes = this.config.CAST_INTERVAL_MIN;\n const maxMinutes = this.config.CAST_INTERVAL_MAX;\n const randomMinutes = Math.floor(Math.random() * (maxMinutes - minMinutes + 1)) + minMinutes;\n const delay = randomMinutes * 60 * 1000;\n return { delay, randomMinutes };\n }\n\n private async runPeriodically(): Promise<void> {\n if (this.config.CAST_IMMEDIATELY) {\n await this.generateNewCast();\n }\n\n while (this.isRunning) {\n try {\n const lastPost = await this.runtime.getCache<LastCast>(lastCastCacheKey(this.fid));\n const lastPostTimestamp = lastPost?.timestamp ?? 0;\n const { delay, randomMinutes } = this.calculateDelay();\n\n if (Date.now() > lastPostTimestamp + delay) {\n await this.generateNewCast();\n }\n\n this.runtime.logger.log(`Next cast scheduled in ${randomMinutes} minutes`);\n await new Promise((resolve) => (this.timeout = setTimeout(resolve, delay)));\n } catch (error) {\n this.runtime.logger.error({ agentId: this.runtime.agentId, error }, '[Farcaster] Error in periodic cast loop:');\n }\n }\n }\n\n private async generateNewCast() {\n this.runtime.logger.info('Generating new cast');\n try {\n const worldId = createUniqueUuid(this.runtime, this.fid.toString());\n const roomId = createUniqueUuid(this.runtime, `${this.fid}-home`);\n\n // callback for handling the actual posting\n const callback = standardCastHandlerCallback({\n client: this.client,\n runtime: this.runtime,\n config: this.config,\n roomId,\n onCompletion: async (casts, _memories) => {\n const lastCast = casts[casts.length - 1];\n await this.runtime.setCache<LastCast>(lastCastCacheKey(this.fid), {\n hash: lastCast.hash,\n timestamp: new Date(lastCast.timestamp).getTime(),\n });\n },\n });\n\n this.runtime.emitEvent([EventType.POST_GENERATED, FarcasterEventTypes.CAST_GENERATED], {\n runtime: this.runtime,\n callback,\n worldId,\n userId: this.runtime.agentId,\n roomId,\n source: FARCASTER_SOURCE,\n });\n } catch (error) {\n this.runtime.logger.error({ error }, '[Farcaster] Error generating new cast');\n }\n }\n}\n",
16
- "import { Content, HandlerCallback, IAgentRuntime, Memory, UUID } from '@elizaos/core';\nimport { Cast as NeynarCast } from '@neynar/nodejs-sdk/build/api';\nimport { FarcasterClient } from '../client';\nimport { CastId, FarcasterConfig } from './types';\nimport { createCastMemory, neynarCastToCast } from './utils';\n\nexport function standardCastHandlerCallback({\n client,\n runtime,\n config,\n roomId,\n onCompletion,\n onError,\n inReplyTo,\n}: {\n inReplyTo?: CastId;\n client: FarcasterClient;\n runtime: IAgentRuntime;\n config: FarcasterConfig;\n roomId: UUID;\n onCompletion?: (casts: NeynarCast[], memories: Memory[]) => Promise<void>;\n onError?: (error: unknown) => Promise<void>;\n}): HandlerCallback {\n const callback: HandlerCallback = async (content: Content, _files?: any) => {\n try {\n if (config.FARCASTER_DRY_RUN) {\n runtime.logger.info(`[Farcaster] Dry run: would have cast: ${content.text}`);\n return [];\n }\n\n const casts = await client.sendCast({ content, inReplyTo });\n\n if (casts.length === 0) {\n runtime.logger.warn('[Farcaster] No casts posted');\n return [];\n }\n\n const memories: Memory[] = [];\n for (let i = 0; i < casts.length; i++) {\n const cast = casts[i];\n runtime.logger.success(`[Farcaster] Published cast ${cast.hash}`);\n\n const memory = createCastMemory({\n roomId,\n senderId: runtime.agentId,\n runtime,\n cast: neynarCastToCast(cast),\n });\n\n if (i === 0) {\n // sendCast removes the response action, so we need to add it back here\n memory.content.actions = content.actions;\n }\n\n await runtime.createMemory(memory, 'messages');\n memories.push(memory);\n }\n\n if (onCompletion) {\n await onCompletion(casts, memories);\n }\n\n return memories;\n } catch (error) {\n runtime.logger.error('[Farcaster] Error posting cast:', typeof error === 'string' ? error : (error as Error).message);\n\n if (onError) {\n await onError(error);\n }\n\n return [];\n }\n };\n\n return callback;\n}\n",
17
- "import {\n ChannelType,\n Content,\n createUniqueUuid,\n EventPayload,\n EventType,\n type IAgentRuntime,\n type Memory,\n MessagePayload,\n ModelType,\n parseKeyValueXml,\n stringToUuid,\n UUID,\n} from '@elizaos/core';\nimport { Cast as NeynarCast } from '@neynar/nodejs-sdk/build/api';\nimport type { FarcasterClient } from '../client';\nimport { AsyncQueue } from '../common/asyncqueue';\nimport { standardCastHandlerCallback } from '../common/callbacks';\nimport { FARCASTER_SOURCE } from '../common/constants';\nimport {\n type Cast,\n type FarcasterConfig,\n FarcasterEventTypes,\n FarcasterGenericCastPayload,\n type NeynarWebhookData,\n type Profile,\n} from '../common/types';\nimport { castUuid, neynarCastToCast } from '../common/utils';\nimport { createFarcasterInteractionSource, type FarcasterInteractionSource } from './interaction-source';\nimport type { IInteractionProcessor } from './interaction-processor';\nimport { EmbedManager } from './embedManager';\n\ninterface FarcasterInteractionManagerParams {\n client: FarcasterClient;\n runtime: IAgentRuntime;\n config: FarcasterConfig;\n}\n\n/**\n * Processes Farcaster interactions (mentions, replies) regardless of source (polling/webhook)\n * This class contains the core logic for handling interactions and manages the interaction source\n */\nexport class FarcasterInteractionManager implements IInteractionProcessor {\n private client: FarcasterClient;\n private runtime: IAgentRuntime;\n private config: FarcasterConfig;\n private asyncQueue: AsyncQueue;\n private embedManager: EmbedManager;\n\n // Mode and source management\n public readonly mode: 'polling' | 'webhook';\n public readonly source: FarcasterInteractionSource;\n\n constructor(opts: FarcasterInteractionManagerParams) {\n this.client = opts.client;\n this.runtime = opts.runtime;\n this.config = opts.config;\n this.asyncQueue = new AsyncQueue(1);\n this.embedManager = new EmbedManager(opts.runtime);\n\n // Initialize mode and source\n this.mode = opts.config.FARCASTER_MODE as 'polling' | 'webhook';\n this.source = createFarcasterInteractionSource({\n client: this.client,\n runtime: this.runtime,\n config: this.config,\n processor: this\n });\n\n this.runtime.logger.info(`Farcaster interaction mode: ${this.mode}`);\n }\n\n /**\n * Process a mention from any source (webhook or polling)\n */\n async processMention(cast: NeynarCast): Promise<void> {\n const agentFid = this.config.FARCASTER_FID;\n const agent = await this.client.getProfile(agentFid);\n const mention = neynarCastToCast(cast);\n\n // Process embeds if present\n if (mention.embeds && mention.embeds.length > 0) {\n try {\n this.runtime.logger.debug(\n { castHash: cast.hash, embedCount: mention.embeds.length },\n '[Farcaster] Processing embeds for mention'\n );\n const processedMedia = await this.embedManager.processEmbeds(mention.embeds);\n mention.media = processedMedia;\n this.runtime.logger.info(\n { castHash: cast.hash, mediaCount: processedMedia.length },\n '[Farcaster] Processed embeds for mention'\n );\n } catch (error) {\n this.runtime.logger.warn(\n { error: error instanceof Error ? error.message : String(error), castHash: cast.hash },\n '[Farcaster] Failed to process embeds, continuing without media'\n );\n }\n }\n\n await this.handleMentionCast({ agent, mention, cast });\n }\n\n /**\n * Process a reply from any source (webhook or polling)\n */\n async processReply(cast: NeynarCast): Promise<void> {\n // Similar to processMention but for replies\n const agentFid = this.config.FARCASTER_FID;\n const agent = await this.client.getProfile(agentFid);\n const reply = neynarCastToCast(cast);\n\n // Process embeds if present\n if (reply.embeds && reply.embeds.length > 0) {\n try {\n this.runtime.logger.debug(\n { castHash: cast.hash, embedCount: reply.embeds.length },\n '[Farcaster] Processing embeds for reply'\n );\n const processedMedia = await this.embedManager.processEmbeds(reply.embeds);\n reply.media = processedMedia;\n this.runtime.logger.info(\n { castHash: cast.hash, mediaCount: processedMedia.length },\n '[Farcaster] Processed embeds for reply'\n );\n } catch (error) {\n this.runtime.logger.warn(\n { error: error instanceof Error ? error.message : String(error), castHash: cast.hash },\n '[Farcaster] Failed to process embeds, continuing without media'\n );\n }\n }\n\n await this.handleMentionCast({ agent, mention: reply, cast });\n }\n\n /**\n * Process webhook data from Neynar\n */\n async processWebhookData(webhookData: NeynarWebhookData): Promise<void> {\n if (webhookData.type !== 'cast.created' || !webhookData.data) {\n this.runtime.logger.debug('Ignoring non-cast webhook event:', webhookData.type);\n return;\n }\n\n const castData = webhookData.data;\n const agentFid = this.config.FARCASTER_FID;\n\n // Validate required cast data structure\n if (!castData.author || !castData.hash || typeof castData.author.fid !== 'number') {\n this.runtime.logger.warn('Invalid webhook cast data structure - missing author, hash, or author.fid');\n return;\n }\n\n // Skip if it's from the agent itself\n if (castData.author.fid === agentFid) {\n this.runtime.logger.debug('Skipping webhook event from agent itself');\n return;\n }\n\n // Deduplication check - skip if already processed\n const memoryId = castUuid({ agentId: this.runtime.agentId, hash: castData.hash });\n if (await this.runtime.getMemoryById(memoryId)) {\n this.runtime.logger.debug('Skipping already processed webhook cast:', castData.hash);\n return;\n }\n\n // Check if it's a mention\n const isMention = castData.mentioned_profiles?.some((profile: any) => profile.fid === agentFid);\n\n // Check if it's a reply to the agent\n const isReply = castData.parent_hash && castData.parent_author?.fid === agentFid;\n\n if (isMention) {\n const username = castData.author.username || 'unknown';\n const text = castData.text || '';\n this.runtime.logger.info(`Processing webhook MENTION from @${username}: \"${text}\"`);\n\n try {\n // Fetch the proper NeynarCast object using the cast hash\n const neynarCast = await this.client.getCast(castData.hash);\n await this.processMention(neynarCast);\n } catch (error) {\n this.runtime.logger.error(\n { agentId: this.runtime.agentId, error },\n 'Failed to process webhook mention from @' + username\n );\n }\n } else if (isReply) {\n const username = castData.author.username || 'unknown';\n const text = castData.text || '';\n this.runtime.logger.info(`Processing webhook REPLY from @${username}: \"${text}\"`);\n\n try {\n // Fetch the proper NeynarCast object using the cast hash\n const neynarCast = await this.client.getCast(castData.hash);\n await this.processReply(neynarCast);\n } catch (error) {\n this.runtime.logger.error({ error }, `Failed to process webhook reply from @${username}:`);\n }\n } else {\n this.runtime.logger.debug('Webhook cast is neither mention nor reply to agent');\n }\n }\n\n public async ensureCastConnection(cast: Cast): Promise<Memory> {\n return await this.asyncQueue.submit(async () => {\n const memoryId = castUuid({ agentId: this.runtime.agentId, hash: cast.hash });\n const conversationId = cast.threadId ?? cast.inReplyTo?.hash ?? cast.hash;\n const entityId = createUniqueUuid(this.runtime, cast.authorFid.toString());\n const worldId = createUniqueUuid(this.runtime, cast.authorFid.toString());\n const roomId = createUniqueUuid(this.runtime, conversationId);\n\n if (entityId !== this.runtime.agentId) {\n await this.runtime.ensureConnection({\n entityId,\n roomId,\n worldName: `${cast.profile.username}'s Farcaster`,\n userName: cast.profile.username,\n name: cast.profile.name,\n source: FARCASTER_SOURCE,\n type: ChannelType.THREAD,\n channelId: conversationId,\n messageServerId: stringToUuid(cast.authorFid.toString()),\n worldId,\n metadata: {\n ownership: { ownerId: cast.authorFid.toString() },\n farcaster: {\n username: cast.profile.username,\n id: cast.authorFid.toString(),\n name: cast.profile.name,\n },\n },\n });\n }\n\n // Build text with attachment hint to trigger ATTACHMENTS provider selection\n let text = cast.text;\n if (cast.media && cast.media.length > 0) {\n const attachmentTypes = cast.media.map(m => m.source || 'attachment').join(', ');\n text = `${cast.text}\\n\\n(Attachments: ${cast.media.length} - ${attachmentTypes})`;\n }\n\n const memory: Memory = {\n id: memoryId,\n agentId: this.runtime.agentId,\n content: {\n text,\n inReplyTo: cast.inReplyTo?.hash\n ? castUuid({ agentId: this.runtime.agentId, hash: cast.inReplyTo.hash })\n : undefined,\n source: FARCASTER_SOURCE,\n channelType: ChannelType.THREAD,\n // Include processed media attachments if available\n attachments: cast.media && cast.media.length > 0 ? cast.media : undefined,\n },\n entityId,\n roomId,\n createdAt: cast.timestamp.getTime(),\n };\n\n return memory;\n });\n }\n\n private async buildThreadForCast(cast: Cast, skipMemoryId: Set<UUID>): Promise<Cast[]> {\n const thread: Cast[] = [];\n const visited: Set<string> = new Set();\n const client = this.client;\n const runtime = this.runtime;\n const self = this;\n\n async function processThread(currentCast: Cast) {\n const memoryId = castUuid({ hash: currentCast.hash, agentId: runtime.agentId });\n\n if (visited.has(currentCast.hash) || skipMemoryId.has(memoryId)) {\n return;\n }\n\n visited.add(currentCast.hash);\n\n // Check if the current cast has already been saved\n const memory = await runtime.getMemoryById(memoryId);\n\n if (!memory) {\n runtime.logger.info({ hash: currentCast.hash }, 'Creating memory for cast');\n const newMemory = await self.ensureCastConnection(currentCast);\n await runtime.createMemory(newMemory, 'messages');\n runtime.emitEvent(FarcasterEventTypes.THREAD_CAST_CREATED as string, {\n runtime,\n memory: newMemory,\n cast: currentCast,\n source: FARCASTER_SOURCE,\n } as EventPayload);\n }\n\n thread.unshift(currentCast);\n\n if (currentCast.inReplyTo) {\n const parentCast = await client.getCast(currentCast.inReplyTo.hash);\n await processThread(neynarCastToCast(parentCast));\n }\n }\n\n await processThread(cast);\n return thread;\n }\n\n private async handleMentionCast({\n agent,\n mention,\n cast,\n }: {\n agent: Profile;\n cast: NeynarCast;\n mention: Cast;\n }): Promise<void> {\n if (mention.profile.fid === agent.fid) {\n this.runtime.logger.info({ hash: mention.hash }, 'skipping cast from bot itself');\n return;\n }\n\n // Process one at a time to ensure proper sequencing\n const memory = await this.ensureCastConnection(mention);\n const thread: Cast[] = await this.buildThreadForCast(\n mention,\n memory.id ? new Set([memory.id]) : new Set()\n );\n\n if (!memory.content.text || memory.content.text.trim() === '') {\n this.runtime.logger.info({ hash: mention.hash }, 'skipping cast with no text');\n return;\n }\n\n // Setup callback for the response\n const callback = standardCastHandlerCallback({\n client: this.client,\n runtime: this.runtime,\n config: this.config,\n roomId: memory.roomId,\n inReplyTo: {\n hash: mention.hash,\n fid: mention.authorFid,\n },\n });\n\n // Call messageService directly - it handles shouldRespond evaluation and action processing\n try {\n if (!this.runtime.messageService) {\n this.runtime.logger.warn('[Farcaster] messageService not available, skipping mention handling');\n return;\n }\n await this.runtime.messageService.handleMessage(\n this.runtime,\n memory,\n callback\n );\n } catch (error) {\n this.runtime.logger.error(\n {\n error: error instanceof Error ? error.message : String(error),\n castHash: mention.hash,\n },\n '[Farcaster] Error processing mention'\n );\n }\n\n // Emit platform-specific MENTION_RECEIVED event for any custom handlers\n const mentionPayload: FarcasterGenericCastPayload = {\n runtime: this.runtime,\n memory,\n cast,\n source: FARCASTER_SOURCE,\n callback,\n };\n this.runtime.emitEvent(FarcasterEventTypes.MENTION_RECEIVED, mentionPayload);\n }\n\n /**\n * Start the interaction manager (delegates to the appropriate source)\n */\n async start(): Promise<void> {\n this.runtime.logger.info(`Starting Farcaster interaction manager in ${this.mode} mode`);\n await this.source.start();\n }\n\n /**\n * Stop the interaction manager\n */\n async stop(): Promise<void> {\n this.runtime.logger.info('Stopping Farcaster interaction manager');\n await this.source.stop();\n }\n\n}\n",
18
- "export class AsyncQueue {\n private queue: (() => Promise<void>)[] = [];\n private running = 0;\n private emptyListeners: (() => void)[] = [];\n private maxConcurrent: number;\n\n constructor(maxConcurrent: number = 1) {\n this.maxConcurrent = maxConcurrent;\n }\n\n async submit<T>(work: () => Promise<T>): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n this.queue.push(async () => {\n try {\n resolve(await work());\n } catch (err) {\n reject(err);\n }\n });\n void this.doNextWork();\n });\n }\n\n private async doNextWork(): Promise<void> {\n if (this.running >= this.maxConcurrent) {\n return;\n }\n\n const work = this.queue.shift();\n if (!work) {\n this.checkIfEmptyAndNotify();\n return;\n }\n\n this.running++;\n try {\n await work();\n } catch (err) {\n // Error handling without logging\n } finally {\n this.running--;\n void this.doNextWork();\n }\n }\n\n async size(): Promise<number> {\n return this.queue.length;\n }\n\n async waitUntilFinished(): Promise<void> {\n return new Promise((resolve) => {\n if (this.queue.length === 0 && this.running === 0) {\n resolve();\n } else {\n this.emptyListeners.push(resolve);\n }\n });\n }\n\n private checkIfEmptyAndNotify(): void {\n if (this.queue.length === 0 && this.running === 0) {\n while (this.emptyListeners.length) {\n const listener = this.emptyListeners.shift();\n if (listener) listener();\n }\n }\n }\n}\n",
19
- "import { type IAgentRuntime } from '@elizaos/core';\nimport type { FarcasterClient } from '../client';\nimport type { FarcasterConfig, NeynarWebhookData } from '../common/types';\nimport type { IInteractionProcessor } from './interaction-processor';\nimport { neynarCastToCast, castUuid } from '../common/utils';\n\ninterface FarcasterInteractionSourceParams {\n client: FarcasterClient;\n runtime: IAgentRuntime;\n config: FarcasterConfig;\n processor: IInteractionProcessor;\n}\n\n/**\n * Abstract base class for Farcaster interaction sources\n */\nexport abstract class FarcasterInteractionSource {\n protected client: FarcasterClient;\n protected runtime: IAgentRuntime;\n protected config: FarcasterConfig;\n protected processor: IInteractionProcessor;\n protected isRunning: boolean = false;\n\n constructor(params: FarcasterInteractionSourceParams) {\n this.client = params.client;\n this.runtime = params.runtime;\n this.config = params.config;\n this.processor = params.processor;\n }\n\n abstract start(): Promise<void>;\n abstract stop(): Promise<void>;\n}\n\n/**\n * Polling-based interaction source (original behavior)\n */\nexport class FarcasterPollingSource extends FarcasterInteractionSource {\n private timeout: ReturnType<typeof setTimeout> | undefined;\n\n async start(): Promise<void> {\n this.runtime.logger.info('Starting Farcaster polling mode');\n if (this.isRunning) {\n return;\n }\n\n this.isRunning = true;\n void this.runPeriodically();\n }\n\n async stop(): Promise<void> {\n this.runtime.logger.info('Stopping Farcaster polling mode');\n if (this.timeout) clearTimeout(this.timeout);\n this.isRunning = false;\n }\n\n private async runPeriodically(): Promise<void> {\n while (this.isRunning) {\n try {\n await this.pollForInteractions();\n\n // Sleep for the configured interval\n const delay = this.config.FARCASTER_POLL_INTERVAL * 1000;\n await new Promise((resolve) => (this.timeout = setTimeout(resolve, delay)));\n } catch (error) {\n this.runtime.logger.error({ error }, '[Farcaster] Error in polling:');\n }\n }\n }\n\n private async pollForInteractions(): Promise<void> {\n const agentFid = this.config.FARCASTER_FID;\n const mentions = await this.client.getMentions({\n fid: agentFid,\n pageSize: 20,\n });\n\n for (const cast of mentions) {\n try {\n const mention = neynarCastToCast(cast);\n const memoryId = castUuid({ agentId: this.runtime.agentId, hash: mention.hash });\n\n // Deduplication check - skip if already processed\n if (await this.runtime.getMemoryById(memoryId)) {\n continue;\n }\n\n this.runtime.logger.info({ hash: mention.hash }, 'New Cast found');\n\n // Filter out the agent mentions (self-posts)\n if (mention.authorFid === agentFid) {\n const memory = await this.processor.ensureCastConnection(mention);\n await this.runtime.addEmbeddingToMemory(memory);\n await this.runtime.createMemory(memory, 'messages');\n continue;\n }\n\n // Process mention through the processor\n await this.processor.processMention(cast);\n } catch (error) {\n this.runtime.logger.error({ error }, '[Farcaster] Error processing mention:');\n }\n }\n }\n}\n\n/**\n * Webhook-based interaction source\n */\nexport class FarcasterWebhookSource extends FarcasterInteractionSource {\n async start(): Promise<void> {\n this.runtime.logger.info('Starting Farcaster webhook mode');\n if (this.isRunning) {\n return;\n }\n\n this.isRunning = true;\n this.runtime.logger.info('Webhook source is active - waiting for webhook events');\n }\n\n async stop(): Promise<void> {\n this.runtime.logger.info('Stopping Farcaster webhook mode');\n this.isRunning = false;\n }\n\n /**\n * Process webhook data (called from webhook route handler)\n */\n async processWebhookData(webhookData: NeynarWebhookData): Promise<void> {\n if (!this.isRunning) {\n this.runtime.logger.warn('Webhook source is not running, ignoring webhook data');\n return;\n }\n\n try {\n await this.processor.processWebhookData(webhookData);\n } catch (error) {\n this.runtime.logger.error({ error }, '[Farcaster] Error processing webhook data:');\n }\n }\n}\n\n/**\n * Factory function to create the appropriate interaction source based on config\n */\nexport function createFarcasterInteractionSource(params: FarcasterInteractionSourceParams): FarcasterInteractionSource {\n const mode = params.config.FARCASTER_MODE;\n \n switch (mode) {\n case 'webhook':\n return new FarcasterWebhookSource(params);\n case 'polling':\n default:\n return new FarcasterPollingSource(params);\n }\n}\n",
20
- "import { type IAgentRuntime, type Media, ModelType } from '@elizaos/core';\nimport type { \n Embed as NeynarEmbed,\n EmbedUrl,\n EmbedCast \n} from '@neynar/nodejs-sdk/build/api';\n\n/**\n * Type guard to check if an embed is a URL embed\n */\nexport function isEmbedUrl(embed: NeynarEmbed): embed is EmbedUrl {\n return 'url' in embed && typeof (embed as EmbedUrl).url === 'string';\n}\n\n/**\n * Type guard to check if an embed is a cast embed\n */\nexport function isEmbedCast(embed: NeynarEmbed): embed is EmbedCast {\n return 'cast' in embed && typeof (embed as EmbedCast).cast === 'object';\n}\n\n/**\n * Determines the media type from a URL based on content type or extension\n */\nfunction getMediaTypeFromUrl(url: string, contentType?: string | null): 'image' | 'video' | 'audio' | 'webpage' | 'unknown' {\n const lowerUrl = url.toLowerCase();\n const lowerContentType = contentType?.toLowerCase() || '';\n\n // Check content type first\n if (lowerContentType.startsWith('image/')) return 'image';\n if (lowerContentType.startsWith('video/')) return 'video';\n if (lowerContentType.startsWith('audio/')) return 'audio';\n\n // Fall back to URL extension\n const imageExtensions = ['.jpg', '.jpeg', '.png', '.gif', '.webp', '.svg', '.bmp', '.ico'];\n const videoExtensions = ['.mp4', '.webm', '.mov', '.avi', '.mkv', '.m4v'];\n const audioExtensions = ['.mp3', '.wav', '.ogg', '.flac', '.aac', '.m4a'];\n\n if (imageExtensions.some(ext => lowerUrl.includes(ext))) return 'image';\n if (videoExtensions.some(ext => lowerUrl.includes(ext))) return 'video';\n if (audioExtensions.some(ext => lowerUrl.includes(ext))) return 'audio';\n\n return 'webpage';\n}\n\n/**\n * Processed embed information\n */\nexport interface ProcessedEmbed {\n id: string;\n url: string;\n type: 'image' | 'video' | 'audio' | 'webpage' | 'cast' | 'frame' | 'unknown';\n title?: string;\n description?: string;\n text?: string;\n source: string;\n metadata?: {\n width?: number;\n height?: number;\n duration?: number;\n contentType?: string;\n // For embedded casts\n castHash?: string;\n authorFid?: number;\n authorUsername?: string;\n };\n}\n\n/**\n * Manager class for processing Farcaster embeds (images, videos, URLs, frames, etc.)\n * Similar to Discord's AttachmentManager but for Farcaster-specific embed types\n */\nexport class EmbedManager {\n private runtime: IAgentRuntime;\n private embedCache: Map<string, ProcessedEmbed> = new Map();\n\n constructor(runtime: IAgentRuntime) {\n this.runtime = runtime;\n }\n\n /**\n * Process all embeds from a cast and return Media objects\n */\n async processEmbeds(embeds: NeynarEmbed[]): Promise<Media[]> {\n if (embeds.length === 0) {\n return [];\n }\n\n this.runtime.logger.info(\n { embedCount: embeds.length },\n '[EmbedManager] Processing embeds from cast'\n );\n\n const processedMedia: Media[] = [];\n\n for (const embed of embeds) {\n try {\n const processed = await this.processEmbed(embed);\n if (processed) {\n processedMedia.push(this.toMedia(processed));\n }\n } catch (error) {\n this.runtime.logger.warn(\n { error: error instanceof Error ? error.message : String(error) },\n '[EmbedManager] Failed to process embed'\n );\n }\n }\n\n this.runtime.logger.info(\n { processedCount: processedMedia.length, types: processedMedia.map(m => m.source) },\n '[EmbedManager] Finished processing embeds'\n );\n\n return processedMedia;\n }\n\n /**\n * Process a single embed\n */\n async processEmbed(embed: NeynarEmbed): Promise<ProcessedEmbed | null> {\n if (isEmbedUrl(embed)) {\n return this.processUrlEmbed(embed);\n } else if (isEmbedCast(embed)) {\n return this.processCastEmbed(embed);\n }\n \n this.runtime.logger.debug('[EmbedManager] Unknown embed type');\n return null;\n }\n\n /**\n * Process a URL embed (image, video, webpage, frame)\n */\n private async processUrlEmbed(embed: EmbedUrl): Promise<ProcessedEmbed> {\n const { url, metadata } = embed;\n const embedId = `embed-${this.hashUrl(url)}`;\n\n // Check cache\n if (this.embedCache.has(embedId)) {\n return this.embedCache.get(embedId)!;\n }\n\n const contentType = metadata?.content_type;\n const mediaType = getMediaTypeFromUrl(url, contentType);\n\n // Check if it's a Farcaster Frame\n if (metadata?.frame) {\n return this.processFrameEmbed(embed, embedId);\n }\n\n let processed: ProcessedEmbed;\n\n switch (mediaType) {\n case 'image':\n processed = await this.processImageEmbed(embed, embedId);\n break;\n case 'video':\n processed = await this.processVideoEmbed(embed, embedId);\n break;\n case 'audio':\n processed = await this.processAudioEmbed(embed, embedId);\n break;\n default:\n processed = await this.processWebpageEmbed(embed, embedId);\n }\n\n this.embedCache.set(embedId, processed);\n return processed;\n }\n\n /**\n * Process an image embed - uses vision model for description\n */\n private async processImageEmbed(embed: EmbedUrl, embedId: string): Promise<ProcessedEmbed> {\n const { url, metadata } = embed;\n \n let description = 'An image attachment';\n let title = 'Image';\n\n try {\n // Use vision model to describe the image\n // Pass as object with prompt and imageUrl for compatibility with OpenAI plugin\n // Default to gpt-4o-mini which supports vision - can be overridden via OPENAI_IMAGE_DESCRIPTION_MODEL\n const result = await this.runtime.useModel(ModelType.IMAGE_DESCRIPTION, {\n prompt: 'Analyze this image and provide a concise title and description. Focus on the main subject and any notable details.',\n imageUrl: url,\n model: 'gpt-4o-mini', // Default vision model - supports image analysis\n });\n \n if (result && typeof result === 'object') {\n const typedResult = result as { title?: string; description?: string };\n description = typedResult.description || description;\n title = typedResult.title || title;\n } else if (typeof result === 'string') {\n description = result;\n }\n\n this.runtime.logger.info(\n { url: url.substring(0, 60) + '...', descriptionLength: description.length, title },\n '[EmbedManager] Processed image with vision model'\n );\n } catch (error) {\n this.runtime.logger.warn(\n { url, error: error instanceof Error ? error.message : String(error) },\n '[EmbedManager] Failed to describe image, using fallback'\n );\n }\n\n return {\n id: embedId,\n url,\n type: 'image',\n title,\n description,\n text: description,\n source: 'Farcaster',\n metadata: {\n width: metadata?.image?.width_px,\n height: metadata?.image?.height_px,\n contentType: metadata?.content_type || 'image/*',\n },\n };\n }\n\n /**\n * Process a video embed\n */\n private async processVideoEmbed(embed: EmbedUrl, embedId: string): Promise<ProcessedEmbed> {\n const { url, metadata } = embed;\n\n // For now, we note it's a video - transcription would require downloading\n // which may not be appropriate for all use cases\n const description = metadata?.video?.duration_s\n ? `Video (${Math.round(metadata.video.duration_s)}s)`\n : 'Video attachment';\n\n return {\n id: embedId,\n url,\n type: 'video',\n title: 'Video',\n description,\n text: description,\n source: 'Farcaster',\n metadata: {\n duration: metadata?.video?.duration_s,\n contentType: metadata?.content_type || 'video/*',\n },\n };\n }\n\n /**\n * Process an audio embed\n */\n private async processAudioEmbed(embed: EmbedUrl, embedId: string): Promise<ProcessedEmbed> {\n const { url, metadata } = embed;\n\n // Similar to video - note it's audio\n const description = 'Audio attachment';\n\n return {\n id: embedId,\n url,\n type: 'audio',\n title: 'Audio',\n description,\n text: description,\n source: 'Farcaster',\n metadata: {\n contentType: metadata?.content_type || 'audio/*',\n },\n };\n }\n\n /**\n * Process a webpage embed (link with HTML metadata)\n */\n private async processWebpageEmbed(embed: EmbedUrl, embedId: string): Promise<ProcessedEmbed> {\n const { url, metadata } = embed;\n const html = metadata?.html;\n\n const title = html?.ogTitle || html?.ogSiteName || 'Web Page';\n // Extract hostname safely without using URL constructor (may not be available in all environments)\n const hostnameMatch = url.match(/^(?:https?:\\/\\/)?([^/?#]+)/);\n const hostname = hostnameMatch ? hostnameMatch[1] : url;\n const description = html?.ogDescription || `Link to ${hostname}`;\n\n return {\n id: embedId,\n url,\n type: 'webpage',\n title,\n description,\n text: `${title}: ${description}`,\n source: 'Web',\n metadata: {\n contentType: 'text/html',\n },\n };\n }\n\n /**\n * Process a Farcaster Frame embed\n */\n private async processFrameEmbed(embed: EmbedUrl, embedId: string): Promise<ProcessedEmbed> {\n const { url, metadata } = embed;\n const frame = metadata?.frame;\n\n const title = frame?.title || 'Farcaster Frame';\n const description = `Interactive Frame: ${title}`;\n\n return {\n id: embedId,\n url,\n type: 'frame',\n title,\n description,\n text: description,\n source: 'Frame',\n metadata: {\n contentType: 'application/x-farcaster-frame',\n },\n };\n }\n\n /**\n * Process an embedded cast (quote cast)\n */\n private async processCastEmbed(embed: EmbedCast): Promise<ProcessedEmbed> {\n const cast = embed.cast;\n const embedId = `cast-${cast.hash}`;\n\n // Check cache\n if (this.embedCache.has(embedId)) {\n return this.embedCache.get(embedId)!;\n }\n\n const authorUsername = cast.author?.username || 'unknown';\n const title = `Quoted cast from @${authorUsername}`;\n const description = cast.text || '';\n\n const processed: ProcessedEmbed = {\n id: embedId,\n url: `https://warpcast.com/${authorUsername}/${cast.hash.slice(0, 10)}`,\n type: 'cast',\n title,\n description,\n text: `[Quote from @${authorUsername}]: ${description}`,\n source: 'Farcaster',\n metadata: {\n castHash: cast.hash,\n authorFid: cast.author?.fid,\n authorUsername,\n },\n };\n\n this.embedCache.set(embedId, processed);\n return processed;\n }\n\n /**\n * Convert ProcessedEmbed to elizaos Media type\n */\n private toMedia(embed: ProcessedEmbed): Media {\n return {\n id: embed.id,\n url: embed.url,\n title: embed.title || embed.type,\n source: embed.source,\n description: embed.description,\n text: embed.text,\n };\n }\n\n /**\n * Simple hash function for URL deduplication\n */\n private hashUrl(url: string): string {\n let hash = 0;\n for (let i = 0; i < url.length; i++) {\n const char = url.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash;\n }\n return Math.abs(hash).toString(36);\n }\n\n /**\n * Clear the embed cache\n */\n clearCache(): void {\n this.embedCache.clear();\n }\n}\n\n",
21
- "import { type UUID, createUniqueUuid } from '@elizaos/core';\nimport type { FarcasterClient } from '../client';\nimport { getFarcasterFid } from '../common/config';\nimport { castUuid, neynarCastToCast } from '../common/utils';\nimport { FARCASTER_SOURCE } from '../common/constants';\nimport { FarcasterMessageType, FarcasterEventTypes } from '../common/types';\nimport type { Cast } from '../common/types';\n\n// Simple interfaces for MessageService compatibility\ninterface Message {\n id: string;\n agentId: UUID;\n roomId: string;\n userId: string;\n username: string;\n text: string;\n type: FarcasterMessageType;\n timestamp: number;\n inReplyTo?: string;\n metadata?: any;\n}\n\ninterface GetMessagesOptions {\n agentId: UUID;\n roomId?: string;\n limit?: number;\n}\n\ninterface SendMessageOptions {\n agentId: UUID;\n roomId: string;\n text: string;\n type: string;\n replyToId?: string;\n metadata?: any;\n}\n\ninterface IMessageService {\n getMessages(options: GetMessagesOptions): Promise<Message[]>;\n sendMessage(options: SendMessageOptions): Promise<Message>;\n getMessage(messageId: string, agentId: UUID): Promise<Message | null>;\n}\n\nexport class FarcasterMessageService implements IMessageService {\n constructor(\n private client: FarcasterClient,\n private runtime: any\n ) { }\n\n private castToMessage(\n cast: Cast,\n agentId: UUID,\n extraMetadata?: Record<string, unknown>\n ): Message {\n return {\n id: castUuid({ hash: cast.hash, agentId }),\n agentId,\n roomId: createUniqueUuid(this.runtime, cast.threadId || cast.hash),\n userId: cast.profile.fid.toString(),\n username: cast.profile.username,\n text: cast.text,\n type: cast.inReplyTo ? FarcasterMessageType.REPLY : FarcasterMessageType.CAST,\n timestamp: cast.timestamp.getTime(),\n inReplyTo: cast.inReplyTo ? castUuid({ hash: cast.inReplyTo.hash, agentId }) : undefined,\n metadata: {\n source: FARCASTER_SOURCE,\n castHash: cast.hash,\n threadId: cast.threadId,\n authorFid: cast.authorFid,\n ...(extraMetadata || {}),\n },\n };\n }\n\n async getMessages(options: GetMessagesOptions): Promise<Message[]> {\n try {\n const { agentId, roomId, limit = 20 } = options;\n\n // Get mentions and timeline\n const fid = getFarcasterFid(this.runtime);\n if (!fid) {\n this.runtime.logger.error('[Farcaster] FARCASTER_FID is not configured');\n return [];\n }\n\n const { timeline } = await this.client.getTimeline({\n fid,\n pageSize: limit,\n });\n\n const messages: Message[] = timeline\n .map((cast) => this.castToMessage(cast, agentId))\n .filter((message) => {\n if (roomId) {\n return message.roomId === roomId;\n }\n return true;\n });\n\n return messages;\n } catch (error) {\n this.runtime.logger.error({ error }, '[Farcaster] Error fetching messages');\n return [];\n }\n }\n\n async sendMessage(options: SendMessageOptions): Promise<Message> {\n try {\n const { text, type, roomId, replyToId, agentId } = options;\n\n let inReplyTo: { hash: string; fid: number } | undefined = undefined;\n if (replyToId && type === FarcasterMessageType.REPLY) {\n // Extract cast hash from the message ID (which is a UUID)\n // In a real implementation, you'd need to maintain a mapping or extract from metadata\n const parentHash = options.metadata?.parentHash || replyToId;\n const fid = getFarcasterFid(this.runtime);\n if (!fid) {\n throw new Error('FARCASTER_FID is not configured');\n }\n inReplyTo = {\n hash: parentHash as string,\n fid,\n };\n }\n\n const casts = await this.client.sendCast({\n content: { text },\n inReplyTo,\n });\n\n if (casts.length === 0) {\n throw new Error('No cast was created');\n }\n\n const cast = neynarCastToCast(casts[0]);\n const message = this.castToMessage(cast, agentId, options.metadata);\n message.roomId = roomId;\n message.type = type as FarcasterMessageType;\n\n // Emit event for metadata tracking\n await this.runtime.emitEvent(FarcasterEventTypes.CAST_GENERATED, {\n runtime: this.runtime,\n castHash: cast.hash,\n message,\n threadId: cast.threadId,\n });\n\n return message;\n } catch (error) {\n this.runtime.logger.error({ error }, '[Farcaster] Error sending message');\n throw error;\n }\n }\n\n async deleteMessage(messageId: string, agentId: UUID): Promise<void> {\n // Farcaster doesn't support deleting casts via API\n this.runtime.logger.warn('[Farcaster] Cast deletion is not supported by the Farcaster API');\n }\n\n async getMessage(messageId: string, agentId: UUID): Promise<Message | null> {\n try {\n // Extract cast hash from the message ID\n // In production, you'd need to maintain a proper mapping\n const castHash = messageId; // Simplified for now\n\n const cast = await this.client.getCast(castHash);\n const farcasterCast = neynarCastToCast(cast);\n\n return this.castToMessage(farcasterCast, agentId);\n } catch (error) {\n this.runtime.logger.error({ error }, '[Farcaster] Error fetching message');\n return null;\n }\n }\n\n async getThread(params: { agentId: UUID; castHash: string }): Promise<Message[]> {\n try {\n const thread: Message[] = [];\n const visited = new Set<string>();\n let currentHash: string | undefined = params.castHash;\n\n while (currentHash) {\n if (visited.has(currentHash)) {\n break;\n }\n visited.add(currentHash);\n\n const cast = neynarCastToCast(await this.client.getCast(currentHash));\n thread.unshift(this.castToMessage(cast, params.agentId));\n\n currentHash = cast.inReplyTo?.hash;\n }\n\n return thread;\n } catch (error) {\n this.runtime.logger.error({ error }, '[Farcaster] Error fetching thread');\n return [];\n }\n }\n\n async markAsRead(messageIds: string[], agentId: UUID): Promise<void> {\n // Farcaster doesn't have a read/unread concept\n this.runtime.logger.debug('[Farcaster] Mark as read is not applicable for Farcaster casts');\n }\n}\n",
22
- "import {\n type IAgentRuntime,\n type UUID,\n ModelType,\n createUniqueUuid,\n} from '@elizaos/core';\nimport type { FarcasterClient } from '../client';\nimport { getFarcasterFid } from '../common/config';\nimport { castUuid, neynarCastToCast } from '../common/utils';\nimport { FARCASTER_SOURCE } from '../common/constants';\nimport type { Cast } from '../common/types';\n\n// Simple interface for Cast data\ninterface FarcasterCast {\n id: string;\n agentId: UUID;\n roomId: UUID;\n userId: string;\n username: string;\n text: string;\n timestamp: number;\n inReplyTo?: string;\n media?: any[];\n metadata?: any;\n}\n\nexport interface CastServiceInterface {\n getCasts(params: { agentId: UUID; limit?: number; cursor?: string }): Promise<FarcasterCast[]>;\n\n createCast(params: {\n agentId: UUID;\n roomId: UUID;\n text: string;\n media?: string[];\n replyTo?: {\n hash: string;\n fid: number;\n };\n }): Promise<FarcasterCast>;\n\n deleteCast(params: { agentId: UUID; castHash: string }): Promise<void>;\n\n likeCast(params: { agentId: UUID; castHash: string }): Promise<void>;\n\n unlikeCast(params: { agentId: UUID; castHash: string }): Promise<void>;\n\n recast(params: { agentId: UUID; castHash: string }): Promise<void>;\n\n unrecast(params: { agentId: UUID; castHash: string }): Promise<void>;\n\n getMentions(params: { agentId: UUID; limit?: number }): Promise<FarcasterCast[]>;\n}\n\nexport class FarcasterCastService implements CastServiceInterface {\n static serviceType = 'ICastService';\n\n constructor(\n private client: FarcasterClient,\n private runtime: IAgentRuntime\n ) {}\n\n /**\n * Get recent casts from the timeline\n */\n async getCasts(params: {\n agentId: UUID;\n limit?: number;\n cursor?: string;\n }): Promise<FarcasterCast[]> {\n try {\n const fid = getFarcasterFid(this.runtime);\n if (!fid) {\n this.runtime.logger.error('FARCASTER_FID is not configured');\n return [];\n }\n\n const { timeline } = await this.client.getTimeline({\n fid,\n pageSize: params.limit || 50,\n });\n\n return timeline.map((cast) => this.castToFarcasterCast(cast, params.agentId));\n } catch (error) {\n this.runtime.logger.error(`Failed to get casts: ${JSON.stringify({ params, error })}`);\n return [];\n }\n }\n\n /**\n * Create a new cast\n */\n async createCast(params: {\n agentId: UUID;\n roomId: UUID;\n text: string;\n media?: string[];\n replyTo?: {\n hash: string;\n fid: number;\n };\n }): Promise<FarcasterCast> {\n try {\n // Generate cast content using AI if needed\n let castText = params.text;\n\n if (!castText || castText.trim() === '') {\n castText = await this.generateCastContent();\n }\n\n // Ensure cast doesn't exceed character limit (320 characters for Farcaster)\n if (castText.length > 320) {\n castText = await this.truncateCast(castText);\n }\n\n // Send the cast\n const casts = await this.client.sendCast({\n content: { text: castText },\n inReplyTo: params.replyTo\n ? { hash: params.replyTo.hash, fid: params.replyTo.fid }\n : undefined,\n });\n\n if (casts.length === 0) {\n throw new Error('No cast was created');\n }\n\n const cast = neynarCastToCast(casts[0]);\n const farcasterCast: FarcasterCast = {\n id: castUuid({ hash: cast.hash, agentId: params.agentId }),\n agentId: params.agentId,\n roomId: params.roomId,\n userId: cast.profile.fid.toString(),\n username: cast.profile.username,\n text: cast.text,\n timestamp: cast.timestamp.getTime(),\n inReplyTo: params.replyTo?.hash,\n media: [], // TODO: Handle media upload when Farcaster API supports it\n metadata: {\n castHash: cast.hash,\n threadId: cast.threadId,\n authorFid: cast.authorFid,\n source: FARCASTER_SOURCE,\n },\n };\n\n // Store the cast in memory\n await this.storeCastInMemory(params.roomId, farcasterCast);\n\n return farcasterCast;\n } catch (error) {\n this.runtime.logger.error(`Failed to create cast: ${JSON.stringify({ params, error })}`);\n throw error;\n }\n }\n\n /**\n * Delete a cast\n */\n async deleteCast(params: { agentId: UUID; castHash: string }): Promise<void> {\n try {\n // Farcaster doesn't support deleting casts via API\n this.runtime.logger.warn(`Cast deletion is not supported by the Farcaster API: ${JSON.stringify({ castHash: params.castHash })}`);\n } catch (error) {\n this.runtime.logger.error(`Failed to delete cast: ${JSON.stringify({ params, error })}`);\n throw error;\n }\n }\n\n /**\n * Like a cast\n */\n async likeCast(params: { agentId: UUID; castHash: string }): Promise<void> {\n try {\n // TODO: Implement like functionality when Neynar API supports it\n this.runtime.logger.info(`Like functionality not yet implemented for cast: ${JSON.stringify({ castHash: params.castHash })}`);\n\n // In a full implementation, this would call the Neynar API\n // await this.client.neynar.likeCast({ signerUuid, castHash: params.castHash });\n } catch (error) {\n this.runtime.logger.error(`Failed to like cast: ${JSON.stringify({ params, error })}`);\n throw error;\n }\n }\n\n /**\n * Unlike a cast\n */\n async unlikeCast(params: { agentId: UUID; castHash: string }): Promise<void> {\n try {\n // TODO: Implement unlike functionality when Neynar API supports it\n this.runtime.logger.info(`Unlike functionality not yet implemented for cast: ${JSON.stringify({ castHash: params.castHash })}`);\n\n // In a full implementation, this would call the Neynar API\n // await this.client.neynar.unlikeCast({ signerUuid, castHash: params.castHash });\n } catch (error) {\n this.runtime.logger.error(`Failed to unlike cast: ${JSON.stringify({ params, error })}`);\n throw error;\n }\n }\n\n /**\n * Recast a cast\n */\n async recast(params: { agentId: UUID; castHash: string }): Promise<void> {\n try {\n // TODO: Implement recast functionality when Neynar API supports it\n this.runtime.logger.info(`Recast functionality not yet implemented for cast: ${JSON.stringify({ castHash: params.castHash })}`);\n\n // In a full implementation, this would call the Neynar API\n // await this.client.neynar.recast({ signerUuid, castHash: params.castHash });\n } catch (error) {\n this.runtime.logger.error(`Failed to recast: ${JSON.stringify({ params, error })}`);\n throw error;\n }\n }\n\n /**\n * Remove a recast\n */\n async unrecast(params: { agentId: UUID; castHash: string }): Promise<void> {\n try {\n // TODO: Implement unrecast functionality when Neynar API supports it\n this.runtime.logger.info(`Remove recast functionality not yet implemented for cast: ${JSON.stringify({ castHash: params.castHash })}`);\n\n // In a full implementation, this would call the Neynar API\n // await this.client.neynar.unrecast({ signerUuid, castHash: params.castHash });\n } catch (error) {\n this.runtime.logger.error(`Failed to remove recast: ${JSON.stringify({ params, error })}`);\n throw error;\n }\n }\n\n /**\n * Get mentions\n */\n async getMentions(params: { agentId: UUID; limit?: number }): Promise<FarcasterCast[]> {\n try {\n const fid = getFarcasterFid(this.runtime);\n if (!fid) {\n this.runtime.logger.error('FARCASTER_FID is not configured');\n return [];\n }\n\n const mentions = await this.client.getMentions({\n fid,\n pageSize: params.limit || 20,\n });\n\n return mentions.map((castWithInteractions) => {\n const cast = neynarCastToCast(castWithInteractions);\n return this.castToFarcasterCast(cast, params.agentId);\n });\n } catch (error) {\n this.runtime.logger.error(`Failed to get mentions: ${JSON.stringify({ params, error })}`);\n return [];\n }\n }\n\n /**\n * Generate cast content using AI\n */\n private async generateCastContent(): Promise<string> {\n const prompt = `Generate an interesting and engaging Farcaster cast. It should be conversational, authentic, and under 320 characters. Topics can include technology, AI, crypto, decentralized social media, or general observations about life.`;\n\n try {\n const response = await this.runtime.useModel(ModelType.TEXT_SMALL, {\n prompt,\n maxTokens: 100,\n });\n\n return response as string;\n } catch (error) {\n this.runtime.logger.error(`Failed to generate cast content: ${JSON.stringify({ error })}`);\n return 'Hello Farcaster! 👋';\n }\n }\n\n /**\n * Truncate cast to fit character limit\n */\n private async truncateCast(text: string): Promise<string> {\n const prompt = `Shorten this text to under 320 characters while keeping the main message intact: \"${text}\"`;\n\n try {\n const response = await this.runtime.useModel(ModelType.TEXT_SMALL, {\n prompt,\n maxTokens: 100,\n });\n\n const truncated = response as string;\n\n // Ensure it's actually under the limit\n if (truncated.length > 320) {\n return truncated.substring(0, 317) + '...';\n }\n\n return truncated;\n } catch (error) {\n this.runtime.logger.error(`Failed to truncate cast: ${JSON.stringify({ error })}`);\n return text.substring(0, 317) + '...';\n }\n }\n\n /**\n * Store cast in agent memory\n */\n private async storeCastInMemory(roomId: UUID, cast: FarcasterCast): Promise<void> {\n try {\n const memory = {\n id: createUniqueUuid(this.runtime, cast.id),\n agentId: this.runtime.agentId,\n content: {\n text: cast.text,\n castHash: cast.metadata?.castHash,\n castId: cast.id,\n author: cast.username,\n timestamp: cast.timestamp,\n },\n roomId,\n userId: cast.userId,\n createdAt: Date.now(),\n };\n\n // Store memory using the runtime's API\n // Note: The exact method may vary based on ElizaOS version\n if (typeof (this.runtime as any).storeMemory === 'function') {\n await (this.runtime as any).storeMemory(memory);\n } else if (\n (this.runtime as any).memory &&\n typeof (this.runtime as any).memory.create === 'function'\n ) {\n await (this.runtime as any).memory.create(memory);\n } else {\n this.runtime.logger.warn('Memory storage method not available in runtime');\n }\n } catch (error) {\n this.runtime.logger.error(`Failed to store cast in memory: ${JSON.stringify({ error })}`);\n }\n }\n\n /**\n * Convert internal Cast type to FarcasterCast\n */\n private castToFarcasterCast(cast: Cast, agentId: UUID): FarcasterCast {\n return {\n id: castUuid({ hash: cast.hash, agentId }),\n agentId,\n roomId: createUniqueUuid(this.runtime, cast.threadId || cast.hash),\n userId: cast.profile.fid.toString(),\n username: cast.profile.username,\n text: cast.text,\n timestamp: cast.timestamp.getTime(),\n media: [], // Farcaster casts can have embedded media but not in our Cast type\n metadata: {\n castHash: cast.hash,\n threadId: cast.threadId,\n authorFid: cast.authorFid,\n source: FARCASTER_SOURCE,\n stats: cast.stats,\n },\n };\n }\n}\n",
23
- "import {\n type IAgentRuntime,\n ModelType,\n type TestSuite,\n createUniqueUuid,\n type TestCase,\n} from '@elizaos/core';\nimport { getFarcasterFid, hasFarcasterEnabled } from '../common/config';\nimport { FARCASTER_SERVICE_NAME } from '../common/constants';\nimport { FidRequest, FarcasterMessageType } from '../common/types';\nimport { FarcasterAgentManager } from '../managers/agent';\nimport { TEST_IMAGE } from './test-utils';\nimport { farcasterE2EScenarios } from './e2e/scenarios';\n\n/**\n * Represents a Test Suite for Farcaster functionality.\n * This class implements the TestSuite interface.\n * It contains various test cases related to Farcaster operations such as initializing the client,\n * fetching profile, fetching casts, posting casts, and handling cast interactions.\n */\nexport class FarcasterTestSuite implements TestSuite {\n name = 'Farcaster Plugin Tests';\n description = 'Test suite for Farcaster plugin functionality';\n private manager: FarcasterAgentManager | null = null;\n tests: TestCase[];\n\n /**\n * Constructor for TestSuite class.\n * Initializes an array of test functions to be executed.\n */\n constructor() {\n // The decision to run real or mock tests is now deferred to the execution of each test case.\n // The constructor simply sets up all possible tests.\n this.tests = farcasterE2EScenarios.map((realTest) => {\n // Find a corresponding mock test or create a default one.\n const mockTest: TestCase = {\n name: `Mock: ${realTest.name}`,\n fn: async (runtime: IAgentRuntime) => {\n runtime.logger.info(\n `This is a mock execution of \"${realTest.name}\". To run the real test, configure Farcaster settings for the '${runtime.character.name}' agent.`\n );\n // You could add mock service validation here if needed.\n const service = runtime.getService(FARCASTER_SERVICE_NAME);\n if (!service) {\n runtime.logger.warn('Farcaster service not available in mock mode, which might be expected.');\n }\n },\n };\n return this.credentialedOrMockTest(realTest, mockTest);\n });\n\n // Add a standalone configuration check test that always runs.\n this.tests.unshift({\n name: 'Check Farcaster Configuration',\n fn: this.testConfiguration.bind(this),\n });\n }\n\n /**\n * A wrapper for test cases that dynamically runs either a real or mock test\n * based on the presence of Farcaster credentials in the agent's runtime settings.\n *\n * @param realTest - The test case to run if credentials are provided.\n * @param mockTest - An optional mock test case to run as a fallback.\n * @returns A TestCase that handles the conditional logic.\n */\n private credentialedOrMockTest(realTest: TestCase, mockTest?: TestCase): TestCase {\n return {\n name: realTest.name,\n fn: async (runtime: IAgentRuntime) => {\n if (hasFarcasterEnabled(runtime)) {\n runtime.logger.info(\n `[${realTest.name}] Running test with real credentials for agent: ${runtime.character.name}`\n );\n await realTest.fn(runtime);\n } else {\n if (mockTest) {\n runtime.logger.warn(\n `[${mockTest.name}] Running mock test for agent: ${runtime.character.name} (credentials not found)`\n );\n await mockTest.fn(runtime);\n } else {\n runtime.logger.info(\n `[${realTest.name}] Skipping test for agent: ${runtime.character.name} (credentials not found)`\n );\n }\n }\n },\n };\n }\n\n /**\n * Test that checks and logs the Farcaster configuration for the current agent.\n */\n async testConfiguration(runtime: IAgentRuntime) {\n runtime.logger.info(`=== Farcaster Test Configuration for [${runtime.character.name}] ===`);\n const fid = runtime.getSetting('FARCASTER_FID');\n const signerUuid = runtime.getSetting('FARCASTER_SIGNER_UUID');\n const apiKey = runtime.getSetting('FARCASTER_NEYNAR_API_KEY');\n const dryRun = runtime.getSetting('FARCASTER_DRY_RUN') || 'not set (defaults to false)';\n\n runtime.logger.info(`FID: ${fid ? '✓ Found' : '✗ Missing'}`);\n runtime.logger.info(`Signer UUID: ${signerUuid ? '✓ Found' : '✗ Missing'}`);\n runtime.logger.info(`API Key: ${apiKey ? '✓ Found' : '✗ Missing'}`);\n runtime.logger.info(`Dry Run: ${dryRun}`);\n runtime.logger.info('===================================================');\n\n if (!hasFarcasterEnabled(runtime)) {\n runtime.logger.warn(\n `⚠️ Farcaster credentials not found in settings for agent [${runtime.character.name}]. Tests will be skipped or mocked.`\n );\n } else {\n runtime.logger.success(`✅ Farcaster credentials found for agent [${runtime.character.name}].`);\n }\n }\n\n /**\n * Test that checks if Farcaster is properly configured\n */\n async testMockConfiguration(runtime: IAgentRuntime) {\n runtime.logger.info('Running mock configuration test');\n \n const fid = runtime.getSetting('FARCASTER_FID');\n const signerUuid = runtime.getSetting('FARCASTER_SIGNER_UUID');\n const apiKey = runtime.getSetting('FARCASTER_NEYNAR_API_KEY');\n \n runtime.logger.info('Runtime settings check:');\n runtime.logger.info(`- FID from runtime: ${fid ? 'Found' : 'Not found'}`);\n runtime.logger.info(`- Signer UUID from runtime: ${signerUuid ? 'Found' : 'Not found'}`);\n runtime.logger.info(`- API Key from runtime: ${apiKey ? 'Found' : 'Not found'}`);\n \n if (!fid || !signerUuid || !apiKey) {\n runtime.logger.info('Farcaster not configured - this is expected in mock mode');\n runtime.logger.info('To enable real tests, configure the following:');\n runtime.logger.info('- FARCASTER_FID: Your Farcaster ID');\n runtime.logger.info('- FARCASTER_SIGNER_UUID: Neynar signer UUID');\n runtime.logger.info('- FARCASTER_NEYNAR_API_KEY: Neynar API key');\n }\n }\n\n /**\n * Test service initialization without real credentials\n */\n async testMockServiceInit(runtime: IAgentRuntime) {\n runtime.logger.info('Running mock service initialization test');\n \n try {\n const service = runtime.getService(FARCASTER_SERVICE_NAME) as any;\n \n if (!service) {\n runtime.logger.info('Farcaster service not available - this is expected without credentials');\n return;\n }\n \n runtime.logger.info('Farcaster service is registered but may not be fully initialized');\n \n // Test that service methods exist\n if (typeof service.getMessageService === 'function') {\n runtime.logger.info('✓ getMessageService method exists');\n }\n \n if (typeof service.getPostService === 'function') {\n runtime.logger.info('✓ getPostService method exists');\n }\n \n if (typeof service.healthCheck === 'function') {\n runtime.logger.info('✓ healthCheck method exists');\n }\n \n } catch (error) {\n runtime.logger.info('Service initialization check completed');\n }\n }\n\n /**\n * Asynchronously initializes the Farcaster client for the provided agent runtime.\n *\n * @param {IAgentRuntime} runtime - The agent runtime to use for initializing the Farcaster client.\n * @throws {Error} If the Farcaster client manager is not found or if the Farcaster client fails to initialize.\n */\n async testInitializingClient(runtime: IAgentRuntime) {\n try {\n const service = runtime.getService(FARCASTER_SERVICE_NAME) as any;\n if (!service) {\n throw new Error('Farcaster service not found');\n }\n\n this.manager = service.managers.get(runtime.agentId);\n\n if (this.manager) {\n runtime.logger.debug('FarcasterAgentManager initialized successfully.');\n } else {\n throw new Error('FarcasterAgentManager failed to initialize.');\n }\n } catch (error) {\n throw new Error(`Error in initializing Farcaster client: ${error}`);\n }\n }\n\n /**\n * Asynchronously fetches the profile of a user from Farcaster using the given runtime.\n *\n * @param {IAgentRuntime} runtime The runtime to use for fetching the profile.\n * @returns {Promise<void>} A Promise that resolves when the profile is successfully fetched, or rejects with an error.\n */\n async testFetchProfile(runtime: IAgentRuntime) {\n try {\n if (!this.manager) {\n throw new Error('FarcasterAgentManager not initialized');\n }\n\n const fid = getFarcasterFid(runtime);\n if (!fid) {\n throw new Error('Invalid FID in settings.');\n }\n\n const profile = await this.manager.client.getProfile(fid);\n if (!profile || !profile.fid) {\n throw new Error('Profile fetch failed.');\n }\n runtime.logger.log('Successfully fetched Farcaster profile:', JSON.stringify(profile));\n } catch (error) {\n throw new Error(`Error fetching Farcaster profile: ${error}`);\n }\n }\n\n /**\n * Asynchronously fetches the timeline from the Farcaster client.\n *\n * @param {IAgentRuntime} runtime - The agent runtime object.\n * @throws {Error} If there are no casts in the timeline.\n * @throws {Error} If an error occurs while fetching the timeline.\n */\n async testFetchTimeline(runtime: IAgentRuntime) {\n try {\n if (!this.manager) {\n throw new Error('FarcasterAgentManager not initialized');\n }\n\n const fid = getFarcasterFid(runtime);\n if (!fid) {\n throw new Error('Invalid FID in settings.');\n }\n\n const request: FidRequest = { fid, pageSize: 5 };\n const result = await this.manager.client.getTimeline(request);\n\n if (!result.timeline || result.timeline.length === 0) {\n throw new Error('No casts in timeline.');\n }\n runtime.logger.log(`Successfully fetched ${result.timeline.length} casts from timeline.`);\n } catch (error) {\n throw new Error(`Error fetching timeline: ${error}`);\n }\n }\n\n /**\n * Asynchronously posts a test cast using the Farcaster API.\n *\n * @param {IAgentRuntime} runtime - The agent runtime object.\n * @returns {Promise<void>} A Promise that resolves when the cast is successfully posted.\n * @throws {Error} If there is an error posting the cast.\n */\n async testPostCast(runtime: IAgentRuntime) {\n try {\n if (!this.manager) {\n throw new Error('FarcasterAgentManager not initialized');\n }\n\n const castText = await this.generateRandomCastContent(runtime);\n const result = await this.manager.client.sendCast({\n content: { text: castText },\n });\n\n if (!result || result.length === 0) {\n throw new Error('Cast posting failed.');\n }\n runtime.logger.success('Successfully posted a test cast.');\n } catch (error) {\n throw new Error(`Error posting a cast: ${error}`);\n }\n }\n\n /**\n * Asynchronously posts an image cast on Farcaster using the provided runtime and cast content.\n * Note: This might need updating based on how images are actually handled in sendCast\n *\n * @param {IAgentRuntime} runtime - The runtime environment for the action.\n * @returns {Promise<void>} A Promise that resolves when the cast is successfully posted.\n * @throws {Error} If there is an error posting the cast.\n */\n async testPostImageCast(runtime: IAgentRuntime) {\n try {\n if (!this.manager) {\n throw new Error('FarcasterAgentManager not initialized');\n }\n\n const castText = await this.generateRandomCastContent(runtime, 'image_post');\n // This implementation might need to be updated based on how images are actually handled\n const result = await this.manager.client.sendCast({\n content: {\n text: castText,\n media: [TEST_IMAGE],\n },\n });\n\n if (!result || result.length === 0) {\n throw new Error('Cast with image posting failed.');\n }\n runtime.logger.success('Successfully posted a test cast with image.');\n } catch (error) {\n throw new Error(`Error posting a cast with image: ${error}`);\n }\n }\n\n /**\n * Asynchronously handles a fake cast response using the given runtime.\n *\n * @param {IAgentRuntime} runtime - The runtime object for the agent\n * @returns {Promise<void>} - A promise that resolves when the cast response is handled\n * @throws {Error} - If there is an error handling the cast response\n */\n async testHandleCastResponse(runtime: IAgentRuntime) {\n try {\n if (!this.manager) {\n throw new Error('FarcasterAgentManager not initialized');\n }\n\n // For testing purposes, we'll just mock the event emission instead of calling the actual handler\n // This avoids dealing with complex type requirements\n const testCast = {\n hash: '0x12345',\n text: '@testUser What do you think about AI?',\n authorFid: 123,\n profile: {\n fid: 123,\n username: 'randomUser',\n name: 'Random User',\n },\n timestamp: new Date(),\n };\n\n // Create a mock memory for the test\n const memoryId = createUniqueUuid(runtime, testCast.hash);\n const memory = {\n id: memoryId,\n agentId: runtime.agentId,\n content: {\n text: testCast.text,\n },\n entityId: createUniqueUuid(runtime, String(testCast.authorFid)),\n roomId: createUniqueUuid(runtime, 'test-room'),\n createdAt: testCast.timestamp.getTime(),\n };\n\n // Emit an event to simulate the interaction\n runtime.emitEvent('farcaster.mention_received', {\n runtime,\n memory,\n cast: testCast,\n source: 'farcaster',\n });\n\n runtime.logger.success('Successfully simulated cast response handling');\n } catch (error) {\n throw new Error(`Error handling cast response: ${error}`);\n }\n }\n\n /**\n * Generates random content for a cast based on the given context.\n *\n * @param {IAgentRuntime} runtime - The runtime environment.\n * @param {string} context - Optional context for the content generation.\n * @returns {Promise<string>} A promise that resolves to the generated cast content.\n */\n private async generateRandomCastContent(\n runtime: IAgentRuntime,\n context = 'general'\n ): Promise<string> {\n const prompt = `Generate a short, interesting cast about ${context} (max 280 chars).`;\n // Use TEXT_SMALL instead of CHAT since that seems to be the correct ModelType\n const result = await runtime.useModel(ModelType.TEXT_SMALL, {\n prompt,\n });\n\n // Truncate the result to ensure it doesn't exceed 280 characters\n return (result as string).substring(0, 280);\n }\n\n /**\n * Tests the MessageService functionality\n *\n * @param {IAgentRuntime} runtime - The runtime environment.\n * @returns {Promise<void>} A promise that resolves when the test is complete.\n */\n async testMessageService(runtime: IAgentRuntime) {\n try {\n const service = runtime.getService(FARCASTER_SERVICE_NAME) as any;\n if (!service) {\n throw new Error('Farcaster service not found');\n }\n\n const messageService = service.getMessageService(runtime.agentId);\n if (!messageService) {\n throw new Error('MessageService not initialized');\n }\n\n // Test getMessages\n const messages = await messageService.getMessages({\n agentId: runtime.agentId,\n limit: 5,\n });\n\n runtime.logger.log(`Retrieved ${messages.length} messages from MessageService`);\n\n // Test sendMessage\n const testText = await this.generateRandomCastContent(runtime, 'message_service_test');\n const message = await messageService.sendMessage({\n agentId: runtime.agentId,\n roomId: createUniqueUuid(runtime, 'test-room'),\n text: testText,\n type: FarcasterMessageType.CAST,\n });\n\n if (!message || !message.id) {\n throw new Error('Failed to send message via MessageService');\n }\n\n runtime.logger.success('MessageService test completed successfully');\n } catch (error) {\n throw new Error(`Error testing MessageService: ${error}`);\n }\n }\n\n /**\n * Tests the PostService functionality\n *\n * @param {IAgentRuntime} runtime - The runtime environment.\n * @returns {Promise<void>} A promise that resolves when the test is complete.\n */\n async testPostService(runtime: IAgentRuntime) {\n try {\n const service = runtime.getService(FARCASTER_SERVICE_NAME) as any;\n if (!service) {\n throw new Error('Farcaster service not found');\n }\n\n const castService = service.getCastService(runtime.agentId);\n if (!castService) {\n throw new Error('CastService not initialized');\n }\n\n // Test getCasts\n const casts = await castService.getCasts({\n agentId: runtime.agentId,\n limit: 5,\n });\n\n runtime.logger.log(`Retrieved ${casts.length} casts from CastService`);\n\n // Test createCast\n const testText = await this.generateRandomCastContent(runtime, 'cast_service_test');\n const cast = await castService.createCast({\n agentId: runtime.agentId,\n roomId: createUniqueUuid(runtime, 'test-room'),\n text: testText,\n });\n\n if (!cast || !cast.id) {\n throw new Error('Failed to create cast via CastService');\n }\n\n runtime.logger.success('CastService test completed successfully');\n } catch (error) {\n throw new Error(`Error testing PostService: ${error}`);\n }\n }\n\n /**\n * Tests real account posting functionality\n *\n * @param {IAgentRuntime} runtime - The runtime environment.\n * @returns {Promise<void>} A promise that resolves when the test is complete.\n */\n async testRealAccountPosting(runtime: IAgentRuntime) {\n try {\n const service = runtime.getService(FARCASTER_SERVICE_NAME) as any;\n if (!service) {\n throw new Error('Farcaster service not found');\n }\n\n const postService = service.getPostService(runtime.agentId);\n if (!postService) {\n throw new Error('PostService not initialized');\n }\n\n // Create multiple posts to test real functionality\n const testPosts = [\n 'Testing ElizaOS Farcaster integration! 🚀 #ElizaOS',\n 'AI agents are the future of social media engagement 🤖',\n 'Building amazing things with the ElizaOS framework 💻',\n ];\n\n for (const text of testPosts) {\n const post = await postService.createPost({\n agentId: runtime.agentId,\n roomId: createUniqueUuid(runtime, 'real-test'),\n text,\n });\n\n if (!post || !post.id || !post.metadata?.castHash) {\n throw new Error('Failed to create real post');\n }\n\n runtime.logger.success(`Posted real cast: ${post.metadata.castHash}`);\n \n // Wait a bit between posts to avoid rate limiting\n await new Promise(resolve => setTimeout(resolve, 1000));\n }\n\n runtime.logger.success('Real account posting test completed successfully');\n } catch (error) {\n throw new Error(`Error testing real account posting: ${error}`);\n }\n }\n\n /**\n * Tests real account interactions (mentions, replies, etc)\n *\n * @param {IAgentRuntime} runtime - The runtime environment.\n * @returns {Promise<void>} A promise that resolves when the test is complete.\n */\n async testRealAccountInteractions(runtime: IAgentRuntime) {\n try {\n const service = runtime.getService(FARCASTER_SERVICE_NAME) as any;\n if (!service) {\n throw new Error('Farcaster service not found');\n }\n\n const postService = service.getPostService(runtime.agentId);\n const messageService = service.getMessageService(runtime.agentId);\n \n if (!postService || !messageService) {\n throw new Error('Services not initialized');\n }\n\n // Get recent mentions\n const mentions = await postService.getMentions(runtime.agentId, { limit: 10 });\n runtime.logger.log(`Found ${mentions.length} mentions`);\n\n // Get timeline posts\n const timeline = await postService.getPosts({\n agentId: runtime.agentId,\n limit: 20,\n });\n runtime.logger.log(`Found ${timeline.length} timeline posts`);\n\n // If we have posts, try to reply to one\n if (timeline.length > 0) {\n const targetPost = timeline[0];\n if (targetPost.metadata?.castHash) {\n const reply = await messageService.sendMessage({\n agentId: runtime.agentId,\n roomId: targetPost.roomId,\n text: 'Great post! Testing real interactions with ElizaOS 🎉',\n type: FarcasterMessageType.REPLY,\n replyToId: targetPost.metadata.castHash,\n metadata: {\n parentHash: targetPost.metadata.castHash,\n },\n });\n\n if (reply && reply.metadata?.castHash) {\n runtime.logger.success(`Replied to cast with: ${reply.metadata.castHash}`);\n }\n }\n }\n\n runtime.logger.success('Real account interactions test completed successfully');\n } catch (error) {\n throw new Error(`Error testing real account interactions: ${error}`);\n }\n }\n\n /**\n * Tests message metadata tracking functionality\n *\n * @param {IAgentRuntime} runtime - The runtime environment.\n * @returns {Promise<void>} A promise that resolves when the test is complete.\n */\n async testMessageMetadataTracking(runtime: IAgentRuntime) {\n try {\n const service = runtime.getService(FARCASTER_SERVICE_NAME) as any;\n if (!service) {\n throw new Error('Farcaster service not found');\n }\n\n const messageService = service.getMessageService(runtime.agentId);\n if (!messageService) {\n throw new Error('MessageService not initialized');\n }\n\n // Send a message and track its metadata\n const testMessage = await messageService.sendMessage({\n agentId: runtime.agentId,\n roomId: createUniqueUuid(runtime, 'metadata-test'),\n text: 'Testing metadata tracking with ElizaOS',\n type: FarcasterMessageType.CAST,\n });\n\n if (!testMessage || !testMessage.metadata?.castHash) {\n throw new Error('Failed to send test message');\n }\n\n const castHash = testMessage.metadata.castHash;\n runtime.logger.log(`Sent message with cast hash: ${castHash}`);\n\n // Verify we can retrieve the message by its hash\n const retrievedMessage = await messageService.getMessage(castHash, runtime.agentId);\n \n if (!retrievedMessage) {\n throw new Error('Failed to retrieve message by hash');\n }\n\n // Verify metadata is properly stored\n if (retrievedMessage.metadata?.castHash !== castHash) {\n throw new Error('Metadata mismatch in retrieved message');\n }\n\n runtime.logger.success('Message metadata tracking test completed successfully');\n } catch (error) {\n throw new Error(`Error testing message metadata tracking: ${error}`);\n }\n }\n}\n",
24
- "import type { FarcasterClient } from '../client';\nimport type { Cast, Profile } from '../common/types';\nimport type { TestInteraction } from './types';\n\nexport function createTestInteraction(cast: Cast, profile: Profile): TestInteraction | null {\n // Only create interaction if there is significant engagement\n if (\n !cast.stats ||\n (cast.stats.recasts === 0 && cast.stats.replies === 0 && cast.stats.likes === 0)\n ) {\n return null;\n }\n\n // Simple heuristic: if the cast has more replies, reply to it\n if (cast.stats.replies > cast.stats.recasts && cast.stats.replies > cast.stats.likes) {\n return {\n type: 'REPLY',\n castId: cast.hash,\n content: 'Interesting perspective!',\n };\n }\n\n // If it has more likes, like it\n if (cast.stats.likes > cast.stats.recasts && cast.stats.likes > cast.stats.replies) {\n return {\n type: 'LIKE',\n castId: cast.hash,\n };\n }\n\n // Otherwise, recast it\n return {\n type: 'RECAST',\n castId: cast.hash,\n };\n}\n\nexport async function handleTestInteraction(client: FarcasterClient, interaction: TestInteraction) {\n // Validate the interaction\n if (!interaction.castId) {\n throw new Error(`Cast ID required for ${interaction.type.toLowerCase()}`);\n }\n if (interaction.type === 'REPLY' && !interaction.content) {\n throw new Error('Cast ID and content required for reply');\n }\n \n // Create a mock response that matches what the tests expect\n const mockResponse = {\n success: true,\n cast: {\n hash: `interaction-${Date.now()}`,\n text: interaction.type === 'REPLY' ? interaction.content || '' : '',\n parent_hash: interaction.castId,\n timestamp: new Date().toISOString(),\n }\n };\n \n // Since we can't access private properties, return a mock response\n // In real usage, this would go through the client's public methods\n return Promise.resolve(mockResponse);\n}\n\nexport async function createTestCast(client: FarcasterClient, content: string) {\n if (!content) {\n throw new Error('Cast content cannot be empty');\n }\n if (content.length > 320) {\n throw new Error('Cast content too long');\n }\n \n // Since we can't access private properties, use the public sendCast method\n const result = await client.sendCast({ content: { text: content } });\n if (result.length > 0) {\n return { success: true, cast: result[0] };\n }\n throw new Error('Failed to create cast');\n}\n\nexport const TEST_IMAGE_URL =\n 'https://github.com/elizaOS/awesome-eliza/blob/main/assets/eliza-logo.jpg?raw=true';\n\nexport const TEST_IMAGE = {\n id: 'mock-image-id',\n text: 'mock image',\n description: 'mock image descirption',\n source: 'mock image source',\n url: TEST_IMAGE_URL,\n title: 'mock image',\n contentType: 'image/jpeg',\n alt_text: 'mock image',\n};\n",
25
- "import { type IAgentRuntime, createUniqueUuid, type TestCase } from '@elizaos/core';\nimport { getFarcasterFid } from '../../common/config.js';\nimport { FARCASTER_SERVICE_NAME } from '../../common/constants.js';\nimport type { FarcasterService } from '../../service.js';\nimport { FarcasterMessageType } from '../../common/types.js';\n\n// E2E Test Scenarios as TestCase functions\nexport const farcasterE2EScenarios: TestCase[] = [\n {\n name: 'Farcaster Plugin - Agent Introduction',\n async fn(runtime: IAgentRuntime): Promise<void> {\n const service = runtime.getService(FARCASTER_SERVICE_NAME) as FarcasterService;\n if (!service) {\n throw new Error('Farcaster service not initialized');\n }\n\n // Test 1: Post introduction\n const castService = service.getCastService(runtime.agentId);\n if (!castService) {\n throw new Error('CastService not available');\n }\n\n const introText = `Hello Farcaster! I'm ${runtime.character.name}, an AI agent powered by ElizaOS. Looking forward to connecting with you all! 🤖`;\n \n const cast = await castService.createCast({\n agentId: runtime.agentId,\n roomId: createUniqueUuid(runtime, 'farcaster-timeline'),\n text: introText,\n });\n\n if (!cast || !cast.id || !cast.text || !cast.metadata?.castHash) {\n throw new Error('Failed to create introduction cast');\n }\n \n runtime.logger.info(`Posted introduction cast: ${cast.metadata.castHash}`);\n\n // Test 2: Fetch profile\n const manager = service.getActiveManagers().get(runtime.agentId);\n if (!manager) {\n throw new Error('Manager not found for agent');\n }\n\n const fid = getFarcasterFid(runtime);\n if (!fid) {\n throw new Error('FARCASTER_FID not configured');\n }\n const profile = await manager.client.getProfile(fid);\n\n if (!profile || profile.fid !== fid) {\n throw new Error('Profile fetch failed or FID mismatch');\n }\n \n runtime.logger.info(`Agent profile verified: @${profile.username} (FID: ${profile.fid})`);\n }\n },\n\n {\n name: 'Farcaster Plugin - Timeline Monitoring',\n\n async fn(runtime: IAgentRuntime): Promise<void> {\n const service = runtime.getService(FARCASTER_SERVICE_NAME) as FarcasterService;\n if (!service) {\n throw new Error('Farcaster service not initialized');\n }\n\n const castService = service.getCastService(runtime.agentId);\n if (!castService) {\n throw new Error('CastService not available');\n }\n\n // Test 1: Fetch timeline casts\n const casts = await castService.getCasts({\n agentId: runtime.agentId,\n limit: 10,\n });\n\n if (!Array.isArray(casts)) {\n throw new Error('getPosts did not return an array');\n }\n \n runtime.logger.info(`Found ${casts.length} casts in timeline`);\n \n if (casts.length > 0) {\n const firstCast = casts[0];\n if (!firstCast.id || !firstCast.username || !firstCast.text) {\n throw new Error('Cast missing required fields');\n }\n runtime.logger.info(`Latest cast by @${firstCast.username}: ${firstCast.text.substring(0, 50)}...`);\n }\n\n // Test 2: Fetch mentions\n const mentions = await castService.getMentions({ agentId: runtime.agentId, limit: 5 });\n \n if (!Array.isArray(mentions)) {\n throw new Error('getMentions did not return an array');\n }\n \n runtime.logger.info(`Found ${mentions.length} mentions`);\n }\n },\n\n {\n name: 'Farcaster Plugin - Message Send and Retrieve',\n async fn(runtime: IAgentRuntime): Promise<void> {\n const service = runtime.getService(FARCASTER_SERVICE_NAME) as FarcasterService;\n if (!service) {\n throw new Error('Farcaster service not initialized');\n }\n\n const messageService = service.getMessageService(runtime.agentId);\n if (!messageService) {\n throw new Error('MessageService not available');\n }\n\n const roomId = createUniqueUuid(runtime, 'test-conversation');\n \n // Send a new cast\n const message = await messageService.sendMessage({\n agentId: runtime.agentId,\n roomId,\n text: 'Testing message send and retrieve with ElizaOS Farcaster plugin! 🧪',\n type: FarcasterMessageType.CAST,\n });\n\n if (!message || !message.id || !message.metadata?.castHash) {\n throw new Error('Failed to send message or missing metadata');\n }\n \n runtime.logger.info(`Sent cast with hash: ${message.metadata.castHash}`);\n \n // Retrieve the message\n const castHash = message.metadata.castHash as string;\n const retrieved = await messageService.getMessage(castHash, runtime.agentId);\n \n if (!retrieved || retrieved.text !== message.text) {\n throw new Error('Failed to retrieve message or content mismatch');\n }\n \n runtime.logger.info('Successfully retrieved message by hash');\n }\n },\n\n {\n name: 'Farcaster Plugin - Reply Threading',\n async fn(runtime: IAgentRuntime): Promise<void> {\n const service = runtime.getService(FARCASTER_SERVICE_NAME) as FarcasterService;\n if (!service) {\n throw new Error('Farcaster service not initialized');\n }\n\n const messageService = service.getMessageService(runtime.agentId);\n const castService = service.getCastService(runtime.agentId);\n \n if (!messageService || !castService) {\n throw new Error('Services not available');\n }\n\n // First create a cast to reply to\n const originalCast = await castService.createCast({\n agentId: runtime.agentId,\n roomId: createUniqueUuid(runtime, 'reply-test'),\n text: 'This is a test cast for reply threading 🧵',\n });\n\n if (!originalCast || !originalCast.metadata?.castHash) {\n throw new Error('Failed to create original cast');\n }\n\n // Send a reply\n const reply = await messageService.sendMessage({\n agentId: runtime.agentId,\n roomId: originalCast.roomId,\n text: 'This is a test reply maintaining thread context! 💬',\n type: 'REPLY' as any,\n replyToId: originalCast.metadata.castHash,\n metadata: {\n parentHash: originalCast.metadata.castHash,\n },\n });\n \n if (!reply || !reply.inReplyTo || !reply.metadata?.castHash) {\n throw new Error('Failed to create reply or missing thread context');\n }\n \n runtime.logger.info(`Created reply ${reply.metadata.castHash} to ${originalCast.metadata.castHash}`);\n }\n },\n\n {\n name: 'Farcaster Plugin - Action Execution',\n async fn(runtime: IAgentRuntime): Promise<void> {\n // Import the action directly\n const { sendCastAction } = await import('../../actions/sendCast.js');\n \n // Create a mock message requesting a cast\n const mockMessage = {\n id: createUniqueUuid(runtime, 'test-message'),\n agentId: runtime.agentId,\n roomId: createUniqueUuid(runtime, 'test-room'),\n entityId: runtime.agentId,\n content: {\n text: 'Can you post about the ElizaOS framework on Farcaster?',\n },\n createdAt: Date.now(),\n };\n \n // Validate the action\n const shouldExecute = await sendCastAction.validate(runtime, mockMessage);\n if (!shouldExecute) {\n throw new Error('SEND_CAST action validation failed');\n }\n \n // Execute the action (returns void, so just check it doesn't throw)\n await sendCastAction.handler(runtime, mockMessage);\n \n runtime.logger.info('Successfully validated and executed SEND_CAST action');\n }\n },\n\n {\n name: 'Farcaster Plugin - Provider Context',\n async fn(runtime: IAgentRuntime): Promise<void> {\n // Import providers directly\n const { farcasterProfileProvider } = await import('../../providers/profileProvider.js');\n const { farcasterTimelineProvider } = await import('../../providers/timelineProvider.js');\n \n const mockMessage = {\n id: createUniqueUuid(runtime, 'test-message'),\n agentId: runtime.agentId,\n roomId: createUniqueUuid(runtime, 'test-room'),\n entityId: runtime.agentId,\n content: { text: 'test' },\n createdAt: Date.now(),\n };\n \n // Test profile provider\n const profileContext = await farcasterProfileProvider.get(runtime, mockMessage, { values: [], data: {}, text: '' });\n \n if (!profileContext || !profileContext.text || profileContext.data?.available === undefined) {\n throw new Error('Profile provider returned invalid context');\n }\n \n runtime.logger.info(`Profile provider: ${profileContext.text}`);\n \n // Test timeline provider\n const timelineContext = await farcasterTimelineProvider.get(runtime, mockMessage, { values: [], data: {}, text: '' });\n \n if (!timelineContext || !timelineContext.text || timelineContext.data?.available === undefined) {\n throw new Error('Timeline provider returned invalid context');\n }\n \n runtime.logger.info(`Timeline provider: ${timelineContext.text}`);\n }\n },\n\n {\n name: 'Farcaster Plugin - Rate Limit Handling',\n async fn(runtime: IAgentRuntime): Promise<void> {\n const service = runtime.getService(FARCASTER_SERVICE_NAME) as FarcasterService;\n if (!service) {\n throw new Error('Farcaster service not initialized');\n }\n\n const messageService = service.getMessageService(runtime.agentId);\n if (!messageService) {\n throw new Error('MessageService not available');\n }\n \n // Send multiple messages quickly\n const promises: Promise<any>[] = [];\n for (let i = 0; i < 3; i++) {\n promises.push(\n messageService.sendMessage({\n agentId: runtime.agentId,\n roomId: createUniqueUuid(runtime, 'rate-limit-test'),\n text: `Rate limit test message ${i + 1}`,\n type: FarcasterMessageType.CAST,\n }).catch(error => {\n runtime.logger.warn(`Expected rate limit error: ${error.message}`);\n return null;\n })\n );\n }\n \n const results = await Promise.all(promises);\n const successfulSends = results.filter(r => r !== null);\n \n if (successfulSends.length === 0) {\n throw new Error('All messages failed - check if rate limiting is too strict');\n }\n \n runtime.logger.info(`Successfully sent ${successfulSends.length} out of ${promises.length} messages`);\n }\n },\n\n {\n name: 'Farcaster Plugin - Service Health Check',\n async fn(runtime: IAgentRuntime): Promise<void> {\n const service = runtime.getService(FARCASTER_SERVICE_NAME) as FarcasterService;\n if (!service) {\n throw new Error('Farcaster service not initialized');\n }\n\n const health = await service.healthCheck();\n \n if (!health || health.healthy === undefined || !health.details) {\n throw new Error('Health check returned invalid data');\n }\n \n runtime.logger.info(`Service health: ${health.healthy ? 'Healthy' : 'Unhealthy'}`);\n runtime.logger.info(`Active managers: ${health.details.activeManagers}`);\n \n if (!health.healthy) {\n runtime.logger.warn({ details: health.details }, 'Service reported unhealthy status');\n }\n }\n },\n\n {\n name: 'Farcaster Plugin - Should Send a Real Cast',\n async fn(runtime: IAgentRuntime): Promise<void> {\n const service = runtime.getService(FARCASTER_SERVICE_NAME) as FarcasterService;\n if (!service) {\n throw new Error('FarcasterService not found');\n }\n\n const castService = service.getCastService(runtime.agentId);\n if (!castService) {\n throw new Error('CastService not available');\n }\n\n const uniqueMessage = `This is a real E2E test cast from ElizaOS! ID: ${createUniqueUuid(runtime, 'e2e-cast')}`;\n runtime.logger.info(`Attempting to post cast: \"${uniqueMessage}\"`);\n\n const cast = await castService.createCast({\n agentId: runtime.agentId,\n roomId: createUniqueUuid(runtime, 'farcaster-e2e-test'),\n text: uniqueMessage,\n });\n\n if (!cast || !cast.id) {\n throw new Error('E2E test failed to create a real cast.');\n }\n\n runtime.logger.success(`Successfully posted E2E test cast with ID: ${cast.id}`);\n // In a real-world scenario, you might want to add a step to delete this cast\n // if the API supports it, to keep the feed clean.\n },\n },\n];\n\n// Export for use in test suite\nexport default farcasterE2EScenarios; ",
26
- "export { sendCastAction } from './sendCast';\nexport { replyCastAction } from './replyCast';\n\nimport { sendCastAction } from './sendCast';\nimport { replyCastAction } from './replyCast';\n\n// Export all actions as an array for easy plugin registration\nexport const farcasterActions = [sendCastAction, replyCastAction];\n",
27
- "import {\n type Action,\n type IAgentRuntime,\n type Memory,\n type State,\n logger,\n} from '@elizaos/core';\nimport { FARCASTER_SERVICE_NAME } from '../common/constants';\nimport type { FarcasterService } from '../service';\nimport { FarcasterMessageType } from '../common/types';\n\nexport const replyCastAction: Action = {\n name: 'REPLY_TO_CAST',\n description: 'Replies to a cast on Farcaster',\n examples: [\n [\n {\n name: 'user',\n content: { text: 'Someone asked about ElizaOS on Farcaster, can you reply?' },\n },\n {\n name: 'assistant',\n content: {\n text: \"I'll reply to their question about ElizaOS.\",\n actions: ['REPLY_TO_CAST'],\n },\n },\n ],\n [\n {\n name: 'user',\n content: { text: 'Reply to that cast and thank them for the feedback' },\n },\n {\n name: 'assistant',\n content: {\n text: \"I'll reply with a thank you message.\",\n actions: ['REPLY_TO_CAST'],\n },\n },\n ],\n ],\n\n validate: async (runtime: IAgentRuntime, message: Memory): Promise<boolean> => {\n const text = message.content.text?.toLowerCase() || '';\n const keywords = ['reply', 'respond', 'answer', 'comment'];\n\n // Check if the message contains relevant keywords\n const hasKeyword = keywords.some((keyword) => text.includes(keyword));\n\n // Check if we have a parent cast to reply to\n // Note: inReplyTo doesn't exist on Memory type, check metadata\n const hasParentCast = !!(\n message.content.metadata && (message.content.metadata as any).parentCastHash\n );\n\n // Check if Farcaster service is available\n const service = runtime.getService(FARCASTER_SERVICE_NAME) as FarcasterService;\n const isServiceAvailable = !!service?.getMessageService(runtime.agentId);\n\n return hasKeyword && (hasParentCast || isServiceAvailable);\n },\n\n handler: async (runtime: IAgentRuntime, message: Memory, state?: State): Promise<void> => {\n try {\n const service = runtime.getService(FARCASTER_SERVICE_NAME) as FarcasterService;\n const messageService = service?.getMessageService(runtime.agentId);\n\n if (!messageService) {\n runtime.logger.error('[REPLY_TO_CAST] MessageService not available');\n return;\n }\n\n // Get the parent cast hash\n const parentCastHash =\n (message.content.metadata as any)?.parentCastHash || state?.parentCastHash;\n\n if (!parentCastHash) {\n runtime.logger.error('[REPLY_TO_CAST] No parent cast to reply to');\n return;\n }\n\n // Generate reply content\n let replyContent = '';\n\n if (state?.replyContent) {\n replyContent = state.replyContent as string;\n } else {\n const prompt = `Based on this request: \"${message.content.text}\", generate a helpful and engaging reply for a Farcaster cast (max 320 characters).`;\n\n const response = await runtime.useModel('text_large', { prompt });\n replyContent = typeof response === 'string' ? response : response.text || '';\n }\n\n // Ensure content fits Farcaster's character limit\n if (replyContent.length > 320) {\n replyContent = replyContent.substring(0, 317) + '...';\n }\n\n // Send the reply\n const reply = await messageService.sendMessage({\n agentId: runtime.agentId,\n roomId: message.roomId,\n text: replyContent,\n type: FarcasterMessageType.REPLY,\n replyToId: parentCastHash as string,\n metadata: {\n parentHash: parentCastHash,\n },\n });\n\n runtime.logger.info(`[REPLY_TO_CAST] Successfully replied to cast: ${reply.id}`);\n } catch (error) {\n runtime.logger.error('[REPLY_TO_CAST] Error replying to cast:', typeof error === 'string' ? error : (error as Error).message);\n throw error;\n }\n },\n};\n",
28
- "export { farcasterProfileProvider } from './profileProvider';\nexport { farcasterTimelineProvider } from './timelineProvider';\nexport { farcasterThreadProvider } from './threadProvider';\n\nimport { farcasterProfileProvider } from './profileProvider';\nimport { farcasterTimelineProvider } from './timelineProvider';\nimport { farcasterThreadProvider } from './threadProvider';\n\n// Export all providers as an array for easy plugin registration\nexport const farcasterProviders = [\n farcasterProfileProvider,\n farcasterTimelineProvider,\n farcasterThreadProvider,\n];\n",
29
- "import {\n type Provider,\n type IAgentRuntime,\n type Memory,\n type State,\n type ProviderResult,\n} from '@elizaos/core';\nimport { FARCASTER_SOURCE, FARCASTER_SERVICE_NAME } from '../common/constants';\nimport type { FarcasterService } from '../service';\n\nconst formatTimestamp = (timestamp: number): string => {\n return new Date(timestamp).toLocaleString('en-US', {\n hour: '2-digit',\n minute: '2-digit',\n month: 'short',\n day: 'numeric',\n });\n};\n\nexport const farcasterThreadProvider: Provider = {\n name: 'farcasterThread',\n description: 'Provides thread context for Farcaster casts so the agent can reference the full conversation.',\n\n get: async (\n runtime: IAgentRuntime,\n message: Memory,\n _state: State\n ): Promise<ProviderResult> => {\n const source = (message.content as any)?.source;\n\n if (source !== FARCASTER_SOURCE) {\n return {\n text: '',\n data: {\n available: false,\n reason: `Not a Farcaster message (source=${source ?? 'unknown'})`,\n },\n };\n }\n\n const service = runtime.getService(FARCASTER_SERVICE_NAME) as FarcasterService | null;\n const messageService = service?.getMessageService(runtime.agentId);\n\n if (!messageService) {\n return {\n text: 'Farcaster message service not available.',\n data: { available: false, error: 'service_unavailable' },\n };\n }\n\n const content = message.content as Record<string, any>;\n const messageMetadata = (message.metadata as Record<string, any> | undefined) ?? {};\n const castHash =\n content.hash ||\n content.castHash ||\n content?.metadata?.castHash ||\n messageMetadata.castHash ||\n content?.metadata?.parentHash ||\n messageMetadata.parentHash;\n\n if (!castHash || typeof castHash !== 'string') {\n return {\n text: 'Unable to resolve Farcaster cast hash for this message.',\n data: { available: false, error: 'missing_cast_hash' },\n };\n }\n\n const threadMessages = await messageService.getThread({\n agentId: runtime.agentId,\n castHash,\n });\n\n if (!threadMessages || threadMessages.length === 0) {\n runtime.logger.debug(\n { castHash },\n '[FarcasterThreadProvider] No thread messages retrieved for cast.'\n );\n return {\n text: 'No Farcaster thread context available.',\n data: { available: false, castHash, count: 0 },\n };\n }\n\n const formattedThread = threadMessages\n .map((msg, index) => {\n const time = formatTimestamp(msg.timestamp);\n const username = msg.username || msg.userId || 'unknown';\n const marker = index === threadMessages.length - 1 ? '→' : '•';\n const text = msg.text && msg.text.trim().length > 0 ? msg.text : '<no text>';\n return `${marker} [${time}] @${username}: ${text}`;\n })\n .join('\\n');\n\n return {\n text: `# Farcaster Thread Context\\n${formattedThread}`,\n data: {\n available: true,\n castHash,\n count: threadMessages.length,\n },\n values: {\n farcasterThread: formattedThread,\n farcasterCastHash: castHash,\n farcasterCurrentCastText: threadMessages[threadMessages.length - 1]?.text ?? '',\n farcasterParentCastText:\n threadMessages.length > 1 ? threadMessages[threadMessages.length - 2]?.text ?? '' : '',\n },\n };\n },\n};\n",
30
- "import { Route } from '@elizaos/core';\n\nexport const farcasterWebhookRoutes: Route[] = [\n {\n type: 'POST',\n name: 'Farcaster Webhook Handler',\n path: '/webhook',\n handler: async (req: any, res: any, runtime: any) => {\n try {\n const webhookData = req.body;\n const eventType = webhookData.type;\n\n // Get the Farcaster service from the runtime\n const farcasterService = runtime?.getService?.('farcaster');\n \n if (farcasterService) {\n // Get the agent manager for this runtime\n const agentManager = farcasterService.managers?.get?.(runtime.agentId);\n \n if (agentManager && agentManager.interactions) {\n // Check if we're in webhook mode\n if (agentManager.interactions.mode === 'webhook') {\n console.log(\"Processing webhook through FarcasterInteractionManager...\");\n await agentManager.interactions.processWebhookData(webhookData);\n } else {\n console.warn(`Agent is in ${agentManager.interactions.mode} mode, not webhook mode`);\n }\n } else {\n console.warn(`FarcasterAgentManager not found for agent ${runtime.agentId}`);\n }\n } else {\n console.warn(\"FarcasterService not found - webhook data logged only\");\n }\n \n // Send success response\n res.status(200).json({ \n success: true, \n message: 'Webhook processed successfully',\n event_type: eventType,\n timestamp: new Date().toISOString()\n });\n } catch (error) {\n console.error('Webhook processing error:', error);\n res.status(500).json({ \n success: false, \n error: 'Internal server error' \n });\n }\n }\n }\n];\n",
31
- "import { FarcasterService } from './service.js';\nimport { FarcasterTestSuite } from './__tests__/suite.js';\nimport { farcasterActions } from './actions/index.js';\nimport { farcasterProviders } from './providers/index.js';\nimport { farcasterWebhookRoutes } from './routes/webhook.js';\n\n// Export types and utilities for external use\nexport { EmbedManager, isEmbedUrl, isEmbedCast, type ProcessedEmbed } from './managers/embedManager.js';\nexport type { Cast, CastEmbed, Profile, FarcasterConfig } from './common/types.js';\n\nconst farcasterPlugin = {\n name: 'farcaster',\n description: 'Farcaster client plugin for sending and receiving casts',\n services: [FarcasterService],\n actions: farcasterActions,\n providers: farcasterProviders,\n routes: farcasterWebhookRoutes,\n tests: [new FarcasterTestSuite()],\n};\n\nexport default farcasterPlugin;\n"
32
- ],
33
- "mappings": "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",
34
- "debugId": "A63E21221285D19864756E2164756E21",
35
- "names": []
36
- }
@@ -1,21 +0,0 @@
1
- import { type IAgentRuntime } from '@elizaos/core';
2
- import { FarcasterClient } from '../client';
3
- import { type FarcasterConfig } from '../common/types';
4
- import { FarcasterCastManager } from './post';
5
- import { FarcasterInteractionManager } from './interactions';
6
- /**
7
- * A manager that orchestrates all Farcaster operations:
8
- * - client: base operations (Neynar client, hub connection, etc.)
9
- * - posts: autonomous posting logic
10
- * - interactions: handling mentions, replies, likes, etc.
11
- */
12
- export declare class FarcasterAgentManager {
13
- readonly runtime: IAgentRuntime;
14
- readonly client: FarcasterClient;
15
- readonly casts: FarcasterCastManager;
16
- readonly interactions: FarcasterInteractionManager;
17
- constructor(runtime: IAgentRuntime, config: FarcasterConfig);
18
- start(): Promise<void>;
19
- stop(): Promise<void>;
20
- }
21
- //# sourceMappingURL=agent.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/managers/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,2BAA2B,EAAE,MAAM,gBAAgB,CAAC;AAE7D;;;;;GAKG;AACH,qBAAa,qBAAqB;IAChC,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;IACjC,QAAQ,CAAC,KAAK,EAAE,oBAAoB,CAAC;IACrC,QAAQ,CAAC,YAAY,EAAE,2BAA2B,CAAC;gBAEvC,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,eAAe;IAiBrD,KAAK;IAIL,IAAI;CAGX"}