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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/dist/browser/index.browser.js +16 -0
  2. package/dist/browser/index.browser.js.map +10 -0
  3. package/dist/browser/index.d.ts +2 -0
  4. package/dist/cjs/index.d.ts +2 -0
  5. package/dist/cjs/index.node.cjs +2351 -0
  6. package/dist/cjs/index.node.js.map +34 -0
  7. package/dist/index.d.ts +2 -15
  8. package/dist/node/index.d.ts +2 -0
  9. package/dist/{index.js → node/index.node.js} +1056 -1609
  10. package/dist/node/index.node.js.map +34 -0
  11. package/package.json +67 -46
  12. package/LICENSE +0 -21
  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
@@ -0,0 +1,34 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../actions/replyCast.ts", "../../generated/specs/specs.ts", "../../generated/specs/spec-helpers.ts", "../../types/index.ts", "../../actions/sendCast.ts", "../../actions/index.ts", "../../utils/config.ts", "../../providers/profileProvider.ts", "../../providers/threadProvider.ts", "../../providers/timelineProvider.ts", "../../providers/index.ts", "../../routes/webhook.ts", "../../services/FarcasterService.ts", "../../managers/AgentManager.ts", "../../client/FarcasterClient.ts", "../../utils/index.ts", "../../managers/CastManager.ts", "../../utils/callbacks.ts", "../../managers/InteractionManager.ts", "../../utils/asyncqueue.ts", "../../managers/EmbedManager.ts", "../../managers/InteractionSource.ts", "../../services/CastService.ts", "../../services/MessageService.ts", "../../index.ts"],
4
+ "sourcesContent": [
5
+ "import type { Action, IAgentRuntime, Memory, State } from \"@elizaos/core\";\nimport { ModelType } from \"@elizaos/core\";\nimport { requireActionSpec } from \"../generated/specs/spec-helpers\";\nimport type { FarcasterService } from \"../services/FarcasterService\";\nimport { FARCASTER_SERVICE_NAME, FarcasterMessageType } from \"../types\";\n\nconst spec = requireActionSpec(\"REPLY_CAST\");\n\nexport const replyCastAction: Action = {\n name: spec.name,\n description: spec.description,\n examples: [\n [\n {\n name: \"user\",\n content: {\n text: \"Someone asked about ElizaOS on Farcaster, can you reply?\",\n },\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 const hasKeyword = keywords.some((keyword) => text.includes(keyword));\n\n const hasParentCast = !!(\n message.content.metadata &&\n (message.content.metadata as Record<string, unknown>).parentCastHash\n );\n\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) => {\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 { success: false, error: \"MessageService not available\" };\n }\n\n const metadata = message.content.metadata as Record<string, string | undefined> | undefined;\n const stateParentCastHash =\n typeof state?.parentCastHash === \"string\" ? state.parentCastHash : undefined;\n const parentCastHash = metadata?.parentCastHash ?? stateParentCastHash;\n\n if (!parentCastHash) {\n runtime.logger.error(\"[REPLY_TO_CAST] No parent cast to reply to\");\n return { success: false, error: \"No parent cast to reply to\" };\n }\n\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(ModelType.TEXT_LARGE, { prompt });\n replyContent = typeof response === \"string\" ? response : String(response);\n }\n\n if (replyContent.length > 320) {\n replyContent = `${replyContent.substring(0, 317)}...`;\n }\n\n const reply = await messageService.sendMessage({\n agentId: runtime.agentId,\n roomId: message.roomId,\n text: replyContent,\n type: FarcasterMessageType.REPLY,\n replyToId: parentCastHash,\n metadata: {\n parentHash: parentCastHash,\n },\n });\n\n runtime.logger.info(`[REPLY_TO_CAST] Successfully replied to cast: ${reply.id}`);\n return { success: true, text: `Replied to cast: ${reply.id}` };\n } catch (error) {\n runtime.logger.error(\n \"[REPLY_TO_CAST] Error replying to cast:\",\n typeof error === \"string\" ? error : (error as Error).message\n );\n throw error;\n }\n },\n};\n",
6
+ "/**\n * Auto-generated canonical action/provider/evaluator docs for plugin-farcaster.\n * DO NOT EDIT - Generated from prompts/specs/**.\n */\n\nexport type ActionDoc = {\n name: string;\n description: string;\n similes?: readonly string[];\n parameters?: readonly unknown[];\n examples?: readonly (readonly unknown[])[];\n};\n\nexport type ProviderDoc = {\n name: string;\n description: string;\n position?: number;\n dynamic?: boolean;\n};\n\nexport type EvaluatorDoc = {\n name: string;\n description: string;\n similes?: readonly string[];\n alwaysRun?: boolean;\n examples?: readonly unknown[];\n};\n\nexport const coreActionsSpec = {\n version: \"1.0.0\",\n actions: [\n {\n name: \"user\",\n description: \"\",\n parameters: [],\n },\n {\n name: \"user\",\n description: \"\",\n parameters: [],\n },\n ],\n} as const;\nexport const allActionsSpec = {\n version: \"1.0.0\",\n actions: [\n {\n name: \"user\",\n description: \"\",\n parameters: [],\n },\n {\n name: \"user\",\n description: \"\",\n parameters: [],\n },\n ],\n} as const;\nexport const coreProvidersSpec = {\n version: \"1.0.0\",\n providers: [\n {\n name: \"farcasterProfile\",\n description: \"Provides information about the agent\",\n dynamic: true,\n },\n {\n name: \"farcasterThread\",\n description:\n \"Provides thread context for Farcaster casts so the agent can reference the full conversation.\",\n dynamic: true,\n },\n {\n name: \"farcasterTimeline\",\n description: \"Provides recent casts from the agent\",\n dynamic: true,\n },\n ],\n} as const;\nexport const allProvidersSpec = {\n version: \"1.0.0\",\n providers: [\n {\n name: \"farcasterProfile\",\n description: \"Provides information about the agent\",\n dynamic: true,\n },\n {\n name: \"farcasterThread\",\n description:\n \"Provides thread context for Farcaster casts so the agent can reference the full conversation.\",\n dynamic: true,\n },\n {\n name: \"farcasterTimeline\",\n description: \"Provides recent casts from the agent\",\n dynamic: true,\n },\n ],\n} as const;\nexport const coreEvaluatorsSpec = {\n version: \"1.0.0\",\n evaluators: [],\n} as const;\nexport const allEvaluatorsSpec = {\n version: \"1.0.0\",\n evaluators: [],\n} as const;\n\nexport const coreActionDocs: readonly ActionDoc[] = coreActionsSpec.actions;\nexport const allActionDocs: readonly ActionDoc[] = allActionsSpec.actions;\nexport const coreProviderDocs: readonly ProviderDoc[] = coreProvidersSpec.providers;\nexport const allProviderDocs: readonly ProviderDoc[] = allProvidersSpec.providers;\nexport const coreEvaluatorDocs: readonly EvaluatorDoc[] = coreEvaluatorsSpec.evaluators;\nexport const allEvaluatorDocs: readonly EvaluatorDoc[] = allEvaluatorsSpec.evaluators;\n",
7
+ "/**\n * Helper functions to lookup action/provider/evaluator specs by name.\n * These allow language-specific implementations to import their text content\n * (description, similes, examples) from the centralized specs.\n *\n * DO NOT EDIT the spec data - update prompts/actions.json, prompts/providers.json, prompts/evaluators.json and regenerate.\n */\n\nimport {\n type ActionDoc,\n allActionDocs,\n allEvaluatorDocs,\n allProviderDocs,\n coreActionDocs,\n coreEvaluatorDocs,\n coreProviderDocs,\n type EvaluatorDoc,\n type ProviderDoc,\n} from \"./specs\";\n\n// Build lookup maps for O(1) access\nconst coreActionMap = new Map<string, ActionDoc>(coreActionDocs.map((doc) => [doc.name, doc]));\nconst allActionMap = new Map<string, ActionDoc>(allActionDocs.map((doc) => [doc.name, doc]));\nconst coreProviderMap = new Map<string, ProviderDoc>(\n coreProviderDocs.map((doc) => [doc.name, doc])\n);\nconst allProviderMap = new Map<string, ProviderDoc>(allProviderDocs.map((doc) => [doc.name, doc]));\nconst coreEvaluatorMap = new Map<string, EvaluatorDoc>(\n coreEvaluatorDocs.map((doc) => [doc.name, doc])\n);\nconst allEvaluatorMap = new Map<string, EvaluatorDoc>(\n allEvaluatorDocs.map((doc) => [doc.name, doc])\n);\n\n/**\n * Get an action spec by name from the core specs.\n * @param name - The action name\n * @returns The action spec or undefined if not found\n */\nexport function getActionSpec(name: string): ActionDoc | undefined {\n return coreActionMap.get(name) ?? allActionMap.get(name);\n}\n\n/**\n * Get an action spec by name, throwing if not found.\n * @param name - The action name\n * @returns The action spec\n * @throws Error if the action is not found\n */\nexport function requireActionSpec(name: string): ActionDoc {\n const spec = getActionSpec(name);\n if (!spec) {\n throw new Error(`Action spec not found: ${name}`);\n }\n return spec;\n}\n\n/**\n * Get a provider spec by name from the core specs.\n * @param name - The provider name\n * @returns The provider spec or undefined if not found\n */\nexport function getProviderSpec(name: string): ProviderDoc | undefined {\n return coreProviderMap.get(name) ?? allProviderMap.get(name);\n}\n\n/**\n * Get a provider spec by name, throwing if not found.\n * @param name - The provider name\n * @returns The provider spec\n * @throws Error if the provider is not found\n */\nexport function requireProviderSpec(name: string): ProviderDoc {\n const spec = getProviderSpec(name);\n if (!spec) {\n throw new Error(`Provider spec not found: ${name}`);\n }\n return spec;\n}\n\n/**\n * Get an evaluator spec by name from the core specs.\n * @param name - The evaluator name\n * @returns The evaluator spec or undefined if not found\n */\nexport function getEvaluatorSpec(name: string): EvaluatorDoc | undefined {\n return coreEvaluatorMap.get(name) ?? allEvaluatorMap.get(name);\n}\n\n/**\n * Get an evaluator spec by name, throwing if not found.\n * @param name - The evaluator name\n * @returns The evaluator spec\n * @throws Error if the evaluator is not found\n */\nexport function requireEvaluatorSpec(name: string): EvaluatorDoc {\n const spec = getEvaluatorSpec(name);\n if (!spec) {\n throw new Error(`Evaluator spec not found: ${name}`);\n }\n return spec;\n}\n\n// Re-export types for convenience\nexport type { ActionDoc, ProviderDoc, EvaluatorDoc };\n",
8
+ "import type { Media, Memory, MessagePayload } from \"@elizaos/core\";\nimport type { Cast as NeynarCast, Embed as NeynarEmbed } from \"@neynar/nodejs-sdk/build/api\";\nimport { z } from \"zod\";\n\nexport interface Profile {\n fid: number;\n name: string;\n username: string;\n pfp?: string;\n bio?: string;\n url?: string;\n}\n\nexport interface CastEmbed {\n type: \"image\" | \"video\" | \"audio\" | \"url\" | \"cast\" | \"frame\" | \"unknown\";\n url: string;\n castHash?: string;\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 interface 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 embeds?: NeynarEmbed[];\n media?: Media[];\n}\n\nexport interface CastId {\n hash: string;\n fid: number;\n}\n\nexport interface FidRequest {\n fid: number;\n pageSize: number;\n}\n\nexport interface LastCast {\n hash: string;\n timestamp: number;\n}\n\nexport const DEFAULT_MAX_CAST_LENGTH = 320;\nexport const DEFAULT_POLL_INTERVAL = 120;\nexport const DEFAULT_CAST_INTERVAL_MIN = 90;\nexport const DEFAULT_CAST_INTERVAL_MAX = 180;\nexport const DEFAULT_CAST_CACHE_TTL = 1000 * 30 * 60;\nexport const DEFAULT_CAST_CACHE_SIZE = 9000;\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 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\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\nexport const FARCASTER_SERVICE_NAME = \"farcaster\";\nexport const FARCASTER_SOURCE = \"farcaster\";\n",
9
+ "import {\n type Action,\n type ActionExample,\n createUniqueUuid,\n type IAgentRuntime,\n type Memory,\n ModelType,\n type State,\n} from \"@elizaos/core\";\nimport { requireActionSpec } from \"../generated/specs/spec-helpers\";\nimport type { FarcasterService } from \"../services/FarcasterService\";\nimport { FARCASTER_SERVICE_NAME } from \"../types\";\n\nconst spec = requireActionSpec(\"SEND_CAST\");\n\nexport const sendCastAction: Action = {\n name: spec.name,\n similes: spec.similes ? [...spec.similes] : [],\n description: spec.description,\n examples: (spec.examples ?? []) as ActionExample[][],\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\"];\n\n const hasKeyword = keywords.some((keyword) => text.includes(keyword));\n\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) => {\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 { success: false, error: \"PostService not available\" };\n }\n\n let castContent = \"\";\n\n if (state?.castContent) {\n castContent = state.castContent as string;\n } else {\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(ModelType.TEXT_LARGE, { prompt });\n castContent = typeof response === \"string\" ? response : String(response);\n }\n\n if (castContent.length > 320) {\n castContent = `${castContent.substring(0, 317)}...`;\n }\n\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 await runtime.createMemory(\n {\n agentId: runtime.agentId,\n roomId: cast.roomId,\n entityId: runtime.agentId,\n content: {\n text: castContent,\n source: \"farcaster\",\n metadata: {\n castHash: String(cast.metadata?.castHash || \"\"),\n action: \"SEND_CAST\",\n },\n },\n createdAt: cast.timestamp,\n },\n \"messages\"\n );\n return { success: true, text: `Posted cast: ${cast.id}` };\n } catch (error) {\n runtime.logger.error(\n \"[SEND_CAST] Error posting cast:\",\n typeof error === \"string\" ? error : (error as Error).message\n );\n return { success: false, error: (error as Error).message };\n }\n },\n};\n",
10
+ "import { replyCastAction } from \"./replyCast\";\nimport { sendCastAction } from \"./sendCast\";\n\nexport { replyCastAction, sendCastAction };\nexport const farcasterActions = [sendCastAction, replyCastAction];\n",
11
+ "import { type IAgentRuntime, parseBooleanFromText } from \"@elizaos/core\";\nimport { z } from \"zod\";\nimport {\n DEFAULT_CAST_INTERVAL_MAX,\n DEFAULT_CAST_INTERVAL_MIN,\n DEFAULT_MAX_CAST_LENGTH,\n DEFAULT_POLL_INTERVAL,\n type FarcasterConfig,\n FarcasterConfigSchema,\n} from \"../types\";\n\ntype ProcessEnvLike = Record<string, string | undefined>;\n\nfunction getProcessEnv(): ProcessEnvLike {\n if (typeof process === \"undefined\") {\n return {};\n }\n return process.env as ProcessEnvLike;\n}\n\nconst env = getProcessEnv();\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\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\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\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(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\") || parseBooleanFromText(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(env.ENABLE_ACTION_PROCESSING || \"false\"),\n\n ACTION_INTERVAL: safeParseInt(runtime.getSetting(\"ACTION_INTERVAL\") as string, 5),\n\n CAST_IMMEDIATELY:\n runtime.getSetting(\"CAST_IMMEDIATELY\") ||\n parseBooleanFromText(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: runtime.getSetting(\"FARCASTER_HUB_URL\") || \"hub.pinata.cloud\",\n\n FARCASTER_MODE: runtime.getSetting(\"FARCASTER_MODE\") || \"polling\",\n };\n\n runtime.logger.debug(\n `[validateFarcasterConfig] Resolved FID: ${farcasterConfig.FARCASTER_FID}`\n );\n runtime.logger.debug(\n `[validateFarcasterConfig] Resolved Signer UUID: ${farcasterConfig.FARCASTER_SIGNER_UUID ? \"Found\" : \"Missing\"}`\n );\n runtime.logger.debug(\n `[validateFarcasterConfig] Resolved API Key: ${farcasterConfig.FARCASTER_NEYNAR_API_KEY ? \"Found\" : \"Missing\"}`\n );\n\n const config = FarcasterConfigSchema.parse(farcasterConfig);\n\n const isDryRun = config.FARCASTER_DRY_RUN;\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(\n `- Cast Immediately: ${config.CAST_IMMEDIATELY ? \"enabled\" : \"disabled\"}`\n );\n }\n runtime.logger.info(\n `- Action Processing: ${config.ENABLE_ACTION_PROCESSING ? \"enabled\" : \"disabled\"}`\n );\n runtime.logger.info(`- Action Interval: ${config.ACTION_INTERVAL} minutes`);\n\n if (isDryRun) {\n runtime.logger.info(\n \"Farcaster client initialized in dry run mode - no actual casts should be posted\"\n );\n }\n\n return config;\n } catch (error) {\n if (error instanceof z.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",
12
+ "import type { IAgentRuntime, Memory, Provider, ProviderResult, State } from \"@elizaos/core\";\nimport { requireProviderSpec } from \"../generated/specs/spec-helpers\";\nimport type { FarcasterService } from \"../services/FarcasterService\";\nimport { FARCASTER_SERVICE_NAME } from \"../types\";\nimport { getFarcasterFid } from \"../utils/config\";\n\nconst spec = requireProviderSpec(\"profileProvider\");\n\nexport const farcasterProfileProvider: Provider = {\n name: spec.name,\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(\n \"[FarcasterProfileProvider] Error fetching profile:\",\n typeof error === \"string\" ? error : (error as Error).message\n );\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(\n \"[FarcasterProfileProvider] Error:\",\n typeof error === \"string\" ? error : (error as Error).message\n );\n return {\n text: \"Farcaster service is not available.\",\n data: { available: false },\n };\n }\n },\n};\n",
13
+ "import type { IAgentRuntime, Memory, Provider, ProviderResult, State } from \"@elizaos/core\";\nimport { requireProviderSpec } from \"../generated/specs/spec-helpers\";\nimport type { FarcasterService } from \"../services/FarcasterService\";\nimport { FARCASTER_SERVICE_NAME, FARCASTER_SOURCE } from \"../types\";\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\nconst spec = requireProviderSpec(\"threadProvider\");\n\nexport const farcasterThreadProvider: Provider = {\n name: spec.name,\n description:\n \"Provides thread context for Farcaster casts so the agent can reference the full conversation.\",\n\n get: async (runtime: IAgentRuntime, message: Memory, _state: State): Promise<ProviderResult> => {\n const contentForSource = message.content as Record<\n string,\n string | number | boolean | null | object | undefined\n >;\n const source =\n typeof contentForSource.source === \"string\" ? contentForSource.source : undefined;\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 {\n hash?: string;\n castHash?: string;\n metadata?: Record<string, string | undefined> | string;\n };\n const messageMetadata =\n (message.metadata as Record<string, string | undefined> | undefined) ?? {};\n const contentMetadata =\n typeof content.metadata === \"object\" &&\n content.metadata !== null &&\n !Array.isArray(content.metadata)\n ? content.metadata\n : undefined;\n const castHash =\n content.hash ||\n content.castHash ||\n contentMetadata?.castHash ||\n messageMetadata.castHash ||\n contentMetadata?.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",
14
+ "import type { IAgentRuntime, Memory, Provider, ProviderResult, State } from \"@elizaos/core\";\nimport { requireProviderSpec } from \"../generated/specs/spec-helpers\";\nimport type { FarcasterService } from \"../services/FarcasterService\";\nimport { FARCASTER_SERVICE_NAME } from \"../types\";\n\nfunction getTimeAgo(date: Date): string {\n const seconds = Math.floor((Date.now() - 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\nconst spec = requireProviderSpec(\"timelineProvider\");\n\nexport const farcasterTimelineProvider: Provider = {\n name: spec.name,\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 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 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 castCount: casts.length,\n },\n values: {\n latestCastHash: String(casts[0]?.metadata?.castHash || \"\"),\n latestCastText: casts[0]?.text || \"\",\n },\n };\n } catch (error) {\n runtime.logger.error(\n \"[FarcasterTimelineProvider] Error:\",\n typeof error === \"string\" ? error : (error as Error).message\n );\n return {\n text: \"Unable to fetch Farcaster timeline.\",\n data: {\n available: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n },\n };\n }\n },\n};\n",
15
+ "import { farcasterProfileProvider } from \"./profileProvider\";\nimport { farcasterThreadProvider } from \"./threadProvider\";\nimport { farcasterTimelineProvider } from \"./timelineProvider\";\n\nexport { farcasterProfileProvider, farcasterThreadProvider, farcasterTimelineProvider };\nexport const farcasterProviders = [\n farcasterProfileProvider,\n farcasterTimelineProvider,\n farcasterThreadProvider,\n];\n",
16
+ "import type { IAgentRuntime, Route, RouteRequest, RouteResponse } from \"@elizaos/core\";\n\nexport const farcasterWebhookRoutes: Route[] = [\n {\n type: \"POST\",\n name: \"Farcaster Webhook Handler\",\n path: \"/webhook\",\n handler: async (req: RouteRequest, res: RouteResponse, runtime: IAgentRuntime) => {\n try {\n const webhookData = req.body as { type?: string };\n const eventType = webhookData.type;\n\n const farcasterService = runtime?.getService?.(\"farcaster\") as {\n managers?: {\n get?: (id: string) => {\n interactions?: {\n mode?: string;\n processWebhookData?: (data: { type?: string }) => Promise<void>;\n };\n };\n };\n };\n\n if (farcasterService) {\n const agentManager = farcasterService.managers?.get?.(runtime.agentId ?? \"\");\n\n if (agentManager?.interactions) {\n if (agentManager.interactions.mode === \"webhook\") {\n await agentManager.interactions.processWebhookData?.(webhookData);\n }\n }\n }\n\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 if (runtime.logger) {\n runtime.logger.error(\n error instanceof Error ? error : new Error(String(error)),\n \"Webhook processing error\"\n );\n }\n res.status(500).json({\n success: false,\n error: \"Internal server error\",\n });\n }\n },\n },\n];\n",
17
+ "import { type IAgentRuntime, Service, type UUID } from \"@elizaos/core\";\nimport { FarcasterAgentManager } from \"../managers/AgentManager\";\nimport { FARCASTER_SERVICE_NAME } from \"../types\";\nimport { getFarcasterFid, hasFarcasterEnabled, validateFarcasterConfig } from \"../utils/config\";\nimport { FarcasterCastService } from \"./CastService\";\nimport { FarcasterMessageService } from \"./MessageService\";\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 static serviceType = FARCASTER_SERVICE_NAME;\n\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 async initialize(runtime: IAgentRuntime): Promise<void> {\n await FarcasterService.start(runtime);\n }\n\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 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 static async stop(runtime: IAgentRuntime): Promise<void> {\n const service = FarcasterService.getInstance();\n const 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 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 getMessageService(agentId: UUID): FarcasterMessageService | undefined {\n return this.messageServices.get(agentId);\n }\n\n getCastService(agentId: UUID): FarcasterCastService | undefined {\n return this.castServices.get(agentId);\n }\n\n async healthCheck(): Promise<{\n healthy: boolean;\n details: Record<string, unknown>;\n }> {\n const managerStatuses: Record<string, unknown> = {};\n let overallHealthy = true;\n\n for (const [agentId, manager] of Array.from(this.managers.entries())) {\n try {\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 getActiveManagers(): Map<UUID, FarcasterAgentManager> {\n return new Map(this.managers);\n }\n}\n",
18
+ "import type { IAgentRuntime } from \"@elizaos/core\";\nimport { Configuration, NeynarAPIClient } from \"@neynar/nodejs-sdk\";\nimport { FarcasterClient } from \"../client/FarcasterClient\";\nimport type { FarcasterConfig } from \"../types\";\nimport { FarcasterCastManager } from \"./CastManager\";\nimport { FarcasterInteractionManager } from \"./InteractionManager\";\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({\n apiKey: config.FARCASTER_NEYNAR_API_KEY,\n });\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 this.interactions = new FarcasterInteractionManager({\n client,\n runtime,\n config,\n });\n this.casts = new FarcasterCastManager({ client, runtime, config });\n }\n\n async start(): Promise<void> {\n await Promise.all([this.casts.start(), this.interactions.start()]);\n }\n\n async stop(): Promise<void> {\n await Promise.all([this.casts.stop(), this.interactions.stop()]);\n }\n}\n",
19
+ "import { type Content, elizaLogger } from \"@elizaos/core\";\nimport { isApiErrorResponse, type NeynarAPIClient } from \"@neynar/nodejs-sdk\";\nimport type { Cast as NeynarCast } from \"@neynar/nodejs-sdk/build/api\";\nimport { LRUCache } from \"lru-cache\";\nimport {\n type Cast,\n type CastId,\n DEFAULT_CAST_CACHE_SIZE,\n DEFAULT_CAST_CACHE_TTL,\n type FidRequest,\n type Profile,\n} from \"../types\";\nimport { neynarCastToCast, splitPostContent } from \"../utils\";\n\nconst castCache: LRUCache<string, NeynarCast> = new LRUCache({\n max: DEFAULT_CAST_CACHE_SIZE,\n ttl: DEFAULT_CAST_CACHE_TTL,\n});\n\nconst profileCache: LRUCache<number, Profile> = new LRUCache({\n max: 1000,\n ttl: 1000 * 60 * 15,\n});\n\nexport class FarcasterClient {\n private neynar: NeynarAPIClient;\n private signerUuid: string;\n\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({\n identifier: castHash,\n type: \"hash\",\n });\n\n castCache.set(castHash, response.cast);\n\n return response.cast;\n }\n\n /**\n * Get mentions for a FID.\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 async publishReaction(params: {\n reactionType: \"like\" | \"recast\";\n target: string;\n }): Promise<{ success: boolean }> {\n try {\n const result = await this.neynar.publishReaction({\n signerUuid: this.signerUuid,\n reactionType: params.reactionType,\n target: params.target,\n });\n\n return { success: result.success ?? false };\n } catch (err) {\n if (isApiErrorResponse(err)) {\n elizaLogger.error(`Neynar error publishing reaction: ${JSON.stringify(err.response.data)}`);\n throw err.response.data;\n }\n elizaLogger.error(`Error publishing reaction: ${JSON.stringify(err)}`);\n throw err;\n }\n }\n\n async deleteReaction(params: {\n reactionType: \"like\" | \"recast\";\n target: string;\n }): Promise<{ success: boolean }> {\n try {\n const result = await this.neynar.deleteReaction({\n signerUuid: this.signerUuid,\n reactionType: params.reactionType,\n target: params.target,\n });\n\n return { success: result.success ?? false };\n } catch (err) {\n if (isApiErrorResponse(err)) {\n elizaLogger.error(`Neynar error deleting reaction: ${JSON.stringify(err.response.data)}`);\n throw err.response.data;\n }\n elizaLogger.error(`Error deleting reaction: ${JSON.stringify(err)}`);\n throw err;\n }\n }\n}\n",
20
+ "import type { IAgentRuntime, Memory, UUID } from \"@elizaos/core\";\nimport { stringToUuid } from \"@elizaos/core\";\nimport type { Cast as NeynarCast } from \"@neynar/nodejs-sdk/build/api\";\nimport { type Cast, FARCASTER_SOURCE } from \"../types\";\n\nexport const MAX_CAST_LENGTH = 1024;\n\nexport function castId({ hash, agentId }: { hash: string; agentId: string }): string {\n return `${hash}-${agentId}`;\n}\n\nexport function castUuid(props: { hash: string; agentId: string }): UUID {\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 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 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): string {\n return `farcaster/${fid}/lastCast`;\n}\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 embeds: neynarCast.embeds && neynarCast.embeds.length > 0 ? neynarCast.embeds : 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 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",
21
+ "import { createUniqueUuid, type EventPayload, EventType, type IAgentRuntime } from \"@elizaos/core\";\nimport type { FarcasterClient } from \"../client/FarcasterClient\";\nimport {\n FARCASTER_SOURCE,\n type FarcasterConfig,\n FarcasterEventTypes,\n type LastCast,\n} from \"../types\";\nimport { lastCastCacheKey } from \"../utils\";\nimport { standardCastHandlerCallback } from \"../utils/callbacks\";\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 async start(): Promise<void> {\n if (this.isRunning || !this.config.ENABLE_CAST) {\n return;\n }\n\n this.isRunning = true;\n\n void this.runPeriodically();\n }\n\n async stop(): Promise<void> {\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) => {\n const timeoutId = setTimeout(resolve, delay);\n this.timeout = timeoutId;\n });\n } catch (error) {\n this.runtime.logger.error(\n { agentId: this.runtime.agentId, error },\n \"[Farcaster] Error in periodic cast loop:\"\n );\n }\n }\n }\n\n private async generateNewCast(): Promise<void> {\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 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 await this.runtime.emitEvent(EventType.POST_GENERATED, {\n runtime: this.runtime,\n callback,\n worldId,\n userId: this.runtime.agentId,\n roomId,\n source: FARCASTER_SOURCE,\n });\n\n await this.runtime.emitEvent(\n FarcasterEventTypes.CAST_GENERATED as string,\n {\n runtime: this.runtime,\n source: FARCASTER_SOURCE,\n } as EventPayload\n );\n } catch (error) {\n this.runtime.logger.error({ error }, \"[Farcaster] Error generating new cast\");\n }\n }\n}\n",
22
+ "import type { Content, HandlerCallback, IAgentRuntime, Memory, UUID } from \"@elizaos/core\";\nimport type { Cast as NeynarCast } from \"@neynar/nodejs-sdk/build/api\";\nimport type { FarcasterClient } from \"../client\";\nimport type { CastId, FarcasterConfig } from \"../types\";\nimport { createCastMemory, neynarCastToCast } from \"./index\";\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): Promise<Memory[]> => {\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 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(\n \"[Farcaster] Error posting cast:\",\n typeof error === \"string\" ? error : (error as Error).message\n );\n\n if (onError) {\n await onError(error);\n }\n\n return [];\n }\n };\n\n return callback;\n}\n",
23
+ "import {\n ChannelType,\n createUniqueUuid,\n type EventPayload,\n type IAgentRuntime,\n type Memory,\n stringToUuid,\n type UUID,\n} from \"@elizaos/core\";\nimport type { Cast as NeynarCast } from \"@neynar/nodejs-sdk/build/api\";\nimport type { FarcasterClient } from \"../client/FarcasterClient\";\nimport {\n type Cast,\n FARCASTER_SOURCE,\n type FarcasterConfig,\n FarcasterEventTypes,\n type FarcasterGenericCastPayload,\n type NeynarWebhookData,\n type Profile,\n} from \"../types\";\nimport { castUuid, neynarCastToCast } from \"../utils\";\nimport { AsyncQueue } from \"../utils/asyncqueue\";\nimport { standardCastHandlerCallback } from \"../utils/callbacks\";\nimport { EmbedManager } from \"./EmbedManager\";\nimport type { IInteractionProcessor } from \"./InteractionProcessor\";\nimport {\n createFarcasterInteractionSource,\n type FarcasterInteractionSource,\n} from \"./InteractionSource\";\n\ninterface FarcasterInteractionManagerParams {\n client: FarcasterClient;\n runtime: IAgentRuntime;\n config: FarcasterConfig;\n}\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 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 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 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 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 {\n error: error instanceof Error ? error.message : String(error),\n castHash: cast.hash,\n },\n \"[Farcaster] Failed to process embeds, continuing without media\"\n );\n }\n }\n\n await this.handleMentionCast({ agent, mention, cast });\n }\n\n async processReply(cast: NeynarCast): Promise<void> {\n const agentFid = this.config.FARCASTER_FID;\n const agent = await this.client.getProfile(agentFid);\n const reply = neynarCastToCast(cast);\n\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 {\n error: error instanceof Error ? error.message : String(error),\n castHash: cast.hash,\n },\n \"[Farcaster] Failed to process embeds, continuing without media\"\n );\n }\n }\n\n await this.handleMentionCast({ agent, mention: reply, cast });\n }\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 if (!castData.author || !castData.hash || typeof castData.author.fid !== \"number\") {\n this.runtime.logger.warn(\n \"Invalid webhook cast data structure - missing author, hash, or author.fid\"\n );\n return;\n }\n\n if (castData.author.fid === agentFid) {\n this.runtime.logger.debug(\"Skipping webhook event from agent itself\");\n return;\n }\n\n const memoryId = castUuid({\n agentId: this.runtime.agentId,\n hash: castData.hash,\n });\n if (await this.runtime.getMemoryById(memoryId)) {\n this.runtime.logger.debug(\"Skipping already processed webhook cast:\", castData.hash);\n return;\n }\n\n const isMention = castData.mentioned_profiles?.some(\n (profile: { fid: number }) => profile.fid === agentFid\n );\n\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 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 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 async ensureCastConnection(cast: Cast): Promise<Memory> {\n return await this.asyncQueue.submit(async () => {\n const memoryId = castUuid({\n agentId: this.runtime.agentId,\n hash: cast.hash,\n });\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 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({\n agentId: this.runtime.agentId,\n hash: cast.inReplyTo.hash,\n })\n : undefined,\n source: FARCASTER_SOURCE,\n channelType: ChannelType.THREAD,\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): Promise<void> {\n const memoryId = castUuid({\n hash: currentCast.hash,\n agentId: runtime.agentId,\n });\n\n if (visited.has(currentCast.hash) || skipMemoryId.has(memoryId)) {\n return;\n }\n\n visited.add(currentCast.hash);\n\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(\n FarcasterEventTypes.THREAD_CAST_CREATED as string,\n {\n runtime,\n memory: newMemory,\n cast: currentCast,\n source: FARCASTER_SOURCE,\n } as EventPayload\n );\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 const memory = await this.ensureCastConnection(mention);\n await this.buildThreadForCast(mention, memory.id ? new Set([memory.id]) : new Set());\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 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 try {\n if (!this.runtime.messageService) {\n this.runtime.logger.warn(\n \"[Farcaster] messageService not available, skipping mention handling\"\n );\n return;\n }\n await this.runtime.messageService.handleMessage(this.runtime, memory, callback);\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 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 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 async stop(): Promise<void> {\n this.runtime.logger.info(\"Stopping Farcaster interaction manager\");\n await this.source.stop();\n }\n}\n",
24
+ "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 {\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",
25
+ "import { type IAgentRuntime, type Media, ModelType } from \"@elizaos/core\";\nimport type { EmbedCast, EmbedUrl, Embed as NeynarEmbed } from \"@neynar/nodejs-sdk/build/api\";\n\nexport function isEmbedUrl(embed: NeynarEmbed): embed is EmbedUrl {\n return \"url\" in embed && typeof (embed as EmbedUrl).url === \"string\";\n}\n\nexport function isEmbedCast(embed: NeynarEmbed): embed is EmbedCast {\n return \"cast\" in embed && typeof (embed as EmbedCast).cast === \"object\";\n}\n\nfunction getMediaTypeFromUrl(\n url: string,\n contentType?: string | null\n): \"image\" | \"video\" | \"audio\" | \"webpage\" | \"unknown\" {\n const lowerUrl = url.toLowerCase();\n const lowerContentType = contentType?.toLowerCase() || \"\";\n\n if (lowerContentType.startsWith(\"image/\")) return \"image\";\n if (lowerContentType.startsWith(\"video/\")) return \"video\";\n if (lowerContentType.startsWith(\"audio/\")) return \"audio\";\n\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\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 castHash?: string;\n authorFid?: number;\n authorUsername?: string;\n };\n}\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 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 {\n processedCount: processedMedia.length,\n types: processedMedia.map((m) => m.source),\n },\n \"[EmbedManager] Finished processing embeds\"\n );\n\n return processedMedia;\n }\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 private async processUrlEmbed(embed: EmbedUrl): Promise<ProcessedEmbed> {\n const { url, metadata } = embed;\n const embedId = `embed-${this.hashUrl(url)}`;\n\n const cached = this.embedCache.get(embedId);\n if (cached) {\n return cached;\n }\n\n const contentType = metadata?.content_type;\n const mediaType = getMediaTypeFromUrl(url, contentType);\n\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 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 const result = await this.runtime.useModel(ModelType.IMAGE_DESCRIPTION, {\n prompt:\n \"Analyze this image and provide a concise title and description. Focus on the main subject and any notable details.\",\n imageUrl: url,\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 {\n url: `${url.substring(0, 60)}...`,\n descriptionLength: description.length,\n title,\n },\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 private async processVideoEmbed(embed: EmbedUrl, embedId: string): Promise<ProcessedEmbed> {\n const { url, metadata } = embed;\n\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 private async processAudioEmbed(embed: EmbedUrl, embedId: string): Promise<ProcessedEmbed> {\n const { url, metadata } = embed;\n\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 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 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 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 private async processCastEmbed(embed: EmbedCast): Promise<ProcessedEmbed> {\n const cast = embed.cast;\n const embedId = `cast-${cast.hash}`;\n\n const cached = this.embedCache.get(embedId);\n if (cached) {\n return cached;\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 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 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 clearCache(): void {\n this.embedCache.clear();\n }\n}\n",
26
+ "import type { IAgentRuntime } from \"@elizaos/core\";\nimport type { FarcasterClient } from \"../client/FarcasterClient\";\nimport type { FarcasterConfig, NeynarWebhookData } from \"../types\";\nimport { castUuid, neynarCastToCast } from \"../utils\";\nimport type { IInteractionProcessor } from \"./InteractionProcessor\";\n\ninterface FarcasterInteractionSourceParams {\n client: FarcasterClient;\n runtime: IAgentRuntime;\n config: FarcasterConfig;\n processor: IInteractionProcessor;\n}\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.\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 const delay = this.config.FARCASTER_POLL_INTERVAL * 1000;\n await new Promise((resolve) => {\n this.timeout = setTimeout(resolve, delay);\n });\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({\n agentId: this.runtime.agentId,\n hash: mention.hash,\n });\n\n if (await this.runtime.getMemoryById(memoryId)) {\n continue;\n }\n\n this.runtime.logger.info({ hash: mention.hash }, \"New Cast found\");\n\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 await this.processor.processMention(cast);\n } catch (error) {\n this.runtime.logger.error({ error }, \"[Farcaster] Error processing mention:\");\n }\n }\n }\n}\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 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\nexport function createFarcasterInteractionSource(\n params: FarcasterInteractionSourceParams\n): FarcasterInteractionSource {\n const mode = params.config.FARCASTER_MODE;\n\n switch (mode) {\n case \"webhook\":\n return new FarcasterWebhookSource(params);\n default:\n return new FarcasterPollingSource(params);\n }\n}\n",
27
+ "import { createUniqueUuid, type IAgentRuntime, ModelType, type UUID } from \"@elizaos/core\";\nimport type { FarcasterClient } from \"../client/FarcasterClient\";\nimport { type Cast, FARCASTER_SOURCE } from \"../types\";\nimport { castUuid, neynarCastToCast } from \"../utils\";\nimport { getFarcasterFid } from \"../utils/config\";\n\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?: Array<Record<string, string | number | boolean>>;\n metadata?: Record<string, string | number | boolean>;\n}\n\nexport interface CastServiceInterface {\n getCasts(params: { agentId: UUID; limit?: number; cursor?: string }): Promise<FarcasterCast[]>;\n createCast(params: {\n agentId: UUID;\n roomId: UUID;\n text: string;\n media?: string[];\n replyTo?: { hash: string; fid: number };\n }): Promise<FarcasterCast>;\n deleteCast(params: { agentId: UUID; castHash: string }): Promise<void>;\n likeCast(params: { agentId: UUID; castHash: string }): Promise<void>;\n unlikeCast(params: { agentId: UUID; castHash: string }): Promise<void>;\n recast(params: { agentId: UUID; castHash: string }): Promise<void>;\n unrecast(params: { agentId: UUID; castHash: string }): Promise<void>;\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 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 async createCast(params: {\n agentId: UUID;\n roomId: UUID;\n text: string;\n media?: string[];\n replyTo?: { hash: string; fid: number };\n }): Promise<FarcasterCast> {\n try {\n let castText = params.text;\n\n if (!castText || castText.trim() === \"\") {\n castText = await this.generateCastContent();\n }\n\n if (castText.length > 320) {\n castText = await this.truncateCast(castText);\n }\n\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: [],\n metadata: {\n castHash: cast.hash,\n authorFid: cast.authorFid,\n source: FARCASTER_SOURCE,\n ...(cast.threadId ? { threadId: cast.threadId } : {}),\n },\n };\n\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 async deleteCast(params: { agentId: UUID; castHash: string }): Promise<void> {\n this.runtime.logger.warn(\n `Cast deletion is not supported by the Farcaster API: ${JSON.stringify({ castHash: params.castHash })}`\n );\n }\n\n async likeCast(params: { agentId: UUID; castHash: string }): Promise<void> {\n try {\n const result = await this.client.publishReaction({\n reactionType: \"like\",\n target: params.castHash,\n });\n\n if (!result.success) {\n throw new Error(`Failed to like cast: ${params.castHash}`);\n }\n\n this.runtime.logger.info(`Liked cast: ${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 async unlikeCast(params: { agentId: UUID; castHash: string }): Promise<void> {\n try {\n const result = await this.client.deleteReaction({\n reactionType: \"like\",\n target: params.castHash,\n });\n\n if (!result.success) {\n throw new Error(`Failed to unlike cast: ${params.castHash}`);\n }\n\n this.runtime.logger.info(`Unliked cast: ${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 async recast(params: { agentId: UUID; castHash: string }): Promise<void> {\n try {\n const result = await this.client.publishReaction({\n reactionType: \"recast\",\n target: params.castHash,\n });\n\n if (!result.success) {\n throw new Error(`Failed to recast: ${params.castHash}`);\n }\n\n this.runtime.logger.info(`Recasted: ${params.castHash}`);\n } catch (error) {\n this.runtime.logger.error(`Failed to recast: ${JSON.stringify({ params, error })}`);\n throw error;\n }\n }\n\n async unrecast(params: { agentId: UUID; castHash: string }): Promise<void> {\n try {\n const result = await this.client.deleteReaction({\n reactionType: \"recast\",\n target: params.castHash,\n });\n\n if (!result.success) {\n throw new Error(`Failed to remove recast: ${params.castHash}`);\n }\n\n this.runtime.logger.info(`Removed recast: ${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 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 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 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 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 private async storeCastInMemory(roomId: UUID, cast: FarcasterCast): Promise<void> {\n try {\n const entityId = createUniqueUuid(this.runtime, cast.userId);\n const memory = {\n id: createUniqueUuid(this.runtime, cast.id),\n agentId: this.runtime.agentId,\n entityId,\n content: {\n text: cast.text,\n castHash: String(cast.metadata?.castHash || \"\"),\n castId: cast.id,\n author: cast.username,\n timestamp: cast.timestamp,\n },\n roomId,\n createdAt: Date.now(),\n };\n\n // Use the database adapter's createMemory method\n await this.runtime.createMemory(memory, \"farcaster_casts\");\n } catch (error) {\n this.runtime.logger.error(`Failed to store cast in memory: ${JSON.stringify({ error })}`);\n }\n }\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: [],\n metadata: {\n castHash: cast.hash,\n authorFid: cast.authorFid,\n source: FARCASTER_SOURCE,\n ...(cast.threadId ? { threadId: cast.threadId } : {}),\n ...(cast.stats\n ? {\n recasts: cast.stats.recasts,\n replies: cast.stats.replies,\n likes: cast.stats.likes,\n }\n : {}),\n },\n };\n }\n}\n",
28
+ "import { createUniqueUuid, type IAgentRuntime, type UUID } from \"@elizaos/core\";\nimport type { FarcasterClient } from \"../client/FarcasterClient\";\nimport { type Cast, FARCASTER_SOURCE, FarcasterEventTypes, FarcasterMessageType } from \"../types\";\nimport { castUuid, neynarCastToCast } from \"../utils\";\nimport { getFarcasterFid } from \"../utils/config\";\n\ntype MessageMetadata = Record<string, string | number | boolean | null | undefined>;\n\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?: MessageMetadata;\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?: MessageMetadata;\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: IAgentRuntime\n ) {}\n\n private castToMessage(cast: Cast, agentId: UUID, extraMetadata?: MessageMetadata): 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 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 const err = error instanceof Error ? error : new Error(String(error));\n this.runtime.logger.error(err, \"[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;\n if (replyToId && type === FarcasterMessageType.REPLY) {\n const parentHash =\n typeof options.metadata?.parentHash === \"string\"\n ? options.metadata.parentHash\n : 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,\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 const castGeneratedPayload = {\n runtime: this.runtime,\n source: FARCASTER_SOURCE,\n castHash: cast.hash,\n ...(cast.threadId ? { threadId: cast.threadId } : {}),\n messageId: message.id,\n roomId,\n };\n await this.runtime.emitEvent(\n FarcasterEventTypes.CAST_GENERATED as string,\n castGeneratedPayload\n );\n\n return message;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.runtime.logger.error(err, \"[Farcaster] Error sending message\");\n throw err;\n }\n }\n\n async deleteMessage(_messageId: string, _agentId: UUID): Promise<void> {\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 const castHash = messageId;\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 const err = error instanceof Error ? error : new Error(String(error));\n this.runtime.logger.error(err, \"[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 const err = error instanceof Error ? error : new Error(String(error));\n this.runtime.logger.error(err, \"[Farcaster] Error fetching thread\");\n return [];\n }\n }\n\n async markAsRead(_messageIds: string[], _agentId: UUID): Promise<void> {\n this.runtime.logger.debug(\"[Farcaster] Mark as read is not applicable for Farcaster casts\");\n }\n}\n",
29
+ "import type { Plugin } from \"@elizaos/core\";\nimport { farcasterActions } from \"./actions\";\nimport { farcasterProviders } from \"./providers\";\nimport { farcasterWebhookRoutes } from \"./routes/webhook\";\nimport { FarcasterService } from \"./services/FarcasterService\";\n\nexport { FarcasterClient } from \"./client/FarcasterClient\";\nexport {\n EmbedManager,\n isEmbedCast,\n isEmbedUrl,\n type ProcessedEmbed,\n} from \"./managers/EmbedManager\";\nexport { FarcasterService } from \"./services/FarcasterService\";\nexport type {\n Cast,\n CastEmbed,\n CastId,\n FarcasterConfig,\n FarcasterEventTypes,\n FarcasterMessageType,\n FidRequest,\n Profile,\n} from \"./types\";\n\nexport const farcasterPlugin: Plugin = {\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};\n\nexport default farcasterPlugin;\n"
30
+ ],
31
+ "mappings": "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",
32
+ "debugId": "AB1623D783FDBC2864756E2164756E21",
33
+ "names": []
34
+ }
package/dist/index.d.ts CHANGED
@@ -1,15 +1,2 @@
1
- import { FarcasterService } from './service.js';
2
- import { FarcasterTestSuite } from './__tests__/suite.js';
3
- export { EmbedManager, isEmbedUrl, isEmbedCast, type ProcessedEmbed } from './managers/embedManager.js';
4
- export type { Cast, CastEmbed, Profile, FarcasterConfig } from './common/types.js';
5
- declare const farcasterPlugin: {
6
- name: string;
7
- description: string;
8
- services: (typeof FarcasterService)[];
9
- actions: any[];
10
- providers: any[];
11
- routes: Route[];
12
- tests: FarcasterTestSuite[];
13
- };
14
- export default farcasterPlugin;
15
- //# sourceMappingURL=index.d.ts.map
1
+ export * from "./node/index";
2
+ export { default } from "./node/index";
@@ -0,0 +1,2 @@
1
+ export * from "./index.node";
2
+ export { default } from "./index.node";