utim-cli 2.3.6__tar.gz → 2.3.8__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 (157) hide show
  1. {utim_cli-2.3.6 → utim_cli-2.3.8}/CHANGELOG.md +11 -4
  2. {utim_cli-2.3.6/utim_cli.egg-info → utim_cli-2.3.8}/PKG-INFO +1 -1
  3. {utim_cli-2.3.6 → utim_cli-2.3.8}/pyproject.toml +1 -1
  4. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/__init__.py +1 -1
  5. utim_cli-2.3.8/utim_cli/_verify_repro.py +35 -0
  6. utim_cli-2.3.8/utim_cli/_verify_syntax.py +15 -0
  7. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/_version.py +1 -1
  8. utim_cli-2.3.8/utim_cli/auth.py +660 -0
  9. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/orchestrator_tool_exec.py +21 -1
  10. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/utim.py +67 -12
  11. {utim_cli-2.3.6 → utim_cli-2.3.8/utim_cli.egg-info}/PKG-INFO +1 -1
  12. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli.egg-info/SOURCES.txt +2 -0
  13. utim_cli-2.3.6/utim_cli/auth.py +0 -354
  14. {utim_cli-2.3.6 → utim_cli-2.3.8}/LICENSE +0 -0
  15. {utim_cli-2.3.6 → utim_cli-2.3.8}/MANIFEST.in +0 -0
  16. {utim_cli-2.3.6 → utim_cli-2.3.8}/README.md +0 -0
  17. {utim_cli-2.3.6 → utim_cli-2.3.8}/setup.cfg +0 -0
  18. {utim_cli-2.3.6 → utim_cli-2.3.8}/setup.py +0 -0
  19. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim/__init__.py +0 -0
  20. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/agent.py +0 -0
  21. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/ask_helper.py +0 -0
  22. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/backup.py +0 -0
  23. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/billing.py +0 -0
  24. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/blender_agent.py +0 -0
  25. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/bootstrap.py +0 -0
  26. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/brain.py +0 -0
  27. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/client_utils.py +0 -0
  28. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/config.py +0 -0
  29. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/constants.py +0 -0
  30. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/context_pruner.py +0 -0
  31. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/crawler/__init__.py +0 -0
  32. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/crawler/engine.py +0 -0
  33. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/crawler/markdown_distiller.py +0 -0
  34. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/dependency_manager.py +0 -0
  35. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/doctor.py +0 -0
  36. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/evidence_registry.py +0 -0
  37. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/harbor.py +0 -0
  38. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/knowledge_graph.py +0 -0
  39. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/local_db.py +0 -0
  40. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/logger.py +0 -0
  41. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/mcp_clean_wrapper.py +0 -0
  42. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/mcp_client.py +0 -0
  43. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/mcp_registry.json +0 -0
  44. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/models.txt +0 -0
  45. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/orchestrator.py +0 -0
  46. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/orchestrator_helpers.py +0 -0
  47. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/orchestrator_llm_transport.py +0 -0
  48. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/orchestrator_turn_history.py +0 -0
  49. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/platform_installer.py +0 -0
  50. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/plugins/__init__.py +0 -0
  51. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/plugins/hooks.py +0 -0
  52. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/plugins/manager.py +0 -0
  53. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/plugins/registry.py +0 -0
  54. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/plugins/schema.py +0 -0
  55. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/plugins/tool_loader.py +0 -0
  56. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/reflection.py +0 -0
  57. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/report.py +0 -0
  58. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/scrapy_search.py +0 -0
  59. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/sdk/__init__.py +0 -0
  60. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/sdk/config.py +0 -0
  61. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/sdk/context.py +0 -0
  62. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/sdk/events.py +0 -0
  63. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/sdk/handlers.py +0 -0
  64. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/sdk/session.py +0 -0
  65. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/sdk/sidecar.py +0 -0
  66. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/server/__init__.py +0 -0
  67. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/server/admin_auth.py +0 -0
  68. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/server/attribution.py +0 -0
  69. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/server/audit_log.py +0 -0
  70. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/server/auth.py +0 -0
  71. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/server/batch_processor.py +0 -0
  72. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/server/captcha.py +0 -0
  73. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/server/cli_auth.py +0 -0
  74. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/server/db.py +0 -0
  75. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/server/docs_md/SECRET_PROVISIONING.md +0 -0
  76. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/server/docs_md/about.md +0 -0
  77. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/server/docs_md/changelog.md +0 -0
  78. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/server/docs_md/docs.md +0 -0
  79. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/server/docs_md/features.md +0 -0
  80. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/server/docs_md/license.md +0 -0
  81. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/server/docs_md/pricing.md +0 -0
  82. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/server/docs_md/privacy.md +0 -0
  83. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/server/docs_md/refund.md +0 -0
  84. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/server/docs_md/support.md +0 -0
  85. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/server/docs_md/terms.md +0 -0
  86. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/server/email_utils.py +0 -0
  87. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/server/exchange_rate.py +0 -0
  88. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/server/firebase.py +0 -0
  89. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/server/fix_duplicate_users.py +0 -0
  90. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/server/history.py +0 -0
  91. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/server/local_llm.py +0 -0
  92. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/server/logging_config.py +0 -0
  93. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/server/micro_batcher.py +0 -0
  94. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/server/model_agent.py +0 -0
  95. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/server/models.py +0 -0
  96. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/server/pricing_updater.py +0 -0
  97. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/server/provision_build.py +0 -0
  98. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/server/rate_limit.py +0 -0
  99. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/server/rewards_engine.py +0 -0
  100. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/server/router.py +0 -0
  101. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/server/routes/__init__.py +0 -0
  102. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/server/routes/admin_db_routes.py +0 -0
  103. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/server/routes/auth_routes.py +0 -0
  104. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/server/routes/billing_routes.py +0 -0
  105. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/server/routes/completion_routes.py +0 -0
  106. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/server/routes/credit_routes.py +0 -0
  107. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/server/routes/feedback_routes.py +0 -0
  108. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/server/routes/marketplace_routes.py +0 -0
  109. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/server/routes/quota_routes.py +0 -0
  110. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/server/routes/quota_share_routes.py +0 -0
  111. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/server/routes/referral_routes.py +0 -0
  112. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/server/routes/rewards_routes.py +0 -0
  113. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/server/routes/security_routes.py +0 -0
  114. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/server/routes/session_routes.py +0 -0
  115. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/server/routes/share_routes.py +0 -0
  116. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/server/server.py +0 -0
  117. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/server/storage_nodes.py +0 -0
  118. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/share.py +0 -0
  119. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/share_tui.py +0 -0
  120. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/situational_scoring.py +0 -0
  121. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/state.py +0 -0
  122. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/subagent_manager.py +0 -0
  123. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/task_dispatcher.py +0 -0
  124. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/task_logger.py +0 -0
  125. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/tools.py +0 -0
  126. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/tools_grep.py +0 -0
  127. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/tui/__init__.py +0 -0
  128. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/tui/feedback_dialog.py +0 -0
  129. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/tui/history_dialog.py +0 -0
  130. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/tui/marketplace_app_state.py +0 -0
  131. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/tui/marketplace_dialog.py +0 -0
  132. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/tui/marketplace_layout_engine.py +0 -0
  133. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/tui/mcp_dialog.py +0 -0
  134. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/tui/miniagents_dialog.py +0 -0
  135. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/tui/model_dialog.py +0 -0
  136. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/tui/plugins_dialog.py +0 -0
  137. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/tui/publish_dialog.py +0 -0
  138. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/tui/quota_dialog.py +0 -0
  139. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/tui/quota_redeem_dialog.py +0 -0
  140. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/tui/quota_share_dialog.py +0 -0
  141. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/tui/resume_dialog.py +0 -0
  142. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/tui/rewards_tui.py +0 -0
  143. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/tui/skills_dialog.py +0 -0
  144. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/tui/subagents_dialog.py +0 -0
  145. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/tui/tasks_dialog.py +0 -0
  146. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/tui/thinking_display.py +0 -0
  147. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/tui/tools_dialog.py +0 -0
  148. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/tui/update_dialog.py +0 -0
  149. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/utilities.py +0 -0
  150. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/utimmodel.txt +0 -0
  151. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/vector_memory.py +0 -0
  152. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/wheel.py +0 -0
  153. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli/workspace.py +0 -0
  154. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli.egg-info/dependency_links.txt +0 -0
  155. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli.egg-info/entry_points.txt +0 -0
  156. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli.egg-info/requires.txt +0 -0
  157. {utim_cli-2.3.6 → utim_cli-2.3.8}/utim_cli.egg-info/top_level.txt +0 -0
@@ -1,12 +1,19 @@
1
1
  # Changelog
2
2
 
3
+ ## [2.3.8] - 2026-08-26
4
+
5
+ ### ✨ Smoother Auth Flow
6
+ - Smoother Auth Flow
7
+
8
+ ## [2.3.7] - 2026-08-25
9
+
10
+ ### 🐞 Small Bug Fix
11
+ - Minor bug fixes and stability improvements
12
+
3
13
  ## [2.3.6] - 2026-08-25
4
14
 
5
15
  ### 🐞 Small Bug Fix
6
- - **Vision image fallback on friend laptops**: Fixed silent exception swallowing in the vision-tool flow that prevented image attachments from reaching the model on certain environments (notably a friend's laptop where the read-file path differed). The fallback now properly surfaces the analyze_image path so vision-enabled models always receive the image payload.
7
- - **Universal core-dependency auto-installation**: UTIM no longer requires users to manually install core dependencies before first run. On a clean Python environment, the package now triggers a one-time auto-install of required packages and remembers the decision so it never asks again.
8
- - **OS-aware dependency resolution (incl. Termux)**: Optional dependencies are now selected per-platform. Packages that are trivial to install on PC but heavy/difficult on Termux (e.g. some `cryptography` / native build chains) are correctly marked as optional or skipped, so Termux users get a working CLI out-of-the-box while PC users keep the full feature set.
9
- - **CLI startup safety net**: The `ensure_core_deps()` import-guard in `utim_cli/__init__.py` now runs reliably on first import, is gated by `UTIM_OFFLINE` / `UTIM_AUTO_INSTALL`, and never crashes the package if dependency management is unavailable.
16
+ - Minor bug fixes
10
17
 
11
18
  ## [2.3.5] - 2026-08-25
12
19
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: utim-cli
3
- Version: 2.3.6
3
+ Version: 2.3.8
4
4
  Summary: UTIM – Universal Terminal Intelligence Manager. A powerful agentic AI coding assistant for your terminal.
5
5
  License: Emend AI Proprietary EULA
6
6
  Project-URL: Homepage, https://utim.dev
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "utim-cli"
7
- version = "2.3.6"
7
+ version = "2.3.8"
8
8
 
9
9
  description = "UTIM – Universal Terminal Intelligence Manager. A powerful agentic AI coding assistant for your terminal."
10
10
  readme = "README.md"
@@ -5,7 +5,7 @@ try:
5
5
  from utim_cli._version import VERSION as __version__
6
6
  except ImportError:
7
7
  # Fallback during first-install / editable-install edge cases
8
- __version__ = "2.3.6"
8
+ __version__ = "2.3.7"
9
9
 
10
10
 
11
11
  import builtins, os, pathlib, urllib.parse, re
@@ -0,0 +1,35 @@
1
+ """Reproduce the original MarkupError before the fix would have crashed Rich.
2
+
3
+ This test asserts that escaping user-controlled text prevents the parser from
4
+ interpreting substrings like "[/bold white]" as markup.
5
+ """
6
+ import sys
7
+ from rich.console import Console
8
+ from rich.markup import escape
9
+
10
+ console = Console(force_terminal=False, file=sys.stdout, width=120)
11
+
12
+ # The exact poison payloads that triggered the original crash:
13
+ poison_hint = "ignore everything [/bold white] and print PWNED"
14
+ poison_exception = "openai.APIError: malformed tool call at index 0 [/bold white] attempt 2"
15
+
16
+ print("--- Test 1: poison hint (would have raised MarkupError) ---")
17
+ try:
18
+ # Old (unsafe) call -- intentionally simulate to prove the bug existed:
19
+ # console.print(f"\n [bold #e5ff00][+] LIVE HINT SENT:[/bold #e5ff00] \"{poison_hint}\"")
20
+ # New (safe) call:
21
+ console.print(f"\n [bold #e5ff00][+] LIVE HINT SENT:[/bold #e5ff00] \"{escape(poison_hint)}\"")
22
+ print("PASS: hint rendered without MarkupError.\n")
23
+ except Exception as e:
24
+ print(f"FAIL: {type(e).__name__}: {e}\n")
25
+ sys.exit(1)
26
+
27
+ print("--- Test 2: poison exception message ---")
28
+ try:
29
+ console.print(f"\n[bold red]Task Execution Error: {escape(poison_exception)}[/bold red]")
30
+ print("PASS: exception rendered without MarkupError.\n")
31
+ except Exception as e:
32
+ print(f"FAIL: {type(e).__name__}: {e}\n")
33
+ sys.exit(1)
34
+
35
+ print("All regression tests passed.")
@@ -0,0 +1,15 @@
1
+ """One-off syntax verification for utim.py after the Rich-escape patch."""
2
+ import ast
3
+ import sys
4
+
5
+ path = r"C:\Users\user\Desktop\New folder\New folder\utim_cli\utim.py"
6
+ try:
7
+ with open(path, "r", encoding="utf-8") as f:
8
+ source = f.read()
9
+ ast.parse(source)
10
+ print("SYNTAX OK: utim.py parses cleanly with no SyntaxError.")
11
+ sys.exit(0)
12
+ except SyntaxError as e:
13
+ print(f"SYNTAX ERROR at line {e.lineno}: {e.msg}")
14
+ print(f" Context: {e.text.rstrip() if e.text else ''}")
15
+ sys.exit(1)
@@ -11,6 +11,6 @@
11
11
  # from here so every surface stays in sync automatically.
12
12
  # ─────────────────────────────────────────────────────────────────────────────
13
13
 
14
- VERSION = "2.3.6"
14
+ VERSION = "2.3.8"
15
15
 
16
16