databricks-tellr-app 0.4.3.dev9__tar.gz → 0.4.3.dev11__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (167) hide show
  1. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/PKG-INFO +1 -1
  2. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/databricks_tellr_app.egg-info/PKG-INFO +1 -1
  3. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/pyproject.toml +1 -1
  4. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/core/database.py +120 -53
  5. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/README.md +0 -0
  6. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/databricks_tellr_app/__init__.py +0 -0
  7. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/databricks_tellr_app/run.py +0 -0
  8. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/databricks_tellr_app.egg-info/SOURCES.txt +0 -0
  9. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/databricks_tellr_app.egg-info/dependency_links.txt +0 -0
  10. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/databricks_tellr_app.egg-info/requires.txt +0 -0
  11. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/databricks_tellr_app.egg-info/top_level.txt +0 -0
  12. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/setup.cfg +0 -0
  13. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/setup.py +0 -0
  14. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/__init__.py +0 -0
  15. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/api/__init__.py +0 -0
  16. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/api/_otel_bootstrap.py +0 -0
  17. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/api/fixtures/tour_demo_deck.json +0 -0
  18. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/api/main.py +0 -0
  19. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/api/mcp_auth.py +0 -0
  20. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/api/mcp_server.py +0 -0
  21. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/api/middleware/__init__.py +0 -0
  22. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/api/middleware/csrf.py +0 -0
  23. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/api/middleware/request_logging.py +0 -0
  24. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/api/middleware/security_headers.py +0 -0
  25. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/api/routes/__init__.py +0 -0
  26. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/api/routes/_authz.py +0 -0
  27. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/api/routes/admin.py +0 -0
  28. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/api/routes/admin_usage.py +0 -0
  29. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/api/routes/agent_config.py +0 -0
  30. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/api/routes/chat.py +0 -0
  31. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/api/routes/deck_contributors.py +0 -0
  32. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/api/routes/export.py +0 -0
  33. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/api/routes/feedback.py +0 -0
  34. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/api/routes/google_slides.py +0 -0
  35. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/api/routes/images.py +0 -0
  36. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/api/routes/local_version.py +0 -0
  37. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/api/routes/profiles.py +0 -0
  38. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/api/routes/sessions.py +0 -0
  39. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/api/routes/settings/__init__.py +0 -0
  40. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/api/routes/settings/contributors.py +0 -0
  41. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/api/routes/settings/deck_prompts.py +0 -0
  42. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/api/routes/settings/design_systems.py +0 -0
  43. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/api/routes/settings/identities.py +0 -0
  44. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/api/routes/settings/slide_styles.py +0 -0
  45. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/api/routes/setup.py +0 -0
  46. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/api/routes/slides.py +0 -0
  47. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/api/routes/tools.py +0 -0
  48. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/api/routes/tour.py +0 -0
  49. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/api/routes/verification.py +0 -0
  50. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/api/routes/version.py +0 -0
  51. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/api/schemas/__init__.py +0 -0
  52. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/api/schemas/agent_config.py +0 -0
  53. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/api/schemas/feedback.py +0 -0
  54. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/api/schemas/requests.py +0 -0
  55. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/api/schemas/responses.py +0 -0
  56. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/api/schemas/settings/__init__.py +0 -0
  57. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/api/schemas/settings/requests.py +0 -0
  58. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/api/schemas/settings/responses.py +0 -0
  59. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/api/schemas/streaming.py +0 -0
  60. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/api/services/__init__.py +0 -0
  61. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/api/services/chat_service.py +0 -0
  62. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/api/services/export_job_queue.py +0 -0
  63. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/api/services/feedback_service.py +0 -0
  64. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/api/services/job_queue.py +0 -0
  65. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/api/services/session_manager.py +0 -0
  66. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/api/services/session_naming.py +0 -0
  67. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/api/services/usage_events.py +0 -0
  68. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/api/services/usage_service.py +0 -0
  69. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/api/utils/__init__.py +0 -0
  70. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/api/utils/validation.py +0 -0
  71. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/core/__init__.py +0 -0
  72. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/core/config_loader.py +0 -0
  73. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/core/context_utils.py +0 -0
  74. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/core/databricks_client.py +0 -0
  75. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/core/defaults.py +0 -0
  76. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/core/encryption.py +0 -0
  77. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/core/init_default_profile.py +0 -0
  78. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/core/lakebase.py +0 -0
  79. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/core/migrate_profiles_to_agent_config.py +0 -0
  80. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/core/mlflow_agent_spans.py +0 -0
  81. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/core/mlflow_tracing.py +0 -0
  82. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/core/otel_logging.py +0 -0
  83. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/core/permission_context.py +0 -0
  84. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/core/prompt_modules.py +0 -0
  85. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/core/settings_db.py +0 -0
  86. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/core/user_context.py +0 -0
  87. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/database/__init__.py +0 -0
  88. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/database/models/__init__.py +0 -0
  89. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/database/models/deck_contributor.py +0 -0
  90. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/database/models/design_system.py +0 -0
  91. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/database/models/encryption_key.py +0 -0
  92. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/database/models/feedback.py +0 -0
  93. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/database/models/genie_space.py +0 -0
  94. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/database/models/google_global_credentials.py +0 -0
  95. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/database/models/google_oauth_token.py +0 -0
  96. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/database/models/identity.py +0 -0
  97. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/database/models/image.py +0 -0
  98. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/database/models/profile.py +0 -0
  99. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/database/models/profile_contributor.py +0 -0
  100. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/database/models/prompts.py +0 -0
  101. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/database/models/request_log.py +0 -0
  102. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/database/models/session.py +0 -0
  103. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/database/models/slide_deck_prompt.py +0 -0
  104. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/database/models/slide_style_library.py +0 -0
  105. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/database/models/usage_event.py +0 -0
  106. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/database/models/user_preference.py +0 -0
  107. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/database/types.py +0 -0
  108. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/domain/__init__.py +0 -0
  109. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/domain/slide.py +0 -0
  110. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/domain/slide_deck.py +0 -0
  111. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/services/__init__.py +0 -0
  112. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/services/agent.py +0 -0
  113. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/services/agent_factory.py +0 -0
  114. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/services/config_service.py +0 -0
  115. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/services/config_validator.py +0 -0
  116. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/services/converter_jail/__init__.py +0 -0
  117. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/services/converter_jail/ast_guard.py +0 -0
  118. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/services/converter_jail/codeprep.py +0 -0
  119. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/services/converter_jail/gslides_runner.py +0 -0
  120. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/services/converter_jail/jail.py +0 -0
  121. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/services/converter_jail/pptx_runner.py +0 -0
  122. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/services/converter_jail/protocol.py +0 -0
  123. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/services/design_system_compiler.py +0 -0
  124. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/services/design_system_service.py +0 -0
  125. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/services/design_system_templates.py +0 -0
  126. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/services/drive_uploader.py +0 -0
  127. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/services/evaluation/__init__.py +0 -0
  128. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/services/evaluation/llm_judge.py +0 -0
  129. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/services/genie_service.py +0 -0
  130. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/services/google_slides_auth.py +0 -0
  131. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/services/google_slides_prompts_defaults.py +0 -0
  132. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/services/html_to_google_slides.py +0 -0
  133. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/services/html_to_pptx.py +0 -0
  134. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/services/identity_provider.py +0 -0
  135. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/services/identity_providers/__init__.py +0 -0
  136. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/services/identity_providers/account_provider.py +0 -0
  137. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/services/identity_providers/local_provider.py +0 -0
  138. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/services/identity_providers/workspace_provider.py +0 -0
  139. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/services/image_service.py +0 -0
  140. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/services/image_tools.py +0 -0
  141. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/services/permission_service.py +0 -0
  142. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/services/pptx_from_html_huashu.py +0 -0
  143. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/services/pptx_from_records.py +0 -0
  144. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/services/pptx_prompts_defaults.py +0 -0
  145. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/services/profile_service.py +0 -0
  146. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/services/streaming_callback.py +0 -0
  147. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/services/tools/__init__.py +0 -0
  148. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/services/tools/agent_bricks_tool.py +0 -0
  149. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/services/tools/ds_asset_tool.py +0 -0
  150. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/services/tools/genie_tool.py +0 -0
  151. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/services/tools/mcp_tool.py +0 -0
  152. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/services/tools/model_endpoint_tool.py +0 -0
  153. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/services/tools/vector_tool.py +0 -0
  154. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/services/validator.py +0 -0
  155. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/utils/__init__.py +0 -0
  156. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/utils/css_utils.py +0 -0
  157. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/utils/ds_asset_utils.py +0 -0
  158. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/utils/error_handling.py +0 -0
  159. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/utils/html_safety.py +0 -0
  160. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/utils/html_utils.py +0 -0
  161. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/utils/image_utils.py +0 -0
  162. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/utils/js_validator.py +0 -0
  163. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/utils/logging_config.py +0 -0
  164. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/utils/pi_filter.py +0 -0
  165. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/utils/slide_hash.py +0 -0
  166. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/utils/spotlight.py +0 -0
  167. {databricks_tellr_app-0.4.3.dev9 → databricks_tellr_app-0.4.3.dev11}/src/utils/text_caps.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: databricks-tellr-app
3
- Version: 0.4.3.dev9
3
+ Version: 0.4.3.dev11
4
4
  Summary: Tellr application package for Databricks Apps
5
5
  Requires-Python: >=3.10
6
6
  Description-Content-Type: text/markdown
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: databricks-tellr-app
3
- Version: 0.4.3.dev9
3
+ Version: 0.4.3.dev11
4
4
  Summary: Tellr application package for Databricks Apps
5
5
  Requires-Python: >=3.10
6
6
  Description-Content-Type: text/markdown
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "databricks-tellr-app"
7
- version = "0.4.3.dev9"
7
+ version = "0.4.3.dev11"
8
8
  description = "Tellr application package for Databricks Apps"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -1161,6 +1161,31 @@ def _deck_columns_have_int_placeholder(conn, live_targets, _qual, is_sqlite) ->
1161
1161
  return False
1162
1162
 
1163
1163
 
1164
+ def _referenced_int_image_ids(conn, live_targets, _qual) -> set:
1165
+ """Distinct integer ids referenced by ``{{image:<int>}}`` across the deck columns.
1166
+
1167
+ PostgreSQL/Lakebase only. Extraction happens IN THE DATABASE via
1168
+ ``regexp_matches`` — only the small integer ids come back to Python, never the
1169
+ deck blobs. This lets :func:`_migrate_rewrite_deck_image_placeholders` map just
1170
+ the few hundred images decks actually reference instead of every image row (the
1171
+ difference between a ~1-minute and an ~80-minute startup step on a real fork).
1172
+ """
1173
+ from sqlalchemy import text
1174
+
1175
+ ids: set = set()
1176
+ for table_name, column_name in live_targets:
1177
+ q = _qual(table_name)
1178
+ result = conn.execute(
1179
+ text(
1180
+ f"SELECT DISTINCT (regexp_matches({column_name}, :cap, 'g'))[1] AS id "
1181
+ f"FROM {q} WHERE {column_name} ~ :any_int"
1182
+ ),
1183
+ {"cap": r"\{\{image:([0-9]+)\}\}", "any_int": r"\{\{image:[0-9]+\}\}"},
1184
+ ).fetchall()
1185
+ ids.update(int(r[0]) for r in result)
1186
+ return ids
1187
+
1188
+
1164
1189
  def _migrate_rewrite_deck_image_placeholders(conn, inspector, schema, _qual, is_sqlite) -> None:
1165
1190
  """Rewrite stored deck ``{{image:<int-id>}}`` placeholders to ``{{image:<token>}}`` (SDR-4437 F-TM-7).
1166
1191
 
@@ -1172,44 +1197,68 @@ def _migrate_rewrite_deck_image_placeholders(conn, inspector, schema, _qual, is_
1172
1197
  place, using the ``id -> token`` map that ``_migrate_image_assets_add_token``
1173
1198
  (which runs just before this) has guaranteed exists on every image row.
1174
1199
 
1175
- The string work stays IN THE DATABASE — Python only drives a per-``(id, token)``
1176
- loop of set-based ``replace()`` UPDATEs, exactly like the token backfill drives
1177
- its loop. Deck blobs are never pulled into the app to be regexed.
1178
-
1179
- Correctness / performance:
1180
-
1181
- - **Per-image sequential loop, not a join.** A single
1182
- ``UPDATE ... FROM image_assets`` applies only ONE arbitrary matched row per
1183
- target row, so a deck referencing two images would be half-rewritten. The
1184
- sequential per-image ``replace()`` accumulates correctly across multi-image
1185
- decks. ``regexp_replace`` can't express it either — the replacement is a
1186
- per-match lookup into ``image_assets``, not a fixed template.
1200
+ The string work stays IN THE DATABASE — Python only drives the id/token map and
1201
+ builds the SQL. Deck blobs are never pulled into the app to be regexed.
1202
+
1203
+ Scale matters: prod holds thousands of image rows and thousands of decks with
1204
+ ~35 KB (up to ~430 KB) JSON blobs. The naive shape — a per-``(id, token)`` loop
1205
+ of ``UPDATE ... WHERE col LIKE '%{{image:N}}%'`` — is O(images) unindexable
1206
+ full-table scans per column and measured ~80 min on a real fork, which stalled
1207
+ startup. Two changes make it a ~1-minute one-time step:
1208
+
1209
+ - **Only referenced ids.** On PostgreSQL/Lakebase the ids ACTUALLY referenced by
1210
+ a deck are extracted IN THE DATABASE (:func:`_referenced_int_image_ids`, via
1211
+ ``regexp_matches`` — only integers come back, never blobs); prod decks reuse a
1212
+ few hundred of the thousands of images, so the rest are never considered. On
1213
+ SQLite (tests, tiny data) there is no in-DB regex, so every image row is mapped
1214
+ and a fast gate (:func:`_deck_columns_have_int_placeholder`) skips an
1215
+ already-migrated DB.
1216
+ - **One pass per column.** A single ``UPDATE`` per column applies a CHAINED
1217
+ ``replace()`` over every ``(id -> token)`` pair, so each large-blob column is
1218
+ scanned once rather than once per image.
1219
+
1220
+ Correctness:
1221
+
1222
+ - **Chained sequential replace, not a join.** ``replace(replace(col, id1, tok1),
1223
+ id2, tok2)`` applies each substitution across the whole blob in turn, so a
1224
+ multi-image deck is fully rewritten. A single ``UPDATE ... FROM image_assets``
1225
+ would apply only ONE arbitrary matched row per target row (half-rewriting
1226
+ multi-image decks); ``regexp_replace`` can't do the per-match id->token lookup.
1187
1227
  - **Prefix-safe.** The literal ``{{image:5}}`` (closing braces included) never
1188
- matches inside ``{{image:51}}``, so there is no id-prefix collision.
1189
- - **Idempotent + cheap on repeat.** This runs on EVERY worker at EVERY startup,
1190
- so a fast gate (:func:`_deck_columns_have_int_placeholder`) short-circuits the
1191
- whole thing once no int-style placeholder remains — turning steady-state boots
1192
- into a few read-only ``LIMIT 1`` scans instead of O(images) unindexable
1193
- leading-wildcard ``LIKE`` UPDATEs per column (that unconditional per-boot cost
1194
- stalled real multi-worker startup on prod-scale data). The per-UPDATE ``LIKE``
1195
- guard is the second layer: within a run it skips rows without this id, and
1196
- unreferenced or hard-deleted ids are never touched.
1228
+ matches inside ``{{image:51}}``, and a token (``[A-Za-z0-9_-]``) has no braces,
1229
+ so the order of the chained replaces is irrelevant — no id-prefix collision.
1230
+ - **Idempotent.** The per-``UPDATE`` guard restricts the pass to rows that still
1231
+ hold an int placeholder, so a re-run over token-only rows is a no-op; once the
1232
+ mappable ids are rewritten, extraction/gate find nothing (only unmappable
1233
+ ids), so no further passes run.
1197
1234
  - **No jsonb cast.** Every target column (:data:`_DECK_PLACEHOLDER_COLUMNS`) is
1198
1235
  ``TEXT`` on both backends, so ``replace()`` applies directly. Tokens are
1199
1236
  ``[A-Za-z0-9_-]`` (JSON-safe), so text-level replacement inside a JSON blob
1200
1237
  cannot corrupt its structure.
1201
1238
  - **Soft-deleted images included** (no ``is_active`` filter) — a deck may still
1202
1239
  reference an image that was later soft-deleted, and it must keep resolving.
1240
+ - **Unknown/hard-deleted ids** referenced by a deck have no image row, so they
1241
+ are not in the map and their placeholder is left unchanged.
1203
1242
 
1204
1243
  A no-op when ``image_assets`` (or its ``token`` column) or every target table is
1205
1244
  absent on a given deploy.
1206
1245
  """
1207
- from sqlalchemy import text
1246
+ from sqlalchemy import inspect, text
1247
+
1248
+ # Reflect the LIVE schema with a FRESH inspector, NOT the shared one that
1249
+ # _run_migrations threads through. _migrate_image_assets_add_token adds the
1250
+ # token column in this SAME transaction, and the shared inspector's reflection
1251
+ # cache predates that ALTER — so a cached read reports "no token column" and
1252
+ # this migration would return early, silently skipping the rewrite on every
1253
+ # fresh DB and every prod fork (where the column is added during this run).
1254
+ # This is the same reflection-cache staleness the design-system migrations in
1255
+ # this file avoid the same way (see _migrate_uncap_brand_text_columns).
1256
+ insp = inspect(conn)
1208
1257
 
1209
1258
  # image_assets + its token column must exist (guaranteed by the prior migration
1210
1259
  # on any live deploy; guarded so this can be exercised standalone).
1211
1260
  try:
1212
- image_cols = {c["name"] for c in inspector.get_columns("image_assets", schema=schema)}
1261
+ image_cols = {c["name"] for c in insp.get_columns("image_assets", schema=schema)}
1213
1262
  except Exception:
1214
1263
  return
1215
1264
  if "token" not in image_cols:
@@ -1219,7 +1268,7 @@ def _migrate_rewrite_deck_image_placeholders(conn, inspector, schema, _qual, is_
1219
1268
  live_targets: list[tuple[str, str]] = []
1220
1269
  for table_name, column_name in _DECK_PLACEHOLDER_COLUMNS:
1221
1270
  try:
1222
- cols = {c["name"] for c in inspector.get_columns(table_name, schema=schema)}
1271
+ cols = {c["name"] for c in insp.get_columns(table_name, schema=schema)}
1223
1272
  except Exception:
1224
1273
  continue
1225
1274
  if column_name in cols:
@@ -1227,43 +1276,61 @@ def _migrate_rewrite_deck_image_placeholders(conn, inspector, schema, _qual, is_
1227
1276
  if not live_targets:
1228
1277
  return
1229
1278
 
1230
- # Fast idempotency gate. This migration runs on EVERY worker at EVERY startup
1231
- # (init_db in the FastAPI lifespan), so once the one-time rewrite is done it must
1232
- # NOT re-issue the per-image UPDATEs: each is an unindexable leading-wildcard
1233
- # LIKE scan of a large-blob deck table, and O(images) of them per column across
1234
- # several concurrent workers stalls startup on prod-scale data. If no target
1235
- # column still holds an int-style {{image:<digits>}} placeholder, there is
1236
- # nothing to do — return before touching the image rows or the deck tables.
1237
- if not _deck_columns_have_int_placeholder(conn, live_targets, _qual, is_sqlite):
1238
- return
1239
-
1240
- rows = conn.execute(
1241
- text(f"SELECT id, token FROM {_qual('image_assets')} WHERE token IS NOT NULL")
1242
- ).fetchall()
1279
+ # The (id -> token) pairs to rewrite. Only ids ACTUALLY referenced by a deck —
1280
+ # see the docstring for why looping every image row is far too slow at prod
1281
+ # scale.
1282
+ q_images = _qual("image_assets")
1283
+ if is_sqlite:
1284
+ # No in-DB regex on SQLite; test data is tiny, so gate on any int
1285
+ # placeholder (skips an already-migrated DB) and map every image row.
1286
+ if not _deck_columns_have_int_placeholder(conn, live_targets, _qual, is_sqlite):
1287
+ return
1288
+ rows = conn.execute(
1289
+ text(f"SELECT id, token FROM {q_images} WHERE token IS NOT NULL")
1290
+ ).fetchall()
1291
+ else:
1292
+ referenced = _referenced_int_image_ids(conn, live_targets, _qual)
1293
+ if not referenced:
1294
+ return
1295
+ rows = conn.execute(
1296
+ text(
1297
+ f"SELECT id, token FROM {q_images} "
1298
+ "WHERE token IS NOT NULL AND id = ANY(:ids)"
1299
+ ),
1300
+ {"ids": list(referenced)},
1301
+ ).fetchall()
1243
1302
  if not rows:
1244
1303
  return
1245
1304
 
1246
1305
  logger.info(
1247
1306
  "Migration: rewriting {{image:<id>}} deck placeholders to tokens for "
1248
- "%d images across %d columns (SDR-4437 F-TM-7)",
1307
+ "%d referenced images across %d columns (SDR-4437 F-TM-7)",
1249
1308
  len(rows),
1250
1309
  len(live_targets),
1251
1310
  )
1252
- for image_id, token in rows:
1253
- old = f"{{{{image:{image_id}}}}}"
1254
- new = f"{{{{image:{token}}}}}"
1255
- for table_name, column_name in live_targets:
1256
- q = _qual(table_name)
1257
- # Identifiers come from the hardcoded _DECK_PLACEHOLDER_COLUMNS; the
1258
- # placeholder literals are bound parameters. The LIKE guard makes rows
1259
- # without this id (and every row on a re-run) a no-op.
1260
- conn.execute(
1261
- text(
1262
- f"UPDATE {q} SET {column_name} = replace({column_name}, :old, :new) "
1263
- f"WHERE {column_name} LIKE :pattern"
1264
- ),
1265
- {"old": old, "new": new, "pattern": f"%{old}%"},
1266
- )
1311
+
1312
+ # One UPDATE per column: a single chained replace() over all (id -> token)
1313
+ # pairs, so each large-blob column is scanned ONCE, not once per image. The
1314
+ # WHERE guard limits the pass to rows that still hold an int placeholder, so a
1315
+ # re-run over token-only rows is a no-op. Identifiers come from the hardcoded
1316
+ # _DECK_PLACEHOLDER_COLUMNS; every placeholder literal is a bound parameter.
1317
+ if is_sqlite:
1318
+ guard_sql, guard_param = "LIKE :_guard", {"_guard": "%{{image:%"}
1319
+ else:
1320
+ guard_sql, guard_param = "~ :_guard", {"_guard": r"\{\{image:[0-9]+\}\}"}
1321
+
1322
+ for table_name, column_name in live_targets:
1323
+ q = _qual(table_name)
1324
+ expr = column_name
1325
+ params: dict = {}
1326
+ for i, (image_id, token) in enumerate(rows):
1327
+ expr = f"replace({expr}, :o{i}, :n{i})"
1328
+ params[f"o{i}"] = f"{{{{image:{image_id}}}}}"
1329
+ params[f"n{i}"] = f"{{{{image:{token}}}}}"
1330
+ conn.execute(
1331
+ text(f"UPDATE {q} SET {column_name} = {expr} WHERE {column_name} {guard_sql}"),
1332
+ {**params, **guard_param},
1333
+ )
1267
1334
 
1268
1335
 
1269
1336
  #: The one place the precedence rule is written in SQL. ``$$``-quoted so the body