@opencoredev/social-sdk 0.1.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.
Files changed (155) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +24 -0
  3. package/dist/cli.d.ts +14 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +223 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/cloud/common.d.ts +26 -0
  8. package/dist/cloud/common.d.ts.map +1 -0
  9. package/dist/cloud/common.js +307 -0
  10. package/dist/cloud/common.js.map +1 -0
  11. package/dist/cloud/lifecycle.d.ts +11 -0
  12. package/dist/cloud/lifecycle.d.ts.map +1 -0
  13. package/dist/cloud/lifecycle.js +108 -0
  14. package/dist/cloud/lifecycle.js.map +1 -0
  15. package/dist/cloud/media.d.ts +24 -0
  16. package/dist/cloud/media.d.ts.map +1 -0
  17. package/dist/cloud/media.js +97 -0
  18. package/dist/cloud/media.js.map +1 -0
  19. package/dist/cloud/outcomes.d.ts +10 -0
  20. package/dist/cloud/outcomes.d.ts.map +1 -0
  21. package/dist/cloud/outcomes.js +188 -0
  22. package/dist/cloud/outcomes.js.map +1 -0
  23. package/dist/cloud/post-for-me.d.ts +70 -0
  24. package/dist/cloud/post-for-me.d.ts.map +1 -0
  25. package/dist/cloud/post-for-me.js +326 -0
  26. package/dist/cloud/post-for-me.js.map +1 -0
  27. package/dist/cloud/zernio.d.ts +112 -0
  28. package/dist/cloud/zernio.d.ts.map +1 -0
  29. package/dist/cloud/zernio.js +542 -0
  30. package/dist/cloud/zernio.js.map +1 -0
  31. package/dist/core/adapter.d.ts +118 -0
  32. package/dist/core/adapter.d.ts.map +1 -0
  33. package/dist/core/adapter.js +4 -0
  34. package/dist/core/adapter.js.map +1 -0
  35. package/dist/core/client.d.ts +108 -0
  36. package/dist/core/client.d.ts.map +1 -0
  37. package/dist/core/client.js +893 -0
  38. package/dist/core/client.js.map +1 -0
  39. package/dist/core/concurrency.d.ts +10 -0
  40. package/dist/core/concurrency.d.ts.map +1 -0
  41. package/dist/core/concurrency.js +78 -0
  42. package/dist/core/concurrency.js.map +1 -0
  43. package/dist/core/errors.d.ts +45 -0
  44. package/dist/core/errors.d.ts.map +1 -0
  45. package/dist/core/errors.js +44 -0
  46. package/dist/core/errors.js.map +1 -0
  47. package/dist/core/idempotency.d.ts +34 -0
  48. package/dist/core/idempotency.d.ts.map +1 -0
  49. package/dist/core/idempotency.js +59 -0
  50. package/dist/core/idempotency.js.map +1 -0
  51. package/dist/core/index.d.ts +7 -0
  52. package/dist/core/index.d.ts.map +1 -0
  53. package/dist/core/index.js +7 -0
  54. package/dist/core/index.js.map +1 -0
  55. package/dist/core/pagination.d.ts +12 -0
  56. package/dist/core/pagination.d.ts.map +1 -0
  57. package/dist/core/pagination.js +81 -0
  58. package/dist/core/pagination.js.map +1 -0
  59. package/dist/core/types.d.ts +329 -0
  60. package/dist/core/types.d.ts.map +1 -0
  61. package/dist/core/types.js +7 -0
  62. package/dist/core/types.js.map +1 -0
  63. package/dist/index.d.ts +2 -0
  64. package/dist/index.d.ts.map +1 -0
  65. package/dist/index.js +2 -0
  66. package/dist/index.js.map +1 -0
  67. package/dist/platforms/bluesky.d.ts +132 -0
  68. package/dist/platforms/bluesky.d.ts.map +1 -0
  69. package/dist/platforms/bluesky.js +1049 -0
  70. package/dist/platforms/bluesky.js.map +1 -0
  71. package/dist/platforms/instagram.d.ts +63 -0
  72. package/dist/platforms/instagram.d.ts.map +1 -0
  73. package/dist/platforms/instagram.js +676 -0
  74. package/dist/platforms/instagram.js.map +1 -0
  75. package/dist/platforms/linkedin.d.ts +54 -0
  76. package/dist/platforms/linkedin.d.ts.map +1 -0
  77. package/dist/platforms/linkedin.js +580 -0
  78. package/dist/platforms/linkedin.js.map +1 -0
  79. package/dist/platforms/threads.d.ts +102 -0
  80. package/dist/platforms/threads.d.ts.map +1 -0
  81. package/dist/platforms/threads.js +571 -0
  82. package/dist/platforms/threads.js.map +1 -0
  83. package/dist/platforms/tiktok.d.ts +32 -0
  84. package/dist/platforms/tiktok.d.ts.map +1 -0
  85. package/dist/platforms/tiktok.js +511 -0
  86. package/dist/platforms/tiktok.js.map +1 -0
  87. package/dist/platforms/x-engagement.d.ts +17 -0
  88. package/dist/platforms/x-engagement.d.ts.map +1 -0
  89. package/dist/platforms/x-engagement.js +47 -0
  90. package/dist/platforms/x-engagement.js.map +1 -0
  91. package/dist/platforms/x.d.ts +82 -0
  92. package/dist/platforms/x.d.ts.map +1 -0
  93. package/dist/platforms/x.js +511 -0
  94. package/dist/platforms/x.js.map +1 -0
  95. package/dist/platforms/youtube-upload.d.ts +33 -0
  96. package/dist/platforms/youtube-upload.d.ts.map +1 -0
  97. package/dist/platforms/youtube-upload.js +281 -0
  98. package/dist/platforms/youtube-upload.js.map +1 -0
  99. package/dist/platforms/youtube.d.ts +55 -0
  100. package/dist/platforms/youtube.d.ts.map +1 -0
  101. package/dist/platforms/youtube.js +561 -0
  102. package/dist/platforms/youtube.js.map +1 -0
  103. package/dist/server/connections.d.ts +124 -0
  104. package/dist/server/connections.d.ts.map +1 -0
  105. package/dist/server/connections.js +334 -0
  106. package/dist/server/connections.js.map +1 -0
  107. package/dist/server/credentials.d.ts +52 -0
  108. package/dist/server/credentials.d.ts.map +1 -0
  109. package/dist/server/credentials.js +115 -0
  110. package/dist/server/credentials.js.map +1 -0
  111. package/dist/server/index.d.ts +5 -0
  112. package/dist/server/index.d.ts.map +1 -0
  113. package/dist/server/index.js +5 -0
  114. package/dist/server/index.js.map +1 -0
  115. package/dist/server/oauth.d.ts +48 -0
  116. package/dist/server/oauth.d.ts.map +1 -0
  117. package/dist/server/oauth.js +483 -0
  118. package/dist/server/oauth.js.map +1 -0
  119. package/dist/server/webhooks.d.ts +58 -0
  120. package/dist/server/webhooks.d.ts.map +1 -0
  121. package/dist/server/webhooks.js +198 -0
  122. package/dist/server/webhooks.js.map +1 -0
  123. package/dist/testing/index.d.ts +47 -0
  124. package/dist/testing/index.d.ts.map +1 -0
  125. package/dist/testing/index.js +413 -0
  126. package/dist/testing/index.js.map +1 -0
  127. package/dist/testing.d.ts +2 -0
  128. package/dist/testing.d.ts.map +1 -0
  129. package/dist/testing.js +2 -0
  130. package/dist/testing.js.map +1 -0
  131. package/dist/transport/binary.d.ts +3 -0
  132. package/dist/transport/binary.d.ts.map +1 -0
  133. package/dist/transport/binary.js +30 -0
  134. package/dist/transport/binary.js.map +1 -0
  135. package/dist/transport/budget.d.ts +4 -0
  136. package/dist/transport/budget.d.ts.map +1 -0
  137. package/dist/transport/budget.js +27 -0
  138. package/dist/transport/budget.js.map +1 -0
  139. package/dist/transport/http.d.ts +44 -0
  140. package/dist/transport/http.d.ts.map +1 -0
  141. package/dist/transport/http.js +230 -0
  142. package/dist/transport/http.js.map +1 -0
  143. package/dist/transport/json.d.ts +3 -0
  144. package/dist/transport/json.d.ts.map +1 -0
  145. package/dist/transport/json.js +11 -0
  146. package/dist/transport/json.js.map +1 -0
  147. package/dist/transport/upload.d.ts +25 -0
  148. package/dist/transport/upload.d.ts.map +1 -0
  149. package/dist/transport/upload.js +133 -0
  150. package/dist/transport/upload.js.map +1 -0
  151. package/dist/transport/validation.d.ts +6 -0
  152. package/dist/transport/validation.d.ts.map +1 -0
  153. package/dist/transport/validation.js +24 -0
  154. package/dist/transport/validation.js.map +1 -0
  155. package/package.json +96 -0
@@ -0,0 +1,571 @@
1
+ import { connectedAccountRef, defineAdapter, platformPostRef, } from "../core/index.js";
2
+ import { SocialError } from "../core/errors.js";
3
+ import { managedHttp, publicFields } from "../cloud/common.js";
4
+ import { object, array, optionalNumber, optionalString } from "../transport/validation.js";
5
+ import { httpsUrl } from "../transport/upload.js";
6
+ export class MemoryThreadsWorkflowStore {
7
+ rows = new Map();
8
+ claims = new Set();
9
+ async create(input) {
10
+ const row = { ...input, id: `thwf_${globalThis.crypto.randomUUID()}` };
11
+ this.rows.set(row.id, structuredClone(row));
12
+ return structuredClone(row);
13
+ }
14
+ async get(id) {
15
+ const row = this.rows.get(id);
16
+ return row ? structuredClone(row) : undefined;
17
+ }
18
+ async update(id, update) {
19
+ const row = this.rows.get(id);
20
+ if (!row)
21
+ throw new Error("Threads workflow not found");
22
+ const next = { ...row, ...update, id };
23
+ this.rows.set(id, structuredClone(next));
24
+ return structuredClone(next);
25
+ }
26
+ async claim(id) {
27
+ if (!this.rows.has(id) || this.claims.has(id))
28
+ return false;
29
+ this.claims.add(id);
30
+ return true;
31
+ }
32
+ async release(id) {
33
+ this.claims.delete(id);
34
+ }
35
+ }
36
+ function fail(operation, message, code = "upstream_failure") {
37
+ throw new SocialError({
38
+ code,
39
+ operation,
40
+ message,
41
+ retryDisposition: { kind: code === "invalid_input" ? "never" : "reconcile-first" },
42
+ });
43
+ }
44
+ const accountRef = (backend, accountId) => connectedAccountRef({ backend, platform: "threads", accountId });
45
+ export function threads(options) {
46
+ const backend = options.backend ?? "default", version = options.graphVersion ?? "v1.0", auth = options.auth, store = options.workflowStore ?? new MemoryThreadsWorkflowStore(), now = () => (options.clock?.() ?? new Date()).toISOString();
47
+ const http = managedHttp(`https://graph.threads.net/${version}`, {
48
+ apiKey: auth.accessToken,
49
+ ...(options.fetch ? { fetch: options.fetch } : {}),
50
+ });
51
+ async function request(path, init, operation, context) {
52
+ const [raw = "", qs] = path.split("?", 2);
53
+ const query = Object.fromEntries(new URLSearchParams(qs ?? ""));
54
+ try {
55
+ return object(await http(`/${raw.replace(/^\//, "")}`, context, init.method === "POST" ? {} : undefined, query, init.method === "POST" || init.method === "DELETE" || init.method === "PUT"
56
+ ? init.method
57
+ : "GET"));
58
+ }
59
+ catch (e) {
60
+ if (e instanceof SocialError)
61
+ throw e;
62
+ fail(operation, "Threads API request failed.");
63
+ }
64
+ }
65
+ function authorize(ref, op) {
66
+ if (ref.backend !== backend || ref.platform !== "threads" || ref.accountId !== auth.userId)
67
+ fail(op, "Account reference does not match this Threads authorization.", "unauthorized");
68
+ }
69
+ const account = accountRef(backend, auth.userId);
70
+ async function readAccount(context) {
71
+ const v = await request("/me?fields=id,username", { method: "GET" }, "threads.accounts.read", context);
72
+ const id = v["id"], username = v["username"];
73
+ if (typeof id !== "string" || id !== auth.userId)
74
+ fail("threads.accounts.read", "Threads returned an unauthorized account.", "unauthorized");
75
+ return {
76
+ ref: account,
77
+ displayName: typeof username === "string" ? username : (auth.handle ?? auth.userId),
78
+ ...(typeof username === "string" ? { handle: username } : {}),
79
+ status: "connected",
80
+ };
81
+ }
82
+ async function listPosts(selected, input, context) {
83
+ authorize(selected, "threads.posts.list");
84
+ if (input.limit !== undefined &&
85
+ (!Number.isSafeInteger(input.limit) || input.limit < 1 || input.limit > 100))
86
+ fail("threads.posts.list", "Threads feed limit must be an integer from 1 through 100.", "invalid_input");
87
+ const query = new URLSearchParams({
88
+ fields: "id,text,username,media_type,permalink,timestamp",
89
+ });
90
+ if (input.cursor !== undefined)
91
+ query.set("after", input.cursor);
92
+ if (input.limit !== undefined)
93
+ query.set("limit", String(input.limit));
94
+ const result = await request(`${encodeURIComponent(selected.accountId)}/threads?${query.toString()}`, { method: "GET" }, "threads.posts.list", context);
95
+ const items = array(result["data"]).map((entry) => publicFields(entry, ["id", "text", "username", "media_type", "permalink", "timestamp"]));
96
+ const paging = result["paging"] === undefined ? {} : object(result["paging"]);
97
+ const cursors = paging["cursors"] === undefined ? {} : object(paging["cursors"]);
98
+ const hasNext = typeof paging["next"] === "string" && paging["next"].length > 0;
99
+ const nextCursor = hasNext && typeof cursors["after"] === "string" ? cursors["after"] : undefined;
100
+ return {
101
+ items,
102
+ ...(nextCursor === undefined ? {} : { nextCursor }),
103
+ };
104
+ }
105
+ async function getAccountMetrics(selected, context) {
106
+ authorize(selected, "threads.analytics");
107
+ const metricNames = [
108
+ "views",
109
+ "likes",
110
+ "replies",
111
+ "reposts",
112
+ "quotes",
113
+ "clicks",
114
+ "followers_count",
115
+ ];
116
+ const result = await request(`${encodeURIComponent(selected.accountId)}/threads_insights?metric=${metricNames.join(",")}`, { method: "GET" }, "threads.analytics", context);
117
+ const allowed = new Set(metricNames);
118
+ return array(result["data"]).flatMap((entry) => {
119
+ const row = object(entry);
120
+ const name = typeof row["name"] === "string" ? row["name"] : undefined;
121
+ if (name === undefined || !allowed.has(name))
122
+ return [];
123
+ const total = row["total_value"] === undefined ? undefined : object(row["total_value"]);
124
+ const values = row["values"] === undefined ? [] : array(row["values"]);
125
+ const latest = values.at(-1);
126
+ const totalValue = optionalNumber(total?.["value"]);
127
+ const value = totalValue ?? (latest === undefined ? undefined : optionalNumber(object(latest)["value"]));
128
+ if (value === undefined)
129
+ return [];
130
+ const latestEnd = latest === undefined ? undefined : optionalString(object(latest)["end_time"]);
131
+ const totalIsLifetime = totalValue !== undefined && (row["period"] === "lifetime" || name === "followers_count");
132
+ const period = totalValue !== undefined
133
+ ? totalIsLifetime
134
+ ? "lifetime"
135
+ : "unknown"
136
+ : totalValue === undefined &&
137
+ row["period"] === "day" &&
138
+ latestEnd !== undefined &&
139
+ Number.isFinite(Date.parse(latestEnd))
140
+ ? {
141
+ from: new Date(Date.parse(latestEnd) - 86_400_000).toISOString(),
142
+ to: latestEnd,
143
+ }
144
+ : "unknown";
145
+ return [
146
+ {
147
+ name,
148
+ value,
149
+ unit: "count",
150
+ period,
151
+ ...(totalValue === undefined && latestEnd !== undefined ? { measuredAt: latestEnd } : {}),
152
+ fetchedAt: now(),
153
+ freshness: "unknown",
154
+ source: `threads:${version}`,
155
+ },
156
+ ];
157
+ });
158
+ }
159
+ async function status(id, c) {
160
+ return request(`${encodeURIComponent(id)}?fields=id,status,error_message`, { method: "GET", ...(c.signal ? { signal: c.signal } : {}) }, "threads.container.status", c);
161
+ }
162
+ const base = (a, id, state, backendState) => ({
163
+ state,
164
+ targetIndex: 0,
165
+ account: a,
166
+ observedAt: now(),
167
+ ...(backendState ? { backendState } : {}),
168
+ delivery: {
169
+ kind: "delivery",
170
+ version: 1,
171
+ backend: a.backend,
172
+ platform: "threads",
173
+ accountId: a.accountId,
174
+ deliveryId: id,
175
+ },
176
+ });
177
+ const terminalFailure = (a, id, state) => ({
178
+ ...base(a, id, "failed", state),
179
+ code: "media_error",
180
+ message: "Threads container failed or expired before publication.",
181
+ retryDisposition: { kind: "never" },
182
+ });
183
+ async function resume(w, a, c) {
184
+ if (w.nativeId)
185
+ return {
186
+ ...base(a, w.id, "published", "PUBLISHED"),
187
+ post: platformPostRef({
188
+ backend,
189
+ platform: "threads",
190
+ accountId: a.accountId,
191
+ postId: w.nativeId,
192
+ }),
193
+ };
194
+ if (w.stage === "unknown")
195
+ return {
196
+ ...base(a, w.id, "unknown", w.backendState),
197
+ reason: "ambiguous-submission",
198
+ diagnostic: "Threads publish acceptance is unknown; no replay was attempted.",
199
+ };
200
+ let cur = w;
201
+ const items = Array.isArray(cur.options["_mediaItems"]) ? cur.options["_mediaItems"] : [];
202
+ while (cur.childIds.length < items.length) {
203
+ const item = object(items[cur.childIds.length]);
204
+ const p = new URLSearchParams({
205
+ media_type: item["kind"] === "video" ? "VIDEO" : "IMAGE",
206
+ is_carousel_item: "true",
207
+ ...(item["kind"] === "video"
208
+ ? { video_url: String(item["url"]) }
209
+ : { image_url: String(item["url"]) }),
210
+ ...(typeof item["altText"] === "string" ? { alt_text: item["altText"] } : {}),
211
+ });
212
+ await store.update(cur.id, { stage: "unknown", backendState: "CREATING_CHILD" });
213
+ const child = await request(`${a.accountId}/threads?${p}`, { method: "POST", ...(c.signal ? { signal: c.signal } : {}) }, "threads.container.child", c);
214
+ if (typeof child["id"] !== "string")
215
+ fail("threads.container.child", "Threads did not return a child container ID.");
216
+ cur = await store.update(cur.id, {
217
+ childIds: [...cur.childIds, child["id"]],
218
+ stage: "children",
219
+ });
220
+ }
221
+ for (const id of cur.childIds) {
222
+ const s = await status(id, c);
223
+ const st = typeof s["status"] === "string" ? s["status"] : "";
224
+ if (st === "ERROR" || st === "EXPIRED")
225
+ return terminalFailure(a, w.id, st);
226
+ if (st !== "FINISHED" && st !== "PUBLISHED")
227
+ return base(a, w.id, "processing", st || "PROCESSING");
228
+ }
229
+ if (!cur.parentId) {
230
+ const singleKind = cur.options["_mediaKind"];
231
+ const singleUrl = cur.options["_mediaUrl"];
232
+ const p = new URLSearchParams({
233
+ media_type: cur.childIds.length
234
+ ? "CAROUSEL"
235
+ : singleKind === "video"
236
+ ? "VIDEO"
237
+ : singleKind === "image"
238
+ ? "IMAGE"
239
+ : "TEXT",
240
+ ...(cur.childIds.length ? { children: cur.childIds.join(",") } : {}),
241
+ ...(typeof singleUrl === "string"
242
+ ? singleKind === "video"
243
+ ? { video_url: singleUrl }
244
+ : { image_url: singleUrl }
245
+ : {}),
246
+ ...(typeof cur.options["_altText"] === "string"
247
+ ? { alt_text: cur.options["_altText"] }
248
+ : {}),
249
+ ...(cur.caption ? { text: cur.caption } : {}),
250
+ ...(typeof cur.options["replyControl"] === "string"
251
+ ? { reply_control: cur.options["replyControl"] }
252
+ : {}),
253
+ ...(typeof cur.options["_replyToId"] === "string"
254
+ ? { reply_to_id: cur.options["_replyToId"] }
255
+ : {}),
256
+ });
257
+ // Persist ambiguity before dispatch so a process crash cannot recreate a
258
+ // possibly accepted container under the same continuation handle.
259
+ await store.update(cur.id, { stage: "unknown", backendState: "CREATING_PARENT" });
260
+ const parent = await request(`${a.accountId}/threads?${p}`, { method: "POST", ...(c.signal ? { signal: c.signal } : {}) }, "threads.container.create", c);
261
+ const parentId = parent["id"];
262
+ if (typeof parentId !== "string")
263
+ fail("threads.container.create", "Threads did not return a container ID.");
264
+ cur = await store.update(cur.id, { parentId, stage: "parent" });
265
+ }
266
+ const parentId = cur.parentId;
267
+ if (!parentId)
268
+ fail("threads.container.create", "Missing parent container ID.");
269
+ const ps = await status(parentId, c);
270
+ const pst = typeof ps["status"] === "string" ? ps["status"] : "";
271
+ if (pst === "ERROR" || pst === "EXPIRED")
272
+ return terminalFailure(a, cur.id, pst);
273
+ if (pst === "PUBLISHED") {
274
+ await store.update(cur.id, { stage: "unknown", backendState: "PUBLISHED_WITHOUT_NATIVE_ID" });
275
+ return {
276
+ ...base(a, cur.id, "unknown", pst),
277
+ reason: "ambiguous-submission",
278
+ };
279
+ }
280
+ if (pst !== "FINISHED")
281
+ return base(a, cur.id, "processing", pst || "PROCESSING");
282
+ await store.update(cur.id, { stage: "unknown", backendState: "PUBLISHING" });
283
+ try {
284
+ const pub = await request(`${a.accountId}/threads_publish?creation_id=${encodeURIComponent(parentId)}`, { method: "POST", ...(c.signal ? { signal: c.signal } : {}) }, "threads.publish", c);
285
+ const nativeId = pub["id"];
286
+ if (typeof nativeId !== "string") {
287
+ await store.update(cur.id, { stage: "unknown", backendState: "MISSING_ID" });
288
+ return {
289
+ ...base(a, cur.id, "unknown", "MISSING_ID"),
290
+ reason: "ambiguous-submission",
291
+ diagnostic: "Threads accepted publish without a native post ID.",
292
+ };
293
+ }
294
+ await store.update(cur.id, { nativeId, stage: "published", backendState: "PUBLISHED" });
295
+ return {
296
+ ...base(a, cur.id, "published", "PUBLISHED"),
297
+ post: platformPostRef({
298
+ backend,
299
+ platform: "threads",
300
+ accountId: a.accountId,
301
+ postId: nativeId,
302
+ }),
303
+ };
304
+ }
305
+ catch (e) {
306
+ await store.update(cur.id, { stage: "unknown", backendState: "AMBIGUOUS" });
307
+ if (e instanceof SocialError)
308
+ return {
309
+ ...base(a, cur.id, "unknown", "AMBIGUOUS"),
310
+ reason: "ambiguous-submission",
311
+ diagnostic: e.message,
312
+ };
313
+ throw e;
314
+ }
315
+ }
316
+ const capabilities = {
317
+ schemaVersion: 1,
318
+ backend,
319
+ apiRevision: `Meta Threads Graph ${version}`,
320
+ runtime: ["node>=22.12", "bun"],
321
+ capabilities: [
322
+ { operation: "accounts.read", platform: "threads", availability: "available" },
323
+ {
324
+ operation: "posts.publish",
325
+ platform: "threads",
326
+ availability: "available",
327
+ formats: ["text", "image", "video", "carousel"],
328
+ },
329
+ { operation: "posts.read", platform: "threads", availability: "available" },
330
+ { operation: "posts.list", platform: "threads", availability: "available" },
331
+ { operation: "posts.status", platform: "threads", availability: "available" },
332
+ { operation: "analytics.read", platform: "threads", availability: "available" },
333
+ { operation: "comments.read", platform: "threads", availability: "available" },
334
+ { operation: "comments.write", platform: "threads", availability: "available" },
335
+ { operation: "posts.quote", platform: "threads", availability: "available" },
336
+ { operation: "posts.repost", platform: "threads", availability: "available" },
337
+ { operation: "posts.delete", platform: "threads", availability: "available" },
338
+ { operation: "profile.read", platform: "threads", availability: "available" },
339
+ { operation: "search.keyword", platform: "threads", availability: "available" },
340
+ { operation: "mentions.read", platform: "threads", availability: "available" },
341
+ {
342
+ operation: "messages.read",
343
+ platform: "threads",
344
+ availability: "unsupported-by-platform",
345
+ notes: "Threads does not expose messaging APIs to standard apps.",
346
+ },
347
+ ],
348
+ };
349
+ const native = {
350
+ getPost: (id, c) => request(`${encodeURIComponent(id)}?fields=id,text,username,media_type,permalink`, { method: "GET", ...(c.signal ? { signal: c.signal } : {}) }, "threads.posts.get", c),
351
+ getContainer: (id, c) => status(id, c),
352
+ resumePublication: async (a, id, c) => {
353
+ authorize(a, "threads.posts.resume");
354
+ const w = await store.get(id);
355
+ if (!w || w.backend !== backend || w.accountId !== a.accountId)
356
+ fail("threads.posts.resume", "Workflow handle is not authorized for this account.", "unauthorized");
357
+ if (!(await store.claim(id)))
358
+ return base(a, id, "processing", "CLAIMED");
359
+ try {
360
+ return await resume((await store.get(id)) ?? w, a, c);
361
+ }
362
+ finally {
363
+ await store.release?.(id);
364
+ }
365
+ },
366
+ async quotePost({ account, postId, text, context }) {
367
+ authorize(account, "threads.posts.quote");
368
+ return request(`${encodeURIComponent(account.accountId)}/threads?media_type=TEXT&text=${encodeURIComponent(text)}&quote_id=${encodeURIComponent(postId)}`, { method: "POST" }, "threads.posts.quote", context);
369
+ },
370
+ async repost({ account, postId, context }) {
371
+ authorize(account, "threads.posts.repost");
372
+ return request(`${encodeURIComponent(account.accountId)}/threads?media_type=TEXT&repost_id=${encodeURIComponent(postId)}`, { method: "POST" }, "threads.posts.repost", context);
373
+ },
374
+ async deletePost({ account, postId, context }) {
375
+ authorize(account, "threads.posts.delete");
376
+ await request(encodeURIComponent(postId), { method: "DELETE" }, "threads.posts.delete", context);
377
+ },
378
+ async search({ account, query, cursor, context }) {
379
+ authorize(account, "threads.search");
380
+ return request(`keyword_search?query=${encodeURIComponent(query)}${cursor ? `&after=${encodeURIComponent(cursor)}` : ""}`, { method: "GET" }, "threads.search", context);
381
+ },
382
+ async mentions({ account, cursor, context }) {
383
+ authorize(account, "threads.mentions");
384
+ return request(`${encodeURIComponent(account.accountId)}/mentions${cursor ? `?after=${encodeURIComponent(cursor)}` : ""}`, { method: "GET" }, "threads.mentions", context);
385
+ },
386
+ async getProfile({ account, context }) {
387
+ authorize(account, "threads.profile.read");
388
+ return request(`${encodeURIComponent(account.accountId)}?fields=id,username,name,threads_profile_picture_url`, { method: "GET" }, "threads.profile.read", context);
389
+ },
390
+ };
391
+ const adapter = defineAdapter({
392
+ id: backend,
393
+ capabilities,
394
+ native,
395
+ accounts: {
396
+ list: async (_input, context) => ({ items: [await readAccount(context)] }),
397
+ get: async (ref, context) => {
398
+ authorize(ref, "threads.accounts.get");
399
+ return readAccount(context);
400
+ },
401
+ },
402
+ posts: {
403
+ list: listPosts,
404
+ prepareTarget(target) {
405
+ const issues = [];
406
+ const add = (code, message) => issues.push({ code, message, severity: "error", targetIndex: target.targetIndex });
407
+ authorize(target.account, "threads.posts.prepare");
408
+ const media = target.content.media ?? [];
409
+ if ((target.content.text?.length ?? 0) > 500)
410
+ add("text.too_long", "Threads text is limited to 500 characters.");
411
+ if (media.length > 10)
412
+ add("media.too_many", "Threads carousels support at most ten items.");
413
+ if (!media.length && !target.content.text)
414
+ add("content.empty", "Threads requires text or media.");
415
+ for (const item of media) {
416
+ if (item.source.kind !== "https-url")
417
+ add("media.url_required", "Threads requires public HTTPS media URLs.");
418
+ else
419
+ try {
420
+ httpsUrl(item.source.url);
421
+ }
422
+ catch {
423
+ add("media.url_invalid", "Use public HTTPS media without credentials or local hosts.");
424
+ }
425
+ if (item.kind === "image" &&
426
+ item.mimeType &&
427
+ item.mimeType !== "image/jpeg" &&
428
+ item.mimeType !== "image/png")
429
+ add("media.format", "Threads images must be JPEG or PNG.");
430
+ if (item.kind === "video" && item.mimeType && item.mimeType !== "video/mp4")
431
+ add("media.format", "Threads videos must be MP4.");
432
+ if (item.altText && item.altText.length > 1000)
433
+ add("media.alt_text", "Alt text is limited to 1,000 characters.");
434
+ }
435
+ if (target.options !== undefined) {
436
+ const o = object(target.options);
437
+ if (Object.keys(o).some((key) => key !== "replyControl"))
438
+ add("options.unmapped", "A supplied option has no Threads mapping.");
439
+ const replyControl = o["replyControl"];
440
+ if (replyControl !== undefined &&
441
+ replyControl !== "everyone" &&
442
+ replyControl !== "accountsYouFollow" &&
443
+ replyControl !== "mentionedOnly")
444
+ add("options.reply_control", "Unsupported Threads reply control.");
445
+ }
446
+ if (target.schedule)
447
+ add("schedule.unsupported", "Threads scheduling requires an application-owned runner.");
448
+ return issues;
449
+ },
450
+ async publishTarget(target) {
451
+ authorize(target.account, "threads.posts.publish");
452
+ const media = target.content.media ?? [];
453
+ const item = media.length === 1 ? media[0] : undefined;
454
+ const opts = {
455
+ ...object(target.options ?? {}),
456
+ ...(target.replyTo ? { _replyToId: target.replyTo.postId } : {}),
457
+ ...(media.length > 1
458
+ ? {
459
+ _mediaItems: media.map((entry) => ({
460
+ kind: entry.kind,
461
+ url: entry.source.kind === "https-url" ? entry.source.url : "",
462
+ ...(entry.altText ? { altText: entry.altText } : {}),
463
+ })),
464
+ }
465
+ : {}),
466
+ ...(item?.source.kind === "https-url"
467
+ ? {
468
+ _mediaKind: item.kind,
469
+ _mediaUrl: item.source.url,
470
+ ...(item.altText ? { _altText: item.altText } : {}),
471
+ }
472
+ : {}),
473
+ };
474
+ const w = await store.create({
475
+ backend,
476
+ accountId: target.account.accountId,
477
+ childIds: [],
478
+ caption: target.content.text ?? "",
479
+ options: opts,
480
+ stage: "children",
481
+ });
482
+ return {
483
+ ...base(target.account, w.id, "processing", "CREATED"),
484
+ targetIndex: target.targetIndex,
485
+ };
486
+ },
487
+ async get(ref, c) {
488
+ authorize(ref, "threads.posts.get");
489
+ return native.getPost(ref.postId, c);
490
+ },
491
+ async getDelivery(ref, _c) {
492
+ authorize(ref, "threads.posts.status");
493
+ const w = await store.get(ref.deliveryId);
494
+ if (!w || w.backend !== backend || w.accountId !== ref.accountId)
495
+ fail("threads.posts.status", "Workflow handle is not authorized for this account.", "unauthorized");
496
+ if (w.nativeId)
497
+ return {
498
+ ...base(accountRef(backend, ref.accountId), w.id, "published", "PUBLISHED"),
499
+ post: platformPostRef({
500
+ backend,
501
+ platform: "threads",
502
+ accountId: ref.accountId,
503
+ postId: w.nativeId,
504
+ }),
505
+ };
506
+ if (w.stage === "unknown")
507
+ return {
508
+ ...base(accountRef(backend, ref.accountId), w.id, "unknown", w.backendState),
509
+ reason: "ambiguous-submission",
510
+ diagnostic: "Explicit resumePublication is required.",
511
+ };
512
+ return base(accountRef(backend, ref.accountId), w.id, "processing", w.stage.toUpperCase());
513
+ },
514
+ },
515
+ comments: {
516
+ async list(post, input, context) {
517
+ authorize(post, "threads.comments.list");
518
+ const result = await request(`${encodeURIComponent(post.postId)}/replies?fields=id,text,username,timestamp${input.cursor ? `&after=${encodeURIComponent(input.cursor)}` : ""}`, { method: "GET" }, "threads.comments.list", context);
519
+ const rows = Array.isArray(result["data"]) ? result["data"] : [];
520
+ return {
521
+ items: rows,
522
+ ...(typeof result["paging"] === "object" &&
523
+ result["paging"] &&
524
+ typeof result["paging"]["next"] === "string"
525
+ ? { nextCursor: String(result["paging"]["next"]) }
526
+ : {}),
527
+ };
528
+ },
529
+ async reply(comment, content, context) {
530
+ authorize(comment, "threads.comments.reply");
531
+ if (!content.text.trim())
532
+ fail("threads.comments.reply", "Comment text is required.", "invalid_input");
533
+ const result = await request(`${encodeURIComponent(comment.postId)}/replies`, { method: "POST" }, "threads.comments.reply", context);
534
+ return {
535
+ ...comment,
536
+ commentId: typeof result["id"] === "string" ? result["id"] : comment.commentId,
537
+ };
538
+ },
539
+ },
540
+ analytics: {
541
+ getAccountMetrics,
542
+ async getPostMetrics(post, c) {
543
+ authorize(post, "threads.analytics");
544
+ const r = await request(`${encodeURIComponent(post.postId)}/insights?metric=views,likes,replies,reposts,quotes,shares`, { method: "GET", ...(c.signal ? { signal: c.signal } : {}) }, "threads.analytics", c);
545
+ return array(r["data"]).flatMap((x) => {
546
+ const row = object(x);
547
+ const first = Array.isArray(row["values"]) ? row["values"][0] : undefined;
548
+ const value = first && typeof first === "object"
549
+ ? optionalNumber(object(first)["value"])
550
+ : optionalNumber(row["value"]);
551
+ const name = row["name"];
552
+ return value === undefined || typeof name !== "string"
553
+ ? []
554
+ : [
555
+ {
556
+ name,
557
+ value,
558
+ unit: "count",
559
+ period: "lifetime",
560
+ fetchedAt: now(),
561
+ freshness: "unknown",
562
+ source: `threads:${version}`,
563
+ },
564
+ ];
565
+ });
566
+ },
567
+ },
568
+ });
569
+ return adapter;
570
+ }
571
+ //# sourceMappingURL=threads.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"threads.js","sourceRoot":"","sources":["../../src/platforms/threads.ts"],"names":[],"mappings":"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"}