peak6-x-publishing-plugin 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../node_modules/.pnpm/@paperclipai+plugin-sdk@file+.paperclip-sdk+paperclipai-plugin-sdk-1.0.0.tgz_react@19.2.4/node_modules/@paperclipai/plugin-sdk/src/define-plugin.ts", "../node_modules/.pnpm/@paperclipai+plugin-sdk@file+.paperclip-sdk+paperclipai-plugin-sdk-1.0.0.tgz_react@19.2.4/node_modules/@paperclipai/plugin-sdk/src/worker-rpc-host.ts", "../node_modules/.pnpm/@paperclipai+plugin-sdk@file+.paperclip-sdk+paperclipai-plugin-sdk-1.0.0.tgz_react@19.2.4/node_modules/@paperclipai/plugin-sdk/src/protocol.ts", "../src/constants.ts", "../src/pipeline/oauth-manager.ts", "../src/pipeline/x-api-write-client.ts", "../src/pipeline/rate-limiter.ts", "../src/pipeline/approval-gate.ts", "../src/pipeline/thread-publisher.ts", "../src/worker.ts"],
4
+ "sourcesContent": [null, null, null, "export const PLUGIN_ID = \"peak6-labs.x-publishing\";\nexport const PLUGIN_VERSION = \"0.1.2\";\n\nexport const TOOL_NAMES = {\n draftPost: \"draft-post\",\n updateDraft: \"update-draft\",\n publishPost: \"publish-post\",\n replyToTweet: \"reply-to-tweet\",\n quoteTweet: \"quote-tweet\",\n repost: \"repost\",\n schedulePost: \"schedule-post\",\n publishThread: \"publish-thread\",\n draftThread: \"draft-thread\",\n getDrafts: \"get-drafts\",\n getSchedule: \"get-schedule\",\n getPostMetrics: \"get-post-metrics\",\n getAccountStatus: \"get-account-status\",\n setupOauth: \"setup-oauth\",\n} as const;\n\nexport const JOB_KEYS = {\n tokenRefresh: \"token-refresh\",\n publishScheduled: \"publish-scheduled\",\n metricsCapture: \"metrics-capture\",\n staleDraftCleanup: \"stale-draft-cleanup\",\n} as const;\n\nexport const ENTITY_TYPES = {\n draft: \"draft\",\n publishedPost: \"published-post\",\n} as const;\n\nexport const EVENT_NAMES = {\n postPublished: \"post.published\",\n draftCreated: \"draft.created\",\n approvalRequired: \"approval.required\",\n postEngagementMilestone: \"post.engagement-milestone\",\n threadPublished: \"thread.published\",\n} as const;\n\nexport const STATE_KEYS = {\n oauthTokens: \"oauth_tokens\",\n rateLimits: \"rate_limits\",\n} as const;\n\nexport const SLOT_IDS = {\n dashboardWidget: \"x-publishing-dashboard\",\n settingsPage: \"x-publishing-settings\",\n contentPage: \"x-publishing-content\",\n} as const;\n\nexport const EXPORT_NAMES = {\n dashboardWidget: \"DashboardWidget\",\n settingsPage: \"SettingsPage\",\n contentPage: \"ContentPage\",\n} as const;\n\nexport type ApprovalMode = \"required\" | \"optional\" | \"none\";\n\nexport const DEFAULT_CONFIG = {\n company_id: \"\",\n x_handle: \"\",\n x_user_id: \"\",\n oauth_client_id_ref: \"X_OAUTH_CLIENT_ID\",\n oauth_client_secret_ref: \"X_OAUTH_CLIENT_SECRET\",\n daily_post_limit: 25,\n approval_modes: {\n posts: \"none\" as ApprovalMode,\n replies: \"none\" as ApprovalMode,\n quotes: \"none\" as ApprovalMode,\n reposts: \"none\" as ApprovalMode,\n scheduled: \"required\" as ApprovalMode,\n },\n engagement_milestones: [50, 100, 500, 1000],\n metrics_capture_lookback_days: 7,\n alert_agents: [] as Array<{ agentId: string; memoryFile: string | null }>,\n} as const;\n", "import type { PluginContext } from \"@paperclipai/plugin-sdk\";\nimport { STATE_KEYS } from \"../constants.js\";\nimport type { PublishingConfig, TokenState } from \"../types.js\";\n\nconst REFRESH_BUFFER_MS = 5 * 60 * 1000; // 5 minutes\n\nfunction stateKey(key: string) {\n return { scopeKind: \"instance\" as const, stateKey: key };\n}\n\nexport async function getTokens(ctx: PluginContext): Promise<TokenState> {\n const raw = await ctx.state.get(stateKey(STATE_KEYS.oauthTokens));\n if (!raw) throw new Error(\"No OAuth tokens in state\");\n return raw as unknown as TokenState;\n}\n\nexport async function setTokens(ctx: PluginContext, tokens: TokenState): Promise<void> {\n await ctx.state.set(stateKey(STATE_KEYS.oauthTokens), tokens as unknown as Record<string, unknown>);\n}\n\nexport async function refreshTokens(ctx: PluginContext, config: PublishingConfig): Promise<TokenState> {\n const current = await getTokens(ctx);\n const clientId = await ctx.secrets.resolve(config.oauth_client_id_ref);\n const clientSecret = await ctx.secrets.resolve(config.oauth_client_secret_ref);\n\n const resp = await ctx.http.fetch(\"https://api.x.com/2/oauth2/token\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n Authorization: `Basic ${btoa(`${clientId}:${clientSecret}`)}`,\n },\n body: new URLSearchParams({\n grant_type: \"refresh_token\",\n refresh_token: current.refresh_token,\n }).toString(),\n });\n\n if (!resp.ok) {\n const text = await resp.text();\n throw new Error(`Token refresh failed: HTTP ${resp.status} \u2014 ${text}`);\n }\n\n const body = (await resp.json()) as {\n access_token: string;\n refresh_token: string;\n expires_in: number;\n token_type: string;\n };\n\n const newTokens: TokenState = {\n access_token: body.access_token,\n refresh_token: body.refresh_token,\n expires_at: Date.now() + body.expires_in * 1000,\n };\n\n await setTokens(ctx, newTokens);\n return newTokens;\n}\n\nexport async function getValidAccessToken(ctx: PluginContext, config: PublishingConfig): Promise<string> {\n const tokens = await getTokens(ctx);\n\n if (tokens.expires_at - Date.now() < REFRESH_BUFFER_MS) {\n const refreshed = await refreshTokens(ctx, config);\n return refreshed.access_token;\n }\n\n return tokens.access_token;\n}\n", "import type { PluginContext } from \"@paperclipai/plugin-sdk\";\nimport type { RateLimitHeaders } from \"../types.js\";\n\nfunction parseRateLimitHeaders(headers: Headers): RateLimitHeaders {\n const remaining = parseInt(headers.get(\"x-rate-limit-remaining\") || \"99\", 10);\n const resetEpoch = parseInt(headers.get(\"x-rate-limit-reset\") || \"0\", 10);\n return {\n remaining,\n reset_at: resetEpoch * 1000, // X API returns epoch seconds\n };\n}\n\nasync function withRetry<T>(fn: () => Promise<T>, maxRetries = 2): Promise<T> {\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n return await fn();\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n if (attempt < maxRetries && message.includes(\"429\")) {\n const backoffMs = Math.pow(2, attempt + 1) * 1000;\n await new Promise((r) => setTimeout(r, backoffMs));\n continue;\n }\n throw err;\n }\n }\n throw new Error(\"Unreachable\");\n}\n\ntype HttpClient = PluginContext[\"http\"];\n\nexport async function createTweet(\n http: HttpClient,\n token: string,\n params: { text: string; reply_to?: string; quote_tweet_id?: string; media_ids?: string[] },\n): Promise<{ data: { id: string; text: string }; rateLimit: RateLimitHeaders }> {\n return withRetry(async () => {\n const body: Record<string, unknown> = { text: params.text };\n\n if (params.reply_to) {\n body.reply = { in_reply_to_tweet_id: params.reply_to };\n }\n if (params.quote_tweet_id) {\n body.quote_tweet_id = params.quote_tweet_id;\n }\n if (params.media_ids && params.media_ids.length > 0) {\n body.media = { media_ids: params.media_ids };\n }\n\n const resp = await http.fetch(\"https://api.x.com/2/tweets\", {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(body),\n });\n\n if (resp.status === 429) {\n throw new Error(\"429 Rate limited\");\n }\n\n if (resp.status !== 201) {\n const text = await resp.text();\n throw new Error(`Create tweet failed: HTTP ${resp.status} \u2014 ${text}`);\n }\n\n const json = (await resp.json()) as { data: { id: string; text: string } };\n return {\n data: json.data,\n rateLimit: parseRateLimitHeaders(resp.headers),\n };\n });\n}\n\nexport async function deleteTweet(\n http: HttpClient,\n token: string,\n tweetId: string,\n): Promise<{ data: { deleted: boolean }; rateLimit: RateLimitHeaders }> {\n return withRetry(async () => {\n const resp = await http.fetch(`https://api.x.com/2/tweets/${tweetId}`, {\n method: \"DELETE\",\n headers: { Authorization: `Bearer ${token}` },\n });\n\n if (resp.status === 429) {\n throw new Error(\"429 Rate limited\");\n }\n\n if (resp.status !== 200) {\n const text = await resp.text();\n throw new Error(`Delete tweet failed: HTTP ${resp.status} \u2014 ${text}`);\n }\n\n const json = (await resp.json()) as { data: { deleted: boolean } };\n return {\n data: json.data,\n rateLimit: parseRateLimitHeaders(resp.headers),\n };\n });\n}\n\nexport async function repost(\n http: HttpClient,\n token: string,\n userId: string,\n tweetId: string,\n): Promise<{ data: { retweeted: boolean }; rateLimit: RateLimitHeaders }> {\n return withRetry(async () => {\n const resp = await http.fetch(`https://api.x.com/2/users/${userId}/retweets`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ tweet_id: tweetId }),\n });\n\n if (resp.status === 429) {\n throw new Error(\"429 Rate limited\");\n }\n\n if (resp.status !== 200) {\n const text = await resp.text();\n throw new Error(`Repost failed: HTTP ${resp.status} \u2014 ${text}`);\n }\n\n const json = (await resp.json()) as { data: { retweeted: boolean } };\n return {\n data: json.data,\n rateLimit: parseRateLimitHeaders(resp.headers),\n };\n });\n}\n\nexport async function undoRepost(\n http: HttpClient,\n token: string,\n userId: string,\n tweetId: string,\n): Promise<{ data: { retweeted: boolean }; rateLimit: RateLimitHeaders }> {\n return withRetry(async () => {\n const resp = await http.fetch(`https://api.x.com/2/users/${userId}/retweets/${tweetId}`, {\n method: \"DELETE\",\n headers: { Authorization: `Bearer ${token}` },\n });\n\n if (resp.status === 429) {\n throw new Error(\"429 Rate limited\");\n }\n\n if (resp.status !== 200) {\n const text = await resp.text();\n throw new Error(`Undo repost failed: HTTP ${resp.status} \u2014 ${text}`);\n }\n\n const json = (await resp.json()) as { data: { retweeted: boolean } };\n return {\n data: json.data,\n rateLimit: parseRateLimitHeaders(resp.headers),\n };\n });\n}\n", "import type { PluginContext } from \"@paperclipai/plugin-sdk\";\nimport { STATE_KEYS } from \"../constants.js\";\nimport type { RateLimitHeaders, RateLimitState } from \"../types.js\";\n\nfunction stateKey(key: string) {\n return { scopeKind: \"instance\" as const, stateKey: key };\n}\n\nconst DEFAULT_STATE: RateLimitState = {\n post_tweets: { remaining: 99, reset_at: 0 },\n delete_tweets: { remaining: 99, reset_at: 0 },\n retweets: { remaining: 99, reset_at: 0 },\n daily_posts: 0,\n daily_reset_at: 0,\n};\n\nasync function getRateLimitState(ctx: PluginContext): Promise<RateLimitState> {\n const raw = await ctx.state.get(stateKey(STATE_KEYS.rateLimits));\n if (!raw) return { ...DEFAULT_STATE };\n const state = raw as unknown as RateLimitState;\n\n // Reset daily counter if past midnight\n if (state.daily_reset_at && Date.now() > state.daily_reset_at) {\n state.daily_posts = 0;\n state.daily_reset_at = getNextMidnightMs();\n }\n\n return state;\n}\n\nfunction getNextMidnightMs(): number {\n const now = new Date();\n const tomorrow = new Date(now.getFullYear(), now.getMonth(), now.getDate() + 1);\n return tomorrow.getTime();\n}\n\nexport async function updateRateLimits(\n ctx: PluginContext,\n endpoint: \"post_tweets\" | \"delete_tweets\" | \"retweets\",\n headers: RateLimitHeaders,\n): Promise<void> {\n const state = await getRateLimitState(ctx);\n\n state[endpoint] = {\n remaining: headers.remaining,\n reset_at: headers.reset_at,\n };\n\n if (endpoint === \"post_tweets\") {\n state.daily_posts++;\n if (!state.daily_reset_at) {\n state.daily_reset_at = getNextMidnightMs();\n }\n }\n\n await ctx.state.set(stateKey(STATE_KEYS.rateLimits), state as unknown as Record<string, unknown>);\n}\n\nexport async function checkRateLimit(\n ctx: PluginContext,\n endpoint: \"post_tweets\" | \"delete_tweets\" | \"retweets\",\n dailyLimit?: number,\n): Promise<{ ok: boolean; reason?: string }> {\n const state = await getRateLimitState(ctx);\n const limit = state[endpoint];\n\n if (limit.remaining <= 0 && limit.reset_at > Date.now()) {\n const resetIn = Math.ceil((limit.reset_at - Date.now()) / 60000);\n return { ok: false, reason: `Rate limit exhausted for ${endpoint}. Resets in ${resetIn}m.` };\n }\n\n if (dailyLimit && endpoint === \"post_tweets\" && state.daily_posts >= dailyLimit) {\n return { ok: false, reason: `Daily post limit (${dailyLimit}) reached.` };\n }\n\n return { ok: true };\n}\n", "import type { PluginContext } from \"@paperclipai/plugin-sdk\";\nimport type { PublishingConfig, DraftData } from \"../types.js\";\nimport { ENTITY_TYPES, EVENT_NAMES } from \"../constants.js\";\n\ntype ContentType = \"posts\" | \"replies\" | \"quotes\" | \"reposts\" | \"scheduled\";\n\ninterface ApprovalResult {\n allowed: boolean;\n reason?: string;\n}\n\nexport async function checkApproval(\n ctx: PluginContext,\n config: PublishingConfig,\n contentType: ContentType,\n draftId?: string,\n): Promise<ApprovalResult> {\n const mode = config.approval_modes[contentType];\n\n if (mode === \"none\") {\n return { allowed: true };\n }\n\n if (mode === \"optional\") {\n ctx.logger.info(`Approval optional for ${contentType}, proceeding`);\n return { allowed: true };\n }\n\n // mode === \"required\"\n if (!draftId) {\n const issue = await ctx.issues.create({\n companyId: config.company_id,\n title: `Approval required for ${contentType}`,\n description: `Content type \"${contentType}\" requires approval but no draft was provided for review.\\n\\nCreate a draft first, then have it approved before publishing.`,\n });\n await ctx.issues.update(issue.id, { status: \"todo\" as const }, config.company_id);\n\n await ctx.events.emit(EVENT_NAMES.approvalRequired, config.company_id, {\n content_type: contentType,\n reason: \"No draft provided for required approval\",\n });\n\n return { allowed: false, reason: `Approval required for ${contentType}. Create a draft and get it approved first.` };\n }\n\n // Find draft by ID\n const allDrafts = await ctx.entities.list({ entityType: ENTITY_TYPES.draft, limit: 500 });\n const entity = allDrafts.find((e) => e.id === draftId);\n if (!entity) {\n return { allowed: false, reason: `Draft ${draftId} not found.` };\n }\n\n const draft = entity.data as unknown as DraftData;\n if (draft.status === \"approved\") {\n return { allowed: true };\n }\n\n // Draft exists but not approved \u2014 move to in_review\n if (draft.status !== \"in_review\") {\n draft.status = \"in_review\";\n const issue = await ctx.issues.create({\n companyId: config.company_id,\n title: `Review draft: ${draft.text.slice(0, 60)}`,\n description: `Draft ID: ${draftId}\\nFormat: ${draft.format}\\n\\nText:\\n${draft.text}${draft.thread_tweets ? \"\\n\\nThread:\\n\" + draft.thread_tweets.join(\"\\n---\\n\") : \"\"}`,\n });\n await ctx.issues.update(issue.id, { status: \"todo\" as const }, config.company_id);\n\n draft.review_issue_id = issue.id;\n await ctx.entities.upsert({\n entityType: ENTITY_TYPES.draft,\n scopeKind: \"instance\",\n externalId: entity.externalId ?? undefined,\n title: entity.title ?? draft.text.slice(0, 60),\n data: draft as unknown as Record<string, unknown>,\n });\n\n await ctx.events.emit(EVENT_NAMES.approvalRequired, config.company_id, {\n draft_id: draftId,\n content_type: contentType,\n reason: \"Draft submitted for review\",\n });\n }\n\n return { allowed: false, reason: `Draft ${draftId} is ${draft.status}. Approval required before publishing.` };\n}\n", "import type { PluginContext } from \"@paperclipai/plugin-sdk\";\nimport { ENTITY_TYPES } from \"../constants.js\";\nimport type { ContentMetadata, PublishedPostData } from \"../types.js\";\nimport { createTweet } from \"./x-api-write-client.js\";\nimport { updateRateLimits } from \"./rate-limiter.js\";\n\nconst MAX_RETRIES = 3;\n\nexport interface ThreadResult {\n tweetIds: string[];\n partial: boolean;\n}\n\nexport async function publishThread(\n ctx: PluginContext,\n token: string,\n tweets: string[],\n metadata: ContentMetadata,\n companyId: string,\n): Promise<ThreadResult> {\n const tweetIds: string[] = [];\n let replyTo: string | undefined;\n\n for (let i = 0; i < tweets.length; i++) {\n const text = tweets[i]!;\n let posted = false;\n\n for (let attempt = 0; attempt < MAX_RETRIES; attempt++) {\n try {\n const result = await createTweet(ctx.http, token, {\n text,\n reply_to: replyTo,\n });\n await updateRateLimits(ctx, \"post_tweets\", result.rateLimit);\n\n tweetIds.push(result.data.id);\n replyTo = result.data.id;\n\n const published: PublishedPostData = {\n tweet_id: result.data.id,\n text: result.data.text,\n published_at: new Date().toISOString(),\n format: \"thread\",\n thread_tweet_ids: tweetIds.slice(),\n metadata,\n };\n\n await ctx.entities.upsert({\n entityType: ENTITY_TYPES.publishedPost,\n scopeKind: \"instance\",\n externalId: result.data.id,\n title: `Thread ${i + 1}/${tweets.length}: ${text.slice(0, 40)}`,\n data: published as unknown as Record<string, unknown>,\n });\n\n posted = true;\n break;\n } catch (err) {\n ctx.logger.error(`Thread tweet ${i + 1}/${tweets.length} attempt ${attempt + 1} failed`, { error: String(err) });\n if (attempt < MAX_RETRIES - 1) {\n await new Promise((r) => setTimeout(r, Math.pow(2, attempt + 1) * 1000));\n }\n }\n }\n\n if (!posted) {\n const issue = await ctx.issues.create({\n companyId,\n title: `Thread publish failed at tweet ${i + 1}/${tweets.length}`,\n description: `Thread was partially published.\\n\\nPublished tweet IDs: ${tweetIds.join(\", \")}\\n\\nFailed tweet text: ${text}\\n\\nRemaining tweets: ${tweets.length - i}`,\n });\n await ctx.issues.update(issue.id, { status: \"todo\" as const }, companyId);\n\n return { tweetIds, partial: true };\n }\n }\n\n return { tweetIds, partial: false };\n}\n", "import {\n definePlugin,\n runWorker,\n type PluginContext,\n type PluginJobContext,\n type ToolResult,\n} from \"@paperclipai/plugin-sdk\";\nimport {\n DEFAULT_CONFIG,\n ENTITY_TYPES,\n EVENT_NAMES,\n JOB_KEYS,\n STATE_KEYS,\n TOOL_NAMES,\n} from \"./constants.js\";\nimport type {\n PublishingConfig,\n TokenState,\n DraftData,\n PublishedPostData,\n RateLimitState,\n} from \"./types.js\";\nimport { getValidAccessToken, getTokens, setTokens, refreshTokens } from \"./pipeline/oauth-manager.js\";\nimport { createTweet } from \"./pipeline/x-api-write-client.js\";\nimport { repost as apiRepost } from \"./pipeline/x-api-write-client.js\";\nimport { updateRateLimits } from \"./pipeline/rate-limiter.js\";\nimport { checkApproval } from \"./pipeline/approval-gate.js\";\nimport { publishThread } from \"./pipeline/thread-publisher.js\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction stateKey(key: string) {\n return { scopeKind: \"instance\" as const, stateKey: key };\n}\n\nasync function getConfig(ctx: PluginContext): Promise<PublishingConfig> {\n const raw = await ctx.config.get();\n return { ...DEFAULT_CONFIG, ...raw } as unknown as PublishingConfig;\n}\n\ninterface EntityRecord {\n id: string;\n entityType: string;\n externalId: string | null;\n title: string | null;\n status: string | null;\n data: Record<string, unknown>;\n createdAt: string;\n updatedAt: string;\n}\n\nfunction findEntityById<T>(entities: EntityRecord[], id: string): { id: string; data: T; raw: EntityRecord } | null {\n const found = entities.find((e) => e.id === id);\n if (!found) return null;\n return { id: found.id, data: found.data as unknown as T, raw: found };\n}\n\n// ---------------------------------------------------------------------------\n// Tool handlers\n// ---------------------------------------------------------------------------\n\nasync function handleSetupOauth(ctx: PluginContext, params: Record<string, unknown>): Promise<ToolResult> {\n const accessToken = params.access_token as string;\n const refreshToken = params.refresh_token as string;\n const expiresIn = (params.expires_in as number) || 7200;\n\n const tokenState: TokenState = {\n access_token: accessToken,\n refresh_token: refreshToken,\n expires_at: Date.now() + expiresIn * 1000,\n };\n await setTokens(ctx, tokenState);\n\n return { content: `OAuth tokens stored. Expires at ${new Date(tokenState.expires_at).toISOString()}.` };\n}\n\nasync function handleDraftPost(ctx: PluginContext, params: Record<string, unknown>): Promise<ToolResult> {\n const text = params.text as string;\n if (text.length > 280) {\n return { error: `Tweet text exceeds 280 characters (${text.length}).` };\n }\n\n const config = await getConfig(ctx);\n const format = (params.format as string) || \"single\";\n const metadata = (params.metadata as DraftData[\"metadata\"]) || {};\n\n const draft: DraftData = {\n text,\n format: format as DraftData[\"format\"],\n reply_to_tweet_id: params.reply_to_tweet_id as string | undefined,\n quote_tweet_id: params.quote_tweet_id as string | undefined,\n schedule_at: params.schedule_at as string | undefined,\n status: \"draft\",\n metadata,\n };\n\n const entity = await ctx.entities.upsert({\n entityType: ENTITY_TYPES.draft,\n scopeKind: \"instance\",\n title: text.slice(0, 60),\n data: draft as unknown as Record<string, unknown>,\n });\n\n await ctx.events.emit(EVENT_NAMES.draftCreated, config.company_id, {\n draft_id: entity.id,\n format,\n metadata,\n });\n\n return { content: JSON.stringify({ draft_id: entity.id, status: \"draft\", format }) };\n}\n\nasync function handleDraftThread(ctx: PluginContext, params: Record<string, unknown>): Promise<ToolResult> {\n const threadTweets = params.thread_tweets as string[];\n if (!threadTweets || threadTweets.length < 2) {\n return { error: \"Thread must have at least 2 tweets.\" };\n }\n\n for (let i = 0; i < threadTweets.length; i++) {\n if (threadTweets[i]!.length > 280) {\n return { error: `Tweet ${i + 1} exceeds 280 characters (${threadTweets[i]!.length}).` };\n }\n }\n\n const config = await getConfig(ctx);\n const metadata = (params.metadata as DraftData[\"metadata\"]) || {};\n const draft: DraftData = {\n text: threadTweets[0]!,\n format: \"thread\",\n thread_tweets: threadTweets,\n schedule_at: params.schedule_at as string | undefined,\n status: \"draft\",\n metadata,\n };\n\n const entity = await ctx.entities.upsert({\n entityType: ENTITY_TYPES.draft,\n scopeKind: \"instance\",\n title: `Thread: ${threadTweets[0]!.slice(0, 50)}`,\n data: draft as unknown as Record<string, unknown>,\n });\n\n await ctx.events.emit(EVENT_NAMES.draftCreated, config.company_id, {\n draft_id: entity.id,\n format: \"thread\",\n metadata,\n });\n\n return { content: JSON.stringify({ draft_id: entity.id, status: \"draft\", format: \"thread\", tweet_count: threadTweets.length }) };\n}\n\nasync function handleUpdateDraft(ctx: PluginContext, params: Record<string, unknown>): Promise<ToolResult> {\n const draftId = params.draft_id as string;\n const entities = await ctx.entities.list({ entityType: ENTITY_TYPES.draft, limit: 500 });\n const match = findEntityById<DraftData>(entities, draftId);\n if (!match) return { error: `Draft ${draftId} not found.` };\n\n const data = match.data;\n if (params.text !== undefined) data.text = params.text as string;\n if (params.thread_tweets !== undefined) data.thread_tweets = params.thread_tweets as string[];\n if (params.schedule_at !== undefined) data.schedule_at = params.schedule_at as string;\n if (params.metadata !== undefined) data.metadata = { ...data.metadata, ...(params.metadata as DraftData[\"metadata\"]) };\n data.status = \"draft\"; // reset to draft on edit\n\n await ctx.entities.upsert({\n entityType: ENTITY_TYPES.draft,\n scopeKind: \"instance\",\n externalId: match.raw.externalId ?? undefined,\n title: data.text.slice(0, 60),\n data: data as unknown as Record<string, unknown>,\n });\n\n return { content: JSON.stringify({ draft_id: draftId, status: \"draft\", updated: true }) };\n}\n\nasync function handlePublishPost(ctx: PluginContext, params: Record<string, unknown>): Promise<ToolResult> {\n const config = await getConfig(ctx);\n let text = params.text as string | undefined;\n let metadata = (params.metadata as PublishedPostData[\"metadata\"]) || {};\n const draftId = params.draft_id as string | undefined;\n\n if (draftId) {\n const entities = await ctx.entities.list({ entityType: ENTITY_TYPES.draft, limit: 500 });\n const match = findEntityById<DraftData>(entities, draftId);\n if (!match) return { error: `Draft ${draftId} not found.` };\n text = match.data.text;\n metadata = { ...match.data.metadata, ...metadata };\n }\n\n if (!text) return { error: \"No text provided and no draft_id.\" };\n\n const approval = await checkApproval(ctx, config, \"posts\", draftId);\n if (!approval.allowed) return { error: `Blocked: ${approval.reason}` };\n\n const token = await getValidAccessToken(ctx, config);\n const result = await createTweet(ctx.http, token, { text });\n await updateRateLimits(ctx, \"post_tweets\", result.rateLimit);\n\n const published: PublishedPostData = {\n tweet_id: result.data.id,\n text: result.data.text,\n published_at: new Date().toISOString(),\n draft_id: draftId,\n format: \"single\",\n metadata,\n };\n\n await ctx.entities.upsert({\n entityType: ENTITY_TYPES.publishedPost,\n scopeKind: \"instance\",\n externalId: result.data.id,\n title: text.slice(0, 60),\n data: published as unknown as Record<string, unknown>,\n });\n\n await ctx.events.emit(EVENT_NAMES.postPublished, config.company_id, {\n tweet_id: result.data.id, text, format: \"single\", metadata,\n });\n\n return { content: JSON.stringify({ tweet_id: result.data.id, text: result.data.text, status: \"published\" }) };\n}\n\nasync function handleReplyToTweet(ctx: PluginContext, params: Record<string, unknown>): Promise<ToolResult> {\n const config = await getConfig(ctx);\n const tweetId = params.tweet_id as string;\n const text = params.text as string;\n const metadata = (params.metadata as PublishedPostData[\"metadata\"]) || {};\n\n const approval = await checkApproval(ctx, config, \"replies\", params.draft_id as string | undefined);\n if (!approval.allowed) return { error: `Blocked: ${approval.reason}` };\n\n const token = await getValidAccessToken(ctx, config);\n const result = await createTweet(ctx.http, token, { text, reply_to: tweetId });\n await updateRateLimits(ctx, \"post_tweets\", result.rateLimit);\n\n const published: PublishedPostData = {\n tweet_id: result.data.id,\n text: result.data.text,\n published_at: new Date().toISOString(),\n draft_id: params.draft_id as string | undefined,\n format: \"reply\",\n metadata: { ...metadata, source_tweet_id: tweetId },\n };\n\n await ctx.entities.upsert({\n entityType: ENTITY_TYPES.publishedPost,\n scopeKind: \"instance\",\n externalId: result.data.id,\n title: `Reply: ${text.slice(0, 50)}`,\n data: published as unknown as Record<string, unknown>,\n });\n\n await ctx.events.emit(EVENT_NAMES.postPublished, config.company_id, {\n tweet_id: result.data.id, text, format: \"reply\", metadata: published.metadata,\n });\n\n return { content: JSON.stringify({ tweet_id: result.data.id, text: result.data.text, status: \"published\", reply_to: tweetId }) };\n}\n\nasync function handleQuoteTweet(ctx: PluginContext, params: Record<string, unknown>): Promise<ToolResult> {\n const config = await getConfig(ctx);\n const tweetId = params.tweet_id as string;\n const text = params.text as string;\n const metadata = (params.metadata as PublishedPostData[\"metadata\"]) || {};\n\n const approval = await checkApproval(ctx, config, \"quotes\", params.draft_id as string | undefined);\n if (!approval.allowed) return { error: `Blocked: ${approval.reason}` };\n\n const token = await getValidAccessToken(ctx, config);\n const result = await createTweet(ctx.http, token, { text, quote_tweet_id: tweetId });\n await updateRateLimits(ctx, \"post_tweets\", result.rateLimit);\n\n const published: PublishedPostData = {\n tweet_id: result.data.id,\n text: result.data.text,\n published_at: new Date().toISOString(),\n draft_id: params.draft_id as string | undefined,\n format: \"quote\",\n metadata: { ...metadata, source_tweet_id: tweetId },\n };\n\n await ctx.entities.upsert({\n entityType: ENTITY_TYPES.publishedPost,\n scopeKind: \"instance\",\n externalId: result.data.id,\n title: `Quote: ${text.slice(0, 50)}`,\n data: published as unknown as Record<string, unknown>,\n });\n\n await ctx.events.emit(EVENT_NAMES.postPublished, config.company_id, {\n tweet_id: result.data.id, text, format: \"quote\", metadata: published.metadata,\n });\n\n return { content: JSON.stringify({ tweet_id: result.data.id, text: result.data.text, status: \"published\", quoted: tweetId }) };\n}\n\nasync function handleRepost(ctx: PluginContext, params: Record<string, unknown>): Promise<ToolResult> {\n const config = await getConfig(ctx);\n const tweetId = params.tweet_id as string;\n\n const approval = await checkApproval(ctx, config, \"reposts\", params.draft_id as string | undefined);\n if (!approval.allowed) return { error: `Blocked: ${approval.reason}` };\n\n const token = await getValidAccessToken(ctx, config);\n const result = await apiRepost(ctx.http, token, config.x_user_id, tweetId);\n await updateRateLimits(ctx, \"retweets\", result.rateLimit);\n\n const published: PublishedPostData = {\n tweet_id: tweetId,\n text: \"\",\n published_at: new Date().toISOString(),\n draft_id: params.draft_id as string | undefined,\n format: \"repost\",\n metadata: { source_tweet_id: tweetId },\n };\n\n await ctx.entities.upsert({\n entityType: ENTITY_TYPES.publishedPost,\n scopeKind: \"instance\",\n externalId: `repost-${tweetId}`,\n title: `Repost: ${tweetId}`,\n data: published as unknown as Record<string, unknown>,\n });\n\n await ctx.events.emit(EVENT_NAMES.postPublished, config.company_id, {\n tweet_id: tweetId, text: \"\", format: \"repost\", metadata: published.metadata,\n });\n\n return { content: JSON.stringify({ tweet_id: tweetId, status: \"reposted\" }) };\n}\n\nasync function handleSchedulePost(ctx: PluginContext, params: Record<string, unknown>): Promise<ToolResult> {\n const scheduleAt = params.schedule_at as string;\n const draftId = params.draft_id as string | undefined;\n const text = params.text as string | undefined;\n const metadata = (params.metadata as DraftData[\"metadata\"]) || {};\n\n if (draftId) {\n const entities = await ctx.entities.list({ entityType: ENTITY_TYPES.draft, limit: 500 });\n const match = findEntityById<DraftData>(entities, draftId);\n if (!match) return { error: `Draft ${draftId} not found.` };\n match.data.schedule_at = scheduleAt;\n await ctx.entities.upsert({\n entityType: ENTITY_TYPES.draft,\n scopeKind: \"instance\",\n externalId: match.raw.externalId ?? undefined,\n title: match.data.text.slice(0, 60),\n data: match.data as unknown as Record<string, unknown>,\n });\n return { content: JSON.stringify({ draft_id: draftId, schedule_at: scheduleAt, status: \"scheduled\" }) };\n }\n\n if (!text) return { error: \"Provide text or draft_id.\" };\n\n const draft: DraftData = {\n text,\n format: \"single\",\n schedule_at: scheduleAt,\n status: \"draft\",\n metadata,\n };\n\n const entity = await ctx.entities.upsert({\n entityType: ENTITY_TYPES.draft,\n scopeKind: \"instance\",\n title: text.slice(0, 60),\n data: draft as unknown as Record<string, unknown>,\n });\n\n return { content: JSON.stringify({ draft_id: entity.id, schedule_at: scheduleAt, status: \"scheduled\" }) };\n}\n\nasync function handlePublishThread(ctx: PluginContext, params: Record<string, unknown>): Promise<ToolResult> {\n const config = await getConfig(ctx);\n let threadTweets = params.thread_tweets as string[] | undefined;\n let metadata = (params.metadata as PublishedPostData[\"metadata\"]) || {};\n const draftId = params.draft_id as string | undefined;\n\n if (draftId) {\n const entities = await ctx.entities.list({ entityType: ENTITY_TYPES.draft, limit: 500 });\n const match = findEntityById<DraftData>(entities, draftId);\n if (!match) return { error: `Draft ${draftId} not found.` };\n threadTweets = match.data.thread_tweets;\n metadata = { ...match.data.metadata, ...metadata };\n }\n\n if (!threadTweets || threadTweets.length < 2) {\n return { error: \"Thread must have at least 2 tweets.\" };\n }\n\n const approval = await checkApproval(ctx, config, \"posts\", draftId);\n if (!approval.allowed) return { error: `Blocked: ${approval.reason}` };\n\n const token = await getValidAccessToken(ctx, config);\n const result = await publishThread(ctx, token, threadTweets, metadata, config.company_id);\n\n await ctx.events.emit(EVENT_NAMES.threadPublished, config.company_id, {\n tweet_ids: result.tweetIds,\n thread_length: threadTweets.length,\n partial: result.partial,\n });\n\n for (const tweetId of result.tweetIds) {\n await ctx.events.emit(EVENT_NAMES.postPublished, config.company_id, {\n tweet_id: tweetId, text: \"\", format: \"thread\", metadata,\n });\n }\n\n return { content: JSON.stringify({\n tweet_ids: result.tweetIds,\n thread_length: threadTweets.length,\n partial: result.partial,\n status: result.partial ? \"partial\" : \"published\",\n }) };\n}\n\nasync function handleGetDrafts(ctx: PluginContext, params: Record<string, unknown>): Promise<ToolResult> {\n const statusFilter = params.status as string | undefined;\n const limit = (params.limit as number) || 20;\n\n const entities = await ctx.entities.list({ entityType: ENTITY_TYPES.draft, limit: 100 });\n let drafts = entities.map((e) => ({ id: e.id, ...(e.data as unknown as DraftData) }));\n\n if (statusFilter) {\n drafts = drafts.filter((d) => d.status === statusFilter);\n }\n\n return { content: JSON.stringify(drafts.slice(0, limit)) };\n}\n\nasync function handleGetSchedule(ctx: PluginContext, params: Record<string, unknown>): Promise<ToolResult> {\n const limit = (params.limit as number) || 20;\n const entities = await ctx.entities.list({ entityType: ENTITY_TYPES.draft, limit: 100 });\n const scheduled = entities\n .map((e) => ({ id: e.id, ...(e.data as unknown as DraftData) }))\n .filter((d) => d.schedule_at && (d.status === \"draft\" || d.status === \"approved\"))\n .sort((a, b) => (a.schedule_at! > b.schedule_at! ? 1 : -1));\n\n return { content: JSON.stringify(scheduled.slice(0, limit)) };\n}\n\nasync function handleGetPostMetrics(ctx: PluginContext, params: Record<string, unknown>): Promise<ToolResult> {\n const tweetId = params.tweet_id as string;\n const entities = await ctx.entities.list({ entityType: ENTITY_TYPES.publishedPost, limit: 500 });\n const post = entities.find((e) => (e.data as unknown as PublishedPostData).tweet_id === tweetId);\n\n if (!post) return { error: `No published post found for tweet ${tweetId}.` };\n\n const data = post.data as unknown as PublishedPostData;\n return { content: JSON.stringify({\n tweet_id: data.tweet_id,\n text: data.text,\n published_at: data.published_at,\n format: data.format,\n metadata: data.metadata,\n metrics: data.metrics || null,\n }) };\n}\n\nasync function handleGetAccountStatus(ctx: PluginContext, _params: Record<string, unknown>): Promise<ToolResult> {\n const config = await getConfig(ctx);\n\n let tokenHealth = \"unknown\";\n try {\n const tokens = await getTokens(ctx);\n if (tokens.expires_at > Date.now()) {\n const minutesLeft = Math.round((tokens.expires_at - Date.now()) / 60000);\n tokenHealth = `valid (${minutesLeft}m remaining)`;\n } else {\n tokenHealth = \"expired\";\n }\n } catch {\n tokenHealth = \"no tokens stored\";\n }\n\n let rateLimits: RateLimitState | null = null;\n try {\n const raw = await ctx.state.get(stateKey(STATE_KEYS.rateLimits));\n if (raw) rateLimits = raw as unknown as RateLimitState;\n } catch {\n // no rate limit data yet\n }\n\n const today = new Date().toISOString().split(\"T\")[0]!;\n const entities = await ctx.entities.list({ entityType: ENTITY_TYPES.publishedPost, limit: 500 });\n const todayCount = entities.filter((e) => {\n const data = e.data as unknown as PublishedPostData;\n return data.published_at.startsWith(today);\n }).length;\n\n return { content: JSON.stringify({\n x_handle: config.x_handle,\n token_health: tokenHealth,\n daily_posts: { count: todayCount, limit: config.daily_post_limit },\n rate_limits: rateLimits,\n }) };\n}\n\n// ---------------------------------------------------------------------------\n// Job handlers\n// ---------------------------------------------------------------------------\n\nasync function handleTokenRefresh(ctx: PluginContext, _job: PluginJobContext): Promise<void> {\n const config = await getConfig(ctx);\n try {\n await refreshTokens(ctx, config);\n ctx.logger.info(\"Token refresh succeeded\");\n } catch (err) {\n ctx.logger.error(\"Token refresh failed\", { error: String(err) });\n const issue = await ctx.issues.create({\n companyId: config.company_id,\n title: \"OAuth token refresh failed\",\n description: `Token refresh failed at ${new Date().toISOString()}.\\n\\nError: ${String(err)}\\n\\nManual re-auth may be required via setup-oauth tool.`,\n });\n await ctx.issues.update(issue.id, { status: \"todo\" as const }, config.company_id);\n }\n}\n\nasync function handlePublishScheduled(ctx: PluginContext, _job: PluginJobContext): Promise<void> {\n const config = await getConfig(ctx);\n const now = new Date().toISOString();\n const entities = await ctx.entities.list({ entityType: ENTITY_TYPES.draft, limit: 100 });\n const due = entities.filter((e) => {\n const d = e.data as unknown as DraftData;\n return d.schedule_at && d.schedule_at <= now && (d.status === \"approved\" || d.status === \"draft\");\n });\n\n for (const entity of due) {\n const draft = entity.data as unknown as DraftData;\n const approval = await checkApproval(ctx, config, \"scheduled\", entity.id);\n if (!approval.allowed) {\n ctx.logger.info(`Scheduled draft ${entity.id} blocked: ${approval.reason}`);\n continue;\n }\n\n try {\n const token = await getValidAccessToken(ctx, config);\n\n if (draft.format === \"thread\" && draft.thread_tweets) {\n await publishThread(ctx, token, draft.thread_tweets, draft.metadata, config.company_id);\n } else {\n const result = await createTweet(ctx.http, token, {\n text: draft.text,\n reply_to: draft.reply_to_tweet_id,\n quote_tweet_id: draft.quote_tweet_id,\n });\n await updateRateLimits(ctx, \"post_tweets\", result.rateLimit);\n\n await ctx.entities.upsert({\n entityType: ENTITY_TYPES.publishedPost,\n scopeKind: \"instance\",\n externalId: result.data.id,\n title: draft.text.slice(0, 60),\n data: {\n tweet_id: result.data.id,\n text: result.data.text,\n published_at: new Date().toISOString(),\n draft_id: entity.id,\n format: draft.format,\n metadata: draft.metadata,\n } as unknown as Record<string, unknown>,\n });\n\n await ctx.events.emit(EVENT_NAMES.postPublished, config.company_id, {\n tweet_id: result.data.id,\n text: draft.text,\n format: draft.format,\n metadata: draft.metadata,\n });\n }\n\n // Mark draft as published\n draft.status = \"approved\";\n await ctx.entities.upsert({\n entityType: ENTITY_TYPES.draft,\n scopeKind: \"instance\",\n externalId: entity.externalId ?? undefined,\n title: entity.title ?? draft.text.slice(0, 60),\n data: draft as unknown as Record<string, unknown>,\n });\n\n ctx.logger.info(`Published scheduled draft ${entity.id}`);\n } catch (err) {\n ctx.logger.error(`Failed to publish scheduled draft ${entity.id}`, { error: String(err) });\n }\n }\n}\n\nasync function handleMetricsCapture(ctx: PluginContext, _job: PluginJobContext): Promise<void> {\n const config = await getConfig(ctx);\n const lookbackMs = config.metrics_capture_lookback_days * 86400000;\n const cutoff = new Date(Date.now() - lookbackMs).toISOString();\n const entities = await ctx.entities.list({ entityType: ENTITY_TYPES.publishedPost, limit: 500 });\n const recent = entities.filter((e) => {\n const d = e.data as unknown as PublishedPostData;\n return d.published_at >= cutoff && d.format !== \"repost\";\n });\n\n if (recent.length === 0) return;\n\n const tweetIds = recent.map((e) => (e.data as unknown as PublishedPostData).tweet_id);\n const token = await getValidAccessToken(ctx, config);\n\n const batchSize = 100;\n for (let i = 0; i < tweetIds.length; i += batchSize) {\n const batch = tweetIds.slice(i, i + batchSize);\n const url = `https://api.x.com/2/tweets?ids=${batch.join(\",\")}&tweet.fields=public_metrics`;\n const resp = await ctx.http.fetch(url, {\n headers: { Authorization: `Bearer ${token}` },\n });\n\n if (!resp.ok) {\n ctx.logger.error(\"Metrics capture batch failed\", { status: resp.status });\n continue;\n }\n\n const body = (await resp.json()) as { data?: Array<{ id: string; public_metrics: { like_count: number; retweet_count: number; reply_count: number; impression_count?: number } }> };\n if (!body.data) continue;\n\n for (const tweet of body.data) {\n const entity = recent.find((e) => (e.data as unknown as PublishedPostData).tweet_id === tweet.id);\n if (!entity) continue;\n\n const data = entity.data as unknown as PublishedPostData;\n const newMetrics = {\n likes: tweet.public_metrics.like_count,\n retweets: tweet.public_metrics.retweet_count,\n replies: tweet.public_metrics.reply_count,\n impressions: tweet.public_metrics.impression_count || 0,\n captured_at: new Date().toISOString(),\n };\n\n // Check milestones\n const totalEngagement = newMetrics.likes + newMetrics.retweets + newMetrics.replies;\n const prevTotal = data.metrics\n ? data.metrics.likes + data.metrics.retweets + data.metrics.replies\n : 0;\n\n for (const milestone of config.engagement_milestones) {\n if (totalEngagement >= milestone && prevTotal < milestone) {\n await ctx.events.emit(EVENT_NAMES.postEngagementMilestone, config.company_id, {\n tweet_id: tweet.id,\n milestone,\n current_metrics: newMetrics,\n });\n }\n }\n\n data.metrics = newMetrics;\n await ctx.entities.upsert({\n entityType: ENTITY_TYPES.publishedPost,\n scopeKind: \"instance\",\n externalId: entity.externalId ?? undefined,\n title: entity.title ?? data.text.slice(0, 60),\n data: data as unknown as Record<string, unknown>,\n });\n }\n }\n\n ctx.logger.info(`Metrics captured for ${recent.length} posts`);\n}\n\nasync function handleStaleDraftCleanup(ctx: PluginContext, _job: PluginJobContext): Promise<void> {\n const cutoff = new Date(Date.now() - 48 * 3600000).toISOString();\n const entities = await ctx.entities.list({ entityType: ENTITY_TYPES.draft, limit: 500 });\n let staleCount = 0;\n\n for (const entity of entities) {\n const data = entity.data as unknown as DraftData;\n if ((data.status === \"draft\" || data.status === \"in_review\") && entity.createdAt < cutoff) {\n data.status = \"stale\";\n await ctx.entities.upsert({\n entityType: ENTITY_TYPES.draft,\n scopeKind: \"instance\",\n externalId: entity.externalId ?? undefined,\n title: entity.title ?? data.text.slice(0, 60),\n data: data as unknown as Record<string, unknown>,\n });\n staleCount++;\n }\n }\n\n if (staleCount > 0) {\n ctx.logger.info(`Marked ${staleCount} drafts as stale`);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Plugin definition\n// ---------------------------------------------------------------------------\n\nlet pluginCtx: PluginContext | null = null;\n\nconst plugin = definePlugin({\n async setup(ctx) {\n pluginCtx = ctx;\n\n // Register job handlers\n ctx.jobs.register(JOB_KEYS.tokenRefresh, (job) => handleTokenRefresh(ctx, job));\n ctx.jobs.register(JOB_KEYS.publishScheduled, (job) => handlePublishScheduled(ctx, job));\n ctx.jobs.register(JOB_KEYS.metricsCapture, (job) => handleMetricsCapture(ctx, job));\n ctx.jobs.register(JOB_KEYS.staleDraftCleanup, (job) => handleStaleDraftCleanup(ctx, job));\n\n // Register agent tools\n const p = (params: unknown) => params as Record<string, unknown>;\n ctx.tools.register(\n TOOL_NAMES.setupOauth,\n { displayName: \"Setup OAuth\", description: \"Seed initial OAuth tokens\", parametersSchema: {} },\n (params) => handleSetupOauth(ctx, p(params)),\n );\n ctx.tools.register(\n TOOL_NAMES.draftPost,\n { displayName: \"Draft Post\", description: \"Create a draft post\", parametersSchema: {} },\n (params) => handleDraftPost(ctx, p(params)),\n );\n ctx.tools.register(\n TOOL_NAMES.draftThread,\n { displayName: \"Draft Thread\", description: \"Create a draft thread\", parametersSchema: {} },\n (params) => handleDraftThread(ctx, p(params)),\n );\n ctx.tools.register(\n TOOL_NAMES.updateDraft,\n { displayName: \"Update Draft\", description: \"Update an existing draft\", parametersSchema: {} },\n (params) => handleUpdateDraft(ctx, p(params)),\n );\n ctx.tools.register(\n TOOL_NAMES.publishPost,\n { displayName: \"Publish Post\", description: \"Publish a tweet to X\", parametersSchema: {} },\n (params) => handlePublishPost(ctx, p(params)),\n );\n ctx.tools.register(\n TOOL_NAMES.replyToTweet,\n { displayName: \"Reply to Tweet\", description: \"Post a reply to a tweet\", parametersSchema: {} },\n (params) => handleReplyToTweet(ctx, p(params)),\n );\n ctx.tools.register(\n TOOL_NAMES.quoteTweet,\n { displayName: \"Quote Tweet\", description: \"Post a quote tweet\", parametersSchema: {} },\n (params) => handleQuoteTweet(ctx, p(params)),\n );\n ctx.tools.register(\n TOOL_NAMES.repost,\n { displayName: \"Repost\", description: \"Repost a tweet\", parametersSchema: {} },\n (params) => handleRepost(ctx, p(params)),\n );\n ctx.tools.register(\n TOOL_NAMES.schedulePost,\n { displayName: \"Schedule Post\", description: \"Schedule a post for later\", parametersSchema: {} },\n (params) => handleSchedulePost(ctx, p(params)),\n );\n ctx.tools.register(\n TOOL_NAMES.publishThread,\n { displayName: \"Publish Thread\", description: \"Publish a multi-tweet thread\", parametersSchema: {} },\n (params) => handlePublishThread(ctx, p(params)),\n );\n ctx.tools.register(\n TOOL_NAMES.getDrafts,\n { displayName: \"Get Drafts\", description: \"Query drafts by status\", parametersSchema: {} },\n (params) => handleGetDrafts(ctx, p(params)),\n );\n ctx.tools.register(\n TOOL_NAMES.getSchedule,\n { displayName: \"Get Schedule\", description: \"Get upcoming scheduled posts\", parametersSchema: {} },\n (params) => handleGetSchedule(ctx, p(params)),\n );\n ctx.tools.register(\n TOOL_NAMES.getPostMetrics,\n { displayName: \"Get Post Metrics\", description: \"Get engagement metrics for a post\", parametersSchema: {} },\n (params) => handleGetPostMetrics(ctx, p(params)),\n );\n ctx.tools.register(\n TOOL_NAMES.getAccountStatus,\n { displayName: \"Get Account Status\", description: \"Account health and rate limits\", parametersSchema: {} },\n (params) => handleGetAccountStatus(ctx, p(params)),\n );\n\n // Register UI data handlers\n ctx.data.register(\"dashboard-summary\", async () => {\n const config = await getConfig(ctx);\n const today = new Date().toISOString().split(\"T\")[0]!;\n const published = await ctx.entities.list({ entityType: ENTITY_TYPES.publishedPost, limit: 100 });\n const drafts = await ctx.entities.list({ entityType: ENTITY_TYPES.draft, limit: 100 });\n\n const todayPosts = published.filter((e) =>\n (e.data as unknown as PublishedPostData).published_at.startsWith(today),\n );\n\n const pendingDrafts = drafts.filter((e) => {\n const d = e.data as unknown as DraftData;\n return d.status === \"draft\" || d.status === \"in_review\" || d.status === \"approved\";\n });\n\n let tokenHealth = \"unknown\";\n try {\n const tokens = await getTokens(ctx);\n tokenHealth = tokens.expires_at > Date.now() ? \"valid\" : \"expired\";\n } catch {\n tokenHealth = \"not configured\";\n }\n\n const recentPosts = published\n .map((e) => e.data as unknown as PublishedPostData)\n .sort((a, b) => (a.published_at > b.published_at ? -1 : 1))\n .slice(0, 5);\n\n return {\n today_post_count: todayPosts.length,\n daily_limit: config.daily_post_limit,\n pending_drafts: pendingDrafts.length,\n token_health: tokenHealth,\n recent_posts: recentPosts,\n };\n });\n\n ctx.data.register(\"plugin-config\", async () => {\n const config = await getConfig(ctx);\n return config as unknown as Record<string, unknown>;\n });\n\n ctx.data.register(\"content-queue\", async () => {\n const allDrafts = await ctx.entities.list({ entityType: ENTITY_TYPES.draft, limit: 100 });\n\n const pending = allDrafts\n .map((e) => {\n const d = e.data as unknown as DraftData;\n return { id: e.id, text: d.text, format: d.format, status: d.status, schedule_at: d.schedule_at };\n })\n .filter((d) => (d.status === \"draft\" || d.status === \"in_review\" || d.status === \"approved\") && !d.schedule_at);\n\n const scheduled = allDrafts\n .map((e) => {\n const d = e.data as unknown as DraftData;\n return { id: e.id, text: d.text, format: d.format, status: d.status, schedule_at: d.schedule_at };\n })\n .filter((d): d is typeof d & { schedule_at: string } =>\n !!d.schedule_at && (d.status === \"draft\" || d.status === \"approved\" || d.status === \"in_review\"))\n .sort((a, b) => (a.schedule_at > b.schedule_at ? 1 : -1));\n\n return { drafts: pending, scheduled };\n });\n\n // Cross-plugin event subscriptions (logging only for v1)\n ctx.events.on(`plugin.${ENTITY_TYPES.draft}` as never, async () => {\n // placeholder \u2014 can't subscribe to x-intelligence events without the exact\n // event type string at compile time. Wire this up at deployment time.\n });\n\n ctx.logger.info(\"X Publishing plugin initialized\");\n },\n\n async onHealth() {\n if (!pluginCtx) return { status: \"error\" as const, message: \"Plugin not initialized\" };\n\n const details: Record<string, unknown> = {};\n let status: \"ok\" | \"degraded\" | \"error\" = \"ok\";\n const issues: string[] = [];\n\n // Check token state\n try {\n const tokens = await getTokens(pluginCtx);\n const tokenOk = tokens.expires_at > Date.now();\n const minutesLeft = Math.round((tokens.expires_at - Date.now()) / 60000);\n details.token = tokenOk ? `valid (${minutesLeft}m remaining)` : \"expired\";\n if (!tokenOk) {\n status = \"degraded\";\n issues.push(\"Token expired\");\n }\n } catch {\n status = \"error\";\n issues.push(\"No OAuth tokens configured\");\n details.token = \"not configured\";\n }\n\n // Check rate limits\n try {\n const raw = await pluginCtx.state.get(stateKey(STATE_KEYS.rateLimits));\n if (raw) {\n const limits = raw as unknown as RateLimitState;\n details.rate_limits = {\n post_tweets_remaining: limits.post_tweets?.remaining ?? \"unknown\",\n daily_posts: limits.daily_posts ?? 0,\n };\n if (limits.post_tweets && limits.post_tweets.remaining === 0 && limits.post_tweets.reset_at > Date.now()) {\n if (status === \"ok\") status = \"degraded\";\n issues.push(\"Tweet rate limit exhausted\");\n }\n }\n } catch {\n details.rate_limits = \"unavailable\";\n }\n\n const message = issues.length > 0 ? issues.join(\"; \") : \"All systems operational\";\n return { status, message, details };\n },\n\n async onValidateConfig(config: Record<string, unknown>) {\n const warnings: string[] = [];\n const errors: string[] = [];\n\n if (!config.x_handle) errors.push(\"x_handle is required\");\n if (!config.x_user_id) errors.push(\"x_user_id is required\");\n\n if (pluginCtx) {\n const clientIdRef = (config.oauth_client_id_ref as string) || DEFAULT_CONFIG.oauth_client_id_ref;\n const clientSecretRef = (config.oauth_client_secret_ref as string) || DEFAULT_CONFIG.oauth_client_secret_ref;\n\n try {\n await pluginCtx.secrets.resolve(clientIdRef);\n } catch {\n errors.push(\"Could not resolve oauth_client_id_ref secret\");\n }\n\n try {\n await pluginCtx.secrets.resolve(clientSecretRef);\n } catch {\n errors.push(\"Could not resolve oauth_client_secret_ref secret\");\n }\n\n try {\n await getTokens(pluginCtx);\n } catch {\n warnings.push(\"No OAuth tokens in state \u2014 run setup-oauth tool after configuration\");\n }\n }\n\n return { ok: errors.length === 0, warnings, errors };\n },\n});\n\nexport default plugin;\nrunWorker(plugin, import.meta.url);\n"],
5
+ "mappings": "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",
6
+ "names": ["plugin", "stateKey", "stateKey"]
7
+ }
package/package.json ADDED
@@ -0,0 +1,47 @@
1
+ {
2
+ "name": "peak6-x-publishing-plugin",
3
+ "version": "0.1.2",
4
+ "type": "module",
5
+ "description": "X/Twitter publishing plugin for Paperclip",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/peak6-labs/x-publishing-plugin"
9
+ },
10
+ "files": [
11
+ "dist/"
12
+ ],
13
+ "publishConfig": {
14
+ "access": "public"
15
+ },
16
+ "paperclipPlugin": {
17
+ "manifest": "./dist/manifest.js",
18
+ "worker": "./dist/worker.js",
19
+ "ui": "./dist/ui/"
20
+ },
21
+ "keywords": [
22
+ "paperclip",
23
+ "plugin",
24
+ "connector"
25
+ ],
26
+ "author": "peak6-labs",
27
+ "license": "MIT",
28
+ "devDependencies": {
29
+ "@paperclipai/shared": "file:.paperclip-sdk/paperclipai-shared-0.3.1.tgz",
30
+ "@paperclipai/plugin-sdk": "file:.paperclip-sdk/paperclipai-plugin-sdk-1.0.0.tgz",
31
+ "@types/node": "^24.6.0",
32
+ "@types/react": "^19.0.8",
33
+ "esbuild": "^0.27.3",
34
+ "typescript": "^5.7.3",
35
+ "vitest": "^3.0.5"
36
+ },
37
+ "peerDependencies": {
38
+ "react": ">=18"
39
+ },
40
+ "scripts": {
41
+ "build": "node ./esbuild.config.mjs",
42
+ "dev": "node ./esbuild.config.mjs --watch",
43
+ "dev:ui": "paperclip-plugin-dev-server --root . --ui-dir dist/ui --port 4178",
44
+ "test": "vitest run --config ./vitest.config.ts",
45
+ "typecheck": "tsc --noEmit"
46
+ }
47
+ }