databricks-tellr-app 0.4.3.dev19__tar.gz → 0.4.3.dev21__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 (199) hide show
  1. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/PKG-INFO +10 -8
  2. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/databricks_tellr_app/run.py +45 -0
  3. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/databricks_tellr_app.egg-info/PKG-INFO +10 -8
  4. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/databricks_tellr_app.egg-info/SOURCES.txt +62 -0
  5. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/databricks_tellr_app.egg-info/requires.txt +9 -7
  6. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/pyproject.toml +17 -8
  7. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/fixtures/tour_demo_deck.json +52 -1
  8. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/main.py +22 -15
  9. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/mcp_auth.py +25 -36
  10. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/routes/chat.py +80 -5
  11. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/routes/sessions.py +74 -5
  12. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/routes/settings/design_systems.py +2 -22
  13. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/routes/slides.py +133 -4
  14. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/routes/tour.py +28 -0
  15. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/routes/verification.py +9 -9
  16. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/routes/version.py +2 -6
  17. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/schemas/agent_config.py +4 -10
  18. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/schemas/settings/requests.py +0 -11
  19. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/schemas/settings/responses.py +0 -2
  20. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/schemas/streaming.py +23 -0
  21. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/services/chat_service.py +852 -13
  22. databricks_tellr_app-0.4.3.dev21/src/api/services/deck_level_writer.py +407 -0
  23. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/services/job_queue.py +15 -0
  24. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/services/session_manager.py +1282 -47
  25. databricks_tellr_app-0.4.3.dev21/src/api/services/slide_repository.py +378 -0
  26. databricks_tellr_app-0.4.3.dev21/src/core/backfill_session_slides_startup.py +315 -0
  27. databricks_tellr_app-0.4.3.dev21/src/core/checkpointer.py +488 -0
  28. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/core/config_loader.py +4 -11
  29. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/core/database.py +375 -0
  30. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/core/databricks_client.py +0 -50
  31. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/core/defaults.py +9 -0
  32. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/core/encryption.py +32 -54
  33. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/core/init_default_profile.py +0 -5
  34. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/core/migrate_profiles_to_agent_config.py +4 -28
  35. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/core/settings_db.py +3 -2
  36. databricks_tellr_app-0.4.3.dev21/src/core/skills/__init__.py +225 -0
  37. databricks_tellr_app-0.4.3.dev21/src/core/skills/architect.py +64 -0
  38. databricks_tellr_app-0.4.3.dev21/src/core/skills/build_reviewer.py +80 -0
  39. databricks_tellr_app-0.4.3.dev21/src/core/skills/builder.py +54 -0
  40. databricks_tellr_app-0.4.3.dev21/src/core/skills/data_analyst.py +38 -0
  41. databricks_tellr_app-0.4.3.dev21/src/core/skills/deck_reviewer.py +24 -0
  42. databricks_tellr_app-0.4.3.dev21/src/core/skills/fix_reviewer.py +22 -0
  43. databricks_tellr_app-0.4.3.dev21/src/core/skills/fixer.py +52 -0
  44. databricks_tellr_app-0.4.3.dev21/src/core/strip_retired_prompt_keys.py +210 -0
  45. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/database/models/__init__.py +8 -0
  46. databricks_tellr_app-0.4.3.dev21/src/database/models/deck_review.py +77 -0
  47. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/database/models/encryption_key.py +2 -6
  48. databricks_tellr_app-0.4.3.dev21/src/database/models/graph_checkpoint.py +104 -0
  49. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/database/models/prompts.py +7 -6
  50. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/database/models/session.py +127 -1
  51. databricks_tellr_app-0.4.3.dev21/src/domain/deck_spec.py +166 -0
  52. databricks_tellr_app-0.4.3.dev21/src/domain/finding.py +313 -0
  53. databricks_tellr_app-0.4.3.dev21/src/domain/skill_io.py +259 -0
  54. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/domain/slide_deck.py +10 -4
  55. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/agent.py +24 -5
  56. databricks_tellr_app-0.4.3.dev21/src/services/agent_factory.py +150 -0
  57. databricks_tellr_app-0.4.3.dev19/src/services/agent_factory.py → databricks_tellr_app-0.4.3.dev21/src/services/agent_resolution.py +260 -168
  58. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/config_service.py +0 -12
  59. databricks_tellr_app-0.4.3.dev21/src/services/deck_css_aggregator.py +211 -0
  60. databricks_tellr_app-0.4.3.dev21/src/services/deck_review_store.py +263 -0
  61. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/design_system_compiler.py +1 -20
  62. databricks_tellr_app-0.4.3.dev21/src/services/foreman_service.py +307 -0
  63. databricks_tellr_app-0.4.3.dev21/src/services/graph/__init__.py +6 -0
  64. databricks_tellr_app-0.4.3.dev21/src/services/graph/builder.py +265 -0
  65. databricks_tellr_app-0.4.3.dev21/src/services/graph/event_emitter.py +186 -0
  66. databricks_tellr_app-0.4.3.dev21/src/services/graph/nodes.py +2682 -0
  67. databricks_tellr_app-0.4.3.dev21/src/services/graph/routers.py +203 -0
  68. databricks_tellr_app-0.4.3.dev21/src/services/graph/state.py +307 -0
  69. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/html_to_google_slides.py +1 -1
  70. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/html_to_pptx.py +2 -2
  71. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/profile_service.py +0 -7
  72. databricks_tellr_app-0.4.3.dev21/src/services/spec_sync.py +756 -0
  73. databricks_tellr_app-0.4.3.dev21/src/services/template_sections.py +512 -0
  74. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/validator.py +6 -10
  75. databricks_tellr_app-0.4.3.dev21/src/utils/css_utils.py +289 -0
  76. databricks_tellr_app-0.4.3.dev21/src/utils/graph_safety.py +100 -0
  77. databricks_tellr_app-0.4.3.dev19/src/utils/css_utils.py +0 -78
  78. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/README.md +0 -0
  79. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/databricks_tellr_app/__init__.py +0 -0
  80. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/databricks_tellr_app.egg-info/dependency_links.txt +0 -0
  81. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/databricks_tellr_app.egg-info/top_level.txt +0 -0
  82. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/setup.cfg +0 -0
  83. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/setup.py +0 -0
  84. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/__init__.py +0 -0
  85. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/__init__.py +0 -0
  86. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/_otel_bootstrap.py +0 -0
  87. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/mcp_server.py +0 -0
  88. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/middleware/__init__.py +0 -0
  89. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/middleware/csrf.py +0 -0
  90. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/middleware/request_logging.py +0 -0
  91. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/middleware/security_headers.py +0 -0
  92. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/routes/__init__.py +0 -0
  93. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/routes/_authz.py +0 -0
  94. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/routes/admin.py +0 -0
  95. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/routes/admin_usage.py +0 -0
  96. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/routes/agent_config.py +0 -0
  97. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/routes/deck_contributors.py +0 -0
  98. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/routes/export.py +0 -0
  99. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/routes/feedback.py +0 -0
  100. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/routes/google_slides.py +0 -0
  101. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/routes/images.py +0 -0
  102. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/routes/local_version.py +0 -0
  103. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/routes/profiles.py +0 -0
  104. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/routes/settings/__init__.py +0 -0
  105. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/routes/settings/contributors.py +0 -0
  106. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/routes/settings/deck_prompts.py +0 -0
  107. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/routes/settings/identities.py +0 -0
  108. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/routes/settings/slide_styles.py +0 -0
  109. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/routes/setup.py +0 -0
  110. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/routes/tools.py +0 -0
  111. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/schemas/__init__.py +0 -0
  112. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/schemas/feedback.py +0 -0
  113. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/schemas/requests.py +0 -0
  114. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/schemas/responses.py +0 -0
  115. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/schemas/settings/__init__.py +0 -0
  116. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/services/__init__.py +0 -0
  117. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/services/export_job_queue.py +0 -0
  118. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/services/feedback_service.py +0 -0
  119. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/services/session_naming.py +0 -0
  120. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/services/usage_events.py +0 -0
  121. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/services/usage_service.py +0 -0
  122. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/utils/__init__.py +0 -0
  123. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/utils/validation.py +0 -0
  124. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/core/__init__.py +0 -0
  125. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/core/context_utils.py +0 -0
  126. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/core/lakebase.py +0 -0
  127. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/core/mlflow_agent_spans.py +0 -0
  128. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/core/mlflow_tracing.py +0 -0
  129. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/core/otel_logging.py +0 -0
  130. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/core/permission_context.py +0 -0
  131. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/core/prompt_modules.py +0 -0
  132. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/core/user_context.py +0 -0
  133. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/database/__init__.py +0 -0
  134. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/database/models/deck_contributor.py +0 -0
  135. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/database/models/design_system.py +0 -0
  136. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/database/models/feedback.py +0 -0
  137. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/database/models/genie_space.py +0 -0
  138. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/database/models/google_global_credentials.py +0 -0
  139. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/database/models/google_oauth_token.py +0 -0
  140. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/database/models/identity.py +0 -0
  141. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/database/models/image.py +0 -0
  142. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/database/models/profile.py +0 -0
  143. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/database/models/profile_contributor.py +0 -0
  144. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/database/models/request_log.py +0 -0
  145. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/database/models/slide_deck_prompt.py +0 -0
  146. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/database/models/slide_style_library.py +0 -0
  147. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/database/models/usage_event.py +0 -0
  148. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/database/models/user_preference.py +0 -0
  149. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/database/types.py +0 -0
  150. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/domain/__init__.py +0 -0
  151. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/domain/slide.py +0 -0
  152. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/__init__.py +0 -0
  153. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/config_validator.py +0 -0
  154. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/converter_jail/__init__.py +0 -0
  155. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/converter_jail/ast_guard.py +0 -0
  156. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/converter_jail/codeprep.py +0 -0
  157. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/converter_jail/gslides_runner.py +0 -0
  158. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/converter_jail/jail.py +0 -0
  159. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/converter_jail/pptx_runner.py +0 -0
  160. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/converter_jail/protocol.py +0 -0
  161. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/design_system_service.py +0 -0
  162. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/design_system_templates.py +0 -0
  163. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/drive_uploader.py +0 -0
  164. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/evaluation/__init__.py +0 -0
  165. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/evaluation/llm_judge.py +0 -0
  166. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/genie_service.py +0 -0
  167. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/google_slides_auth.py +0 -0
  168. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/google_slides_prompts_defaults.py +0 -0
  169. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/identity_provider.py +0 -0
  170. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/identity_providers/__init__.py +0 -0
  171. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/identity_providers/account_provider.py +0 -0
  172. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/identity_providers/local_provider.py +0 -0
  173. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/identity_providers/workspace_provider.py +0 -0
  174. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/image_service.py +0 -0
  175. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/image_tools.py +0 -0
  176. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/permission_service.py +0 -0
  177. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/pptx_from_html_huashu.py +0 -0
  178. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/pptx_from_records.py +0 -0
  179. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/pptx_prompts_defaults.py +0 -0
  180. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/streaming_callback.py +0 -0
  181. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/tools/__init__.py +0 -0
  182. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/tools/agent_bricks_tool.py +0 -0
  183. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/tools/ds_asset_tool.py +0 -0
  184. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/tools/genie_tool.py +0 -0
  185. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/tools/mcp_tool.py +0 -0
  186. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/tools/model_endpoint_tool.py +0 -0
  187. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/tools/vector_tool.py +0 -0
  188. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/utils/__init__.py +0 -0
  189. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/utils/ds_asset_utils.py +0 -0
  190. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/utils/error_handling.py +0 -0
  191. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/utils/html_safety.py +0 -0
  192. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/utils/html_utils.py +0 -0
  193. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/utils/image_utils.py +0 -0
  194. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/utils/js_validator.py +0 -0
  195. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/utils/logging_config.py +0 -0
  196. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/utils/pi_filter.py +0 -0
  197. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/utils/slide_hash.py +0 -0
  198. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/utils/spotlight.py +0 -0
  199. {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/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.dev19
3
+ Version: 0.4.3.dev21
4
4
  Summary: Tellr application package for Databricks Apps
5
5
  Requires-Python: >=3.10
6
6
  Description-Content-Type: text/markdown
@@ -10,10 +10,10 @@ Requires-Dist: python-multipart==0.0.20
10
10
  Requires-Dist: pydantic==2.12.4
11
11
  Requires-Dist: pydantic-settings==2.12.0
12
12
  Requires-Dist: databricks-langchain==0.9.0
13
- Requires-Dist: langchain==1.0.5
14
- Requires-Dist: langchain-core==1.0.4
15
- Requires-Dist: langchain-community==0.4.1
16
- Requires-Dist: langchain-text-splitters==1.0.0
13
+ Requires-Dist: langchain==1.3.14
14
+ Requires-Dist: langchain-core==1.5.3
15
+ Requires-Dist: langchain-community==0.4.2
16
+ Requires-Dist: langchain-text-splitters==1.1.2
17
17
  Requires-Dist: litellm==1.80.11
18
18
  Requires-Dist: mcp==1.27.0
19
19
  Requires-Dist: opentelemetry-api==1.38.0
@@ -47,9 +47,11 @@ Requires-Dist: databricks-ai-bridge==0.21.0
47
47
  Requires-Dist: databricks-ai-search==0.76
48
48
  Requires-Dist: databricks-connect==16.1.7
49
49
  Requires-Dist: databricks-vectorsearch==0.75
50
- Requires-Dist: langchain-classic==1.0.0
51
- Requires-Dist: langgraph==1.0.10
52
- Requires-Dist: langgraph-prebuilt==1.0.10
50
+ Requires-Dist: langchain-classic==1.0.8
51
+ Requires-Dist: langgraph==1.2.10
52
+ Requires-Dist: langgraph-checkpoint==4.1.1
53
+ Requires-Dist: langgraph-prebuilt==1.1.0
54
+ Requires-Dist: langgraph-sdk==0.4.2
53
55
  Requires-Dist: langsmith==0.9.5
54
56
  Requires-Dist: unitycatalog-ai==0.3.2
55
57
  Requires-Dist: unitycatalog-langchain==0.3.0
@@ -74,6 +74,29 @@ def init_database(seed_databricks_defaults: bool = False) -> None:
74
74
  logger.error(f"Failed to migrate profiles/sessions to agent_config: {e}\n{tb}")
75
75
  raise SystemExit(1) from e
76
76
 
77
+ # Row-per-slide (PR1): migrate historical deck_json blobs into session_slides
78
+ # rows. Runs HERE, pre-fork, for the same reason as the two migrations above —
79
+ # the uvicorn workers must never execute migration code. It originally lived in
80
+ # the FastAPI lifespan; main moved migrations out of the lifespan while this
81
+ # branch was in flight, so it was relocated on merge rather than dropped.
82
+ #
83
+ # Guarded by a per-deck NOT EXISTS anti-join over session_slides (index-only
84
+ # against its composite PK), so it is a no-op scan once every deck has rows.
85
+ # A deck whose blob will not parse is logged and skipped, never raised — one
86
+ # bad row must not abort startup.
87
+ logger.info("Backfilling session_slides rows...")
88
+ try:
89
+ from src.core.database import get_session_local
90
+ from src.core.backfill_session_slides_startup import backfill_unmigrated_decks
91
+
92
+ slide_decks = backfill_unmigrated_decks(get_session_local())
93
+ if slide_decks:
94
+ logger.info(f"Backfilled {slide_decks} deck(s) into session_slides rows")
95
+ except Exception as e:
96
+ tb = traceback.format_exc()
97
+ logger.error(f"Failed to backfill session_slides rows: {e}\n{tb}")
98
+ raise SystemExit(1) from e
99
+
77
100
  # Seed default content
78
101
  logger.info(f"Seeding defaults (include_databricks={seed_databricks_defaults})...")
79
102
  try:
@@ -97,6 +120,28 @@ def init_database(seed_databricks_defaults: bool = False) -> None:
97
120
  logger.error(f"Failed to ensure encryption key: {e}\n{tb}")
98
121
  raise SystemExit(1) from e
99
122
 
123
+ # Retired prompt overrides: strip 'system_prompt' and
124
+ # 'slide_editing_instructions' out of every stored agent_config blob. The
125
+ # physical columns are dropped inside init_db()'s migration chain, early,
126
+ # because a database that still has them cannot insert a profile; the BLOB
127
+ # strip runs LAST, deliberately — it is the one position no later step can
128
+ # undo by writing a fresh blob (seed_defaults above creates profiles).
129
+ # A blob that will not parse is logged and skipped, never raised, so one bad
130
+ # row cannot abort startup; anything else here is SystemExit(1) like the five
131
+ # steps above.
132
+ logger.info("Stripping retired prompt keys from agent_config blobs...")
133
+ try:
134
+ from src.core.database import get_session_local
135
+ from src.core.strip_retired_prompt_keys import strip_retired_prompt_keys
136
+
137
+ stripped = strip_retired_prompt_keys(get_session_local())
138
+ if stripped:
139
+ logger.info(f"Stripped retired prompt keys from {stripped} row(s)")
140
+ except Exception as e:
141
+ tb = traceback.format_exc()
142
+ logger.error(f"Failed to strip retired prompt keys from agent_config: {e}\n{tb}")
143
+ raise SystemExit(1) from e
144
+
100
145
 
101
146
  def main() -> None:
102
147
  """Start the uvicorn server."""
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: databricks-tellr-app
3
- Version: 0.4.3.dev19
3
+ Version: 0.4.3.dev21
4
4
  Summary: Tellr application package for Databricks Apps
5
5
  Requires-Python: >=3.10
6
6
  Description-Content-Type: text/markdown
@@ -10,10 +10,10 @@ Requires-Dist: python-multipart==0.0.20
10
10
  Requires-Dist: pydantic==2.12.4
11
11
  Requires-Dist: pydantic-settings==2.12.0
12
12
  Requires-Dist: databricks-langchain==0.9.0
13
- Requires-Dist: langchain==1.0.5
14
- Requires-Dist: langchain-core==1.0.4
15
- Requires-Dist: langchain-community==0.4.1
16
- Requires-Dist: langchain-text-splitters==1.0.0
13
+ Requires-Dist: langchain==1.3.14
14
+ Requires-Dist: langchain-core==1.5.3
15
+ Requires-Dist: langchain-community==0.4.2
16
+ Requires-Dist: langchain-text-splitters==1.1.2
17
17
  Requires-Dist: litellm==1.80.11
18
18
  Requires-Dist: mcp==1.27.0
19
19
  Requires-Dist: opentelemetry-api==1.38.0
@@ -47,9 +47,11 @@ Requires-Dist: databricks-ai-bridge==0.21.0
47
47
  Requires-Dist: databricks-ai-search==0.76
48
48
  Requires-Dist: databricks-connect==16.1.7
49
49
  Requires-Dist: databricks-vectorsearch==0.75
50
- Requires-Dist: langchain-classic==1.0.0
51
- Requires-Dist: langgraph==1.0.10
52
- Requires-Dist: langgraph-prebuilt==1.0.10
50
+ Requires-Dist: langchain-classic==1.0.8
51
+ Requires-Dist: langgraph==1.2.10
52
+ Requires-Dist: langgraph-checkpoint==4.1.1
53
+ Requires-Dist: langgraph-prebuilt==1.1.0
54
+ Requires-Dist: langgraph-sdk==0.4.2
53
55
  Requires-Dist: langsmith==0.9.5
54
56
  Requires-Dist: unitycatalog-ai==0.3.2
55
57
  Requires-Dist: unitycatalog-langchain==0.3.0
@@ -51,16 +51,20 @@ setup.py
51
51
  ./src/api/schemas/settings/responses.py
52
52
  ./src/api/services/__init__.py
53
53
  ./src/api/services/chat_service.py
54
+ ./src/api/services/deck_level_writer.py
54
55
  ./src/api/services/export_job_queue.py
55
56
  ./src/api/services/feedback_service.py
56
57
  ./src/api/services/job_queue.py
57
58
  ./src/api/services/session_manager.py
58
59
  ./src/api/services/session_naming.py
60
+ ./src/api/services/slide_repository.py
59
61
  ./src/api/services/usage_events.py
60
62
  ./src/api/services/usage_service.py
61
63
  ./src/api/utils/__init__.py
62
64
  ./src/api/utils/validation.py
63
65
  ./src/core/__init__.py
66
+ ./src/core/backfill_session_slides_startup.py
67
+ ./src/core/checkpointer.py
64
68
  ./src/core/config_loader.py
65
69
  ./src/core/context_utils.py
66
70
  ./src/core/database.py
@@ -76,17 +80,28 @@ setup.py
76
80
  ./src/core/permission_context.py
77
81
  ./src/core/prompt_modules.py
78
82
  ./src/core/settings_db.py
83
+ ./src/core/strip_retired_prompt_keys.py
79
84
  ./src/core/user_context.py
85
+ ./src/core/skills/__init__.py
86
+ ./src/core/skills/architect.py
87
+ ./src/core/skills/build_reviewer.py
88
+ ./src/core/skills/builder.py
89
+ ./src/core/skills/data_analyst.py
90
+ ./src/core/skills/deck_reviewer.py
91
+ ./src/core/skills/fix_reviewer.py
92
+ ./src/core/skills/fixer.py
80
93
  ./src/database/__init__.py
81
94
  ./src/database/types.py
82
95
  ./src/database/models/__init__.py
83
96
  ./src/database/models/deck_contributor.py
97
+ ./src/database/models/deck_review.py
84
98
  ./src/database/models/design_system.py
85
99
  ./src/database/models/encryption_key.py
86
100
  ./src/database/models/feedback.py
87
101
  ./src/database/models/genie_space.py
88
102
  ./src/database/models/google_global_credentials.py
89
103
  ./src/database/models/google_oauth_token.py
104
+ ./src/database/models/graph_checkpoint.py
90
105
  ./src/database/models/identity.py
91
106
  ./src/database/models/image.py
92
107
  ./src/database/models/profile.py
@@ -99,17 +114,24 @@ setup.py
99
114
  ./src/database/models/usage_event.py
100
115
  ./src/database/models/user_preference.py
101
116
  ./src/domain/__init__.py
117
+ ./src/domain/deck_spec.py
118
+ ./src/domain/finding.py
119
+ ./src/domain/skill_io.py
102
120
  ./src/domain/slide.py
103
121
  ./src/domain/slide_deck.py
104
122
  ./src/services/__init__.py
105
123
  ./src/services/agent.py
106
124
  ./src/services/agent_factory.py
125
+ ./src/services/agent_resolution.py
107
126
  ./src/services/config_service.py
108
127
  ./src/services/config_validator.py
128
+ ./src/services/deck_css_aggregator.py
129
+ ./src/services/deck_review_store.py
109
130
  ./src/services/design_system_compiler.py
110
131
  ./src/services/design_system_service.py
111
132
  ./src/services/design_system_templates.py
112
133
  ./src/services/drive_uploader.py
134
+ ./src/services/foreman_service.py
113
135
  ./src/services/genie_service.py
114
136
  ./src/services/google_slides_auth.py
115
137
  ./src/services/google_slides_prompts_defaults.py
@@ -123,7 +145,9 @@ setup.py
123
145
  ./src/services/pptx_from_records.py
124
146
  ./src/services/pptx_prompts_defaults.py
125
147
  ./src/services/profile_service.py
148
+ ./src/services/spec_sync.py
126
149
  ./src/services/streaming_callback.py
150
+ ./src/services/template_sections.py
127
151
  ./src/services/validator.py
128
152
  ./src/services/converter_jail/__init__.py
129
153
  ./src/services/converter_jail/ast_guard.py
@@ -134,6 +158,12 @@ setup.py
134
158
  ./src/services/converter_jail/protocol.py
135
159
  ./src/services/evaluation/__init__.py
136
160
  ./src/services/evaluation/llm_judge.py
161
+ ./src/services/graph/__init__.py
162
+ ./src/services/graph/builder.py
163
+ ./src/services/graph/event_emitter.py
164
+ ./src/services/graph/nodes.py
165
+ ./src/services/graph/routers.py
166
+ ./src/services/graph/state.py
137
167
  ./src/services/identity_providers/__init__.py
138
168
  ./src/services/identity_providers/account_provider.py
139
169
  ./src/services/identity_providers/local_provider.py
@@ -149,6 +179,7 @@ setup.py
149
179
  ./src/utils/css_utils.py
150
180
  ./src/utils/ds_asset_utils.py
151
181
  ./src/utils/error_handling.py
182
+ ./src/utils/graph_safety.py
152
183
  ./src/utils/html_safety.py
153
184
  ./src/utils/html_utils.py
154
185
  ./src/utils/image_utils.py
@@ -213,16 +244,20 @@ src/api/schemas/settings/requests.py
213
244
  src/api/schemas/settings/responses.py
214
245
  src/api/services/__init__.py
215
246
  src/api/services/chat_service.py
247
+ src/api/services/deck_level_writer.py
216
248
  src/api/services/export_job_queue.py
217
249
  src/api/services/feedback_service.py
218
250
  src/api/services/job_queue.py
219
251
  src/api/services/session_manager.py
220
252
  src/api/services/session_naming.py
253
+ src/api/services/slide_repository.py
221
254
  src/api/services/usage_events.py
222
255
  src/api/services/usage_service.py
223
256
  src/api/utils/__init__.py
224
257
  src/api/utils/validation.py
225
258
  src/core/__init__.py
259
+ src/core/backfill_session_slides_startup.py
260
+ src/core/checkpointer.py
226
261
  src/core/config_loader.py
227
262
  src/core/context_utils.py
228
263
  src/core/database.py
@@ -238,17 +273,28 @@ src/core/otel_logging.py
238
273
  src/core/permission_context.py
239
274
  src/core/prompt_modules.py
240
275
  src/core/settings_db.py
276
+ src/core/strip_retired_prompt_keys.py
241
277
  src/core/user_context.py
278
+ src/core/skills/__init__.py
279
+ src/core/skills/architect.py
280
+ src/core/skills/build_reviewer.py
281
+ src/core/skills/builder.py
282
+ src/core/skills/data_analyst.py
283
+ src/core/skills/deck_reviewer.py
284
+ src/core/skills/fix_reviewer.py
285
+ src/core/skills/fixer.py
242
286
  src/database/__init__.py
243
287
  src/database/types.py
244
288
  src/database/models/__init__.py
245
289
  src/database/models/deck_contributor.py
290
+ src/database/models/deck_review.py
246
291
  src/database/models/design_system.py
247
292
  src/database/models/encryption_key.py
248
293
  src/database/models/feedback.py
249
294
  src/database/models/genie_space.py
250
295
  src/database/models/google_global_credentials.py
251
296
  src/database/models/google_oauth_token.py
297
+ src/database/models/graph_checkpoint.py
252
298
  src/database/models/identity.py
253
299
  src/database/models/image.py
254
300
  src/database/models/profile.py
@@ -261,17 +307,24 @@ src/database/models/slide_style_library.py
261
307
  src/database/models/usage_event.py
262
308
  src/database/models/user_preference.py
263
309
  src/domain/__init__.py
310
+ src/domain/deck_spec.py
311
+ src/domain/finding.py
312
+ src/domain/skill_io.py
264
313
  src/domain/slide.py
265
314
  src/domain/slide_deck.py
266
315
  src/services/__init__.py
267
316
  src/services/agent.py
268
317
  src/services/agent_factory.py
318
+ src/services/agent_resolution.py
269
319
  src/services/config_service.py
270
320
  src/services/config_validator.py
321
+ src/services/deck_css_aggregator.py
322
+ src/services/deck_review_store.py
271
323
  src/services/design_system_compiler.py
272
324
  src/services/design_system_service.py
273
325
  src/services/design_system_templates.py
274
326
  src/services/drive_uploader.py
327
+ src/services/foreman_service.py
275
328
  src/services/genie_service.py
276
329
  src/services/google_slides_auth.py
277
330
  src/services/google_slides_prompts_defaults.py
@@ -285,7 +338,9 @@ src/services/pptx_from_html_huashu.py
285
338
  src/services/pptx_from_records.py
286
339
  src/services/pptx_prompts_defaults.py
287
340
  src/services/profile_service.py
341
+ src/services/spec_sync.py
288
342
  src/services/streaming_callback.py
343
+ src/services/template_sections.py
289
344
  src/services/validator.py
290
345
  src/services/converter_jail/__init__.py
291
346
  src/services/converter_jail/ast_guard.py
@@ -296,6 +351,12 @@ src/services/converter_jail/pptx_runner.py
296
351
  src/services/converter_jail/protocol.py
297
352
  src/services/evaluation/__init__.py
298
353
  src/services/evaluation/llm_judge.py
354
+ src/services/graph/__init__.py
355
+ src/services/graph/builder.py
356
+ src/services/graph/event_emitter.py
357
+ src/services/graph/nodes.py
358
+ src/services/graph/routers.py
359
+ src/services/graph/state.py
299
360
  src/services/identity_providers/__init__.py
300
361
  src/services/identity_providers/account_provider.py
301
362
  src/services/identity_providers/local_provider.py
@@ -311,6 +372,7 @@ src/utils/__init__.py
311
372
  src/utils/css_utils.py
312
373
  src/utils/ds_asset_utils.py
313
374
  src/utils/error_handling.py
375
+ src/utils/graph_safety.py
314
376
  src/utils/html_safety.py
315
377
  src/utils/html_utils.py
316
378
  src/utils/image_utils.py
@@ -4,10 +4,10 @@ python-multipart==0.0.20
4
4
  pydantic==2.12.4
5
5
  pydantic-settings==2.12.0
6
6
  databricks-langchain==0.9.0
7
- langchain==1.0.5
8
- langchain-core==1.0.4
9
- langchain-community==0.4.1
10
- langchain-text-splitters==1.0.0
7
+ langchain==1.3.14
8
+ langchain-core==1.5.3
9
+ langchain-community==0.4.2
10
+ langchain-text-splitters==1.1.2
11
11
  litellm==1.80.11
12
12
  mcp==1.27.0
13
13
  opentelemetry-api==1.38.0
@@ -41,9 +41,11 @@ databricks-ai-bridge==0.21.0
41
41
  databricks-ai-search==0.76
42
42
  databricks-connect==16.1.7
43
43
  databricks-vectorsearch==0.75
44
- langchain-classic==1.0.0
45
- langgraph==1.0.10
46
- langgraph-prebuilt==1.0.10
44
+ langchain-classic==1.0.8
45
+ langgraph==1.2.10
46
+ langgraph-checkpoint==4.1.1
47
+ langgraph-prebuilt==1.1.0
48
+ langgraph-sdk==0.4.2
47
49
  langsmith==0.9.5
48
50
  unitycatalog-ai==0.3.2
49
51
  unitycatalog-langchain==0.3.0
@@ -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.dev19"
7
+ version = "0.4.3.dev21"
8
8
  description = "Tellr application package for Databricks Apps"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -15,10 +15,10 @@ dependencies = [
15
15
  "pydantic==2.12.4",
16
16
  "pydantic-settings==2.12.0",
17
17
  "databricks-langchain==0.9.0",
18
- "langchain==1.0.5",
19
- "langchain-core==1.0.4",
20
- "langchain-community==0.4.1",
21
- "langchain-text-splitters==1.0.0",
18
+ "langchain==1.3.14",
19
+ "langchain-core==1.5.3",
20
+ "langchain-community==0.4.2",
21
+ "langchain-text-splitters==1.1.2",
22
22
  "litellm==1.80.11",
23
23
  "mcp==1.27.0",
24
24
  "opentelemetry-api==1.38.0",
@@ -73,6 +73,13 @@ dependencies = [
73
73
  # `pip install databricks-tellr-app` is safe.
74
74
  # SDR-4437 MEDIUM-7 (July 2026): the 7 formerly-ranged direct deps above
75
75
  # this block are now exact-pinned too; same refresh discipline.
76
+ # PR2 LangGraph stack bump (August 2026): updated langchain 1.0.5→1.3.14,
77
+ # langchain-core 1.0.4→1.5.3, langchain-community 0.4.1→0.4.2,
78
+ # langchain-text-splitters 1.0.0→1.1.2, langchain-classic 1.0.0→1.0.8,
79
+ # langgraph 1.0.10→1.2.10, added langgraph-checkpoint==4.1.1,
80
+ # langgraph-prebuilt 1.0.10→1.1.0, added langgraph-sdk==0.4.2. These match
81
+ # the repo-root requirements.txt and pyproject.toml. MUST be re-verified via
82
+ # a devloop deploy on db-tellr-dev-pinfix or equivalent before PR3 ships.
76
83
  "databricks-sdk==0.120.0",
77
84
  "mlflow[databricks]==3.14.0",
78
85
  "mlflow-skinny==3.14.0",
@@ -81,9 +88,11 @@ dependencies = [
81
88
  "databricks-ai-search==0.76",
82
89
  "databricks-connect==16.1.7",
83
90
  "databricks-vectorsearch==0.75",
84
- "langchain-classic==1.0.0",
85
- "langgraph==1.0.10",
86
- "langgraph-prebuilt==1.0.10",
91
+ "langchain-classic==1.0.8",
92
+ "langgraph==1.2.10",
93
+ "langgraph-checkpoint==4.1.1",
94
+ "langgraph-prebuilt==1.1.0",
95
+ "langgraph-sdk==0.4.2",
87
96
  "langsmith==0.9.5",
88
97
  "unitycatalog-ai==0.3.2",
89
98
  "unitycatalog-langchain==0.3.0",
@@ -24,5 +24,56 @@
24
24
  }
25
25
  ],
26
26
  "chat_prompt": "Create 3 slides about the benefits of AI in modern healthcare, with a title slide, key advantages, and future outlook.",
27
- "chat_reply": "Here's your deck with 3 slides! I've created:\n\n1. **Title Slide** — introducing AI in healthcare\n2. **Key Advantages** — early detection, personalized treatment, operational efficiency, and drug discovery\n3. **Future Outlook** — predictive monitoring, AI-assisted surgery, and global health equity\n\nFeel free to ask me to refine any slide, add new ones, or change the style."
27
+ "chat_reply": "Here's your deck with 3 slides! I've created:\n\n1. **Title Slide** — introducing AI in healthcare\n2. **Key Advantages** — early detection, personalized treatment, operational efficiency, and drug discovery\n3. **Future Outlook** — predictive monitoring, AI-assisted surgery, and global health equity\n\nFeel free to ask me to refine any slide, add new ones, or change the style.",
28
+ "deck_spec": {
29
+ "title": "Example Deck — AI in Healthcare",
30
+ "audience": "A first-time Tellr user taking the product tour: a general business audience, with no clinical or machine-learning background assumed.",
31
+ "purpose": "Show a new user what a finished Tellr deck looks like, on a subject that needs no domain briefing, so they can see structure and styling before they write their own prompt.",
32
+ "argument": "AI already delivers concrete benefits across diagnosis, treatment and research, and its near-term trajectory points at prevention and wider access, so it is worth engaging with now rather than watching.",
33
+ "call_to_action": "Ask the assistant to refine a slide, add a new one, or change the style: the next step of the tour.",
34
+ "narrative_arc": [
35
+ "Frame the subject: AI is already changing patient care, diagnostics and medical research, a transformation under way rather than a forecast.",
36
+ "Ground that claim in four advantages visible today: earlier disease detection, personalized treatment, operational efficiency, and faster drug discovery.",
37
+ "Extend today's gains into the near future and land on access: predictive monitoring, AI-assisted surgery, and specialist-level care reaching underserved communities."
38
+ ],
39
+ "design_contract": {
40
+ "design_system_id": null,
41
+ "template_id": null,
42
+ "slide_style_id": null
43
+ },
44
+ "resolved_data": {
45
+ "synthesis": "No live data was resolved for this deck. The tour ships fixed illustrative bytes so every user sees the same three slides; the claims are widely reported general benefits of AI in healthcare, not figures drawn from a source system.",
46
+ "figures": [],
47
+ "gaps": [
48
+ "No quantitative source: the deck cites no measured figure, so no claim in it is traceable to a dataset.",
49
+ "No organisation context: the tour deck is deliberately generic and names no customer, hospital or vendor."
50
+ ]
51
+ },
52
+ "slides": [
53
+ {
54
+ "position": 0,
55
+ "purpose": "Open the deck: name the subject and frame AI in healthcare as a transformation already under way.",
56
+ "content_brief": "Title slide. Badge reading 'AI & Healthcare', headline 'The Benefits of AI in Modern Healthcare', and a one-line standfirst naming the three areas the deck covers: patient care, diagnostics, and medical research.",
57
+ "assumes": "Nothing. This is the deck's first slide.",
58
+ "hands_off": "The reader knows the subject and expects concrete advantages next.",
59
+ "data_references": []
60
+ },
61
+ {
62
+ "position": 1,
63
+ "purpose": "Make the case with four concrete present-day advantages, so the benefit claim is specific rather than atmospheric.",
64
+ "content_brief": "Four bolded items, one explanatory clause each: early disease detection (imaging patterns a human reader can miss), personalized treatment plans (genetics, lifestyle, history), operational efficiency (scheduling, documentation, triage), and drug discovery acceleration (molecular simulation at scale).",
65
+ "assumes": "The reader has accepted the framing from the title slide.",
66
+ "hands_off": "The present-tense case is made; the reader is ready to look forward.",
67
+ "data_references": []
68
+ },
69
+ {
70
+ "position": 2,
71
+ "purpose": "Extend the argument from today's gains to the near future and close on access, so the deck ends on consequence rather than a list.",
72
+ "content_brief": "Three bolded forward-looking items: predictive health monitoring (wearables shifting medicine from reactive to proactive), AI-assisted surgery (robotics guided by real-time analysis), and global health equity (mobile diagnostics for underserved communities). Close on the italic line about healthcare becoming intelligent, personalized and accessible to all.",
73
+ "assumes": "The reader accepts the four present-day advantages from the previous slide.",
74
+ "hands_off": "The deck ends; the reader leaves with the equity claim as the takeaway.",
75
+ "data_references": []
76
+ }
77
+ ]
78
+ }
28
79
  }
@@ -51,13 +51,14 @@ _worker_task = None
51
51
  _export_worker_task = None
52
52
  _cleanup_task = None
53
53
  _timeout_task = None
54
+ _spec_sweeper_task = None
54
55
  _frontend_assets_stack: ExitStack | None = None
55
56
 
56
57
 
57
58
  @asynccontextmanager
58
59
  async def lifespan(app: FastAPI):
59
60
  """Lifespan context manager for startup/shutdown events."""
60
- global _worker_task, _export_worker_task, _cleanup_task, _timeout_task, _frontend_assets_stack
61
+ global _worker_task, _export_worker_task, _cleanup_task, _timeout_task, _spec_sweeper_task, _frontend_assets_stack
61
62
 
62
63
  # Startup
63
64
  logger.info(f"Starting AI Slide Generator API (environment: {ENVIRONMENT})")
@@ -134,6 +135,16 @@ async def lifespan(app: FastAPI):
134
135
  _cleanup_task = asyncio.create_task(request_log_cleanup_loop())
135
136
  logger.info("Request log cleanup task started")
136
137
 
138
+ # Start the spec-dirty arc-review sweeper. A PERIODIC LOOP, so it belongs
139
+ # here beside the two above and NOT in run.py::init_database: the
140
+ # pre-fork rule there is for migrations and backfills, which must run
141
+ # exactly once, and a loop started in that step would die with it. It
142
+ # runs in every uvicorn worker (UVICORN_WORKERS defaults to 4), which is
143
+ # why claim_due_marker takes an atomic lease rather than trusting a read.
144
+ from src.services.spec_sync import spec_review_sweeper_loop
145
+ _spec_sweeper_task = asyncio.create_task(spec_review_sweeper_loop())
146
+ logger.info("Spec-review arc sweeper started")
147
+
137
148
  # Recover any stuck requests from previous crashes
138
149
  try:
139
150
  recovered = await recover_stuck_requests()
@@ -185,6 +196,14 @@ async def lifespan(app: FastAPI):
185
196
  pass
186
197
  logger.info("MCP job timeout sweeper stopped")
187
198
 
199
+ if _spec_sweeper_task:
200
+ _spec_sweeper_task.cancel()
201
+ try:
202
+ await _spec_sweeper_task
203
+ except asyncio.CancelledError:
204
+ pass
205
+ logger.info("Spec-review arc sweeper stopped")
206
+
188
207
  # Tear down the FastMCP session manager's task group. Safe to call
189
208
  # unconditionally — the stack was entered unconditionally at startup.
190
209
  await mcp_lifespan_stack.aclose()
@@ -489,23 +508,11 @@ logger.info("MCP server mounted at /mcp")
489
508
 
490
509
  @app.get("/api/health")
491
510
  async def health():
492
- """Health check endpoint.
493
-
494
- ``encryption_key_source`` is load-bearing for deployment: ``tellr.update``
495
- polls it to confirm a relocated app is reading the secret before it deletes
496
- the Lakebase key row. Reports the source only — never the key.
497
-
498
- ``version`` comes from the installed wheel's metadata, so it tracks the
499
- deployed release; it reads "unknown" from a source checkout.
500
- """
501
- from src.api.routes.version import get_installed_version
502
- from src.core.encryption import key_source
503
-
511
+ """Health check endpoint."""
504
512
  return {
505
513
  "status": "healthy",
506
514
  "environment": ENVIRONMENT,
507
- "version": get_installed_version(),
508
- "encryption_key_source": key_source(),
515
+ "version": "0.3.0",
509
516
  }
510
517
 
511
518
 
@@ -16,22 +16,19 @@ Accepts three identity sources, evaluated in priority order:
16
16
  identity headers. The receiving app (tellr) trusts those headers
17
17
  because the same proxy sets them, strips any caller-supplied versions,
18
18
  and cannot be bypassed by external traffic. This path has no user
19
- token, so the user-client ContextVar is left **unset**: agent tools
20
- that resolve their client via ``get_user_client()`` fail closed rather
21
- than silently running as tellr's service principal (SDR-4437 / F-CR-3).
22
- Code that legitimately needs SP credentials on this path must call
23
- ``get_system_client()`` explicitly. Attribution (``created_by`` on
24
- decks, etc.) remains the real user via ``user_name``.
19
+ token, so downstream Databricks API calls use tellr's own service
20
+ principal credentials; attribution (``created_by`` on decks, etc.)
21
+ remains the real user via ``user_name``.
25
22
 
26
23
  The priority-3 path is gated on ``TELLR_TRUST_FORWARDED_IDENTITY=true``
27
24
  so the behaviour is explicit at deploy time. Production Databricks Apps
28
25
  deployments enable it; local dev does not.
29
26
 
30
27
  The resolved identity is bound into the same request-scoped ContextVars
31
- the browser flow uses (``set_current_user``, ``set_permission_context``,
32
- and — only when a user token is present — ``set_user_client``), so
33
- downstream services (session manager, permission service, MLflow, Google
34
- OAuth) see the caller's identity without any MCP-specific plumbing.
28
+ the browser flow uses (``set_current_user``, ``set_user_client``,
29
+ ``set_permission_context``), so downstream services (session manager,
30
+ permission service, MLflow, Google OAuth) see the caller's identity
31
+ without any MCP-specific plumbing.
35
32
  """
36
33
 
37
34
  from __future__ import annotations
@@ -46,6 +43,7 @@ from fastapi import Request
46
43
 
47
44
  from src.core.databricks_client import (
48
45
  get_or_create_user_client,
46
+ get_system_client,
49
47
  set_user_client,
50
48
  )
51
49
  from src.core.permission_context import (
@@ -152,24 +150,28 @@ def extract_mcp_identity(request: Request) -> MCPIdentity:
152
150
  def mcp_auth_scope(request: Request) -> Iterator[MCPIdentity]:
153
151
  """Authenticate an MCP request and bind identity ContextVars for the block.
154
152
 
155
- On entry: resolves identity and binds ``current_user`` and
156
- ``permission_context``. The ``user_client`` ContextVar is bound only when
157
- a real user token is present (priority 1/2); on the token-less priority-3
158
- app-to-app path it is deliberately left unset.
153
+ On entry: resolves identity, binds ``current_user``, ``user_client``,
154
+ and ``permission_context``.
159
155
 
160
156
  On exit: clears all three ContextVars, even if the wrapped block raised.
161
157
 
162
- Leaving ``user_client`` unset on priority 3 makes it true by construction
163
- that agent tools (which resolve their client via ``get_user_client()``)
164
- can never execute as tellr's service principal on the app-to-app path —
165
- they fail closed with ``UserClientRequiredError`` in production
166
- (SDR-4437 / F-CR-3). Code that legitimately needs SP credentials must call
167
- ``get_system_client()`` explicitly. Attribution (``created_by``) is
168
- unaffected: it uses ``user_name`` from the forwarded identity headers,
169
- which the proxy attests.
158
+ When the identity was resolved via priority 3 (no user token), the
159
+ bound ``user_client`` is tellr's service-principal client — downstream
160
+ services still function, but any SDK calls are made with SP credentials
161
+ rather than the user's own. Attribution (``created_by``) is unaffected:
162
+ it uses ``user_name`` from the forwarded identity headers, which the
163
+ proxy attests.
170
164
  """
171
165
  identity = extract_mcp_identity(request)
172
166
 
167
+ if identity.token is not None:
168
+ user_client = get_or_create_user_client(identity.token)
169
+ else:
170
+ # Priority-3 path: no user token, so downstream Databricks API
171
+ # calls use tellr's service principal. Safe because the app-to-app
172
+ # model explicitly delegates credentialing to the receiving app.
173
+ user_client = get_system_client()
174
+
173
175
  permission_ctx = build_permission_context(
174
176
  user_id=identity.user_id,
175
177
  user_name=identity.user_name,
@@ -177,22 +179,9 @@ def mcp_auth_scope(request: Request) -> Iterator[MCPIdentity]:
177
179
  )
178
180
 
179
181
  set_current_user(identity.user_name)
182
+ set_user_client(user_client)
180
183
  set_permission_context(permission_ctx)
181
184
 
182
- if identity.token is not None:
183
- # Priority 1/2: a real user token is present. Bind the OBO client so
184
- # downstream services (agent tools included) act as the user.
185
- set_user_client(get_or_create_user_client(identity.token))
186
- else:
187
- # Priority-3 (app-to-app) path: no user token is available. Do NOT
188
- # bind any client into the user-client ContextVar. Leaving it unset
189
- # makes it true by construction that agent tools — which resolve their
190
- # client via get_user_client() — can never run as the app service
191
- # principal on this path: they fail closed with UserClientRequiredError
192
- # in production (SDR-4437 / F-CR-3). Anything that legitimately needs
193
- # the SP here must call get_system_client() explicitly.
194
- set_user_client(None)
195
-
196
185
  logger.debug(
197
186
  "MCP auth scope entered",
198
187
  extra={