@classytic/social 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 (121) hide show
  1. package/CHANGELOG.md +65 -0
  2. package/LICENSE +21 -0
  3. package/README.md +368 -0
  4. package/dist/base-Bw7e52V8.mjs +246 -0
  5. package/dist/base-Bw7e52V8.mjs.map +1 -0
  6. package/dist/base-DBtKFiSX.d.mts +226 -0
  7. package/dist/base-DBtKFiSX.d.mts.map +1 -0
  8. package/dist/chunk-DQk6qfdC.mjs +18 -0
  9. package/dist/client/index.d.mts +44 -0
  10. package/dist/client/index.d.mts.map +1 -0
  11. package/dist/client/index.mjs +154 -0
  12. package/dist/client/index.mjs.map +1 -0
  13. package/dist/common/index.d.mts +3 -0
  14. package/dist/common/index.mjs +7 -0
  15. package/dist/contracts-Cdwa4zlg.d.mts +121 -0
  16. package/dist/contracts-Cdwa4zlg.d.mts.map +1 -0
  17. package/dist/contracts-lCa069IK.mjs +221 -0
  18. package/dist/contracts-lCa069IK.mjs.map +1 -0
  19. package/dist/env-Bl0cwwjC.mjs +955 -0
  20. package/dist/env-Bl0cwwjC.mjs.map +1 -0
  21. package/dist/env-DxOZHf0p.d.mts +394 -0
  22. package/dist/env-DxOZHf0p.d.mts.map +1 -0
  23. package/dist/errors-Cm6LeKf7.mjs +32 -0
  24. package/dist/errors-Cm6LeKf7.mjs.map +1 -0
  25. package/dist/facebook-l_4CghaA.mjs +95 -0
  26. package/dist/facebook-l_4CghaA.mjs.map +1 -0
  27. package/dist/http-DpcLSR1M.mjs +197 -0
  28. package/dist/http-DpcLSR1M.mjs.map +1 -0
  29. package/dist/index.d.mts +42 -0
  30. package/dist/index.d.mts.map +1 -0
  31. package/dist/index.mjs +71 -0
  32. package/dist/index.mjs.map +1 -0
  33. package/dist/instagram-BGaeUFU2.mjs +90 -0
  34. package/dist/instagram-BGaeUFU2.mjs.map +1 -0
  35. package/dist/linkedin-70whtVKa.mjs +101 -0
  36. package/dist/linkedin-70whtVKa.mjs.map +1 -0
  37. package/dist/meta-D3vcJU1c.mjs +126 -0
  38. package/dist/meta-D3vcJU1c.mjs.map +1 -0
  39. package/dist/pkce-jq5II68b.mjs +72 -0
  40. package/dist/pkce-jq5II68b.mjs.map +1 -0
  41. package/dist/polling-DZ1apXtA.mjs +25 -0
  42. package/dist/polling-DZ1apXtA.mjs.map +1 -0
  43. package/dist/providers/facebook.d.mts +135 -0
  44. package/dist/providers/facebook.d.mts.map +1 -0
  45. package/dist/providers/facebook.mjs +450 -0
  46. package/dist/providers/facebook.mjs.map +1 -0
  47. package/dist/providers/instagram.d.mts +122 -0
  48. package/dist/providers/instagram.d.mts.map +1 -0
  49. package/dist/providers/instagram.mjs +496 -0
  50. package/dist/providers/instagram.mjs.map +1 -0
  51. package/dist/providers/linkedin.d.mts +145 -0
  52. package/dist/providers/linkedin.d.mts.map +1 -0
  53. package/dist/providers/linkedin.mjs +574 -0
  54. package/dist/providers/linkedin.mjs.map +1 -0
  55. package/dist/providers/reddit.d.mts +102 -0
  56. package/dist/providers/reddit.d.mts.map +1 -0
  57. package/dist/providers/reddit.mjs +657 -0
  58. package/dist/providers/reddit.mjs.map +1 -0
  59. package/dist/providers/telegram.d.mts +139 -0
  60. package/dist/providers/telegram.d.mts.map +1 -0
  61. package/dist/providers/telegram.mjs +517 -0
  62. package/dist/providers/telegram.mjs.map +1 -0
  63. package/dist/providers/tiktok.d.mts +116 -0
  64. package/dist/providers/tiktok.d.mts.map +1 -0
  65. package/dist/providers/tiktok.mjs +676 -0
  66. package/dist/providers/tiktok.mjs.map +1 -0
  67. package/dist/providers/twitter.d.mts +150 -0
  68. package/dist/providers/twitter.d.mts.map +1 -0
  69. package/dist/providers/twitter.mjs +628 -0
  70. package/dist/providers/twitter.mjs.map +1 -0
  71. package/dist/providers/whatsapp.d.mts +79 -0
  72. package/dist/providers/whatsapp.d.mts.map +1 -0
  73. package/dist/providers/whatsapp.mjs +376 -0
  74. package/dist/providers/whatsapp.mjs.map +1 -0
  75. package/dist/providers/youtube.d.mts +153 -0
  76. package/dist/providers/youtube.d.mts.map +1 -0
  77. package/dist/providers/youtube.mjs +902 -0
  78. package/dist/providers/youtube.mjs.map +1 -0
  79. package/dist/reddit-B10kS4Se.mjs +126 -0
  80. package/dist/reddit-B10kS4Se.mjs.map +1 -0
  81. package/dist/schemas/index.d.mts +819 -0
  82. package/dist/schemas/index.d.mts.map +1 -0
  83. package/dist/schemas/index.mjs +31 -0
  84. package/dist/schemas/index.mjs.map +1 -0
  85. package/dist/security-BXhfebWm.d.mts +338 -0
  86. package/dist/security-BXhfebWm.d.mts.map +1 -0
  87. package/dist/shared-Fvc6xQku.mjs +100 -0
  88. package/dist/shared-Fvc6xQku.mjs.map +1 -0
  89. package/dist/telegram-FaUHpZgB.mjs +107 -0
  90. package/dist/telegram-FaUHpZgB.mjs.map +1 -0
  91. package/dist/tiktok-B_bMk4G-.mjs +94 -0
  92. package/dist/tiktok-B_bMk4G-.mjs.map +1 -0
  93. package/dist/twitter-BC22zfuc.mjs +98 -0
  94. package/dist/twitter-BC22zfuc.mjs.map +1 -0
  95. package/dist/types-BFE4psYI.d.mts +102 -0
  96. package/dist/types-BFE4psYI.d.mts.map +1 -0
  97. package/dist/types-Bv27tcT0.d.mts +230 -0
  98. package/dist/types-Bv27tcT0.d.mts.map +1 -0
  99. package/dist/types-BwkKyqpi.d.mts +253 -0
  100. package/dist/types-BwkKyqpi.d.mts.map +1 -0
  101. package/dist/types-CJrHMDV9.mjs +27 -0
  102. package/dist/types-CJrHMDV9.mjs.map +1 -0
  103. package/dist/types-ClbVc2rc.d.mts +117 -0
  104. package/dist/types-ClbVc2rc.d.mts.map +1 -0
  105. package/dist/types-D91N16Ym.d.mts +242 -0
  106. package/dist/types-D91N16Ym.d.mts.map +1 -0
  107. package/dist/types-DfLp_ibQ.d.mts +178 -0
  108. package/dist/types-DfLp_ibQ.d.mts.map +1 -0
  109. package/dist/types-DfjDgEoJ.d.mts +88 -0
  110. package/dist/types-DfjDgEoJ.d.mts.map +1 -0
  111. package/dist/types-Dp5Z9VBr.mjs +23 -0
  112. package/dist/types-Dp5Z9VBr.mjs.map +1 -0
  113. package/dist/types-hriBJTsU.d.mts +129 -0
  114. package/dist/types-hriBJTsU.d.mts.map +1 -0
  115. package/dist/types-rn6UuLL8.d.mts +184 -0
  116. package/dist/types-rn6UuLL8.d.mts.map +1 -0
  117. package/dist/whatsapp-CFp7ryR4.mjs +101 -0
  118. package/dist/whatsapp-CFp7ryR4.mjs.map +1 -0
  119. package/dist/youtube-Bs0fdY7H.mjs +98 -0
  120. package/dist/youtube-Bs0fdY7H.mjs.map +1 -0
  121. package/package.json +148 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/schemas/shared.ts","../../src/schemas/youtube.ts","../../src/schemas/tiktok.ts","../../src/schemas/instagram.ts","../../src/schemas/facebook.ts","../../src/schemas/linkedin.ts","../../src/schemas/telegram.ts","../../src/schemas/whatsapp.ts","../../src/schemas/twitter.ts","../../src/schemas/reddit.ts","../../src/schemas/index.ts"],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import { a as PrivacyLevel, i as OAuthTokensSchema, n as ISODateTime, o as PublicUrl, r as NonEmptyString, s as fieldsFromSchema, t as ClientCredentials } from "../shared-Fvc6xQku.mjs";
2
+ import { i as twitter_exports, n as twitterCapabilities, r as twitterInfo, t as TwitterCredentialsSchema } from "../twitter-BC22zfuc.mjs";
3
+ import { i as facebook_exports, n as facebookCapabilities, r as facebookInfo, t as FacebookCredentialsSchema } from "../facebook-l_4CghaA.mjs";
4
+ import { i as linkedin_exports, n as linkedinCapabilities, r as linkedinInfo, t as LinkedInCredentialsSchema } from "../linkedin-70whtVKa.mjs";
5
+ import { i as reddit_exports, n as redditCapabilities, r as redditInfo, t as RedditCredentialsSchema } from "../reddit-B10kS4Se.mjs";
6
+ import { i as instagram_exports, n as instagramCapabilities, r as instagramInfo, t as InstagramCredentialsSchema } from "../instagram-BGaeUFU2.mjs";
7
+ import { i as youtube_exports, n as youtubeCapabilities, r as youtubeInfo, t as YouTubeCredentialsSchema } from "../youtube-Bs0fdY7H.mjs";
8
+ import { i as tiktok_exports, n as tiktokCapabilities, r as tiktokInfo, t as TikTokCredentialsSchema } from "../tiktok-B_bMk4G-.mjs";
9
+ import { i as telegram_exports, n as telegramCapabilities, r as telegramInfo, t as TelegramCredentialsSchema } from "../telegram-FaUHpZgB.mjs";
10
+ import { i as whatsapp_exports, n as whatsappCapabilities, r as whatsappInfo, t as WhatsAppCredentialsSchema } from "../whatsapp-CFp7ryR4.mjs";
11
+
12
+ //#region src/schemas/index.ts
13
+ const allCapabilities = {
14
+ youtube: youtubeCapabilities,
15
+ tiktok: tiktokCapabilities,
16
+ instagram: instagramCapabilities,
17
+ facebook: facebookCapabilities,
18
+ linkedin: linkedinCapabilities,
19
+ telegram: telegramCapabilities,
20
+ whatsapp: whatsappCapabilities,
21
+ twitter: twitterCapabilities,
22
+ reddit: redditCapabilities
23
+ };
24
+ /** Convenience: list provider names that have a given capability. */
25
+ function providersWithCapability(key, value = true) {
26
+ return Object.entries(allCapabilities).filter(([, caps]) => caps[key] === value).map(([name]) => name);
27
+ }
28
+
29
+ //#endregion
30
+ export { ClientCredentials, facebook_exports as Facebook, FacebookCredentialsSchema, ISODateTime, instagram_exports as Instagram, InstagramCredentialsSchema, linkedin_exports as LinkedIn, LinkedInCredentialsSchema, NonEmptyString, OAuthTokensSchema, PrivacyLevel, PublicUrl, reddit_exports as Reddit, RedditCredentialsSchema, telegram_exports as Telegram, TelegramCredentialsSchema, tiktok_exports as TikTok, TikTokCredentialsSchema, twitter_exports as Twitter, TwitterCredentialsSchema, whatsapp_exports as WhatsApp, WhatsAppCredentialsSchema, youtube_exports as YouTube, YouTubeCredentialsSchema, allCapabilities, facebookCapabilities, facebookInfo, fieldsFromSchema, instagramCapabilities, instagramInfo, linkedinCapabilities, linkedinInfo, providersWithCapability, redditCapabilities, redditInfo, telegramCapabilities, telegramInfo, tiktokCapabilities, tiktokInfo, twitterCapabilities, twitterInfo, whatsappCapabilities, whatsappInfo, youtubeCapabilities, youtubeInfo };
31
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../src/schemas/index.ts"],"sourcesContent":["/**\n * `@classytic/social/schemas`\n * ===========================\n * Authoritative zod v4 schemas for every provider — credentials, request inputs,\n * capability declarations. Consumers (e.g., `@classytic/arc`) import from this\n * subpath to:\n * - Validate input at API boundaries\n * - Render UI forms (via `fieldsFromSchema()` or `z.toJSONSchema()`)\n * - Generate OpenAPI/MCP tool contracts\n * - Filter providers by capability (`{ posting: true }`, `{ scheduling: true }`)\n *\n * Example:\n *\n * import { YouTubeUploadParamsSchema, youtubeCapabilities } from '@classytic/social/schemas';\n * const parsed = YouTubeUploadParamsSchema.parse(input);\n * const json = z.toJSONSchema(YouTubeUploadParamsSchema);\n */\n\n// Shared building blocks\nexport * from './shared.js';\n\n// Per-provider schemas (re-exported under namespaces to avoid name clashes)\nexport * as YouTube from './youtube.js';\nexport * as TikTok from './tiktok.js';\nexport * as Instagram from './instagram.js';\nexport * as Facebook from './facebook.js';\nexport * as LinkedIn from './linkedin.js';\nexport * as Telegram from './telegram.js';\nexport * as WhatsApp from './whatsapp.js';\nexport * as Twitter from './twitter.js';\nexport * as Reddit from './reddit.js';\n\n// Direct re-exports for the most-used schemas (capabilities map + credentials)\nexport { youtubeCapabilities, YouTubeCredentialsSchema, youtubeInfo } from './youtube.js';\nexport { tiktokCapabilities, TikTokCredentialsSchema, tiktokInfo } from './tiktok.js';\nexport { instagramCapabilities, InstagramCredentialsSchema, instagramInfo } from './instagram.js';\nexport { facebookCapabilities, FacebookCredentialsSchema, facebookInfo } from './facebook.js';\nexport { linkedinCapabilities, LinkedInCredentialsSchema, linkedinInfo } from './linkedin.js';\nexport { telegramCapabilities, TelegramCredentialsSchema, telegramInfo } from './telegram.js';\nexport { whatsappCapabilities, WhatsAppCredentialsSchema, whatsappInfo } from './whatsapp.js';\nexport { twitterCapabilities, TwitterCredentialsSchema, twitterInfo } from './twitter.js';\nexport { redditCapabilities, RedditCredentialsSchema, redditInfo } from './reddit.js';\n\n// Capability map — keyed by provider name\nimport type { ProviderCapabilities } from '../common/contracts.js';\nimport { youtubeCapabilities } from './youtube.js';\nimport { tiktokCapabilities } from './tiktok.js';\nimport { instagramCapabilities } from './instagram.js';\nimport { facebookCapabilities } from './facebook.js';\nimport { linkedinCapabilities } from './linkedin.js';\nimport { telegramCapabilities } from './telegram.js';\nimport { whatsappCapabilities } from './whatsapp.js';\nimport { twitterCapabilities } from './twitter.js';\nimport { redditCapabilities } from './reddit.js';\n\nexport const allCapabilities: Record<string, ProviderCapabilities> = {\n youtube: youtubeCapabilities,\n tiktok: tiktokCapabilities,\n instagram: instagramCapabilities,\n facebook: facebookCapabilities,\n linkedin: linkedinCapabilities,\n telegram: telegramCapabilities,\n whatsapp: whatsappCapabilities,\n twitter: twitterCapabilities,\n reddit: redditCapabilities,\n};\n\n/** Convenience: list provider names that have a given capability. */\nexport function providersWithCapability<K extends keyof ProviderCapabilities>(\n key: K,\n value: ProviderCapabilities[K] = true as ProviderCapabilities[K],\n): string[] {\n return Object.entries(allCapabilities)\n .filter(([, caps]) => caps[key] === value)\n .map(([name]) => name);\n}\n"],"mappings":";;;;;;;;;;;;AAuDA,MAAa,kBAAwD;CACnE,SAAS;CACT,QAAQ;CACR,WAAW;CACX,UAAU;CACV,UAAU;CACV,UAAU;CACV,UAAU;CACV,SAAS;CACT,QAAQ;CACT;;AAGD,SAAgB,wBACd,KACA,QAAiC,MACvB;AACV,QAAO,OAAO,QAAQ,gBAAgB,CACnC,QAAQ,GAAG,UAAU,KAAK,SAAS,MAAM,CACzC,KAAK,CAAC,UAAU,KAAK"}
@@ -0,0 +1,338 @@
1
+ import { o as OAuthTokens } from "./base-DBtKFiSX.mjs";
2
+
3
+ //#region src/common/meta.d.ts
4
+ /**
5
+ * Shared Meta Graph API constants for Facebook, Instagram, and WhatsApp.
6
+ * Update META_GRAPH_VERSION here to upgrade all three providers at once.
7
+ *
8
+ * @see packages/social/wiki/facebook.md
9
+ * @see packages/social/wiki/instagram.md
10
+ * @see packages/social/wiki/whatsapp.md
11
+ */
12
+ declare const META_GRAPH_VERSION = "v25.0";
13
+ declare const META_GRAPH_BASE = "https://graph.facebook.com/v25.0";
14
+ declare const META_GRAPH_VIDEO_BASE = "https://graph-video.facebook.com/v25.0";
15
+ declare const META_AUTH_URL = "https://www.facebook.com/v25.0/dialog/oauth";
16
+ declare const META_TOKEN_URL = "https://graph.facebook.com/v25.0/oauth/access_token";
17
+ //#endregion
18
+ //#region src/errors.d.ts
19
+ /**
20
+ * Social Provider Error
21
+ * =====================
22
+ * Standalone error class for social media provider failures.
23
+ * Mirrors the behavior of ProviderError but with zero app dependencies.
24
+ *
25
+ * Usage:
26
+ * throw new SocialError('youtube', 'Upload failed', { errorCode: 403, retryable: false });
27
+ * throw new SocialError('telegram', 'Rate limited', { retryable: true, retryAfter: 30 });
28
+ */
29
+ interface SocialErrorOptions {
30
+ statusCode?: number;
31
+ errorCode?: string | number | null;
32
+ hint?: string | null;
33
+ retryable?: boolean | null;
34
+ retryAfter?: number | null;
35
+ originalError?: Error | null;
36
+ [key: string]: unknown;
37
+ }
38
+ declare class SocialError extends Error {
39
+ readonly provider: string;
40
+ readonly statusCode: number;
41
+ readonly status: string;
42
+ readonly isOperational: boolean;
43
+ readonly errorCode: string | number | null;
44
+ readonly hint: string | null;
45
+ readonly retryable: boolean | null;
46
+ readonly retryAfter: number | null;
47
+ readonly originalError: Error | null;
48
+ constructor(provider: string, message: string, options?: SocialErrorOptions | Error);
49
+ }
50
+ //#endregion
51
+ //#region src/common/http.d.ts
52
+ type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';
53
+ type ParseError<E> = (raw: unknown, status: number, headers: Headers) => {
54
+ message: string;
55
+ errorCode?: string | number | null;
56
+ hint?: string | null;
57
+ retryable?: boolean | null;
58
+ retryAfter?: number | null;
59
+ extras?: Record<string, unknown>;
60
+ } | null;
61
+ interface RetryConfig {
62
+ /** Max retry attempts (in addition to the initial request). Default 0. */
63
+ attempts: number;
64
+ /** HTTP status codes that should trigger a retry. Default [429, 502, 503, 504]. */
65
+ on?: number[];
66
+ /** Base delay in ms before exponential backoff. Default 500. */
67
+ baseDelayMs?: number;
68
+ /** Cap on backoff delay. Default 30_000. */
69
+ maxDelayMs?: number;
70
+ }
71
+ interface HttpRequestOptions<E = unknown> {
72
+ method?: HttpMethod;
73
+ url: string;
74
+ query?: Record<string, string | number | boolean | undefined | null>;
75
+ /** JSON body. Mutually exclusive with `form`, `urlencoded`, `binary`, `text`. */
76
+ json?: unknown;
77
+ /** multipart/form-data body. */
78
+ form?: FormData;
79
+ /** application/x-www-form-urlencoded body. */
80
+ urlencoded?: URLSearchParams | Record<string, string>;
81
+ /** Raw binary body. */
82
+ binary?: ArrayBuffer | Uint8Array | Buffer;
83
+ /** Raw text body. */
84
+ text?: string;
85
+ headers?: Record<string, string>;
86
+ /** Convenience: sets `Authorization: Bearer <token>`. */
87
+ bearer?: string;
88
+ /** Request timeout in ms. Default 30_000. Use 0 to disable. */
89
+ timeout?: number;
90
+ /** Retry policy. Default no retries. */
91
+ retry?: RetryConfig;
92
+ /** Provider-specific error parser invoked when the response is not OK. */
93
+ parseError?: ParseError<E>;
94
+ /** AbortSignal for caller-driven cancellation. */
95
+ signal?: AbortSignal;
96
+ }
97
+ interface HttpResponse<T> {
98
+ data: T;
99
+ status: number;
100
+ headers: Headers;
101
+ }
102
+ /**
103
+ * Core request function. Throws SocialError on failure. Returns parsed body on success.
104
+ *
105
+ * @param provider — provider name used for error attribution
106
+ * @param opts — request options
107
+ */
108
+ declare function httpRequest<T = unknown, E = unknown>(provider: string, opts: HttpRequestOptions<E>): Promise<HttpResponse<T>>;
109
+ //#endregion
110
+ //#region src/common/oauth/pkce.d.ts
111
+ /**
112
+ * PKCE (Proof Key for Code Exchange) helpers for OAuth 2.0.
113
+ *
114
+ * @see https://datatracker.ietf.org/doc/html/rfc7636
115
+ */
116
+ /**
117
+ * Generate a cryptographically random code verifier.
118
+ * Length: 43 characters (RFC 7636 §4.1 allows 43-128).
119
+ */
120
+ declare function generateCodeVerifier(length?: number): string;
121
+ /**
122
+ * Generate the SHA-256 challenge for a verifier (PKCE method `S256`).
123
+ */
124
+ declare function generateCodeChallenge(verifier: string): Promise<string>;
125
+ /**
126
+ * Default in-memory verifier store with TTL-based eviction.
127
+ *
128
+ * **Note:** This is a single-process default. In multi-instance deployments,
129
+ * persist verifiers alongside `state` (e.g., in a session, Redis, or DB) and
130
+ * pass them back to `exchangeCode`. Do NOT rely on this store across servers.
131
+ */
132
+ declare class PkceStore {
133
+ private ttlMs;
134
+ private entries;
135
+ constructor(ttlMs?: number);
136
+ set(state: string, verifier: string): void;
137
+ /** Returns and removes the verifier (single-use semantics). */
138
+ take(state: string): string | undefined;
139
+ delete(state: string): void;
140
+ size(): number;
141
+ private evictExpired;
142
+ }
143
+ //#endregion
144
+ //#region src/common/oauth/oauth2.d.ts
145
+ interface OAuth2ExchangeParams {
146
+ /** Token endpoint URL. */
147
+ tokenUrl: string;
148
+ /** Authorization code from the redirect callback. */
149
+ code: string;
150
+ clientId: string;
151
+ /** Required for confidential clients; sent via Basic auth or body. */
152
+ clientSecret?: string;
153
+ redirectUri: string;
154
+ /** PKCE verifier (S256 or plain). Required by Twitter, TikTok, etc. */
155
+ codeVerifier?: string;
156
+ /** Use HTTP Basic auth for client credentials (Reddit, Twitter confidential). */
157
+ basicAuth?: boolean;
158
+ /** Additional body params to merge in. */
159
+ extra?: Record<string, string>;
160
+ /** Additional headers (e.g., User-Agent for Reddit). */
161
+ headers?: Record<string, string>;
162
+ }
163
+ interface OAuth2RefreshParams {
164
+ tokenUrl: string;
165
+ refreshToken: string;
166
+ clientId: string;
167
+ clientSecret?: string;
168
+ basicAuth?: boolean;
169
+ extra?: Record<string, string>;
170
+ headers?: Record<string, string>;
171
+ }
172
+ /**
173
+ * Exchange an authorization code for an access token.
174
+ *
175
+ * The body is `application/x-www-form-urlencoded` per RFC 6749 §4.1.3. Client
176
+ * credentials may be sent in the body (`client_secret`) or via Basic auth — the
177
+ * latter is required by some providers (Reddit). Use `basicAuth: true` to opt in.
178
+ *
179
+ * @throws SocialError on HTTP failure (rate-limit, server error, parse error).
180
+ */
181
+ declare function oauth2ExchangeCode(provider: string, params: OAuth2ExchangeParams): Promise<OAuthTokens>;
182
+ /**
183
+ * Refresh an access token using a refresh token (RFC 6749 §6).
184
+ */
185
+ declare function oauth2RefreshToken(provider: string, params: OAuth2RefreshParams): Promise<OAuthTokens>;
186
+ /**
187
+ * Build an OAuth 2.0 authorization URL (RFC 6749 §4.1.1).
188
+ */
189
+ declare function buildAuthUrl(authUrl: string, params: {
190
+ clientId: string;
191
+ redirectUri: string;
192
+ state: string;
193
+ scope: string | string[]; /** Default `code` for authorization-code grant. */
194
+ responseType?: string; /** Scope separator — space (default) or comma (Facebook). */
195
+ scopeSeparator?: ' ' | ','; /** PKCE challenge (S256 or plain). */
196
+ codeChallenge?: string;
197
+ codeChallengeMethod?: 'S256' | 'plain'; /** Provider-specific extras (access_type, prompt, etc.). */
198
+ extra?: Record<string, string>;
199
+ }): string;
200
+ //#endregion
201
+ //#region src/common/oauth/meta.d.ts
202
+ declare const IG_REFRESH_URL = "https://graph.instagram.com/refresh_access_token";
203
+ interface MetaExchangeParams {
204
+ graphVersion: string;
205
+ clientId: string;
206
+ clientSecret: string;
207
+ redirectUri: string;
208
+ code: string;
209
+ }
210
+ /**
211
+ * Two-step Meta token exchange: code → short-lived → long-lived.
212
+ *
213
+ * @param provider — `'facebook'` or `'instagram'` (used for error attribution).
214
+ * @returns Long-lived OAuth tokens. `refresh_token` is set to `access_token`
215
+ * because Meta uses the access token itself for refresh.
216
+ */
217
+ declare function metaExchangeLongLived(provider: 'facebook' | 'instagram', params: MetaExchangeParams): Promise<OAuthTokens>;
218
+ /**
219
+ * Refresh a long-lived Facebook user token.
220
+ * Page tokens derived from the long-lived user token never expire.
221
+ */
222
+ declare function metaRefreshLongLivedFacebook(params: {
223
+ graphVersion: string;
224
+ clientId: string;
225
+ clientSecret: string;
226
+ refreshToken: string;
227
+ }): Promise<OAuthTokens>;
228
+ /**
229
+ * Refresh a long-lived Instagram token (must be ≥24h old, not yet expired).
230
+ */
231
+ declare function metaRefreshLongLivedInstagram(params: {
232
+ refreshToken: string;
233
+ }): Promise<OAuthTokens>;
234
+ /**
235
+ * Parser for Graph API error envelope: `{ error: { message, code, error_subcode, type, fbtrace_id } }`.
236
+ */
237
+ declare function parseGraphError(raw: unknown): ReturnType<NonNullable<Parameters<typeof httpRequest>[1]['parseError']>>;
238
+ //#endregion
239
+ //#region src/common/paginate.d.ts
240
+ /**
241
+ * Generic pagination helper.
242
+ *
243
+ * Wraps a per-page fetcher in an `AsyncIterable` so consumers can do:
244
+ *
245
+ * for await (const post of paginate(fetchPage)) { ... }
246
+ *
247
+ * Use `.toArray()` for the simple case, or `.take(n)` to bound results.
248
+ */
249
+ interface Page<T> {
250
+ items: T[];
251
+ /** Opaque cursor for the next page, or `undefined` when exhausted. */
252
+ nextCursor?: string;
253
+ }
254
+ interface PaginateOptions {
255
+ /** Hard cap on items returned across pages. */
256
+ maxItems?: number;
257
+ /** Hard cap on page fetches (defense against infinite loops). Default 100. */
258
+ maxPages?: number;
259
+ }
260
+ interface PaginatedIterable<T> extends AsyncIterable<T> {
261
+ toArray(): Promise<T[]>;
262
+ take(n: number): Promise<T[]>;
263
+ }
264
+ declare function paginate<T>(fetchPage: (cursor: string | undefined) => Promise<Page<T>>, opts?: PaginateOptions): PaginatedIterable<T>;
265
+ //#endregion
266
+ //#region src/utils/polling.d.ts
267
+ /**
268
+ * Generic Polling Utility
269
+ * =======================
270
+ * Reusable poll-until-complete pattern for platform API status checks.
271
+ *
272
+ * Used by Instagram (container status) and TikTok (publish status).
273
+ *
274
+ * Usage:
275
+ * import { pollUntilComplete } from '../utils/polling.js';
276
+ *
277
+ * const result = await pollUntilComplete({
278
+ * fn: () => fetchStatus(id),
279
+ * isComplete: (data) => data.status === 'FINISHED',
280
+ * getError: (data) => data.status === 'FAILED' ? data.reason : null,
281
+ * label: 'Instagram container',
282
+ * });
283
+ */
284
+ interface PollOptions<T> {
285
+ /** Async function to call each iteration. Receives attempt index. */
286
+ fn: (attempt: number) => Promise<T>;
287
+ /** Predicate: return true when the operation is complete. */
288
+ isComplete: (data: T) => boolean;
289
+ /** Return an Error, string message, or null to keep polling. */
290
+ getError: (data: T) => Error | string | null;
291
+ /** Max polling iterations before timeout (default 30). */
292
+ maxAttempts?: number;
293
+ /** Delay between polls in milliseconds (default 5000). */
294
+ intervalMs?: number;
295
+ /** Label for timeout warning logs (default 'polling'). */
296
+ label?: string;
297
+ }
298
+ /**
299
+ * Poll an async function until a completion or failure condition is met.
300
+ *
301
+ * @returns The data from `fn()` when `isComplete` returns true, or null on timeout.
302
+ * @throws Whatever `getError` returns (wrapped in Error if string).
303
+ */
304
+ declare function pollUntilComplete<T>({
305
+ fn,
306
+ isComplete,
307
+ getError,
308
+ maxAttempts,
309
+ intervalMs,
310
+ label
311
+ }: PollOptions<T>): Promise<T | null>;
312
+ //#endregion
313
+ //#region src/common/security.d.ts
314
+ /**
315
+ * Security helpers used at provider boundaries.
316
+ */
317
+ /**
318
+ * Validate that a URL is safe to fetch on the server side.
319
+ *
320
+ * Rejects:
321
+ * - Non-HTTP(S) schemes (file://, data://, gopher://, etc.)
322
+ * - Localhost / loopback (127.0.0.0/8, ::1)
323
+ * - RFC 1918 private ranges (10/8, 172.16/12, 192.168/16)
324
+ * - Link-local (169.254/16) — blocks AWS/GCP metadata endpoints
325
+ * - Multicast / reserved blocks
326
+ *
327
+ * **Note:** This is a literal-IP guard; it does not resolve DNS. For complete
328
+ * protection (DNS-rebinding), validate again after resolution at fetch time.
329
+ */
330
+ declare function assertPublicHttpUrl(provider: string, raw: string, context?: string): URL;
331
+ /**
332
+ * Redact secrets from arbitrary objects for safe logging.
333
+ * Replaces values for keys matching common secret patterns with `'[REDACTED]'`.
334
+ */
335
+ declare function redactSecrets(input: unknown): unknown;
336
+ //#endregion
337
+ export { SocialErrorOptions as A, HttpMethod as C, RetryConfig as D, ParseError as E, META_TOKEN_URL as F, META_GRAPH_BASE as M, META_GRAPH_VERSION as N, httpRequest as O, META_GRAPH_VIDEO_BASE as P, generateCodeVerifier as S, HttpResponse as T, buildAuthUrl as _, Page as a, PkceStore as b, paginate as c, metaExchangeLongLived as d, metaRefreshLongLivedFacebook as f, OAuth2RefreshParams as g, OAuth2ExchangeParams as h, pollUntilComplete as i, META_AUTH_URL as j, SocialError as k, IG_REFRESH_URL as l, parseGraphError as m, redactSecrets as n, PaginateOptions as o, metaRefreshLongLivedInstagram as p, PollOptions as r, PaginatedIterable as s, assertPublicHttpUrl as t, MetaExchangeParams as u, oauth2ExchangeCode as v, HttpRequestOptions as w, generateCodeChallenge as x, oauth2RefreshToken as y };
338
+ //# sourceMappingURL=security-BXhfebWm.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security-BXhfebWm.d.mts","names":[],"sources":["../src/common/meta.ts","../src/errors.ts","../src/common/http.ts","../src/common/oauth/pkce.ts","../src/common/oauth/oauth2.ts","../src/common/oauth/meta.ts","../src/common/paginate.ts","../src/utils/polling.ts","../src/common/security.ts"],"mappings":"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"}
@@ -0,0 +1,100 @@
1
+ import { z } from "zod";
2
+
3
+ //#region src/schemas/shared.ts
4
+ /**
5
+ * Shared zod v4 building blocks used by per-provider schemas.
6
+ *
7
+ * Consumers (e.g., `@classytic/arc`) import from `@classytic/social/schemas`
8
+ * to render forms, validate inputs, and generate API contracts.
9
+ */
10
+ const NonEmptyString = z.string().min(1);
11
+ /** Public URL. Use `assertPublicHttpUrl` from `common/security.ts` for SSRF guards. */
12
+ const PublicUrl = z.url();
13
+ const ISODateTime = z.union([z.iso.datetime(), z.date()]).describe("ISO 8601 datetime string or Date instance");
14
+ const PrivacyLevel = z.enum([
15
+ "public",
16
+ "private",
17
+ "unlisted"
18
+ ]);
19
+ const OAuthTokensSchema = z.looseObject({
20
+ access_token: NonEmptyString,
21
+ refresh_token: z.string().optional(),
22
+ expires_in: z.number().optional(),
23
+ token_type: z.string().optional(),
24
+ scope: z.string().optional()
25
+ });
26
+ const ClientCredentials = z.object({
27
+ clientId: NonEmptyString.describe("OAuth client ID"),
28
+ clientSecret: NonEmptyString.describe("OAuth client secret"),
29
+ redirectUri: z.url().optional().describe("OAuth redirect URI override")
30
+ });
31
+ const SECRET_NAME = /token|secret|password|key|credential/i;
32
+ /**
33
+ * Derive `FieldMeta[]` from a zod object schema. Used by providers to expose a
34
+ * UI form schema without manually duplicating field metadata.
35
+ *
36
+ * Heuristics:
37
+ * - field name matching `/token|secret|password|key|credential/i` ⇒ `password`
38
+ * - `z.url()` ⇒ `url`
39
+ * - `z.enum([...])` ⇒ `select`
40
+ * - everything else ⇒ `text`
41
+ */
42
+ function fieldsFromSchema(schema, overrides = {}) {
43
+ const fields = [];
44
+ const shape = schema.shape;
45
+ for (const [name, def] of Object.entries(shape)) {
46
+ const inner = unwrap(def);
47
+ const optional = isOptional(def);
48
+ const description = def.description;
49
+ let type = "text";
50
+ let options;
51
+ if (SECRET_NAME.test(name)) type = "password";
52
+ else if (isUrl(inner)) type = "url";
53
+ else if (inner instanceof z.ZodEnum) {
54
+ type = "select";
55
+ options = inner.options.map((v) => ({
56
+ label: v,
57
+ value: v
58
+ }));
59
+ }
60
+ const ovr = overrides[name] ?? {};
61
+ fields.push({
62
+ name,
63
+ displayName: ovr.displayName ?? toDisplayName(name),
64
+ type: ovr.type ?? type,
65
+ required: ovr.required ?? !optional,
66
+ description: ovr.description ?? description,
67
+ placeholder: ovr.placeholder,
68
+ options: ovr.options ?? options
69
+ });
70
+ }
71
+ return fields;
72
+ }
73
+ function unwrap(t) {
74
+ let cur = t;
75
+ while (true) {
76
+ const def = cur.def;
77
+ const inner = def?.innerType;
78
+ if (!inner) return cur;
79
+ if (def?.type === "optional" || def?.type === "nullable" || def?.type === "default") {
80
+ cur = inner;
81
+ continue;
82
+ }
83
+ return cur;
84
+ }
85
+ }
86
+ function isOptional(t) {
87
+ const def = t.def;
88
+ return def?.type === "optional" || def?.type === "default" || def?.type === "nullable";
89
+ }
90
+ function isUrl(t) {
91
+ const def = t.def;
92
+ return def?.type === "url" || def?.format === "url";
93
+ }
94
+ function toDisplayName(name) {
95
+ return name.replace(/([A-Z])/g, " $1").replace(/^./, (c) => c.toUpperCase()).replace(/\bid\b/i, "ID").replace(/\burl\b/i, "URL").trim();
96
+ }
97
+
98
+ //#endregion
99
+ export { PrivacyLevel as a, OAuthTokensSchema as i, ISODateTime as n, PublicUrl as o, NonEmptyString as r, fieldsFromSchema as s, ClientCredentials as t };
100
+ //# sourceMappingURL=shared-Fvc6xQku.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared-Fvc6xQku.mjs","names":[],"sources":["../src/schemas/shared.ts"],"sourcesContent":["/**\n * Shared zod v4 building blocks used by per-provider schemas.\n *\n * Consumers (e.g., `@classytic/arc`) import from `@classytic/social/schemas`\n * to render forms, validate inputs, and generate API contracts.\n */\n\nimport { z } from 'zod';\n\n// ─── Primitives ─────────────────────────────────────────────────────────────\n\nexport const NonEmptyString = z.string().min(1);\n\n/** Public URL. Use `assertPublicHttpUrl` from `common/security.ts` for SSRF guards. */\nexport const PublicUrl = z.url();\n\nexport const ISODateTime = z.union([z.iso.datetime(), z.date()])\n .describe('ISO 8601 datetime string or Date instance');\n\nexport const PrivacyLevel = z.enum(['public', 'private', 'unlisted']);\nexport type PrivacyLevel = z.infer<typeof PrivacyLevel>;\n\n// ─── OAuth tokens ───────────────────────────────────────────────────────────\n\nexport const OAuthTokensSchema = z.looseObject({\n access_token: NonEmptyString,\n refresh_token: z.string().optional(),\n expires_in: z.number().optional(),\n token_type: z.string().optional(),\n scope: z.string().optional(),\n});\n\nexport type OAuthTokensInput = z.infer<typeof OAuthTokensSchema>;\n\n// ─── Common credential field shape ──────────────────────────────────────────\n\nexport const ClientCredentials = z.object({\n clientId: NonEmptyString.describe('OAuth client ID'),\n clientSecret: NonEmptyString.describe('OAuth client secret'),\n redirectUri: z.url().optional().describe('OAuth redirect URI override'),\n});\n\n// ─── Form-field metadata derivation ─────────────────────────────────────────\n\n/**\n * UI form-field descriptor derived from a zod schema. Mirrors the shape of\n * `CredentialField` in base.ts for backward compatibility.\n */\nexport interface FieldMeta {\n name: string;\n displayName: string;\n type: 'text' | 'password' | 'url' | 'select' | 'textarea';\n required: boolean;\n description?: string;\n placeholder?: string;\n options?: { label: string; value: string }[];\n}\n\nconst SECRET_NAME = /token|secret|password|key|credential/i;\n\n/**\n * Derive `FieldMeta[]` from a zod object schema. Used by providers to expose a\n * UI form schema without manually duplicating field metadata.\n *\n * Heuristics:\n * - field name matching `/token|secret|password|key|credential/i` ⇒ `password`\n * - `z.url()` ⇒ `url`\n * - `z.enum([...])` ⇒ `select`\n * - everything else ⇒ `text`\n */\nexport function fieldsFromSchema<T extends z.ZodObject>(\n schema: T,\n overrides: Partial<Record<keyof z.infer<T> & string, Partial<FieldMeta>>> = {},\n): FieldMeta[] {\n const fields: FieldMeta[] = [];\n const shape = schema.shape;\n for (const [name, def] of Object.entries(shape)) {\n const inner = unwrap(def as z.ZodType);\n const optional = isOptional(def as z.ZodType);\n const description = (def as z.ZodType).description;\n\n let type: FieldMeta['type'] = 'text';\n let options: FieldMeta['options'];\n\n if (SECRET_NAME.test(name)) {\n type = 'password';\n } else if (isUrl(inner)) {\n type = 'url';\n } else if (inner instanceof z.ZodEnum) {\n type = 'select';\n const enumValues = (inner as z.ZodEnum).options as readonly string[];\n options = enumValues.map((v: string) => ({ label: v, value: v }));\n }\n\n const ovr = overrides[name as keyof typeof overrides] ?? {};\n fields.push({\n name,\n displayName: ovr.displayName ?? toDisplayName(name),\n type: ovr.type ?? type,\n required: ovr.required ?? !optional,\n description: ovr.description ?? description,\n placeholder: ovr.placeholder,\n options: ovr.options ?? options,\n });\n }\n return fields;\n}\n\nfunction unwrap(t: z.ZodType): z.ZodType {\n let cur: z.ZodType = t;\n // Peel optional / nullable / default wrappers\n while (true) {\n const def = (cur as { def?: { type?: string; innerType?: z.ZodType } }).def;\n const inner = def?.innerType;\n if (!inner) return cur;\n if (def?.type === 'optional' || def?.type === 'nullable' || def?.type === 'default') {\n cur = inner;\n continue;\n }\n return cur;\n }\n}\n\nfunction isOptional(t: z.ZodType): boolean {\n const def = (t as { def?: { type?: string } }).def;\n return def?.type === 'optional' || def?.type === 'default' || def?.type === 'nullable';\n}\n\nfunction isUrl(t: z.ZodType): boolean {\n const def = (t as { def?: { type?: string; format?: string } }).def;\n return def?.type === 'url' || def?.format === 'url';\n}\n\nfunction toDisplayName(name: string): string {\n return name\n .replace(/([A-Z])/g, ' $1')\n .replace(/^./, c => c.toUpperCase())\n .replace(/\\bid\\b/i, 'ID')\n .replace(/\\burl\\b/i, 'URL')\n .trim();\n}\n"],"mappings":";;;;;;;;;AAWA,MAAa,iBAAiB,EAAE,QAAQ,CAAC,IAAI,EAAE;;AAG/C,MAAa,YAAY,EAAE,KAAK;AAEhC,MAAa,cAAc,EAAE,MAAM,CAAC,EAAE,IAAI,UAAU,EAAE,EAAE,MAAM,CAAC,CAAC,CAC7D,SAAS,4CAA4C;AAExD,MAAa,eAAe,EAAE,KAAK;CAAC;CAAU;CAAW;CAAW,CAAC;AAKrE,MAAa,oBAAoB,EAAE,YAAY;CAC7C,cAAc;CACd,eAAe,EAAE,QAAQ,CAAC,UAAU;CACpC,YAAY,EAAE,QAAQ,CAAC,UAAU;CACjC,YAAY,EAAE,QAAQ,CAAC,UAAU;CACjC,OAAO,EAAE,QAAQ,CAAC,UAAU;CAC7B,CAAC;AAMF,MAAa,oBAAoB,EAAE,OAAO;CACxC,UAAU,eAAe,SAAS,kBAAkB;CACpD,cAAc,eAAe,SAAS,sBAAsB;CAC5D,aAAa,EAAE,KAAK,CAAC,UAAU,CAAC,SAAS,8BAA8B;CACxE,CAAC;AAkBF,MAAM,cAAc;;;;;;;;;;;AAYpB,SAAgB,iBACd,QACA,YAA4E,EAAE,EACjE;CACb,MAAM,SAAsB,EAAE;CAC9B,MAAM,QAAQ,OAAO;AACrB,MAAK,MAAM,CAAC,MAAM,QAAQ,OAAO,QAAQ,MAAM,EAAE;EAC/C,MAAM,QAAQ,OAAO,IAAiB;EACtC,MAAM,WAAW,WAAW,IAAiB;EAC7C,MAAM,cAAe,IAAkB;EAEvC,IAAI,OAA0B;EAC9B,IAAI;AAEJ,MAAI,YAAY,KAAK,KAAK,CACxB,QAAO;WACE,MAAM,MAAM,CACrB,QAAO;WACE,iBAAiB,EAAE,SAAS;AACrC,UAAO;AAEP,aADoB,MAAoB,QACnB,KAAK,OAAe;IAAE,OAAO;IAAG,OAAO;IAAG,EAAE;;EAGnE,MAAM,MAAM,UAAU,SAAmC,EAAE;AAC3D,SAAO,KAAK;GACV;GACA,aAAa,IAAI,eAAe,cAAc,KAAK;GACnD,MAAM,IAAI,QAAQ;GAClB,UAAU,IAAI,YAAY,CAAC;GAC3B,aAAa,IAAI,eAAe;GAChC,aAAa,IAAI;GACjB,SAAS,IAAI,WAAW;GACzB,CAAC;;AAEJ,QAAO;;AAGT,SAAS,OAAO,GAAyB;CACvC,IAAI,MAAiB;AAErB,QAAO,MAAM;EACX,MAAM,MAAO,IAA2D;EACxE,MAAM,QAAQ,KAAK;AACnB,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI,KAAK,SAAS,cAAc,KAAK,SAAS,cAAc,KAAK,SAAS,WAAW;AACnF,SAAM;AACN;;AAEF,SAAO;;;AAIX,SAAS,WAAW,GAAuB;CACzC,MAAM,MAAO,EAAkC;AAC/C,QAAO,KAAK,SAAS,cAAc,KAAK,SAAS,aAAa,KAAK,SAAS;;AAG9E,SAAS,MAAM,GAAuB;CACpC,MAAM,MAAO,EAAmD;AAChE,QAAO,KAAK,SAAS,SAAS,KAAK,WAAW;;AAGhD,SAAS,cAAc,MAAsB;AAC3C,QAAO,KACJ,QAAQ,YAAY,MAAM,CAC1B,QAAQ,OAAM,MAAK,EAAE,aAAa,CAAC,CACnC,QAAQ,WAAW,KAAK,CACxB,QAAQ,YAAY,MAAM,CAC1B,MAAM"}
@@ -0,0 +1,107 @@
1
+ import { t as __exportAll } from "./chunk-DQk6qfdC.mjs";
2
+ import { r as NonEmptyString } from "./shared-Fvc6xQku.mjs";
3
+ import { z } from "zod";
4
+
5
+ //#region src/schemas/telegram.ts
6
+ /**
7
+ * Telegram zod v4 schemas.
8
+ *
9
+ * Telegram uses bot tokens (no OAuth). Chat IDs are numeric — supergroups and
10
+ * channels prefix with `-100`, regular groups with `-`.
11
+ */
12
+ var telegram_exports = /* @__PURE__ */ __exportAll({
13
+ TelegramCredentialsSchema: () => TelegramCredentialsSchema,
14
+ TelegramMediaItemSchema: () => TelegramMediaItemSchema,
15
+ TelegramSendDocumentSchema: () => TelegramSendDocumentSchema,
16
+ TelegramSendMediaGroupSchema: () => TelegramSendMediaGroupSchema,
17
+ TelegramSendMessageSchema: () => TelegramSendMessageSchema,
18
+ TelegramSendPhotoSchema: () => TelegramSendPhotoSchema,
19
+ TelegramSendVideoSchema: () => TelegramSendVideoSchema,
20
+ telegramCapabilities: () => telegramCapabilities,
21
+ telegramInfo: () => telegramInfo
22
+ });
23
+ const TelegramCredentialsSchema = z.object({
24
+ botToken: NonEmptyString.regex(/^\d+:[A-Za-z0-9_-]+$/, "Bot token must be in `<bot_id>:<token>` format").describe("Bot token from @BotFather"),
25
+ chatId: z.union([z.string(), z.number()]).optional().describe("Optional default chat ID to validate against")
26
+ });
27
+ const ChatId = z.union([z.string().min(1), z.number()]);
28
+ const ParseMode = z.enum([
29
+ "MarkdownV2",
30
+ "Markdown",
31
+ "HTML"
32
+ ]);
33
+ const TelegramSendMessageSchema = z.object({
34
+ chatId: ChatId,
35
+ text: z.string().min(1).max(4096),
36
+ parseMode: ParseMode.optional(),
37
+ disableNotification: z.boolean().optional(),
38
+ disableWebPagePreview: z.boolean().optional(),
39
+ replyToMessageId: z.union([z.string(), z.number()]).optional()
40
+ });
41
+ const TelegramSendPhotoSchema = z.object({
42
+ chatId: ChatId,
43
+ photo: z.union([z.url(), z.string().min(1)]).describe("URL or file_id"),
44
+ caption: z.string().max(1024).optional(),
45
+ parseMode: ParseMode.optional()
46
+ });
47
+ const TelegramSendVideoSchema = z.object({
48
+ chatId: ChatId,
49
+ video: z.union([z.url(), z.string().min(1)]),
50
+ caption: z.string().max(1024).optional(),
51
+ duration: z.number().int().nonnegative().optional(),
52
+ width: z.number().int().positive().optional(),
53
+ height: z.number().int().positive().optional(),
54
+ supportsStreaming: z.boolean().optional(),
55
+ parseMode: ParseMode.optional()
56
+ });
57
+ const TelegramSendDocumentSchema = z.object({
58
+ chatId: ChatId,
59
+ document: z.union([z.url(), z.string().min(1)]),
60
+ caption: z.string().max(1024).optional(),
61
+ parseMode: ParseMode.optional()
62
+ });
63
+ const TelegramMediaItemSchema = z.discriminatedUnion("type", [z.object({
64
+ type: z.literal("photo"),
65
+ media: z.union([z.url(), z.string().min(1)]),
66
+ caption: z.string().max(1024).optional()
67
+ }), z.object({
68
+ type: z.literal("video"),
69
+ media: z.union([z.url(), z.string().min(1)]),
70
+ caption: z.string().max(1024).optional(),
71
+ duration: z.number().int().nonnegative().optional()
72
+ })]);
73
+ const TelegramSendMediaGroupSchema = z.object({
74
+ chatId: ChatId,
75
+ media: z.array(TelegramMediaItemSchema).min(2).max(10)
76
+ });
77
+ const telegramCapabilities = {
78
+ auth: "token",
79
+ posting: false,
80
+ upload: true,
81
+ messaging: true,
82
+ scheduling: false,
83
+ deletion: true,
84
+ listing: false,
85
+ analytics: false,
86
+ environments: false,
87
+ pkce: false
88
+ };
89
+ const telegramInfo = {
90
+ name: "telegram",
91
+ displayName: "Telegram",
92
+ scopes: [],
93
+ rateLimits: {
94
+ perSecondToDifferentChats: 30,
95
+ perSecondToSameChat: 1
96
+ },
97
+ fileLimits: {
98
+ photo: { maxSizeBytes: 10 * 1024 * 1024 },
99
+ video: { maxSizeBytes: 50 * 1024 * 1024 },
100
+ document: { maxSizeBytes: 50 * 1024 * 1024 }
101
+ },
102
+ docsUrl: "https://core.telegram.org/bots/api"
103
+ };
104
+
105
+ //#endregion
106
+ export { telegram_exports as i, telegramCapabilities as n, telegramInfo as r, TelegramCredentialsSchema as t };
107
+ //# sourceMappingURL=telegram-FaUHpZgB.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telegram-FaUHpZgB.mjs","names":[],"sources":["../src/schemas/telegram.ts"],"sourcesContent":["/**\n * Telegram zod v4 schemas.\n *\n * Telegram uses bot tokens (no OAuth). Chat IDs are numeric — supergroups and\n * channels prefix with `-100`, regular groups with `-`.\n */\n\nimport { z } from 'zod';\nimport type { ProviderCapabilities } from '../common/contracts.js';\nimport { NonEmptyString } from './shared.js';\n\n// ─── Credentials ────────────────────────────────────────────────────────────\n\nexport const TelegramCredentialsSchema = z.object({\n botToken: NonEmptyString.regex(/^\\d+:[A-Za-z0-9_-]+$/, 'Bot token must be in `<bot_id>:<token>` format')\n .describe('Bot token from @BotFather'),\n chatId: z.union([z.string(), z.number()]).optional()\n .describe('Optional default chat ID to validate against'),\n});\nexport type TelegramCredentialsInput = z.infer<typeof TelegramCredentialsSchema>;\n\n// ─── Chat IDs ───────────────────────────────────────────────────────────────\n\nconst ChatId = z.union([z.string().min(1), z.number()]);\n\nconst ParseMode = z.enum(['MarkdownV2', 'Markdown', 'HTML']);\n\n// ─── Send message ───────────────────────────────────────────────────────────\n\nexport const TelegramSendMessageSchema = z.object({\n chatId: ChatId,\n text: z.string().min(1).max(4096),\n parseMode: ParseMode.optional(),\n disableNotification: z.boolean().optional(),\n disableWebPagePreview: z.boolean().optional(),\n replyToMessageId: z.union([z.string(), z.number()]).optional(),\n});\n\nexport const TelegramSendPhotoSchema = z.object({\n chatId: ChatId,\n photo: z.union([z.url(), z.string().min(1)]).describe('URL or file_id'),\n caption: z.string().max(1024).optional(),\n parseMode: ParseMode.optional(),\n});\n\nexport const TelegramSendVideoSchema = z.object({\n chatId: ChatId,\n video: z.union([z.url(), z.string().min(1)]),\n caption: z.string().max(1024).optional(),\n duration: z.number().int().nonnegative().optional(),\n width: z.number().int().positive().optional(),\n height: z.number().int().positive().optional(),\n supportsStreaming: z.boolean().optional(),\n parseMode: ParseMode.optional(),\n});\n\nexport const TelegramSendDocumentSchema = z.object({\n chatId: ChatId,\n document: z.union([z.url(), z.string().min(1)]),\n caption: z.string().max(1024).optional(),\n parseMode: ParseMode.optional(),\n});\n\nexport const TelegramMediaItemSchema = z.discriminatedUnion('type', [\n z.object({\n type: z.literal('photo'),\n media: z.union([z.url(), z.string().min(1)]),\n caption: z.string().max(1024).optional(),\n }),\n z.object({\n type: z.literal('video'),\n media: z.union([z.url(), z.string().min(1)]),\n caption: z.string().max(1024).optional(),\n duration: z.number().int().nonnegative().optional(),\n }),\n]);\n\nexport const TelegramSendMediaGroupSchema = z.object({\n chatId: ChatId,\n media: z.array(TelegramMediaItemSchema).min(2).max(10),\n});\n\n// ─── Capabilities ───────────────────────────────────────────────────────────\n\nexport const telegramCapabilities: ProviderCapabilities = {\n auth: 'token',\n posting: false,\n upload: true,\n messaging: true,\n scheduling: false,\n deletion: true,\n listing: false,\n analytics: false,\n environments: false,\n pkce: false,\n};\n\nexport const telegramInfo = {\n name: 'telegram' as const,\n displayName: 'Telegram',\n scopes: [],\n rateLimits: { perSecondToDifferentChats: 30, perSecondToSameChat: 1 },\n fileLimits: {\n photo: { maxSizeBytes: 10 * 1024 * 1024 },\n video: { maxSizeBytes: 50 * 1024 * 1024 },\n document: { maxSizeBytes: 50 * 1024 * 1024 },\n },\n docsUrl: 'https://core.telegram.org/bots/api',\n} as const;\n"],"mappings":"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"}