socialcli 0.3.0__py3-none-any.whl

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.

Potentially problematic release.


This version of socialcli might be problematic. Click here for more details.

Files changed (224) hide show
  1. socialcli-0.3.0.dist-info/METADATA +168 -0
  2. socialcli-0.3.0.dist-info/RECORD +224 -0
  3. socialcli-0.3.0.dist-info/WHEEL +4 -0
  4. socialcli-0.3.0.dist-info/entry_points.txt +3 -0
  5. socialcli-0.3.0.dist-info/licenses/LICENSE +21 -0
  6. socialctl/__init__.py +0 -0
  7. socialctl/__main__.py +6 -0
  8. socialctl/adapters/__init__.py +6 -0
  9. socialctl/adapters/base.py +68 -0
  10. socialctl/adapters/errores.py +56 -0
  11. socialctl/adapters/facebook.py +180 -0
  12. socialctl/adapters/instagram.py +442 -0
  13. socialctl/adapters/tiktok.py +535 -0
  14. socialctl/adapters/youtube.py +331 -0
  15. socialctl/agent_errors.py +176 -0
  16. socialctl/agent_guide.py +23 -0
  17. socialctl/approval_cli.py +27 -0
  18. socialctl/auth.py +139 -0
  19. socialctl/authflow.py +344 -0
  20. socialctl/brands.py +194 -0
  21. socialctl/capabilities.py +57 -0
  22. socialctl/capabilities.yml +5945 -0
  23. socialctl/cli.py +1766 -0
  24. socialctl/connection_service/__init__.py +0 -0
  25. socialctl/connection_service/__main__.py +33 -0
  26. socialctl/connection_service/app.py +496 -0
  27. socialctl/connection_service/assets/PLATFORM-LOGOS-LICENSE.txt +50 -0
  28. socialctl/connection_service/assets/connection.css +75 -0
  29. socialctl/connection_service/assets/facebook.webp +0 -0
  30. socialctl/connection_service/assets/instagram.svg +194 -0
  31. socialctl/connection_service/assets/socialcli-logo.png +0 -0
  32. socialctl/connection_service/assets/tiktok.png +0 -0
  33. socialctl/connection_service/assets/youtube.svg +1 -0
  34. socialctl/connection_service/landing.py +146 -0
  35. socialctl/connection_service/legacy.py +48 -0
  36. socialctl/connection_service/peer.py +13 -0
  37. socialctl/connection_service/providers.py +324 -0
  38. socialctl/connection_service/settings.py +76 -0
  39. socialctl/connection_service/store.py +124 -0
  40. socialctl/connections/__init__.py +0 -0
  41. socialctl/connections/account_cli.py +438 -0
  42. socialctl/connections/cli.py +379 -0
  43. socialctl/connections/client.py +126 -0
  44. socialctl/connections/credential_cli.py +224 -0
  45. socialctl/connections/credential_store.py +49 -0
  46. socialctl/connections/file_store.py +193 -0
  47. socialctl/connections/keychain.py +78 -0
  48. socialctl/connections/meta_user.py +81 -0
  49. socialctl/connections/rotation_cli.py +116 -0
  50. socialctl/connections/saas_client.py +91 -0
  51. socialctl/connections/temporary_media.py +62 -0
  52. socialctl/delivery_options.py +70 -0
  53. socialctl/engagement.py +200 -0
  54. socialctl/engagement_cli.py +50 -0
  55. socialctl/executor.py +135 -0
  56. socialctl/formatter.py +291 -0
  57. socialctl/hosted_media.py +152 -0
  58. socialctl/identity.py +200 -0
  59. socialctl/inbox.py +298 -0
  60. socialctl/inbox_cli.py +46 -0
  61. socialctl/inventory.py +155 -0
  62. socialctl/inventory_cli.py +171 -0
  63. socialctl/inventory_sources.py +101 -0
  64. socialctl/management/__init__.py +1 -0
  65. socialctl/management/batch_cli.py +115 -0
  66. socialctl/management/batches.py +325 -0
  67. socialctl/management/changes.py +485 -0
  68. socialctl/management/cli.py +227 -0
  69. socialctl/management/comments_cli.py +352 -0
  70. socialctl/management/community_batch_cli.py +63 -0
  71. socialctl/management/community_batches.py +294 -0
  72. socialctl/management/community_changes.py +370 -0
  73. socialctl/management/community_cli.py +142 -0
  74. socialctl/management/community_schema.py +119 -0
  75. socialctl/management/facebook_groups.py +1118 -0
  76. socialctl/management/groups_cli.py +274 -0
  77. socialctl/management/inbox_readers.py +87 -0
  78. socialctl/management/meta_changes.py +197 -0
  79. socialctl/management/meta_cli.py +342 -0
  80. socialctl/management/meta_client.py +631 -0
  81. socialctl/management/meta_comment_inbox.py +565 -0
  82. socialctl/management/meta_comments.py +587 -0
  83. socialctl/management/meta_errors.py +59 -0
  84. socialctl/management/meta_pagination.py +52 -0
  85. socialctl/management/meta_schema.py +128 -0
  86. socialctl/management/meta_webhooks.py +147 -0
  87. socialctl/management/metadata_parts.py +144 -0
  88. socialctl/management/owned_assets.py +85 -0
  89. socialctl/management/owned_changes.py +470 -0
  90. socialctl/management/owned_cli.py +128 -0
  91. socialctl/management/owned_reorder.py +62 -0
  92. socialctl/management/owned_schema.py +368 -0
  93. socialctl/management/reply_context.py +24 -0
  94. socialctl/management/reply_evidence.py +80 -0
  95. socialctl/management/resource_changes.py +407 -0
  96. socialctl/management/resource_cli.py +136 -0
  97. socialctl/management/snippet_readback.py +26 -0
  98. socialctl/management/stories.py +713 -0
  99. socialctl/management/stories_cli.py +172 -0
  100. socialctl/management/youtube.py +323 -0
  101. socialctl/management/youtube_community.py +326 -0
  102. socialctl/management/youtube_metadata.py +122 -0
  103. socialctl/management/youtube_owned.py +259 -0
  104. socialctl/management/youtube_resources.py +305 -0
  105. socialctl/media.py +269 -0
  106. socialctl/media_cli.py +183 -0
  107. socialctl/media_ingress.py +211 -0
  108. socialctl/media_preflight.py +114 -0
  109. socialctl/media_registry.py +301 -0
  110. socialctl/media_requirements.py +52 -0
  111. socialctl/metricas/__init__.py +6 -0
  112. socialctl/metricas/almacen.py +133 -0
  113. socialctl/metricas/analytics_changes.py +295 -0
  114. socialctl/metricas/analytics_cli.py +191 -0
  115. socialctl/metricas/analytics_client.py +304 -0
  116. socialctl/metricas/analytics_ingest.py +260 -0
  117. socialctl/metricas/analytics_schema.py +174 -0
  118. socialctl/metricas/base.py +147 -0
  119. socialctl/metricas/facebook.py +418 -0
  120. socialctl/metricas/insights.py +227 -0
  121. socialctl/metricas/instagram.py +133 -0
  122. socialctl/metricas/modelos.py +87 -0
  123. socialctl/metricas/piezas.py +134 -0
  124. socialctl/metricas/reach.py +94 -0
  125. socialctl/metricas/reporting_client.py +112 -0
  126. socialctl/metricas/resumen.py +251 -0
  127. socialctl/metricas/slugs.py +89 -0
  128. socialctl/metricas/tiktok.py +185 -0
  129. socialctl/metricas/youtube.py +403 -0
  130. socialctl/migration_cli.py +60 -0
  131. socialctl/migration_files.py +68 -0
  132. socialctl/models.py +150 -0
  133. socialctl/native_schedule/__init__.py +13 -0
  134. socialctl/native_schedule/api_delivery.py +15 -0
  135. socialctl/native_schedule/api_reconcile.py +40 -0
  136. socialctl/native_schedule/approval.py +160 -0
  137. socialctl/native_schedule/cadence.py +73 -0
  138. socialctl/native_schedule/cli.py +510 -0
  139. socialctl/native_schedule/dispatcher.py +120 -0
  140. socialctl/native_schedule/facebook.py +112 -0
  141. socialctl/native_schedule/facebook_reels.py +140 -0
  142. socialctl/native_schedule/first_comment.py +181 -0
  143. socialctl/native_schedule/handoff.py +193 -0
  144. socialctl/native_schedule/instagram_delivery.py +224 -0
  145. socialctl/native_schedule/instagram_runtime.py +66 -0
  146. socialctl/native_schedule/inventory.py +70 -0
  147. socialctl/native_schedule/migration.py +310 -0
  148. socialctl/native_schedule/models.py +103 -0
  149. socialctl/native_schedule/reconcile.py +83 -0
  150. socialctl/native_schedule/remote_data.py +177 -0
  151. socialctl/native_schedule/report.py +151 -0
  152. socialctl/native_schedule/store.py +560 -0
  153. socialctl/native_schedule/verification.py +32 -0
  154. socialctl/native_schedule/youtube.py +339 -0
  155. socialctl/operation_output.py +87 -0
  156. socialctl/plantillas/accounts.yml +33 -0
  157. socialctl/plantillas/brand.md +95 -0
  158. socialctl/plantillas/estrategia.md +64 -0
  159. socialctl/postfile.py +240 -0
  160. socialctl/preflight.py +73 -0
  161. socialctl/publication_policy.py +34 -0
  162. socialctl/publication_status.py +75 -0
  163. socialctl/publication_steps.py +398 -0
  164. socialctl/publish_output.py +96 -0
  165. socialctl/publisher.py +445 -0
  166. socialctl/queue_migration.py +302 -0
  167. socialctl/read_budget.py +224 -0
  168. socialctl/read_reports.py +91 -0
  169. socialctl/rutas.py +103 -0
  170. socialctl/saas/__init__.py +1 -0
  171. socialctl/saas/access.py +75 -0
  172. socialctl/saas/auth.py +213 -0
  173. socialctl/saas/backup.py +124 -0
  174. socialctl/saas/billing.py +327 -0
  175. socialctl/saas/billing_enrollment.py +1237 -0
  176. socialctl/saas/billing_enrollment_schema.py +519 -0
  177. socialctl/saas/billing_inventory.py +775 -0
  178. socialctl/saas/billing_reconcile.py +127 -0
  179. socialctl/saas/billing_routes.py +27 -0
  180. socialctl/saas/budget.py +66 -0
  181. socialctl/saas/connections.py +374 -0
  182. socialctl/saas/consent.py +52 -0
  183. socialctl/saas/lifecycle.py +341 -0
  184. socialctl/saas/mail.py +89 -0
  185. socialctl/saas/maintenance.py +68 -0
  186. socialctl/saas/meta_user.py +298 -0
  187. socialctl/saas/meta_webhooks.py +358 -0
  188. socialctl/saas/migration.py +107 -0
  189. socialctl/saas/models.py +8 -0
  190. socialctl/saas/operations.py +102 -0
  191. socialctl/saas/pages.py +126 -0
  192. socialctl/saas/pairing.py +158 -0
  193. socialctl/saas/permissions.py +57 -0
  194. socialctl/saas/reminders.py +128 -0
  195. socialctl/saas/renewal.py +74 -0
  196. socialctl/saas/restore_guard.py +229 -0
  197. socialctl/saas/revocation.py +97 -0
  198. socialctl/saas/rotation.py +114 -0
  199. socialctl/saas/routes.py +221 -0
  200. socialctl/saas/settings.py +34 -0
  201. socialctl/saas/store.py +106 -0
  202. socialctl/saas/temporary_media.py +245 -0
  203. socialctl/saas/webhooks.py +76 -0
  204. socialctl/schedule_remote.py +262 -0
  205. socialctl/schedule_sqlite.py +44 -0
  206. socialctl/scheduler.py +581 -0
  207. socialctl/scheduler_launchd.py +319 -0
  208. socialctl/scheduler_systemd.py +167 -0
  209. socialctl/source_links.py +119 -0
  210. socialctl/ui/__init__.py +1 -0
  211. socialctl/ui/assets/agent-manual.md +850 -0
  212. socialctl/ui/assets/agents.md +27 -0
  213. socialctl/ui/assets/components.css +20 -0
  214. socialctl/ui/assets/connection-layout.css +53 -0
  215. socialctl/ui/assets/otp.template.html +10 -0
  216. socialctl/ui/assets/tokens.css +1 -0
  217. socialctl/ui/assets/trial.template.html +11 -0
  218. socialctl/ui/assets/web-layout.css +38 -0
  219. socialctl/ui/email/otp.html +10 -0
  220. socialctl/ui/email/trial.html +11 -0
  221. socialctl/upload_consent.py +13 -0
  222. socialctl/workspace.py +8 -0
  223. socialctl/youtube_data.py +471 -0
  224. socialctl/youtube_data_service.py +225 -0
@@ -0,0 +1,168 @@
1
+ Metadata-Version: 2.5
2
+ Name: socialcli
3
+ Version: 0.3.0
4
+ Summary: SocialCli: publish and manage creator-owned social content from the terminal.
5
+ Project-URL: Homepage, https://socialcli.app
6
+ Project-URL: Repository, https://github.com/engels-florentino/SocialCli
7
+ Project-URL: Issues, https://github.com/engels-florentino/SocialCli/issues
8
+ License-Expression: MIT
9
+ License-File: LICENSE
10
+ Requires-Python: >=3.11
11
+ Requires-Dist: httpx>=0.28.1
12
+ Requires-Dist: keyring>=25.0
13
+ Requires-Dist: pydantic>=2.13.5
14
+ Requires-Dist: pyyaml>=6.0.3
15
+ Requires-Dist: typer>=0.27.2
16
+ Provides-Extra: connection-server
17
+ Requires-Dist: cryptography>=43; extra == 'connection-server'
18
+ Requires-Dist: fastapi>=0.115; extra == 'connection-server'
19
+ Requires-Dist: uvicorn>=0.30; extra == 'connection-server'
20
+ Provides-Extra: headless-credentials
21
+ Requires-Dist: cryptography>=43; extra == 'headless-credentials'
22
+ Description-Content-Type: text/markdown
23
+
24
+ <p align="center"><img src="docs/assets/socialcli-logo.png" width="128" height="128" alt="SocialCli logo: S and terminal prompt &gt;_"></p>
25
+
26
+ # SocialCli
27
+
28
+ **Current source version: 0.3.0.** SocialCli SaaS is the current SocialCli
29
+ product. The repository root on `main` is its single development workspace;
30
+ the CLI, hosted connection service and account/billing components live together
31
+ here. Earlier versions remain in Git history for reference and migration.
32
+
33
+ **A social media CLI for AI agents and the people who supervise them.** Use a terminal-enabled assistant to inspect your accounts, draft posts and prepare user-approved actions on YouTube, Facebook, Instagram and TikTok. SocialCli provides concrete commands, validation, previews and local records for creators and teams.
34
+
35
+ [Website and documentation](https://socialcli.app/) · [AI agent guide](docs/ai-agents.md) · [Setup](SETUP.md) · [Security](SECURITY.md) · [TikTok limitations](docs/tiktok-review.md)
36
+
37
+ ## Work with your AI agent
38
+
39
+ Install SocialCli where your agent can run shell commands, point it at your creator workspace and name the brand explicitly. Try:
40
+
41
+ > Check MyBrand's TikTok connection and available capabilities. Summarize missing permissions without publishing.
42
+
43
+ > Use MyBrand/media/my-video.mp4, draft a caption in our brand voice and show the complete TikTok dry-run preview. Wait for my approval before sending it.
44
+
45
+ > Inspect my YouTube video and propose a description change. Show the proposal and fingerprint before applying anything.
46
+
47
+ [The AI agent guide](docs/ai-agents.md) includes the commands behind these prompts, workspace instructions and the approval workflow. JSON is available on supported diagnostics and inventory commands. SocialCli runs through the agent's shell; it does not include an AI model or an MCP server. Your agent must keep credentials private and preserve the distinction between confirmed, pending and uncertain results.
48
+
49
+ ## Public SaaS pilot
50
+
51
+ Copy this line into your terminal-enabled AI assistant:
52
+
53
+ > Install SocialCli: https://socialcli.app/agents
54
+
55
+ The installation guide verifies the selected release download and uses
56
+ https://pilot.socialcli.app for email sign-in, assistant approval and account
57
+ connections. The pilot supports eligible YouTube, Facebook, Instagram and TikTok
58
+ test accounts. Provider verification is separate from the OAuth publishing
59
+ toggle; Meta development access and TikTok sandbox restrictions still apply.
60
+ Stripe uses test mode. Planned access costs
61
+ USD 10/month after 14 free days from the first successful connection. No real
62
+ subscriptions are collected in this pilot.
63
+
64
+ The current client release target is **0.3.0** (published first to TestPyPI and
65
+ then to PyPI through the reviewed release workflow). The compatible hosted
66
+ runtime is `socialcli-saas-candidate:45fda63`. The client's wheel and
67
+ source archive are verified against the
68
+ reviewed build hashes before publication. Provider commercial approvals and live
69
+ billing cutover remain separate from package publication. See the
70
+ [release record](deploy/saas/release.md).
71
+ The [stable release scope](docs/stable-scope.md) excludes unsupported automatic
72
+ operations; disabled research catalogue entries are not offered features.
73
+
74
+ ## Install and connect
75
+
76
+ Use the short installation prompt above. Your assistant needs a persistent shell,
77
+ Python 3.11+, macOS or Linux and protected credential storage. The bootstrap
78
+ verifies the exact wheel before installation and resolves dependencies from normal
79
+ PyPI. Video validation also requires ffprobe from FFmpeg.
80
+
81
+ The setup order is **brand → credentials → account login → connect**. Ask for the
82
+ brand name explicitly, preserve its workspace outside the application repository,
83
+ and read socialcli agent-guide setup. The account step uses
84
+ https://pilot.socialcli.app. Give each printed link directly to the user without
85
+ opening it; the user signs in and approves the assistant and provider account in
86
+ their browser. Never request OTPs or provider tokens in chat.
87
+
88
+ ```bash
89
+ socialcli account login --brand MyBrand --service https://pilot.socialcli.app --no-browser
90
+ socialcli connect youtube --brand MyBrand --management --analytics --no-browser
91
+ socialcli connections --brand MyBrand --json
92
+ ```
93
+
94
+ Run these after creating the brand and configuring protected credentials as shown
95
+ in the [connection guide](docs/connections.md). OS keyring and explicit encrypted
96
+ file storage are supported; there is no silent fallback. Use the same workspace,
97
+ store and key in later conversations. Connecting never authorizes publication.
98
+
99
+ For source development use uv sync --group dev, uv run pytest and
100
+ uv run socialcli --help in the repository. [SETUP.md](SETUP.md) covers independent
101
+ operator apps; customers of the hosted SaaS do not need developer credentials.
102
+
103
+ ## Review and publish
104
+
105
+ Create `MyBrand/posts/my-video/post.yml` and place your produced file in `MyBrand/media/`. [Example](examples/post.yml):
106
+
107
+ ```yaml
108
+ slug: my-video
109
+ campaign: clip-vertical
110
+ platforms:
111
+ tiktok:
112
+ body: "A story worth telling."
113
+ hashtags: []
114
+ media: ["my-video.mp4"]
115
+ ```
116
+
117
+ ```bash
118
+ socialcli publish my-video --brand MyBrand --only tiktok --dry-run
119
+ socialcli publish my-video --brand MyBrand --only tiktok
120
+ ```
121
+
122
+ The first command displays a preview without publishing. The second displays it again and requests confirmation. TikTok defaults to **inbox**: the video reaches your inbox and you complete publication in TikTok. A pending confirmation status does not mean the video is published.
123
+
124
+ ## Features
125
+
126
+ - Separate brands, local credentials and token renewal where supported by the provider.
127
+ - File validation, previews and confirmation before publication.
128
+ - Publishing, inventory, metrics and content management, subject to each platform's permissions and capabilities.
129
+ - Scheduling with approval checks and handling of ambiguous results to reduce duplicates.
130
+ - Adapter tests with simulated responses that do not publish to real accounts.
131
+
132
+ Each command group documents its options with `socialcli <group> --help`. The internal Python package remains `socialctl`; the public command is `socialcli`. `socialctl` remains a compatibility alias.
133
+
134
+ ## Status and limitations
135
+
136
+ Public source code does not grant production API access. Each platform imposes requirements, permissions, quotas and reviews. SocialCli **has no accredited TikTok production approval**. Direct Post is disabled and excluded from the current offer; creator-reviewed inbox upload is supported. Direct Post still lacks the complete user experience controls described in [the technical review](docs/tiktok-review.md). Publishing this repository does not satisfy those requirements.
137
+
138
+ Metrics and management permissions are separate from publishing permissions. A valid connection does not demonstrate authorization for every feature. Check capabilities and verify remote results before retrying an uncertain operation.
139
+
140
+ ## Contributing and support
141
+
142
+ Read [CONTRIBUTING.md](CONTRIBUTING.md). For questions or bugs, open an [issue](https://github.com/engels-florentino/SocialCli/issues) without tokens, keys, `.env` files or private logs. Report vulnerabilities through the private channel described in [SECURITY.md](SECURITY.md).
143
+
144
+ [MIT license](LICENSE). SocialCli is not affiliated with the platforms it integrates.
145
+
146
+ ## Account, media and scheduling
147
+
148
+ [Account](https://socialcli.app/account/) lets you manage your brand, connected
149
+ platforms, approved assistants and billing. The plan covers one brand and one
150
+ account per supported platform. Subscribe during the 14-day trial without losing
151
+ its remaining days; the first USD 10 payment is due at the original trial end.
152
+ The current pilot uses Stripe test mode and collects no live payments.
153
+
154
+ Instagram can use automatic 15-minute temporary staging on florentino.pro for
155
+ supplied originals, up to 512 MiB and subject to quotas. Files are excluded from
156
+ backups and removed after the operation or by expiry cleanup. Local schedules
157
+ keep the original on the customer runner and stage it only at dispatch. Verified
158
+ native scheduling uses provider storage where supported. See
159
+ [media handling](MEDIA-INGESTION.md) and [scheduling](NATIVE-SCHEDULING.md).
160
+
161
+ Read the packaged socialcli agent-guide topic for the operation, the
162
+ [capability matrix](docs/capabilities.md), [security](SECURITY.md),
163
+ [privacy policy](https://socialcli.app/privacy.html) and
164
+ [terms](https://socialcli.app/terms.html). Historical 0.2.6 releases and deploy
165
+ records are migration evidence, not a second current product.
166
+
167
+ SocialCli is operated by **Florentino.pro**. For private account, billing or privacy
168
+ questions, contact [admin@socialcli.app](mailto:admin@socialcli.app).
@@ -0,0 +1,224 @@
1
+ socialctl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
+ socialctl/__main__.py,sha256=3s7Cky_ATIRXnfgny8sqCzMRHxjYav3L9SliXLqcwTs,141
3
+ socialctl/agent_errors.py,sha256=xLzVgBuwUSY8M0ePXEQZcAc9kTF4XrpFewcoJeN2RII,12875
4
+ socialctl/agent_guide.py,sha256=p8IAs3NKbBu24XmBofcWfDAHGoHS-nISY9z7P-yiG3g,1749
5
+ socialctl/approval_cli.py,sha256=fxIZE7YY4nklzgsIEVltNgL7CiZ_zr7iLl_w46p91YU,1192
6
+ socialctl/auth.py,sha256=OyaJ2FFws7DrAZgxbXSCDy2Ql_ID6b1oL6cTvlTN4ac,5556
7
+ socialctl/authflow.py,sha256=lkz9SeZ-B2oTtNd_wY5A2slNPS08o14_kw5GJkN1DhU,14130
8
+ socialctl/brands.py,sha256=sXWGTB86Ua8-23cpP0AFivTNkRrtbNONl8OIeBvCz38,7001
9
+ socialctl/capabilities.py,sha256=U2Nei99yeid0IqLkGcvVQYXpFJrv4U-cXY2SyQP9MQs,2672
10
+ socialctl/capabilities.yml,sha256=_4ox5_m3TOxD9QLjxgpUzkN7GTlarL-N5FQV_GUNtg0,301164
11
+ socialctl/cli.py,sha256=bO4ndUvXfPwim0qpmPTbyuWjBMoSbIUDaMVUIZ36Xy8,80555
12
+ socialctl/delivery_options.py,sha256=B2yyGTOyJwgnv5gKS_RO241Nf3YxIVkL8JtpBm0sxRA,4165
13
+ socialctl/engagement.py,sha256=SCWSL0BdYpWMzN1qaIz-cIhHTlP3WB4MXUdrkQQFSr8,13746
14
+ socialctl/engagement_cli.py,sha256=Azo4kTqE6ZUDsyWA5oe30hpnPzH3KnFFsZ3UyzlTX90,2887
15
+ socialctl/executor.py,sha256=vWY96Ic94R0w7srcCPMEpAl_9Ys-wSMHIdb5U2p_6r0,5751
16
+ socialctl/formatter.py,sha256=Q0LFYzaIBwh04MP8F6qENxP-0LT0VWIKFtQHpdxG-8M,11737
17
+ socialctl/hosted_media.py,sha256=5kY5aDqPo0HAFWniarh_rJEjc4Aqv8W8y4OcERTPUJ0,7984
18
+ socialctl/identity.py,sha256=lnu65GD4y5kNugG1olNTAGZWuunewEXoGNm4HToLmvA,9232
19
+ socialctl/inbox.py,sha256=q9O6lkfRRCKcL-E4KIo4zSjlhYNEuedp3LP--FHuuhs,20042
20
+ socialctl/inbox_cli.py,sha256=a6c9SYcNLfjp5MwXQWa1yi0p9eyoCU0QqmR4Z1Ag9sU,3198
21
+ socialctl/inventory.py,sha256=57RxmRUgLPhLePRP3G-Bfav0CQ9qnk7P1wEnD6eThGY,7088
22
+ socialctl/inventory_cli.py,sha256=fiwHLRcCtYW6VYBIrcxLpsJVZD1e98zhfqTD_4bsNLA,9458
23
+ socialctl/inventory_sources.py,sha256=17OsoPxc5kRfHuZJuj1hAwbsC-jfFUt4IfC2HBR-Pgw,5177
24
+ socialctl/media.py,sha256=qERziLP5N1vgrnXrsKkQf9iCUUeF2ERDS1SUntUdNOU,11397
25
+ socialctl/media_cli.py,sha256=Y8XWyPxs9F8OG9PnoLIIEOL6vItH9s-kUcGgVcwTphA,9242
26
+ socialctl/media_ingress.py,sha256=S9xfOo-b0Jga_0kzuZSBSP7xWh1FzrmmFGAOpEwj-QU,11409
27
+ socialctl/media_preflight.py,sha256=iHwI6cS1fEC5TxidEPc4OLwb4WX284d2itPNYhxEWrk,7328
28
+ socialctl/media_registry.py,sha256=TBLA4DBdPGppa3wqI-Ykoyp15JkBo60jkS6nMVG-qPA,12872
29
+ socialctl/media_requirements.py,sha256=LX0ze-d_N2C2f60_-RJc_fn8R-Gz5p1OY_cDuRTd_VY,3672
30
+ socialctl/migration_cli.py,sha256=N8EIUuvvCnO9NI-eeplsSvQIK3mMscjoQqXpl7qWAZQ,3019
31
+ socialctl/migration_files.py,sha256=ohpaIZF0RjLAI2Rj5AQwZcRRbKH8hEYBy8ncatZ-R3s,2776
32
+ socialctl/models.py,sha256=xkT06nUZtGd7m8WgZZLgNEq-h7ghyr_pH9eHA8KWt4I,5405
33
+ socialctl/operation_output.py,sha256=6j4_zFuanr97Ym9RshJydjaZ9oPdk2zlP9uaRdxStbs,4192
34
+ socialctl/postfile.py,sha256=RSNQKKEHH8OE7eosd9nkRUsT2o9Q7A3oAL55Gw9A8uE,8946
35
+ socialctl/preflight.py,sha256=Sa2dEcNvb_L-8Gd5M0FMJM8eH7tctewtppKKzKsAfz0,3294
36
+ socialctl/publication_policy.py,sha256=NgZ3xJwh1oCpO8Pq-IWZDDM53QLnRKSIwwj3ZtekQEQ,1666
37
+ socialctl/publication_status.py,sha256=9uAubMLqjhBHvY6UC8C_6GZVjjvmLtjSv0ZQUNPnVTc,3223
38
+ socialctl/publication_steps.py,sha256=lgzxiX6wqcpnqe2lasGtvk_PgyzEGTM7nWR5DgJYBXw,20189
39
+ socialctl/publish_output.py,sha256=-etcw5NhQ5v003SJ9x4iVslNItvxcZjLx05AfDe0Qa0,4406
40
+ socialctl/publisher.py,sha256=IacW5xVvnVhCLSQvhVp-EXLRv4DNXsM-BYlf29zZI9A,19481
41
+ socialctl/queue_migration.py,sha256=LfxhCmIWlpvcEs1OCjh-ch4bUU5KaEodMT8mEVFTCxg,17295
42
+ socialctl/read_budget.py,sha256=vEmAFPw0YVQiMWO_Pir-n0Ml1nwMUHwR7eCmqzZ_AEU,8980
43
+ socialctl/read_reports.py,sha256=5G_ISxwy1PeMfanDuWX3_VpE9E8yRa1QR1UJi0LCZwI,3832
44
+ socialctl/rutas.py,sha256=BFMEwYFcYtjCgrdBEjnjtjzbfd2M24UbxMkLoDWVs4Y,3176
45
+ socialctl/schedule_remote.py,sha256=mDMJt6OVjktzbqdg3zZHcuMOGzty6b5_YgOKZurPrgU,11872
46
+ socialctl/schedule_sqlite.py,sha256=eNH6crxROqKpFEMBYHgmzoH-wJTsimtV5IFTPglfJno,1732
47
+ socialctl/scheduler.py,sha256=SkIRSHGlz5Zna893OhD7SNqr7j16MhWnxsdXSC1yHYE,24357
48
+ socialctl/scheduler_launchd.py,sha256=j83yWSOn6-ayxICPD0ZFXcvMWzUaMXbAbS5VUxxyI_M,14729
49
+ socialctl/scheduler_systemd.py,sha256=LENCFf1ONdgxS3g_8bmPbap1nz6A1cqNUmvoc8uUKx8,8104
50
+ socialctl/source_links.py,sha256=uLYTZHUV1LLG9E-mzaR9ZcGY_MYuGHiA9hegyvUAR-Q,5150
51
+ socialctl/upload_consent.py,sha256=o5yvAHIW1aFrxh4_5DyfmzGIi7xGzxCvyhCeBPsk4iI,625
52
+ socialctl/workspace.py,sha256=9UHAudzn5L7ph5xDIvKMmFV9Tfqgp2AC7uqSyhFZOBY,282
53
+ socialctl/youtube_data.py,sha256=Mwj4GtupQ7QMwVQH17gY57rxyaoAKoXjfvC_9K0CNo8,25904
54
+ socialctl/youtube_data_service.py,sha256=0LFwEP3wwL-0dFeFmGtRkZrdYbH_aZYwwYzkvYTfXJg,12515
55
+ socialctl/adapters/__init__.py,sha256=alhYdPAuSS3mjoWJkUvcPPiJ-j_wthyWiT2jFOmKyso,259
56
+ socialctl/adapters/base.py,sha256=yIaNIElmmhVSaqryNe1IEtkmNVGk0ubKV1ZaUhbfPko,2440
57
+ socialctl/adapters/errores.py,sha256=zwMDFMSpm1HTEe3BYrWoFgnQKyZK0BXcfob9m2wfbII,2281
58
+ socialctl/adapters/facebook.py,sha256=1XT_6j2Tdj3_poXkHk7TW3hzdc5IlE0TPqsI1UrAQuU,7617
59
+ socialctl/adapters/instagram.py,sha256=QASMlAhcRg8y8Ief1CiJKgPOWt6-0MuwqzBbZiYlsr8,20807
60
+ socialctl/adapters/tiktok.py,sha256=A65fWWsOIm5BocSbR6GoizYmARQkTfC7kjfaKqGSGWs,22473
61
+ socialctl/adapters/youtube.py,sha256=rOvYUvFmEYjgFt82KU03LMRwIqZHc0snAQcuTaleUTI,14232
62
+ socialctl/connection_service/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
63
+ socialctl/connection_service/__main__.py,sha256=7lRogxeJPacEv-nroh9ZdXAjH2IiJgY1Jhe_ZMOp2tc,1196
64
+ socialctl/connection_service/app.py,sha256=flGGsMs-0c71a7i-9v1dQvif-D7iYaIogUgWDcLy66o,29517
65
+ socialctl/connection_service/landing.py,sha256=U_u3CETMb1FxHLhV6g_zp-KAkV-6lBtE8MR5zDs_HY4,9165
66
+ socialctl/connection_service/legacy.py,sha256=7RfnXZ-8QV9F7K3zhNIJnu8qdfHbKe93-GzMps7u4KU,2932
67
+ socialctl/connection_service/peer.py,sha256=j58hz1rkIgctAvwpIfzPGKEIla0koqeCh19Td9kDf-4,484
68
+ socialctl/connection_service/providers.py,sha256=vZlMdD7yl0CcD766gK2nISICiq30UUuM89DkrgXCuXw,18621
69
+ socialctl/connection_service/settings.py,sha256=SeZ8GWka5kJ0u5NUNXBfjwdDZ9wRQ_5Br12ZzUHaIm8,4068
70
+ socialctl/connection_service/store.py,sha256=xnaWOp_6CfVItuw3GrIV80vHjptOEvN6Fnbnp7JyBYc,7804
71
+ socialctl/connection_service/assets/PLATFORM-LOGOS-LICENSE.txt,sha256=qTln01sbo6pxnSHj1JaDJc4Rp0fim4tZrsuFT5p1u_A,7424
72
+ socialctl/connection_service/assets/connection.css,sha256=QIfJppSpAGofSeD-eWxpFi7lO7P8A9j-hH4EP3VPSog,8723
73
+ socialctl/connection_service/assets/facebook.webp,sha256=BOOKYfnLN0C085IMpaMYSAJ2YwVv4Hcg1-dg5GQQtwo,27072
74
+ socialctl/connection_service/assets/instagram.svg,sha256=aaf9ceB3ERS1s4DkE0EloGbjXambRP5WBO4ML8eejp4,13615
75
+ socialctl/connection_service/assets/socialcli-logo.png,sha256=ShFXrB9hES6MvNdMNDCuYHQmT6BsP_323nKJmq4cblY,847748
76
+ socialctl/connection_service/assets/tiktok.png,sha256=B9yfoewhvRdduETG1WjAN0iWGsTpImgYsPZ3PBoeCYQ,11997
77
+ socialctl/connection_service/assets/youtube.svg,sha256=f1FWRIucG2UVbjTkRD8O_4uF9a-ng_yKjQn0k4D-1CQ,474
78
+ socialctl/connections/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
79
+ socialctl/connections/account_cli.py,sha256=Nr7DaM7FuxUVkvh3FavarbSFLU7ooMDDxyPujSUTz1A,27606
80
+ socialctl/connections/cli.py,sha256=EsQ9iHriZREMbFk7NIuV3xA20kpAvzB44vepDvEElf8,22719
81
+ socialctl/connections/client.py,sha256=EXUSsN5hBsXSv9ZT70EUe3lnH7mlTVSdbKXzmkMxRz8,6216
82
+ socialctl/connections/credential_cli.py,sha256=NL9oEzYefHEobwgkmiRQ_3bPH-QahTyN_b_A4fDXSIk,12688
83
+ socialctl/connections/credential_store.py,sha256=vyEPLgDMnmd8joDwj1kKvzzF-kMy-BYoxSrKn0X2M-8,1939
84
+ socialctl/connections/file_store.py,sha256=sKhunqb0boJRSoXTqZcnmRVAdgVRpxGDeoukDZDTrhI,7838
85
+ socialctl/connections/keychain.py,sha256=jHZw4oRqd4GWit0kqe2zxLMpPmKwdg-dZiAMDWsyJZ0,2709
86
+ socialctl/connections/meta_user.py,sha256=tNx5OIScdsCgdgBt0pWHlqXVxalHfFH716lUaYpEC3A,5184
87
+ socialctl/connections/rotation_cli.py,sha256=AEYAQCwsGRIf5jWpkQm8GY_Y4nNHa0CqMChNeqDayNo,8470
88
+ socialctl/connections/saas_client.py,sha256=JXJILjmTdq_1yTeTqWFA4orohdJ5sJtjiNM9pK89PCk,7234
89
+ socialctl/connections/temporary_media.py,sha256=BnVkZL0ClgTVP516xYvmgvtGalkqbet0OMe9913AiQE,3144
90
+ socialctl/management/__init__.py,sha256=t04iFkzm438qvqCPfHueAiF1fak4eKJMY93ejC3p6p0,55
91
+ socialctl/management/batch_cli.py,sha256=fVDgKOv-AbW88FQM3X_ESJzx_7JzUlNCkBo6Hp6K8lo,6001
92
+ socialctl/management/batches.py,sha256=EUVlU8jbRU2akUu4fc_xVTw8MAZEVO-Qvo1thTvy_fE,14027
93
+ socialctl/management/changes.py,sha256=yrIL6qI3Rf9kpaVjravwDDd1NhTOxs3KoeK2j8akX08,17526
94
+ socialctl/management/cli.py,sha256=zFFeVm0ifVqbz9ztPhVRYEjmQNch58qVtDL_wr6rTm8,7933
95
+ socialctl/management/comments_cli.py,sha256=ihKZl9ssGTR8XI6BdWvsX56QvYuR1kl_N62fdGyWtC0,20001
96
+ socialctl/management/community_batch_cli.py,sha256=9xAWIzKxK7ovabP1ngLqOn5ZU6BJuSFTqoyYnN8Ec6o,3732
97
+ socialctl/management/community_batches.py,sha256=3ZaqXxD4W78NfK0MvGddSXuRtwgDBRFyBFNs4_QAww4,16169
98
+ socialctl/management/community_changes.py,sha256=he4BqaHGnY0mW8XU6aCYB5kg47DKa8pkGA4hoR3fmUg,20600
99
+ socialctl/management/community_cli.py,sha256=no9awxKiCIKxHAhzSYMYDszCRbPgX4Ak0tZCWt9a840,10169
100
+ socialctl/management/community_schema.py,sha256=CWzv443pnGZCE4jd8DumsH1cAEPumpTx1xTYPxEXOrc,5092
101
+ socialctl/management/facebook_groups.py,sha256=6QLkAHsWwHF7OwKhFMGKDwtDeVgPv2pgigt050cPvC4,45511
102
+ socialctl/management/groups_cli.py,sha256=21p5ZfnScYik5yxidJDF44BMVzCRiQ0ZlnykMfz0Fzk,11445
103
+ socialctl/management/inbox_readers.py,sha256=8DTUlivtAiLRnO5-yHDjngX4wDWHbOfNROAK6SLl348,3760
104
+ socialctl/management/meta_changes.py,sha256=mMX4sBDg6seFnD-865KiODWs8xXeXxI7f9klp6-aYJY,8818
105
+ socialctl/management/meta_cli.py,sha256=qG_y2prECoyzlo2-RAj3n89tRbX4UKBjij12acgrtrY,14019
106
+ socialctl/management/meta_client.py,sha256=giynNCMmePUC9IaU34nW4Fh0pxMQLSiID9ISJQnQVjM,39380
107
+ socialctl/management/meta_comment_inbox.py,sha256=KD9J3pX-J6-9c_GSc4kMXWHNLabNcoCMJS8CkBm1vLk,28390
108
+ socialctl/management/meta_comments.py,sha256=ilBmnMj5x6FpYw_jPBAVgpyWCvEerSTcI6ueM3YaUqY,30298
109
+ socialctl/management/meta_errors.py,sha256=jOrYOBaeYm2ZwwgwR8HPdiH9BhoZn5MxX0eLHfKPgfk,2695
110
+ socialctl/management/meta_pagination.py,sha256=uCNLokJjzjvCwiudZ0Rqu5gXNSNozRSgkqDtCN_KF28,2252
111
+ socialctl/management/meta_schema.py,sha256=x_mdfMQTcXbay21iWlU9XVrG1jIWoSfzXdMDCEbwkbM,4693
112
+ socialctl/management/meta_webhooks.py,sha256=Xt0jqA6lqG28h8VFq6lsZHI7Gmpr8hO6qzDYDdUikwc,8093
113
+ socialctl/management/metadata_parts.py,sha256=KI-AXjE1ansOi3XCTwH4vYwseFOJoBi_fvGsqq8Dcrg,7775
114
+ socialctl/management/owned_assets.py,sha256=8vgMEIrTV_T2FiVTAZU_wQQnJOlUUHCWfLIX2iTEzhw,4004
115
+ socialctl/management/owned_changes.py,sha256=hZbnmpj96s0gZd71MlCIBRO1Aiy30D6RtT_R97A7Nt4,25772
116
+ socialctl/management/owned_cli.py,sha256=39I45aeav-qgFA-6tYG5Zd4BnUWP1WSRyIqZPU1Vomw,6691
117
+ socialctl/management/owned_reorder.py,sha256=zk59W3TJZ1HcgsMeOwj85DzB7Ry1kPjif5sN_lw646w,3623
118
+ socialctl/management/owned_schema.py,sha256=EX9i66XrMMRpRIYmlu0errC3HUB82spDBXEiXw0mmco,19952
119
+ socialctl/management/reply_context.py,sha256=wWLUvtLqdtaT03J0fhescPlToLtxSk5HXofigNmbAIg,1509
120
+ socialctl/management/reply_evidence.py,sha256=gscXyZj9SbWhUn7OW40rFgLTwuHu-jgj-TB0M7JQiUQ,4320
121
+ socialctl/management/resource_changes.py,sha256=nseklqxxZ0cuaFckcgG3CavdwXPdIho-_rEGZAhwDrA,20964
122
+ socialctl/management/resource_cli.py,sha256=hINDGj4Zi0GAWzqKtzyqqrEx7xAf8tk1-N8kqntaow8,7127
123
+ socialctl/management/snippet_readback.py,sha256=WO84_L7TyqJtD4okdAyF8ki5pwa7FqTFn-fOcVh9WM4,1246
124
+ socialctl/management/stories.py,sha256=CBne8BcGlGoUYH2-i9eLPC3Yxf7Mlh4gtUlMeKwKQIE,29554
125
+ socialctl/management/stories_cli.py,sha256=TgEvjoAyGauR2bX27vumbdEyWD5ryXyfDTRJWuH0fAE,7104
126
+ socialctl/management/youtube.py,sha256=Eas89K5o76s-8JMJo7f9K_yl5EBY0KjxAThAHffXxnM,13108
127
+ socialctl/management/youtube_community.py,sha256=wZIrHz8aP5QA4viZMU9EVrsAvqv888HOFzDV0j-2PuY,19517
128
+ socialctl/management/youtube_metadata.py,sha256=zYIlgtC6s-NuhyDzwaA-3GdhNyU7sytW48FUJWn_Kx0,6513
129
+ socialctl/management/youtube_owned.py,sha256=_BeteA8L6C7V9YBo656HR0Mri5ZvbzDSPrrjCDPFMLw,15751
130
+ socialctl/management/youtube_resources.py,sha256=FW-dVF2LGCq0ivfbLH4AmoFBviBGdkEds5LI9l6A9KA,15656
131
+ socialctl/metricas/__init__.py,sha256=cpYEcSTf66Rnre_I6pn8pGZFN3gUmX9SSQ6NKsOalcI,285
132
+ socialctl/metricas/almacen.py,sha256=ppIYnb1N7fu5pwKhhinGUWub2VB5R7MrZuQ4q6-9SkE,4948
133
+ socialctl/metricas/analytics_changes.py,sha256=F3lBUSAjgQl9v6yQkNAfLEisn8b6y2FhAS8YQx3mIbU,14825
134
+ socialctl/metricas/analytics_cli.py,sha256=jIOz3l9X8DXy-xoC51NOT_KxTa7YfGxOwHke5g4JFcY,11031
135
+ socialctl/metricas/analytics_client.py,sha256=BPijijFWmOmyaj5xiIpCWPk-AvRHERQFjfieNxaT7CA,18909
136
+ socialctl/metricas/analytics_ingest.py,sha256=zNbM9DEeNnfoapCTj1cypXEfQ48Kz0unr26dfARa9Hc,15438
137
+ socialctl/metricas/analytics_schema.py,sha256=gKUJ2fXqGYcm0dqs_KWATlAGOK6X8VZ74qGH1r6clZY,11690
138
+ socialctl/metricas/base.py,sha256=v5Y2c0FJqkaN-yQiHwqgOmpdHuBERzfIIZmii3jMPLQ,6912
139
+ socialctl/metricas/facebook.py,sha256=fRkQ3bVyo8Xv85upsi9lvmSP69M8oyFAhtbsic7WwHA,18527
140
+ socialctl/metricas/insights.py,sha256=v2KwGytyDZzXR3uFAJSfFnEBIcaJBAs7K8nrV3P6sIk,12503
141
+ socialctl/metricas/instagram.py,sha256=drsyavF3NYhhDJ5bl_AAhQKKpQygv31qFTifegyd3u4,5683
142
+ socialctl/metricas/modelos.py,sha256=wEo0X_N7JmcD510xKjaM3quVi41dYGJyNXQ-NYXMlZQ,2714
143
+ socialctl/metricas/piezas.py,sha256=Ng52s-CTQUTdf1nWcRR84LVbuuWZxKoPyvKSbgEKumI,5924
144
+ socialctl/metricas/reach.py,sha256=mPyDHJdj-6xXf3tLDEGIc9P4aEPUjQyMEsasF2sk8o8,4181
145
+ socialctl/metricas/reporting_client.py,sha256=4xfrTyrl4gOBVyIrL3zpUVUI600Bbvswy2dKbCmX2Jc,5998
146
+ socialctl/metricas/resumen.py,sha256=UTwT9VGVzaTS3WWEsKGH_HJ7mVWiUfsxk0zhu7O_2qE,11112
147
+ socialctl/metricas/slugs.py,sha256=FluUgAs4Y2n_IwiLS1xch575Pc99F8vjDBbVgYt3LQc,3459
148
+ socialctl/metricas/tiktok.py,sha256=z2iEkzW1owaF6twpcNcthSlqgOyusDE5X28jIlsdL34,8141
149
+ socialctl/metricas/youtube.py,sha256=PrHudr_VMskf5XFSfVqmTeBurY3_7ip4UlDiHhFg2Uw,17630
150
+ socialctl/native_schedule/__init__.py,sha256=NF-U_AIOP6YCmsQqJD-pjCijdRqi65j_eFywNi9EylI,387
151
+ socialctl/native_schedule/api_delivery.py,sha256=CoJHpVEDW6jJs31avBl82_iQ7YTWCFet0OIaBGfjqiY,492
152
+ socialctl/native_schedule/api_reconcile.py,sha256=FwSPSL31LLGyP9ZrtuP3Iz6qs2iXhhUHZGEqpqsfEy4,1862
153
+ socialctl/native_schedule/approval.py,sha256=tZB9_afKEUSkP4np0oTP7WCQeE6aYAUD7ytGG87Al_U,8179
154
+ socialctl/native_schedule/cadence.py,sha256=iWRsyPX7Njoku7Tkd1-Xi0P_DtzkgxW01kbB8iW7nlA,3024
155
+ socialctl/native_schedule/cli.py,sha256=Kitq5Eyu_yXf7ieS1YLiGgsC333CPdPjbIM6pjUO_Yw,30614
156
+ socialctl/native_schedule/dispatcher.py,sha256=fOUCy9Edkk41jx7VRNn5s9R2QYxnuJWGe9EMaPy2vjs,6862
157
+ socialctl/native_schedule/facebook.py,sha256=F8pj0aeUVgo1Nu3HdeXAnDPQKkfZ7eBE45OVaue1QSM,5037
158
+ socialctl/native_schedule/facebook_reels.py,sha256=t2GIH_rehfNVGp2nwcGyCLUljpWTai3TQtAvWM58ZG0,6827
159
+ socialctl/native_schedule/first_comment.py,sha256=FGwCnuUkirqx0WFaF3AvH7k6HL9VGqkh7bZl88uWMVM,9818
160
+ socialctl/native_schedule/handoff.py,sha256=BaqT4gn9ItikDkJctgd_t2NkNxuDa0MY_d3J6KfPkG8,9207
161
+ socialctl/native_schedule/instagram_delivery.py,sha256=cq73jAcrMDQug4hEYl7I_YK7u47ssUT7X1V1R9yYy9s,10648
162
+ socialctl/native_schedule/instagram_runtime.py,sha256=dgGJyzIrKFQjD0tKucx3b-265n24nuKEqIBCBHfBP7c,4141
163
+ socialctl/native_schedule/inventory.py,sha256=nxIwhOX1KcXnfpZ0vCEwiIW8RLpanYg60SwNPFpC8C0,3765
164
+ socialctl/native_schedule/migration.py,sha256=5Wea4pWq_gp9Ybnu2d00cyiotuyCi1_OZes2ia2T6xI,17247
165
+ socialctl/native_schedule/models.py,sha256=EBlrDJtfazoBeWsLlX0toYOkcEQ1ueYUgF29YBAA_w4,3759
166
+ socialctl/native_schedule/reconcile.py,sha256=LcSEayCfL5AvCPGTGksGLsnF1FVVh3UYQQeS7nVOrF8,4158
167
+ socialctl/native_schedule/remote_data.py,sha256=CTLfLulufRN-xfLWmaKObwCVj6pGFT281zCRWo3H5xs,11245
168
+ socialctl/native_schedule/report.py,sha256=prEbasLdLRxZ-DkNoHoDTMN6NoL3XnnYpHHD2GzTzKA,6945
169
+ socialctl/native_schedule/store.py,sha256=Ag6c9JulrnCgnFP3kBS8hX1s5wPXGUnFO2o4mDLVcDI,34016
170
+ socialctl/native_schedule/verification.py,sha256=sPNpRqr5yYgfnWw9EUL-eT5AQtXMS5r4m00cu7_R8Uc,1517
171
+ socialctl/native_schedule/youtube.py,sha256=49R69xWvbQ2uhlcxTPD2txHnqVxkICZNYWKk4LtnGd4,17634
172
+ socialctl/plantillas/accounts.yml,sha256=Oi5qZBY-BtFJNM4GbT_zRuRlLWf1VcH33BDoclUX53Y,1362
173
+ socialctl/plantillas/brand.md,sha256=v8asOxL9RIC9l2AvJOKeSVL7Pncugx5hBfFI9IoOpQo,3298
174
+ socialctl/plantillas/estrategia.md,sha256=crm69Lq8gOjbMgbW9IYD8vxBG16XVdkJSeWVL_fYqGY,2195
175
+ socialctl/saas/__init__.py,sha256=BWyJVYgra20jZGzjbv08u6p9zFpR-SF8HSu1DB0nQoU,82
176
+ socialctl/saas/access.py,sha256=DtiWaeemSzCrimoaIsPysczeDGstjA7GgjACtXJXpdE,3673
177
+ socialctl/saas/auth.py,sha256=aPvwP5zKrZrp6RFRkTMLPOKoCwz0skKsg0uXuYFGeHg,10771
178
+ socialctl/saas/backup.py,sha256=2dXt4xs8DzfpCGzz_tjecPfRKONo0cI_bu9KmaENdew,6420
179
+ socialctl/saas/billing.py,sha256=EQK2rePnawJENCS1iW_s4XpreD2Y2k3Qkr0NRXTblQM,20172
180
+ socialctl/saas/billing_enrollment.py,sha256=yxUvMQS_q-aCAv9Yn6EfCVs9tblPUmEeVAu620HVkr8,66814
181
+ socialctl/saas/billing_enrollment_schema.py,sha256=0_FT1h38iavzXIDh4DW0hEBIYZ71fd3AmXBTjZG1T_g,15458
182
+ socialctl/saas/billing_inventory.py,sha256=GJ8P6khOhjWh-9vjLHjuHXKVh2DZl_lprGrC7NGfV30,39775
183
+ socialctl/saas/billing_reconcile.py,sha256=ieyhuJrHkJ9hoEmkeQUBM0hD-1OoVNlHeTVAdj67Cgs,8054
184
+ socialctl/saas/billing_routes.py,sha256=n8fWUz_lsZlvq9JJjDHW5BL_uWWiD72bF5rdi0Svo7A,1199
185
+ socialctl/saas/budget.py,sha256=w8B-0Tm5VowhTdmB58omRhbBPKrs2s8c4w5-tMFIhG4,1887
186
+ socialctl/saas/connections.py,sha256=0CM09BBwvnBCQSJsOundJzYB7ZET-HCyBG5QCYSJjuo,25711
187
+ socialctl/saas/consent.py,sha256=hkwbHyqsXDyQI8pdPIMBkg9v8jGn3ezJTWTUntDGu2M,2581
188
+ socialctl/saas/lifecycle.py,sha256=hGKIeM8iaWPb0XCNg6pNKkfLNgCzG0TVc0AFVYnOHuc,25799
189
+ socialctl/saas/mail.py,sha256=qpONTBD263B7iK_JbowyrpAZnVQioEV1Rw99IAnWZMA,3465
190
+ socialctl/saas/maintenance.py,sha256=tiLPsrA_svQPI_gGbAyPk9S9zYO3yfEULgMa75axHsM,3547
191
+ socialctl/saas/meta_user.py,sha256=JnbflRaPnlxlEe3NE0wM61e1WlZoM8WONzm9flpJY3Q,17992
192
+ socialctl/saas/meta_webhooks.py,sha256=iJByhQF44lCs1tStkCmzNwLEPDWxEU_cDMGzf79EdHI,21709
193
+ socialctl/saas/migration.py,sha256=cuF64WbXaIFfrtj8P2dXQNW1XZ_RGJs1PBZwQO8ysUc,7674
194
+ socialctl/saas/models.py,sha256=hyVA-3gTS6s1bUONjW65Io24AoZlKSLt84m8vPwrnjQ,171
195
+ socialctl/saas/operations.py,sha256=x3pIScVhS2MyM9s-Zx4x1bfHmighk1lxSKX3MVzrwRI,5680
196
+ socialctl/saas/pages.py,sha256=q5P3TFuESZpb1fHh7rSSunC9O0Y3YwbbheAw1f16blI,10052
197
+ socialctl/saas/pairing.py,sha256=eA0mPWq-Xw174XTggYdeE3zcqKy1Xeludmf4pQCAKFI,9321
198
+ socialctl/saas/permissions.py,sha256=T7URr-Mu-zyyKbNyx-PV-BlYCDaGmRFnv5ZoToT-myw,2910
199
+ socialctl/saas/reminders.py,sha256=tiJ82R87Jd8-o1JzDaBjzqIs2AneIFpOui2NNZHC22w,7919
200
+ socialctl/saas/renewal.py,sha256=T6O8UCoI_2NGoapyFT9tbZM4v7XQbZ0eh6RxFrU7N1Y,3823
201
+ socialctl/saas/restore_guard.py,sha256=nf0qhKVklY1OqnFioUzDR4e4iTEe0f5VhIfs8Us_RJc,14395
202
+ socialctl/saas/revocation.py,sha256=JbNNFgDbXEiF4Xq_VFrwpeLsAe1MrD-4pOOgR1m8_wk,5498
203
+ socialctl/saas/rotation.py,sha256=CWsVXYo8u70HgipqwD8WBlqHGPyhH123fqTsacF5Pbo,7631
204
+ socialctl/saas/routes.py,sha256=dJN2rjNUdYnNvUOtzrs5aeZ1nSo1XaXSagho4Eh1pXo,12477
205
+ socialctl/saas/settings.py,sha256=xfjgjn2ugFTh_5Gu8u8j7uuOTpb8LdUJmQ9OO6Gs13c,1558
206
+ socialctl/saas/store.py,sha256=JzLc3cSvkMsh6j8bdGBLf_MLWjGAg0-0wNyOC009xn4,9126
207
+ socialctl/saas/temporary_media.py,sha256=V7XFLSlceNiUkKkaWglvfG91p30D15eplEDmaAguXVE,12851
208
+ socialctl/saas/webhooks.py,sha256=P7TK4jmz67fFZhNHEyVozZqgkEk2gQi8i0VyuwJXVnc,4442
209
+ socialctl/ui/__init__.py,sha256=LjSx2Msio0qF4fna7yYdXqlVJly4PzFoolJcPoxxhyk,89
210
+ socialctl/ui/assets/agent-manual.md,sha256=mG_NhiuWrmZS0DxIPAPdvwdW2lRzbF7bKP--2N54Qbs,53108
211
+ socialctl/ui/assets/agents.md,sha256=8hVflKSVHufG7krFaapHge8QTXDQa_UighsA3JWnhrU,1955
212
+ socialctl/ui/assets/components.css,sha256=pI9mI4hlm-e-dclRoZac8JVlEam1iIJ6AhO0KSIw_ZM,1854
213
+ socialctl/ui/assets/connection-layout.css,sha256=SxkRkagEy7Bo2uj-eAri946iapIQqbD5hqvq-I2BDZc,6480
214
+ socialctl/ui/assets/otp.template.html,sha256=g0JXM6gtfciL9BmwDORVHjLYq65OMjXyCPQGq2L9cFY,1248
215
+ socialctl/ui/assets/tokens.css,sha256=Pzna4WThULiIsbeFL2ISpRZKavzwesj9FwoXGk20Bf4,315
216
+ socialctl/ui/assets/trial.template.html,sha256=f8fYQLkw-4YukGTwIgeKbETknhj2KyUb9pfPKU1YyOQ,1572
217
+ socialctl/ui/assets/web-layout.css,sha256=oe5ZarZ_ql989sF29-5Bn4189IvHI5Oxwt89KjkPO04,6007
218
+ socialctl/ui/email/otp.html,sha256=tEzv7traUe2qcMH98HNJyCtF8lLIUyqGQ1ybDqLL2s0,1194
219
+ socialctl/ui/email/trial.html,sha256=auzr8MAOwsM5-wmSzL3TV1o4WXZhbTy63j73A3yKd10,1508
220
+ socialcli-0.3.0.dist-info/METADATA,sha256=OKKYGPm5FoYYRUfzTpoAmqpjHOUh2S5gWsBVAwfVsV0,9572
221
+ socialcli-0.3.0.dist-info/WHEEL,sha256=W3fkpkm7-wf9vBI5Z-7s0eWkeM-spu78I8Neb98DeEg,87
222
+ socialcli-0.3.0.dist-info/entry_points.txt,sha256=fch-ed2Pcudr_MshRQ3CAo40v7F-xbu18UQxmdhjugU,78
223
+ socialcli-0.3.0.dist-info/licenses/LICENSE,sha256=USd1tS37hSkMGbxwJJZvncsZ-NZBbe1rUbtwSZvLnVg,1074
224
+ socialcli-0.3.0.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.32.4
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,3 @@
1
+ [console_scripts]
2
+ socialcli = socialctl.cli:app
3
+ socialctl = socialctl.cli:app
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Engels Florentino
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
socialctl/__init__.py ADDED
File without changes
socialctl/__main__.py ADDED
@@ -0,0 +1,6 @@
1
+ """Run the installed socialcli interface through its Python package."""
2
+
3
+ from socialctl.cli import app
4
+
5
+ if __name__ == "__main__":
6
+ app()
@@ -0,0 +1,6 @@
1
+ 'Importing this package registers all four adapters in ADAPTADORES.'
2
+
3
+ from __future__ import annotations
4
+
5
+ from socialctl.adapters import facebook, instagram, tiktok, youtube # noqa: F401
6
+ from socialctl.adapters.base import ADAPTADORES, Adapter # noqa: F401
@@ -0,0 +1,68 @@
1
+ 'Common interface for platform adapters.'
2
+
3
+ from __future__ import annotations
4
+
5
+ from abc import ABC, abstractmethod
6
+
7
+ import httpx
8
+
9
+ from socialctl.brands import Brand
10
+ from socialctl.formatter import validar_privacidad, validar_texto
11
+ from socialctl.media import validar_media
12
+ from socialctl.models import Platform, PlatformPost, PostResult, ValidationError
13
+
14
+ _SIN_VALOR = object()
15
+
16
+
17
+ def _sigue_siendo_abstracta(cls: type) -> bool:
18
+ 'Return whether cls still has an unimplemented abstract method.'
19
+ for nombre in dir(cls):
20
+ try:
21
+ miembro = getattr(cls, nombre)
22
+ except AttributeError:
23
+ continue
24
+ if getattr(miembro, "__isabstractmethod__", False):
25
+ return True
26
+ return False
27
+
28
+
29
+ class Adapter(ABC):
30
+ 'Common validation and publication interface for every supported platform.'
31
+
32
+ platform: Platform
33
+
34
+ def __init_subclass__(cls, **kwargs: object) -> None:
35
+ 'Require every concrete adapter to declare a valid Platform value.'
36
+ super().__init_subclass__(**kwargs)
37
+
38
+ if _sigue_siendo_abstracta(cls):
39
+ return
40
+
41
+ valor = getattr(cls, "platform", _SIN_VALOR)
42
+
43
+ if valor is _SIN_VALOR:
44
+ raise TypeError(
45
+ f"{cls.__name__} does not declare 'platform': every concrete "
46
+ 'Adapter must assign a Platform value. The type annotation '
47
+ 'inherited from Adapter is insufficient; assign a value '
48
+ "(for example, 'platform = Platform.TIKTOK')."
49
+ )
50
+
51
+ if not isinstance(valor, Platform):
52
+ raise TypeError(
53
+ f"{cls.__name__} declares 'platform = {valor!r}', which is not a "
54
+ 'Platform member. Use a Platform value '
55
+ '(for example, Platform.TIKTOK).'
56
+ )
57
+
58
+ def validate(self, post: PlatformPost, brand: Brand) -> list[ValidationError]:
59
+ 'Validate platform content limits without network access.'
60
+ return validar_texto(post) + validar_media(post) + validar_privacidad(post)
61
+
62
+ @abstractmethod
63
+ def publish(self, post: PlatformPost, brand: Brand, client: httpx.Client) -> PostResult:
64
+ 'Publish the post only after validate() returns no errors.'
65
+
66
+
67
+ ADAPTADORES: dict[Platform, type[Adapter]] = {}
68
+ 'Registry of adapter classes keyed by Platform. Consumers instantiate ADAPTADORES[platform]() without arguments; concrete adapters must not require constructor parameters.'
@@ -0,0 +1,56 @@
1
+ 'Extract actionable provider error text while redacting known credentials.\n\nPrefer the provider error.message field when it is a nonempty string. Otherwise\nretain a bounded response-body excerpt. Redact literal and URL-encoded known\nsecrets of at least eight characters, including proxy responses that reflect\nrequest URLs or bodies. This keeps diagnostics useful without disclosing tokens.'
2
+
3
+ from __future__ import annotations
4
+
5
+ import urllib.parse
6
+
7
+ import httpx
8
+
9
+ # Recorte razonable para no volcar cuerpos de respuesta gigantes (p. ej. una
10
+ # página de error HTML de un proxy intermedio) en un mensaje de error.
11
+ _LONGITUD_MAXIMA_CUERPO_ERROR = 500
12
+
13
+ _MARCA_REDACCION = '[TOKEN REDACTED]'
14
+
15
+ # Ver docstring del módulo: evita que un "secreto" de relleno (típicamente
16
+ # muy corto en los tests que no versan sobre seguridad, p. ej. la cadena
17
+ # "t") acabe redactando subcadenas normales de un mensaje legítimo. Ningún
18
+ # token real de las cuatro redes que publica este proyecto es tan corto.
19
+ _LONGITUD_MINIMA_SECRETO_REDACTABLE = 8
20
+
21
+
22
+ def _redactar_secretos(texto: str, secretos: tuple[str, ...]) -> str:
23
+ 'Redact literal and URL-encoded occurrences of each sufficiently long secret.'
24
+ for secreto in secretos:
25
+ if not secreto or len(secreto) < _LONGITUD_MINIMA_SECRETO_REDACTABLE:
26
+ continue
27
+ texto = texto.replace(secreto, _MARCA_REDACCION)
28
+ codificado = urllib.parse.quote(secreto, safe="")
29
+ if codificado != secreto:
30
+ texto = texto.replace(codificado, _MARCA_REDACCION)
31
+ return texto
32
+
33
+
34
+ def mensaje_de_error(respuesta: httpx.Response, *secretos: str) -> str:
35
+ 'Return bounded provider error text with known credentials redacted.'
36
+ try:
37
+ mensaje = respuesta.json()["error"]["message"]
38
+ if isinstance(mensaje, str) and mensaje:
39
+ return _redactar_secretos(mensaje, secretos)
40
+ except Exception:
41
+ pass
42
+
43
+ try:
44
+ cuerpo = respuesta.text.strip()
45
+ except Exception:
46
+ cuerpo = ""
47
+
48
+ cuerpo = _redactar_secretos(cuerpo, secretos)
49
+
50
+ if not cuerpo:
51
+ return f"HTTP {respuesta.status_code}"
52
+
53
+ if len(cuerpo) > _LONGITUD_MAXIMA_CUERPO_ERROR:
54
+ cuerpo = cuerpo[:_LONGITUD_MAXIMA_CUERPO_ERROR] + "…"
55
+
56
+ return f"HTTP {respuesta.status_code}: {cuerpo}"