databricks-tellr-app 0.4.3.dev10__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.dev10 → databricks_tellr_app-0.4.3.dev11}/PKG-INFO +1 -1
  2. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/databricks_tellr_app.egg-info/PKG-INFO +1 -1
  3. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/pyproject.toml +1 -1
  4. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/core/database.py +107 -50
  5. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/README.md +0 -0
  6. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/databricks_tellr_app/__init__.py +0 -0
  7. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/databricks_tellr_app/run.py +0 -0
  8. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/databricks_tellr_app.egg-info/SOURCES.txt +0 -0
  9. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/databricks_tellr_app.egg-info/dependency_links.txt +0 -0
  10. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/databricks_tellr_app.egg-info/requires.txt +0 -0
  11. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/databricks_tellr_app.egg-info/top_level.txt +0 -0
  12. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/setup.cfg +0 -0
  13. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/setup.py +0 -0
  14. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/__init__.py +0 -0
  15. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/api/__init__.py +0 -0
  16. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/api/_otel_bootstrap.py +0 -0
  17. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/api/fixtures/tour_demo_deck.json +0 -0
  18. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/api/main.py +0 -0
  19. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/api/mcp_auth.py +0 -0
  20. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/api/mcp_server.py +0 -0
  21. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/api/middleware/__init__.py +0 -0
  22. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/api/middleware/csrf.py +0 -0
  23. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/api/middleware/request_logging.py +0 -0
  24. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/api/middleware/security_headers.py +0 -0
  25. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/api/routes/__init__.py +0 -0
  26. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/api/routes/_authz.py +0 -0
  27. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/api/routes/admin.py +0 -0
  28. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/api/routes/admin_usage.py +0 -0
  29. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/api/routes/agent_config.py +0 -0
  30. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/api/routes/chat.py +0 -0
  31. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/api/routes/deck_contributors.py +0 -0
  32. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/api/routes/export.py +0 -0
  33. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/api/routes/feedback.py +0 -0
  34. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/api/routes/google_slides.py +0 -0
  35. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/api/routes/images.py +0 -0
  36. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/api/routes/local_version.py +0 -0
  37. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/api/routes/profiles.py +0 -0
  38. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/api/routes/sessions.py +0 -0
  39. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/api/routes/settings/__init__.py +0 -0
  40. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/api/routes/settings/contributors.py +0 -0
  41. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/api/routes/settings/deck_prompts.py +0 -0
  42. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/api/routes/settings/design_systems.py +0 -0
  43. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/api/routes/settings/identities.py +0 -0
  44. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/api/routes/settings/slide_styles.py +0 -0
  45. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/api/routes/setup.py +0 -0
  46. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/api/routes/slides.py +0 -0
  47. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/api/routes/tools.py +0 -0
  48. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/api/routes/tour.py +0 -0
  49. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/api/routes/verification.py +0 -0
  50. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/api/routes/version.py +0 -0
  51. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/api/schemas/__init__.py +0 -0
  52. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/api/schemas/agent_config.py +0 -0
  53. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/api/schemas/feedback.py +0 -0
  54. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/api/schemas/requests.py +0 -0
  55. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/api/schemas/responses.py +0 -0
  56. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/api/schemas/settings/__init__.py +0 -0
  57. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/api/schemas/settings/requests.py +0 -0
  58. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/api/schemas/settings/responses.py +0 -0
  59. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/api/schemas/streaming.py +0 -0
  60. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/api/services/__init__.py +0 -0
  61. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/api/services/chat_service.py +0 -0
  62. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/api/services/export_job_queue.py +0 -0
  63. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/api/services/feedback_service.py +0 -0
  64. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/api/services/job_queue.py +0 -0
  65. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/api/services/session_manager.py +0 -0
  66. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/api/services/session_naming.py +0 -0
  67. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/api/services/usage_events.py +0 -0
  68. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/api/services/usage_service.py +0 -0
  69. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/api/utils/__init__.py +0 -0
  70. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/api/utils/validation.py +0 -0
  71. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/core/__init__.py +0 -0
  72. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/core/config_loader.py +0 -0
  73. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/core/context_utils.py +0 -0
  74. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/core/databricks_client.py +0 -0
  75. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/core/defaults.py +0 -0
  76. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/core/encryption.py +0 -0
  77. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/core/init_default_profile.py +0 -0
  78. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/core/lakebase.py +0 -0
  79. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/core/migrate_profiles_to_agent_config.py +0 -0
  80. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/core/mlflow_agent_spans.py +0 -0
  81. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/core/mlflow_tracing.py +0 -0
  82. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/core/otel_logging.py +0 -0
  83. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/core/permission_context.py +0 -0
  84. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/core/prompt_modules.py +0 -0
  85. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/core/settings_db.py +0 -0
  86. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/core/user_context.py +0 -0
  87. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/database/__init__.py +0 -0
  88. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/database/models/__init__.py +0 -0
  89. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/database/models/deck_contributor.py +0 -0
  90. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/database/models/design_system.py +0 -0
  91. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/database/models/encryption_key.py +0 -0
  92. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/database/models/feedback.py +0 -0
  93. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/database/models/genie_space.py +0 -0
  94. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/database/models/google_global_credentials.py +0 -0
  95. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/database/models/google_oauth_token.py +0 -0
  96. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/database/models/identity.py +0 -0
  97. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/database/models/image.py +0 -0
  98. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/database/models/profile.py +0 -0
  99. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/database/models/profile_contributor.py +0 -0
  100. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/database/models/prompts.py +0 -0
  101. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/database/models/request_log.py +0 -0
  102. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/database/models/session.py +0 -0
  103. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/database/models/slide_deck_prompt.py +0 -0
  104. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/database/models/slide_style_library.py +0 -0
  105. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/database/models/usage_event.py +0 -0
  106. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/database/models/user_preference.py +0 -0
  107. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/database/types.py +0 -0
  108. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/domain/__init__.py +0 -0
  109. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/domain/slide.py +0 -0
  110. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/domain/slide_deck.py +0 -0
  111. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/services/__init__.py +0 -0
  112. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/services/agent.py +0 -0
  113. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/services/agent_factory.py +0 -0
  114. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/services/config_service.py +0 -0
  115. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/services/config_validator.py +0 -0
  116. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/services/converter_jail/__init__.py +0 -0
  117. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/services/converter_jail/ast_guard.py +0 -0
  118. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/services/converter_jail/codeprep.py +0 -0
  119. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/services/converter_jail/gslides_runner.py +0 -0
  120. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/services/converter_jail/jail.py +0 -0
  121. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/services/converter_jail/pptx_runner.py +0 -0
  122. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/services/converter_jail/protocol.py +0 -0
  123. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/services/design_system_compiler.py +0 -0
  124. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/services/design_system_service.py +0 -0
  125. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/services/design_system_templates.py +0 -0
  126. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/services/drive_uploader.py +0 -0
  127. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/services/evaluation/__init__.py +0 -0
  128. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/services/evaluation/llm_judge.py +0 -0
  129. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/services/genie_service.py +0 -0
  130. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/services/google_slides_auth.py +0 -0
  131. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/services/google_slides_prompts_defaults.py +0 -0
  132. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/services/html_to_google_slides.py +0 -0
  133. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/services/html_to_pptx.py +0 -0
  134. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/services/identity_provider.py +0 -0
  135. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/services/identity_providers/__init__.py +0 -0
  136. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/services/identity_providers/account_provider.py +0 -0
  137. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/services/identity_providers/local_provider.py +0 -0
  138. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/services/identity_providers/workspace_provider.py +0 -0
  139. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/services/image_service.py +0 -0
  140. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/services/image_tools.py +0 -0
  141. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/services/permission_service.py +0 -0
  142. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/services/pptx_from_html_huashu.py +0 -0
  143. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/services/pptx_from_records.py +0 -0
  144. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/services/pptx_prompts_defaults.py +0 -0
  145. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/services/profile_service.py +0 -0
  146. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/services/streaming_callback.py +0 -0
  147. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/services/tools/__init__.py +0 -0
  148. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/services/tools/agent_bricks_tool.py +0 -0
  149. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/services/tools/ds_asset_tool.py +0 -0
  150. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/services/tools/genie_tool.py +0 -0
  151. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/services/tools/mcp_tool.py +0 -0
  152. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/services/tools/model_endpoint_tool.py +0 -0
  153. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/services/tools/vector_tool.py +0 -0
  154. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/services/validator.py +0 -0
  155. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/utils/__init__.py +0 -0
  156. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/utils/css_utils.py +0 -0
  157. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/utils/ds_asset_utils.py +0 -0
  158. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/utils/error_handling.py +0 -0
  159. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/utils/html_safety.py +0 -0
  160. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/utils/html_utils.py +0 -0
  161. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/utils/image_utils.py +0 -0
  162. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/utils/js_validator.py +0 -0
  163. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/utils/logging_config.py +0 -0
  164. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/utils/pi_filter.py +0 -0
  165. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/utils/slide_hash.py +0 -0
  166. {databricks_tellr_app-0.4.3.dev10 → databricks_tellr_app-0.4.3.dev11}/src/utils/spotlight.py +0 -0
  167. {databricks_tellr_app-0.4.3.dev10 → 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.dev10
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.dev10
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.dev10"
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,34 +1197,48 @@ 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.
@@ -1237,43 +1276,61 @@ def _migrate_rewrite_deck_image_placeholders(conn, inspector, schema, _qual, is_
1237
1276
  if not live_targets:
1238
1277
  return
1239
1278
 
1240
- # Fast idempotency gate. This migration runs on EVERY worker at EVERY startup
1241
- # (init_db in the FastAPI lifespan), so once the one-time rewrite is done it must
1242
- # NOT re-issue the per-image UPDATEs: each is an unindexable leading-wildcard
1243
- # LIKE scan of a large-blob deck table, and O(images) of them per column across
1244
- # several concurrent workers stalls startup on prod-scale data. If no target
1245
- # column still holds an int-style {{image:<digits>}} placeholder, there is
1246
- # nothing to do — return before touching the image rows or the deck tables.
1247
- if not _deck_columns_have_int_placeholder(conn, live_targets, _qual, is_sqlite):
1248
- return
1249
-
1250
- rows = conn.execute(
1251
- text(f"SELECT id, token FROM {_qual('image_assets')} WHERE token IS NOT NULL")
1252
- ).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()
1253
1302
  if not rows:
1254
1303
  return
1255
1304
 
1256
1305
  logger.info(
1257
1306
  "Migration: rewriting {{image:<id>}} deck placeholders to tokens for "
1258
- "%d images across %d columns (SDR-4437 F-TM-7)",
1307
+ "%d referenced images across %d columns (SDR-4437 F-TM-7)",
1259
1308
  len(rows),
1260
1309
  len(live_targets),
1261
1310
  )
1262
- for image_id, token in rows:
1263
- old = f"{{{{image:{image_id}}}}}"
1264
- new = f"{{{{image:{token}}}}}"
1265
- for table_name, column_name in live_targets:
1266
- q = _qual(table_name)
1267
- # Identifiers come from the hardcoded _DECK_PLACEHOLDER_COLUMNS; the
1268
- # placeholder literals are bound parameters. The LIKE guard makes rows
1269
- # without this id (and every row on a re-run) a no-op.
1270
- conn.execute(
1271
- text(
1272
- f"UPDATE {q} SET {column_name} = replace({column_name}, :old, :new) "
1273
- f"WHERE {column_name} LIKE :pattern"
1274
- ),
1275
- {"old": old, "new": new, "pattern": f"%{old}%"},
1276
- )
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
+ )
1277
1334
 
1278
1335
 
1279
1336
  #: The one place the precedence rule is written in SQL. ``$$``-quoted so the body