universal-social-sdk 1.0.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/config/env.ts","../src/errors/SocialError.ts","../src/platforms/shared/metaClient.ts","../src/utils/retry.ts","../src/utils/scheduler.ts","../src/validation/platformSchemas.ts","../src/platforms/instagram.ts","../src/platforms/x.ts","../src/utils/file.ts","../src/platforms/facebook.ts","../src/platforms/linkedin.ts","../src/platforms/shared/linkedinAuth.ts","../src/platforms/youtube.ts","../src/platforms/tiktok.ts","../src/platforms/pinterest.ts","../src/platforms/bluesky.ts","../src/platforms/mastodon.ts","../src/platforms/threads.ts"],"sourcesContent":["import dotenv from \"dotenv\";\n\ndotenv.config();\n\nfunction readNumberEnv(name: string, fallback: number): number {\n const value = process.env[name];\n if (!value) {\n return fallback;\n }\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : fallback;\n}\n\nexport const env = {\n x: {\n apiKey: process.env.X_API_KEY ?? \"\",\n apiSecret: process.env.X_API_SECRET ?? \"\",\n accessToken: process.env.X_ACCESS_TOKEN ?? \"\",\n accessSecret: process.env.X_ACCESS_SECRET ?? \"\",\n bearerToken: process.env.X_BEARER_TOKEN ?? \"\",\n clientId: process.env.X_CLIENT_ID ?? \"\",\n clientSecret: process.env.X_CLIENT_SECRET ?? \"\"\n },\n meta: {\n appId: process.env.META_APP_ID ?? \"\",\n appSecret: process.env.META_APP_SECRET ?? \"\",\n graphVersion: process.env.META_GRAPH_VERSION ?? \"v21.0\",\n fbPageToken: process.env.FB_PAGE_ACCESS_TOKEN ?? \"\",\n fbPageId: process.env.FB_PAGE_ID ?? \"\",\n igToken: process.env.IG_ACCESS_TOKEN ?? \"\",\n igUserId: process.env.IG_USER_ID ?? \"\"\n },\n linkedin: {\n accessToken: process.env.LINKEDIN_ACCESS_TOKEN ?? \"\",\n refreshToken: process.env.LINKEDIN_REFRESH_TOKEN ?? \"\",\n clientId: process.env.LINKEDIN_CLIENT_ID ?? \"\",\n clientSecret: process.env.LINKEDIN_CLIENT_SECRET ?? \"\",\n orgUrn: process.env.LINKEDIN_ORG_URN ?? \"\",\n personUrn: process.env.LINKEDIN_PERSON_URN ?? \"\",\n apiVersion: process.env.LINKEDIN_API_VERSION ?? \"202510\"\n },\n youtube: {\n accessToken: process.env.YOUTUBE_ACCESS_TOKEN ?? \"\",\n channelId: process.env.YOUTUBE_CHANNEL_ID ?? \"\"\n },\n tiktok: {\n accessToken: process.env.TIKTOK_ACCESS_TOKEN ?? \"\",\n openId: process.env.TIKTOK_OPEN_ID ?? \"\",\n advertiserId: process.env.TIKTOK_ADVERTISER_ID ?? \"\"\n },\n pinterest: {\n accessToken: process.env.PINTEREST_ACCESS_TOKEN ?? \"\",\n boardId: process.env.PINTEREST_BOARD_ID ?? \"\"\n },\n bluesky: {\n serviceUrl: process.env.BLUESKY_SERVICE_URL ?? \"https://bsky.social\",\n identifier: process.env.BLUESKY_IDENTIFIER ?? \"\",\n appPassword: process.env.BLUESKY_APP_PASSWORD ?? \"\",\n accessJwt: process.env.BLUESKY_ACCESS_JWT ?? \"\",\n refreshJwt: process.env.BLUESKY_REFRESH_JWT ?? \"\"\n },\n mastodon: {\n baseUrl: process.env.MASTODON_BASE_URL ?? \"\",\n accessToken: process.env.MASTODON_ACCESS_TOKEN ?? \"\",\n accountId: process.env.MASTODON_ACCOUNT_ID ?? \"\"\n },\n threads: {\n accessToken: process.env.THREADS_ACCESS_TOKEN ?? \"\",\n userId: process.env.THREADS_USER_ID ?? \"\"\n },\n retry: {\n maxRetries: readNumberEnv(\"SOCIAL_SDK_MAX_RETRIES\", 3),\n baseDelayMs: readNumberEnv(\"SOCIAL_SDK_RETRY_BASE_MS\", 500)\n },\n ollama: {\n host: process.env.OLLAMA_HOST ?? \"http://127.0.0.1:11434\",\n model: process.env.OLLAMA_MODEL ?? \"llama3.2:3b\"\n }\n};\n\nexport function requireEnv(name: string): string {\n const value = process.env[name];\n if (!value) {\n throw new Error(`Missing required environment variable: ${name}`);\n }\n return value;\n}\n","import type { Platform } from \"../types.js\";\n\nexport class SocialError extends Error {\n public readonly platform: Platform;\n public readonly endpoint: string;\n public readonly statusCode?: number;\n public readonly details?: unknown;\n public readonly cause?: unknown;\n\n constructor(params: {\n platform: Platform;\n endpoint: string;\n message: string;\n statusCode?: number;\n details?: unknown;\n cause?: unknown;\n }) {\n super(params.message);\n this.name = \"SocialError\";\n this.platform = params.platform;\n this.endpoint = params.endpoint;\n this.statusCode = params.statusCode;\n this.details = params.details;\n this.cause = params.cause;\n }\n\n toJSON() {\n return {\n name: this.name,\n message: this.message,\n platform: this.platform,\n endpoint: this.endpoint,\n statusCode: this.statusCode,\n details: this.details\n };\n }\n\n static normalize(params: {\n platform: Platform;\n endpoint: string;\n error: unknown;\n }): SocialError {\n const { platform, endpoint, error } = params;\n if (error instanceof SocialError) {\n return error;\n }\n if (error && typeof error === \"object\") {\n const maybeAny = error as Record<string, unknown>;\n const response = maybeAny.response as\n | { status?: number; data?: unknown }\n | undefined;\n const message =\n (maybeAny.message as string | undefined) ??\n \"Unknown platform SDK error\";\n\n return new SocialError({\n platform,\n endpoint,\n message,\n statusCode: response?.status,\n details:\n response && typeof response === \"object\"\n ? {\n data: response.data,\n status: response.status,\n headers: (maybeAny as { response?: { headers?: unknown } }).response\n ?.headers\n }\n : error,\n cause: error\n });\n }\n\n return new SocialError({\n platform,\n endpoint,\n message: String(error ?? \"Unknown error\"),\n cause: error\n });\n }\n}\n","import bizSdk from \"facebook-nodejs-business-sdk\";\nimport { env } from \"../../config/env.js\";\nimport { SocialError } from \"../../errors/SocialError.js\";\nimport { withRetries } from \"../../utils/retry.js\";\n\nconst { FacebookAdsApi } = bizSdk;\n\nlet didInit = false;\n\nfunction ensureInit(): void {\n if (!didInit) {\n const token = env.meta.fbPageToken || env.meta.igToken;\n if (!token) {\n throw new SocialError({\n platform: \"facebook\",\n endpoint: \"meta:init\",\n message:\n \"Missing FB_PAGE_ACCESS_TOKEN or IG_ACCESS_TOKEN for Meta SDK initialization.\"\n });\n }\n FacebookAdsApi.init(token);\n didInit = true;\n }\n}\n\nexport async function metaCall<T = unknown>(params: {\n endpoint: string;\n method: \"GET\" | \"POST\" | \"DELETE\";\n query?: Record<string, unknown>;\n body?: Record<string, unknown>;\n platform: \"facebook\" | \"instagram\";\n}): Promise<T> {\n ensureInit();\n const api = FacebookAdsApi.getDefaultApi();\n const endpointPath = `/${env.meta.graphVersion}${params.endpoint}`;\n\n return withRetries({\n platform: params.platform,\n endpoint: endpointPath,\n execute: async () => {\n try {\n return (await api.call(\n params.method,\n endpointPath,\n params.query ?? {},\n params.body ?? {}\n )) as T;\n } catch (error) {\n throw SocialError.normalize({\n platform: params.platform,\n endpoint: endpointPath,\n error\n });\n }\n }\n });\n}\n","import { env } from \"../config/env.js\";\nimport { SocialError } from \"../errors/SocialError.js\";\nimport type { Platform } from \"../types.js\";\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction parseRetryAfterMs(details: unknown): number | null {\n if (!details || typeof details !== \"object\") {\n return null;\n }\n const maybe = details as Record<string, unknown>;\n const headers = maybe.headers;\n if (!headers || typeof headers !== \"object\") {\n return null;\n }\n const retryAfterRaw = (headers as Record<string, unknown>)[\"retry-after\"];\n if (typeof retryAfterRaw !== \"string\" && typeof retryAfterRaw !== \"number\") {\n return null;\n }\n const seconds = Number(retryAfterRaw);\n if (Number.isFinite(seconds) && seconds >= 0) {\n return Math.round(seconds * 1000);\n }\n return null;\n}\n\nfunction isRetryableStatus(code?: number): boolean {\n if (!code) {\n return false;\n }\n return code === 429 || (code >= 500 && code <= 599);\n}\n\nexport async function withRetries<T>(params: {\n platform: Platform;\n endpoint: string;\n execute: () => Promise<T>;\n retries?: number;\n baseDelayMs?: number;\n}): Promise<T> {\n const retries = params.retries ?? env.retry.maxRetries;\n const baseDelayMs = params.baseDelayMs ?? env.retry.baseDelayMs;\n\n let attempt = 0;\n let lastError: unknown;\n\n while (attempt <= retries) {\n try {\n return await params.execute();\n } catch (error) {\n lastError = error;\n const normalized = SocialError.normalize({\n platform: params.platform,\n endpoint: params.endpoint,\n error\n });\n\n if (!isRetryableStatus(normalized.statusCode) || attempt === retries) {\n throw normalized;\n }\n\n const backoffMs = baseDelayMs * 2 ** attempt;\n const jitterMs = Math.floor(Math.random() * Math.max(50, baseDelayMs));\n const retryAfterMs = parseRetryAfterMs(normalized.details) ?? backoffMs + jitterMs;\n await sleep(retryAfterMs);\n attempt += 1;\n }\n }\n\n throw SocialError.normalize({\n platform: params.platform,\n endpoint: params.endpoint,\n error: lastError\n });\n}\n","const scheduledJobs = new Map<string, NodeJS.Timeout>();\n\nfunction toDate(value: Date | string): Date {\n if (value instanceof Date) {\n return value;\n }\n return new Date(value);\n}\n\nexport function scheduleTask<T>(params: {\n id: string;\n runAt: Date | string;\n task: () => Promise<T>;\n}): Promise<T> {\n const runAt = toDate(params.runAt).getTime();\n const delay = Math.max(0, runAt - Date.now());\n\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(async () => {\n scheduledJobs.delete(params.id);\n try {\n resolve(await params.task());\n } catch (error) {\n reject(error);\n }\n }, delay);\n\n scheduledJobs.set(params.id, timeout);\n });\n}\n\nexport function cancelScheduledTask(id: string): boolean {\n const timeout = scheduledJobs.get(id);\n if (!timeout) {\n return false;\n }\n clearTimeout(timeout);\n scheduledJobs.delete(id);\n return true;\n}\n","import { z } from \"zod\";\nimport { SocialError } from \"../errors/SocialError.js\";\nimport type { Platform } from \"../types.js\";\n\nconst nonEmpty = z.string().min(1);\nconst optionalNonEmpty = nonEmpty.optional();\nconst dateLike = z.union([z.date(), z.string().min(1)]);\n\nconst schemaMap = {\n x: {\n postTweet: z.object({ text: nonEmpty, mediaIds: z.array(nonEmpty).optional() }),\n postThread: z.object({ tweets: z.array(nonEmpty).min(1) }),\n replyTweet: z.object({ text: nonEmpty, inReplyToTweetId: nonEmpty }),\n quoteTweet: z.object({ text: nonEmpty, quoteTweetId: nonEmpty }),\n deleteTweet: z.object({ tweetId: nonEmpty }),\n retweet: z.object({ userId: nonEmpty, tweetId: nonEmpty }),\n unretweet: z.object({ userId: nonEmpty, tweetId: nonEmpty }),\n likeTweet: z.object({ userId: nonEmpty, tweetId: nonEmpty }),\n unlikeTweet: z.object({ userId: nonEmpty, tweetId: nonEmpty }),\n uploadMedia: z.object({ mediaPath: nonEmpty }),\n postPhoto: z.object({ mediaPath: nonEmpty, text: nonEmpty }),\n postVideo: z.object({ mediaPath: nonEmpty, text: nonEmpty }),\n postPoll: z.object({\n text: nonEmpty,\n options: z.array(nonEmpty).min(2).max(4),\n durationMinutes: z.number().int().min(5).max(10080)\n }),\n sendDirectMessage: z.object({ recipientId: nonEmpty, text: nonEmpty }),\n getTweetAnalytics: z.object({ tweetId: nonEmpty }),\n scheduleTweet: z.object({ text: nonEmpty, publishAt: dateLike })\n },\n facebook: {\n publishToPage: z.object({\n pageId: optionalNonEmpty,\n message: nonEmpty,\n link: optionalNonEmpty,\n photoUrl: optionalNonEmpty\n }),\n publishPhoto: z.object({ pageId: optionalNonEmpty, url: nonEmpty, caption: optionalNonEmpty }),\n publishVideo: z.object({\n pageId: optionalNonEmpty,\n fileUrl: nonEmpty,\n description: optionalNonEmpty,\n title: optionalNonEmpty\n }),\n publishCarousel: z.object({\n pageId: optionalNonEmpty,\n message: nonEmpty,\n photoUrls: z.array(nonEmpty).min(2)\n }),\n publishStory: z.object({ pageId: optionalNonEmpty, photoUrl: nonEmpty }),\n schedulePost: z.object({ pageId: optionalNonEmpty, message: nonEmpty, publishAt: dateLike }),\n commentOnPost: z.object({ postId: nonEmpty, message: nonEmpty }),\n replyToComment: z.object({ commentId: nonEmpty, message: nonEmpty }),\n likeObject: z.object({ objectId: nonEmpty }),\n deletePost: z.object({ objectId: nonEmpty }),\n sendPageMessage: z.object({ recipientPsid: nonEmpty, message: nonEmpty, pageId: optionalNonEmpty }),\n getPostInsights: z.object({ postId: nonEmpty, metrics: z.array(nonEmpty).optional() }),\n getPageInsights: z.object({\n pageId: optionalNonEmpty,\n metrics: z.array(nonEmpty).optional(),\n period: z.enum([\"day\", \"week\", \"days_28\"]).optional()\n }),\n uploadResumableVideo: z.object({\n pageId: optionalNonEmpty,\n fileSize: z.number().int().positive(),\n startOffset: z.number().int().nonnegative().optional()\n }),\n listPublishedPosts: z.object({\n pageId: optionalNonEmpty,\n limit: z.number().int().positive().optional()\n })\n },\n instagram: {\n uploadPhoto: z.object({ igUserId: optionalNonEmpty, imageUrl: nonEmpty, caption: optionalNonEmpty }),\n uploadVideo: z.object({ igUserId: optionalNonEmpty, videoUrl: nonEmpty, caption: optionalNonEmpty }),\n uploadReel: z.object({\n igUserId: optionalNonEmpty,\n mediaPath: optionalNonEmpty,\n videoUrl: nonEmpty,\n caption: optionalNonEmpty\n }),\n uploadStoryPhoto: z.object({ igUserId: optionalNonEmpty, imageUrl: nonEmpty }),\n uploadStoryVideo: z.object({ igUserId: optionalNonEmpty, videoUrl: nonEmpty }),\n publishCarousel: z.object({\n igUserId: optionalNonEmpty,\n caption: optionalNonEmpty,\n items: z.array(z.object({ imageUrl: optionalNonEmpty, videoUrl: optionalNonEmpty })).min(2)\n }),\n commentOnMedia: z.object({ mediaId: nonEmpty, message: nonEmpty }),\n replyToComment: z.object({ commentId: nonEmpty, message: nonEmpty }),\n hideComment: z.object({ commentId: nonEmpty, hide: z.boolean() }),\n deleteComment: z.object({ commentId: nonEmpty }),\n deleteMedia: z.object({ mediaId: nonEmpty }),\n sendPrivateReply: z.object({ commentId: nonEmpty, message: nonEmpty }),\n getMediaInsights: z.object({ mediaId: nonEmpty, metrics: z.array(nonEmpty).optional() }),\n getAccountInsights: z.object({\n igUserId: optionalNonEmpty,\n metrics: z.array(nonEmpty).optional(),\n period: z.enum([\"day\", \"week\", \"days_28\"]).optional()\n }),\n getPublishingLimit: z.object({ igUserId: optionalNonEmpty }),\n scheduleReel: z.object({\n igUserId: optionalNonEmpty,\n videoUrl: nonEmpty,\n caption: optionalNonEmpty,\n publishAt: dateLike\n })\n },\n linkedin: {\n createTextPost: z.object({\n author: optionalNonEmpty,\n text: nonEmpty,\n visibility: z.enum([\"PUBLIC\", \"CONNECTIONS\"]).optional()\n }),\n createImagePost: z.object({ author: optionalNonEmpty, text: nonEmpty, mediaUrn: nonEmpty }),\n createVideoPost: z.object({ author: optionalNonEmpty, text: nonEmpty, mediaUrn: nonEmpty }),\n createCarouselPost: z.object({\n author: optionalNonEmpty,\n text: nonEmpty,\n mediaUrns: z.array(nonEmpty).min(2)\n }),\n schedulePost: z.object({ author: optionalNonEmpty, text: nonEmpty, publishAt: dateLike }),\n commentOnPost: z.object({ actor: optionalNonEmpty, objectUrn: nonEmpty, message: nonEmpty }),\n replyToComment: z.object({\n actor: optionalNonEmpty,\n parentCommentUrn: nonEmpty,\n message: nonEmpty\n }),\n deleteComment: z.object({ encodedCommentUrn: nonEmpty }),\n likePost: z.object({ actor: optionalNonEmpty, objectUrn: nonEmpty }),\n unlikePost: z.object({ actorUrn: optionalNonEmpty, encodedObjectUrn: nonEmpty }),\n sendDirectMessage: z.object({\n actor: optionalNonEmpty,\n recipientUrn: nonEmpty,\n text: nonEmpty\n }),\n getPostAnalytics: z.object({ postUrn: nonEmpty }),\n getOrganizationAnalytics: z.object({ orgUrn: optionalNonEmpty }),\n registerUpload: z.object({\n owner: optionalNonEmpty,\n mediaType: z.enum([\"image\", \"video\"]),\n fileSize: z.number().int().positive()\n }),\n uploadBinary: z.object({ uploadUrl: nonEmpty, mediaPath: nonEmpty }),\n deletePost: z.object({ encodedPostUrn: nonEmpty })\n },\n youtube: {\n createVideoUploadSession: z.object({\n title: nonEmpty,\n description: optionalNonEmpty,\n privacyStatus: z.enum([\"private\", \"public\", \"unlisted\"]).optional()\n }),\n uploadBinary: z.object({ uploadUrl: nonEmpty, mediaPath: nonEmpty }),\n listMyVideos: z.object({ maxResults: z.number().int().positive().optional() }),\n updateVideoMetadata: z.object({\n videoId: nonEmpty,\n title: optionalNonEmpty,\n description: optionalNonEmpty,\n privacyStatus: z.enum([\"private\", \"public\", \"unlisted\"]).optional()\n }),\n deleteVideo: z.object({ videoId: nonEmpty }),\n commentOnVideo: z.object({ videoId: nonEmpty, text: nonEmpty }),\n replyToComment: z.object({ parentCommentId: nonEmpty, text: nonEmpty }),\n likeVideo: z.object({ videoId: nonEmpty }),\n unlikeVideo: z.object({ videoId: nonEmpty }),\n createPlaylist: z.object({\n title: nonEmpty,\n description: optionalNonEmpty,\n privacyStatus: z.enum([\"private\", \"public\", \"unlisted\"]).optional()\n }),\n addVideoToPlaylist: z.object({ playlistId: nonEmpty, videoId: nonEmpty }),\n getChannelAnalytics: z.object({\n startDate: nonEmpty,\n endDate: nonEmpty,\n metrics: optionalNonEmpty\n }),\n scheduleVideoMetadataUpdate: z.object({\n videoId: nonEmpty,\n title: optionalNonEmpty,\n description: optionalNonEmpty,\n privacyStatus: z.enum([\"private\", \"public\", \"unlisted\"]).optional(),\n publishAt: dateLike\n })\n },\n tiktok: {\n createPost: z.object({\n text: nonEmpty,\n visibility: z\n .enum([\"PUBLIC_TO_EVERYONE\", \"MUTUAL_FOLLOW_FRIENDS\", \"SELF_ONLY\"])\n .optional()\n }),\n createVideoPost: z.object({\n title: nonEmpty,\n videoUrl: nonEmpty,\n visibility: z\n .enum([\"PUBLIC_TO_EVERYONE\", \"MUTUAL_FOLLOW_FRIENDS\", \"SELF_ONLY\"])\n .optional()\n }),\n getPostStatus: z.object({ publishId: nonEmpty }),\n listVideos: z.object({ maxCount: z.number().int().positive().optional() }),\n deleteVideo: z.object({ videoId: nonEmpty }),\n commentOnVideo: z.object({ videoId: nonEmpty, text: nonEmpty }),\n replyToComment: z.object({ commentId: nonEmpty, text: nonEmpty }),\n likeVideo: z.object({ videoId: nonEmpty }),\n unlikeVideo: z.object({ videoId: nonEmpty }),\n getVideoAnalytics: z.object({ videoIds: z.array(nonEmpty).min(1) }),\n getProfileAnalytics: z.object({ fields: z.array(nonEmpty).optional() }),\n scheduleVideoPost: z.object({\n title: nonEmpty,\n videoUrl: nonEmpty,\n publishAt: dateLike\n })\n },\n pinterest: {\n createPin: z.object({\n boardId: optionalNonEmpty,\n title: nonEmpty,\n description: optionalNonEmpty,\n link: optionalNonEmpty,\n mediaSourceUrl: nonEmpty\n }),\n createVideoPin: z.object({\n boardId: optionalNonEmpty,\n title: nonEmpty,\n description: optionalNonEmpty,\n mediaSourceUrl: nonEmpty\n }),\n updatePin: z.object({\n pinId: nonEmpty,\n title: optionalNonEmpty,\n description: optionalNonEmpty,\n link: optionalNonEmpty\n }),\n deletePin: z.object({ pinId: nonEmpty }),\n listPins: z.object({\n boardId: optionalNonEmpty,\n pageSize: z.number().int().positive().optional()\n }),\n createBoard: z.object({\n name: nonEmpty,\n description: optionalNonEmpty,\n privacy: z.enum([\"PUBLIC\", \"PROTECTED\", \"SECRET\"]).optional()\n }),\n listBoards: z.object({ pageSize: z.number().int().positive().optional() }),\n commentOnPin: z.object({ pinId: nonEmpty, text: nonEmpty }),\n replyToComment: z.object({\n pinId: nonEmpty,\n commentId: nonEmpty,\n text: nonEmpty\n }),\n getPinAnalytics: z.object({\n pinId: nonEmpty,\n startDate: nonEmpty,\n endDate: nonEmpty\n }),\n getAccountAnalytics: z.object({ startDate: nonEmpty, endDate: nonEmpty }),\n schedulePin: z.object({\n title: nonEmpty,\n mediaSourceUrl: nonEmpty,\n boardId: optionalNonEmpty,\n publishAt: dateLike\n })\n },\n bluesky: {\n postText: z.object({ text: nonEmpty }),\n postWithLink: z.object({ text: nonEmpty, url: nonEmpty }),\n replyToPost: z.object({\n text: nonEmpty,\n rootUri: nonEmpty,\n rootCid: nonEmpty,\n parentUri: nonEmpty,\n parentCid: nonEmpty\n }),\n likePost: z.object({ subjectUri: nonEmpty, subjectCid: nonEmpty }),\n repost: z.object({ subjectUri: nonEmpty, subjectCid: nonEmpty }),\n deleteRecord: z.object({ uri: nonEmpty }),\n getAuthorFeed: z.object({\n actorDidOrHandle: nonEmpty,\n limit: z.number().int().positive().optional()\n }),\n searchPosts: z.object({\n query: nonEmpty,\n limit: z.number().int().positive().optional()\n }),\n getPostThread: z.object({\n uri: nonEmpty,\n depth: z.number().int().positive().optional()\n }),\n getNotificationFeed: z.object({\n limit: z.number().int().positive().optional()\n }),\n schedulePost: z.object({ text: nonEmpty, publishAt: dateLike })\n },\n mastodon: {\n createStatus: z.object({\n text: nonEmpty,\n visibility: z.enum([\"public\", \"unlisted\", \"private\", \"direct\"]).optional()\n }),\n uploadMedia: z.object({ mediaPath: nonEmpty, description: optionalNonEmpty }),\n createMediaStatus: z.object({\n text: nonEmpty,\n mediaIds: z.array(nonEmpty).min(1),\n visibility: z.enum([\"public\", \"unlisted\", \"private\", \"direct\"]).optional()\n }),\n replyToStatus: z.object({ statusId: nonEmpty, text: nonEmpty }),\n deleteStatus: z.object({ statusId: nonEmpty }),\n favouriteStatus: z.object({ statusId: nonEmpty }),\n unfavouriteStatus: z.object({ statusId: nonEmpty }),\n boostStatus: z.object({ statusId: nonEmpty }),\n unboostStatus: z.object({ statusId: nonEmpty }),\n listMyStatuses: z.object({ limit: z.number().int().positive().optional() }),\n getStatusContext: z.object({ statusId: nonEmpty }),\n getAccountAnalytics: z.object({\n instanceScope: z.enum([\"day\", \"week\", \"month\"]).optional()\n }),\n scheduleStatus: z.object({ text: nonEmpty, publishAt: dateLike })\n },\n threads: {\n postText: z.object({ threadsUserId: optionalNonEmpty, text: nonEmpty }),\n postImage: z.object({\n threadsUserId: optionalNonEmpty,\n text: optionalNonEmpty,\n imageUrl: nonEmpty\n }),\n postVideo: z.object({\n threadsUserId: optionalNonEmpty,\n text: optionalNonEmpty,\n videoUrl: nonEmpty\n }),\n replyToThread: z.object({\n threadsUserId: optionalNonEmpty,\n threadId: nonEmpty,\n text: nonEmpty\n }),\n deleteThread: z.object({ threadId: nonEmpty }),\n getThread: z.object({\n threadId: nonEmpty,\n fields: z.array(nonEmpty).optional()\n }),\n listMyThreads: z.object({\n threadsUserId: optionalNonEmpty,\n limit: z.number().int().positive().optional()\n }),\n getThreadInsights: z.object({\n threadId: nonEmpty,\n metrics: z.array(nonEmpty).optional()\n }),\n getAccountInsights: z.object({\n threadsUserId: optionalNonEmpty,\n metrics: z.array(nonEmpty).optional(),\n period: z.enum([\"day\", \"week\", \"days_28\"]).optional()\n }),\n likeThread: z.object({ threadId: nonEmpty }),\n unlikeThread: z.object({ threadId: nonEmpty }),\n scheduleTextPost: z.object({\n threadsUserId: optionalNonEmpty,\n text: nonEmpty,\n publishAt: dateLike\n })\n }\n} as const;\n\ntype MethodFor<P extends Platform> = keyof (typeof schemaMap)[P] & string;\n\nexport function validatePlatformInput<P extends Platform, M extends MethodFor<P>>(\n platform: P,\n method: M,\n input: unknown\n): z.infer<(typeof schemaMap)[P][M]> {\n const schema = schemaMap[platform][method];\n const result = schema.safeParse(input);\n if (result.success) {\n return result.data;\n }\n\n throw new SocialError({\n platform,\n endpoint: `${platform}.${method}`,\n message: `Invalid input for ${platform}.${method}`,\n details: result.error.flatten()\n });\n}\n","import { env } from \"../config/env.js\";\nimport { SocialError } from \"../errors/SocialError.js\";\nimport { metaCall } from \"./shared/metaClient.js\";\nimport { scheduleTask } from \"../utils/scheduler.js\";\nimport { validatePlatformInput } from \"../validation/platformSchemas.js\";\n\nfunction igUserIdOrThrow(inputUserId?: string): string {\n const igUserId = inputUserId ?? env.meta.igUserId;\n if (!igUserId) {\n throw new SocialError({\n platform: \"instagram\",\n endpoint: \"ig-user-id\",\n message: \"Missing IG_USER_ID (or pass igUserId explicitly).\"\n });\n }\n return igUserId;\n}\n\nasync function createMediaContainer(params: {\n igUserId: string;\n imageUrl?: string;\n videoUrl?: string;\n caption?: string;\n mediaType?: \"IMAGE\" | \"VIDEO\" | \"REELS\" | \"STORIES\";\n isCarouselItem?: boolean;\n children?: string[];\n}): Promise<{ id: string }> {\n return metaCall<{ id: string }>({\n platform: \"instagram\",\n method: \"POST\",\n endpoint: `/${params.igUserId}/media`,\n body: {\n image_url: params.imageUrl,\n video_url: params.videoUrl,\n caption: params.caption,\n media_type: params.mediaType,\n is_carousel_item: params.isCarouselItem,\n children: params.children\n }\n });\n}\n\nasync function publishContainer(igUserId: string, creationId: string) {\n return metaCall({\n platform: \"instagram\",\n method: \"POST\",\n endpoint: `/${igUserId}/media_publish`,\n body: { creation_id: creationId }\n });\n}\n\nexport class Instagram {\n static async uploadPhoto(input: { igUserId?: string; imageUrl: string; caption?: string }) {\n validatePlatformInput(\"instagram\", \"uploadPhoto\", input);\n const igUserId = igUserIdOrThrow(input.igUserId);\n const container = await createMediaContainer({\n igUserId,\n imageUrl: input.imageUrl,\n caption: input.caption,\n mediaType: \"IMAGE\"\n });\n return publishContainer(igUserId, container.id);\n }\n\n static async uploadVideo(input: { igUserId?: string; videoUrl: string; caption?: string }) {\n validatePlatformInput(\"instagram\", \"uploadVideo\", input);\n const igUserId = igUserIdOrThrow(input.igUserId);\n const container = await createMediaContainer({\n igUserId,\n videoUrl: input.videoUrl,\n caption: input.caption,\n mediaType: \"VIDEO\"\n });\n return publishContainer(igUserId, container.id);\n }\n\n static async uploadReel(input: { igUserId?: string; mediaPath?: string; videoUrl: string; caption?: string }) {\n validatePlatformInput(\"instagram\", \"uploadReel\", input);\n const igUserId = igUserIdOrThrow(input.igUserId);\n const container = await createMediaContainer({\n igUserId,\n videoUrl: input.videoUrl,\n caption: input.caption,\n mediaType: \"REELS\"\n });\n return publishContainer(igUserId, container.id);\n }\n\n static async uploadStoryPhoto(input: { igUserId?: string; imageUrl: string }) {\n validatePlatformInput(\"instagram\", \"uploadStoryPhoto\", input);\n const igUserId = igUserIdOrThrow(input.igUserId);\n const container = await createMediaContainer({\n igUserId,\n imageUrl: input.imageUrl,\n mediaType: \"STORIES\"\n });\n return publishContainer(igUserId, container.id);\n }\n\n static async uploadStoryVideo(input: { igUserId?: string; videoUrl: string }) {\n validatePlatformInput(\"instagram\", \"uploadStoryVideo\", input);\n const igUserId = igUserIdOrThrow(input.igUserId);\n const container = await createMediaContainer({\n igUserId,\n videoUrl: input.videoUrl,\n mediaType: \"STORIES\"\n });\n return publishContainer(igUserId, container.id);\n }\n\n static async publishCarousel(input: {\n igUserId?: string;\n caption?: string;\n items: Array<{ imageUrl?: string; videoUrl?: string }>;\n }) {\n validatePlatformInput(\"instagram\", \"publishCarousel\", input);\n const igUserId = igUserIdOrThrow(input.igUserId);\n const children: string[] = [];\n for (const item of input.items) {\n const child = await createMediaContainer({\n igUserId,\n imageUrl: item.imageUrl,\n videoUrl: item.videoUrl,\n isCarouselItem: true\n });\n children.push(child.id);\n }\n const parent = await createMediaContainer({\n igUserId,\n caption: input.caption,\n mediaType: \"IMAGE\",\n children\n });\n return publishContainer(igUserId, parent.id);\n }\n\n static async commentOnMedia(input: { mediaId: string; message: string }) {\n validatePlatformInput(\"instagram\", \"commentOnMedia\", input);\n return metaCall({\n platform: \"instagram\",\n method: \"POST\",\n endpoint: `/${input.mediaId}/comments`,\n body: { message: input.message }\n });\n }\n\n static async replyToComment(input: { commentId: string; message: string }) {\n validatePlatformInput(\"instagram\", \"replyToComment\", input);\n return metaCall({\n platform: \"instagram\",\n method: \"POST\",\n endpoint: `/${input.commentId}/replies`,\n body: { message: input.message }\n });\n }\n\n static async hideComment(input: { commentId: string; hide: boolean }) {\n validatePlatformInput(\"instagram\", \"hideComment\", input);\n return metaCall({\n platform: \"instagram\",\n method: \"POST\",\n endpoint: `/${input.commentId}`,\n body: { hidden: input.hide }\n });\n }\n\n static async deleteComment(input: { commentId: string }) {\n validatePlatformInput(\"instagram\", \"deleteComment\", input);\n return metaCall({\n platform: \"instagram\",\n method: \"DELETE\",\n endpoint: `/${input.commentId}`\n });\n }\n\n static async deleteMedia(input: { mediaId: string }) {\n validatePlatformInput(\"instagram\", \"deleteMedia\", input);\n return metaCall({\n platform: \"instagram\",\n method: \"DELETE\",\n endpoint: `/${input.mediaId}`\n });\n }\n\n static async sendPrivateReply(input: { commentId: string; message: string }) {\n validatePlatformInput(\"instagram\", \"sendPrivateReply\", input);\n return metaCall({\n platform: \"instagram\",\n method: \"POST\",\n endpoint: `/${input.commentId}/private_replies`,\n body: { message: input.message }\n });\n }\n\n static async getMediaInsights(input: { mediaId: string; metrics?: string[] }) {\n validatePlatformInput(\"instagram\", \"getMediaInsights\", input);\n return metaCall({\n platform: \"instagram\",\n method: \"GET\",\n endpoint: `/${input.mediaId}/insights`,\n query: { metric: (input.metrics ?? [\"impressions\", \"reach\", \"saved\", \"video_views\"]).join(\",\") }\n });\n }\n\n static async getAccountInsights(input: { igUserId?: string; metrics?: string[]; period?: \"day\" | \"week\" | \"days_28\" }) {\n validatePlatformInput(\"instagram\", \"getAccountInsights\", input);\n const igUserId = igUserIdOrThrow(input.igUserId);\n return metaCall({\n platform: \"instagram\",\n method: \"GET\",\n endpoint: `/${igUserId}/insights`,\n query: {\n metric: (input.metrics ?? [\"impressions\", \"reach\", \"profile_views\"]).join(\",\"),\n period: input.period ?? \"day\"\n }\n });\n }\n\n static async getPublishingLimit(input: { igUserId?: string }) {\n validatePlatformInput(\"instagram\", \"getPublishingLimit\", input);\n const igUserId = igUserIdOrThrow(input.igUserId);\n return metaCall({\n platform: \"instagram\",\n method: \"GET\",\n endpoint: `/${igUserId}/content_publishing_limit`,\n query: { fields: \"quota_usage,config\" }\n });\n }\n\n static async scheduleReel(input: { igUserId?: string; videoUrl: string; caption?: string; publishAt: Date | string }) {\n validatePlatformInput(\"instagram\", \"scheduleReel\", input);\n const igUserId = igUserIdOrThrow(input.igUserId);\n return scheduleTask({\n id: `ig-schedule-${Date.now()}`,\n runAt: input.publishAt,\n task: async () =>\n Instagram.uploadReel({\n igUserId,\n videoUrl: input.videoUrl,\n caption: input.caption\n })\n });\n }\n}\n","import { TwitterApi } from \"twitter-api-v2\";\nimport { env } from \"../config/env.js\";\nimport { SocialError } from \"../errors/SocialError.js\";\nimport { createUploadStream } from \"../utils/file.js\";\nimport { withRetries } from \"../utils/retry.js\";\nimport { scheduleTask } from \"../utils/scheduler.js\";\nimport { validatePlatformInput } from \"../validation/platformSchemas.js\";\n\ninterface PostTweetInput {\n text: string;\n mediaIds?: string[];\n}\n\ninterface ReplyTweetInput {\n text: string;\n inReplyToTweetId: string;\n}\n\ninterface QuoteTweetInput {\n text: string;\n quoteTweetId: string;\n}\n\ninterface PostMediaInput {\n mediaPath: string;\n text: string;\n}\n\ninterface PollTweetInput {\n text: string;\n options: string[];\n durationMinutes: number;\n}\n\nlet client: TwitterApi | null = null;\n\nfunction getClient(): TwitterApi {\n if (client) {\n return client;\n }\n if (!env.x.apiKey || !env.x.apiSecret || !env.x.accessToken || !env.x.accessSecret) {\n throw new SocialError({\n platform: \"x\",\n endpoint: \"auth\",\n message:\n \"Missing X credentials. Required: X_API_KEY, X_API_SECRET, X_ACCESS_TOKEN, X_ACCESS_SECRET.\"\n });\n }\n client = new TwitterApi({\n appKey: env.x.apiKey,\n appSecret: env.x.apiSecret,\n accessToken: env.x.accessToken,\n accessSecret: env.x.accessSecret\n });\n return client;\n}\n\nasync function uploadMediaInternal(mediaPath: string): Promise<string> {\n const rw = getClient().readWrite as any;\n return withRetries({\n platform: \"x\",\n endpoint: \"v1.1/media/upload\",\n execute: async () => rw.v1.uploadMedia(createUploadStream(mediaPath))\n });\n}\n\nexport class X {\n static async postTweet(input: PostTweetInput) {\n validatePlatformInput(\"x\", \"postTweet\", input);\n const rw = getClient().readWrite as any;\n return withRetries({\n platform: \"x\",\n endpoint: \"POST /2/tweets\",\n execute: async () => rw.v2.tweet({ text: input.text, media: input.mediaIds ? { media_ids: input.mediaIds } : undefined })\n });\n }\n\n static async postThread(input: { tweets: string[] }) {\n validatePlatformInput(\"x\", \"postThread\", input);\n let previousId: string | undefined;\n const published: unknown[] = [];\n for (const text of input.tweets) {\n const payload = previousId ? { text, reply: { in_reply_to_tweet_id: previousId } } : { text };\n const rw = getClient().readWrite as any;\n const result = await rw.v2.tweet(payload);\n published.push(result);\n previousId = result?.data?.id;\n }\n return published;\n }\n\n static async replyTweet(input: ReplyTweetInput) {\n validatePlatformInput(\"x\", \"replyTweet\", input);\n const rw = getClient().readWrite as any;\n return withRetries({\n platform: \"x\",\n endpoint: \"POST /2/tweets\",\n execute: async () => rw.v2.tweet({ text: input.text, reply: { in_reply_to_tweet_id: input.inReplyToTweetId } })\n });\n }\n\n static async quoteTweet(input: QuoteTweetInput) {\n validatePlatformInput(\"x\", \"quoteTweet\", input);\n const rw = getClient().readWrite as any;\n return withRetries({\n platform: \"x\",\n endpoint: \"POST /2/tweets\",\n execute: async () => rw.v2.tweet({ text: input.text, quote_tweet_id: input.quoteTweetId })\n });\n }\n\n static async deleteTweet(input: { tweetId: string }) {\n validatePlatformInput(\"x\", \"deleteTweet\", input);\n const rw = getClient().readWrite as any;\n return withRetries({\n platform: \"x\",\n endpoint: \"DELETE /2/tweets/:id\",\n execute: async () => rw.v2.deleteTweet(input.tweetId)\n });\n }\n\n static async retweet(input: { userId: string; tweetId: string }) {\n validatePlatformInput(\"x\", \"retweet\", input);\n const rw = getClient().readWrite as any;\n return withRetries({\n platform: \"x\",\n endpoint: \"POST /2/users/:id/retweets\",\n execute: async () => rw.v2.retweet(input.userId, input.tweetId)\n });\n }\n\n static async unretweet(input: { userId: string; tweetId: string }) {\n validatePlatformInput(\"x\", \"unretweet\", input);\n const rw = getClient().readWrite as any;\n return withRetries({\n platform: \"x\",\n endpoint: \"DELETE /2/users/:id/retweets/:tweet_id\",\n execute: async () => rw.v2.unretweet(input.userId, input.tweetId)\n });\n }\n\n static async likeTweet(input: { userId: string; tweetId: string }) {\n validatePlatformInput(\"x\", \"likeTweet\", input);\n const rw = getClient().readWrite as any;\n return withRetries({\n platform: \"x\",\n endpoint: \"POST /2/users/:id/likes\",\n execute: async () => rw.v2.like(input.userId, input.tweetId)\n });\n }\n\n static async unlikeTweet(input: { userId: string; tweetId: string }) {\n validatePlatformInput(\"x\", \"unlikeTweet\", input);\n const rw = getClient().readWrite as any;\n return withRetries({\n platform: \"x\",\n endpoint: \"DELETE /2/users/:id/likes/:tweet_id\",\n execute: async () => rw.v2.unlike(input.userId, input.tweetId)\n });\n }\n\n static async uploadMedia(input: { mediaPath: string }) {\n validatePlatformInput(\"x\", \"uploadMedia\", input);\n return uploadMediaInternal(input.mediaPath);\n }\n\n static async postPhoto(input: PostMediaInput) {\n validatePlatformInput(\"x\", \"postPhoto\", input);\n const mediaId = await uploadMediaInternal(input.mediaPath);\n return X.postTweet({ text: input.text, mediaIds: [mediaId] });\n }\n\n static async postVideo(input: PostMediaInput) {\n validatePlatformInput(\"x\", \"postVideo\", input);\n const mediaId = await uploadMediaInternal(input.mediaPath);\n return X.postTweet({ text: input.text, mediaIds: [mediaId] });\n }\n\n static async postPoll(input: PollTweetInput) {\n validatePlatformInput(\"x\", \"postPoll\", input);\n const rw = getClient().readWrite as any;\n return withRetries({\n platform: \"x\",\n endpoint: \"POST /2/tweets\",\n execute: async () =>\n rw.v2.tweet({\n text: input.text,\n poll: {\n options: input.options,\n duration_minutes: input.durationMinutes\n }\n })\n });\n }\n\n static async sendDirectMessage(input: { recipientId: string; text: string }) {\n validatePlatformInput(\"x\", \"sendDirectMessage\", input);\n const rw = getClient().readWrite as any;\n return withRetries({\n platform: \"x\",\n endpoint: \"POST /2/dm_conversations/with/:participant_id/messages\",\n execute: async () =>\n rw.v2.post(`dm_conversations/with/${input.recipientId}/messages`, {\n text: input.text\n })\n });\n }\n\n static async getTweetAnalytics(input: { tweetId: string }) {\n validatePlatformInput(\"x\", \"getTweetAnalytics\", input);\n const ro = getClient().readOnly as any;\n return withRetries({\n platform: \"x\",\n endpoint: \"GET /2/tweets/:id\",\n execute: async () =>\n ro.v2.singleTweet(input.tweetId, {\n \"tweet.fields\": [\"public_metrics\", \"created_at\", \"organic_metrics\", \"non_public_metrics\"]\n })\n });\n }\n\n static async scheduleTweet(input: { text: string; publishAt: Date | string }) {\n validatePlatformInput(\"x\", \"scheduleTweet\", input);\n const jobId = `x-schedule-${Date.now()}`;\n return scheduleTask({\n id: jobId,\n runAt: input.publishAt,\n task: async () => X.postTweet({ text: input.text })\n });\n }\n}\n","import { createReadStream, statSync } from \"node:fs\";\nimport path from \"node:path\";\n\nexport function getFileMeta(filePath: string): {\n fileName: string;\n fileSize: number;\n} {\n const stat = statSync(filePath);\n return {\n fileName: path.basename(filePath),\n fileSize: stat.size\n };\n}\n\nexport function createUploadStream(filePath: string) {\n return createReadStream(filePath);\n}\n","import { env } from \"../config/env.js\";\nimport { SocialError } from \"../errors/SocialError.js\";\nimport { metaCall } from \"./shared/metaClient.js\";\nimport { scheduleTask } from \"../utils/scheduler.js\";\nimport { validatePlatformInput } from \"../validation/platformSchemas.js\";\n\nfunction pageIdOrThrow(inputPageId?: string): string {\n const pageId = inputPageId ?? env.meta.fbPageId;\n if (!pageId) {\n throw new SocialError({\n platform: \"facebook\",\n endpoint: \"page-id\",\n message: \"Missing FB_PAGE_ID (or pass pageId explicitly).\"\n });\n }\n return pageId;\n}\n\nexport class Facebook {\n static async publishToPage(input: {\n pageId?: string;\n message: string;\n link?: string;\n photoUrl?: string;\n }) {\n validatePlatformInput(\"facebook\", \"publishToPage\", input);\n const pageId = pageIdOrThrow(input.pageId);\n return metaCall({\n platform: \"facebook\",\n method: \"POST\",\n endpoint: `/${pageId}/feed`,\n body: {\n message: input.message,\n link: input.link,\n picture: input.photoUrl\n }\n });\n }\n\n static async publishPhoto(input: { pageId?: string; url: string; caption?: string }) {\n validatePlatformInput(\"facebook\", \"publishPhoto\", input);\n const pageId = pageIdOrThrow(input.pageId);\n return metaCall({\n platform: \"facebook\",\n method: \"POST\",\n endpoint: `/${pageId}/photos`,\n body: { url: input.url, caption: input.caption }\n });\n }\n\n static async publishVideo(input: { pageId?: string; fileUrl: string; description?: string; title?: string }) {\n validatePlatformInput(\"facebook\", \"publishVideo\", input);\n const pageId = pageIdOrThrow(input.pageId);\n return metaCall({\n platform: \"facebook\",\n method: \"POST\",\n endpoint: `/${pageId}/videos`,\n body: {\n file_url: input.fileUrl,\n description: input.description,\n title: input.title\n }\n });\n }\n\n static async publishCarousel(input: { pageId?: string; message: string; photoUrls: string[] }) {\n validatePlatformInput(\"facebook\", \"publishCarousel\", input);\n const pageId = pageIdOrThrow(input.pageId);\n const mediaIds: string[] = [];\n for (const url of input.photoUrls) {\n const media = (await metaCall<{ id: string }>({\n platform: \"facebook\",\n method: \"POST\",\n endpoint: `/${pageId}/photos`,\n body: { url, published: false }\n })) as { id: string };\n mediaIds.push(media.id);\n }\n return metaCall({\n platform: \"facebook\",\n method: \"POST\",\n endpoint: `/${pageId}/feed`,\n body: {\n message: input.message,\n attached_media: mediaIds.map((id) => ({ media_fbid: id }))\n }\n });\n }\n\n static async publishStory(input: { pageId?: string; photoUrl: string }) {\n validatePlatformInput(\"facebook\", \"publishStory\", input);\n const pageId = pageIdOrThrow(input.pageId);\n return metaCall({\n platform: \"facebook\",\n method: \"POST\",\n endpoint: `/${pageId}/photo_stories`,\n body: { url: input.photoUrl }\n });\n }\n\n static async schedulePost(input: { pageId?: string; message: string; publishAt: Date | string }) {\n validatePlatformInput(\"facebook\", \"schedulePost\", input);\n const pageId = pageIdOrThrow(input.pageId);\n const publishTime = Math.floor(new Date(input.publishAt).getTime() / 1000);\n return metaCall({\n platform: \"facebook\",\n method: \"POST\",\n endpoint: `/${pageId}/feed`,\n body: {\n message: input.message,\n published: false,\n scheduled_publish_time: publishTime\n }\n });\n }\n\n static async commentOnPost(input: { postId: string; message: string }) {\n validatePlatformInput(\"facebook\", \"commentOnPost\", input);\n return metaCall({\n platform: \"facebook\",\n method: \"POST\",\n endpoint: `/${input.postId}/comments`,\n body: { message: input.message }\n });\n }\n\n static async replyToComment(input: { commentId: string; message: string }) {\n validatePlatformInput(\"facebook\", \"replyToComment\", input);\n return metaCall({\n platform: \"facebook\",\n method: \"POST\",\n endpoint: `/${input.commentId}/comments`,\n body: { message: input.message }\n });\n }\n\n static async likeObject(input: { objectId: string }) {\n validatePlatformInput(\"facebook\", \"likeObject\", input);\n return metaCall({\n platform: \"facebook\",\n method: \"POST\",\n endpoint: `/${input.objectId}/likes`\n });\n }\n\n static async deletePost(input: { objectId: string }) {\n validatePlatformInput(\"facebook\", \"deletePost\", input);\n return metaCall({\n platform: \"facebook\",\n method: \"DELETE\",\n endpoint: `/${input.objectId}`\n });\n }\n\n static async sendPageMessage(input: { recipientPsid: string; message: string; pageId?: string }) {\n validatePlatformInput(\"facebook\", \"sendPageMessage\", input);\n const pageId = pageIdOrThrow(input.pageId);\n return metaCall({\n platform: \"facebook\",\n method: \"POST\",\n endpoint: `/${pageId}/messages`,\n body: {\n recipient: { id: input.recipientPsid },\n message: { text: input.message },\n messaging_type: \"RESPONSE\"\n }\n });\n }\n\n static async getPostInsights(input: { postId: string; metrics?: string[] }) {\n validatePlatformInput(\"facebook\", \"getPostInsights\", input);\n return metaCall({\n platform: \"facebook\",\n method: \"GET\",\n endpoint: `/${input.postId}/insights`,\n query: { metric: (input.metrics ?? [\"post_impressions\", \"post_engaged_users\"]).join(\",\") }\n });\n }\n\n static async getPageInsights(input: { pageId?: string; metrics?: string[]; period?: \"day\" | \"week\" | \"days_28\" }) {\n validatePlatformInput(\"facebook\", \"getPageInsights\", input);\n const pageId = pageIdOrThrow(input.pageId);\n return metaCall({\n platform: \"facebook\",\n method: \"GET\",\n endpoint: `/${pageId}/insights`,\n query: {\n metric: (input.metrics ?? [\"page_impressions\", \"page_engaged_users\"]).join(\",\"),\n period: input.period ?? \"day\"\n }\n });\n }\n\n static async uploadResumableVideo(input: { pageId?: string; fileSize: number; startOffset?: number }) {\n validatePlatformInput(\"facebook\", \"uploadResumableVideo\", input);\n const pageId = pageIdOrThrow(input.pageId);\n return metaCall({\n platform: \"facebook\",\n method: \"POST\",\n endpoint: `/${pageId}/videos`,\n body: {\n upload_phase: \"start\",\n file_size: input.fileSize,\n start_offset: input.startOffset ?? 0\n }\n });\n }\n\n static async listPublishedPosts(input: { pageId?: string; limit?: number }) {\n validatePlatformInput(\"facebook\", \"listPublishedPosts\", input);\n const pageId = pageIdOrThrow(input.pageId);\n return metaCall({\n platform: \"facebook\",\n method: \"GET\",\n endpoint: `/${pageId}/published_posts`,\n query: { limit: input.limit ?? 25 }\n });\n }\n\n static async scheduleInProcess(input: { publishAt: Date | string; action: () => Promise<unknown> }) {\n return scheduleTask({\n id: `facebook-schedule-${Date.now()}`,\n runAt: input.publishAt,\n task: input.action\n });\n }\n}\n","import axios from \"axios\";\nimport { env } from \"../config/env.js\";\nimport { SocialError } from \"../errors/SocialError.js\";\nimport { createUploadStream, getFileMeta } from \"../utils/file.js\";\nimport { withRetries } from \"../utils/retry.js\";\nimport { scheduleTask } from \"../utils/scheduler.js\";\nimport {\n getLinkedInAccessToken,\n getLinkedInHeaders\n} from \"./shared/linkedinAuth.js\";\nimport { validatePlatformInput } from \"../validation/platformSchemas.js\";\n\nconst BASE_URL = \"https://api.linkedin.com/rest\";\n\nfunction authorOrThrow(author?: string): string {\n const resolved = author ?? env.linkedin.orgUrn ?? env.linkedin.personUrn;\n if (!resolved) {\n throw new SocialError({\n platform: \"linkedin\",\n endpoint: \"author\",\n message:\n \"Missing LinkedIn author URN. Set LINKEDIN_ORG_URN or LINKEDIN_PERSON_URN or pass author.\"\n });\n }\n return resolved;\n}\n\nasync function linkedInRequest<T = unknown>(params: {\n endpoint: string;\n method: \"GET\" | \"POST\" | \"DELETE\";\n data?: unknown;\n query?: Record<string, string | number>;\n headers?: Record<string, string>;\n}): Promise<T> {\n await getLinkedInAccessToken();\n return withRetries({\n platform: \"linkedin\",\n endpoint: params.endpoint,\n execute: async () => {\n try {\n const response = await axios.request<T>({\n url: `${BASE_URL}${params.endpoint}`,\n method: params.method,\n params: params.query,\n data: params.data,\n headers: { ...getLinkedInHeaders(), ...(params.headers ?? {}) }\n });\n return response.data;\n } catch (error) {\n throw SocialError.normalize({\n platform: \"linkedin\",\n endpoint: params.endpoint,\n error\n });\n }\n }\n });\n}\n\nexport class LinkedIn {\n static async createTextPost(input: { author?: string; text: string; visibility?: \"PUBLIC\" | \"CONNECTIONS\" }) {\n validatePlatformInput(\"linkedin\", \"createTextPost\", input);\n const author = authorOrThrow(input.author);\n return linkedInRequest({\n endpoint: \"/posts\",\n method: \"POST\",\n data: {\n author,\n commentary: input.text,\n visibility: input.visibility ?? \"PUBLIC\",\n distribution: { feedDistribution: \"MAIN_FEED\", targetEntities: [], thirdPartyDistributionChannels: [] },\n lifecycleState: \"PUBLISHED\",\n isReshareDisabledByAuthor: false\n }\n });\n }\n\n static async createImagePost(input: { author?: string; text: string; mediaUrn: string }) {\n validatePlatformInput(\"linkedin\", \"createImagePost\", input);\n const author = authorOrThrow(input.author);\n return linkedInRequest({\n endpoint: \"/posts\",\n method: \"POST\",\n data: {\n author,\n commentary: input.text,\n visibility: \"PUBLIC\",\n content: { media: { id: input.mediaUrn } },\n lifecycleState: \"PUBLISHED\"\n }\n });\n }\n\n static async createVideoPost(input: { author?: string; text: string; mediaUrn: string }) {\n validatePlatformInput(\"linkedin\", \"createVideoPost\", input);\n return LinkedIn.createImagePost(input);\n }\n\n static async createCarouselPost(input: { author?: string; text: string; mediaUrns: string[] }) {\n validatePlatformInput(\"linkedin\", \"createCarouselPost\", input);\n const author = authorOrThrow(input.author);\n return linkedInRequest({\n endpoint: \"/posts\",\n method: \"POST\",\n data: {\n author,\n commentary: input.text,\n visibility: \"PUBLIC\",\n content: {\n multiImage: {\n images: input.mediaUrns.map((urn) => ({ id: urn }))\n }\n },\n lifecycleState: \"PUBLISHED\"\n }\n });\n }\n\n static async schedulePost(input: { author?: string; text: string; publishAt: Date | string }) {\n validatePlatformInput(\"linkedin\", \"schedulePost\", input);\n return scheduleTask({\n id: `linkedin-schedule-${Date.now()}`,\n runAt: input.publishAt,\n task: async () => LinkedIn.createTextPost({ author: input.author, text: input.text })\n });\n }\n\n static async commentOnPost(input: { actor?: string; objectUrn: string; message: string }) {\n validatePlatformInput(\"linkedin\", \"commentOnPost\", input);\n const actor = authorOrThrow(input.actor);\n return linkedInRequest({\n endpoint: \"/socialActions/comments\",\n method: \"POST\",\n data: {\n actor,\n object: input.objectUrn,\n message: { text: input.message }\n }\n });\n }\n\n static async replyToComment(input: { actor?: string; parentCommentUrn: string; message: string }) {\n validatePlatformInput(\"linkedin\", \"replyToComment\", input);\n const actor = authorOrThrow(input.actor);\n return linkedInRequest({\n endpoint: \"/socialActions/comments\",\n method: \"POST\",\n data: {\n actor,\n object: input.parentCommentUrn,\n message: { text: input.message }\n }\n });\n }\n\n static async deleteComment(input: { encodedCommentUrn: string }) {\n validatePlatformInput(\"linkedin\", \"deleteComment\", input);\n return linkedInRequest({\n endpoint: `/socialActions/comments/${encodeURIComponent(input.encodedCommentUrn)}`,\n method: \"DELETE\"\n });\n }\n\n static async likePost(input: { actor?: string; objectUrn: string }) {\n validatePlatformInput(\"linkedin\", \"likePost\", input);\n const actor = authorOrThrow(input.actor);\n return linkedInRequest({\n endpoint: \"/socialActions/likes\",\n method: \"POST\",\n data: { actor, object: input.objectUrn }\n });\n }\n\n static async unlikePost(input: { actorUrn?: string; encodedObjectUrn: string }) {\n validatePlatformInput(\"linkedin\", \"unlikePost\", input);\n const actorUrn = authorOrThrow(input.actorUrn);\n const encodedActor = encodeURIComponent(actorUrn);\n return linkedInRequest({\n endpoint: `/socialActions/${encodeURIComponent(input.encodedObjectUrn)}/likes/${encodedActor}`,\n method: \"DELETE\"\n });\n }\n\n static async sendDirectMessage(input: { actor?: string; recipientUrn: string; text: string }) {\n validatePlatformInput(\"linkedin\", \"sendDirectMessage\", input);\n const actor = authorOrThrow(input.actor);\n return linkedInRequest({\n endpoint: \"/messages\",\n method: \"POST\",\n data: {\n from: actor,\n recipients: [input.recipientUrn],\n body: input.text\n }\n });\n }\n\n static async getPostAnalytics(input: { postUrn: string }) {\n validatePlatformInput(\"linkedin\", \"getPostAnalytics\", input);\n return linkedInRequest({\n endpoint: \"/organizationalEntityShareStatistics\",\n method: \"GET\",\n query: {\n q: \"organizationalEntity\",\n organizationalEntity: input.postUrn\n }\n });\n }\n\n static async getOrganizationAnalytics(input: { orgUrn?: string }) {\n validatePlatformInput(\"linkedin\", \"getOrganizationAnalytics\", input);\n const orgUrn = input.orgUrn ?? env.linkedin.orgUrn;\n if (!orgUrn) {\n throw new SocialError({\n platform: \"linkedin\",\n endpoint: \"organization-analytics\",\n message: \"Missing LINKEDIN_ORG_URN or orgUrn input.\"\n });\n }\n return linkedInRequest({\n endpoint: \"/organizationalEntityFollowerStatistics\",\n method: \"GET\",\n query: { q: \"organizationalEntity\", organizationalEntity: orgUrn }\n });\n }\n\n static async registerUpload(input: {\n owner?: string;\n mediaType: \"image\" | \"video\";\n fileSize: number;\n }) {\n validatePlatformInput(\"linkedin\", \"registerUpload\", input);\n const owner = authorOrThrow(input.owner);\n return linkedInRequest<{\n value: {\n uploadMechanism: Record<string, unknown>;\n asset: string;\n };\n }>({\n endpoint: \"/assets?action=registerUpload\",\n method: \"POST\",\n data: {\n registerUploadRequest: {\n recipes:\n input.mediaType === \"image\"\n ? [\"urn:li:digitalmediaRecipe:feedshare-image\"]\n : [\"urn:li:digitalmediaRecipe:feedshare-video\"],\n owner,\n serviceRelationships: [\n {\n relationshipType: \"OWNER\",\n identifier: \"urn:li:userGeneratedContent\"\n }\n ],\n supportedUploadMechanism: [\"SYNCHRONOUS_UPLOAD\"]\n }\n }\n });\n }\n\n static async uploadBinary(input: { uploadUrl: string; mediaPath: string }) {\n validatePlatformInput(\"linkedin\", \"uploadBinary\", input);\n const { fileSize } = getFileMeta(input.mediaPath);\n await getLinkedInAccessToken();\n return withRetries({\n platform: \"linkedin\",\n endpoint: \"uploadBinary\",\n execute: async () =>\n axios.put(input.uploadUrl, createUploadStream(input.mediaPath), {\n maxBodyLength: Infinity,\n headers: {\n Authorization: getLinkedInHeaders().Authorization,\n \"Content-Length\": String(fileSize)\n }\n })\n });\n }\n\n static async deletePost(input: { encodedPostUrn: string }) {\n validatePlatformInput(\"linkedin\", \"deletePost\", input);\n return linkedInRequest({\n endpoint: `/posts/${encodeURIComponent(input.encodedPostUrn)}`,\n method: \"DELETE\"\n });\n }\n}\n","import axios from \"axios\";\nimport { env } from \"../../config/env.js\";\nimport { SocialError } from \"../../errors/SocialError.js\";\n\nconst LINKEDIN_TOKEN_URL = \"https://www.linkedin.com/oauth/v2/accessToken\";\n\nlet accessTokenCache = env.linkedin.accessToken;\nlet expiryEpochMs = 0;\n\nexport function getLinkedInHeaders(): Record<string, string> {\n return {\n Authorization: `Bearer ${accessTokenCache}`,\n \"Content-Type\": \"application/json\",\n \"Linkedin-Version\": env.linkedin.apiVersion,\n \"X-Restli-Protocol-Version\": \"2.0.0\"\n };\n}\n\nexport async function getLinkedInAccessToken(): Promise<string> {\n const stillValid =\n accessTokenCache.length > 0 && Date.now() < expiryEpochMs - 30_000;\n\n if (stillValid) {\n return accessTokenCache;\n }\n\n if (!env.linkedin.refreshToken) {\n if (!accessTokenCache) {\n throw new SocialError({\n platform: \"linkedin\",\n endpoint: \"oauth/token\",\n message:\n \"Missing LinkedIn credentials. Provide LINKEDIN_ACCESS_TOKEN or refresh-token credentials.\"\n });\n }\n return accessTokenCache;\n }\n\n if (!env.linkedin.clientId || !env.linkedin.clientSecret) {\n throw new SocialError({\n platform: \"linkedin\",\n endpoint: \"oauth/token\",\n message:\n \"Missing LINKEDIN_CLIENT_ID or LINKEDIN_CLIENT_SECRET for token refresh.\"\n });\n }\n\n const body = new URLSearchParams({\n grant_type: \"refresh_token\",\n refresh_token: env.linkedin.refreshToken,\n client_id: env.linkedin.clientId,\n client_secret: env.linkedin.clientSecret\n });\n\n try {\n const response = await axios.post<{\n access_token: string;\n expires_in: number;\n }>(LINKEDIN_TOKEN_URL, body.toString(), {\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" }\n });\n\n accessTokenCache = response.data.access_token;\n expiryEpochMs = Date.now() + response.data.expires_in * 1000;\n return accessTokenCache;\n } catch (error) {\n throw SocialError.normalize({\n platform: \"linkedin\",\n endpoint: \"oauth/token\",\n error\n });\n }\n}\n","import axios from \"axios\";\nimport { env } from \"../config/env.js\";\nimport { SocialError } from \"../errors/SocialError.js\";\nimport { createUploadStream, getFileMeta } from \"../utils/file.js\";\nimport { withRetries } from \"../utils/retry.js\";\nimport { scheduleTask } from \"../utils/scheduler.js\";\nimport { validatePlatformInput } from \"../validation/platformSchemas.js\";\n\nconst YT_API_BASE = \"https://www.googleapis.com/youtube/v3\";\nconst YT_UPLOAD_BASE = \"https://www.googleapis.com/upload/youtube/v3\";\nconst YT_ANALYTICS_BASE = \"https://youtubeanalytics.googleapis.com/v2\";\n\nfunction authHeader() {\n if (!env.youtube.accessToken) {\n throw new SocialError({\n platform: \"youtube\",\n endpoint: \"auth\",\n message: \"Missing YOUTUBE_ACCESS_TOKEN.\"\n });\n }\n return { Authorization: `Bearer ${env.youtube.accessToken}` };\n}\n\nasync function youtubeRequest<T = unknown>(params: {\n endpoint: string;\n method: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\";\n data?: unknown;\n query?: Record<string, unknown>;\n upload?: boolean;\n}): Promise<T> {\n return withRetries({\n platform: \"youtube\",\n endpoint: params.endpoint,\n execute: async () => {\n try {\n const response = await axios.request<T>({\n baseURL: params.upload ? YT_UPLOAD_BASE : YT_API_BASE,\n url: params.endpoint,\n method: params.method,\n params: params.query,\n data: params.data,\n headers: {\n ...authHeader(),\n \"Content-Type\": \"application/json\"\n }\n });\n return response.data;\n } catch (error) {\n throw SocialError.normalize({\n platform: \"youtube\",\n endpoint: params.endpoint,\n error\n });\n }\n }\n });\n}\n\nexport class YouTube {\n static async createVideoUploadSession(input: {\n title: string;\n description?: string;\n privacyStatus?: \"private\" | \"public\" | \"unlisted\";\n }) {\n validatePlatformInput(\"youtube\", \"createVideoUploadSession\", input);\n return youtubeRequest({\n endpoint: \"/videos\",\n method: \"POST\",\n query: { part: \"snippet,status\", uploadType: \"resumable\" },\n data: {\n snippet: {\n title: input.title,\n description: input.description ?? \"\"\n },\n status: { privacyStatus: input.privacyStatus ?? \"private\" }\n },\n upload: true\n });\n }\n\n static async uploadBinary(input: { uploadUrl: string; mediaPath: string }) {\n validatePlatformInput(\"youtube\", \"uploadBinary\", input);\n const { fileSize } = getFileMeta(input.mediaPath);\n return withRetries({\n platform: \"youtube\",\n endpoint: \"uploadBinary\",\n execute: async () =>\n axios.put(input.uploadUrl, createUploadStream(input.mediaPath), {\n maxBodyLength: Infinity,\n headers: {\n ...authHeader(),\n \"Content-Length\": String(fileSize),\n \"Content-Type\": \"application/octet-stream\"\n }\n })\n });\n }\n\n static async listMyVideos(input: { maxResults?: number }) {\n validatePlatformInput(\"youtube\", \"listMyVideos\", input);\n return youtubeRequest({\n endpoint: \"/search\",\n method: \"GET\",\n query: {\n part: \"snippet\",\n forMine: true,\n type: \"video\",\n maxResults: input.maxResults ?? 25\n }\n });\n }\n\n static async updateVideoMetadata(input: {\n videoId: string;\n title?: string;\n description?: string;\n privacyStatus?: \"private\" | \"public\" | \"unlisted\";\n }) {\n validatePlatformInput(\"youtube\", \"updateVideoMetadata\", input);\n return youtubeRequest({\n endpoint: \"/videos\",\n method: \"PUT\",\n query: { part: \"snippet,status\" },\n data: {\n id: input.videoId,\n snippet: {\n title: input.title,\n description: input.description\n },\n status: {\n privacyStatus: input.privacyStatus\n }\n }\n });\n }\n\n static async deleteVideo(input: { videoId: string }) {\n validatePlatformInput(\"youtube\", \"deleteVideo\", input);\n return youtubeRequest({\n endpoint: \"/videos\",\n method: \"DELETE\",\n query: { id: input.videoId }\n });\n }\n\n static async commentOnVideo(input: { videoId: string; text: string }) {\n validatePlatformInput(\"youtube\", \"commentOnVideo\", input);\n return youtubeRequest({\n endpoint: \"/commentThreads\",\n method: \"POST\",\n query: { part: \"snippet\" },\n data: {\n snippet: {\n videoId: input.videoId,\n topLevelComment: {\n snippet: { textOriginal: input.text }\n }\n }\n }\n });\n }\n\n static async replyToComment(input: { parentCommentId: string; text: string }) {\n validatePlatformInput(\"youtube\", \"replyToComment\", input);\n return youtubeRequest({\n endpoint: \"/comments\",\n method: \"POST\",\n query: { part: \"snippet\" },\n data: {\n snippet: {\n parentId: input.parentCommentId,\n textOriginal: input.text\n }\n }\n });\n }\n\n static async likeVideo(input: { videoId: string }) {\n validatePlatformInput(\"youtube\", \"likeVideo\", input);\n return youtubeRequest({\n endpoint: \"/videos/rate\",\n method: \"POST\",\n query: { id: input.videoId, rating: \"like\" }\n });\n }\n\n static async unlikeVideo(input: { videoId: string }) {\n validatePlatformInput(\"youtube\", \"unlikeVideo\", input);\n return youtubeRequest({\n endpoint: \"/videos/rate\",\n method: \"POST\",\n query: { id: input.videoId, rating: \"none\" }\n });\n }\n\n static async createPlaylist(input: {\n title: string;\n description?: string;\n privacyStatus?: \"private\" | \"public\" | \"unlisted\";\n }) {\n validatePlatformInput(\"youtube\", \"createPlaylist\", input);\n return youtubeRequest({\n endpoint: \"/playlists\",\n method: \"POST\",\n query: { part: \"snippet,status\" },\n data: {\n snippet: {\n title: input.title,\n description: input.description ?? \"\"\n },\n status: { privacyStatus: input.privacyStatus ?? \"private\" }\n }\n });\n }\n\n static async addVideoToPlaylist(input: { playlistId: string; videoId: string }) {\n validatePlatformInput(\"youtube\", \"addVideoToPlaylist\", input);\n return youtubeRequest({\n endpoint: \"/playlistItems\",\n method: \"POST\",\n query: { part: \"snippet\" },\n data: {\n snippet: {\n playlistId: input.playlistId,\n resourceId: {\n kind: \"youtube#video\",\n videoId: input.videoId\n }\n }\n }\n });\n }\n\n static async getChannelAnalytics(input: {\n startDate: string;\n endDate: string;\n metrics?: string;\n }) {\n validatePlatformInput(\"youtube\", \"getChannelAnalytics\", input);\n return withRetries({\n platform: \"youtube\",\n endpoint: \"/reports\",\n execute: async () => {\n const response = await axios.get(`${YT_ANALYTICS_BASE}/reports`, {\n params: {\n ids: `channel==${env.youtube.channelId}`,\n startDate: input.startDate,\n endDate: input.endDate,\n metrics: input.metrics ?? \"views,likes,comments,estimatedMinutesWatched\"\n },\n headers: authHeader()\n });\n return response.data;\n }\n });\n }\n\n static async scheduleVideoMetadataUpdate(input: {\n videoId: string;\n title?: string;\n description?: string;\n privacyStatus?: \"private\" | \"public\" | \"unlisted\";\n publishAt: Date | string;\n }) {\n validatePlatformInput(\"youtube\", \"scheduleVideoMetadataUpdate\", input);\n return scheduleTask({\n id: `youtube-schedule-${Date.now()}`,\n runAt: input.publishAt,\n task: async () =>\n YouTube.updateVideoMetadata({\n videoId: input.videoId,\n title: input.title,\n description: input.description,\n privacyStatus: input.privacyStatus\n })\n });\n }\n}\n","import axios from \"axios\";\nimport { env } from \"../config/env.js\";\nimport { SocialError } from \"../errors/SocialError.js\";\nimport { withRetries } from \"../utils/retry.js\";\nimport { scheduleTask } from \"../utils/scheduler.js\";\nimport { validatePlatformInput } from \"../validation/platformSchemas.js\";\n\nconst TIKTOK_API_BASE = \"https://open.tiktokapis.com/v2\";\n\nfunction tiktokHeaders() {\n if (!env.tiktok.accessToken) {\n throw new SocialError({\n platform: \"tiktok\",\n endpoint: \"auth\",\n message: \"Missing TIKTOK_ACCESS_TOKEN.\"\n });\n }\n return {\n Authorization: `Bearer ${env.tiktok.accessToken}`,\n \"Content-Type\": \"application/json\"\n };\n}\n\nasync function tikTokRequest<T = unknown>(params: {\n endpoint: string;\n method: \"GET\" | \"POST\" | \"DELETE\";\n data?: unknown;\n query?: Record<string, unknown>;\n}): Promise<T> {\n return withRetries({\n platform: \"tiktok\",\n endpoint: params.endpoint,\n execute: async () => {\n try {\n const response = await axios.request<T>({\n baseURL: TIKTOK_API_BASE,\n url: params.endpoint,\n method: params.method,\n params: params.query,\n data: params.data,\n headers: tiktokHeaders()\n });\n return response.data;\n } catch (error) {\n throw SocialError.normalize({\n platform: \"tiktok\",\n endpoint: params.endpoint,\n error\n });\n }\n }\n });\n}\n\nexport class TikTok {\n static async createPost(input: {\n text: string;\n visibility?: \"PUBLIC_TO_EVERYONE\" | \"MUTUAL_FOLLOW_FRIENDS\" | \"SELF_ONLY\";\n }) {\n validatePlatformInput(\"tiktok\", \"createPost\", input);\n return tikTokRequest({\n endpoint: \"/post/publish/inbox/video/init/\",\n method: \"POST\",\n data: {\n post_info: {\n title: input.text,\n privacy_level: input.visibility ?? \"PUBLIC_TO_EVERYONE\"\n },\n source_info: {\n source: \"PULL_FROM_URL\",\n video_url: \"\"\n }\n }\n });\n }\n\n static async createVideoPost(input: {\n title: string;\n videoUrl: string;\n visibility?: \"PUBLIC_TO_EVERYONE\" | \"MUTUAL_FOLLOW_FRIENDS\" | \"SELF_ONLY\";\n }) {\n validatePlatformInput(\"tiktok\", \"createVideoPost\", input);\n return tikTokRequest({\n endpoint: \"/post/publish/video/init/\",\n method: \"POST\",\n data: {\n post_info: {\n title: input.title,\n privacy_level: input.visibility ?? \"PUBLIC_TO_EVERYONE\"\n },\n source_info: {\n source: \"PULL_FROM_URL\",\n video_url: input.videoUrl\n }\n }\n });\n }\n\n static async getPostStatus(input: { publishId: string }) {\n validatePlatformInput(\"tiktok\", \"getPostStatus\", input);\n return tikTokRequest({\n endpoint: \"/post/publish/status/fetch/\",\n method: \"POST\",\n data: { publish_id: input.publishId }\n });\n }\n\n static async listVideos(input: { maxCount?: number }) {\n validatePlatformInput(\"tiktok\", \"listVideos\", input);\n return tikTokRequest({\n endpoint: \"/video/list/\",\n method: \"POST\",\n data: { max_count: input.maxCount ?? 20 }\n });\n }\n\n static async deleteVideo(input: { videoId: string }) {\n validatePlatformInput(\"tiktok\", \"deleteVideo\", input);\n return tikTokRequest({\n endpoint: \"/video/delete/\",\n method: \"POST\",\n data: { video_id: input.videoId }\n });\n }\n\n static async commentOnVideo(input: { videoId: string; text: string }) {\n validatePlatformInput(\"tiktok\", \"commentOnVideo\", input);\n return tikTokRequest({\n endpoint: \"/video/comment/create/\",\n method: \"POST\",\n data: { video_id: input.videoId, text: input.text }\n });\n }\n\n static async replyToComment(input: { commentId: string; text: string }) {\n validatePlatformInput(\"tiktok\", \"replyToComment\", input);\n return tikTokRequest({\n endpoint: \"/video/comment/reply/\",\n method: \"POST\",\n data: { comment_id: input.commentId, text: input.text }\n });\n }\n\n static async likeVideo(input: { videoId: string }) {\n validatePlatformInput(\"tiktok\", \"likeVideo\", input);\n return tikTokRequest({\n endpoint: \"/video/like/\",\n method: \"POST\",\n data: { video_id: input.videoId }\n });\n }\n\n static async unlikeVideo(input: { videoId: string }) {\n validatePlatformInput(\"tiktok\", \"unlikeVideo\", input);\n return tikTokRequest({\n endpoint: \"/video/unlike/\",\n method: \"POST\",\n data: { video_id: input.videoId }\n });\n }\n\n static async getVideoAnalytics(input: { videoIds: string[] }) {\n validatePlatformInput(\"tiktok\", \"getVideoAnalytics\", input);\n return tikTokRequest({\n endpoint: \"/research/video/query/\",\n method: \"POST\",\n data: { filters: { video_ids: input.videoIds } }\n });\n }\n\n static async getProfileAnalytics(input: { fields?: string[] }) {\n validatePlatformInput(\"tiktok\", \"getProfileAnalytics\", input);\n return tikTokRequest({\n endpoint: \"/user/info/\",\n method: \"GET\",\n query: {\n fields: (input.fields ?? [\"display_name\", \"follower_count\", \"video_count\"]).join(\",\")\n }\n });\n }\n\n static async scheduleVideoPost(input: {\n title: string;\n videoUrl: string;\n publishAt: Date | string;\n }) {\n validatePlatformInput(\"tiktok\", \"scheduleVideoPost\", input);\n return scheduleTask({\n id: `tiktok-schedule-${Date.now()}`,\n runAt: input.publishAt,\n task: async () =>\n TikTok.createVideoPost({\n title: input.title,\n videoUrl: input.videoUrl\n })\n });\n }\n}\n","import axios from \"axios\";\nimport { env } from \"../config/env.js\";\nimport { SocialError } from \"../errors/SocialError.js\";\nimport { withRetries } from \"../utils/retry.js\";\nimport { scheduleTask } from \"../utils/scheduler.js\";\nimport { validatePlatformInput } from \"../validation/platformSchemas.js\";\n\nconst PINTEREST_BASE = \"https://api.pinterest.com/v5\";\n\nfunction pinterestHeaders() {\n if (!env.pinterest.accessToken) {\n throw new SocialError({\n platform: \"pinterest\",\n endpoint: \"auth\",\n message: \"Missing PINTEREST_ACCESS_TOKEN.\"\n });\n }\n return {\n Authorization: `Bearer ${env.pinterest.accessToken}`,\n \"Content-Type\": \"application/json\"\n };\n}\n\nasync function pinterestRequest<T = unknown>(params: {\n endpoint: string;\n method: \"GET\" | \"POST\" | \"PATCH\" | \"DELETE\";\n data?: unknown;\n query?: Record<string, unknown>;\n}) {\n return withRetries({\n platform: \"pinterest\",\n endpoint: params.endpoint,\n execute: async () => {\n try {\n const response = await axios.request<T>({\n baseURL: PINTEREST_BASE,\n url: params.endpoint,\n method: params.method,\n params: params.query,\n data: params.data,\n headers: pinterestHeaders()\n });\n return response.data;\n } catch (error) {\n throw SocialError.normalize({\n platform: \"pinterest\",\n endpoint: params.endpoint,\n error\n });\n }\n }\n });\n}\n\nexport class Pinterest {\n static async createPin(input: {\n boardId?: string;\n title: string;\n description?: string;\n link?: string;\n mediaSourceUrl: string;\n }) {\n validatePlatformInput(\"pinterest\", \"createPin\", input);\n return pinterestRequest({\n endpoint: \"/pins\",\n method: \"POST\",\n data: {\n board_id: input.boardId ?? env.pinterest.boardId,\n title: input.title,\n description: input.description,\n link: input.link,\n media_source: {\n source_type: \"image_url\",\n url: input.mediaSourceUrl\n }\n }\n });\n }\n\n static async createVideoPin(input: {\n boardId?: string;\n title: string;\n description?: string;\n mediaSourceUrl: string;\n }) {\n validatePlatformInput(\"pinterest\", \"createVideoPin\", input);\n return pinterestRequest({\n endpoint: \"/pins\",\n method: \"POST\",\n data: {\n board_id: input.boardId ?? env.pinterest.boardId,\n title: input.title,\n description: input.description,\n media_source: {\n source_type: \"video_url\",\n url: input.mediaSourceUrl\n }\n }\n });\n }\n\n static async updatePin(input: {\n pinId: string;\n title?: string;\n description?: string;\n link?: string;\n }) {\n validatePlatformInput(\"pinterest\", \"updatePin\", input);\n return pinterestRequest({\n endpoint: `/pins/${input.pinId}`,\n method: \"PATCH\",\n data: {\n title: input.title,\n description: input.description,\n link: input.link\n }\n });\n }\n\n static async deletePin(input: { pinId: string }) {\n validatePlatformInput(\"pinterest\", \"deletePin\", input);\n return pinterestRequest({\n endpoint: `/pins/${input.pinId}`,\n method: \"DELETE\"\n });\n }\n\n static async listPins(input: { boardId?: string; pageSize?: number }) {\n validatePlatformInput(\"pinterest\", \"listPins\", input);\n return pinterestRequest({\n endpoint: \"/pins\",\n method: \"GET\",\n query: {\n board_id: input.boardId ?? env.pinterest.boardId,\n page_size: input.pageSize ?? 25\n }\n });\n }\n\n static async createBoard(input: {\n name: string;\n description?: string;\n privacy?: \"PUBLIC\" | \"PROTECTED\" | \"SECRET\";\n }) {\n validatePlatformInput(\"pinterest\", \"createBoard\", input);\n return pinterestRequest({\n endpoint: \"/boards\",\n method: \"POST\",\n data: {\n name: input.name,\n description: input.description,\n privacy: input.privacy ?? \"PUBLIC\"\n }\n });\n }\n\n static async listBoards(input: { pageSize?: number }) {\n validatePlatformInput(\"pinterest\", \"listBoards\", input);\n return pinterestRequest({\n endpoint: \"/boards\",\n method: \"GET\",\n query: { page_size: input.pageSize ?? 25 }\n });\n }\n\n static async commentOnPin(input: { pinId: string; text: string }) {\n validatePlatformInput(\"pinterest\", \"commentOnPin\", input);\n return pinterestRequest({\n endpoint: `/pins/${input.pinId}/comments`,\n method: \"POST\",\n data: { text: input.text }\n });\n }\n\n static async replyToComment(input: { pinId: string; commentId: string; text: string }) {\n validatePlatformInput(\"pinterest\", \"replyToComment\", input);\n return pinterestRequest({\n endpoint: `/pins/${input.pinId}/comments/${input.commentId}/replies`,\n method: \"POST\",\n data: { text: input.text }\n });\n }\n\n static async getPinAnalytics(input: { pinId: string; startDate: string; endDate: string }) {\n validatePlatformInput(\"pinterest\", \"getPinAnalytics\", input);\n return pinterestRequest({\n endpoint: `/pins/${input.pinId}/analytics`,\n method: \"GET\",\n query: { start_date: input.startDate, end_date: input.endDate }\n });\n }\n\n static async getAccountAnalytics(input: { startDate: string; endDate: string }) {\n validatePlatformInput(\"pinterest\", \"getAccountAnalytics\", input);\n return pinterestRequest({\n endpoint: \"/user_account/analytics\",\n method: \"GET\",\n query: { start_date: input.startDate, end_date: input.endDate }\n });\n }\n\n static async schedulePin(input: {\n title: string;\n mediaSourceUrl: string;\n boardId?: string;\n publishAt: Date | string;\n }) {\n validatePlatformInput(\"pinterest\", \"schedulePin\", input);\n return scheduleTask({\n id: `pinterest-schedule-${Date.now()}`,\n runAt: input.publishAt,\n task: async () =>\n Pinterest.createPin({\n title: input.title,\n mediaSourceUrl: input.mediaSourceUrl,\n boardId: input.boardId\n })\n });\n }\n}\n","import axios from \"axios\";\nimport { env } from \"../config/env.js\";\nimport { SocialError } from \"../errors/SocialError.js\";\nimport { withRetries } from \"../utils/retry.js\";\nimport { scheduleTask } from \"../utils/scheduler.js\";\nimport { validatePlatformInput } from \"../validation/platformSchemas.js\";\n\nconst DEFAULT_SERVICE = \"https://bsky.social\";\n\nfunction serviceBase() {\n return `${env.bluesky.serviceUrl || DEFAULT_SERVICE}/xrpc`;\n}\n\nlet accessJwt = env.bluesky.accessJwt;\nlet did = \"\";\n\nasync function ensureSession(): Promise<{ accessJwt: string; did: string }> {\n if (accessJwt && did) {\n return { accessJwt, did };\n }\n if (!env.bluesky.identifier || !env.bluesky.appPassword) {\n throw new SocialError({\n platform: \"bluesky\",\n endpoint: \"createSession\",\n message:\n \"Missing Bluesky session credentials. Set BLUESKY_IDENTIFIER and BLUESKY_APP_PASSWORD, or provide BLUESKY_ACCESS_JWT.\"\n });\n }\n const response = await axios.post(`${serviceBase()}/com.atproto.server.createSession`, {\n identifier: env.bluesky.identifier,\n password: env.bluesky.appPassword\n });\n accessJwt = response.data.accessJwt as string;\n did = response.data.did as string;\n return { accessJwt, did };\n}\n\nasync function bskyRequest<T = unknown>(params: {\n endpoint: string;\n method: \"GET\" | \"POST\";\n data?: unknown;\n query?: Record<string, unknown>;\n}) {\n const session = await ensureSession();\n return withRetries({\n platform: \"bluesky\",\n endpoint: params.endpoint,\n execute: async () => {\n try {\n const response = await axios.request<T>({\n baseURL: serviceBase(),\n url: params.endpoint,\n method: params.method,\n params: params.query,\n data: params.data,\n headers: {\n Authorization: `Bearer ${session.accessJwt}`,\n \"Content-Type\": \"application/json\"\n }\n });\n return response.data;\n } catch (error) {\n throw SocialError.normalize({\n platform: \"bluesky\",\n endpoint: params.endpoint,\n error\n });\n }\n }\n });\n}\n\nasync function createRecord(collection: string, record: Record<string, unknown>) {\n const session = await ensureSession();\n return bskyRequest({\n endpoint: \"/com.atproto.repo.createRecord\",\n method: \"POST\",\n data: {\n repo: session.did,\n collection,\n record\n }\n });\n}\n\nexport class Bluesky {\n static async postText(input: { text: string }) {\n validatePlatformInput(\"bluesky\", \"postText\", input);\n return createRecord(\"app.bsky.feed.post\", {\n $type: \"app.bsky.feed.post\",\n text: input.text,\n createdAt: new Date().toISOString()\n });\n }\n\n static async postWithLink(input: { text: string; url: string }) {\n validatePlatformInput(\"bluesky\", \"postWithLink\", input);\n return createRecord(\"app.bsky.feed.post\", {\n $type: \"app.bsky.feed.post\",\n text: `${input.text}\\n${input.url}`,\n createdAt: new Date().toISOString()\n });\n }\n\n static async replyToPost(input: {\n text: string;\n rootUri: string;\n rootCid: string;\n parentUri: string;\n parentCid: string;\n }) {\n validatePlatformInput(\"bluesky\", \"replyToPost\", input);\n return createRecord(\"app.bsky.feed.post\", {\n $type: \"app.bsky.feed.post\",\n text: input.text,\n createdAt: new Date().toISOString(),\n reply: {\n root: { uri: input.rootUri, cid: input.rootCid },\n parent: { uri: input.parentUri, cid: input.parentCid }\n }\n });\n }\n\n static async likePost(input: { subjectUri: string; subjectCid: string }) {\n validatePlatformInput(\"bluesky\", \"likePost\", input);\n return createRecord(\"app.bsky.feed.like\", {\n $type: \"app.bsky.feed.like\",\n subject: { uri: input.subjectUri, cid: input.subjectCid },\n createdAt: new Date().toISOString()\n });\n }\n\n static async repost(input: { subjectUri: string; subjectCid: string }) {\n validatePlatformInput(\"bluesky\", \"repost\", input);\n return createRecord(\"app.bsky.feed.repost\", {\n $type: \"app.bsky.feed.repost\",\n subject: { uri: input.subjectUri, cid: input.subjectCid },\n createdAt: new Date().toISOString()\n });\n }\n\n static async deleteRecord(input: { uri: string }) {\n validatePlatformInput(\"bluesky\", \"deleteRecord\", input);\n const session = await ensureSession();\n const parsed = new URL(input.uri.replace(\"at://\", \"https://\"));\n const parts = parsed.pathname.split(\"/\").filter(Boolean);\n const [collection, rkey] = parts.slice(-2);\n return bskyRequest({\n endpoint: \"/com.atproto.repo.deleteRecord\",\n method: \"POST\",\n data: {\n repo: session.did,\n collection,\n rkey\n }\n });\n }\n\n static async getAuthorFeed(input: { actorDidOrHandle: string; limit?: number }) {\n validatePlatformInput(\"bluesky\", \"getAuthorFeed\", input);\n return bskyRequest({\n endpoint: \"/app.bsky.feed.getAuthorFeed\",\n method: \"GET\",\n query: {\n actor: input.actorDidOrHandle,\n limit: input.limit ?? 25\n }\n });\n }\n\n static async searchPosts(input: { query: string; limit?: number }) {\n validatePlatformInput(\"bluesky\", \"searchPosts\", input);\n return bskyRequest({\n endpoint: \"/app.bsky.feed.searchPosts\",\n method: \"GET\",\n query: { q: input.query, limit: input.limit ?? 25 }\n });\n }\n\n static async getPostThread(input: { uri: string; depth?: number }) {\n validatePlatformInput(\"bluesky\", \"getPostThread\", input);\n return bskyRequest({\n endpoint: \"/app.bsky.feed.getPostThread\",\n method: \"GET\",\n query: { uri: input.uri, depth: input.depth ?? 6 }\n });\n }\n\n static async getNotificationFeed(input: { limit?: number }) {\n validatePlatformInput(\"bluesky\", \"getNotificationFeed\", input);\n return bskyRequest({\n endpoint: \"/app.bsky.notification.listNotifications\",\n method: \"GET\",\n query: { limit: input.limit ?? 25 }\n });\n }\n\n static async schedulePost(input: { text: string; publishAt: Date | string }) {\n validatePlatformInput(\"bluesky\", \"schedulePost\", input);\n return scheduleTask({\n id: `bluesky-schedule-${Date.now()}`,\n runAt: input.publishAt,\n task: async () => Bluesky.postText({ text: input.text })\n });\n }\n}\n","import axios from \"axios\";\nimport { env } from \"../config/env.js\";\nimport { SocialError } from \"../errors/SocialError.js\";\nimport { createUploadStream, getFileMeta } from \"../utils/file.js\";\nimport { withRetries } from \"../utils/retry.js\";\nimport { scheduleTask } from \"../utils/scheduler.js\";\nimport { validatePlatformInput } from \"../validation/platformSchemas.js\";\n\nfunction baseUrl() {\n if (!env.mastodon.baseUrl) {\n throw new SocialError({\n platform: \"mastodon\",\n endpoint: \"baseUrl\",\n message: \"Missing MASTODON_BASE_URL.\"\n });\n }\n return env.mastodon.baseUrl.replace(/\\/$/, \"\");\n}\n\nfunction mastodonHeaders(extra?: Record<string, string>) {\n if (!env.mastodon.accessToken) {\n throw new SocialError({\n platform: \"mastodon\",\n endpoint: \"auth\",\n message: \"Missing MASTODON_ACCESS_TOKEN.\"\n });\n }\n return {\n Authorization: `Bearer ${env.mastodon.accessToken}`,\n ...extra\n };\n}\n\nasync function mastodonRequest<T = unknown>(params: {\n endpoint: string;\n method: \"GET\" | \"POST\" | \"DELETE\";\n data?: unknown;\n query?: Record<string, unknown>;\n headers?: Record<string, string>;\n}) {\n return withRetries({\n platform: \"mastodon\",\n endpoint: params.endpoint,\n execute: async () => {\n try {\n const response = await axios.request<T>({\n baseURL: `${baseUrl()}/api/v1`,\n url: params.endpoint,\n method: params.method,\n params: params.query,\n data: params.data,\n headers: mastodonHeaders(params.headers)\n });\n return response.data;\n } catch (error) {\n throw SocialError.normalize({\n platform: \"mastodon\",\n endpoint: params.endpoint,\n error\n });\n }\n }\n });\n}\n\nexport class Mastodon {\n static async createStatus(input: { text: string; visibility?: \"public\" | \"unlisted\" | \"private\" | \"direct\" }) {\n validatePlatformInput(\"mastodon\", \"createStatus\", input);\n return mastodonRequest({\n endpoint: \"/statuses\",\n method: \"POST\",\n data: {\n status: input.text,\n visibility: input.visibility ?? \"public\"\n }\n });\n }\n\n static async uploadMedia(input: { mediaPath: string; description?: string }) {\n validatePlatformInput(\"mastodon\", \"uploadMedia\", input);\n const { fileSize } = getFileMeta(input.mediaPath);\n\n return withRetries({\n platform: \"mastodon\",\n endpoint: \"/media\",\n execute: async () =>\n axios.post(`${baseUrl()}/api/v2/media`, createUploadStream(input.mediaPath), {\n headers: mastodonHeaders({\n \"Content-Length\": String(fileSize),\n \"Content-Type\": \"application/octet-stream\"\n }),\n maxBodyLength: Infinity\n })\n });\n }\n\n static async createMediaStatus(input: {\n text: string;\n mediaIds: string[];\n visibility?: \"public\" | \"unlisted\" | \"private\" | \"direct\";\n }) {\n validatePlatformInput(\"mastodon\", \"createMediaStatus\", input);\n return mastodonRequest({\n endpoint: \"/statuses\",\n method: \"POST\",\n data: {\n status: input.text,\n media_ids: input.mediaIds,\n visibility: input.visibility ?? \"public\"\n }\n });\n }\n\n static async replyToStatus(input: { statusId: string; text: string }) {\n validatePlatformInput(\"mastodon\", \"replyToStatus\", input);\n return mastodonRequest({\n endpoint: \"/statuses\",\n method: \"POST\",\n data: {\n status: input.text,\n in_reply_to_id: input.statusId\n }\n });\n }\n\n static async deleteStatus(input: { statusId: string }) {\n validatePlatformInput(\"mastodon\", \"deleteStatus\", input);\n return mastodonRequest({\n endpoint: `/statuses/${input.statusId}`,\n method: \"DELETE\"\n });\n }\n\n static async favouriteStatus(input: { statusId: string }) {\n validatePlatformInput(\"mastodon\", \"favouriteStatus\", input);\n return mastodonRequest({\n endpoint: `/statuses/${input.statusId}/favourite`,\n method: \"POST\"\n });\n }\n\n static async unfavouriteStatus(input: { statusId: string }) {\n validatePlatformInput(\"mastodon\", \"unfavouriteStatus\", input);\n return mastodonRequest({\n endpoint: `/statuses/${input.statusId}/unfavourite`,\n method: \"POST\"\n });\n }\n\n static async boostStatus(input: { statusId: string }) {\n validatePlatformInput(\"mastodon\", \"boostStatus\", input);\n return mastodonRequest({\n endpoint: `/statuses/${input.statusId}/reblog`,\n method: \"POST\"\n });\n }\n\n static async unboostStatus(input: { statusId: string }) {\n validatePlatformInput(\"mastodon\", \"unboostStatus\", input);\n return mastodonRequest({\n endpoint: `/statuses/${input.statusId}/unreblog`,\n method: \"POST\"\n });\n }\n\n static async listMyStatuses(input: { limit?: number }) {\n validatePlatformInput(\"mastodon\", \"listMyStatuses\", input);\n const accountId = env.mastodon.accountId;\n if (!accountId) {\n throw new SocialError({\n platform: \"mastodon\",\n endpoint: \"accountId\",\n message: \"Missing MASTODON_ACCOUNT_ID.\"\n });\n }\n return mastodonRequest({\n endpoint: `/accounts/${accountId}/statuses`,\n method: \"GET\",\n query: { limit: input.limit ?? 20 }\n });\n }\n\n static async getStatusContext(input: { statusId: string }) {\n validatePlatformInput(\"mastodon\", \"getStatusContext\", input);\n return mastodonRequest({\n endpoint: `/statuses/${input.statusId}/context`,\n method: \"GET\"\n });\n }\n\n static async getAccountAnalytics(input: { instanceScope?: \"day\" | \"week\" | \"month\" }) {\n validatePlatformInput(\"mastodon\", \"getAccountAnalytics\", input);\n return mastodonRequest({\n endpoint: \"/accounts/verify_credentials\",\n method: \"GET\",\n query: { scope: input.instanceScope ?? \"day\" }\n });\n }\n\n static async scheduleStatus(input: { text: string; publishAt: Date | string }) {\n validatePlatformInput(\"mastodon\", \"scheduleStatus\", input);\n return scheduleTask({\n id: `mastodon-schedule-${Date.now()}`,\n runAt: input.publishAt,\n task: async () => Mastodon.createStatus({ text: input.text })\n });\n }\n}\n","import axios from \"axios\";\nimport { env } from \"../config/env.js\";\nimport { SocialError } from \"../errors/SocialError.js\";\nimport { withRetries } from \"../utils/retry.js\";\nimport { scheduleTask } from \"../utils/scheduler.js\";\nimport { validatePlatformInput } from \"../validation/platformSchemas.js\";\n\nfunction graphBase() {\n return `https://graph.facebook.com/${env.meta.graphVersion}`;\n}\n\nfunction threadsUserIdOrThrow(inputUserId?: string) {\n const userId = inputUserId ?? env.threads.userId;\n if (!userId) {\n throw new SocialError({\n platform: \"threads\",\n endpoint: \"threads-user-id\",\n message: \"Missing THREADS_USER_ID (or pass threadsUserId).\"\n });\n }\n return userId;\n}\n\nfunction threadsTokenOrThrow() {\n const token = env.threads.accessToken || env.meta.igToken;\n if (!token) {\n throw new SocialError({\n platform: \"threads\",\n endpoint: \"threads-token\",\n message: \"Missing THREADS_ACCESS_TOKEN (or IG_ACCESS_TOKEN fallback).\"\n });\n }\n return token;\n}\n\nasync function threadsRequest<T = unknown>(params: {\n endpoint: string;\n method: \"GET\" | \"POST\" | \"DELETE\";\n data?: Record<string, unknown>;\n query?: Record<string, unknown>;\n}): Promise<T> {\n return withRetries({\n platform: \"threads\",\n endpoint: params.endpoint,\n execute: async () => {\n try {\n const response = await axios.request<T>({\n baseURL: graphBase(),\n url: params.endpoint,\n method: params.method,\n params: {\n ...params.query,\n access_token: threadsTokenOrThrow()\n },\n data: params.data\n });\n return response.data;\n } catch (error) {\n throw SocialError.normalize({\n platform: \"threads\",\n endpoint: params.endpoint,\n error\n });\n }\n }\n });\n}\n\nasync function createContainer(params: {\n threadsUserId: string;\n mediaType?: \"TEXT\" | \"IMAGE\" | \"VIDEO\";\n text?: string;\n imageUrl?: string;\n videoUrl?: string;\n replyToId?: string;\n}) {\n return threadsRequest<{ id: string }>({\n endpoint: `/${params.threadsUserId}/threads`,\n method: \"POST\",\n data: {\n media_type: params.mediaType ?? \"TEXT\",\n text: params.text,\n image_url: params.imageUrl,\n video_url: params.videoUrl,\n reply_to_id: params.replyToId\n }\n });\n}\n\nasync function publishContainer(threadsUserId: string, creationId: string) {\n return threadsRequest({\n endpoint: `/${threadsUserId}/threads_publish`,\n method: \"POST\",\n data: { creation_id: creationId }\n });\n}\n\nexport class Threads {\n static async postText(input: { threadsUserId?: string; text: string }) {\n validatePlatformInput(\"threads\", \"postText\", input);\n const threadsUserId = threadsUserIdOrThrow(input.threadsUserId);\n const container = await createContainer({\n threadsUserId,\n mediaType: \"TEXT\",\n text: input.text\n });\n return publishContainer(threadsUserId, container.id);\n }\n\n static async postImage(input: {\n threadsUserId?: string;\n text?: string;\n imageUrl: string;\n }) {\n validatePlatformInput(\"threads\", \"postImage\", input);\n const threadsUserId = threadsUserIdOrThrow(input.threadsUserId);\n const container = await createContainer({\n threadsUserId,\n mediaType: \"IMAGE\",\n text: input.text,\n imageUrl: input.imageUrl\n });\n return publishContainer(threadsUserId, container.id);\n }\n\n static async postVideo(input: {\n threadsUserId?: string;\n text?: string;\n videoUrl: string;\n }) {\n validatePlatformInput(\"threads\", \"postVideo\", input);\n const threadsUserId = threadsUserIdOrThrow(input.threadsUserId);\n const container = await createContainer({\n threadsUserId,\n mediaType: \"VIDEO\",\n text: input.text,\n videoUrl: input.videoUrl\n });\n return publishContainer(threadsUserId, container.id);\n }\n\n static async replyToThread(input: {\n threadsUserId?: string;\n threadId: string;\n text: string;\n }) {\n validatePlatformInput(\"threads\", \"replyToThread\", input);\n const threadsUserId = threadsUserIdOrThrow(input.threadsUserId);\n const container = await createContainer({\n threadsUserId,\n mediaType: \"TEXT\",\n text: input.text,\n replyToId: input.threadId\n });\n return publishContainer(threadsUserId, container.id);\n }\n\n static async deleteThread(input: { threadId: string }) {\n validatePlatformInput(\"threads\", \"deleteThread\", input);\n return threadsRequest({\n endpoint: `/${input.threadId}`,\n method: \"DELETE\"\n });\n }\n\n static async getThread(input: { threadId: string; fields?: string[] }) {\n validatePlatformInput(\"threads\", \"getThread\", input);\n return threadsRequest({\n endpoint: `/${input.threadId}`,\n method: \"GET\",\n query: {\n fields: (input.fields ?? [\"id\", \"text\", \"timestamp\", \"permalink\"]).join(\",\")\n }\n });\n }\n\n static async listMyThreads(input: { threadsUserId?: string; limit?: number }) {\n validatePlatformInput(\"threads\", \"listMyThreads\", input);\n const threadsUserId = threadsUserIdOrThrow(input.threadsUserId);\n return threadsRequest({\n endpoint: `/${threadsUserId}/threads`,\n method: \"GET\",\n query: { limit: input.limit ?? 25 }\n });\n }\n\n static async getThreadInsights(input: { threadId: string; metrics?: string[] }) {\n validatePlatformInput(\"threads\", \"getThreadInsights\", input);\n return threadsRequest({\n endpoint: `/${input.threadId}/insights`,\n method: \"GET\",\n query: {\n metric: (input.metrics ?? [\"views\", \"likes\", \"replies\", \"reposts\"]).join(\",\")\n }\n });\n }\n\n static async getAccountInsights(input: {\n threadsUserId?: string;\n metrics?: string[];\n period?: \"day\" | \"week\" | \"days_28\";\n }) {\n validatePlatformInput(\"threads\", \"getAccountInsights\", input);\n const threadsUserId = threadsUserIdOrThrow(input.threadsUserId);\n return threadsRequest({\n endpoint: `/${threadsUserId}/threads_insights`,\n method: \"GET\",\n query: {\n metric: (input.metrics ?? [\"views\", \"followers_count\", \"likes\"]).join(\",\"),\n period: input.period ?? \"day\"\n }\n });\n }\n\n static async likeThread(input: { threadId: string }) {\n validatePlatformInput(\"threads\", \"likeThread\", input);\n return threadsRequest({\n endpoint: `/${input.threadId}/likes`,\n method: \"POST\"\n });\n }\n\n static async unlikeThread(input: { threadId: string }) {\n validatePlatformInput(\"threads\", \"unlikeThread\", input);\n return threadsRequest({\n endpoint: `/${input.threadId}/likes`,\n method: \"DELETE\"\n });\n }\n\n static async scheduleTextPost(input: {\n threadsUserId?: string;\n text: string;\n publishAt: Date | string;\n }) {\n validatePlatformInput(\"threads\", \"scheduleTextPost\", input);\n return scheduleTask({\n id: `threads-schedule-${Date.now()}`,\n runAt: input.publishAt,\n task: async () =>\n Threads.postText({\n threadsUserId: input.threadsUserId,\n text: input.text\n })\n });\n }\n}\n"],"mappings":"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","names":["axios","axios","axios","axios","axios","axios","axios","axios","axios","axios","axios","axios","axios","axios","publishContainer"]}
package/package.json ADDED
@@ -0,0 +1,75 @@
1
+ {
2
+ "name": "universal-social-sdk",
3
+ "version": "1.0.0",
4
+ "description": "TypeScript-first universal social media SDK for Node.js",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "author": "universal-social-sdk contributors",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "https://github.com/Gabo-Tech/universal-social-sdk.git"
11
+ },
12
+ "keywords": [
13
+ "sdk",
14
+ "social-media",
15
+ "instagram",
16
+ "twitter",
17
+ "x",
18
+ "facebook",
19
+ "linkedin",
20
+ "typescript",
21
+ "ollama"
22
+ ],
23
+ "engines": {
24
+ "node": ">=18.18.0"
25
+ },
26
+ "main": "./dist/index.js",
27
+ "module": "./dist/index.js",
28
+ "types": "./dist/index.d.ts",
29
+ "exports": {
30
+ ".": {
31
+ "types": "./dist/index.d.ts",
32
+ "import": "./dist/index.js"
33
+ }
34
+ },
35
+ "files": [
36
+ "dist",
37
+ "README.md",
38
+ ".env.example",
39
+ "supported-methods.json"
40
+ ],
41
+ "bin": {
42
+ "universal-social-sdk": "./dist/cli/index.js"
43
+ },
44
+ "scripts": {
45
+ "build": "tsup",
46
+ "dev": "tsup --watch",
47
+ "typecheck": "tsc --noEmit",
48
+ "clean": "rimraf dist",
49
+ "test": "vitest run",
50
+ "test:unit": "vitest run tests/unit",
51
+ "test:integration": "vitest run tests/integration",
52
+ "test:watch": "vitest",
53
+ "prepare": "npm run build"
54
+ },
55
+ "dependencies": {
56
+ "axios": "^1.9.0",
57
+ "chalk": "^5.4.1",
58
+ "cheerio": "^1.0.0",
59
+ "commander": "^13.1.0",
60
+ "diff": "^7.0.0",
61
+ "dotenv": "^16.4.7",
62
+ "facebook-nodejs-business-sdk": "^24.0.1",
63
+ "inquirer": "^13.3.0",
64
+ "ora": "^8.2.0",
65
+ "twitter-api-v2": "^1.29.0",
66
+ "zod": "^3.24.2"
67
+ },
68
+ "devDependencies": {
69
+ "@types/node": "^22.13.10",
70
+ "rimraf": "^6.0.1",
71
+ "tsup": "^8.4.0",
72
+ "typescript": "^5.8.2",
73
+ "vitest": "^3.0.9"
74
+ }
75
+ }
@@ -0,0 +1,161 @@
1
+ {
2
+ "updatedAt": "2026-03-07T00:00:00.000Z",
3
+ "platforms": {
4
+ "x": [
5
+ "postTweet",
6
+ "postThread",
7
+ "replyTweet",
8
+ "quoteTweet",
9
+ "deleteTweet",
10
+ "retweet",
11
+ "unretweet",
12
+ "likeTweet",
13
+ "unlikeTweet",
14
+ "uploadMedia",
15
+ "postPhoto",
16
+ "postVideo",
17
+ "postPoll",
18
+ "sendDirectMessage",
19
+ "getTweetAnalytics",
20
+ "scheduleTweet"
21
+ ],
22
+ "facebook": [
23
+ "publishToPage",
24
+ "publishPhoto",
25
+ "publishVideo",
26
+ "publishCarousel",
27
+ "publishStory",
28
+ "schedulePost",
29
+ "commentOnPost",
30
+ "replyToComment",
31
+ "likeObject",
32
+ "deletePost",
33
+ "sendPageMessage",
34
+ "getPostInsights",
35
+ "getPageInsights",
36
+ "uploadResumableVideo",
37
+ "listPublishedPosts"
38
+ ],
39
+ "instagram": [
40
+ "uploadPhoto",
41
+ "uploadVideo",
42
+ "uploadReel",
43
+ "uploadStoryPhoto",
44
+ "uploadStoryVideo",
45
+ "publishCarousel",
46
+ "commentOnMedia",
47
+ "replyToComment",
48
+ "hideComment",
49
+ "deleteComment",
50
+ "deleteMedia",
51
+ "sendPrivateReply",
52
+ "getMediaInsights",
53
+ "getAccountInsights",
54
+ "getPublishingLimit",
55
+ "scheduleReel"
56
+ ],
57
+ "linkedin": [
58
+ "createTextPost",
59
+ "createImagePost",
60
+ "createVideoPost",
61
+ "createCarouselPost",
62
+ "schedulePost",
63
+ "commentOnPost",
64
+ "replyToComment",
65
+ "deleteComment",
66
+ "likePost",
67
+ "unlikePost",
68
+ "sendDirectMessage",
69
+ "getPostAnalytics",
70
+ "getOrganizationAnalytics",
71
+ "registerUpload",
72
+ "uploadBinary",
73
+ "deletePost"
74
+ ],
75
+ "youtube": [
76
+ "createVideoUploadSession",
77
+ "uploadBinary",
78
+ "listMyVideos",
79
+ "updateVideoMetadata",
80
+ "deleteVideo",
81
+ "commentOnVideo",
82
+ "replyToComment",
83
+ "likeVideo",
84
+ "unlikeVideo",
85
+ "createPlaylist",
86
+ "addVideoToPlaylist",
87
+ "getChannelAnalytics",
88
+ "scheduleVideoMetadataUpdate"
89
+ ],
90
+ "tiktok": [
91
+ "createPost",
92
+ "createVideoPost",
93
+ "getPostStatus",
94
+ "listVideos",
95
+ "deleteVideo",
96
+ "commentOnVideo",
97
+ "replyToComment",
98
+ "likeVideo",
99
+ "unlikeVideo",
100
+ "getVideoAnalytics",
101
+ "getProfileAnalytics",
102
+ "scheduleVideoPost"
103
+ ],
104
+ "pinterest": [
105
+ "createPin",
106
+ "createVideoPin",
107
+ "updatePin",
108
+ "deletePin",
109
+ "listPins",
110
+ "createBoard",
111
+ "listBoards",
112
+ "commentOnPin",
113
+ "replyToComment",
114
+ "getPinAnalytics",
115
+ "getAccountAnalytics",
116
+ "schedulePin"
117
+ ],
118
+ "bluesky": [
119
+ "postText",
120
+ "postWithLink",
121
+ "replyToPost",
122
+ "likePost",
123
+ "repost",
124
+ "deleteRecord",
125
+ "getAuthorFeed",
126
+ "searchPosts",
127
+ "getPostThread",
128
+ "getNotificationFeed",
129
+ "schedulePost"
130
+ ],
131
+ "mastodon": [
132
+ "createStatus",
133
+ "uploadMedia",
134
+ "createMediaStatus",
135
+ "replyToStatus",
136
+ "deleteStatus",
137
+ "favouriteStatus",
138
+ "unfavouriteStatus",
139
+ "boostStatus",
140
+ "unboostStatus",
141
+ "listMyStatuses",
142
+ "getStatusContext",
143
+ "getAccountAnalytics",
144
+ "scheduleStatus"
145
+ ],
146
+ "threads": [
147
+ "postText",
148
+ "postImage",
149
+ "postVideo",
150
+ "replyToThread",
151
+ "deleteThread",
152
+ "getThread",
153
+ "listMyThreads",
154
+ "getThreadInsights",
155
+ "getAccountInsights",
156
+ "likeThread",
157
+ "unlikeThread",
158
+ "scheduleTextPost"
159
+ ]
160
+ }
161
+ }