core-framework 4.0.1__tar.gz → 4.2.0__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.
- core_framework-4.2.0/.agents/skills/building-pydantic-ai-agents +1 -0
- core_framework-4.2.0/.cursor/skills/building-pydantic-ai-agents +1 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/.cursor/skills/code-review/SKILL.md +12 -1
- {core_framework-4.0.1 → core_framework-4.2.0}/.github/workflows/_deploy.yml +20 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/.github/workflows/dev-ci-cd.yaml +5 -1
- {core_framework-4.0.1 → core_framework-4.2.0}/.github/workflows/manual-deployment.yaml +5 -1
- {core_framework-4.0.1 → core_framework-4.2.0}/CHANGELOG.md +29 -1
- {core_framework-4.0.1 → core_framework-4.2.0}/PKG-INFO +4 -2
- core_framework-4.2.0/alembic/entitlement/alembic/env.py +77 -0
- core_framework-4.2.0/alembic/entitlement/alembic/versions/b7ed2400e94e_entitlement_schema.py +58 -0
- core_framework-4.2.0/alembic/post/alembic/versions/0a89b4c23746_post_stats_like_created_post_index.py +27 -0
- core_framework-4.2.0/alembic/post/alembic/versions/954f00734f36_post_add_post_discovery_rank.py +37 -0
- core_framework-4.2.0/alembic/post/alembic/versions/b3c61daef9b5_post_add_post_bookmarks.py +37 -0
- core_framework-4.2.0/alembic/rating/alembic.ini +52 -0
- core_framework-4.2.0/alembic/user/alembic/README +1 -0
- core_framework-4.2.0/alembic/user/alembic/script.py.mako +28 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/config.toml +17 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/config.toml.template +17 -0
- core_framework-4.2.0/core_framework/api/admin/agent/router.py +19 -0
- core_framework-4.2.0/core_framework/api/admin/agent/schemas.py +8 -0
- core_framework-4.2.0/core_framework/api/admin/entitlements/router.py +41 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/admin/router.py +4 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/comments/public/router.py +27 -2
- core_framework-4.2.0/core_framework/api/entitlements/dependencies.py +23 -0
- core_framework-4.2.0/core_framework/api/entitlements/router.py +33 -0
- core_framework-4.2.0/core_framework/api/entitlements/schemas.py +13 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/pagination.py +45 -1
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/posts/authenticated/router.py +23 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/posts/authenticated/schemas.py +6 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/posts/public/router.py +50 -13
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/posts/public/schemas.py +1 -0
- core_framework-4.2.0/core_framework/api/ratings/pagination.py +23 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/ratings/public/router.py +5 -4
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/system/router.py +21 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/users/authenticated/router.py +29 -0
- core_framework-4.2.0/core_framework/application/agent/probe.py +12 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/bootstrap.py +14 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/comments/public_service.py +25 -3
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/email/enqueue.py +4 -2
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/email/registry.py +38 -0
- core_framework-4.2.0/core_framework/application/entitlement/grant_service.py +96 -0
- core_framework-4.2.0/core_framework/application/entitlement/registry.py +140 -0
- core_framework-4.2.0/core_framework/application/entitlement/signature.py +28 -0
- core_framework-4.2.0/core_framework/application/entitlement/webhook_service.py +285 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/posts/aggregation_service.py +1 -1
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/posts/authenticated_service.py +34 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/posts/public_service.py +51 -9
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/ratings/public_service.py +11 -6
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/shared/exceptions.py +8 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/users/account_removal/contributors.py +7 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/users/account_removal/registry.py +5 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/users/account_removal/runner.py +4 -3
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/users/user_deletion_service.py +8 -2
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/bundled_alembic.py +1 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/core/exception_handlers/application.py +12 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/core/rate_limit.py +6 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/core/runtime.py +10 -5
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/core/settings.py +122 -0
- core_framework-4.2.0/core_framework/domains/agent/README.md +105 -0
- core_framework-4.2.0/core_framework/domains/agent/__init__.py +19 -0
- core_framework-4.2.0/core_framework/domains/agent/dependencies.py +168 -0
- core_framework-4.2.0/core_framework/domains/agent/models.py +54 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/comment/models.py +1 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/comment/repository.py +92 -23
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/comment/service.py +22 -5
- core_framework-4.2.0/core_framework/domains/entitlement/README.md +22 -0
- core_framework-4.2.0/core_framework/domains/entitlement/__init__.py +25 -0
- core_framework-4.2.0/core_framework/domains/entitlement/dependencies.py +88 -0
- core_framework-4.2.0/core_framework/domains/entitlement/exceptions.py +11 -0
- core_framework-4.2.0/core_framework/domains/entitlement/models.py +47 -0
- core_framework-4.2.0/core_framework/domains/entitlement/ports/revenuecat.py +48 -0
- core_framework-4.2.0/core_framework/domains/entitlement/repository.py +289 -0
- core_framework-4.2.0/core_framework/domains/entitlement/service.py +186 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/moderation/enums.py +2 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/post/README.md +16 -5
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/post/__init__.py +4 -1
- core_framework-4.2.0/core_framework/domains/post/discovery_rank.py +29 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/post/models.py +8 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/post/outcomes.py +6 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/post/repository.py +367 -37
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/post/service.py +95 -8
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/rating/models.py +1 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/rating/repository.py +16 -12
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/rating/service.py +9 -10
- core_framework-4.2.0/core_framework/infrastructure/agent/anthropic_agent_adapter.py +148 -0
- core_framework-4.2.0/core_framework/infrastructure/agent/openai_agent_adapter.py +233 -0
- core_framework-4.2.0/core_framework/infrastructure/revenuecat/revenuecat_entitlement_adapter.py +212 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/main.py +12 -1
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/worker/main.py +2 -1
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/deployments/deploy-playbook.md +11 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/deployments/e2e-smoke-tests-design.md +10 -9
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/deployments/edge-rate-limits.md +3 -1
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/deployments/host-config-defaults-design.md +26 -12
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/design/README.md +32 -25
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/design/account-removal-spine-design.md +40 -38
- core_framework-4.2.0/docs/design/bookmark-implementation.md +200 -0
- core_framework-4.2.0/docs/design/entitlement-design.md +225 -0
- core_framework-4.2.0/docs/design/entitlement-implementation.md +312 -0
- core_framework-4.2.0/docs/design/list-sort-design.md +398 -0
- core_framework-4.2.0/docs/design/list-sort-implementation.md +286 -0
- core_framework-4.2.0/docs/design/model-call-design.md +154 -0
- core_framework-4.2.0/docs/design/model-call-implementation.md +258 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/design/transactional-email-design.md +7 -5
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/README.md +4 -2
- core_framework-4.2.0/docs/domains/agent/model_call_probe.md +55 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/auth/access_control.md +4 -2
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/comments/README.md +1 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/comments/retrieve_comments.md +12 -10
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/deletion/posts.md +6 -3
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/deletion/users.md +21 -19
- core_framework-4.2.0/docs/domains/entitlement/entitlements.md +191 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/moderation/moderator_actions.md +2 -1
- core_framework-4.2.0/docs/domains/notifications/inbox-hint-design.md +124 -0
- core_framework-4.2.0/docs/domains/notifications/inbox-hint-implementation.md +102 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/posts/README.md +8 -0
- core_framework-4.2.0/docs/domains/posts/bookmark-design.md +97 -0
- core_framework-4.2.0/docs/domains/posts/bookmark.md +165 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/posts/hashtag_discovery.md +5 -4
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/posts/post_stats_aggregation.md +2 -1
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/posts/retrieve_posts.md +14 -12
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/ratings/README.md +1 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/ratings/rating-design.md +3 -3
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/ratings/retrieve_ratings.md +4 -4
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/users/my_posts_and_comments.md +6 -6
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/library/api.md +18 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/library/capability-wiring.md +70 -12
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/library/overview.md +3 -1
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/library/package-api.md +62 -2
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/library/workers.md +1 -1
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/platform/architecture-decisions.md +121 -4
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/platform/client-error-visibility.md +16 -14
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/platform/conventions.md +14 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/platform/glossary.md +49 -1
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/todo.md +1 -3
- {core_framework-4.0.1 → core_framework-4.2.0}/pyproject.toml +7 -2
- {core_framework-4.0.1 → core_framework-4.2.0}/tach.toml +17 -0
- core_framework-4.2.0/tests/e2e/smoke/agent_probe_test.py +47 -0
- core_framework-4.2.0/tests/integration/api/list_sort_integration_test.py +448 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/posts/authenticated/post_writes_integration_test.py +2 -0
- core_framework-4.2.0/tests/integration/api/posts/bookmark_integration_test.py +327 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/rate_limit_test.py +27 -0
- core_framework-4.2.0/tests/unit/api/ratings/review_pagination_test.py +54 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/unit/docs/api_routes_test.py +22 -8
- {core_framework-4.0.1 → core_framework-4.2.0}/uv.lock +2034 -10
- core_framework-4.0.1/core_framework/api/ratings/pagination.py +0 -37
- {core_framework-4.0.1 → core_framework-4.2.0}/.agents/skills/fastapi +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/.agents/skills/library-skills/.library-skills.json +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/.agents/skills/library-skills/SKILL.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/.cursor/rules/alembic-migrations.mdc +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/.cursor/rules/api-layer.mdc +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/.cursor/rules/api-reference-docs.mdc +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/.cursor/rules/api-validation.mdc +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/.cursor/rules/application-layer.mdc +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/.cursor/rules/constants-final.mdc +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/.cursor/rules/constitution.mdc +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/.cursor/rules/database-triggers.mdc +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/.cursor/rules/docstrings.mdc +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/.cursor/rules/domain-caller-context.mdc +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/.cursor/rules/domain-imports.mdc +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/.cursor/rules/domain-input-guards.mdc +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/.cursor/rules/domain-repository-exceptions.mdc +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/.cursor/rules/domain-services-and-adapters.mdc +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/.cursor/rules/error-boundary.mdc +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/.cursor/rules/flow-documentation.mdc +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/.cursor/rules/ignore-analytics-warehouse.mdc +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/.cursor/rules/inline-raise-messages.mdc +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/.cursor/rules/integration-test-strategy.mdc +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/.cursor/rules/layer-boundaries.mdc +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/.cursor/rules/no-code-in-docs.mdc +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/.cursor/rules/postgres-config-conventions.mdc +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/.cursor/rules/repository-schema-isolation.mdc +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/.cursor/rules/strong-reads.mdc +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/.cursor/rules/structured-logging.mdc +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/.cursor/skills/add-config/SKILL.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/.cursor/skills/add-domain/SKILL.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/.cursor/skills/design-review/SKILL.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/.cursor/skills/fastapi +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/.cursor/skills/grill/SKILL.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/.cursor/skills/implement-feature/SKILL.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/.cursor/skills/recommend-features/SKILL.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/.cursor/skills/sync-host-rules/SKILL.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/.cursor/skills/write-flow-doc/SKILL.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/.dockerignore +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/.github/ci/package-lock.json +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/.github/ci/package-smoke.sh +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/.github/ci/package.json +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/.github/ci/package_smoke.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/.github/workflows/manual-observability-deployment.yaml +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/.github/workflows/publish-pypi.yml +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/.github/workflows/test.yaml +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/.gitignore +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/.pre-commit-config.yaml +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/.python-version +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/LICENSE +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/README.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/alembic/analytics/alembic/README +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/alembic/analytics/alembic/env.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/alembic/analytics/alembic/script.py.mako +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/alembic/analytics/alembic/versions/2d61a5e88d76_analytics_utm_events_add_kind.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/alembic/analytics/alembic/versions/585105e1149e_analytics_add_utm_events.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/alembic/analytics/alembic/versions/5b9ac98bb150_analytics_daily_fact.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/alembic/analytics/alembic/versions/7f2a9c1d4e8b_analytics_daily_fact_day_index.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/alembic/analytics/alembic.ini +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/alembic/comment/alembic/README +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/alembic/comment/alembic/env.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/alembic/comment/alembic/script.py.mako +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/alembic/comment/alembic/versions/comment_add_comment_attachments.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/alembic/comment/alembic/versions/comment_add_comment_create_idempotency.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/alembic/comment/alembic/versions/comment_add_comment_create_idempotency_created_at_index.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/alembic/comment/alembic/versions/comment_add_comment_mentions.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/alembic/comment/alembic/versions/comment_subject_kind_varchar.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/alembic/comment/alembic/versions/comment_tombstone_status_model.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/alembic/comment/alembic/versions/v1_comment_init_baseline.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/alembic/comment/alembic.ini +0 -0
- {core_framework-4.0.1/alembic/extension → core_framework-4.2.0/alembic/entitlement}/alembic/README +0 -0
- {core_framework-4.0.1/alembic/extension → core_framework-4.2.0/alembic/entitlement}/alembic/script.py.mako +0 -0
- {core_framework-4.0.1/alembic/media → core_framework-4.2.0/alembic/entitlement}/alembic.ini +0 -0
- {core_framework-4.0.1/alembic/media → core_framework-4.2.0/alembic/extension}/alembic/README +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/alembic/extension/alembic/env.py +0 -0
- {core_framework-4.0.1/alembic/media → core_framework-4.2.0/alembic/extension}/alembic/script.py.mako +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/alembic/extension/alembic/versions/v1_ext_init_baseline.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/alembic/extension/alembic.ini +0 -0
- {core_framework-4.0.1/alembic/moderation → core_framework-4.2.0/alembic/media}/alembic/README +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/alembic/media/alembic/env.py +0 -0
- {core_framework-4.0.1/alembic/moderation → core_framework-4.2.0/alembic/media}/alembic/script.py.mako +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/alembic/media/alembic/versions/media_add_attachment_staging_registry.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/alembic/media/alembic/versions/media_add_banner_staging_and_lease.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/alembic/media/alembic/versions/media_attachment_staging_registry_published_at.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/alembic/media/alembic/versions/v1_media_init_baseline.py +0 -0
- {core_framework-4.0.1/alembic/notification → core_framework-4.2.0/alembic/media}/alembic.ini +0 -0
- {core_framework-4.0.1/alembic/notification → core_framework-4.2.0/alembic/moderation}/alembic/README +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/alembic/moderation/alembic/env.py +0 -0
- {core_framework-4.0.1/alembic/notification → core_framework-4.2.0/alembic/moderation}/alembic/script.py.mako +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/alembic/moderation/alembic/versions/3027828c2c80_align_dead_outbox_keyset_index.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/alembic/moderation/alembic/versions/5be85718122a_moderation_add_review_reports.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/alembic/moderation/alembic/versions/moderation_add_event_outbox.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/alembic/moderation/alembic/versions/moderation_add_event_outbox_dead_indexes.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/alembic/moderation/alembic/versions/moderation_add_event_outbox_pending_created_at_index.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/alembic/moderation/alembic/versions/v1_mod_init_baseline.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/alembic/moderation/alembic.ini +0 -0
- {core_framework-4.0.1/alembic/post → core_framework-4.2.0/alembic/notification}/alembic/README +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/alembic/notification/alembic/env.py +0 -0
- {core_framework-4.0.1/alembic/post → core_framework-4.2.0/alembic/notification}/alembic/script.py.mako +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/alembic/notification/alembic/versions/2fdd68777706_notification_read_at_retention_index.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/alembic/notification/alembic/versions/a5f29155815d_notification_add_friendship_types.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/alembic/notification/alembic/versions/b1263ed1a303_notification_inbox_redesign_preview.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/alembic/notification/alembic/versions/c6b9941065ec_notification_add_group_invite_type.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/alembic/notification/alembic/versions/fbe8476b4437_notification_add_rating_owner_cue_labels.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/alembic/notification/alembic/versions/v1_notif_init_baseline.py +0 -0
- {core_framework-4.0.1/alembic/rating → core_framework-4.2.0/alembic/notification}/alembic.ini +0 -0
- {core_framework-4.0.1/alembic/rating → core_framework-4.2.0/alembic/post}/alembic/README +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/alembic/post/alembic/env.py +0 -0
- {core_framework-4.0.1/alembic/rating → core_framework-4.2.0/alembic/post}/alembic/script.py.mako +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/alembic/post/alembic/versions/post_add_post_attachments.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/alembic/post/alembic/versions/post_add_post_create_idempotency.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/alembic/post/alembic/versions/post_add_post_create_idempotency_created_at_index.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/alembic/post/alembic/versions/post_add_post_mentions.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/alembic/post/alembic/versions/post_post_views_retention_high_water_mark.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/alembic/post/alembic/versions/post_tombstone_status_model.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/alembic/post/alembic/versions/v1_post_init_baseline.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/alembic/post/alembic.ini +0 -0
- {core_framework-4.0.1/alembic/user → core_framework-4.2.0/alembic/rating}/alembic/README +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/alembic/rating/alembic/env.py +0 -0
- {core_framework-4.0.1/alembic/user → core_framework-4.2.0/alembic/rating}/alembic/script.py.mako +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/alembic/rating/alembic/versions/04182d734619_rating_list_indexes.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/alembic/rating/alembic/versions/2ef924b0be4c_rating_schema.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/alembic/user/alembic/env.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/alembic/user/alembic/versions/24ba262c4ef2_user_add_account_removal_started_at.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/alembic/user/alembic/versions/2dc1d398a840_user_add_groups.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/alembic/user/alembic/versions/44df70a45ba6_user_add_signup_events.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/alembic/user/alembic/versions/7078e4313554_user_add_friendships.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/alembic/user/alembic/versions/922eece707db_align_dead_outbox_keyset_index.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/alembic/user/alembic/versions/user_add_avatar_ingest_sequences.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/alembic/user/alembic/versions/user_add_banner_ingest_sequences.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/alembic/user/alembic/versions/user_add_date_of_birth_to_profiles.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/alembic/user/alembic/versions/user_add_event_outbox.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/alembic/user/alembic/versions/user_add_event_outbox_dead_indexes.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/alembic/user/alembic/versions/user_add_event_outbox_pending_created_at_index.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/alembic/user/alembic/versions/user_reserve_sentinel_user_ids.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/alembic/user/alembic/versions/v1_user_init_baseline.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/alembic/user/alembic.ini +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/admin/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/admin/analytics/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/admin/analytics/router.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/admin/analytics/schemas.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/admin/cache/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/admin/cache/router.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/admin/cache/schemas.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/admin/comments/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/admin/comments/router.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/admin/comments/schemas.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/admin/moderation/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/admin/moderation/router.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/admin/moderation/schemas.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/admin/outbox/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/admin/outbox/router.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/admin/outbox/schemas.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/admin/posts/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/admin/posts/router.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/admin/posts/schemas.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/admin/ratings/router.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/admin/ratings/schemas.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/admin/users/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/admin/users/router.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/admin/users/schemas.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/attachments/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/attachments/router.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/attachments/schemas.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/auth/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/auth/router.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/auth/schemas.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/comments/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/comments/authenticated/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/comments/authenticated/mappers.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/comments/authenticated/router.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/comments/authenticated/schemas.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/comments/public/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/comments/public/schemas.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/comments/router.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/comments/schemas.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/dependencies.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/events/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/events/router.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/events/schemas.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/groups/router.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/groups/schemas.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/idempotency/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/idempotency/dependencies.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/ingest_guards.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/notifications/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/notifications/authenticated/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/notifications/authenticated/router.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/notifications/authenticated/schemas.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/notifications/router.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/posts/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/posts/authenticated/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/posts/authenticated/mappers.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/posts/public/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/posts/router.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/posts/schemas.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/ratings/authenticated/router.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/ratings/router.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/ratings/schemas.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/router.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/schemas.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/system/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/upload.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/users/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/users/authenticated/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/users/authenticated/mappers.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/users/authenticated/schemas.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/users/public/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/users/public/router.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/users/public/schemas.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/users/router.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/users/shared/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/users/shared/mappers.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/api/users/shared/schemas.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/analytics/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/analytics/bucket_service.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/analytics/prune_service.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/analytics/read_service.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/analytics/refresh_service.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/analytics/registry.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/analytics/sources/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/analytics/sources/comment_created.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/analytics/sources/post_created.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/analytics/sources/post_viewed.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/analytics/sources/user_registered.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/auth/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/auth/access_service.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/auth/auth_service.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/auth/models.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/auth/token_verification.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/cache/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/cache/invalidate_service.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/cache/models.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/comments/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/comments/admin_service.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/comments/aggregation_service.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/comments/authenticated_service.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/comments/cleanup_service.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/comments/host_service.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/comments/kind_registry.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/comments/post_subject.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/comments/rating_subject.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/email/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/email/account_deletion_scheduled.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/email/send.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/events/README.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/events/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/events/event_service.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/events/event_token.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/events/models.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/events/utm_capture_kinds.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/groups/authenticated_service.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/groups/cleanup_service.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/groups/group_invite_link_token.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/groups/strip_service.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/media/README.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/media/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/media/attachment_read.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/media/attachment_service.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/media/avatar_service.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/media/banner_service.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/media/read_url_config.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/moderation/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/moderation/appeal_service.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/moderation/moderator_service.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/moderation/report_service.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/moderation/restriction_fanout/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/moderation/restriction_fanout/heals.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/moderation/restriction_fanout/mirrors.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/moderation/restriction_fanout/reactions.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/moderation/restriction_fanout/registry.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/moderation/restriction_fanout/runner.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/moderation/scheduled_service.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/moderation/user_service.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/notifications/README.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/notifications/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/notifications/enums.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/notifications/friendship_notification_service.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/notifications/group_invite_notification_service.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/notifications/inbox_service.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/notifications/mute_service.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/notifications/notification_service.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/notifications/preview.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/notifications/prune_service.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/notifications/wipe_service.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/outbox/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/outbox/block_mirrors.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/outbox/events.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/outbox/exceptions.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/outbox/follow_mirrors.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/outbox/handlers.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/outbox/ops_service.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/outbox/polling_service.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/outbox/processing_service.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/outbox/restriction_mirrors.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/posts/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/posts/admin_service.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/posts/cleanup_service.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/ratings/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/ratings/admin_service.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/ratings/aggregation_service.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/ratings/authenticated_service.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/ratings/kind_registry.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/ratings/purge_service.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/ratings/serialization.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/ratings/subject_existence.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/shared/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/shared/deletion_cleanup_ledger.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/shared/enums.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/shared/request_context.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/shared/worker_jobs.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/users/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/users/account_removal/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/users/admin_service.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/users/aggregation_service.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/users/authenticated_service.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/users/deletion_audit.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/users/enums.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/users/identity_enrichment.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/users/public_service.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/application/users/scheduled_service.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/asgi.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/constants.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/core/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/core/cache.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/core/context.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/core/database.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/core/exception_handlers/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/core/exception_handlers/common.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/core/exception_handlers/setup.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/core/exceptions.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/core/firebase.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/core/http_client.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/core/http_probes.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/core/logging.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/core/middleware.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/core/observability.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/core/pagination.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/core/process.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/core/redis.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/analytics/README.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/analytics/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/analytics/constants.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/analytics/dependencies.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/analytics/exceptions.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/analytics/models.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/analytics/ports/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/analytics/ports/activity_source.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/analytics/repository.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/analytics/service.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/auth/README.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/auth/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/auth/dependencies.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/auth/exceptions.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/auth/models.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/auth/outcomes.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/auth/ports/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/auth/ports/auth.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/auth/service.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/comment/README.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/comment/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/comment/constants.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/comment/dependencies.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/comment/enums.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/comment/exceptions.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/comment/outcomes.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/comment/ports/subject.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/email/README.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/email/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/email/dependencies.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/email/exceptions.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/email/models.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/email/ports/send.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/email/service.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/exceptions.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/media/README.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/media/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/media/attachment/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/media/attachment/components/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/media/attachment/components/finals_publisher.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/media/attachment/components/staging.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/media/attachment/components/variant_encoder.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/media/attachment/constants.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/media/attachment/exceptions.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/media/attachment/models.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/media/attachment/ports/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/media/attachment/ports/finals_publisher.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/media/attachment/ports/staging.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/media/attachment/ports/variant_encoder.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/media/attachment/service.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/media/avatar/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/media/avatar/components/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/media/avatar/components/finals_publisher.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/media/avatar/components/staging.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/media/avatar/components/variant_encoder.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/media/avatar/constants.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/media/avatar/exceptions.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/media/avatar/models.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/media/avatar/ports/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/media/avatar/ports/finals_publisher.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/media/avatar/ports/staging.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/media/avatar/ports/variant_encoder.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/media/avatar/service.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/media/banner/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/media/banner/components/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/media/banner/components/finals_publisher.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/media/banner/components/staging.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/media/banner/components/variant_encoder.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/media/banner/constants.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/media/banner/exceptions.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/media/banner/models.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/media/banner/ports/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/media/banner/ports/finals_publisher.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/media/banner/ports/staging.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/media/banner/ports/variant_encoder.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/media/banner/service.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/media/dependencies.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/media/shared/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/media/shared/constants.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/media/shared/exceptions.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/media/shared/outcomes.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/media/shared/repository.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/media/shared/utils.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/moderation/README.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/moderation/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/moderation/dependencies.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/moderation/exceptions.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/moderation/models.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/moderation/outbox_repository.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/moderation/outbox_service.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/moderation/outcomes.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/moderation/repository.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/moderation/service.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/notification/README.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/notification/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/notification/dependencies.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/notification/enums.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/notification/exceptions.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/notification/models.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/notification/repository.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/notification/service.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/outbox/README.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/outbox/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/outbox/dependencies.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/outbox/exceptions.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/outbox/models.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/outbox/ports/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/outbox/ports/admin.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/outbox/ports/consumer.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/outbox/ports/producer.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/outbox/service.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/post/constants.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/post/dependencies.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/post/enums.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/post/exceptions.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/rating/README.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/rating/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/rating/constants.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/rating/dependencies.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/rating/exceptions.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/rating/outcomes.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/rating/ports/subject_existence.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/repository_sql.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/user/README.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/user/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/user/constants.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/user/dependencies.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/user/enums.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/user/exceptions.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/user/group_repository.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/user/group_service.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/user/models.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/user/outbox_repository.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/user/outbox_service.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/user/outcomes.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/user/repository.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/user/service.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/user/utils.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/domains/utils.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/infrastructure/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/infrastructure/email/resend_email_adapter.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/infrastructure/firebase/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/infrastructure/firebase/firebase_auth_adapter.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/infrastructure/media/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/infrastructure/media/attachment_staging_display_geometry.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/infrastructure/media/local_attachment_staging_adapter.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/infrastructure/media/local_avatar_staging_adapter.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/infrastructure/media/local_banner_staging_adapter.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/infrastructure/media/pillow_attachment_variant_encoder_adapter.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/infrastructure/media/pillow_avatar_variant_encoder_adapter.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/infrastructure/media/pillow_banner_variant_encoder_adapter.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/infrastructure/media/pillow_staging_image.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/infrastructure/media/ssh_attachment_finals_publisher_adapter.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/infrastructure/media/ssh_banner_finals_publisher_adapter.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/infrastructure/media/ssh_finals_publisher_adapter.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/infrastructure/media/staging_paths.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/infrastructure/outbox/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/infrastructure/outbox/outbox_consumer_adapter.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/infrastructure/outbox/outbox_producer_adapter.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/migrate_cli.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/py.typed +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/testing/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/testing/arq.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/testing/auth.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/testing/blockbuster.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/testing/config.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/testing/containers.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/testing/firebase.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/testing/firebase_identity_toolkit.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/testing/hookspecs.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/testing/httpx_test_client.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/testing/media.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/testing/migrations.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/testing/plugin.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/worker/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/worker/schedules/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/worker/schedules/analytics_refresh_cron.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/worker/schedules/schedule_aggregate_comment_stats.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/worker/schedules/schedule_aggregate_post_stats.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/worker/schedules/schedule_aggregate_rating_stats.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/worker/schedules/schedule_aggregate_rating_subject_stats.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/worker/schedules/schedule_aggregate_user_stats.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/worker/schedules/schedule_expired_account_deletions.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/worker/schedules/schedule_expired_mute_lifts.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/worker/schedules/schedule_poll_outbox.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/worker/schedules/schedule_prune_analytics_daily_facts.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/worker/schedules/schedule_prune_post_views.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/worker/schedules/schedule_prune_read_notifications.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/worker/schedules/schedule_purge_expired_create_idempotency_keys.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/worker/schedules/schedule_purge_expired_group_invites.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/worker/schedules/schedule_refresh_analytics.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/worker/schedules/schedule_restriction_heals.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/worker/schedules/schedule_sweep_stale_attachment_staging.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/worker/schedules/schedule_sweep_stale_avatar_staging.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/worker/schedules/schedule_sweep_stale_banner_staging.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/worker/tasks/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/worker/tasks/delete_attachment_finals.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/worker/tasks/delete_superseded_avatar_finals.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/worker/tasks/delete_superseded_banner_finals.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/worker/tasks/process_account_deletion.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/worker/tasks/process_account_deletion_scheduled_email.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/worker/tasks/process_admin_user_deletion.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/worker/tasks/process_aggregate_comment_stats.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/worker/tasks/process_aggregate_post_stats.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/worker/tasks/process_aggregate_rating_stats.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/worker/tasks/process_aggregate_rating_subject_stats.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/worker/tasks/process_aggregate_user_stats.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/worker/tasks/process_attachment_asset_variants.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/worker/tasks/process_banner_asset_variants.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/worker/tasks/process_block_notification_wipe.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/worker/tasks/process_cache_pattern_invalidation.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/worker/tasks/process_comment_tombstone_cleanup.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/worker/tasks/process_destructive_comment_delete.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/worker/tasks/process_destructive_post_delete.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/worker/tasks/process_friendship_pair_notification_wipe.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/worker/tasks/process_group_invite_notification_wipe.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/worker/tasks/process_media_asset_variants.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/worker/tasks/process_mute_lift.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/worker/tasks/process_outbox_row.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/worker/tasks/process_post_private_notification_wipe.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/worker/tasks/process_post_tombstone_cleanup.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/worker/tasks/process_refresh_analytics_bucket.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/worker/tasks/process_restriction_reactions.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/worker/tasks/process_transactional_email.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/worker/tasks/process_user_content_deletion.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/core_framework/worker/worker_context.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/deploy/README.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/deploy/app/docker-compose.dev.yaml +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/deploy/app/docker-compose.yml +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/deploy/app/dockerfile +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/deploy/observability/.env.example +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/deploy/observability/README.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/deploy/observability/docker-compose.yml +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/deploy/observability/grafana/dashboards/application/api-http.json +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/deploy/observability/grafana/dashboards/application/worker-jobs.json +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/deploy/observability/grafana/dashboards/infrastructure/node-exporter.json +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/deploy/observability/grafana/dashboards/infrastructure/postgres-exporter.json +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/deploy/observability/grafana/dashboards/infrastructure/redis-exporter.json +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/deploy/observability/grafana/provisioning/dashboards/dashboards.yml +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/deploy/observability/grafana/provisioning/datasources/datasources.yml +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/deploy/observability/loki.yaml +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/deploy/observability/otel-collector-config.yaml +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/deploy/observability/prometheus.yml +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/deploy/observability/targets/node/.gitkeep +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/deploy/observability/targets/postgres/.gitkeep +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/deploy/observability/targets/redis/.gitkeep +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/deploy/observability/targets.default/node.yml +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/deploy/observability/targets.default/postgres.yml +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/deploy/observability/targets.default/redis.yml +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/deploy/observability/targets.example/README.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/deploy/observability/tempo.yaml +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/README.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/deployments/README.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/deployments/edge-upload-limits.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/deployments/examples/Caddyfile.example +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/deployments/examples/Caddyfile.observability.example +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/deployments/examples/image-server-known-hosts.example +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/deployments/guides/playbook/postgres-backup-playbook.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/deployments/guides/playbook/py-spy-playbook.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/deployments/guides/setup/app-server-deploy-ssh.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/deployments/guides/setup/caddy-setup.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/deployments/guides/setup/cloudflare-setup.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/deployments/guides/setup/image-server-ssh.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/deployments/guides/setup/observability-lgtm-setup.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/deployments/guides/setup/postgres-backup-setup.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/deployments/guides/setup/postgres-setup.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/deployments/guides/setup/py-spy-setup.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/deployments/guides/setup/redis-setup.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/deployments/guides/setup/ubuntu-server-setup.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/deployments/host-config-defaults-implementation.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/deployments/postgres-backup-design.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/deployments/release-playbook.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/design/account-removal-spine-implementation.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/design/analytics-rollup-design.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/design/analytics-warehouse-design.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/design/cache-invalidation-design.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/design/comment-subject-kinds-design.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/design/create-idempotency-design.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/design/event-outbox-design.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/design/events-ingest-design.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/design/media-cpu-off-api-refactor.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/design/media-storage-topology.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/design/moderation-restriction-fanout-design.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/design/moderation-restriction-fanout-implementation.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/design/moderator-surfaces-design.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/design/moderator-surfaces-implementation.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/design/observability-lgtm-design.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/design/outbox-admin-ops-design.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/design/rating-implementation-plan.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/design/rating-thread-owner-cue-design.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/design/rating-thread-owner-cue-implementation.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/design/restriction-and-block-visibility-design.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/design/restriction-and-block-visibility-implementation.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/design/utm-events-design.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/analytics/admin_analytics_reads.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/auth/registration.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/cache/admin_cache_invalidation.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/comments/admin_comments.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/comments/comment_like.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/comments/comment_report.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/comments/comment_stats_aggregation.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/comments/create_comment.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/comments/delete_comment.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/comments/edit_comment.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/deletion/comments.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/deletion/overview.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/deletion/ratings.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/events/events.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/media/README.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/media/attachment_upload.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/media/avatar-upload-design.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/media/banner-upload-design.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/media/post-comment-attachments-design.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/media/upload-pipeline-design.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/media/upload_pipeline.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/mentions/mentions_in_content.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/moderation/README.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/moderation/appeals.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/moderation/internal_notes.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/moderation/reports.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/moderation/restrictions.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/notifications/inbox-redesign-design.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/notifications/notification_inbox.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/outbox/admin_outbox_ops.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/posts/admin_posts.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/posts/author_context.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/posts/create_post.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/posts/delete_post.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/posts/edit_post.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/posts/post_like.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/posts/post_report.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/posts/post_visibility.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/ratings/admin_ratings.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/ratings/delete_rating.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/ratings/edit_rating.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/ratings/rating_report.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/ratings/rating_stats_aggregation.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/ratings/rating_upvote.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/ratings/upsert_rating.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/users/account.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/users/account_deletion.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/users/admin_users.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/users/avatar.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/users/banner.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/users/blocks.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/users/change_history.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/users/check_username_exists.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/users/follow-system-design.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/users/follow.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/users/friendship-system-design.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/users/friendship.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/users/groups-system-design.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/users/groups.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/users/preferences.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/users/profile.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/users/public_profile.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/users/user_removal.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/users/user_stats_aggregation.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/domains/users/username_suggest.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/library/README.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/library/core-framework-migration.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/library/testing-plugin-design.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/platform/README.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/platform/database-triggers.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/platform/domain-services-and-adapters.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/platform/layers-and-boundaries.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/platform/patch-update-typed-payload.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/platform/response-composition-and-caching.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/reviews/README.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/reviews/log.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/reviews/review-playbook.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/reviews/slices.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/docs/testing.md +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/firebase_config.example.json +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/makefile +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/conftest.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/e2e/_auth.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/e2e/_canaries.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/e2e/_media.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/e2e/_settings.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/e2e/_upload_payloads.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/e2e/conftest.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/e2e/media/pipeline_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/e2e/smoke/canary_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/e2e/smoke/media_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/e2e/smoke/system_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/e2e/smoke/tls_host_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/_http_error_details.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/_poll.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/analytics/_helpers.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/_auth_helpers.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/_destructive_delete_helpers.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/_http_helpers.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/_outbox_helpers.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/_user_deletion_helpers.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/_user_helpers.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/admin/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/admin/_auth_cases.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/admin/analytics/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/admin/analytics/router_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/admin/cache/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/admin/cache/router_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/admin/comments/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/admin/comments/router_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/admin/moderation/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/admin/moderation/router_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/admin/moderator_surfaces_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/admin/outbox/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/admin/outbox/router_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/admin/posts/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/admin/posts/router_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/admin/users/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/admin/users/router_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/attachments/_helpers.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/attachments/attachment_upload_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/attachments/conftest.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/auth/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/auth/router_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/comments/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/comments/authenticated/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/comments/authenticated/comment_writes_integration_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/comments/comment_attachments_integration_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/comments/comment_kind_registry_integration_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/comments/public/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/comments/public/router_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/create_idempotency_integration_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/events/router_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/groups/groups_integration_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/media/ingest_contract_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/mentions/mentions_integration_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/notifications/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/notifications/inbox_redesign_integration_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/notifications/router_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/posts/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/posts/comment_count_aggregation_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/posts/followers_visibility_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/posts/post_attachments_integration_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/posts/post_deletion_integration_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/posts/post_stats_dirty_marking_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/posts/public/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/posts/public/router_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/public_read_by_id_unavailable_detail_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/ratings/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/ratings/_helpers.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/ratings/conftest.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/ratings/ratings_integration_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/ratings/ratings_visibility_integration_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/restriction_visibility_integration_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/system/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/system/router_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/users/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/users/account_deletion_email_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/users/authenticated/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/users/authenticated/friendship_integration_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/users/authenticated/profile_media_upload_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/users/authenticated/router_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/users/deletion_audit_integration_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/users/public/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/users/public/router_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/api/users/user_deletion_integration_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/conftest.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/worker/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/worker/_aggregate_stats_helpers.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/worker/_arq_helpers.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/worker/_media_upload_helpers.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/worker/account_deletion_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/worker/aggregate_comment_stats_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/worker/aggregate_post_stats_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/worker/aggregate_user_stats_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/worker/analytics_prune_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/worker/analytics_refresh_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/worker/attachment_upload_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/worker/conftest.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/worker/create_idempotency_retention_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/worker/moderation_outbox_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/worker/mute_lift_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/worker/profile_media_upload_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/worker/read_notifications_retention_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/worker/restriction_fanout_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/worker/stale_staging_sweep_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/integration/worker/user_outbox_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/unit/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/unit/api/comments/authenticated/comment_request_schemas_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/unit/api/dedupe_preserving_order_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/unit/api/posts/authenticated/post_update_mapper_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/unit/api/users/profile_update_mapper_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/unit/application/comments/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/unit/application/comments/kind_registry_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/unit/application/email/account_deletion_scheduled_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/unit/application/events/event_service_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/unit/application/moderation/restriction_fanout_registry_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/unit/application/notifications/preview_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/unit/application/ratings/kind_registry_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/unit/application/shared/request_context_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/unit/application/users/account_removal_registry_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/unit/application/users/account_removal_runner_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/unit/application/users/deletion_audit_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/unit/core/bundled_alembic_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/unit/core/migrate_cli_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/unit/core/pagination_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/unit/docs/_api_reference.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/unit/domains/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/unit/domains/comment/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/unit/domains/post/models_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/unit/domains/user/service_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/unit/infrastructure/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/unit/infrastructure/media/__init__.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/unit/infrastructure/media/ssh_finals_publisher_adapter_test.py +0 -0
- {core_framework-4.0.1 → core_framework-4.2.0}/tests/unit/worker/tasks_registration_test.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
../../.venv/lib/python3.14/site-packages/pydantic_ai/.agents/skills/building-pydantic-ai-agents
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
../../.agents/skills/building-pydantic-ai-agents
|
|
@@ -28,12 +28,23 @@ Do **not** flag documented accepted trade-offs in **`docs/platform/architecture-
|
|
|
28
28
|
|
|
29
29
|
**Spec sources** (first that applies): docs the user named; design/flow docs the change clearly belongs to; matching `docs/design/*-design.md` / `docs/domains/**/*-design.md` plus the paired flow doc. If none exist, skip this check — do not mention that there is no spec.
|
|
30
30
|
|
|
31
|
+
## Reachability and impact
|
|
32
|
+
|
|
33
|
+
Before keeping a race, edge case, or error-path finding, state who can trigger it and what it harms. Severity follows both.
|
|
34
|
+
|
|
35
|
+
- **Who triggers it:** a correct client, a buggy client, or a deliberate caller (attacker).
|
|
36
|
+
- **What it harms:** data corruption or lost writes; another user's data or existence (trust boundary); availability beyond what ordinary requests already allow; or only the caller's own request failing.
|
|
37
|
+
|
|
38
|
+
**Drop** a finding when the only trigger is the caller's own invalid or contradictory request and the only outcome is that request failing, even with the wrong status (e.g. a deadlock that needs an illegal request to collide with a legal one, where the illegal one was already going to fail). Mention it only if the user asks for edge cases.
|
|
39
|
+
|
|
40
|
+
**Keep** deliberate-caller findings that cross a trust boundary (another user's rows, enumeration, auth bypass) or give an attacker more load or disruption than ordinary requests allow. Do not drop a finding just because a correct client would not hit it.
|
|
41
|
+
|
|
31
42
|
## Output format (required)
|
|
32
43
|
|
|
33
44
|
**Actionable findings only**, under `## Findings`:
|
|
34
45
|
|
|
35
46
|
- Bugs, wrong behavior, improvements, optimizations, doc/code contradictions, parallel implementation drift (sibling flows that diverge without documented reason), **Residue** after an implementation or refactor, spec gaps / extras / mismatches.
|
|
36
|
-
- One numbered list, prioritized by severity. Each item: file context, what is wrong, fix direction.
|
|
47
|
+
- One numbered list, prioritized by severity (see **Reachability and impact**). Each item: file context, what is wrong, who can trigger it, fix direction.
|
|
37
48
|
- **Do not** praise, summarize strengths, pad with checklist pass narratives, or emit empty-axis sentences.
|
|
38
49
|
- One-line scope is fine. If there is nothing to address, say so in one sentence — no `## Findings` heading.
|
|
39
50
|
|
|
@@ -22,6 +22,14 @@ on:
|
|
|
22
22
|
required: false
|
|
23
23
|
EMAIL_API_KEY:
|
|
24
24
|
required: false
|
|
25
|
+
AGENT_OPENAI_API_KEY:
|
|
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
|
|
25
33
|
FIREBASE_CONFIG:
|
|
26
34
|
required: true
|
|
27
35
|
IMAGE_SERVER_SSH_PRIVATE_KEY:
|
|
@@ -98,6 +106,18 @@ jobs:
|
|
|
98
106
|
EMAIL_API_KEY: ${{ secrets.EMAIL_API_KEY }}
|
|
99
107
|
EMAIL_FROM_ADDRESS: ${{ vars.EMAIL_FROM_ADDRESS }}
|
|
100
108
|
EMAIL_FROM_NAME: ${{ vars.EMAIL_FROM_NAME }}
|
|
109
|
+
AGENT_ENABLED: ${{ vars.AGENT_ENABLED || 'false' }}
|
|
110
|
+
AGENT_PROVIDER: ${{ vars.AGENT_PROVIDER || 'openai' }}
|
|
111
|
+
AGENT_MODEL: ${{ vars.AGENT_MODEL }}
|
|
112
|
+
AGENT_OPENAI_API_KEY: ${{ secrets.AGENT_OPENAI_API_KEY }}
|
|
113
|
+
AGENT_OPENAI_BASE_URL: ${{ vars.AGENT_OPENAI_BASE_URL }}
|
|
114
|
+
AGENT_ANTHROPIC_API_KEY: ${{ secrets.AGENT_ANTHROPIC_API_KEY }}
|
|
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 }}
|
|
101
121
|
run: |
|
|
102
122
|
set -euo pipefail
|
|
103
123
|
|
|
@@ -121,7 +121,7 @@ jobs:
|
|
|
121
121
|
needs: [app-docker, worker-docker]
|
|
122
122
|
permissions:
|
|
123
123
|
contents: read
|
|
124
|
-
uses:
|
|
124
|
+
uses: $/.github/workflows/_deploy.yml
|
|
125
125
|
with:
|
|
126
126
|
env_name: development
|
|
127
127
|
dockerhub_username: ${{ vars.DOCKERHUB_USERNAME }}
|
|
@@ -130,6 +130,10 @@ jobs:
|
|
|
130
130
|
WRITE_POSTGRES_PASSWORD: ${{ secrets.WRITE_POSTGRES_PASSWORD }}
|
|
131
131
|
READ_POSTGRES_PASSWORD: ${{ secrets.READ_POSTGRES_PASSWORD }}
|
|
132
132
|
EMAIL_API_KEY: ${{ secrets.EMAIL_API_KEY }}
|
|
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 }}
|
|
133
137
|
FIREBASE_CONFIG: ${{ secrets.FIREBASE_CONFIG }}
|
|
134
138
|
IMAGE_SERVER_SSH_PRIVATE_KEY: ${{ secrets.IMAGE_SERVER_SSH_PRIVATE_KEY }}
|
|
135
139
|
IMAGE_SERVER_KNOWN_HOSTS: ${{ secrets.IMAGE_SERVER_KNOWN_HOSTS }}
|
|
@@ -36,7 +36,7 @@ jobs:
|
|
|
36
36
|
needs: validate
|
|
37
37
|
permissions:
|
|
38
38
|
contents: read
|
|
39
|
-
uses:
|
|
39
|
+
uses: $/.github/workflows/_deploy.yml
|
|
40
40
|
with:
|
|
41
41
|
env_name: ${{ inputs.environment }}
|
|
42
42
|
dockerhub_username: ${{ vars.DOCKERHUB_USERNAME }}
|
|
@@ -46,6 +46,10 @@ jobs:
|
|
|
46
46
|
WRITE_POSTGRES_PASSWORD: ${{ secrets.WRITE_POSTGRES_PASSWORD }}
|
|
47
47
|
READ_POSTGRES_PASSWORD: ${{ secrets.READ_POSTGRES_PASSWORD }}
|
|
48
48
|
EMAIL_API_KEY: ${{ secrets.EMAIL_API_KEY }}
|
|
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 }}
|
|
49
53
|
FIREBASE_CONFIG: ${{ secrets.FIREBASE_CONFIG }}
|
|
50
54
|
IMAGE_SERVER_SSH_PRIVATE_KEY: ${{ secrets.IMAGE_SERVER_SSH_PRIVATE_KEY }}
|
|
51
55
|
IMAGE_SERVER_KNOWN_HOSTS: ${{ secrets.IMAGE_SERVER_KNOWN_HOSTS }}
|
|
@@ -4,6 +4,32 @@ Notable changes to **core-framework** (import **`core_framework`**). Format foll
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [4.2.0] - 2026-10-08
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- **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.
|
|
12
|
+
- **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.
|
|
13
|
+
- **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.
|
|
14
|
+
- **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.
|
|
15
|
+
- **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.
|
|
16
|
+
- **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.
|
|
17
|
+
|
|
18
|
+
## [4.1.0] - 2026-09-28
|
|
19
|
+
|
|
20
|
+
### Breaking
|
|
21
|
+
|
|
22
|
+
- **Review list sort:** `GET /ratings/{subject_kind}/{subject_id}/reviews?sort=top` is **422**. Use `sort=votes` (stored upvote count, then `created_at`, then `id`, all descending). No alias. See **`docs/domains/ratings/retrieve_ratings.md`** and **`docs/design/list-sort-design.md`**.
|
|
23
|
+
|
|
24
|
+
### Added
|
|
25
|
+
|
|
26
|
+
- **List sort:** Post discovery (`GET /posts`, `GET /posts/hashtags/{hashtag}`, `GET /posts/users/{user_id}`) accepts `sort` of `newest`, `votes`, or `hot`. Comment subject and reply lists accept `newest` and `votes`. Omit `sort` stays newest-first. Self-history and by-user comment/rating history do not declare `sort`. See **`docs/design/list-sort-design.md`**.
|
|
27
|
+
- **Post discovery rank:** Run **`cf-alembic`** before API and worker start so **post** applies **`954f00734f36`** (empty **`post_discovery_rank`**; index **`idx_post_discovery_rank_hot_created_post`** on **`(hot_score desc, created_at desc, post_id desc)`**). Post create inserts a rank row in that table. The table is empty at ship, so **`sort=hot`** contains only posts created after the migration.
|
|
28
|
+
- **Post votes index:** Run **`cf-alembic`** so **post** applies **`0a89b4c23746`** (`idx_post_stats_like_created_post` on **`post_stats (like_count desc, created_at desc, post_id desc)`**). Post discovery **`sort=votes`** orders from that index.
|
|
29
|
+
- **Model-call probe:** `POST /admin/agent/probe` (admin role) runs one fixed prompt on the configured model and returns **disabled**, **completed** (with the reply text), or **failed**. Model calls that are off do not call OpenAI. See **`docs/domains/agent/model_call_probe.md`**.
|
|
30
|
+
- **Readiness:** `GET /readiness` adds **`agent_status`**: **DISABLED** when model calls are off (no OpenAI call), otherwise **OK** or **ERROR** from one lookup of the default model (no completion). A key without model read permission reports **ERROR**. It does not change **`app_status`** or the **503**.
|
|
31
|
+
- **Model calls (agent capability):** OpenAI connection for [Pydantic AI](https://github.com/pydantic/pydantic-ai) callers. **`pydantic-ai-slim[openai]`** is a normal dependency. Optional **`[agent]`** Settings (**`enabled`** default **false**, **`model`**, **`openai_api_key`**, **`openai_base_url`**, **`timeout_seconds`** default **120**); deploy variables **`AGENT_ENABLED`**, **`AGENT_MODEL`**, **`AGENT_OPENAI_BASE_URL`**, **`AGENT_TIMEOUT_SECONDS`** and secret **`AGENT_OPENAI_API_KEY`**. When enabled, a blank key fails Settings load and startup builds one OpenAI provider (own HTTP client, no SDK retries, timeout per request phase); the OpenAI library’s own environment variables have no effect. **`responses_model`** (**`core_framework.domains.agent.dependencies`**) returns a content-free instrumented Responses model with OpenAI response storage off by default (agent or run settings may turn it on), or **`disabled`** when off; **`SupportedModel`** and **`disabled`** export from **`core_framework.domains.agent`**. Hosts that never call a model change nothing. See **`docs/design/model-call-design.md`** and **`docs/library/package-api.md`**.
|
|
32
|
+
|
|
7
33
|
## [4.0.1] - 2026-09-17
|
|
8
34
|
|
|
9
35
|
### Fixed
|
|
@@ -784,4 +810,6 @@ First **SemVer-stable** release per **`docs/library/package-api.md`**.
|
|
|
784
810
|
[3.3.0]: https://github.com/NepNepFFXIV/core-framework/compare/v3.2.0...v3.3.0
|
|
785
811
|
[4.0.0]: https://github.com/NepNepFFXIV/core-framework/compare/v3.3.0...v4.0.0
|
|
786
812
|
[4.0.1]: https://github.com/NepNepFFXIV/core-framework/compare/v4.0.0...v4.0.1
|
|
787
|
-
[
|
|
813
|
+
[4.1.0]: https://github.com/NepNepFFXIV/core-framework/compare/v4.0.1...v4.1.0
|
|
814
|
+
[4.2.0]: https://github.com/NepNepFFXIV/core-framework/compare/v4.1.0...v4.2.0
|
|
815
|
+
[unreleased]: https://github.com/NepNepFFXIV/core-framework/compare/v4.2.0...HEAD
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: core-framework
|
|
3
|
-
Version: 4.0
|
|
3
|
+
Version: 4.2.0
|
|
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,12 +15,13 @@ 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
|
|
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
|
|
22
22
|
Requires-Dist: itsdangerous>=2.2.0
|
|
23
23
|
Requires-Dist: mashumaro[orjson]>=3.22
|
|
24
|
+
Requires-Dist: openai<3.20,>=3.19.2
|
|
24
25
|
Requires-Dist: opentelemetry-api<1.45,>=1.44.0
|
|
25
26
|
Requires-Dist: opentelemetry-exporter-otlp-proto-http<1.45,>=1.44.0
|
|
26
27
|
Requires-Dist: opentelemetry-instrumentation-asyncpg<0.66,>=0.65b0
|
|
@@ -32,6 +33,7 @@ Requires-Dist: opentelemetry-semantic-conventions<0.66,>=0.65b0
|
|
|
32
33
|
Requires-Dist: orjson>=3.12.0
|
|
33
34
|
Requires-Dist: pillow-heif>=1.7.0
|
|
34
35
|
Requires-Dist: pillow>=12.3.0
|
|
36
|
+
Requires-Dist: pydantic-ai-slim[anthropic,openai]<3,>=2.51.0
|
|
35
37
|
Requires-Dist: pyinstrument>=5.1.3
|
|
36
38
|
Requires-Dist: python-ulid>=4.0.1
|
|
37
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,27 @@
|
|
|
1
|
+
"""index post_stats for discovery votes order
|
|
2
|
+
|
|
3
|
+
Revision ID: 0a89b4c23746
|
|
4
|
+
Revises: 954f00734f36
|
|
5
|
+
Create Date: 2026-09-23 15:44:00.000000
|
|
6
|
+
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from collections.abc import Sequence
|
|
10
|
+
|
|
11
|
+
from alembic import op
|
|
12
|
+
|
|
13
|
+
revision: str = "0a89b4c23746"
|
|
14
|
+
down_revision: str | Sequence[str] | None = "954f00734f36"
|
|
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 index if not exists idx_post_stats_like_created_post
|
|
22
|
+
on post_stats (like_count desc, created_at desc, post_id desc);
|
|
23
|
+
""")
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def downgrade() -> None:
|
|
27
|
+
op.execute("drop index if exists idx_post_stats_like_created_post;")
|
core_framework-4.2.0/alembic/post/alembic/versions/954f00734f36_post_add_post_discovery_rank.py
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"""add empty post_discovery_rank for stored hot discovery
|
|
2
|
+
|
|
3
|
+
Revision ID: 954f00734f36
|
|
4
|
+
Revises: 1602f054c545
|
|
5
|
+
Create Date: 2026-09-20 12:00:00.000000
|
|
6
|
+
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from collections.abc import Sequence
|
|
10
|
+
|
|
11
|
+
from alembic import op
|
|
12
|
+
|
|
13
|
+
revision: str = "954f00734f36"
|
|
14
|
+
down_revision: str | Sequence[str] | None = "1602f054c545"
|
|
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_discovery_rank (
|
|
22
|
+
post_id varchar(26) primary key references posts(id) on delete cascade,
|
|
23
|
+
hot_score bigint not null,
|
|
24
|
+
created_at timestamptz not null,
|
|
25
|
+
computed_at timestamptz not null
|
|
26
|
+
);
|
|
27
|
+
""")
|
|
28
|
+
|
|
29
|
+
op.execute("""
|
|
30
|
+
create index if not exists idx_post_discovery_rank_hot_created_post
|
|
31
|
+
on post_discovery_rank (hot_score desc, created_at desc, post_id desc);
|
|
32
|
+
""")
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def downgrade() -> None:
|
|
36
|
+
op.execute("drop index if exists idx_post_discovery_rank_hot_created_post;")
|
|
37
|
+
op.execute("drop table if exists post_discovery_rank;")
|
|
@@ -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"}
|
|
@@ -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"
|
|
@@ -147,3 +148,19 @@ provider = "resend"
|
|
|
147
148
|
api_key = ""
|
|
148
149
|
from_address = ""
|
|
149
150
|
from_name = ""
|
|
151
|
+
|
|
152
|
+
[agent]
|
|
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"
|
|
@@ -135,3 +136,19 @@ provider = "$EMAIL_PROVIDER"
|
|
|
135
136
|
api_key = "$EMAIL_API_KEY"
|
|
136
137
|
from_address = "$EMAIL_FROM_ADDRESS"
|
|
137
138
|
from_name = "$EMAIL_FROM_NAME"
|
|
139
|
+
|
|
140
|
+
[agent]
|
|
141
|
+
enabled = $AGENT_ENABLED
|
|
142
|
+
provider = "$AGENT_PROVIDER"
|
|
143
|
+
model = "$AGENT_MODEL"
|
|
144
|
+
openai_api_key = "$AGENT_OPENAI_API_KEY"
|
|
145
|
+
openai_base_url = "$AGENT_OPENAI_BASE_URL"
|
|
146
|
+
anthropic_api_key = "$AGENT_ANTHROPIC_API_KEY"
|
|
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,19 @@
|
|
|
1
|
+
from typing import Any
|
|
2
|
+
|
|
3
|
+
from fastapi import APIRouter, Depends
|
|
4
|
+
|
|
5
|
+
from core_framework.api.admin.agent.schemas import ModelProbeResponse
|
|
6
|
+
from core_framework.api.dependencies import check_admin_role
|
|
7
|
+
from core_framework.application.agent.probe import probe_model_call
|
|
8
|
+
|
|
9
|
+
router = APIRouter(
|
|
10
|
+
prefix="/agent",
|
|
11
|
+
tags=["agent - admin"],
|
|
12
|
+
dependencies=[Depends(check_admin_role)],
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@router.post("/probe", response_model=ModelProbeResponse)
|
|
17
|
+
async def post_model_call_probe() -> Any:
|
|
18
|
+
result = await probe_model_call()
|
|
19
|
+
return ModelProbeResponse(status=result.status, output=result.output)
|
|
@@ -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
|
+
)
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
from fastapi import APIRouter, Depends
|
|
2
2
|
|
|
3
|
+
from core_framework.api.admin.agent.router import router as agent_router
|
|
3
4
|
from core_framework.api.admin.analytics.router import router as analytics_router
|
|
4
5
|
from core_framework.api.admin.cache.router import router as cache_router
|
|
5
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
|
|
6
8
|
from core_framework.api.admin.moderation.router import router as moderation_router
|
|
7
9
|
from core_framework.api.admin.outbox.router import router as outbox_router
|
|
8
10
|
from core_framework.api.admin.posts.router import router as posts_router
|
|
@@ -15,10 +17,12 @@ router = APIRouter(
|
|
|
15
17
|
dependencies=[Depends(check_admin_identity), Depends(check_moderator_or_admin)],
|
|
16
18
|
)
|
|
17
19
|
|
|
20
|
+
router.include_router(agent_router)
|
|
18
21
|
router.include_router(cache_router)
|
|
19
22
|
router.include_router(analytics_router)
|
|
20
23
|
router.include_router(outbox_router)
|
|
21
24
|
router.include_router(users_router)
|
|
25
|
+
router.include_router(entitlements_router)
|
|
22
26
|
router.include_router(moderation_router)
|
|
23
27
|
router.include_router(posts_router)
|
|
24
28
|
router.include_router(comments_router)
|