databricks-tellr-app 0.5.1.dev2__tar.gz → 0.5.1.dev3__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 (245) hide show
  1. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/PKG-INFO +1 -1
  2. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/databricks_tellr_app.egg-info/PKG-INFO +1 -1
  3. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/pyproject.toml +1 -1
  4. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/api/services/session_manager.py +25 -17
  5. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/graph/nodes.py +88 -13
  6. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/README.md +0 -0
  7. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/databricks_tellr_app/__init__.py +0 -0
  8. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/databricks_tellr_app/run.py +0 -0
  9. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/databricks_tellr_app.egg-info/SOURCES.txt +0 -0
  10. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/databricks_tellr_app.egg-info/dependency_links.txt +0 -0
  11. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/databricks_tellr_app.egg-info/requires.txt +0 -0
  12. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/databricks_tellr_app.egg-info/top_level.txt +0 -0
  13. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/setup.cfg +0 -0
  14. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/setup.py +0 -0
  15. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/__init__.py +0 -0
  16. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/api/__init__.py +0 -0
  17. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/api/_otel_bootstrap.py +0 -0
  18. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/api/fixtures/tour_demo_deck.json +0 -0
  19. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/api/main.py +0 -0
  20. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/api/mcp_auth.py +0 -0
  21. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/api/mcp_server.py +0 -0
  22. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/api/middleware/__init__.py +0 -0
  23. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/api/middleware/csrf.py +0 -0
  24. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/api/middleware/request_logging.py +0 -0
  25. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/api/middleware/security_headers.py +0 -0
  26. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/api/routes/__init__.py +0 -0
  27. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/api/routes/_authz.py +0 -0
  28. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/api/routes/admin.py +0 -0
  29. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/api/routes/admin_usage.py +0 -0
  30. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/api/routes/agent_config.py +0 -0
  31. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/api/routes/agent_definitions.py +0 -0
  32. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/api/routes/chat.py +0 -0
  33. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/api/routes/deck_contributors.py +0 -0
  34. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/api/routes/export.py +0 -0
  35. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/api/routes/feedback.py +0 -0
  36. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/api/routes/google_slides.py +0 -0
  37. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/api/routes/images.py +0 -0
  38. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/api/routes/local_version.py +0 -0
  39. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/api/routes/profiles.py +0 -0
  40. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/api/routes/sessions.py +0 -0
  41. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/api/routes/settings/__init__.py +0 -0
  42. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/api/routes/settings/contributors.py +0 -0
  43. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/api/routes/settings/deck_prompts.py +0 -0
  44. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/api/routes/settings/design_systems.py +0 -0
  45. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/api/routes/settings/identities.py +0 -0
  46. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/api/routes/settings/slide_styles.py +0 -0
  47. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/api/routes/setup.py +0 -0
  48. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/api/routes/slides.py +0 -0
  49. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/api/routes/tools.py +0 -0
  50. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/api/routes/tour.py +0 -0
  51. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/api/routes/verification.py +0 -0
  52. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/api/routes/version.py +0 -0
  53. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/api/schemas/__init__.py +0 -0
  54. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/api/schemas/agent_config.py +0 -0
  55. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/api/schemas/agent_definitions.py +0 -0
  56. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/api/schemas/feedback.py +0 -0
  57. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/api/schemas/graph_release_history.py +0 -0
  58. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/api/schemas/graph_releases.py +0 -0
  59. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/api/schemas/requests.py +0 -0
  60. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/api/schemas/responses.py +0 -0
  61. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/api/schemas/settings/__init__.py +0 -0
  62. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/api/schemas/settings/requests.py +0 -0
  63. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/api/schemas/settings/responses.py +0 -0
  64. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/api/schemas/streaming.py +0 -0
  65. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/api/services/__init__.py +0 -0
  66. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/api/services/chat_service.py +0 -0
  67. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/api/services/deck_level_writer.py +0 -0
  68. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/api/services/export_job_queue.py +0 -0
  69. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/api/services/feedback_service.py +0 -0
  70. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/api/services/job_queue.py +0 -0
  71. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/api/services/session_naming.py +0 -0
  72. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/api/services/slide_repository.py +0 -0
  73. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/api/services/slide_style_preview_queue.py +0 -0
  74. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/api/services/usage_events.py +0 -0
  75. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/api/services/usage_service.py +0 -0
  76. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/api/utils/__init__.py +0 -0
  77. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/api/utils/validation.py +0 -0
  78. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/core/__init__.py +0 -0
  79. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/core/backfill_session_slides_startup.py +0 -0
  80. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/core/checkpointer.py +0 -0
  81. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/core/config_loader.py +0 -0
  82. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/core/context_utils.py +0 -0
  83. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/core/database.py +0 -0
  84. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/core/databricks_client.py +0 -0
  85. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/core/defaults.py +0 -0
  86. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/core/encryption.py +0 -0
  87. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/core/init_default_profile.py +0 -0
  88. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/core/lakebase.py +0 -0
  89. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/core/migrate_profiles_to_agent_config.py +0 -0
  90. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/core/mlflow_agent_spans.py +0 -0
  91. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/core/mlflow_tracing.py +0 -0
  92. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/core/otel_logging.py +0 -0
  93. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/core/permission_context.py +0 -0
  94. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/core/prompt_modules.py +0 -0
  95. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/core/settings_db.py +0 -0
  96. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/core/skills/__init__.py +0 -0
  97. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/core/skills/architect.py +0 -0
  98. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/core/skills/build_reviewer.py +0 -0
  99. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/core/skills/builder.py +0 -0
  100. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/core/skills/data_analyst.py +0 -0
  101. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/core/skills/deck_reviewer.py +0 -0
  102. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/core/skills/fix_reviewer.py +0 -0
  103. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/core/skills/fixer.py +0 -0
  104. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/core/strip_retired_prompt_keys.py +0 -0
  105. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/core/user_context.py +0 -0
  106. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/database/__init__.py +0 -0
  107. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/database/models/__init__.py +0 -0
  108. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/database/models/data_migration.py +0 -0
  109. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/database/models/deck_contributor.py +0 -0
  110. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/database/models/deck_review.py +0 -0
  111. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/database/models/design_system.py +0 -0
  112. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/database/models/encryption_key.py +0 -0
  113. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/database/models/feedback.py +0 -0
  114. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/database/models/genie_space.py +0 -0
  115. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/database/models/google_global_credentials.py +0 -0
  116. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/database/models/google_oauth_token.py +0 -0
  117. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/database/models/graph_checkpoint.py +0 -0
  118. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/database/models/graph_configuration.py +0 -0
  119. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/database/models/identity.py +0 -0
  120. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/database/models/image.py +0 -0
  121. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/database/models/profile.py +0 -0
  122. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/database/models/profile_contributor.py +0 -0
  123. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/database/models/prompts.py +0 -0
  124. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/database/models/request_log.py +0 -0
  125. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/database/models/session.py +0 -0
  126. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/database/models/slide_deck_prompt.py +0 -0
  127. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/database/models/slide_style_library.py +0 -0
  128. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/database/models/slide_style_preview.py +0 -0
  129. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/database/models/usage_event.py +0 -0
  130. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/database/models/user_preference.py +0 -0
  131. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/database/types.py +0 -0
  132. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/domain/__init__.py +0 -0
  133. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/domain/conversation_engine.py +0 -0
  134. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/domain/conversation_turns.py +0 -0
  135. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/domain/deck_spec.py +0 -0
  136. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/domain/deck_spec_slides.py +0 -0
  137. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/domain/finding.py +0 -0
  138. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/domain/finding_copy.py +0 -0
  139. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/domain/skill_io.py +0 -0
  140. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/domain/slide.py +0 -0
  141. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/domain/slide_alignment.py +0 -0
  142. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/domain/slide_deck.py +0 -0
  143. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/domain/slide_numbering.py +0 -0
  144. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/domain/slide_operations.py +0 -0
  145. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/__init__.py +0 -0
  146. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/agent.py +0 -0
  147. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/agent_definition_manifest_v1.py +0 -0
  148. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/agent_factory.py +0 -0
  149. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/agent_model_payload.py +0 -0
  150. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/agent_resolution.py +0 -0
  151. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/agent_runtime.py +0 -0
  152. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/agent_runtime_identity.py +0 -0
  153. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/agent_schema_registry.py +0 -0
  154. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/agent_schema_types.py +0 -0
  155. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/agent_test_workbench.py +0 -0
  156. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/collaboration_history.py +0 -0
  157. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/config_service.py +0 -0
  158. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/config_validator.py +0 -0
  159. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/conversation_pins.py +0 -0
  160. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/converter_jail/__init__.py +0 -0
  161. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/converter_jail/ast_guard.py +0 -0
  162. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/converter_jail/codeprep.py +0 -0
  163. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/converter_jail/gslides_runner.py +0 -0
  164. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/converter_jail/jail.py +0 -0
  165. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/converter_jail/pptx_runner.py +0 -0
  166. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/converter_jail/protocol.py +0 -0
  167. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/deck_css_aggregator.py +0 -0
  168. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/deck_review_store.py +0 -0
  169. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/design_system_compiler.py +0 -0
  170. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/design_system_service.py +0 -0
  171. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/design_system_templates.py +0 -0
  172. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/drive_uploader.py +0 -0
  173. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/evaluation/__init__.py +0 -0
  174. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/evaluation/llm_judge.py +0 -0
  175. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/foreman_service.py +0 -0
  176. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/gateway_openai.py +0 -0
  177. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/genie_service.py +0 -0
  178. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/google_slides_auth.py +0 -0
  179. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/google_slides_prompts_defaults.py +0 -0
  180. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/graph/__init__.py +0 -0
  181. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/graph/builder.py +0 -0
  182. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/graph/event_emitter.py +0 -0
  183. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/graph/progress.py +0 -0
  184. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/graph/routers.py +0 -0
  185. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/graph/state.py +0 -0
  186. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/graph/user_notices.py +0 -0
  187. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/graph_configuration.py +0 -0
  188. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/graph_configuration_bootstrap.py +0 -0
  189. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/graph_configuration_content.py +0 -0
  190. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/graph_configuration_draft.py +0 -0
  191. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/graph_configuration_publication.py +0 -0
  192. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/graph_configuration_rollback.py +0 -0
  193. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/graph_configuration_seed.py +0 -0
  194. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/graph_configuration_workbench.py +0 -0
  195. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/graph_definition_manifest.py +0 -0
  196. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/graph_release_evidence.py +0 -0
  197. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/graph_release_history.py +0 -0
  198. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/html_to_google_slides.py +0 -0
  199. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/html_to_pptx.py +0 -0
  200. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/identity_provider.py +0 -0
  201. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/identity_providers/__init__.py +0 -0
  202. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/identity_providers/account_provider.py +0 -0
  203. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/identity_providers/local_provider.py +0 -0
  204. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/identity_providers/scim_filter.py +0 -0
  205. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/identity_providers/workspace_provider.py +0 -0
  206. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/image_service.py +0 -0
  207. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/image_tools.py +0 -0
  208. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/model_endpoint_catalog.py +0 -0
  209. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/model_endpoint_probe.py +0 -0
  210. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/permission_service.py +0 -0
  211. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/persisted_graph_release.py +0 -0
  212. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/pptx_from_html_huashu.py +0 -0
  213. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/pptx_from_records.py +0 -0
  214. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/pptx_prompts_defaults.py +0 -0
  215. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/profile_service.py +0 -0
  216. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/prompt_assembler.py +0 -0
  217. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/shared_deck_attribution.py +0 -0
  218. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/slide_style_preview_fixture.py +0 -0
  219. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/slide_style_preview_storage.py +0 -0
  220. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/spec_sync.py +0 -0
  221. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/streaming_callback.py +0 -0
  222. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/svg_sanitizer.py +0 -0
  223. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/template_sections.py +0 -0
  224. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/tools/__init__.py +0 -0
  225. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/tools/agent_bricks_tool.py +0 -0
  226. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/tools/ds_asset_tool.py +0 -0
  227. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/tools/genie_tool.py +0 -0
  228. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/tools/mcp_tool.py +0 -0
  229. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/tools/model_endpoint_tool.py +0 -0
  230. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/tools/vector_tool.py +0 -0
  231. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/services/validator.py +0 -0
  232. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/utils/__init__.py +0 -0
  233. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/utils/css_utils.py +0 -0
  234. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/utils/ds_asset_utils.py +0 -0
  235. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/utils/error_handling.py +0 -0
  236. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/utils/graph_safety.py +0 -0
  237. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/utils/html_safety.py +0 -0
  238. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/utils/html_utils.py +0 -0
  239. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/utils/image_utils.py +0 -0
  240. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/utils/js_validator.py +0 -0
  241. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/utils/logging_config.py +0 -0
  242. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/utils/pi_filter.py +0 -0
  243. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/utils/slide_hash.py +0 -0
  244. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/src/utils/spotlight.py +0 -0
  245. {databricks_tellr_app-0.5.1.dev2 → databricks_tellr_app-0.5.1.dev3}/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.5.1.dev2
3
+ Version: 0.5.1.dev3
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.5.1.dev2
3
+ Version: 0.5.1.dev3
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.5.1.dev2"
7
+ version = "0.5.1.dev3"
8
8
  description = "Tellr application package for Databricks Apps"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -712,8 +712,11 @@ def _rewrite_slide_rows(
712
712
  ) -> None:
713
713
  """THE per-slide rewrite of a whole deck: one copy, so its callers cannot diverge.
714
714
 
715
- ``save_slide_deck``, ``restore_version`` and ``SlideWriter.insert_pending_slides``
716
- all rewrite every row of a deck through here. Hand-copied versions of this
715
+ ``save_slide_deck``, ``restore_version`` and :func:`_lay_out_slide_rows` all
716
+ rewrite every row of a deck through here. ``_lay_out_slide_rows`` is the
717
+ exact-map shift behind ``SlideWriter.apply_slide_layout`` (and so its
718
+ ``insert_pending_slides`` special case) and, through :func:`_splice_slide_rows`,
719
+ the manual ``SessionManager.insert_slide``. Hand-copied versions of this
717
720
  block once drifted apart, and a reorder then attached slide identity and
718
721
  verdicts to the wrong slide.
719
722
 
@@ -817,22 +820,22 @@ def _splice_slide_rows(
817
820
  old_rows: List[SessionSlide],
818
821
  new_slides: Mapping[int, Tuple[Dict[str, Any], Dict[str, Any]]],
819
822
  ) -> None:
820
- """THE shift: splice new slides in among a deck's rows with the EXACT old-row map.
823
+ """Splice new slides in among a deck's rows, in order: the in-order wrapper.
821
824
 
822
- Shared by the graph's ``SlideWriter.insert_pending_slides`` and the manual
823
- ``SessionManager.insert_slide``, so there is one shift primitive and one row
824
- writer.
825
+ The manual ``SessionManager.insert_slide``'s shift. It only builds the
826
+ in-order layout and hands it to :func:`_lay_out_slide_rows`, THE shift
827
+ primitive, which the graph's ``SlideWriter.apply_slide_layout`` (and so its
828
+ ``insert_pending_slides`` special case) calls directly — so there is one
829
+ shift primitive and one row writer.
825
830
 
826
- 1. Every old row is snapshotted (:func:`_snapshot_row`) and attributed
827
- (:func:`_attribution_from`) BEFORE any write: ``_upsert_slide_row``
828
- rewrites those ORM rows in place.
829
- 2. ``len(old_rows) + len(new_slides)`` positions are laid out: position ``i``
831
+ 1. ``len(old_rows) + len(new_slides)`` positions are laid out: position ``i``
830
832
  holds ``new_slides[i]``'s slide when ``i`` is a key, otherwise the next old
831
833
  row in order.
832
- 3. Every position is rewritten through ``_rewrite_slide_rows`` with that map,
833
- never the attribution heuristic, and with ``now_dt=None`` /
834
- ``author_fallback=None``, so a moved row with a NULL author or timestamp
835
- stays NULL and no moved row gets a fresh ``modified_at``.
834
+ 2. :func:`_lay_out_slide_rows` snapshots and attributes every old row BEFORE
835
+ any write and rewrites every position with that exact map, never the
836
+ attribution heuristic, and with ``now_dt=None`` / ``author_fallback=None``,
837
+ so a moved row with a NULL author or timestamp stays NULL and no moved row
838
+ gets a fresh ``modified_at``.
836
839
 
837
840
  Args:
838
841
  db: live SQLAlchemy session; the caller owns the transaction.
@@ -878,7 +881,11 @@ def _lay_out_slide_rows(
878
881
  at new index ``i``, or ``None`` for a new slide, whose
879
882
  ``(slide_dict, incoming_record)`` is ``new_slides[i]``. An old index may
880
883
  appear at most once; one that is absent is deleted (pruned, with its record
881
- and spec fragment). ``_splice_slide_rows`` is the in-order special case.
884
+ and spec fragment). Every exact-map writer goes through here:
885
+ ``SlideWriter.apply_slide_layout`` (the graph's operations layout, and its
886
+ ``insert_pending_slides`` special case) directly, and the manual
887
+ ``SessionManager.insert_slide`` through :func:`_splice_slide_rows`, the
888
+ in-order wrapper.
882
889
 
883
890
  1. Every old row is snapshotted (:func:`_snapshot_row`) and attributed
884
891
  (:func:`_attribution_from`) BEFORE any write: ``_upsert_slide_row``
@@ -2220,8 +2227,9 @@ class SessionManager:
2220
2227
  """Insert one slide (the viewer's manual insert) in ONE transaction.
2221
2228
 
2222
2229
  The manual insert shifts every later slide by one, so it moves rows with
2223
- the EXACT old-row map (:func:`_splice_slide_rows`, shared with the graph's
2224
- ``SlideWriter.insert_pending_slides``), never ``save_slide_deck``'s
2230
+ the EXACT old-row map (:func:`_splice_slide_rows`, the in-order wrapper of
2231
+ :func:`_lay_out_slide_rows`, the shift primitive the graph's
2232
+ ``SlideWriter.apply_slide_layout`` also uses), never ``save_slide_deck``'s
2225
2233
  attribution heuristic. Rows, spec, deck columns and evidence are written
2226
2234
  in one ``get_db_session()``, in this order:
2227
2235
 
@@ -1919,6 +1919,43 @@ _ALIGNMENT_REFUSALS = {
1919
1919
  ),
1920
1920
  }
1921
1921
 
1922
+ # What a refused edit without operations tells the MODEL (spec §4: "the problem
1923
+ # tells the model to list the changes as operations"). The user's sentence above
1924
+ # and ``error_state`` keep their text; only the retry's problem (and the refusal
1925
+ # row's, which the next turn's note replays) says this. Each problem says what
1926
+ # went wrong and then how to answer instead — never that the change cannot be
1927
+ # made, because as operations it can: the prompt's ``rejected_edit`` rule turns
1928
+ # "cannot be done" into a ``discuss`` that tells the user deleting or moving is
1929
+ # impossible, the very symptom operations exist to remove. So the alignment's
1930
+ # own detail ("removing slides is not supported", "an edit cannot move a slide")
1931
+ # reaches ``error_state`` only, never the model.
1932
+ _AS_OPERATIONS = (
1933
+ "return this edit as `operations` (insert, update, delete, replace or move, "
1934
+ "at the positions of current_deck_spec) instead of a revised deck_spec: "
1935
+ "removing a slide is a delete and reordering slides is a move"
1936
+ )
1937
+
1938
+ # What the alignment could not read, by ``AlignmentRefused.code``, in the model's
1939
+ # terms and with no verdict on what an edit may do.
1940
+ _ALIGNMENT_PROBLEM_DETAILS = {
1941
+ "ambiguous": (
1942
+ "your revised deck_spec can be matched to current_deck_spec in more than "
1943
+ "one way, so it is unclear which slides are new and which were changed"
1944
+ ),
1945
+ "moves_slides": (
1946
+ "your revised deck_spec moves a slide: one of its slides is a copy of a "
1947
+ "different slide of current_deck_spec"
1948
+ ),
1949
+ "removes_slides": (
1950
+ "your revised deck_spec has fewer slides than current_deck_spec"
1951
+ ),
1952
+ }
1953
+
1954
+
1955
+ def _as_operations_problem(code: str, what_went_wrong: str) -> OperationProblem:
1956
+ """A refused full-spec edit's problem: what went wrong, then answer as operations."""
1957
+ return OperationProblem(code, (), f"{what_went_wrong}; {_AS_OPERATIONS}")
1958
+
1922
1959
  # The two ways a row write planned against the committed rows can fail to land
1923
1960
  # (#314 D4). The insert shift and the operations layout share the CODES, so an
1924
1961
  # operator sees one code per cause whichever path wrote. They do not share the
@@ -1966,12 +2003,14 @@ def _rows_failed_degrade(exc: Exception, *, operations: bool = False) -> Dict[st
1966
2003
 
1967
2004
  # The planning refusals the model can fix (spec §5), by degrade code: operations
1968
2005
  # problems (and the DeckSpec problems composing reports with them), template
1969
- # binding errors, and today's alignment and position-set refusals of a full-spec
1970
- # edit. On one of these the architect is asked ONCE more, told what it answered
1971
- # and exactly why that was refused, and the turn degrades only if the second
1972
- # answer is refused too. Everything else is the deck's state, not the answer's —
1973
- # no persisted spec, a spec the rows have outgrown, a spec-less edit the model
1974
- # was already told to revise, and a row write that did not land — so asking
2006
+ # binding errors, today's alignment and position-set refusals of a full-spec
2007
+ # edit, and an edit that returned neither operations nor a spec (a slip the new
2008
+ # prompt's "deck_spec is not needed" invites). The full-spec and spec-less ones
2009
+ # tell the model to answer with operations (_AS_OPERATIONS). On one of these
2010
+ # the architect is asked ONCE more, told what it answered and exactly why that
2011
+ # was refused, and the turn degrades only if the second answer is refused too.
2012
+ # Everything else is the deck's state, not the answer's — no persisted spec, a
2013
+ # spec the rows have outgrown, and a row write that did not land — so asking
1975
2014
  # again would only spend a model call to reach the same refusal.
1976
2015
  RETRYABLE_EDIT_CODES = frozenset(
1977
2016
  {
@@ -1980,6 +2019,7 @@ RETRYABLE_EDIT_CODES = frozenset(
1980
2019
  "edit_insert_ambiguous",
1981
2020
  "edit_spec_moves_slides",
1982
2021
  "edit_spec_positions_changed",
2022
+ "edit_without_revised_spec",
1983
2023
  }
1984
2024
  )
1985
2025
 
@@ -2003,8 +2043,10 @@ def _refusal_problems(degrade: Dict[str, Any]) -> Tuple[OperationProblem, ...]:
2003
2043
  """Why *degrade* refused, as problems: what a retry is told and the row records.
2004
2044
 
2005
2045
  A planning refusal carries its own under ``"problems"`` (an operations list's,
2006
- one per binding error, an alignment's reason). Any other refusal is one
2007
- problem: its code and its model-facing message.
2046
+ one per binding error, and for an edit without operations — refused by the
2047
+ alignment or the position-set guard, or carrying no spec at all — one that
2048
+ says what went wrong and to answer with operations). Any other refusal is
2049
+ one problem: its code and its model-facing message.
2008
2050
  """
2009
2051
  problems = degrade.get("problems")
2010
2052
  if problems:
@@ -2611,6 +2653,18 @@ def _plan_answer(
2611
2653
  "plan for the deck, so nothing has been changed. Please "
2612
2654
  "try asking again."
2613
2655
  ),
2656
+ # What the retry is told: a slip the model can fix (M4).
2657
+ "problems": (
2658
+ OperationProblem(
2659
+ "edit_without_revised_spec",
2660
+ (),
2661
+ "your edit returned neither `operations` nor a deck_spec, "
2662
+ "so it changes nothing; an edit must list its changes as "
2663
+ "`operations` (insert, update, delete, replace or move, at "
2664
+ "the positions of current_deck_spec), or return the full "
2665
+ "revised deck_spec only to re-describe the deck as it stands",
2666
+ ),
2667
+ ),
2614
2668
  }
2615
2669
  elif not describe_only and (
2616
2670
  len(spec.slides) < len(prior_spec.slides)
@@ -2625,14 +2679,25 @@ def _plan_answer(
2625
2679
  # shorter spec would silently drop a committed row's spec; an
2626
2680
  # equal-length one with other positions describes rows that are not
2627
2681
  # there.
2682
+ revised_positions = sorted(s.position for s in spec.slides)
2683
+ current_positions = sorted(s.position for s in prior_spec.slides)
2628
2684
  edit_degrade = {
2629
2685
  "code": "edit_spec_positions_changed",
2630
2686
  "message": (
2631
- "the edit's deck_spec has slide positions "
2632
- f"{sorted(s.position for s in spec.slides)} but the persisted "
2633
- f"deck_spec has {sorted(s.position for s in prior_spec.slides)}"
2687
+ f"the edit's deck_spec has slide positions {revised_positions} "
2688
+ f"but the persisted deck_spec has {current_positions}"
2634
2689
  ),
2635
2690
  "user": _POSITIONS_CHANGED_TEXT,
2691
+ # What the retry is told (spec §4): what went wrong, and to list
2692
+ # the change as operations, where a delete or a move is fine.
2693
+ "problems": (
2694
+ _as_operations_problem(
2695
+ "edit_spec_positions_changed",
2696
+ f"your revised deck_spec has slide positions "
2697
+ f"{revised_positions} but current_deck_spec has "
2698
+ f"{current_positions}",
2699
+ ),
2700
+ ),
2636
2701
  }
2637
2702
 
2638
2703
  # #314 follow-up (N2): a describe-only turn sees no HTML, so on a deck its
@@ -2718,12 +2783,22 @@ def _plan_answer(
2718
2783
  "code": code,
2719
2784
  "message": exc.detail,
2720
2785
  "user": user,
2721
- # What the retry is told (spec §5): the alignment's own reason.
2786
+ # What the retry is told (spec §4-§5): what the alignment could
2787
+ # not read, then to list the change as operations — not the
2788
+ # alignment's own detail, whose "is not supported" / "cannot
2789
+ # move" would steer the model to tell the user it is impossible.
2722
2790
  # It names no position, because what it could not read is the
2723
2791
  # relation between two lists, not a slide. Its prefix keeps it
2724
2792
  # apart from an operations problem's code.
2725
2793
  "problems": (
2726
- OperationProblem(f"alignment_{exc.code}", (), exc.detail),
2794
+ _as_operations_problem(
2795
+ f"alignment_{exc.code}",
2796
+ _ALIGNMENT_PROBLEM_DETAILS.get(
2797
+ exc.code,
2798
+ "your revised deck_spec does not line up with "
2799
+ "current_deck_spec",
2800
+ ),
2801
+ ),
2727
2802
  ),
2728
2803
  }
2729
2804