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.
- package/dist/manifest.js +485 -0
- package/dist/manifest.js.map +7 -0
- package/dist/ui/index.js +151 -0
- package/dist/ui/index.js.map +7 -0
- package/dist/worker.js +1990 -0
- package/dist/worker.js.map +7 -0
- package/package.json +47 -0
package/dist/manifest.js
ADDED
|
@@ -0,0 +1,485 @@
|
|
|
1
|
+
// src/constants.ts
|
|
2
|
+
var PLUGIN_ID = "peak6-labs.x-publishing";
|
|
3
|
+
var PLUGIN_VERSION = "0.1.2";
|
|
4
|
+
var TOOL_NAMES = {
|
|
5
|
+
draftPost: "draft-post",
|
|
6
|
+
updateDraft: "update-draft",
|
|
7
|
+
publishPost: "publish-post",
|
|
8
|
+
replyToTweet: "reply-to-tweet",
|
|
9
|
+
quoteTweet: "quote-tweet",
|
|
10
|
+
repost: "repost",
|
|
11
|
+
schedulePost: "schedule-post",
|
|
12
|
+
publishThread: "publish-thread",
|
|
13
|
+
draftThread: "draft-thread",
|
|
14
|
+
getDrafts: "get-drafts",
|
|
15
|
+
getSchedule: "get-schedule",
|
|
16
|
+
getPostMetrics: "get-post-metrics",
|
|
17
|
+
getAccountStatus: "get-account-status",
|
|
18
|
+
setupOauth: "setup-oauth"
|
|
19
|
+
};
|
|
20
|
+
var JOB_KEYS = {
|
|
21
|
+
tokenRefresh: "token-refresh",
|
|
22
|
+
publishScheduled: "publish-scheduled",
|
|
23
|
+
metricsCapture: "metrics-capture",
|
|
24
|
+
staleDraftCleanup: "stale-draft-cleanup"
|
|
25
|
+
};
|
|
26
|
+
var SLOT_IDS = {
|
|
27
|
+
dashboardWidget: "x-publishing-dashboard",
|
|
28
|
+
settingsPage: "x-publishing-settings",
|
|
29
|
+
contentPage: "x-publishing-content"
|
|
30
|
+
};
|
|
31
|
+
var EXPORT_NAMES = {
|
|
32
|
+
dashboardWidget: "DashboardWidget",
|
|
33
|
+
settingsPage: "SettingsPage",
|
|
34
|
+
contentPage: "ContentPage"
|
|
35
|
+
};
|
|
36
|
+
var DEFAULT_CONFIG = {
|
|
37
|
+
company_id: "",
|
|
38
|
+
x_handle: "",
|
|
39
|
+
x_user_id: "",
|
|
40
|
+
oauth_client_id_ref: "X_OAUTH_CLIENT_ID",
|
|
41
|
+
oauth_client_secret_ref: "X_OAUTH_CLIENT_SECRET",
|
|
42
|
+
daily_post_limit: 25,
|
|
43
|
+
approval_modes: {
|
|
44
|
+
posts: "none",
|
|
45
|
+
replies: "none",
|
|
46
|
+
quotes: "none",
|
|
47
|
+
reposts: "none",
|
|
48
|
+
scheduled: "required"
|
|
49
|
+
},
|
|
50
|
+
engagement_milestones: [50, 100, 500, 1e3],
|
|
51
|
+
metrics_capture_lookback_days: 7,
|
|
52
|
+
alert_agents: []
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
// src/manifest.ts
|
|
56
|
+
var manifest = {
|
|
57
|
+
id: PLUGIN_ID,
|
|
58
|
+
apiVersion: 1,
|
|
59
|
+
version: PLUGIN_VERSION,
|
|
60
|
+
displayName: "X Publishing",
|
|
61
|
+
description: "X/Twitter publishing plugin \u2014 drafts, approvals, scheduling, threads, metrics capture, and cross-plugin event flow.",
|
|
62
|
+
author: "peak6-labs",
|
|
63
|
+
categories: ["connector", "automation"],
|
|
64
|
+
capabilities: [
|
|
65
|
+
"http.outbound",
|
|
66
|
+
"secrets.read-ref",
|
|
67
|
+
"jobs.schedule",
|
|
68
|
+
"agent.tools.register",
|
|
69
|
+
"plugin.state.read",
|
|
70
|
+
"plugin.state.write",
|
|
71
|
+
"events.subscribe",
|
|
72
|
+
"events.emit",
|
|
73
|
+
"issues.read",
|
|
74
|
+
"issues.create",
|
|
75
|
+
"issues.update",
|
|
76
|
+
"activity.log.write",
|
|
77
|
+
"metrics.write",
|
|
78
|
+
"instance.settings.register",
|
|
79
|
+
"ui.dashboardWidget.register",
|
|
80
|
+
"ui.page.register"
|
|
81
|
+
],
|
|
82
|
+
entrypoints: {
|
|
83
|
+
worker: "./dist/worker.js",
|
|
84
|
+
ui: "./dist/ui"
|
|
85
|
+
},
|
|
86
|
+
instanceConfigSchema: {
|
|
87
|
+
type: "object",
|
|
88
|
+
properties: {
|
|
89
|
+
company_id: {
|
|
90
|
+
type: "string",
|
|
91
|
+
title: "Company ID",
|
|
92
|
+
description: "UUID of the company this plugin serves",
|
|
93
|
+
default: DEFAULT_CONFIG.company_id
|
|
94
|
+
},
|
|
95
|
+
x_handle: {
|
|
96
|
+
type: "string",
|
|
97
|
+
title: "X Handle",
|
|
98
|
+
description: "X/Twitter handle (without @)",
|
|
99
|
+
default: DEFAULT_CONFIG.x_handle
|
|
100
|
+
},
|
|
101
|
+
x_user_id: {
|
|
102
|
+
type: "string",
|
|
103
|
+
title: "X User ID",
|
|
104
|
+
description: "Numeric X user ID (needed for repost endpoint)",
|
|
105
|
+
default: DEFAULT_CONFIG.x_user_id
|
|
106
|
+
},
|
|
107
|
+
oauth_client_id_ref: {
|
|
108
|
+
type: "string",
|
|
109
|
+
title: "OAuth Client ID Secret Reference",
|
|
110
|
+
default: DEFAULT_CONFIG.oauth_client_id_ref
|
|
111
|
+
},
|
|
112
|
+
oauth_client_secret_ref: {
|
|
113
|
+
type: "string",
|
|
114
|
+
title: "OAuth Client Secret Reference",
|
|
115
|
+
default: DEFAULT_CONFIG.oauth_client_secret_ref
|
|
116
|
+
},
|
|
117
|
+
daily_post_limit: {
|
|
118
|
+
type: "number",
|
|
119
|
+
title: "Daily Post Limit",
|
|
120
|
+
description: "Maximum posts per day (safety guardrail)",
|
|
121
|
+
default: DEFAULT_CONFIG.daily_post_limit
|
|
122
|
+
},
|
|
123
|
+
approval_modes: {
|
|
124
|
+
type: "object",
|
|
125
|
+
title: "Approval Modes",
|
|
126
|
+
description: "Per-content-type approval requirements",
|
|
127
|
+
properties: {
|
|
128
|
+
posts: { type: "string", enum: ["required", "optional", "none"], default: "none" },
|
|
129
|
+
replies: { type: "string", enum: ["required", "optional", "none"], default: "none" },
|
|
130
|
+
quotes: { type: "string", enum: ["required", "optional", "none"], default: "none" },
|
|
131
|
+
reposts: { type: "string", enum: ["required", "optional", "none"], default: "none" },
|
|
132
|
+
scheduled: { type: "string", enum: ["required", "optional", "none"], default: "required" }
|
|
133
|
+
},
|
|
134
|
+
default: DEFAULT_CONFIG.approval_modes
|
|
135
|
+
},
|
|
136
|
+
engagement_milestones: {
|
|
137
|
+
type: "array",
|
|
138
|
+
title: "Engagement Milestones",
|
|
139
|
+
description: "Total engagement thresholds that trigger milestone events",
|
|
140
|
+
items: { type: "number" },
|
|
141
|
+
default: DEFAULT_CONFIG.engagement_milestones
|
|
142
|
+
},
|
|
143
|
+
metrics_capture_lookback_days: {
|
|
144
|
+
type: "number",
|
|
145
|
+
title: "Metrics Capture Lookback (days)",
|
|
146
|
+
default: DEFAULT_CONFIG.metrics_capture_lookback_days
|
|
147
|
+
},
|
|
148
|
+
alert_agents: {
|
|
149
|
+
type: "array",
|
|
150
|
+
title: "Alert Agents",
|
|
151
|
+
description: "Agents to notify on failures or milestones",
|
|
152
|
+
items: {
|
|
153
|
+
type: "object",
|
|
154
|
+
properties: {
|
|
155
|
+
agentId: { type: "string", description: "Paperclip agent UUID" },
|
|
156
|
+
memoryFile: { type: ["string", "null"], description: "Path to user memory file" }
|
|
157
|
+
},
|
|
158
|
+
required: ["agentId"]
|
|
159
|
+
},
|
|
160
|
+
default: DEFAULT_CONFIG.alert_agents
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
},
|
|
164
|
+
jobs: [
|
|
165
|
+
{
|
|
166
|
+
jobKey: JOB_KEYS.tokenRefresh,
|
|
167
|
+
displayName: "Token Refresh",
|
|
168
|
+
description: "Refresh OAuth2 access token before expiry. Alerts on failure.",
|
|
169
|
+
schedule: "0 */2 * * *"
|
|
170
|
+
// every 2 hours
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
jobKey: JOB_KEYS.publishScheduled,
|
|
174
|
+
displayName: "Publish Scheduled",
|
|
175
|
+
description: "Publish approved drafts whose schedule_at has passed.",
|
|
176
|
+
schedule: "*/15 * * * *"
|
|
177
|
+
// every 15 min
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
jobKey: JOB_KEYS.metricsCapture,
|
|
181
|
+
displayName: "Metrics Capture",
|
|
182
|
+
description: "Snapshot engagement metrics on recent published posts.",
|
|
183
|
+
schedule: "0 */6 * * *"
|
|
184
|
+
// every 6 hours
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
jobKey: JOB_KEYS.staleDraftCleanup,
|
|
188
|
+
displayName: "Stale Draft Cleanup",
|
|
189
|
+
description: "Mark drafts older than 48h in draft/in_review status as stale.",
|
|
190
|
+
schedule: "0 2 * * *"
|
|
191
|
+
// daily at 2 AM
|
|
192
|
+
}
|
|
193
|
+
],
|
|
194
|
+
tools: [
|
|
195
|
+
{
|
|
196
|
+
name: TOOL_NAMES.setupOauth,
|
|
197
|
+
displayName: "Setup OAuth",
|
|
198
|
+
description: "Seed initial OAuth tokens from a manual PKCE flow. Call once during setup.",
|
|
199
|
+
parametersSchema: {
|
|
200
|
+
type: "object",
|
|
201
|
+
properties: {
|
|
202
|
+
access_token: { type: "string", description: "OAuth2 access token" },
|
|
203
|
+
refresh_token: { type: "string", description: "OAuth2 refresh token" },
|
|
204
|
+
expires_in: { type: "number", description: "Token TTL in seconds (default 7200)" }
|
|
205
|
+
},
|
|
206
|
+
required: ["access_token", "refresh_token"]
|
|
207
|
+
}
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
name: TOOL_NAMES.draftPost,
|
|
211
|
+
displayName: "Draft Post",
|
|
212
|
+
description: "Create a draft post for review or later publishing.",
|
|
213
|
+
parametersSchema: {
|
|
214
|
+
type: "object",
|
|
215
|
+
properties: {
|
|
216
|
+
text: { type: "string", description: "Tweet text (max 280 chars)" },
|
|
217
|
+
format: { type: "string", enum: ["single", "reply", "quote"], description: "Post format" },
|
|
218
|
+
reply_to_tweet_id: { type: "string", description: "Tweet ID to reply to (for reply format)" },
|
|
219
|
+
quote_tweet_id: { type: "string", description: "Tweet ID to quote (for quote format)" },
|
|
220
|
+
schedule_at: { type: "string", description: "ISO datetime to schedule publication" },
|
|
221
|
+
metadata: {
|
|
222
|
+
type: "object",
|
|
223
|
+
description: "Content metadata for feedback loop",
|
|
224
|
+
properties: {
|
|
225
|
+
voice: { type: "string" },
|
|
226
|
+
content_bucket: { type: "string" },
|
|
227
|
+
topic: { type: "string" },
|
|
228
|
+
source_tweet_id: { type: "string" },
|
|
229
|
+
source_issue_id: { type: "string" }
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
},
|
|
233
|
+
required: ["text"]
|
|
234
|
+
}
|
|
235
|
+
},
|
|
236
|
+
{
|
|
237
|
+
name: TOOL_NAMES.draftThread,
|
|
238
|
+
displayName: "Draft Thread",
|
|
239
|
+
description: "Create a draft thread (multiple tweets posted as a reply chain).",
|
|
240
|
+
parametersSchema: {
|
|
241
|
+
type: "object",
|
|
242
|
+
properties: {
|
|
243
|
+
thread_tweets: {
|
|
244
|
+
type: "array",
|
|
245
|
+
items: { type: "string" },
|
|
246
|
+
description: "Array of tweet texts (each max 280 chars)"
|
|
247
|
+
},
|
|
248
|
+
schedule_at: { type: "string", description: "ISO datetime to schedule publication" },
|
|
249
|
+
metadata: {
|
|
250
|
+
type: "object",
|
|
251
|
+
properties: {
|
|
252
|
+
voice: { type: "string" },
|
|
253
|
+
content_bucket: { type: "string" },
|
|
254
|
+
topic: { type: "string" },
|
|
255
|
+
source_tweet_id: { type: "string" },
|
|
256
|
+
source_issue_id: { type: "string" }
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
},
|
|
260
|
+
required: ["thread_tweets"]
|
|
261
|
+
}
|
|
262
|
+
},
|
|
263
|
+
{
|
|
264
|
+
name: TOOL_NAMES.updateDraft,
|
|
265
|
+
displayName: "Update Draft",
|
|
266
|
+
description: "Update an existing draft's text, metadata, or schedule.",
|
|
267
|
+
parametersSchema: {
|
|
268
|
+
type: "object",
|
|
269
|
+
properties: {
|
|
270
|
+
draft_id: { type: "string", description: "Draft entity ID" },
|
|
271
|
+
text: { type: "string", description: "Updated tweet text" },
|
|
272
|
+
thread_tweets: { type: "array", items: { type: "string" } },
|
|
273
|
+
schedule_at: { type: "string" },
|
|
274
|
+
metadata: {
|
|
275
|
+
type: "object",
|
|
276
|
+
properties: {
|
|
277
|
+
voice: { type: "string" },
|
|
278
|
+
content_bucket: { type: "string" },
|
|
279
|
+
topic: { type: "string" },
|
|
280
|
+
source_tweet_id: { type: "string" },
|
|
281
|
+
source_issue_id: { type: "string" }
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
},
|
|
285
|
+
required: ["draft_id"]
|
|
286
|
+
}
|
|
287
|
+
},
|
|
288
|
+
{
|
|
289
|
+
name: TOOL_NAMES.publishPost,
|
|
290
|
+
displayName: "Publish Post",
|
|
291
|
+
description: "Publish a tweet to X. Accepts inline text or a draft_id.",
|
|
292
|
+
parametersSchema: {
|
|
293
|
+
type: "object",
|
|
294
|
+
properties: {
|
|
295
|
+
text: { type: "string", description: "Tweet text (if publishing inline)" },
|
|
296
|
+
draft_id: { type: "string", description: "Draft entity ID (if publishing from draft)" },
|
|
297
|
+
metadata: {
|
|
298
|
+
type: "object",
|
|
299
|
+
properties: {
|
|
300
|
+
voice: { type: "string" },
|
|
301
|
+
content_bucket: { type: "string" },
|
|
302
|
+
topic: { type: "string" },
|
|
303
|
+
source_tweet_id: { type: "string" }
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
},
|
|
309
|
+
{
|
|
310
|
+
name: TOOL_NAMES.replyToTweet,
|
|
311
|
+
displayName: "Reply to Tweet",
|
|
312
|
+
description: "Post a reply to an existing tweet on X.",
|
|
313
|
+
parametersSchema: {
|
|
314
|
+
type: "object",
|
|
315
|
+
properties: {
|
|
316
|
+
tweet_id: { type: "string", description: "Tweet ID to reply to" },
|
|
317
|
+
text: { type: "string", description: "Reply text (max 280 chars)" },
|
|
318
|
+
draft_id: { type: "string", description: "Draft entity ID (if from draft)" },
|
|
319
|
+
metadata: {
|
|
320
|
+
type: "object",
|
|
321
|
+
properties: {
|
|
322
|
+
voice: { type: "string" },
|
|
323
|
+
content_bucket: { type: "string" },
|
|
324
|
+
topic: { type: "string" },
|
|
325
|
+
source_tweet_id: { type: "string" }
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
},
|
|
329
|
+
required: ["tweet_id", "text"]
|
|
330
|
+
}
|
|
331
|
+
},
|
|
332
|
+
{
|
|
333
|
+
name: TOOL_NAMES.quoteTweet,
|
|
334
|
+
displayName: "Quote Tweet",
|
|
335
|
+
description: "Post a quote tweet on X.",
|
|
336
|
+
parametersSchema: {
|
|
337
|
+
type: "object",
|
|
338
|
+
properties: {
|
|
339
|
+
tweet_id: { type: "string", description: "Tweet ID to quote" },
|
|
340
|
+
text: { type: "string", description: "Quote text (max 280 chars)" },
|
|
341
|
+
draft_id: { type: "string", description: "Draft entity ID (if from draft)" },
|
|
342
|
+
metadata: {
|
|
343
|
+
type: "object",
|
|
344
|
+
properties: {
|
|
345
|
+
voice: { type: "string" },
|
|
346
|
+
content_bucket: { type: "string" },
|
|
347
|
+
topic: { type: "string" },
|
|
348
|
+
source_tweet_id: { type: "string" }
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
},
|
|
352
|
+
required: ["tweet_id", "text"]
|
|
353
|
+
}
|
|
354
|
+
},
|
|
355
|
+
{
|
|
356
|
+
name: TOOL_NAMES.repost,
|
|
357
|
+
displayName: "Repost",
|
|
358
|
+
description: "Repost (retweet) an existing tweet on X.",
|
|
359
|
+
parametersSchema: {
|
|
360
|
+
type: "object",
|
|
361
|
+
properties: {
|
|
362
|
+
tweet_id: { type: "string", description: "Tweet ID to repost" },
|
|
363
|
+
draft_id: { type: "string", description: "Draft entity ID (if from draft)" }
|
|
364
|
+
},
|
|
365
|
+
required: ["tweet_id"]
|
|
366
|
+
}
|
|
367
|
+
},
|
|
368
|
+
{
|
|
369
|
+
name: TOOL_NAMES.schedulePost,
|
|
370
|
+
displayName: "Schedule Post",
|
|
371
|
+
description: "Create or update a draft with a scheduled publication time.",
|
|
372
|
+
parametersSchema: {
|
|
373
|
+
type: "object",
|
|
374
|
+
properties: {
|
|
375
|
+
draft_id: { type: "string", description: "Existing draft ID to schedule" },
|
|
376
|
+
text: { type: "string", description: "Tweet text (creates new draft if no draft_id)" },
|
|
377
|
+
schedule_at: { type: "string", description: "ISO datetime for publication" },
|
|
378
|
+
metadata: {
|
|
379
|
+
type: "object",
|
|
380
|
+
properties: {
|
|
381
|
+
voice: { type: "string" },
|
|
382
|
+
content_bucket: { type: "string" },
|
|
383
|
+
topic: { type: "string" },
|
|
384
|
+
source_tweet_id: { type: "string" }
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
},
|
|
388
|
+
required: ["schedule_at"]
|
|
389
|
+
}
|
|
390
|
+
},
|
|
391
|
+
{
|
|
392
|
+
name: TOOL_NAMES.publishThread,
|
|
393
|
+
displayName: "Publish Thread",
|
|
394
|
+
description: "Publish a multi-tweet thread to X with reply chaining. Retries on failure; leaves partial thread + alert on persistent failure.",
|
|
395
|
+
parametersSchema: {
|
|
396
|
+
type: "object",
|
|
397
|
+
properties: {
|
|
398
|
+
thread_tweets: { type: "array", items: { type: "string" }, description: "Array of tweet texts" },
|
|
399
|
+
draft_id: { type: "string", description: "Draft entity ID (if from draft)" },
|
|
400
|
+
metadata: {
|
|
401
|
+
type: "object",
|
|
402
|
+
properties: {
|
|
403
|
+
voice: { type: "string" },
|
|
404
|
+
content_bucket: { type: "string" },
|
|
405
|
+
topic: { type: "string" },
|
|
406
|
+
source_tweet_id: { type: "string" }
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
},
|
|
412
|
+
{
|
|
413
|
+
name: TOOL_NAMES.getDrafts,
|
|
414
|
+
displayName: "Get Drafts",
|
|
415
|
+
description: "Query draft entities, optionally filtered by status.",
|
|
416
|
+
parametersSchema: {
|
|
417
|
+
type: "object",
|
|
418
|
+
properties: {
|
|
419
|
+
status: { type: "string", enum: ["draft", "in_review", "approved", "rejected", "stale"], description: "Filter by draft status" },
|
|
420
|
+
limit: { type: "number", description: "Max results (default 20)" }
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
},
|
|
424
|
+
{
|
|
425
|
+
name: TOOL_NAMES.getSchedule,
|
|
426
|
+
displayName: "Get Schedule",
|
|
427
|
+
description: "Get upcoming scheduled posts (drafts with schedule_at set).",
|
|
428
|
+
parametersSchema: {
|
|
429
|
+
type: "object",
|
|
430
|
+
properties: {
|
|
431
|
+
limit: { type: "number", description: "Max results (default 20)" }
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
},
|
|
435
|
+
{
|
|
436
|
+
name: TOOL_NAMES.getPostMetrics,
|
|
437
|
+
displayName: "Get Post Metrics",
|
|
438
|
+
description: "Get engagement metrics for a published post.",
|
|
439
|
+
parametersSchema: {
|
|
440
|
+
type: "object",
|
|
441
|
+
properties: {
|
|
442
|
+
tweet_id: { type: "string", description: "Tweet ID to get metrics for" }
|
|
443
|
+
},
|
|
444
|
+
required: ["tweet_id"]
|
|
445
|
+
}
|
|
446
|
+
},
|
|
447
|
+
{
|
|
448
|
+
name: TOOL_NAMES.getAccountStatus,
|
|
449
|
+
displayName: "Get Account Status",
|
|
450
|
+
description: "Get account health: rate limits, daily post count, token validity.",
|
|
451
|
+
parametersSchema: {
|
|
452
|
+
type: "object",
|
|
453
|
+
properties: {}
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
],
|
|
457
|
+
ui: {
|
|
458
|
+
slots: [
|
|
459
|
+
{
|
|
460
|
+
type: "dashboardWidget",
|
|
461
|
+
id: SLOT_IDS.dashboardWidget,
|
|
462
|
+
displayName: "X Publishing",
|
|
463
|
+
exportName: EXPORT_NAMES.dashboardWidget
|
|
464
|
+
},
|
|
465
|
+
{
|
|
466
|
+
type: "settingsPage",
|
|
467
|
+
id: SLOT_IDS.settingsPage,
|
|
468
|
+
displayName: "X Publishing Settings",
|
|
469
|
+
exportName: EXPORT_NAMES.settingsPage
|
|
470
|
+
},
|
|
471
|
+
{
|
|
472
|
+
type: "page",
|
|
473
|
+
id: SLOT_IDS.contentPage,
|
|
474
|
+
displayName: "Content Queue",
|
|
475
|
+
exportName: EXPORT_NAMES.contentPage,
|
|
476
|
+
routePath: "x-publishing"
|
|
477
|
+
}
|
|
478
|
+
]
|
|
479
|
+
}
|
|
480
|
+
};
|
|
481
|
+
var manifest_default = manifest;
|
|
482
|
+
export {
|
|
483
|
+
manifest_default as default
|
|
484
|
+
};
|
|
485
|
+
//# sourceMappingURL=manifest.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/constants.ts", "../src/manifest.ts"],
|
|
4
|
+
"sourcesContent": ["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 { PaperclipPluginManifestV1 } from \"@paperclipai/plugin-sdk\";\nimport {\n DEFAULT_CONFIG,\n EXPORT_NAMES,\n JOB_KEYS,\n PLUGIN_ID,\n PLUGIN_VERSION,\n SLOT_IDS,\n TOOL_NAMES,\n} from \"./constants.js\";\n\nconst manifest: PaperclipPluginManifestV1 = {\n id: PLUGIN_ID,\n apiVersion: 1,\n version: PLUGIN_VERSION,\n displayName: \"X Publishing\",\n description:\n \"X/Twitter publishing plugin \u2014 drafts, approvals, scheduling, threads, metrics capture, and cross-plugin event flow.\",\n author: \"peak6-labs\",\n categories: [\"connector\", \"automation\"],\n capabilities: [\n \"http.outbound\",\n \"secrets.read-ref\",\n \"jobs.schedule\",\n \"agent.tools.register\",\n \"plugin.state.read\",\n \"plugin.state.write\",\n \"events.subscribe\",\n \"events.emit\",\n \"issues.read\",\n \"issues.create\",\n \"issues.update\",\n \"activity.log.write\",\n \"metrics.write\",\n \"instance.settings.register\",\n \"ui.dashboardWidget.register\",\n \"ui.page.register\",\n ],\n entrypoints: {\n worker: \"./dist/worker.js\",\n ui: \"./dist/ui\",\n },\n instanceConfigSchema: {\n type: \"object\",\n properties: {\n company_id: {\n type: \"string\",\n title: \"Company ID\",\n description: \"UUID of the company this plugin serves\",\n default: DEFAULT_CONFIG.company_id,\n },\n x_handle: {\n type: \"string\",\n title: \"X Handle\",\n description: \"X/Twitter handle (without @)\",\n default: DEFAULT_CONFIG.x_handle,\n },\n x_user_id: {\n type: \"string\",\n title: \"X User ID\",\n description: \"Numeric X user ID (needed for repost endpoint)\",\n default: DEFAULT_CONFIG.x_user_id,\n },\n oauth_client_id_ref: {\n type: \"string\",\n title: \"OAuth Client ID Secret Reference\",\n default: DEFAULT_CONFIG.oauth_client_id_ref,\n },\n oauth_client_secret_ref: {\n type: \"string\",\n title: \"OAuth Client Secret Reference\",\n default: DEFAULT_CONFIG.oauth_client_secret_ref,\n },\n daily_post_limit: {\n type: \"number\",\n title: \"Daily Post Limit\",\n description: \"Maximum posts per day (safety guardrail)\",\n default: DEFAULT_CONFIG.daily_post_limit,\n },\n approval_modes: {\n type: \"object\",\n title: \"Approval Modes\",\n description: \"Per-content-type approval requirements\",\n properties: {\n posts: { type: \"string\", enum: [\"required\", \"optional\", \"none\"], default: \"none\" },\n replies: { type: \"string\", enum: [\"required\", \"optional\", \"none\"], default: \"none\" },\n quotes: { type: \"string\", enum: [\"required\", \"optional\", \"none\"], default: \"none\" },\n reposts: { type: \"string\", enum: [\"required\", \"optional\", \"none\"], default: \"none\" },\n scheduled: { type: \"string\", enum: [\"required\", \"optional\", \"none\"], default: \"required\" },\n },\n default: DEFAULT_CONFIG.approval_modes,\n },\n engagement_milestones: {\n type: \"array\",\n title: \"Engagement Milestones\",\n description: \"Total engagement thresholds that trigger milestone events\",\n items: { type: \"number\" },\n default: DEFAULT_CONFIG.engagement_milestones,\n },\n metrics_capture_lookback_days: {\n type: \"number\",\n title: \"Metrics Capture Lookback (days)\",\n default: DEFAULT_CONFIG.metrics_capture_lookback_days,\n },\n alert_agents: {\n type: \"array\",\n title: \"Alert Agents\",\n description: \"Agents to notify on failures or milestones\",\n items: {\n type: \"object\",\n properties: {\n agentId: { type: \"string\", description: \"Paperclip agent UUID\" },\n memoryFile: { type: [\"string\", \"null\"], description: \"Path to user memory file\" },\n },\n required: [\"agentId\"],\n },\n default: DEFAULT_CONFIG.alert_agents,\n },\n },\n },\n jobs: [\n {\n jobKey: JOB_KEYS.tokenRefresh,\n displayName: \"Token Refresh\",\n description: \"Refresh OAuth2 access token before expiry. Alerts on failure.\",\n schedule: \"0 */2 * * *\", // every 2 hours\n },\n {\n jobKey: JOB_KEYS.publishScheduled,\n displayName: \"Publish Scheduled\",\n description: \"Publish approved drafts whose schedule_at has passed.\",\n schedule: \"*/15 * * * *\", // every 15 min\n },\n {\n jobKey: JOB_KEYS.metricsCapture,\n displayName: \"Metrics Capture\",\n description: \"Snapshot engagement metrics on recent published posts.\",\n schedule: \"0 */6 * * *\", // every 6 hours\n },\n {\n jobKey: JOB_KEYS.staleDraftCleanup,\n displayName: \"Stale Draft Cleanup\",\n description: \"Mark drafts older than 48h in draft/in_review status as stale.\",\n schedule: \"0 2 * * *\", // daily at 2 AM\n },\n ],\n tools: [\n {\n name: TOOL_NAMES.setupOauth,\n displayName: \"Setup OAuth\",\n description: \"Seed initial OAuth tokens from a manual PKCE flow. Call once during setup.\",\n parametersSchema: {\n type: \"object\",\n properties: {\n access_token: { type: \"string\", description: \"OAuth2 access token\" },\n refresh_token: { type: \"string\", description: \"OAuth2 refresh token\" },\n expires_in: { type: \"number\", description: \"Token TTL in seconds (default 7200)\" },\n },\n required: [\"access_token\", \"refresh_token\"],\n },\n },\n {\n name: TOOL_NAMES.draftPost,\n displayName: \"Draft Post\",\n description: \"Create a draft post for review or later publishing.\",\n parametersSchema: {\n type: \"object\",\n properties: {\n text: { type: \"string\", description: \"Tweet text (max 280 chars)\" },\n format: { type: \"string\", enum: [\"single\", \"reply\", \"quote\"], description: \"Post format\" },\n reply_to_tweet_id: { type: \"string\", description: \"Tweet ID to reply to (for reply format)\" },\n quote_tweet_id: { type: \"string\", description: \"Tweet ID to quote (for quote format)\" },\n schedule_at: { type: \"string\", description: \"ISO datetime to schedule publication\" },\n metadata: {\n type: \"object\",\n description: \"Content metadata for feedback loop\",\n properties: {\n voice: { type: \"string\" },\n content_bucket: { type: \"string\" },\n topic: { type: \"string\" },\n source_tweet_id: { type: \"string\" },\n source_issue_id: { type: \"string\" },\n },\n },\n },\n required: [\"text\"],\n },\n },\n {\n name: TOOL_NAMES.draftThread,\n displayName: \"Draft Thread\",\n description: \"Create a draft thread (multiple tweets posted as a reply chain).\",\n parametersSchema: {\n type: \"object\",\n properties: {\n thread_tweets: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"Array of tweet texts (each max 280 chars)\",\n },\n schedule_at: { type: \"string\", description: \"ISO datetime to schedule publication\" },\n metadata: {\n type: \"object\",\n properties: {\n voice: { type: \"string\" },\n content_bucket: { type: \"string\" },\n topic: { type: \"string\" },\n source_tweet_id: { type: \"string\" },\n source_issue_id: { type: \"string\" },\n },\n },\n },\n required: [\"thread_tweets\"],\n },\n },\n {\n name: TOOL_NAMES.updateDraft,\n displayName: \"Update Draft\",\n description: \"Update an existing draft's text, metadata, or schedule.\",\n parametersSchema: {\n type: \"object\",\n properties: {\n draft_id: { type: \"string\", description: \"Draft entity ID\" },\n text: { type: \"string\", description: \"Updated tweet text\" },\n thread_tweets: { type: \"array\", items: { type: \"string\" } },\n schedule_at: { type: \"string\" },\n metadata: {\n type: \"object\",\n properties: {\n voice: { type: \"string\" },\n content_bucket: { type: \"string\" },\n topic: { type: \"string\" },\n source_tweet_id: { type: \"string\" },\n source_issue_id: { type: \"string\" },\n },\n },\n },\n required: [\"draft_id\"],\n },\n },\n {\n name: TOOL_NAMES.publishPost,\n displayName: \"Publish Post\",\n description: \"Publish a tweet to X. Accepts inline text or a draft_id.\",\n parametersSchema: {\n type: \"object\",\n properties: {\n text: { type: \"string\", description: \"Tweet text (if publishing inline)\" },\n draft_id: { type: \"string\", description: \"Draft entity ID (if publishing from draft)\" },\n metadata: {\n type: \"object\",\n properties: {\n voice: { type: \"string\" },\n content_bucket: { type: \"string\" },\n topic: { type: \"string\" },\n source_tweet_id: { type: \"string\" },\n },\n },\n },\n },\n },\n {\n name: TOOL_NAMES.replyToTweet,\n displayName: \"Reply to Tweet\",\n description: \"Post a reply to an existing tweet on X.\",\n parametersSchema: {\n type: \"object\",\n properties: {\n tweet_id: { type: \"string\", description: \"Tweet ID to reply to\" },\n text: { type: \"string\", description: \"Reply text (max 280 chars)\" },\n draft_id: { type: \"string\", description: \"Draft entity ID (if from draft)\" },\n metadata: {\n type: \"object\",\n properties: {\n voice: { type: \"string\" },\n content_bucket: { type: \"string\" },\n topic: { type: \"string\" },\n source_tweet_id: { type: \"string\" },\n },\n },\n },\n required: [\"tweet_id\", \"text\"],\n },\n },\n {\n name: TOOL_NAMES.quoteTweet,\n displayName: \"Quote Tweet\",\n description: \"Post a quote tweet on X.\",\n parametersSchema: {\n type: \"object\",\n properties: {\n tweet_id: { type: \"string\", description: \"Tweet ID to quote\" },\n text: { type: \"string\", description: \"Quote text (max 280 chars)\" },\n draft_id: { type: \"string\", description: \"Draft entity ID (if from draft)\" },\n metadata: {\n type: \"object\",\n properties: {\n voice: { type: \"string\" },\n content_bucket: { type: \"string\" },\n topic: { type: \"string\" },\n source_tweet_id: { type: \"string\" },\n },\n },\n },\n required: [\"tweet_id\", \"text\"],\n },\n },\n {\n name: TOOL_NAMES.repost,\n displayName: \"Repost\",\n description: \"Repost (retweet) an existing tweet on X.\",\n parametersSchema: {\n type: \"object\",\n properties: {\n tweet_id: { type: \"string\", description: \"Tweet ID to repost\" },\n draft_id: { type: \"string\", description: \"Draft entity ID (if from draft)\" },\n },\n required: [\"tweet_id\"],\n },\n },\n {\n name: TOOL_NAMES.schedulePost,\n displayName: \"Schedule Post\",\n description: \"Create or update a draft with a scheduled publication time.\",\n parametersSchema: {\n type: \"object\",\n properties: {\n draft_id: { type: \"string\", description: \"Existing draft ID to schedule\" },\n text: { type: \"string\", description: \"Tweet text (creates new draft if no draft_id)\" },\n schedule_at: { type: \"string\", description: \"ISO datetime for publication\" },\n metadata: {\n type: \"object\",\n properties: {\n voice: { type: \"string\" },\n content_bucket: { type: \"string\" },\n topic: { type: \"string\" },\n source_tweet_id: { type: \"string\" },\n },\n },\n },\n required: [\"schedule_at\"],\n },\n },\n {\n name: TOOL_NAMES.publishThread,\n displayName: \"Publish Thread\",\n description: \"Publish a multi-tweet thread to X with reply chaining. Retries on failure; leaves partial thread + alert on persistent failure.\",\n parametersSchema: {\n type: \"object\",\n properties: {\n thread_tweets: { type: \"array\", items: { type: \"string\" }, description: \"Array of tweet texts\" },\n draft_id: { type: \"string\", description: \"Draft entity ID (if from draft)\" },\n metadata: {\n type: \"object\",\n properties: {\n voice: { type: \"string\" },\n content_bucket: { type: \"string\" },\n topic: { type: \"string\" },\n source_tweet_id: { type: \"string\" },\n },\n },\n },\n },\n },\n {\n name: TOOL_NAMES.getDrafts,\n displayName: \"Get Drafts\",\n description: \"Query draft entities, optionally filtered by status.\",\n parametersSchema: {\n type: \"object\",\n properties: {\n status: { type: \"string\", enum: [\"draft\", \"in_review\", \"approved\", \"rejected\", \"stale\"], description: \"Filter by draft status\" },\n limit: { type: \"number\", description: \"Max results (default 20)\" },\n },\n },\n },\n {\n name: TOOL_NAMES.getSchedule,\n displayName: \"Get Schedule\",\n description: \"Get upcoming scheduled posts (drafts with schedule_at set).\",\n parametersSchema: {\n type: \"object\",\n properties: {\n limit: { type: \"number\", description: \"Max results (default 20)\" },\n },\n },\n },\n {\n name: TOOL_NAMES.getPostMetrics,\n displayName: \"Get Post Metrics\",\n description: \"Get engagement metrics for a published post.\",\n parametersSchema: {\n type: \"object\",\n properties: {\n tweet_id: { type: \"string\", description: \"Tweet ID to get metrics for\" },\n },\n required: [\"tweet_id\"],\n },\n },\n {\n name: TOOL_NAMES.getAccountStatus,\n displayName: \"Get Account Status\",\n description: \"Get account health: rate limits, daily post count, token validity.\",\n parametersSchema: {\n type: \"object\",\n properties: {},\n },\n },\n ],\n ui: {\n slots: [\n {\n type: \"dashboardWidget\",\n id: SLOT_IDS.dashboardWidget,\n displayName: \"X Publishing\",\n exportName: EXPORT_NAMES.dashboardWidget,\n },\n {\n type: \"settingsPage\",\n id: SLOT_IDS.settingsPage,\n displayName: \"X Publishing Settings\",\n exportName: EXPORT_NAMES.settingsPage,\n },\n {\n type: \"page\",\n id: SLOT_IDS.contentPage,\n displayName: \"Content Queue\",\n exportName: EXPORT_NAMES.contentPage,\n routePath: \"x-publishing\",\n },\n ],\n },\n};\n\nexport default manifest;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|