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.
- {utim_cli-2.3.13 → utim_cli-2.3.15}/CHANGELOG.md +12 -0
- {utim_cli-2.3.13/utim_cli.egg-info → utim_cli-2.3.15}/PKG-INFO +1 -1
- {utim_cli-2.3.13 → utim_cli-2.3.15}/pyproject.toml +1 -1
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim/__init__.py +1 -1
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/__init__.py +1 -1
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/_version.py +1 -1
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/agent.py +7 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/ask_helper.py +1 -1
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/auth.py +2 -2
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/brain.py +36 -2
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/context_pruner.py +1 -1
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/crawler/markdown_distiller.py +258 -251
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/orchestrator.py +19 -43
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/orchestrator_llm_transport.py +83 -21
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/orchestrator_turn_history.py +40 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/plugins/manager.py +135 -43
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/reflection.py +33 -4
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/cli_auth.py +6 -1
- utim_cli-2.3.15/utim_cli/server/email_utils.py +911 -0
- utim_cli-2.3.15/utim_cli/server/key_rotator.py +1055 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/router.py +11 -1
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/routes/auth_routes.py +21 -11
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/routes/completion_routes.py +136 -98
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/routes/credit_routes.py +26 -9
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/routes/marketplace_routes.py +17 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/tools.py +64 -23
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/tui/feedback_dialog.py +87 -14
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/tui/marketplace_dialog.py +8 -3
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/tui/model_dialog.py +17 -7
- utim_cli-2.3.15/utim_cli/tui/plugins_dialog.py +756 -0
- utim_cli-2.3.15/utim_cli/update_checker.py +545 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/utim.py +190 -70
- {utim_cli-2.3.13 → utim_cli-2.3.15/utim_cli.egg-info}/PKG-INFO +1 -1
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli.egg-info/SOURCES.txt +2 -0
- utim_cli-2.3.13/utim_cli/server/email_utils.py +0 -691
- utim_cli-2.3.13/utim_cli/tui/plugins_dialog.py +0 -351
- {utim_cli-2.3.13 → utim_cli-2.3.15}/LICENSE +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/MANIFEST.in +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/README.md +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/setup.cfg +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/setup.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/_verify_repro.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/_verify_syntax.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/backup.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/billing.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/blender_agent.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/bootstrap.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/client_utils.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/config.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/constants.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/crawler/__init__.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/crawler/engine.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/dependency_manager.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/doctor.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/evidence_registry.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/harbor.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/knowledge_graph.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/local_db.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/logger.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/mcp_clean_wrapper.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/mcp_client.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/mcp_registry.json +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/models.txt +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/orchestrator_helpers.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/orchestrator_tool_exec.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/personalities.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/platform_installer.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/plugins/__init__.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/plugins/hooks.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/plugins/registry.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/plugins/schema.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/plugins/tool_loader.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/report.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/scrapy_search.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/sdk/__init__.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/sdk/config.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/sdk/context.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/sdk/events.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/sdk/handlers.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/sdk/session.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/sdk/sidecar.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/__init__.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/admin_auth.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/attribution.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/audit_log.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/auth.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/batch_processor.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/captcha.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/concurrency.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/db.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/docs_md/SECRET_PROVISIONING.md +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/docs_md/about.md +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/docs_md/changelog.md +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/docs_md/docs.md +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/docs_md/features.md +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/docs_md/license.md +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/docs_md/pricing.md +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/docs_md/privacy.md +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/docs_md/refund.md +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/docs_md/support.md +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/docs_md/terms.md +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/exchange_rate.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/firebase.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/fix_duplicate_users.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/history.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/local_llm.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/logging_config.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/micro_batcher.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/model_agent.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/models.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/pricing_updater.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/provision_build.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/rate_limit.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/rewards_engine.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/routes/__init__.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/routes/admin_db_routes.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/routes/billing_routes.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/routes/feedback_routes.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/routes/quota_routes.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/routes/quota_share_routes.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/routes/referral_routes.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/routes/rewards_routes.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/routes/security_routes.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/routes/session_routes.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/routes/share_routes.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/server.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/server/storage_nodes.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/share.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/share_tui.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/situational_scoring.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/state.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/subagent_manager.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/task_dispatcher.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/task_logger.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/tools_grep.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/tui/__init__.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/tui/history_dialog.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/tui/marketplace_app_state.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/tui/marketplace_layout_engine.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/tui/mcp_dialog.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/tui/miniagents_dialog.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/tui/personality_dialog.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/tui/publish_dialog.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/tui/quota_dialog.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/tui/quota_redeem_dialog.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/tui/quota_share_dialog.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/tui/resume_dialog.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/tui/rewards_tui.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/tui/skills_dialog.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/tui/subagents_dialog.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/tui/tasks_dialog.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/tui/thinking_display.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/tui/tools_dialog.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/tui/update_dialog.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/utilities.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/utimmodel.txt +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/vector_memory.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/wheel.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli/workspace.py +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli.egg-info/dependency_links.txt +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli.egg-info/entry_points.txt +0 -0
- {utim_cli-2.3.13 → utim_cli-2.3.15}/utim_cli.egg-info/requires.txt +0 -0
- {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.
|
|
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
|
|
@@ -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.
|
|
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
|
|
@@ -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",
|
|
@@ -321,7 +321,7 @@ class _AuthCallbackHandler(http.server.BaseHTTPRequestHandler):
|
|
|
321
321
|
|
|
322
322
|
# ── Public login() function ───────────────────────────────────────────────────
|
|
323
323
|
|
|
324
|
-
def login(restart: bool =
|
|
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
|
|
780
|
-
Safe to call multiple times
|
|
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=
|
|
1499
|
+
is_reflection=False
|
|
1500
1500
|
)
|
|
1501
1501
|
if resp.status_code == 429:
|
|
1502
1502
|
# On 429 rate limit, immediately try fallback without blocking
|