abstractcore 2.20.2__tar.gz → 2.22.0__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 (330) hide show
  1. {abstractcore-2.20.2 → abstractcore-2.22.0}/PKG-INFO +3 -4
  2. {abstractcore-2.20.2 → abstractcore-2.22.0}/README.md +2 -3
  3. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/assets/model_downloads_catalog.json +11 -1
  4. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/assets/model_downloads_catalog.schema.json +11 -0
  5. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/comms/email/__init__.py +10 -1
  6. abstractcore-2.22.0/abstractcore/comms/email/discovery.py +833 -0
  7. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/comms/email/limits.py +1 -1
  8. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/comms/email/models.py +7 -2
  9. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/comms/email/oauth.py +26 -0
  10. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/comms/email/policy.py +11 -1
  11. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/comms/email/store.py +151 -14
  12. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/config/capability_defaults.py +51 -1
  13. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/config/email_cli.py +110 -15
  14. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/config/manager.py +169 -2
  15. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/config/model_catalog.py +34 -1
  16. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/config/model_materializer.py +33 -8
  17. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/config/route_engines.py +56 -7
  18. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/console/theme_sync.py +111 -4
  19. abstractcore-2.22.0/abstractcore/console/themes.py +305 -0
  20. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/console/web.py +874 -255
  21. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/server/email_routes.py +116 -23
  22. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/utils/version.py +1 -1
  23. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore.egg-info/PKG-INFO +3 -4
  24. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore.egg-info/SOURCES.txt +2 -0
  25. abstractcore-2.22.0/tests/test_console_email_tab.py +565 -0
  26. {abstractcore-2.20.2 → abstractcore-2.22.0}/tests/test_console_web.py +91 -1
  27. abstractcore-2.20.2/abstractcore/console/themes.py +0 -298
  28. {abstractcore-2.20.2 → abstractcore-2.22.0}/LICENSE +0 -0
  29. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/__init__.py +0 -0
  30. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/apps/__init__.py +0 -0
  31. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/apps/__main__.py +0 -0
  32. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/apps/app_config_utils.py +0 -0
  33. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/apps/deepsearch.py +0 -0
  34. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/apps/extractor.py +0 -0
  35. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/apps/intent.py +0 -0
  36. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/apps/judge.py +0 -0
  37. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/apps/summarizer.py +0 -0
  38. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/architectures/__init__.py +0 -0
  39. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/architectures/detection.py +0 -0
  40. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/architectures/enums.py +0 -0
  41. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/architectures/response_postprocessing.py +0 -0
  42. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/architectures/thinking_controls.py +0 -0
  43. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/assets/OCRA.ttf +0 -0
  44. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/assets/OCRB.ttf +0 -0
  45. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/assets/OCRBL.ttf +0 -0
  46. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/assets/README.md +0 -0
  47. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/assets/abstractframework_identity.json +0 -0
  48. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/assets/architecture_formats.json +0 -0
  49. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/assets/bloc-schema.jsonld +0 -0
  50. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/assets/model_capabilities.json +0 -0
  51. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/assets/model_capabilities.schema.json +0 -0
  52. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/assets/semantic_models.md +0 -0
  53. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/assets/session_schema.json +0 -0
  54. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/capabilities/__init__.py +0 -0
  55. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/capabilities/errors.py +0 -0
  56. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/capabilities/host.py +0 -0
  57. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/capabilities/music_selectors.py +0 -0
  58. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/capabilities/registry.py +0 -0
  59. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/capabilities/scene3d_selectors.py +0 -0
  60. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/capabilities/types.py +0 -0
  61. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/capabilities/vision_catalog.py +0 -0
  62. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/comms/__init__.py +0 -0
  63. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/comms/email/bodystructure.py +0 -0
  64. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/comms/email/client.py +0 -0
  65. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/comms/email/context.py +0 -0
  66. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/comms/email/errors.py +0 -0
  67. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/comms/email/imap_codec.py +0 -0
  68. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/comms/email/legacy.py +0 -0
  69. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/comms/email/search.py +0 -0
  70. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/comms/email/vault.py +0 -0
  71. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/compression/__init__.py +0 -0
  72. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/compression/analytics.py +0 -0
  73. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/compression/cache.py +0 -0
  74. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/compression/config.py +0 -0
  75. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/compression/exceptions.py +0 -0
  76. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/compression/glyph_processor.py +0 -0
  77. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/compression/optimizer.py +0 -0
  78. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/compression/orchestrator.py +0 -0
  79. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/compression/pil_text_renderer.py +0 -0
  80. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/compression/quality.py +0 -0
  81. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/compression/text_formatter.py +0 -0
  82. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/compression/vision_compressor.py +0 -0
  83. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/config/__init__.py +0 -0
  84. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/config/engines.py +0 -0
  85. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/config/host_jobs.py +0 -0
  86. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/config/main.py +0 -0
  87. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/config/model_verify.py +0 -0
  88. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/config/models_engines_cli.py +0 -0
  89. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/config/provider_profiles.py +0 -0
  90. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/config/recommendations.py +0 -0
  91. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/config/vision_config.py +0 -0
  92. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/console/__init__.py +0 -0
  93. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/core/__init__.py +0 -0
  94. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/core/bloc_kv.py +0 -0
  95. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/core/bloc_metadata.py +0 -0
  96. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/core/cached_session.py +0 -0
  97. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/core/degeneration.py +0 -0
  98. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/core/endpoint_damping.py +0 -0
  99. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/core/enums.py +0 -0
  100. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/core/factory.py +0 -0
  101. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/core/file_blocs.py +0 -0
  102. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/core/file_boxes.py +0 -0
  103. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/core/generate_contract.py +0 -0
  104. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/core/interface.py +0 -0
  105. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/core/multimodal_generation.py +0 -0
  106. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/core/output_specs.py +0 -0
  107. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/core/retry.py +0 -0
  108. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/core/session.py +0 -0
  109. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/core/types.py +0 -0
  110. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/download.py +0 -0
  111. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/embeddings/__init__.py +0 -0
  112. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/embeddings/manager.py +0 -0
  113. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/embeddings/models.py +0 -0
  114. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/endpoint/__init__.py +0 -0
  115. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/endpoint/app.py +0 -0
  116. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/events/__init__.py +0 -0
  117. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/exceptions/__init__.py +0 -0
  118. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/mcp/__init__.py +0 -0
  119. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/mcp/client.py +0 -0
  120. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/mcp/factory.py +0 -0
  121. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/mcp/naming.py +0 -0
  122. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/mcp/stdio_client.py +0 -0
  123. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/mcp/tool_source.py +0 -0
  124. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/media/__init__.py +0 -0
  125. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/media/auto_handler.py +0 -0
  126. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/media/base.py +0 -0
  127. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/media/capabilities.py +0 -0
  128. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/media/delivery.py +0 -0
  129. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/media/enrichment.py +0 -0
  130. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/media/handlers/__init__.py +0 -0
  131. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/media/handlers/anthropic_handler.py +0 -0
  132. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/media/handlers/local_handler.py +0 -0
  133. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/media/handlers/openai_handler.py +0 -0
  134. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/media/openai_parts.py +0 -0
  135. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/media/pdf_routing.py +0 -0
  136. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/media/processors/__init__.py +0 -0
  137. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/media/processors/audio_processor.py +0 -0
  138. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/media/processors/direct_pdf_processor.py +0 -0
  139. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/media/processors/glyph_pdf_processor.py +0 -0
  140. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/media/processors/image_processor.py +0 -0
  141. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/media/processors/office_processor.py +0 -0
  142. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/media/processors/pdf_processor.py +0 -0
  143. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/media/processors/text_processor.py +0 -0
  144. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/media/processors/video_processor.py +0 -0
  145. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/media/types.py +0 -0
  146. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/media/utils/__init__.py +0 -0
  147. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/media/utils/image_scaler.py +0 -0
  148. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/media/utils/video_frames.py +0 -0
  149. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/media/vision_fallback.py +0 -0
  150. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/processing/__init__.py +0 -0
  151. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/processing/basic_deepsearch.py +0 -0
  152. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/processing/basic_extractor.py +0 -0
  153. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/processing/basic_intent.py +0 -0
  154. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/processing/basic_judge.py +0 -0
  155. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/processing/basic_summarizer.py +0 -0
  156. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/providers/__init__.py +0 -0
  157. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/providers/_http.py +0 -0
  158. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/providers/anthropic_provider.py +0 -0
  159. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/providers/base.py +0 -0
  160. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/providers/capability_host.py +0 -0
  161. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/providers/endpoint_context.py +0 -0
  162. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/providers/generation_cancel.py +0 -0
  163. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/providers/generation_progress.py +0 -0
  164. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/providers/hf_residency.py +0 -0
  165. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/providers/huggingface_provider.py +0 -0
  166. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/providers/lmstudio_provider.py +0 -0
  167. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/providers/mlx_model_rules.py +0 -0
  168. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/providers/mlx_native_cache.py +0 -0
  169. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/providers/mlx_native_session.py +0 -0
  170. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/providers/mlx_prefill_observer.py +0 -0
  171. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/providers/mlx_provider.py +0 -0
  172. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/providers/mlx_qwen4.py +0 -0
  173. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/providers/mlx_residency.py +0 -0
  174. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/providers/mlx_runtime.py +0 -0
  175. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/providers/mlx_vision_addon.py +0 -0
  176. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/providers/model_capabilities.py +0 -0
  177. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/providers/model_config_fingerprint.py +0 -0
  178. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/providers/ollama_provider.py +0 -0
  179. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/providers/openai_compatible_provider.py +0 -0
  180. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/providers/openai_provider.py +0 -0
  181. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/providers/openrouter_provider.py +0 -0
  182. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/providers/portkey_provider.py +0 -0
  183. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/providers/process_residency.py +0 -0
  184. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/providers/registry.py +0 -0
  185. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/providers/speculation.py +0 -0
  186. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/providers/streaming.py +0 -0
  187. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/providers/tokenizer_fingerprint.py +0 -0
  188. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/providers/vllm_provider.py +0 -0
  189. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/providers/weights_fingerprint.py +0 -0
  190. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/py.typed +0 -0
  191. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/server/__init__.py +0 -0
  192. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/server/__main__.py +0 -0
  193. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/server/app.py +0 -0
  194. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/server/audio_endpoints.py +0 -0
  195. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/server/camera_endpoints.py +0 -0
  196. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/server/capability_generation.py +0 -0
  197. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/server/console_routes.py +0 -0
  198. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/server/credentials.py +0 -0
  199. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/server/first_run.py +0 -0
  200. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/server/host_routes.py +0 -0
  201. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/server/scene3d_endpoints.py +0 -0
  202. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/server/session_routes.py +0 -0
  203. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/server/vision_endpoints.py +0 -0
  204. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/structured/__init__.py +0 -0
  205. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/structured/handler.py +0 -0
  206. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/structured/retry.py +0 -0
  207. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/structured/schema_compat.py +0 -0
  208. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/testing/__init__.py +0 -0
  209. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/testing/mailserver.py +0 -0
  210. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/tools/__init__.py +0 -0
  211. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/tools/abstractignore.py +0 -0
  212. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/tools/arg_canonicalizer.py +0 -0
  213. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/tools/arg_coercion.py +0 -0
  214. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/tools/browser_tools.py +0 -0
  215. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/tools/code_analysis.py +0 -0
  216. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/tools/common_tools.py +0 -0
  217. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/tools/comms_tools.py +0 -0
  218. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/tools/core.py +0 -0
  219. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/tools/email_digests.py +0 -0
  220. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/tools/fetch_url_ssrf.py +0 -0
  221. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/tools/handler.py +0 -0
  222. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/tools/inventory.py +0 -0
  223. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/tools/parser.py +0 -0
  224. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/tools/process_tree.py +0 -0
  225. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/tools/registry.py +0 -0
  226. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/tools/risk_facts.py +0 -0
  227. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/tools/shell_session.py +0 -0
  228. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/tools/shell_tools.py +0 -0
  229. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/tools/syntax_rewriter.py +0 -0
  230. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/tools/tag_rewriter.py +0 -0
  231. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/tools/telegram_tdlib.py +0 -0
  232. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/tools/telegram_tools.py +0 -0
  233. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/tools/wire_naming.py +0 -0
  234. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/utils/__init__.py +0 -0
  235. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/utils/async_stream.py +0 -0
  236. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/utils/cli.py +0 -0
  237. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/utils/context_calibration.py +0 -0
  238. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/utils/context_estimate.py +0 -0
  239. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/utils/data_registry.py +0 -0
  240. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/utils/display.py +0 -0
  241. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/utils/file_filters.py +0 -0
  242. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/utils/host_profile.py +0 -0
  243. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/utils/hostinfo.py +0 -0
  244. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/utils/identity.py +0 -0
  245. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/utils/install_settings.py +0 -0
  246. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/utils/jsonish.py +0 -0
  247. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/utils/memory.py +0 -0
  248. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/utils/message_preprocessor.py +0 -0
  249. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/utils/model_cache.py +0 -0
  250. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/utils/model_fit.py +0 -0
  251. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/utils/residency.py +0 -0
  252. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/utils/self_fixes.py +0 -0
  253. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/utils/structured_logging.py +0 -0
  254. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/utils/token_utils.py +0 -0
  255. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/utils/trace_export.py +0 -0
  256. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/utils/truncation.py +0 -0
  257. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/utils/vlm_token_calculator.py +0 -0
  258. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/utils/windows_dll.py +0 -0
  259. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore/utils/workspace_paths.py +0 -0
  260. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore.egg-info/dependency_links.txt +0 -0
  261. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore.egg-info/entry_points.txt +0 -0
  262. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore.egg-info/requires.txt +0 -0
  263. {abstractcore-2.20.2 → abstractcore-2.22.0}/abstractcore.egg-info/top_level.txt +0 -0
  264. {abstractcore-2.20.2 → abstractcore-2.22.0}/pyproject.toml +0 -0
  265. {abstractcore-2.20.2 → abstractcore-2.22.0}/setup.cfg +0 -0
  266. {abstractcore-2.20.2 → abstractcore-2.22.0}/tests/test_abstractendpoint_singleton_provider.py +0 -0
  267. {abstractcore-2.20.2 → abstractcore-2.22.0}/tests/test_agentic_cli_compatibility.py +0 -0
  268. {abstractcore-2.20.2 → abstractcore-2.22.0}/tests/test_basic_session.py +0 -0
  269. {abstractcore-2.20.2 → abstractcore-2.22.0}/tests/test_bloc_kv.py +0 -0
  270. {abstractcore-2.20.2 → abstractcore-2.22.0}/tests/test_bloc_kv_cache_dtype.py +0 -0
  271. {abstractcore-2.20.2 → abstractcore-2.22.0}/tests/test_bloc_kv_endpoint.py +0 -0
  272. {abstractcore-2.20.2 → abstractcore-2.22.0}/tests/test_bloc_kv_engine_fingerprint.py +0 -0
  273. {abstractcore-2.20.2 → abstractcore-2.22.0}/tests/test_bloc_kv_model_config_fingerprint.py +0 -0
  274. {abstractcore-2.20.2 → abstractcore-2.22.0}/tests/test_bloc_kv_tokenizer_fingerprint.py +0 -0
  275. {abstractcore-2.20.2 → abstractcore-2.22.0}/tests/test_bloc_kv_weights_fingerprint.py +0 -0
  276. {abstractcore-2.20.2 → abstractcore-2.22.0}/tests/test_bloc_metadata_json_extract.py +0 -0
  277. {abstractcore-2.20.2 → abstractcore-2.22.0}/tests/test_cached_session_kv_mode.py +0 -0
  278. {abstractcore-2.20.2 → abstractcore-2.22.0}/tests/test_cached_session_kv_thinking_prefix.py +0 -0
  279. {abstractcore-2.20.2 → abstractcore-2.22.0}/tests/test_capabilities_registry.py +0 -0
  280. {abstractcore-2.20.2 → abstractcore-2.22.0}/tests/test_capabilities_registry_preferred_backends_from_config.py +0 -0
  281. {abstractcore-2.20.2 → abstractcore-2.22.0}/tests/test_complete_integration.py +0 -0
  282. {abstractcore-2.20.2 → abstractcore-2.22.0}/tests/test_comprehensive_events.py +0 -0
  283. {abstractcore-2.20.2 → abstractcore-2.22.0}/tests/test_core_components.py +0 -0
  284. {abstractcore-2.20.2 → abstractcore-2.22.0}/tests/test_display_rule.py +0 -0
  285. {abstractcore-2.20.2 → abstractcore-2.22.0}/tests/test_email_digests.py +0 -0
  286. {abstractcore-2.20.2 → abstractcore-2.22.0}/tests/test_embedding_model_token_warnings.py +0 -0
  287. {abstractcore-2.20.2 → abstractcore-2.22.0}/tests/test_enhanced_prompt.py +0 -0
  288. {abstractcore-2.20.2 → abstractcore-2.22.0}/tests/test_environment_variable_tool_call_tags.py +0 -0
  289. {abstractcore-2.20.2 → abstractcore-2.22.0}/tests/test_factory.py +0 -0
  290. {abstractcore-2.20.2 → abstractcore-2.22.0}/tests/test_file_bloc_store_unit.py +0 -0
  291. {abstractcore-2.20.2 → abstractcore-2.22.0}/tests/test_file_boxes_cached_session.py +0 -0
  292. {abstractcore-2.20.2 → abstractcore-2.22.0}/tests/test_final_accuracy.py +0 -0
  293. {abstractcore-2.20.2 → abstractcore-2.22.0}/tests/test_final_comprehensive.py +0 -0
  294. {abstractcore-2.20.2 → abstractcore-2.22.0}/tests/test_final_graceful_errors.py +0 -0
  295. {abstractcore-2.20.2 → abstractcore-2.22.0}/tests/test_generate_contract.py +0 -0
  296. {abstractcore-2.20.2 → abstractcore-2.22.0}/tests/test_generate_response_reasoning_property_unit.py +0 -0
  297. {abstractcore-2.20.2 → abstractcore-2.22.0}/tests/test_generate_with_outputs.py +0 -0
  298. {abstractcore-2.20.2 → abstractcore-2.22.0}/tests/test_graceful_fallback.py +0 -0
  299. {abstractcore-2.20.2 → abstractcore-2.22.0}/tests/test_import_debug.py +0 -0
  300. {abstractcore-2.20.2 → abstractcore-2.22.0}/tests/test_import_safety.py +0 -0
  301. {abstractcore-2.20.2 → abstractcore-2.22.0}/tests/test_incremental_thinking_tag_stripper.py +0 -0
  302. {abstractcore-2.20.2 → abstractcore-2.22.0}/tests/test_install_hints_no_bare_packages.py +0 -0
  303. {abstractcore-2.20.2 → abstractcore-2.22.0}/tests/test_install_settings.py +0 -0
  304. {abstractcore-2.20.2 → abstractcore-2.22.0}/tests/test_integrated_functionality.py +0 -0
  305. {abstractcore-2.20.2 → abstractcore-2.22.0}/tests/test_llms_sources.py +0 -0
  306. {abstractcore-2.20.2 → abstractcore-2.22.0}/tests/test_mcp_integration.py +0 -0
  307. {abstractcore-2.20.2 → abstractcore-2.22.0}/tests/test_mcp_stdio_client.py +0 -0
  308. {abstractcore-2.20.2 → abstractcore-2.22.0}/tests/test_multimodal_generate_output.py +0 -0
  309. {abstractcore-2.20.2 → abstractcore-2.22.0}/tests/test_openai_prompt_cache_key_passthrough.py +0 -0
  310. {abstractcore-2.20.2 → abstractcore-2.22.0}/tests/test_output_specs.py +0 -0
  311. {abstractcore-2.20.2 → abstractcore-2.22.0}/tests/test_packaging_assets.py +0 -0
  312. {abstractcore-2.20.2 → abstractcore-2.22.0}/tests/test_packaging_extras.py +0 -0
  313. {abstractcore-2.20.2 → abstractcore-2.22.0}/tests/test_prompt_cache_api.py +0 -0
  314. {abstractcore-2.20.2 → abstractcore-2.22.0}/tests/test_prompt_cache_bloc_composition.py +0 -0
  315. {abstractcore-2.20.2 → abstractcore-2.22.0}/tests/test_prompt_cache_bloc_e2e_gate.py +0 -0
  316. {abstractcore-2.20.2 → abstractcore-2.22.0}/tests/test_prompt_cache_control_plane.py +0 -0
  317. {abstractcore-2.20.2 → abstractcore-2.22.0}/tests/test_prompt_cache_prepare_modules_thinking_http.py +0 -0
  318. {abstractcore-2.20.2 → abstractcore-2.22.0}/tests/test_retry_observability.py +0 -0
  319. {abstractcore-2.20.2 → abstractcore-2.22.0}/tests/test_retry_strategy.py +0 -0
  320. {abstractcore-2.20.2 → abstractcore-2.22.0}/tests/test_seed_determinism.py +0 -0
  321. {abstractcore-2.20.2 → abstractcore-2.22.0}/tests/test_seed_temperature_basic.py +0 -0
  322. {abstractcore-2.20.2 → abstractcore-2.22.0}/tests/test_sensory_prompting.py +0 -0
  323. {abstractcore-2.20.2 → abstractcore-2.22.0}/tests/test_server_prompt_cache_control_plane_proxy.py +0 -0
  324. {abstractcore-2.20.2 → abstractcore-2.22.0}/tests/test_server_prompt_cache_key_passthrough.py +0 -0
  325. {abstractcore-2.20.2 → abstractcore-2.22.0}/tests/test_session_reasoning_persistence_unit.py +0 -0
  326. {abstractcore-2.20.2 → abstractcore-2.22.0}/tests/test_structured_output_truncation_retry.py +0 -0
  327. {abstractcore-2.20.2 → abstractcore-2.22.0}/tests/test_text_only_model_experience.py +0 -0
  328. {abstractcore-2.20.2 → abstractcore-2.22.0}/tests/test_unload_memory.py +0 -0
  329. {abstractcore-2.20.2 → abstractcore-2.22.0}/tests/test_user_scenario_validation.py +0 -0
  330. {abstractcore-2.20.2 → abstractcore-2.22.0}/tests/test_voice_host_credentials.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: abstractcore
3
- Version: 2.20.2
3
+ Version: 2.22.0
4
4
  Summary: Unified interface to all LLM providers with essential infrastructure for tool calling, streaming, and model management
5
5
  Author-email: Laurent-Philippe Albou <contact@abstractcore.ai>
6
6
  Maintainer-email: Laurent-Philippe Albou <contact@abstractcore.ai>
@@ -455,7 +455,7 @@ You can also persist settings (including API keys) via the config CLI:
455
455
  - Embeddings and semantic search → [Embeddings](docs/embeddings.md)
456
456
  - Observability: global event bus + interaction traces → [Architecture](docs/architecture.md), [API Reference (Events)](docs/api-reference.md#eventtype), [Interaction Tracing](docs/interaction-tracing.md)
457
457
  - MCP (Model Context Protocol): discover tools from MCP servers (HTTP/stdio) → [MCP](docs/mcp.md)
458
- - Email: one IMAP/SMTP account (password or OAuth2), encrypted credentials, recipient policy, send limits, read-only mailbox and email tools → [Email](docs/email.md)
458
+ - Email: one IMAP/SMTP account (password or OAuth2; servers found from the address), encrypted credentials, recipient policy, send limits, read-only mailbox and email tools → [Email](docs/email.md)
459
459
  - OpenAI-compatible server: one `/v1` gateway for chat + optional `/v1/images/*` and `/v1/audio/*` endpoints → [Server](docs/server.md)
460
460
 
461
461
  ## Tool calling (passthrough by default)
@@ -728,8 +728,7 @@ abstractcore engines install ollama --dry-run # the exact install command
728
728
  Email (see [Email](docs/email.md)):
729
729
 
730
730
  ```bash
731
- abstractcore email connect --address me@example.com \
732
- --imap-host imap.example.com --smtp-host smtp.example.com --password <value>
731
+ abstractcore email connect --address me@example.com --password <value> # servers found from the address
733
732
  abstractcore email test
734
733
  abstractcore email status
735
734
  ```
@@ -270,7 +270,7 @@ You can also persist settings (including API keys) via the config CLI:
270
270
  - Embeddings and semantic search → [Embeddings](docs/embeddings.md)
271
271
  - Observability: global event bus + interaction traces → [Architecture](docs/architecture.md), [API Reference (Events)](docs/api-reference.md#eventtype), [Interaction Tracing](docs/interaction-tracing.md)
272
272
  - MCP (Model Context Protocol): discover tools from MCP servers (HTTP/stdio) → [MCP](docs/mcp.md)
273
- - Email: one IMAP/SMTP account (password or OAuth2), encrypted credentials, recipient policy, send limits, read-only mailbox and email tools → [Email](docs/email.md)
273
+ - Email: one IMAP/SMTP account (password or OAuth2; servers found from the address), encrypted credentials, recipient policy, send limits, read-only mailbox and email tools → [Email](docs/email.md)
274
274
  - OpenAI-compatible server: one `/v1` gateway for chat + optional `/v1/images/*` and `/v1/audio/*` endpoints → [Server](docs/server.md)
275
275
 
276
276
  ## Tool calling (passthrough by default)
@@ -543,8 +543,7 @@ abstractcore engines install ollama --dry-run # the exact install command
543
543
  Email (see [Email](docs/email.md)):
544
544
 
545
545
  ```bash
546
- abstractcore email connect --address me@example.com \
547
- --imap-host imap.example.com --smtp-host smtp.example.com --password <value>
546
+ abstractcore email connect --address me@example.com --password <value> # servers found from the address
548
547
  abstractcore email test
549
548
  abstractcore email status
550
549
  ```
@@ -2,7 +2,7 @@
2
2
  "$schema": "./model_downloads_catalog.schema.json",
3
3
  "schema": "model_downloads_catalog_v1",
4
4
  "version": "2026-09-29",
5
- "notes": "Curated download catalog. Sizes are bytes observed in real engine stores/caches (size_source=catalog) or null (unknown). verified=true means the artifact id was seen on a real engine or cache when the seed was built; other ids follow each engine's naming convention and are checked by presence probes and by the post-download verification in model_materializer. upstream={method, checked, revision?} records an id verified to exist upstream on that date (hf_api: HfApi.model_info(files_metadata=True), download_bytes = the weight files; ollama_registry: the registry manifest, download_bytes = the sum of its layers); such an artifact must carry its verified size. options carries route options the recommendation copies (the MTP builds: speculation). resident={bytes, source} (optional, per artifact) is the MEASURED memory the engine needs while it runs, for models whose working memory is not their file size (video generation): the fit verdict uses it instead of download_bytes, and `source` says where and at which profile it was measured.",
5
+ "notes": "Curated download catalog. Sizes are bytes observed in real engine stores/caches (size_source=catalog) or null (unknown). verified=true means the artifact id was seen on a real engine or cache when the seed was built; other ids follow each engine's naming convention and are checked by presence probes and by the post-download verification in model_materializer. upstream={method, checked, revision?} records an id verified to exist upstream on that date (hf_api: HfApi.model_info(files_metadata=True), download_bytes = the weight files; ollama_registry: the registry manifest, download_bytes = the sum of its layers); such an artifact must carry its verified size. options carries route options the recommendation copies (the MTP builds: speculation). resident={bytes, source} (optional, per artifact) is the MEASURED memory the engine needs while it runs, for models whose working memory is not their file size (video generation): the fit verdict uses it instead of download_bytes, and `source` says where and at which profile it was measured. route={key, provider, model} (optional, per artifact) names the capability route that runs the artifact when its engine is not the download provider (AbstractVoice's faster-whisper runs `base`, fetched as a Hugging Face repo): what a surface shows and writes for that route, and how a route stored with the download pair is repaired (capability_defaults.repair_download_pair_routes).",
6
6
  "companion_sizes": {
7
7
  "mlx-community/Qwen3.5-4B-MTP-4bit": {
8
8
  "download_bytes": 67859512,
@@ -4345,6 +4345,11 @@
4345
4345
  "download_bytes": 147886409,
4346
4346
  "size_source": "catalog",
4347
4347
  "verified": true,
4348
+ "route": {
4349
+ "key": "input.voice",
4350
+ "provider": "faster-whisper",
4351
+ "model": "base"
4352
+ },
4348
4353
  "upstream": {
4349
4354
  "method": "hf_api",
4350
4355
  "checked": "2026-09-28",
@@ -4381,6 +4386,11 @@
4381
4386
  "download_bytes": 11105348328,
4382
4387
  "size_source": "catalog",
4383
4388
  "verified": true,
4389
+ "route": {
4390
+ "key": "output.music",
4391
+ "provider": "acestep",
4392
+ "model": "ACE-Step/acestep-v15-xl-turbo-diffusers"
4393
+ },
4384
4394
  "upstream": {
4385
4395
  "method": "hf_api",
4386
4396
  "checked": "2026-09-28",
@@ -95,6 +95,17 @@
95
95
  "properties": {"speculation": {}},
96
96
  "additionalProperties": false
97
97
  },
98
+ "route": {
99
+ "type": "object",
100
+ "description": "The capability route that runs this artifact when its engine is not the download provider (AbstractVoice's faster-whisper runs `base`, fetched from a Hugging Face repo): what a surface shows and writes for that route, and the target of the repair of a route stored with the download pair.",
101
+ "required": ["key", "provider", "model"],
102
+ "properties": {
103
+ "key": {"type": "string", "minLength": 1},
104
+ "provider": {"type": "string", "minLength": 1},
105
+ "model": {"type": "string", "minLength": 1}
106
+ },
107
+ "additionalProperties": false
108
+ },
98
109
  "note": {"type": "string", "minLength": 1},
99
110
  "upstream": {"$ref": "#/$defs/upstream"},
100
111
  "resident": {
@@ -20,7 +20,9 @@ Modules: `models` (typed settings), `client` (IMAP read-only + SMTP, verified TL
20
20
  `bodystructure` (the MIME structure used to fetch only the parts needed),
21
21
  `policy` (recipient allowlist / denylist), `limits` (send rate limits), `vault` (encrypted
22
22
  credentials), `oauth` (OAuth2 / XOAUTH2), `store` (settings + secret + status), `context`
23
- (the guarded send), `errors` (typed errors), `legacy` (one-time import of pre-2.20 settings).
23
+ (the guarded send), `errors` (typed errors), `legacy` (one-time import of pre-2.20 settings),
24
+ `discovery` (a mailbox's IMAP/SMTP servers from its address: known providers, autoconfig, ISPDB,
25
+ DNS SRV, MX).
24
26
  """
25
27
 
26
28
  from .client import DEFAULT_MAX_MESSAGE_BYTES, MAX_LIST_LIMIT, EmailClient, auto_submitted_value, tls_context
@@ -52,6 +54,7 @@ from .errors import (
52
54
  EmailTransient,
53
55
  EmailUnreachable,
54
56
  )
57
+ from .discovery import EmailDiscoveryFailed, discover_servers, require_servers, server_defaults
55
58
  from .limits import SendRateLimiter
56
59
  from .models import (
57
60
  AUTO_SUBMITTED_GENERATED,
@@ -83,6 +86,7 @@ from .oauth import (
83
86
  OAuthTokenProvider,
84
87
  TokenSet,
85
88
  builtin_client,
89
+ oauth_providers_public,
86
90
  provider_preset,
87
91
  resolve_oauth_client,
88
92
  xoauth2_string,
@@ -115,6 +119,7 @@ __all__ = [
115
119
  "EmailClient",
116
120
  "EmailContext",
117
121
  "EmailDisabled",
122
+ "EmailDiscoveryFailed",
118
123
  "EmailError",
119
124
  "EmailInvalidMessage",
120
125
  "EmailInvalidSettings",
@@ -158,6 +163,10 @@ __all__ = [
158
163
  "SmtpSettings",
159
164
  "TokenSet",
160
165
  "builtin_client",
166
+ "discover_servers",
167
+ "oauth_providers_public",
168
+ "require_servers",
169
+ "server_defaults",
161
170
  "evaluate",
162
171
  "guarded_send",
163
172
  "normalize_address",