@elizaos/plugin-bluesky 2.0.0-beta.1 → 2.0.3-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,20 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../index.ts", "../../types/index.ts", "../../utils/config.ts", "../../connector-account-provider.ts", "../../services/bluesky.ts", "../../client.ts", "../../managers/agent.ts", "../../services/message.ts", "../../prompts.ts", "../../services/post.ts", "../../workflow-credential-provider.ts"],
4
- "sourcesContent": [
5
- "import {\n\tgetConnectorAccountManager,\n\ttype IAgentRuntime,\n\tlogger,\n\ttype Plugin,\n\ttype TestCase,\n\ttype TestSuite,\n} from \"@elizaos/core\";\nimport { createBlueSkyConnectorAccountProvider } from \"./connector-account-provider\";\nimport { BlueSkyService } from \"./services/bluesky\";\nimport { getApiKeyOptional } from \"./utils/config\";\nimport { BlueskyWorkflowCredentialProvider } from \"./workflow-credential-provider\";\n\nexport { BlueSkyClient } from \"./client\";\nexport {\n\tBLUESKY_PROVIDER_ID,\n\tcreateBlueSkyConnectorAccountProvider,\n} from \"./connector-account-provider\";\nexport { BlueSkyService } from \"./services/bluesky\";\nexport {\n\tDEFAULT_BLUESKY_ACCOUNT_ID,\n\tlistBlueSkyAccountIds,\n\tnormalizeBlueSkyAccountId,\n\treadBlueSkyAccountId,\n\tresolveDefaultBlueSkyAccountId,\n} from \"./utils/config\";\n\nexport interface PluginConfig {\n\treadonly BLUESKY_HANDLE?: string;\n\treadonly BLUESKY_PASSWORD?: string;\n\treadonly BLUESKY_SERVICE?: string;\n\treadonly BLUESKY_DRY_RUN?: string;\n\treadonly BLUESKY_POLL_INTERVAL?: string;\n\treadonly BLUESKY_ENABLE_POSTING?: string;\n\treadonly BLUESKY_ENABLE_DMS?: string;\n\treadonly BLUESKY_POST_INTERVAL_MIN?: string;\n\treadonly BLUESKY_POST_INTERVAL_MAX?: string;\n\treadonly BLUESKY_ENABLE_ACTION_PROCESSING?: string;\n\treadonly BLUESKY_ACTION_INTERVAL?: string;\n\treadonly BLUESKY_POST_IMMEDIATELY?: string;\n\treadonly BLUESKY_MAX_ACTIONS_PROCESSING?: string;\n\treadonly BLUESKY_MAX_POST_LENGTH?: string;\n\treadonly BLUESKY_ACCOUNTS?: string;\n\treadonly BLUESKY_DEFAULT_ACCOUNT_ID?: string;\n}\n\nconst pluginTests = [\n\t{\n\t\tname: \"bluesky_plugin_tests\",\n\t\ttests: [\n\t\t\t{\n\t\t\t\tname: \"bluesky_test_credentials_validation\",\n\t\t\t\tfn: async (runtime: IAgentRuntime) => {\n\t\t\t\t\tconst handle = getApiKeyOptional(runtime, \"BLUESKY_HANDLE\");\n\t\t\t\t\tconst password = getApiKeyOptional(runtime, \"BLUESKY_PASSWORD\");\n\t\t\t\t\tif (!handle || !password) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\"BLUESKY_HANDLE and BLUESKY_PASSWORD are not configured\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tlogger.log(\"BlueSky credentials are configured\");\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"bluesky_test_service_initialization\",\n\t\t\t\tfn: async (runtime: IAgentRuntime) => {\n\t\t\t\t\tconst handle = getApiKeyOptional(runtime, \"BLUESKY_HANDLE\");\n\t\t\t\t\tconst password = getApiKeyOptional(runtime, \"BLUESKY_PASSWORD\");\n\t\t\t\t\tif (!handle || !password) {\n\t\t\t\t\t\tlogger.log(\n\t\t\t\t\t\t\t\"Skipping service initialization test - credentials not configured\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst service = await BlueSkyService.start(runtime);\n\t\t\t\t\tif (!service) {\n\t\t\t\t\t\tthrow new Error(\"Failed to initialize BlueSky service\");\n\t\t\t\t\t}\n\t\t\t\t\tlogger.log(\"BlueSky service initialized successfully\");\n\t\t\t\t},\n\t\t\t},\n\t\t] as TestCase[],\n\t},\n] as TestSuite[];\n\nexport const blueSkyPlugin: Plugin = {\n\tname: \"bluesky\",\n\tdescription:\n\t\t\"BlueSky client plugin using AT Protocol for social interactions\",\n\n\tconfig: {\n\t\tBLUESKY_HANDLE: process.env.BLUESKY_HANDLE ?? null,\n\t\tBLUESKY_PASSWORD: process.env.BLUESKY_PASSWORD ?? null,\n\t\tBLUESKY_SERVICE: process.env.BLUESKY_SERVICE ?? null,\n\t\tBLUESKY_DRY_RUN: process.env.BLUESKY_DRY_RUN ?? null,\n\t\tBLUESKY_POLL_INTERVAL: process.env.BLUESKY_POLL_INTERVAL ?? null,\n\t\tBLUESKY_ENABLE_POSTING: process.env.BLUESKY_ENABLE_POSTING ?? null,\n\t\tBLUESKY_ENABLE_DMS: process.env.BLUESKY_ENABLE_DMS ?? null,\n\t\tBLUESKY_POST_INTERVAL_MIN: process.env.BLUESKY_POST_INTERVAL_MIN ?? null,\n\t\tBLUESKY_POST_INTERVAL_MAX: process.env.BLUESKY_POST_INTERVAL_MAX ?? null,\n\t\tBLUESKY_ENABLE_ACTION_PROCESSING:\n\t\t\tprocess.env.BLUESKY_ENABLE_ACTION_PROCESSING ?? null,\n\t\tBLUESKY_ACTION_INTERVAL: process.env.BLUESKY_ACTION_INTERVAL ?? null,\n\t\tBLUESKY_POST_IMMEDIATELY: process.env.BLUESKY_POST_IMMEDIATELY ?? null,\n\t\tBLUESKY_MAX_ACTIONS_PROCESSING:\n\t\t\tprocess.env.BLUESKY_MAX_ACTIONS_PROCESSING ?? null,\n\t\tBLUESKY_MAX_POST_LENGTH: process.env.BLUESKY_MAX_POST_LENGTH ?? null,\n\t\tBLUESKY_ACCOUNTS: process.env.BLUESKY_ACCOUNTS ?? null,\n\t\tBLUESKY_DEFAULT_ACCOUNT_ID: process.env.BLUESKY_DEFAULT_ACCOUNT_ID ?? null,\n\t},\n\n\tasync init(_config, runtime) {\n\t\ttry {\n\t\t\tconst manager = getConnectorAccountManager(runtime);\n\t\t\tmanager.registerProvider(createBlueSkyConnectorAccountProvider(runtime));\n\t\t} catch (err) {\n\t\t\tlogger.warn(\n\t\t\t\t{\n\t\t\t\t\tsrc: \"plugin:bluesky\",\n\t\t\t\t\terr: err instanceof Error ? err.message : String(err),\n\t\t\t\t},\n\t\t\t\t\"Failed to register BlueSky provider with ConnectorAccountManager\",\n\t\t\t);\n\t\t}\n\t\tlogger.log(\"BlueSky plugin initialized\");\n\t},\n\n\tactions: [],\n\n\tservices: [BlueSkyService, BlueskyWorkflowCredentialProvider],\n\n\ttests: pluginTests,\n};\n\nexport default blueSkyPlugin;\n",
6
- "import type { IAgentRuntime } from \"@elizaos/core\";\nimport * as zod from \"zod\";\n\nconst z = zod.z ?? zod;\n\nexport const BLUESKY_SERVICE_URL = \"https://bsky.social\";\nexport const BLUESKY_MAX_POST_LENGTH = 300;\nexport const BLUESKY_POLL_INTERVAL = 60;\nexport const BLUESKY_POST_INTERVAL_MIN = 1800;\nexport const BLUESKY_POST_INTERVAL_MAX = 3600;\nexport const BLUESKY_ACTION_INTERVAL = 120;\nexport const BLUESKY_MAX_ACTIONS = 5;\nexport const BLUESKY_CHAT_SERVICE_DID = \"did:web:api.bsky.chat\";\nexport const BLUESKY_SERVICE_NAME = \"bluesky\";\n\nexport const AT_PROTOCOL_HANDLE_REGEX =\n\t/^([a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\\.)+[a-zA-Z]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?$/;\n\nexport const CACHE_TTL = {\n\tPROFILE: 3600000,\n\tTIMELINE: 300000,\n\tPOST: 1800000,\n\tNOTIFICATIONS: 300000,\n\tCONVERSATIONS: 300000,\n} as const;\n\nexport const CACHE_SIZE = {\n\tPROFILE: 1000,\n\tTIMELINE: 500,\n\tPOST: 10000,\n\tNOTIFICATIONS: 1000,\n\tCONVERSATIONS: 100,\n} as const;\n\nexport const BlueSkyConfigSchema = z.object({\n\thandle: z.string().regex(AT_PROTOCOL_HANDLE_REGEX, \"Invalid handle format\"),\n\tpassword: z.string().min(1),\n\tservice: z.string().url().default(BLUESKY_SERVICE_URL),\n\tdryRun: z.boolean().default(false),\n\tpollInterval: z.number().positive().default(BLUESKY_POLL_INTERVAL),\n\tenablePost: z.boolean().default(true),\n\tpostIntervalMin: z.number().positive().default(BLUESKY_POST_INTERVAL_MIN),\n\tpostIntervalMax: z.number().positive().default(BLUESKY_POST_INTERVAL_MAX),\n\tenableActionProcessing: z.boolean().default(true),\n\tactionInterval: z.number().positive().default(BLUESKY_ACTION_INTERVAL),\n\tpostImmediately: z.boolean().default(false),\n\tmaxActionsProcessing: z.number().positive().default(BLUESKY_MAX_ACTIONS),\n\tenableDMs: z.boolean().default(true),\n});\n\nexport type BlueSkyConfig = zod.infer<typeof BlueSkyConfigSchema>;\n\nexport interface BlueSkyProfile {\n\tdid: string;\n\thandle: string;\n\tdisplayName?: string;\n\tdescription?: string;\n\tavatar?: string;\n\tbanner?: string;\n\tfollowersCount?: number;\n\tfollowsCount?: number;\n\tpostsCount?: number;\n\tindexedAt?: string;\n\tcreatedAt?: string;\n}\n\nexport interface PostFacet {\n\tindex: { byteStart: number; byteEnd: number };\n\tfeatures: Array<{\n\t\t$type?: string;\n\t\t[key: string]: string | number | boolean | object | null | undefined;\n\t}>;\n}\n\nexport interface PostEmbed {\n\t$type: string;\n\t[key: string]: string | number | boolean | object | null | undefined;\n}\n\nexport interface PostRecord {\n\t$type: string;\n\ttext: string;\n\tfacets?: PostFacet[];\n\tembed?: PostEmbed;\n\tcreatedAt: string;\n}\n\nexport interface BlueSkyPost {\n\turi: string;\n\tcid: string;\n\tauthor: BlueSkyProfile;\n\trecord: PostRecord;\n\tembed?: PostEmbed;\n\treplyCount?: number;\n\trepostCount?: number;\n\tlikeCount?: number;\n\tquoteCount?: number;\n\tindexedAt: string;\n}\n\nexport interface TimelineRequest {\n\talgorithm?: string;\n\tlimit?: number;\n\tcursor?: string;\n}\n\nexport interface TimelineFeedItem {\n\tpost: BlueSkyPost;\n\treply?: {\n\t\troot: BlueSkyPost;\n\t\tparent: BlueSkyPost;\n\t};\n\treason?: Record<\n\t\tstring,\n\t\tstring | number | boolean | object | null | undefined\n\t>;\n}\n\nexport interface TimelineResponse {\n\tcursor?: string;\n\tfeed: TimelineFeedItem[];\n}\n\nexport interface CreatePostRequest {\n\tcontent: {\n\t\ttext: string;\n\t\tfacets?: PostFacet[];\n\t\tembed?: PostEmbed;\n\t};\n\treplyTo?: { uri: string; cid: string };\n}\n\nexport type NotificationReason =\n\t| \"mention\"\n\t| \"reply\"\n\t| \"follow\"\n\t| \"like\"\n\t| \"repost\"\n\t| \"quote\";\n\nexport interface BlueSkyNotification {\n\turi: string;\n\tcid: string;\n\tauthor: BlueSkyProfile;\n\treason: NotificationReason;\n\treasonSubject?: string;\n\trecord: Record<string, string | number | boolean | object | null | undefined>;\n\tisRead: boolean;\n\tindexedAt: string;\n}\n\nexport interface BlueSkyMessage {\n\tid: string;\n\trev: string;\n\ttext?: string;\n\tembed?: PostEmbed;\n\tsender: { did: string };\n\tsentAt: string;\n}\n\nexport interface BlueSkyConversation {\n\tid: string;\n\trev: string;\n\tmembers: Array<{\n\t\tdid: string;\n\t\thandle?: string;\n\t\tdisplayName?: string;\n\t\tavatar?: string;\n\t}>;\n\tlastMessage?: BlueSkyMessage;\n\tunreadCount: number;\n\tmuted: boolean;\n}\n\nexport interface SendMessageRequest {\n\tconvoId: string;\n\tmessage: { text?: string; embed?: PostEmbed };\n}\n\nexport interface BlueSkySession {\n\tdid: string;\n\thandle: string;\n\temail?: string;\n\taccessJwt: string;\n\trefreshJwt: string;\n}\n\nexport class BlueSkyError extends Error {\n\tconstructor(\n\t\tmessage: string,\n\t\tpublic readonly code: string,\n\t\tpublic readonly status?: number,\n\t) {\n\t\tsuper(message);\n\t\tthis.name = \"BlueSkyError\";\n\t}\n}\n\nexport interface ATProtocolPostRecord {\n\t$type: string;\n\ttext: string;\n\tfacets?: PostFacet[];\n\tembed?: PostEmbed;\n\tcreatedAt: string;\n\t[k: string]:\n\t\t| string\n\t\t| PostFacet[]\n\t\t| PostEmbed\n\t\t| number\n\t\t| boolean\n\t\t| null\n\t\t| undefined;\n}\n\nexport interface ATProtocolProfileViewExtended {\n\tdid: string;\n\thandle: string;\n\tdisplayName?: string;\n\tdescription?: string;\n\tavatar?: string;\n\tbanner?: string;\n\tfollowersCount?: number;\n\tfollowsCount?: number;\n\tpostsCount?: number;\n\tindexedAt?: string;\n\tcreatedAt?: string;\n\t[k: string]: string | number | undefined;\n}\n\nexport interface BlueSkyEventPayload {\n\truntime: IAgentRuntime;\n\tsource: \"bluesky\";\n\taccountId?: string;\n}\n\nexport interface BlueSkyNotificationEventPayload extends BlueSkyEventPayload {\n\tnotification: BlueSkyNotification;\n}\n\nexport interface BlueSkyCreatePostEventPayload extends BlueSkyEventPayload {\n\tautomated: boolean;\n}\n",
7
- "import type { IAgentRuntime } from \"@elizaos/core\";\nimport {\n\tBLUESKY_ACTION_INTERVAL,\n\tBLUESKY_MAX_ACTIONS,\n\tBLUESKY_POLL_INTERVAL,\n\tBLUESKY_POST_INTERVAL_MAX,\n\tBLUESKY_POST_INTERVAL_MIN,\n\tBLUESKY_SERVICE_URL,\n\ttype BlueSkyConfig,\n\tBlueSkyConfigSchema,\n} from \"../types\";\n\nexport type { BlueSkyConfig };\nexport type ResolvedBlueSkyConfig = BlueSkyConfig & { accountId: string };\n\nexport const DEFAULT_BLUESKY_ACCOUNT_ID = \"default\";\n\ntype RawBlueSkyAccountConfig = Partial<BlueSkyConfig> &\n\tRecord<string, unknown> & {\n\t\taccountId?: string;\n\t\tid?: string;\n\t};\n\ntype BlueSkyMultiAccountConfig = RawBlueSkyAccountConfig & {\n\taccounts?: Record<string, RawBlueSkyAccountConfig>;\n};\n\nexport function getApiKeyOptional(\n\truntime: IAgentRuntime,\n\tkey: string,\n): string | undefined {\n\tconst value = runtime.getSetting(key);\n\treturn typeof value === \"string\" ? value : undefined;\n}\n\nfunction stringSetting(\n\truntime: IAgentRuntime,\n\tkey: string,\n): string | undefined {\n\tconst value = runtime.getSetting(key);\n\treturn typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n}\n\nfunction characterConfig(runtime: IAgentRuntime): BlueSkyMultiAccountConfig {\n\tconst settings = runtime.character?.settings as\n\t\t| Record<string, unknown>\n\t\t| undefined;\n\tconst raw = settings?.bluesky;\n\treturn raw && typeof raw === \"object\"\n\t\t? (raw as BlueSkyMultiAccountConfig)\n\t\t: {};\n}\n\nfunction parseAccountsJson(\n\truntime: IAgentRuntime,\n): Record<string, RawBlueSkyAccountConfig> {\n\tconst raw = stringSetting(runtime, \"BLUESKY_ACCOUNTS\");\n\tif (!raw) return {};\n\n\ttry {\n\t\tconst parsed = JSON.parse(raw) as unknown;\n\t\tif (Array.isArray(parsed)) {\n\t\t\treturn Object.fromEntries(\n\t\t\t\tparsed\n\t\t\t\t\t.filter(\n\t\t\t\t\t\t(item): item is RawBlueSkyAccountConfig =>\n\t\t\t\t\t\t\tBoolean(item) && typeof item === \"object\",\n\t\t\t\t\t)\n\t\t\t\t\t.map((item) => [\n\t\t\t\t\t\tnormalizeBlueSkyAccountId(item.accountId ?? item.id),\n\t\t\t\t\t\titem,\n\t\t\t\t\t]),\n\t\t\t);\n\t\t}\n\t\treturn parsed && typeof parsed === \"object\"\n\t\t\t? (parsed as Record<string, RawBlueSkyAccountConfig>)\n\t\t\t: {};\n\t} catch {\n\t\treturn {};\n\t}\n}\n\nfunction allAccountConfigs(\n\truntime: IAgentRuntime,\n): Record<string, RawBlueSkyAccountConfig> {\n\treturn {\n\t\t...(characterConfig(runtime).accounts ?? {}),\n\t\t...parseAccountsJson(runtime),\n\t};\n}\n\nfunction accountConfig(\n\truntime: IAgentRuntime,\n\taccountId: string,\n): RawBlueSkyAccountConfig {\n\tconst accounts = allAccountConfigs(runtime);\n\treturn (\n\t\taccounts[accountId] ?? accounts[normalizeBlueSkyAccountId(accountId)] ?? {}\n\t);\n}\n\nfunction readRawField(\n\trecord: RawBlueSkyAccountConfig | undefined,\n\tkeys: string[],\n): string | undefined {\n\tif (!record) return undefined;\n\tfor (const key of keys) {\n\t\tconst value = record[key];\n\t\tif (typeof value === \"string\" && value.trim()) return value.trim();\n\t\tif (typeof value === \"number\" || typeof value === \"boolean\")\n\t\t\treturn String(value);\n\t}\n\treturn undefined;\n}\n\nfunction boolValue(value: unknown, fallback = false): boolean {\n\tif (typeof value === \"boolean\") return value;\n\tif (typeof value === \"string\") return value.trim().toLowerCase() === \"true\";\n\treturn fallback;\n}\n\nfunction intValue(value: unknown, fallback: number): number {\n\tconst parsed = Number.parseInt(String(value ?? \"\"), 10);\n\treturn Number.isFinite(parsed) && parsed > 0 ? parsed : fallback;\n}\n\nexport function normalizeBlueSkyAccountId(accountId?: unknown): string {\n\tif (typeof accountId !== \"string\") return DEFAULT_BLUESKY_ACCOUNT_ID;\n\tconst trimmed = accountId.trim();\n\treturn trimmed || DEFAULT_BLUESKY_ACCOUNT_ID;\n}\n\nexport function listBlueSkyAccountIds(runtime: IAgentRuntime): string[] {\n\tconst ids = new Set<string>();\n\tconst config = characterConfig(runtime);\n\tif (\n\t\tstringSetting(runtime, \"BLUESKY_HANDLE\") ||\n\t\t(config.handle && config.password)\n\t) {\n\t\tids.add(DEFAULT_BLUESKY_ACCOUNT_ID);\n\t}\n\tfor (const id of Object.keys(allAccountConfigs(runtime))) {\n\t\tids.add(normalizeBlueSkyAccountId(id));\n\t}\n\treturn Array.from(\n\t\tids.size ? ids : new Set([DEFAULT_BLUESKY_ACCOUNT_ID]),\n\t).sort((a, b) => a.localeCompare(b));\n}\n\nexport function resolveDefaultBlueSkyAccountId(runtime: IAgentRuntime): string {\n\tconst requested =\n\t\tstringSetting(runtime, \"BLUESKY_DEFAULT_ACCOUNT_ID\") ??\n\t\tstringSetting(runtime, \"BLUESKY_ACCOUNT_ID\");\n\tif (requested) return normalizeBlueSkyAccountId(requested);\n\tconst ids = listBlueSkyAccountIds(runtime);\n\treturn ids.includes(DEFAULT_BLUESKY_ACCOUNT_ID)\n\t\t? DEFAULT_BLUESKY_ACCOUNT_ID\n\t\t: (ids[0] ?? DEFAULT_BLUESKY_ACCOUNT_ID);\n}\n\nexport function readBlueSkyAccountId(\n\t...sources: unknown[]\n): string | undefined {\n\tfor (const source of sources) {\n\t\tif (!source || typeof source !== \"object\") continue;\n\t\tconst record = source as Record<string, unknown>;\n\t\tconst parameters =\n\t\t\trecord.parameters && typeof record.parameters === \"object\"\n\t\t\t\t? (record.parameters as Record<string, unknown>)\n\t\t\t\t: {};\n\t\tconst data =\n\t\t\trecord.data && typeof record.data === \"object\"\n\t\t\t\t? (record.data as Record<string, unknown>)\n\t\t\t\t: {};\n\t\tconst metadata =\n\t\t\trecord.metadata && typeof record.metadata === \"object\"\n\t\t\t\t? (record.metadata as Record<string, unknown>)\n\t\t\t\t: {};\n\t\tconst bluesky =\n\t\t\tdata.bluesky && typeof data.bluesky === \"object\"\n\t\t\t\t? (data.bluesky as Record<string, unknown>)\n\t\t\t\t: {};\n\t\tconst value =\n\t\t\trecord.accountId ??\n\t\t\tparameters.accountId ??\n\t\t\tdata.accountId ??\n\t\t\tbluesky.accountId ??\n\t\t\tmetadata.accountId;\n\t\tif (typeof value === \"string\" && value.trim())\n\t\t\treturn normalizeBlueSkyAccountId(value);\n\t}\n\treturn undefined;\n}\n\nexport function hasBlueSkyEnabled(\n\truntime: IAgentRuntime,\n\taccountId?: string | null,\n): boolean {\n\tconst normalizedAccountId = normalizeBlueSkyAccountId(\n\t\taccountId ?? resolveDefaultBlueSkyAccountId(runtime),\n\t);\n\tconst base = characterConfig(runtime);\n\tconst account = accountConfig(runtime, normalizedAccountId);\n\tconst allowEnv = normalizedAccountId === DEFAULT_BLUESKY_ACCOUNT_ID;\n\tconst enabled =\n\t\treadRawField(account, [\"enabled\", \"BLUESKY_ENABLED\"]) ??\n\t\treadRawField(base, [\"enabled\", \"BLUESKY_ENABLED\"]) ??\n\t\t(allowEnv ? runtime.getSetting(\"BLUESKY_ENABLED\") : undefined);\n\tif (enabled) return String(enabled).toLowerCase() === \"true\";\n\treturn Boolean(\n\t\t(readRawField(account, [\"handle\", \"BLUESKY_HANDLE\"]) ??\n\t\t\treadRawField(base, [\"handle\", \"BLUESKY_HANDLE\"]) ??\n\t\t\t(allowEnv ? stringSetting(runtime, \"BLUESKY_HANDLE\") : undefined)) &&\n\t\t\t(readRawField(account, [\"password\", \"BLUESKY_PASSWORD\"]) ??\n\t\t\t\treadRawField(base, [\"password\", \"BLUESKY_PASSWORD\"]) ??\n\t\t\t\t(allowEnv ? stringSetting(runtime, \"BLUESKY_PASSWORD\") : undefined)),\n\t);\n}\n\nexport function validateBlueSkyConfig(\n\truntime: IAgentRuntime,\n\taccountId?: string | null,\n): ResolvedBlueSkyConfig {\n\tconst normalizedAccountId = normalizeBlueSkyAccountId(\n\t\taccountId ?? resolveDefaultBlueSkyAccountId(runtime),\n\t);\n\tconst base = characterConfig(runtime);\n\tconst account = accountConfig(runtime, normalizedAccountId);\n\tconst allowEnv = normalizedAccountId === DEFAULT_BLUESKY_ACCOUNT_ID;\n\tconst result = BlueSkyConfigSchema.safeParse({\n\t\thandle:\n\t\t\treadRawField(account, [\"handle\", \"BLUESKY_HANDLE\"]) ??\n\t\t\treadRawField(base, [\"handle\", \"BLUESKY_HANDLE\"]) ??\n\t\t\t(allowEnv ? stringSetting(runtime, \"BLUESKY_HANDLE\") : undefined) ??\n\t\t\t\"\",\n\t\tpassword:\n\t\t\treadRawField(account, [\"password\", \"BLUESKY_PASSWORD\"]) ??\n\t\t\treadRawField(base, [\"password\", \"BLUESKY_PASSWORD\"]) ??\n\t\t\t(allowEnv ? stringSetting(runtime, \"BLUESKY_PASSWORD\") : undefined) ??\n\t\t\t\"\",\n\t\tservice:\n\t\t\treadRawField(account, [\"service\", \"BLUESKY_SERVICE\"]) ??\n\t\t\treadRawField(base, [\"service\", \"BLUESKY_SERVICE\"]) ??\n\t\t\t(allowEnv ? stringSetting(runtime, \"BLUESKY_SERVICE\") : undefined) ??\n\t\t\tBLUESKY_SERVICE_URL,\n\t\tdryRun: boolValue(\n\t\t\treadRawField(account, [\"dryRun\", \"BLUESKY_DRY_RUN\"]) ??\n\t\t\t\treadRawField(base, [\"dryRun\", \"BLUESKY_DRY_RUN\"]) ??\n\t\t\t\t(allowEnv ? runtime.getSetting(\"BLUESKY_DRY_RUN\") : undefined),\n\t\t),\n\t\tpollInterval: intValue(\n\t\t\treadRawField(account, [\"pollInterval\", \"BLUESKY_POLL_INTERVAL\"]) ??\n\t\t\t\treadRawField(base, [\"pollInterval\", \"BLUESKY_POLL_INTERVAL\"]) ??\n\t\t\t\t(allowEnv ? runtime.getSetting(\"BLUESKY_POLL_INTERVAL\") : undefined),\n\t\t\tBLUESKY_POLL_INTERVAL,\n\t\t),\n\t\tenablePost:\n\t\t\tString(\n\t\t\t\treadRawField(account, [\"enablePost\", \"BLUESKY_ENABLE_POSTING\"]) ??\n\t\t\t\t\treadRawField(base, [\"enablePost\", \"BLUESKY_ENABLE_POSTING\"]) ??\n\t\t\t\t\t(allowEnv\n\t\t\t\t\t\t? runtime.getSetting(\"BLUESKY_ENABLE_POSTING\")\n\t\t\t\t\t\t: undefined) ??\n\t\t\t\t\t\"true\",\n\t\t\t).toLowerCase() !== \"false\",\n\t\tpostIntervalMin: intValue(\n\t\t\treadRawField(account, [\"postIntervalMin\", \"BLUESKY_POST_INTERVAL_MIN\"]) ??\n\t\t\t\treadRawField(base, [\"postIntervalMin\", \"BLUESKY_POST_INTERVAL_MIN\"]) ??\n\t\t\t\t(allowEnv\n\t\t\t\t\t? runtime.getSetting(\"BLUESKY_POST_INTERVAL_MIN\")\n\t\t\t\t\t: undefined),\n\t\t\tBLUESKY_POST_INTERVAL_MIN,\n\t\t),\n\t\tpostIntervalMax: intValue(\n\t\t\treadRawField(account, [\"postIntervalMax\", \"BLUESKY_POST_INTERVAL_MAX\"]) ??\n\t\t\t\treadRawField(base, [\"postIntervalMax\", \"BLUESKY_POST_INTERVAL_MAX\"]) ??\n\t\t\t\t(allowEnv\n\t\t\t\t\t? runtime.getSetting(\"BLUESKY_POST_INTERVAL_MAX\")\n\t\t\t\t\t: undefined),\n\t\t\tBLUESKY_POST_INTERVAL_MAX,\n\t\t),\n\t\tenableActionProcessing:\n\t\t\tString(\n\t\t\t\treadRawField(account, [\n\t\t\t\t\t\"enableActionProcessing\",\n\t\t\t\t\t\"BLUESKY_ENABLE_ACTION_PROCESSING\",\n\t\t\t\t]) ??\n\t\t\t\t\treadRawField(base, [\n\t\t\t\t\t\t\"enableActionProcessing\",\n\t\t\t\t\t\t\"BLUESKY_ENABLE_ACTION_PROCESSING\",\n\t\t\t\t\t]) ??\n\t\t\t\t\t(allowEnv\n\t\t\t\t\t\t? runtime.getSetting(\"BLUESKY_ENABLE_ACTION_PROCESSING\")\n\t\t\t\t\t\t: undefined) ??\n\t\t\t\t\t\"true\",\n\t\t\t).toLowerCase() !== \"false\",\n\t\tactionInterval: intValue(\n\t\t\treadRawField(account, [\"actionInterval\", \"BLUESKY_ACTION_INTERVAL\"]) ??\n\t\t\t\treadRawField(base, [\"actionInterval\", \"BLUESKY_ACTION_INTERVAL\"]) ??\n\t\t\t\t(allowEnv ? runtime.getSetting(\"BLUESKY_ACTION_INTERVAL\") : undefined),\n\t\t\tBLUESKY_ACTION_INTERVAL,\n\t\t),\n\t\tpostImmediately: boolValue(\n\t\t\treadRawField(account, [\"postImmediately\", \"BLUESKY_POST_IMMEDIATELY\"]) ??\n\t\t\t\treadRawField(base, [\"postImmediately\", \"BLUESKY_POST_IMMEDIATELY\"]) ??\n\t\t\t\t(allowEnv ? runtime.getSetting(\"BLUESKY_POST_IMMEDIATELY\") : undefined),\n\t\t),\n\t\tmaxActionsProcessing: intValue(\n\t\t\treadRawField(account, [\n\t\t\t\t\"maxActionsProcessing\",\n\t\t\t\t\"BLUESKY_MAX_ACTIONS_PROCESSING\",\n\t\t\t]) ??\n\t\t\t\treadRawField(base, [\n\t\t\t\t\t\"maxActionsProcessing\",\n\t\t\t\t\t\"BLUESKY_MAX_ACTIONS_PROCESSING\",\n\t\t\t\t]) ??\n\t\t\t\t(allowEnv\n\t\t\t\t\t? runtime.getSetting(\"BLUESKY_MAX_ACTIONS_PROCESSING\")\n\t\t\t\t\t: undefined),\n\t\t\tBLUESKY_MAX_ACTIONS,\n\t\t),\n\t\tenableDMs:\n\t\t\tString(\n\t\t\t\treadRawField(account, [\"enableDMs\", \"BLUESKY_ENABLE_DMS\"]) ??\n\t\t\t\t\treadRawField(base, [\"enableDMs\", \"BLUESKY_ENABLE_DMS\"]) ??\n\t\t\t\t\t(allowEnv ? runtime.getSetting(\"BLUESKY_ENABLE_DMS\") : undefined) ??\n\t\t\t\t\t\"true\",\n\t\t\t).toLowerCase() !== \"false\",\n\t});\n\n\tif (!result.success) {\n\t\tconst errors =\n\t\t\t(\n\t\t\t\tresult.error as { errors?: { path: string[]; message: string }[] }\n\t\t\t).errors\n\t\t\t\t?.map((e) => `${e.path.join(\".\")}: ${e.message}`)\n\t\t\t\t.join(\", \") || result.error.toString();\n\t\tthrow new Error(`Invalid BlueSky configuration: ${errors}`);\n\t}\n\n\treturn { ...result.data, accountId: normalizedAccountId };\n}\n\nexport function getPollInterval(\n\truntime: IAgentRuntime,\n\taccountId?: string,\n): number {\n\tconst config = validateBlueSkyConfig(runtime, accountId);\n\treturn config.pollInterval * 1000;\n}\n\nexport function getActionInterval(\n\truntime: IAgentRuntime,\n\taccountId?: string,\n): number {\n\tconst config = validateBlueSkyConfig(runtime, accountId);\n\treturn config.actionInterval * 1000;\n}\n\nexport function getMaxActionsProcessing(\n\truntime: IAgentRuntime,\n\taccountId?: string,\n): number {\n\tconst config = validateBlueSkyConfig(runtime, accountId);\n\treturn config.maxActionsProcessing;\n}\n\nexport function isPostingEnabled(\n\truntime: IAgentRuntime,\n\taccountId?: string,\n): boolean {\n\tconst config = validateBlueSkyConfig(runtime, accountId);\n\treturn config.enablePost;\n}\n\nexport function shouldPostImmediately(\n\truntime: IAgentRuntime,\n\taccountId?: string,\n): boolean {\n\tconst config = validateBlueSkyConfig(runtime, accountId);\n\treturn config.postImmediately;\n}\n\nexport function getPostIntervalRange(\n\truntime: IAgentRuntime,\n\taccountId?: string,\n): {\n\tmin: number;\n\tmax: number;\n} {\n\tconst config = validateBlueSkyConfig(runtime, accountId);\n\treturn {\n\t\tmin: config.postIntervalMin * 1000,\n\t\tmax: config.postIntervalMax * 1000,\n\t};\n}\n",
8
- "/**\n * BlueSky ConnectorAccountManager provider.\n *\n * BlueSky uses AT Protocol with username + password (app password) per handle.\n * The `accountKey` is the BlueSky handle. Multi-handle deployments configure\n * additional accounts via `BLUESKY_ACCOUNTS` env JSON or\n * `character.settings.bluesky.accounts`.\n *\n * Persistence of new accounts is owned by the manager's storage; the provider\n * adapter just normalizes the account shape.\n */\n\nimport type {\n\tConnectorAccount,\n\tConnectorAccountManager,\n\tConnectorAccountPatch,\n\tConnectorAccountProvider,\n\tIAgentRuntime,\n} from \"@elizaos/core\";\nimport {\n\tlistBlueSkyAccountIds,\n\tnormalizeBlueSkyAccountId,\n\tvalidateBlueSkyConfig,\n} from \"./utils/config\";\n\nexport const BLUESKY_PROVIDER_ID = \"bluesky\";\n\nfunction toConnectorAccount(\n\truntime: IAgentRuntime,\n\taccountId: string,\n): ConnectorAccount {\n\tlet connected = false;\n\tlet handle = \"\";\n\tlet service = \"\";\n\ttry {\n\t\tconst config = validateBlueSkyConfig(runtime, accountId);\n\t\tconnected = Boolean(config.handle && config.password);\n\t\thandle = config.handle;\n\t\tservice = config.service;\n\t} catch {\n\t\tconnected = false;\n\t}\n\tconst now = Date.now();\n\treturn {\n\t\tid: accountId,\n\t\tprovider: BLUESKY_PROVIDER_ID,\n\t\tlabel: handle || accountId,\n\t\trole: \"OWNER\",\n\t\tpurpose: [\"posting\", \"reading\"],\n\t\taccessGate: \"open\",\n\t\tstatus: connected ? \"connected\" : \"disabled\",\n\t\texternalId: handle || undefined,\n\t\tdisplayHandle: handle || undefined,\n\t\tcreatedAt: now,\n\t\tupdatedAt: now,\n\t\tmetadata: {\n\t\t\tservice,\n\t\t},\n\t};\n}\n\nexport function createBlueSkyConnectorAccountProvider(\n\truntime: IAgentRuntime,\n): ConnectorAccountProvider {\n\treturn {\n\t\tprovider: BLUESKY_PROVIDER_ID,\n\t\tlabel: \"BlueSky\",\n\t\tlistAccounts: async (\n\t\t\t_manager: ConnectorAccountManager,\n\t\t): Promise<ConnectorAccount[]> => {\n\t\t\tconst ids = listBlueSkyAccountIds(runtime);\n\t\t\treturn ids.map((id) => toConnectorAccount(runtime, id));\n\t\t},\n\t\tcreateAccount: async (\n\t\t\tinput: ConnectorAccountPatch,\n\t\t\t_manager: ConnectorAccountManager,\n\t\t) => {\n\t\t\treturn {\n\t\t\t\t...input,\n\t\t\t\tprovider: BLUESKY_PROVIDER_ID,\n\t\t\t\trole: input.role ?? \"OWNER\",\n\t\t\t\tpurpose: input.purpose ?? [\"posting\", \"reading\"],\n\t\t\t\taccessGate: input.accessGate ?? \"open\",\n\t\t\t\tstatus: input.status ?? \"pending\",\n\t\t\t};\n\t\t},\n\t\tpatchAccount: async (\n\t\t\t_accountId: string,\n\t\t\tpatch: ConnectorAccountPatch,\n\t\t\t_manager: ConnectorAccountManager,\n\t\t) => {\n\t\t\treturn { ...patch, provider: BLUESKY_PROVIDER_ID };\n\t\t},\n\t\tdeleteAccount: async (\n\t\t\t_accountId: string,\n\t\t\t_manager: ConnectorAccountManager,\n\t\t) => {\n\t\t\t// Credentials live in character settings or env; out of band.\n\t\t},\n\t};\n}\n\nexport { normalizeBlueSkyAccountId };\n",
9
- "import {\n\tChannelType,\n\ttype Content,\n\ttype IAgentRuntime,\n\tlogger,\n\ttype Memory,\n\tService,\n\ttype UUID,\n} from \"@elizaos/core\";\nimport { BlueSkyClient } from \"../client\";\nimport { BlueSkyAgentManager } from \"../managers/agent\";\nimport { BLUESKY_SERVICE_NAME } from \"../types\";\nimport {\n\tDEFAULT_BLUESKY_ACCOUNT_ID,\n\thasBlueSkyEnabled,\n\tlistBlueSkyAccountIds,\n\tnormalizeBlueSkyAccountId,\n\tresolveDefaultBlueSkyAccountId,\n\tvalidateBlueSkyConfig,\n} from \"../utils/config\";\nimport { BlueSkyMessageService } from \"./message\";\nimport { BlueSkyPostService } from \"./post\";\n\ntype BlueSkyMessageConnectorRegistration = Parameters<\n\tIAgentRuntime[\"registerMessageConnector\"]\n>[0] & {\n\tfetchMessages?: BlueSkyMessageService[\"fetchConnectorMessages\"];\n\tcontentShaping?: {\n\t\tsystemPromptFragment?: string;\n\t\tconstraints?: Record<string, unknown>;\n\t};\n\taccountId?: string;\n};\n\ntype BlueSkyPostConnectorRegistration = {\n\tsource: string;\n\tlabel?: string;\n\tdescription?: string;\n\tcapabilities?: string[];\n\tcontexts?: string[];\n\tmetadata?: Record<string, unknown>;\n\tpostHandler: (runtime: IAgentRuntime, content: Content) => Promise<Memory>;\n\tfetchFeed?: BlueSkyPostService[\"fetchFeed\"];\n\tsearchPosts?: BlueSkyPostService[\"searchPosts\"];\n\tcontentShaping?: {\n\t\tsystemPromptFragment?: string;\n\t\tconstraints?: Record<string, unknown>;\n\t};\n\taccountId?: string;\n};\n\ntype RuntimeWithPostConnector = IAgentRuntime & {\n\tregisterPostConnector?: (\n\t\tregistration: BlueSkyPostConnectorRegistration,\n\t) => void;\n};\n\ninterface AgentAccounts {\n\tdefaultAccountId: string;\n\tmanagers: Map<string, BlueSkyAgentManager>;\n\tmessageServices: Map<string, BlueSkyMessageService>;\n\tpostServices: Map<string, BlueSkyPostService>;\n}\n\nexport class BlueSkyService extends Service {\n\tprivate static instance: BlueSkyService;\n\tprivate agents = new Map<UUID, AgentAccounts>();\n\tstatic serviceType = BLUESKY_SERVICE_NAME;\n\treadonly capabilityDescription = \"Send and receive messages on BlueSky\";\n\n\tprivate static getInstance(): BlueSkyService {\n\t\tBlueSkyService.instance ??= new BlueSkyService();\n\t\treturn BlueSkyService.instance;\n\t}\n\n\tstatic async start(runtime: IAgentRuntime): Promise<Service> {\n\t\tconst service = BlueSkyService.getInstance();\n\n\t\tif (service.agents.has(runtime.agentId)) {\n\t\t\treturn service;\n\t\t}\n\n\t\tif (!hasBlueSkyEnabled(runtime)) {\n\t\t\treturn service;\n\t\t}\n\n\t\tconst accountIds = listBlueSkyAccountIds(runtime);\n\t\tconst defaultAccountId = normalizeBlueSkyAccountId(\n\t\t\tresolveDefaultBlueSkyAccountId(runtime),\n\t\t);\n\t\tconst accounts: AgentAccounts = {\n\t\t\tdefaultAccountId,\n\t\t\tmanagers: new Map(),\n\t\t\tmessageServices: new Map(),\n\t\t\tpostServices: new Map(),\n\t\t};\n\t\tservice.agents.set(runtime.agentId, accounts);\n\n\t\tfor (const accountId of accountIds) {\n\t\t\tif (!hasBlueSkyEnabled(runtime, accountId)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst config = validateBlueSkyConfig(runtime, accountId);\n\t\t\tif (!config.handle || !config.password) {\n\t\t\t\tlogger.warn(\n\t\t\t\t\t{ agentId: runtime.agentId, accountId },\n\t\t\t\t\t\"Skipping BlueSky account without handle/password\",\n\t\t\t\t);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst client = new BlueSkyClient({\n\t\t\t\tservice: config.service,\n\t\t\t\thandle: config.handle,\n\t\t\t\tpassword: config.password,\n\t\t\t\tdryRun: config.dryRun,\n\t\t\t});\n\n\t\t\tconst manager = new BlueSkyAgentManager(runtime, config, client);\n\t\t\taccounts.managers.set(accountId, manager);\n\t\t\taccounts.messageServices.set(\n\t\t\t\taccountId,\n\t\t\t\tnew BlueSkyMessageService(client, runtime, accountId),\n\t\t\t);\n\t\t\taccounts.postServices.set(\n\t\t\t\taccountId,\n\t\t\t\tnew BlueSkyPostService(client, runtime, accountId),\n\t\t\t);\n\n\t\t\tawait manager.start();\n\t\t\tlogger.success(\n\t\t\t\t{ agentId: runtime.agentId, accountId },\n\t\t\t\t\"BlueSky client started\",\n\t\t\t);\n\t\t}\n\n\t\treturn service;\n\t}\n\n\tstatic async stop(runtime: IAgentRuntime): Promise<void> {\n\t\tconst service = BlueSkyService.getInstance();\n\t\tconst accounts = service.agents.get(runtime.agentId);\n\t\tif (!accounts) return;\n\n\t\tfor (const manager of accounts.managers.values()) {\n\t\t\tawait manager.stop();\n\t\t}\n\t\tservice.agents.delete(runtime.agentId);\n\t\tlogger.info({ agentId: runtime.agentId }, \"BlueSky client stopped\");\n\t}\n\n\tstatic registerSendHandlers(\n\t\truntime: IAgentRuntime,\n\t\tserviceInstance: BlueSkyService,\n\t): void {\n\t\tconst accounts = serviceInstance?.agents.get(runtime.agentId);\n\t\tif (!accounts) {\n\t\t\truntime.logger.warn(\n\t\t\t\t{ src: \"plugin:bluesky\", agentId: runtime.agentId },\n\t\t\t\t\"Cannot register BlueSky connectors; service is not initialized\",\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tfor (const postService of accounts.postServices.values()) {\n\t\t\tBlueSkyService.registerPostConnector(runtime, postService);\n\t\t}\n\n\t\tif (\n\t\t\ttypeof runtime.registerMessageConnector === \"function\" &&\n\t\t\taccounts.messageServices.size > 0\n\t\t) {\n\t\t\tfor (const messageService of accounts.messageServices.values()) {\n\t\t\t\tBlueSkyService.registerMessageConnector(runtime, messageService);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tconst defaultAccountId = normalizeBlueSkyAccountId(\n\t\t\taccounts.defaultAccountId,\n\t\t);\n\t\tconst messageService = accounts.messageServices.get(defaultAccountId);\n\t\tif (!messageService) {\n\t\t\truntime.logger.warn(\n\t\t\t\t{ src: \"plugin:bluesky\", agentId: runtime.agentId },\n\t\t\t\t\"Cannot register legacy BlueSky DM send handler; default message service is not initialized\",\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\truntime.registerSendHandler(\n\t\t\t\"bluesky\",\n\t\t\tmessageService.handleSendMessage.bind(messageService),\n\t\t);\n\t}\n\n\tprivate static registerMessageConnector(\n\t\truntime: IAgentRuntime,\n\t\tmessageService: BlueSkyMessageService,\n\t): void {\n\t\tconst accountId = messageService.getAccountId();\n\t\tconst registration: BlueSkyMessageConnectorRegistration = {\n\t\t\tsource: \"bluesky\",\n\t\t\taccountId,\n\t\t\tlabel: \"BlueSky\",\n\t\t\tdescription:\n\t\t\t\t\"BlueSky DM connector for sending private messages to conversations.\",\n\t\t\tcapabilities: [\n\t\t\t\t\"send_message\",\n\t\t\t\t\"fetch_messages\",\n\t\t\t\t\"resolve_targets\",\n\t\t\t\t\"list_rooms\",\n\t\t\t\t\"chat_context\",\n\t\t\t\t\"user_context\",\n\t\t\t],\n\t\t\tsupportedTargetKinds: [\"thread\", \"user\"],\n\t\t\tcontexts: [\"social\", \"connectors\"],\n\t\t\tmetadata: {\n\t\t\t\taccountId,\n\t\t\t\tservice: BLUESKY_SERVICE_NAME,\n\t\t\t},\n\t\t\tresolveTargets:\n\t\t\t\tmessageService.resolveConnectorTargets.bind(messageService),\n\t\t\tlistRecentTargets:\n\t\t\t\tmessageService.listRecentConnectorTargets.bind(messageService),\n\t\t\tlistRooms: messageService.listConnectorRooms.bind(messageService),\n\t\t\tgetChatContext:\n\t\t\t\tmessageService.getConnectorChatContext.bind(messageService),\n\t\t\tgetUserContext:\n\t\t\t\tmessageService.getConnectorUserContext.bind(messageService),\n\t\t\tfetchMessages: messageService.fetchConnectorMessages.bind(messageService),\n\t\t\tcontentShaping: {\n\t\t\t\tsystemPromptFragment:\n\t\t\t\t\t\"For BlueSky DMs, keep messages direct and conversational. Avoid public-feed conventions like hashtags unless the user asked.\",\n\t\t\t\tconstraints: {\n\t\t\t\t\tsupportsMarkdown: false,\n\t\t\t\t\tchannelType: ChannelType.DM,\n\t\t\t\t},\n\t\t\t},\n\t\t\tsendHandler: messageService.handleSendMessage.bind(messageService),\n\t\t};\n\t\truntime.registerMessageConnector(registration);\n\t\truntime.logger.info(\n\t\t\t{ src: \"plugin:bluesky\", agentId: runtime.agentId, accountId },\n\t\t\t\"Registered BlueSky DM connector\",\n\t\t);\n\t}\n\n\tprivate static registerPostConnector(\n\t\truntime: IAgentRuntime,\n\t\tpostService: BlueSkyPostService,\n\t): void {\n\t\tconst withPostConnector = runtime as RuntimeWithPostConnector;\n\t\tif (typeof withPostConnector.registerPostConnector !== \"function\") {\n\t\t\treturn;\n\t\t}\n\t\tconst accountId =\n\t\t\tpostService.getAccountId?.() ?? DEFAULT_BLUESKY_ACCOUNT_ID;\n\n\t\twithPostConnector.registerPostConnector({\n\t\t\tsource: \"bluesky\",\n\t\t\taccountId,\n\t\t\tlabel: \"BlueSky\",\n\t\t\tdescription:\n\t\t\t\t\"BlueSky public feed connector for publishing posts, reading the timeline, and searching posts.\",\n\t\t\tcapabilities: [\"post\", \"fetch_feed\", \"search_posts\"],\n\t\t\tcontexts: [\"social\", \"social_posting\", \"connectors\"],\n\t\t\tmetadata: {\n\t\t\t\taccountId,\n\t\t\t\tservice: BLUESKY_SERVICE_NAME,\n\t\t\t},\n\t\t\tpostHandler: postService.handleSendPost.bind(postService),\n\t\t\tfetchFeed: postService.fetchFeed.bind(postService),\n\t\t\tsearchPosts: postService.searchPosts.bind(postService),\n\t\t\tcontentShaping: {\n\t\t\t\tsystemPromptFragment:\n\t\t\t\t\t\"For BlueSky posts, write a public post under 300 characters. Handles, links, and facets are supported by the connector; do not exceed the platform limit.\",\n\t\t\t\tconstraints: {\n\t\t\t\t\tmaxLength: 300,\n\t\t\t\t\tsupportsMarkdown: false,\n\t\t\t\t\tchannelType: ChannelType.FEED,\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\truntime.logger.info(\n\t\t\t{ src: \"plugin:bluesky\", agentId: runtime.agentId, accountId },\n\t\t\t\"Registered BlueSky post connector\",\n\t\t);\n\t}\n\n\tasync stop(): Promise<void> {\n\t\tfor (const [agentId, accounts] of this.agents) {\n\t\t\tfor (const manager of accounts.managers.values()) {\n\t\t\t\tawait manager.stop();\n\t\t\t}\n\t\t\tthis.agents.delete(agentId);\n\t\t}\n\t}\n\n\tgetMessageServiceForAccount(\n\t\taccountId: string | undefined,\n\t\tagentId?: UUID,\n\t): BlueSkyMessageService | undefined {\n\t\tconst resolvedAgentId = agentId ?? this.firstAgentId();\n\t\tif (!resolvedAgentId) return undefined;\n\t\tconst accounts = this.agents.get(resolvedAgentId);\n\t\tif (!accounts) return undefined;\n\t\tconst id = accountId\n\t\t\t? normalizeBlueSkyAccountId(accountId)\n\t\t\t: accounts.defaultAccountId;\n\t\treturn accounts.messageServices.get(id);\n\t}\n\n\tgetPostServiceForAccount(\n\t\taccountId: string | undefined,\n\t\tagentId?: UUID,\n\t): BlueSkyPostService | undefined {\n\t\tconst resolvedAgentId = agentId ?? this.firstAgentId();\n\t\tif (!resolvedAgentId) return undefined;\n\t\tconst accounts = this.agents.get(resolvedAgentId);\n\t\tif (!accounts) return undefined;\n\t\tconst id = accountId\n\t\t\t? normalizeBlueSkyAccountId(accountId)\n\t\t\t: accounts.defaultAccountId;\n\t\treturn accounts.postServices.get(id);\n\t}\n\n\tgetMessageService(\n\t\tagentId: UUID,\n\t\taccountId?: string,\n\t): BlueSkyMessageService | undefined {\n\t\treturn this.getMessageServiceForAccount(accountId, agentId);\n\t}\n\n\tgetPostService(\n\t\tagentId: UUID,\n\t\taccountId?: string,\n\t): BlueSkyPostService | undefined {\n\t\treturn this.getPostServiceForAccount(accountId, agentId);\n\t}\n\n\tgetDefaultAccountId(agentId?: UUID): string | undefined {\n\t\tconst resolvedAgentId = agentId ?? this.firstAgentId();\n\t\treturn resolvedAgentId\n\t\t\t? this.agents.get(resolvedAgentId)?.defaultAccountId\n\t\t\t: undefined;\n\t}\n\n\tlistAccountIds(agentId?: UUID): string[] {\n\t\tconst resolvedAgentId = agentId ?? this.firstAgentId();\n\t\tconst accounts = resolvedAgentId\n\t\t\t? this.agents.get(resolvedAgentId)\n\t\t\t: undefined;\n\t\treturn accounts ? Array.from(accounts.managers.keys()) : [];\n\t}\n\n\tprivate firstAgentId(): UUID | undefined {\n\t\treturn this.agents.keys().next().value;\n\t}\n}\n",
10
- "import { type AppBskyFeedDefs, BskyAgent, RichText } from \"@atproto/api\";\nimport { logger } from \"@elizaos/core\";\nimport { LRUCache } from \"lru-cache\";\nimport type {\n\tATProtocolPostRecord,\n\tATProtocolProfileViewExtended,\n\tBlueSkyConversation,\n\tBlueSkyMessage,\n\tBlueSkyNotification,\n\tBlueSkyPost,\n\tBlueSkyProfile,\n\tBlueSkySession,\n\tCreatePostRequest,\n\tPostEmbed,\n\tPostFacet,\n\tSendMessageRequest,\n\tTimelineRequest,\n\tTimelineResponse,\n} from \"./types\";\nimport {\n\tBLUESKY_CHAT_SERVICE_DID,\n\tBlueSkyError,\n\tCACHE_SIZE,\n\tCACHE_TTL,\n} from \"./types\";\n\nfunction isPostView(\n\titem:\n\t\t| AppBskyFeedDefs.PostView\n\t\t| AppBskyFeedDefs.NotFoundPost\n\t\t| AppBskyFeedDefs.BlockedPost\n\t\t| { $type: string; [k: string]: unknown },\n): item is AppBskyFeedDefs.PostView {\n\treturn (\n\t\ttypeof item === \"object\" &&\n\t\titem !== null &&\n\t\t\"uri\" in item &&\n\t\t\"cid\" in item &&\n\t\t\"author\" in item &&\n\t\t\"record\" in item &&\n\t\t\"indexedAt\" in item &&\n\t\ttypeof (item as AppBskyFeedDefs.PostView).uri === \"string\" &&\n\t\ttypeof (item as AppBskyFeedDefs.PostView).cid === \"string\"\n\t);\n}\n\nfunction isReplyWithPostViews(\n\treply: AppBskyFeedDefs.ReplyRef | null | undefined,\n): reply is AppBskyFeedDefs.ReplyRef & {\n\troot: AppBskyFeedDefs.PostView;\n\tparent: AppBskyFeedDefs.PostView;\n} {\n\treturn (\n\t\ttypeof reply === \"object\" &&\n\t\treply !== null &&\n\t\t\"root\" in reply &&\n\t\t\"parent\" in reply &&\n\t\tisPostView(reply.root) &&\n\t\tisPostView(reply.parent)\n\t);\n}\n\nfunction adaptPostView(postView: AppBskyFeedDefs.PostView): BlueSkyPost {\n\tconst author = postView.author as ATProtocolProfileViewExtended;\n\tconst record = postView.record as ATProtocolPostRecord;\n\n\treturn {\n\t\turi: postView.uri,\n\t\tcid: postView.cid,\n\t\tauthor: {\n\t\t\tdid: author.did,\n\t\t\thandle: author.handle,\n\t\t\tdisplayName: author.displayName,\n\t\t\tdescription: author.description,\n\t\t\tavatar: author.avatar,\n\t\t\tbanner: author.banner,\n\t\t\tfollowersCount: author.followersCount,\n\t\t\tfollowsCount: author.followsCount,\n\t\t\tpostsCount: author.postsCount,\n\t\t\tindexedAt: author.indexedAt,\n\t\t\tcreatedAt: author.createdAt,\n\t\t},\n\t\trecord: {\n\t\t\t$type: record.$type ?? \"app.bsky.feed.post\",\n\t\t\ttext: record.text ?? \"\",\n\t\t\tfacets: record.facets as PostFacet[] | undefined,\n\t\t\tembed: record.embed as PostEmbed | undefined,\n\t\t\tcreatedAt: record.createdAt ?? \"\",\n\t\t},\n\t\tembed: postView.embed as PostEmbed | undefined,\n\t\treplyCount: postView.replyCount,\n\t\trepostCount: postView.repostCount,\n\t\tlikeCount: postView.likeCount,\n\t\tquoteCount: postView.quoteCount,\n\t\tindexedAt: postView.indexedAt,\n\t};\n}\n\nexport interface BlueSkyClientConfig {\n\tservice: string;\n\thandle: string;\n\tpassword: string;\n\tdryRun: boolean;\n}\n\nexport class BlueSkyClient {\n\tprivate readonly agent: BskyAgent;\n\tprivate session: BlueSkySession | null = null;\n\tprivate readonly profileCache: LRUCache<string, BlueSkyProfile>;\n\n\tconstructor(private readonly config: BlueSkyClientConfig) {\n\t\tthis.agent = new BskyAgent({ service: config.service });\n\t\tthis.profileCache = new LRUCache({\n\t\t\tmax: CACHE_SIZE.PROFILE,\n\t\t\tttl: CACHE_TTL.PROFILE,\n\t\t});\n\t}\n\n\tasync authenticate(): Promise<BlueSkySession> {\n\t\tconst response = await this.agent.login({\n\t\t\tidentifier: this.config.handle,\n\t\t\tpassword: this.config.password,\n\t\t});\n\n\t\tif (!response.success) {\n\t\t\tthrow new BlueSkyError(\"Authentication failed\", \"AUTH_FAILED\");\n\t\t}\n\n\t\tthis.session = {\n\t\t\tdid: response.data.did,\n\t\t\thandle: response.data.handle,\n\t\t\temail: response.data.email,\n\t\t\taccessJwt: response.data.accessJwt,\n\t\t\trefreshJwt: response.data.refreshJwt,\n\t\t};\n\n\t\tlogger.info(`Authenticated with BlueSky: ${this.session.handle}`);\n\t\treturn this.session;\n\t}\n\n\tgetSession(): BlueSkySession | null {\n\t\treturn this.session;\n\t}\n\n\tasync getProfile(handle: string): Promise<BlueSkyProfile> {\n\t\tconst cached = this.profileCache.get(handle);\n\t\tif (cached) return cached;\n\n\t\tconst response = await this.agent.getProfile({ actor: handle });\n\t\tconst profile: BlueSkyProfile = {\n\t\t\tdid: response.data.did,\n\t\t\thandle: response.data.handle,\n\t\t\tdisplayName: response.data.displayName,\n\t\t\tdescription: response.data.description,\n\t\t\tavatar: response.data.avatar,\n\t\t\tbanner: response.data.banner,\n\t\t\tfollowersCount: response.data.followersCount,\n\t\t\tfollowsCount: response.data.followsCount,\n\t\t\tpostsCount: response.data.postsCount,\n\t\t\tindexedAt: response.data.indexedAt,\n\t\t\tcreatedAt: response.data.createdAt,\n\t\t};\n\n\t\tthis.profileCache.set(handle, profile);\n\t\treturn profile;\n\t}\n\n\tasync getTimeline(params: TimelineRequest = {}): Promise<TimelineResponse> {\n\t\tconst response = await this.agent.getTimeline({\n\t\t\talgorithm: params.algorithm,\n\t\t\tlimit: params.limit ?? 50,\n\t\t\tcursor: params.cursor,\n\t\t});\n\n\t\treturn {\n\t\t\tcursor: response.data.cursor,\n\t\t\tfeed: response.data.feed.map((item) => {\n\t\t\t\tconst reply = isReplyWithPostViews(item.reply)\n\t\t\t\t\t? {\n\t\t\t\t\t\t\troot: adaptPostView(item.reply.root),\n\t\t\t\t\t\t\tparent: adaptPostView(item.reply.parent),\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined;\n\n\t\t\t\treturn {\n\t\t\t\t\tpost: adaptPostView(item.post),\n\t\t\t\t\treply,\n\t\t\t\t\treason: item.reason as Record<\n\t\t\t\t\t\tstring,\n\t\t\t\t\t\tstring | number | boolean | object | null | undefined\n\t\t\t\t\t>,\n\t\t\t\t};\n\t\t\t}),\n\t\t};\n\t}\n\n\tasync searchPosts(params: {\n\t\tquery: string;\n\t\tlimit?: number;\n\t\tcursor?: string;\n\t}): Promise<{ posts: BlueSkyPost[]; cursor?: string }> {\n\t\tconst api = this.agent as {\n\t\t\tapp: {\n\t\t\t\tbsky: {\n\t\t\t\t\tfeed: {\n\t\t\t\t\t\tsearchPosts: (params: {\n\t\t\t\t\t\t\tq: string;\n\t\t\t\t\t\t\tlimit?: number;\n\t\t\t\t\t\t\tcursor?: string;\n\t\t\t\t\t\t}) => Promise<{\n\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\tposts: AppBskyFeedDefs.PostView[];\n\t\t\t\t\t\t\t\tcursor?: string;\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}>;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t};\n\t\tconst response = await api.app.bsky.feed.searchPosts({\n\t\t\tq: params.query,\n\t\t\tlimit: params.limit ?? 25,\n\t\t\tcursor: params.cursor,\n\t\t});\n\n\t\treturn {\n\t\t\tposts: response.data.posts.map(adaptPostView),\n\t\t\tcursor: response.data.cursor,\n\t\t};\n\t}\n\n\tasync sendPost(request: CreatePostRequest): Promise<BlueSkyPost> {\n\t\tif (this.config.dryRun) {\n\t\t\tlogger.info(\n\t\t\t\t`Dry run: would create post with text: ${request.content.text}`,\n\t\t\t);\n\t\t\treturn this.mockPost(request.content.text);\n\t\t}\n\n\t\tconst rt = new RichText({ text: request.content.text });\n\t\tawait rt.detectFacets(this.agent);\n\n\t\tconst record: Record<\n\t\t\tstring,\n\t\t\t| string\n\t\t\t| PostFacet[]\n\t\t\t| PostEmbed\n\t\t\t| {\n\t\t\t\t\troot: { uri: string; cid: string };\n\t\t\t\t\tparent: { uri: string; cid: string };\n\t\t\t }\n\t\t> = {\n\t\t\t$type: \"app.bsky.feed.post\",\n\t\t\ttext: rt.text,\n\t\t\tfacets: rt.facets as PostFacet[],\n\t\t\tcreatedAt: new Date().toISOString(),\n\t\t};\n\n\t\tif (request.replyTo) {\n\t\t\trecord.reply = { root: request.replyTo, parent: request.replyTo };\n\t\t}\n\n\t\tif (request.content.embed) {\n\t\t\trecord.embed = request.content.embed;\n\t\t}\n\n\t\tlogger.info(\n\t\t\t{\n\t\t\t\tsrc: \"plugin:bluesky\",\n\t\t\t\top: \"atproto:post\",\n\t\t\t\ttextLength: rt.text.length,\n\t\t\t\thasReply: Boolean(request.replyTo),\n\t\t\t\thasEmbed: Boolean(request.content.embed),\n\t\t\t},\n\t\t\t\"Publishing Bluesky post via atproto\",\n\t\t);\n\t\tconst response = await this.agent.post(record);\n\t\tlogger.info(\n\t\t\t{\n\t\t\t\tsrc: \"plugin:bluesky\",\n\t\t\t\top: \"atproto:post\",\n\t\t\t\turi: response.uri,\n\t\t\t\tcid: response.cid,\n\t\t\t},\n\t\t\t\"Bluesky post published\",\n\t\t);\n\t\tconst thread = await this.agent.getPostThread({\n\t\t\turi: response.uri,\n\t\t\tdepth: 0,\n\t\t});\n\n\t\tif (thread.data.thread.$type !== \"app.bsky.feed.defs#threadViewPost\") {\n\t\t\tthrow new BlueSkyError(\n\t\t\t\t\"Failed to retrieve created post\",\n\t\t\t\t\"POST_CREATE_FAILED\",\n\t\t\t);\n\t\t}\n\n\t\tconst threadViewPost = thread.data.thread as AppBskyFeedDefs.ThreadViewPost;\n\t\treturn adaptPostView(threadViewPost.post);\n\t}\n\n\tasync deletePost(uri: string): Promise<void> {\n\t\tif (this.config.dryRun) {\n\t\t\tlogger.info(`Dry run: would delete post: ${uri}`);\n\t\t\treturn;\n\t\t}\n\t\tawait this.agent.deletePost(uri);\n\t}\n\n\tasync likePost(uri: string, cid: string): Promise<void> {\n\t\tif (this.config.dryRun) {\n\t\t\tlogger.info(`Dry run: would like post: ${uri}`);\n\t\t\treturn;\n\t\t}\n\t\tawait this.agent.like(uri, cid);\n\t}\n\n\tasync repost(uri: string, cid: string): Promise<void> {\n\t\tif (this.config.dryRun) {\n\t\t\tlogger.info({ uri }, \"Dry run: would repost\");\n\t\t\treturn;\n\t\t}\n\t\tawait this.agent.repost(uri, cid);\n\t}\n\n\tasync getNotifications(\n\t\tlimit = 50,\n\t\tcursor?: string,\n\t): Promise<{\n\t\tnotifications: BlueSkyNotification[];\n\t\tcursor?: string;\n\t}> {\n\t\tconst response = await this.agent.listNotifications({ limit, cursor });\n\t\treturn {\n\t\t\tnotifications: response.data.notifications as BlueSkyNotification[],\n\t\t\tcursor: response.data.cursor,\n\t\t};\n\t}\n\n\tasync updateSeenNotifications(): Promise<void> {\n\t\tawait this.agent.updateSeenNotifications();\n\t}\n\n\tasync getConversations(\n\t\tlimit = 50,\n\t\tcursor?: string,\n\t): Promise<{\n\t\tconversations: BlueSkyConversation[];\n\t\tcursor?: string;\n\t}> {\n\t\tconst response = await this.agent.api.chat.bsky.convo.listConvos(\n\t\t\t{ limit, cursor },\n\t\t\t{ headers: { \"atproto-proxy\": BLUESKY_CHAT_SERVICE_DID } },\n\t\t);\n\t\treturn {\n\t\t\tconversations: response.data.convos as BlueSkyConversation[],\n\t\t\tcursor: response.data.cursor,\n\t\t};\n\t}\n\n\tasync getMessages(\n\t\tconvoId: string,\n\t\tlimit = 50,\n\t\tcursor?: string,\n\t): Promise<{\n\t\tmessages: BlueSkyMessage[];\n\t\tcursor?: string;\n\t}> {\n\t\tconst response = await this.agent.api.chat.bsky.convo.getMessages(\n\t\t\t{ convoId, limit, cursor },\n\t\t\t{ headers: { \"atproto-proxy\": BLUESKY_CHAT_SERVICE_DID } },\n\t\t);\n\t\treturn {\n\t\t\tmessages: response.data.messages as BlueSkyMessage[],\n\t\t\tcursor: response.data.cursor,\n\t\t};\n\t}\n\n\tasync sendMessage(request: SendMessageRequest): Promise<BlueSkyMessage> {\n\t\tif (this.config.dryRun) {\n\t\t\tlogger.info({ convoId: request.convoId }, \"Dry run: would send message\");\n\t\t\treturn this.mockMessage(request.message.text ?? \"\");\n\t\t}\n\n\t\tconst response = await this.agent.api.chat.bsky.convo.sendMessage(\n\t\t\t{\n\t\t\t\tconvoId: request.convoId,\n\t\t\t\tmessage: { text: request.message.text ?? \"\" },\n\t\t\t},\n\t\t\t{ headers: { \"atproto-proxy\": BLUESKY_CHAT_SERVICE_DID } },\n\t\t);\n\t\treturn response.data as BlueSkyMessage;\n\t}\n\n\tasync cleanup(): Promise<void> {\n\t\tthis.profileCache.clear();\n\t\tthis.session = null;\n\t}\n\n\tprivate mockPost(text: string): BlueSkyPost {\n\t\tconst now = new Date().toISOString();\n\t\treturn {\n\t\t\turi: `mock://post/${Date.now()}`,\n\t\t\tcid: `mock-cid-${Date.now()}`,\n\t\t\tauthor: {\n\t\t\t\tdid: this.session?.did ?? \"did:plc:mock\",\n\t\t\t\thandle: this.session?.handle ?? \"mock.handle\",\n\t\t\t},\n\t\t\trecord: { $type: \"app.bsky.feed.post\", text, createdAt: now },\n\t\t\tindexedAt: now,\n\t\t};\n\t}\n\n\tprivate mockMessage(text: string): BlueSkyMessage {\n\t\treturn {\n\t\t\tid: `mock-msg-${Date.now()}`,\n\t\t\trev: \"1\",\n\t\t\ttext,\n\t\t\tsender: { did: this.session?.did ?? \"did:plc:mock\" },\n\t\t\tsentAt: new Date().toISOString(),\n\t\t};\n\t}\n}\n",
11
- "import {\n\ttype IAgentRuntime,\n\tlogger,\n\tsetTrajectoryPurpose,\n\twithStandaloneTrajectory,\n} from \"@elizaos/core\";\nimport type { BlueSkyClient } from \"../client\";\nimport type {\n\tBlueSkyConfig,\n\tBlueSkyCreatePostEventPayload,\n\tBlueSkyNotification,\n\tBlueSkyNotificationEventPayload,\n\tNotificationReason,\n} from \"../types\";\nimport {\n\tDEFAULT_BLUESKY_ACCOUNT_ID,\n\tgetActionInterval,\n\tgetMaxActionsProcessing,\n\tgetPollInterval,\n\tgetPostIntervalRange,\n\tisPostingEnabled,\n\tnormalizeBlueSkyAccountId,\n\tshouldPostImmediately,\n} from \"../utils/config\";\n\nfunction cursorCacheKey(agentId: string, accountId: string): string {\n\treturn `bluesky:cursor:${agentId}:${accountId}`;\n}\n\nexport class BlueSkyAgentManager {\n\tprivate pollTimer: ReturnType<typeof setInterval> | null = null;\n\tprivate actionTimer: ReturnType<typeof setInterval> | null = null;\n\tprivate postTimer: ReturnType<typeof setTimeout> | null = null;\n\tprivate running = false;\n\tprivate lastSeenAt: string | null = null;\n\tpublic readonly accountId: string;\n\n\tconstructor(\n\t\tpublic readonly runtime: IAgentRuntime,\n\t\tpublic readonly config: BlueSkyConfig & { accountId?: string },\n\t\tpublic readonly client: BlueSkyClient,\n\t) {\n\t\tthis.accountId = normalizeBlueSkyAccountId(\n\t\t\tconfig.accountId ?? DEFAULT_BLUESKY_ACCOUNT_ID,\n\t\t);\n\t}\n\n\tgetAccountId(): string {\n\t\treturn this.accountId;\n\t}\n\n\tasync start(): Promise<void> {\n\t\tif (this.running) return;\n\n\t\tawait this.client.authenticate();\n\t\tthis.running = true;\n\n\t\tconst cached = await this.runtime.getCache<string>(\n\t\t\tcursorCacheKey(this.runtime.agentId, this.accountId),\n\t\t);\n\t\tif (typeof cached === \"string\" && cached) {\n\t\t\tthis.lastSeenAt = cached;\n\t\t}\n\n\t\tthis.startNotificationPolling();\n\n\t\tif (this.config.enableActionProcessing) {\n\t\t\tthis.startActionProcessing();\n\t\t}\n\n\t\tif (isPostingEnabled(this.runtime, this.accountId)) {\n\t\t\tthis.startAutomatedPosting();\n\t\t}\n\n\t\tlogger.success(\n\t\t\t{ agentId: this.runtime.agentId, accountId: this.accountId },\n\t\t\t\"BlueSky agent manager started\",\n\t\t);\n\t}\n\n\tasync stop(): Promise<void> {\n\t\tthis.running = false;\n\n\t\tif (this.pollTimer) clearInterval(this.pollTimer);\n\t\tif (this.actionTimer) clearInterval(this.actionTimer);\n\t\tif (this.postTimer) clearTimeout(this.postTimer);\n\n\t\tthis.pollTimer = null;\n\t\tthis.actionTimer = null;\n\t\tthis.postTimer = null;\n\n\t\tawait this.client.cleanup();\n\t\tlogger.info(\n\t\t\t{ agentId: this.runtime.agentId, accountId: this.accountId },\n\t\t\t\"BlueSky agent manager stopped\",\n\t\t);\n\t}\n\n\tprivate startNotificationPolling(): void {\n\t\tconst interval = getPollInterval(this.runtime, this.accountId);\n\t\tthis.pollNotifications();\n\t\tthis.pollTimer = setInterval(() => this.pollNotifications(), interval);\n\t}\n\n\tprivate async pollNotifications(): Promise<void> {\n\t\tif (!this.running) return;\n\n\t\tconst { notifications } = await this.client.getNotifications(50);\n\t\tif (notifications.length === 0) return;\n\n\t\tconst newNotifications = this.lastSeenAt\n\t\t\t? notifications.filter((n) => {\n\t\t\t\t\tconst lastSeen = this.lastSeenAt;\n\t\t\t\t\treturn lastSeen !== null && n.indexedAt > lastSeen;\n\t\t\t\t})\n\t\t\t: notifications;\n\n\t\tif (newNotifications.length > 0) {\n\t\t\tthis.lastSeenAt = notifications[0].indexedAt;\n\t\t\tawait this.runtime.setCache(\n\t\t\t\tcursorCacheKey(this.runtime.agentId, this.accountId),\n\t\t\t\tthis.lastSeenAt,\n\t\t\t);\n\n\t\t\tfor (const notification of newNotifications) {\n\t\t\t\tthis.emitNotificationEvent(notification);\n\t\t\t}\n\n\t\t\tawait this.client.updateSeenNotifications();\n\t\t}\n\t}\n\n\tprivate emitNotificationEvent(notification: BlueSkyNotification): void {\n\t\tconst eventMap: Record<NotificationReason, string> = {\n\t\t\tmention: \"bluesky.mention_received\",\n\t\t\treply: \"bluesky.mention_received\",\n\t\t\tfollow: \"bluesky.follow_received\",\n\t\t\tlike: \"bluesky.like_received\",\n\t\t\trepost: \"bluesky.repost_received\",\n\t\t\tquote: \"bluesky.quote_received\",\n\t\t};\n\n\t\tconst event = eventMap[notification.reason];\n\t\tif (event) {\n\t\t\tconst payload: BlueSkyNotificationEventPayload = {\n\t\t\t\truntime: this.runtime,\n\t\t\t\tsource: \"bluesky\",\n\t\t\t\taccountId: this.accountId,\n\t\t\t\tnotification,\n\t\t\t};\n\t\t\tvoid this.runtime.emitEvent(event, payload);\n\t\t}\n\t}\n\n\tprivate startActionProcessing(): void {\n\t\tconst interval = getActionInterval(this.runtime, this.accountId);\n\t\tthis.processQueuedActions();\n\t\tthis.actionTimer = setInterval(() => this.processQueuedActions(), interval);\n\t}\n\n\tprivate async processQueuedActions(): Promise<void> {\n\t\tif (!this.running) return;\n\n\t\tconst max = getMaxActionsProcessing(this.runtime, this.accountId);\n\t\tconst { notifications } = await this.client.getNotifications(max);\n\n\t\tfor (const notification of notifications) {\n\t\t\tif (\n\t\t\t\tnotification.reason === \"mention\" ||\n\t\t\t\tnotification.reason === \"reply\"\n\t\t\t) {\n\t\t\t\tconst payload: BlueSkyNotificationEventPayload = {\n\t\t\t\t\truntime: this.runtime,\n\t\t\t\t\tsource: \"bluesky\",\n\t\t\t\t\taccountId: this.accountId,\n\t\t\t\t\tnotification,\n\t\t\t\t};\n\t\t\t\tvoid this.runtime.emitEvent(\"bluesky.should_respond\", payload);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate startAutomatedPosting(): void {\n\t\tif (shouldPostImmediately(this.runtime, this.accountId)) {\n\t\t\tvoid this.createAutomatedPost();\n\t\t}\n\t\tthis.scheduleNextPost();\n\t}\n\n\tprivate scheduleNextPost(): void {\n\t\tconst { min, max } = getPostIntervalRange(this.runtime, this.accountId);\n\t\tconst interval = Math.random() * (max - min) + min;\n\n\t\tthis.postTimer = setTimeout(() => {\n\t\t\tif (this.running) {\n\t\t\t\tvoid this.createAutomatedPost().finally(() => this.scheduleNextPost());\n\t\t\t}\n\t\t}, interval);\n\t}\n\n\tprivate async createAutomatedPost(): Promise<void> {\n\t\tawait withStandaloneTrajectory(\n\t\t\tthis.runtime,\n\t\t\t{\n\t\t\t\tsource: \"plugin-bluesky:auto-post\",\n\t\t\t\tmetadata: {\n\t\t\t\t\tplatform: \"bluesky\",\n\t\t\t\t\tkind: \"public_post_generation\",\n\t\t\t\t\tautomated: true,\n\t\t\t\t\taccountId: this.accountId,\n\t\t\t\t},\n\t\t\t},\n\t\t\tasync () => {\n\t\t\t\tsetTrajectoryPurpose(\"background\");\n\t\t\t\tconst payload: BlueSkyCreatePostEventPayload = {\n\t\t\t\t\truntime: this.runtime,\n\t\t\t\t\tsource: \"bluesky\",\n\t\t\t\t\tautomated: true,\n\t\t\t\t\taccountId: this.accountId,\n\t\t\t\t};\n\t\t\t\tawait this.runtime.emitEvent(\"bluesky.create_post\", payload);\n\t\t\t},\n\t\t);\n\t}\n}\n",
12
- "import {\n\tChannelType,\n\ttype Content,\n\tcomposePrompt,\n\tcreateUniqueUuid,\n\ttype IAgentRuntime,\n\ttype Memory,\n\ttype MessageConnectorChatContext,\n\ttype MessageConnectorQueryContext,\n\ttype MessageConnectorTarget,\n\ttype MessageConnectorUserContext,\n\tModelType,\n\ttype TargetInfo,\n} from \"@elizaos/core\";\nimport type { BlueSkyClient } from \"../client\";\nimport { generateDmTemplate } from \"../prompts.js\";\nimport type { BlueSkyConversation, BlueSkyMessage } from \"../types\";\nimport {\n\tnormalizeBlueSkyAccountId,\n\treadBlueSkyAccountId,\n} from \"../utils/config\";\n\nconst BLUESKY_CONNECTOR_CONTEXTS = [\"social\", \"connectors\"];\n\nfunction normalizeBlueSkyQuery(value: string): string {\n\treturn value.trim().replace(/^@/, \"\").toLowerCase();\n}\n\nfunction scoreBlueSkyMatch(\n\tquery: string,\n\tid: string,\n\tlabels: Array<string | null | undefined>,\n): number {\n\tif (!query) return 0.45;\n\tif (id.toLowerCase() === query) return 1;\n\n\tlet bestScore = 0;\n\tfor (const label of labels) {\n\t\tconst normalized = label?.trim().replace(/^@/, \"\").toLowerCase();\n\t\tif (!normalized) continue;\n\t\tif (normalized === query) {\n\t\t\tbestScore = Math.max(bestScore, 0.95);\n\t\t} else if (normalized.startsWith(query)) {\n\t\t\tbestScore = Math.max(bestScore, 0.85);\n\t\t} else if (normalized.includes(query)) {\n\t\t\tbestScore = Math.max(bestScore, 0.7);\n\t\t}\n\t}\n\treturn bestScore;\n}\n\nexport class BlueSkyMessageService {\n\tstatic serviceType = \"IMessageService\";\n\n\tconstructor(\n\t\tprivate readonly client: BlueSkyClient,\n\t\tprivate readonly runtime: IAgentRuntime,\n\t\tpublic readonly accountId: string = \"default\",\n\t) {}\n\n\tgetAccountId(): string {\n\t\treturn normalizeBlueSkyAccountId(this.accountId);\n\t}\n\n\tasync getMessages(convoId: string, limit = 50): Promise<BlueSkyMessage[]> {\n\t\tconst response = await this.client.getMessages(convoId, limit);\n\t\treturn response.messages;\n\t}\n\n\tasync sendMessage(convoId: string, text: string): Promise<BlueSkyMessage> {\n\t\tconst messageText = text.trim() || (await this.generateReply());\n\t\treturn this.client.sendMessage({ convoId, message: { text: messageText } });\n\t}\n\n\tasync getConversations(limit = 50): Promise<BlueSkyConversation[]> {\n\t\tconst response = await this.client.getConversations(limit);\n\t\treturn response.conversations;\n\t}\n\n\tasync handleSendMessage(\n\t\truntime: IAgentRuntime,\n\t\ttarget: TargetInfo,\n\t\tcontent: Content,\n\t): Promise<void> {\n\t\tconst requestedAccountId = normalizeBlueSkyAccountId(\n\t\t\ttarget.accountId ??\n\t\t\t\treadBlueSkyAccountId(content, target) ??\n\t\t\t\tthis.getAccountId(),\n\t\t);\n\t\tif (requestedAccountId !== this.getAccountId()) {\n\t\t\tthrow new Error(\n\t\t\t\t`BlueSky account '${requestedAccountId}' is not available in this service instance`,\n\t\t\t);\n\t\t}\n\n\t\tconst text = typeof content.text === \"string\" ? content.text.trim() : \"\";\n\t\tif (!text) {\n\t\t\tthrow new Error(\"BlueSky DM connector requires non-empty text content.\");\n\t\t}\n\n\t\tlet convoId = target.channelId ?? target.threadId;\n\t\tif (!convoId && target.roomId) {\n\t\t\tconst room = await runtime.getRoom(target.roomId);\n\t\t\tconvoId = room?.channelId;\n\t\t}\n\t\tif (!convoId) {\n\t\t\tthrow new Error(\"BlueSky DM connector requires a conversation target.\");\n\t\t}\n\n\t\tawait this.sendMessage(convoId, text);\n\t}\n\n\tasync fetchConnectorMessages(\n\t\tcontext: MessageConnectorQueryContext,\n\t\tparams: {\n\t\t\ttarget?: TargetInfo;\n\t\t\tlimit?: number;\n\t\t\tbefore?: string;\n\t\t\tafter?: string;\n\t\t} = {},\n\t): Promise<Memory[]> {\n\t\tconst requestedAccountId = normalizeBlueSkyAccountId(\n\t\t\tcontext.accountId ?? context.metadata?.accountId ?? this.getAccountId(),\n\t\t);\n\t\tif (requestedAccountId !== this.getAccountId()) {\n\t\t\tthrow new Error(\n\t\t\t\t`BlueSky account '${requestedAccountId}' is not available in this service instance`,\n\t\t\t);\n\t\t}\n\n\t\tconst target = params.target ?? context.target;\n\t\tlet convoId = target?.channelId ?? target?.threadId;\n\t\tif (!convoId && target?.roomId) {\n\t\t\tconst room = await context.runtime.getRoom(target.roomId);\n\t\t\tconvoId = room?.channelId;\n\t\t}\n\n\t\tif (convoId) {\n\t\t\tconst messages = await this.getMessages(\n\t\t\t\tconvoId,\n\t\t\t\tclampLimit(params.limit, 25, 100),\n\t\t\t);\n\t\t\treturn messages.map((message) =>\n\t\t\t\tthis.messageToMemory(context.runtime, message, convoId),\n\t\t\t);\n\t\t}\n\n\t\tconst conversations = await this.getConversations(\n\t\t\tclampLimit(params.limit, 25, 50),\n\t\t);\n\t\tconst memories: Memory[] = [];\n\t\tfor (const conversation of conversations) {\n\t\t\tconst messages = await this.getMessages(conversation.id, 1);\n\t\t\tmemories.push(\n\t\t\t\t...messages.map((message) =>\n\t\t\t\t\tthis.messageToMemory(context.runtime, message, conversation.id),\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t\treturn memories.sort((a, b) => (b.createdAt ?? 0) - (a.createdAt ?? 0));\n\t}\n\n\tasync resolveConnectorTargets(\n\t\tquery: string,\n\t\t_context: MessageConnectorQueryContext,\n\t): Promise<MessageConnectorTarget[]> {\n\t\tconst normalizedQuery = normalizeBlueSkyQuery(query);\n\t\tconst conversations = await this.getConversations(50);\n\t\treturn conversations\n\t\t\t.map((conversation) => {\n\t\t\t\tconst score = scoreBlueSkyMatch(normalizedQuery, conversation.id, [\n\t\t\t\t\t...conversation.members.flatMap((member) => [\n\t\t\t\t\t\tmember.handle,\n\t\t\t\t\t\tmember.displayName,\n\t\t\t\t\t\tmember.did,\n\t\t\t\t\t]),\n\t\t\t\t]);\n\t\t\t\treturn score > 0\n\t\t\t\t\t? this.buildConversationTarget(conversation, score)\n\t\t\t\t\t: null;\n\t\t\t})\n\t\t\t.filter((target): target is MessageConnectorTarget => Boolean(target))\n\t\t\t.slice(0, 25);\n\t}\n\n\tasync listConnectorRooms(\n\t\t_context: MessageConnectorQueryContext,\n\t): Promise<MessageConnectorTarget[]> {\n\t\tconst conversations = await this.getConversations(50);\n\t\treturn conversations.map((conversation) =>\n\t\t\tthis.buildConversationTarget(conversation, 0.5),\n\t\t);\n\t}\n\n\tasync listRecentConnectorTargets(\n\t\tcontext: MessageConnectorQueryContext,\n\t): Promise<MessageConnectorTarget[]> {\n\t\tconst targets: MessageConnectorTarget[] = [];\n\t\tconst room =\n\t\t\tcontext.roomId && typeof context.runtime.getRoom === \"function\"\n\t\t\t\t? await context.runtime.getRoom(context.roomId)\n\t\t\t\t: null;\n\t\tconst convoId = context.target?.channelId ?? room?.channelId;\n\n\t\tif (convoId) {\n\t\t\ttargets.push({\n\t\t\t\ttarget: {\n\t\t\t\t\tsource: \"bluesky\",\n\t\t\t\t\taccountId: this.getAccountId(),\n\t\t\t\t\tchannelId: convoId,\n\t\t\t\t} as TargetInfo,\n\t\t\t\tlabel: `BlueSky conversation ${convoId}`,\n\t\t\t\tkind: \"thread\",\n\t\t\t\tscore: 0.95,\n\t\t\t\tcontexts: [...BLUESKY_CONNECTOR_CONTEXTS],\n\t\t\t\tmetadata: { accountId: this.getAccountId(), blueskyConvoId: convoId },\n\t\t\t});\n\t\t}\n\n\t\ttargets.push(...(await this.listConnectorRooms(context)));\n\t\tconst seen = new Set<string>();\n\t\treturn targets\n\t\t\t.filter((target) => {\n\t\t\t\tconst channelId = target.target.channelId;\n\t\t\t\tif (!channelId || seen.has(channelId)) return false;\n\t\t\t\tseen.add(channelId);\n\t\t\t\treturn true;\n\t\t\t})\n\t\t\t.slice(0, 25);\n\t}\n\n\tasync getConnectorChatContext(\n\t\ttarget: TargetInfo,\n\t\tcontext: MessageConnectorQueryContext,\n\t): Promise<MessageConnectorChatContext | null> {\n\t\tlet convoId = target.channelId ?? target.threadId;\n\t\tif (!convoId && target.roomId) {\n\t\t\tconst room = await context.runtime.getRoom(target.roomId);\n\t\t\tconvoId = room?.channelId;\n\t\t}\n\t\tif (!convoId) return null;\n\n\t\tconst messages = await this.getMessages(convoId, 25);\n\t\treturn {\n\t\t\ttarget: {\n\t\t\t\tsource: \"bluesky\",\n\t\t\t\taccountId: this.getAccountId(),\n\t\t\t\tchannelId: convoId,\n\t\t\t} as TargetInfo,\n\t\t\tlabel: `BlueSky conversation ${convoId}`,\n\t\t\trecentMessages: messages.map((message) => ({\n\t\t\t\tname: message.sender.did,\n\t\t\t\ttext: message.text ?? \"\",\n\t\t\t\ttimestamp: Date.parse(message.sentAt),\n\t\t\t\tmetadata: {\n\t\t\t\t\taccountId: this.getAccountId(),\n\t\t\t\t\tblueskyMessageId: message.id,\n\t\t\t\t\tblueskySenderDid: message.sender.did,\n\t\t\t\t},\n\t\t\t})),\n\t\t\tmetadata: { accountId: this.getAccountId(), blueskyConvoId: convoId },\n\t\t};\n\t}\n\n\tasync getConnectorUserContext(\n\t\tentityId: string,\n\t\t_context: MessageConnectorQueryContext,\n\t): Promise<MessageConnectorUserContext | null> {\n\t\tconst normalizedEntity = entityId.trim().replace(/^@/, \"\");\n\t\tif (!normalizedEntity) return null;\n\n\t\tconst conversations = await this.getConversations(50);\n\t\tfor (const conversation of conversations) {\n\t\t\tconst member = conversation.members.find(\n\t\t\t\t(candidate) =>\n\t\t\t\t\tcandidate.did === entityId ||\n\t\t\t\t\tcandidate.handle === normalizedEntity ||\n\t\t\t\t\tcandidate.displayName === entityId,\n\t\t\t);\n\t\t\tif (!member) continue;\n\n\t\t\treturn {\n\t\t\t\tentityId,\n\t\t\t\tlabel: member.displayName || member.handle || member.did,\n\t\t\t\taliases: [member.handle, member.displayName, member.did].filter(\n\t\t\t\t\t(value): value is string => Boolean(value),\n\t\t\t\t),\n\t\t\t\thandles: {\n\t\t\t\t\tbluesky: member.handle ?? member.did,\n\t\t\t\t},\n\t\t\t\tmetadata: {\n\t\t\t\t\taccountId: this.getAccountId(),\n\t\t\t\t\tblueskyDid: member.did,\n\t\t\t\t\tblueskyHandle: member.handle,\n\t\t\t\t\tavatar: member.avatar,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tprivate buildConversationTarget(\n\t\tconversation: BlueSkyConversation,\n\t\tscore: number,\n\t): MessageConnectorTarget {\n\t\tconst sessionDid = this.client.getSession()?.did;\n\t\tconst otherMembers = conversation.members.filter(\n\t\t\t(member) => member.did !== sessionDid,\n\t\t);\n\t\tconst label =\n\t\t\totherMembers\n\t\t\t\t.map((member) => member.displayName || member.handle || member.did)\n\t\t\t\t.filter(Boolean)\n\t\t\t\t.join(\", \") || `BlueSky conversation ${conversation.id}`;\n\n\t\treturn {\n\t\t\ttarget: {\n\t\t\t\tsource: \"bluesky\",\n\t\t\t\taccountId: this.getAccountId(),\n\t\t\t\tchannelId: conversation.id,\n\t\t\t} as TargetInfo,\n\t\t\tlabel,\n\t\t\tkind: \"thread\",\n\t\t\tdescription: \"BlueSky direct message conversation\",\n\t\t\tscore,\n\t\t\tcontexts: [...BLUESKY_CONNECTOR_CONTEXTS],\n\t\t\tmetadata: {\n\t\t\t\taccountId: this.getAccountId(),\n\t\t\t\tblueskyConvoId: conversation.id,\n\t\t\t\tunreadCount: conversation.unreadCount,\n\t\t\t\tmuted: conversation.muted,\n\t\t\t\tmembers: conversation.members.map((member) => ({\n\t\t\t\t\tdid: member.did,\n\t\t\t\t\thandle: member.handle,\n\t\t\t\t\tdisplayName: member.displayName,\n\t\t\t\t})),\n\t\t\t},\n\t\t};\n\t}\n\n\tprivate messageToMemory(\n\t\truntime: IAgentRuntime,\n\t\tmessage: BlueSkyMessage,\n\t\tconvoId: string,\n\t): Memory {\n\t\tconst senderDid = message.sender.did || \"unknown\";\n\t\tconst createdAt = Date.parse(message.sentAt) || Date.now();\n\t\tconst entityId =\n\t\t\tsenderDid === runtime.agentId\n\t\t\t\t? runtime.agentId\n\t\t\t\t: createUniqueUuid(runtime, `bluesky:user:${senderDid}`);\n\t\tconst roomId = createUniqueUuid(runtime, `bluesky:dm:${convoId}`);\n\n\t\treturn {\n\t\t\tid: createUniqueUuid(runtime, `bluesky:dm:${message.id}`),\n\t\t\tagentId: runtime.agentId,\n\t\t\tentityId,\n\t\t\troomId,\n\t\t\tcreatedAt,\n\t\t\tcontent: {\n\t\t\t\ttext: message.text ?? \"\",\n\t\t\t\tsource: \"bluesky\",\n\t\t\t\tchannelType: ChannelType.DM,\n\t\t\t},\n\t\t\tmetadata: {\n\t\t\t\ttype: \"message\",\n\t\t\t\tsource: \"bluesky\",\n\t\t\t\taccountId: this.getAccountId(),\n\t\t\t\tprovider: \"bluesky\",\n\t\t\t\ttimestamp: createdAt,\n\t\t\t\tfromBot: entityId === runtime.agentId,\n\t\t\t\tmessageIdFull: message.id,\n\t\t\t\tchatType: ChannelType.DM,\n\t\t\t\tsender: {\n\t\t\t\t\tid: senderDid,\n\t\t\t\t},\n\t\t\t\tbluesky: {\n\t\t\t\t\taccountId: this.getAccountId(),\n\t\t\t\t\tmessageId: message.id,\n\t\t\t\t\tconvoId,\n\t\t\t\t\trev: message.rev,\n\t\t\t\t\tsenderDid,\n\t\t\t\t},\n\t\t\t} as Memory[\"metadata\"],\n\t\t};\n\t}\n\n\tprivate async generateReply(): Promise<string> {\n\t\tconst prompt = composePrompt({\n\t\t\tstate: {},\n\t\t\ttemplate: generateDmTemplate,\n\t\t});\n\t\tconst response = await this.runtime.useModel(ModelType.TEXT_SMALL, {\n\t\t\tprompt,\n\t\t\tmaxTokens: 50,\n\t\t});\n\t\treturn response as string;\n\t}\n}\n\nfunction clampLimit(\n\tvalue: number | undefined,\n\tfallback: number,\n\tmax: number,\n): number {\n\tif (!Number.isFinite(value)) return fallback;\n\treturn Math.min(Math.max(1, Math.floor(value as number)), max);\n}\n",
13
- "/**\n * Prompt templates for the BlueSky plugin.\n *\n * These prompts use Handlebars-style template syntax:\n * - {{variableName}} for simple substitution\n * - {{#each items}}...{{/each}} for iteration\n * - {{#if condition}}...{{/if}} for conditionals\n */\n\nexport const generateDmTemplate = `Generate a friendly direct message response under 200 characters.`;\n\nexport const GENERATE_DM_TEMPLATE = generateDmTemplate;\n\nexport const generatePostTemplate = `Generate an engaging BlueSky post under {{maxLength}} characters.`;\n\nexport const GENERATE_POST_TEMPLATE = generatePostTemplate;\n\nexport const truncatePostTemplate = `Shorten to under {{maxLength}} characters: \"{{text}}\"`;\n\nexport const TRUNCATE_POST_TEMPLATE = truncatePostTemplate;\n",
14
- "import {\n\tChannelType,\n\ttype Content,\n\tcomposePrompt,\n\tcreateUniqueUuid,\n\ttype IAgentRuntime,\n\ttype Memory,\n\tModelType,\n\ttype UUID,\n} from \"@elizaos/core\";\nimport type { BlueSkyClient } from \"../client\";\nimport { generatePostTemplate, truncatePostTemplate } from \"../prompts.js\";\nimport type { BlueSkyPost, CreatePostRequest } from \"../types\";\nimport { BLUESKY_MAX_POST_LENGTH } from \"../types\";\nimport {\n\tnormalizeBlueSkyAccountId,\n\treadBlueSkyAccountId,\n} from \"../utils/config\";\n\ninterface PostConnectorQueryContext {\n\truntime: IAgentRuntime;\n\troomId?: UUID;\n\tsource?: string;\n\taccountId?: string;\n\ttarget?: { entityId?: UUID | string; channelId?: string; threadId?: string };\n\tmetadata?: Record<string, unknown>;\n}\n\nfunction clampLimit(\n\tvalue: number | undefined,\n\tfallback: number,\n\tmax: number,\n): number {\n\tif (!Number.isFinite(value)) return fallback;\n\treturn Math.min(Math.max(1, Math.floor(value as number)), max);\n}\n\nfunction readContentString(\n\tcontent: Content,\n\tkeys: string[],\n): string | undefined {\n\tconst record = content as Content & Record<string, unknown>;\n\tfor (const key of keys) {\n\t\tconst value = record[key];\n\t\tif (typeof value === \"string\" && value.trim()) return value.trim();\n\t}\n\treturn undefined;\n}\n\nexport class BlueSkyPostService {\n\tstatic serviceType = \"IPostService\";\n\n\tconstructor(\n\t\tprivate readonly client: BlueSkyClient,\n\t\tprivate readonly runtime: IAgentRuntime,\n\t\tpublic readonly accountId: string = \"default\",\n\t) {}\n\n\tgetAccountId(): string {\n\t\treturn normalizeBlueSkyAccountId(this.accountId);\n\t}\n\n\tasync getPosts(limit = 50, cursor?: string): Promise<BlueSkyPost[]> {\n\t\tconst response = await this.client.getTimeline({ limit, cursor });\n\t\treturn response.feed.map((item) => item.post);\n\t}\n\n\tasync createPost(\n\t\ttext: string,\n\t\treplyTo?: { uri: string; cid: string },\n\t): Promise<BlueSkyPost> {\n\t\tlet postText = text.trim() || (await this.generateContent());\n\n\t\tif (postText.length > BLUESKY_MAX_POST_LENGTH) {\n\t\t\tpostText = await this.truncate(postText);\n\t\t}\n\n\t\tconst request: CreatePostRequest = {\n\t\t\tcontent: { text: postText },\n\t\t\treplyTo,\n\t\t};\n\n\t\treturn this.client.sendPost(request);\n\t}\n\n\tasync handleSendPost(\n\t\truntime: IAgentRuntime,\n\t\tcontent: Content,\n\t): Promise<Memory> {\n\t\tconst requestedAccountId = normalizeBlueSkyAccountId(\n\t\t\treadBlueSkyAccountId(content) ?? this.getAccountId(),\n\t\t);\n\t\tif (requestedAccountId !== this.getAccountId()) {\n\t\t\tthrow new Error(\n\t\t\t\t`BlueSky account '${requestedAccountId}' is not available in this service instance`,\n\t\t\t);\n\t\t}\n\n\t\tconst replyUri = readContentString(content, [\"replyToUri\", \"replyTo\"]);\n\t\tconst replyCid = readContentString(content, [\"replyToCid\"]);\n\t\tconst post = await this.createPost(\n\t\t\tcontent.text ?? \"\",\n\t\t\treplyUri && replyCid ? { uri: replyUri, cid: replyCid } : undefined,\n\t\t);\n\t\treturn this.postToMemory(runtime, post);\n\t}\n\n\tasync fetchFeed(\n\t\tcontext: PostConnectorQueryContext,\n\t\tparams: {\n\t\t\tfeed?: string;\n\t\t\ttarget?: PostConnectorQueryContext[\"target\"];\n\t\t\tlimit?: number;\n\t\t\tcursor?: string;\n\t\t} = {},\n\t): Promise<Memory[]> {\n\t\tconst requestedAccountId = normalizeBlueSkyAccountId(\n\t\t\tcontext.accountId ?? context.metadata?.accountId ?? this.getAccountId(),\n\t\t);\n\t\tif (requestedAccountId !== this.getAccountId()) {\n\t\t\tthrow new Error(\n\t\t\t\t`BlueSky account '${requestedAccountId}' is not available in this service instance`,\n\t\t\t);\n\t\t}\n\n\t\tconst response = await this.client.getTimeline({\n\t\t\tlimit: clampLimit(params.limit, 25, 100),\n\t\t\tcursor: params.cursor,\n\t\t});\n\t\treturn response.feed.map((item) =>\n\t\t\tthis.postToMemory(context.runtime, item.post),\n\t\t);\n\t}\n\n\tasync searchPosts(\n\t\tcontext: PostConnectorQueryContext,\n\t\tparams: { query: string; limit?: number; cursor?: string },\n\t): Promise<Memory[]> {\n\t\tconst requestedAccountId = normalizeBlueSkyAccountId(\n\t\t\tcontext.accountId ?? context.metadata?.accountId ?? this.getAccountId(),\n\t\t);\n\t\tif (requestedAccountId !== this.getAccountId()) {\n\t\t\tthrow new Error(\n\t\t\t\t`BlueSky account '${requestedAccountId}' is not available in this service instance`,\n\t\t\t);\n\t\t}\n\n\t\tconst query = params.query?.trim();\n\t\tif (!query) {\n\t\t\tthrow new Error(\"BlueSky searchPosts connector requires a query.\");\n\t\t}\n\t\tconst response = await this.client.searchPosts({\n\t\t\tquery,\n\t\t\tlimit: clampLimit(params.limit, 25, 100),\n\t\t\tcursor: params.cursor,\n\t\t});\n\t\treturn response.posts.map((post) =>\n\t\t\tthis.postToMemory(context.runtime, post),\n\t\t);\n\t}\n\n\tasync deletePost(uri: string): Promise<void> {\n\t\tawait this.client.deletePost(uri);\n\t}\n\n\tprivate postToMemory(runtime: IAgentRuntime, post: BlueSkyPost): Memory {\n\t\tconst createdAt =\n\t\t\tDate.parse(post.indexedAt || post.record.createdAt) || Date.now();\n\t\tconst authorId = post.author.did || post.author.handle || \"unknown\";\n\t\tconst entityId =\n\t\t\tauthorId === runtime.agentId\n\t\t\t\t? runtime.agentId\n\t\t\t\t: createUniqueUuid(runtime, `bluesky:user:${authorId}`);\n\t\tconst roomId = createUniqueUuid(runtime, `bluesky:feed:${authorId}`);\n\n\t\treturn {\n\t\t\tid: createUniqueUuid(runtime, `bluesky:post:${post.uri}`),\n\t\t\tagentId: runtime.agentId,\n\t\t\tentityId,\n\t\t\troomId,\n\t\t\tcreatedAt,\n\t\t\tcontent: {\n\t\t\t\ttext: post.record.text,\n\t\t\t\tsource: \"bluesky\",\n\t\t\t\turl: `https://bsky.app/profile/${post.author.handle}/post/${post.uri.split(\"/\").pop()}`,\n\t\t\t\tchannelType: ChannelType.FEED,\n\t\t\t},\n\t\t\tmetadata: {\n\t\t\t\ttype: \"message\",\n\t\t\t\tsource: \"bluesky\",\n\t\t\t\taccountId: this.getAccountId(),\n\t\t\t\tprovider: \"bluesky\",\n\t\t\t\ttimestamp: createdAt,\n\t\t\t\tfromBot: entityId === runtime.agentId,\n\t\t\t\tmessageIdFull: post.uri,\n\t\t\t\tchatType: ChannelType.FEED,\n\t\t\t\tsender: {\n\t\t\t\t\tid: authorId,\n\t\t\t\t\tname: post.author.displayName,\n\t\t\t\t\tusername: post.author.handle,\n\t\t\t\t},\n\t\t\t\tbluesky: {\n\t\t\t\t\taccountId: this.getAccountId(),\n\t\t\t\t\turi: post.uri,\n\t\t\t\t\tcid: post.cid,\n\t\t\t\t\tauthorDid: post.author.did,\n\t\t\t\t\tauthorHandle: post.author.handle,\n\t\t\t\t\treplyCount: post.replyCount,\n\t\t\t\t\trepostCount: post.repostCount,\n\t\t\t\t\tlikeCount: post.likeCount,\n\t\t\t\t\tquoteCount: post.quoteCount,\n\t\t\t\t},\n\t\t\t} as Memory[\"metadata\"],\n\t\t};\n\t}\n\n\tprivate async generateContent(): Promise<string> {\n\t\tconst prompt = composePrompt({\n\t\t\tstate: {\n\t\t\t\tmaxLength: String(BLUESKY_MAX_POST_LENGTH),\n\t\t\t},\n\t\t\ttemplate: generatePostTemplate,\n\t\t});\n\t\tconst response = await this.runtime.useModel(ModelType.TEXT_SMALL, {\n\t\t\tprompt,\n\t\t\tmaxTokens: 100,\n\t\t});\n\t\treturn response as string;\n\t}\n\n\tprivate async truncate(text: string): Promise<string> {\n\t\tconst prompt = composePrompt({\n\t\t\tstate: {\n\t\t\t\tmaxLength: String(BLUESKY_MAX_POST_LENGTH),\n\t\t\t\ttext,\n\t\t\t},\n\t\t\ttemplate: truncatePostTemplate,\n\t\t});\n\t\tconst response = await this.runtime.useModel(ModelType.TEXT_SMALL, {\n\t\t\tprompt,\n\t\t\tmaxTokens: 100,\n\t\t});\n\t\tconst truncated = response as string;\n\t\treturn truncated.length > BLUESKY_MAX_POST_LENGTH\n\t\t\t? `${truncated.substring(0, BLUESKY_MAX_POST_LENGTH - 3)}...`\n\t\t\t: truncated;\n\t}\n}\n",
15
- "import { type IAgentRuntime, Service } from \"@elizaos/core\";\n\n// Inlined to avoid adding @elizaos/plugin-workflow as a compile-time dependency.\n// The runtime duck-types the service — only the serviceType string and resolve() shape matter.\nconst WORKFLOW_CREDENTIAL_PROVIDER_TYPE = \"workflow_credential_provider\";\ntype CredentialProviderResult =\n\t| { status: \"credential_data\"; data: Record<string, unknown> }\n\t| { status: \"needs_auth\"; authUrl: string }\n\t| null;\n\n// Bluesky (AT Protocol) uses app password credentials. No dedicated workflow node;\n// use HTTP Request node. The runtime supplies handle + app password; workflows call\n// com.atproto.server.createSession to get JWT.\nconst SUPPORTED = [\"httpHeaderAuth\"];\n\nexport class BlueskyWorkflowCredentialProvider extends Service {\n\tstatic override readonly serviceType = WORKFLOW_CREDENTIAL_PROVIDER_TYPE;\n\toverride capabilityDescription =\n\t\t\"Supplies Bluesky credentials to the workflow plugin.\";\n\n\tstatic async start(\n\t\truntime: IAgentRuntime,\n\t): Promise<BlueskyWorkflowCredentialProvider> {\n\t\treturn new BlueskyWorkflowCredentialProvider(runtime);\n\t}\n\n\tasync stop(): Promise<void> {}\n\n\tasync resolve(\n\t\t_userId: string,\n\t\tcredType: string,\n\t): Promise<CredentialProviderResult> {\n\t\tif (credType !== \"httpHeaderAuth\") return null;\n\t\tconst handle = this.runtime.getSetting(\"BLUESKY_HANDLE\") as\n\t\t\t| string\n\t\t\t| undefined;\n\t\tconst password = this.runtime.getSetting(\"BLUESKY_PASSWORD\") as\n\t\t\t| string\n\t\t\t| undefined;\n\t\tif (!handle?.trim() || !password?.trim()) return null;\n\t\treturn {\n\t\t\tstatus: \"credential_data\",\n\t\t\tdata: {\n\t\t\t\tname: \"X-Bluesky-Handle\",\n\t\t\t\tvalue: handle.trim(),\n\t\t\t\tappPassword: password.trim(),\n\t\t\t},\n\t\t};\n\t}\n\n\tcheckCredentialTypes(credTypes: string[]): {\n\t\tsupported: string[];\n\t\tunsupported: string[];\n\t} {\n\t\treturn {\n\t\t\tsupported: credTypes.filter((t) => SUPPORTED.includes(t)),\n\t\t\tunsupported: credTypes.filter((t) => !SUPPORTED.includes(t)),\n\t\t};\n\t}\n}\n"
16
- ],
17
- "mappings": "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",
18
- "debugId": "ABC5C845CC8C11C664756E2164756E21",
19
- "names": []
20
- }