databricks-tellr-app 0.4.3.dev43__tar.gz → 0.4.3.dev3401__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.dev43 → databricks_tellr_app-0.4.3.dev3401}/PKG-INFO +1 -1
  2. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/databricks_tellr_app.egg-info/PKG-INFO +1 -1
  3. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/pyproject.toml +1 -1
  4. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/api/routes/chat.py +31 -6
  5. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/api/routes/export.py +0 -4
  6. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/api/services/export_job_queue.py +1 -3
  7. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/services/image_service.py +2 -31
  8. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/services/image_tools.py +1 -18
  9. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/utils/image_utils.py +6 -27
  10. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/README.md +0 -0
  11. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/databricks_tellr_app/__init__.py +0 -0
  12. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/databricks_tellr_app/run.py +0 -0
  13. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/databricks_tellr_app.egg-info/SOURCES.txt +0 -0
  14. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/databricks_tellr_app.egg-info/dependency_links.txt +0 -0
  15. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/databricks_tellr_app.egg-info/requires.txt +0 -0
  16. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/databricks_tellr_app.egg-info/top_level.txt +0 -0
  17. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/setup.cfg +0 -0
  18. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/setup.py +0 -0
  19. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/__init__.py +0 -0
  20. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/api/__init__.py +0 -0
  21. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/api/_otel_bootstrap.py +0 -0
  22. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/api/fixtures/tour_demo_deck.json +0 -0
  23. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/api/main.py +0 -0
  24. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/api/mcp_auth.py +0 -0
  25. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/api/mcp_server.py +0 -0
  26. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/api/middleware/__init__.py +0 -0
  27. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/api/middleware/csrf.py +0 -0
  28. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/api/middleware/request_logging.py +0 -0
  29. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/api/middleware/security_headers.py +0 -0
  30. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/api/routes/__init__.py +0 -0
  31. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/api/routes/_authz.py +0 -0
  32. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/api/routes/admin.py +0 -0
  33. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/api/routes/admin_usage.py +0 -0
  34. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/api/routes/agent_config.py +0 -0
  35. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/api/routes/deck_contributors.py +0 -0
  36. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/api/routes/feedback.py +0 -0
  37. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/api/routes/google_slides.py +0 -0
  38. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/api/routes/images.py +0 -0
  39. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/api/routes/local_version.py +0 -0
  40. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/api/routes/profiles.py +0 -0
  41. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/api/routes/sessions.py +0 -0
  42. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/api/routes/settings/__init__.py +0 -0
  43. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/api/routes/settings/contributors.py +0 -0
  44. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/api/routes/settings/deck_prompts.py +0 -0
  45. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/api/routes/settings/design_systems.py +0 -0
  46. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/api/routes/settings/identities.py +0 -0
  47. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/api/routes/settings/slide_styles.py +0 -0
  48. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/api/routes/setup.py +0 -0
  49. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/api/routes/slides.py +0 -0
  50. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/api/routes/tools.py +0 -0
  51. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/api/routes/tour.py +0 -0
  52. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/api/routes/verification.py +0 -0
  53. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/api/routes/version.py +0 -0
  54. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/api/schemas/__init__.py +0 -0
  55. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/api/schemas/agent_config.py +0 -0
  56. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/api/schemas/feedback.py +0 -0
  57. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/api/schemas/requests.py +0 -0
  58. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/api/schemas/responses.py +0 -0
  59. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/api/schemas/settings/__init__.py +0 -0
  60. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/api/schemas/settings/requests.py +0 -0
  61. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/api/schemas/settings/responses.py +0 -0
  62. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/api/schemas/streaming.py +0 -0
  63. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/api/services/__init__.py +0 -0
  64. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/api/services/chat_service.py +0 -0
  65. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/api/services/feedback_service.py +0 -0
  66. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/api/services/job_queue.py +0 -0
  67. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/api/services/session_manager.py +0 -0
  68. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/api/services/session_naming.py +0 -0
  69. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/api/services/usage_events.py +0 -0
  70. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/api/services/usage_service.py +0 -0
  71. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/api/utils/__init__.py +0 -0
  72. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/api/utils/validation.py +0 -0
  73. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/core/__init__.py +0 -0
  74. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/core/config_loader.py +0 -0
  75. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/core/context_utils.py +0 -0
  76. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/core/database.py +0 -0
  77. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/core/databricks_client.py +0 -0
  78. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/core/defaults.py +0 -0
  79. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/core/encryption.py +0 -0
  80. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/core/init_default_profile.py +0 -0
  81. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/core/lakebase.py +0 -0
  82. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/core/migrate_profiles_to_agent_config.py +0 -0
  83. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/core/mlflow_agent_spans.py +0 -0
  84. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/core/mlflow_tracing.py +0 -0
  85. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/core/otel_logging.py +0 -0
  86. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/core/permission_context.py +0 -0
  87. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/core/prompt_modules.py +0 -0
  88. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/core/settings_db.py +0 -0
  89. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/core/user_context.py +0 -0
  90. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/database/__init__.py +0 -0
  91. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/database/models/__init__.py +0 -0
  92. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/database/models/deck_contributor.py +0 -0
  93. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/database/models/design_system.py +0 -0
  94. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/database/models/encryption_key.py +0 -0
  95. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/database/models/feedback.py +0 -0
  96. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/database/models/genie_space.py +0 -0
  97. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/database/models/google_global_credentials.py +0 -0
  98. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/database/models/google_oauth_token.py +0 -0
  99. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/database/models/identity.py +0 -0
  100. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/database/models/image.py +0 -0
  101. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/database/models/profile.py +0 -0
  102. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/database/models/profile_contributor.py +0 -0
  103. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/database/models/prompts.py +0 -0
  104. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/database/models/request_log.py +0 -0
  105. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/database/models/session.py +0 -0
  106. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/database/models/slide_deck_prompt.py +0 -0
  107. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/database/models/slide_style_library.py +0 -0
  108. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/database/models/usage_event.py +0 -0
  109. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/database/models/user_preference.py +0 -0
  110. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/database/types.py +0 -0
  111. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/domain/__init__.py +0 -0
  112. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/domain/slide.py +0 -0
  113. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/domain/slide_deck.py +0 -0
  114. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/services/__init__.py +0 -0
  115. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/services/agent.py +0 -0
  116. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/services/agent_factory.py +0 -0
  117. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/services/config_service.py +0 -0
  118. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/services/config_validator.py +0 -0
  119. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/services/converter_jail/__init__.py +0 -0
  120. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/services/converter_jail/ast_guard.py +0 -0
  121. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/services/converter_jail/codeprep.py +0 -0
  122. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/services/converter_jail/gslides_runner.py +0 -0
  123. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/services/converter_jail/jail.py +0 -0
  124. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/services/converter_jail/pptx_runner.py +0 -0
  125. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/services/converter_jail/protocol.py +0 -0
  126. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/services/design_system_compiler.py +0 -0
  127. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/services/design_system_service.py +0 -0
  128. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/services/design_system_templates.py +0 -0
  129. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/services/drive_uploader.py +0 -0
  130. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/services/evaluation/__init__.py +0 -0
  131. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/services/evaluation/llm_judge.py +0 -0
  132. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/services/genie_service.py +0 -0
  133. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/services/google_slides_auth.py +0 -0
  134. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/services/google_slides_prompts_defaults.py +0 -0
  135. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/services/html_to_google_slides.py +0 -0
  136. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/services/html_to_pptx.py +0 -0
  137. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/services/identity_provider.py +0 -0
  138. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/services/identity_providers/__init__.py +0 -0
  139. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/services/identity_providers/account_provider.py +0 -0
  140. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/services/identity_providers/local_provider.py +0 -0
  141. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/services/identity_providers/workspace_provider.py +0 -0
  142. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/services/permission_service.py +0 -0
  143. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/services/pptx_from_html_huashu.py +0 -0
  144. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/services/pptx_from_records.py +0 -0
  145. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/services/pptx_prompts_defaults.py +0 -0
  146. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/services/profile_service.py +0 -0
  147. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/services/streaming_callback.py +0 -0
  148. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/services/tools/__init__.py +0 -0
  149. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/services/tools/agent_bricks_tool.py +0 -0
  150. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/services/tools/ds_asset_tool.py +0 -0
  151. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/services/tools/genie_tool.py +0 -0
  152. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/services/tools/mcp_tool.py +0 -0
  153. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/services/tools/model_endpoint_tool.py +0 -0
  154. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/services/tools/vector_tool.py +0 -0
  155. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/services/validator.py +0 -0
  156. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/utils/__init__.py +0 -0
  157. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/utils/css_utils.py +0 -0
  158. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/utils/ds_asset_utils.py +0 -0
  159. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/utils/error_handling.py +0 -0
  160. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/utils/html_safety.py +0 -0
  161. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/utils/html_utils.py +0 -0
  162. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/utils/js_validator.py +0 -0
  163. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/utils/logging_config.py +0 -0
  164. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/utils/pi_filter.py +0 -0
  165. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/utils/slide_hash.py +0 -0
  166. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/src/utils/spotlight.py +0 -0
  167. {databricks_tellr_app-0.4.3.dev43 → databricks_tellr_app-0.4.3.dev3401}/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.dev43
3
+ Version: 0.4.3.dev3401
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.dev43
3
+ Version: 0.4.3.dev3401
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.dev43"
7
+ version = "0.4.3.dev3401"
8
8
  description = "Tellr application package for Databricks Apps"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -25,7 +25,6 @@ from src.api.schemas.agent_config import normalize_style_source_exclusivity
25
25
  from src.api.schemas.requests import ChatRequest
26
26
  from src.api.schemas.responses import ChatResponse
27
27
  from src.api.schemas.streaming import StreamEvent, StreamEventType
28
- from src.api.routes._authz import _check_deck_permission_for_session
29
28
  from src.api.services.chat_service import get_chat_service
30
29
  from src.api.services.job_queue import enqueue_job
31
30
  from src.api.services.session_manager import SessionNotFoundError, get_session_manager
@@ -121,6 +120,32 @@ def _check_chat_permission(session_id: str, db: DBSession) -> None:
121
120
  )
122
121
 
123
122
 
123
+ def _require_chat_request_owner(session_id: str) -> None:
124
+ """Allow polling only for the session that owns the chat request.
125
+
126
+ ChatRequest rows are bound to a session, and conversations are private
127
+ (same rule as ``GET /api/sessions/{id}/messages``): only the session
128
+ creator may read them. A viewer's contributor session is a different
129
+ session with a different creator, so deck-level CAN_VIEW is not enough.
130
+
131
+ Raises:
132
+ HTTPException 404: Session no longer exists.
133
+ HTTPException 403: Caller is not the session creator.
134
+ """
135
+ session_manager = get_session_manager()
136
+ try:
137
+ session_info = session_manager.get_session(session_id)
138
+ except SessionNotFoundError:
139
+ raise HTTPException(status_code=404, detail="Request not found")
140
+
141
+ current_user = get_current_user()
142
+ if not current_user or session_info.get("created_by") != current_user:
143
+ raise HTTPException(
144
+ status_code=403,
145
+ detail="Conversations are private. Only the session creator can view chat events.",
146
+ )
147
+
148
+
124
149
  def _apply_org_default_style_source(
125
150
  agent_config_data: dict,
126
151
  *,
@@ -671,21 +696,21 @@ async def poll_chat(
671
696
  Dictionary with status, events, last_message_id, and result
672
697
 
673
698
  Raises:
674
- HTTPException: 404 if request not found
699
+ HTTPException: 404 if request not found, 403 if caller is not the
700
+ session creator
675
701
  """
676
702
  session_manager = get_session_manager()
677
703
 
678
704
  # SDR-4437 (chat-poll IDOR): a request_id must not grant access to another
679
705
  # user's chat events/result. ChatRequest rows are session-bound — resolve
680
- # the session and require CAN_VIEW on the deck.
706
+ # the session and require the caller to be its creator (F-CR-31: same
707
+ # privacy rule as /messages; deck CAN_VIEW must not expose chat events).
681
708
  session_id = await asyncio.to_thread(
682
709
  session_manager.get_session_id_for_request, request_id
683
710
  )
684
711
  if session_id is None:
685
712
  raise HTTPException(status_code=404, detail="Request not found")
686
- await asyncio.to_thread(
687
- _check_deck_permission_for_session, session_id, PermissionLevel.CAN_VIEW
688
- )
713
+ await asyncio.to_thread(_require_chat_request_owner, session_id)
689
714
 
690
715
  chat_request = await asyncio.to_thread(
691
716
  session_manager.get_chat_request, request_id
@@ -702,7 +702,6 @@ async def start_pptx_export_async(request: ExportPPTXRequest):
702
702
  enqueue_export_job,
703
703
  generate_job_id,
704
704
  )
705
- from src.services.image_service import resolve_requesting_user
706
705
 
707
706
  import time
708
707
  start_time = time.time()
@@ -760,9 +759,6 @@ async def start_pptx_export_async(request: ExportPPTXRequest):
760
759
  job_id,
761
760
  {
762
761
  "session_id": request.session_id,
763
- # Acting user for {{image:ID}} ownership checks (F-CR-27): the
764
- # worker runs outside this request's user context.
765
- "user_identity": resolve_requesting_user(),
766
762
  "chart_images_per_slide": chart_images_per_slide,
767
763
  "title": slide_deck.get("title", "slides"),
768
764
  "total_slides": total_slides,
@@ -212,9 +212,7 @@ async def process_export_job(job_id: str, payload: dict) -> None:
212
212
  from src.core.database import get_db_session
213
213
  ds_id = resolve_active_design_system_id(session_id)
214
214
  with get_db_session() as db:
215
- substitute_deck_dict_images(
216
- slide_deck, db, requesting_user=payload.get("user_identity")
217
- )
215
+ substitute_deck_dict_images(slide_deck, db)
218
216
  substitute_deck_dict_ds_assets(slide_deck, db, design_system_id=ds_id)
219
217
 
220
218
  slides = slide_deck.get("slides", [])
@@ -1,7 +1,6 @@
1
1
  """Image upload, thumbnail generation, and retrieval service."""
2
2
  import base64
3
3
  import logging
4
- import os
5
4
  import uuid
6
5
  from io import BytesIO
7
6
  from typing import List, Optional
@@ -87,35 +86,10 @@ def upload_image(
87
86
  return image
88
87
 
89
88
 
90
- def resolve_requesting_user() -> Optional[str]:
91
- """Identity to check image ownership against on non-route fetch paths.
92
-
93
- Mirrors ``routes.images._get_current_user`` (the identity ``upload_image``
94
- stamps into ``uploaded_by``) without an extra API call: the dev/test
95
- ``"system"`` fallback, otherwise the request-scoped username set by the auth
96
- middleware / MCP auth. ``None`` when no identity is bound (fail-closed for
97
- ephemeral images).
98
- """
99
- if os.getenv("ENVIRONMENT") in ("development", "test"):
100
- return "system"
101
- from src.core.user_context import get_current_user
102
-
103
- return get_current_user()
104
-
105
-
106
- def get_image_base64(
107
- db: Session, token: str, *, requesting_user: Optional[str]
108
- ) -> tuple[str, str]:
89
+ def get_image_base64(db: Session, token: str) -> tuple[str, str]:
109
90
  """
110
91
  Get full image as base64 string, keyed by the opaque token (SDR-4437 F-TM-7).
111
92
 
112
- Applies the same privacy guard as the ``GET /api/images/{token}`` routes
113
- (F-CR-27): chat-pasted ("ephemeral") images are private to their uploader,
114
- so a token for another user's ephemeral image is reported not-found. Library
115
- images stay open-read. ``requesting_user`` is mandatory and keyword-only so
116
- every caller makes the acting identity explicit; ``None`` fails closed for
117
- ephemeral images.
118
-
119
93
  Returns:
120
94
  Tuple of (base64_data, mime_type)
121
95
  """
@@ -123,10 +97,7 @@ def get_image_base64(
123
97
  ImageAsset.token == token,
124
98
  ImageAsset.is_active == True,
125
99
  ).first()
126
- if not image or (
127
- image.category == "ephemeral"
128
- and (requesting_user is None or image.uploaded_by != requesting_user)
129
- ):
100
+ if not image:
130
101
  raise ValueError(f"Image {token} not found")
131
102
 
132
103
  b64 = base64.b64encode(image.image_data).decode("utf-8")
@@ -10,8 +10,6 @@ from src.services import image_service
10
10
 
11
11
  logger = logging.getLogger(__name__)
12
12
 
13
- _NO_IMAGES_MESSAGE = "No images found matching your criteria."
14
-
15
13
 
16
14
  class SearchImagesInput(BaseModel):
17
15
  """Input schema for image search tool."""
@@ -43,27 +41,12 @@ def search_images(
43
41
  Returns:
44
42
  JSON list of matching images with id, filename, description, and tags
45
43
  """
46
- # F-CR-27: chat-pasted ("ephemeral") images are private to their uploader and
47
- # are never discoverable through the agent tool. The user's own pastes reach
48
- # the agent via their message, not via search.
49
- if category is not None and category.strip().lower() == "ephemeral":
50
- logger.warning("search_images: refusing category='ephemeral' (private images)")
51
- return json.dumps({"message": _NO_IMAGES_MESSAGE, "images": []})
52
-
53
- # Scope the listing to the caller (same as GET /api/images). Fail closed when
54
- # no identity is bound rather than listing every user's images.
55
- requesting_user = image_service.resolve_requesting_user()
56
- if requesting_user is None:
57
- logger.warning("search_images: no requesting user bound; returning no images")
58
- return json.dumps({"message": _NO_IMAGES_MESSAGE, "images": []})
59
-
60
44
  with get_db_session() as db:
61
45
  images = image_service.search_images(
62
46
  db=db,
63
47
  query=query,
64
48
  category=category,
65
49
  tags=tags,
66
- uploaded_by=requesting_user,
67
50
  )
68
51
 
69
52
  # Return metadata only - NEVER base64
@@ -82,6 +65,6 @@ def search_images(
82
65
  ]
83
66
 
84
67
  if not results:
85
- return json.dumps({"message": _NO_IMAGES_MESSAGE, "images": []})
68
+ return json.dumps({"message": "No images found matching your criteria.", "images": []})
86
69
 
87
70
  return json.dumps({"message": f"Found {len(results)} image(s).", "images": results})
@@ -1,7 +1,6 @@
1
1
  """Image placeholder substitution for generated slides."""
2
2
  import logging
3
3
  import re
4
- from typing import Optional
5
4
 
6
5
  from sqlalchemy.orm import Session
7
6
 
@@ -13,31 +12,20 @@ logger = logging.getLogger(__name__)
13
12
  IMAGE_PLACEHOLDER_PATTERN = re.compile(r"\{\{image:([A-Za-z0-9_-]+)\}\}")
14
13
 
15
14
 
16
- def substitute_image_placeholders(
17
- html: str, db: Session, *, requesting_user: Optional[str] = None
18
- ) -> str:
15
+ def substitute_image_placeholders(html: str, db: Session) -> str:
19
16
  """
20
17
  Replace {{image:ID}} placeholders with base64 data URIs.
21
18
 
22
19
  Called after agent generates HTML, before returning to frontend.
23
20
  Works in both HTML img src and CSS url() contexts.
24
-
25
- Resolution is scoped to the acting user (F-CR-27): another user's ephemeral
26
- image is left as an unresolved placeholder. ``requesting_user`` defaults to
27
- the request-scoped identity (``image_service.resolve_requesting_user``);
28
- background callers without a request context must pass it explicitly.
29
21
  """
30
22
  if not html or "{{image:" not in html:
31
23
  return html
32
- if requesting_user is None:
33
- requesting_user = image_service.resolve_requesting_user()
34
24
 
35
25
  def replace_match(match):
36
26
  image_token = match.group(1)
37
27
  try:
38
- b64_data, mime_type = image_service.get_image_base64(
39
- db, image_token, requesting_user=requesting_user
40
- )
28
+ b64_data, mime_type = image_service.get_image_base64(db, image_token)
41
29
  return f"data:{mime_type};base64,{b64_data}"
42
30
  except Exception as e:
43
31
  logger.warning(f"Failed to resolve image placeholder {{{{image:{image_token}}}}}: {e}")
@@ -53,32 +41,23 @@ def substitute_image_placeholders(
53
41
  _DECK_IMAGE_FIELDS = ("html_content", "css")
54
42
 
55
43
 
56
- def substitute_deck_dict_images(
57
- deck_dict: dict, db: Session, *, requesting_user: Optional[str] = None
58
- ) -> dict:
44
+ def substitute_deck_dict_images(deck_dict: dict, db: Session) -> dict:
59
45
  """Substitute {{image:ID}} placeholders across a deck dict.
60
46
 
61
47
  Covers every field that can carry the placeholder: each slide's ``html``,
62
48
  the deck's ``html_content`` (full knitted HTML) and its top-level ``css``
63
49
  (backgrounds). Deck-level fields are resolved independently of the slides
64
50
  array, mirroring ``substitute_deck_dict_ds_assets`` — the css gap fixed
65
- there existed here too. ``requesting_user`` is as for
66
- ``substitute_image_placeholders``.
51
+ there existed here too.
67
52
  """
68
53
  if not deck_dict:
69
54
  return deck_dict
70
- if requesting_user is None:
71
- requesting_user = image_service.resolve_requesting_user()
72
55
  for slide in deck_dict.get("slides") or []:
73
56
  html = slide.get("html", "")
74
57
  if "{{image:" in html:
75
- slide["html"] = substitute_image_placeholders(
76
- html, db, requesting_user=requesting_user
77
- )
58
+ slide["html"] = substitute_image_placeholders(html, db)
78
59
  for field in _DECK_IMAGE_FIELDS:
79
60
  value = deck_dict.get(field)
80
61
  if value and "{{image:" in value:
81
- deck_dict[field] = substitute_image_placeholders(
82
- value, db, requesting_user=requesting_user
83
- )
62
+ deck_dict[field] = substitute_image_placeholders(value, db)
84
63
  return deck_dict