core-framework 4.1.0__tar.gz → 4.2.1__tar.gz

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 (1005) hide show
  1. {core_framework-4.1.0 → core_framework-4.2.1}/.github/workflows/_deploy.yml +13 -0
  2. {core_framework-4.1.0 → core_framework-4.2.1}/.github/workflows/dev-ci-cd.yaml +3 -0
  3. {core_framework-4.1.0 → core_framework-4.2.1}/.github/workflows/manual-deployment.yaml +3 -0
  4. {core_framework-4.1.0 → core_framework-4.2.1}/CHANGELOG.md +20 -1
  5. {core_framework-4.1.0 → core_framework-4.2.1}/PKG-INFO +3 -3
  6. core_framework-4.2.1/alembic/entitlement/alembic/env.py +77 -0
  7. core_framework-4.2.1/alembic/entitlement/alembic/versions/b7ed2400e94e_entitlement_schema.py +58 -0
  8. core_framework-4.2.1/alembic/post/alembic/versions/b3c61daef9b5_post_add_post_bookmarks.py +37 -0
  9. core_framework-4.2.1/alembic/rating/alembic.ini +52 -0
  10. core_framework-4.2.1/alembic/user/alembic/README +1 -0
  11. core_framework-4.2.1/alembic/user/alembic/script.py.mako +28 -0
  12. core_framework-4.2.1/alembic/user/alembic/versions/089f4398f943_user_add_preference_switches.py +40 -0
  13. {core_framework-4.1.0 → core_framework-4.2.1}/config.toml +14 -0
  14. {core_framework-4.1.0 → core_framework-4.2.1}/config.toml.template +10 -0
  15. core_framework-4.2.1/core_framework/api/admin/entitlements/router.py +41 -0
  16. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/admin/router.py +2 -0
  17. core_framework-4.2.1/core_framework/api/entitlements/dependencies.py +23 -0
  18. core_framework-4.2.1/core_framework/api/entitlements/router.py +33 -0
  19. core_framework-4.2.1/core_framework/api/entitlements/schemas.py +13 -0
  20. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/posts/authenticated/router.py +23 -0
  21. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/posts/authenticated/schemas.py +6 -0
  22. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/posts/public/schemas.py +1 -0
  23. core_framework-4.2.1/core_framework/api/users/authenticated/mappers.py +42 -0
  24. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/users/authenticated/router.py +34 -2
  25. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/users/authenticated/schemas.py +26 -2
  26. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/bootstrap.py +9 -0
  27. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/email/enqueue.py +4 -2
  28. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/email/registry.py +38 -0
  29. core_framework-4.2.1/core_framework/application/entitlement/grant_service.py +96 -0
  30. core_framework-4.2.1/core_framework/application/entitlement/registry.py +129 -0
  31. core_framework-4.2.1/core_framework/application/entitlement/signature.py +28 -0
  32. core_framework-4.2.1/core_framework/application/entitlement/webhook_service.py +285 -0
  33. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/notifications/friendship_notification_service.py +6 -1
  34. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/notifications/group_invite_notification_service.py +6 -1
  35. core_framework-4.2.1/core_framework/application/notifications/inbox_type_switch.py +54 -0
  36. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/notifications/notification_service.py +33 -6
  37. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/posts/authenticated_service.py +34 -0
  38. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/posts/public_service.py +14 -5
  39. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/shared/exceptions.py +8 -0
  40. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/users/account_removal/contributors.py +7 -0
  41. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/users/account_removal/registry.py +5 -0
  42. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/users/account_removal/runner.py +4 -3
  43. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/users/user_deletion_service.py +8 -2
  44. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/bundled_alembic.py +1 -0
  45. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/core/exception_handlers/application.py +12 -0
  46. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/core/rate_limit.py +6 -0
  47. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/core/settings.py +77 -8
  48. core_framework-4.2.1/core_framework/domains/agent/README.md +105 -0
  49. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/agent/__init__.py +2 -0
  50. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/agent/dependencies.py +43 -26
  51. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/agent/models.py +17 -1
  52. core_framework-4.2.1/core_framework/domains/entitlement/README.md +22 -0
  53. core_framework-4.2.1/core_framework/domains/entitlement/__init__.py +25 -0
  54. core_framework-4.2.1/core_framework/domains/entitlement/dependencies.py +88 -0
  55. core_framework-4.2.1/core_framework/domains/entitlement/exceptions.py +11 -0
  56. core_framework-4.2.1/core_framework/domains/entitlement/models.py +47 -0
  57. core_framework-4.2.1/core_framework/domains/entitlement/ports/revenuecat.py +48 -0
  58. core_framework-4.2.1/core_framework/domains/entitlement/repository.py +289 -0
  59. core_framework-4.2.1/core_framework/domains/entitlement/service.py +186 -0
  60. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/moderation/enums.py +2 -0
  61. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/post/README.md +10 -4
  62. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/post/__init__.py +4 -1
  63. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/post/models.py +7 -0
  64. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/post/outcomes.py +6 -0
  65. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/post/repository.py +179 -2
  66. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/post/service.py +54 -2
  67. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/user/models.py +24 -0
  68. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/user/repository.py +57 -1
  69. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/user/service.py +14 -0
  70. core_framework-4.2.1/core_framework/infrastructure/agent/anthropic_agent_adapter.py +148 -0
  71. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/infrastructure/agent/openai_agent_adapter.py +1 -1
  72. core_framework-4.2.1/core_framework/infrastructure/revenuecat/revenuecat_entitlement_adapter.py +212 -0
  73. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/main.py +10 -0
  74. {core_framework-4.1.0 → core_framework-4.2.1}/docs/deployments/deploy-playbook.md +10 -4
  75. {core_framework-4.1.0 → core_framework-4.2.1}/docs/deployments/edge-rate-limits.md +3 -1
  76. {core_framework-4.1.0 → core_framework-4.2.1}/docs/deployments/host-config-defaults-design.md +22 -12
  77. {core_framework-4.1.0 → core_framework-4.2.1}/docs/design/README.md +34 -29
  78. {core_framework-4.1.0 → core_framework-4.2.1}/docs/design/account-removal-spine-design.md +40 -38
  79. core_framework-4.2.1/docs/design/bookmark-implementation.md +200 -0
  80. core_framework-4.2.1/docs/design/entitlement-design.md +225 -0
  81. core_framework-4.2.1/docs/design/entitlement-implementation.md +312 -0
  82. {core_framework-4.1.0 → core_framework-4.2.1}/docs/design/model-call-design.md +51 -45
  83. {core_framework-4.1.0 → core_framework-4.2.1}/docs/design/model-call-implementation.md +86 -55
  84. core_framework-4.2.1/docs/design/preference-enhancement-design.md +204 -0
  85. core_framework-4.2.1/docs/design/preference-enhancement-implementation.md +199 -0
  86. {core_framework-4.1.0 → core_framework-4.2.1}/docs/design/transactional-email-design.md +7 -5
  87. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/README.md +18 -17
  88. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/deletion/posts.md +5 -3
  89. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/deletion/users.md +21 -19
  90. core_framework-4.2.1/docs/domains/entitlement/entitlements.md +191 -0
  91. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/moderation/moderator_actions.md +2 -1
  92. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/notifications/inbox-redesign-design.md +3 -2
  93. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/notifications/notification_inbox.md +1 -1
  94. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/posts/README.md +7 -0
  95. core_framework-4.2.1/docs/domains/posts/bookmark-design.md +97 -0
  96. core_framework-4.2.1/docs/domains/posts/bookmark.md +165 -0
  97. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/posts/hashtag_discovery.md +1 -1
  98. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/posts/retrieve_posts.md +2 -2
  99. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/ratings/rating-design.md +4 -2
  100. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/users/preferences.md +1 -1
  101. {core_framework-4.1.0 → core_framework-4.2.1}/docs/library/api.md +12 -0
  102. {core_framework-4.1.0 → core_framework-4.2.1}/docs/library/capability-wiring.md +41 -33
  103. {core_framework-4.1.0 → core_framework-4.2.1}/docs/library/overview.md +3 -2
  104. {core_framework-4.1.0 → core_framework-4.2.1}/docs/library/package-api.md +34 -18
  105. {core_framework-4.1.0 → core_framework-4.2.1}/docs/platform/architecture-decisions.md +43 -7
  106. {core_framework-4.1.0 → core_framework-4.2.1}/docs/platform/client-error-visibility.md +16 -14
  107. {core_framework-4.1.0 → core_framework-4.2.1}/docs/platform/glossary.md +21 -1
  108. {core_framework-4.1.0 → core_framework-4.2.1}/docs/todo.md +5 -1
  109. {core_framework-4.1.0 → core_framework-4.2.1}/pyproject.toml +3 -3
  110. {core_framework-4.1.0 → core_framework-4.2.1}/tach.toml +8 -0
  111. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/posts/authenticated/post_writes_integration_test.py +2 -0
  112. core_framework-4.2.1/tests/integration/api/posts/bookmark_integration_test.py +327 -0
  113. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/rate_limit_test.py +27 -0
  114. {core_framework-4.1.0 → core_framework-4.2.1}/tests/unit/docs/api_routes_test.py +22 -8
  115. {core_framework-4.1.0 → core_framework-4.2.1}/uv.lock +4 -4
  116. core_framework-4.1.0/core_framework/api/users/authenticated/mappers.py +0 -19
  117. core_framework-4.1.0/core_framework/domains/agent/README.md +0 -90
  118. {core_framework-4.1.0 → core_framework-4.2.1}/.agents/skills/building-pydantic-ai-agents +0 -0
  119. {core_framework-4.1.0 → core_framework-4.2.1}/.agents/skills/fastapi +0 -0
  120. {core_framework-4.1.0 → core_framework-4.2.1}/.agents/skills/library-skills/.library-skills.json +0 -0
  121. {core_framework-4.1.0 → core_framework-4.2.1}/.agents/skills/library-skills/SKILL.md +0 -0
  122. {core_framework-4.1.0 → core_framework-4.2.1}/.cursor/rules/alembic-migrations.mdc +0 -0
  123. {core_framework-4.1.0 → core_framework-4.2.1}/.cursor/rules/api-layer.mdc +0 -0
  124. {core_framework-4.1.0 → core_framework-4.2.1}/.cursor/rules/api-reference-docs.mdc +0 -0
  125. {core_framework-4.1.0 → core_framework-4.2.1}/.cursor/rules/api-validation.mdc +0 -0
  126. {core_framework-4.1.0 → core_framework-4.2.1}/.cursor/rules/application-layer.mdc +0 -0
  127. {core_framework-4.1.0 → core_framework-4.2.1}/.cursor/rules/constants-final.mdc +0 -0
  128. {core_framework-4.1.0 → core_framework-4.2.1}/.cursor/rules/constitution.mdc +0 -0
  129. {core_framework-4.1.0 → core_framework-4.2.1}/.cursor/rules/database-triggers.mdc +0 -0
  130. {core_framework-4.1.0 → core_framework-4.2.1}/.cursor/rules/docstrings.mdc +0 -0
  131. {core_framework-4.1.0 → core_framework-4.2.1}/.cursor/rules/domain-caller-context.mdc +0 -0
  132. {core_framework-4.1.0 → core_framework-4.2.1}/.cursor/rules/domain-imports.mdc +0 -0
  133. {core_framework-4.1.0 → core_framework-4.2.1}/.cursor/rules/domain-input-guards.mdc +0 -0
  134. {core_framework-4.1.0 → core_framework-4.2.1}/.cursor/rules/domain-repository-exceptions.mdc +0 -0
  135. {core_framework-4.1.0 → core_framework-4.2.1}/.cursor/rules/domain-services-and-adapters.mdc +0 -0
  136. {core_framework-4.1.0 → core_framework-4.2.1}/.cursor/rules/error-boundary.mdc +0 -0
  137. {core_framework-4.1.0 → core_framework-4.2.1}/.cursor/rules/flow-documentation.mdc +0 -0
  138. {core_framework-4.1.0 → core_framework-4.2.1}/.cursor/rules/ignore-analytics-warehouse.mdc +0 -0
  139. {core_framework-4.1.0 → core_framework-4.2.1}/.cursor/rules/inline-raise-messages.mdc +0 -0
  140. {core_framework-4.1.0 → core_framework-4.2.1}/.cursor/rules/integration-test-strategy.mdc +0 -0
  141. {core_framework-4.1.0 → core_framework-4.2.1}/.cursor/rules/layer-boundaries.mdc +0 -0
  142. {core_framework-4.1.0 → core_framework-4.2.1}/.cursor/rules/no-code-in-docs.mdc +0 -0
  143. {core_framework-4.1.0 → core_framework-4.2.1}/.cursor/rules/postgres-config-conventions.mdc +0 -0
  144. {core_framework-4.1.0 → core_framework-4.2.1}/.cursor/rules/repository-schema-isolation.mdc +0 -0
  145. {core_framework-4.1.0 → core_framework-4.2.1}/.cursor/rules/strong-reads.mdc +0 -0
  146. {core_framework-4.1.0 → core_framework-4.2.1}/.cursor/rules/structured-logging.mdc +0 -0
  147. {core_framework-4.1.0 → core_framework-4.2.1}/.cursor/skills/add-config/SKILL.md +0 -0
  148. {core_framework-4.1.0 → core_framework-4.2.1}/.cursor/skills/add-domain/SKILL.md +0 -0
  149. {core_framework-4.1.0 → core_framework-4.2.1}/.cursor/skills/building-pydantic-ai-agents +0 -0
  150. {core_framework-4.1.0 → core_framework-4.2.1}/.cursor/skills/code-review/SKILL.md +0 -0
  151. {core_framework-4.1.0 → core_framework-4.2.1}/.cursor/skills/design-review/SKILL.md +0 -0
  152. {core_framework-4.1.0 → core_framework-4.2.1}/.cursor/skills/fastapi +0 -0
  153. {core_framework-4.1.0 → core_framework-4.2.1}/.cursor/skills/grill/SKILL.md +0 -0
  154. {core_framework-4.1.0 → core_framework-4.2.1}/.cursor/skills/implement-feature/SKILL.md +0 -0
  155. {core_framework-4.1.0 → core_framework-4.2.1}/.cursor/skills/recommend-features/SKILL.md +0 -0
  156. {core_framework-4.1.0 → core_framework-4.2.1}/.cursor/skills/sync-host-rules/SKILL.md +0 -0
  157. {core_framework-4.1.0 → core_framework-4.2.1}/.cursor/skills/write-flow-doc/SKILL.md +0 -0
  158. {core_framework-4.1.0 → core_framework-4.2.1}/.dockerignore +0 -0
  159. {core_framework-4.1.0 → core_framework-4.2.1}/.github/ci/package-lock.json +0 -0
  160. {core_framework-4.1.0 → core_framework-4.2.1}/.github/ci/package-smoke.sh +0 -0
  161. {core_framework-4.1.0 → core_framework-4.2.1}/.github/ci/package.json +0 -0
  162. {core_framework-4.1.0 → core_framework-4.2.1}/.github/ci/package_smoke.py +0 -0
  163. {core_framework-4.1.0 → core_framework-4.2.1}/.github/workflows/manual-observability-deployment.yaml +0 -0
  164. {core_framework-4.1.0 → core_framework-4.2.1}/.github/workflows/publish-pypi.yml +0 -0
  165. {core_framework-4.1.0 → core_framework-4.2.1}/.github/workflows/test.yaml +0 -0
  166. {core_framework-4.1.0 → core_framework-4.2.1}/.gitignore +0 -0
  167. {core_framework-4.1.0 → core_framework-4.2.1}/.pre-commit-config.yaml +0 -0
  168. {core_framework-4.1.0 → core_framework-4.2.1}/.python-version +0 -0
  169. {core_framework-4.1.0 → core_framework-4.2.1}/LICENSE +0 -0
  170. {core_framework-4.1.0 → core_framework-4.2.1}/README.md +0 -0
  171. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/analytics/alembic/README +0 -0
  172. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/analytics/alembic/env.py +0 -0
  173. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/analytics/alembic/script.py.mako +0 -0
  174. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/analytics/alembic/versions/2d61a5e88d76_analytics_utm_events_add_kind.py +0 -0
  175. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/analytics/alembic/versions/585105e1149e_analytics_add_utm_events.py +0 -0
  176. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/analytics/alembic/versions/5b9ac98bb150_analytics_daily_fact.py +0 -0
  177. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/analytics/alembic/versions/7f2a9c1d4e8b_analytics_daily_fact_day_index.py +0 -0
  178. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/analytics/alembic.ini +0 -0
  179. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/comment/alembic/README +0 -0
  180. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/comment/alembic/env.py +0 -0
  181. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/comment/alembic/script.py.mako +0 -0
  182. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/comment/alembic/versions/comment_add_comment_attachments.py +0 -0
  183. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/comment/alembic/versions/comment_add_comment_create_idempotency.py +0 -0
  184. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/comment/alembic/versions/comment_add_comment_create_idempotency_created_at_index.py +0 -0
  185. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/comment/alembic/versions/comment_add_comment_mentions.py +0 -0
  186. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/comment/alembic/versions/comment_subject_kind_varchar.py +0 -0
  187. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/comment/alembic/versions/comment_tombstone_status_model.py +0 -0
  188. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/comment/alembic/versions/v1_comment_init_baseline.py +0 -0
  189. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/comment/alembic.ini +0 -0
  190. {core_framework-4.1.0/alembic/extension → core_framework-4.2.1/alembic/entitlement}/alembic/README +0 -0
  191. {core_framework-4.1.0/alembic/extension → core_framework-4.2.1/alembic/entitlement}/alembic/script.py.mako +0 -0
  192. {core_framework-4.1.0/alembic/media → core_framework-4.2.1/alembic/entitlement}/alembic.ini +0 -0
  193. {core_framework-4.1.0/alembic/media → core_framework-4.2.1/alembic/extension}/alembic/README +0 -0
  194. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/extension/alembic/env.py +0 -0
  195. {core_framework-4.1.0/alembic/media → core_framework-4.2.1/alembic/extension}/alembic/script.py.mako +0 -0
  196. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/extension/alembic/versions/v1_ext_init_baseline.py +0 -0
  197. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/extension/alembic.ini +0 -0
  198. {core_framework-4.1.0/alembic/moderation → core_framework-4.2.1/alembic/media}/alembic/README +0 -0
  199. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/media/alembic/env.py +0 -0
  200. {core_framework-4.1.0/alembic/moderation → core_framework-4.2.1/alembic/media}/alembic/script.py.mako +0 -0
  201. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/media/alembic/versions/media_add_attachment_staging_registry.py +0 -0
  202. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/media/alembic/versions/media_add_banner_staging_and_lease.py +0 -0
  203. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/media/alembic/versions/media_attachment_staging_registry_published_at.py +0 -0
  204. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/media/alembic/versions/v1_media_init_baseline.py +0 -0
  205. {core_framework-4.1.0/alembic/notification → core_framework-4.2.1/alembic/media}/alembic.ini +0 -0
  206. {core_framework-4.1.0/alembic/notification → core_framework-4.2.1/alembic/moderation}/alembic/README +0 -0
  207. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/moderation/alembic/env.py +0 -0
  208. {core_framework-4.1.0/alembic/notification → core_framework-4.2.1/alembic/moderation}/alembic/script.py.mako +0 -0
  209. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/moderation/alembic/versions/3027828c2c80_align_dead_outbox_keyset_index.py +0 -0
  210. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/moderation/alembic/versions/5be85718122a_moderation_add_review_reports.py +0 -0
  211. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/moderation/alembic/versions/moderation_add_event_outbox.py +0 -0
  212. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/moderation/alembic/versions/moderation_add_event_outbox_dead_indexes.py +0 -0
  213. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/moderation/alembic/versions/moderation_add_event_outbox_pending_created_at_index.py +0 -0
  214. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/moderation/alembic/versions/v1_mod_init_baseline.py +0 -0
  215. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/moderation/alembic.ini +0 -0
  216. {core_framework-4.1.0/alembic/post → core_framework-4.2.1/alembic/notification}/alembic/README +0 -0
  217. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/notification/alembic/env.py +0 -0
  218. {core_framework-4.1.0/alembic/post → core_framework-4.2.1/alembic/notification}/alembic/script.py.mako +0 -0
  219. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/notification/alembic/versions/2fdd68777706_notification_read_at_retention_index.py +0 -0
  220. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/notification/alembic/versions/a5f29155815d_notification_add_friendship_types.py +0 -0
  221. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/notification/alembic/versions/b1263ed1a303_notification_inbox_redesign_preview.py +0 -0
  222. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/notification/alembic/versions/c6b9941065ec_notification_add_group_invite_type.py +0 -0
  223. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/notification/alembic/versions/fbe8476b4437_notification_add_rating_owner_cue_labels.py +0 -0
  224. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/notification/alembic/versions/v1_notif_init_baseline.py +0 -0
  225. {core_framework-4.1.0/alembic/rating → core_framework-4.2.1/alembic/notification}/alembic.ini +0 -0
  226. {core_framework-4.1.0/alembic/rating → core_framework-4.2.1/alembic/post}/alembic/README +0 -0
  227. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/post/alembic/env.py +0 -0
  228. {core_framework-4.1.0/alembic/rating → core_framework-4.2.1/alembic/post}/alembic/script.py.mako +0 -0
  229. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/post/alembic/versions/0a89b4c23746_post_stats_like_created_post_index.py +0 -0
  230. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/post/alembic/versions/954f00734f36_post_add_post_discovery_rank.py +0 -0
  231. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/post/alembic/versions/post_add_post_attachments.py +0 -0
  232. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/post/alembic/versions/post_add_post_create_idempotency.py +0 -0
  233. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/post/alembic/versions/post_add_post_create_idempotency_created_at_index.py +0 -0
  234. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/post/alembic/versions/post_add_post_mentions.py +0 -0
  235. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/post/alembic/versions/post_post_views_retention_high_water_mark.py +0 -0
  236. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/post/alembic/versions/post_tombstone_status_model.py +0 -0
  237. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/post/alembic/versions/v1_post_init_baseline.py +0 -0
  238. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/post/alembic.ini +0 -0
  239. {core_framework-4.1.0/alembic/user → core_framework-4.2.1/alembic/rating}/alembic/README +0 -0
  240. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/rating/alembic/env.py +0 -0
  241. {core_framework-4.1.0/alembic/user → core_framework-4.2.1/alembic/rating}/alembic/script.py.mako +0 -0
  242. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/rating/alembic/versions/04182d734619_rating_list_indexes.py +0 -0
  243. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/rating/alembic/versions/2ef924b0be4c_rating_schema.py +0 -0
  244. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/user/alembic/env.py +0 -0
  245. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/user/alembic/versions/24ba262c4ef2_user_add_account_removal_started_at.py +0 -0
  246. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/user/alembic/versions/2dc1d398a840_user_add_groups.py +0 -0
  247. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/user/alembic/versions/44df70a45ba6_user_add_signup_events.py +0 -0
  248. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/user/alembic/versions/7078e4313554_user_add_friendships.py +0 -0
  249. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/user/alembic/versions/922eece707db_align_dead_outbox_keyset_index.py +0 -0
  250. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/user/alembic/versions/user_add_avatar_ingest_sequences.py +0 -0
  251. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/user/alembic/versions/user_add_banner_ingest_sequences.py +0 -0
  252. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/user/alembic/versions/user_add_date_of_birth_to_profiles.py +0 -0
  253. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/user/alembic/versions/user_add_event_outbox.py +0 -0
  254. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/user/alembic/versions/user_add_event_outbox_dead_indexes.py +0 -0
  255. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/user/alembic/versions/user_add_event_outbox_pending_created_at_index.py +0 -0
  256. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/user/alembic/versions/user_reserve_sentinel_user_ids.py +0 -0
  257. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/user/alembic/versions/v1_user_init_baseline.py +0 -0
  258. {core_framework-4.1.0 → core_framework-4.2.1}/alembic/user/alembic.ini +0 -0
  259. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/__init__.py +0 -0
  260. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/__init__.py +0 -0
  261. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/admin/__init__.py +0 -0
  262. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/admin/agent/router.py +0 -0
  263. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/admin/agent/schemas.py +0 -0
  264. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/admin/analytics/__init__.py +0 -0
  265. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/admin/analytics/router.py +0 -0
  266. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/admin/analytics/schemas.py +0 -0
  267. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/admin/cache/__init__.py +0 -0
  268. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/admin/cache/router.py +0 -0
  269. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/admin/cache/schemas.py +0 -0
  270. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/admin/comments/__init__.py +0 -0
  271. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/admin/comments/router.py +0 -0
  272. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/admin/comments/schemas.py +0 -0
  273. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/admin/moderation/__init__.py +0 -0
  274. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/admin/moderation/router.py +0 -0
  275. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/admin/moderation/schemas.py +0 -0
  276. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/admin/outbox/__init__.py +0 -0
  277. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/admin/outbox/router.py +0 -0
  278. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/admin/outbox/schemas.py +0 -0
  279. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/admin/posts/__init__.py +0 -0
  280. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/admin/posts/router.py +0 -0
  281. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/admin/posts/schemas.py +0 -0
  282. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/admin/ratings/router.py +0 -0
  283. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/admin/ratings/schemas.py +0 -0
  284. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/admin/users/__init__.py +0 -0
  285. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/admin/users/router.py +0 -0
  286. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/admin/users/schemas.py +0 -0
  287. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/attachments/__init__.py +0 -0
  288. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/attachments/router.py +0 -0
  289. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/attachments/schemas.py +0 -0
  290. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/auth/__init__.py +0 -0
  291. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/auth/router.py +0 -0
  292. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/auth/schemas.py +0 -0
  293. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/comments/__init__.py +0 -0
  294. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/comments/authenticated/__init__.py +0 -0
  295. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/comments/authenticated/mappers.py +0 -0
  296. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/comments/authenticated/router.py +0 -0
  297. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/comments/authenticated/schemas.py +0 -0
  298. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/comments/public/__init__.py +0 -0
  299. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/comments/public/router.py +0 -0
  300. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/comments/public/schemas.py +0 -0
  301. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/comments/router.py +0 -0
  302. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/comments/schemas.py +0 -0
  303. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/dependencies.py +0 -0
  304. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/events/__init__.py +0 -0
  305. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/events/router.py +0 -0
  306. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/events/schemas.py +0 -0
  307. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/groups/router.py +0 -0
  308. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/groups/schemas.py +0 -0
  309. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/idempotency/__init__.py +0 -0
  310. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/idempotency/dependencies.py +0 -0
  311. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/ingest_guards.py +0 -0
  312. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/notifications/__init__.py +0 -0
  313. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/notifications/authenticated/__init__.py +0 -0
  314. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/notifications/authenticated/router.py +0 -0
  315. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/notifications/authenticated/schemas.py +0 -0
  316. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/notifications/router.py +0 -0
  317. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/pagination.py +0 -0
  318. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/posts/__init__.py +0 -0
  319. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/posts/authenticated/__init__.py +0 -0
  320. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/posts/authenticated/mappers.py +0 -0
  321. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/posts/public/__init__.py +0 -0
  322. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/posts/public/router.py +0 -0
  323. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/posts/router.py +0 -0
  324. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/posts/schemas.py +0 -0
  325. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/ratings/authenticated/router.py +0 -0
  326. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/ratings/pagination.py +0 -0
  327. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/ratings/public/router.py +0 -0
  328. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/ratings/router.py +0 -0
  329. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/ratings/schemas.py +0 -0
  330. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/router.py +0 -0
  331. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/schemas.py +0 -0
  332. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/system/__init__.py +0 -0
  333. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/system/router.py +0 -0
  334. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/upload.py +0 -0
  335. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/users/__init__.py +0 -0
  336. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/users/authenticated/__init__.py +0 -0
  337. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/users/public/__init__.py +0 -0
  338. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/users/public/router.py +0 -0
  339. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/users/public/schemas.py +0 -0
  340. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/users/router.py +0 -0
  341. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/users/shared/__init__.py +0 -0
  342. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/users/shared/mappers.py +0 -0
  343. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/api/users/shared/schemas.py +0 -0
  344. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/__init__.py +0 -0
  345. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/agent/probe.py +0 -0
  346. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/analytics/__init__.py +0 -0
  347. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/analytics/bucket_service.py +0 -0
  348. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/analytics/prune_service.py +0 -0
  349. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/analytics/read_service.py +0 -0
  350. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/analytics/refresh_service.py +0 -0
  351. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/analytics/registry.py +0 -0
  352. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/analytics/sources/__init__.py +0 -0
  353. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/analytics/sources/comment_created.py +0 -0
  354. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/analytics/sources/post_created.py +0 -0
  355. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/analytics/sources/post_viewed.py +0 -0
  356. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/analytics/sources/user_registered.py +0 -0
  357. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/auth/__init__.py +0 -0
  358. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/auth/access_service.py +0 -0
  359. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/auth/auth_service.py +0 -0
  360. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/auth/models.py +0 -0
  361. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/auth/token_verification.py +0 -0
  362. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/cache/__init__.py +0 -0
  363. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/cache/invalidate_service.py +0 -0
  364. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/cache/models.py +0 -0
  365. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/comments/__init__.py +0 -0
  366. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/comments/admin_service.py +0 -0
  367. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/comments/aggregation_service.py +0 -0
  368. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/comments/authenticated_service.py +0 -0
  369. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/comments/cleanup_service.py +0 -0
  370. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/comments/host_service.py +0 -0
  371. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/comments/kind_registry.py +0 -0
  372. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/comments/post_subject.py +0 -0
  373. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/comments/public_service.py +0 -0
  374. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/comments/rating_subject.py +0 -0
  375. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/email/__init__.py +0 -0
  376. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/email/account_deletion_scheduled.py +0 -0
  377. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/email/send.py +0 -0
  378. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/events/README.md +0 -0
  379. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/events/__init__.py +0 -0
  380. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/events/event_service.py +0 -0
  381. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/events/event_token.py +0 -0
  382. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/events/models.py +0 -0
  383. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/events/utm_capture_kinds.py +0 -0
  384. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/groups/authenticated_service.py +0 -0
  385. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/groups/cleanup_service.py +0 -0
  386. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/groups/group_invite_link_token.py +0 -0
  387. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/groups/strip_service.py +0 -0
  388. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/media/README.md +0 -0
  389. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/media/__init__.py +0 -0
  390. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/media/attachment_read.py +0 -0
  391. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/media/attachment_service.py +0 -0
  392. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/media/avatar_service.py +0 -0
  393. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/media/banner_service.py +0 -0
  394. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/media/read_url_config.py +0 -0
  395. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/moderation/__init__.py +0 -0
  396. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/moderation/appeal_service.py +0 -0
  397. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/moderation/moderator_service.py +0 -0
  398. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/moderation/report_service.py +0 -0
  399. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/moderation/restriction_fanout/__init__.py +0 -0
  400. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/moderation/restriction_fanout/heals.py +0 -0
  401. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/moderation/restriction_fanout/mirrors.py +0 -0
  402. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/moderation/restriction_fanout/reactions.py +0 -0
  403. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/moderation/restriction_fanout/registry.py +0 -0
  404. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/moderation/restriction_fanout/runner.py +0 -0
  405. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/moderation/scheduled_service.py +0 -0
  406. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/moderation/user_service.py +0 -0
  407. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/notifications/README.md +0 -0
  408. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/notifications/__init__.py +0 -0
  409. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/notifications/enums.py +0 -0
  410. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/notifications/inbox_service.py +0 -0
  411. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/notifications/mute_service.py +0 -0
  412. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/notifications/preview.py +0 -0
  413. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/notifications/prune_service.py +0 -0
  414. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/notifications/wipe_service.py +0 -0
  415. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/outbox/__init__.py +0 -0
  416. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/outbox/block_mirrors.py +0 -0
  417. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/outbox/events.py +0 -0
  418. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/outbox/exceptions.py +0 -0
  419. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/outbox/follow_mirrors.py +0 -0
  420. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/outbox/handlers.py +0 -0
  421. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/outbox/ops_service.py +0 -0
  422. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/outbox/polling_service.py +0 -0
  423. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/outbox/processing_service.py +0 -0
  424. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/outbox/restriction_mirrors.py +0 -0
  425. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/posts/__init__.py +0 -0
  426. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/posts/admin_service.py +0 -0
  427. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/posts/aggregation_service.py +0 -0
  428. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/posts/cleanup_service.py +0 -0
  429. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/ratings/__init__.py +0 -0
  430. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/ratings/admin_service.py +0 -0
  431. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/ratings/aggregation_service.py +0 -0
  432. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/ratings/authenticated_service.py +0 -0
  433. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/ratings/kind_registry.py +0 -0
  434. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/ratings/public_service.py +0 -0
  435. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/ratings/purge_service.py +0 -0
  436. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/ratings/serialization.py +0 -0
  437. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/ratings/subject_existence.py +0 -0
  438. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/shared/__init__.py +0 -0
  439. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/shared/deletion_cleanup_ledger.py +0 -0
  440. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/shared/enums.py +0 -0
  441. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/shared/request_context.py +0 -0
  442. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/shared/worker_jobs.py +0 -0
  443. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/users/__init__.py +0 -0
  444. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/users/account_removal/__init__.py +0 -0
  445. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/users/admin_service.py +0 -0
  446. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/users/aggregation_service.py +0 -0
  447. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/users/authenticated_service.py +0 -0
  448. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/users/deletion_audit.py +0 -0
  449. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/users/enums.py +0 -0
  450. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/users/identity_enrichment.py +0 -0
  451. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/users/public_service.py +0 -0
  452. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/application/users/scheduled_service.py +0 -0
  453. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/asgi.py +0 -0
  454. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/constants.py +0 -0
  455. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/core/__init__.py +0 -0
  456. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/core/cache.py +0 -0
  457. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/core/context.py +0 -0
  458. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/core/database.py +0 -0
  459. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/core/exception_handlers/__init__.py +0 -0
  460. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/core/exception_handlers/common.py +0 -0
  461. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/core/exception_handlers/setup.py +0 -0
  462. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/core/exceptions.py +0 -0
  463. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/core/firebase.py +0 -0
  464. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/core/http_client.py +0 -0
  465. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/core/http_probes.py +0 -0
  466. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/core/logging.py +0 -0
  467. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/core/middleware.py +0 -0
  468. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/core/observability.py +0 -0
  469. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/core/pagination.py +0 -0
  470. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/core/process.py +0 -0
  471. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/core/redis.py +0 -0
  472. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/core/runtime.py +0 -0
  473. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/__init__.py +0 -0
  474. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/analytics/README.md +0 -0
  475. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/analytics/__init__.py +0 -0
  476. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/analytics/constants.py +0 -0
  477. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/analytics/dependencies.py +0 -0
  478. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/analytics/exceptions.py +0 -0
  479. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/analytics/models.py +0 -0
  480. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/analytics/ports/__init__.py +0 -0
  481. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/analytics/ports/activity_source.py +0 -0
  482. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/analytics/repository.py +0 -0
  483. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/analytics/service.py +0 -0
  484. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/auth/README.md +0 -0
  485. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/auth/__init__.py +0 -0
  486. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/auth/dependencies.py +0 -0
  487. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/auth/exceptions.py +0 -0
  488. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/auth/models.py +0 -0
  489. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/auth/outcomes.py +0 -0
  490. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/auth/ports/__init__.py +0 -0
  491. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/auth/ports/auth.py +0 -0
  492. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/auth/service.py +0 -0
  493. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/comment/README.md +0 -0
  494. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/comment/__init__.py +0 -0
  495. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/comment/constants.py +0 -0
  496. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/comment/dependencies.py +0 -0
  497. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/comment/enums.py +0 -0
  498. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/comment/exceptions.py +0 -0
  499. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/comment/models.py +0 -0
  500. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/comment/outcomes.py +0 -0
  501. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/comment/ports/subject.py +0 -0
  502. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/comment/repository.py +0 -0
  503. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/comment/service.py +0 -0
  504. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/email/README.md +0 -0
  505. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/email/__init__.py +0 -0
  506. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/email/dependencies.py +0 -0
  507. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/email/exceptions.py +0 -0
  508. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/email/models.py +0 -0
  509. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/email/ports/send.py +0 -0
  510. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/email/service.py +0 -0
  511. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/exceptions.py +0 -0
  512. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/media/README.md +0 -0
  513. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/media/__init__.py +0 -0
  514. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/media/attachment/__init__.py +0 -0
  515. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/media/attachment/components/__init__.py +0 -0
  516. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/media/attachment/components/finals_publisher.py +0 -0
  517. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/media/attachment/components/staging.py +0 -0
  518. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/media/attachment/components/variant_encoder.py +0 -0
  519. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/media/attachment/constants.py +0 -0
  520. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/media/attachment/exceptions.py +0 -0
  521. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/media/attachment/models.py +0 -0
  522. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/media/attachment/ports/__init__.py +0 -0
  523. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/media/attachment/ports/finals_publisher.py +0 -0
  524. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/media/attachment/ports/staging.py +0 -0
  525. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/media/attachment/ports/variant_encoder.py +0 -0
  526. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/media/attachment/service.py +0 -0
  527. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/media/avatar/__init__.py +0 -0
  528. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/media/avatar/components/__init__.py +0 -0
  529. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/media/avatar/components/finals_publisher.py +0 -0
  530. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/media/avatar/components/staging.py +0 -0
  531. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/media/avatar/components/variant_encoder.py +0 -0
  532. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/media/avatar/constants.py +0 -0
  533. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/media/avatar/exceptions.py +0 -0
  534. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/media/avatar/models.py +0 -0
  535. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/media/avatar/ports/__init__.py +0 -0
  536. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/media/avatar/ports/finals_publisher.py +0 -0
  537. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/media/avatar/ports/staging.py +0 -0
  538. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/media/avatar/ports/variant_encoder.py +0 -0
  539. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/media/avatar/service.py +0 -0
  540. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/media/banner/__init__.py +0 -0
  541. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/media/banner/components/__init__.py +0 -0
  542. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/media/banner/components/finals_publisher.py +0 -0
  543. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/media/banner/components/staging.py +0 -0
  544. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/media/banner/components/variant_encoder.py +0 -0
  545. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/media/banner/constants.py +0 -0
  546. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/media/banner/exceptions.py +0 -0
  547. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/media/banner/models.py +0 -0
  548. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/media/banner/ports/__init__.py +0 -0
  549. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/media/banner/ports/finals_publisher.py +0 -0
  550. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/media/banner/ports/staging.py +0 -0
  551. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/media/banner/ports/variant_encoder.py +0 -0
  552. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/media/banner/service.py +0 -0
  553. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/media/dependencies.py +0 -0
  554. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/media/shared/__init__.py +0 -0
  555. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/media/shared/constants.py +0 -0
  556. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/media/shared/exceptions.py +0 -0
  557. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/media/shared/outcomes.py +0 -0
  558. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/media/shared/repository.py +0 -0
  559. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/media/shared/utils.py +0 -0
  560. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/moderation/README.md +0 -0
  561. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/moderation/__init__.py +0 -0
  562. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/moderation/dependencies.py +0 -0
  563. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/moderation/exceptions.py +0 -0
  564. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/moderation/models.py +0 -0
  565. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/moderation/outbox_repository.py +0 -0
  566. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/moderation/outbox_service.py +0 -0
  567. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/moderation/outcomes.py +0 -0
  568. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/moderation/repository.py +0 -0
  569. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/moderation/service.py +0 -0
  570. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/notification/README.md +0 -0
  571. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/notification/__init__.py +0 -0
  572. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/notification/dependencies.py +0 -0
  573. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/notification/enums.py +0 -0
  574. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/notification/exceptions.py +0 -0
  575. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/notification/models.py +0 -0
  576. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/notification/repository.py +0 -0
  577. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/notification/service.py +0 -0
  578. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/outbox/README.md +0 -0
  579. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/outbox/__init__.py +0 -0
  580. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/outbox/dependencies.py +0 -0
  581. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/outbox/exceptions.py +0 -0
  582. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/outbox/models.py +0 -0
  583. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/outbox/ports/__init__.py +0 -0
  584. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/outbox/ports/admin.py +0 -0
  585. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/outbox/ports/consumer.py +0 -0
  586. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/outbox/ports/producer.py +0 -0
  587. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/outbox/service.py +0 -0
  588. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/post/constants.py +0 -0
  589. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/post/dependencies.py +0 -0
  590. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/post/discovery_rank.py +0 -0
  591. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/post/enums.py +0 -0
  592. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/post/exceptions.py +0 -0
  593. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/rating/README.md +0 -0
  594. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/rating/__init__.py +0 -0
  595. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/rating/constants.py +0 -0
  596. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/rating/dependencies.py +0 -0
  597. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/rating/exceptions.py +0 -0
  598. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/rating/models.py +0 -0
  599. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/rating/outcomes.py +0 -0
  600. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/rating/ports/subject_existence.py +0 -0
  601. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/rating/repository.py +0 -0
  602. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/rating/service.py +0 -0
  603. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/repository_sql.py +0 -0
  604. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/user/README.md +0 -0
  605. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/user/__init__.py +0 -0
  606. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/user/constants.py +0 -0
  607. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/user/dependencies.py +0 -0
  608. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/user/enums.py +0 -0
  609. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/user/exceptions.py +0 -0
  610. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/user/group_repository.py +0 -0
  611. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/user/group_service.py +0 -0
  612. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/user/outbox_repository.py +0 -0
  613. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/user/outbox_service.py +0 -0
  614. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/user/outcomes.py +0 -0
  615. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/user/utils.py +0 -0
  616. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/domains/utils.py +0 -0
  617. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/infrastructure/__init__.py +0 -0
  618. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/infrastructure/email/resend_email_adapter.py +0 -0
  619. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/infrastructure/firebase/__init__.py +0 -0
  620. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/infrastructure/firebase/firebase_auth_adapter.py +0 -0
  621. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/infrastructure/media/__init__.py +0 -0
  622. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/infrastructure/media/attachment_staging_display_geometry.py +0 -0
  623. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/infrastructure/media/local_attachment_staging_adapter.py +0 -0
  624. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/infrastructure/media/local_avatar_staging_adapter.py +0 -0
  625. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/infrastructure/media/local_banner_staging_adapter.py +0 -0
  626. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/infrastructure/media/pillow_attachment_variant_encoder_adapter.py +0 -0
  627. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/infrastructure/media/pillow_avatar_variant_encoder_adapter.py +0 -0
  628. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/infrastructure/media/pillow_banner_variant_encoder_adapter.py +0 -0
  629. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/infrastructure/media/pillow_staging_image.py +0 -0
  630. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/infrastructure/media/ssh_attachment_finals_publisher_adapter.py +0 -0
  631. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/infrastructure/media/ssh_banner_finals_publisher_adapter.py +0 -0
  632. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/infrastructure/media/ssh_finals_publisher_adapter.py +0 -0
  633. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/infrastructure/media/staging_paths.py +0 -0
  634. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/infrastructure/outbox/__init__.py +0 -0
  635. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/infrastructure/outbox/outbox_consumer_adapter.py +0 -0
  636. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/infrastructure/outbox/outbox_producer_adapter.py +0 -0
  637. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/migrate_cli.py +0 -0
  638. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/py.typed +0 -0
  639. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/testing/__init__.py +0 -0
  640. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/testing/arq.py +0 -0
  641. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/testing/auth.py +0 -0
  642. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/testing/blockbuster.py +0 -0
  643. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/testing/config.py +0 -0
  644. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/testing/containers.py +0 -0
  645. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/testing/firebase.py +0 -0
  646. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/testing/firebase_identity_toolkit.py +0 -0
  647. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/testing/hookspecs.py +0 -0
  648. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/testing/httpx_test_client.py +0 -0
  649. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/testing/media.py +0 -0
  650. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/testing/migrations.py +0 -0
  651. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/testing/plugin.py +0 -0
  652. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/worker/__init__.py +0 -0
  653. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/worker/main.py +0 -0
  654. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/worker/schedules/__init__.py +0 -0
  655. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/worker/schedules/analytics_refresh_cron.py +0 -0
  656. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/worker/schedules/schedule_aggregate_comment_stats.py +0 -0
  657. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/worker/schedules/schedule_aggregate_post_stats.py +0 -0
  658. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/worker/schedules/schedule_aggregate_rating_stats.py +0 -0
  659. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/worker/schedules/schedule_aggregate_rating_subject_stats.py +0 -0
  660. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/worker/schedules/schedule_aggregate_user_stats.py +0 -0
  661. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/worker/schedules/schedule_expired_account_deletions.py +0 -0
  662. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/worker/schedules/schedule_expired_mute_lifts.py +0 -0
  663. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/worker/schedules/schedule_poll_outbox.py +0 -0
  664. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/worker/schedules/schedule_prune_analytics_daily_facts.py +0 -0
  665. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/worker/schedules/schedule_prune_post_views.py +0 -0
  666. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/worker/schedules/schedule_prune_read_notifications.py +0 -0
  667. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/worker/schedules/schedule_purge_expired_create_idempotency_keys.py +0 -0
  668. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/worker/schedules/schedule_purge_expired_group_invites.py +0 -0
  669. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/worker/schedules/schedule_refresh_analytics.py +0 -0
  670. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/worker/schedules/schedule_restriction_heals.py +0 -0
  671. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/worker/schedules/schedule_sweep_stale_attachment_staging.py +0 -0
  672. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/worker/schedules/schedule_sweep_stale_avatar_staging.py +0 -0
  673. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/worker/schedules/schedule_sweep_stale_banner_staging.py +0 -0
  674. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/worker/tasks/__init__.py +0 -0
  675. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/worker/tasks/delete_attachment_finals.py +0 -0
  676. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/worker/tasks/delete_superseded_avatar_finals.py +0 -0
  677. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/worker/tasks/delete_superseded_banner_finals.py +0 -0
  678. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/worker/tasks/process_account_deletion.py +0 -0
  679. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/worker/tasks/process_account_deletion_scheduled_email.py +0 -0
  680. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/worker/tasks/process_admin_user_deletion.py +0 -0
  681. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/worker/tasks/process_aggregate_comment_stats.py +0 -0
  682. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/worker/tasks/process_aggregate_post_stats.py +0 -0
  683. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/worker/tasks/process_aggregate_rating_stats.py +0 -0
  684. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/worker/tasks/process_aggregate_rating_subject_stats.py +0 -0
  685. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/worker/tasks/process_aggregate_user_stats.py +0 -0
  686. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/worker/tasks/process_attachment_asset_variants.py +0 -0
  687. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/worker/tasks/process_banner_asset_variants.py +0 -0
  688. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/worker/tasks/process_block_notification_wipe.py +0 -0
  689. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/worker/tasks/process_cache_pattern_invalidation.py +0 -0
  690. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/worker/tasks/process_comment_tombstone_cleanup.py +0 -0
  691. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/worker/tasks/process_destructive_comment_delete.py +0 -0
  692. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/worker/tasks/process_destructive_post_delete.py +0 -0
  693. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/worker/tasks/process_friendship_pair_notification_wipe.py +0 -0
  694. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/worker/tasks/process_group_invite_notification_wipe.py +0 -0
  695. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/worker/tasks/process_media_asset_variants.py +0 -0
  696. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/worker/tasks/process_mute_lift.py +0 -0
  697. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/worker/tasks/process_outbox_row.py +0 -0
  698. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/worker/tasks/process_post_private_notification_wipe.py +0 -0
  699. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/worker/tasks/process_post_tombstone_cleanup.py +0 -0
  700. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/worker/tasks/process_refresh_analytics_bucket.py +0 -0
  701. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/worker/tasks/process_restriction_reactions.py +0 -0
  702. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/worker/tasks/process_transactional_email.py +0 -0
  703. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/worker/tasks/process_user_content_deletion.py +0 -0
  704. {core_framework-4.1.0 → core_framework-4.2.1}/core_framework/worker/worker_context.py +0 -0
  705. {core_framework-4.1.0 → core_framework-4.2.1}/deploy/README.md +0 -0
  706. {core_framework-4.1.0 → core_framework-4.2.1}/deploy/app/docker-compose.dev.yaml +0 -0
  707. {core_framework-4.1.0 → core_framework-4.2.1}/deploy/app/docker-compose.yml +0 -0
  708. {core_framework-4.1.0 → core_framework-4.2.1}/deploy/app/dockerfile +0 -0
  709. {core_framework-4.1.0 → core_framework-4.2.1}/deploy/observability/.env.example +0 -0
  710. {core_framework-4.1.0 → core_framework-4.2.1}/deploy/observability/README.md +0 -0
  711. {core_framework-4.1.0 → core_framework-4.2.1}/deploy/observability/docker-compose.yml +0 -0
  712. {core_framework-4.1.0 → core_framework-4.2.1}/deploy/observability/grafana/dashboards/application/api-http.json +0 -0
  713. {core_framework-4.1.0 → core_framework-4.2.1}/deploy/observability/grafana/dashboards/application/worker-jobs.json +0 -0
  714. {core_framework-4.1.0 → core_framework-4.2.1}/deploy/observability/grafana/dashboards/infrastructure/node-exporter.json +0 -0
  715. {core_framework-4.1.0 → core_framework-4.2.1}/deploy/observability/grafana/dashboards/infrastructure/postgres-exporter.json +0 -0
  716. {core_framework-4.1.0 → core_framework-4.2.1}/deploy/observability/grafana/dashboards/infrastructure/redis-exporter.json +0 -0
  717. {core_framework-4.1.0 → core_framework-4.2.1}/deploy/observability/grafana/provisioning/dashboards/dashboards.yml +0 -0
  718. {core_framework-4.1.0 → core_framework-4.2.1}/deploy/observability/grafana/provisioning/datasources/datasources.yml +0 -0
  719. {core_framework-4.1.0 → core_framework-4.2.1}/deploy/observability/loki.yaml +0 -0
  720. {core_framework-4.1.0 → core_framework-4.2.1}/deploy/observability/otel-collector-config.yaml +0 -0
  721. {core_framework-4.1.0 → core_framework-4.2.1}/deploy/observability/prometheus.yml +0 -0
  722. {core_framework-4.1.0 → core_framework-4.2.1}/deploy/observability/targets/node/.gitkeep +0 -0
  723. {core_framework-4.1.0 → core_framework-4.2.1}/deploy/observability/targets/postgres/.gitkeep +0 -0
  724. {core_framework-4.1.0 → core_framework-4.2.1}/deploy/observability/targets/redis/.gitkeep +0 -0
  725. {core_framework-4.1.0 → core_framework-4.2.1}/deploy/observability/targets.default/node.yml +0 -0
  726. {core_framework-4.1.0 → core_framework-4.2.1}/deploy/observability/targets.default/postgres.yml +0 -0
  727. {core_framework-4.1.0 → core_framework-4.2.1}/deploy/observability/targets.default/redis.yml +0 -0
  728. {core_framework-4.1.0 → core_framework-4.2.1}/deploy/observability/targets.example/README.md +0 -0
  729. {core_framework-4.1.0 → core_framework-4.2.1}/deploy/observability/tempo.yaml +0 -0
  730. {core_framework-4.1.0 → core_framework-4.2.1}/docs/README.md +0 -0
  731. {core_framework-4.1.0 → core_framework-4.2.1}/docs/deployments/README.md +0 -0
  732. {core_framework-4.1.0 → core_framework-4.2.1}/docs/deployments/e2e-smoke-tests-design.md +0 -0
  733. {core_framework-4.1.0 → core_framework-4.2.1}/docs/deployments/edge-upload-limits.md +0 -0
  734. {core_framework-4.1.0 → core_framework-4.2.1}/docs/deployments/examples/Caddyfile.example +0 -0
  735. {core_framework-4.1.0 → core_framework-4.2.1}/docs/deployments/examples/Caddyfile.observability.example +0 -0
  736. {core_framework-4.1.0 → core_framework-4.2.1}/docs/deployments/examples/image-server-known-hosts.example +0 -0
  737. {core_framework-4.1.0 → core_framework-4.2.1}/docs/deployments/guides/playbook/postgres-backup-playbook.md +0 -0
  738. {core_framework-4.1.0 → core_framework-4.2.1}/docs/deployments/guides/playbook/py-spy-playbook.md +0 -0
  739. {core_framework-4.1.0 → core_framework-4.2.1}/docs/deployments/guides/setup/app-server-deploy-ssh.md +0 -0
  740. {core_framework-4.1.0 → core_framework-4.2.1}/docs/deployments/guides/setup/caddy-setup.md +0 -0
  741. {core_framework-4.1.0 → core_framework-4.2.1}/docs/deployments/guides/setup/cloudflare-setup.md +0 -0
  742. {core_framework-4.1.0 → core_framework-4.2.1}/docs/deployments/guides/setup/image-server-ssh.md +0 -0
  743. {core_framework-4.1.0 → core_framework-4.2.1}/docs/deployments/guides/setup/observability-lgtm-setup.md +0 -0
  744. {core_framework-4.1.0 → core_framework-4.2.1}/docs/deployments/guides/setup/postgres-backup-setup.md +0 -0
  745. {core_framework-4.1.0 → core_framework-4.2.1}/docs/deployments/guides/setup/postgres-setup.md +0 -0
  746. {core_framework-4.1.0 → core_framework-4.2.1}/docs/deployments/guides/setup/py-spy-setup.md +0 -0
  747. {core_framework-4.1.0 → core_framework-4.2.1}/docs/deployments/guides/setup/redis-setup.md +0 -0
  748. {core_framework-4.1.0 → core_framework-4.2.1}/docs/deployments/guides/setup/ubuntu-server-setup.md +0 -0
  749. {core_framework-4.1.0 → core_framework-4.2.1}/docs/deployments/host-config-defaults-implementation.md +0 -0
  750. {core_framework-4.1.0 → core_framework-4.2.1}/docs/deployments/postgres-backup-design.md +0 -0
  751. {core_framework-4.1.0 → core_framework-4.2.1}/docs/deployments/release-playbook.md +0 -0
  752. {core_framework-4.1.0 → core_framework-4.2.1}/docs/design/account-removal-spine-implementation.md +0 -0
  753. {core_framework-4.1.0 → core_framework-4.2.1}/docs/design/analytics-rollup-design.md +0 -0
  754. {core_framework-4.1.0 → core_framework-4.2.1}/docs/design/analytics-warehouse-design.md +0 -0
  755. {core_framework-4.1.0 → core_framework-4.2.1}/docs/design/cache-invalidation-design.md +0 -0
  756. {core_framework-4.1.0 → core_framework-4.2.1}/docs/design/comment-subject-kinds-design.md +0 -0
  757. {core_framework-4.1.0 → core_framework-4.2.1}/docs/design/create-idempotency-design.md +0 -0
  758. {core_framework-4.1.0 → core_framework-4.2.1}/docs/design/event-outbox-design.md +0 -0
  759. {core_framework-4.1.0 → core_framework-4.2.1}/docs/design/events-ingest-design.md +0 -0
  760. {core_framework-4.1.0 → core_framework-4.2.1}/docs/design/list-sort-design.md +0 -0
  761. {core_framework-4.1.0 → core_framework-4.2.1}/docs/design/list-sort-implementation.md +0 -0
  762. {core_framework-4.1.0 → core_framework-4.2.1}/docs/design/media-cpu-off-api-refactor.md +0 -0
  763. {core_framework-4.1.0 → core_framework-4.2.1}/docs/design/media-storage-topology.md +0 -0
  764. {core_framework-4.1.0 → core_framework-4.2.1}/docs/design/moderation-restriction-fanout-design.md +0 -0
  765. {core_framework-4.1.0 → core_framework-4.2.1}/docs/design/moderation-restriction-fanout-implementation.md +0 -0
  766. {core_framework-4.1.0 → core_framework-4.2.1}/docs/design/moderator-surfaces-design.md +0 -0
  767. {core_framework-4.1.0 → core_framework-4.2.1}/docs/design/moderator-surfaces-implementation.md +0 -0
  768. {core_framework-4.1.0 → core_framework-4.2.1}/docs/design/observability-lgtm-design.md +0 -0
  769. {core_framework-4.1.0 → core_framework-4.2.1}/docs/design/outbox-admin-ops-design.md +0 -0
  770. {core_framework-4.1.0 → core_framework-4.2.1}/docs/design/rating-implementation-plan.md +0 -0
  771. {core_framework-4.1.0 → core_framework-4.2.1}/docs/design/rating-thread-owner-cue-design.md +0 -0
  772. {core_framework-4.1.0 → core_framework-4.2.1}/docs/design/rating-thread-owner-cue-implementation.md +0 -0
  773. {core_framework-4.1.0 → core_framework-4.2.1}/docs/design/restriction-and-block-visibility-design.md +0 -0
  774. {core_framework-4.1.0 → core_framework-4.2.1}/docs/design/restriction-and-block-visibility-implementation.md +0 -0
  775. {core_framework-4.1.0 → core_framework-4.2.1}/docs/design/utm-events-design.md +0 -0
  776. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/agent/model_call_probe.md +0 -0
  777. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/analytics/admin_analytics_reads.md +0 -0
  778. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/auth/access_control.md +0 -0
  779. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/auth/registration.md +0 -0
  780. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/cache/admin_cache_invalidation.md +0 -0
  781. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/comments/README.md +0 -0
  782. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/comments/admin_comments.md +0 -0
  783. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/comments/comment_like.md +0 -0
  784. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/comments/comment_report.md +0 -0
  785. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/comments/comment_stats_aggregation.md +0 -0
  786. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/comments/create_comment.md +0 -0
  787. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/comments/delete_comment.md +0 -0
  788. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/comments/edit_comment.md +0 -0
  789. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/comments/retrieve_comments.md +0 -0
  790. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/deletion/comments.md +0 -0
  791. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/deletion/overview.md +0 -0
  792. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/deletion/ratings.md +0 -0
  793. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/events/events.md +0 -0
  794. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/media/README.md +0 -0
  795. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/media/attachment_upload.md +0 -0
  796. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/media/avatar-upload-design.md +0 -0
  797. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/media/banner-upload-design.md +0 -0
  798. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/media/post-comment-attachments-design.md +0 -0
  799. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/media/upload-pipeline-design.md +0 -0
  800. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/media/upload_pipeline.md +0 -0
  801. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/mentions/mentions_in_content.md +0 -0
  802. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/moderation/README.md +0 -0
  803. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/moderation/appeals.md +0 -0
  804. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/moderation/internal_notes.md +0 -0
  805. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/moderation/reports.md +0 -0
  806. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/moderation/restrictions.md +0 -0
  807. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/notifications/inbox-hint-design.md +0 -0
  808. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/notifications/inbox-hint-implementation.md +0 -0
  809. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/outbox/admin_outbox_ops.md +0 -0
  810. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/posts/admin_posts.md +0 -0
  811. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/posts/author_context.md +0 -0
  812. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/posts/create_post.md +0 -0
  813. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/posts/delete_post.md +0 -0
  814. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/posts/edit_post.md +0 -0
  815. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/posts/post_like.md +0 -0
  816. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/posts/post_report.md +0 -0
  817. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/posts/post_stats_aggregation.md +0 -0
  818. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/posts/post_visibility.md +0 -0
  819. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/ratings/README.md +0 -0
  820. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/ratings/admin_ratings.md +0 -0
  821. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/ratings/delete_rating.md +0 -0
  822. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/ratings/edit_rating.md +0 -0
  823. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/ratings/rating_report.md +0 -0
  824. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/ratings/rating_stats_aggregation.md +0 -0
  825. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/ratings/rating_upvote.md +0 -0
  826. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/ratings/retrieve_ratings.md +0 -0
  827. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/ratings/upsert_rating.md +0 -0
  828. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/users/account.md +0 -0
  829. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/users/account_deletion.md +0 -0
  830. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/users/admin_users.md +0 -0
  831. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/users/avatar.md +0 -0
  832. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/users/banner.md +0 -0
  833. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/users/blocks.md +0 -0
  834. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/users/change_history.md +0 -0
  835. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/users/check_username_exists.md +0 -0
  836. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/users/follow-system-design.md +0 -0
  837. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/users/follow.md +0 -0
  838. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/users/friendship-system-design.md +0 -0
  839. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/users/friendship.md +0 -0
  840. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/users/groups-system-design.md +0 -0
  841. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/users/groups.md +0 -0
  842. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/users/my_posts_and_comments.md +0 -0
  843. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/users/profile.md +0 -0
  844. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/users/public_profile.md +0 -0
  845. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/users/user_removal.md +0 -0
  846. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/users/user_stats_aggregation.md +0 -0
  847. {core_framework-4.1.0 → core_framework-4.2.1}/docs/domains/users/username_suggest.md +0 -0
  848. {core_framework-4.1.0 → core_framework-4.2.1}/docs/library/README.md +0 -0
  849. {core_framework-4.1.0 → core_framework-4.2.1}/docs/library/core-framework-migration.md +0 -0
  850. {core_framework-4.1.0 → core_framework-4.2.1}/docs/library/testing-plugin-design.md +0 -0
  851. {core_framework-4.1.0 → core_framework-4.2.1}/docs/library/workers.md +0 -0
  852. {core_framework-4.1.0 → core_framework-4.2.1}/docs/platform/README.md +0 -0
  853. {core_framework-4.1.0 → core_framework-4.2.1}/docs/platform/conventions.md +0 -0
  854. {core_framework-4.1.0 → core_framework-4.2.1}/docs/platform/database-triggers.md +0 -0
  855. {core_framework-4.1.0 → core_framework-4.2.1}/docs/platform/domain-services-and-adapters.md +0 -0
  856. {core_framework-4.1.0 → core_framework-4.2.1}/docs/platform/layers-and-boundaries.md +0 -0
  857. {core_framework-4.1.0 → core_framework-4.2.1}/docs/platform/patch-update-typed-payload.md +0 -0
  858. {core_framework-4.1.0 → core_framework-4.2.1}/docs/platform/response-composition-and-caching.md +0 -0
  859. {core_framework-4.1.0 → core_framework-4.2.1}/docs/reviews/README.md +0 -0
  860. {core_framework-4.1.0 → core_framework-4.2.1}/docs/reviews/log.md +0 -0
  861. {core_framework-4.1.0 → core_framework-4.2.1}/docs/reviews/review-playbook.md +0 -0
  862. {core_framework-4.1.0 → core_framework-4.2.1}/docs/reviews/slices.md +0 -0
  863. {core_framework-4.1.0 → core_framework-4.2.1}/docs/testing.md +0 -0
  864. {core_framework-4.1.0 → core_framework-4.2.1}/firebase_config.example.json +0 -0
  865. {core_framework-4.1.0 → core_framework-4.2.1}/makefile +0 -0
  866. {core_framework-4.1.0 → core_framework-4.2.1}/tests/__init__.py +0 -0
  867. {core_framework-4.1.0 → core_framework-4.2.1}/tests/conftest.py +0 -0
  868. {core_framework-4.1.0 → core_framework-4.2.1}/tests/e2e/_auth.py +0 -0
  869. {core_framework-4.1.0 → core_framework-4.2.1}/tests/e2e/_canaries.py +0 -0
  870. {core_framework-4.1.0 → core_framework-4.2.1}/tests/e2e/_media.py +0 -0
  871. {core_framework-4.1.0 → core_framework-4.2.1}/tests/e2e/_settings.py +0 -0
  872. {core_framework-4.1.0 → core_framework-4.2.1}/tests/e2e/_upload_payloads.py +0 -0
  873. {core_framework-4.1.0 → core_framework-4.2.1}/tests/e2e/conftest.py +0 -0
  874. {core_framework-4.1.0 → core_framework-4.2.1}/tests/e2e/media/pipeline_test.py +0 -0
  875. {core_framework-4.1.0 → core_framework-4.2.1}/tests/e2e/smoke/agent_probe_test.py +0 -0
  876. {core_framework-4.1.0 → core_framework-4.2.1}/tests/e2e/smoke/canary_test.py +0 -0
  877. {core_framework-4.1.0 → core_framework-4.2.1}/tests/e2e/smoke/media_test.py +0 -0
  878. {core_framework-4.1.0 → core_framework-4.2.1}/tests/e2e/smoke/system_test.py +0 -0
  879. {core_framework-4.1.0 → core_framework-4.2.1}/tests/e2e/smoke/tls_host_test.py +0 -0
  880. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/__init__.py +0 -0
  881. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/_http_error_details.py +0 -0
  882. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/_poll.py +0 -0
  883. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/analytics/_helpers.py +0 -0
  884. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/__init__.py +0 -0
  885. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/_auth_helpers.py +0 -0
  886. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/_destructive_delete_helpers.py +0 -0
  887. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/_http_helpers.py +0 -0
  888. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/_outbox_helpers.py +0 -0
  889. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/_user_deletion_helpers.py +0 -0
  890. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/_user_helpers.py +0 -0
  891. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/admin/__init__.py +0 -0
  892. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/admin/_auth_cases.py +0 -0
  893. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/admin/analytics/__init__.py +0 -0
  894. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/admin/analytics/router_test.py +0 -0
  895. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/admin/cache/__init__.py +0 -0
  896. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/admin/cache/router_test.py +0 -0
  897. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/admin/comments/__init__.py +0 -0
  898. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/admin/comments/router_test.py +0 -0
  899. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/admin/moderation/__init__.py +0 -0
  900. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/admin/moderation/router_test.py +0 -0
  901. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/admin/moderator_surfaces_test.py +0 -0
  902. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/admin/outbox/__init__.py +0 -0
  903. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/admin/outbox/router_test.py +0 -0
  904. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/admin/posts/__init__.py +0 -0
  905. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/admin/posts/router_test.py +0 -0
  906. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/admin/users/__init__.py +0 -0
  907. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/admin/users/router_test.py +0 -0
  908. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/attachments/_helpers.py +0 -0
  909. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/attachments/attachment_upload_test.py +0 -0
  910. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/attachments/conftest.py +0 -0
  911. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/auth/__init__.py +0 -0
  912. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/auth/router_test.py +0 -0
  913. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/comments/__init__.py +0 -0
  914. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/comments/authenticated/__init__.py +0 -0
  915. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/comments/authenticated/comment_writes_integration_test.py +0 -0
  916. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/comments/comment_attachments_integration_test.py +0 -0
  917. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/comments/comment_kind_registry_integration_test.py +0 -0
  918. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/comments/public/__init__.py +0 -0
  919. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/comments/public/router_test.py +0 -0
  920. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/create_idempotency_integration_test.py +0 -0
  921. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/events/router_test.py +0 -0
  922. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/groups/groups_integration_test.py +0 -0
  923. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/list_sort_integration_test.py +0 -0
  924. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/media/ingest_contract_test.py +0 -0
  925. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/mentions/mentions_integration_test.py +0 -0
  926. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/notifications/__init__.py +0 -0
  927. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/notifications/inbox_redesign_integration_test.py +0 -0
  928. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/notifications/router_test.py +0 -0
  929. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/posts/__init__.py +0 -0
  930. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/posts/comment_count_aggregation_test.py +0 -0
  931. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/posts/followers_visibility_test.py +0 -0
  932. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/posts/post_attachments_integration_test.py +0 -0
  933. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/posts/post_deletion_integration_test.py +0 -0
  934. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/posts/post_stats_dirty_marking_test.py +0 -0
  935. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/posts/public/__init__.py +0 -0
  936. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/posts/public/router_test.py +0 -0
  937. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/public_read_by_id_unavailable_detail_test.py +0 -0
  938. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/ratings/__init__.py +0 -0
  939. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/ratings/_helpers.py +0 -0
  940. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/ratings/conftest.py +0 -0
  941. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/ratings/ratings_integration_test.py +0 -0
  942. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/ratings/ratings_visibility_integration_test.py +0 -0
  943. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/restriction_visibility_integration_test.py +0 -0
  944. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/system/__init__.py +0 -0
  945. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/system/router_test.py +0 -0
  946. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/users/__init__.py +0 -0
  947. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/users/account_deletion_email_test.py +0 -0
  948. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/users/authenticated/__init__.py +0 -0
  949. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/users/authenticated/friendship_integration_test.py +0 -0
  950. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/users/authenticated/profile_media_upload_test.py +0 -0
  951. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/users/authenticated/router_test.py +0 -0
  952. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/users/deletion_audit_integration_test.py +0 -0
  953. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/users/public/__init__.py +0 -0
  954. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/users/public/router_test.py +0 -0
  955. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/api/users/user_deletion_integration_test.py +0 -0
  956. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/conftest.py +0 -0
  957. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/worker/__init__.py +0 -0
  958. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/worker/_aggregate_stats_helpers.py +0 -0
  959. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/worker/_arq_helpers.py +0 -0
  960. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/worker/_media_upload_helpers.py +0 -0
  961. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/worker/account_deletion_test.py +0 -0
  962. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/worker/aggregate_comment_stats_test.py +0 -0
  963. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/worker/aggregate_post_stats_test.py +0 -0
  964. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/worker/aggregate_user_stats_test.py +0 -0
  965. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/worker/analytics_prune_test.py +0 -0
  966. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/worker/analytics_refresh_test.py +0 -0
  967. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/worker/attachment_upload_test.py +0 -0
  968. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/worker/conftest.py +0 -0
  969. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/worker/create_idempotency_retention_test.py +0 -0
  970. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/worker/moderation_outbox_test.py +0 -0
  971. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/worker/mute_lift_test.py +0 -0
  972. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/worker/profile_media_upload_test.py +0 -0
  973. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/worker/read_notifications_retention_test.py +0 -0
  974. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/worker/restriction_fanout_test.py +0 -0
  975. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/worker/stale_staging_sweep_test.py +0 -0
  976. {core_framework-4.1.0 → core_framework-4.2.1}/tests/integration/worker/user_outbox_test.py +0 -0
  977. {core_framework-4.1.0 → core_framework-4.2.1}/tests/unit/__init__.py +0 -0
  978. {core_framework-4.1.0 → core_framework-4.2.1}/tests/unit/api/comments/authenticated/comment_request_schemas_test.py +0 -0
  979. {core_framework-4.1.0 → core_framework-4.2.1}/tests/unit/api/dedupe_preserving_order_test.py +0 -0
  980. {core_framework-4.1.0 → core_framework-4.2.1}/tests/unit/api/posts/authenticated/post_update_mapper_test.py +0 -0
  981. {core_framework-4.1.0 → core_framework-4.2.1}/tests/unit/api/ratings/review_pagination_test.py +0 -0
  982. {core_framework-4.1.0 → core_framework-4.2.1}/tests/unit/api/users/profile_update_mapper_test.py +0 -0
  983. {core_framework-4.1.0 → core_framework-4.2.1}/tests/unit/application/comments/__init__.py +0 -0
  984. {core_framework-4.1.0 → core_framework-4.2.1}/tests/unit/application/comments/kind_registry_test.py +0 -0
  985. {core_framework-4.1.0 → core_framework-4.2.1}/tests/unit/application/email/account_deletion_scheduled_test.py +0 -0
  986. {core_framework-4.1.0 → core_framework-4.2.1}/tests/unit/application/events/event_service_test.py +0 -0
  987. {core_framework-4.1.0 → core_framework-4.2.1}/tests/unit/application/moderation/restriction_fanout_registry_test.py +0 -0
  988. {core_framework-4.1.0 → core_framework-4.2.1}/tests/unit/application/notifications/preview_test.py +0 -0
  989. {core_framework-4.1.0 → core_framework-4.2.1}/tests/unit/application/ratings/kind_registry_test.py +0 -0
  990. {core_framework-4.1.0 → core_framework-4.2.1}/tests/unit/application/shared/request_context_test.py +0 -0
  991. {core_framework-4.1.0 → core_framework-4.2.1}/tests/unit/application/users/account_removal_registry_test.py +0 -0
  992. {core_framework-4.1.0 → core_framework-4.2.1}/tests/unit/application/users/account_removal_runner_test.py +0 -0
  993. {core_framework-4.1.0 → core_framework-4.2.1}/tests/unit/application/users/deletion_audit_test.py +0 -0
  994. {core_framework-4.1.0 → core_framework-4.2.1}/tests/unit/core/bundled_alembic_test.py +0 -0
  995. {core_framework-4.1.0 → core_framework-4.2.1}/tests/unit/core/migrate_cli_test.py +0 -0
  996. {core_framework-4.1.0 → core_framework-4.2.1}/tests/unit/core/pagination_test.py +0 -0
  997. {core_framework-4.1.0 → core_framework-4.2.1}/tests/unit/docs/_api_reference.py +0 -0
  998. {core_framework-4.1.0 → core_framework-4.2.1}/tests/unit/domains/__init__.py +0 -0
  999. {core_framework-4.1.0 → core_framework-4.2.1}/tests/unit/domains/comment/__init__.py +0 -0
  1000. {core_framework-4.1.0 → core_framework-4.2.1}/tests/unit/domains/post/models_test.py +0 -0
  1001. {core_framework-4.1.0 → core_framework-4.2.1}/tests/unit/domains/user/service_test.py +0 -0
  1002. {core_framework-4.1.0 → core_framework-4.2.1}/tests/unit/infrastructure/__init__.py +0 -0
  1003. {core_framework-4.1.0 → core_framework-4.2.1}/tests/unit/infrastructure/media/__init__.py +0 -0
  1004. {core_framework-4.1.0 → core_framework-4.2.1}/tests/unit/infrastructure/media/ssh_finals_publisher_adapter_test.py +0 -0
  1005. {core_framework-4.1.0 → core_framework-4.2.1}/tests/unit/worker/tasks_registration_test.py +0 -0
@@ -24,6 +24,12 @@ on:
24
24
  required: false
25
25
  AGENT_OPENAI_API_KEY:
26
26
  required: false
27
+ AGENT_ANTHROPIC_API_KEY:
28
+ required: false
29
+ ENTITLEMENT_SECRET_API_KEY:
30
+ required: false
31
+ ENTITLEMENT_WEBHOOK_SIGNING_SECRET:
32
+ required: false
27
33
  FIREBASE_CONFIG:
28
34
  required: true
29
35
  IMAGE_SERVER_SSH_PRIVATE_KEY:
@@ -101,10 +107,17 @@ jobs:
101
107
  EMAIL_FROM_ADDRESS: ${{ vars.EMAIL_FROM_ADDRESS }}
102
108
  EMAIL_FROM_NAME: ${{ vars.EMAIL_FROM_NAME }}
103
109
  AGENT_ENABLED: ${{ vars.AGENT_ENABLED || 'false' }}
110
+ AGENT_PROVIDER: ${{ vars.AGENT_PROVIDER || 'openai' }}
104
111
  AGENT_MODEL: ${{ vars.AGENT_MODEL }}
105
112
  AGENT_OPENAI_API_KEY: ${{ secrets.AGENT_OPENAI_API_KEY }}
106
113
  AGENT_OPENAI_BASE_URL: ${{ vars.AGENT_OPENAI_BASE_URL }}
114
+ AGENT_ANTHROPIC_API_KEY: ${{ secrets.AGENT_ANTHROPIC_API_KEY }}
107
115
  AGENT_TIMEOUT_SECONDS: ${{ vars.AGENT_TIMEOUT_SECONDS || '120' }}
116
+ ENTITLEMENT_ENABLED: ${{ vars.ENTITLEMENT_ENABLED || 'false' }}
117
+ ENTITLEMENT_SECRET_API_KEY: ${{ secrets.ENTITLEMENT_SECRET_API_KEY }}
118
+ ENTITLEMENT_PROJECT_ID: ${{ vars.ENTITLEMENT_PROJECT_ID }}
119
+ ENTITLEMENT_WEBHOOK_SIGNING_SECRET: ${{ secrets.ENTITLEMENT_WEBHOOK_SIGNING_SECRET }}
120
+ ENTITLEMENT_ALERT_ADDRESS: ${{ vars.ENTITLEMENT_ALERT_ADDRESS }}
108
121
  run: |
109
122
  set -euo pipefail
110
123
 
@@ -131,6 +131,9 @@ jobs:
131
131
  READ_POSTGRES_PASSWORD: ${{ secrets.READ_POSTGRES_PASSWORD }}
132
132
  EMAIL_API_KEY: ${{ secrets.EMAIL_API_KEY }}
133
133
  AGENT_OPENAI_API_KEY: ${{ secrets.AGENT_OPENAI_API_KEY }}
134
+ AGENT_ANTHROPIC_API_KEY: ${{ secrets.AGENT_ANTHROPIC_API_KEY }}
135
+ ENTITLEMENT_SECRET_API_KEY: ${{ secrets.ENTITLEMENT_SECRET_API_KEY }}
136
+ ENTITLEMENT_WEBHOOK_SIGNING_SECRET: ${{ secrets.ENTITLEMENT_WEBHOOK_SIGNING_SECRET }}
134
137
  FIREBASE_CONFIG: ${{ secrets.FIREBASE_CONFIG }}
135
138
  IMAGE_SERVER_SSH_PRIVATE_KEY: ${{ secrets.IMAGE_SERVER_SSH_PRIVATE_KEY }}
136
139
  IMAGE_SERVER_KNOWN_HOSTS: ${{ secrets.IMAGE_SERVER_KNOWN_HOSTS }}
@@ -47,6 +47,9 @@ jobs:
47
47
  READ_POSTGRES_PASSWORD: ${{ secrets.READ_POSTGRES_PASSWORD }}
48
48
  EMAIL_API_KEY: ${{ secrets.EMAIL_API_KEY }}
49
49
  AGENT_OPENAI_API_KEY: ${{ secrets.AGENT_OPENAI_API_KEY }}
50
+ AGENT_ANTHROPIC_API_KEY: ${{ secrets.AGENT_ANTHROPIC_API_KEY }}
51
+ ENTITLEMENT_SECRET_API_KEY: ${{ secrets.ENTITLEMENT_SECRET_API_KEY }}
52
+ ENTITLEMENT_WEBHOOK_SIGNING_SECRET: ${{ secrets.ENTITLEMENT_WEBHOOK_SIGNING_SECRET }}
50
53
  FIREBASE_CONFIG: ${{ secrets.FIREBASE_CONFIG }}
51
54
  IMAGE_SERVER_SSH_PRIVATE_KEY: ${{ secrets.IMAGE_SERVER_SSH_PRIVATE_KEY }}
52
55
  IMAGE_SERVER_KNOWN_HOSTS: ${{ secrets.IMAGE_SERVER_KNOWN_HOSTS }}
@@ -4,6 +4,23 @@ Notable changes to **core-framework** (import **`core_framework`**). Format foll
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [4.2.1] - 2026-10-10
8
+
9
+ ### Changed
10
+
11
+ - **Entitlement grant list:** `GET /users/me/entitlements` returns **`identifier`** instead of **`label`**. **`register_entitlement_tier`** takes one **`identifier`**, which is that tier's RevenueCat lookup key. Registering tier **1** replaces **`plus`**. A host that passed **`label`** or **`lookup_keys`** must pass **`identifier`**.
12
+
13
+ ## [4.2.0] - 2026-10-08
14
+
15
+ ### Added
16
+
17
+ - **Model provider:** a host selects **openai** (default) or **anthropic**. Startup builds only that provider. **`SupportedModel`** adds **`claude-opus-5`**, **`claude-sonnet-5`**, and **`claude-haiku-5-5`**. An omitted or blank **`model`** is **`gpt-6-luna`** for OpenAI and **`claude-haiku-5-5`** for Anthropic. **`claude-haiku-5-5`** is the Claude API id. The pinned Pydantic AI release classifies the Opus and Sonnet ids and leaves Haiku on its generic Anthropic profile (native JSON-schema output off, adaptive thinking and effort off, sampling settings forwarded) until a pin classifies that id. An explicit **`model`** must belong to the selected provider. Secret **`AGENT_ANTHROPIC_API_KEY`** is required only when enabled and the provider is Anthropic. The Anthropic client uses **`https://api.anthropic.com`** and ignores **`ANTHROPIC_API_KEY`**, **`ANTHROPIC_BASE_URL`**, **`ANTHROPIC_CUSTOM_HEADERS`**, **`ANTHROPIC_WEBHOOK_SIGNING_KEY`**, and **`ANTHROPIC_LOG`**. **`responses_model`** returns that provider's content-free model, or raises when the requested member belongs to the other provider.
18
+ - **Entitlement grants:** a signed RevenueCat webhook replaces paid tiers and leaves complimentary tiers. A refused grant returns **200**, leaves that user's paid rows, and emails the operator at most once per reason and entitlement id per hour. Admin complimentary grant and remove return **204**. Account removal tries the RevenueCat customer delete when entitlements are on, then deletes the user's grant and cursor rows. A failed customer delete is logged and removal continues.
19
+ - **Entitlement RevenueCat adapter:** fetch active entitlements, load the project entitlement list, and delete a customer. A missing customer is an empty active list on fetch and success on delete. A **409** with **`retryable`** false on delete is success, because the delete is already queued. **400**, **401**, **403**, and **422** on delete are not retried. A retryable error or a network failure waits and retries up to three times. Wired only while entitlements are on. The API loads the entitlement list before it accepts traffic and does not start if that load fails. It retries a few times; **401** and **403** fail immediately. An empty list is success. The worker does not load the list.
20
+ - **Entitlement repository:** replace paid grants, insert or delete a complimentary grant, and read active tiers from the replica. A webhook delivery stores its event id and advances each user's sync cursor in one transaction. An older event timestamp does not overwrite a newer snapshot.
21
+ - **Entitlement HTTP:** `PUT` and `DELETE /admin/users/{target_user_id}/entitlements/{tier_id}` stay mounted and return **204**. `POST /webhooks/revenuecat` and `GET /users/me/entitlements` mount only when `[entitlement].enabled` is true. A webhook signature failure is **401**. A tier gate allows its route while entitlements are off and returns **403** **Entitlement required** when they are on and the caller has no qualifying tier.
22
+ - **Entitlement domain (scaffold):** package `core_framework/domains/entitlement`, `[postgres_schemas].schema_entitlement` (default `entitlement`), and Alembic tree `alembic/entitlement/` in `ALEMBIC_DOMAINS`. Revision `b7ed2400e94e` creates `paid_grants`, `complimentary_grants`, `sync_cursors`, and `deliveries` (no foreign key to the user schema; `deliveries` has no `user_id`). Optional `[entitlement]` Settings (`enabled` default false). A blank secret key, project id, or webhook signing secret fails load only when enabled. The secret key, project id, and webhook signing secret are stripped; a CR or LF in a non-blank stripped secret or alert address fails load.
23
+
7
24
  ## [4.1.0] - 2026-09-28
8
25
 
9
26
  ### Breaking
@@ -800,4 +817,6 @@ First **SemVer-stable** release per **`docs/library/package-api.md`**.
800
817
  [4.0.0]: https://github.com/NepNepFFXIV/core-framework/compare/v3.3.0...v4.0.0
801
818
  [4.0.1]: https://github.com/NepNepFFXIV/core-framework/compare/v4.0.0...v4.0.1
802
819
  [4.1.0]: https://github.com/NepNepFFXIV/core-framework/compare/v4.0.1...v4.1.0
803
- [unreleased]: https://github.com/NepNepFFXIV/core-framework/compare/v4.1.0...HEAD
820
+ [4.2.0]: https://github.com/NepNepFFXIV/core-framework/compare/v4.1.0...v4.2.0
821
+ [4.2.1]: https://github.com/NepNepFFXIV/core-framework/compare/v4.2.0...v4.2.1
822
+ [unreleased]: https://github.com/NepNepFFXIV/core-framework/compare/v4.2.1...HEAD
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: core-framework
3
- Version: 4.1.0
3
+ Version: 4.2.1
4
4
  Summary: Core framework package (import as core_framework)
5
5
  Project-URL: Homepage, https://github.com/NepNepFFXIV/core-framework
6
6
  Project-URL: Repository, https://github.com/NepNepFFXIV/core-framework
@@ -15,7 +15,7 @@ Requires-Dist: asyncpg>=0.31.0
15
15
  Requires-Dist: asyncssh>=2.24.0
16
16
  Requires-Dist: brotli-asgi>=1.6.0
17
17
  Requires-Dist: cashews[redis]>=7.5.0
18
- Requires-Dist: device-detector>=6.4.0
18
+ Requires-Dist: device-detector<6.5,>=6.4.0
19
19
  Requires-Dist: fastapi[standard]>=0.141.1
20
20
  Requires-Dist: firebase-admin>=7.5.0
21
21
  Requires-Dist: httpx[http2]>=0.28.1
@@ -33,7 +33,7 @@ Requires-Dist: opentelemetry-semantic-conventions<0.66,>=0.65b0
33
33
  Requires-Dist: orjson>=3.12.0
34
34
  Requires-Dist: pillow-heif>=1.7.0
35
35
  Requires-Dist: pillow>=12.3.0
36
- Requires-Dist: pydantic-ai-slim[openai]<3,>=2.51.0
36
+ Requires-Dist: pydantic-ai-slim[anthropic,openai]<3,>=2.51.0
37
37
  Requires-Dist: pyinstrument>=5.1.3
38
38
  Requires-Dist: python-ulid>=4.0.1
39
39
  Requires-Dist: resend[async]>=2.44.0
@@ -0,0 +1,77 @@
1
+ import asyncio
2
+ from logging.config import fileConfig
3
+
4
+ from sqlalchemy import pool, text
5
+ from sqlalchemy.engine import Connection
6
+ from sqlalchemy.ext.asyncio import async_engine_from_config
7
+
8
+ from alembic import context
9
+ from core_framework.core.settings import load_default_settings
10
+
11
+ settings = load_default_settings()
12
+
13
+ # this is the Alembic Config object, which provides
14
+ # access to the values within the .ini file in use.
15
+ config = context.config
16
+
17
+ # Interpret the config file for Python logging.
18
+ if config.config_file_name is not None:
19
+ fileConfig(config.config_file_name)
20
+
21
+ target_metadata = None
22
+
23
+ config.set_main_option("sqlalchemy.url", settings.write_postgres.alembic_postgres_url)
24
+
25
+
26
+ def run_migrations_offline() -> None:
27
+ """Run migrations in 'offline' mode."""
28
+ url = config.get_main_option("sqlalchemy.url")
29
+ context.configure(
30
+ url=url,
31
+ target_metadata=target_metadata,
32
+ literal_binds=True,
33
+ dialect_opts={"paramstyle": "named"},
34
+ )
35
+
36
+ quoted_schema_name = f'"{settings.postgres_schemas.schema_entitlement.replace('"', '""')}"'
37
+
38
+ with context.begin_transaction():
39
+ context.execute(text(f"set search_path to {quoted_schema_name}"))
40
+ context.run_migrations()
41
+
42
+
43
+ def do_run_migrations(connection: Connection) -> None:
44
+ quoted_schema_name = f'"{settings.postgres_schemas.schema_entitlement.replace('"', '""')}"'
45
+
46
+ connection.execute(text(f"create schema if not exists {quoted_schema_name}"))
47
+ connection.execute(text(f"set search_path to {quoted_schema_name}"))
48
+ connection.commit()
49
+
50
+ context.configure(connection=connection, target_metadata=target_metadata)
51
+
52
+ with context.begin_transaction():
53
+ context.run_migrations()
54
+
55
+
56
+ async def run_async_migrations() -> None:
57
+ """Run migrations in 'online' mode."""
58
+ connectable = async_engine_from_config(
59
+ config.get_section(config.config_ini_section, {}),
60
+ prefix="sqlalchemy.",
61
+ poolclass=pool.NullPool,
62
+ )
63
+
64
+ async with connectable.connect() as connection:
65
+ await connection.run_sync(do_run_migrations)
66
+
67
+ await connectable.dispose()
68
+
69
+
70
+ def run_migrations_online() -> None:
71
+ asyncio.run(run_async_migrations())
72
+
73
+
74
+ if context.is_offline_mode():
75
+ run_migrations_offline()
76
+ else:
77
+ run_migrations_online()
@@ -0,0 +1,58 @@
1
+ """create entitlement schema tables
2
+
3
+ Revision ID: b7ed2400e94e
4
+ Revises:
5
+ Create Date: 2026-10-01 11:11:00.000000
6
+
7
+ """
8
+
9
+ from collections.abc import Sequence
10
+
11
+ from alembic import op
12
+
13
+ revision: str = "b7ed2400e94e"
14
+ down_revision: str | Sequence[str] | None = None
15
+ branch_labels: str | Sequence[str] | None = None
16
+ depends_on: str | Sequence[str] | None = None
17
+
18
+
19
+ def upgrade() -> None:
20
+ op.execute("""
21
+ create table paid_grants (
22
+ user_id varchar(128) not null,
23
+ tier_id integer not null,
24
+ expires_at timestamptz not null,
25
+ synced_at timestamptz not null,
26
+ primary key (user_id, tier_id),
27
+ constraint paid_grants_tier_id_positive check (tier_id >= 1)
28
+ );
29
+ """)
30
+
31
+ op.execute("""
32
+ create table complimentary_grants (
33
+ user_id varchar(128) not null,
34
+ tier_id integer not null,
35
+ granted_by varchar(128) not null,
36
+ granted_at timestamptz not null,
37
+ primary key (user_id, tier_id),
38
+ constraint complimentary_grants_tier_id_positive check (tier_id >= 1)
39
+ );
40
+ """)
41
+
42
+ op.execute("""
43
+ create table sync_cursors (
44
+ user_id varchar(128) primary key,
45
+ last_event_timestamp timestamptz not null
46
+ );
47
+ """)
48
+
49
+ op.execute("""
50
+ create table deliveries (
51
+ event_id varchar(255) primary key,
52
+ applied_at timestamptz not null
53
+ );
54
+ """)
55
+
56
+
57
+ def downgrade() -> None:
58
+ raise RuntimeError("downgrade is not supported for this revision")
@@ -0,0 +1,37 @@
1
+ """add post_bookmarks
2
+
3
+ Revision ID: b3c61daef9b5
4
+ Revises: 0a89b4c23746
5
+ Create Date: 2026-10-06 05:13:00.000000
6
+
7
+ """
8
+
9
+ from collections.abc import Sequence
10
+
11
+ from alembic import op
12
+
13
+ revision: str = "b3c61daef9b5"
14
+ down_revision: str | Sequence[str] | None = "0a89b4c23746"
15
+ branch_labels: str | Sequence[str] | None = None
16
+ depends_on: str | Sequence[str] | None = None
17
+
18
+
19
+ def upgrade() -> None:
20
+ op.execute("""
21
+ create table post_bookmarks (
22
+ user_id varchar(128) not null,
23
+ post_id varchar(26) not null references posts(id) on delete cascade,
24
+ saved_at timestamptz not null default now(),
25
+ primary key (user_id, post_id)
26
+ );
27
+ """)
28
+
29
+ op.execute("""
30
+ create index if not exists idx_post_bookmarks_user_saved_post
31
+ on post_bookmarks (user_id, saved_at desc, post_id desc);
32
+ """)
33
+
34
+
35
+ def downgrade() -> None:
36
+ op.execute("drop index if exists idx_post_bookmarks_user_saved_post;")
37
+ op.execute("drop table if exists post_bookmarks;")
@@ -0,0 +1,52 @@
1
+ # A generic, single database configuration.
2
+
3
+ [alembic]
4
+ # path to migration scripts.
5
+ # this is typically a path given in POSIX (e.g. forward slashes)
6
+ # format, relative to the token %(here)s which refers to the location of this
7
+ # ini file
8
+ script_location = %(here)s/alembic
9
+
10
+ # sys.path path, will be prepended to sys.path if present.
11
+ prepend_sys_path = .
12
+
13
+ path_separator = os
14
+
15
+ sqlalchemy.url = driver://user:pass@localhost/dbname
16
+
17
+
18
+ [post_write_hooks]
19
+
20
+ [loggers]
21
+ keys = root,sqlalchemy,alembic
22
+
23
+ [handlers]
24
+ keys = console
25
+
26
+ [formatters]
27
+ keys = generic
28
+
29
+ [logger_root]
30
+ level = WARNING
31
+ handlers = console
32
+ qualname =
33
+
34
+ [logger_sqlalchemy]
35
+ level = WARNING
36
+ handlers =
37
+ qualname = sqlalchemy.engine
38
+
39
+ [logger_alembic]
40
+ level = INFO
41
+ handlers =
42
+ qualname = alembic
43
+
44
+ [handler_console]
45
+ class = StreamHandler
46
+ args = (sys.stderr,)
47
+ level = NOTSET
48
+ formatter = generic
49
+
50
+ [formatter_generic]
51
+ format = %(levelname)-5.5s [%(name)s] %(message)s
52
+ datefmt = %H:%M:%S
@@ -0,0 +1 @@
1
+ Generic single-database configuration with an async dbapi.
@@ -0,0 +1,28 @@
1
+ """${message}
2
+
3
+ Revision ID: ${up_revision}
4
+ Revises: ${down_revision | comma,n}
5
+ Create Date: ${create_date}
6
+
7
+ """
8
+ from typing import Sequence, Union
9
+
10
+ from alembic import op
11
+ import sqlalchemy as sa
12
+ ${imports if imports else ""}
13
+
14
+ # revision identifiers, used by Alembic.
15
+ revision: str = ${repr(up_revision)}
16
+ down_revision: Union[str, Sequence[str], None] = ${repr(down_revision)}
17
+ branch_labels: Union[str, Sequence[str], None] = ${repr(branch_labels)}
18
+ depends_on: Union[str, Sequence[str], None] = ${repr(depends_on)}
19
+
20
+
21
+ def upgrade() -> None:
22
+ """Upgrade schema."""
23
+ ${upgrades if upgrades else "pass"}
24
+
25
+
26
+ def downgrade() -> None:
27
+ """Downgrade schema."""
28
+ ${downgrades if downgrades else "pass"}
@@ -0,0 +1,40 @@
1
+ """add user_preferences inbox type switches
2
+
3
+ Revision ID: 089f4398f943
4
+ Revises: 24ba262c4ef2
5
+ Create Date: 2026-10-09 15:57:00.000000
6
+
7
+ """
8
+
9
+ from collections.abc import Sequence
10
+
11
+ from alembic import op
12
+
13
+ revision: str = "089f4398f943"
14
+ down_revision: str | Sequence[str] | None = "24ba262c4ef2"
15
+ branch_labels: str | Sequence[str] | None = None
16
+ depends_on: str | Sequence[str] | None = None
17
+
18
+
19
+ def upgrade() -> None:
20
+ op.execute("""
21
+ alter table user_preferences
22
+ add column comments boolean not null default true,
23
+ add column replies boolean not null default true,
24
+ add column mentions boolean not null default true,
25
+ add column follows boolean not null default true,
26
+ add column friend_requests boolean not null default true,
27
+ add column group_invites boolean not null default true;
28
+ """)
29
+
30
+
31
+ def downgrade() -> None:
32
+ op.execute("""
33
+ alter table user_preferences
34
+ drop column if exists comments,
35
+ drop column if exists replies,
36
+ drop column if exists mentions,
37
+ drop column if exists follows,
38
+ drop column if exists friend_requests,
39
+ drop column if exists group_invites;
40
+ """)
@@ -134,6 +134,7 @@ schema_notification = "notification"
134
134
  schema_media = "media"
135
135
  schema_analytics = "analytics"
136
136
  schema_rating = "rating"
137
+ schema_entitlement = "entitlement"
137
138
 
138
139
  [redis]
139
140
  host = "127.0.0.1"
@@ -150,3 +151,16 @@ from_name = ""
150
151
 
151
152
  [agent]
152
153
  enabled = false
154
+ provider = "openai"
155
+ model = ""
156
+ openai_api_key = ""
157
+ openai_base_url = ""
158
+ anthropic_api_key = ""
159
+ timeout_seconds = 300
160
+
161
+ [entitlement]
162
+ enabled = false
163
+ secret_api_key = ""
164
+ project_id = ""
165
+ webhook_signing_secret = ""
166
+ alert_address = ""
@@ -122,6 +122,7 @@ schema_notification = "notification"
122
122
  schema_media = "media"
123
123
  schema_analytics = "analytics"
124
124
  schema_rating = "rating"
125
+ schema_entitlement = "entitlement"
125
126
 
126
127
  [redis]
127
128
  host = "$REDIS_HOST"
@@ -138,7 +139,16 @@ from_name = "$EMAIL_FROM_NAME"
138
139
 
139
140
  [agent]
140
141
  enabled = $AGENT_ENABLED
142
+ provider = "$AGENT_PROVIDER"
141
143
  model = "$AGENT_MODEL"
142
144
  openai_api_key = "$AGENT_OPENAI_API_KEY"
143
145
  openai_base_url = "$AGENT_OPENAI_BASE_URL"
146
+ anthropic_api_key = "$AGENT_ANTHROPIC_API_KEY"
144
147
  timeout_seconds = $AGENT_TIMEOUT_SECONDS
148
+
149
+ [entitlement]
150
+ enabled = $ENTITLEMENT_ENABLED
151
+ secret_api_key = "$ENTITLEMENT_SECRET_API_KEY"
152
+ project_id = "$ENTITLEMENT_PROJECT_ID"
153
+ webhook_signing_secret = "$ENTITLEMENT_WEBHOOK_SIGNING_SECRET"
154
+ alert_address = "$ENTITLEMENT_ALERT_ADDRESS"
@@ -0,0 +1,41 @@
1
+ from typing import Annotated
2
+
3
+ from fastapi import APIRouter, Depends, Path, status
4
+
5
+ from core_framework.api.dependencies import RequiredUserID, check_admin_role
6
+ from core_framework.api.users.shared.schemas import validate_user_id
7
+ from core_framework.application.entitlement.grant_service import grant_complimentary_tier, remove_complimentary_tier
8
+
9
+ router = APIRouter(
10
+ prefix="/users",
11
+ tags=["entitlements - admin"],
12
+ dependencies=[Depends(check_admin_role)],
13
+ )
14
+
15
+
16
+ @router.put("/{target_user_id}/entitlements/{tier_id}", status_code=status.HTTP_204_NO_CONTENT)
17
+ async def put_complimentary_entitlement(
18
+ actor_id: RequiredUserID,
19
+ target_user_id: str,
20
+ tier_id: Annotated[int, Path(ge=1)],
21
+ ) -> None:
22
+ validated_target_user_id = validate_user_id(user_id=target_user_id)
23
+ await grant_complimentary_tier(
24
+ actor_id=actor_id,
25
+ target_user_id=validated_target_user_id,
26
+ tier_id=tier_id,
27
+ )
28
+
29
+
30
+ @router.delete("/{target_user_id}/entitlements/{tier_id}", status_code=status.HTTP_204_NO_CONTENT)
31
+ async def delete_complimentary_entitlement(
32
+ actor_id: RequiredUserID,
33
+ target_user_id: str,
34
+ tier_id: Annotated[int, Path(ge=1)],
35
+ ) -> None:
36
+ validated_target_user_id = validate_user_id(user_id=target_user_id)
37
+ await remove_complimentary_tier(
38
+ actor_id=actor_id,
39
+ target_user_id=validated_target_user_id,
40
+ tier_id=tier_id,
41
+ )
@@ -4,6 +4,7 @@ from core_framework.api.admin.agent.router import router as agent_router
4
4
  from core_framework.api.admin.analytics.router import router as analytics_router
5
5
  from core_framework.api.admin.cache.router import router as cache_router
6
6
  from core_framework.api.admin.comments.router import router as comments_router
7
+ from core_framework.api.admin.entitlements.router import router as entitlements_router
7
8
  from core_framework.api.admin.moderation.router import router as moderation_router
8
9
  from core_framework.api.admin.outbox.router import router as outbox_router
9
10
  from core_framework.api.admin.posts.router import router as posts_router
@@ -21,6 +22,7 @@ router.include_router(cache_router)
21
22
  router.include_router(analytics_router)
22
23
  router.include_router(outbox_router)
23
24
  router.include_router(users_router)
25
+ router.include_router(entitlements_router)
24
26
  router.include_router(moderation_router)
25
27
  router.include_router(posts_router)
26
28
  router.include_router(comments_router)
@@ -0,0 +1,23 @@
1
+ from typing import Annotated
2
+
3
+ from fastapi import Depends
4
+
5
+ from core_framework.api.dependencies import RequiredUserID, check_caller_identity
6
+ from core_framework.application.entitlement.grant_service import require_caller_tier
7
+ from core_framework.application.entitlement.registry import note_tier_gate
8
+
9
+
10
+ def require_tier(tier_id: int):
11
+ """Route dependency for one tier id. Allows the route while entitlements are off."""
12
+ if tier_id < 1:
13
+ raise ValueError("tier_id must be at least 1")
14
+ note_tier_gate(tier_id)
15
+
16
+ async def gate(
17
+ user_id: RequiredUserID,
18
+ _: Annotated[None, Depends(check_caller_identity)],
19
+ ) -> None:
20
+ del _
21
+ await require_caller_tier(user_id=user_id, tier_id=tier_id)
22
+
23
+ return gate
@@ -0,0 +1,33 @@
1
+ from typing import Any
2
+
3
+ from fastapi import APIRouter, Depends, Request
4
+
5
+ from core_framework.api.dependencies import RequiredUserID, check_caller_identity
6
+ from core_framework.api.entitlements.schemas import EntitlementItemResponse, EntitlementsResponse
7
+ from core_framework.application.entitlement.grant_service import list_caller_entitlements
8
+ from core_framework.application.entitlement.webhook_service import handle_revenuecat_webhook
9
+
10
+ webhook_router = APIRouter(tags=["entitlements"])
11
+ me_router = APIRouter(prefix="/users", tags=["entitlements"])
12
+
13
+
14
+ @webhook_router.post("/webhooks/revenuecat")
15
+ async def post_revenuecat_webhook(request: Request) -> None:
16
+ raw_body = await request.body()
17
+ header = request.headers.get("x-revenuecat-webhook-signature")
18
+ await handle_revenuecat_webhook(body=raw_body, signature_header=header)
19
+
20
+
21
+ @me_router.get(
22
+ "/me/entitlements",
23
+ response_model=EntitlementsResponse,
24
+ dependencies=[Depends(check_caller_identity)],
25
+ )
26
+ async def get_my_entitlements(user_id: RequiredUserID) -> Any:
27
+ items = await list_caller_entitlements(user_id=user_id)
28
+ return EntitlementsResponse(
29
+ items=[
30
+ EntitlementItemResponse(tier_id=item.tier_id, identifier=item.identifier, expires_at=item.expires_at)
31
+ for item in items
32
+ ]
33
+ )
@@ -0,0 +1,13 @@
1
+ from datetime import datetime
2
+
3
+ from pydantic import BaseModel, Field
4
+
5
+
6
+ class EntitlementItemResponse(BaseModel):
7
+ tier_id: int = Field(ge=1)
8
+ identifier: str = Field(min_length=1)
9
+ expires_at: datetime | None
10
+
11
+
12
+ class EntitlementsResponse(BaseModel):
13
+ items: list[EntitlementItemResponse]
@@ -5,6 +5,7 @@ from ulid import ULID
5
5
 
6
6
  from core_framework.api.attachments.schemas import attachment_asset_id_strings
7
7
  from core_framework.api.dependencies import RequiredUserID, check_caller_identity
8
+ from core_framework.api.entitlements.dependencies import require_tier
8
9
  from core_framework.api.idempotency.dependencies import optional_idempotency_key
9
10
  from core_framework.api.posts.authenticated.mappers import post_update_from_request
10
11
  from core_framework.api.posts.authenticated.schemas import (
@@ -19,7 +20,9 @@ from core_framework.application.posts.authenticated_service import (
19
20
  create_post,
20
21
  edit_post,
21
22
  like_post,
23
+ remove_post_bookmark,
22
24
  remove_post_report,
25
+ save_post_bookmark,
23
26
  tombstone_post_for_author,
24
27
  unlike_post,
25
28
  )
@@ -86,6 +89,26 @@ async def delete_post_like(post_id: ULID, user_id: RequiredUserID, background_ta
86
89
  background_tasks.add_task(mark_post_stats_dirty, post_id=post_id_str)
87
90
 
88
91
 
92
+ @router.put(
93
+ "/{post_id}/bookmark",
94
+ status_code=status.HTTP_204_NO_CONTENT,
95
+ dependencies=[Depends(require_tier(1))],
96
+ )
97
+ @RateLimitKey.POST_BOOKMARK()
98
+ async def put_post_bookmark(post_id: ULID, user_id: RequiredUserID) -> None:
99
+ await save_post_bookmark(user_id=user_id, post_id=str(post_id))
100
+
101
+
102
+ @router.delete(
103
+ "/{post_id}/bookmark",
104
+ status_code=status.HTTP_204_NO_CONTENT,
105
+ dependencies=[Depends(require_tier(1))],
106
+ )
107
+ @RateLimitKey.POST_BOOKMARK()
108
+ async def delete_post_bookmark(post_id: ULID, user_id: RequiredUserID) -> None:
109
+ await remove_post_bookmark(user_id=user_id, post_id=str(post_id))
110
+
111
+
89
112
  @router.post("/{post_id}/report", status_code=status.HTTP_204_NO_CONTENT)
90
113
  @RateLimitKey.POST_REPORT()
91
114
  async def post_post_report(
@@ -1,3 +1,4 @@
1
+ from datetime import datetime
1
2
  from typing import Annotated
2
3
 
3
4
  from pydantic import BaseModel, Field, field_validator
@@ -25,6 +26,11 @@ class CreatedPostResponse(BaseModel):
25
26
  id: ULID
26
27
 
27
28
 
29
+ class BookmarkItemResponse(BaseModel):
30
+ post_id: ULID
31
+ saved_at: datetime
32
+
33
+
28
34
  class CreatePostRequest(BaseModel):
29
35
  content: PostContent
30
36
  visibility: PostVisibility = PostVisibility.PUBLIC
@@ -19,6 +19,7 @@ class PostStatsResponse(BaseModel):
19
19
  class PostViewerContext(BaseModel):
20
20
  is_liked: bool
21
21
  is_reported: bool
22
+ is_bookmarked: bool
22
23
 
23
24
 
24
25
  class AuthorContext(BaseModel):