databricks-tellr-app 0.4.2.dev9__tar.gz → 0.4.2.dev10__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.2.dev9 → databricks_tellr_app-0.4.2.dev10}/PKG-INFO +1 -1
  2. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/databricks_tellr_app.egg-info/PKG-INFO +1 -1
  3. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/pyproject.toml +1 -1
  4. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/services/design_system_service.py +104 -10
  5. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/services/design_system_templates.py +21 -3
  6. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/README.md +0 -0
  7. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/databricks_tellr_app/__init__.py +0 -0
  8. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/databricks_tellr_app/run.py +0 -0
  9. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/databricks_tellr_app.egg-info/SOURCES.txt +0 -0
  10. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/databricks_tellr_app.egg-info/dependency_links.txt +0 -0
  11. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/databricks_tellr_app.egg-info/requires.txt +0 -0
  12. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/databricks_tellr_app.egg-info/top_level.txt +0 -0
  13. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/setup.cfg +0 -0
  14. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/setup.py +0 -0
  15. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/__init__.py +0 -0
  16. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/api/__init__.py +0 -0
  17. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/api/_otel_bootstrap.py +0 -0
  18. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/api/fixtures/tour_demo_deck.json +0 -0
  19. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/api/main.py +0 -0
  20. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/api/mcp_auth.py +0 -0
  21. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/api/mcp_server.py +0 -0
  22. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/api/middleware/__init__.py +0 -0
  23. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/api/middleware/csrf.py +0 -0
  24. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/api/middleware/request_logging.py +0 -0
  25. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/api/middleware/security_headers.py +0 -0
  26. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/api/routes/__init__.py +0 -0
  27. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/api/routes/_authz.py +0 -0
  28. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/api/routes/admin.py +0 -0
  29. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/api/routes/admin_usage.py +0 -0
  30. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/api/routes/agent_config.py +0 -0
  31. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/api/routes/chat.py +0 -0
  32. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/api/routes/deck_contributors.py +0 -0
  33. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/api/routes/export.py +0 -0
  34. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/api/routes/feedback.py +0 -0
  35. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/api/routes/google_slides.py +0 -0
  36. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/api/routes/images.py +0 -0
  37. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/api/routes/local_version.py +0 -0
  38. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/api/routes/profiles.py +0 -0
  39. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/api/routes/sessions.py +0 -0
  40. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/api/routes/settings/__init__.py +0 -0
  41. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/api/routes/settings/contributors.py +0 -0
  42. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/api/routes/settings/deck_prompts.py +0 -0
  43. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/api/routes/settings/design_systems.py +0 -0
  44. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/api/routes/settings/identities.py +0 -0
  45. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/api/routes/settings/slide_styles.py +0 -0
  46. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/api/routes/setup.py +0 -0
  47. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/api/routes/slides.py +0 -0
  48. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/api/routes/tools.py +0 -0
  49. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/api/routes/tour.py +0 -0
  50. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/api/routes/verification.py +0 -0
  51. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/api/routes/version.py +0 -0
  52. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/api/schemas/__init__.py +0 -0
  53. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/api/schemas/agent_config.py +0 -0
  54. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/api/schemas/feedback.py +0 -0
  55. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/api/schemas/requests.py +0 -0
  56. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/api/schemas/responses.py +0 -0
  57. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/api/schemas/settings/__init__.py +0 -0
  58. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/api/schemas/settings/requests.py +0 -0
  59. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/api/schemas/settings/responses.py +0 -0
  60. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/api/schemas/streaming.py +0 -0
  61. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/api/services/__init__.py +0 -0
  62. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/api/services/chat_service.py +0 -0
  63. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/api/services/export_job_queue.py +0 -0
  64. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/api/services/feedback_service.py +0 -0
  65. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/api/services/job_queue.py +0 -0
  66. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/api/services/session_manager.py +0 -0
  67. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/api/services/session_naming.py +0 -0
  68. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/api/services/usage_events.py +0 -0
  69. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/api/services/usage_service.py +0 -0
  70. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/api/utils/__init__.py +0 -0
  71. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/api/utils/validation.py +0 -0
  72. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/core/__init__.py +0 -0
  73. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/core/config_loader.py +0 -0
  74. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/core/context_utils.py +0 -0
  75. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/core/database.py +0 -0
  76. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/core/databricks_client.py +0 -0
  77. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/core/defaults.py +0 -0
  78. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/core/encryption.py +0 -0
  79. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/core/init_default_profile.py +0 -0
  80. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/core/lakebase.py +0 -0
  81. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/core/migrate_profiles_to_agent_config.py +0 -0
  82. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/core/mlflow_agent_spans.py +0 -0
  83. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/core/mlflow_tracing.py +0 -0
  84. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/core/otel_logging.py +0 -0
  85. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/core/permission_context.py +0 -0
  86. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/core/prompt_modules.py +0 -0
  87. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/core/settings_db.py +0 -0
  88. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/core/user_context.py +0 -0
  89. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/database/__init__.py +0 -0
  90. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/database/models/__init__.py +0 -0
  91. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/database/models/deck_contributor.py +0 -0
  92. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/database/models/design_system.py +0 -0
  93. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/database/models/encryption_key.py +0 -0
  94. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/database/models/feedback.py +0 -0
  95. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/database/models/genie_space.py +0 -0
  96. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/database/models/google_global_credentials.py +0 -0
  97. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/database/models/google_oauth_token.py +0 -0
  98. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/database/models/identity.py +0 -0
  99. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/database/models/image.py +0 -0
  100. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/database/models/profile.py +0 -0
  101. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/database/models/profile_contributor.py +0 -0
  102. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/database/models/prompts.py +0 -0
  103. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/database/models/request_log.py +0 -0
  104. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/database/models/session.py +0 -0
  105. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/database/models/slide_deck_prompt.py +0 -0
  106. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/database/models/slide_style_library.py +0 -0
  107. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/database/models/usage_event.py +0 -0
  108. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/database/models/user_preference.py +0 -0
  109. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/database/types.py +0 -0
  110. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/domain/__init__.py +0 -0
  111. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/domain/slide.py +0 -0
  112. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/domain/slide_deck.py +0 -0
  113. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/services/__init__.py +0 -0
  114. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/services/agent.py +0 -0
  115. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/services/agent_factory.py +0 -0
  116. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/services/config_service.py +0 -0
  117. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/services/config_validator.py +0 -0
  118. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/services/converter_jail/__init__.py +0 -0
  119. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/services/converter_jail/ast_guard.py +0 -0
  120. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/services/converter_jail/codeprep.py +0 -0
  121. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/services/converter_jail/gslides_runner.py +0 -0
  122. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/services/converter_jail/jail.py +0 -0
  123. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/services/converter_jail/pptx_runner.py +0 -0
  124. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/services/converter_jail/protocol.py +0 -0
  125. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/services/design_system_compiler.py +0 -0
  126. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/services/drive_uploader.py +0 -0
  127. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/services/evaluation/__init__.py +0 -0
  128. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/services/evaluation/llm_judge.py +0 -0
  129. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/services/genie_service.py +0 -0
  130. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/services/google_slides_auth.py +0 -0
  131. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/services/google_slides_prompts_defaults.py +0 -0
  132. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/services/html_to_google_slides.py +0 -0
  133. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/services/html_to_pptx.py +0 -0
  134. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/services/identity_provider.py +0 -0
  135. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/services/identity_providers/__init__.py +0 -0
  136. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/services/identity_providers/account_provider.py +0 -0
  137. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/services/identity_providers/local_provider.py +0 -0
  138. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/services/identity_providers/workspace_provider.py +0 -0
  139. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/services/image_service.py +0 -0
  140. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/services/image_tools.py +0 -0
  141. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/services/permission_service.py +0 -0
  142. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/services/pptx_from_html_huashu.py +0 -0
  143. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/services/pptx_from_records.py +0 -0
  144. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/services/pptx_prompts_defaults.py +0 -0
  145. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/services/profile_service.py +0 -0
  146. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/services/streaming_callback.py +0 -0
  147. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/services/tools/__init__.py +0 -0
  148. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/services/tools/agent_bricks_tool.py +0 -0
  149. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/services/tools/ds_asset_tool.py +0 -0
  150. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/services/tools/genie_tool.py +0 -0
  151. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/services/tools/mcp_tool.py +0 -0
  152. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/services/tools/model_endpoint_tool.py +0 -0
  153. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/services/tools/vector_tool.py +0 -0
  154. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/services/validator.py +0 -0
  155. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/utils/__init__.py +0 -0
  156. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/utils/css_utils.py +0 -0
  157. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/utils/ds_asset_utils.py +0 -0
  158. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/utils/error_handling.py +0 -0
  159. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/utils/html_safety.py +0 -0
  160. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/utils/html_utils.py +0 -0
  161. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/utils/image_utils.py +0 -0
  162. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/utils/js_validator.py +0 -0
  163. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/utils/logging_config.py +0 -0
  164. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/utils/pi_filter.py +0 -0
  165. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/utils/slide_hash.py +0 -0
  166. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/src/utils/spotlight.py +0 -0
  167. {databricks_tellr_app-0.4.2.dev9 → databricks_tellr_app-0.4.2.dev10}/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.2.dev9
3
+ Version: 0.4.2.dev10
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.2.dev9
3
+ Version: 0.4.2.dev10
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.2.dev9"
7
+ version = "0.4.2.dev10"
8
8
  description = "Tellr application package for Databricks Apps"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -11,9 +11,13 @@ Lakebase rows:
11
11
  custom properties are parsed as an ADDITIONAL token source.
12
12
  - ``fonts/**`` and ``assets/**`` — binary files stored as ``design_system_asset``
13
13
  rows (bytes in-DB, following the ``image_assets`` pattern). ``preview*`` files
14
- under ``assets/`` are reference-only and skipped; a template folder's
15
- ``templates/<folder>/preview.*`` screenshot IS stored (kind ``template_shot``,
16
- v1 Phase 4) so the template picker can serve thumbnails.
14
+ under ``assets/`` are reference-only and skipped; a template folder's screenshot
15
+ IS stored (kind ``template_shot``, v1 Phase 4) so the template picker can serve
16
+ thumbnails. Both shipped shapes count: ``templates/<folder>/preview.<ext>`` and
17
+ the DOT-PREFIXED, EXTENSION-LESS ``templates/<folder>/.thumbnail`` a real export
18
+ writes — the latter is allowlisted past the general dotfile skip and has its
19
+ media type SNIFFED from its magic bytes (unknown content is refused, never
20
+ stored under a guessed type).
17
21
 
18
22
  v1 Phase 1 ("import foundation") extends the importer WITHOUT changing the
19
23
  generation seam:
@@ -280,17 +284,76 @@ _TEMPLATE_PREVIEW_RE = re.compile(
280
284
  r"^templates/[^/]+/preview[^/]*\.(png|jpe?g|gif|webp)$", re.IGNORECASE
281
285
  )
282
286
 
287
+ # The SAME screenshot as it actually ships in a real export: DOT-PREFIXED, named
288
+ # ``thumbnail`` rather than ``preview``, and carrying NO file extension —
289
+ # ``templates/<folder>/.thumbnail``. Every one of those was discarded, so a real
290
+ # bundle imported with no thumbnail at all and a NULL ``thumbnail_url``.
291
+ #
292
+ # Deliberately the NARROWEST path shape that describes them: exactly one folder
293
+ # segment under ``templates/``, an optional single leading dot, one of the two
294
+ # known basenames, and NOTHING else — no extension, no suffix. It is this
295
+ # tightness that makes it safe for :func:`_iter_safe_entries` to exempt a match
296
+ # from the general dotfile skip; a dotfile anywhere else stays skipped. Because
297
+ # a match carries no extension, its media type is NOT guessable from the name and
298
+ # is sniffed from the content instead (:func:`_sniff_raster_mime`).
299
+ _TEMPLATE_THUMBNAIL_RE = re.compile(
300
+ r"^templates/[^/]+/\.?(thumbnail|preview)$", re.IGNORECASE
301
+ )
302
+
303
+ # Magic-byte signatures for the raster formats a template thumbnail may be. An
304
+ # extension-less file is stored ONLY if its bytes match one of these; unknown
305
+ # content is refused rather than persisted under a guessed content type. SVG is
306
+ # absent on purpose (it can carry inline script and has no magic number).
307
+ _PNG_MAGIC = b"\x89PNG\r\n\x1a\n"
308
+ _JPEG_MAGIC = b"\xff\xd8\xff"
309
+ _GIF_MAGICS = (b"GIF87a", b"GIF89a")
310
+
311
+
312
+ def _sniff_raster_mime(data: bytes) -> Optional[str]:
313
+ """MIME type from an image's MAGIC BYTES, or ``None`` if not a known raster.
314
+
315
+ Content-based detection for files whose name carries no extension. WebP is a
316
+ RIFF container, so ``RIFF`` alone is not enough — the form type at bytes 8:12
317
+ must spell ``WEBP``, otherwise a RIFF/WAVE file would be stored as an image.
318
+ """
319
+ if data.startswith(_PNG_MAGIC):
320
+ return "image/png"
321
+ if data.startswith(_JPEG_MAGIC):
322
+ return "image/jpeg"
323
+ if data.startswith(_GIF_MAGICS):
324
+ return "image/gif"
325
+ if data[:4] == b"RIFF" and data[8:12] == b"WEBP":
326
+ return "image/webp"
327
+ return None
328
+
329
+
330
+ def _is_template_thumbnail(rel_path: str) -> bool:
331
+ """True for an EXTENSION-LESS template screenshot (``templates/x/.thumbnail``).
332
+
333
+ Distinguished from :func:`_is_template_preview` because the absence of an
334
+ extension is what forces content sniffing.
335
+ """
336
+ return bool(_TEMPLATE_THUMBNAIL_RE.match(rel_path.lower()))
337
+
283
338
 
284
339
  def _is_template_preview(rel_path: str) -> bool:
285
- return bool(_TEMPLATE_PREVIEW_RE.match(rel_path.lower()))
340
+ """True for a template folder's screenshot in EITHER shipped shape."""
341
+ low = rel_path.lower()
342
+ return bool(_TEMPLATE_PREVIEW_RE.match(low)) or bool(
343
+ _TEMPLATE_THUMBNAIL_RE.match(low)
344
+ )
286
345
 
287
346
 
288
347
  def _should_skip(rel_path: str) -> bool:
289
348
  """Only ``assets/**`` and ``fonts/**`` files are stored; skip everything else.
290
349
 
291
350
  Directories, OS junk, dotfiles, template screenshots and ``preview*`` files
292
- (reference-only material) are excluded. Template-folder preview thumbnails
293
- are the exception — the caller checks :func:`_is_template_preview` first.
351
+ (reference-only material) are excluded. Template-folder screenshots are the
352
+ exception — the caller checks :func:`_is_template_preview` first.
353
+
354
+ NOTE: this is not the FIRST gate an entry passes. ``_iter_safe_entries`` runs
355
+ upstream and applies its own dotfile skip, so a dot-prefixed screenshot has to
356
+ be allowlisted THERE as well or it never reaches this function at all.
294
357
  """
295
358
  low = rel_path.lower()
296
359
  base = _basename(low)
@@ -990,6 +1053,17 @@ def _iter_safe_entries(zf: zipfile.ZipFile, root_prefix: str):
990
1053
  Skips directories, OS junk (``__MACOSX``, ``.DS_Store``) and dotfiles. Raises
991
1054
  :class:`DesignSystemImportError` on a zip-slip path (absolute or ``..``) so a
992
1055
  malicious bundle is rejected rather than silently stored.
1056
+
1057
+ This is the ACTUAL first gate every entry passes, so the ONE dot-prefixed shape
1058
+ the importer stores — a template folder's ``.thumbnail`` screenshot
1059
+ (:func:`_is_template_preview`) — is allowlisted HERE too. Without that a fix to
1060
+ the recognizer alone reads as working in a unit test and still drops every real
1061
+ thumbnail, because the entry never reaches the recognizer.
1062
+
1063
+ The zip-slip check runs BEFORE the dotfile decision, so normalization and
1064
+ rejection are never skippable by a dot-prefixed name, and the allowlist is
1065
+ tested against the NORMALIZED path — the same string the recognizer sees
1066
+ downstream, so the gate and the recognizer cannot disagree.
993
1067
  """
994
1068
  for info in zf.infolist():
995
1069
  name = info.filename
@@ -1001,15 +1075,17 @@ def _iter_safe_entries(zf: zipfile.ZipFile, root_prefix: str):
1001
1075
  low = rel_raw.lower()
1002
1076
  if low.startswith("__macosx/") or "/__macosx/" in low:
1003
1077
  continue
1004
- base = _basename(low)
1005
- if base == ".ds_store" or base.startswith("."):
1006
- continue
1007
1078
  safe = _safe_relpath(rel_raw)
1008
1079
  if safe is None:
1009
1080
  raise DesignSystemImportError(
1010
1081
  f"Bundle contains an unsafe path '{rel_raw}' (absolute path or "
1011
1082
  "parent-directory traversal); refusing to import."
1012
1083
  )
1084
+ base = _basename(safe.lower())
1085
+ if (base == ".ds_store" or base.startswith(".")) and not _is_template_preview(
1086
+ safe
1087
+ ):
1088
+ continue
1013
1089
  yield info, safe
1014
1090
 
1015
1091
 
@@ -1176,8 +1252,26 @@ def _collect_assets_and_files(
1176
1252
  # Size-checked read: the declared size is validated BEFORE
1177
1253
  # materialisation (bomb guard).
1178
1254
  data = budget.read_info(zf, info)
1179
- mime = _guess_mime(rel)
1180
1255
  kind = "template_shot" if _is_template_preview(rel) else _infer_asset_kind(rel)
1256
+ if _is_template_thumbnail(rel):
1257
+ # No extension to guess from, so the type comes from the CONTENT.
1258
+ # Unrecognized bytes are REFUSED rather than stored as
1259
+ # application/octet-stream: a thumbnail is served back to the
1260
+ # browser, so its declared type has to be one we actually verified.
1261
+ # Only THIS entry is dropped — a bundle import is one request, and
1262
+ # one junk screenshot must not cost the whole upload.
1263
+ sniffed = _sniff_raster_mime(data)
1264
+ if sniffed is None:
1265
+ logger.warning(
1266
+ "Bundle entry '%s' is not a PNG/JPEG/GIF/WebP image "
1267
+ "(%d bytes); not stored as a template thumbnail",
1268
+ rel,
1269
+ len(data),
1270
+ )
1271
+ continue
1272
+ mime = sniffed
1273
+ else:
1274
+ mime = _guess_mime(rel)
1181
1275
  width, height = _image_dimensions(data, mime)
1182
1276
  asset = DesignSystemAsset(
1183
1277
  kind=kind,
@@ -606,9 +606,27 @@ def _entry_path_candidates(entry: dict) -> list[str]:
606
606
  return out
607
607
 
608
608
 
609
+ #: Basenames a template folder's screenshot ships under, with or without a leading
610
+ #: dot and with or without an extension: the documented ``preview.png`` and the
611
+ #: ``.thumbnail`` a real export actually writes. Matching only ``preview*`` left
612
+ #: every real bundle's ``thumbnail_url`` NULL even once the importer stored the
613
+ #: bytes — the importer and this lookup are two separate gates on the same file.
614
+ _THUMBNAIL_BASENAME_PREFIXES = ("preview", "thumbnail")
615
+
616
+
617
+ def _is_thumbnail_basename(basename: str) -> bool:
618
+ return basename.lstrip(".").startswith(_THUMBNAIL_BASENAME_PREFIXES)
619
+
620
+
609
621
  def _find_thumbnail_asset_id(files: list[Any], template_dir: str) -> Optional[int]:
610
- """The template folder's ``preview*`` screenshot: the smallest-path image
611
- reference row under ``template_dir`` whose basename starts with ``preview``."""
622
+ """The template folder's screenshot: the smallest-path image reference row
623
+ under ``template_dir`` whose basename names a preview or a thumbnail.
624
+
625
+ Smallest path is the tie-break when a folder ships more than one, so the choice
626
+ is deterministic. The ``image/*`` requirement is what keeps a non-image file
627
+ named ``thumbnail`` out: the importer only records a verified, sniffed media
628
+ type on these rows.
629
+ """
612
630
  previews: list[tuple[str, int]] = []
613
631
  for ds_file in files:
614
632
  asset_id = getattr(ds_file, "asset_id", None)
@@ -619,7 +637,7 @@ def _find_thumbnail_asset_id(files: list[Any], template_dir: str) -> Optional[in
619
637
  continue
620
638
  basename = path.rsplit("/", 1)[-1].lower()
621
639
  mime = (getattr(ds_file, "mime", "") or "").lower()
622
- if basename.startswith("preview") and mime.startswith("image/"):
640
+ if _is_thumbnail_basename(basename) and mime.startswith("image/"):
623
641
  previews.append((path, asset_id))
624
642
  return min(previews)[1] if previews else None
625
643