utim-cli 2.3.13__tar.gz → 2.3.15__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 (163) hide show
  1. {utim_cli-2.3.13 → utim_cli-2.3.15}/CHANGELOG.md +12 -0
  2. {utim_cli-2.3.13/utim_cli.egg-info → utim_cli-2.3.15}/PKG-INFO +1 -1
  3. {utim_cli-2.3.13 → utim_cli-2.3.15}/pyproject.toml +1 -1
  4. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim/__init__.py +1 -1
  5. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/__init__.py +1 -1
  6. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/_version.py +1 -1
  7. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/agent.py +7 -0
  8. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/ask_helper.py +1 -1
  9. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/auth.py +2 -2
  10. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/brain.py +36 -2
  11. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/context_pruner.py +1 -1
  12. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/crawler/markdown_distiller.py +258 -251
  13. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/orchestrator.py +19 -43
  14. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/orchestrator_llm_transport.py +83 -21
  15. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/orchestrator_turn_history.py +40 -0
  16. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/plugins/manager.py +135 -43
  17. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/reflection.py +33 -4
  18. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/cli_auth.py +6 -1
  19. utim_cli-2.3.15/utim_cli/server/email_utils.py +911 -0
  20. utim_cli-2.3.15/utim_cli/server/key_rotator.py +1055 -0
  21. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/router.py +11 -1
  22. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/routes/auth_routes.py +21 -11
  23. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/routes/completion_routes.py +136 -98
  24. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/routes/credit_routes.py +26 -9
  25. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/routes/marketplace_routes.py +17 -0
  26. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/tools.py +64 -23
  27. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/tui/feedback_dialog.py +87 -14
  28. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/tui/marketplace_dialog.py +8 -3
  29. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/tui/model_dialog.py +17 -7
  30. utim_cli-2.3.15/utim_cli/tui/plugins_dialog.py +756 -0
  31. utim_cli-2.3.15/utim_cli/update_checker.py +545 -0
  32. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/utim.py +190 -70
  33. {utim_cli-2.3.13 → utim_cli-2.3.15/utim_cli.egg-info}/PKG-INFO +1 -1
  34. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli.egg-info/SOURCES.txt +2 -0
  35. utim_cli-2.3.13/utim_cli/server/email_utils.py +0 -691
  36. utim_cli-2.3.13/utim_cli/tui/plugins_dialog.py +0 -351
  37. {utim_cli-2.3.13 → utim_cli-2.3.15}/LICENSE +0 -0
  38. {utim_cli-2.3.13 → utim_cli-2.3.15}/MANIFEST.in +0 -0
  39. {utim_cli-2.3.13 → utim_cli-2.3.15}/README.md +0 -0
  40. {utim_cli-2.3.13 → utim_cli-2.3.15}/setup.cfg +0 -0
  41. {utim_cli-2.3.13 → utim_cli-2.3.15}/setup.py +0 -0
  42. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/_verify_repro.py +0 -0
  43. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/_verify_syntax.py +0 -0
  44. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/backup.py +0 -0
  45. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/billing.py +0 -0
  46. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/blender_agent.py +0 -0
  47. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/bootstrap.py +0 -0
  48. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/client_utils.py +0 -0
  49. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/config.py +0 -0
  50. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/constants.py +0 -0
  51. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/crawler/__init__.py +0 -0
  52. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/crawler/engine.py +0 -0
  53. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/dependency_manager.py +0 -0
  54. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/doctor.py +0 -0
  55. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/evidence_registry.py +0 -0
  56. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/harbor.py +0 -0
  57. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/knowledge_graph.py +0 -0
  58. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/local_db.py +0 -0
  59. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/logger.py +0 -0
  60. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/mcp_clean_wrapper.py +0 -0
  61. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/mcp_client.py +0 -0
  62. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/mcp_registry.json +0 -0
  63. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/models.txt +0 -0
  64. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/orchestrator_helpers.py +0 -0
  65. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/orchestrator_tool_exec.py +0 -0
  66. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/personalities.py +0 -0
  67. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/platform_installer.py +0 -0
  68. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/plugins/__init__.py +0 -0
  69. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/plugins/hooks.py +0 -0
  70. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/plugins/registry.py +0 -0
  71. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/plugins/schema.py +0 -0
  72. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/plugins/tool_loader.py +0 -0
  73. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/report.py +0 -0
  74. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/scrapy_search.py +0 -0
  75. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/sdk/__init__.py +0 -0
  76. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/sdk/config.py +0 -0
  77. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/sdk/context.py +0 -0
  78. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/sdk/events.py +0 -0
  79. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/sdk/handlers.py +0 -0
  80. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/sdk/session.py +0 -0
  81. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/sdk/sidecar.py +0 -0
  82. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/__init__.py +0 -0
  83. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/admin_auth.py +0 -0
  84. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/attribution.py +0 -0
  85. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/audit_log.py +0 -0
  86. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/auth.py +0 -0
  87. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/batch_processor.py +0 -0
  88. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/captcha.py +0 -0
  89. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/concurrency.py +0 -0
  90. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/db.py +0 -0
  91. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/docs_md/SECRET_PROVISIONING.md +0 -0
  92. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/docs_md/about.md +0 -0
  93. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/docs_md/changelog.md +0 -0
  94. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/docs_md/docs.md +0 -0
  95. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/docs_md/features.md +0 -0
  96. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/docs_md/license.md +0 -0
  97. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/docs_md/pricing.md +0 -0
  98. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/docs_md/privacy.md +0 -0
  99. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/docs_md/refund.md +0 -0
  100. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/docs_md/support.md +0 -0
  101. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/docs_md/terms.md +0 -0
  102. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/exchange_rate.py +0 -0
  103. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/firebase.py +0 -0
  104. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/fix_duplicate_users.py +0 -0
  105. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/history.py +0 -0
  106. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/local_llm.py +0 -0
  107. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/logging_config.py +0 -0
  108. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/micro_batcher.py +0 -0
  109. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/model_agent.py +0 -0
  110. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/models.py +0 -0
  111. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/pricing_updater.py +0 -0
  112. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/provision_build.py +0 -0
  113. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/rate_limit.py +0 -0
  114. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/rewards_engine.py +0 -0
  115. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/routes/__init__.py +0 -0
  116. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/routes/admin_db_routes.py +0 -0
  117. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/routes/billing_routes.py +0 -0
  118. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/routes/feedback_routes.py +0 -0
  119. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/routes/quota_routes.py +0 -0
  120. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/routes/quota_share_routes.py +0 -0
  121. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/routes/referral_routes.py +0 -0
  122. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/routes/rewards_routes.py +0 -0
  123. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/routes/security_routes.py +0 -0
  124. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/routes/session_routes.py +0 -0
  125. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/routes/share_routes.py +0 -0
  126. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/server.py +0 -0
  127. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/storage_nodes.py +0 -0
  128. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/share.py +0 -0
  129. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/share_tui.py +0 -0
  130. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/situational_scoring.py +0 -0
  131. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/state.py +0 -0
  132. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/subagent_manager.py +0 -0
  133. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/task_dispatcher.py +0 -0
  134. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/task_logger.py +0 -0
  135. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/tools_grep.py +0 -0
  136. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/tui/__init__.py +0 -0
  137. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/tui/history_dialog.py +0 -0
  138. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/tui/marketplace_app_state.py +0 -0
  139. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/tui/marketplace_layout_engine.py +0 -0
  140. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/tui/mcp_dialog.py +0 -0
  141. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/tui/miniagents_dialog.py +0 -0
  142. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/tui/personality_dialog.py +0 -0
  143. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/tui/publish_dialog.py +0 -0
  144. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/tui/quota_dialog.py +0 -0
  145. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/tui/quota_redeem_dialog.py +0 -0
  146. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/tui/quota_share_dialog.py +0 -0
  147. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/tui/resume_dialog.py +0 -0
  148. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/tui/rewards_tui.py +0 -0
  149. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/tui/skills_dialog.py +0 -0
  150. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/tui/subagents_dialog.py +0 -0
  151. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/tui/tasks_dialog.py +0 -0
  152. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/tui/thinking_display.py +0 -0
  153. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/tui/tools_dialog.py +0 -0
  154. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/tui/update_dialog.py +0 -0
  155. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/utilities.py +0 -0
  156. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/utimmodel.txt +0 -0
  157. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/vector_memory.py +0 -0
  158. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/wheel.py +0 -0
  159. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/workspace.py +0 -0
  160. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli.egg-info/dependency_links.txt +0 -0
  161. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli.egg-info/entry_points.txt +0 -0
  162. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli.egg-info/requires.txt +0 -0
  163. {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli.egg-info/top_level.txt +0 -0
@@ -1,5 +1,17 @@
1
1
  # Changelog
2
2
 
3
+ ## [2.3.15] - 2026-08-29
4
+
5
+ ### 🛠️ Minor Enhancements and Tool Call Bug Fixes
6
+ - Minor enhancements and fixed tool call bugs
7
+
8
+ ## [2.3.14] - 2026-08-28
9
+
10
+ ### ⚡ Request Queue & Scaled Free Capacity
11
+ - Added request queue visual, Increased global free user request cap from 20RPM - 60RPM
12
+ - Increase per user Rpm cap from 10-30RPM
13
+ - Added a new fun feature "/personality"
14
+
3
15
  ## [2.3.13] - 2026-08-28
4
16
 
5
17
  ### 🐞 Minor Bug Fixes
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: utim-cli
3
- Version: 2.3.13
3
+ Version: 2.3.15
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.13"
7
+ version = "2.3.15"
8
8
 
9
9
  description = "UTIM – Universal Terminal Intelligence Manager. A powerful agentic AI coding assistant for your terminal."
10
10
  readme = "README.md"
@@ -14,7 +14,7 @@ Quickstart:
14
14
  try:
15
15
  from utim_cli._version import VERSION as __version__
16
16
  except ImportError:
17
- __version__ = "2.3.13"
17
+ __version__ = "2.3.15"
18
18
 
19
19
  # Developer-friendly core classes (similar to `import genai` / `import openai`)
20
20
  from utim_cli.sdk.session import UtimSession as Session
@@ -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.13"
8
+ __version__ = "2.3.15"
9
9
 
10
10
 
11
11
  import builtins, os, pathlib, urllib.parse, re
@@ -11,6 +11,6 @@
11
11
  # from here so every surface stays in sync automatically.
12
12
  # ─────────────────────────────────────────────────────────────────────────────
13
13
 
14
- VERSION = "2.3.13"
14
+ VERSION = "2.3.15"
15
15
 
16
16
 
@@ -168,6 +168,13 @@ class ReActAgent:
168
168
  arguments[key] = val
169
169
  tool_name = actual_name
170
170
 
171
+ # Collapse duplicated tool names (e.g. 'read_fileread_file', 'read_file read_file',
172
+ # 'run_commandrun_command') produced by buggy model/proxy tool-call serialization.
173
+ import re as _re_dup
174
+ _dup_match = _re_dup.match(r'^([a-zA-Z_]\w*)[\s_]*\1$', tool_name)
175
+ if _dup_match:
176
+ tool_name = _dup_match.group(1)
177
+
171
178
  # Map common alias tool names to actual UTIM CLI tool names
172
179
  _TOOL_NAME_ALIASES = {
173
180
  "shell": "run_command",
@@ -389,7 +389,7 @@ def execute_ask_helper(
389
389
  },
390
390
  stream=False,
391
391
  timeout=(15, 300),
392
- is_reflection=True,
392
+ is_reflection=False,
393
393
  )
394
394
  if resp.status_code == 429:
395
395
  continue
@@ -321,7 +321,7 @@ class _AuthCallbackHandler(http.server.BaseHTTPRequestHandler):
321
321
 
322
322
  # ── Public login() function ───────────────────────────────────────────────────
323
323
 
324
- def login(restart: bool = True) -> None:
324
+ def login(restart: bool = False) -> None:
325
325
  """
326
326
  Sign in via the Device Authorization Flow.
327
327
 
@@ -504,8 +504,8 @@ def login(restart: bool = True) -> None:
504
504
  raw_print(f" Signed in as {BLUE}{body.get('email', '')}{RESET}")
505
505
  if "credits" in body:
506
506
  raw_print(f" Credits: {body.get('credits', 0):,.0f} UTIM")
507
- raw_print(f" {DIM}Restarting UTIM CLI…{RESET}")
508
507
  if restart:
508
+ raw_print(f" {DIM}Restarting UTIM CLI…{RESET}")
509
509
  restart_process()
510
510
  # If restart wasn't called, fall through and let the main loop exit.
511
511
 
@@ -353,6 +353,13 @@ def store_brain_memory(
353
353
  if not content or not content.strip():
354
354
  return ""
355
355
 
356
+ try:
357
+ from utim_cli.tools import is_user_paid
358
+ if not is_user_paid():
359
+ return ""
360
+ except Exception:
361
+ pass
362
+
356
363
  pid = project_id or _project_id()
357
364
  now = datetime.now().isoformat()
358
365
  clean_title = title or content[:60].replace("\n", " ").strip()
@@ -444,6 +451,13 @@ def retrieve_brain_memories(
444
451
  if not query:
445
452
  return []
446
453
 
454
+ try:
455
+ from utim_cli.tools import is_user_paid
456
+ if not is_user_paid():
457
+ return []
458
+ except Exception:
459
+ pass
460
+
447
461
  pid = project_id or _project_id()
448
462
 
449
463
  # ── Stage 1: Forward pass ─────────────────────────────────────────────
@@ -696,6 +710,13 @@ def index_project_architecture(workspace: str = "."):
696
710
  If yes, store an updated architecture memory in the brain.
697
711
  Maintains exactly one deterministic architecture memory per project.
698
712
  """
713
+ try:
714
+ from utim_cli.tools import is_user_paid
715
+ if not is_user_paid():
716
+ return
717
+ except Exception:
718
+ pass
719
+
699
720
  pid = _project_id(workspace)
700
721
  snap = _snapshot_project_architecture(workspace)
701
722
  snap_hash = hashlib.sha1(snap.encode()).hexdigest()
@@ -776,13 +797,19 @@ _watcher_lock = threading.Lock()
776
797
 
777
798
  def start_brain_watcher():
778
799
  """
779
- Start the background brain watcher daemon thread.
780
- Safe to call multiple times — only one thread is ever started.
800
+ Start the background daemon watcher if not already running.
801
+ Safe to call multiple times.
781
802
  """
782
803
  global _watcher_started
783
804
  with _watcher_lock:
784
805
  if _watcher_started:
785
806
  return
807
+ try:
808
+ from utim_cli.tools import is_user_paid
809
+ if not is_user_paid():
810
+ return
811
+ except Exception:
812
+ pass
786
813
  _watcher_started = True
787
814
 
788
815
  # One-time cleanup of legacy duplicate records on startup
@@ -946,6 +973,13 @@ def get_brain_context_prompt(user_prompt: str = "") -> str:
946
973
  relevant brain project folder matching the project data/query, and injects
947
974
  direct clickable paths into the system prompt.
948
975
  """
976
+ try:
977
+ from utim_cli.tools import is_user_paid
978
+ if not is_user_paid():
979
+ return ""
980
+ except Exception:
981
+ pass
982
+
949
983
  try:
950
984
  pid, proj_dir = find_most_relevant_brain_project(user_prompt)
951
985
  brain_root = _brain_root()
@@ -1496,7 +1496,7 @@ def _call_compression_model_with_fallback(messages: List[Dict], llm_key: str, ma
1496
1496
  },
1497
1497
  stream=False,
1498
1498
  timeout=(15, 300),
1499
- is_reflection=True
1499
+ is_reflection=False
1500
1500
  )
1501
1501
  if resp.status_code == 429:
1502
1502
  # On 429 rate limit, immediately try fallback without blocking