databricks-tellr-app 0.4.3.dev4__tar.gz → 0.4.3.dev6__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.dev4 → databricks_tellr_app-0.4.3.dev6}/PKG-INFO +1 -1
  2. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/databricks_tellr_app.egg-info/PKG-INFO +1 -1
  3. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/pyproject.toml +1 -1
  4. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/api/main.py +2 -4
  5. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/api/routes/google_slides.py +47 -94
  6. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/api/routes/sessions.py +3 -83
  7. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/README.md +0 -0
  8. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/databricks_tellr_app/__init__.py +0 -0
  9. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/databricks_tellr_app/run.py +0 -0
  10. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/databricks_tellr_app.egg-info/SOURCES.txt +0 -0
  11. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/databricks_tellr_app.egg-info/dependency_links.txt +0 -0
  12. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/databricks_tellr_app.egg-info/requires.txt +0 -0
  13. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/databricks_tellr_app.egg-info/top_level.txt +0 -0
  14. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/setup.cfg +0 -0
  15. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/setup.py +0 -0
  16. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/__init__.py +0 -0
  17. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/api/__init__.py +0 -0
  18. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/api/_otel_bootstrap.py +0 -0
  19. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/api/fixtures/tour_demo_deck.json +0 -0
  20. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/api/mcp_auth.py +0 -0
  21. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/api/mcp_server.py +0 -0
  22. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/api/middleware/__init__.py +0 -0
  23. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/api/middleware/csrf.py +0 -0
  24. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/api/middleware/request_logging.py +0 -0
  25. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/api/middleware/security_headers.py +0 -0
  26. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/api/routes/__init__.py +0 -0
  27. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/api/routes/_authz.py +0 -0
  28. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/api/routes/admin.py +0 -0
  29. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/api/routes/admin_usage.py +0 -0
  30. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/api/routes/agent_config.py +0 -0
  31. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/api/routes/chat.py +0 -0
  32. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/api/routes/deck_contributors.py +0 -0
  33. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/api/routes/export.py +0 -0
  34. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/api/routes/feedback.py +0 -0
  35. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/api/routes/images.py +0 -0
  36. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/api/routes/local_version.py +0 -0
  37. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/api/routes/profiles.py +0 -0
  38. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/api/routes/settings/__init__.py +0 -0
  39. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/api/routes/settings/contributors.py +0 -0
  40. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/api/routes/settings/deck_prompts.py +0 -0
  41. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/api/routes/settings/design_systems.py +0 -0
  42. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/api/routes/settings/identities.py +0 -0
  43. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/api/routes/settings/slide_styles.py +0 -0
  44. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/api/routes/setup.py +0 -0
  45. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/api/routes/slides.py +0 -0
  46. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/api/routes/tools.py +0 -0
  47. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/api/routes/tour.py +0 -0
  48. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/api/routes/verification.py +0 -0
  49. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/api/routes/version.py +0 -0
  50. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/api/schemas/__init__.py +0 -0
  51. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/api/schemas/agent_config.py +0 -0
  52. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/api/schemas/feedback.py +0 -0
  53. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/api/schemas/requests.py +0 -0
  54. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/api/schemas/responses.py +0 -0
  55. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/api/schemas/settings/__init__.py +0 -0
  56. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/api/schemas/settings/requests.py +0 -0
  57. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/api/schemas/settings/responses.py +0 -0
  58. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/api/schemas/streaming.py +0 -0
  59. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/api/services/__init__.py +0 -0
  60. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/api/services/chat_service.py +0 -0
  61. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/api/services/export_job_queue.py +0 -0
  62. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/api/services/feedback_service.py +0 -0
  63. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/api/services/job_queue.py +0 -0
  64. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/api/services/session_manager.py +0 -0
  65. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/api/services/session_naming.py +0 -0
  66. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/api/services/usage_events.py +0 -0
  67. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/api/services/usage_service.py +0 -0
  68. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/api/utils/__init__.py +0 -0
  69. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/api/utils/validation.py +0 -0
  70. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/core/__init__.py +0 -0
  71. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/core/config_loader.py +0 -0
  72. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/core/context_utils.py +0 -0
  73. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/core/database.py +0 -0
  74. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/core/databricks_client.py +0 -0
  75. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/core/defaults.py +0 -0
  76. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/core/encryption.py +0 -0
  77. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/core/init_default_profile.py +0 -0
  78. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/core/lakebase.py +0 -0
  79. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/core/migrate_profiles_to_agent_config.py +0 -0
  80. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/core/mlflow_agent_spans.py +0 -0
  81. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/core/mlflow_tracing.py +0 -0
  82. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/core/otel_logging.py +0 -0
  83. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/core/permission_context.py +0 -0
  84. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/core/prompt_modules.py +0 -0
  85. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/core/settings_db.py +0 -0
  86. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/core/user_context.py +0 -0
  87. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/database/__init__.py +0 -0
  88. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/database/models/__init__.py +0 -0
  89. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/database/models/deck_contributor.py +0 -0
  90. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/database/models/design_system.py +0 -0
  91. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/database/models/encryption_key.py +0 -0
  92. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/database/models/feedback.py +0 -0
  93. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/database/models/genie_space.py +0 -0
  94. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/database/models/google_global_credentials.py +0 -0
  95. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/database/models/google_oauth_token.py +0 -0
  96. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/database/models/identity.py +0 -0
  97. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/database/models/image.py +0 -0
  98. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/database/models/profile.py +0 -0
  99. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/database/models/profile_contributor.py +0 -0
  100. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/database/models/prompts.py +0 -0
  101. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/database/models/request_log.py +0 -0
  102. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/database/models/session.py +0 -0
  103. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/database/models/slide_deck_prompt.py +0 -0
  104. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/database/models/slide_style_library.py +0 -0
  105. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/database/models/usage_event.py +0 -0
  106. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/database/models/user_preference.py +0 -0
  107. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/database/types.py +0 -0
  108. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/domain/__init__.py +0 -0
  109. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/domain/slide.py +0 -0
  110. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/domain/slide_deck.py +0 -0
  111. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/services/__init__.py +0 -0
  112. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/services/agent.py +0 -0
  113. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/services/agent_factory.py +0 -0
  114. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/services/config_service.py +0 -0
  115. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/services/config_validator.py +0 -0
  116. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/services/converter_jail/__init__.py +0 -0
  117. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/services/converter_jail/ast_guard.py +0 -0
  118. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/services/converter_jail/codeprep.py +0 -0
  119. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/services/converter_jail/gslides_runner.py +0 -0
  120. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/services/converter_jail/jail.py +0 -0
  121. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/services/converter_jail/pptx_runner.py +0 -0
  122. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/services/converter_jail/protocol.py +0 -0
  123. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/services/design_system_compiler.py +0 -0
  124. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/services/design_system_service.py +0 -0
  125. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/services/design_system_templates.py +0 -0
  126. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/services/drive_uploader.py +0 -0
  127. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/services/evaluation/__init__.py +0 -0
  128. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/services/evaluation/llm_judge.py +0 -0
  129. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/services/genie_service.py +0 -0
  130. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/services/google_slides_auth.py +0 -0
  131. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/services/google_slides_prompts_defaults.py +0 -0
  132. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/services/html_to_google_slides.py +0 -0
  133. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/services/html_to_pptx.py +0 -0
  134. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/services/identity_provider.py +0 -0
  135. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/services/identity_providers/__init__.py +0 -0
  136. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/services/identity_providers/account_provider.py +0 -0
  137. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/services/identity_providers/local_provider.py +0 -0
  138. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/services/identity_providers/workspace_provider.py +0 -0
  139. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/services/image_service.py +0 -0
  140. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/services/image_tools.py +0 -0
  141. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/services/permission_service.py +0 -0
  142. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/services/pptx_from_html_huashu.py +0 -0
  143. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/services/pptx_from_records.py +0 -0
  144. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/services/pptx_prompts_defaults.py +0 -0
  145. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/services/profile_service.py +0 -0
  146. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/services/streaming_callback.py +0 -0
  147. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/services/tools/__init__.py +0 -0
  148. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/services/tools/agent_bricks_tool.py +0 -0
  149. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/services/tools/ds_asset_tool.py +0 -0
  150. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/services/tools/genie_tool.py +0 -0
  151. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/services/tools/mcp_tool.py +0 -0
  152. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/services/tools/model_endpoint_tool.py +0 -0
  153. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/services/tools/vector_tool.py +0 -0
  154. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/services/validator.py +0 -0
  155. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/utils/__init__.py +0 -0
  156. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/utils/css_utils.py +0 -0
  157. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/utils/ds_asset_utils.py +0 -0
  158. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/utils/error_handling.py +0 -0
  159. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/utils/html_safety.py +0 -0
  160. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/utils/html_utils.py +0 -0
  161. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/utils/image_utils.py +0 -0
  162. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/utils/js_validator.py +0 -0
  163. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/utils/logging_config.py +0 -0
  164. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/utils/pi_filter.py +0 -0
  165. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/utils/slide_hash.py +0 -0
  166. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/src/utils/spotlight.py +0 -0
  167. {databricks_tellr_app-0.4.3.dev4 → databricks_tellr_app-0.4.3.dev6}/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.dev4
3
+ Version: 0.4.3.dev6
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.dev4
3
+ Version: 0.4.3.dev6
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.dev4"
7
+ version = "0.4.3.dev6"
8
8
  description = "Tellr application package for Databricks Apps"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -337,14 +337,12 @@ async def user_auth_middleware(request: Request, call_next):
337
337
  user_name = None
338
338
 
339
339
  if token:
340
- # Diagnostic logging: check if token is service principal ID (debug to avoid log spam on every request/poll)
341
- token_prefix = token[:20] if len(token) > 20 else token
340
+ # Diagnostic logging: flag SP-vs-user tokens. F-CR-9 (SDR-4437): never log
341
+ # any part of the bearer token (no prefix, no length) only derived booleans.
342
342
  is_sp_token = client_id and token.startswith(client_id)
343
343
  logger.debug(
344
344
  "OBO auth: extracted token from header",
345
345
  extra={
346
- "token_prefix": token_prefix,
347
- "token_length": len(token),
348
346
  "is_service_principal": is_sp_token,
349
347
  "header_present": True,
350
348
  },
@@ -10,10 +10,9 @@ user tokens are stored per-user in the ``google_oauth_tokens`` table.
10
10
  import json
11
11
  import logging
12
12
  import os
13
- import secrets
14
13
  from typing import Any, Optional
15
14
 
16
- from fastapi import APIRouter, Depends, HTTPException, Query, Request, Response
15
+ from fastapi import APIRouter, Depends, HTTPException, Query, Request
17
16
  from fastapi.responses import HTMLResponse
18
17
  from pydantic import BaseModel
19
18
  from sqlalchemy.orm import Session
@@ -34,12 +33,6 @@ logger = logging.getLogger(__name__)
34
33
 
35
34
  router = APIRouter(prefix="/api/export/google-slides", tags=["google-slides"])
36
35
 
37
- # F-CR-3 (SDR-4437): the OAuth "state" carries an unguessable nonce that is also
38
- # stored in this short-lived cookie; the callback requires them to match before
39
- # exchanging the authorization code (anti-CSRF / anti-login-CSRF double-submit).
40
- _OAUTH_STATE_COOKIE = "g_oauth_state"
41
- _OAUTH_COOKIE_PATH = "/api/export/google-slides"
42
-
43
36
 
44
37
  # -------------------------------------------------------------------------
45
38
  # Helpers
@@ -105,76 +98,32 @@ class AuthUrlResponse(BaseModel):
105
98
  # -------------------------------------------------------------------------
106
99
 
107
100
 
108
- def _build_app_origin(request: Request) -> str:
109
- """Return the public origin (``scheme://host``) serving the app.
101
+ def _build_redirect_uri(request: Request) -> str:
102
+ """Build the OAuth callback redirect URI from the current request.
103
+
104
+ Google requires redirect URIs to match *exactly* what's registered in GCP,
105
+ with no query parameters.
110
106
 
111
107
  Behind a reverse proxy (e.g. Databricks Apps), ``request.base_url``
112
108
  returns the internal address (``http://localhost:8000``). We use the
113
109
  ``X-Forwarded-Host`` / ``X-Forwarded-Proto`` headers set by the proxy
114
- to reconstruct the public URL instead. For localhost, force ``http``.
110
+ to reconstruct the public URL instead.
111
+
112
+ For localhost, Google only allows ``http``.
115
113
  """
116
114
  forwarded_host = request.headers.get("x-forwarded-host")
117
115
  forwarded_proto = request.headers.get("x-forwarded-proto")
118
116
 
119
117
  if forwarded_host:
120
118
  scheme = forwarded_proto or "https"
121
- return f"{scheme}://{forwarded_host.split(',')[0].strip()}"
122
-
123
- base = str(request.base_url).rstrip("/")
124
- if "://localhost" in base or "://127.0.0.1" in base:
125
- base = base.replace("https://", "http://")
126
- return base
127
-
128
-
129
- def _build_redirect_uri(request: Request) -> str:
130
- """Build the OAuth callback redirect URI from the current request.
131
-
132
- Google requires redirect URIs to match *exactly* what's registered in GCP,
133
- with no query parameters.
134
- """
135
- return f"{_build_app_origin(request)}/api/export/google-slides/auth/callback"
136
-
137
-
138
- # Callback page template. The JS object braces are intentionally literal; the
139
- # %TOKENS% are substituted below so the postMessage targets the explicit app
140
- # origin (F-CR-3) instead of the wildcard '*'.
141
- _CALLBACK_TEMPLATE = """
142
- <html><body>
143
- <h2>%TITLE%</h2>
144
- <p>%MESSAGE%</p>
145
- <script>
146
- if (window.opener) {
147
- window.opener.postMessage({ type: 'google-slides-auth', success: %SUCCESS% }, %ORIGIN%);
148
- }
149
- setTimeout(() => window.close(), %DELAY%);
150
- </script>
151
- </body></html>
152
- """
153
-
154
-
155
- def _callback_response(app_origin: str, *, success: bool) -> HTMLResponse:
156
- """Render the popup callback page and clear the anti-CSRF state cookie.
157
-
158
- ``postMessage`` targets ``app_origin`` explicitly (F-CR-3); ``json.dumps``
159
- yields a safely-quoted JS string literal for the origin.
160
- """
161
- if success:
162
- title, message, delay = "Authorization Successful", "You can close this window.", "1500"
119
+ base = f"{scheme}://{forwarded_host.split(',')[0].strip()}"
163
120
  else:
164
- title = "Authorization Failed"
165
- message = "Authorization could not be completed. Please close this window and try again."
166
- delay = "3000"
167
- body = (
168
- _CALLBACK_TEMPLATE
169
- .replace("%TITLE%", title)
170
- .replace("%MESSAGE%", message)
171
- .replace("%SUCCESS%", "true" if success else "false")
172
- .replace("%ORIGIN%", json.dumps(app_origin))
173
- .replace("%DELAY%", delay)
174
- )
175
- resp = HTMLResponse(content=body, status_code=200)
176
- resp.delete_cookie(_OAUTH_STATE_COOKIE, path=_OAUTH_COOKIE_PATH)
177
- return resp
121
+ base = str(request.base_url).rstrip("/")
122
+ # Force http for localhost (Google rejects https://localhost)
123
+ if "://localhost" in base or "://127.0.0.1" in base:
124
+ base = base.replace("https://", "http://")
125
+
126
+ return f"{base}/api/export/google-slides/auth/callback"
178
127
 
179
128
 
180
129
  @router.get("/auth/status", response_model=AuthStatusResponse)
@@ -192,7 +141,6 @@ async def auth_status(db: Session = Depends(get_db)):
192
141
  @router.get("/auth/url", response_model=AuthUrlResponse)
193
142
  async def auth_url(
194
143
  request: Request,
195
- response: Response,
196
144
  db: Session = Depends(get_db),
197
145
  ):
198
146
  """Generate the Google OAuth consent URL.
@@ -201,26 +149,13 @@ async def auth_url(
201
149
  passed via the OAuth ``state`` parameter so the callback can persist the
202
150
  token for the correct user — the redirect URI itself stays clean
203
151
  (no query params) to satisfy Google's exact-match requirement.
204
-
205
- F-CR-3: an unguessable nonce is bound into both the ``state`` and a
206
- short-lived cookie; the callback requires them to match.
207
152
  """
208
153
  try:
209
154
  auth = _get_auth(db)
210
155
  redirect_uri = _build_redirect_uri(request)
211
- nonce = secrets.token_urlsafe(32)
212
- state = json.dumps({"user": _get_user_identity(), "nonce": nonce})
156
+ state = json.dumps({"user": _get_user_identity()})
213
157
  url = auth.get_auth_url(redirect_uri=redirect_uri, state=state)
214
158
 
215
- response.set_cookie(
216
- key=_OAUTH_STATE_COOKIE,
217
- value=nonce,
218
- max_age=600,
219
- httponly=True,
220
- secure=True,
221
- samesite="lax", # sent on Google's top-level redirect back to us
222
- path=_OAUTH_COOKIE_PATH,
223
- )
224
159
  return AuthUrlResponse(url=url)
225
160
  except GoogleSlidesAuthError as exc:
226
161
  raise HTTPException(status_code=400, detail=str(exc)) from exc
@@ -249,22 +184,12 @@ async def auth_callback(
249
184
  them in the ``google_oauth_tokens`` table. Returns a small HTML page
250
185
  that notifies the opener window and closes itself.
251
186
  """
252
- app_origin = _build_app_origin(request)
253
- cookie_nonce = request.cookies.get(_OAUTH_STATE_COOKIE)
254
187
  try:
255
188
  state_data = json.loads(state) if state else {}
256
189
  user = state_data.get("user")
257
190
  if not user:
258
191
  raise ValueError("Missing user in OAuth state")
259
192
 
260
- # F-CR-3: verify the anti-CSRF nonce BEFORE exchanging the code. The
261
- # state nonce must match the cookie set when the auth URL was issued.
262
- state_nonce = state_data.get("nonce")
263
- if not cookie_nonce or not state_nonce or not secrets.compare_digest(
264
- str(cookie_nonce), str(state_nonce)
265
- ):
266
- raise ValueError("OAuth state nonce mismatch")
267
-
268
193
  auth = _get_auth(db)
269
194
  redirect_uri = _build_redirect_uri(request)
270
195
  code_verifier = state_data.get("code_verifier")
@@ -277,9 +202,37 @@ async def auth_callback(
277
202
  # F-CR-2 (SDR-4437): never reflect the raw exception into the HTML page —
278
203
  # it is logged server-side above. Show a static, generic failure message.
279
204
  logger.error("OAuth callback failed", exc_info=True)
280
- return _callback_response(app_origin, success=False)
205
+ return HTMLResponse(
206
+ content="""
207
+ <html><body>
208
+ <h2>Authorization Failed</h2>
209
+ <p>Authorization could not be completed. Please close this window and try again.</p>
210
+ <script>
211
+ if (window.opener) {
212
+ window.opener.postMessage({ type: 'google-slides-auth', success: false }, '*');
213
+ }
214
+ setTimeout(() => window.close(), 3000);
215
+ </script>
216
+ </body></html>
217
+ """,
218
+ status_code=200,
219
+ )
281
220
 
282
- return _callback_response(app_origin, success=True)
221
+ return HTMLResponse(
222
+ content="""
223
+ <html><body>
224
+ <h2>Authorization Successful</h2>
225
+ <p>You can close this window.</p>
226
+ <script>
227
+ if (window.opener) {
228
+ window.opener.postMessage({ type: 'google-slides-auth', success: true }, '*');
229
+ }
230
+ setTimeout(() => window.close(), 1500);
231
+ </script>
232
+ </body></html>
233
+ """,
234
+ status_code=200,
235
+ )
283
236
 
284
237
 
285
238
  # -------------------------------------------------------------------------
@@ -9,10 +9,7 @@ Session access is controlled by:
9
9
  """
10
10
 
11
11
  import asyncio
12
- import json
13
12
  import logging
14
- from datetime import datetime
15
- from pathlib import Path
16
13
  from typing import Optional
17
14
 
18
15
  from fastapi import APIRouter, Depends, HTTPException, Query
@@ -769,86 +766,9 @@ async def cleanup_expired_sessions():
769
766
  ) from e
770
767
 
771
768
 
772
- @router.post("/{session_id}/export")
773
- async def export_session(session_id: str):
774
- """Export full session data to logs/sessions/{session_id}.json for debugging.
775
-
776
- Exports:
777
- - Session info (id, timestamps, profile)
778
- - All chat messages (user + AI responses with full content)
779
- - Full slide deck (HTML, scripts, slide count)
780
-
781
- Args:
782
- session_id: Session to export
783
-
784
- Returns:
785
- Export confirmation with file path
786
- """
787
- try:
788
- # Permission check: require CAN_VIEW on the deck
789
- await asyncio.to_thread(
790
- _check_deck_permission_for_session, session_id, PermissionLevel.CAN_VIEW
791
- )
792
-
793
- session_manager = get_session_manager()
794
-
795
- # Get all session data
796
- session = await asyncio.to_thread(session_manager.get_session, session_id)
797
- messages = await asyncio.to_thread(session_manager.get_messages, session_id)
798
- slide_deck = await asyncio.to_thread(session_manager.get_slide_deck, session_id)
799
-
800
- # Build export data
801
- export_data = {
802
- "exported_at": datetime.utcnow().isoformat(),
803
- "session": session,
804
- "messages": messages,
805
- "slide_deck": slide_deck,
806
- "summary": {
807
- "message_count": len(messages),
808
- "slide_count": slide_deck.get("slide_count", 0) if slide_deck else 0,
809
- "user_messages": sum(1 for m in messages if m.get("role") == "user"),
810
- "ai_messages": sum(1 for m in messages if m.get("role") == "assistant"),
811
- }
812
- }
813
-
814
- # Ensure logs/sessions directory exists
815
- sessions_dir = Path("logs/sessions")
816
- sessions_dir.mkdir(parents=True, exist_ok=True)
817
-
818
- # Write to file
819
- export_path = sessions_dir / f"{session_id}.json"
820
- with open(export_path, "w", encoding="utf-8") as f:
821
- json.dump(export_data, f, indent=2, default=str)
822
-
823
- logger.info(
824
- "Session exported",
825
- extra={
826
- "session_id": session_id,
827
- "export_path": str(export_path),
828
- "message_count": len(messages),
829
- },
830
- )
831
-
832
- return {
833
- "status": "exported",
834
- "session_id": session_id,
835
- "export_path": str(export_path),
836
- "summary": export_data["summary"],
837
- }
838
-
839
- except SessionNotFoundError:
840
- raise HTTPException(
841
- status_code=404,
842
- detail=f"Session not found: {session_id}",
843
- )
844
- except HTTPException:
845
- raise
846
- except Exception as e:
847
- logger.error(f"Failed to export session: {e}", exc_info=True)
848
- raise HTTPException(
849
- status_code=500,
850
- detail="Export failed",
851
- ) from e
769
+ # F-CR-10 (SDR-4437): the debug-only POST /{session_id}/export endpoint was
770
+ # removed — it was unused by the frontend and dumped full session data (all chat
771
+ # messages + deck) to logs/sessions/{id}.json.
852
772
 
853
773
 
854
774
  # =========================================================================